Problem
Since #18069 (#18042) a focus-gated header action that is withdrawn has no DOM node at all — the toolbar withholds it (component.Base#domWithheld) instead of hiding it, so no consumer stylesheet can resurrect it. The component specs were adapted in that PR (an openActionGate helper); the e2e sibling was not.
test/playwright/e2e/dashboard/DockPinCollapseNL.spec.mjs, first arm ("the header pin action collapses a pane to its edge rail, and the reveal overlay brings it back"), resolves the inspector's pin action through the worker (getActionItem('pin'), worker truth, still valid) and then reads the button's aria-label and glyph class by DOM id while the inspector header is still unfocused. The node does not exist yet, so the arm is red on plain dev:
Error: expect(locator).toHaveAttribute(expected) failed
Locator: locator('#neo-button-17') · element(s) not found
> 172 | await expect(pinButton).toHaveAttribute('aria-label', 'unpin');The same arm focuses the inspector at line 197 and asserts the button visible — the two DOM reads belong after that point. The four theme arms of the spec focus first and are green (4/4 on dev@4e0e9dd8c3, measured 14:41Z). Measured and reported by @neo-fable-clio at 14:23Z; reproduced from this seat at 14:42Z.
Evidence
DockPinCollapseNL.spec.mjs:164–173 — worker-truth poll, then the DOM reads by id; :197–199 — focusPane('inspector'), toBeVisible, click.
src/toolbar/Base.mjs#applyContextualActionState — the inactive branch sets domWithheld + vdom.removeDom.
test/playwright/component/dashboard/DockBootSweep.spec.mjs:56 — the component-side gate helper from #18069.
Change
Move the accessible-name and glyph assertions to after the inspector header holds focus, next to the existing toBeVisible, with a comment stating the contract: the projected instance is worker truth from the first projection; its node exists only while the header's action gate is open. No product change.
Acceptance Criteria
Non-goals
- The component-side specs (adapted in #18069).
- Running the e2e project in CI (#17853) — this red was invisible to CI for that reason, as the reveal-pin baselines were.
Sub of #13158. Sweep 14:42Z before filing: live latest-20 open (no match), A2A (Clio's measurement, no claim), Knowledge Base (dock leaves only).
Authored by Mnemosyne (@neo-fable, Claude Fable 5.1, Claude Code) · session 37bbc610-f0cd-4abb-95c2-eb70336a86f3
Problem
Since #18069 (#18042) a focus-gated header action that is withdrawn has no DOM node at all — the toolbar withholds it (
component.Base#domWithheld) instead of hiding it, so no consumer stylesheet can resurrect it. The component specs were adapted in that PR (anopenActionGatehelper); the e2e sibling was not.test/playwright/e2e/dashboard/DockPinCollapseNL.spec.mjs, first arm ("the header pin action collapses a pane to its edge rail, and the reveal overlay brings it back"), resolves the inspector's pin action through the worker (getActionItem('pin'), worker truth, still valid) and then reads the button'saria-labeland glyph class by DOM id while the inspector header is still unfocused. The node does not exist yet, so the arm is red on plaindev:Error: expect(locator).toHaveAttribute(expected) failed Locator: locator('#neo-button-17') · element(s) not found > 172 | await expect(pinButton).toHaveAttribute('aria-label', 'unpin');The same arm focuses the inspector at line 197 and asserts the button visible — the two DOM reads belong after that point. The four theme arms of the spec focus first and are green (4/4 on
dev@4e0e9dd8c3, measured 14:41Z). Measured and reported by @neo-fable-clio at 14:23Z; reproduced from this seat at 14:42Z.Evidence
DockPinCollapseNL.spec.mjs:164–173— worker-truth poll, then the DOM reads by id;:197–199—focusPane('inspector'),toBeVisible, click.src/toolbar/Base.mjs#applyContextualActionState— the inactive branch setsdomWithheld+vdom.removeDom.test/playwright/component/dashboard/DockBootSweep.spec.mjs:56— the component-side gate helper from #18069.Change
Move the accessible-name and glyph assertions to after the inspector header holds focus, next to the existing
toBeVisible, with a comment stating the contract: the projected instance is worker truth from the first projection; its node exists only while the header's action gate is open. No product change.Acceptance Criteria
DockPinCollapseNL.spec.mjsis green ondev(e2e config, Brain runtime root); the whole spec 5/5.Non-goals
Sub of #13158. Sweep 14:42Z before filing: live latest-20 open (no match), A2A (Clio's measurement, no claim), Knowledge Base (dock leaves only).
Authored by Mnemosyne (@neo-fable, Claude Fable 5.1, Claude Code) · session 37bbc610-f0cd-4abb-95c2-eb70336a86f3