docs(perception): record exact parity and fixed-envelope IPC comparison

This commit is contained in:
DCCONSTRUCTIONS
2026-09-02 14:28:58 +03:00
parent f39f1ff0b6
commit b8ba0cae1e
3 changed files with 182 additions and 6 deletions
@@ -1,8 +1,8 @@
# Observatory: четыре этапа создания полного real-time Perception-профиля
Дата: 2026-09-01; обновлено 2026-09-02 13:55 МСК. **Этап 1 закрыт; этап 2 в работе. Пятый инкремент: бинарный вход → supervised H.264 decoder → causal sensors → тот же полный DDRNet/RF-DETR/LiDAR/motion/TGS/costmap/policy граф.** Выполнены 128/128 кадров исходного 1× потока, без drops и готового MP4; 384/384 входных события. Новый полный p95/p99 — 161.974/191.806 ms, fresh 74/128: real-time qualification НЕ выдана. BGR/маски/детекции/треки/raw costmap exact 128/128; strict raw parity остаётся открытой из-за двух последних разрядов float в расстояниях. Далее воспроизводимость/хвост задержек и controller/network/standalone image; этапы 3–4 не начаты.
Дата: 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 не начаты.
Последние изменения: `221e429` — bounded decoder RPC, общий causal sensor window, атомарный handoff памяти и полный binary pilot. 271 focused tests PASS, Ruff/format/mypy PASS. CPU oracle до GPU и после review — 32/32 exact sensor bundles; synthetic decoder timeout прекращает поток и освобождает ресурсы. Полный прогон: peak accounted input 8,883,895 bytes, остаток 0; первый результат через 583 ms, 126/128 результатов до End. Один профиль, GPU-модели последовательно; четыре Mission Core сервиса восстановлены, Ollama/Frigate не включались. Auto clocks, quotas/модели не менялись; product batch path пока не переключён.
Последние изменения: `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 не переключён.
Текущий 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 с полным потоковым вычислением
**Текущий статус, 13:55 МСК:** в работе. Binary ingress, supervised native decoder, causal cloud/pose cut и общий ownership/scratch budget соединены с полным графом и измерены на Worker: 128/128 без drops. Результаты выходят до source End; `/source.mp4` не монтируется. Не пройдены p95/p99 125 ms и strict bitwise parity двух geometry floats; допуски задним числом не менялись. Production admission/recovery, continuous GPU inventory/envelope monitoring, network ingress и standalone image ещё не закрыты. GO на этап 3 пока нет.
**Текущий статус, 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 пока нет.
**Цель:** один самостоятельный контейнер принимает поток и реально рассчитывает DDRNet, детекции, расстояния, motion, TGS/costmap и policy-shadow; ничего не дорисовывается из старых LAB.
@@ -224,6 +224,8 @@ EoMT — семейство ViT-моделей сегментации изобр
## Progress
- 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 не заявлены.
- 2026-09-02 10:16 МСК: `097e450` — six-layer shared ABI и read-only Worker operating-envelope checker. Два sequential PyTorch auto-clock runs, 128/128 без drops; финальный C p95/p99 122.11/141.40 ms. 27 свежих полных scenes, 52 missing sensor pairs, 49 stale costmaps; пять дополнительных отказов после receipt aging. Функциональные model/geometry/motion/TGS/material outputs точны к reference 128/128. 142 focused tests + 42 adjacent regressions PASS, 1 исторический evidence-root test FAIL из-за существующих symlinks в соседний checkout; данные и guard не менялись. Этап 1 закрыт как engineering baseline; этап 2 допущен, не реализован. Evidence manifest `3b0a2ad32f6b60d3da48a4bcafdf6e11bc91209abc9d1f65da54b0eb36c52d45`.
@@ -266,7 +268,8 @@ EoMT — семейство ViT-моделей сегментации изобр
## Surprises / открытые вопросы
- 2026-09-02 13:55 МСК: строгая сверка нового full binary run обнаружила только два raw-расхождения: seq13 observation3 и seq29 observation2, `metric_geometry.range_m`, абсолютная разница 1.3877787807814457e-17 m. Никаких округлений или нового tolerance ради PASS не внесено. Причина численной недетерминированности ещё не воспроизведена; input BGR и 32-frame sensor oracle exact, projection/association algorithm не менялся. Следующий parity check должен объяснить это, а не скрыть в comparator.
- 2026-09-02 13:55 → 14:22 МСК: два старых range_m расхождения 1.3877787807814457e-17 m воспроизведены и исправлены. Quaternion начинался на byte 24 общего pose buffer; адрес 8 mod 16 менял norm на один ULP в текущем NumPy runtime. Offsets 0/16/32/48 возвращают reference, 8/24/40/56 точно воспроизводят оба отклонения. Теперь quaternion — отдельная immutable 32-byte копия с проверенным 16-byte alignment; формулы и comparator прежние. Полный граф подтвердил 128/128 exact дважды. Это квалификация numeric layout текущего pinned runtime, не универсальное обещание bitwise равенства на любом CPU/NumPy.
- Четыре удалённые full-frame copies дают небольшой измеримый эффект в IPC, не объясняют разницу 192→91 ms. При одинаковых фиксированных частотах контроль тоже проходил 125-ms gate до оптимизации. Новый p95 колеблется внутри межпрогонного разброса; p99 немного ниже в обоих повторах. CPU-only кандидат имел native-decode outlier и худший total p99, хотя IPC-minus-decode снизился; отрицательный результат сохранён. Автоматический runtime не должен обещать fixed-clock qualification без фактического envelope и не должен сам менять host clocks без отдельной authority.
- В том же запуске auto memory clocks переходят 10,251 → 405–810 MHz. По последнему 0.5-s sample перед receipt high/low cohorts имеют p95 88.269/172.079 ms (39/89 кадров). Это корреляция внутри одного прогона, не controlled A/B и не отдельная qualification. Общий p95/p99 161.974/191.806 ms остаётся FAIL. Decoder p95/p99 10.871/11.606 ms, RPC+bundle 18.053/38.991 ms, очередь 44.284/84.492 ms, DDRNet RPC 73.068/77.479 ms; CPU throttled delta=0. Нельзя приписать всю разницу с предыдущими 124.98/136.12 ms новому транспорту или сделать вывод об исчерпании 24 GiB VRAM.
- 2026-09-02 13:09 МСК: decoder-инкремент `350366b` / `f102712` принят отдельно от full graph. Evidence `.runtime/perception-stage2-decoded-ingress-worker-20260902T1310MSK/manifest.json`, 43 artifacts, SHA-256 `612295eabbc8f203ad9b037a69ac9cf97b2df3134b087d9e51a9786738423f2f`; связан с отдельными 128-frame demux/direct/reference manifests. Все 128 BGR совпадают; 32-camera binary canary и negative EOF освобождают весь input budget. Четыре Mission Core сервиса не останавливались; модели и GPU clocks не менялись.
@@ -316,6 +319,6 @@ EoMT — семейство ViT-моделей сегментации изобр
## Outcomes / retrospective
Этап 1 остаётся завершённым engineering baseline. На этапе 2 общий lifecycle/scheduler и binary input уже питают полный граф через supervised incremental decoder и causal sensor window. Полный MP4 не передаётся, исходный 1× clock сохранён; 128/128 кадров и 384/384 событий учтены, pending ≤2, peak input <16 MiB, normal/failure cleanup освобождает память и lease. Инкремент подтверждает исполнение, а не qualification: p95/p99 161.974/191.806 ms, fresh 74/128, два float-различия strict raw parity остаются открытыми. Далее отдельно воспроизвести численный drift и уменьшать decoder/IPC/queue/CPU-tail latency при измеренном operating envelope. Network/gRPC/authentication, production controller/recovery/inventory и standalone image не приняты; старый batch/registry/UI не переключены. Один полный Worker GPU pilot плюс CPU checks; Mac только focused tests, без full suite/build. Сервис 8000 сохранён, четыре Mission Core сервиса восстановлены, Ollama/Frigate выключены.
Этап 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 выключены.
После этапа 4 здесь будут перечислены digest самостоятельного полного образа, измеренные статусы и ошибки по recordings, реально проверенные source/hardware/config комбинации, состояние сохранённого EoMT-варианта и оставшиеся physical-live/quality/vehicle-integration ограничения. Готовый Docker и готовая автономия не отождествляются.
@@ -1,6 +1,6 @@
# ADR 0049 — Stream-first full perception profiles
Date: 2026-09-01; updated 2026-09-02 13:55 MSK. Status: stage-1 engineering
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.
Execution order remains the four stages in
[the ExecPlan](../OBSERVATORY_REALTIME_PROFILES_EXECPLAN.md).
@@ -243,6 +243,46 @@ Next: explain numerical reproducibility, measure/tune remaining pipeline tails,
then complete controller/network/standalone boundaries within stage 2.
No quality, physical-live, vehicle-control or real-time qualification is granted.
Stage-2 numeric/IPC increment, 2026-09-02 14:22 MSK (`380b6ea`, `f39f1ff`):
the two preceding raw range differences are resolved, not tolerated. A bounded
CPU-only probe on Worker NumPy 1.26.4 reproduces both exact deviations using
identical quaternion values at addresses 8 mod 16. The wire quaternion starts at
byte 24 of a combined pose buffer; its norm changes by one ULP on that layout.
Offsets 0/16/32/48 restore reference norm/rotation/depth, while 8/24/40/56 reproduce
the deviations. The adapter now owns an immutable 32-byte quaternion copy and
checks 16-byte alignment. Input bytes, projection algorithm and tolerances are
unchanged. Other CPU/NumPy combinations still require numerical qualification.
Synchronous local IPC now borrows contiguous image buffers. Decoder and parent
no longer call BGR `tobytes()` for these handoffs; the sender writes framing and
the borrowed body separately instead of concatenating a full message copy.
Partial writes loop with explicit progress validation; noncontiguous buffers
fail before output. The owner retains the image until send completes. This removes
four application-level BGR copies across decoder→parent→DDRNet, not kernel copies,
network bytes, or all intermediate allocations. Framing and lease/deadline checks
are unchanged; a hung-decoder probe still fails and releases all owned resources.
Preregistered sequential ABBA at authorized temporary stock clock locks:
all samples observed SM2610/memory10251 MHz, unchanged 8 CPU/8 GiB/power limit.
Every run completes 128/128 without drops. Control p95/p99 84.702/92.961 and
83.930/91.759 ms; candidate 85.113/91.219 and 82.425/90.530 ms. Both candidates
match reference BGR, masks, objects, geometry/ranges, tracks, threats, materials,
lineage/binding and raw costmap exactly on 128/128. Baselines still reproduce the
two old float deviations. Median decoder RPC-minus-decode falls 1.6421.825 to
1.1001.118 ms; DDRNet RPC-minus-component 2.1092.217 to 1.5581.613 ms.
This is a modest IPC improvement; full p95 does not show an unambiguous win.
The previous auto-clock 191.806-ms p99 cannot be compared as a copy-only baseline.
Local 125-ms timing passes at this fixed operating envelope, but only 76/128
scenes are fresh because the same 52 input sensor gaps remain. No overall or
auto-clock/network/physical-live qualification is granted. Auto clocks and four
Mission Core services are restored; Ollama/Frigate remain disabled. 279 focused
tests pass. Manifest: 305 artifacts, SHA-256
`9c72a93833a1dda51c4787dca13fb9791a1bf2e31c763b7740e1b21406703707`,
`.runtime/perception-stage2-ipc-worker-20260902T1410MSK/manifest.json`.
Next implementation boundary is the controller/envelope/network integration and
standalone package. Host clock management is not granted implicitly to that controller.
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
@@ -1718,3 +1718,136 @@ operating envelope; затем production controller/admission/recovery/inventor
network ingress/egress и самостоятельный image. Старые product LAB/registry/UI
не переключены. Несколько/полная запись, physical source, field quality и
actuation не проверены. Этапы 3–4 не начаты; real-time qualification=false.
## 2026-09-02 14:22 МСК — этап 2, инкремент 6: exact pose и IPC без лишних copies
Коммиты: `380b6ea` (numeric layout), `f39f1ff` (IPC). Эксперимент
`perception-stage2-ipc-worker-20260902T1410MSK`. Итог: прежние два float-различия
устранены с exact parity полного графа 128/128 на двух повторах. Локальный
125-ms timing gate пройден в фиксированном штатном operating envelope; общий
real-time/network/physical-live статус по-прежнему не выдан.
### Причина численного расхождения и исправление
CPU-only bounded probe использует прежний producer для получения текущих
points/pose и неизменную KB4 projection. Никаких моделей или готовых perception
слоёв в новый граф не подмешивается: frozen observations нужны только для выбора
тех исходных point IDs, по которым сравнивается median range в диагностике.
32-camera prefix, без decode, source copy или полного source pass; этот
offline numerical probe не измеряет real-time latency.
В Worker NumPy 1.26.4 одинаковые quaternion bytes по адресу 8 mod 16 дают другое
округление `np.linalg.norm`, чем по адресу 0 mod 16. Новый combined pose wire body
содержит position (24 bytes) + quaternion (32 bytes), поэтому view quaternion начинался
на byte 24. Это не изменение source pose, association или расстояния как величины.
Управляемые offsets 8/24/40/56 mod 64 **точно воспроизводят** прежние два отклонения;
offsets 0/16/32/48, отдельные bytes и owning NumPy copy возвращают reference.
- seq13: norm `0x1.000033dcb5b18p+0` против reference `0x1.000033dcb5b19p+0`;
- seq29: norm `0x1.000035ea6dab2p+0` против reference `0x1.000035ea6dab3p+0`.
Норма влияет на rotation, projected depths и два опубликованных `range_m`.
Projected source indices остаются одинаковыми. Теперь sensor adapter создаёт
отдельную immutable 32-byte quaternion copy и проверяет 16-byte alignment;
эти bytes входят в существующий cache scratch allowance. Исходные значения,
norm/projection formula, distance-estimator definition и comparator не менялись.
Нового rounding/tolerance нет. Это восстановление numeric layout текущего
квалифицируемого runtime, не гарантия побитного равенства любого CPU/NumPy.
### Уменьшение копирования и CPU canary
Убраны `image.tobytes()` при передаче из decoder child и при отправке в DDRNet;
sender больше не делает `header + payload` с полной копией тела. Передаются
contiguous memoryviews, framing и body записываются отдельно. Partial writes
обрабатываются циклом; нулевой/неверный progress и noncontiguous input отвергаются.
Синхронный sender заимствует buffer только до завершения записи, поэтому прежний
owner не освобождает изображение раньше времени. Wire bytes, lease/epoch guards,
deadlines, queue/TTL budgets и модели не меняются.
Структурно удалены четыре копии BGR по 1,440,000 bytes на кадр на двух границах
decoder→parent→DDRNet. Это не zero-copy OS/kernel и не экономия сетевого трафика;
receiver buffers, model preprocess и обязательные transforms остаются.
CPU baseline/candidate выполняются отдельно, 128 исходных кадров при 1×,
2 CPU / 768 MiB, network none, без GPU request. У обоих BGR и sensor bundles
128/128 exact, residual input=0. Median RPC-minus-decode 1.621→1.060 ms,
p95 2.024→1.499 ms. При этом candidate native decode имел outlier 44.277 ms:
total source-due→dequeue p99 **ухудшился** с 21.323 до 31.722 ms. Это сохранено;
component-copy improvement не выдаётся за стабильный total-latency выигрыш.
### Полный A–B–BA в одном operating envelope
Порядок задан до запуска: baseline → candidate → candidate-repeat → baseline-repeat.
Все четыре отдельно, один полный профиль, serial GPU inference DDRNet + RF-DETR.
По ранее данному разрешению временно заданы штатные `-lgc 2610,2610` и
`-lmc 10501,10501`; **фактически все telemetry samples** показывают 2610/10251 MHz.
Без разгона, power-limit/CPU/RAM quota changes. Исходные 8 CPU / 8 GiB,
read-only/network-none, source clock 1×, без `/source.mp4` и полного preload.
Image/profile/weights/preprocess те же, что в предыдущем binary pilot;
baseline/candidate code snapshots и их hashes сохранены отдельно.
| Run, 128 кадров каждый | p95, ms | p99, ms | Raw observations exact | Fresh при receipt |
| --- | ---: | ---: | ---: | ---: |
| A: baseline | 84.702 | 92.961 | 126/128 | 76/128 |
| B: candidate | 85.113 | 91.219 | 128/128 | 76/128 |
| B: candidate-repeat | 82.425 | 90.530 | 128/128 | 76/128 |
| A: baseline-repeat | 83.930 | 91.759 | 126/128 | 76/128 |
Каждый: released/completed 128/128, drops/source_failed/unaccounted 0,
384/384 ingress observations, peak pending 1 при общем limit 2,
peak accounted input 8,761,039 bytes <16 MiB, residual input/children/lease 0.
Candidate first result 580.2580.3 ms, warmup 7.1317.146 s, stop 4.061 s.
VRAM peak 2363 MiB, RAM 3342.270/3358.859 MiB; CPU throttled delta 0.
Максимальный source release lag кандидатов 5.27 ms; source clock не замедляется.
Оба baseline повторили ровно прежние seq13/29 float differences; оба candidate
полностью совпали с reference по BGR, segmentation SHA, proposals, observations/
geometry ranges, tracks, threats, range-estimator metadata, material,
sensor binding/lineage и raw TGS costmap SHA. Дополнительно проверены surface
state/availability/authority flags и TGS points/ground/occupied/rejected counts.
Effective TTL-based costmap/policy сравниваются по validity, не как timeless raw.
Медианная накладная часть decoder RPC-minus-decode:
baseline 1.6421.825 ms → candidate 1.1001.118 ms; DDRNet RPC-minus-component:
2.1092.217 ms → 1.5581.613 ms. Это небольшой согласованный IPC выигрыш.
Full p95 не улучшился однозначно в обоих повторах; full p99 чуть ниже. По двум
samples нельзя обещать статистически устойчивое глобальное ускорение.
Разницу с предыдущими auto-clock 161.974/191.806 ms нельзя приписать копиям:
в текущих одинаковых clock conditions **контроль тоже** проходит timing gate.
Новый candidate в auto-clock режиме в этой итерации не измерялся.
Source gaps не «исправлены» ускорением: available/fresh 76/128, остальные 52
явно unavailable/stale по прежнему sensor contract. Новых receipt-age expirations
поверх available pairs нет. Все output freshness/TTL gates сохраняются;
physical-live, несколько/полная запись, качество и motor authority не допущены.
### Отказы, восстановление, evidence и следующий шаг
Candidate synthetic hung decoder повторно проверен CPU-only: timeout 250 ms,
terminal failed, source cameras 0/1/2 учтены как failed, child/lease/input
освобождены, остаток 0. 279 focused tests PASS; Ruff check/format 8 files,
Python 3.9 IPC lint и mypy common sensor module PASS. На Mac нет моделей,
нагрузочного/full-suite теста, Docker/image build или второго web service.
После A–B–B–A частоты сброшены в auto до восстановления сервисов. Triton
восстановлен первым, ready 200; остальные три Mission Core сервиса running.
Ollama/Frigate exited/restart=no. Временный experiment lease volume удалён после
сохранения released owner generation 4; recordings/models и старые artifacts
не тронуты. Все временные containers остановлены/удалены; Mac 8000=200,
8765 closed. Финальный GPU P8: 988 MiB, 210/405 MHz, power limit 450 W.
Manifest `.runtime/perception-stage2-ipc-worker-20260902T1410MSK/manifest.json`:
305 artifacts, SHA-256
`9c72a93833a1dda51c4787dca13fb9791a1bf2e31c763b7740e1b21406703707`.
Проверены hashes 228 code files на Worker; текущий код совпадает с измеренным
candidate. Сохранены CPU diagnosis/oracles/negative, четыре полных результата,
покадровые timings/parity, команды, before/quiesced/after, clock lock/reset,
terminal owner и final checks. Manifest связан с предыдущим binary evidence.
**Следующая работа этапа 2:** product controller/admission/recovery и continuous
operating-envelope/inventory, network boundary и standalone packaging.
Текущий bounded baseline позволяет идти дальше без изменения моделей и без
бесконечного ожидания идеального microbenchmark. Clock control не становится
автоматической властью будущего controller; installed/available/running/
qualified остаются разными состояниями. Старые LAB/registry/UI не переключены;
этапы 3–4 не начаты, global real-time qualification=false, actuation=false.