Skip to content

docs(qa): land the five re-verified environment facts in RUNNER.md - #9427

Merged
os-steve merged 2 commits into
mainfrom
claude/issue-9386-runner-env-facts
Aug 18, 2026
Merged

docs(qa): land the five re-verified environment facts in RUNNER.md#9427
os-steve merged 2 commits into
mainfrom
claude/issue-9386-runner-env-facts

Conversation

@os-steve

@os-steveos-steve commented Aug 18, 2026

Copy link
Copy Markdown
Collaborator

Fixes#9386

Docs-only. Lands the five environment facts the #9296 QA wave paid container time to
learn into the Environment facts the runner should not re-derive section of
docs/qa/platform-checklist/RUNNER.md, plus the absence-inference row in the trap
vocabulary table.

Each fact is written as something the next runner can check and that changes what
they do
: a mechanism, a concrete check command, and the action. No run narrative.

Every fact was re-measured against this tree, not transcribed

Verified at 51a46a440 (= origin/main at branch time); gate union re-run at head
adc9de82e. Three of the five needed correcting, which is why the card asked for
re-verification.

#factverdict
1verify --rls is a separate invocationconfirmed, unchanged
2Playwright needs an explicit executablePathconfirmed; prescribed path hardened, see follow-up
3?id= on /api/v1/meta/app keys on the app namemechanism confirmed, app list corrected
4ss blindnessconclusion confirmed, mechanism was wrong
5cold tree cannot boot from the console-build recipesymptom confirmed, prescription was wrong, rider stale

1 — confirmed. Source: packages/cli/src/commands/verify.ts gates the proofs behind
rls: Flags.boolean({ default: false }) and prints the report only if (rls). Measured
live on showcase: bare verify ends at 15 verified, 0 gaps, 0 FAILED, 1 needs-fixture, 7 skipped with no PROVEN/HOLES line; --rls appends 20 PROVEN (20 consistent, 0 HOLES) over 23 objects and 9 of 9 declared position(s) probed — matching the card's
numbers exactly.

2 — confirmed.playwright-core@1.62.1's browsers.json pins chromium revision
1234 (browserVersion 151.0.7922.34); /opt/pw-browsers holds only chromium-1194
(Chromium 141.0.7390.37). The stock showcase playwright.config.ts sets no
executablePath. The "31" is verified as exactly the number of SURFACES entries in
showcase-smoke.spec.ts. I wrote the uniformity discriminator (whole run red =
environment, selective = product) rather than pinning the brittle count as the signal.

3 — mechanism confirmed, app list corrected.rest-server.ts matches
a.name === appIdFilter, so the package id com.example.showcase yields items: [].
But the card's name list is misleading: studio is not installed on stock showcase, so
?id=studio is legitimately empty there too. An empty items therefore has two distinct
causes, and the file now says so and tells the runner to read the unfiltered list first.

4 — conclusion confirmed, mechanism corrected.ss does not "return empty" here — it
is not installed at all, and neither is netstat (lsof and fuser are present).
Measured against a live listener: ss -ltn 2>/dev/null | grep :PORT gives empty stdout and
exit 1 while curl returns 200. The operational rule is unchanged and stronger, but the
stated mechanism would have sent a runner looking for a socket-table quirk that does not
exist.

5 — symptom confirmed, prescription wrong, rider stale.pnpm objectui:build builds
the console only, and a cold tree has no packages/cli/dist, so the bare binary answers
Error: command dev not found (exit 2) — verbatim as filed. Two corrections:

The genuinely useful addition here is that the root pnpm dev script runs
check:dev-prereqs first, so the cryptic error only appears when a runner bypasses it by
invoking the bare binary.

Follow-up commit adc9de82e — durability of the fact 2 copy-paste value

Review raised that prescribing the versioned literal
/opt/pw-browsers/chromium-1194/chrome-linux/chrome rots at the next image bump, inside
the one section contracted to be trusted without re-derivation. Verified rather than
assumed, and the change is made:

  • /opt/pw-browsers/chromium is a symlink maintained by the image build, resolving to
    chromium-1194/chrome-linux/chrome today.
  • Playwright accepts a symlinked executablePath — launched through the alias with
    1.62.1, got Chromium 141.0.7390.37 and drove a real page. So the hazard-free option is
    also a working one; no trade-off to record.
  • Control leg confirms the mismatch is live: a default launch fails with
    Executable doesn't exist at .../chromium_headless_shell-1234/.... That names the
    headless-shell variant, so the file now records that as the signature to recognise.

The prescribed value is now the alias; the 1194 / 1234 numbers stay where they do
diagnostic work — the mechanism prose and the grep/ls check.

Trap row

absence-inference — a missing flag/key/script read as a missing capability. Counter
verified: serve's ui flag is default: true, allowNo: true, so --no-ui is the off
switch and a scaffold's bare objectstack dev still serves the console. Line numbers
deliberately omitted; the flag spelling is greppable and does not drift.

Not folded in

The two facts offered as dispatch input are not among the five and are not written in.
Worth recording: the "turbo replays its cache across worktrees, so a fresh worktree is not
cold" observation did not hold here — this fresh worktree built 1 cached of 55, i.e.
effectively cold. It looks condition-dependent rather than a standing environment fact, so
it would have been a poor entry in a section whose contract is that entries are trusted
without re-derivation.

Verification

Gate derivation for docs/qa/platform-checklist/RUNNER.md names no family (a silent
verdict, not a clearance). Re-derived from the actual changed path and re-run on the new
head adc9de82e with a clean tree: check:nul-bytes PASS, check:platform-checklist
PASS (15 areas, 190 items), check:doc-anchors PASS (244 fragment links resolve),
check:doc-authoring PASS (376 files clean).

No areas/*.json edits, no .claude/skills/**, no CI posture changes — the card's three
scope fences hold.

Generated by Claude Code

The #9296 wave paid container time to learn five environment facts about
these QA boxes. None was in RUNNER.md, so each new runner re-derived them.
Every fact was re-measured against this tree before being written down;
three needed correcting rather than transcribing.
- verify --rls is a separate invocation (bare verify prints no RLS section)
- Playwright needs an explicit executablePath (wants chromium 1234, has 1194)
- ?id= on /api/v1/meta/app keys on the app name, never the package id
- ss/netstat are absent here; read liveness with curl
- a cold tree cannot boot from the console-build recipe alone
Also adds the absence-inference trap row: a missing flag read as a missing
capability, countered by following the forwarding chain to the default.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XqDQYVU5smx29ts9pAErja
@os-steveos-steve added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 18, 2026 — with Claude
@github-actionsgithub-actionsBot added the documentation Improvements or additions to documentation label Aug 18, 2026
…iteral
The executablePath a runner copies out of the facts section has to survive
an image bump. /opt/pw-browsers/chromium is a symlink maintained by the
image build; the versioned chromium-1194/chrome-linux/chrome beneath it
stops existing the moment the image moves to 1234 — and a dead path in a
section contracted to be trusted without re-derivation is the same
absence-inference shape the trap table now warns about.
Verified rather than assumed: Playwright 1.62.1 launches through the
symlink (Chromium 141.0.7390.37, real page driven), so a symlinked
executablePath is accepted. The control leg confirms the mismatch is live —
a default launch fails naming chromium_headless_shell-1234, which is now
recorded as the signature to recognise.
The 1194 / 1234 numbers stay where they do diagnostic work: the mechanism
prose and the grep/ls check.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XqDQYVU5smx29ts9pAErja
@os-steve
os-steve marked this pull request as ready for review August 18, 2026 01:08
@os-steve
os-steve added this pull request to the merge queueAug 18, 2026
Merged via the queue into main with commit 3c9f935Aug 18, 2026
23 checks passed
@os-steve
os-steve deleted the claude/issue-9386-runner-env-facts branch August 18, 2026 01:21
os-zhuang pushed a commit that referenced this pull request Aug 18, 2026
…ion-auth environment fact
Closes out the second half of the QA wave #9296 ledger debt. Part 1 (five of the
six environment facts plus the absence-inference trap row) landed in PR #9427;
this carries the sixth fact and every areas/*.json item correction.
RUNNER.md — the one environment fact still missing: console session auth is a
bearer token in localStorage (auth-session-token), so a clearCookies() gesture
expires nothing and leaves a fully authed shell rendering; true expiry is
POST /api/v1/auth/sign-out. The cookie half matters too — the storage family
resolves its caller through better-auth's own getSession, so a bearer-only
session 401s on /storage/upload/presigned.
areas/*.json — 32 items corrected across 12 area files, each with its own
revision bump and history entry naming what changed and why. Sources: the five
run records #9334, #9401, #9417, #9453 and #9467.
Every correction was re-grounded against origin/main before being written; four
reported corrections were rejected as already-true or contradicted by the tree,
and four items carrying the same defect class were found by that grounding
rather than from any report.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ai9gUdihXjg7FumzsBNSSs
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

docs(qa): land the #9296 wave's environment facts in RUNNER.md and the 34 checklist-accuracy corrections in areas/*.json

2 participants

@os-steve@claude