@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.
Files changed (185) hide show
  1. package/authoring/chat-models/glm-5.3-flash-320b-q2.json +129 -0
  2. package/authoring/gstack/wave.json +2 -2
  3. package/data/chat-models/gl/glm-5.3-flash-320b-q2/manifest.json +137 -0
  4. package/data/chat-models/gl/glm-5.3-flash-320b-q2/versions/1.0.0/manifest.json +23 -0
  5. package/data/chat-models/index.json +1 -1
  6. package/data/craftbook-templates/a1/a11y-audit/versions/1.1.3/test.json +16 -8
  7. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.2/craftbook.json +618 -0
  8. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.2/test.json +228 -0
  9. package/data/craftbook-templates/al/album-curate/versions/1.0.3/test.json +6 -3
  10. package/data/craftbook-templates/al/alert-rules/versions/1.0.3/test.json +8 -8
  11. package/data/craftbook-templates/an/anniversary-cut/versions/1.0.5/test.json +10 -5
  12. package/data/craftbook-templates/an/annual-document-review/versions/1.0.3/test.json +16 -8
  13. package/data/craftbook-templates/an/anomaly-scan/versions/1.0.3/test.json +12 -6
  14. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.2/craftbook.json +602 -0
  15. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.2/test.json +290 -0
  16. package/data/craftbook-templates/ar/artifact-integrity-review/versions/1.0.3/test.json +18 -9
  17. package/data/craftbook-templates/au/audiobook-master-pack/versions/1.0.5/test.json +10 -5
  18. package/data/craftbook-templates/au/auth-flow/versions/1.0.3/test.json +12 -6
  19. package/data/craftbook-templates/au/auth-flow/versions/1.0.4/craftbook.json +282 -0
  20. package/data/craftbook-templates/au/auth-flow/versions/1.0.4/test.json +143 -0
  21. package/data/craftbook-templates/au/automation-recipe/versions/1.0.3/test.json +12 -6
  22. package/data/craftbook-templates/ba/backup-routine/versions/1.0.4/craftbook.json +282 -0
  23. package/data/craftbook-templates/ba/backup-routine/versions/1.0.4/test.json +108 -0
  24. package/data/craftbook-templates/bl/blog-post/versions/1.0.3/test.json +8 -8
  25. package/data/craftbook-templates/br/branding-website/versions/1.1.3/craftbook.json +335 -0
  26. package/data/craftbook-templates/br/branding-website/versions/1.1.3/test.json +164 -0
  27. package/data/craftbook-templates/br/broadcast-announcement/versions/1.0.3/test.json +8 -8
  28. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.8/craftbook.json +621 -0
  29. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.8/test.json +376 -0
  30. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.2/craftbook.json +730 -0
  31. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.2/test.json +221 -0
  32. package/data/craftbook-templates/bu/build-loop/versions/1.1.1/test.json +8 -8
  33. package/data/craftbook-templates/ca/case-study/versions/1.0.3/test.json +8 -8
  34. package/data/craftbook-templates/ch/chapter-narration-run/versions/1.0.4/test.json +10 -5
  35. package/data/craftbook-templates/ch/character-turnaround/versions/1.0.3/test.json +25 -11
  36. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.2/craftbook.json +587 -0
  37. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.2/test.json +225 -0
  38. package/data/craftbook-templates/ci/citation-audit/versions/1.0.3/test.json +28 -14
  39. package/data/craftbook-templates/cl/cli-tool/versions/1.1.3/test.json +8 -8
  40. package/data/craftbook-templates/co/codebase-refactoring-review/versions/1.0.3/test.json +16 -8
  41. package/data/craftbook-templates/co/codebase-ux-review/versions/1.0.3/test.json +18 -9
  42. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.2/craftbook.json +605 -0
  43. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.2/test.json +252 -0
  44. package/data/craftbook-templates/co/cohort-analysis/versions/1.0.3/test.json +18 -9
  45. package/data/craftbook-templates/co/competitive-analysis/versions/1.0.3/test.json +23 -15
  46. package/data/craftbook-templates/co/content-accuracy-review/versions/1.0.3/test.json +28 -14
  47. package/data/craftbook-templates/co/content-deck/versions/1.2.3/craftbook.json +4 -4
  48. package/data/craftbook-templates/co/content-deck/versions/1.2.3/test.json +3 -0
  49. package/data/craftbook-templates/co/content-deck/versions/1.2.4/craftbook.json +341 -0
  50. package/data/craftbook-templates/co/content-deck/versions/1.2.4/test.json +169 -0
  51. package/data/craftbook-templates/co/copy-review/versions/1.0.3/test.json +14 -7
  52. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.3/craftbook.json +4 -4
  53. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.3/test.json +3 -0
  54. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.4/craftbook.json +345 -0
  55. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.4/test.json +187 -0
  56. package/data/craftbook-templates/co/corpus-synthesis/versions/1.0.3/test.json +26 -13
  57. package/data/craftbook-templates/co/cover-letter/versions/1.0.3/test.json +8 -8
  58. package/data/craftbook-templates/cs/csv-transformer/versions/1.2.4/test.json +7 -7
  59. package/data/craftbook-templates/da/dashboard-spec/versions/1.0.3/test.json +7 -7
  60. package/data/craftbook-templates/da/data-export-migrate/versions/1.0.4/craftbook.json +285 -0
  61. package/data/craftbook-templates/da/data-export-migrate/versions/1.0.4/test.json +104 -0
  62. package/data/craftbook-templates/da/data-pipeline-etl/versions/1.0.5/craftbook.json +284 -0
  63. package/data/craftbook-templates/da/data-pipeline-etl/versions/1.0.5/test.json +162 -0
  64. package/data/craftbook-templates/da/data-quality-audit/versions/1.0.3/test.json +38 -19
  65. package/data/craftbook-templates/da/data-to-report/versions/1.0.3/test.json +12 -6
  66. package/data/craftbook-templates/db/db-index-tuning/versions/1.0.4/craftbook.json +286 -0
  67. package/data/craftbook-templates/db/db-index-tuning/versions/1.0.4/test.json +104 -0
  68. package/data/craftbook-templates/de/dependency-audit/versions/1.1.3/test.json +14 -7
  69. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.2/craftbook.json +621 -0
  70. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.2/test.json +235 -0
  71. package/data/craftbook-templates/de/design-review/versions/1.0.3/test.json +16 -8
  72. package/data/craftbook-templates/de/design-system-consultation/versions/2.0.8/craftbook.json +616 -0
  73. package/data/craftbook-templates/de/design-system-consultation/versions/2.0.8/test.json +201 -0
  74. package/data/craftbook-templates/do/doc-intake-pipeline/versions/1.0.4/craftbook.json +285 -0
  75. package/data/craftbook-templates/do/doc-intake-pipeline/versions/1.0.4/test.json +104 -0
  76. package/data/craftbook-templates/do/doc-rewrite/versions/1.0.3/test.json +119 -55
  77. package/data/craftbook-templates/do/dockerize-app/versions/1.0.4/craftbook.json +285 -0
  78. package/data/craftbook-templates/do/dockerize-app/versions/1.0.4/test.json +92 -0
  79. package/data/craftbook-templates/do/documentation-drift-review/versions/1.0.3/test.json +18 -9
  80. package/data/craftbook-templates/dr/draft-social-post/versions/1.0.2/craftbook.json +324 -0
  81. package/data/craftbook-templates/dr/draft-social-post/versions/1.0.2/test.json +161 -0
  82. package/data/craftbook-templates/ed/edit-notes/versions/1.0.3/test.json +11 -4
  83. package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.8/craftbook.json +566 -0
  84. package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.8/test.json +191 -0
  85. package/data/craftbook-templates/ep/episode-plan/versions/1.0.3/test.json +10 -5
  86. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.7/test.json +7 -10
  87. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.8/craftbook.json +595 -0
  88. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.8/test.json +139 -0
  89. package/data/craftbook-templates/ex/expense-categorize/versions/1.0.4/craftbook.json +277 -0
  90. package/data/craftbook-templates/ex/expense-categorize/versions/1.0.4/test.json +104 -0
  91. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.2/craftbook.json +327 -0
  92. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.2/test.json +162 -0
  93. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.2/craftbook.json +718 -0
  94. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.2/test.json +239 -0
  95. package/data/craftbook-templates/fo/form-fill-batch/versions/1.0.4/craftbook.json +285 -0
  96. package/data/craftbook-templates/fo/form-fill-batch/versions/1.0.4/test.json +162 -0
  97. package/data/craftbook-templates/fo/form-wizard/versions/1.0.3/test.json +8 -8
  98. package/data/craftbook-templates/ho/holiday-card-run/versions/1.0.3/test.json +11 -4
  99. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.2/craftbook.json +610 -0
  100. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.2/test.json +220 -0
  101. package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.3/craftbook.json +343 -0
  102. package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.3/test.json +176 -0
  103. package/data/craftbook-templates/id/idea-office-hours/versions/2.0.8/craftbook.json +566 -0
  104. package/data/craftbook-templates/id/idea-office-hours/versions/2.0.8/test.json +141 -0
  105. package/data/craftbook-templates/im/image-set-index/versions/1.2.3/craftbook.json +298 -0
  106. package/data/craftbook-templates/im/image-set-index/versions/1.2.3/test.json +180 -0
  107. package/data/craftbook-templates/in/insurance-inventory/versions/1.0.3/test.json +11 -4
  108. package/data/craftbook-templates/in/interactive-quiz/versions/1.0.3/test.json +48 -23
  109. package/data/craftbook-templates/in/invitation-design/versions/1.0.3/test.json +1 -1
  110. package/data/craftbook-templates/index.json +1 -1
  111. package/data/craftbook-templates/it/item-intake/versions/1.0.3/test.json +11 -4
  112. package/data/craftbook-templates/le/lead-enrichment/versions/1.0.4/craftbook.json +277 -0
  113. package/data/craftbook-templates/le/lead-enrichment/versions/1.0.4/test.json +104 -0
  114. package/data/craftbook-templates/me/meeting-prep-brief/versions/1.0.3/test.json +16 -8
  115. package/data/craftbook-templates/me/memory-prompt-session/versions/1.0.3/test.json +3 -0
  116. package/data/craftbook-templates/mo/morning-report/versions/1.0.3/test.json +21 -9
  117. package/data/craftbook-templates/of/office-hours/versions/1.1.1/test.json +8 -8
  118. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.2/craftbook.json +697 -0
  119. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.2/test.json +235 -0
  120. package/data/craftbook-templates/pe/pest-diagnosis/versions/1.0.3/test.json +19 -8
  121. package/data/craftbook-templates/pl/plan/versions/1.0.2/test.json +8 -8
  122. package/data/craftbook-templates/pl/playtest-report/versions/1.0.3/test.json +17 -7
  123. package/data/craftbook-templates/pr/practice-exam/versions/1.0.3/test.json +7 -2
  124. package/data/craftbook-templates/pr/practice-session/versions/1.0.3/test.json +11 -4
  125. package/data/craftbook-templates/pu/pull-request-review/versions/1.9.2/craftbook.json +435 -0
  126. package/data/craftbook-templates/pu/pull-request-review/versions/1.9.2/test.json +141 -0
  127. package/data/craftbook-templates/qu/quarterly-summary/versions/1.0.3/test.json +16 -8
  128. package/data/craftbook-templates/re/receipt-intake/versions/1.0.3/test.json +11 -4
  129. package/data/craftbook-templates/re/receipt-ocr-ledger/versions/1.0.4/craftbook.json +277 -0
  130. package/data/craftbook-templates/re/receipt-ocr-ledger/versions/1.0.4/test.json +104 -0
  131. package/data/craftbook-templates/re/recipe-capture/versions/1.0.3/test.json +13 -5
  132. package/data/craftbook-templates/re/record-a-relative/versions/1.0.3/test.json +3 -0
  133. package/data/craftbook-templates/re/recurring-invoice-run/versions/1.0.4/craftbook.json +285 -0
  134. package/data/craftbook-templates/re/recurring-invoice-run/versions/1.0.4/test.json +104 -0
  135. package/data/craftbook-templates/re/refactor-module/versions/2.0.2/craftbook.json +695 -0
  136. package/data/craftbook-templates/re/refactor-module/versions/2.0.2/test.json +241 -0
  137. package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.4/craftbook.json +361 -0
  138. package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.4/test.json +138 -0
  139. package/data/craftbook-templates/re/release-notes/versions/1.0.4/test.json +8 -8
  140. package/data/craftbook-templates/re/release-notes/versions/1.0.5/craftbook.json +339 -0
  141. package/data/craftbook-templates/re/release-notes/versions/1.0.5/test.json +111 -0
  142. package/data/craftbook-templates/re/reliability-review/versions/1.0.3/test.json +16 -8
  143. package/data/craftbook-templates/re/research-report/versions/1.0.3/test.json +16 -8
  144. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.8/craftbook.json +596 -0
  145. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.8/test.json +157 -0
  146. package/data/craftbook-templates/ro/rough-cut-assembly/versions/1.0.4/test.json +13 -5
  147. package/data/craftbook-templates/sc/schema-migration/versions/2.0.2/craftbook.json +624 -0
  148. package/data/craftbook-templates/sc/schema-migration/versions/2.0.2/test.json +225 -0
  149. package/data/craftbook-templates/sc/script-automation/versions/1.0.4/craftbook.json +284 -0
  150. package/data/craftbook-templates/sc/script-automation/versions/1.0.4/test.json +162 -0
  151. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.7/test.json +10 -13
  152. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.8/craftbook.json +597 -0
  153. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.8/test.json +157 -0
  154. package/data/craftbook-templates/so/social-digest/versions/1.0.3/craftbook.json +239 -0
  155. package/data/craftbook-templates/so/social-digest/versions/1.0.3/test.json +168 -0
  156. package/data/craftbook-templates/so/source-quality-audit/versions/1.0.3/test.json +25 -11
  157. package/data/craftbook-templates/sp/spec-authoring/versions/2.0.8/craftbook.json +599 -0
  158. package/data/craftbook-templates/sp/spec-authoring/versions/2.0.8/test.json +162 -0
  159. package/data/craftbook-templates/te/technical-documentation/versions/2.0.8/craftbook.json +577 -0
  160. package/data/craftbook-templates/te/technical-documentation/versions/2.0.8/test.json +174 -0
  161. package/data/craftbook-templates/te/test-coverage-review/versions/1.2.1/test.json +16 -8
  162. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.2/craftbook.json +592 -0
  163. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.2/test.json +195 -0
  164. package/data/craftbook-templates/th/thank-you-batch/versions/1.0.3/test.json +6 -3
  165. package/data/craftbook-templates/th/thank-you-sweep/versions/1.0.3/test.json +11 -4
  166. package/data/craftbook-templates/ti/tileset-batch/versions/1.0.3/test.json +9 -3
  167. package/data/craftbook-templates/tr/transcribe-and-shownotes/versions/1.0.3/test.json +10 -5
  168. package/data/craftbook-templates/tr/transcribe-index/versions/1.0.3/test.json +6 -3
  169. package/data/craftbook-templates/tr/translate-content/versions/1.1.3/craftbook.json +140 -0
  170. package/data/craftbook-templates/tr/translate-content/versions/1.1.3/test.json +141 -0
  171. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.2/craftbook.json +594 -0
  172. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.2/test.json +221 -0
  173. package/data/craftbook-templates/ux/ux-update/versions/1.0.2/craftbook.json +606 -0
  174. package/data/craftbook-templates/ux/ux-update/versions/1.0.2/test.json +206 -0
  175. package/data/craftbook-templates/we/weak-spot-drill/versions/1.0.3/test.json +11 -4
  176. package/data/craftbook-templates/we/weekly-walkthrough/versions/1.0.3/test.json +21 -9
  177. package/data/craftbook-templates/wh/whitepaper/versions/1.0.3/test.json +16 -8
  178. package/data/craftbook-templates/ye/year-in-review/versions/1.0.3/test.json +8 -4
  179. package/data/project-types/index.json +1 -1
  180. package/data/project-types/ju/just-chat/manifest.json +1 -1
  181. package/data/project-types/ju/just-chat/versions/1.0.1/about.md +5 -0
  182. package/data/project-types/ju/just-chat/versions/1.0.1/manifest.json +19 -0
  183. package/package.json +1 -1
  184. package/schemas/chat-model-identity.schema.json +27 -0
  185. package/schemas/chat-model-version.schema.json +22 -0
@@ -0,0 +1,206 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "title": "UX change with before/after proof",
4
+ "objective": "The craftbook drives a described UX change on a small orders page: move the bottom-of-page search into the header next to the title with an exact requested placeholder, while the / keyboard shortcut and the list-filter handler keep working. Placement, placeholder, and surviving wiring are verified mechanically against the fixed markup.",
5
+ "tags": [
6
+ "code",
7
+ "ux",
8
+ "frontend",
9
+ "tactical-fleet"
10
+ ],
11
+ "prompt": "Use the Implement a UX Change craftbook: nobody finds the search on the Orderboard page because it sits at the very bottom. Move the search into the header next to the title, set its placeholder to 'Search orders…', and keep the / keyboard shortcut working. The full request is in source/change-request.md.",
12
+ "setup": {
13
+ "projectName": "Orderboard",
14
+ "about": "A single-page order list for a small furniture shop: index.html with an inline script, plus styles.css. No build step and no test suite.",
15
+ "files": [
16
+ {
17
+ "path": "package.json",
18
+ "content": "{\n \"name\": \"orderboard\",\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>Orderboard</title>\n<link rel=\"stylesheet\" href=\"styles.css\">\n</head>\n<body>\n<header class=\"topbar\">\n <h1>Orderboard</h1>\n</header>\n<main>\n <ul id=\"orders\">\n <li>#1042 Walnut writing desk</li>\n <li>#1043 Oak bookshelf</li>\n <li>#1044 Cherry side table</li>\n <li>#1045 Maple bench</li>\n <li>#1046 Walnut picture frame</li>\n </ul>\n</main>\n<section class=\"search-row\">\n <input id=\"search\" type=\"search\" placeholder=\"Filter orders\">\n</section>\n<script>\nconst search = document.getElementById('search');\nsearch.addEventListener('input', () => {\n const q = search.value.toLowerCase();\n for (const item of document.querySelectorAll('#orders li')) {\n item.hidden = q !== '' && !item.textContent.toLowerCase().includes(q);\n }\n});\ndocument.addEventListener('keydown', (event) => {\n if (event.key === '/' && document.activeElement !== search) {\n event.preventDefault();\n search.focus();\n }\n});\n</script>\n</body>\n</html>\n"
23
+ },
24
+ {
25
+ "path": "styles.css",
26
+ "content": "body { margin: 0; font-family: system-ui, sans-serif; color: #1c2430; background: #f5f6f8; }\n.topbar { display: flex; align-items: center; gap: 1rem; padding: 0.75rem 1.25rem; background: #223047; color: #fff; }\n.topbar h1 { margin: 0; font-size: 1.2rem; }\nmain { max-width: 40rem; padding: 1rem 1.25rem; }\n#orders { list-style: none; padding: 0; }\n#orders li { padding: 0.5rem 0.25rem; border-bottom: 1px solid #dde1e8; }\n.search-row { padding: 1rem 1.25rem; }\n#search { padding: 0.4rem 0.6rem; width: 16rem; }\n"
27
+ },
28
+ {
29
+ "path": "source/change-request.md",
30
+ "content": "# Change request\n\nFrom the product owner: \"Nobody finds the search — it sits at the very bottom of the page. Move the search into the header, next to the Orderboard title. Set its placeholder to 'Search orders…'. The / keyboard shortcut people already use must keep working, and typing in the box must still filter the list.\"\n"
31
+ },
32
+ {
33
+ "path": "tests/verify-ux-update.mjs",
34
+ "content": "import assert from 'node:assert/strict';\nimport { readFileSync } from 'node:fs';\n\nconst html = readFileSync('index.html', 'utf8');\nlet code = html;\nfor (const m of html.matchAll(/<script\\b[^>]*\\bsrc\\s*=\\s*[\"']([^\"']+)[\"']/gi)) {\n try { code += readFileSync(m[1], 'utf8'); } catch {}\n}\n\n// 1) Exactly one search input, and it lives inside the header, next to the title.\nconst inputs = [...html.matchAll(/<input\\b[^>]*>/gi)].map((m) => m[0]).filter((t) => /\\bid\\s*=\\s*[\"']search[\"']/i.test(t));\nassert.equal(inputs.length, 1, 'exactly one #search input exists');\nconst header = html.match(/<header\\b[^>]*>([\\s\\S]*?)<\\/header>/i);\nassert.ok(header, 'the header still exists');\nassert.ok(/\\bid\\s*=\\s*[\"']search[\"']/i.test(header[1]), 'the search input lives inside the header');\nassert.ok(/<h1\\b[^>]*>[^<]*Orderboard/i.test(header[1]), 'the Orderboard title is still in the header');\nconsole.log('UXUPDATE_ORACLE placement ok');\n\n// 2) The placeholder is exactly as requested.\nconst ph = inputs[0].match(/\\bplaceholder\\s*=\\s*[\"']([^\"']*)[\"']/i);\nassert.ok(ph, 'the search input has a placeholder');\nassert.equal(ph[1], 'Search orders…', 'placeholder is exactly \"Search orders…\"');\nconsole.log('UXUPDATE_ORACLE placeholder ok');\n\n// 3) The / shortcut still targets and focuses the search input.\nassert.ok(/['\"]\\/['\"]/.test(code), 'the / key hook survives');\nassert.ok(/getElementById\\(\\s*['\"]search['\"]\\s*\\)|querySelector\\(\\s*['\"]#search['\"]\\s*\\)/.test(code), 'the script still targets #search');\nassert.ok(/\\.focus\\s*\\(\\s*\\)/.test(code), 'the shortcut still focuses the search input');\nconsole.log('UXUPDATE_ORACLE shortcut ok');\n\n// 4) The list-filter behavior is still wired.\nassert.ok(/addEventListener\\s*\\(\\s*['\"]input['\"]/.test(code) || /\\boninput\\s*=/i.test(html), 'the input filter handler is still wired');\nassert.ok(/#orders/.test(code), 'the filter still targets the order list');\nconsole.log('UXUPDATE_ORACLE filter ok');\nconsole.log('UXUPDATE_ORACLE done');\n",
35
+ "surface": "harness"
36
+ }
37
+ ],
38
+ "craftbookParams": {
39
+ "scope": "Move the search into the header next to the Orderboard title, set its placeholder to 'Search orders…', and keep the / keyboard shortcut and the list filtering working; see source/change-request.md."
40
+ }
41
+ },
42
+ "mocks": [],
43
+ "success": {
44
+ "summary": "The search input sits inside the header next to the title with the exact requested placeholder, the old bottom-of-page placement is gone, and the / shortcut plus the filter handler still work — with every fleet artifact present and honestly cited.",
45
+ "deliverables": [
46
+ {
47
+ "path": "{{task.dir}}/before.md",
48
+ "kind": "markdown-notes",
49
+ "artifact": true,
50
+ "minBytes": 500,
51
+ "checks": [
52
+ {
53
+ "kind": "contains",
54
+ "file": "{{task.dir}}/before.md",
55
+ "pattern": "^##\\s+Request[\\s\\S]*^##\\s+Current behavior[\\s\\S]*^##\\s+Surfaces involved",
56
+ "flags": "im",
57
+ "label": "before sections in order"
58
+ },
59
+ {
60
+ "kind": "citationsResolve",
61
+ "file": "{{task.dir}}/before.md",
62
+ "minCitations": 2,
63
+ "artifact": true
64
+ },
65
+ {
66
+ "kind": "contains",
67
+ "file": "{{task.dir}}/before.md",
68
+ "pattern": "index\\.html",
69
+ "label": "names the real page"
70
+ }
71
+ ]
72
+ },
73
+ {
74
+ "path": "{{task.dir}}/fix-notes.md",
75
+ "kind": "markdown-notes",
76
+ "artifact": true,
77
+ "minBytes": 700,
78
+ "checks": [
79
+ {
80
+ "kind": "contains",
81
+ "file": "{{task.dir}}/fix-notes.md",
82
+ "pattern": "^##\\s+Problem[\\s\\S]*^##\\s+Change[\\s\\S]*^##\\s+Files touched[\\s\\S]*^##\\s+Consistency notes[\\s\\S]*^##\\s+Risk[\\s\\S]*^##\\s+How to verify",
83
+ "flags": "im",
84
+ "label": "fix-notes sections in order"
85
+ },
86
+ {
87
+ "kind": "citationsResolve",
88
+ "file": "{{task.dir}}/fix-notes.md",
89
+ "minCitations": 2,
90
+ "artifact": true
91
+ }
92
+ ]
93
+ },
94
+ {
95
+ "path": "{{task.dir}}/validation.md",
96
+ "kind": "markdown-notes",
97
+ "artifact": true,
98
+ "minBytes": 500,
99
+ "checks": [
100
+ {
101
+ "kind": "contains",
102
+ "file": "{{task.dir}}/validation.md",
103
+ "pattern": "^##\\s+Before\\s*/\\s*after[\\s\\S]*^##\\s+What was exercised[\\s\\S]*^##\\s+Result",
104
+ "flags": "im",
105
+ "label": "validation sections in order"
106
+ }
107
+ ]
108
+ },
109
+ {
110
+ "path": "{{task.dir}}/review.md",
111
+ "kind": "markdown-report",
112
+ "artifact": true,
113
+ "minBytes": 400,
114
+ "checks": [
115
+ {
116
+ "kind": "contains",
117
+ "file": "{{task.dir}}/review.md",
118
+ "pattern": "Verdict:\\s*(?:PASS|REVISE)",
119
+ "flags": "i",
120
+ "label": "explicit reviewer verdict"
121
+ }
122
+ ]
123
+ }
124
+ ],
125
+ "checks": [
126
+ {
127
+ "kind": "notContains",
128
+ "file": "index.html",
129
+ "pattern": "placeholder=[\"']Filter orders[\"']",
130
+ "label": "the old bottom-of-page search placeholder is gone"
131
+ },
132
+ {
133
+ "kind": "htmlLint",
134
+ "file": "index.html"
135
+ },
136
+ {
137
+ "kind": "nodeScriptPasses",
138
+ "script": "tests/verify-ux-update.mjs",
139
+ "timeoutMs": 60000,
140
+ "requiredOutput": [
141
+ {
142
+ "pattern": "UXUPDATE_ORACLE placement ok",
143
+ "label": "search moved into the header next to the title"
144
+ },
145
+ {
146
+ "pattern": "UXUPDATE_ORACLE placeholder ok",
147
+ "label": "placeholder is exactly as requested"
148
+ },
149
+ {
150
+ "pattern": "UXUPDATE_ORACLE shortcut ok",
151
+ "label": "the / shortcut still focuses the search"
152
+ },
153
+ {
154
+ "pattern": "UXUPDATE_ORACLE filter ok",
155
+ "label": "the list filter is still wired"
156
+ }
157
+ ]
158
+ }
159
+ ],
160
+ "taskNotes": {
161
+ "minBytes": 120,
162
+ "checks": [
163
+ {
164
+ "kind": "contains",
165
+ "file": "task-notes.md",
166
+ "pattern": "\\bDONE\\b[\\s\\S]*(validation\\.md|fix-notes\\.md|before\\.md)",
167
+ "flags": "i",
168
+ "label": "DONE note names the deliverables"
169
+ }
170
+ ]
171
+ },
172
+ "taskGraph": {
173
+ "requireCraftbookTask": true,
174
+ "requireTerminalStep": true
175
+ },
176
+ "unchangedFixtures": [
177
+ "package.json",
178
+ "source/change-request.md"
179
+ ]
180
+ },
181
+ "rubric": {
182
+ "artifact": {
183
+ "path": "{{task.dir}}/fix-notes.md",
184
+ "kind": "markdown"
185
+ },
186
+ "axes": [
187
+ {
188
+ "name": "Request fidelity",
189
+ "description": "The delivered change is what was asked, judged as a user would: search in the header next to the title, the exact placeholder, nothing extra smuggled in."
190
+ },
191
+ {
192
+ "name": "Convention respect",
193
+ "description": "The edit reuses the page's existing structure, naming, and style patterns — the topbar's own layout — rather than inventing a new one-off style."
194
+ },
195
+ {
196
+ "name": "Behavior preservation with honest verification",
197
+ "description": "The / shortcut and the input filter still work after the move, and validation separates what was inspected in the code from what was actually exercised."
198
+ }
199
+ ]
200
+ },
201
+ "qualityFocus": [
202
+ "before/after grounded in real markup",
203
+ "existing behaviors preserved",
204
+ "enforced review loop"
205
+ ]
206
+ }
@@ -19,6 +19,9 @@
19
19
  "worker": {
20
20
  "name": "Fenna",
21
21
  "role": "Study coach"
22
+ },
23
+ "craftbookParams": {
24
+ "workPath": "tasks/eval"
22
25
  }
23
26
  },
24
27
  "mocks": [],
@@ -73,22 +76,26 @@
73
76
  "kind": "contains",
74
77
  "file": "tasks/eval/report.md",
75
78
  "pattern": "(?:^|\\n)#{1,3}\\s+\\S",
76
- "flags": "i"
79
+ "flags": "i",
80
+ "artifact": true
77
81
  },
78
82
  {
79
83
  "kind": "contains",
80
84
  "file": "tasks/eval/report.md",
81
85
  "pattern": "review|schedule|next",
82
86
  "flags": "i",
83
- "label": "follow-up scheduled"
87
+ "label": "follow-up scheduled",
88
+ "artifact": true
84
89
  },
85
90
  {
86
91
  "kind": "contains",
87
92
  "file": "tasks/eval/report.md",
88
93
  "pattern": "\\d",
89
- "label": "the evidence has numbers"
94
+ "label": "the evidence has numbers",
95
+ "artifact": true
90
96
  }
91
- ]
97
+ ],
98
+ "artifact": true
92
99
  }
93
100
  ]
94
101
  },
@@ -23,6 +23,9 @@
23
23
  "worker": {
24
24
  "name": "Wim",
25
25
  "role": "Gardener"
26
+ },
27
+ "craftbookParams": {
28
+ "workPath": "tasks/eval"
26
29
  }
27
30
  },
28
31
  "mocks": [],
@@ -38,54 +41,63 @@
38
41
  "kind": "contains",
39
42
  "file": "tasks/eval/report.md",
40
43
  "pattern": "(?:^|\\n)#{1,3}\\s+\\S",
41
- "flags": "i"
44
+ "flags": "i",
45
+ "artifact": true
42
46
  },
43
47
  {
44
48
  "kind": "contains",
45
49
  "file": "tasks/eval/report.md",
46
50
  "pattern": "North Bed",
47
- "label": "North Bed covered"
51
+ "label": "North Bed covered",
52
+ "artifact": true
48
53
  },
49
54
  {
50
55
  "kind": "contains",
51
56
  "file": "tasks/eval/report.md",
52
57
  "pattern": "Back Fence",
53
- "label": "Back Fence Bed covered"
58
+ "label": "Back Fence Bed covered",
59
+ "artifact": true
54
60
  },
55
61
  {
56
62
  "kind": "contains",
57
63
  "file": "tasks/eval/report.md",
58
64
  "pattern": "Herb Spiral",
59
- "label": "Herb Spiral covered"
65
+ "label": "Herb Spiral covered",
66
+ "artifact": true
60
67
  },
61
68
  {
62
69
  "kind": "contains",
63
70
  "file": "tasks/eval/report.md",
64
71
  "pattern": "Berry Corner",
65
- "label": "Berry Corner covered"
72
+ "label": "Berry Corner covered",
73
+ "artifact": true
66
74
  },
67
75
  {
68
76
  "kind": "contains",
69
77
  "file": "tasks/eval/report.md",
70
78
  "pattern": "yellow",
71
79
  "flags": "i",
72
- "label": "the reported yellow leaves are captured"
80
+ "label": "the reported yellow leaves are captured",
81
+ "artifact": true
73
82
  },
74
83
  {
75
84
  "kind": "contains",
76
85
  "file": "tasks/eval/report.md",
77
86
  "pattern": "zucchini",
78
87
  "flags": "i",
79
- "label": "the zucchini harvest is captured"
88
+ "label": "the zucchini harvest is captured",
89
+ "artifact": true
80
90
  },
81
91
  {
82
92
  "kind": "contains",
83
93
  "file": "tasks/eval/report.md",
84
94
  "pattern": "next week",
85
95
  "flags": "i",
86
- "label": "next week seeded"
96
+ "label": "next week seeded",
97
+ "artifact": true
87
98
  }
88
- ]
99
+ ],
100
+ "artifact": true
89
101
  }
90
102
  ],
91
103
  "checks": [
@@ -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
  },
@@ -94,22 +94,26 @@
94
94
  "kind": "contains",
95
95
  "file": "tasks/eval/report.md",
96
96
  "pattern": "(?:^|\\n)#{1,3}\\s+\\S",
97
- "flags": "i"
97
+ "flags": "i",
98
+ "artifact": true
98
99
  },
99
100
  {
100
101
  "kind": "contains",
101
102
  "file": "tasks/eval/report.md",
102
103
  "pattern": "March",
103
104
  "flags": "i",
104
- "label": "the empty March is acknowledged, not papered over"
105
+ "label": "the empty March is acknowledged, not papered over",
106
+ "artifact": true
105
107
  },
106
108
  {
107
109
  "kind": "judge",
108
110
  "file": "tasks/eval/report.md",
109
111
  "rubric": "The review has an emotional arc: a year's thread stated up front, carried through month sections that lean on the picks' captions, ending on a deliberately chosen closing image — and the photo-less March is named honestly and kindly.",
110
- "label": "the arc earns December"
112
+ "label": "the arc earns December",
113
+ "artifact": true
111
114
  }
112
- ]
115
+ ],
116
+ "artifact": true
113
117
  }
114
118
  ]
115
119
  },