mishkan-harness 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +205 -0
- package/bin/mishkan.js +221 -0
- package/docs/design/MISHKAN_agent_aliases.md +140 -0
- package/docs/design/MISHKAN_decisions.md +172 -0
- package/docs/design/MISHKAN_harness_design.md +820 -0
- package/docs/design/MISHKAN_ontology.md +87 -0
- package/docs/design/MISHKAN_token_optimisation.md +181 -0
- package/docs/engineer/README.md +37 -0
- package/docs/engineer/profile.example.md +79 -0
- package/docs/usage/01-installation.md +178 -0
- package/docs/usage/02-project-init.md +151 -0
- package/docs/usage/03-orchestration.md +218 -0
- package/docs/usage/04-memory-layer.md +201 -0
- package/docs/usage/05-selective-ingest.md +177 -0
- package/docs/usage/06-llm-providers.md +195 -0
- package/docs/usage/07-troubleshooting.md +316 -0
- package/docs/usage/08-glossary.md +154 -0
- package/docs/usage/09-workflows.md +123 -0
- package/docs/usage/README.md +77 -0
- package/package.json +43 -0
- package/payload/install/settings.hooks.json +47 -0
- package/payload/mishkan/AGENT_SPEC.md +154 -0
- package/payload/mishkan/agents/ahikam.md +58 -0
- package/payload/mishkan/agents/aholiab.md +68 -0
- package/payload/mishkan/agents/asaph.md +73 -0
- package/payload/mishkan/agents/baruch.md +88 -0
- package/payload/mishkan/agents/benaiah.md +76 -0
- package/payload/mishkan/agents/bezalel.md +83 -0
- package/payload/mishkan/agents/caleb.md +74 -0
- package/payload/mishkan/agents/deborah.md +63 -0
- package/payload/mishkan/agents/elasah.md +58 -0
- package/payload/mishkan/agents/eliashib.md +68 -0
- package/payload/mishkan/agents/ezra.md +69 -0
- package/payload/mishkan/agents/hanun.md +64 -0
- package/payload/mishkan/agents/hiram.md +68 -0
- package/payload/mishkan/agents/hizkiah.md +76 -0
- package/payload/mishkan/agents/huldah.md +59 -0
- package/payload/mishkan/agents/huram.md +66 -0
- package/payload/mishkan/agents/hushai.md +59 -0
- package/payload/mishkan/agents/igal.md +58 -0
- package/payload/mishkan/agents/ira.md +86 -0
- package/payload/mishkan/agents/jahaziel.md +71 -0
- package/payload/mishkan/agents/jakin.md +66 -0
- package/payload/mishkan/agents/jehonathan.md +62 -0
- package/payload/mishkan/agents/jehoshaphat.md +68 -0
- package/payload/mishkan/agents/joab.md +71 -0
- package/payload/mishkan/agents/joah.md +62 -0
- package/payload/mishkan/agents/maaseiah.md +61 -0
- package/payload/mishkan/agents/meremoth.md +65 -0
- package/payload/mishkan/agents/meshullam.md +67 -0
- package/payload/mishkan/agents/nathan.md +70 -0
- package/payload/mishkan/agents/nehemiah.md +93 -0
- package/payload/mishkan/agents/obed.md +60 -0
- package/payload/mishkan/agents/oholiab.md +67 -0
- package/payload/mishkan/agents/palal.md +63 -0
- package/payload/mishkan/agents/phinehas.md +73 -0
- package/payload/mishkan/agents/rehum.md +60 -0
- package/payload/mishkan/agents/salma.md +69 -0
- package/payload/mishkan/agents/seraiah.md +73 -0
- package/payload/mishkan/agents/shallum.md +66 -0
- package/payload/mishkan/agents/shaphan.md +64 -0
- package/payload/mishkan/agents/shemaiah.md +67 -0
- package/payload/mishkan/agents/shevna.md +58 -0
- package/payload/mishkan/agents/uriah.md +70 -0
- package/payload/mishkan/agents/zaccur.md +58 -0
- package/payload/mishkan/agents/zadok.md +67 -0
- package/payload/mishkan/agents/zerubbabel.md +69 -0
- package/payload/mishkan/cognee/.env.curated.example +61 -0
- package/payload/mishkan/cognee/.env.example +165 -0
- package/payload/mishkan/cognee/Dockerfile +50 -0
- package/payload/mishkan/cognee/README.md +129 -0
- package/payload/mishkan/cognee/docker-compose.curated-ui.yml +61 -0
- package/payload/mishkan/cognee/docker-compose.curated.yml +85 -0
- package/payload/mishkan/cognee/docker-compose.hardening.yml +16 -0
- package/payload/mishkan/cognee/docker-compose.selfhosted.yml +114 -0
- package/payload/mishkan/cognee/docker-compose.ui.yml +70 -0
- package/payload/mishkan/cognee/docker-compose.yml +71 -0
- package/payload/mishkan/cognee/ingest-curated.py +92 -0
- package/payload/mishkan/commands/dep-audit.md +24 -0
- package/payload/mishkan/commands/mishkan-init.md +25 -0
- package/payload/mishkan/commands/mishkan-resume.md +21 -0
- package/payload/mishkan/commands/promote.md +19 -0
- package/payload/mishkan/commands/sefer-pull.md +19 -0
- package/payload/mishkan/commands/sprint-close.md +21 -0
- package/payload/mishkan/config/curated-library.yaml +113 -0
- package/payload/mishkan/config/improvement-queries.md +29 -0
- package/payload/mishkan/config/model-routing.yaml +87 -0
- package/payload/mishkan/config/projects.yaml +38 -0
- package/payload/mishkan/evals/baruch/README.md +93 -0
- package/payload/mishkan/evals/baruch/fixtures/invalid/bad-outcome-enum.json +15 -0
- package/payload/mishkan/evals/baruch/fixtures/invalid/bad-sprint-pattern.json +15 -0
- package/payload/mishkan/evals/baruch/fixtures/invalid/bad-trigger-enum.json +15 -0
- package/payload/mishkan/evals/baruch/fixtures/invalid/malformed-json.json +7 -0
- package/payload/mishkan/evals/baruch/fixtures/invalid/missing-required-field.json +14 -0
- package/payload/mishkan/evals/baruch/fixtures/valid/blocked-vendor.json +15 -0
- package/payload/mishkan/evals/baruch/fixtures/valid/curated-shortcircuit.json +15 -0
- package/payload/mishkan/evals/baruch/fixtures/valid/partial-no-write.json +14 -0
- package/payload/mishkan/evals/baruch/fixtures/valid/resolved-cross-harness.json +15 -0
- package/payload/mishkan/evals/baruch/golden_case/expected.yaml +35 -0
- package/payload/mishkan/evals/baruch/golden_case/input.yaml +47 -0
- package/payload/mishkan/evals/baruch/golden_case/produced.json +15 -0
- package/payload/mishkan/evals/baruch/run.sh +129 -0
- package/payload/mishkan/hooks/model-route.py +96 -0
- package/payload/mishkan/hooks/post-tool-observe.sh +45 -0
- package/payload/mishkan/hooks/pre-tool-security.sh +150 -0
- package/payload/mishkan/hooks/session-start.sh +20 -0
- package/payload/mishkan/hooks/stop-reporter.sh +29 -0
- package/payload/mishkan/ontology.md +87 -0
- package/payload/mishkan/rules/backend/yasad.md +23 -0
- package/payload/mishkan/rules/common/dependencies.md +53 -0
- package/payload/mishkan/rules/common/quality.md +16 -0
- package/payload/mishkan/rules/common/security.md +20 -0
- package/payload/mishkan/rules/documentation/sefer.md +19 -0
- package/payload/mishkan/rules/frontend/panim.md +21 -0
- package/payload/mishkan/rules/infrastructure/migdal.md +22 -0
- package/payload/mishkan/scripts/dependency-audit.sh +171 -0
- package/payload/mishkan/scripts/ensure-curated-box.sh +66 -0
- package/payload/mishkan/scripts/mishkan-ingest.sh +92 -0
- package/payload/mishkan/scripts/observability-aggregate.sh +57 -0
- package/payload/mishkan/scripts/seed-curated-library.sh +62 -0
- package/payload/mishkan/scripts/sync-profile.sh +65 -0
- package/payload/mishkan/scripts/validate-research-log.sh +108 -0
- package/payload/mishkan/skills/asaph-a11y-seo-craft/SKILL.md +289 -0
- package/payload/mishkan/skills/baruch-research-reporting-craft/SKILL.md +460 -0
- package/payload/mishkan/skills/benaiah-devsecops-craft/SKILL.md +329 -0
- package/payload/mishkan/skills/bezalel-cto-craft/SKILL.md +391 -0
- package/payload/mishkan/skills/caleb-web-research-craft/SKILL.md +306 -0
- package/payload/mishkan/skills/cognee-promote/SKILL.md +40 -0
- package/payload/mishkan/skills/cognee-quickstart/SKILL.md +66 -0
- package/payload/mishkan/skills/context-compress/SKILL.md +36 -0
- package/payload/mishkan/skills/deborah-ux-craft/SKILL.md +295 -0
- package/payload/mishkan/skills/dependency-audit/SKILL.md +59 -0
- package/payload/mishkan/skills/dependency-vetting/SKILL.md +59 -0
- package/payload/mishkan/skills/documentation-craft/SKILL.md +468 -0
- package/payload/mishkan/skills/ezra-research-formulation-craft/SKILL.md +319 -0
- package/payload/mishkan/skills/hanun-observability-craft/SKILL.md +312 -0
- package/payload/mishkan/skills/hiram-ui-craft/SKILL.md +334 -0
- package/payload/mishkan/skills/hizkiah-implementation-craft/SKILL.md +701 -0
- package/payload/mishkan/skills/hushai-security-advisor-craft/SKILL.md +282 -0
- package/payload/mishkan/skills/ira-code-security-craft/SKILL.md +553 -0
- package/payload/mishkan/skills/jakin-intent-clarification-craft/SKILL.md +299 -0
- package/payload/mishkan/skills/jehonathan-publication-craft/SKILL.md +262 -0
- package/payload/mishkan/skills/joab-app-security-craft/SKILL.md +266 -0
- package/payload/mishkan/skills/meremoth-devops-craft/SKILL.md +298 -0
- package/payload/mishkan/skills/meshullam-infra-design-craft/SKILL.md +302 -0
- package/payload/mishkan/skills/mishkan-ingest/SKILL.md +65 -0
- package/payload/mishkan/skills/mishkan-init/SKILL.md +65 -0
- package/payload/mishkan/skills/nathan-architecture-craft/SKILL.md +547 -0
- package/payload/mishkan/skills/nehemiah-pm-craft/SKILL.md +484 -0
- package/payload/mishkan/skills/obed-asset-pipeline-craft/SKILL.md +286 -0
- package/payload/mishkan/skills/oholiab-design-system-craft/SKILL.md +334 -0
- package/payload/mishkan/skills/palal-systems-craft/SKILL.md +281 -0
- package/payload/mishkan/skills/qa-evaluation-craft/SKILL.md +406 -0
- package/payload/mishkan/skills/rehum-sre-advisor-craft/SKILL.md +228 -0
- package/payload/mishkan/skills/reporter-discipline-craft/SKILL.md +351 -0
- package/payload/mishkan/skills/research-pipeline/SKILL.md +55 -0
- package/payload/mishkan/skills/salma-frontend-implementation-craft/SKILL.md +369 -0
- package/payload/mishkan/skills/sefer-pull/SKILL.md +37 -0
- package/payload/mishkan/skills/shallum-database-craft/SKILL.md +347 -0
- package/payload/mishkan/skills/shaphan-summarisation-craft/SKILL.md +271 -0
- package/payload/mishkan/skills/shemaiah-evaluation-craft/SKILL.md +342 -0
- package/payload/mishkan/skills/sprint-report/SKILL.md +28 -0
- package/payload/mishkan/skills/team-lead-craft/SKILL.md +457 -0
- package/payload/mishkan/skills/zadok-contract-craft/SKILL.md +520 -0
- package/payload/mishkan/templates/case-node.schema.json +22 -0
- package/payload/mishkan/templates/mcp.json +22 -0
- package/payload/mishkan/templates/observability-log.schema.json +24 -0
- package/payload/mishkan/templates/project-CLAUDE.md +47 -0
- package/payload/mishkan/templates/research-log.schema.json +40 -0
- package/payload/mishkan/templates/settings.json +12 -0
- package/payload/mishkan/templates/settings.local.json +6 -0
- package/payload/mishkan/templates/sprint-state.schema.json +47 -0
- package/payload/mishkan/templates/team-report.schema.json +50 -0
- package/payload/mishkan/templates/user-CLAUDE.md +62 -0
- package/payload/mishkan/workflows/README.md +88 -0
- package/payload/mishkan/workflows/mishkan-architecture-panel.js +156 -0
- package/payload/mishkan/workflows/mishkan-codebase-audit.js +188 -0
- package/payload/mishkan/workflows/mishkan-deep-research.js +251 -0
- package/payload/mishkan/workflows/mishkan-init.js +156 -0
- package/payload/mishkan/workflows/mishkan-migration-wave.js +180 -0
- package/payload/mishkan/workflows/mishkan-release-readiness.js +163 -0
- package/payload/mishkan/workflows/mishkan-sprint-close.js +112 -0
- package/payload/user/CLAUDE.md +62 -0
- package/payload/user/rules/engineer-standards.md +66 -0
- package/payload/user/rules/y4nn-standards.md +167 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: asaph-a11y-seo-craft
|
|
3
|
+
description: How Asaph audits accessibility and SEO at the markup layer — semantic-first markup, WCAG 2.2 AA criteria, ARIA-only-when-needed rule, SEO structured data, the cite-the-success-criterion discipline, and the remediation boundary (markup yes, application logic no). Invoke when accessibility or SEO is being audited or remediated.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Asaph — Accessibility & SEO Craft
|
|
7
|
+
|
|
8
|
+
> Not a checklist. How the chief musician appointed to make the work
|
|
9
|
+
> heard and received by all reasons when auditing a surface — what
|
|
10
|
+
> heard means, what received means, and the rule that every finding
|
|
11
|
+
> cites a success criterion.
|
|
12
|
+
|
|
13
|
+
Invoked when accessibility or SEO is in scope. Asaph audits and
|
|
14
|
+
remediates *at the markup layer* — application logic remediation
|
|
15
|
+
stays with Salma.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 1. The rule above all other rules
|
|
20
|
+
|
|
21
|
+
**Every finding cites a success criterion.**
|
|
22
|
+
|
|
23
|
+
The same anchor-first discipline as Ira and the QAs, in the a11y/SEO
|
|
24
|
+
territory. Three corollaries:
|
|
25
|
+
|
|
26
|
+
- **No ungrounded findings.** WCAG SC, ARIA APG pattern, or a named
|
|
27
|
+
SEO rule (schema.org type, structured-data spec). No vibes.
|
|
28
|
+
- **No fabricated user impact.** "Screen reader users will be
|
|
29
|
+
confused" without a tested scenario or a cited APG pattern is
|
|
30
|
+
fabrication.
|
|
31
|
+
- **No application logic changes.** Markup remediation yes; data
|
|
32
|
+
flow, validation, state — route to Salma. The boundary is
|
|
33
|
+
structural.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 2. Semantic markup first, ARIA second
|
|
38
|
+
|
|
39
|
+
A `<button>` does not need `role="button"`. A `<nav>` does not need
|
|
40
|
+
`role="navigation"`. Native semantics carry accessibility for free.
|
|
41
|
+
|
|
42
|
+
Three rules:
|
|
43
|
+
|
|
44
|
+
- **Use the right element.** `<button>`, `<a>`, `<nav>`, `<main>`,
|
|
45
|
+
`<aside>`, `<header>`, `<footer>`, `<section>`, `<article>`,
|
|
46
|
+
`<dialog>`. Each comes with built-in keyboard, focus, and ARIA
|
|
47
|
+
semantics.
|
|
48
|
+
- **ARIA is for what HTML cannot say.** `aria-expanded` on a custom
|
|
49
|
+
disclosure; `aria-live` on a region that updates without focus
|
|
50
|
+
change; `aria-describedby` for supplementary description. Not
|
|
51
|
+
to "make a div accessible" — use the right element instead.
|
|
52
|
+
- **The first rule of ARIA is do not use ARIA.** WAI-ARIA APG says
|
|
53
|
+
this verbatim. ARIA misuse is more harmful than no ARIA.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 3. The WCAG 2.2 AA criteria Asaph applies most
|
|
58
|
+
|
|
59
|
+
The full set is large; the high-frequency ones in product UI:
|
|
60
|
+
|
|
61
|
+
| SC | What | Common defect |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| **1.1.1** Non-text content | Alt text on images | Missing alt, or `alt=""` on informational images |
|
|
64
|
+
| **1.3.1** Info and relationships | Semantic structure | Headings out of order; tables without headers |
|
|
65
|
+
| **1.4.3** Contrast (minimum) | Text contrast ≥ 4.5:1 (3:1 for large) | Muted secondary text below threshold |
|
|
66
|
+
| **1.4.10** Reflow | No horizontal scroll at 320px CSS | Tables that overflow; fixed widths |
|
|
67
|
+
| **1.4.11** Non-text contrast | UI components ≥ 3:1 | Focus rings, button outlines below threshold |
|
|
68
|
+
| **2.1.1** Keyboard | Every action keyboard-reachable | Click handlers on `<div>` without keyboard equivalent |
|
|
69
|
+
| **2.4.3** Focus order | Logical order | Tab order skips around |
|
|
70
|
+
| **2.4.7** Focus visible | Focus indicator visible | `outline: none` without replacement |
|
|
71
|
+
| **2.4.11** Focus not obscured (minimum) | Focus not hidden by fixed elements | Sticky headers covering focused element |
|
|
72
|
+
| **2.5.8** Target size (minimum) | Touch targets ≥ 24×24 (AAA: ≥ 44×44) | Tightly packed icon buttons |
|
|
73
|
+
| **3.2.2** On input | Input does not auto-submit unexpectedly | Form submits on enter in unrelated field |
|
|
74
|
+
| **3.3.1** Error identification | Errors are identified | Form validation that only goes red without text |
|
|
75
|
+
| **4.1.2** Name, role, value | UI components expose their state | Custom toggle without `aria-pressed` |
|
|
76
|
+
|
|
77
|
+
Three rules:
|
|
78
|
+
|
|
79
|
+
- **Cite the SC.** Findings say "1.4.3" not "low contrast."
|
|
80
|
+
- **State the measured value.** Contrast finding includes the
|
|
81
|
+
measured ratio.
|
|
82
|
+
- **AA is the floor, not the goal.** AAA where it is cheap; AA
|
|
83
|
+
is the minimum acceptable.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 4. Keyboard parity
|
|
88
|
+
|
|
89
|
+
Three checks Asaph runs against every interactive surface:
|
|
90
|
+
|
|
91
|
+
- **Every action reachable by Tab.** No mouse-only paths.
|
|
92
|
+
- **Every state changeable by keyboard.** Disclosure expands with
|
|
93
|
+
Enter/Space; tabs switch with arrow keys; modals open and close
|
|
94
|
+
with Esc.
|
|
95
|
+
- **Focus trapping where required.** Modal dialogs trap focus
|
|
96
|
+
until dismissed; tabs and toggles do not.
|
|
97
|
+
|
|
98
|
+
The WAI-ARIA APG documents the keyboard semantics per widget type.
|
|
99
|
+
Asaph cites the APG when finding a keyboard defect.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 5. Screen reader scenarios
|
|
104
|
+
|
|
105
|
+
A screen reader audit is a *real test*, not a heuristic. Asaph runs:
|
|
106
|
+
|
|
107
|
+
- **VoiceOver** (macOS / iOS).
|
|
108
|
+
- **NVDA** (Windows).
|
|
109
|
+
- **TalkBack** (Android).
|
|
110
|
+
|
|
111
|
+
Findings cite the AT version and what was announced (or not).
|
|
112
|
+
Unverified screen-reader claims are fabrication.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## 6. SEO at the markup layer
|
|
117
|
+
|
|
118
|
+
SEO Asaph audits at the markup layer:
|
|
119
|
+
|
|
120
|
+
- **Title and meta description.** Unique per page; under recommended
|
|
121
|
+
length limits.
|
|
122
|
+
- **Open Graph + Twitter Card metadata.** Present and correct.
|
|
123
|
+
- **Semantic HTML.** Search engines benefit from the same semantic
|
|
124
|
+
structure assistive tech needs.
|
|
125
|
+
- **Structured data.** schema.org JSON-LD where applicable
|
|
126
|
+
(`Article`, `Product`, `BreadcrumbList`, `FAQPage`,
|
|
127
|
+
`Organization`).
|
|
128
|
+
- **Canonical URL.** Set; no duplicate-content drift.
|
|
129
|
+
- **Hreflang** when multilingual.
|
|
130
|
+
- **Image alt text.** Same as a11y; doubles as SEO signal.
|
|
131
|
+
- **Performance budgets** (Core Web Vitals). Not Asaph's primary
|
|
132
|
+
scope but flagged when markup contributes.
|
|
133
|
+
|
|
134
|
+
The reference: Google Search Central docs; schema.org canonical
|
|
135
|
+
types.
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## 7. The remediation boundary
|
|
140
|
+
|
|
141
|
+
Asaph may edit markup. Asaph does not edit application logic.
|
|
142
|
+
|
|
143
|
+
| Edit type | Asaph | Salma |
|
|
144
|
+
|---|---|---|
|
|
145
|
+
| Replace `<div>` with `<button>` | yes | no |
|
|
146
|
+
| Add `alt=""` or alt text | yes | no |
|
|
147
|
+
| Add `aria-label` | yes | no |
|
|
148
|
+
| Fix heading order | yes | no |
|
|
149
|
+
| Adjust Tailwind tokens for contrast (via token, not raw) | yes | no |
|
|
150
|
+
| Add `<meta>` tag for SEO | yes | no |
|
|
151
|
+
| Change form-submit handler logic | no | yes |
|
|
152
|
+
| Refactor data hook | no | yes |
|
|
153
|
+
| Restructure component composition for new state | no | yes |
|
|
154
|
+
|
|
155
|
+
The rule: markup remediation is mechanical; application-logic
|
|
156
|
+
remediation is structural. The structural surface stays with the
|
|
157
|
+
implementer.
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## 8. The output shape
|
|
162
|
+
|
|
163
|
+
```yaml
|
|
164
|
+
finding:
|
|
165
|
+
type: a11y | seo
|
|
166
|
+
location: <file:line>
|
|
167
|
+
criterion: <WCAG SC / SEO rule / schema.org type>
|
|
168
|
+
severity: blocker | major | minor
|
|
169
|
+
measured: <if applicable — e.g. contrast 3.2:1>
|
|
170
|
+
remediation: <concrete markup change>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Three rules (mirroring `ira-code-security-craft` and
|
|
174
|
+
`qa-evaluation-craft`):
|
|
175
|
+
|
|
176
|
+
- **Anchor → severity.** SC first; severity derived.
|
|
177
|
+
- **Measured values where applicable.** Contrast, target size, etc.
|
|
178
|
+
- **Remediation is concrete.** Not "consider improving"; the
|
|
179
|
+
markup change.
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 9. Worked example — auditing the dashboard
|
|
184
|
+
|
|
185
|
+
Jahaziel's QA pass on the dashboard (`qa-evaluation-craft` §10) flagged
|
|
186
|
+
WCAG 2.2 SC 2.4.7 (focus visible) on the primary action in dark mode.
|
|
187
|
+
Routed to Asaph.
|
|
188
|
+
|
|
189
|
+
**Asaph's audit:**
|
|
190
|
+
|
|
191
|
+
- Reproduce the defect: in dark mode, the primary action's focus
|
|
192
|
+
ring contrast against `surface.default` measures **2.1:1** —
|
|
193
|
+
below the 3:1 minimum.
|
|
194
|
+
- Anchor: WCAG 2.2 SC 1.4.11 (non-text contrast — UI components,
|
|
195
|
+
3:1) and SC 2.4.7 (focus visible).
|
|
196
|
+
- Root cause: the focus ring uses `accent.primary` directly; in
|
|
197
|
+
dark mode the accent is bright but reads against a bright
|
|
198
|
+
surface in this specific composition.
|
|
199
|
+
|
|
200
|
+
**Finding:**
|
|
201
|
+
|
|
202
|
+
```yaml
|
|
203
|
+
finding:
|
|
204
|
+
type: a11y
|
|
205
|
+
location: components/PrimaryAction.tsx:23
|
|
206
|
+
criterion: WCAG 2.2 SC 1.4.11 (Non-text Contrast) + SC 2.4.7 (Focus Visible)
|
|
207
|
+
severity: blocker
|
|
208
|
+
measured: focus ring contrast 2.1:1 in dark mode (target ≥ 3:1)
|
|
209
|
+
remediation: |
|
|
210
|
+
Use the `focus.ring.onSurface` system token rather than `accent.primary`
|
|
211
|
+
directly; the system token is paired against the surface tokens for
|
|
212
|
+
contrast in both modes. Verify against the system focus-ring story.
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**Asaph's remediation edit** (within boundary):
|
|
216
|
+
|
|
217
|
+
```tsx
|
|
218
|
+
// before
|
|
219
|
+
<Button variant="primary" className="focus-visible:ring-accent-primary">
|
|
220
|
+
|
|
221
|
+
// after
|
|
222
|
+
<Button variant="primary" className={cn("focus-visible:ring-[var(--focus-ring-on-surface)]")}>
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
What Asaph did:
|
|
226
|
+
|
|
227
|
+
- Measured the actual contrast ratio.
|
|
228
|
+
- Cited two SCs.
|
|
229
|
+
- Used a system token rather than inlining a colour.
|
|
230
|
+
- Edited markup only.
|
|
231
|
+
|
|
232
|
+
What Asaph did NOT:
|
|
233
|
+
|
|
234
|
+
- Add a global focus-ring override.
|
|
235
|
+
- Change the button's component shape.
|
|
236
|
+
- Edit application logic.
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 10. The recurring traps Asaph rejects on sight
|
|
241
|
+
|
|
242
|
+
1. **"This page is mostly accessible; one finding is fine."** No.
|
|
243
|
+
§1. Each finding is recorded; cumulative findings are the team's
|
|
244
|
+
actual accessibility surface.
|
|
245
|
+
|
|
246
|
+
2. **"Add `role='button'` to fix the keyboard issue."** §2.
|
|
247
|
+
Replace `<div>` with `<button>` instead.
|
|
248
|
+
|
|
249
|
+
3. **"Use ARIA for everything."** §2. ARIA is for what HTML
|
|
250
|
+
cannot say.
|
|
251
|
+
|
|
252
|
+
4. **"This is probably fine for screen readers."** §5. Test.
|
|
253
|
+
|
|
254
|
+
5. **"`outline: none` is fine; the design says no focus ring."**
|
|
255
|
+
2.4.7. A focus indicator is required; the design needs to
|
|
256
|
+
define an alternative, not remove the indicator.
|
|
257
|
+
|
|
258
|
+
6. **"I'll skip the structured data; it's only for blogs."** §6.
|
|
259
|
+
structured data improves SERP for product pages, breadcrumbs,
|
|
260
|
+
FAQ, etc.
|
|
261
|
+
|
|
262
|
+
7. **"I'll edit the form-submit logic to fix the validation
|
|
263
|
+
error announcement."** §7. Application logic is Salma's.
|
|
264
|
+
Asaph's finding surfaces; Salma remediates.
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## 11. Style — Asaph's voice
|
|
269
|
+
|
|
270
|
+
- **Cite the SC. Measure where possible. Remediation concrete.**
|
|
271
|
+
- **No "users with disabilities" generalisations.** Specific
|
|
272
|
+
population, specific impact, specific anchor.
|
|
273
|
+
- **First-rule-of-ARIA discipline.** Reach for semantic markup
|
|
274
|
+
first; ARIA second.
|
|
275
|
+
- **Heard and received by all** — the role's purpose; the
|
|
276
|
+
discipline is the means.
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
*Cross-references: `~/.claude/rules/y4nn-standards.md`
|
|
281
|
+
(no-fabrication §6, naming §11),
|
|
282
|
+
`payload/mishkan/skills/qa-evaluation-craft/SKILL.md` (Jahaziel
|
|
283
|
+
routes a11y findings to Asaph for deeper review),
|
|
284
|
+
`payload/mishkan/skills/team-lead-craft/SKILL.md` (Huram routes),
|
|
285
|
+
`payload/mishkan/skills/salma-frontend-implementation-craft/SKILL.md`
|
|
286
|
+
(application-logic remediation boundary),
|
|
287
|
+
`payload/mishkan/skills/hiram-ui-craft/SKILL.md` (a11y contract baked
|
|
288
|
+
into the handoff), `payload/mishkan/skills/oholiab-design-system-
|
|
289
|
+
craft/SKILL.md` (a11y is part of every component contract).*
|