fix(a11y): repair editor contrast and keyboard focus - #362
Conversation
Give hosts a typed catalog of the repeating --cwl-* chrome tokens, a DTCG 2025.10 interchange snapshot, and Storybook stories for toolbar button states so brand theming happens on .cwl-editor after a WCAG 2.2 contrast check. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
Delete the leftover 0027 design-token ADR so this lane no longer collides with #141, #248, and #320. Catalog color remaps are print-media values, not forced-colors assignments, and Storybook now shows disabled, surface, and collaboration-status chrome as a class-level sample. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
Add a Live Toolbar story that constructs the real TipTap toolbar so hosts can preview token overrides on the same buttons buyers ship, while the class-level sample stays available and CwlEditor stays unmounted. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
Hosts can compare shipped color pairs and their own #rrggbb overrides against the WCAG 2.2 4.5:1 text threshold without reading CSS internals or treating the ratio as a certification. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
Point hosts at --cwl-accent on --cwl-accent-soft, publish meetsTextContrast for that pair, and add a :focus-visible Storybook sample so dark active toolbar text is not treated as certified. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
There was a problem hiding this comment.
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
successwith required evidence or explicit no-source not-applicable evidence. -
Regression test: Keep the approval branch checking
needs.coverage-evidence.result == successbefore 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 head7ba47884393b14a4b3c92b82756ec052c3bfe9c2. -
Head SHA:
7ba47884393b14a4b3c92b82756ec052c3bfe9c2 -
Workflow run: 32107324836
-
Workflow attempt: 1
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 (15 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (15 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Docs (12 files)"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs (12 files)"]
R2 --> V2["docs review"]
|
@opencode-agent review Regenerate review-only evidence for exact unchanged Inkspan head |
|
@opencode-agent review Post-repair acceptance canary for exact unchanged Inkspan head Protected central review truth is now signed Inkspan-local gates on this immutable head remain terminal GREEN: CI Require a durable receipt bound to this source comment/repository/PR/head/base, an observed downstream exact checkout SHA |
|
@opencode-agent please run a fresh review-only canary for exact head |
There was a problem hiding this comment.
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
successwith required evidence or explicit no-source not-applicable evidence. -
Regression test: Keep the approval branch checking
needs.coverage-evidence.result == successbefore 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 head11d5cfecdcc0949ec98e6ca110d482124bff00c4. -
Head SHA:
11d5cfecdcc0949ec98e6ca110d482124bff00c4 -
Workflow run: 32702575402
-
Workflow attempt: 1
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 (20 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (20 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Docs (15 files)"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs (15 files)"]
R2 --> V2["docs review"]
Evidence --> S3["Test (2 files)"]
S3 --> I3["regression suite"]
I3 --> R3["Review risk: Test (2 files)"]
R3 --> V3["targeted test run"]
…f7-4165-a287-7953b06e4df3-4137 # Conflicts: # CHANGELOG.md
|
Current-head update
Awaiting fresh exact-head checks before merge. |
|
Merge-readiness evidence for exact head
Merging under the organization admin path (precedent #326, #299, #372). |
ADR 0031 Accepted (integrated via #362); UML/adr-index/storybook-inventory/ doctoring/design-tokens moved from Active-PR phrasing to shipped truth; designTokenDocumentation.test.ts asserts the integrated contract.
Product defect / Inkspan ownership
This is the existing Inkspan-owned accessibility/design-token lane. It repairs the editor presentation boundary without moving host transport, auth, tenancy, persistence, credentials, model policy, durable audit, Yjs authority, or durable PDF authority into Inkspan.
The core buyer-visible repairs include:
:focus-visibleindicator for the editable textbox, including forced-colors behavior;Host CSS overrides remain host-owned: catalog contrast helpers describe shipped catalog values; resolved host override colors must be checked with the lower-level contrast helper using the actual resolved colors.
TDD / review lineage
The branch contains test-first lineages for the focus indicator and print suppression and later review-driven repairs. All currently visible CodeRabbit/Devin inline threads are resolved; informational observations about forced-colors cascade, DTCG light-value export, and catalog-vs-host contrast do not by themselves authorize merge.
Predecessor reviews, runs, and exact-head claims remain historical evidence only and do not transfer after branch movement.
Fresh exact state
Refetched live state before this PR-body repair:
main:fd75c835a2a7c5d9a1f57c3e080364237d69819a;9b8c5e689968d2c41d0fdb2ce7160f2e8526702f;ahead 74 / behind 33, merge baseb68b763b67a51bfb480af8d435ba8728156ebbd3;32859096145: completed / success;32859094437: completed / success;32859094356: completed / success;CHANGES_REQUESTEDis predecessor-head11d5cfecdcc0949ec98e6ca110d482124bff00c4and is non-transferable.The current required OpenCode workflow generation
32859091491has successful check contexts, but itscoverage-source-tree(97851132751),coverage-evidence(97861796918), andopencode-review(97871884421) jobs intentionally do not execute PR content and explicitly delegate review/coverage to a separate authenticated dispatch. Under Inkspan's fail-closed acceptance contract those are status-only contexts, not formal approval and not independent non-vacuous current-head review evidence.Source-ownership dependency
Live changed-path inspection proves this branch and the earlier canonical forced-colors Draft #151 both write
src/styles.cssandsrc/editorFocusStyles.test.ts. #151 additionally ownssrc/forcedColorsStyles.test.tsandtests/browser/specs/forced-colors.browser.spec.ts. This PR therefore remains Draft until that source-owner overlap is reconciled dependency-first; neither branch may race the shared stylesheet/focus-test boundary.Foreign review-control owner
The missing current-head formal review is owned by the existing central review-control path, not by Inkspan source. The current evidence and falsifiable acceptance were advanced on
ContextualWisdomLab/.github#814without creating another same-head leaf request. Current protected central authority was refetched as.github/main@95b05b393c75931044b405ae491079d336d89293.Do not change Inkspan source merely to make predecessor review evidence appear current. Do not post duplicate same-head review requests, self-approve, bypass branch governance, or treat successful placeholder contexts as review/coverage proof.
Integration boundary
This PR must not merge from the present state. Before any lifecycle action:
src/styles.cssandsrc/editorFocusStyles.test.tsdependency-first, without creating a competing writer;Pending, queued, skipped, cancelled, absent, neutral, failed, stale, predecessor, status-only, model-only, wrong-checkout, or synthetic-merge-only evidence is non-passing. Protected
mainremains the only shipped implementation authority.