@bendyline/gilde 0.1.55 → 0.1.56
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/authoring/chat-models/glm-5.3-flash-320b-q2.json +129 -0
- package/authoring/gstack/wave.json +2 -2
- package/data/chat-models/gl/glm-5.3-flash-320b-q2/manifest.json +137 -0
- package/data/chat-models/gl/glm-5.3-flash-320b-q2/versions/1.0.0/manifest.json +23 -0
- package/data/chat-models/index.json +1 -1
- package/data/craftbook-templates/a1/a11y-audit/versions/1.1.3/test.json +16 -8
- package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.2/craftbook.json +618 -0
- package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.2/test.json +228 -0
- package/data/craftbook-templates/al/album-curate/versions/1.0.3/test.json +6 -3
- package/data/craftbook-templates/al/alert-rules/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/an/anniversary-cut/versions/1.0.5/test.json +10 -5
- package/data/craftbook-templates/an/annual-document-review/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/an/anomaly-scan/versions/1.0.3/test.json +12 -6
- package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.2/craftbook.json +602 -0
- package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.2/test.json +290 -0
- package/data/craftbook-templates/ar/artifact-integrity-review/versions/1.0.3/test.json +18 -9
- package/data/craftbook-templates/au/audiobook-master-pack/versions/1.0.5/test.json +10 -5
- package/data/craftbook-templates/au/auth-flow/versions/1.0.3/test.json +12 -6
- package/data/craftbook-templates/au/auth-flow/versions/1.0.4/craftbook.json +282 -0
- package/data/craftbook-templates/au/auth-flow/versions/1.0.4/test.json +143 -0
- package/data/craftbook-templates/au/automation-recipe/versions/1.0.3/test.json +12 -6
- package/data/craftbook-templates/ba/backup-routine/versions/1.0.4/craftbook.json +282 -0
- package/data/craftbook-templates/ba/backup-routine/versions/1.0.4/test.json +108 -0
- package/data/craftbook-templates/bl/blog-post/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/br/branding-website/versions/1.1.3/craftbook.json +335 -0
- package/data/craftbook-templates/br/branding-website/versions/1.1.3/test.json +164 -0
- package/data/craftbook-templates/br/broadcast-announcement/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.8/craftbook.json +621 -0
- package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.8/test.json +376 -0
- package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.2/craftbook.json +730 -0
- package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.2/test.json +221 -0
- package/data/craftbook-templates/bu/build-loop/versions/1.1.1/test.json +8 -8
- package/data/craftbook-templates/ca/case-study/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/ch/chapter-narration-run/versions/1.0.4/test.json +10 -5
- package/data/craftbook-templates/ch/character-turnaround/versions/1.0.3/test.json +25 -11
- package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.2/craftbook.json +587 -0
- package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.2/test.json +225 -0
- package/data/craftbook-templates/ci/citation-audit/versions/1.0.3/test.json +28 -14
- package/data/craftbook-templates/cl/cli-tool/versions/1.1.3/test.json +8 -8
- package/data/craftbook-templates/co/codebase-refactoring-review/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/co/codebase-ux-review/versions/1.0.3/test.json +18 -9
- package/data/craftbook-templates/co/codemod-sweep/versions/1.0.2/craftbook.json +605 -0
- package/data/craftbook-templates/co/codemod-sweep/versions/1.0.2/test.json +252 -0
- package/data/craftbook-templates/co/cohort-analysis/versions/1.0.3/test.json +18 -9
- package/data/craftbook-templates/co/competitive-analysis/versions/1.0.3/test.json +23 -15
- package/data/craftbook-templates/co/content-accuracy-review/versions/1.0.3/test.json +28 -14
- package/data/craftbook-templates/co/content-deck/versions/1.2.3/craftbook.json +4 -4
- package/data/craftbook-templates/co/content-deck/versions/1.2.3/test.json +3 -0
- package/data/craftbook-templates/co/content-deck/versions/1.2.4/craftbook.json +341 -0
- package/data/craftbook-templates/co/content-deck/versions/1.2.4/test.json +169 -0
- package/data/craftbook-templates/co/copy-review/versions/1.0.3/test.json +14 -7
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.3/craftbook.json +4 -4
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.3/test.json +3 -0
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.4/craftbook.json +345 -0
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.4/test.json +187 -0
- package/data/craftbook-templates/co/corpus-synthesis/versions/1.0.3/test.json +26 -13
- package/data/craftbook-templates/co/cover-letter/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/cs/csv-transformer/versions/1.2.4/test.json +7 -7
- package/data/craftbook-templates/da/dashboard-spec/versions/1.0.3/test.json +7 -7
- package/data/craftbook-templates/da/data-export-migrate/versions/1.0.4/craftbook.json +285 -0
- package/data/craftbook-templates/da/data-export-migrate/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/da/data-pipeline-etl/versions/1.0.5/craftbook.json +284 -0
- package/data/craftbook-templates/da/data-pipeline-etl/versions/1.0.5/test.json +162 -0
- package/data/craftbook-templates/da/data-quality-audit/versions/1.0.3/test.json +38 -19
- package/data/craftbook-templates/da/data-to-report/versions/1.0.3/test.json +12 -6
- package/data/craftbook-templates/db/db-index-tuning/versions/1.0.4/craftbook.json +286 -0
- package/data/craftbook-templates/db/db-index-tuning/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/de/dependency-audit/versions/1.1.3/test.json +14 -7
- package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.2/craftbook.json +621 -0
- package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.2/test.json +235 -0
- package/data/craftbook-templates/de/design-review/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/de/design-system-consultation/versions/2.0.8/craftbook.json +616 -0
- package/data/craftbook-templates/de/design-system-consultation/versions/2.0.8/test.json +201 -0
- package/data/craftbook-templates/do/doc-intake-pipeline/versions/1.0.4/craftbook.json +285 -0
- package/data/craftbook-templates/do/doc-intake-pipeline/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/do/doc-rewrite/versions/1.0.3/test.json +119 -55
- package/data/craftbook-templates/do/dockerize-app/versions/1.0.4/craftbook.json +285 -0
- package/data/craftbook-templates/do/dockerize-app/versions/1.0.4/test.json +92 -0
- package/data/craftbook-templates/do/documentation-drift-review/versions/1.0.3/test.json +18 -9
- package/data/craftbook-templates/dr/draft-social-post/versions/1.0.2/craftbook.json +324 -0
- package/data/craftbook-templates/dr/draft-social-post/versions/1.0.2/test.json +161 -0
- package/data/craftbook-templates/ed/edit-notes/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.8/craftbook.json +566 -0
- package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.8/test.json +191 -0
- package/data/craftbook-templates/ep/episode-plan/versions/1.0.3/test.json +10 -5
- package/data/craftbook-templates/ex/executive-level-review/versions/2.0.7/test.json +7 -10
- package/data/craftbook-templates/ex/executive-level-review/versions/2.0.8/craftbook.json +595 -0
- package/data/craftbook-templates/ex/executive-level-review/versions/2.0.8/test.json +139 -0
- package/data/craftbook-templates/ex/expense-categorize/versions/1.0.4/craftbook.json +277 -0
- package/data/craftbook-templates/ex/expense-categorize/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.2/craftbook.json +327 -0
- package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.2/test.json +162 -0
- package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.2/craftbook.json +718 -0
- package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.2/test.json +239 -0
- package/data/craftbook-templates/fo/form-fill-batch/versions/1.0.4/craftbook.json +285 -0
- package/data/craftbook-templates/fo/form-fill-batch/versions/1.0.4/test.json +162 -0
- package/data/craftbook-templates/fo/form-wizard/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/ho/holiday-card-run/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.2/craftbook.json +610 -0
- package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.2/test.json +220 -0
- package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.3/craftbook.json +343 -0
- package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.3/test.json +176 -0
- package/data/craftbook-templates/id/idea-office-hours/versions/2.0.8/craftbook.json +566 -0
- package/data/craftbook-templates/id/idea-office-hours/versions/2.0.8/test.json +141 -0
- package/data/craftbook-templates/im/image-set-index/versions/1.2.3/craftbook.json +298 -0
- package/data/craftbook-templates/im/image-set-index/versions/1.2.3/test.json +180 -0
- package/data/craftbook-templates/in/insurance-inventory/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/in/interactive-quiz/versions/1.0.3/test.json +48 -23
- package/data/craftbook-templates/in/invitation-design/versions/1.0.3/test.json +1 -1
- package/data/craftbook-templates/index.json +1 -1
- package/data/craftbook-templates/it/item-intake/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/le/lead-enrichment/versions/1.0.4/craftbook.json +277 -0
- package/data/craftbook-templates/le/lead-enrichment/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/me/meeting-prep-brief/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/me/memory-prompt-session/versions/1.0.3/test.json +3 -0
- package/data/craftbook-templates/mo/morning-report/versions/1.0.3/test.json +21 -9
- package/data/craftbook-templates/of/office-hours/versions/1.1.1/test.json +8 -8
- package/data/craftbook-templates/pe/perf-optimization/versions/2.0.2/craftbook.json +697 -0
- package/data/craftbook-templates/pe/perf-optimization/versions/2.0.2/test.json +235 -0
- package/data/craftbook-templates/pe/pest-diagnosis/versions/1.0.3/test.json +19 -8
- package/data/craftbook-templates/pl/plan/versions/1.0.2/test.json +8 -8
- package/data/craftbook-templates/pl/playtest-report/versions/1.0.3/test.json +17 -7
- package/data/craftbook-templates/pr/practice-exam/versions/1.0.3/test.json +7 -2
- package/data/craftbook-templates/pr/practice-session/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/pu/pull-request-review/versions/1.9.2/craftbook.json +435 -0
- package/data/craftbook-templates/pu/pull-request-review/versions/1.9.2/test.json +141 -0
- package/data/craftbook-templates/qu/quarterly-summary/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/re/receipt-intake/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/re/receipt-ocr-ledger/versions/1.0.4/craftbook.json +277 -0
- package/data/craftbook-templates/re/receipt-ocr-ledger/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/re/recipe-capture/versions/1.0.3/test.json +13 -5
- package/data/craftbook-templates/re/record-a-relative/versions/1.0.3/test.json +3 -0
- package/data/craftbook-templates/re/recurring-invoice-run/versions/1.0.4/craftbook.json +285 -0
- package/data/craftbook-templates/re/recurring-invoice-run/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/re/refactor-module/versions/2.0.2/craftbook.json +695 -0
- package/data/craftbook-templates/re/refactor-module/versions/2.0.2/test.json +241 -0
- package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.4/craftbook.json +361 -0
- package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.4/test.json +138 -0
- package/data/craftbook-templates/re/release-notes/versions/1.0.4/test.json +8 -8
- package/data/craftbook-templates/re/release-notes/versions/1.0.5/craftbook.json +339 -0
- package/data/craftbook-templates/re/release-notes/versions/1.0.5/test.json +111 -0
- package/data/craftbook-templates/re/reliability-review/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/re/research-report/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.8/craftbook.json +596 -0
- package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.8/test.json +157 -0
- package/data/craftbook-templates/ro/rough-cut-assembly/versions/1.0.4/test.json +13 -5
- package/data/craftbook-templates/sc/schema-migration/versions/2.0.2/craftbook.json +624 -0
- package/data/craftbook-templates/sc/schema-migration/versions/2.0.2/test.json +225 -0
- package/data/craftbook-templates/sc/script-automation/versions/1.0.4/craftbook.json +284 -0
- package/data/craftbook-templates/sc/script-automation/versions/1.0.4/test.json +162 -0
- package/data/craftbook-templates/se/security-architecture-review/versions/2.0.7/test.json +10 -13
- package/data/craftbook-templates/se/security-architecture-review/versions/2.0.8/craftbook.json +597 -0
- package/data/craftbook-templates/se/security-architecture-review/versions/2.0.8/test.json +157 -0
- package/data/craftbook-templates/so/social-digest/versions/1.0.3/craftbook.json +239 -0
- package/data/craftbook-templates/so/social-digest/versions/1.0.3/test.json +168 -0
- package/data/craftbook-templates/so/source-quality-audit/versions/1.0.3/test.json +25 -11
- package/data/craftbook-templates/sp/spec-authoring/versions/2.0.8/craftbook.json +599 -0
- package/data/craftbook-templates/sp/spec-authoring/versions/2.0.8/test.json +162 -0
- package/data/craftbook-templates/te/technical-documentation/versions/2.0.8/craftbook.json +577 -0
- package/data/craftbook-templates/te/technical-documentation/versions/2.0.8/test.json +174 -0
- package/data/craftbook-templates/te/test-coverage-review/versions/1.2.1/test.json +16 -8
- package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.2/craftbook.json +592 -0
- package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.2/test.json +195 -0
- package/data/craftbook-templates/th/thank-you-batch/versions/1.0.3/test.json +6 -3
- package/data/craftbook-templates/th/thank-you-sweep/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/ti/tileset-batch/versions/1.0.3/test.json +9 -3
- package/data/craftbook-templates/tr/transcribe-and-shownotes/versions/1.0.3/test.json +10 -5
- package/data/craftbook-templates/tr/transcribe-index/versions/1.0.3/test.json +6 -3
- package/data/craftbook-templates/tr/translate-content/versions/1.1.3/craftbook.json +140 -0
- package/data/craftbook-templates/tr/translate-content/versions/1.1.3/test.json +141 -0
- package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.2/craftbook.json +594 -0
- package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.2/test.json +221 -0
- package/data/craftbook-templates/ux/ux-update/versions/1.0.2/craftbook.json +606 -0
- package/data/craftbook-templates/ux/ux-update/versions/1.0.2/test.json +206 -0
- package/data/craftbook-templates/we/weak-spot-drill/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/we/weekly-walkthrough/versions/1.0.3/test.json +21 -9
- package/data/craftbook-templates/wh/whitepaper/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/ye/year-in-review/versions/1.0.3/test.json +8 -4
- package/data/project-types/index.json +1 -1
- package/data/project-types/ju/just-chat/manifest.json +1 -1
- package/data/project-types/ju/just-chat/versions/1.0.1/about.md +5 -0
- package/data/project-types/ju/just-chat/versions/1.0.1/manifest.json +19 -0
- package/package.json +1 -1
- package/schemas/chat-model-identity.schema.json +27 -0
- package/schemas/chat-model-version.schema.json +22 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"title": "Accessibility retrofit on a seeded page",
|
|
4
|
+
"objective": "The craftbook drives a real accessibility retrofit of a page seeded with five concrete violations: missing alt text on two meaningful images, a placeholder-as-label email input, a div-as-button control with no keyboard path, a heading jump from h1 to h4, and a decorative divider whose empty alt must survive untouched. Every repair is verified mechanically by string-parsing the fixed markup.",
|
|
5
|
+
"tags": [
|
|
6
|
+
"code",
|
|
7
|
+
"accessibility",
|
|
8
|
+
"a11y",
|
|
9
|
+
"tactical-fleet"
|
|
10
|
+
],
|
|
11
|
+
"prompt": "Use the Accessibility Retrofit craftbook on this site: readers using screen readers and keyboards report the Field Notes page is unusable — images carry no descriptions, the signup field has no label, and the Join the list control cannot be reached or activated with the keyboard. Audit index.html, fix every violation at its real site in the markup, and verify the result.",
|
|
12
|
+
"setup": {
|
|
13
|
+
"projectName": "Acme Field Notes",
|
|
14
|
+
"about": "A small static newsletter site: index.html plus styles.css and a few inline SVG images. No build step and no test suite.",
|
|
15
|
+
"files": [
|
|
16
|
+
{
|
|
17
|
+
"path": "package.json",
|
|
18
|
+
"content": "{\n \"name\": \"field-notes\",\n \"private\": true,\n \"version\": \"1.0.0\",\n \"type\": \"module\"\n}\n"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"path": "index.html",
|
|
22
|
+
"content": "<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Acme Field Notes</title>\n<link rel=\"stylesheet\" href=\"styles.css\">\n</head>\n<body>\n<div class=\"masthead\">\n <h1>Acme Field Notes</h1>\n <img src=\"images/divider.svg\" class=\"divider\" alt=\"\">\n</div>\n<div class=\"content\">\n <h4>Latest dispatch</h4>\n <img src=\"images/harvest-crew.svg\" class=\"feature\">\n <p>The harvest crew finished the north field on Tuesday, two days ahead of schedule, and moved on to the orchard rows.</p>\n <h4>Sign up for dispatches</h4>\n <p>Get the weekly note by email.</p>\n <input type=\"email\" placeholder=\"Your email address\">\n <div class=\"button\" onclick=\"joinList()\">Join the list</div>\n <p id=\"joined-note\" hidden>You are on the list.</p>\n <h4>From the archive</h4>\n <img src=\"images/seed-chart.svg\" class=\"feature\">\n <p>Germination rates for the last five seasons, charted by seed lot and sowing week.</p>\n</div>\n<script>\nfunction joinList() {\n document.getElementById('joined-note').hidden = false;\n}\n</script>\n</body>\n</html>\n"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"path": "styles.css",
|
|
26
|
+
"content": "body { margin: 0; font-family: Georgia, serif; color: #222; background: #faf8f4; }\n.masthead { padding: 2rem 1.5rem 0; }\n.divider { width: 100%; height: 12px; }\n.content { max-width: 40rem; padding: 1rem 1.5rem 3rem; }\n.feature { max-width: 100%; }\n.button { display: inline-block; padding: 0.5rem 1rem; background: #2e5d3b; color: #fff; cursor: pointer; }\n.button:hover { background: #234a2e; }\ninput[type=\"email\"] { padding: 0.5rem; width: 16rem; }\n"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"path": "images/harvest-crew.svg",
|
|
30
|
+
"content": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 180\"><rect width=\"320\" height=\"180\" fill=\"#dce8d8\"/><text x=\"16\" y=\"95\" font-size=\"16\">Harvest crew walking the north field at dawn</text></svg>\n"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"path": "images/seed-chart.svg",
|
|
34
|
+
"content": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 180\"><rect width=\"320\" height=\"180\" fill=\"#e8e2d4\"/><text x=\"16\" y=\"95\" font-size=\"16\">Germination rate by season, 2021 to 2025</text></svg>\n"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"path": "images/divider.svg",
|
|
38
|
+
"content": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 12\"><line x1=\"0\" y1=\"6\" x2=\"320\" y2=\"6\" stroke=\"#b8b0a0\" stroke-width=\"2\"/></svg>\n"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"path": "tests/verify-retrofit.mjs",
|
|
42
|
+
"content": "import assert from 'node:assert/strict';\nimport { readFileSync } from 'node:fs';\n\nconst html = readFileSync('index.html', 'utf8');\n\nfunction imgTag(src) {\n const tags = [...html.matchAll(/<img\\b[^>]*>/gi)].map((m) => m[0]);\n const tag = tags.find((t) => t.includes(src));\n assert.ok(tag, `an img referencing ${src} still exists`);\n return tag;\n}\nfunction altOf(tag, src) {\n const alt = tag.match(/\\balt\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/i);\n assert.ok(alt, `image ${src} carries an alt attribute`);\n return alt[2] ?? alt[3] ?? '';\n}\n\n// 1) Meaningful images: specific, non-empty alt text.\nfor (const src of ['harvest-crew', 'seed-chart']) {\n const alt = altOf(imgTag(src), src).trim();\n assert.ok(alt.length >= 10, `alt for ${src} must be specific, got \"${alt}\"`);\n assert.ok(!/^(image|photo|picture|graphic|img)$/i.test(alt), `alt for ${src} must not be filler`);\n assert.ok(!/^(an? )?(image|photo|picture) of/i.test(alt), `alt for ${src} must not open with \"image of\"`);\n}\nconsole.log('A11YRETRO_ORACLE alts ok');\n\n// 2) The decorative divider keeps an EMPTY alt - no sprayed description.\nassert.equal(altOf(imgTag('divider'), 'divider').trim(), '', 'decorative divider keeps alt=\"\"');\nconsole.log('A11YRETRO_ORACLE decorative ok');\n\n// 3) The email input is labeled by a real label whose for resolves to its id.\nconst labels = [...html.matchAll(/<label\\b[^>]*\\bfor\\s*=\\s*[\"']([^\"']+)[\"'][^>]*>/gi)];\nassert.ok(labels.length >= 1, 'a label element with a for attribute exists');\nconst paired = labels.filter((m) => new RegExp(`<input\\\\b[^>]*\\\\bid\\\\s*=\\\\s*[\"']${m[1]}[\"']`, 'i').test(html));\nassert.ok(paired.length >= 1, \"a label's for attribute resolves to a real input id\");\nconsole.log('A11YRETRO_ORACLE label ok');\n\n// 4) The join control is a real button, or carries complete ARIA button semantics.\nconst join = html.match(/<([a-z0-9]+)\\b([^>]*)>\\s*Join the list/i);\nassert.ok(join, 'the \"Join the list\" control still exists');\nconst [, joinTag, joinAttrs] = join;\nif (joinTag.toLowerCase() !== 'button') {\n assert.ok(/\\brole\\s*=\\s*[\"']button[\"']/i.test(joinAttrs), 'non-button control carries role=\"button\"');\n assert.ok(/\\btabindex\\s*=\\s*[\"']0[\"']/i.test(joinAttrs), 'non-button control is focusable via tabindex=\"0\"');\n const keyWired = /\\bonkey(?:down|up|press)\\s*=/i.test(joinAttrs) || /addEventListener\\s*\\(\\s*[\"']key(?:down|up|press)[\"']/i.test(html);\n assert.ok(keyWired, 'non-button control has keyboard activation wired');\n}\nconsole.log('A11YRETRO_ORACLE control ok');\n\n// 5) Heading order is monotonic from a single h1.\nconst levels = [...html.matchAll(/<h([1-6])\\b[^>]*>/gi)].map((m) => Number(m[1]));\nassert.ok(levels.length >= 3, 'the page keeps its headings');\nassert.equal(levels[0], 1, 'the page starts at h1');\nfor (let i = 1; i < levels.length; i++) {\n assert.ok(levels[i] <= levels[i - 1] + 1, `heading level jumps from h${levels[i - 1]} to h${levels[i]}`);\n}\nconsole.log('A11YRETRO_ORACLE headings ok');\n\n// 6) The join behavior target survives the retrofit.\nassert.ok(/joined-note/.test(html), 'the joined-note behavior target survives');\nconsole.log('A11YRETRO_ORACLE done');\n",
|
|
43
|
+
"surface": "harness"
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
"mocks": [],
|
|
48
|
+
"success": {
|
|
49
|
+
"summary": "All five seeded violations are repaired at their real sites in index.html — specific alts on the meaningful images, an empty alt preserved on the decorative divider, a paired label, a keyboard-operable join control, monotonic headings — and every fleet artifact exists with honest citations.",
|
|
50
|
+
"deliverables": [
|
|
51
|
+
{
|
|
52
|
+
"path": "{{task.dir}}/audit.md",
|
|
53
|
+
"kind": "markdown-notes",
|
|
54
|
+
"artifact": true,
|
|
55
|
+
"minBytes": 600,
|
|
56
|
+
"checks": [
|
|
57
|
+
{
|
|
58
|
+
"kind": "contains",
|
|
59
|
+
"file": "{{task.dir}}/audit.md",
|
|
60
|
+
"pattern": "^##\\s+Scope[\\s\\S]*^##\\s+Violations[\\s\\S]*^##\\s+Priorities",
|
|
61
|
+
"flags": "im",
|
|
62
|
+
"label": "audit sections in order"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"kind": "tableShape",
|
|
66
|
+
"file": "{{task.dir}}/audit.md",
|
|
67
|
+
"requiredColumns": [
|
|
68
|
+
"File",
|
|
69
|
+
"Issue",
|
|
70
|
+
"Priority"
|
|
71
|
+
],
|
|
72
|
+
"minRows": 3,
|
|
73
|
+
"artifact": true
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"kind": "citationsResolve",
|
|
77
|
+
"file": "{{task.dir}}/audit.md",
|
|
78
|
+
"minCitations": 2,
|
|
79
|
+
"artifact": true
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"kind": "contains",
|
|
83
|
+
"file": "{{task.dir}}/audit.md",
|
|
84
|
+
"pattern": "index\\.html",
|
|
85
|
+
"label": "the audit names the real page"
|
|
86
|
+
}
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"path": "{{task.dir}}/fix-notes.md",
|
|
91
|
+
"kind": "markdown-notes",
|
|
92
|
+
"artifact": true,
|
|
93
|
+
"minBytes": 700,
|
|
94
|
+
"checks": [
|
|
95
|
+
{
|
|
96
|
+
"kind": "contains",
|
|
97
|
+
"file": "{{task.dir}}/fix-notes.md",
|
|
98
|
+
"pattern": "^##\\s+Problem[\\s\\S]*^##\\s+Change[\\s\\S]*^##\\s+Files touched[\\s\\S]*^##\\s+Per-violation disposition[\\s\\S]*^##\\s+Risk[\\s\\S]*^##\\s+How to verify",
|
|
99
|
+
"flags": "im",
|
|
100
|
+
"label": "fix-notes sections in order"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"kind": "citationsResolve",
|
|
104
|
+
"file": "{{task.dir}}/fix-notes.md",
|
|
105
|
+
"minCitations": 2,
|
|
106
|
+
"artifact": true
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"path": "{{task.dir}}/validation.md",
|
|
112
|
+
"kind": "markdown-notes",
|
|
113
|
+
"artifact": true,
|
|
114
|
+
"minBytes": 500,
|
|
115
|
+
"checks": [
|
|
116
|
+
{
|
|
117
|
+
"kind": "contains",
|
|
118
|
+
"file": "{{task.dir}}/validation.md",
|
|
119
|
+
"pattern": "^##\\s+Per-item verification[\\s\\S]*^##\\s+Keyboard walk[\\s\\S]*^##\\s+Result",
|
|
120
|
+
"flags": "im",
|
|
121
|
+
"label": "validation sections in order"
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"path": "{{task.dir}}/review.md",
|
|
127
|
+
"kind": "markdown-report",
|
|
128
|
+
"artifact": true,
|
|
129
|
+
"minBytes": 400,
|
|
130
|
+
"checks": [
|
|
131
|
+
{
|
|
132
|
+
"kind": "contains",
|
|
133
|
+
"file": "{{task.dir}}/review.md",
|
|
134
|
+
"pattern": "Verdict:\\s*(?:PASS|REVISE)",
|
|
135
|
+
"flags": "i",
|
|
136
|
+
"label": "explicit reviewer verdict"
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
}
|
|
140
|
+
],
|
|
141
|
+
"checks": [
|
|
142
|
+
{
|
|
143
|
+
"kind": "notContains",
|
|
144
|
+
"file": "index.html",
|
|
145
|
+
"pattern": "<img\\b(?![^>]*\\balt\\s*=)[^>]*>",
|
|
146
|
+
"label": "no image is missing its alt attribute"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"kind": "htmlLint",
|
|
150
|
+
"file": "index.html"
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"kind": "nodeScriptPasses",
|
|
154
|
+
"script": "tests/verify-retrofit.mjs",
|
|
155
|
+
"timeoutMs": 60000,
|
|
156
|
+
"requiredOutput": [
|
|
157
|
+
{
|
|
158
|
+
"pattern": "A11YRETRO_ORACLE alts ok",
|
|
159
|
+
"label": "meaningful images carry specific alt text"
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"pattern": "A11YRETRO_ORACLE decorative ok",
|
|
163
|
+
"label": "the decorative divider keeps its empty alt"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"pattern": "A11YRETRO_ORACLE label ok",
|
|
167
|
+
"label": "the label's for pairs with a real input id"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"pattern": "A11YRETRO_ORACLE control ok",
|
|
171
|
+
"label": "the join control is keyboard-operable"
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"pattern": "A11YRETRO_ORACLE headings ok",
|
|
175
|
+
"label": "heading order is monotonic"
|
|
176
|
+
}
|
|
177
|
+
]
|
|
178
|
+
}
|
|
179
|
+
],
|
|
180
|
+
"taskNotes": {
|
|
181
|
+
"minBytes": 120,
|
|
182
|
+
"checks": [
|
|
183
|
+
{
|
|
184
|
+
"kind": "contains",
|
|
185
|
+
"file": "task-notes.md",
|
|
186
|
+
"pattern": "\\bDONE\\b[\\s\\S]*(validation\\.md|fix-notes\\.md|audit\\.md)",
|
|
187
|
+
"flags": "i",
|
|
188
|
+
"label": "DONE note names the deliverables"
|
|
189
|
+
}
|
|
190
|
+
]
|
|
191
|
+
},
|
|
192
|
+
"taskGraph": {
|
|
193
|
+
"requireCraftbookTask": true,
|
|
194
|
+
"requireTerminalStep": true
|
|
195
|
+
},
|
|
196
|
+
"unchangedFixtures": [
|
|
197
|
+
"package.json",
|
|
198
|
+
"images/harvest-crew.svg",
|
|
199
|
+
"images/seed-chart.svg",
|
|
200
|
+
"images/divider.svg"
|
|
201
|
+
]
|
|
202
|
+
},
|
|
203
|
+
"rubric": {
|
|
204
|
+
"artifact": {
|
|
205
|
+
"path": "{{task.dir}}/fix-notes.md",
|
|
206
|
+
"kind": "markdown"
|
|
207
|
+
},
|
|
208
|
+
"axes": [
|
|
209
|
+
{
|
|
210
|
+
"name": "Real-site repair",
|
|
211
|
+
"description": "Violations were fixed in the actual markup with semantic elements preferred over ARIA bolt-ons — a real button and a real label rather than aria-label sprayed on divs."
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"name": "Classification judgment",
|
|
215
|
+
"description": "Meaningful versus decorative images were classified correctly: specific purposeful alt text for the content images, an empty alt preserved on the divider, and the decorative call stated in the notes."
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
"name": "Honest verification trail",
|
|
219
|
+
"description": "Audit, fix-notes, and validation reconcile item for item, and validation separates what was inspected in the code from what was actually exercised."
|
|
220
|
+
}
|
|
221
|
+
]
|
|
222
|
+
},
|
|
223
|
+
"qualityFocus": [
|
|
224
|
+
"real-site fixes over ARIA theater",
|
|
225
|
+
"content vs decorative image judgment",
|
|
226
|
+
"enforced review loop"
|
|
227
|
+
]
|
|
228
|
+
}
|
|
@@ -102,16 +102,19 @@
|
|
|
102
102
|
"kind": "contains",
|
|
103
103
|
"file": "tasks/eval/report.md",
|
|
104
104
|
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
105
|
-
"flags": "i"
|
|
105
|
+
"flags": "i",
|
|
106
|
+
"artifact": true
|
|
106
107
|
},
|
|
107
108
|
{
|
|
108
109
|
"kind": "contains",
|
|
109
110
|
"file": "tasks/eval/report.md",
|
|
110
111
|
"pattern": "dupl|near-dup|burst|similar",
|
|
111
112
|
"flags": "i",
|
|
112
|
-
"label": "the cull is explained — bursts and near-duplicates named"
|
|
113
|
+
"label": "the cull is explained — bursts and near-duplicates named",
|
|
114
|
+
"artifact": true
|
|
113
115
|
}
|
|
114
|
-
]
|
|
116
|
+
],
|
|
117
|
+
"artifact": true
|
|
115
118
|
}
|
|
116
119
|
]
|
|
117
120
|
},
|
|
@@ -119,20 +119,20 @@
|
|
|
119
119
|
},
|
|
120
120
|
"axes": [
|
|
121
121
|
{
|
|
122
|
-
"name": "
|
|
123
|
-
"description": "
|
|
122
|
+
"name": "correctness",
|
|
123
|
+
"description": "The module does what the requirements ask, with sensible edge handling."
|
|
124
124
|
},
|
|
125
125
|
{
|
|
126
|
-
"name": "
|
|
127
|
-
"description": "
|
|
126
|
+
"name": "verification",
|
|
127
|
+
"description": "Self-tests exercise real behavior, not trivial truths."
|
|
128
128
|
},
|
|
129
129
|
{
|
|
130
|
-
"name": "
|
|
131
|
-
"description": "
|
|
130
|
+
"name": "clarity",
|
|
131
|
+
"description": "Exports, naming, and structure make the module usable without reading every line."
|
|
132
132
|
},
|
|
133
133
|
{
|
|
134
|
-
"name": "
|
|
135
|
-
"description": "
|
|
134
|
+
"name": "robustness",
|
|
135
|
+
"description": "Invalid input and boundary cases fail loudly rather than silently."
|
|
136
136
|
}
|
|
137
137
|
]
|
|
138
138
|
},
|
|
@@ -96,20 +96,23 @@
|
|
|
96
96
|
"kind": "contains",
|
|
97
97
|
"file": "tasks/eval/report.md",
|
|
98
98
|
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
99
|
-
"flags": "i"
|
|
99
|
+
"flags": "i",
|
|
100
|
+
"artifact": true
|
|
100
101
|
},
|
|
101
102
|
{
|
|
102
103
|
"kind": "contains",
|
|
103
104
|
"file": "tasks/eval/report.md",
|
|
104
105
|
"pattern": "chapter",
|
|
105
106
|
"flags": "i",
|
|
106
|
-
"label": "a chapter list for the reel"
|
|
107
|
+
"label": "a chapter list for the reel",
|
|
108
|
+
"artifact": true
|
|
107
109
|
},
|
|
108
110
|
{
|
|
109
111
|
"kind": "contains",
|
|
110
112
|
"file": "tasks/eval/report.md",
|
|
111
113
|
"pattern": "Ria",
|
|
112
|
-
"label": "the dedication names Ria"
|
|
114
|
+
"label": "the dedication names Ria",
|
|
115
|
+
"artifact": true
|
|
113
116
|
},
|
|
114
117
|
{
|
|
115
118
|
"kind": "judge",
|
|
@@ -119,9 +122,11 @@
|
|
|
119
122
|
"clips.json",
|
|
120
123
|
"family.md"
|
|
121
124
|
],
|
|
122
|
-
"label": "era coverage and warmth"
|
|
125
|
+
"label": "era coverage and warmth",
|
|
126
|
+
"artifact": true
|
|
123
127
|
}
|
|
124
|
-
]
|
|
128
|
+
],
|
|
129
|
+
"artifact": true
|
|
125
130
|
}
|
|
126
131
|
]
|
|
127
132
|
},
|
|
@@ -37,47 +37,55 @@
|
|
|
37
37
|
"kind": "contains",
|
|
38
38
|
"file": "tasks/eval/report.md",
|
|
39
39
|
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
40
|
-
"flags": "i"
|
|
40
|
+
"flags": "i",
|
|
41
|
+
"artifact": true
|
|
41
42
|
},
|
|
42
43
|
{
|
|
43
44
|
"kind": "contains",
|
|
44
45
|
"file": "tasks/eval/report.md",
|
|
45
46
|
"pattern": "source/brief\\.md|Brief",
|
|
46
47
|
"flags": "i",
|
|
47
|
-
"label": "cite or name the seeded source"
|
|
48
|
+
"label": "cite or name the seeded source",
|
|
49
|
+
"artifact": true
|
|
48
50
|
},
|
|
49
51
|
{
|
|
50
52
|
"kind": "contains",
|
|
51
53
|
"file": "tasks/eval/report.md",
|
|
52
54
|
"pattern": "18\\b[\\s\\S]{0,30}\\bSKUs",
|
|
53
55
|
"flags": "i",
|
|
54
|
-
"label": "include the 18-SKU pilot scope"
|
|
56
|
+
"label": "include the 18-SKU pilot scope",
|
|
57
|
+
"artifact": true
|
|
55
58
|
},
|
|
56
59
|
{
|
|
57
60
|
"kind": "contains",
|
|
58
61
|
"file": "tasks/eval/report.md",
|
|
59
62
|
"pattern": "18\\s*hours|6\\s*hours",
|
|
60
|
-
"flags": "i"
|
|
63
|
+
"flags": "i",
|
|
64
|
+
"artifact": true
|
|
61
65
|
},
|
|
62
66
|
{
|
|
63
67
|
"kind": "contains",
|
|
64
68
|
"file": "tasks/eval/report.md",
|
|
65
69
|
"pattern": "14\\.2%|8\\.9%",
|
|
66
|
-
"flags": "i"
|
|
70
|
+
"flags": "i",
|
|
71
|
+
"artifact": true
|
|
67
72
|
},
|
|
68
73
|
{
|
|
69
74
|
"kind": "contains",
|
|
70
75
|
"file": "tasks/eval/report.md",
|
|
71
76
|
"pattern": "status silence|photo submission",
|
|
72
|
-
"flags": "i"
|
|
77
|
+
"flags": "i",
|
|
78
|
+
"artifact": true
|
|
73
79
|
},
|
|
74
80
|
{
|
|
75
81
|
"kind": "contains",
|
|
76
82
|
"file": "tasks/eval/report.md",
|
|
77
83
|
"pattern": "automated status emails|barcode|Finance",
|
|
78
|
-
"flags": "i"
|
|
84
|
+
"flags": "i",
|
|
85
|
+
"artifact": true
|
|
79
86
|
}
|
|
80
|
-
]
|
|
87
|
+
],
|
|
88
|
+
"artifact": true
|
|
81
89
|
}
|
|
82
90
|
]
|
|
83
91
|
},
|
|
@@ -37,33 +37,39 @@
|
|
|
37
37
|
"kind": "contains",
|
|
38
38
|
"file": "tasks/eval/report.md",
|
|
39
39
|
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
40
|
-
"flags": "i"
|
|
40
|
+
"flags": "i",
|
|
41
|
+
"artifact": true
|
|
41
42
|
},
|
|
42
43
|
{
|
|
43
44
|
"kind": "contains",
|
|
44
45
|
"file": "tasks/eval/report.md",
|
|
45
46
|
"pattern": "O-1007|O-1009|O-1010|O-1013",
|
|
46
|
-
"flags": "i"
|
|
47
|
+
"flags": "i",
|
|
48
|
+
"artifact": true
|
|
47
49
|
},
|
|
48
50
|
{
|
|
49
51
|
"kind": "contains",
|
|
50
52
|
"file": "tasks/eval/report.md",
|
|
51
53
|
"pattern": "negative|future|quantity|outlier|threshold|severity",
|
|
52
|
-
"flags": "i"
|
|
54
|
+
"flags": "i",
|
|
55
|
+
"artifact": true
|
|
53
56
|
},
|
|
54
57
|
{
|
|
55
58
|
"kind": "contains",
|
|
56
59
|
"file": "tasks/eval/report.md",
|
|
57
60
|
"pattern": "likely real|probable noise|false positive",
|
|
58
|
-
"flags": "i"
|
|
61
|
+
"flags": "i",
|
|
62
|
+
"artifact": true
|
|
59
63
|
},
|
|
60
64
|
{
|
|
61
65
|
"kind": "contains",
|
|
62
66
|
"file": "tasks/eval/report.md",
|
|
63
67
|
"pattern": "recommended next steps|triage|action",
|
|
64
|
-
"flags": "i"
|
|
68
|
+
"flags": "i",
|
|
69
|
+
"artifact": true
|
|
65
70
|
}
|
|
66
|
-
]
|
|
71
|
+
],
|
|
72
|
+
"artifact": true
|
|
67
73
|
},
|
|
68
74
|
{
|
|
69
75
|
"path": "data/anomalies.json",
|