docs(perception): record bounded binary ingress evidence and remaining bridge
This commit is contained in:
@@ -99,6 +99,47 @@ explicit byte bound is required. No duplicate new scanner feed is introduced.
|
||||
|
||||
## Time and lifecycle
|
||||
|
||||
Stage-2 raw IPC increment, 2026-09-02 (`da60fef`, `a937400`, `79ce55d`):
|
||||
`streaming_wire.py` maps existing `LiveIngressEvent` fields into
|
||||
`missioncore.live-perception-wire/v2`. The v1 producer hooks, class and legacy
|
||||
serialization remain unchanged. A bounded length-prefixed JSON header carries
|
||||
decimal uint64 projections; payloads remain binary. This is a controller-supplied
|
||||
IPC socket candidate, not a selection/replacement of the intended gRPC network
|
||||
transport. No listener, arbitrary endpoint, scanner feed or command path is added.
|
||||
|
||||
Open compares the entire expected StreamStart and acquisition session binding;
|
||||
every fragment/control carries a digest of that full binding. A hash is integrity,
|
||||
not authentication. Fragment size is at most 1 MiB, event caps reuse the existing
|
||||
1 MiB camera / 2 MiB LiDAR/pose limits. Headers are capped at 64 KiB. One
|
||||
observation assembles at a time with exact offsets, fragment and whole-event
|
||||
SHA-256, per-channel source identity/sequence/clock checks. End, Cancel and
|
||||
gap/unavailable notices are explicit. EOF without End, timeout, malformed,
|
||||
cross-binding or incomplete input fails the bound stream; an unbound wrong Open
|
||||
is rejected without stopping the current owner. Camera frames require init;
|
||||
camera gap invalidates init. Actual codec/keyframe/IDR validation is NOT yet here.
|
||||
|
||||
`StreamingSender` owns no queue and fails on its bounded write deadline rather
|
||||
than stretching replay time. `StreamingIngress` is a lifecycle-tracked thread;
|
||||
idle reads poll the lease and cannot keep accepting an expired owner. Raw/header
|
||||
and reassembly reservations charge the SAME StreamMailbox 16 MiB input budget as
|
||||
queued/active bundles. They survive cancellation until the borrowing callback
|
||||
returns and buffers are dropped. Reservations are count-bounded too. Trusted
|
||||
decoder adapters must reserve scratch BEFORE allocation and must not retain raw
|
||||
callback bytes outside that ownership contract. Python metadata object overhead,
|
||||
socket/kernel buffers, source adapter memory and model tensors additionally need
|
||||
RSS/OS resource bounds; this application counter alone is not a total-RSS claim.
|
||||
|
||||
Worker evidence uses a separate source process, original camera init/fMP4 segments
|
||||
and existing normalized point/pose increments paced at original 1x times. All
|
||||
103 events (32 camera + init + 34 LiDAR + 36 pose) match exact bytes/metadata, each
|
||||
data modality reaches the hash-only consumer before End, and incomplete EOF
|
||||
delivers no observation. Normal peak input is 553,991 bytes. This validates raw
|
||||
IPC, NOT decoder output, the full graph on this ingress, model performance,
|
||||
authenticated network behavior or a standalone image. The next adapter must
|
||||
feed incremental decode and causal sensors into the same graph without using
|
||||
the old concatenated camera file or precomputed geometry. Product source queues,
|
||||
backend routes and the browser are not switched by this increment.
|
||||
|
||||
Open → validate bounded metadata/claim → warm models → Ready → start the replay
|
||||
clock → observations and incremental scenes → stop/drain bounded state → close
|
||||
and asynchronously seal the immutable receipt. A live source already producing
|
||||
|
||||
Reference in New Issue
Block a user