docs(perception): record controller readiness boundary and fault evidence
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
# Observatory: четыре этапа создания полного real-time Perception-профиля
|
||||
|
||||
Дата: 2026-09-01; обновлено 2026-09-02 14:22 МСК. **Этап 1 закрыт; этап 2 в работе. Шестой инкремент: устранено численное расхождение wire-pose и лишние копии кадров в IPC.** Два новых полных binary-прогона дали 128/128 exact raw parity, включая расстояния, без drops и без полного MP4. При временно фиксированных штатных частотах GPU p95/p99 = 85.113/91.219 и 82.425/90.530 ms; локальный gate 125 ms PASS. Это не общий real-time допуск: fresh 76/128, остаются исходные 52 sensor gaps; сеть, другие записи и standalone не проверены. Предыдущий auto-clock 161.974/191.806 ms не отменён; постоянная фиксация частот не вводилась. Далее controller/operating-envelope/network и standalone image; этапы 3–4 не начаты.
|
||||
Дата: 2026-09-01; обновлено 2026-09-02 14:52 МСК. **Этап 1 закрыт; этап 2 в работе. Седьмой инкремент: controller readiness связан с общим streaming lifecycle.** Просроченный/неизвестный inventory, потеря владельца или идентичности останавливают admission/compute/results; heartbeat не заменяет свежую телеметрию. Явный `labelled-experiment` допускает низкие clocks/выход из performance envelope, но не выдаёт qualification. Worker CPU-only: четыре сценария PASS, cleanup 10.676–63.994 ms, input/children/lease released. Это synthetic GPU facts + реальные Linux child processes, не production GPU collector и не новый замер полного графа. Далее trusted collector/control-plane adapter, recovery, network и standalone image; этапы 3–4 не начаты.
|
||||
|
||||
Последние изменения: `380b6ea` — выравненная immutable quaternion-копия, `f39f1ff` — borrowed image buffers вместо full-frame IPC copies. 279 focused tests PASS, Ruff/format/mypy PASS. CPU numerical probe воспроизвёл оба старых отклонения сменой адреса одинаковых данных; tolerance/формулы/пороги не менялись. Полный A–B–B–A выполнен последовательно: все четыре 128/128 без drops, частоты по всем samples 2610/10251 MHz. IPC overhead уменьшился примерно на 0.5 ms у decoder и на 0.5 ms у DDRNet; общего кратного ускорения от этого нет. GPU auto mode и четыре сервиса восстановлены, Ollama/Frigate выключены; product batch path не переключён.
|
||||
Последний код `92625bf`; 349 focused tests PASS, Ruff/format/mypy PASS. В probe нет GPU devices, моделей, записей, Docker socket или новых образов; сервисы/частоты не менялись. Предыдущие полные binary-прогоны сохраняют 128/128 exact raw parity; p95/p99 85.113/91.219 и 82.425/90.530 ms относятся только к временно фиксированным штатным clocks. Fresh 76/128 и исходные 52 sensor gaps остаются, прежний auto-clock FAIL не отменён. Product batch path не переключён; существующий PilotController ещё не получает настоящую непрерывную GPU-телеметрию.
|
||||
|
||||
Текущий evidence: [отчёт этапа 1](../experiments/perception/PERCEPTION_STREAM_STAGE1_2026-09-01.md), [ADR 0049](adr/0049-stream-first-perception-profiles.md), [candidate manifest](../config/perception/k1-perception-ddrnet39-rfdetr-tgs-prototype-v1.json). Запрет full-source preload закреплён в новом контракте; старый batch materializer пока не удалён и продуктовый путь не переключён.
|
||||
|
||||
@@ -143,7 +143,7 @@ IPC/сети, копирований и оркестрации. Вычислит
|
||||
|
||||
## Этап 2 — Самостоятельный Docker с полным потоковым вычислением
|
||||
|
||||
**Текущий статус, 14:22 МСК:** в работе. Binary full graph уже имеет exact raw parity 128/128 на двух повторах; проблема последних float-разрядов закрыта исправлением layout, без нового tolerance. Локальная задержка ≤125 ms измерена только при фиксированном operating envelope, не в общем auto/network режиме; исходные sensor gaps остаются. Следующая граница — production controller/admission/recovery, continuous GPU inventory/envelope monitoring, network ingress и standalone image. Не удерживать эту работу ради ещё одного бесконечного microbenchmark: текущий bounded baseline достаточен для развития runtime, но не для qualification. GO на этап 3 пока нет.
|
||||
**Текущий статус, 14:52 МСК:** в работе. Binary full graph имеет exact raw parity 128/128; локальная задержка ≤125 ms измерена только при фиксированном operating envelope. Теперь `WorkerReadinessMonitor` проверяется в `StreamingLifecycle` перед startup/ready, admission, compute, result, renewal и каждые 50 ms watchdog. Есть strict/labelled-experiment режимы, terminal loss без resurrection и сохранение lease до verified cleanup. Контроль проверен синтетически и CPU-only на Worker. Следующая незакрытая граница — реальный trusted GPU/inventory collector и control-plane adapter для полного профиля, затем recovery/network/standalone. Не объявлять optional monitor в core подключённым production controller; unmonitored runtime явно сообщает `enabled=false`. GO на этап 3 пока нет.
|
||||
|
||||
**Цель:** один самостоятельный контейнер принимает поток и реально рассчитывает DDRNet, детекции, расстояния, motion, TGS/costmap и policy-shadow; ничего не дорисовывается из старых LAB.
|
||||
|
||||
@@ -224,6 +224,7 @@ EoMT — семейство ViT-моделей сегментации изобр
|
||||
|
||||
## Progress
|
||||
|
||||
- 2026-09-02 14:52 МСК: `92625bf`, readiness/lifecycle increment. 349 focused tests PASS; Worker Linux CPU-only 4/4 scenarios, stop 10.676–63.994 ms, 0 residual bytes, terminal fixture lease generation 4 released. Expired inventory остановил runtime через 1043.960 ms после последнего refresh, несмотря на 13 heartbeat renewals; late refresh/result rejected. Allowed overload сохранил violation после восстановления clocks. 70 measured code files verified, 86 evidence artifacts; `.runtime/perception-stage2-readiness-worker-20260902T1450MSK/manifest.json`, SHA-256 `4588995d763fe82d896b42689e981f1d00feedaf9d6aab29f4579f771d03da3a`. GPU facts synthetic, no model timing or collector qualification. Service IDs/StartedAt/restart counts неизменны до/после; у legacy agents уже были restart counts 21/2/2 — состояние running не объявляется устойчивой готовностью. Clock setters, service mutations, network listeners, registry/UI отсутствуют.
|
||||
- 2026-09-02 14:22 МСК: `380b6ea` / `f39f1ff`. CPU probe (NumPy 1.26.4, Worker x86) воспроизвёл две ошибки range_m через quaternion address 8 mod 16; aligned copy сохраняет bytes и прежние norm/projection результаты. Удалены четыре full-frame copies на связке decoder→parent→DDRNet; binary framing, source clock, TTL, lease checks не менялись. A–B–B–A, 4×128 без drops: контроль p95/p99 84.702/92.961 и 83.930/91.759 ms; кандидат 85.113/91.219 и 82.425/90.530 ms. Кандидат raw parity 128/128 дважды, available/fresh 76/128; global qualification=false. CPU oracle 128/128 BGR/sensors для обоих вариантов, hung decoder cleanup PASS. 279 focused tests PASS. Manifest 305 artifacts, SHA-256 `9c72a93833a1dda51c4787dca13fb9791a1bf2e31c763b7740e1b21406703707`, `.runtime/perception-stage2-ipc-worker-20260902T1410MSK/manifest.json`. Частоты auto и сервисы восстановлены; registry/UI/image не менялись.
|
||||
|
||||
- 2026-09-02 13:55 МСК: `221e429` — supervised decoder RPC (250 ms deadline, 1 MiB input / 1,440,000-byte caller-owned BGR), общий causal sensor cache и atomic reservation → mailbox transfer. CPU oracle 32/32 exact до полного запуска и после review; native-hang injection учтён как failed cameras 0/1/2, child/lease/input освобождены. Полный binary 1×: 384/384 событий, 128/128 сцен без drops, BGR/segmentation/proposals/tracks/threats/material/raw costmap exact; два range_m отличаются на 1.388e-17 m, strict parity=false. p95/p99 161.974/191.806 ms; 76 available sensor pairs, 74 fresh scenes, seq106/107 дополнительно stale. 271 focused tests, Ruff/format/mypy PASS. Evidence `.runtime/perception-stage2-binary-graph-worker-20260902T1335MSK/manifest.json`: 161 artifacts, SHA-256 `e224de4e9f2c5fd419fe0fb0b9be6e01ec267628568e104795ae211ec803bce4`. Один GPU-прогон, без изменений clocks/quotas/models; сервисы восстановлены. Standalone/network/product cutover не заявлены.
|
||||
@@ -319,6 +320,6 @@ EoMT — семейство ViT-моделей сегментации изобр
|
||||
|
||||
## Outcomes / retrospective
|
||||
|
||||
Этап 1 остаётся завершённым engineering baseline. На этапе 2 binary full graph уже сохраняет reference raw outputs на 128/128 кадрах, включая geometry ranges; источник 1×, pending ≤2, input <16 MiB, cleanup normal/failure проверен. После удаления лишних copies полный p99 двух кандидатов 91.219/90.530 ms при зафиксированных штатных частотах; контроль 92.961/91.759 ms. Это небольшая оптимизация IPC и доказанный conditional timing baseline, не универсальный real-time статус. Fresh 76/128 из-за source gaps; предыдущий auto-clock FAIL сохранён. Теперь следующий инкремент направлен на controller/operating-envelope/network и standalone packaging, а не на изменение моделей/порогов. Старые batch/registry/UI не переключены, этапы 3–4 не начаты. Mac только focused tests; GPU clocks возвращены в auto, четыре сервиса восстановлены, Ollama/Frigate выключены.
|
||||
Этап 1 завершён; этап 2 продолжается. Полный binary graph сохраняет 128/128 raw outputs, original 1× и bounded input; предыдущий conditional timing baseline не расширен. В общий lifecycle добавлен readiness gate с независимыми lease/inventory deadlines и двумя явными performance modes. Четыре Worker CPU-only faults проверили stop/fencing/retirement, но GPU факты в них synthetic. Следом — реальный read-only collector и доверенная доставка его snapshot в полный профиль, затем recovery/network/standalone packaging. Optional monitor без collector не закрывает production admission. Full-GPU timings, source gaps и quality gates прежние; no actuation. Старые batch/registry/UI не переключены, этапы 3–4 не начаты. Mac 8000=200, 8765 закрыт; Worker services/auto clocks не менялись, Ollama/Frigate exited/restart=no.
|
||||
|
||||
После этапа 4 здесь будут перечислены digest самостоятельного полного образа, измеренные статусы и ошибки по recordings, реально проверенные source/hardware/config комбинации, состояние сохранённого EoMT-варианта и оставшиеся physical-live/quality/vehicle-integration ограничения. Готовый Docker и готовая автономия не отождествляются.
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
# ADR 0049 — Stream-first full perception profiles
|
||||
|
||||
Date: 2026-09-01; updated 2026-09-02 14:22 MSK. Status: stage-1 engineering
|
||||
baseline complete; stage-2 binary full-graph prototype, not a product runtime cutover.
|
||||
Date: 2026-09-01; updated 2026-09-02 14:52 MSK. Status: stage-1 engineering
|
||||
baseline complete; stage-2 binary graph and controller-readiness primitives,
|
||||
not a product runtime cutover or a connected production inventory collector.
|
||||
Execution order remains the four stages in
|
||||
[the ExecPlan](../OBSERVATORY_REALTIME_PROFILES_EXECPLAN.md).
|
||||
|
||||
@@ -100,6 +101,42 @@ explicit byte bound is required. No duplicate new scanner feed is introduced.
|
||||
|
||||
## Time and lifecycle
|
||||
|
||||
Stage-2 controller-readiness increment, 2026-09-02 14:52 (`92625bf`):
|
||||
`WorkerReadinessMonitor` consumes existing `WorkerOperatingEnvelope` and
|
||||
`WorkerSnapshot` under the same lifecycle lock as admission. No host I/O occurs
|
||||
under this lock. The trusted controller, not a sensor payload, provides the
|
||||
snapshot in a locally comparable Worker monotonic clock domain and seals the
|
||||
mode/envelope into its effective configuration. Snapshot arrival is not a lease
|
||||
renewal, and renewing a lease does not refresh inventory. Identity, exclusive
|
||||
ownership, known inventory and freshness are mandatory in both modes.
|
||||
|
||||
`strict-envelope` rejects post-warmup performance conditions outside the
|
||||
preregistered envelope. `labelled-experiment` permits these conditions, including
|
||||
unknown performance facts, but records violations and never grants real-time
|
||||
qualification. It cannot waive unknown/competing GPU clients, stale inventory,
|
||||
changed worker/image/config/owner or missing warmup. Low clocks during STARTING
|
||||
do not prohibit model warmup; transition to RUNNING checks warmup explicitly.
|
||||
Freshness is checked before spawn/admission/compute/result/heartbeat and in the
|
||||
50-ms watchdog. A late telemetry refresh cannot resurrect expired authority;
|
||||
old StreamStart updates are rejected without stopping the current owner.
|
||||
|
||||
Readiness loss enters STOPPING and stops only owned child groups. A new owner
|
||||
still requires verified child/thread/callback/input release and a new generation
|
||||
and epoch. The monitor cannot clear an active durable lease, force recovery,
|
||||
start a replacement model, change host clocks/quotas or stop other services.
|
||||
It retains one snapshot and bounded reason sets, not unlimited telemetry history.
|
||||
|
||||
The existing diagnostic PilotController has no continuous real collector yet;
|
||||
unconfigured runtimes expose `worker_readiness.enabled=false` and cannot claim
|
||||
monitored readiness. No authentication or host-clock translation is implemented
|
||||
by this in-process method. External inventory collection, control-channel
|
||||
delivery, production admission/recovery and standalone packaging remain stage 2.
|
||||
349 focused tests and four sequential Worker Linux CPU-only scenarios pass.
|
||||
The latter use synthetic GPU facts, zero GPU devices/models and real child
|
||||
processes: stop 10.676–63.994 ms, zero residual input, released fixture generation
|
||||
4. These are not new GPU graph timings. Evidence manifest SHA-256:
|
||||
`4588995d763fe82d896b42689e981f1d00feedaf9d6aab29f4579f771d03da3a`.
|
||||
|
||||
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
|
||||
|
||||
@@ -1851,3 +1851,88 @@ operating-envelope/inventory, network boundary и standalone packaging.
|
||||
автоматической властью будущего controller; installed/available/running/
|
||||
qualified остаются разными состояниями. Старые LAB/registry/UI не переключены;
|
||||
этапы 3–4 не начаты, global real-time qualification=false, actuation=false.
|
||||
|
||||
## 2026-09-02 14:52 МСК — этап 2, инкремент 7: controller readiness в lifecycle
|
||||
|
||||
**Результат:** common runtime умеет прекращать работу при потере доверенного
|
||||
Worker readiness и отдельно допускает явно обозначенный performance experiment.
|
||||
Это связка готового envelope validator с lease/supervisor, не новый GPU collector,
|
||||
не production controller service и не отдельное приложение лаборатории.
|
||||
|
||||
Код `92625bf`: `worker_readiness.py`, подключение к `streaming_lifecycle.py`,
|
||||
focused tests и CPU-only `pilot_readiness_probe.py`. У модели/сенсорного payload
|
||||
нет права обновлять inventory. `observe_worker(start, snapshot)` принадлежит
|
||||
доверенному controller; полный StreamStart сверяется до изменения monitor.
|
||||
Mode/envelope должны входить в effective config SHA; fixture это выполняет.
|
||||
Clock domain snapshot — локальный Worker controller, не сырой clock Mac/Windows
|
||||
или timestamp исходной камеры. Будущий collector должен доказать это соответствие.
|
||||
|
||||
Проверка идёт при startup/ready, admission, compute entry/return, result receipt,
|
||||
heartbeat и watchdog каждые 50 ms. Heartbeat не продлевает age inventory; новое
|
||||
inventory не продлевает lease. Старый snapshot проверяется до замены: опоздавший
|
||||
refresh не оживляет просроченного владельца даже между watchdog ticks. Wrong
|
||||
StreamStart не способен отменить текущего владельца; malformed/current clock,
|
||||
future/regressing/duplicate snapshot и unknown inventory дают terminal failure.
|
||||
|
||||
Strict mode требует post-warmup envelope. Labelled experiment разрешает
|
||||
performance mismatches/unknown (GPU model/driver/CPU/RAM/clocks), сохраняет их
|
||||
ограниченный набор в `post_warmup_envelope_violations` и не скрывает нарушение
|
||||
после возврата хорошего snapshot. Оба режима запрещают unknown/busy GPU inventory,
|
||||
неподтверждённого владельца, чужую image/config identity, stale facts и missing
|
||||
warmup при переходе в RUNNING. Warmup допускает низкие idle clocks в STARTING.
|
||||
Ни один режим не даёт real-time qualification или actuation.
|
||||
|
||||
### Worker Linux proof — только CPU и synthetic GPU facts
|
||||
|
||||
Один временный CPU-контейнер: pinned прежний diagnostic image, runc, network none,
|
||||
read-only code, 1 CPU / 256 MiB, pids64, tmpfs16MiB. Нет `--gpus`, GPU devices,
|
||||
model/recording mounts, Docker socket, GPU clock calls или service mutations.
|
||||
Каждый из четырёх сценариев запускает только один короткий Python child; все
|
||||
сценарии последовательны. Общая длительность 2.494 s.
|
||||
|
||||
| Сценарий | Результат | Stop → полный cleanup, ms |
|
||||
| --- | --- | ---: |
|
||||
| Strict: низкая memory clock | failed / worker-not-ready | 63.994 |
|
||||
| Labelled experiment: низкая clock, затем восстановление | разрешён, violation сохранён, normal stop | 63.788 |
|
||||
| Unknown inventory | failed / worker-not-ready | 63.964 |
|
||||
| Inventory перестал обновляться, heartbeat продолжает | failed / worker-not-ready | 10.676 |
|
||||
|
||||
Последний snapshot истёк через 1 s; остановка запрошена через 1043.960 ms после
|
||||
последнего refresh (в пределах следующего 50-ms watchdog tick), несмотря на
|
||||
13 renewals. Late refresh/result отклонены. Активный 32-byte input во всех
|
||||
сценариях не позволил освободить lease до явного завершения владения; затем
|
||||
input=0, children=0, heartbeat joined, generation 4 released. Временный fixture
|
||||
lease удалён с сохранением terminal owner в report; probe container auto-removed.
|
||||
Это не физический Worker lease и не измерение остановки GPU inference.
|
||||
|
||||
### Проверки, сохранение состояния и ограничения
|
||||
|
||||
349 focused tests PASS (3.85 s), Ruff/format и mypy двух runtime modules PASS.
|
||||
Единственное предупреждение — прежнее Starlette/httpx deprecation. Никаких
|
||||
моделей, stress/full-suite, Docker Desktop или нового сервера на Mac.
|
||||
Mac 8000=200, 8765 закрыт. Worker Triton ready=200; service IDs/StartedAt/restart
|
||||
counts совпали до/после, Ollama/Frigate exited/restart=no. GPU до/после P8,
|
||||
210/405 MHz, power limit450 W; 982→989 MiB — отдельный read-only host snapshot,
|
||||
не вход monitor и не свидетельство exclusive ownership.
|
||||
|
||||
До probe у трёх legacy agents уже были auto-restart counts 21/2/2. Их running
|
||||
статус не объявляется устойчивой готовностью, причина здесь не исследована;
|
||||
никакого скрытого restart/fix не выполнялось. Это нужно учитывать при будущем
|
||||
collector/preflight, отдельно от correctness новых synthetic lifecycle tests.
|
||||
|
||||
Evidence `.runtime/perception-stage2-readiness-worker-20260902T1450MSK/manifest.json`:
|
||||
86 artifacts, SHA-256
|
||||
`4588995d763fe82d896b42689e981f1d00feedaf9d6aab29f4579f771d03da3a`.
|
||||
70 code hashes сверены между Mac snapshot, Worker и текущим commit. Сохранены
|
||||
preregistered manifest, commands, четыре reports, owner, before/after, source
|
||||
snapshot, analysis; sealed manifest скопирован на Worker. Фактический запуск
|
||||
14:47 МСК указан в UTC/monotonic evidence, ID окна `1450MSK` не подменяет clock.
|
||||
|
||||
**Далее:** доверенный read-only сборщик GPU/inventory и его bounded control-plane
|
||||
adapter в полный профиль, затем recovery/network/standalone image. Existing
|
||||
PilotController пока работает без этого collector и явно выдаёт monitoring
|
||||
disabled. Optional primitive не засчитывается за готовый product controller.
|
||||
Полный граф/GPU timings в этой итерации не повторялись; предыдущие conditional
|
||||
125-ms PASS, auto-clock FAIL, 52 source gaps и quality limits не изменены.
|
||||
Full-source transfer не возвращён, модели/пороги/TTL/CPU-GPU schedule прежние.
|
||||
Этап 2 не закрыт, этапы 3–4 не начаты; registry/UI не переключены, actuation=false.
|
||||
|
||||
Reference in New Issue
Block a user