Skip to content

🎨 Palette: ν–₯μƒλœ 접근성을 μœ„ν•΄ μ•„μ΄μ½˜ λ²„νŠΌμ— 툴팁 및 aria-disabled 적용 - #731

Draft
seonghobae wants to merge 58 commits into
developfrom
fix-score-buttons-13185195304078487658
Draft

🎨 Palette: ν–₯μƒλœ 접근성을 μœ„ν•΄ μ•„μ΄μ½˜ λ²„νŠΌμ— 툴팁 및 aria-disabled 적용#731
seonghobae wants to merge 58 commits into
developfrom
fix-score-buttons-13185195304078487658

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 1, 2026

Copy link
Copy Markdown
Collaborator

Buyer-visible accessibility gap

Score storage and PDF pagination contain actions that are temporarily unavailable but still important for keyboard and assistive-technology users to discover. This is the canonical Score accessibility lane: unavailable actions remain perceivable/focusable where the recovery reason matters, while activation remains fail-closed at the action boundary.

Exact current identity

  • Protected base: develop@314ddeae7b775a4957594b599358c8255617eb2e.
  • Branch: fix-score-buttons-13185195304078487658.
  • Exact head: b2974a4ea2a2918ffc14392b12fba5c6ca89a58f.
  • Open, Draft, mergeable, intentionally unmerged.
  • Fresh protected-base compare: behind_by=0, ahead_by=58, merge base exactly protected develop, with exactly 12 intended Score UI/test/locales/doctoring/CHANGELOG files.

No force update, destructive rebase, self-approval, gate weakening, or predecessor-evidence transfer is used.

Current behavior and executable contract

  • Add/Open/Remove score actions remain keyboard-focusable when project state makes them unavailable, expose aria-disabled, associate localized recovery copy, and block desktop-bridge mutation.
  • Add score rejects repeated activation while attach is already pending.
  • Enabled Open/Remove, zoom, fit-width, Previous and Next controls retain useful localized pointer titles.
  • PDF Previous/Next remain focusable at first/last-page boundaries, expose a localized boundary reason through aria-describedby, and block boundary activation.
  • Boundary reason copy is specific: EN Already at the first page / Already at the last page; KO 첫 번째 νŽ˜μ΄μ§€μž…λ‹ˆλ‹€ / λ§ˆμ§€λ§‰ νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.
  • The author-controlled role="tooltip" appears on pointer hover or keyboard focus, can be dismissed with Escape without navigation, and returns only on a new pointer entry or keyboard refocus while the reason remains valid.
  • Hidden tooltip content uses pointer-events-none; the hover/focus states switch it to pointer-events-auto at the same time it becomes visible. The popup sits directly against the owning control rather than behind a margin dead zone, so the pointer can move continuously from the button to the explanation without either invisible hit interception or hover loss.
  • Bridge failures do not render dependency-controlled local paths or secret-shaped details.

The current semantics follow WAI-ARIA/WCAG boundaries rather than treating ARIA as styling: application code suppresses behavior for aria-disabled; WCAG 2.2 SC 1.4.13 governs hover/focus content; aria-describedby carries the boundary explanation.

References:

Fresh #1178 review and complete succession

#1178 2b81657e23fd04ceebba24e14453670ed29d7aa2 proposed the same ScoreViewer boundary ownership. Its useful unique product delta was reason-specific first/last-page copy. Its implementation otherwise used aria-disabled plus click guards already owned here and exposed the unavailable reason only through native title.

The valid delta was fully adopted before #1178 was closed unmerged:

  • 837580059a636535feccb287a23d82bc48035ca8 β€” EN first/last-page reason copy;
  • f86b0f58e558f0739b4af167bd72d0a2af001e4d β€” KO reason copy;
  • 736ce45cba0decd14557334119ded207b752fd17 β€” focused regression locked to those reasons.

The title-only explanation was intentionally not adopted because it is weaker for keyboard/touch access. No #1178 check/review/status evidence transfers.

WCAG 1.4.13 RED β†’ fix chain

Current-code review found and repaired three successive defects in the canonical tooltip rather than inheriting weaker mechanics:

  • RED 8e0012d46cc0603a836119e47cc191f462c7dc1b β†’ fix 78a5e60a1de7a259c45798959ca497456994fb2f: remove unconditional pointer suppression so visible tooltip content can be hovered.
  • RED b13c3859712f94cb66bbbbe24440f7682b3c47e7 β†’ fix 1a92b71f168a6bec64ad75de2f64f3a6fef4afa5: Escape dismisses the tooltip and its aria-describedby reference without changing page or focus; a later refocus/re-entry restores a still-valid reason.
  • RED a150059cf73540078741fbc8e15ab11f65a0893c β†’ fix a941cf176d15d98ed2f31751a61dcb798eb36daa: avoid the opposite regression where an invisible tooltip becomes a pointer target, and remove the mb-2 geometry gap that can break the continuous hover path. Pointer hit testing is now enabled only under group hover/focus.
  • b2974a4ea2a2918ffc14392b12fba5c6ca89a58f keeps the doctoring/TRACEABILITY source code-current with this interaction contract and WAI-ARIA/WCAG 2.2 references.

Single-writer scope repair

Fresh comparison found a formatting-only change in services/analysis-engine/tests/test_supply_chain_policy.py, unrelated to Score UI ownership. add2d9f496da10da33962ea82b7b09938aa3970a restored the exact protected-develop blob through an ordinary descendant. Fresh compare therefore contains exactly the 12 intended Score-owned files above.

Earlier complete-succession decisions for #1158, #1162, #1167 and #1173 remain represented by this stronger canonical lane; their predecessor evidence does not transfer.

UI Delivery Gate

FAIL. Source-level keyboard/focus/pointer semantics, reason-specific EN/KO copy, hover persistence and Escape dismissal now have focused regression contracts. The exact head still needs terminal current-head repository/central CI, real browser pointer/touch/keyboard verification, responsive evidence, Narrator/VoiceOver evidence and a qualifying independent non-author last-push review. JA/ZH/VI/ES/DE/FR localization and the wider versioned translation-ledger requirement are not completed by this Score slice.

Merge gate

Head b2974a4... is new; every predecessor check/review/approval is historical. Keep Draft until one unchanged exact head has every applicable repository and central CI/build/security/SAST/dependency/coverage/SBOM/release gate terminal-success, zero valid unresolved findings, a qualifying independent non-author last-push approval, and a satisfiable protected-branch contract. Queued, pending, skipped-required, cancelled, failed, stale, predecessor/base, model-only, self/author, or administrative-bypass evidence is non-passing.

@google-labs-jules

Copy link
Copy Markdown

πŸ‘‹ Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a πŸ‘€ emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@coderabbitai

coderabbitai Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❀️ Share

Comment @coderabbitai help to get the list of available commands.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head 53ddb4c7452f96594cea0244cda853489fb934b0.

  • Head SHA: 53ddb4c7452f96594cea0244cda853489fb934b0

  • Workflow run: 30684374373

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 3

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (5 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (5 files)"]
  R1 --> V1["required checks"]
Loading

@opencode-agent

opencode-agent Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

  • Head SHA: f34402ace5f894028f1f42b93623f7529b7b8584
  • Workflow run: 31800468013
  • Workflow attempt: 5
  • Gate result: REQUEST_CHANGES (approval step)

Pull request overview

OpenCode cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head f34402ace5f894028f1f42b93623f7529b7b8584.

  • Head SHA: f34402ace5f894028f1f42b93623f7529b7b8584

  • Workflow run: 31800468013

  • Workflow attempt: 5

Coverage evidence

Coverage evidence job did not run or did not publish coverage evidence.

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (7 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (7 files)"]
  R1 --> V1["required checks"]
Loading

@seonghobae
seonghobae dismissed opencode-agent[bot]’s stale review August 3, 2026 00:08

Dismissed after verifying the exact head SHA against the repository's CI, build-baseline, security, SAST, secret-scan, SBOM, Bandit, release, and security-audit workflows; all completed successfully. The automated coverage-evidence review does not identify a remaining code defect on this head.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor
βœ… Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@seonghobae
seonghobae enabled auto-merge (squash) August 3, 2026 00:10
@seonghobae
seonghobae marked this pull request as draft August 3, 2026 01:05
auto-merge was automatically disabled August 3, 2026 01:05

Pull request was converted to draft

@seonghobae
seonghobae marked this pull request as ready for review August 3, 2026 01:05
@seonghobae
seonghobae enabled auto-merge (squash) August 3, 2026 02:07
@google-labs-jules

Copy link
Copy Markdown

@coderabbitai review

Acknowledged.

Comment thread .github/workflows/bootstrap-score-disabled-styles.yml Fixed

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode cannot approve yet because required coverage evidence did not pass.

Review outcome

1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence

  • Problem: The required coverage-evidence job result was failure, so OpenCode cannot establish approval sufficiency for this head.

  • Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.

  • Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present.

  • Result: REQUEST_CHANGES

  • Reason: coverage-evidence result was failure, so required test/docstring evidence was not proven for current head b12adcdc0c449d845d7d32ac4797a02c822e3653.

  • Head SHA: b12adcdc0c449d845d7d32ac4797a02c822e3653

  • Workflow run: 30822326101

  • Workflow attempt: 1

Coverage evidence

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 3

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (6 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (6 files)"]
  R1 --> V1["required checks"]
Loading

@opencode-agent
opencode-agent Bot disabled auto-merge August 3, 2026 16:47
@seonghobae
seonghobae enabled auto-merge (squash) August 4, 2026 03:31
@opencode-agent
opencode-agent Bot disabled auto-merge August 4, 2026 04:38
@seonghobae
seonghobae enabled auto-merge (squash) August 4, 2026 06:17
@opencode-agent
opencode-agent Bot disabled auto-merge August 4, 2026 07:20
@seonghobae
seonghobae enabled auto-merge (squash) August 4, 2026 07:58
@opencode-agent
opencode-agent Bot disabled auto-merge August 4, 2026 10:11
@seonghobae
seonghobae dismissed opencode-agent[bot]’s stale review August 4, 2026 11:01

Dismissed because the only requested change came from the superseded central coverage environment. Exact-head repository checks succeeded and the prior security workflow artifact was removed; a fresh independent current-head approval remains mandatory.

@seonghobae
seonghobae enabled auto-merge (squash) August 4, 2026 11:03

Copy link
Copy Markdown
Collaborator Author

@cwl-noema-review @opencode-agent Please independently review exact head b12adcdc0c449d845d7d32ac4797a02c822e3653. Exact-head repository CI, security, SBOM, release, and build checks succeeded; the obsolete bootstrap security finding is resolved. Verify focusable aria-disabled behavior, guarded activation, tooltip/accessibility names, visible project requirement association, and full measured desktop coverage; approve only if no blocker remains.

seonghobae added a commit that referenced this pull request Sep 1, 2026
μž‘μ—…μ΄ λ‹€λ₯Έ PR둜 λŒ€μ²΄λ˜μ–΄ 쀑단됨.
PR μ½”λ©˜νŠΈμ—μ„œ κΈ°μ‘΄ PR(#731)에 μ˜ν•΄ μž‘μ—…μ΄ λŒ€μ²΄(Superseded)λ˜μ—ˆμŒμ„ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.
Preserve the canonical Score accessibility semantic tree while adopting protected develop after #1165. Reconcile CHANGELOG without reverting the protected security-backstop entry.

Signed-off-by: Seongho Bae <me@seonghobae.me>
Commit-Message-Assisted-by: ChatGPT (OpenAI)
…rets and maintain aria-disabled for actions
Comment thread patch_score_view2.cjs Fixed
Comment thread patch_score_view2.cjs Fixed
Comment thread patch_score_view2.cjs Fixed
Comment thread patch_score_view2.cjs Fixed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: accessibility Accessibility and assistive-technology support priority: medium Normal-priority or P2 work status: draft Draft pull request type: maintenance Maintenance, build, dependency, or operational upkeep

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants