Docs

Every .md in this repository, compiled by mdsvex. Hardware chapters first, then the Arrow extract, then in-flight OpenSpec changes.

Hardware

Sim 3090 → T4000 translation fractal1 RTX 3090 is the slow swap emulator of a resident-30fps pipeline. CUDA cores are the wrong axis. Derate bandwidth-bound fps ×0.30, CUDA-core filters ×0.13. 30 fps lab SKU: RunPod PRO 6000 96 GB — no derate to T4000.Pipes Cameras Thor speaks CSI-2, not GMSL. Body on the box is CSI. Sats are GMSL2, PoE H.265, or a cine HDMI/SDI body. Cable plant, not picture quality.Compute Carrier Lab brick is the AGX Thor Developer Kit (T5000). Production ceiling is the T4000 SOM — 64 GB, 1× NVENC, 70 W default — unless satellite count forces T5000.Shell Enclosure First article wraps the AGX kit, two-part resin for an Anycubic bed. Resin is a fit-check, not a heat sink. Production body is metal — the radiator.Plant Interconnect Hybrid fabric: body CSI/GMSL into NVENC, sats PoE H.265, lens /i as a second stream. HEVC bring-up fits 5GbE.Cooke /i Lens metadata Frame-accurate /i (or LDS / XD / EF electronic) from every camera, written as JSONL next to picture. Maps live on the NAS, not per frame.Stages 0–19 Model map Index of which job runs on Thor vs the 6000. Thor resident set stays ≤ ~40 GB. If the 6000 is off, stages 0–8 and 19 still complete.Watts Power T4000 default 70 W, throttle at 90 W. If power sags: drop AI, never record. Two PoE+ sats ≈ 60 W at the PSE. Do not power Thor from the switch.Heat Thermal TDG-12271-001 v1.3. TTP max 75 °C. 70 W fanless in a cine envelope is not honest. Body-as-radiator ~40 W still air; 70 W AI wants heatpipes to a real radiator and at most one slow fan. Measure TTP before metal CAD.Glass + silicon Sensors Bring-up count is 1 body + 2 satellites at 4K30. Body is native CSI/GMSL. Sats are PoE H.265 with Cooke-class metadata, not P-iris stubs.Buy brief Shopping Not a spec. Blackmagic is a cinema body (path B), not a CSI science project. T4000 SOM, AGX kit, and carrier options with street prices as of 2026-09-01.Numbers Stream budget Working haul is ~100 Mbps per 4K30 HEVC. T4000 HQ encodes 2× 4Kp30, not three. QSFP28 is independent 25G lanes, not aggregated 100G.

References

Jetson Thor modules datasheet (PDF) · Thermal design guide TDG-12271-001 v1.3 (PDF)

Repo notes

OpenSpec

In-flight changes and the living hardware-kit spec. Prefer the changes index if you want them grouped.

cartridge-pack Design — packer Steered 2026-09-10. Living rules in openspec/specs/cartridge-runtime/spec.md.cartridge-pack add-cartridge-pack The catalog says what a legal pack is. Nothing yet takes a desired set and returns resident / refused / evict. Without that function the 3090 loader and /bay slot bounce have nothing to call.cartridge-pack openspec/changes/add-cartridge-pack/specs/cartridge-runtime/spec The kit SHALL expose a pure packer: desired cartridge ids and an envelope id in, {resident, refused, evict, log} out, with no GPU. Default envelope on fractal1 SHALL be 3090. Envelope t4000 SHALL be a second call and SHALL NOT be reported as seated on the 3090.cartridge-pack Tasks - [ ] pack.py: desired ids + envelope → resident / refused / evict / log - [ ] Property tests: legal packs; oversize refuses; exclusive-tag refuses; always-on not dropped; sag evicts AI not record - [ ] Checker main(): 4K-pair (sam2-4k+maxine-4k) refuses; 3090 swap-set (klein+samparakeet-engine add-parakeet-engine Hono must talk to a warm CPU Parakeet, not cold-start onnx-asr per request (first load was ~40 s). The 3090 stays on plugins.parakeet-engine openspec/changes/add-parakeet-engine/specs/parakeet-asr/spec The ASR engine SHALL keep Parakeet TDT 0.6B v3 INT8 loaded in a long-lived process. A second transcribe of the same clip SHALL NOT reload encoder weights. Inference SHALL use ONNX Runtime CPUExecutionProvider only.parakeet-engine Tasks - [x] Sidecar under asr/engine/ using fractal1 ~/aicam/parakeet-cpu INT8 weights - [x] Force CPU: CUDAVISIBLEDEVICES= and providers=["CPUExecutionProvider"] - [x] Keep process warm; second transcribe does not re-download / re-load encoder - [x] Sidecar is a Bun child on stdin/IPCparakeet-stream add-parakeet-stream Clip POST is not a pipe. Callers need to stream 16 kHz mono PCM and read text as it is decoded, still on CPU.parakeet-stream openspec/changes/add-parakeet-stream/specs/parakeet-asr/spec The well-known OpenAPI document SHALL list the audio stream operation (method, path, application/octet-stream PCM in, application/x-ndjson events out).parakeet-stream Tasks - [x] Stream route on the Hono app (chunked POST or WS; one, named in OpenAPI) - [x] Windowed TDT decode on the sidecar - [x] NDJSON or SSE events {text, t0, t1} - [x] Well-known spec lists the stream operation - [ ] GPU idle during a 30 s pipearchive add-bay-feed /bay needs a JSON snapshot of fractal1 without SSHing. The 3090-loadout script already knows the facts. Bind like SMB: Tailscale IP only.archive openspec/changes/archive/2026-09-10-add-bay-feed/specs/stage-bay/spec Fractal1 SHALL serve GET /loadout.json on 100.103.147.70:8745 and SHALL NOT bind that port on 0.0.0.0. The body SHALL include gpu, ram, swap (zram vs swapfile), procs, and stack with resident flags.archive Tasks - [x] snapshot.py on fractal1 - [x] serve.py bound to 100.103.147.70:8745 - [x] systemd enable - [x] last-plate.json committed from a live snapshot - [x] vite proxy /bay-apiarchive add-bay-glass The brick state is for a filmmaker. The glass is an EVF: tungsten, tally, waveform. A little sci-fi. Dark first. Separate section.archive openspec/changes/archive/2026-09-10-add-bay-glass/specs/stage-bay/spec /bay SHALL present VRAM, power, RAM, zram vs disk swap, and the model mag rack in a dark EVF chrome (tungsten, tally, waveform). It SHALL NOT use the docs paper-grid as the primary surface.archive Tasks - [x] /bay route + Header link - [x] HUD typefaces loaded - [x] Waveform, mag rack, swap split, tally - [x] Last plate fallback - [x] Dark-locked even when site theme is lightarchive Design — interconnect Steered 2026-09-01 (AUTO hybrid + USER HEVC-not-RAW).archive add-camera-interconnect Pixels, power, and clocks have to move between a Thor-mounted body camera, PoE satellites, and the NAS. The wrong fabric buys the wrong cameras.archive advise add-camera-interconnect Verdict. Hybrid + HEVC-on-the-wire is the only T4000-safe plant. Steelman against: all-GMSL (NVIDIA path, genlock) still loses if we want PoE cable and T4000 HQ encode count. Tradeoff: PTP across PoE is weaker than GMSL genlock; accepted for v1.archive advise add-camera-interconnect 1. Pin the plant boundary: the body sensor may emit RAW only on the CSI/GMSL hop into Thor, while every routed or stored picture stream is HEVC. 2. Pin ownership of encoding: T4000 NVENC owns the body master, and each satellite owns its H.265 encode so the bring-up trio does not archive add-camera-interconnect — re-advise after send-back amend Author this pass: Grok. Prior send-back: Sol, 2026-09-10-advise.md (not overwritten).archive add-camera-interconnect — re2 advise after Thor-in-the-loop amend Author this pass: Grok (commit da58dff). Prior reviews kept: Sol 2026-09-10-advise.md, Fable 2026-09-10-re-advise.md. This file does not overwrite either.archive openspec/changes/archive/2026-09-10-add-camera-interconnect/specs/hardware-kit/spec 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.archive Tasks - [x] Record hybrid + HEVC-not-RAW on the bead - [x] Write docs/INTERCONNECT.md - [x] Delta hardware-kit interconnect requirements - [x] Require satellite-side H.265 encode for T4000 1+2 HQ bring-up and protect the two-session NVENC ceiling - [x] Specify PoE power versus Ethernetarchive Design — cartridge catalog Steered 2026-09-10 (user: modes as presets, knapsack + physics tags, live-brick envelope, glass on /bay).archive add-cartridge-model Named modes already pick one extra and unload the rest. The operator wants to slot models and plugins like game carts. Without a catalog of costs and shelves, a packer cannot refuse an illegal seat, and /bay cannot draw the board.archive Advise: add-cartridge-model Rigor: architecture. Density: lean. Reader family: Claude (Fable 5.1). Author family: grok. Read order: packet Why → change spec specs/cartridge-runtime/spec.md → proposal.md → steer.md → ~/work/Family/web3d-space/docs/all-systems-go/MODELS.md, MODES.md → docs/3090-SIM.md → opensarchive Re-advise: add-cartridge-model Rigor: architecture. Density: lean. Reader family: Claude (Fable 5.1). Author this pass: grok. Read order: packet Why → specs/cartridge-runtime/spec.md → sim/3090/catalog.json → sim/3090/checkcatalog.py (run, exit 0) → proposal.md → steer.md. Blind take written and saved before darchive add-cartridge-model — re-advise 2 (2026-09-10) Sources: proposal Why, openspec/specs/hardware-kit/spec.md, the delta specs/cartridge-runtime/spec.md, sim/3090/checkcatalog.py, sim/3090/catalog.json.archive openspec/changes/archive/2026-09-10-add-cartridge-model/specs/cartridge-runtime/spec The kit SHALL expose a catalog of cartridges. Each cartridge SHALL have an id, a kind (model or plugin), a job string pointing at the MODELS.md row it fills, a shelf (always-on, slottable, or never-on-thor), zero or more exclusive tags, and a cost record per envelope id (3090, t4archive steer add-cartridge-model - cartridge vs mode: named modes are factory presets (a bag of carts). Operator may unslot/slot from a preset. (user) - exclusive vs knapsack: knapsack on measured costs; exclusive tags only for physics already decided (klein↔27B, SAM2↔Maxine at 4K). (user) - envelope: seat/bouncarchive Tasks - [x] Advise reader (other family) on this architecture change (send-back 2026-09-10; three spec pins amended) - [x] Catalog schema: id, kind, shelf, exclusive tags, costs per box (3090 / t4000 / 6000) - [x] Seed always-on (nvenc-hevc, cuvslam), slottable (filters, sam2-tiny, cliarchive add-datasheet-pack CAD and buys need envelopes and URLs, not folklore.archive openspec/changes/archive/2026-09-10-add-datasheet-pack/specs/hardware-kit/spec Every steered SKU SHALL have a PDF or URL, fetch date, and mechanical envelope listed under docs/references/.archive Tasks - [x] Ingest DS-11945-001 v1.4 - [x] Keep docs/references/README.md as the manifest - [x] Delta hardware-kit datasheet requirementarchive add-lens-metadata Matchmove, AD, and splat-readiness need real focal length, T-stop, and focus, not a scripty guess. Cooke /i is the cine interchange.archive advise add-lens-metadata Verdict. /i as interchange, sidecar not muxed into HEVC, every camera. Steelman against: EF-only — loses entrance pupil and /i3 maps on sats. Tradeoff: cheap P-iris PoE boxes become stubs.archive openspec/changes/archive/2026-09-10-add-lens-metadata/specs/hardware-kit/spec 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) SHALarchive Tasks - [x] Write docs/LENS.md - [x] Point record path and sensors at /i - [x] Delta hardware-kit lens-metadata requirementarchive Design: parakeet-asr GitHub Pages is static. The ASR API is a Bun process on fractal1, sibling to aicam-bay-feed (:8745), bound to the Tailscale IPv4 only on :8750. UPnP is on; never 0.0.0.0.archive add-parakeet-api The 3090 stays on 30 fps plugins. Parakeet runs on the 14600KF. Callers need a machine-readable contract so any agent can pipe audio and get text without reading this notebook. This repo is adapter-static Pages today; the only HTTP is the bay loadout feed. The API is a new procesarchive Advise: add-parakeet-api Rigor: architecture. Density: standard. Reader family: Claude (Fable 5.1). Author family: grok. Read order: packet Why → change spec specs/parakeet-asr/spec.md → package.json (adapter-static) → sim/3090/serve.py (bindip, port 8745) → daBOM src/lib/server/api/root.ts (well-known tarchive Re-advise: add-parakeet-api Rigor: architecture. Density: standard. Reader family: Claude (Fable 5.1). Author family: grok. Prior: reviews/2026-09-10-advise.md (send-back, five spec lines + one struck design clause). Amend under review: 4194d0f. Read order: packet Why → proposal.md → steer.md → change spec archive openspec/changes/archive/2026-09-10-add-parakeet-api/specs/parakeet-asr/spec The ASR process SHALL publish the current OpenAPI 3.1 document at GET /.well-known/openapi.json. The body SHALL be the same bytes as GET /api/v1/openapi.json. The document SHALL set servers to the /api/v1 base so path keys are relative to it. GET /.well-known/api-catalog SHALL bearchive steer add-parakeet-api - Discovery: /.well-known/openapi.json + /.well-known/api-catalog (user). Same bytes as /api/v1/openapi.json. daBOM shape on this repo's Bun process. - Engine: warm Python onnx-asr INT8 sidecar on fractal1 (decide-for-me / intend recommended). Do not vendor morphist-asr. - Bind: archive Tasks - [x] Living spec parakeet-asr started by add-parakeet-hono fold; this change's remaining SHALLs fold in - [x] ARCHITECTURE.md note: Bun ASR process beside Pages SSG (this fold) - [x] Advise accept before engine/hono writes - [x] Advise send-back 2026-09-10: strike resample; healarchive add-parakeet-hono Agents need a generated OpenAPI document at a well-known URL, then a clip POST. Pages cannot host this. Bun + Hono on the tailnet can.archive openspec/changes/archive/2026-09-10-add-parakeet-hono/specs/parakeet-asr/spec The Bun process SHALL serve GET /.well-known/openapi.json as OpenAPI 3.1 generated from Zod routes. The body SHALL equal GET /api/v1/openapi.json. POST /api/v1/transcribe SHALL be listed.archive Tasks - [x] Bun workspace asr/server/ with Hono + @hono/zod-openapi + Zod routes - [x] app.doc31('/openapi.json'); root serves /.well-known/openapi.json as the same bytes - [x] RFC 9727 /.well-known/api-catalog - [x] POST /api/v1/transcribe wired to the warm sidecar - [x] Bind Tailscalarchive Design — power and thermal T4000: SYSVINHV 7–20 V (12 V typ), SYSVINMV 5 V, Imax 22 A @ 20 V and 6 A @ 5 V. No 3.3 V module rail. TTP max 75 °C.archive add-power-thermal Thor, PoE satellites, and a resin lid fight the same watts and the same sun. If power sags, drop AI, never record.archive advise add-power-thermal Verdict. Split PSUs, 70/90 W T4000, resin is not a heat sink. Steelman against: one PoE++ injector for Thor+cams — backfeed risk. Tradeoff: no sun-load measurement without the thermal guide.archive Advise: add-power-thermal Written from the Why, living hardware-kit spec, docs/POWER.md, and its T4000/thermal references before opening design.md or tasks.md.archive openspec/changes/archive/2026-09-10-add-power-thermal/specs/hardware-kit/spec Thor module power and satellite PoE SHALL be separate supplies. PoE SHALL NOT backfeed the AGX kit or SOM.archive Tasks - [x] Write docs/POWER.md - [x] Delta hardware-kit power requirementsarchive Design — sensors and lenses Body camera is a module Thor can CSI-capture (Bayer/YUV) so NVENC and cuVSLAM see a native sensor. Electronically controlled iris/focus.archive add-sensor-lens-kit One camera is bolted to the Thor box; two more cover the set. Lenses must be electronically controlled. The fabric (HEVC PoE + CSI body) picks the camera family.archive advise add-sensor-lens-kit Verdict. 1 body CSI + 2 PoE H.265 sats, electronic iris/focus. Steelman against: six cinema bodies — wrong spend before a print. Tradeoff: no SKUs yet; classes only.archive Advise — add-sensor-lens-kit 1. Pin the body camera to the Thor enclosure and a native CSI-2/GMSL/HSB ingest path suitable for 4K30. 2. Pin satellites to camera-side 4K30 H.265 over PoE; GMSL RAW is not the v1 satellite fabric. 3. Pin bring-up to one body plus two satellites, with four- and six-satellite couarchive Re-advise — add-sensor-lens-kit Read after Grok's send-back amend. Prior send-back: reviews/2026-09-10-advise.md (sol-arch-review).archive openspec/changes/archive/2026-09-10-add-sensor-lens-kit/specs/hardware-kit/spec 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.archive Tasks - [x] Write docs/SENSORS.md - [x] Delta hardware-kit sensor requirements - SKU shopping is later (classes live in docs/SENSORS.md; /i glass preferred) - [x] Amend the design and delta so HSB/USB is explicitly an AGX bring-up fallback; the production body path remains enclosure-moarchive Design — four-box mix Product ground stays in web3d-space (HARDWARE.md, MODELS.md, VIDEO-PERCEPTION.md). This repo owns docs/3090-SIM.md derates.archive add-sim-box-mix The live mix is designed as everything resident at 30 fps. fractal1’s 3090 cannot do that — 24 GB + 16 GB host — so it swaps one slot at a time and goes slowly. The same software streams realtime on a rented RTX PRO 6000 Blackwell Server 96 GB or on a local T4000. Truck 6000 stayarchive advise: add-sim-box-mix (2026-09-10) Sources: Why, openspec/specs/hardware-kit/spec.md, change delta, docs/3090-SIM.md, HARDWARE.md, MODELS.md, VIDEO-PERCEPTION.md:100-160.archive openspec/changes/archive/2026-09-10-add-sim-box-mix/specs/hardware-kit/spec 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 archive steer add-sim-box-mix - 3090 residency: sequential swap, slower emulator (user) Why: 24 GB + 16 GB host cannot co-reside the live mix. fractal1 is the T4000 pipe, not a T4000 TOPS proxy and not a 30 fps host. - Design use case: everything-resident 30 fps (user) Why: one software path. Rent NVIDIA RTX archive Tasks - [x] Advise reader (other family) on this architecture change - [x] Four-box table in web3d-space HARDWARE.md (Thor T4000, 3090 swap-emulator, RunPod PRO 6000 96 GB resident-30fps, truck 6000) - [x] Quant / pack rows in web3d-space MODELS.md (SMALL on T4000/3090, LARGE on 6000) archive Design: stage-bay GitHub Pages is HTTPS. Fractal1 JSON is HTTP on Tailscale. Mixed content blocks live fetch from Pages. Same call as web3d-space /gpu: live in vite dev via proxy; Pages ships a last plate.archive Self-critique (author tab — not advise) Author family: grok. Do not treat this as ADVISE.archive add-stage-bay The 3090 brick (fractal1) is the T4000-shaped lab stand-in. Its state — VRAM, RAM, zram vs disk swap, stacked vs resident — lives in a CLI skill. A filmmaker needs an EVF, not nvidia-smi. GitHub Pages cannot see Tailscale, so the data plane has to be honest about live vs plate.archive Advise: add-stage-bay Rigor: architecture. Density: lean. Reader family: Claude (Fable 5.1). Author family: grok. Read order: packet Why → openspec/specs/hardware-kit/spec.md (empty) → change spec → sim/3090/serve.py, sim/3090/snapshot.py, vite.config.ts, src/routes/bay/+page.svelte, src/lib/bay/, srcarchive openspec/changes/archive/2026-09-10-add-stage-bay/specs/stage-bay/spec The hardware notebook SHALL expose brick state at /bay, a nav sibling to Kit and Docs, not a mdsvex docs chapter.archive steer add-stage-bay When. 2026-09-10 Depth. lean (decide-for-me / activate all)archive Tasks - [x] JSON contract in stage-bay spec - [x] Last plate committed at src/lib/bay/last-plate.json - [x] /bay route prerenders - [x] Advise reader (other family) on this architecture changearchive Design — carrier AGX Thor Developer Kit (NVIDIA, T5000, 243.19 × 112.40 × 56.88 mm, 5GbE + QSFP28, USB-C, 40–130 W) is the bring-up brick.archive add-thor-carrier The lab brick and the production SOM are different envelopes, rails, and NVENC counts. Buying the wrong one locks the carrier and the enclosure.archive advise add-thor-carrier Verdict. AGX kit for lab, T4000 SOM as production ceiling. Steelman against: wait for T4000 kit — NVIDIA does not ship one. Tradeoff: first enclosure wraps a T5000 brick we may not ship.archive Advise: add-thor-carrier 1. Pin the lab target to the complete AGX Thor Developer Kit, explicitly identifying its T5000 module and kit envelope. 2. Pin production to a T4000 SOM on a compatible carrier, with T5000 allowed only after measured satellite encode demand exceeds the hybrid path. 3. Refuse any archive Re-advise: add-thor-carrier Second-pass read after Grok's send-back amend (f8f76b9). Sol's two blocking findings from 2026-09-10-advise.md are the frame. Blind take was written from proposal Why, living hardware-kit spec, the cited delta, and docs/references/T4000.md before design.md, tasks.md, or the priorarchive openspec/changes/archive/2026-09-10-add-thor-carrier/specs/hardware-kit/spec Bring-up SHALL use the NVIDIA Jetson AGX Thor Developer Kit (T5000 module).archive Tasks - [x] Write docs/CARRIER.md - [x] Delta hardware-kit carrier requirements - [x] Make the T4000 HV/MV rail contract and absence of SYSVINSV normative in the carrier delta - [x] Add the normative T4000-default/T5000-escape criterion tied to validated hybrid encode loadarchive add-thor-enclosure The body camera mounts to the Thor box. First article is a resin fit-check on the Anycubic, not a production housing.archive openspec/changes/archive/2026-09-10-add-thor-enclosure/specs/hardware-kit/spec The first printable enclosure SHALL fit the AGX Thor Developer Kit envelope and provide a body-camera mount plus TTP ventilation.archive Tasks - [x] Write docs/ENCLOSURE.md print notes - [x] Blender model + STL (docs/cad/agxshellfront.stl, agxshellrear.stl) - [x] Delta hardware-kit enclosure requirementLiving spec cartridge-runtime Living spec for the cartridge catalog and packer contract. In-flight deltas: openspec/changes//specs/cartridge-runtime/.Living spec hardware-kit Living spec for the All Systems Go camera body. In-flight deltas: openspec/changes//specs/hardware-kit/.Living spec parakeet-asr Living spec for CPU-only Parakeet ASR on the tailnet. In-flight deltas: openspec/changes//specs/parakeet-asr/.Living spec stage-bay Living spec for the hardware notebook bay: fractal1 brick state as a Tailscale-only JSON feed. In-flight deltas: openspec/changes//specs/stage-bay/.