Curatrix
Start here

Dataset structure

Every release uses the same directory layout and the same file names, so a loader written against one dataset works against the next one.

Directory layout

Layout of a released version
electrical-assembly-1.3.0/
├── manifest.json           # dataset, version, counts, file map
├── LICENCE.md              # terms this release is delivered under
├── CHANGELOG.md            # what changed since 1.2.0
├── checksums.txt           # sha256 per file
├── episodes/
│   ├── episodes.parquet    # one row per episode
│   └── annotations.parquet # one row per subtask span
├── video/
│   └── ep_000123/
│       ├── head.mp4
│       └── chest.mp4
├── calibration/
│   └── ep_000123.json      # intrinsics and mount geometry
├── provenance/
│   └── provenance.parquet  # one row per episode
└── splits/
    ├── train.txt
    └── eval.txt

manifest.json

The manifest is the entry point. Read it first: it names the schema version your loader must support and maps every logical table to a path.

manifest.json (excerpt)
{
  "dataset_id": "electrical-assembly",
  "version": "1.3.0",
  "schema_version": "2.1",
  "released_at": "2026-05-14",
  "episode_count": 1420,
  "accepted_hours": 56.4,
  "environments": ["workshop"],
  "sensors": ["gopro-head", "chest-cam"],
  "licence": {"tier": "commercial", "file": "LICENCE.md"},
  "files": {
    "episodes": "episodes/episodes.parquet",
    "annotations": "episodes/annotations.parquet",
    "provenance": "provenance/provenance.parquet",
    "splits": {"train": "splits/train.txt", "eval": "splits/eval.txt"}
  },
  "checksums": {"algorithm": "sha256", "file": "checksums.txt"}
}

episodes.parquet

One row per episode. An episode is one complete attempt at the specified task, with explicit start and end conditions.

  • episode_id — stable string identifier, unique within the dataset.
  • task — task identifier from the dataset task vocabulary.
  • environment — workshop, construction-site, residential or industrial.
  • duration_s — episode length in seconds.
  • outcome — success, failure or recovery.
  • contributor — pseudonymous identifier, stable across episodes.
  • streams — sensor streams available for this episode.

annotations.parquet

One row per subtask span, joined to episodes on episode_id. Spans are contiguous and non-overlapping within an episode.

  • episode_id, span_index — join key and ordering within the episode.
  • label — subtask label from the published vocabulary.
  • start_s, end_s — frame-accurate boundaries in seconds.
  • tool, object — referenced entities, nullable.
  • result — outcome of a verify span, nullable.

Splits

The suggested train and eval splits are contributor-disjoint and site-disjoint, so evaluation does not measure memorised scenes. They are a suggestion, not a constraint — the episode list is yours to resplit.

Next step

Start with a scoped pilot

Bring a task. On the call we scope the capture protocol, the episode volume, the annotation schema and the delivery format.

Pilots typically start from approximately €25,000. This is an indicative figure only—final scope and pricing are set after a technical qualification call.