docs(perception): record bounded binary ingress evidence and remaining bridge

This commit is contained in:
DCCONSTRUCTIONS
2026-09-02 12:37:25 +03:00
parent 79ce55d197
commit c23e86fd39
3 changed files with 162 additions and 4 deletions
@@ -8,6 +8,9 @@ GO на инженерную реализацию этапа 2, не полны
Продолжение на 2026-09-02 11:00 МСК: начат этап 2, вынесен общий scheduler
и реализован per-cell expiry. Два новых Worker-прогона и точная parity приведены
в последнем разделе этого же журнала. Этап 2 целиком ещё не закрыт.
Продолжение на 12:35 МСК: третий инкремент — общий bounded binary raw IPC,
103/103 исходных событий до End и negative EOF на Worker. Это raw-digest probe,
не новый полный model run. Decoder/full-graph bridge ещё требуется.
Продолжение на 12:00 МСК: добавлены subprocess lifecycle, Worker-local
cooperative ownership и fencing; normal/две expiry пробы и межконтейнерное
владение проверены. Последний раздел фиксирует этот второй инкремент этапа 2.
@@ -1341,3 +1344,113 @@ trusted recovery/inventory enforcement и standalone image без code/model mou
Stage 3 UI/registry/batch cutover не начинался. Все real-time/network/full-session/
quality/vehicle gates и actuation=false сохраняются; новый image build и
исторический NVCR403 blocker в этом шаге не проверялись.
## Этап 2, третий инкремент — bounded binary raw IPC, 2026-09-02 12:35 МСК
Коммиты: `da60fef` — общий wire/sender/receiver и raw byte reservations;
`a937400` — End-marker до закрытия probe, unique run/epoch по experiment;
`79ce55d` — reuse существующего raw-first ingress без изменения wire v1.
Ни одного нового model run, изменения весов/thresholds/clocks или переключения
product LAB path в этом инкременте нет.
### Что реально реализовано
`missioncore.live-perception-wire/v2` сохраняет поля `LiveIngressEvent`:
session/generation, ingress и source sequences, modality/source, original capture
и source-host arrival stamps. JSON metadata использует decimal uint64 strings;
payload бинарный, без base64, PNG-конверсии или целого архива. Header ≤64 KiB,
fragment ≤1 MiB, raw camera event ≤1 MiB, LiDAR/pose ≤2 MiB — прежние modality
bounds, не новый источник/протокол K1. Full StreamStart и acquisition mapping
сверяются на Open; binding SHA повторяется на каждом fragment/control.
Это integrity/fencing, не сетевая authentication.
Один receiver собирает одно событие; проверяет offsets, размер, SHA каждого
fragment и целого observation, source identity/sequence/clock. Camera без init
отклоняется; gap требует нового init. Парсинг NAL/IDR/codec и превращение fMP4
в кадры пока не реализованы этим слоем. End — явное событие, не prerequisite
для доставки; Cancel и modality gap/unavailable отдельны. Неожиданный EOF,
timeout, порча и переполнение завершают bound stream, не растягивают source time.
Неверный Open ещё не bound peer и не может отменить текущего владельца.
Sender синхронный, без фоновой очереди; source adapter отвечает за pacing и
владение исходным payload. Receiver thread tracked общим lifecycle, idle read
перепроверяет lease. Reassembly и raw/header copies резервируются **до**
аллокации в том же 16-MiB бюджете, что queued/active bundles. Cancel не освобождает
live reservations. Callback получает borrowed raw bytes только на время вызова;
будущий decoder обязан отдельно резервировать scratch до выделения памяти и
не удерживать raw вне этого контракта. Counter не заменяет RSS: Python object,
kernel/socket, source cache и model tensor budgets проверяются отдельно.
### Worker 006: фактический inter-process input
Принятый experiment: `perception-stage2-binary-ingress-worker-20260902T1232MSK`.
Один временный CPU-only контейнер, network none, без GPU request, 2 CPU / 768 MiB,
read-only image, ограниченный tmpfs; новый image не строился. Источник и receiver
разделены процессом/socket. Source adapter читает существующие camera init/media
по одному chunk с проверкой index SHA и incrementally — прежний normalized
sensor NPZ. Точки сохраняют xyz f64 + intensity u8, pose — position/quaternion;
это normalized archive inputs, не выданные за исходный vendor packet/K1 live feed.
Отсутствующий у этих sensor rows UTC не придумывается (0), original host stamps
сохранены. Calibration в hash-only probe не используется и явно имеет synthetic
identity; model scene по этому probe не допускается.
Источник ограничен 32 camera events для canary, но receiver не получает ни
frame count, ни duration, ни inventory. Prefix и bounded prerelease sensor rows
не скрываются: считано 146/4598 pose rows, 139/4570 point batches,
333168/10751258 xyz rows. Это не полный pass, не full-file hash и не полный decode.
| Метрика | Принятый raw IPC probe |
| --- | --- |
| Sent / received | 103 / 103, exact bytes/metadata |
| Состав | init 1, camera 32, LiDAR 34, pose 36 |
| Доставка каждого data channel до End | PASS |
| Wire bytes | 4,061,693 |
| Пик input byte budget / остаток | 553,991 / 0 bytes |
| Cgroup memory peak normal | 51,773,440 bytes |
| Source release lag max | 3.717 ms |
| Межпроцессный send-start → hash callback p50/p95/p99/max | 0.292 / 0.419 / 0.601 / 0.669 ms |
| Sender write p95/p99 | 0.190 / 0.316 ms |
Интервалы измерены на одной Linux kernel monotonic timeline, не вычитанием
несогласованных source/remote clocks. Эти sub-ms значения не включают decode,
модели, TGS, scene delivery, сетевой маршрут или browser. Их нельзя прибавить
к прошлому p99 и объявить новую real-time квалификацию без полного замера.
Отдельная synthetic negative проба оборвала LiDAR observation 1,048,593 bytes
после первого 1-MiB fragment: started=1, completed=0, incomplete=1,
terminal=failed, никакого payload callback. Peak bytes 2,293,803 (включая
консервативный copy reserve), после cleanup 0. Обе пробы: lease released,
owned children=0 live, active GPU/CPU calls=0. Временный source process и
контейнер убраны; никаких постоянных volumes/leases этим probe не создано.
### Неуспешные попытки и финальная фиксация
Попытка `1230MSK` отклонена до observations: в diagnostic code pack не хватило
`k1link.data_plane` (и зависимого perception contracts); точный import failure
подтверждён отдельным CPU-only check. Исправлен только состав snapshot.
PowerShell stderr redirection также исправлена для сохранения traceback.
Попытка `1231MSK` передала 103/103 и корректно обработала negative EOF, но
финальный source timestamp мог не сохраниться: source закрывал socket до записи
marker, а supervisor уже останавливал child. Acceptance остановлена на missing
evidence. Marker перенесён до End; следующий отдельный experiment повторил обе
пробы. Старые folders/logs/owner results не перезаписывались.
276 focused tests PASS (включая 40 новых ingress cases и legacy live-perception
regressions); Ruff, mypy четырёх core modules, diff-check PASS. Full suite не
запускался; прежние baseline-symlink/NVCR403 вопросы не пересматривались.
Manifest: `.runtime/perception-stage2-binary-ingress-worker-20260902T1232MSK/manifest.json`,
42 artifacts, SHA-256
`2a5492080027a86de9f176f051c9265e29f377d1d9207c86ac93cdff7632505a`.
Он ссылается на отдельные sealed rejected manifests 1230/1231. Копии evidence
находятся в одноимённых папках `D:/NDC_MISSIONCORE/runtime/experiments/`.
Model/raw inputs в Git не добавлялись. Четыре Mission Core сервиса продолжали
работу, Triton ready=200; Ollama/Frigate exited/restart=no. Probe/import-check
containers=0. GPU auto P8, 979 MiB, 450 W; Mac 8000=200, 8765 закрыт.
**Gate:** принят bounded raw IPC core. Следующий шаг — persistent incremental
camera decoder и causal sensor adapter, соединяющие этот ingress с тем же
полным DDRNet/RF-DETR/geometry/motion/TGS/policy графом, затем full-graph
parity/timing на новом входе. Network/gRPC/authentication, constant controller
root/recovery/inventory, standalone image и product cutover остаются открытыми.
Этап 2 не закрыт, этапы 3–4 не начаты; actuation=false.