diff --git a/docs/OBSERVATORY_REALTIME_PROFILES_EXECPLAN.md b/docs/OBSERVATORY_REALTIME_PROFILES_EXECPLAN.md index acc4740..4b04603 100644 --- a/docs/OBSERVATORY_REALTIME_PROFILES_EXECPLAN.md +++ b/docs/OBSERVATORY_REALTIME_PROFILES_EXECPLAN.md @@ -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. -- [ ] Этап 2B–2D — новый 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. +- [ ] Этап 2C–2D — 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. ## Карта продолжения, проверка и восстановление diff --git a/docs/adr/0050-recorded-observatory-first.md b/docs/adr/0050-recorded-observatory-first.md index 030ee98..43fda5e 100644 --- a/docs/adr/0050-recorded-observatory-first.md +++ b/docs/adr/0050-recorded-observatory-first.md @@ -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.215–757.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, diff --git a/experiments/perception/OBSERVATORY_RECORDED_PROGRESS_2026-09-03.md b/experiments/perception/OBSERVATORY_RECORDED_PROGRESS_2026-09-03.md index b0b9a1c..f309d74 100644 --- a/experiments/perception/OBSERVATORY_RECORDED_PROGRESS_2026-09-03.md +++ b/experiments/perception/OBSERVATORY_RECORDED_PROGRESS_2026-09-03.md @@ -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.