fix(a11y): surface the WCAG 2.2.2 warnings the validator already computes - #18
Merged
Merged
Conversation
…utes motion_validate and motion_compile dropped validateSpec().warnings, so the only publicly reachable checker answered ok:true for a spec with reduced-motion off, pause off, a 120s marquee and a 60s spin. - register-tools.js/compile.js: pass warnings[] through - catalog.js: expose a11y.persistent as `persistent` (18 of 40 primitives) - validate.js: type-check globals.respectReducedMotion (MS-GLOBALS-RRM-TYPE) - validate.js: gate `ease` against the GSAP vocabulary (MS-PARAM-EASE); kept out of the catalog pattern so the 100-char ReDoS screen and the catalogVersion both stay untouched - lockfile: hono 4.12.32 -> 4.13.0 (GHSA-8j4g-w8fx-2239, prod tree) catalogVersion unchanged (8a9813a9b3c6c626). 302/302 tests, coverage 99.06%. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0149NhkePB1zzszxUyG1L5vW
✅ Deploy Preview for strong-fudge-f04a16 ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
MasterPlayspots
added a commit
that referenced
this pull request
Aug 17, 2026
…caught it (#24) * docs(changelog): 1.2.5 through 1.2.7, plus the gate that should have caught it THE MEASURED GAPS 1. Five tags exist (v1.2.3 ... v1.2.7). One GitHub release does (v1.2.5). 2. CHANGELOG ended at 1.2.4 while npm served 1.2.7 — three releases with no entry. 3. Unreleased commits sit on main after v1.2.7. WHAT CHANGED CHANGELOG: 1.2.5, 1.2.6 and 1.2.7 written from the commit log, not from memory. Tone follows 1.2.7's own name — "honest short descriptions". bin/changelog-gate.js: the previous prepublishOnly check only asked whether CHANGELOG.md EXISTED. It did, continuously, while three versions shipped without an entry. A file-exists check cannot catch that; it was green the whole time. The new gate requires a NON-EMPTY "## [<version>]" section. .github/workflows/release.yml: a tag now creates its GitHub release, with the changelog section as the release notes. Writing release notes twice means writing them differently, and then neither is authoritative. PROVEN, not asserted: version present + section filled -> exit 0 version absent from CHANGELOG -> exit 1 section present but empty -> exit 1 npm test green, npm audit: 0 vulnerabilities CORRECTIONS to the task description: · It claims TWO unreleased commits after v1.2.7. There are THREE — the extra one is 4d6fb59 "fix: resolve high severity npm vulnerability". A security fix is sitting on main, unpublished; npm still serves 1.2.7 without it. Recorded under [Unreleased]. · plugin.json does not exist on main, so it cannot be at 1.2.7 as claimed. package.json and server.json are both 1.2.7 — no drift between those two. · The six "orphan" branches are all genuinely merged (PRs #4, #15, #17, #18, #19, #20); only the refs remain. Deleting them is K4 — listed, not done. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix(deps): regenerate package-lock.json — it pinned nothing CI was red on this PR. It is red on `main` too, for the same reason and independently of anything in this branch: a clean `main` worktree fails `npm ci` identically. npm error `npm ci` can only install packages when your package.json and npm error package-lock.json are in sync. npm error Missing: @commitlint/cli@21.2.2 from lock file npm error Missing: @modelcontextprotocol/sdk@1.30.0 from lock file npm error Missing: zod@4.4.3 from lock file ... 20 more The lock file was not merely stale. It carried NO ENTRY for either runtime dependency — @modelcontextprotocol/sdk and zod — and none for the devDependency tree at all. It pinned nothing. Every CI job died at `npm ci` before running a single test, which is why coverage, e2e, lint, security and all three test matrix legs failed within 17 seconds. Regenerated with `npm install --package-lock-only`. The resulting versions match exactly what package.json already specifies (sdk 1.30.0, zod 4.4.3), so this changes no dependency — it records the ones that were already chosen. npm ci --dry-run passes npm test green npm audit 0 vulnerabilities Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PR: die WCAG-2.2.2-Signale erreichen den Aufrufer
Branch-Vorschlag:
fix/surface-a11y-warningsBasis:
e20d31a(main, 03.08.2026 21:59)Patch:
PR_weg-0.patch— 7 Dateien, +209 / −19Warum
motion_validateist das einzige öffentlich erreichbare Prüfwerkzeug. Es hat bis heuteok:truezurückgegeben für ein Spec mit abgeschaltetem Reduced-Motion-Schutz, abgeschaltetem Pause-Pfad,
einem 120-Sekunden-Marquee und einem 60-Sekunden-Spin — ohne ein einziges Signal.
Die Warnungen wurden dabei die ganze Zeit berechnet.
validate.jserzeugt sie in Zeile 213(
MS-GLOBALS-RRM-OFF) und Zeile 324 (MS-GLOBALS-PAUSE-OFF);register-tools.jsZeile 99 bautedie Antwort ohne das Feld
warnings.compile.jsverwarf sie ebenso, weshalb auch der CLI-Pfadblind war.
Am 04.08. dreimal unabhängig reproduziert, zuletzt gegen den Live-Endpunkt.
Was drin ist
1 ·
warnings[]wird durchgereicht —register-tools.js,compile.jsmotion_validateundmotion_compilegebenwarningsmit aus.okbleibt unverändert (sieheoffene Frage unten). Die Werkzeugbeschreibung sagt jetzt ausdrücklich, dass
ok:truebeinicht-leerem
warnings[]möglich ist.2 ·
persistentsteht im Katalog —catalog.jsmotion_catalogliefert je Primitivpersistent: true|false. 18 der 40 Primitive sindpersistent. Vorher konnte ein Agent aus dem Katalog nicht ableiten, welche Primitive 2.2.2
auslösen. Dazu zwei neue Authoring-Regeln (7 und 8), die
pauseControlsüberhaupt erst erwähnen —der Schlüssel war bisher nur über die Fehlermeldung
MS-GLOBALS-KEYauffindbar.3 ·
respectReducedMotionwird typgeprüft —validate.js"nein danke"ergabok:trueund umging sogar die interne Warnung, weil die auf=== falseprüft. Jetzt harter Fehler
MS-GLOBALS-RRM-TYPE, wie beipauseControls.4 ·
easebekommt ein Vokabular —validate.jsDas Muster im Katalog war ein Zeichensatzfilter und damit invertiert: es nahm
banana.outundquantumBounce9000an. Ein erfundener Wert lief wörtlich in die ausgelieferte Datei und GSAP fielstill auf den Default zurück.
Die Vokabularprüfung sitzt jetzt im Validator, nicht im Katalogmuster. Das ist keine Stilfrage:
catalog.jsdeckelt jedes Muster bei 100 Zeichen (MAX_PATTERN_CHARS, ein ReDoS-Schutz, der intest/forge-promote-gate.test.js:262eigens festgeschrieben ist), und ein GSAP-Ease-Vokabularbraucht 166. Ein Vokabular im Muster hätte also entweder die Sicherheitsinvariante gebrochen oder
alle fünf Primitive auf MAJOR gehoben und die
catalogVersionfür jeden Konsumenten geändert.⇒ Die Primitiv-Dateien bleiben unberührt.
catalogVersionbleibt8a9813a9b3c6c626.npm run catalog-lock:checkmeldet „Catalog SemVer OK".5 ·
hono4.12.32 → 4.13.0 — nurpackage-lock.json, 6 ZeilenNeues Prod-Advisory GHSA-8j4g-w8fx-2239 (ReDoS in der CORS-Middleware), Pfad
motionspec → @modelcontextprotocol/sdk@1.30.0 → hono. Das CI-Gate ist--audit-level=lowundfällt sonst durch. Die beiden Advisories von gestern (
brace-expansion,fast-uri) sind mitPR #17 erledigt.
Gates — alle lokal gefahren auf
e20d31anpm testnpm run lintnpm run catalog-lock:checknpm run coveragenpm audit --audit-level=lownpm run sbom+sbom:check+license-checkblocked-demomuss scheitern)npm run e2eCI / e2ewar am 03.08. 13:57 UTC aufmainrot; ob das noch gilt, muss GitHub zeigenDer Beweis
BEWEIS_vorher-nachher.txtenthält die Antwort, die der Endpunkt nach dem Patch auf genau dasSpec gibt, das vorher
ok:trueohne alles bekam — mit beiden Warnungen,persistent-Zählung,Typprüfung und der ease-Tabelle.
Eine offene Frage, die ich nicht selbst entscheide
Soll
okbei einem 2.2.2-Verstoß weiterhintruesein?Ich habe es so gelassen. Begründung:
pauseControls: "off"ist ein dokumentierter Enum-Wert, undokbeantwortet „kompiliert das Spec", nicht „ist es barrierefrei". Ein Umschalten aufok:falsewäre ein Breaking Change für jeden, der
offbewusst setzt.Folge für die Außendarstellung: Auf den Flächen muss dann „meldet" stehen, nicht „verhindert".
Wenn dort „verhindert" oder „garantiert" stehen soll, ist
ok:falseder ehrliche Weg — dann aberals eigener, angekündigter Major. Angesichts der FTC-Anordnung gegen accessiBe (1 Mio. USD,
03.01.2025, falsch dargestellte Konformitätsfähigkeit) ist das die teuerste Zeile im ganzen Haus.
Eine dritte Möglichkeit: ein eigenes Feld
conformance: { "2.2.2": "violation" }nebenok.Sag Bescheid, dann baue ich es nach.
Was NICHT drin ist
elastic.out(1,0.3)bleibt abgelehnt. Das Zeichensatzmuster in den Primitiv-Dateien verbietetdas Komma; es zu weiten heißt MAJOR-Bump und neue
catalogVersion. Der Fehler nennt jetztwenigstens den wahren Grund (
MS-PARAM-EASE-UNSUPPORTED) statt zu behaupten, der Wert seiunbekannt. Einargumentige Formen wie
elastic.out(1)undback.out(1.7)laufen.globals.defaultEaseist weiterhin ungeprüft (allowlisted, vom Compiler nicht ausgewertet).Gleiche Klasse, kleineres Risiko — bewusst außen vor gelassen, um den PR eng zu halten.
ausgerollt werden, sonst antwortet der Live-Endpunkt weiter wie bisher.
Commit-Vorschlag
\U0001F916 Generated with Claude Code
https://claude.ai/code/session_0149NhkePB1zzszxUyG1L5vW