{
  "report_id": "tobi.vision_pipeline.v1",
  "updated": "2026-09-21",
  "question": "Which FreeMoCap desktop techniques can enter TOBI image recognition without inventing detections.",
  "episodes_checked": [
    "20260917_133640",
    "20260708_155328"
  ],
  "measured": {
    "e2_findings_rows": 707,
    "e2_findings_with_joint_xy": 0,
    "e2_fields": [
      "t",
      "hl",
      "hr",
      "logo",
      "face",
      "person",
      "screen",
      "text",
      "weak"
    ],
    "e6_hand_flag_rows": 607,
    "e6_hand_span_s": 31.917,
    "e6_hand_dt_ms_median": 16.667,
    "e6_hand_dt_note": "Median step is one RGB frame (16.667 ms), not the ~19 Hz device hand rate. Device rate stays in the validity report.",
    "e6_hand_gaps_over_2x_median": 5,
    "e6_hand_gap_ms_max": 19633.3,
    "e6_uv_rows": 599,
    "e6_left_wrist_on_both_eyes": 461,
    "e6_left_wrist_du_px_median": 88.9,
    "e6_left_wrist_du_px_p95": 112.9,
    "e6_uv_note": "UV is the device OpenXR joint projected onto RGB. Not a vision detection. Meters are not computed here because this file has no camera model."
  },
  "techniques": [
    {
      "name": "named_2d_tracker",
      "source": "FreeMoCap SkellyTracker (MediaPipe, RTMPose)",
      "decision": "slot_only",
      "ran": "Apple Vision VNDetectHumanHandPoseRequest on the E2 annotated preview, stored as 1-second counts",
      "not_run": [
        "mediapipe_hands",
        "rtmpose"
      ],
      "why": "No per-joint xy in e2-findings.jsonl. Re-running a tracker needs Camera0/Camera1 at 30 Hz, not the 4 Hz preview."
    },
    {
      "name": "multiview_triangulation",
      "source": "FreeMoCap 3D triangulation, minimum cameras default 3",
      "decision": "reject_for_these_episodes",
      "why": "E2 has two eyes. E6 vision has no second detector. FreeMoCap drops points seen by fewer cameras than the minimum. Two views are the stereo distance path, not an N-camera body solve."
    },
    {
      "name": "per_point_outlier_rejection",
      "source": "FreeMoCap v1.8 outlier rejection for 4+ cameras",
      "decision": "reject_for_these_episodes",
      "why": "Needs at least four views so one bad camera can be dropped. These episodes have two RGB eyes."
    },
    {
      "name": "butterworth_on_joints",
      "source": "FreeMoCap temporal Butterworth on triangulated 3D joints",
      "decision": "not_applied",
      "why": "No vision joint trajectory exists. The E6 flag file is an RGB-aligned index with a max gap of about 19.6 s, so a Butterworth pass would invent motion across the hole. Device OpenXR stays unsmoothed in the device namespace."
    },
    {
      "name": "equal_frame_count_sync",
      "source": "FreeMoCap SkellyCam: same frame count per camera, timestamps kept",
      "decision": "already_in_pipeline",
      "evidence": "E2 Camera0 and Camera1 both 20466 frames at 30 Hz. E6 rgb_index joins hand_index with hand_dt_ns. Factory alignment is recorded and not applied on E2 (no head pose)."
    },
    {
      "name": "preview_is_not_training",
      "source": "FreeMoCap Blender scene is an export, not the raw videos",
      "decision": "already_in_pipeline",
      "evidence": "Train on source Hz. 4 Hz and 10 Hz mp4 stay in preview/."
    },
    {
      "name": "scale_not_claimed",
      "source": "FreeMoCap 2.0 alpha notes about 10% skeleton scale error",
      "decision": "do_not_copy",
      "why": "Their scale bug is theirs. TOBI stereo Z stays an estimate with the published sample stats. No new meter scale is inferred from E6 wrist pixels."
    }
  ],
  "path_fix": {
    "file": "data-layers/e6-estimate/hand_openxr_device.json",
    "namespace": "device",
    "note": "Historical folder is e6-estimate/. The record is device OpenXR, not an offline detector."
  }
}
