Reference implementation · FH-Ego v1

One clip. Every layer. Including what it gets wrong.

This is the complete annotation output of a single real egocentric recording, produced by our pipeline, not a mock-up and not a best case. Every figure below is computed from the JSON at build time, and the file itself is downloadable so you can verify each one yourself.

Delivery formats: what we do and do not offer

Five containers ship. MCAP and WebDataset do not. What arrives, and in what container.

Frames @ 30 fps1,843
Duration61.4 s
Action segments16
Kinematic entries294
Sampled frames185
Mean per-hand confidence 0.8712 Derived

Every figure above is computed from reference-run.json at build time. The mean is an aggregate of the hand-tracking model's own confidence output, so it is derived, not measured.

Download the full annotation (JSON)

Verify it yourself, in about thirty seconds

The page above says the file is downloadable so you can check our figures. That is only worth saying if we tell you how, so: here is the digest of the exact file that button serves, and the three commands that pull our own headline numbers back out of it.

SHA-256 · reference-run.json
shasum -a 256 reference-run.json
ce6591895a1d3b2071bcf4b8c11b3575b3385d03aefc99c531d7be72a1edee7a  reference-run.json
Read our figures out of the file
jq '.actions | length'                  reference-run.json   # 16
jq '.tracks.kinematics_3d | length'     reference-run.json   # 294
jq -r '.provenance.caption_source'      reference-run.json   # heuristic_stub

The third one is the one to run. caption_source is where the file admits the action track was templated rather than detected, the same admission this page makes in words below. We would rather you read it out of the artifact than take it from our copy, because a claim you can execute is worth more than a claim you have to believe.

If a number on this page disagrees with the file, the file is right and we have a bug. Tell us and we will publish the correction here.

What this does not prove

Stated first, because it is the part most vendors omit.

This is one clip. A single validated end-to-end run demonstrates the pipeline executes correctly. It says nothing about consistency across Capture Partners, scenes, or lighting, and we do not claim otherwise.

No inter-annotator agreement study has been run. We publish no Krippendorff's α for this schema. Until we do, treat label quality as unmeasured rather than assured.

Confidence is the model's, not ground truth. The values below come from the hand-tracking model, and they are one score per detected hand, not per joint. The artifact carries no per-joint confidence at all: keypoints_21 holds x, y and z and nothing else. They are not validated against motion capture.

The action track in this run is templated, not detected. The hand tracking below is real measurement. The action layer is not: on this clip the segment boundaries are fixed four-second windows, the verbs cycle a closed five-item list, and scene_semantic and camera_motion are single constants. Nothing in that layer was inferred from the video. The artifact says so about itself: provenance.caption_source is heuristic_stub, and provenance.derived_fields names all nine fields that are not measurements. A production captioner exists and is gated on per-clip consent; this clip is a DEMO capture with no consent receipt, so it has not run here.

Dense captions are derived, not measured. Where language layers are model-generated they are labelled as such in the schema and must not be read as human annotation.

We hold no third-party attestation. No SOC 2, no ISO 27001. We publish the consent mechanism instead, because that is verifiable today.

Known failure modes: measured on this run

Computed from the same file you can download. We publish the floor, not just the mean, because worst case is what determines whether a dataset is usable.

Confidence distribution, computed from reference-run.json

MeasureValue
Sampled frames carrying a hand below 0.70 confidence 44 of 185 (23.8%)
Entries below 0.70 confidence (one entry per hand) 45 of 294 (15.3%)
Lowest per-hand confidence observed0.508
Median per-hand confidence0.9415
Highest per-hand confidence observed0.995
Kinematic coverage of total frames 10.0% (the pipeline emits keyframes, not every frame)
Hand distributionleft: 183 · right: 111

How to read this. Roughly one sampled frame in four on this run carries a hand below 0.70 confidence, concentrated where the hand is partially occluded. For a buyer that is the number that matters: it sets the filtering threshold you would apply before training, and it is why we ship confidence per frame rather than a single quality score.

Four frames from this run

The renders below are pipeline output, not illustrations. Each overlay is drawn by the engine from the same JSON you can download: frame index, action code, hand, detection confidence and the camera-relative position vector. The kinematics track is sampled every ten frames, so each caption names both the frame that was rendered and the nearest sampled entry behind it (two different numbers, with two different confidences), which is why we never print one under the other's label. The callouts on each still, and the readout a mouse pointer brings up, say exactly what the caption says; nothing is behind the hover.

Left hand wiping a fabric surface at an industrial sewing workstation; 21 tracked hand joints drawn in cyan with a wrist orientation triad, frame 276.
Frame 0276 / 1843 · 00:09 · wipe_surface · left hand · overlay confidence 0.93 · P = [-0.23, +0.11, 0.38] m · nearest sampled entry frame 0280, confidence left 0.612, left P = [-0.244, +0.049, +0.364] m
Left hand reaching forward to grasp fabric beside an industrial sewing machine; 21 tracked hand joints drawn in cyan, frame 645.
Frame 0645 / 1843 · 00:21 · grasp_object · left hand · overlay confidence 0.98 · P = [-0.40, +0.18, 0.37] m · nearest sampled entry frame 0640, confidence left 0.986, left P = [-0.404, +0.179, +0.370] m
Both hands placing a processed item back into a workstation tray; the left hand tracked in cyan and the right in green, 21 joints each, frame 1197.
Frame 1197 / 1843 · 00:39 · place_item · both hands · overlay confidence left 0.98, right 0.60 · nearest sampled entry frame 1200, confidence left 0.983, right 0.548, left P = [-0.425, +0.256, +0.362] m
Both hands lifting a component to inspect seam alignment; left hand tracked in cyan, right hand in green, 21 joints each, frame 1566.
Frame 1566 / 1843 · 00:52 · inspect_component · both hands · overlay confidence left 0.98, right 0.80 · nearest sampled entry frame 1570, confidence left 0.991, right 0.618, left P = [-0.385, +0.280, +0.365] m

Frame 1197 is the honest one. The right hand is tracked at 0.60 and the sampled entry behind it at 0.548, under the 0.70 floor in the table above, because the hand is partially behind the machine head. The overlay still draws it, and the confidence value is what tells you not to trust it. That is the whole argument for shipping confidence per frame instead of one quality score.

The three layers, from this run

Tier 1: session

Tier 1 · session · JSON
{
  "task_id": "20260722_Egocentric_Sample_2_task_1",
  "task_label": "T0_Other",
  "scene": "Industrial_Floor",
  "usable": true,
  "start_frame": 0,
  "end_frame": 1843,
  "fps": 30
}

Tier 2: actions

16 action segments in this run; the first 8 shown

Read this table as schema shape, not as detection. On this clip the boundaries are fixed four-second windows and the verbs cycle a closed five-item list; see what this does not prove. The columns show what the format carries; they do not show a model reading the video.

FramesHandActionDescription
0–119leftgrasp_objectThe left hand operates sewing machinery and reaches forward to grasp fabric.
120–239leftorganize_itemsThe left hand aligns and organizes fabric items on the workstation surface.
240–359bothwipe_surfaceBoth hands hold material cloth and wipe the surface in smooth motions.
360–479bothinspect_componentBoth hands pick up the component to inspect alignment and seam orientation.
480–599bothplace_itemBoth hands place the processed item back into the designated workstation tray.
600–719leftgrasp_objectThe left hand operates sewing machinery and reaches forward to grasp fabric.
720–839leftorganize_itemsThe left hand aligns and organizes fabric items on the workstation surface.
840–959bothwipe_surfaceBoth hands hold material cloth and wipe the surface in smooth motions.

Verbs observed across all 16 segments: grasp_object, inspect_component, organize_items, place_item, wipe_surface.

Tier 3: timeline tracks

Entry counts per track in this run

TrackEntries
hand_control5
object_interactions5
action_verbs5
dense_captions16
kinematics_3d294

One kinematic entry, verbatim

This is the shape the coordinate data on this page is read from: 294 of these, one per detected hand, on 185 frames sampled every tenth, in tracks.kinematics_3d.

kinematics_3d[0] · JSON
{
  "frame_idx": 0,
  "timestamp_sec": 0.0,
  "hand": "left",
  "position_3d_m": {
    "x": -0.384,
    "y": 0.282,
    "z": 0.356
  },
  "velocity_3d_mps": {
    "vx": 0.0,
    "vy": 0.0,
    "vz": 0.0
  },
  "confidence": 0.889,
  "keypoints_21": [
    {
      "x": 0.1801,
      "y": 0.8129,
      "z": 0.0
    },
    {
      "x": 0.2565,
      "y": 0.8872,
      "z": -0.0038
    },
    {
      "x": 0.3251,
      "y": 0.8668,
      "z": 0.0054
    },
    {
      "x": 0.3645,
      "y": 0.7889,
      "z": 0.0156
    },
    {
      "x": 0.3798,
      "y": 0.7276,
      "z": 0.0259
    },
    {
      "x": 0.35,
      "y": 0.7193,
      "z": 0.0082
    },
    {
      "x": 0.3903,
      "y": 0.6318,
      "z": 0.0165
    },
    {
      "x": 0.411,
      "y": 0.5881,
      "z": 0.0228
    },
    {
      "x": 0.4252,
      "y": 0.5607,
      "z": 0.0275
    },
    {
      "x": 0.3191,
      "y": 0.6446,
      "z": 0.0119
    },
    {
      "x": 0.3648,
      "y": 0.5688,
      "z": 0.0269
    },
    {
      "x": 0.3939,
      "y": 0.5386,
      "z": 0.0363
    },
    {
      "x": 0.409,
      "y": 0.516,
      "z": 0.0426
    },
    {
      "x": 0.2807,
      "y": 0.6066,
      "z": 0.0145
    },
    {
      "x": 0.3157,
      "y": 0.5379,
      "z": 0.0167
    },
    {
      "x": 0.3174,
      "y": 0.5457,
      "z": 0.0163
    },
    {
      "x": 0.3084,
      "y": 0.5569,
      "z": 0.0191
    },
    {
      "x": 0.2441,
      "y": 0.5904,
      "z": 0.0171
    },
    {
      "x": 0.2671,
      "y": 0.542,
      "z": 0.0113
    },
    {
      "x": 0.2677,
      "y": 0.5459,
      "z": 0.0084
    },
    {
      "x": 0.2591,
      "y": 0.5593,
      "z": 0.0104
    }
  ]
}

Provenance: the part you can audit

Every clip we deliver carries a consent receipt in a SHA-256 ledger with revocation semantics. A receipt records who consented, when, on which device, under which DPDP policy, and whether consent was later withdrawn; and the hash lets you verify the record has not been altered. A certification attests to a process a third party reviewed once; this emits evidence about each individual clip.

Stated plainly: the ledger is implemented and running on SQLite. It runs on the pilot store, and this reference clip is engineering test material rather than Capture Partner cohort data. We would rather tell you that than have you discover it.

How the ledger works