finding: the ADR-0082 D4 ratchet's only trigger needs a Playwright browser the dev containers cannot supply at the expected revision #7315
Description
Activity
Claim: PM loop round 1 (devx seat, new term)
Session:session_01YS2qzDAn3CpWdY7uBX9bFQ
Branch:claude/issue-7315-sdui-ratchet-playwright-note
Worktree:objectstack-issue-7315
Domain:domain:devx
File surface:docs/releases-maintenance.md(primary); optionally a small failure-path pointer inscripts/gen-sdui-manifest.sh(dev's judgment, declared in the PR if taken)
Container & model: S card,mode:subagentshared container,model: sonnet
Serial constraints cleared: no open claim or in-flight PR on either file at claim time; PR #7308 (the pin bump that surfaced this) is merged context, not an edit conflict.Disposition (PM call, veto window open): the card lists 4 candidate dispositions and recommends none. Choosing option 2 — record the symlink-tree workaround in
docs/releases-maintenance.mdnext to the existing Playwright note. Rationale: it is the smallest change that removes the per-dispatch rediscovery cost; options 3/4 cross a repo/image boundary and stay open for a future card if recurrence shows option 2 insufficient. This is verification-process documentation, not product semantics — inside the PM's non-escalation classes.
Generated by Claude Code
ACCEPT — PR #7339 (devx seat review, session
session_01YS2qzDAn3CpWdY7uBX9bFQ).Shipped per the option-2 disposition:
docs/releases-maintenance.mdgains a subsection under the existing "After the pin moves: run the declaration-parity ratchet (#5960)" anchor recording the scratchpad symlink-tree workaround — whyplaywright installis unavailable in dispatch containers, the mechanism (revision-named symlink tree in the agent's own scratchpad, no shared-state mutation), and that the gap is path/revision lookup rather than browser capability (PR #7308's measurement cited with the pin range and revisions).scripts/gen-sdui-manifest.sh's failure output now points at the section, print-line only — the reminder-not-gate design (#5960) is untouched.Review checks: file surface matches the claim exactly (2 files, +45), first line is
Fixes(whole card delivered),skip-changesetapplied (docs+script-comment only), container layout fact-checked against the card, and the doc correctly instructs tryingpnpm sdui:manifestunmodified first. Flipping ready and arming auto-merge; the merge queue lands it once gates conclude green.
Generated by Claude Code
- added a commit that references this issue
on Aug 17, 2026
Observation-class finding recorded while running the console pin bump for #7268 (PR #7308). Nothing a product user hits; it is a durability risk for a gate that runs on-demand only. Filed unassigned, no
pm:queue— for triage to grade.What happened
scripts/gen-sdui-manifest.shis, by explicit decision (#5960), the only trigger for the ADR-0082 D4 spec-registry declaration-parity ratchet: never a CI job, run on demand when the objectui pin moves. It needs Playwright chromium.In the dispatch container
PLAYWRIGHT_BROWSERS_PATH=/opt/pw-browsersis pre-populated, but with chromium build 1194, laid out the old way:objectui at the new pin pulls playwright 1.62.1, which looks for build 1234 at the newer path, and fails:
The remedy both scripts print —
pnpm exec playwright install chromium-headless-shell— is unavailable here:PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1is set and agents are instructed not to run it.Why it is worth recording rather than shrugging at
The script is deliberately a reminder, not a hard gate, so that a machine without Playwright can still move the pin — a good decision, and this finding does not dispute it. But it means the failure mode the reminder exists to prevent is precisely "nobody ran it", and a browser that cannot launch converts every pin-bump dispatch into that case without any gate going red. The pin bump is the ratchet's only trigger, so a skipped run is not deferred coverage, it is coverage that never happens for that range.
Workaround that worked (no install, no shared-state mutation)
A symlink tree in the agent's own scratchpad, named for the revision playwright wants, pointing at the binaries the container already has:
Chromium 141.0.7390.37 driven by playwright 1.62.1 ran the dump and the ratchet cleanly: 57 public blocks written,
no new DECLARATION divergence vs accepted baseline. So the version gap is cosmetic for this workload — it is the path/revision lookup that fails, not the browser.Candidate dispositions (not decided here)
docs/releases-maintenance.mdunder "After the pin moves", next to the existing Playwright note — the smallest change that removes the rediscovery cost.gen-sdui-manifest.shfall back to a discovered local chromium (executablePath) when the expected revision is absent, and say loudly which binary it used. Larger surface; the dump script lives in objectui, not here, so this may need a change on that side.No option is recommended — the trade-off is a devx/infra call, and item 3 in particular crosses a repo boundary.
Evidence
Measured 2026-08-10 during PR #7308 (pin
09987b680d53→8aad9fd50b16). The ratchet ultimately ran and was green, so this bump has full D4 coverage; the finding is about the next one.Generated by Claude Code