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.
Files changed (186) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +205 -0
  3. package/bin/mishkan.js +221 -0
  4. package/docs/design/MISHKAN_agent_aliases.md +140 -0
  5. package/docs/design/MISHKAN_decisions.md +172 -0
  6. package/docs/design/MISHKAN_harness_design.md +820 -0
  7. package/docs/design/MISHKAN_ontology.md +87 -0
  8. package/docs/design/MISHKAN_token_optimisation.md +181 -0
  9. package/docs/engineer/README.md +37 -0
  10. package/docs/engineer/profile.example.md +79 -0
  11. package/docs/usage/01-installation.md +178 -0
  12. package/docs/usage/02-project-init.md +151 -0
  13. package/docs/usage/03-orchestration.md +218 -0
  14. package/docs/usage/04-memory-layer.md +201 -0
  15. package/docs/usage/05-selective-ingest.md +177 -0
  16. package/docs/usage/06-llm-providers.md +195 -0
  17. package/docs/usage/07-troubleshooting.md +316 -0
  18. package/docs/usage/08-glossary.md +154 -0
  19. package/docs/usage/09-workflows.md +123 -0
  20. package/docs/usage/README.md +77 -0
  21. package/package.json +43 -0
  22. package/payload/install/settings.hooks.json +47 -0
  23. package/payload/mishkan/AGENT_SPEC.md +154 -0
  24. package/payload/mishkan/agents/ahikam.md +58 -0
  25. package/payload/mishkan/agents/aholiab.md +68 -0
  26. package/payload/mishkan/agents/asaph.md +73 -0
  27. package/payload/mishkan/agents/baruch.md +88 -0
  28. package/payload/mishkan/agents/benaiah.md +76 -0
  29. package/payload/mishkan/agents/bezalel.md +83 -0
  30. package/payload/mishkan/agents/caleb.md +74 -0
  31. package/payload/mishkan/agents/deborah.md +63 -0
  32. package/payload/mishkan/agents/elasah.md +58 -0
  33. package/payload/mishkan/agents/eliashib.md +68 -0
  34. package/payload/mishkan/agents/ezra.md +69 -0
  35. package/payload/mishkan/agents/hanun.md +64 -0
  36. package/payload/mishkan/agents/hiram.md +68 -0
  37. package/payload/mishkan/agents/hizkiah.md +76 -0
  38. package/payload/mishkan/agents/huldah.md +59 -0
  39. package/payload/mishkan/agents/huram.md +66 -0
  40. package/payload/mishkan/agents/hushai.md +59 -0
  41. package/payload/mishkan/agents/igal.md +58 -0
  42. package/payload/mishkan/agents/ira.md +86 -0
  43. package/payload/mishkan/agents/jahaziel.md +71 -0
  44. package/payload/mishkan/agents/jakin.md +66 -0
  45. package/payload/mishkan/agents/jehonathan.md +62 -0
  46. package/payload/mishkan/agents/jehoshaphat.md +68 -0
  47. package/payload/mishkan/agents/joab.md +71 -0
  48. package/payload/mishkan/agents/joah.md +62 -0
  49. package/payload/mishkan/agents/maaseiah.md +61 -0
  50. package/payload/mishkan/agents/meremoth.md +65 -0
  51. package/payload/mishkan/agents/meshullam.md +67 -0
  52. package/payload/mishkan/agents/nathan.md +70 -0
  53. package/payload/mishkan/agents/nehemiah.md +93 -0
  54. package/payload/mishkan/agents/obed.md +60 -0
  55. package/payload/mishkan/agents/oholiab.md +67 -0
  56. package/payload/mishkan/agents/palal.md +63 -0
  57. package/payload/mishkan/agents/phinehas.md +73 -0
  58. package/payload/mishkan/agents/rehum.md +60 -0
  59. package/payload/mishkan/agents/salma.md +69 -0
  60. package/payload/mishkan/agents/seraiah.md +73 -0
  61. package/payload/mishkan/agents/shallum.md +66 -0
  62. package/payload/mishkan/agents/shaphan.md +64 -0
  63. package/payload/mishkan/agents/shemaiah.md +67 -0
  64. package/payload/mishkan/agents/shevna.md +58 -0
  65. package/payload/mishkan/agents/uriah.md +70 -0
  66. package/payload/mishkan/agents/zaccur.md +58 -0
  67. package/payload/mishkan/agents/zadok.md +67 -0
  68. package/payload/mishkan/agents/zerubbabel.md +69 -0
  69. package/payload/mishkan/cognee/.env.curated.example +61 -0
  70. package/payload/mishkan/cognee/.env.example +165 -0
  71. package/payload/mishkan/cognee/Dockerfile +50 -0
  72. package/payload/mishkan/cognee/README.md +129 -0
  73. package/payload/mishkan/cognee/docker-compose.curated-ui.yml +61 -0
  74. package/payload/mishkan/cognee/docker-compose.curated.yml +85 -0
  75. package/payload/mishkan/cognee/docker-compose.hardening.yml +16 -0
  76. package/payload/mishkan/cognee/docker-compose.selfhosted.yml +114 -0
  77. package/payload/mishkan/cognee/docker-compose.ui.yml +70 -0
  78. package/payload/mishkan/cognee/docker-compose.yml +71 -0
  79. package/payload/mishkan/cognee/ingest-curated.py +92 -0
  80. package/payload/mishkan/commands/dep-audit.md +24 -0
  81. package/payload/mishkan/commands/mishkan-init.md +25 -0
  82. package/payload/mishkan/commands/mishkan-resume.md +21 -0
  83. package/payload/mishkan/commands/promote.md +19 -0
  84. package/payload/mishkan/commands/sefer-pull.md +19 -0
  85. package/payload/mishkan/commands/sprint-close.md +21 -0
  86. package/payload/mishkan/config/curated-library.yaml +113 -0
  87. package/payload/mishkan/config/improvement-queries.md +29 -0
  88. package/payload/mishkan/config/model-routing.yaml +87 -0
  89. package/payload/mishkan/config/projects.yaml +38 -0
  90. package/payload/mishkan/evals/baruch/README.md +93 -0
  91. package/payload/mishkan/evals/baruch/fixtures/invalid/bad-outcome-enum.json +15 -0
  92. package/payload/mishkan/evals/baruch/fixtures/invalid/bad-sprint-pattern.json +15 -0
  93. package/payload/mishkan/evals/baruch/fixtures/invalid/bad-trigger-enum.json +15 -0
  94. package/payload/mishkan/evals/baruch/fixtures/invalid/malformed-json.json +7 -0
  95. package/payload/mishkan/evals/baruch/fixtures/invalid/missing-required-field.json +14 -0
  96. package/payload/mishkan/evals/baruch/fixtures/valid/blocked-vendor.json +15 -0
  97. package/payload/mishkan/evals/baruch/fixtures/valid/curated-shortcircuit.json +15 -0
  98. package/payload/mishkan/evals/baruch/fixtures/valid/partial-no-write.json +14 -0
  99. package/payload/mishkan/evals/baruch/fixtures/valid/resolved-cross-harness.json +15 -0
  100. package/payload/mishkan/evals/baruch/golden_case/expected.yaml +35 -0
  101. package/payload/mishkan/evals/baruch/golden_case/input.yaml +47 -0
  102. package/payload/mishkan/evals/baruch/golden_case/produced.json +15 -0
  103. package/payload/mishkan/evals/baruch/run.sh +129 -0
  104. package/payload/mishkan/hooks/model-route.py +96 -0
  105. package/payload/mishkan/hooks/post-tool-observe.sh +45 -0
  106. package/payload/mishkan/hooks/pre-tool-security.sh +150 -0
  107. package/payload/mishkan/hooks/session-start.sh +20 -0
  108. package/payload/mishkan/hooks/stop-reporter.sh +29 -0
  109. package/payload/mishkan/ontology.md +87 -0
  110. package/payload/mishkan/rules/backend/yasad.md +23 -0
  111. package/payload/mishkan/rules/common/dependencies.md +53 -0
  112. package/payload/mishkan/rules/common/quality.md +16 -0
  113. package/payload/mishkan/rules/common/security.md +20 -0
  114. package/payload/mishkan/rules/documentation/sefer.md +19 -0
  115. package/payload/mishkan/rules/frontend/panim.md +21 -0
  116. package/payload/mishkan/rules/infrastructure/migdal.md +22 -0
  117. package/payload/mishkan/scripts/dependency-audit.sh +171 -0
  118. package/payload/mishkan/scripts/ensure-curated-box.sh +66 -0
  119. package/payload/mishkan/scripts/mishkan-ingest.sh +92 -0
  120. package/payload/mishkan/scripts/observability-aggregate.sh +57 -0
  121. package/payload/mishkan/scripts/seed-curated-library.sh +62 -0
  122. package/payload/mishkan/scripts/sync-profile.sh +65 -0
  123. package/payload/mishkan/scripts/validate-research-log.sh +108 -0
  124. package/payload/mishkan/skills/asaph-a11y-seo-craft/SKILL.md +289 -0
  125. package/payload/mishkan/skills/baruch-research-reporting-craft/SKILL.md +460 -0
  126. package/payload/mishkan/skills/benaiah-devsecops-craft/SKILL.md +329 -0
  127. package/payload/mishkan/skills/bezalel-cto-craft/SKILL.md +391 -0
  128. package/payload/mishkan/skills/caleb-web-research-craft/SKILL.md +306 -0
  129. package/payload/mishkan/skills/cognee-promote/SKILL.md +40 -0
  130. package/payload/mishkan/skills/cognee-quickstart/SKILL.md +66 -0
  131. package/payload/mishkan/skills/context-compress/SKILL.md +36 -0
  132. package/payload/mishkan/skills/deborah-ux-craft/SKILL.md +295 -0
  133. package/payload/mishkan/skills/dependency-audit/SKILL.md +59 -0
  134. package/payload/mishkan/skills/dependency-vetting/SKILL.md +59 -0
  135. package/payload/mishkan/skills/documentation-craft/SKILL.md +468 -0
  136. package/payload/mishkan/skills/ezra-research-formulation-craft/SKILL.md +319 -0
  137. package/payload/mishkan/skills/hanun-observability-craft/SKILL.md +312 -0
  138. package/payload/mishkan/skills/hiram-ui-craft/SKILL.md +334 -0
  139. package/payload/mishkan/skills/hizkiah-implementation-craft/SKILL.md +701 -0
  140. package/payload/mishkan/skills/hushai-security-advisor-craft/SKILL.md +282 -0
  141. package/payload/mishkan/skills/ira-code-security-craft/SKILL.md +553 -0
  142. package/payload/mishkan/skills/jakin-intent-clarification-craft/SKILL.md +299 -0
  143. package/payload/mishkan/skills/jehonathan-publication-craft/SKILL.md +262 -0
  144. package/payload/mishkan/skills/joab-app-security-craft/SKILL.md +266 -0
  145. package/payload/mishkan/skills/meremoth-devops-craft/SKILL.md +298 -0
  146. package/payload/mishkan/skills/meshullam-infra-design-craft/SKILL.md +302 -0
  147. package/payload/mishkan/skills/mishkan-ingest/SKILL.md +65 -0
  148. package/payload/mishkan/skills/mishkan-init/SKILL.md +65 -0
  149. package/payload/mishkan/skills/nathan-architecture-craft/SKILL.md +547 -0
  150. package/payload/mishkan/skills/nehemiah-pm-craft/SKILL.md +484 -0
  151. package/payload/mishkan/skills/obed-asset-pipeline-craft/SKILL.md +286 -0
  152. package/payload/mishkan/skills/oholiab-design-system-craft/SKILL.md +334 -0
  153. package/payload/mishkan/skills/palal-systems-craft/SKILL.md +281 -0
  154. package/payload/mishkan/skills/qa-evaluation-craft/SKILL.md +406 -0
  155. package/payload/mishkan/skills/rehum-sre-advisor-craft/SKILL.md +228 -0
  156. package/payload/mishkan/skills/reporter-discipline-craft/SKILL.md +351 -0
  157. package/payload/mishkan/skills/research-pipeline/SKILL.md +55 -0
  158. package/payload/mishkan/skills/salma-frontend-implementation-craft/SKILL.md +369 -0
  159. package/payload/mishkan/skills/sefer-pull/SKILL.md +37 -0
  160. package/payload/mishkan/skills/shallum-database-craft/SKILL.md +347 -0
  161. package/payload/mishkan/skills/shaphan-summarisation-craft/SKILL.md +271 -0
  162. package/payload/mishkan/skills/shemaiah-evaluation-craft/SKILL.md +342 -0
  163. package/payload/mishkan/skills/sprint-report/SKILL.md +28 -0
  164. package/payload/mishkan/skills/team-lead-craft/SKILL.md +457 -0
  165. package/payload/mishkan/skills/zadok-contract-craft/SKILL.md +520 -0
  166. package/payload/mishkan/templates/case-node.schema.json +22 -0
  167. package/payload/mishkan/templates/mcp.json +22 -0
  168. package/payload/mishkan/templates/observability-log.schema.json +24 -0
  169. package/payload/mishkan/templates/project-CLAUDE.md +47 -0
  170. package/payload/mishkan/templates/research-log.schema.json +40 -0
  171. package/payload/mishkan/templates/settings.json +12 -0
  172. package/payload/mishkan/templates/settings.local.json +6 -0
  173. package/payload/mishkan/templates/sprint-state.schema.json +47 -0
  174. package/payload/mishkan/templates/team-report.schema.json +50 -0
  175. package/payload/mishkan/templates/user-CLAUDE.md +62 -0
  176. package/payload/mishkan/workflows/README.md +88 -0
  177. package/payload/mishkan/workflows/mishkan-architecture-panel.js +156 -0
  178. package/payload/mishkan/workflows/mishkan-codebase-audit.js +188 -0
  179. package/payload/mishkan/workflows/mishkan-deep-research.js +251 -0
  180. package/payload/mishkan/workflows/mishkan-init.js +156 -0
  181. package/payload/mishkan/workflows/mishkan-migration-wave.js +180 -0
  182. package/payload/mishkan/workflows/mishkan-release-readiness.js +163 -0
  183. package/payload/mishkan/workflows/mishkan-sprint-close.js +112 -0
  184. package/payload/user/CLAUDE.md +62 -0
  185. package/payload/user/rules/engineer-standards.md +66 -0
  186. 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).*