openspec/specs/hardware-kit/spec.md
hardware-kit
Living spec for the All Systems Go camera body. In-flight deltas: openspec/changes/*/specs/hardware-kit/.
Purpose
CAD and buys use envelopes and URLs from docs/references/, not folklore.
The kit crib (SKUs, BOM lines, quotes) is sister repo daBOM. Preferred
production kit is SKU kit-prod (Cart T). Lab brick is kit-lab. Hybrid
1+2 plant is kit-hybrid-plant. Explode with GET /api/v1/items/{sku}/bom?explode=true. This markdown is capability
SHALLs, not the parts list.
Requirements
Requirement: Kit crib
The preferred production kit SHALL be the daBOM item kit-prod (Cart T —
T4000 + Rogue-T5). Lab bring-up SHALL be kit-lab. The 1 body + 2 sat
plant SHALL be kit-hybrid-plant. SKUs, BOM lines, and quotes SHALL be
read from daBOM, not copied into this spec.
Scenario: explode production kit
- GIVEN daBOM is running
- WHEN
GET /api/v1/items/kit-prod/bom?explode=true - THEN the tree includes the T4000 SOM, Rogue-T5, and satellite encode mules, not a handwritten parts list in this file
Requirement: Datasheet manifest
Every steered SKU SHALL have a PDF or URL, fetch date, and mechanical
envelope listed under docs/references/.
Scenario: Thor SOM
- GIVEN DS-11945-001 v1.4 in
docs/references/ - WHEN CAD or power work starts
- THEN envelopes come from T4000.md, not memory
Requirement: Cooke /i–class lens sidecar
Each camera, body and satellite, SHALL produce frame-accurate lens metadata in Cooke /i (or ARRI LDS, ZEISS XD, or EF electronic mapped into the same fields). Thor SHALL write it as a JSONL sidecar 1:1 with that camera’s HEVC timecode. RAW lens maps (/i3 distortion, shading) SHALL be files on the NAS keyed by lens identity, not per-frame blobs.
Scenario: body and two sats
- GIVEN three cameras recording
- WHEN a take is written to the NAS
- THEN each HEVC file has a sibling JSONL with at least make, serial, true focal length, T-stop, and focus distance locked to timecode
Requirement: First-article enclosure
The first printable enclosure SHALL fit the AGX Thor Developer Kit envelope and provide a body-camera mount plus TTP ventilation.
Scenario: Anycubic fit-check
- GIVEN the AGX kit dimensions 243.19 × 112.40 × 56.88 mm
- WHEN an STL is printed in resin
- THEN the kit seats, the body cam has a mount, and vents do not cover the TTP
Requirement: Split power tree
Thor module power and satellite PoE SHALL be separate supplies. PoE SHALL NOT backfeed the AGX kit or SOM.
Scenario: sag
- GIVEN thermal or power headroom is gone
- WHEN the kit must shed load
- THEN AI (MIG slice 1) is dropped and record (slice 0) continues
Requirement: T4000 thermal ceiling
A T4000 body SHALL be designed for 70 W default and 90 W TMP, TTP ≤ 75 °C.
Scenario: enclosure
- GIVEN a resin lid over the SOM or AGX kit
- WHEN the GPU is at default power
- THEN the TTP is vented or heat-sunk; resin is not the thermal path
Requirement: Body-mounted camera
One camera SHALL be mounted to the Thor enclosure and ingested over CSI-2 or GMSL into Thor NVENC. It SHALL be 4K30 class. HSB or USB on the AGX kit is a bring-up fallback only and SHALL NOT be the production body path.
Scenario: body record
- GIVEN the body camera is mounted and powered on the production enclosure
- WHEN capture starts
- THEN Thor encodes H.265 from that CSI/GMSL sensor without a PoE hop and without using HSB/USB as the ingest
Requirement: PoE satellites
Bring-up SHALL include two satellite cameras on PoE that emit H.265 at 4K30. The shipped satellite class SHALL support electronic iris and/or focus, a Cooke /i–class metadata path (barrel port to Ethernet), and a UART 1D ToF sensor whose range is written into the same JSONL sidecar as picture. A sealed P-iris turret MAY be an encode mule for bring-up and SHALL NOT be the shipped satellite class.
Scenario: satellite record
- GIVEN two PoE satellites of the shipped class and a PoE switch
- WHEN capture starts
- THEN each satellite delivers camera-side H.265 that Thor remuxes to the NAS, plus Cooke-class lens metadata and 1D ToF in the sidecar, without a RAW Ethernet payload
Requirement: Lab brick
Bring-up SHALL use the NVIDIA Jetson AGX Thor Developer Kit (T5000 module).
Scenario: first power-on
- GIVEN no custom carrier yet
- WHEN the lab kit is used
- THEN I/O is the kit’s 5GbE, QSFP28 (independent MGBE lanes), USB-C, and HSB/USB cameras
Requirement: Production ceiling
Production body design SHALL fit the T4000 SOM: 87 × 100 × 15.29 mm, 699-pin B2B, default 70 W, throttle at 90 W TMP, 1× NVENC, 3× 25GbE, no CAN. The carrier SHALL supply SYS_VIN_HV 7–20 V and SYS_VIN_MV 5 V. It SHALL NOT require SYS_VIN_SV (a T5000-only rail). T4000 is the default production module. T5000 is permitted only when the required satellite encode load cannot remain camera-side or otherwise exceeds the validated T4000 hybrid budget.
Scenario: drop to T4000
- GIVEN hybrid HEVC satellites
- WHEN the body is a T4000 SOM
- THEN Thor encodes the body camera only and satellites remain camera-side H.265
Scenario: rails
- GIVEN a production carrier for T4000
- WHEN the SOM is seated
- THEN HV 7–20 V and MV 5 V are present and SYS_VIN_SV is absent at the module
Scenario: T5000 escape
- GIVEN satellite count or encode demand that will not stay camera-side within the T4000 hybrid budget (1× NVENC, HQ 2× 4Kp30)
- WHEN the body module is chosen
- THEN T5000 may be used; otherwise the body stays T4000
Requirement: Hybrid camera fabric
The camera body SHALL ingest the body camera over CSI-2 or GMSL on the Thor module, and SHALL ingest satellite cameras over Power-over-Ethernet. USB-C SHALL NOT be the satellite trunk.
Scenario: bring-up plant
- GIVEN one body camera and two satellites
- WHEN the kit is powered
- THEN the body path is native CSI/GMSL into Thor and each satellite is a PoE endpoint
Requirement: HEVC record path
The kit SHALL record 4K picture as H.265. RAW SHALL NOT be required on the satellite or truck uplink. CSI RAW is permitted only as the body sensor hop into Thor NVENC. Satellite H.265 SHALL be written to the NAS by Thor (remux, no re-encode) alongside the body master.
Scenario: bring-up bit rate
- GIVEN 1 body + 2 satellites at 4K30 HEVC
- WHEN streams are recorded
- THEN aggregate payload is on the order of 0.24 Gbps and fits in 5 GbE
Requirement: Satellite-side encode for T4000 bring-up
On the T4000 production ceiling (1× NVENC, HQ 2× 4Kp30), each satellite SHALL encode its own H.265. Thor NVENC SHALL own the body master only. The kit SHALL NOT require Thor to HQ-encode the 1 body + 2 satellite bring-up trio.
Scenario: T4000 HQ ceiling
- GIVEN T4000 HQ NVENC is 2× 4Kp30
- WHEN 1 body + 2 satellites record 4K30
- THEN the body is Thor NVENC and each satellite ships camera-side H.265
Requirement: PoE power vs data boundary
PoE SHALL power satellites. The satellite Ethernet PHY SHALL carry H.265. Thor SHALL NOT supply PoE. An external PoE switch is a kit item. PoE class and switch uplink capacity SHALL be evaluated as separate criteria; PoE does not name link bitrate.
Scenario: switch is in the kit
- GIVEN Thor has no PoE
- WHEN two satellites are on set
- THEN each sat is a PoE endpoint on an external switch, and that switch’s data uplink is sized for the HEVC payload plus overhead, not by PoE class
Requirement: Independent MGBE lanes
QSFP/MGBE lanes on Thor SHALL be treated as independent controllers. The kit SHALL NOT present QSFP28 as one aggregated 100GbE video trunk.
Scenario: QSFP is not 100G
- GIVEN QSFP28 is three (T4000) or four (T5000 / AGX kit) independent MGBE controllers (DS-11945-001 4.10.1)
- WHEN the truck uplink is planned
- THEN each lane is budgeted on its own; the plant is not a 100G pipe
Requirement: Clock and sidecar alignment
Body hardware timing, satellite PTP, picture timecode, and Cooke /i–class JSONL SHALL be reconcilable per frame. The exact product clock master MAY remain unspecified.
Scenario: sidecar locks to picture
- GIVEN a take written to the NAS
- WHEN a HEVC file and its JSONL sidecar are opened
- THEN timecode on the sidecar matches picture; satellite PTP and body hardware clocks are named well enough to reconcile them
Requirement: Record-first under AI drop
HEVC recording, the NVMe ring, satellite remux to storage, and metadata sidecars SHALL continue when AI decode or overlay is dropped. Mode switch drops AI, never record. Remux is record, not AI.
Scenario: thermal sag
- GIVEN 1 body + 2 satellites recording
- WHEN slice-1 AI is killed or thermal sag drops overlay/AD
- THEN body HEVC, sat remux to the NAS, and JSONL sidecars keep writing
Requirement: Four compute envelopes
The kit SHALL name four compute envelopes: Thor T4000 (production body),
fractal1 RTX 3090 (local FP16 pipe), RunPod RTX PRO 6000 Blackwell Server
96 GB (30 fps perception lab), and the truck 6000 (quality). The AGX Thor
Developer Kit (T5000 module) SHALL share envelope id t4000 until
measured apart: bandwidth-bound reads ~1× T4000, TPC-bound ×0.6, NVENC
count 2 not 1. The 3090 SHALL NOT be treated as a T4000 TOPS proxy.
Derates SHALL live in docs/3090-SIM.md. Hardware envelope id (derate
and log attribution) and pack id (SMALL or LARGE weights) SHALL be
separate fields. Pack and residency default by envelope and SHALL be
overridable. RunPod 6000 and truck 6000 share the 6000 quality-class
column until measured apart.
Scenario: cartridge costs
- GIVEN the cartridge catalog
- WHEN costs are recorded per envelope id
- THEN the ids
t4000,3090, and6000match this four-box list (RunPod 6000 and truck 6000 share the6000quality-class column until measured apart; the AGX kit logs ast4000with the partial derate above)
Requirement: Resident 30 fps design target
The live perception pipeline SHALL be designed as named slots kept
resident at 30 fps on Thor T4000 and on an RTX PRO 6000. fractal1’s
3090 SHALL emulate that pipeline by loading one slot at a time and
unloading it, and SHALL NOT be a 30 fps host. The same software SHALL
select residency (resident or swap) and pack (SMALL or LARGE)
as independent fields that default by envelope id and MAY be overridden.
A PRO 6000 LARGE-pack stream SHALL NOT be logged as a T4000 FACT; no
derate from 6000 fps to T4000 exists. T4000 30 fps SHALL remain SPEC
until measured on Thor silicon. Swap-mode logs SHALL split load/unload
time from per-frame time before docs/3090-SIM.md derates apply.
Scenario: rent or local body
- GIVEN the live mix is running
- WHEN the envelope is a rented PRO 6000 96 GB
- THEN every live slot stays resident, pack is LARGE, and the stream is a lab result with no derate to T4000
- WHEN the envelope is a local T4000
- THEN every live slot stays resident, pack is SMALL, and 30 fps is SPEC
- WHEN the envelope is fractal1 3090
- THEN slots swap, pack is SMALL, and the log splits load/unload from
per-frame time then applies
docs/3090-SIM.mdderates
Requirement: Envelope-sized packs
T4000 SHALL pack SMALL live weights (VDA-S / oVDA, YOLOE, SAM2-tiny or EdgeTAM, RVM-MN3 on talent, Maxine AR). The 30 fps lab 6000 SHALL pack LARGE live weights (VDA-L or DA3METRIC-L, SAM 3.1, SAM2Matting). The 3090 SHALL load SMALL weights only. SAM 3.1 + VDA-L SHALL NOT be packed on T4000.
Scenario: MODELS quant rows
- GIVEN MODELS.md
- WHEN a live perception job is listed
- THEN it names SMALL and LARGE packs and which envelope runs each