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

We deliver LeRobot v2.1, HDF5 (EgoDex-style paired files) and the open FH-Ego v1 JSON schema; Zarr v2 and TFRecord (RLDS-style) are produced on request. Every format is verified by an automated export bench before we quote it. We do not offer MCAP or WebDataset — MCAP is a robotics logging container rather than a training format, and labs shard WebDataset internally; we would rather tell you which is which.

Frames @ 30 fps1,843
Duration61.4 s
Action segments16
Kinematic frames294
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 have not yet published a 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. 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
Frames below 0.70 confidence 45 of 294 (15.3%)
Lowest joint confidence observed0.508
Median joint confidence0.9415
Highest joint 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 kinematic frame in seven on this run sits 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 frame, verbatim

This is the shape the coordinate data on this page is read from — 294 of these, sampled every ten frames, 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 is not yet backed by production-grade persistence, and this reference clip is engineering test material, not Capture Partner cohort data. We would rather tell you that than have you discover it.

How the ledger works