fix(a11y): include leftover-pair evidence in button names - #977
seonghobae wants to merge 279 commits into
Conversation
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
seonghobae
left a comment
There was a problem hiding this comment.
Two repair findings, preserving this PR's valid evidence-name delta rather than closing it.
-
Wrong serialized parent. Issue #976 explicitly requires this lane to start from the then-current serialized product parent after #829/#830 ancestry settles. This head is still based on the older #802 branch. Keep the PR Draft and reconstruct/retarget it after #830 is promoted; do not patch the stale parent in place or replay cumulative history.
-
WCAG 2.2 SC 2.5.3 Label in Name. The visible button label starts with the localized
kindLabel(for exampleClosest leftover: …), while the explicit accessible name startsOpen leftover closest pair: …. The visible label text therefore is not contained in the accessible name. W3C SC 2.5.3 requires the programmatic name to contain the text presented visually, and recommends putting that visible text at the start: https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html . When this lane is reconstructed on the current parent, use the exact visible label as the accessible-name prefix, then append the action/evidence context. Add a realistic regression that compares rendered visible text with the computedaria-label, while retaining the existing fail-closed handling for non-finite evidence metrics.
Record the exact #860 candidate, local verification, queued hosted checks, stack ordering, and remaining authenticated acceptance boundary. Signed-off-by: Seongho Bae <seonghobae@users.noreply.github.com>
Signed-off-by: Seongho Bae <me@seonghobae.me>
Signed-off-by: Seongho Bae <me@seonghobae.me>
* docs(gaps): refresh exact-head product evidence Record protected-main authority, live aggregate inventory, the active Customer Master cycle repair, and remaining acceptance boundaries. Commit-Message-Assisted-by: Claude (via Claude Code) Signed-off-by: Seongho Bae <me@seonghobae.me> * docs(gaps): bind Customer Master evidence to current head Record the current implementation SHA and the desktop/mobile Storybook audit while leaving authenticated PostgreSQL acceptance unresolved. Commit-Message-Assisted-by: Claude (via Claude Code) Signed-off-by: Seongho Bae <me@seonghobae.me> * docs(gaps): refresh current repair ownership evidence * docs(gaps): refresh ready-state evidence * docs(gaps): retract stale Ready evidence * docs(gaps): refresh exact-head queue evidence * docs(gaps): record authenticated scope repair evidence * docs(gaps): refresh protected loop evidence * docs(gaps): track replay repair head * docs(gaps): correct replay exact head * chore(docs): stage exact-head gap baseline refresh * docs(gaps): refresh live exact-head authority * chore(docs): refresh live gap overlay * chore(docs): remove purpose-complete refresh workflow * chore: stage bounded gap baseline refresh * fix: make bounded gap refresh workflow parseable * docs(gaps): refresh terminal Strix security evidence * chore: stage current gap baseline refresh * docs(gaps): record fresh security repair lanes * chore: stage final current gap baseline refresh * docs(gaps): refresh current security evidence * ci(docs): stage bounded baseline refresh * docs(gaps): refresh live exact-head overlay * chore(gaps): stage current authority overlay * chore(gaps): apply current authority overlay * docs(gaps): refresh customer-master exact-head authority * chore(gaps): stage 10:14 exact-head overlay * chore(gaps): run 10:14 exact-head overlay * docs(gaps): refresh exact-head customer-master evidence * chore(docs): stage bounded gap baseline refresh * docs(gaps): refresh exact-head security evidence * chore(docs): stage bounded gap baseline refresh * docs(gaps): refresh exact-head product evidence * chore(docs): stage live-authority baseline refresh * fix(docs): repair bounded live baseline workflow * docs(gaps): refresh live product authority * chore(gaps): stage bounded authority refresh * chore(gaps): remove failed bounded refresh helper * chore(docs): stage bounded baseline refresh * docs(gaps): converge release owner authority * docs(gaps): refresh current product authority * chore(docs): stage bounded gap baseline refresh * fix(docs): repair bounded gap baseline refresh runner * fix(docs): keep refresh payload inside workflow block * docs(gaps): refresh current Customer Master evidence * chore(docs): stage 20:05 gap baseline refresh * chore(docs): remove queued baseline helper * chore(docs): refresh 20:27 live gap baseline * docs(gaps): refresh 20:27 live authority * docs(gaps): make current baseline projection explicit * docs(gaps): refresh exact-head acceptance evidence * docs(gaps): record review-sidecar prerequisite RED * docs(gaps): record prerequisite exact-head GREEN * docs(gaps): refresh current gate evidence * docs(gaps): record exact-head security green * docs(gaps): refresh live review execution evidence * docs(gaps): record exact-head full-diff review evidence * docs(gaps): refresh central prerequisite evidence * docs(gaps): record exact-head review prerequisite approval * docs(gaps): correct current required-gate inventory * docs(gaps): record terminal review runtime evidence * docs(gaps): record current-main ADR occupancy reconstruction * docs(gaps): refresh central review gate settlement * docs(gaps): record canonical CodeQL dispatch progress * docs(gaps): record reconstructed comparison post repair * docs(gaps): record criterion coordinate stack convergence * docs(gaps): record current leftover-map stack convergence * docs(gaps): record non-force leftover-map convergence * docs(gaps): record comparison-axis repair and stack convergence * docs(gaps): record graphic badge repair and descendant convergence * docs(product): refresh live gap authority after owner and stack repairs * docs(product): refresh owner ADR authority after review repair * docs(gaps): record owner-boundary descendant convergence * docs(gaps): include bounded-operator descendant convergence * docs(gaps): record PostgreSQL timeout compatibility repair * docs(gaps): record exact-head PostgreSQL validation admission * docs(gaps): keep PostgreSQL validation admission current * docs(gaps): record report-axis missingness repair and current stack * docs(gaps): record live report-axis RED and descendant convergence * docs(gaps): repair live leftover-map ancestry authority * docs(gaps): refresh exact-head validation evidence * docs(gaps): refresh leftover-map convergence and repair RCA * docs(gaps): record comparison tick i18n RED * docs(gaps): refresh measurement descendant authority * docs(gaps): record fail-closed dependency review and queue differential * docs(gaps): record CodeQL owner repairs and parser finding * docs(gaps): admit exact-head validation for CodeQL repairs * docs(gaps): record post-body CodeQL repair and convergence * docs(gaps): record attributed script-tag parser repair * docs(gaps): record unresolved embedded-image parser gap * docs(gaps): refresh parser and leftover-map evidence * docs(gaps): refresh current product and validation authority * docs(gaps): record backend embedded-image parser repair * docs(gaps): advance embedded-image repair authority * docs(gaps): record current #1115 provenance repair * docs(gap): align owner-boundary lifecycle and stack heads * docs(gap): record hosted leftover-map and warning owner evidence * docs(gaps): record #983 hosted coverage evidence * docs(gaps): record repaired tick foundation and converged stack * docs(gaps): record comparison tick repair and convergence * docs(gaps): refresh live report-stack authority * docs(gaps): record repaired tick-share stack * docs(gaps): record terminal CodeQL verdict failure * docs(gaps): record current #983 coverage evidence * docs(gaps): record hosted parser RED and repair * docs(gaps): record scanner edge coverage convergence * docs(gaps): record ontology extension coverage ancestry * docs(gaps): correct report-axis exact head * docs(gaps): record image-ingestion security green * docs(gaps): record catalog coverage convergence * docs(gaps): converge report stack and current receipts * docs(gaps): record current-head cancellation class * docs(gaps): record comparison post accessibility evidence * docs(gaps): record current CodeQL producer state * docs(gaps): record #873 test coverage and descendant convergence * docs(gaps): refresh #873 exact queue evidence * docs(gaps): refresh #1115 CodeQL producer progress * docs(gaps): track Customer Master eight-locale review draft * docs(gaps): follow translation draft test repair * docs(gaps): admit translation candidate validation * docs(gaps): record Customer Master seed ownership repair * docs(gaps): scope Customer Master seed ownership lifecycle * docs(gaps): record translation ownership search-path repair * docs(gaps): track ledger search-path integrity repair * docs(gaps): track seed ownership replay concurrency * docs(gaps): refresh canonical scheduler authority * docs(gaps): record concurrent Customer Master seed replay repair * docs(gaps): refresh canonical GitHub owner authority * docs(gaps): track reviewed translation replay preservation * docs(gaps): refresh canonical owner head * docs(gaps): record completed-seed retirement lifecycle * docs(gaps): record non-destructive ownership upgrade * docs(gaps): track versioned ownership constraint repair * docs(gaps): follow canonical CodeQL owner movement * docs(gaps): classify terminal CodeQL owner findings * docs(gaps): refresh canonical queue owner * docs(gaps): classify executed image CodeQL producer * docs(gaps): settle current-head frontend evidence and queue authority * docs(gaps): record hosted TLS contract RED and repair * docs(gaps): record current-parent leftover-pair a11y repair * docs(gaps): record current leftover-pair interaction evidence * docs: track dense mobile leftover-pair repair * docs(gaps): archive prior overlay and refresh live authority * docs(gaps): record hosted Storybook and release inventory gaps * docs(gaps): record registry README owner-boundary convergence * docs(gaps): record OIDC smoke dependency repair * docs(gaps): refresh OIDC smoke operator contract evidence * docs(gaps): serialize OIDC smoke before registry README * docs(gaps): compact current owner chain after OIDC stack convergence * docs(gaps): record #974 exact-head GREEN tests * docs(gaps): record #974 security GREEN * docs(gaps): record hosted leftover selector RED * docs(gaps): separate OIDC smoke from browser auth acceptance * docs(gaps): record ROPC topology removal owner * docs(gaps): record #977 selector repair admission * docs(gaps): correct live translation owner heads * docs(a11y): align leftover-pair ADR with visible labels * docs(gaps): record code-current leftover accessibility ADR * docs(gaps): record executable ROPC security RED * docs(gaps): require PKCE S256 in public-client auth gap * docs(gaps): track queued OIDC causal repair * docs(gaps): make ROPC actor migration precede client shutdown * docs(gaps): record partial OIDC machine-actor migration * docs(gaps): converge README onto auth migration * docs(gaps): refresh auth stack exact-head evidence * docs(gaps): record OIDC ADR convergence * docs(gaps): record shared JWKS verifier repair * docs(gaps): record deterministic machine identity repair * docs(gaps): record terminal translation validation reds * docs: record completed #977 selector repair * docs: record terminal #974 CodeQL settlement RED * docs(gaps): record report-axis contract repair and convergence * docs(gaps): correct exact Customer Master authority * docs(gaps): record duplicate-kid auth hardening * docs(gaps): record current auth verifier evidence * docs(gaps): record RFC 7518 JWKS key floor * docs(gaps): record canonical JWK Base64urlUInt repair * docs(gaps): refresh RSA exponent auth evidence * docs(gaps): record minimal JWK integer hardening * docs(gaps): refresh live auth and delivery authority * docs(gaps): record local PU-scope authorization repair * docs(gaps): add mixed-scope fail-closed repair * docs(gaps): record RSA exponent bound and auth heads * docs(gaps): record odd-modulus auth boundary * docs(gaps): record RFC 7517 key-operations repair * docs(gaps): record null-valued JWK metadata repair * docs(gaps): record canonical Base64url pad-bit repair * docs(gaps): record comparison tick root repair and converged stack * docs(gaps): record #861 App acceptance root and telemetry owner * docs(gaps): record #861 axis-label clipping acceptance * docs(gaps): record report contract RCA and current owner head * docs(gaps): record public-only JWKS boundary * docs(gaps): record JWK x5c consistency repair * docs(gaps): record full x5c chain validation * docs(gaps): record x5c key-usage repair and descendant convergence * docs(gaps): record JWK certificate thumbprint invariant * docs(gaps): attach thumbprint exact-head receipts * docs(gaps): record realm-owned service subject boundary * docs(gaps): record disjoint machine and user principals * docs(gaps): record service-client boundary repair * docs(gaps): record usable machine-auth prerequisite * docs(gaps): refresh auth audiences and report receipt * docs(gaps): record x5u verifier boundary and auth heads * docs(gaps): record implicit-flow auth boundary * docs(gaps): record exact OIDC redirect boundary * docs(gaps): record executable seed auth RED * docs(gaps): refresh auth repair runner authority * docs(gaps): remove stale auth repair lane authority * docs(gaps): record seed auth repair and remaining ROPC * docs(gaps): record backend ROPC executable RED * docs(gaps): record exact report-stack failures * docs(gaps): record auth helper endpoint repair * docs(gaps): record PyJWT floor and auth convergence * docs(gaps): add PyJWT advisory traceability authority * docs(gaps): refresh Voice runtime authority Record the live PR and issue inventory, keep exact-head workflow states non-accepting, and mark Voice-of-X runtime acceptance unverified. Signed-off-by: Seongho Bae <me@seonghobae.me> * docs(gaps): keep baseline head claim immutable Label the observed PR head as the parent of this update so a new commit cannot make its own evidence statement stale. Signed-off-by: Seongho Bae <me@seonghobae.me> * docs(gap): record exact report RED and Voice authority repair * fix(a11y): align leftover pair accessible names * fix(ui): wrap leftover evidence on narrow screens * docs(gaps): refresh exact-head ecosystem authority Signed-off-by: Seongho Bae <me@seonghobae.me> * docs(gaps): converge report stack after merged intermediate * docs(gaps): correct current OIDC smoke authority * test(ui): align leftover pair accessible names * docs(gaps): track auth helper repair and convergence * docs(gaps): refresh auth helper boundary * docs(gaps): record remote OAuth TLS repair * docs(gaps): repair acceptance wording and catalog auth owner * codex: refresh exact-head gap evidence (#1041) * docs(gaps): keep #1041 authority self-reference safe * docs(gaps): record comparison axis repair candidate Separate current local rendering and regression evidence from protected delivery, authenticated acceptance, and the remaining stacked-parent gate. Signed-off-by: Seongho Bae <me@seonghobae.me> * docs(gaps): record coordinate tick repair Record the exact #860 candidate, local verification, queued hosted checks, stack ordering, and remaining authenticated acceptance boundary. Signed-off-by: Seongho Bae <seonghobae@users.noreply.github.com> * docs(gaps): refresh auth exact-head evidence * docs(gaps): refresh exact-head authority Signed-off-by: Seongho Bae <me@seonghobae.me> * docs(gaps): adopt source-repaired report and auth heads * fix(reports): omit unavailable leftover distance Signed-off-by: Seongho Bae <me@seonghobae.me> * test(reports): reject non-finite residual accessibility evidence * fix(reports): omit non-finite residual from accessible evidence * test(a11y): reject duplicate leftover evidence announcements * fix(a11y): announce leftover evidence once * test(a11y): preserve leftover action guidance while deduplicating evidence * fix(a11y): deduplicate leftover evidence without dropping guidance * test(a11y): cover all leftover action evidence branches * test(a11y): type leftover evidence branch cases explicitly --------- Signed-off-by: Seongho Bae <me@seonghobae.me> Signed-off-by: Seongho Bae <seonghobae@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
seonghobae
left a comment
There was a problem hiding this comment.
Current-head review after single-writer convergence: the duplicate accessible-evidence finding is source-repaired by 2a9696b2... → 57c60f62...; accepted ADR 0162 visual R — is restored by 5dd4a63b... → d162aaf3...; #1041's valid docs delta is fully inherited through normal merge 73e0b59c... and non-force post-merge convergence 7d052532.... No unresolved review thread remains. Exact-head Tests 35555913839 is Draft-skipped, so this is not approval or hosted GREEN; browser/full-suite/security and independent approval remain required.
seonghobae
left a comment
There was a problem hiding this comment.
Current-head review found a documentation-lineage regression introduced by the #1041 convergence. docs/adr/0049-leftover-pair-report-ui.md drops ADR 0272–0280 from its Amended by, Decision, and naming-reference sections, while the exact parent #830 retained them and the current product source still renders those persisted segment/pair facts. This is not stale history: accepted ADR 0272 explicitly says it amends ADR 0049, and the current helper/source continues to implement reconstruction/share/U/R/Y/E/rank evidence. Treat this as a repair finding, not a close reason. Add an executable regression that pins the accepted 0272–0280 amendment chain, then restore only the lost cross-references while preserving this PR's WCAG Label-in-Name/accessibility repair. No wholesale parent replay.
seonghobae
left a comment
There was a problem hiding this comment.
Current-head review found one additional source-level accessibility defect and it is repaired in this head. In the rank-only zero case, formatLeftoverMapRank(0) admits and visibly renders rank 0, but LEFTOVER_RANK_ZERO_ACTION does not literally contain that measurement. The duplicate-suppression set still marked rank as consumed, so the programmatic name omitted a formatter-admitted persisted value. RED 7b6ff5bc... reproduces that exact rendered case; fix bce09c14... preserves the existing localized zero-rank guidance and only leaves rank 0 unsuppressed in that branch. Rank-zero + Y/E remains unchanged because its richer action already names rank 0; non-zero rank remains deduplicated. Exact 724614e4... → bce09c14... is ahead 2 / behind 0 and limited to the focused regression plus a 3-addition/1-deletion component edit. No hosted acceptance receipt exists yet for this exact head, so this comment is not approval or GREEN.
Current authority — 2026-09-21
Issue #976 remains the owner. This PR is the single LineageWeave source lane for
LeftoverPairListevidence-in-accessible-name behavior and rendered browser acceptance.bebd77c03e5beae469f42361c20bccc80787ebb59dbb28706a3418ef0f9500873e9e7d7417961ef3bce09c145b979e348d3db3ecad01246ff2d20ed9behind_by=0c614d683414b0af1af006c96ed53169ab5b21ee22a9696b25ce2423ebfff48217ea2e0a31ee3630f→57c60f622b0cbda0a746a99d3af9dd98b50c679b5dd4a63bb007c27c23b26e5c3895f8fa9e6abe52→d162aaf307108fbbbda807c2dc4c0c74f33eda7a73e0b59c06c1181538390fb32d79ef0c4091994b→7d052532bde0000cb96cdd57957ff20806aa5c31ff8adc587a5166c39a2d81450ab60ee602f3c9e5→724614e4d769986471fc5192285cf5d558c64ab57b6ff5bc16beb9c2ae91961bc753fb10ff3d7a89→bce09c145b979e348d3db3ecad01246ff2d20ed99dbb28706a3418ef0f9500873e9e7d7417961ef3Predecessor receipts do not transfer.
Single-writer and product contract
#1041's valid product finding is fully inherited here; #1041 is merged documentation history, not a second
LeftoverPairListsource writer. The action name starts with the exact rendered localizedClosest leftover:/Farthest leftover:label, retains localized rich next-action guidance, announces each formatter-admitted persisted measurement once, omits non-finite evidence from the accessible name, and does not derive/clamp/synthesizeR,Y/E, rank,U, shares,R̂,ξ/ζ, ord. Accepted ADR 0162 still requires non-finite persisted residual to remain visibly disclosed asR —while excluding that placeholder from the programmatic name. Dense/mobile behavior, 44px touch target, keyboard/focus, and pinned Storybook Chromium interaction path remain owned here. Canonical KO/EN/JA/ZH/VI/ES/DE/FR translation authority remains #929/#932.Repair in this head
Fresh source review found a narrow but real omission in the duplicate-suppression logic.
formatLeftoverMapRank(0)admits persistedrank 0and the button visibly renders that badge, but the rank-only zero guidance string (LEFTOVER_RANK_ZERO_ACTION) explains that there is no leftover structure without literally namingrank 0. The implementation nevertheless marked rank as already consumed and suppressed the trailingrank 0from the programmatic name. Rank-zero + observed/expected was not affected because that richer action explicitly saysrank 0.RED
7b6ff5bc...adds a focused rendered regression requiring rank-only zero to remain visible and be announced exactly once. Fixbce09c14...preserves the existing localized zero-rank guidance and only stops marking rank as consumed in the rank-only zero branch, so the existing formatter badge suppliesrank 0once. Non-zero rank still suppresses its duplicate becauseLEFTOVER_RANK_STRUCTURE_ACTIONnames the numeric rank. No translation key, psychometric value, or source-of-truth boundary changed.Compare
724614e4...→bce09c14...is ahead 2 / behind 0 and changes onlyLeftoverPairList.rankZeroAccessibleName.test.tsxplus a 3-addition/1-deletion causal edit inLeftoverPairList.tsx.The current exact head adds only
docs/product-technical-gap-baseline.mdon top of that source repair. Baseline commit9dbb2870...removes stale #977 and authentication head claims, records the current #899 → #1118 → #1120 → #1117 authority chain, and avoids self-invalidating the #977 source claim by namingbce09c14...as the last source-bearing repair while leaving the live PR API/body authoritative for the exact mutable head. Comparebce09c14...→9dbb2870...is ahead 1 / behind 0 and changes only the baseline.The prior ADR-lineage repair remains inherited: RED
ff8adc58...pins accepted ADR 0272–0280 in ADR 0049 and fix724614e4...restores only those lost references while preserving the WCAG 2.2 SC 2.5.3 label-in-name repair.Current acceptance state
No pull-request workflow receipt exists yet for exact
9dbb2870.... The last source-bearing head had only Devin Review and CodeRabbit success, which are not focused/frontend/full-suite/Storybook/Security/SAST/CodeQL acceptance and are not independent approval. The documentation-only head does not make predecessor evidence transferable.Keep Draft and unmerged until one unchanged exact head has focused/frontend/full-suite + Storybook Chromium GREEN, applicable Security/SAST/CodeQL GREEN, no unresolved valid review finding, locale/font-fallback evidence where applicable, and qualifying independent approval. Do not wake the lane with a no-op commit, cycle Draft/Ready, transfer predecessor receipts, self-approve, force push, destructively rebase, weaken gates, copy psychometric logic, or create another
LeftoverPairListsource writer.