Match the Coverage toggle exactly in the staging E2E suite - #370
Conversation
The "Coverage gaps" button added in #358 also matches /Coverage/i, so both toolbar assertions started failing on a Playwright strict-mode violation. That job only runs on a main push, so the PR that introduced the button could not have caught it, and every main push since has failed: production has not deployed since 11 September. Pin both locators to the exact accessible name. Playwright's own error output suggested this locator for the button we want. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Claude finished @Babissimo's task in 51s —— View job Code Review — PR #370Todo list
Verified against
Both changed locators ( No other files needed to change: this is a test-only fix, so the OpenAPI contract regeneration requirement in CLAUDE.md doesn't apply here (no One nit, non-blocking: the reasoning in the PR body about Verdict: LGTM. No blocking issues found. As the PR notes, this can only be proven once merged to |
Why
Every push to
mainsince 2026-09-13 19:00 has failed, and production has notdeployed since 2026-09-11 22:17 (#361). Eleven merges are sitting on
mainundeployed, including the node_ref publication work: production is currently
serving raw node ids publicly (
curl -s https://api.retina.fm/api/radar/nodesreturns 11
ret…ids), which is the disclosure that work exists to close.Unblocking this gate is what ships it.
Three of the failing runs died in
Playwright E2E (staging)on a strict-modeviolation:
The "Coverage gaps" button arrived in #358 (
667ab72a). Two assertions inlive-map.spec.tsstill use a loose/Coverage/i, which now matches both.Why no PR caught it
ci.yml:302gates that job ongithub.ref == 'refs/heads/main' && github.event_name == 'push',and everything from "Deploy to staging" (
ci.yml:596) onward carries the samecondition. Pull requests run only build, lint, tests, docker and env-parity, so
#358 could not have seen this. Its own
mainrun was cancelled, so the failurefirst surfaced on the next push.
That applies to this PR too: the suite it fixes will not run here. It is proven
only once this lands on
main.The change
Both locators pin to the exact accessible name. Playwright's own error output
suggested
{ name: 'Coverage', exact: true }as the locator resolving to thebutton we want, and the button's markup is bare text with no icon or
title,so the accessible name is exactly
Coverage.The neighbouring
/Labels/iand/Arcs/ilocators are proven unambiguous bythe tests at lines 274 and 286, which passed in the same run.
/Trails/ineverexecuted (line 147 threw first), but the only other "trails" text is "Export
trails as CSV", which is gated behind
menuOpen &&and carriesrole="menuitem", sogetByRole("button")cannot match it.Not fixed here
The other three failing runs died earlier, in
Staging smoke tests, onActive nodes > 0 FAIL (0 < 1). That is the deploy concurrency race alreadyfiled as
123zgec26td:deploy-stagingcarriesconcurrency: staging-deploy(
ci.yml:597), butstaging-smoke-tests(ci.yml:729) ande2e-staging(
ci.yml:295) carry none, so a following run's deploy lands between a previousrun's deploy and its verification. Merges landing in the same minute (#357,
#358 and #360 at 19:00; #349, #362 and #363 at 20:40) are what trigger it.
It gates the production deploy independently of this fix, so it can still block
a run on its own. Fixing the selector makes the E2E gate deterministic; it does
not make the pipeline reliable.
🤖 Generated with Claude Code