Skip to content

specs(automation): рестарт пода наблюдён живьём — механизм доказан, триггер нет - #4843

Merged
gHashTag merged 3 commits into
masterfrom
specs/pod-restart-mechanism-observed
Sep 26, 2026
Merged

gHashTag merged 3 commits into
masterfrom
specs/pod-restart-mechanism-observed

Conversation

@gHashTag

@gHashTag gHashTag commented Sep 26, 2026 •

Copy link
Copy Markdown
Owner

Что спрашивали

«проверь что под сам перезапустился». Версия 2 спеки специально не утверждала этого — вопрос точно в ту строку.

Что оказалось

Не перезапускался. И список деплоев на это ответить не может: рестарт переиспользует тот же деплой, у пода так и стоит 4c99ba3f ... SUCCESS 2026-09-23T11:21:26Z. Единственный свидетель — PID 1 внутри контейнера: 02:19:34 при date -u 15:27:58, то есть старт в 13:08:24 — ровно тот ручной рестарт.

И никто его и не просил. Путь срабатывает, когда раунд находит мёртвый браузер, а браузер отвечал за 173 мс.

Поэтому путь прогнан нарочно

restartBrowserAsAgent доступен только через раунд агента (rounds-wiring.ts:112), HTTP-входа нет. Значит рестарт прогнан изнутри контейнера рендера его собственными переменными и исправленным запросом — именно это и было недоказанным:

  • токен доходит до процесса (43 символа, есть);
  • API принимает status: { in: ['SUCCESS'] } и называет деплой пода;
  • deploymentRestart ответил true;
  • PID 1 стал 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

gHashTag and others added 3 commits September 26, 2026 22:12
…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>
@github-actions

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-09-26 15:42:58 UTC

Summary

Status Count
Total Open PRs 37
PRs with Failing Checks 33
PRs with All Checks Green 4
READY 3
FAILING 33
PENDING 0
NO CHECKS YET 0

These columns do not partition: 3 + 33 + 0 + 0 = 36, and there are 37 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=403499176a5d != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@gHashTag
gHashTag merged commit e4063c1 into master Sep 26, 2026
25 of 32 checks passed
@gHashTag
gHashTag deleted the specs/pod-restart-mechanism-observed branch September 26, 2026 15:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant