docs(perception): record controller readiness boundary and fault evidence

This commit is contained in:
DCCONSTRUCTIONS
2026-09-02 14:54:43 +03:00
parent 92625bf48b
commit 06a66a3da8
3 changed files with 129 additions and 6 deletions
@@ -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.