# QA thresholds — tuned from iteration cron
usbl:
  min_points_per_segment: 5       # fewer → degraded
  max_gap_seconds: 30             # gap > this → split segment
  mad_sigma: 3.0                  # MAD outlier threshold
  moving_avg_window: 5            # smoothing window

ingest:
  min_video_seconds: 120          # shorter segments skipped
  max_timestamp_delta_seconds: 60 # EXIF vs USBL match tolerance

frame_extract:
  fps: 1
  width: 518
  height: 294
  underwater_r_minus_g: 5        # R < G-5 AND R < B-5 → hors eau
  trim_min_frames: 8             # skip if fewer underwater frames
  bottom_visible_pct_min: 25     # abaissé 30→25 — GX019817 (29%) récupérable, iter auto 2026-05-12

inference:
  ply_conf_threshold: 1.5
  max_frame_num: 1024
  mode: streaming
  keyframe_interval: 1

align:
  max_translation_m: 500         # sanity check on alignment
  min_inlier_ratio: 0.3          # umeyama inlier ratio

stitch:
  voxel_size: 0.05
  icp_max_distance: 0.5
  icp_iterations: 50
  use_ransac: true
  ransac_iterations: 100000
