docs(perception): record external worker acceptance

This commit is contained in:
DCCONSTRUCTIONS 2026-07-19 16:46:39 +03:00
parent 648d5bced4
commit 31fc4f6567
5 changed files with 254 additions and 0 deletions

View File

@ -103,6 +103,21 @@ uv run k1link doctor
uv run pytest uv run pytest
``` ```
## External perception worker
Mission Core can now package one sealed camera epoch as an immutable,
content-addressed `missioncore.compute-job/v1` without changing the source
evidence. The first recorded TEST007 job was digest-verified and decoded on a
separate Windows RTX 4090 worker, executed through pinned Triton/YOLOX-S and
returned a content-addressed `missioncore.compute-result/v1` containing 56
session-timestamped generic COCO detections. The worker never connects to K1 and
does not own the raw archive.
This is a recorded execution acceptance, not a navigation stack: Rerun result
projection, large-epoch performance, direct worker transport and bounded live
fan-out remain open. See [ADR 0014](docs/adr/0014-bounded-external-perception-worker.md)
and the [external worker contract](docs/10_EXTERNAL_PERCEPTION_WORKER.md).
## Mission Core Control Station and visualization adapters ## Mission Core Control Station and visualization adapters
The browser application is the universal Mission Core Control Station rather than The browser application is the universal Mission Core Control Station rather than

View File

@ -298,6 +298,37 @@ confirms it.
MVP GO: K1-to-Mac scan-correlated data can be captured reliably and at least one MVP GO: K1-to-Mac scan-correlated data can be captured reliably and at least one
useful stream is decoded or structurally identified. useful stream is decoded or structurally identified.
## Stage 8 — replaceable external perception worker
Stages 67 established the raw-first live bridge and durable combined session
archive described above. Stage 8 introduces a replaceable GPU executor without
giving it K1 command authority or the authoritative archive.
Accepted recorded gate, 2026-07-19:
- the Mac validates one sealed camera epoch through the same digest and
ISO-BMFF timing inspector used by saved-session replay;
- `k1link compute prepare-camera-job` publishes an immutable
`missioncore.compute-job/v1` below ignored runtime storage;
- the first TEST007 job contains only one bounded 56-frame camera epoch, not the
MQTT archive or another K1 control path;
- Windows revalidates all 59 job files, reconstructs the exact canonical stream
digest and decodes all 56 frames;
- pinned Apache-2.0 YOLOX-S executes through pinned Triton 2.70.0 on the RTX
4090 and atomically publishes one content-addressed
`missioncore.compute-result/v1`;
- repeating the exact result identity returns the existing result without
increasing Triton inference count.
The accepted result is perception evidence only. Rerun projection, the larger
TEST007 epoch, direct/routed worker transport and bounded live fan-out remain
separate gates. SSH/SCP is allowed only as the recorded laboratory bootstrap.
The worker never connects to K1.
See [ADR 0014](adr/0014-bounded-external-perception-worker.md), the
[worker contract](10_EXTERNAL_PERCEPTION_WORKER.md) and
[Lab 005](lab/005_FIRST_RECORDED_PERCEPTION_20260719.redacted.md).
## Deferred work ## Deferred work
- ROS2/MCAP bridge; - ROS2/MCAP bridge;

View File

@ -0,0 +1,85 @@
# External perception worker contract
## Boundary
```text
K1
-> XGRIDS device plugin / Mission Core Edge
-> authoritative raw session on Mac
-> bounded missioncore.compute-job/v1
-> replaceable GPU worker / Triton
-> content-addressed missioncore.compute-result/v1
-> future optional Rerun derived layer
```
The GPU worker cannot discover, provision, start or stop a K1. It receives an
observation package and returns derived observations. The Mac archive is never
rewritten when a job is prepared or a result is received.
## Recorded camera job v1
`k1link compute prepare-camera-job` accepts a sealed cataloged session, one
camera source and one physical codec epoch. It performs the canonical camera
checks before and after copying into a private staging directory:
- summary schema/source/epoch and per-segment durability contract;
- exact ordered JSONL index and its summary SHA-256;
- init SHA-256, every segment length/SHA-256 and complete stream SHA-256;
- continuous ISO-BMFF decode timeline and finite media duration;
- source session-time mapping through the captured host clock origin.
Publication atomically renames this layout below ignored storage:
```text
<jobs>/<job-id>/
├── job.json
└── input/camera/<source-id>/epoch-N/
├── summary.json
├── index.jsonl
├── init.mp4
└── segments/*.m4s
```
`input_sha256` is SHA-256 over canonical JSON for the complete path-free input
descriptor. `job_id` includes its first 96 bits and validators require the full
digest, so a prefix collision fails closed.
## Recorded result v1
The accepted worker profile verifies every transferred file, reconstructs the
stream outside the job, decodes frames and preserves strictly increasing
best-effort timestamps in session seconds. Its result identity is canonical JSON
covering:
- job and full input generation;
- pipeline ID/version;
- model ID/version/weight SHA-256;
- score/NMS thresholds, tensor shape, color order and letterbox policy.
The identity's full SHA-256 names an immutable `result-<sha256>` directory.
The result manifest binds the detection artifact's length and SHA-256. A repeat
with the same identity validates the existing directory and returns it without
calling Triton.
## Accepted model profile
- YOLOX-S official ONNX from upstream release `0.1.1rc0`;
- Apache-2.0;
- SHA-256
`c5c2d13e59ae883e6af3b45daea64af4833a4951c92d116ec270d9ddbe998063`;
- FP32 input `[1,3,640,640]`, BGR, bilinear top-left letterbox, pad 114;
- FP32 output `[1,8400,85]`, official grid/stride decode, COCO-80;
- Triton 2.70.0 / ONNX Runtime GPU backend in the pinned 26.06 image.
This generic model is useful for proving the contract and timing path. It is not
accepted for obstacle avoidance, free-space estimation or safety decisions.
## Open gates
1. Import the accepted result as an optional session-timestamped Rerun layer.
2. Qualify TEST007's 206-second epoch and record throughput/resource telemetry.
3. Replace SSH/SCP with a reviewed authenticated worker transport.
4. Add bounded live queues, sampling/drop policy and acquisition-isolation
tests.
5. Introduce tracking, segmentation/free-space, calibration and point-cloud
models as separate versioned pipelines.

View File

@ -0,0 +1,73 @@
# ADR 0014: Bounded external perception worker
## Status
Accepted for recorded laboratory execution on 2026-07-19. Live transport and
behavior integration are not accepted.
## Context
Mission Core has a canonical K1 control/archive path and a second workstation
with an RTX 4090. Sending the entire K1 archive to an ad hoc model environment,
letting the GPU host connect to K1 or installing another monolithic Mission Core
would erase the product boundary already established around the device plugin.
The first useful hypothesis is narrower: can one sealed observation be sent to
a replaceable executor, processed by a standard model server and returned as a
versioned derived observation with enough identity to reproduce and reject
stale results?
## Decision
1. Mission Core Edge on the Mac remains the sole K1 command owner and
authoritative raw archive owner.
2. The edge publishes a bounded `missioncore.compute-job/v1`. The first profile
contains one canonical camera codec epoch, its archive index/summary and a
path-free manifest; it never contains the full MQTT capture.
3. The input generation SHA-256 covers session/source identity, media contract,
timeline, ordered file identities and byte counts. The job directory name is
derived from that generation and publication is atomic.
4. Camera packaging uses the saved-session `RecordedMediaInspector` timing and
digest contract. It additionally verifies summary-level index and complete
stream digests before handoff.
5. The Windows worker is an executor, not a second Mission Core. It revalidates
every staged file, decodes a derived copy and cannot talk to K1.
6. NVIDIA Triton is the first replaceable inference runtime. YOLOX-S is the
first generic detector because its official repository/deployment path is
Apache-2.0 and an official ONNX artifact can be pinned by SHA-256. Model
weights stay outside Git.
7. A result identity covers the full input generation, pipeline, model digest
and parameters. `missioncore.compute-result/v1` plus its detection artifact
is atomically published under `result-<identity-sha256>`. Exact repeats
validate and return the existing generation without inference.
8. Detections are observations only. They cannot emit scanner, motion or mission
commands.
9. SSH/SCP is permitted for the recorded lab bootstrap only. Direct Triton or a
later routed transport must receive its own address, authentication, bounded
queue and failure-policy review before live use.
## Accepted evidence
TEST007 left epoch 1 produced job
`recorded-camera-fae25b92ecf645c2c9765dd4`. All 59 transferred files and
4,567,569 package bytes were verified. The worker reconstructed the canonical
4,549,458-byte H.264 stream with SHA-256
`bceca577f762fdb79c4e8901e5c2a2330fd07d24dc091b1b703c5af4010d8a56`
and decoded 56 frames over 5.497 seconds.
Pinned YOLOX-S produced the accepted result
`result-5484a72e81192b19f4e1da2a2dcfd10c876c277ff3e96c6d60cbc9d917b9f604`.
It contains 56 generic `person` detections over 54 frames. Mean client-observed
Triton request latency was 15.611 ms and p95 was 23.728 ms. The result is not a
quality acceptance for navigation.
## Consequences
- Model/runtime changes can be compared against the same immutable input.
- The worker can later move from the lab LAN to a routed host without changing
K1 ownership.
- Storage temporarily duplicates the bounded encoded stream and preprocessed
frames on the worker; retention remains unimplemented.
- Host-arrival camera timing does not become sensor calibration.
- The next accepted vertical must project this result into the saved Rerun
timeline before live fan-out is introduced.

View File

@ -0,0 +1,50 @@
# Lab 005: First recorded external perception acceptance
Date: 2026-07-19 (Europe/Moscow).
## Scope
One sealed TEST007 left-camera epoch was packaged by Mission Core Edge, copied
to the Windows RTX 4090 worker, decoded and submitted to pinned YOLOX-S through
Triton. No K1 command was sent and no raw source file was modified.
## Evidence identities
- session: `20260718T201659Z_viewer_live`;
- job: `recorded-camera-fae25b92ecf645c2c9765dd4`;
- input SHA-256:
`fae25b92ecf645c2c9765dd4b4963f23cf8c101f22fd5a2e14a104f0b447140d`;
- 59 transferred files, 4,567,569 bytes;
- canonical stream: 4,549,458 bytes, SHA-256
`bceca577f762fdb79c4e8901e5c2a2330fd07d24dc091b1b703c5af4010d8a56`;
- decode: H.264 High, 800x600, 56 frames, 5.497 seconds;
- model SHA-256:
`c5c2d13e59ae883e6af3b45daea64af4833a4951c92d116ec270d9ddbe998063`;
- result:
`result-5484a72e81192b19f4e1da2a2dcfd10c876c277ff3e96c6d60cbc9d917b9f604`;
- detections artifact: 23,802 bytes, SHA-256
`71b291616e87bbdd2b7a295b1e00dac2ff3e60c627e63b72a27ba802c32a3ae0`.
## Observed result
All 56 frames were processed. The generic detector returned 56 `person`
detections across 54 frames, with confidence 0.2507290.530741. Client-observed
Triton request latency was mean 15.611 ms, p50 15.001 ms, p95 23.728 ms and max
31.099 ms.
Fragment boundaries contain repeated DTS values, but all 56 frames decode and
the persisted best-effort timestamps are strictly increasing. Synchronization
remains host-arrival best effort.
The first runner attempt completed all inference requests but failed a
post-inference EOF guard before publication. No partial result directory was
published. After correction, the content-addressed result was published. An
identical repeat left Triton's inference count unchanged at 168, proving reuse
of the existing result.
## Interpretation
This accepts the external recorded compute boundary, not detector quality or a
vehicle decision loop. The result has not yet been projected into Rerun. SSH/SCP
is retained only as laboratory bootstrap evidence and is not the product data
plane.