docs(observatory): record real M49 publication and restart acceptance

This commit is contained in:
DCCONSTRUCTIONS
2026-09-03 11:50:32 +03:00
parent bd947b49f4
commit 3ea8d987a7
3 changed files with 178 additions and 28 deletions
+59 -17
View File
@@ -2,9 +2,10 @@
## Актуальный маршрут — 2026-09-03
Сверено с кодом `e436fb5`, evidence до `44afadb` и последними решениями владельца.
Эта актуализация меняет только документы: новые расчёты, сборки, измерения Worker
и изменения сервисов не выполнялись. Разделы до журнала инкрементов — текущий
Сверено с кодом `bee8552`, установкой `54c8d82`, исправлением reindex `bd947b4`
и последними решениями владельца. M4.9T5 ×004TREE рассчитан через UI, опубликован
и повторно открыт как документ из кэша после перезапуска. Визуальный replay ещё
не реализован для этого portable-результата. Разделы до журнала инкрементов — текущий
маршрут; исторические «следующий шаг» и «этап открыт/закрыт» ниже не команды.
### Цель и результат
@@ -26,20 +27,31 @@ PASS через Wi-Fi/LTE не является условием готовно
выбор только совместимых нерассчитанных portable profiles и общие viewer contracts.
- **UI:** готовность видна только по результату внизу. Все текущие профили
рассчитаны → выбор пуст, «Рассчитать» нет, «Обновить» остаётся. Плашек завершения
нет; во время работы пока только индикатор ожидания. Лимит первых 6 карточек снят,
нет; во время работы общий индикатор показывает настоящую фазу и доступные счётчики.
Внутри первичного decode/передачи архива детальные счётчики ещё отсутствуют.
Лимит первых 6 карточек снят,
но пагинация сотен записей ещё не доказана.
- **Последняя приёмка, не новый замер:** 720 frontend tests, 52 focused queue/API
tests, typecheck/build и browser QA PASS. В очереди тогда 11 jobs: 10 failed и
1 succeeded/not-required; точного нового published cache hit не было.
Положительные all-cached/reuse сценарии пока доказаны synthetic tests.
- **Последняя приёмка:** 726 frontend tests, 128 focused progress/queue/API/
transport tests, отдельно40 runtime/wiring и3 installer tests, typecheck/build,
Ruff/mypy и browser QA. Для найденного при рестарте cache-дефекта — ещё89
session/publication и72 admission/cache/queue/API tests. Эти проходы пересекаются,
их суммы не являются числом уникальных тестов.
В очереди12 jobs: прежние10 failed,1 succeeded/not-required и1 новый published.
Все11 прежних jobs сохранены. Новый exact cache/document повторно открыт
после исправления no-op reindex и перезапуска; видео/TGS-view ещё не принят.
- **Реальный M49-результат:** 6830 camera-fragment anchors, 6811 доступных LiDAR
и19 UNOBSERVED; учёт149733073 rolling-point contributions сходится,0 unaccounted.
Расписание39.215–757.160s не покрывает все808.779s исходной сессии. Полный цикл
23:36.763; TGS p95 2.6075ms и runner-stage p95 29.99172ms — только эти стадии,
не full-profile/onboard FPS и не качество сегментации.
- **Текущие составы:** M4.9T5 — CPU TGS; LAB V1 — последовательные EoMT и DDRNet.
Ни один не равен полному будущему AI-профилю рига. Архивные overlays в одном
viewer не доказывают, что один Docker вычислил все слои.
- **Есть инженерный прототип полного графа:** DDRNet/RF-DETR/geometry/distance/
motion/TGS/costmap/policy-shadow и короткие потоковые proofs. Не пишем заново.
Самостоятельный продуктовый образ и полный recorded-run этого состава не приняты.
- **Не закрыто:** реальные счётчики прогресса, полный recorded-analysis текущими
профилями, publish→cache→view после перезапуска на реальных данных, полный поиск/
- **Не закрыто:** полный recorded-analysis текущими
профилями, синхронный сохранённый visual replay, матрица двух профилей/записей, полный поиск/
пагинация каталога, standalone и фактический перенос на борт.
Источники: [ADR 0050](adr/0050-recorded-observatory-first.md),
@@ -48,6 +60,8 @@ PASS через Wi-Fi/LTE не является условием готовно
Desktop final-status — операторская сводка и история; подробный маршрут ведётся
только здесь. Из CODEX_V5 взяты разделение CURRENT/TARGET, критерии готовности и
сохранение выполненной работы, не неподтверждённые сведения о runtime.
Текущее исполнение и точные declarations:
[progress / первый запуск](../experiments/perception/OBSERVATORY_RECORDED_PROGRESS_2026-09-03.md).
## Границы исполнения
@@ -90,6 +104,11 @@ normal/expanded UI; последний код `e436fb5` и отчёты выше
наработанным runtime. Явно оформить версионированный `recorded-analysis` отдельно
от `realtime-rehearsal`; сначала малые контрактные fixtures, не долгий GPU-run.
**Частично выполнено:** bounded attempt-scoped progress реализован и активирован.
Новый M49-run использовал прежний профиль и полностью выполнил его расписание.
Это не закрывает 2A: целиковый input barrier и `_capture_arrays()` до replay-cache
lookup ещё сохранены. Progress observation не является новым режимом исполнения.
- Сохранить source timestamps и causal ordering. Медленный Worker притормаживает
подачу, а не выбрасывает обязательные кадры ради 1×. Учитывается каждый вход/
выход по расписанию профиля; stride, sensor gaps и overload drops различаются.
@@ -110,6 +129,18 @@ normal/expanded UI; последний код `e436fb5` и отчёты выше
timeline. Это приёмка CPU TGS, не полного detector/segmentation профиля.
Историческая M4.9 projection без review binding не заменяет этот proof.
**Доказано на новом run:** compute → seal → publication с первой попытки,
точный cache hit, исчезновение M49 из выбора и открытие документа после рестарта.
Найден и исправлен no-op reindex: служебная переиндексация больше не меняет
source identity; реальное изменение по-прежнему требует нового расчёта.
**Осталось в2B:** portable review сейчас JSON, не проигрыватель. Подключить
typed result/frame reader и общий `CanonicalRecordedLabReplay`, ленивое чтение
сохранённых TGS/costmap и точную камеру/временную привязку. Проверить coverage,
seek/play/pause, normal/expanded/restore/Escape и повторное открытие без job.
Сначала использовать уже sealed пакет; не считать заново и не подмешивать
архивные E47/M49 semantics. Название «полный маршрут и воспроизведение» само
по себе не доказывает доступность replay или полноту всей исходной сессии.
**2C. LAB V1 и другая запись.** Выполнить LAB V1 × 004TREE, затем оба профиля
× RAVNOVES00, строго последовательно. Медленная EoMT не возвращает нас к гонке
за сетевым FPS. Не менять незаметно состав, cadence или разрешение ради PASS.
@@ -132,7 +163,7 @@ RAVNOVES01 — отрицательный случай до подтверждё
**Приёмка:** матрица 2 профиля × 2 совместимые записи, полные обязательные выходы,
честный прогресс, published package, сохранённый просмотр без compute после
перезапуска, проверенные recovery/negative cases и сохранность истории.
Успешный первый M4.9 run закрывает 2B, не автоматически весь этап 2.
Первый M4.9 run **с принятым визуальным replay** закрывает 2B, не весь этап 2.
Зависимости: основа 1, текущие записи и Worker; не новый полный профиль или борт.
## Этап 3 — Самостоятельные Docker-профили и лабораторные эксперименты
@@ -165,6 +196,9 @@ RAVNOVES01 — отрицательный случай до подтверждё
## Этап 4 — Отбор кандидата и перенос на фактический борт
По уточнению владельца 2026-09-03 это будущий пункт: сейчас никакой перенос на
борт, изменение onboard runtime или подключение контроллеров не выполняется.
**Цель:** выбранная конфигурация воспроизводится на целевом компьютере, её
границы известны до подключения автономного управления.
@@ -183,15 +217,23 @@ watchdog, stop/slow при пропаже данных, моторы и авто
- [x] 2026-09-03 — этап 1: queue/cache/identity/selector реализованы и локально проверены.
- [x] 2026-09-03 — история сохранена, completed-status UI удалён.
- [ ] Этап 2A — полный recorded-analysis и счётчики; сейчас только activity indicator.
- [ ] Этап 2B2D — новый M4.9 full run, затем LAB V1/вторая запись, cache/recovery/каталог.
- [x] Этап 2A, часть progress — реальные bounded Worker → backend → UI snapshots.
- [ ] Этап 2A, остаток — versioned recorded-analysis и устранение полного input barrier.
- [x] Этап 2B, compute/publish/cache — M4.9 ×004TREE завершён; документ повторно открыт после рестарта.
- [x] Найденный reindex-дефект exact cache исправлен; исходная связь восстановлена по точному SHA proof.
- [ ] Этап 2B, visual — синхронное воспроизведение сохранённых camera/TGS, coverage и viewer acceptance.
- [ ] Этап 2C2D — LAB V1/вторая запись, cache/recovery/каталог.
- [ ] Этап 3 — самостоятельный полный профиль и сравнение конфигураций.
- [ ] Этап 4 — кандидат, затем фактическая бортовая квалификация.
- [x] 2026-09-03 — план актуализирован; в этом ходе следующие пункты не исполнялись.
- [x] 2026-09-03 — план и Desktop-сводка синхронизируются с фактическим исполнением.
**Непосредственно следующий инкремент — 2A:** сверить пути executor/progress,
оформить минимальный режим полного анализа и настоящие счётчики, проверить на
малых fixtures. Затем 2B — M4.9T5 × 004TREE до сохранённого просмотра.
**Следующий крупный инкремент — остаток2B:** общий сохранённый camera/TGS-viewer
для уже опубликованного результата job
`observatory-run-b230216709dc4c59bc56c98c7e329bf1`, без нового compute.
Result ID и пакет — в связанном progress evidence. Проверять реальную визуальную
синхронизацию/coverage, не только JSON/наличие файлов.
Отдельно закрыть остаток2A версионированным incremental input;
не объявлять прежний whole-recording materializer потоковым.
Не начинать снова с claim/v3, memory repair, селектора или сетевого canary.
## Карта продолжения, проверка и восстановление
+31 -2
View File
@@ -52,8 +52,11 @@ is recoverable. Changed profile versions become new calculations.
The checkpoints below are chronological evidence, not a current TODO list.
As of 2026-09-03, the queue/claim/cache/selector foundation is implemented and
locally checked. Full recorded-analysis, measured progress and end-to-end
published review on real recordings remain unaccepted; the current four-stage
locally checked. Attempt-bound progress is implemented and active (`bee8552`,
control-agent installation `54c8d82`). One real M49 run succeeded and published;
exact cached document reopening survives restart after the no-op reindex fix
`bd947b4`. Full recorded-analysis and synchronized saved visual replay remain
unaccepted; the current four-stage
route and next increment are maintained only in the linked ExecPlan.
## First implementation increment
@@ -151,6 +154,32 @@ Historical terminal logs do not become a new selection's error. The existing
responsive selector layout follows workspace width, including restored narrow
windows, rather than only the browser viewport.
## Real progress, publication and restart proof — 2026-09-03
Worker-to-backend-to-UI progress is claim/generation/sequence-bound and stored as
one bounded current row per job. It does not renew ownership or change live
semantics. One UI-submitted M49 × RAVNOVES004TREE run published on its first
attempt after 1416.763 s. All 6830 fragment-schedule rows and result artifacts
were verified; 19 missing-LiDAR positions remain UNOBSERVED, point accounting
has zero unaccounted contributions. The schedule spans 39.215757.160 s, not
the whole 808.779 s source session. This CPU-only result is not a full AI profile.
An actual canonical restart exposed a missed case: unchanged archive discovery
advanced the source row's update clock, changing its admitted catalog hash and
hiding the exact cache hit. Reconciliation now preserves the **entire existing
snapshot** when only that incidental clock differs. Real changes still alter
identity; the fingerprint, package and computation schemas are not weakened.
The affected source's one clock field was restored only after reconstructing
its exact admitted hash, with backup and transactional before/after fences.
No source bytes, result provenance or job identity were rewritten.
Following activation/restart, the same catalog, job and cached result document
reopened; all previous jobs and claim history remain. However, the portable
review currently renders a checked JSON document/artifact inventory, not video
and TGS. Therefore stage 2B stays open for a common schema-bound saved visual
adapter, using this sealed result without recomputation or legacy overlays.
See [real-run and restart evidence](../../experiments/perception/OBSERVATORY_RECORDED_PROGRESS_2026-09-03.md).
## Boundaries
No Synology deployment, hardware actuation, motor integration, new capture,
@@ -1,6 +1,7 @@
# Recorded Observatory — attempt-bound progress and first real run
Date: 2026-09-03. Current implementation: `bee8552`.
Date: 2026-09-03. Progress: `bee8552`; control layers: `54c8d82`;
unchanged-source reindex fix: `bd947b4`.
This is an observation/control-plane increment of stage 2, not onboard or
full recorded-analysis acceptance. No Synology release, physical acquisition,
actuation, model replacement or GPU benchmark is involved.
@@ -37,6 +38,8 @@ actuation, model replacement or GPU benchmark is involved.
actual subprocess invocation and timeout child cleanup. A separate **40 tests**
cover portable runtime, M49 entrypoint/queue/LAB V1 wiring and minimal imports.
Ruff and focused mypy pass. The existing TestClient deprecation warning remains.
- Exact offline installer: **3 tests** covering file/hash inventory and declaration
fences. These are separate from the 128 + 40 backend checks above.
- Canonical8000 was replaced only while the queue was idle. Previous UI output
and a SQLite backup were retained. All rows in the six pre-existing tables
matched their pre-update hashes; the new progress table was empty.
@@ -74,7 +77,7 @@ predecessors alongside replacements, use the old package launcher to overwrite
the control layer, or restore an old SQLite backup over newer work. No reboot
was performed; installed restart declarations, not reboot recovery, were checked.
## Real run — status at 08:20 UTC
## Real run — succeeded and published
One ordinary UI Calculate action submitted:
@@ -82,16 +85,81 @@ One ordinary UI Calculate action submitted:
- Setup: `m49-tgs-portable-v2`, definition
`f56d6321bd794ccdfb7d2e3b05d044b11f616ffb81ee29517386cc253046d4eb`.
- Job: `observatory-run-b230216709dc4c59bc56c98c7e329bf1`, generation 1.
- Input inventory: 6837 members. Delivery completed after approximately 298 s;
input preparation is still running. There is no result/cache/view acceptance yet.
- Queue: 10 retained failures, one retained historical success/not-required,
one running job, one current progress row. No second model/profile was started.
- Input inventory: 6837 members. Delivery completed after approximately 298 s.
Initial LiDAR decode and source-stage construction completed before TGS; this
remains a whole-input executor, not the target incremental runtime.
- Submitted `2026-09-03T08:08:03.013Z`; published on the first attempt at
`2026-09-03T08:31:39.776Z`: **1416.763 s / 23 min 36.763 s** end to end.
- Result: `m49-tgs-portable-review-a09d2b4a07d103e4f3693ba746a51be2197214768774eabfded4f109ae80dce4`.
Package SHA-256: `52e8afd6aaa38b615008463b873b94feae160946a69ce67aba12efc5f12b1589`.
Central manifest: `0297a3502e7510e3d126ddf33e1afc2ef495638255351cd37a6dbed5b42ab832`.
- All **10 central artifacts**, including the package manifest, independently
passed byte-length and streaming SHA-256 verification on the Mac. The package
contains 9 result members plus that manifest; sampled transfer progress ending
at 8/9 is not the publication/completeness authority.
- **6830 ordered schedule rows**, **2244 costmap cells** per row. There are
6811 available LiDAR associations and 19 missing ones; the corresponding
costmap states are all UNOBSERVED and their height bounds remain NaN.
- Point accounting: 149733073 eligible = 36777326 ground + 112748049 nonground +
207698 rejected; **0 unaccounted**. Counts cover rolling-window contributions,
not unique physical points across the entire route. Rejected is not free space.
- Source-session duration is 808.779495667 s. This profile schedules one anchor
per admitted camera fragment: first 39.215263458 s, last 757.160263458 s;
the camera epoch ends at 757.260263458 s. Its 717.945 s anchor span is not
proof of coverage of every second of the 13:29 source or every decoded image.
- Exact runner trace: TGS-only p50/p95 **1.204 / 2.6075 ms**, stage-wall p50/p95
**17.676102 / 29.991720 ms**. Sums are 9.122023 s TGS and 131.038739079 s
stage wall. These exclude source preparation, result assembly and transfer.
JSON `effective_fps=9.51187` is schedule cadence, not processing/onboard FPS.
- Final queue: 10 retained failures, one retained historical success/not-required,
one new success/published, one v3 claim grant and one progress row. All 11 old
jobs, the 50000 legacy claim receipts and previous reconciliation remain intact.
No second profile, LAB V1, ML/GPU model or onboard execution was started.
An early diagnosis based on a stationary 556912640-byte temporary camera archive
did **not** prove a network stall. That equals the sealed archive's complete
length; the job subsequently advanced normally. Do not report it as a proven
transport outage or benchmark.
## Restart found and fixed a real cache defect
The first idle-only canonical restart recovered health in 20.985 s and preserved
all 12 job rows, but **failed cache acceptance**. The result document still opened;
the profile reappeared in the calculation selector. Archive reconciliation
unconditionally replaced `observation_sessions.updated_at_utc`; that field is
part of the exact source catalog hash, so unchanged data looked like a new source.
`bd947b4` keeps the existing fingerprint algorithm and all source/artifact fields.
Inside the candidate transaction it compares the complete before/after snapshot
with the previous update clock. If everything else is identical, it rolls back
the no-op reindex. Real session/source/artifact differences still commit with
the new timestamp. This does not introduce matching by LAB name or weaken source
or result integrity.
The already-published job needed one bounded metadata repair: changing only its
source row's clock from `2026-09-03T08:36:25.809Z` back to
`2026-09-03T08:06:12.724Z` reconstructs **exactly** the admitted full-catalog hash
`2db6b8f109f5cc31bb32733ca633e03becca83d1f140a68ecc9ec9522010c24e`.
The old clock was recovered by a bounded, read-only millisecond candidate check
in this turn's known startup/admission interval; no other field was varied.
A SQLite backup was retained. The transaction rechecked the current hash, then
the reconstructed admitted hash, and changed only that one field in one row.
Raw evidence, package/provenance and job receipts were not rewritten or recomputed.
Do not generalize this repair to another source without the same exact hash proof.
Validation: **89 session-store/publication tests** (including 7 new regressions),
**72 admission/LAB-cache/queue/API tests**, Ruff and focused mypy pass. A new store,
reconciliation with a later clock and cold result cache preserve reuse; actual
session/source/artifact changes still invalidate it. No frontend rebuild was
needed for this backend-only repair; the previously verified progress UI remains.
After activation/restart, canonical8000 recovered in 20.650 s with PID77997.
Catalog, complete job projection and result view equal their pre-restart values.
Browser Refresh/reopen keeps M49 below, only LAB V1 remains in the selector,
and the exact result document opens with no new job. The 12 job rows remain
unchanged. This proves saved **document/cache** persistence, not visual replay.
The first failed acceptance is retained in the evidence, not overwritten as PASS.
## Remaining boundaries — not hidden by the progress feature
1. This does not introduce `recorded-analysis` into the retained live runtime.
@@ -106,10 +174,21 @@ transport outage or benchmark.
4. Phase snapshots are not a complete performance trace. Warmup/stage timings,
throughput, all required-frame accounting and onboard estimates need separate
evidence. These UI counts are not FPS or real-time qualification.
5. Stage 2B remains open until this run publishes an exact, reviewable result and
cached reopening is verified. LAB V1 and the other recording follow sequentially.
5. **Stage 2B is not closed.** Publication and cached document reopening after
restart are proved, but `portable-result-review` currently renders JSON and
the artifact inventory, not synchronized camera/TGS playback. The existing
title “полный маршрут и воспроизведение” is not an accepted capability proof.
Add a schema-bound, bounded saved-data adapter to the common replay pattern;
admit only this result's arrays and the exact source camera timeline. Do not
reuse the legacy 4489-frame M49/E47 overlays or invent semantic/detector layers.
Reuse this sealed result to validate the viewer without another inference run.
6. LAB V1 and the other recording follow sequentially after the first visual
cycle. Full time coverage/source synchronization must be qualified separately
from counts on the current fragment schedule.
Private evidence, not Git: `.runtime/observatory-progress-DbxaPA/` contains the
SQLite backup and row hashes, payload/plan/receipt/declarations, build/test logs,
submitted job and bounded read-only progress observations. Model assets and
submitted/completed jobs, result/artifact checks, restart failure, exact clock
repair proof/backup and cache/history acceptance, plus bounded read-only progress
observations. Model assets and
recorded camera/LiDAR payloads are not copied into this report.