Every line is a test in three engines or a gate on every commit. The gaps are listed the same way, each with the requirement that will close it.
MeasuredARIA APG pattern in the JSDoclibs/components/accordion/src/accordion.ts, libs/components/accordion/src/accordion-item.ts
MeasuredKeyboard map testedapps/sandbox-e2e/src/accordion.spec.ts (every row above, in three engines). There is no unit case for the keys, because there is no code to test — the browser is the implementation
MeasuredThe exclusive groupapps/sandbox-e2e/src/accordion.spec.ts — three sections, opened one after another, each closing the last, in three engines, plus one shared name nobody wrote. The control is recorded rather than prepared: [attr.name] taken off the <details> leaves 3 of 36 red, one per engine, all of them this case, and every other case green — the reading the negative-control table below repeats for every other mechanism this component writes
MeasuredThe disclosure state is not oursapps/sandbox-e2e/src/accordion.spec.ts and libs/components/accordion/src/accordion.spec.ts — the asserted absence of aria-expanded, role and aria-controls on the heading
Measuredaxe auditapps/sandbox-e2e/src/a11y.spec.ts — the /accordion view, LTR and RTL, with all five demos of the sandbox on the page at once (open, exclusive, disabled, an h4 level and a lone section); and a stage of its own in the derived list of panels — a <details> is a panel part the sandbox holds open, so the stage holds the claim that one stands open in the walk rather than an audit of its own (lesson-196) MeasuredVisual screenshotapps/sandbox-e2e/src/visual.spec.ts — accordion-stack, with one section open and two closed, so the marker's quarter turn is a difference inside one image
Measuredforced-colors: activeapps/sandbox-e2e/src/forced-colors.spec.ts — CanvasText on an ordinary heading, GrayText on a refused one, and the marker the same colour as the row it stands in, which it is only because the sheet hands its color back in this mode. The one state the mode cannot flatten is whether a section is open: the platform announces it
Measuredprefers-reduced-motionlibs/components/accordion/src/accordion-item.scss — the only transitions are color and the marker's rotate over --pct-motion-transition-duration, and the preference is answered by the token build (req-a11y-motion)
MeasuredTouch target ≥ 24×24 pxapps/sandbox-e2e/src/accordion.spec.ts — every heading row's box measured outright; the floor is --pct-accordion-heading-target-min on the row itself, so what a finger gets is what an eye sees. The disarming below narrowed what that case holds — with the floor taken out the row still clears 24 px on its padding alone, so it measures the PROMISE and not this line — and apps/sandbox-e2e/src/target-min.spec.ts is what measures the line: with the padding token at zero and the row emptied, the box reads 24 px, and with the floor deleted it reads 0
By designSize axisnone — deliberately: a section heading is not a control with a height. req-api-size is about --pct-control-height-*, and a heading row takes its height from the type and the padding, which a skin moves through the tokens
MeasuredRTLapps/sandbox-e2e/src/accordion.spec.ts — the marker measured on the far side of the row in both directions, with the direction inherited from the document rather than written on the group
MeasuredSSR + hydrationapps/sandbox-e2e/src/hydration.spec.ts — the /accordion view renders and hydrates with no NG05xx. Every section is in the server's HTML, hidden by a pseudo-element rather than by a branch
By designFormsnone — deliberately: an accordion is not a form control. It holds no value a form owns and implements no FormValueControl
MeasuredA closed section is findableapps/sandbox-e2e/src/accordion.spec.ts — ::details-content computes content-visibility: hidden closed and visible open, and the text inside answers checkVisibility() === false, in three engines
MeasuredThe heading is a real headingapps/sandbox-e2e/src/accordion.spec.ts — the accessible tree read off the DOM (heading … [level=3], [level=4]) plus the tag name; libs/components/accordion/src/accordion.spec.ts for all five levels and the fallback outside a group (lesson-127) MeasuredThe press can be refusedlibs/components/accordion/src/accordion.spec.ts — defaultPrevented both ways; apps/sandbox-e2e/src/accordion.spec.ts for the pointer and Enter in three engines (lesson-128) MeasuredParts in the inventorylibs/components/parts.snapshot.md, tools/check-parts.mjs (target check-parts)
MeasuredTokens + contrast.policy.jsonlibs/tokens/src/contrast.policy.json — five entries. The line between sections is warn and says why: a separator is not what identifies a control or its state, and here the state is not drawn at all
By designStrings through PCT_TEXTSnone — deliberately: the component prints no string of its own, so there is no key to route. tools/check-texts.mjs reads its templates all the same
MeasuredSize budgetlibs/components/size.snapshot.md — the ./accordion row
MeasuredScreen-reader logRead 2026-10-12 from docs/acr/at/ — three readers, whole sandbox, and the act that opens a section. On open all three say one word, expanded, and nothing of the revealed content — the disclosure pattern's promise. The question on arrival was what a reader says about a DisclosureTriangle with a heading inside it, and NVDA alone has said the heading, and not in every pass: Payment, button, collapsed on 2026-10-12, as on 2026-09-28, where the record of 2026-09-16 (543eacde) and the pass of 2026-10-08 (dd0f02fa) read Payment, heading, level 3, button, collapsed — Orca Payment · collapsed button., VoiceOver Shipping expanded summary (the element name, not a mapped role). State is announced by all three, and the disabled item is collapsed button grayed under Orca
Measureddocs page/components/accordion on the published site — prerendered, the demo's own source is the code tab