specs(automation): рестарт пода наблюдён живьём — механизм доказан, триггер нет - #4843
Merged
Merged
Conversation
…t27c does not prove (Refs #4838) Four `Not claimed` lines from this morning became claimable, and one of them was hiding a fifth defect. browser-pod-restart.t27 -> VERSION 2. The restart that shipped this morning could not have worked with any set of service variables: its lookup asked for `status: "SUCCESS"` and the live API answers HTTP 400, because the field is a filter of `in`/`notIn` lists rather than a value. Version 1 blamed two missing variables. The corrected query answers live with the deployment created at 2026-09-23T11:21:26Z -- exactly the last real restart version 1 recorded, which is the cross-check now asserted. The two leaks version 1 named and fixed nowhere are fixed (6-tab budget enforced where a tab is created, never on the person's own tabs; one admin session per errand, handed back in `finally`), with the pre-fix measurements kept: 40 targets behind 16 pages, 35 ghost sessions. The token only the owner could issue exists now, so MISSING_VARIABLES is 0 -- but UNATTENDED_RESTART_OBSERVED stays false, because nobody has watched one. browser-sign-in.t27 -> VERSION 2, with the census: 191 cookies, 6 networks signed in, 5 signed out, 4 unknown, and 6+5+4 == DOORS asserted so it cannot silently stop covering a door. Instagram was never signed in, rather than signed out by the outage -- a degraded Chromium cannot delete a cookie, it could not read a page. Cookies without a known login cookie stay `unknown` instead of being guessed as signed out. And the reason version 2's numbers were not checked by the compiler: on a copy of browser-pod-restart.t27 whose only edit was `TAB_BUDGET == 6` -> `TAB_BUDGET == 999`, `typecheck`, `test` and `check` all exit 0, and `test` prints `Tests: 8` either way -- it counts test blocks DECLARED. So both files' asserts were evaluated against the constants gen-js folded: 59 hold here, 44 in the sign-in spec, 0 fail, and the falsified copy fails exactly one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…gins survived (Refs #4838) Version 2 would not claim the pod had restarted itself. It had not, and the deployment list cannot say either way -- a restart reuses the deployment. PID 1 was the witness: 02:19:34 old, i.e. the afternoon's manual restart. So the path was run on purpose from inside the service, with the service's own variables and the corrected query -- the part that was genuinely unproven. The token reached the process, the API accepted the lookup, the mutation answered true, and PID 1 came back at 01:33. The browser answered a probe afterwards and all 194 cookies with all six logins were still there. Version 3 therefore splits what version 2 ran together: the mechanism is observed end to end, the trigger is not. UNATTENDED_RESTART_OBSERVED stays false, and a new constant says which half that covers. 74 asserts evaluated against the folded constants, 0 fail. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The only conflict was this spec's own header and VERSION, where master already carries the squashed version 2 this branch was written on top of, so ours is a strict superset. 74 asserts re-evaluated after the merge, 0 fail. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Contributor
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
Contributor
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что спрашивали
«проверь что под сам перезапустился». Версия 2 спеки специально не утверждала этого — вопрос точно в ту строку.
Что оказалось
Не перезапускался. И список деплоев на это ответить не может: рестарт переиспользует тот же деплой, у пода так и стоит
4c99ba3f ... SUCCESS 2026-09-23T11:21:26Z. Единственный свидетель — PID 1 внутри контейнера:02:19:34приdate -u15:27:58, то есть старт в 13:08:24 — ровно тот ручной рестарт.И никто его и не просил. Путь срабатывает, когда раунд находит мёртвый браузер, а браузер отвечал за 173 мс.
Поэтому путь прогнан нарочно
restartBrowserAsAgentдоступен только через раунд агента (rounds-wiring.ts:112), HTTP-входа нет. Значит рестарт прогнан изнутри контейнера рендера его собственными переменными и исправленным запросом — именно это и было недоказанным:status: { in: ['SUCCESS'] }и называет деплой пода;deploymentRestartответилtrue;01:33вместо02:19:34.Браузер вернулся живым, а не просто слушающим: вкладка после рестарта посчитала
(() => 1 + 1)()и ответила 2. Логины уцелели все — 194 куки, те же шесть дверей (google, youtube, x, linkedin, tiktok, reddit). Ничего не пришлось вводить заново, а это и делает рестарт дешёвым лекарством.Что по-прежнему не утверждается
Версия 3 разделяет то, что версия 2 смешивала: механизм наблюдён от начала до конца, триггер — нет. Никто не видел, как раунд сам находит мёртвый браузер и перезапускает под без руки на нём.
UNATTENDED_RESTART_OBSERVEDостаётся false, и новая константа прямо говорит, какую половину это покрывает.Арифметика спеки проверена вычислением ассертов по свёрнутым константам (
t27c testпечатает только число объявлений): 74 держатся, 0 падают.🤖 Generated with Claude Code
Refs #4838