chore: state the smoke-helper and CI wall-clock budgets (#2333)

The five rows #2323 left as "assess", each either stated with its
reasoning and measurement, or shared with a constant that already has one.

- F4/F5: `driveAppFlow` and `connectViaDeepLink` default to
  `BROWSER_TIMEOUTS.ui` / `.roundTrip` instead of restating 30_000 /
  45_000 by hand; values unchanged, now one place to raise. A test in each
  helper pins the defaults.
- F1: `announced-child.mjs` states `DEFAULTS` ({ timeoutMs: 30_000,
  pollMs: 250 }) with the measurement — boot-to-announce of the composable
  test server is 135ms median at load average 15, and a passing start pays
  one poll interval, not the budget.
- F7: `pty.mjs` names `SCRIPT_PROBE_TIMEOUT_MS` (5s; the probe spawns in
  1.3ms median, 3.6ms max under load) and stops folding ETIMEDOUT into
  "no script(1)": a starved probe now fails `smoke:tui` loudly instead of
  turning it into an exit-0 skip.
- G1: every job in `.github/workflows/main.yml` declares
  `timeout-minutes` as a hung-job guard — roughly twice the slowest run
  observed over the last 40 push runs (and the last three releases for the
  publish jobs), rounded up to the next five minutes, with the range stated
  per job.

AGENTS.md's timeout section now points at where these live instead of at
this issue.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PsmUAZ6aLUAFqenjJKSSRp
Signed-off-by: cliffhall <cliff@futurescale.com>
This commit is contained in:
cliffhall 2026-09-13 01:50:33 -04:00
commit 3f7ba20ae6

View file

@ -472,8 +472,19 @@ free to run a full `local:gate`). Raising a budget nobody chose hides no race.
per-project cap without re-running that measurement.
- **The Playwright locator budgets the web smokes use are named constants in
`scripts/lib/browser-timeouts.mjs`** — raise one there, not at a call site.
The *remaining* smoke-helper budgets and CI's missing `timeout-minutes` are
tracked on #2333 rather than settled here.
The shared flow helpers (`deep-link-connect.mjs`, `mcp-app-flow.mjs`)
default to the same constants, so a budget that moves there moves for every
smoke at once. The process-level budgets are stated the same way in their
own modules — `DEFAULTS` in `announced-child.mjs` and `render-smoke.mjs`,
`SCRIPT_PROBE_TIMEOUT_MS` in `pty.mjs` — each with the measurement that
sized it (#2333).
- **Every CI job declares `timeout-minutes`, sized from observed runs.** It is
a hung-job guard, not a flake remedy — GitHub runners are not the contended
machine — so the rule is roughly twice the slowest run observed, rounded up
to the next five minutes, stated per job in `.github/workflows/main.yml`
with the range it was read from. A job that starts taking longer gets its
number raised there, with the new range; the 360-minute default it replaces
is how a hang blocks a runner for six hours.
- **Do not scale a fixed sleep.** A `setTimeout(r, N)` with no condition is not
a timeout: it always waits the full window, so raising it slows every passing
run and still races on a loaded one. Replace one with a condition wait when it