@bendyline/gilde 0.1.40 → 0.1.41

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 (147) hide show
  1. package/authoring/gstack/overlays/investigate.json +1 -0
  2. package/authoring/gstack/overlays/qa-only.json +1 -0
  3. package/authoring/gstack/wave.json +12 -2
  4. package/authoring/tactical/books/accessibility-retrofit.json +188 -0
  5. package/authoring/tactical/books/apply-review-findings.json +189 -0
  6. package/authoring/tactical/books/bug-fix-tdd.json +237 -0
  7. package/authoring/tactical/books/ci-pipeline.json +168 -0
  8. package/authoring/tactical/books/codemod-sweep.json +182 -0
  9. package/authoring/tactical/books/dependency-upgrade.json +196 -0
  10. package/authoring/tactical/books/flaky-test-fix.json +238 -0
  11. package/authoring/tactical/books/hotfix-flow.json +187 -0
  12. package/authoring/tactical/books/perf-optimization.json +219 -0
  13. package/authoring/tactical/books/refactor-module.json +217 -0
  14. package/authoring/tactical/books/schema-migration.json +192 -0
  15. package/authoring/tactical/books/test-suite-backfill.json +172 -0
  16. package/authoring/tactical/books/type-safety-pass.json +185 -0
  17. package/authoring/tactical/books/ux-update.json +178 -0
  18. package/authoring/tactical/evals/accessibility-retrofit.json +230 -0
  19. package/authoring/tactical/evals/apply-review-findings.json +290 -0
  20. package/authoring/tactical/evals/bug-fix-tdd.json +221 -0
  21. package/authoring/tactical/evals/ci-pipeline.json +227 -0
  22. package/authoring/tactical/evals/codemod-sweep.json +252 -0
  23. package/authoring/tactical/evals/dependency-upgrade.json +235 -0
  24. package/authoring/tactical/evals/flaky-test-fix.json +239 -0
  25. package/authoring/tactical/evals/hotfix-flow.json +220 -0
  26. package/authoring/tactical/evals/perf-optimization.json +235 -0
  27. package/authoring/tactical/evals/refactor-module.json +241 -0
  28. package/authoring/tactical/evals/schema-migration.json +225 -0
  29. package/authoring/tactical/evals/test-suite-backfill.json +197 -0
  30. package/authoring/tactical/evals/type-safety-pass.json +221 -0
  31. package/authoring/tactical/evals/ux-update.json +206 -0
  32. package/authoring/tactical/wave.json +89 -0
  33. package/data/chat-models/de/deepseek-r1-8b-q4/manifest.json +56 -1
  34. package/data/chat-models/gl/glm-5.2-754b-q2/manifest.json +56 -0
  35. package/data/chat-models/gp/gpt-oss-120b-q4/manifest.json +73 -1
  36. package/data/chat-models/gp/gpt-oss-20b-q4/manifest.json +77 -1
  37. package/data/chat-models/index.json +1 -1
  38. package/data/chat-models/ll/llama3.2-3b-q4/manifest.json +3 -1
  39. package/data/chat-models/mi/mistral-7b-q4/manifest.json +54 -3
  40. package/data/chat-models/mi/mistral-medium-3.5-128b-q4/manifest.json +76 -1
  41. package/data/craftbook-templates/ac/accessibility-retrofit/manifest.json +5 -4
  42. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.0/craftbook.json +451 -0
  43. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.0/test.json +231 -0
  44. package/data/craftbook-templates/al/alt-text-pass/manifest.json +5 -1
  45. package/data/craftbook-templates/ap/apply-review-findings/art.json +12 -0
  46. package/data/craftbook-templates/ap/apply-review-findings/logo.webp +0 -0
  47. package/data/craftbook-templates/ap/apply-review-findings/manifest.json +23 -0
  48. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.0/craftbook.json +436 -0
  49. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.0/test.json +291 -0
  50. package/data/craftbook-templates/br/browser-qa-audit/manifest.json +5 -1
  51. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.5/craftbook.json +438 -0
  52. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.5/test.json +379 -0
  53. package/data/craftbook-templates/bu/bug-fix-tdd/manifest.json +3 -3
  54. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.0/craftbook.json +545 -0
  55. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.0/test.json +222 -0
  56. package/data/craftbook-templates/ch/changelog-cut/manifest.json +5 -1
  57. package/data/craftbook-templates/ch/changelog-writeup/manifest.json +5 -1
  58. package/data/craftbook-templates/ci/ci-pipeline/manifest.json +5 -3
  59. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.0/craftbook.json +423 -0
  60. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.0/test.json +228 -0
  61. package/data/craftbook-templates/co/codemod-sweep/art.json +12 -0
  62. package/data/craftbook-templates/co/codemod-sweep/logo.webp +0 -0
  63. package/data/craftbook-templates/co/codemod-sweep/manifest.json +23 -0
  64. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.0/craftbook.json +441 -0
  65. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.0/test.json +253 -0
  66. package/data/craftbook-templates/de/dependency-upgrade/art.json +12 -0
  67. package/data/craftbook-templates/de/dependency-upgrade/logo.webp +0 -0
  68. package/data/craftbook-templates/de/dependency-upgrade/manifest.json +23 -0
  69. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.0/craftbook.json +459 -0
  70. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.0/test.json +236 -0
  71. package/data/craftbook-templates/fe/feature-flag-release/manifest.json +5 -1
  72. package/data/craftbook-templates/fe/feature-flag-rollout/manifest.json +4 -1
  73. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.0/craftbook.json +203 -0
  74. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.0/test.json +165 -0
  75. package/data/craftbook-templates/fl/flaky-test-fix/art.json +12 -0
  76. package/data/craftbook-templates/fl/flaky-test-fix/logo.webp +0 -0
  77. package/data/craftbook-templates/fl/flaky-test-fix/manifest.json +24 -0
  78. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.0/craftbook.json +534 -0
  79. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.0/test.json +240 -0
  80. package/data/craftbook-templates/ho/hotfix-flow/manifest.json +5 -3
  81. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.0/craftbook.json +442 -0
  82. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.0/test.json +221 -0
  83. package/data/craftbook-templates/in/investigate/manifest.json +4 -1
  84. package/data/craftbook-templates/in/investigate-root-cause/manifest.json +5 -1
  85. package/data/craftbook-templates/index.json +1 -1
  86. package/data/craftbook-templates/li/live-browser-qa/manifest.json +5 -1
  87. package/data/craftbook-templates/ni/nightly-fix-sweep/art.json +12 -0
  88. package/data/craftbook-templates/ni/nightly-fix-sweep/logo.webp +0 -0
  89. package/data/craftbook-templates/ni/nightly-fix-sweep/manifest.json +23 -0
  90. package/data/craftbook-templates/ni/nightly-fix-sweep/versions/1.0.0/craftbook.json +145 -0
  91. package/data/craftbook-templates/ni/nightly-fix-sweep/versions/1.0.0/test.json +121 -0
  92. package/data/craftbook-templates/pe/perf-audit/versions/1.1.0/craftbook.json +195 -0
  93. package/data/craftbook-templates/pe/perf-audit/versions/1.1.0/test.json +165 -0
  94. package/data/craftbook-templates/pe/perf-optimization/manifest.json +3 -3
  95. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.0/craftbook.json +511 -0
  96. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.0/test.json +236 -0
  97. package/data/craftbook-templates/qa/qa/manifest.json +3 -1
  98. package/data/craftbook-templates/re/refactor-module/manifest.json +2 -2
  99. package/data/craftbook-templates/re/refactor-module/versions/1.0.4/craftbook.json +150 -0
  100. package/data/craftbook-templates/re/refactor-module/versions/1.0.4/test.json +95 -0
  101. package/data/craftbook-templates/re/refactor-module/versions/2.0.0/craftbook.json +509 -0
  102. package/data/craftbook-templates/re/refactor-module/versions/2.0.0/test.json +242 -0
  103. package/data/craftbook-templates/re/release-notes/manifest.json +5 -1
  104. package/data/craftbook-templates/re/release-notes/versions/1.0.3/craftbook.json +220 -0
  105. package/data/craftbook-templates/re/release-notes/versions/1.0.3/test.json +114 -0
  106. package/data/craftbook-templates/re/release-pipeline-ci/manifest.json +5 -1
  107. package/data/craftbook-templates/re/release-readiness-review/versions/1.1.0/craftbook.json +192 -0
  108. package/data/craftbook-templates/re/release-readiness-review/versions/1.1.0/test.json +113 -0
  109. package/data/craftbook-templates/ro/root-cause-investigation/manifest.json +7 -1
  110. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.5/craftbook.json +433 -0
  111. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.5/test.json +157 -0
  112. package/data/craftbook-templates/sc/schema-migration/manifest.json +4 -4
  113. package/data/craftbook-templates/sc/schema-migration/versions/2.0.0/craftbook.json +459 -0
  114. package/data/craftbook-templates/sc/schema-migration/versions/2.0.0/test.json +226 -0
  115. package/data/craftbook-templates/te/test-coverage-review/versions/1.2.0/craftbook.json +195 -0
  116. package/data/craftbook-templates/te/test-coverage-review/versions/1.2.0/test.json +116 -0
  117. package/data/craftbook-templates/te/test-suite-backfill/manifest.json +1 -2
  118. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.0/craftbook.json +428 -0
  119. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.0/test.json +198 -0
  120. package/data/craftbook-templates/ty/type-safety-pass/manifest.json +3 -3
  121. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.0/craftbook.json +428 -0
  122. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.0/test.json +222 -0
  123. package/data/craftbook-templates/ux/ux-update/art.json +12 -0
  124. package/data/craftbook-templates/ux/ux-update/logo.webp +0 -0
  125. package/data/craftbook-templates/ux/ux-update/manifest.json +22 -0
  126. package/data/craftbook-templates/ux/ux-update/versions/1.0.0/craftbook.json +439 -0
  127. package/data/craftbook-templates/ux/ux-update/versions/1.0.0/test.json +207 -0
  128. package/data/craftbook-templates/ve/version-bump/versions/1.1.0/craftbook.json +206 -0
  129. package/data/craftbook-templates/ve/version-bump/versions/1.1.0/test.json +95 -0
  130. package/data/gezel-templates/bo/boekwachter/versions/1.1.0/about.md +29 -0
  131. package/data/gezel-templates/bo/boekwachter/versions/1.1.0/manifest.json +16 -0
  132. package/data/gezel-templates/bu/builder/versions/1.5.0/about.md +34 -0
  133. package/data/gezel-templates/bu/builder/versions/1.5.0/manifest.json +16 -0
  134. package/data/gezel-templates/de/developer/versions/1.5.0/about.md +34 -0
  135. package/data/gezel-templates/de/developer/versions/1.5.0/manifest.json +21 -0
  136. package/data/gezel-templates/index.json +1 -1
  137. package/data/gezel-templates/re/reviewer/versions/1.4.0/about.md +49 -0
  138. package/data/gezel-templates/re/reviewer/versions/1.4.0/manifest.json +21 -0
  139. package/data/project-types/index.json +1 -1
  140. package/data/project-types/so/software-project/manifest.json +20 -0
  141. package/data/project-types/so/software-project/versions/1.0.0/about.md +3 -0
  142. package/data/project-types/so/software-project/versions/1.0.0/manifest.json +41 -0
  143. package/data/project-types/so/software-project/versions/1.0.0/mission.md +4 -0
  144. package/package.json +1 -1
  145. package/schemas/craftbook-doc.schema.json +248 -0
  146. package/schemas/craftbook-template-version.schema.json +248 -0
  147. package/schemas/craftbook-test.schema.json +200 -0
@@ -0,0 +1,231 @@
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
+ "craftbookParams": {
47
+ "workPath": "tasks/eval"
48
+ }
49
+ },
50
+ "mocks": [],
51
+ "success": {
52
+ "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.",
53
+ "deliverables": [
54
+ {
55
+ "path": "tasks/eval/audit.md",
56
+ "kind": "markdown-notes",
57
+ "artifact": true,
58
+ "minBytes": 600,
59
+ "checks": [
60
+ {
61
+ "kind": "contains",
62
+ "file": "tasks/eval/audit.md",
63
+ "pattern": "^##\\s+Scope[\\s\\S]*^##\\s+Violations[\\s\\S]*^##\\s+Priorities",
64
+ "flags": "im",
65
+ "label": "audit sections in order"
66
+ },
67
+ {
68
+ "kind": "tableShape",
69
+ "file": "tasks/eval/audit.md",
70
+ "requiredColumns": [
71
+ "File",
72
+ "Issue",
73
+ "Priority"
74
+ ],
75
+ "minRows": 3,
76
+ "artifact": true
77
+ },
78
+ {
79
+ "kind": "citationsResolve",
80
+ "file": "tasks/eval/audit.md",
81
+ "minCitations": 2,
82
+ "artifact": true
83
+ },
84
+ {
85
+ "kind": "contains",
86
+ "file": "tasks/eval/audit.md",
87
+ "pattern": "index\\.html",
88
+ "label": "the audit names the real page"
89
+ }
90
+ ]
91
+ },
92
+ {
93
+ "path": "tasks/eval/fix-notes.md",
94
+ "kind": "markdown-notes",
95
+ "artifact": true,
96
+ "minBytes": 700,
97
+ "checks": [
98
+ {
99
+ "kind": "contains",
100
+ "file": "tasks/eval/fix-notes.md",
101
+ "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",
102
+ "flags": "im",
103
+ "label": "fix-notes sections in order"
104
+ },
105
+ {
106
+ "kind": "citationsResolve",
107
+ "file": "tasks/eval/fix-notes.md",
108
+ "minCitations": 2,
109
+ "artifact": true
110
+ }
111
+ ]
112
+ },
113
+ {
114
+ "path": "tasks/eval/validation.md",
115
+ "kind": "markdown-notes",
116
+ "artifact": true,
117
+ "minBytes": 500,
118
+ "checks": [
119
+ {
120
+ "kind": "contains",
121
+ "file": "tasks/eval/validation.md",
122
+ "pattern": "^##\\s+Per-item verification[\\s\\S]*^##\\s+Keyboard walk[\\s\\S]*^##\\s+Result",
123
+ "flags": "im",
124
+ "label": "validation sections in order"
125
+ }
126
+ ]
127
+ },
128
+ {
129
+ "path": "tasks/eval/review.md",
130
+ "kind": "markdown-report",
131
+ "artifact": true,
132
+ "minBytes": 400,
133
+ "checks": [
134
+ {
135
+ "kind": "contains",
136
+ "file": "tasks/eval/review.md",
137
+ "pattern": "Verdict:\\s*(?:PASS|REVISE)",
138
+ "flags": "i",
139
+ "label": "explicit reviewer verdict"
140
+ }
141
+ ]
142
+ }
143
+ ],
144
+ "checks": [
145
+ {
146
+ "kind": "notContains",
147
+ "file": "index.html",
148
+ "pattern": "<img\\b(?![^>]*\\balt\\s*=)[^>]*>",
149
+ "label": "no image is missing its alt attribute"
150
+ },
151
+ {
152
+ "kind": "htmlLint",
153
+ "file": "index.html"
154
+ },
155
+ {
156
+ "kind": "nodeScriptPasses",
157
+ "script": "tests/verify-retrofit.mjs",
158
+ "timeoutMs": 60000,
159
+ "requiredOutput": [
160
+ {
161
+ "pattern": "A11YRETRO_ORACLE alts ok",
162
+ "label": "meaningful images carry specific alt text"
163
+ },
164
+ {
165
+ "pattern": "A11YRETRO_ORACLE decorative ok",
166
+ "label": "the decorative divider keeps its empty alt"
167
+ },
168
+ {
169
+ "pattern": "A11YRETRO_ORACLE label ok",
170
+ "label": "the label's for pairs with a real input id"
171
+ },
172
+ {
173
+ "pattern": "A11YRETRO_ORACLE control ok",
174
+ "label": "the join control is keyboard-operable"
175
+ },
176
+ {
177
+ "pattern": "A11YRETRO_ORACLE headings ok",
178
+ "label": "heading order is monotonic"
179
+ }
180
+ ]
181
+ }
182
+ ],
183
+ "taskNotes": {
184
+ "minBytes": 120,
185
+ "checks": [
186
+ {
187
+ "kind": "contains",
188
+ "file": "task-notes.md",
189
+ "pattern": "\\bDONE\\b[\\s\\S]*(validation\\.md|fix-notes\\.md|audit\\.md)",
190
+ "flags": "i",
191
+ "label": "DONE note names the deliverables"
192
+ }
193
+ ]
194
+ },
195
+ "taskGraph": {
196
+ "requireCraftbookTask": true,
197
+ "requireTerminalStep": true
198
+ },
199
+ "unchangedFixtures": [
200
+ "package.json",
201
+ "images/harvest-crew.svg",
202
+ "images/seed-chart.svg",
203
+ "images/divider.svg"
204
+ ]
205
+ },
206
+ "rubric": {
207
+ "artifact": {
208
+ "path": "tasks/eval/fix-notes.md",
209
+ "kind": "markdown"
210
+ },
211
+ "axes": [
212
+ {
213
+ "name": "Real-site repair",
214
+ "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."
215
+ },
216
+ {
217
+ "name": "Classification judgment",
218
+ "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."
219
+ },
220
+ {
221
+ "name": "Honest verification trail",
222
+ "description": "Audit, fix-notes, and validation reconcile item for item, and validation separates what was inspected in the code from what was actually exercised."
223
+ }
224
+ ]
225
+ },
226
+ "qualityFocus": [
227
+ "real-site fixes over ARIA theater",
228
+ "content vs decorative image judgment",
229
+ "enforced review loop"
230
+ ]
231
+ }
@@ -19,6 +19,10 @@
19
19
  },
20
20
  "logo": "logo.webp",
21
21
  "license": "MIT",
22
- "yankedVersions": [],
22
+ "yankedVersions": [
23
+ "1.0.0",
24
+ "1.0.1",
25
+ "1.0.2"
26
+ ],
23
27
  "workflow": "build-loop"
24
28
  }
@@ -0,0 +1,12 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "promptVersion": "workshop-mark-1910-v2",
4
+ "periodCue": "circa-1910-subtle",
5
+ "family": "build-repair",
6
+ "accents": [
7
+ "slate",
8
+ "ochre"
9
+ ],
10
+ "sourceSummary": "Take an existing review’s findings and close each one at its real site, with per-finding dispositions and verification.",
11
+ "styleReference": "bug-fix-tdd"
12
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "craftbook-template",
4
+ "id": "apply-review-findings",
5
+ "name": "Apply Review Findings",
6
+ "description": "Take an existing review's findings and close them for real: triage each one against the current code, fix the real ones at their actual sites with the smallest correct change, verify per finding, and account for every finding end to end under an enforced review.",
7
+ "role": "general",
8
+ "category": "code-quality",
9
+ "tags": [
10
+ "review-findings",
11
+ "follow-up",
12
+ "bug-fix",
13
+ "triage",
14
+ "quality",
15
+ "maintenance"
16
+ ],
17
+ "maintainer": {
18
+ "name": "Gezel"
19
+ },
20
+ "license": "MIT",
21
+ "yankedVersions": [],
22
+ "logo": "logo.webp"
23
+ }