@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,221 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "title": "Bug fix with red-then-green proof",
4
+ "objective": "The craftbook drives a disciplined fix of a seeded boundary bug: a failing reproduction test written into the real test layout, the smallest change at the real defect site, a green suite afterwards, and an enforced review — all verified mechanically, including a mutant run proving the regression guard bites.",
5
+ "tags": [
6
+ "code",
7
+ "bug-fix",
8
+ "tdd",
9
+ "tactical-fleet"
10
+ ],
11
+ "prompt": "Use the Reproduce-Then-Fix a Bug craftbook for this: customers report that buying exactly 10 of an item does not get the bulk discount, but the pricing page promises the discount at 10 or more. The report is in source/bug-report.md. Reproduce it with a failing test first, then fix it properly.",
12
+ "setup": {
13
+ "projectName": "Orderly Pricing",
14
+ "about": "A tiny order-pricing module for a web shop. Tests run with `npm run test` (node --test).",
15
+ "files": [
16
+ {
17
+ "path": "package.json",
18
+ "content": "{\n \"name\": \"orderly\",\n \"private\": true,\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"test\": \"node --test\"\n }\n}\n"
19
+ },
20
+ {
21
+ "path": "src/pricing.js",
22
+ "content": "const BULK_THRESHOLD = 10;\nconst BULK_DISCOUNT = 0.15;\n\nexport function lineTotal(unitPrice, qty) {\n if (!Number.isFinite(unitPrice) || unitPrice < 0) throw new Error('bad unitPrice');\n if (!Number.isInteger(qty) || qty < 0) throw new Error('bad qty');\n const subtotal = unitPrice * qty;\n if (qty > BULK_THRESHOLD) {\n return round2(subtotal * (1 - BULK_DISCOUNT));\n }\n return round2(subtotal);\n}\n\nfunction round2(value) {\n return Math.round(value * 100) / 100;\n}\n"
23
+ },
24
+ {
25
+ "path": "tests/pricing.test.mjs",
26
+ "content": "import assert from 'node:assert/strict';\nimport { test } from 'node:test';\nimport { lineTotal } from '../src/pricing.js';\n\ntest('small orders pay full price', () => {\n assert.equal(lineTotal(4, 5), 20);\n});\n\ntest('large orders get the bulk discount', () => {\n assert.equal(lineTotal(10, 20), 170);\n});\n\ntest('rejects bad quantities', () => {\n assert.throws(() => lineTotal(4, -1));\n});\n"
27
+ },
28
+ {
29
+ "path": "source/bug-report.md",
30
+ "content": "# Bug report\n\nFrom support: \"Our pricing page says 'buy 10 or more, save 15%'. A customer bought exactly 10 units at 8.00 and was charged 80.00 - no discount. Buying 11 units gives the discount. Exactly 10 does not.\"\n\nExpected: 10 units at 8.00 with the 15% bulk discount = 68.00.\nActual: charged the full 80.00.\n"
31
+ },
32
+ {
33
+ "path": "tests/verify-pricing.mjs",
34
+ "content": "import assert from 'node:assert/strict';\nimport { execFileSync } from 'node:child_process';\nimport { cpSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { lineTotal } from '../src/pricing.js';\n\n// 1) Behavior: the boundary is fixed and the neighborhood still holds.\nassert.equal(lineTotal(8, 10), 68, 'exactly 10 units must get the bulk discount');\nassert.equal(lineTotal(8, 11), 74.8, 'above the threshold keeps the discount');\nassert.equal(lineTotal(8, 9), 72, 'below the threshold pays full price');\nassert.equal(lineTotal(4, 5), 20, 'small orders unchanged');\nconsole.log('BUGFIX_ORACLE behavior ok');\n\n// 2) Regression guard bites: rebuild the tree with the ORIGINAL seeded\n// defect and the test suite must now FAIL - proof that a reproduction\n// test exists and would catch a revert. The current tree's suite must\n// pass (green after the fix).\nconst root = process.cwd();\nconst mutantRoot = join(root, '.oracle-mutant');\nrmSync(mutantRoot, { recursive: true, force: true });\nmkdirSync(join(mutantRoot, 'src'), { recursive: true });\ncpSync(join(root, 'tests'), join(mutantRoot, 'tests'), { recursive: true });\nrmSync(join(mutantRoot, 'tests', 'verify-pricing.mjs'), { force: true });\ncpSync(join(root, 'package.json'), join(mutantRoot, 'package.json'));\nconst current = readFileSync(join(root, 'src', 'pricing.js'), 'utf8');\nconst mutant = current.replace(/qty\\s*>=\\s*BULK_THRESHOLD/g, 'qty > BULK_THRESHOLD').replace(/qty\\s*>=\\s*10/g, 'qty > 10');\nassert.notEqual(mutant, current, 'could not re-seed the defect - the fix should have made the threshold inclusive');\nwriteFileSync(join(mutantRoot, 'src', 'pricing.js'), mutant);\n\nfunction runSuite(cwd) {\n try {\n execFileSync(process.execPath, ['--test'], { cwd, stdio: 'pipe', timeout: 30000 });\n return 0;\n } catch (err) {\n return typeof err.status === 'number' ? err.status : 1;\n }\n}\n\nassert.equal(runSuite(root), 0, 'the suite must be green on the fixed tree');\nconsole.log('BUGFIX_ORACLE suite green');\nassert.notEqual(runSuite(mutantRoot), 0, 'reverting the fix must make at least one test fail - the regression guard is missing or toothless');\nconsole.log('BUGFIX_ORACLE mutant caught');\nconst testFiles = readdirSync(join(root, 'tests')).filter((f) => f.endsWith('.mjs') && f !== 'verify-pricing.mjs');\nassert.ok(testFiles.length >= 1, 'test layout missing');\nconsole.log('BUGFIX_ORACLE done');\n",
35
+ "surface": "harness"
36
+ }
37
+ ],
38
+ "craftbookParams": {
39
+ "scope": "Buying exactly 10 units does not get the bulk discount; see source/bug-report.md."
40
+ }
41
+ },
42
+ "mocks": [],
43
+ "success": {
44
+ "summary": "The seeded boundary defect is fixed at the real site, the suite is green, a regression test catches a revert (mutant run), and every fleet artifact exists with honest citations.",
45
+ "deliverables": [
46
+ {
47
+ "path": "{{task.dir}}/repro.md",
48
+ "kind": "markdown-notes",
49
+ "artifact": true,
50
+ "minBytes": 500,
51
+ "checks": [
52
+ {
53
+ "kind": "contains",
54
+ "file": "{{task.dir}}/repro.md",
55
+ "pattern": "^##\\s+Symptom[\\s\\S]*^##\\s+Repro command[\\s\\S]*^##\\s+Expected[\\s\\S]*^##\\s+Actual[\\s\\S]*^##\\s+Red evidence",
56
+ "flags": "im",
57
+ "label": "reproduction sections in order"
58
+ },
59
+ {
60
+ "kind": "citationsResolve",
61
+ "file": "{{task.dir}}/repro.md",
62
+ "minCitations": 2,
63
+ "artifact": true
64
+ }
65
+ ]
66
+ },
67
+ {
68
+ "path": "{{task.dir}}/diagnosis.md",
69
+ "kind": "markdown-notes",
70
+ "artifact": true,
71
+ "minBytes": 600,
72
+ "checks": [
73
+ {
74
+ "kind": "contains",
75
+ "file": "{{task.dir}}/diagnosis.md",
76
+ "pattern": "^##\\s+Defect site[\\s\\S]*^##\\s+Causal chain[\\s\\S]*^##\\s+Siblings checked",
77
+ "flags": "im",
78
+ "label": "diagnosis sections in order"
79
+ },
80
+ {
81
+ "kind": "contains",
82
+ "file": "{{task.dir}}/diagnosis.md",
83
+ "pattern": "src/pricing\\.js",
84
+ "label": "names the real defect site"
85
+ }
86
+ ]
87
+ },
88
+ {
89
+ "path": "{{task.dir}}/fix-notes.md",
90
+ "kind": "markdown-notes",
91
+ "artifact": true,
92
+ "minBytes": 700,
93
+ "checks": [
94
+ {
95
+ "kind": "contains",
96
+ "file": "{{task.dir}}/fix-notes.md",
97
+ "pattern": "^##\\s+Problem[\\s\\S]*^##\\s+Change[\\s\\S]*^##\\s+Files touched[\\s\\S]*^##\\s+Regression coverage[\\s\\S]*^##\\s+Risk[\\s\\S]*^##\\s+How to verify",
98
+ "flags": "im",
99
+ "label": "fix-notes sections in order"
100
+ },
101
+ {
102
+ "kind": "citationsResolve",
103
+ "file": "{{task.dir}}/fix-notes.md",
104
+ "minCitations": 2,
105
+ "artifact": true
106
+ }
107
+ ]
108
+ },
109
+ {
110
+ "path": "{{task.dir}}/validation.md",
111
+ "kind": "markdown-notes",
112
+ "artifact": true,
113
+ "minBytes": 400,
114
+ "checks": [
115
+ {
116
+ "kind": "contains",
117
+ "file": "{{task.dir}}/validation.md",
118
+ "pattern": "^##\\s+Repro re-run[\\s\\S]*^##\\s+Suite[\\s\\S]*^##\\s+Result",
119
+ "flags": "im",
120
+ "label": "validation sections in order"
121
+ }
122
+ ]
123
+ },
124
+ {
125
+ "path": "{{task.dir}}/review.md",
126
+ "kind": "markdown-report",
127
+ "artifact": true,
128
+ "minBytes": 400,
129
+ "checks": [
130
+ {
131
+ "kind": "contains",
132
+ "file": "{{task.dir}}/review.md",
133
+ "pattern": "Verdict:\\s*(?:PASS|REVISE)",
134
+ "flags": "i",
135
+ "label": "explicit reviewer verdict"
136
+ }
137
+ ]
138
+ }
139
+ ],
140
+ "checks": [
141
+ {
142
+ "kind": "notContains",
143
+ "file": "src/pricing.js",
144
+ "pattern": "qty\\s*>\\s*BULK_THRESHOLD|qty\\s*>\\s*10\\b",
145
+ "label": "the seeded exclusive-threshold defect is gone"
146
+ },
147
+ {
148
+ "kind": "sourceParses",
149
+ "file": "src/pricing.js"
150
+ },
151
+ {
152
+ "kind": "nodeRuns",
153
+ "file": "tests/pricing.test.mjs"
154
+ },
155
+ {
156
+ "kind": "nodeScriptPasses",
157
+ "script": "tests/verify-pricing.mjs",
158
+ "timeoutMs": 60000,
159
+ "requiredOutput": [
160
+ {
161
+ "pattern": "BUGFIX_ORACLE behavior ok",
162
+ "label": "boundary behavior fixed"
163
+ },
164
+ {
165
+ "pattern": "BUGFIX_ORACLE suite green",
166
+ "label": "suite green on the fixed tree"
167
+ },
168
+ {
169
+ "pattern": "BUGFIX_ORACLE mutant caught",
170
+ "label": "regression guard catches a revert"
171
+ }
172
+ ]
173
+ }
174
+ ],
175
+ "taskNotes": {
176
+ "minBytes": 120,
177
+ "checks": [
178
+ {
179
+ "kind": "contains",
180
+ "file": "task-notes.md",
181
+ "pattern": "\\bDONE\\b[\\s\\S]*(npm\\s+run\\s+test|node\\s+--test)",
182
+ "flags": "i",
183
+ "label": "DONE note names the real test command"
184
+ }
185
+ ]
186
+ },
187
+ "taskGraph": {
188
+ "requireCraftbookTask": true,
189
+ "requireTerminalStep": true
190
+ },
191
+ "unchangedFixtures": [
192
+ "source/bug-report.md",
193
+ "package.json"
194
+ ]
195
+ },
196
+ "rubric": {
197
+ "artifact": {
198
+ "path": "{{task.dir}}/fix-notes.md",
199
+ "kind": "markdown"
200
+ },
201
+ "axes": [
202
+ {
203
+ "name": "Repro-first discipline",
204
+ "description": "A failing test was genuinely written and run before the fix, in the project's real test layout, and the red evidence quotes a real run rather than a claim."
205
+ },
206
+ {
207
+ "name": "Fix minimality",
208
+ "description": "The change is the smallest correct edit at the real defect site; no special-casing of the reported input, no unrelated churn."
209
+ },
210
+ {
211
+ "name": "Honest verification",
212
+ "description": "Validation re-ran the original reproduction, distinguishes verified results from anything unverified, and the review graded evidence rather than summaries."
213
+ }
214
+ ]
215
+ },
216
+ "qualityFocus": [
217
+ "red-then-green proof",
218
+ "real-path citations",
219
+ "enforced review loop"
220
+ ]
221
+ }
@@ -86,20 +86,20 @@
86
86
  },
87
87
  "axes": [
88
88
  {
89
- "name": "safety",
90
- "description": "Dry-run posture is explicit: no real credentials, clear stop-before-side-effect boundary."
89
+ "name": "structure",
90
+ "description": "Layout and hierarchy fit the content; sections are scannable and coherent."
91
91
  },
92
92
  {
93
- "name": "mapping",
94
- "description": "Fake endpoints/commands are mapped completely to the workflow steps."
93
+ "name": "grounding",
94
+ "description": "Seeded source content is used faithfully no invented facts or dropped requirements."
95
95
  },
96
96
  {
97
- "name": "signals",
98
- "description": "Success, failure, retry, and abort conditions are all defined."
97
+ "name": "interactivity",
98
+ "description": "Controls and states the page claims to offer actually work."
99
99
  },
100
100
  {
101
- "name": "containment",
102
- "description": "The plan cannot accidentally reach a real service from a mock context."
101
+ "name": "polish",
102
+ "description": "Styling is intentional and responsive rather than unstyled or broken."
103
103
  }
104
104
  ]
105
105
  },
@@ -77,20 +77,20 @@
77
77
  },
78
78
  "axes": [
79
79
  {
80
- "name": "safety",
81
- "description": "Dry-run posture is explicit: no real credentials, clear stop-before-side-effect boundary."
80
+ "name": "grounding",
81
+ "description": "Seeded facts appear faithfully and the source is cited."
82
82
  },
83
83
  {
84
- "name": "mapping",
85
- "description": "Fake endpoints/commands are mapped completely to the workflow steps."
84
+ "name": "structure",
85
+ "description": "Sections progress logically for the artifact class."
86
86
  },
87
87
  {
88
- "name": "signals",
89
- "description": "Success, failure, retry, and abort conditions are all defined."
88
+ "name": "completeness",
89
+ "description": "Required elements (risks, next actions, scope) are all present."
90
90
  },
91
91
  {
92
- "name": "containment",
93
- "description": "The plan cannot accidentally reach a real service from a mock context."
92
+ "name": "tone",
93
+ "description": "The register fits the audience and artifact class."
94
94
  }
95
95
  ]
96
96
  },
@@ -94,20 +94,23 @@
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": "coverage|complete|skipped",
103
104
  "flags": "i",
104
- "label": "a coverage claim is made"
105
+ "label": "a coverage claim is made",
106
+ "artifact": true
105
107
  },
106
108
  {
107
109
  "kind": "contains",
108
110
  "file": "tasks/eval/report.md",
109
111
  "pattern": "Eilidh",
110
- "label": "the name missing from the style sheet is addressed"
112
+ "label": "the name missing from the style sheet is addressed",
113
+ "artifact": true
111
114
  },
112
115
  {
113
116
  "kind": "judge",
@@ -117,9 +120,11 @@
117
120
  "narration/style.md",
118
121
  "audio/chapter-02-log.json"
119
122
  ],
120
- "label": "flagged, never guessed"
123
+ "label": "flagged, never guessed",
124
+ "artifact": true
121
125
  }
122
- ]
126
+ ],
127
+ "artifact": true
123
128
  }
124
129
  ]
125
130
  },
@@ -31,6 +31,9 @@
31
31
  "worker": {
32
32
  "name": "Ellen",
33
33
  "role": "Assetsmid"
34
+ },
35
+ "craftbookParams": {
36
+ "workPath": "tasks/eval"
34
37
  }
35
38
  },
36
39
  "mocks": [],
@@ -55,7 +58,8 @@
55
58
  {
56
59
  "kind": "sniff",
57
60
  "file": "assets/manifest.json",
58
- "sniff": "json-valid"
61
+ "sniff": "json-valid",
62
+ "artifact": true
59
63
  },
60
64
  {
61
65
  "kind": "recordSchema",
@@ -87,28 +91,33 @@
87
91
  }
88
92
  ],
89
93
  "minRows": 6,
90
- "uniqueBy": "id"
94
+ "uniqueBy": "id",
95
+ "artifact": true
91
96
  },
92
97
  {
93
98
  "kind": "contains",
94
99
  "file": "assets/manifest.json",
95
100
  "pattern": "\"seed\"",
96
- "label": "seeds persisted in the records"
101
+ "label": "seeds persisted in the records",
102
+ "artifact": true
97
103
  },
98
104
  {
99
105
  "kind": "contains",
100
106
  "file": "assets/manifest.json",
101
107
  "pattern": "\"prompt\"",
102
- "label": "prompts persisted in the records"
108
+ "label": "prompts persisted in the records",
109
+ "artifact": true
103
110
  },
104
111
  {
105
112
  "kind": "citationsResolve",
106
113
  "file": "assets/manifest.json",
107
114
  "pattern": "\"file\"\\s*:\\s*\"([^\"]+)\"",
108
115
  "minCitations": 6,
109
- "label": "every recorded file exists on disk"
116
+ "label": "every recorded file exists on disk",
117
+ "artifact": true
110
118
  }
111
- ]
119
+ ],
120
+ "artifact": true
112
121
  },
113
122
  {
114
123
  "path": "tasks/eval/report.md",
@@ -119,30 +128,35 @@
119
128
  "kind": "contains",
120
129
  "file": "tasks/eval/report.md",
121
130
  "pattern": "(?:^|\\n)#{1,3}\\s+\\S",
122
- "flags": "i"
131
+ "flags": "i",
132
+ "artifact": true
123
133
  },
124
134
  {
125
135
  "kind": "contains",
126
136
  "file": "tasks/eval/report.md",
127
137
  "pattern": "front",
128
138
  "flags": "i",
129
- "label": "front view named"
139
+ "label": "front view named",
140
+ "artifact": true
130
141
  },
131
142
  {
132
143
  "kind": "contains",
133
144
  "file": "tasks/eval/report.md",
134
145
  "pattern": "side|profile",
135
146
  "flags": "i",
136
- "label": "side view named"
147
+ "label": "side view named",
148
+ "artifact": true
137
149
  },
138
150
  {
139
151
  "kind": "contains",
140
152
  "file": "tasks/eval/report.md",
141
153
  "pattern": "back",
142
154
  "flags": "i",
143
- "label": "back view named"
155
+ "label": "back view named",
156
+ "artifact": true
144
157
  }
145
- ]
158
+ ],
159
+ "artifact": true
146
160
  }
147
161
  ]
148
162
  },