@bendyline/gilde 0.1.39 → 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 (434) hide show
  1. package/authoring/chat-models/muse-glimmer-30b-q4.json +3 -3
  2. package/authoring/chat-models/ornith-9b-q4.json +1 -1
  3. package/authoring/chat-models/ornith1.5-9b-q4.json +149 -0
  4. package/authoring/chat-models/qwen3.8-27b-iq1-s.json +190 -0
  5. package/authoring/chat-models/qwen3.8-27b-q2.json +189 -0
  6. package/authoring/gstack/overlays/investigate.json +1 -0
  7. package/authoring/gstack/overlays/qa-only.json +1 -0
  8. package/authoring/gstack/wave.json +12 -2
  9. package/authoring/tactical/books/accessibility-retrofit.json +188 -0
  10. package/authoring/tactical/books/apply-review-findings.json +189 -0
  11. package/authoring/tactical/books/bug-fix-tdd.json +237 -0
  12. package/authoring/tactical/books/ci-pipeline.json +168 -0
  13. package/authoring/tactical/books/codemod-sweep.json +182 -0
  14. package/authoring/tactical/books/dependency-upgrade.json +196 -0
  15. package/authoring/tactical/books/flaky-test-fix.json +238 -0
  16. package/authoring/tactical/books/hotfix-flow.json +187 -0
  17. package/authoring/tactical/books/perf-optimization.json +219 -0
  18. package/authoring/tactical/books/refactor-module.json +217 -0
  19. package/authoring/tactical/books/schema-migration.json +192 -0
  20. package/authoring/tactical/books/test-suite-backfill.json +172 -0
  21. package/authoring/tactical/books/type-safety-pass.json +185 -0
  22. package/authoring/tactical/books/ux-update.json +178 -0
  23. package/authoring/tactical/evals/accessibility-retrofit.json +230 -0
  24. package/authoring/tactical/evals/apply-review-findings.json +290 -0
  25. package/authoring/tactical/evals/bug-fix-tdd.json +221 -0
  26. package/authoring/tactical/evals/ci-pipeline.json +227 -0
  27. package/authoring/tactical/evals/codemod-sweep.json +252 -0
  28. package/authoring/tactical/evals/dependency-upgrade.json +235 -0
  29. package/authoring/tactical/evals/flaky-test-fix.json +239 -0
  30. package/authoring/tactical/evals/hotfix-flow.json +220 -0
  31. package/authoring/tactical/evals/perf-optimization.json +235 -0
  32. package/authoring/tactical/evals/refactor-module.json +241 -0
  33. package/authoring/tactical/evals/schema-migration.json +225 -0
  34. package/authoring/tactical/evals/test-suite-backfill.json +197 -0
  35. package/authoring/tactical/evals/type-safety-pass.json +221 -0
  36. package/authoring/tactical/evals/ux-update.json +206 -0
  37. package/authoring/tactical/wave.json +89 -0
  38. package/data/chat-models/de/deepseek-r1-8b-q4/manifest.json +56 -1
  39. package/data/chat-models/gl/glm-5.2-754b-q2/manifest.json +56 -0
  40. package/data/chat-models/gp/gpt-oss-120b-q4/manifest.json +73 -1
  41. package/data/chat-models/gp/gpt-oss-20b-q4/manifest.json +77 -1
  42. package/data/chat-models/index.json +1 -1
  43. package/data/chat-models/ll/llama3.2-3b-q4/manifest.json +3 -1
  44. package/data/chat-models/mi/mistral-7b-q4/manifest.json +54 -3
  45. package/data/chat-models/mi/mistral-medium-3.5-128b-q4/manifest.json +76 -1
  46. package/data/chat-models/mu/muse-glimmer-30b-q4/manifest.json +4 -3
  47. package/data/chat-models/mu/muse-glimmer-30b-q4/versions/1.0.2/manifest.json +20 -0
  48. package/data/chat-models/or/ornith-9b-q4/manifest.json +1 -1
  49. package/data/chat-models/or/ornith1.5-9b-q4/manifest.json +187 -0
  50. package/data/chat-models/or/ornith1.5-9b-q4/versions/1.0.0/manifest.json +53 -0
  51. package/data/chat-models/qw/qwen3.8-27b-iq1-s/manifest.json +195 -0
  52. package/data/chat-models/qw/qwen3.8-27b-iq1-s/versions/1.0.0/manifest.json +19 -0
  53. package/data/chat-models/qw/qwen3.8-27b-q2/manifest.json +194 -0
  54. package/data/chat-models/qw/qwen3.8-27b-q2/versions/1.0.0/manifest.json +19 -0
  55. package/data/craftbook-templates/a1/a11y-audit/manifest.json +1 -0
  56. package/data/craftbook-templates/ab/ab-test-readout/manifest.json +1 -0
  57. package/data/craftbook-templates/ac/accessibility-retrofit/manifest.json +6 -4
  58. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.0/craftbook.json +451 -0
  59. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.0/test.json +231 -0
  60. package/data/craftbook-templates/ad/ad-variations/manifest.json +1 -0
  61. package/data/craftbook-templates/al/album-curate/manifest.json +1 -0
  62. package/data/craftbook-templates/al/alert-rules/manifest.json +1 -0
  63. package/data/craftbook-templates/al/alt-text-pass/manifest.json +6 -1
  64. package/data/craftbook-templates/an/anniversary-cut/manifest.json +1 -0
  65. package/data/craftbook-templates/an/annotated-bibliography/manifest.json +1 -0
  66. package/data/craftbook-templates/an/annual-document-review/manifest.json +1 -0
  67. package/data/craftbook-templates/an/anomaly-scan/manifest.json +1 -0
  68. package/data/craftbook-templates/ap/api-contract-review/manifest.json +1 -0
  69. package/data/craftbook-templates/ap/apply-review-findings/art.json +12 -0
  70. package/data/craftbook-templates/ap/apply-review-findings/logo.webp +0 -0
  71. package/data/craftbook-templates/ap/apply-review-findings/manifest.json +23 -0
  72. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.0/craftbook.json +436 -0
  73. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.0/test.json +291 -0
  74. package/data/craftbook-templates/ar/artifact-integrity-review/manifest.json +1 -0
  75. package/data/craftbook-templates/au/audio-ad-spot/manifest.json +1 -0
  76. package/data/craftbook-templates/au/audio-highlight-reel/manifest.json +1 -0
  77. package/data/craftbook-templates/au/audiobook-master-pack/manifest.json +1 -0
  78. package/data/craftbook-templates/au/auth-flow/manifest.json +1 -0
  79. package/data/craftbook-templates/au/automation-recipe/manifest.json +1 -0
  80. package/data/craftbook-templates/ba/backup-routine/manifest.json +1 -0
  81. package/data/craftbook-templates/bl/blog-post/manifest.json +1 -0
  82. package/data/craftbook-templates/bo/board-deck/manifest.json +1 -0
  83. package/data/craftbook-templates/bo/board-game-web/manifest.json +1 -0
  84. package/data/craftbook-templates/bo/booking-automation/manifest.json +1 -0
  85. package/data/craftbook-templates/br/branding-website/manifest.json +1 -0
  86. package/data/craftbook-templates/br/broadcast-announcement/manifest.json +1 -0
  87. package/data/craftbook-templates/br/browser-qa-audit/manifest.json +6 -1
  88. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.5/craftbook.json +438 -0
  89. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.5/test.json +379 -0
  90. package/data/craftbook-templates/bu/bug-fix-tdd/manifest.json +4 -3
  91. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.0/craftbook.json +545 -0
  92. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.0/test.json +222 -0
  93. package/data/craftbook-templates/bu/build-loop/manifest.json +1 -0
  94. package/data/craftbook-templates/ca/calendar-brief/manifest.json +1 -0
  95. package/data/craftbook-templates/ca/canvas-generative-art/manifest.json +1 -0
  96. package/data/craftbook-templates/ca/careful-mode/manifest.json +1 -0
  97. package/data/craftbook-templates/ca/case-study/manifest.json +1 -0
  98. package/data/craftbook-templates/ca/case-study-writeup/manifest.json +1 -0
  99. package/data/craftbook-templates/ch/changelog-cut/manifest.json +6 -1
  100. package/data/craftbook-templates/ch/changelog-writeup/manifest.json +6 -1
  101. package/data/craftbook-templates/ch/chapter-narration-run/manifest.json +1 -0
  102. package/data/craftbook-templates/ch/chapter-weave/manifest.json +1 -0
  103. package/data/craftbook-templates/ch/character-sheet/manifest.json +1 -0
  104. package/data/craftbook-templates/ch/character-turnaround/manifest.json +1 -0
  105. package/data/craftbook-templates/ch/chart-pack/manifest.json +1 -0
  106. package/data/craftbook-templates/ch/chrome-extension/manifest.json +1 -0
  107. package/data/craftbook-templates/ci/ci-pipeline/manifest.json +6 -3
  108. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.0/craftbook.json +423 -0
  109. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.0/test.json +228 -0
  110. package/data/craftbook-templates/ci/citation-audit/manifest.json +1 -0
  111. package/data/craftbook-templates/cl/cli-tool/manifest.json +1 -0
  112. package/data/craftbook-templates/co/code-review/manifest.json +1 -0
  113. package/data/craftbook-templates/co/codebase-refactoring-review/manifest.json +1 -0
  114. package/data/craftbook-templates/co/codebase-ux-review/manifest.json +1 -0
  115. package/data/craftbook-templates/co/codemod-sweep/art.json +12 -0
  116. package/data/craftbook-templates/co/codemod-sweep/logo.webp +0 -0
  117. package/data/craftbook-templates/co/codemod-sweep/manifest.json +23 -0
  118. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.0/craftbook.json +441 -0
  119. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.0/test.json +253 -0
  120. package/data/craftbook-templates/co/cohort-analysis/manifest.json +1 -0
  121. package/data/craftbook-templates/co/company-research-brief/manifest.json +1 -0
  122. package/data/craftbook-templates/co/comparison-matrix/manifest.json +1 -0
  123. package/data/craftbook-templates/co/compat-check/manifest.json +1 -0
  124. package/data/craftbook-templates/co/competitive-analysis/manifest.json +1 -0
  125. package/data/craftbook-templates/co/comprehensive-codebase-review/art.json +12 -0
  126. package/data/craftbook-templates/co/comprehensive-codebase-review/logo.webp +0 -0
  127. package/data/craftbook-templates/co/comprehensive-codebase-review/manifest.json +27 -0
  128. package/data/craftbook-templates/co/comprehensive-codebase-review/versions/1.0.0/craftbook.json +337 -0
  129. package/data/craftbook-templates/co/comprehensive-codebase-review/versions/1.0.0/test.json +160 -0
  130. package/data/craftbook-templates/co/config-scaffold/manifest.json +1 -0
  131. package/data/craftbook-templates/co/content-accuracy-review/manifest.json +1 -0
  132. package/data/craftbook-templates/co/content-deck/manifest.json +1 -0
  133. package/data/craftbook-templates/co/contract-template/manifest.json +1 -0
  134. package/data/craftbook-templates/co/cookbook-layout/manifest.json +1 -0
  135. package/data/craftbook-templates/co/copy-review/manifest.json +1 -0
  136. package/data/craftbook-templates/co/corpus-email-digest/manifest.json +1 -0
  137. package/data/craftbook-templates/co/corpus-synthesis/manifest.json +1 -0
  138. package/data/craftbook-templates/co/cover-letter/manifest.json +1 -0
  139. package/data/craftbook-templates/cr/crm-update-batch/manifest.json +1 -0
  140. package/data/craftbook-templates/cr/cron-job/manifest.json +1 -0
  141. package/data/craftbook-templates/cr/crossword-forge/manifest.json +1 -0
  142. package/data/craftbook-templates/cs/csv-transformer/manifest.json +1 -0
  143. package/data/craftbook-templates/da/dashboard-spec/manifest.json +1 -0
  144. package/data/craftbook-templates/da/data-dictionary/manifest.json +1 -0
  145. package/data/craftbook-templates/da/data-export-migrate/manifest.json +1 -0
  146. package/data/craftbook-templates/da/data-join-merge/manifest.json +1 -0
  147. package/data/craftbook-templates/da/data-pipeline-etl/manifest.json +1 -0
  148. package/data/craftbook-templates/da/data-quality-audit/manifest.json +1 -0
  149. package/data/craftbook-templates/da/data-to-report/manifest.json +1 -0
  150. package/data/craftbook-templates/da/data-viz-page/manifest.json +1 -0
  151. package/data/craftbook-templates/da/dataset-clean/manifest.json +1 -0
  152. package/data/craftbook-templates/db/db-index-tuning/manifest.json +1 -0
  153. package/data/craftbook-templates/de/deep-security-review/manifest.json +1 -0
  154. package/data/craftbook-templates/de/dependency-audit/manifest.json +1 -0
  155. package/data/craftbook-templates/de/dependency-upgrade/art.json +12 -0
  156. package/data/craftbook-templates/de/dependency-upgrade/logo.webp +0 -0
  157. package/data/craftbook-templates/de/dependency-upgrade/manifest.json +23 -0
  158. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.0/craftbook.json +459 -0
  159. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.0/test.json +236 -0
  160. package/data/craftbook-templates/de/deploy-checklist/manifest.json +1 -0
  161. package/data/craftbook-templates/de/design-review/manifest.json +1 -0
  162. package/data/craftbook-templates/de/design-system-consultation/manifest.json +1 -0
  163. package/data/craftbook-templates/di/diagram-from-text/manifest.json +1 -0
  164. package/data/craftbook-templates/di/digest-from-feeds/manifest.json +1 -0
  165. package/data/craftbook-templates/do/doc-intake-pipeline/manifest.json +1 -0
  166. package/data/craftbook-templates/do/doc-rewrite/manifest.json +1 -0
  167. package/data/craftbook-templates/do/dockerize-app/manifest.json +1 -0
  168. package/data/craftbook-templates/do/docs-site/manifest.json +1 -0
  169. package/data/craftbook-templates/do/documentation-drift-review/manifest.json +1 -0
  170. package/data/craftbook-templates/dr/draft-social-post/manifest.json +1 -0
  171. package/data/craftbook-templates/dr/drive-wrap-up/manifest.json +1 -0
  172. package/data/craftbook-templates/du/due-diligence-brief/manifest.json +1 -0
  173. package/data/craftbook-templates/eb/ebook-compile/manifest.json +1 -0
  174. package/data/craftbook-templates/ed/edit-notes/manifest.json +1 -0
  175. package/data/craftbook-templates/em/email-sequence/manifest.json +1 -0
  176. package/data/craftbook-templates/em/email-template/manifest.json +1 -0
  177. package/data/craftbook-templates/en/engineering-retrospective/manifest.json +1 -0
  178. package/data/craftbook-templates/ep/episode-plan/manifest.json +1 -0
  179. package/data/craftbook-templates/es/escalation-playbook/manifest.json +1 -0
  180. package/data/craftbook-templates/ev/evidence-brief/manifest.json +1 -0
  181. package/data/craftbook-templates/ex/executive-level-review/manifest.json +1 -0
  182. package/data/craftbook-templates/ex/expense-categorize/manifest.json +1 -0
  183. package/data/craftbook-templates/fa/fact-check/manifest.json +1 -0
  184. package/data/craftbook-templates/fa/family-story-chapter/manifest.json +1 -0
  185. package/data/craftbook-templates/fa/faq-from-docs/manifest.json +1 -0
  186. package/data/craftbook-templates/fa/favicon-set/manifest.json +1 -0
  187. package/data/craftbook-templates/fe/feature-flag-release/manifest.json +6 -1
  188. package/data/craftbook-templates/fe/feature-flag-rollout/manifest.json +5 -1
  189. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.0/craftbook.json +203 -0
  190. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.0/test.json +165 -0
  191. package/data/craftbook-templates/fe/feedback-widget/manifest.json +1 -0
  192. package/data/craftbook-templates/fl/flaky-test-fix/art.json +12 -0
  193. package/data/craftbook-templates/fl/flaky-test-fix/logo.webp +0 -0
  194. package/data/craftbook-templates/fl/flaky-test-fix/manifest.json +24 -0
  195. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.0/craftbook.json +534 -0
  196. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.0/test.json +240 -0
  197. package/data/craftbook-templates/fo/folder-to-audio/manifest.json +1 -0
  198. package/data/craftbook-templates/fo/forecast-model/manifest.json +1 -0
  199. package/data/craftbook-templates/fo/form-fill-batch/manifest.json +1 -0
  200. package/data/craftbook-templates/fo/form-wizard/manifest.json +1 -0
  201. package/data/craftbook-templates/fr/freeze-scope/manifest.json +1 -0
  202. package/data/craftbook-templates/ga/game-with-screens/manifest.json +1 -0
  203. package/data/craftbook-templates/gl/glossary-build/manifest.json +1 -0
  204. package/data/craftbook-templates/gr/graphql-api/manifest.json +1 -0
  205. package/data/craftbook-templates/gr/grpc-service/manifest.json +1 -0
  206. package/data/craftbook-templates/ha/handbook-section/manifest.json +1 -0
  207. package/data/craftbook-templates/he/hero-image/manifest.json +1 -0
  208. package/data/craftbook-templates/ho/holiday-card-run/manifest.json +1 -0
  209. package/data/craftbook-templates/ho/hotfix-flow/manifest.json +6 -3
  210. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.0/craftbook.json +442 -0
  211. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.0/test.json +221 -0
  212. package/data/craftbook-templates/ht/html-arcade-game/manifest.json +1 -0
  213. package/data/craftbook-templates/ht/html-puzzle-game/manifest.json +1 -0
  214. package/data/craftbook-templates/ic/icon-pack/manifest.json +1 -0
  215. package/data/craftbook-templates/id/idea-office-hours/manifest.json +1 -0
  216. package/data/craftbook-templates/id/idle-clicker-game/manifest.json +1 -0
  217. package/data/craftbook-templates/im/image-batch-edit/manifest.json +1 -0
  218. package/data/craftbook-templates/im/image-dedup-cluster/manifest.json +1 -0
  219. package/data/craftbook-templates/im/image-palette-extract/manifest.json +1 -0
  220. package/data/craftbook-templates/im/image-seo-rename/manifest.json +1 -0
  221. package/data/craftbook-templates/im/image-set-index/manifest.json +1 -0
  222. package/data/craftbook-templates/in/inbox-triage/manifest.json +1 -0
  223. package/data/craftbook-templates/in/incident-comms-templates/manifest.json +1 -0
  224. package/data/craftbook-templates/in/incident-postmortem/manifest.json +1 -0
  225. package/data/craftbook-templates/in/insurance-inventory/manifest.json +1 -0
  226. package/data/craftbook-templates/in/interactive-quiz/manifest.json +1 -0
  227. package/data/craftbook-templates/in/investigate/manifest.json +5 -1
  228. package/data/craftbook-templates/in/investigate-root-cause/manifest.json +6 -1
  229. package/data/craftbook-templates/in/invitation-design/manifest.json +1 -0
  230. package/data/craftbook-templates/in/invoice-generator/manifest.json +1 -0
  231. package/data/craftbook-templates/in/invoice-run/manifest.json +1 -0
  232. package/data/craftbook-templates/index.json +1 -1
  233. package/data/craftbook-templates/it/item-intake/manifest.json +1 -0
  234. package/data/craftbook-templates/ju/juice-pass/manifest.json +1 -0
  235. package/data/craftbook-templates/kn/knowledge-base-article/manifest.json +1 -0
  236. package/data/craftbook-templates/kp/kpi-scorecard/manifest.json +1 -0
  237. package/data/craftbook-templates/la/landing-copy/manifest.json +1 -0
  238. package/data/craftbook-templates/la/landing-page/manifest.json +1 -0
  239. package/data/craftbook-templates/le/lead-enrichment/manifest.json +1 -0
  240. package/data/craftbook-templates/li/library-package/manifest.json +1 -0
  241. package/data/craftbook-templates/li/literature-review/manifest.json +1 -0
  242. package/data/craftbook-templates/li/live-browser-qa/manifest.json +6 -1
  243. package/data/craftbook-templates/lo/localize-content/manifest.json +1 -0
  244. package/data/craftbook-templates/lo/logo-set/manifest.json +1 -0
  245. package/data/craftbook-templates/ma/market-scan/manifest.json +1 -0
  246. package/data/craftbook-templates/me/meeting-minutes/manifest.json +1 -0
  247. package/data/craftbook-templates/me/meeting-notes-to-actions/manifest.json +1 -0
  248. package/data/craftbook-templates/me/meeting-prep-brief/manifest.json +1 -0
  249. package/data/craftbook-templates/me/meeting-summary-audio/manifest.json +1 -0
  250. package/data/craftbook-templates/me/memory-prompt-session/manifest.json +1 -0
  251. package/data/craftbook-templates/me/message-queue-consumer/manifest.json +1 -0
  252. package/data/craftbook-templates/mi/micro-game-jam/manifest.json +1 -0
  253. package/data/craftbook-templates/mo/mock-interview/manifest.json +1 -0
  254. package/data/craftbook-templates/mo/mod-scaffold/manifest.json +1 -0
  255. package/data/craftbook-templates/mo/monitor-and-alert/manifest.json +1 -0
  256. package/data/craftbook-templates/mo/month-close/manifest.json +1 -0
  257. package/data/craftbook-templates/mo/monthly-recording-review/manifest.json +1 -0
  258. package/data/craftbook-templates/mo/moodboard/manifest.json +1 -0
  259. package/data/craftbook-templates/mo/morning-brief/manifest.json +1 -0
  260. package/data/craftbook-templates/mo/morning-report/manifest.json +1 -0
  261. package/data/craftbook-templates/mu/music-metadata-tag/manifest.json +1 -0
  262. package/data/craftbook-templates/na/narrated-slideshow/manifest.json +1 -0
  263. package/data/craftbook-templates/ne/newsletter-issue/manifest.json +1 -0
  264. package/data/craftbook-templates/ni/nightly-fix-sweep/art.json +12 -0
  265. package/data/craftbook-templates/ni/nightly-fix-sweep/logo.webp +0 -0
  266. package/data/craftbook-templates/ni/nightly-fix-sweep/manifest.json +23 -0
  267. package/data/craftbook-templates/ni/nightly-fix-sweep/versions/1.0.0/craftbook.json +145 -0
  268. package/data/craftbook-templates/ni/nightly-fix-sweep/versions/1.0.0/test.json +121 -0
  269. package/data/craftbook-templates/no/notification-router/manifest.json +1 -0
  270. package/data/craftbook-templates/oc/ocr-extract/manifest.json +1 -0
  271. package/data/craftbook-templates/of/offer-compare/manifest.json +1 -0
  272. package/data/craftbook-templates/of/office-hours/manifest.json +1 -0
  273. package/data/craftbook-templates/on/onboarding-checklist/manifest.json +1 -0
  274. package/data/craftbook-templates/on/onboarding-flow/manifest.json +1 -0
  275. package/data/craftbook-templates/on/oncall-handoff/manifest.json +1 -0
  276. package/data/craftbook-templates/on/one-pager/manifest.json +1 -0
  277. package/data/craftbook-templates/op/ops-runbook/manifest.json +1 -0
  278. package/data/craftbook-templates/pa/page-spread/manifest.json +1 -0
  279. package/data/craftbook-templates/pa/parser-grammar/manifest.json +1 -0
  280. package/data/craftbook-templates/pe/perf-audit/manifest.json +1 -0
  281. package/data/craftbook-templates/pe/perf-audit/versions/1.1.0/craftbook.json +195 -0
  282. package/data/craftbook-templates/pe/perf-audit/versions/1.1.0/test.json +165 -0
  283. package/data/craftbook-templates/pe/perf-optimization/manifest.json +4 -3
  284. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.0/craftbook.json +511 -0
  285. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.0/test.json +236 -0
  286. package/data/craftbook-templates/pe/pest-diagnosis/manifest.json +1 -0
  287. package/data/craftbook-templates/ph/photo-cull/manifest.json +1 -0
  288. package/data/craftbook-templates/ph/physics-toy/manifest.json +1 -0
  289. package/data/craftbook-templates/pi/pitch-deck/manifest.json +1 -0
  290. package/data/craftbook-templates/pl/plan/manifest.json +1 -0
  291. package/data/craftbook-templates/pl/playtest-report/manifest.json +1 -0
  292. package/data/craftbook-templates/po/podcast-chaptering/manifest.json +1 -0
  293. package/data/craftbook-templates/po/portfolio-site/manifest.json +1 -0
  294. package/data/craftbook-templates/po/powerpoint-deck/manifest.json +1 -0
  295. package/data/craftbook-templates/pr/pr-security-review/manifest.json +1 -0
  296. package/data/craftbook-templates/pr/practice-exam/manifest.json +1 -0
  297. package/data/craftbook-templates/pr/practice-session/manifest.json +1 -0
  298. package/data/craftbook-templates/pr/pre-departure-countdown/manifest.json +1 -0
  299. package/data/craftbook-templates/pr/press-release/manifest.json +1 -0
  300. package/data/craftbook-templates/pr/price-tracker/manifest.json +1 -0
  301. package/data/craftbook-templates/pr/pricing-page/manifest.json +1 -0
  302. package/data/craftbook-templates/pr/product-descriptions/manifest.json +1 -0
  303. package/data/craftbook-templates/pr/proposal-sow/manifest.json +1 -0
  304. package/data/craftbook-templates/pu/pull-request-review/manifest.json +1 -0
  305. package/data/craftbook-templates/pu/puzzle-pack-layout/manifest.json +1 -0
  306. package/data/craftbook-templates/pw/pwa-offline/manifest.json +1 -0
  307. package/data/craftbook-templates/qa/qa/manifest.json +4 -1
  308. package/data/craftbook-templates/qu/quarterly-summary/manifest.json +1 -0
  309. package/data/craftbook-templates/re/reading-list/manifest.json +1 -0
  310. package/data/craftbook-templates/re/receipt-intake/manifest.json +1 -0
  311. package/data/craftbook-templates/re/receipt-ocr-ledger/manifest.json +1 -0
  312. package/data/craftbook-templates/re/reception-report/manifest.json +1 -0
  313. package/data/craftbook-templates/re/recipe-capture/manifest.json +1 -0
  314. package/data/craftbook-templates/re/record-a-relative/manifest.json +1 -0
  315. package/data/craftbook-templates/re/recurring-invoice-run/manifest.json +1 -0
  316. package/data/craftbook-templates/re/refactor-module/manifest.json +3 -2
  317. package/data/craftbook-templates/re/refactor-module/versions/1.0.4/craftbook.json +150 -0
  318. package/data/craftbook-templates/re/refactor-module/versions/1.0.4/test.json +95 -0
  319. package/data/craftbook-templates/re/refactor-module/versions/2.0.0/craftbook.json +509 -0
  320. package/data/craftbook-templates/re/refactor-module/versions/2.0.0/test.json +242 -0
  321. package/data/craftbook-templates/re/regex-builder/manifest.json +1 -0
  322. package/data/craftbook-templates/re/release-announcement/manifest.json +1 -0
  323. package/data/craftbook-templates/re/release-artifact-sanity-check/manifest.json +1 -0
  324. package/data/craftbook-templates/re/release-notes/manifest.json +6 -1
  325. package/data/craftbook-templates/re/release-notes/versions/1.0.3/craftbook.json +220 -0
  326. package/data/craftbook-templates/re/release-notes/versions/1.0.3/test.json +114 -0
  327. package/data/craftbook-templates/re/release-pipeline-ci/manifest.json +6 -1
  328. package/data/craftbook-templates/re/release-readiness-review/manifest.json +1 -0
  329. package/data/craftbook-templates/re/release-readiness-review/versions/1.1.0/craftbook.json +192 -0
  330. package/data/craftbook-templates/re/release-readiness-review/versions/1.1.0/test.json +113 -0
  331. package/data/craftbook-templates/re/reliability-review/manifest.json +1 -0
  332. package/data/craftbook-templates/re/report-pdf/manifest.json +1 -0
  333. package/data/craftbook-templates/re/research-report/manifest.json +1 -0
  334. package/data/craftbook-templates/re/research-to-document/manifest.json +1 -0
  335. package/data/craftbook-templates/re/rest-api/manifest.json +1 -0
  336. package/data/craftbook-templates/re/resume-cv/manifest.json +1 -0
  337. package/data/craftbook-templates/re/reviewer-loop/manifest.json +1 -0
  338. package/data/craftbook-templates/ro/rollback-plan/manifest.json +1 -0
  339. package/data/craftbook-templates/ro/root-cause-investigation/manifest.json +8 -1
  340. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.5/craftbook.json +433 -0
  341. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.5/test.json +157 -0
  342. package/data/craftbook-templates/ro/rough-cut-assembly/manifest.json +1 -0
  343. package/data/craftbook-templates/ru/runbook/manifest.json +1 -0
  344. package/data/craftbook-templates/sc/schema-migration/manifest.json +5 -4
  345. package/data/craftbook-templates/sc/schema-migration/versions/2.0.0/craftbook.json +459 -0
  346. package/data/craftbook-templates/sc/schema-migration/versions/2.0.0/test.json +226 -0
  347. package/data/craftbook-templates/sc/scrape-to-structured/manifest.json +1 -0
  348. package/data/craftbook-templates/sc/script-automation/manifest.json +1 -0
  349. package/data/craftbook-templates/sd/sdk-wrapper/manifest.json +1 -0
  350. package/data/craftbook-templates/se/seasonal-maintenance-sweep/manifest.json +1 -0
  351. package/data/craftbook-templates/se/security-architecture-review/manifest.json +1 -0
  352. package/data/craftbook-templates/se/seo-meta-pack/manifest.json +1 -0
  353. package/data/craftbook-templates/sh/ship/manifest.json +1 -0
  354. package/data/craftbook-templates/so/social-digest/manifest.json +1 -0
  355. package/data/craftbook-templates/so/social-thread/manifest.json +1 -0
  356. package/data/craftbook-templates/so/source-quality-audit/manifest.json +1 -0
  357. package/data/craftbook-templates/sp/spa-dashboard/manifest.json +1 -0
  358. package/data/craftbook-templates/sp/spec-authoring/manifest.json +1 -0
  359. package/data/craftbook-templates/sp/spec-doc/manifest.json +1 -0
  360. package/data/craftbook-templates/sp/spreadsheet-model/manifest.json +1 -0
  361. package/data/craftbook-templates/sp/sprite-sheet/manifest.json +1 -0
  362. package/data/craftbook-templates/sq/sql-analysis/manifest.json +1 -0
  363. package/data/craftbook-templates/st/standup-summary/manifest.json +1 -0
  364. package/data/craftbook-templates/st/state-machine/manifest.json +1 -0
  365. package/data/craftbook-templates/st/status-report/manifest.json +1 -0
  366. package/data/craftbook-templates/su/subscription-audit/manifest.json +1 -0
  367. package/data/craftbook-templates/su/subtitle-generator/manifest.json +1 -0
  368. package/data/craftbook-templates/su/summarize-long/manifest.json +1 -0
  369. package/data/craftbook-templates/su/survey-analysis/manifest.json +1 -0
  370. package/data/craftbook-templates/sv/svg-animation/manifest.json +1 -0
  371. package/data/craftbook-templates/ta/tailor-resume/manifest.json +1 -0
  372. package/data/craftbook-templates/te/technical-documentation/manifest.json +1 -0
  373. package/data/craftbook-templates/te/test-coverage-review/manifest.json +1 -0
  374. package/data/craftbook-templates/te/test-coverage-review/versions/1.2.0/craftbook.json +195 -0
  375. package/data/craftbook-templates/te/test-coverage-review/versions/1.2.0/test.json +116 -0
  376. package/data/craftbook-templates/te/test-suite-backfill/manifest.json +2 -2
  377. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.0/craftbook.json +428 -0
  378. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.0/test.json +198 -0
  379. package/data/craftbook-templates/th/thank-you-batch/manifest.json +1 -0
  380. package/data/craftbook-templates/th/thank-you-sweep/manifest.json +1 -0
  381. package/data/craftbook-templates/th/threat-model/manifest.json +1 -0
  382. package/data/craftbook-templates/th/thumbnail-generator/manifest.json +1 -0
  383. package/data/craftbook-templates/ti/tileset-batch/manifest.json +1 -0
  384. package/data/craftbook-templates/to/tone-rewrite/manifest.json +1 -0
  385. package/data/craftbook-templates/to/topic-explainer/manifest.json +1 -0
  386. package/data/craftbook-templates/tr/transcribe-and-shownotes/manifest.json +1 -0
  387. package/data/craftbook-templates/tr/transcribe-audio/manifest.json +1 -0
  388. package/data/craftbook-templates/tr/transcribe-index/manifest.json +1 -0
  389. package/data/craftbook-templates/tr/translate-content/manifest.json +1 -0
  390. package/data/craftbook-templates/ty/type-safety-pass/manifest.json +4 -3
  391. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.0/craftbook.json +428 -0
  392. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.0/test.json +222 -0
  393. package/data/craftbook-templates/ux/ux-update/art.json +12 -0
  394. package/data/craftbook-templates/ux/ux-update/logo.webp +0 -0
  395. package/data/craftbook-templates/ux/ux-update/manifest.json +22 -0
  396. package/data/craftbook-templates/ux/ux-update/versions/1.0.0/craftbook.json +439 -0
  397. package/data/craftbook-templates/ux/ux-update/versions/1.0.0/test.json +207 -0
  398. package/data/craftbook-templates/ve/version-bump/manifest.json +1 -0
  399. package/data/craftbook-templates/ve/version-bump/versions/1.1.0/craftbook.json +206 -0
  400. package/data/craftbook-templates/ve/version-bump/versions/1.1.0/test.json +95 -0
  401. package/data/craftbook-templates/vi/video-storyboard/manifest.json +1 -0
  402. package/data/craftbook-templates/vi/visit-prep/manifest.json +1 -0
  403. package/data/craftbook-templates/vo/voiceover-script/manifest.json +1 -0
  404. package/data/craftbook-templates/we/weak-spot-drill/manifest.json +1 -0
  405. package/data/craftbook-templates/we/web-app-crud/manifest.json +1 -0
  406. package/data/craftbook-templates/we/web-component/manifest.json +1 -0
  407. package/data/craftbook-templates/we/webhook-handler/manifest.json +1 -0
  408. package/data/craftbook-templates/we/week-plan/manifest.json +1 -0
  409. package/data/craftbook-templates/we/weekly-menu-plan/manifest.json +1 -0
  410. package/data/craftbook-templates/we/weekly-pipeline-review/manifest.json +1 -0
  411. package/data/craftbook-templates/we/weekly-review/manifest.json +1 -0
  412. package/data/craftbook-templates/we/weekly-walkthrough/manifest.json +1 -0
  413. package/data/craftbook-templates/wh/whitepaper/manifest.json +1 -0
  414. package/data/craftbook-templates/ye/year-in-review/manifest.json +1 -0
  415. package/data/craftbook-templates/yo/youtube-chapters-seo/manifest.json +1 -0
  416. package/data/gezel-templates/bo/boekwachter/versions/1.1.0/about.md +29 -0
  417. package/data/gezel-templates/bo/boekwachter/versions/1.1.0/manifest.json +16 -0
  418. package/data/gezel-templates/bu/builder/versions/1.5.0/about.md +34 -0
  419. package/data/gezel-templates/bu/builder/versions/1.5.0/manifest.json +16 -0
  420. package/data/gezel-templates/de/developer/versions/1.5.0/about.md +34 -0
  421. package/data/gezel-templates/de/developer/versions/1.5.0/manifest.json +21 -0
  422. package/data/gezel-templates/index.json +1 -1
  423. package/data/gezel-templates/re/reviewer/versions/1.4.0/about.md +49 -0
  424. package/data/gezel-templates/re/reviewer/versions/1.4.0/manifest.json +21 -0
  425. package/data/project-types/index.json +1 -1
  426. package/data/project-types/so/software-project/manifest.json +20 -0
  427. package/data/project-types/so/software-project/versions/1.0.0/about.md +3 -0
  428. package/data/project-types/so/software-project/versions/1.0.0/manifest.json +41 -0
  429. package/data/project-types/so/software-project/versions/1.0.0/mission.md +4 -0
  430. package/package.json +1 -1
  431. package/schemas/craftbook-doc.schema.json +248 -0
  432. package/schemas/craftbook-template-identity.schema.json +21 -0
  433. package/schemas/craftbook-template-version.schema.json +248 -0
  434. package/schemas/craftbook-test.schema.json +210 -0
@@ -0,0 +1,290 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "title": "Apply review findings with a reconciled ledger",
4
+ "objective": "The craftbook drives a real findings pass: three seeded review findings (unvalidated numeric input, a swallowed error, a misleading error message) read from an artifacts-drawer findings file, triaged against the current code, fixed at their actual sites, and verified per finding - with behavior probes proving each one genuinely closed and the neighborhood suite still green.",
5
+ "tags": [
6
+ "code",
7
+ "review-findings",
8
+ "bug-fix",
9
+ "tactical-fleet"
10
+ ],
11
+ "prompt": "Use the Apply Review Findings craftbook: last week's code review left three findings in the artifacts drawer at reviews/findings.json. Triage them against the current code, fix what is real at the real sites, and account for every finding.",
12
+ "setup": {
13
+ "projectName": "Order Intake",
14
+ "about": "A tiny order-intake library (quantity parsing, config loading, discounts). Tests run with `npm run test` (node --test).",
15
+ "files": [
16
+ {
17
+ "path": "package.json",
18
+ "content": "{\n \"name\": \"intake\",\n \"private\": true,\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"test\": \"node --test\"\n }\n}\n",
19
+ "modelInput": false
20
+ },
21
+ {
22
+ "path": "src/quantity.js",
23
+ "content": "export function parseQuantity(raw) {\n return parseInt(raw, 10);\n}\n\nexport function clampQuantity(qty, max) {\n return Math.min(qty, max);\n}\n"
24
+ },
25
+ {
26
+ "path": "src/config.js",
27
+ "content": "import { readFileSync } from 'node:fs';\n\nexport function loadConfig(path) {\n try {\n return JSON.parse(readFileSync(path, 'utf8'));\n } catch (err) {\n return {};\n }\n}\n"
28
+ },
29
+ {
30
+ "path": "src/discount.js",
31
+ "content": "export function applyDiscount(total, percent) {\n if (percent < 0 || percent > 100) {\n throw new Error('quantity out of range');\n }\n return Math.round(total * (1 - percent / 100) * 100) / 100;\n}\n"
32
+ },
33
+ {
34
+ "path": "tests/intake.test.mjs",
35
+ "content": "import assert from 'node:assert/strict';\nimport { test } from 'node:test';\nimport { parseQuantity } from '../src/quantity.js';\nimport { applyDiscount } from '../src/discount.js';\nimport { loadConfig } from '../src/config.js';\n\ntest('parseQuantity reads plain integers', () => {\n assert.equal(parseQuantity('3'), 3);\n assert.equal(parseQuantity('12'), 12);\n});\n\ntest('applyDiscount takes a percentage off', () => {\n assert.equal(applyDiscount(100, 10), 90);\n assert.equal(applyDiscount(80, 0), 80);\n});\n\ntest('loadConfig falls back to defaults for a missing file', () => {\n assert.deepEqual(loadConfig('no-such-config.json'), {});\n});\n",
36
+ "modelInput": false
37
+ },
38
+ {
39
+ "path": "reviews/findings.json",
40
+ "surface": "artifact",
41
+ "content": "[\n {\n \"id\": \"RV-1\",\n \"file\": \"src/quantity.js\",\n \"severity\": \"major\",\n \"title\": \"parseQuantity accepts invalid numeric input\",\n \"detail\": \"parseInt returns NaN for non-numeric input, and negative or zero values pass through unchecked, so downstream order math silently corrupts. parseQuantity must return only positive integers and throw a RangeError naming the rejected value for anything else.\",\n \"verify\": \"parseQuantity('abc'), parseQuantity('-2'), and parseQuantity('0') must throw; parseQuantity('3') must still return 3.\"\n },\n {\n \"id\": \"RV-2\",\n \"file\": \"src/config.js\",\n \"severity\": \"major\",\n \"title\": \"loadConfig swallows JSON syntax errors\",\n \"detail\": \"The catch returns {} for every failure, so a corrupt config file silently behaves like an empty one and a bad deploy ships. Only a missing file may fall back to {}; a parse failure must propagate to the caller.\",\n \"verify\": \"loadConfig on a file containing invalid JSON must throw; loadConfig on a missing path must still return {}.\"\n },\n {\n \"id\": \"RV-3\",\n \"file\": \"src/discount.js\",\n \"severity\": \"minor\",\n \"title\": \"applyDiscount raises a misleading error message\",\n \"detail\": \"An out-of-range percent raises 'quantity out of range', so support keeps chasing phantom quantity bugs. The message must describe the discount percent that was rejected.\",\n \"verify\": \"applyDiscount(100, 150) must throw with a message that mentions the discount or percent, not quantity.\"\n }\n]\n"
42
+ },
43
+ {
44
+ "path": "tests/verify-findings.mjs",
45
+ "surface": "harness",
46
+ "content": "import assert from 'node:assert/strict';\nimport { execFileSync } from 'node:child_process';\nimport { rmSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parseQuantity } from '../src/quantity.js';\nimport { loadConfig } from '../src/config.js';\nimport { applyDiscount } from '../src/discount.js';\n\nconst root = process.cwd();\n\n// RV-1: parseQuantity accepts only positive integers, and still parses them.\nassert.equal(parseQuantity('3'), 3, \"parseQuantity('3') must still return 3\");\nassert.equal(parseQuantity('12'), 12, \"parseQuantity('12') must still return 12\");\nassert.throws(() => parseQuantity('abc'), \"parseQuantity('abc') must throw\");\nassert.throws(() => parseQuantity('-2'), \"parseQuantity('-2') must throw\");\nassert.throws(() => parseQuantity('0'), \"parseQuantity('0') must throw\");\nconsole.log('FINDINGS_ORACLE rv1 closed');\n\n// RV-2: a corrupt config raises; a missing config still falls back to {}.\nconst corruptPath = join(root, '.oracle-corrupt-config.json');\nwriteFileSync(corruptPath, '{ not json');\nassert.throws(() => loadConfig(corruptPath), 'a corrupt config must raise, not vanish into defaults');\nrmSync(corruptPath, { force: true });\nassert.deepEqual(loadConfig(join(root, 'no-such-config.json')), {}, 'a missing config must still fall back to {}');\nconsole.log('FINDINGS_ORACLE rv2 closed');\n\n// RV-3: the out-of-range message describes the discount, not the quantity.\nlet threw = false;\nlet message = '';\ntry {\n applyDiscount(100, 150);\n} catch (err) {\n threw = true;\n message = String((err && err.message) || err);\n}\nassert.ok(threw, 'applyDiscount(100, 150) must throw');\nassert.match(message, /discount|percent/i, 'the error must describe the discount percent');\nassert.ok(!/quantity/i.test(message), 'the error must not blame quantity');\nassert.equal(applyDiscount(100, 10), 90, 'valid discounts must still work');\nassert.equal(applyDiscount(80, 0), 80, 'a zero discount must still be allowed');\nconsole.log('FINDINGS_ORACLE rv3 closed');\n\n// The neighborhood suite stays green after the findings pass.\nexecFileSync(process.execPath, ['--test'], { cwd: root, stdio: 'pipe', timeout: 30000 });\nconsole.log('FINDINGS_ORACLE suite green');\nconsole.log('FINDINGS_ORACLE done');\n"
47
+ }
48
+ ],
49
+ "craftbookParams": {
50
+ "workPath": "tasks/eval",
51
+ "findingsPath": "reviews/findings.json"
52
+ }
53
+ },
54
+ "success": {
55
+ "summary": "All three seeded findings are genuinely closed at their real sites (validated quantity input, propagating config parse errors, an honest discount message), the neighborhood tests stay green, and the finding ids reconcile across triage, fix notes, and verification.",
56
+ "deliverables": [
57
+ {
58
+ "path": "tasks/eval/triage.md",
59
+ "kind": "markdown-notes",
60
+ "artifact": true,
61
+ "minBytes": 600,
62
+ "checks": [
63
+ {
64
+ "kind": "contains",
65
+ "file": "tasks/eval/triage.md",
66
+ "pattern": "^##\\s+Findings read[\\s\\S]*^##\\s+Will fix[\\s\\S]*^##\\s+Deferred[\\s\\S]*^##\\s+Clusters",
67
+ "flags": "im",
68
+ "label": "triage sections in order"
69
+ },
70
+ {
71
+ "kind": "contains",
72
+ "file": "tasks/eval/triage.md",
73
+ "pattern": "\\bRV-1\\b",
74
+ "label": "finding RV-1 triaged"
75
+ },
76
+ {
77
+ "kind": "contains",
78
+ "file": "tasks/eval/triage.md",
79
+ "pattern": "\\bRV-2\\b",
80
+ "label": "finding RV-2 triaged"
81
+ },
82
+ {
83
+ "kind": "contains",
84
+ "file": "tasks/eval/triage.md",
85
+ "pattern": "\\bRV-3\\b",
86
+ "label": "finding RV-3 triaged"
87
+ },
88
+ {
89
+ "kind": "citationsResolve",
90
+ "file": "tasks/eval/triage.md",
91
+ "minCitations": 2,
92
+ "artifact": true
93
+ }
94
+ ]
95
+ },
96
+ {
97
+ "path": "tasks/eval/fix-notes.md",
98
+ "kind": "markdown-notes",
99
+ "artifact": true,
100
+ "minBytes": 700,
101
+ "checks": [
102
+ {
103
+ "kind": "contains",
104
+ "file": "tasks/eval/fix-notes.md",
105
+ "pattern": "^##\\s+Problem[\\s\\S]*^##\\s+Change[\\s\\S]*^##\\s+Files touched[\\s\\S]*^##\\s+Per-finding disposition[\\s\\S]*^##\\s+Risk[\\s\\S]*^##\\s+How to verify",
106
+ "flags": "im",
107
+ "label": "fix-notes sections in order"
108
+ },
109
+ {
110
+ "kind": "contains",
111
+ "file": "tasks/eval/fix-notes.md",
112
+ "pattern": "\\bRV-1\\b",
113
+ "label": "disposition for RV-1"
114
+ },
115
+ {
116
+ "kind": "contains",
117
+ "file": "tasks/eval/fix-notes.md",
118
+ "pattern": "\\bRV-2\\b",
119
+ "label": "disposition for RV-2"
120
+ },
121
+ {
122
+ "kind": "contains",
123
+ "file": "tasks/eval/fix-notes.md",
124
+ "pattern": "\\bRV-3\\b",
125
+ "label": "disposition for RV-3"
126
+ },
127
+ {
128
+ "kind": "citationsResolve",
129
+ "file": "tasks/eval/fix-notes.md",
130
+ "minCitations": 2,
131
+ "artifact": true
132
+ }
133
+ ]
134
+ },
135
+ {
136
+ "path": "tasks/eval/validation.md",
137
+ "kind": "markdown-notes",
138
+ "artifact": true,
139
+ "minBytes": 450,
140
+ "checks": [
141
+ {
142
+ "kind": "contains",
143
+ "file": "tasks/eval/validation.md",
144
+ "pattern": "^##\\s+Per-finding verification[\\s\\S]*^##\\s+Result",
145
+ "flags": "im",
146
+ "label": "validation sections in order"
147
+ },
148
+ {
149
+ "kind": "contains",
150
+ "file": "tasks/eval/validation.md",
151
+ "pattern": "\\bRV-1\\b",
152
+ "label": "verification for RV-1"
153
+ },
154
+ {
155
+ "kind": "contains",
156
+ "file": "tasks/eval/validation.md",
157
+ "pattern": "\\bRV-2\\b",
158
+ "label": "verification for RV-2"
159
+ },
160
+ {
161
+ "kind": "contains",
162
+ "file": "tasks/eval/validation.md",
163
+ "pattern": "\\bRV-3\\b",
164
+ "label": "verification for RV-3"
165
+ },
166
+ {
167
+ "kind": "citationsResolve",
168
+ "file": "tasks/eval/validation.md",
169
+ "minCitations": 2,
170
+ "artifact": true
171
+ }
172
+ ]
173
+ },
174
+ {
175
+ "path": "tasks/eval/review.md",
176
+ "kind": "markdown-report",
177
+ "artifact": true,
178
+ "minBytes": 400,
179
+ "checks": [
180
+ {
181
+ "kind": "contains",
182
+ "file": "tasks/eval/review.md",
183
+ "pattern": "Verdict:\\s*(?:PASS|REVISE)",
184
+ "flags": "i",
185
+ "label": "explicit reviewer verdict"
186
+ }
187
+ ]
188
+ }
189
+ ],
190
+ "checks": [
191
+ {
192
+ "kind": "notContains",
193
+ "file": "src/discount.js",
194
+ "pattern": "quantity out of range",
195
+ "label": "the misleading discount message is gone (RV-3)"
196
+ },
197
+ {
198
+ "kind": "notContains",
199
+ "file": "src/config.js",
200
+ "pattern": "catch\\s*(?:\\([^)]*\\))?\\s*\\{\\s*return\\s*\\{\\s*\\}",
201
+ "label": "the blanket error swallow is gone (RV-2)"
202
+ },
203
+ {
204
+ "kind": "sourceParses",
205
+ "file": "src/quantity.js"
206
+ },
207
+ {
208
+ "kind": "sourceParses",
209
+ "file": "src/config.js"
210
+ },
211
+ {
212
+ "kind": "sourceParses",
213
+ "file": "src/discount.js"
214
+ },
215
+ {
216
+ "kind": "nodeRuns",
217
+ "file": "tests/intake.test.mjs",
218
+ "timeoutMs": 30000
219
+ },
220
+ {
221
+ "kind": "nodeScriptPasses",
222
+ "script": "tests/verify-findings.mjs",
223
+ "timeoutMs": 60000,
224
+ "requiredOutput": [
225
+ {
226
+ "pattern": "FINDINGS_ORACLE rv1 closed",
227
+ "label": "invalid quantities are rejected (RV-1)"
228
+ },
229
+ {
230
+ "pattern": "FINDINGS_ORACLE rv2 closed",
231
+ "label": "corrupt configs raise, missing configs default (RV-2)"
232
+ },
233
+ {
234
+ "pattern": "FINDINGS_ORACLE rv3 closed",
235
+ "label": "the discount error names the discount (RV-3)"
236
+ },
237
+ {
238
+ "pattern": "FINDINGS_ORACLE suite green",
239
+ "label": "the neighborhood suite stays green"
240
+ }
241
+ ]
242
+ }
243
+ ],
244
+ "taskNotes": {
245
+ "minBytes": 120,
246
+ "checks": [
247
+ {
248
+ "kind": "contains",
249
+ "file": "task-notes.md",
250
+ "pattern": "\\bDONE\\b[\\s\\S]*validation\\.md",
251
+ "flags": "i",
252
+ "label": "DONE note names the validation deliverable"
253
+ }
254
+ ]
255
+ },
256
+ "taskGraph": {
257
+ "requireCraftbookTask": true,
258
+ "requireTerminalStep": true
259
+ },
260
+ "unchangedFixtures": [
261
+ "package.json",
262
+ "tests/intake.test.mjs"
263
+ ]
264
+ },
265
+ "rubric": {
266
+ "artifact": {
267
+ "path": "tasks/eval/fix-notes.md",
268
+ "kind": "markdown"
269
+ },
270
+ "axes": [
271
+ {
272
+ "name": "Triage honesty",
273
+ "description": "Every finding is judged against the code as it stands, with a defensible category and no invented or dropped findings."
274
+ },
275
+ {
276
+ "name": "Real closure",
277
+ "description": "Each fix lands at the actual cited site and genuinely resolves what the finding describes - validation added, errors propagated, messages made truthful - with the smallest correct change."
278
+ },
279
+ {
280
+ "name": "Ledger discipline",
281
+ "description": "The same finding ids flow through triage, fix notes, and verification with consistent outcomes, and verification honestly separates what was run from what was only read."
282
+ }
283
+ ]
284
+ },
285
+ "qualityFocus": [
286
+ "per-finding accountability",
287
+ "smallest correct change",
288
+ "honest verification"
289
+ ]
290
+ }
@@ -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
+ "surface": "harness",
35
+ "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"
36
+ }
37
+ ],
38
+ "craftbookParams": {
39
+ "workPath": "tasks/eval",
40
+ "scope": "Buying exactly 10 units does not get the bulk discount; see source/bug-report.md."
41
+ }
42
+ },
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": "tasks/eval/repro.md",
48
+ "kind": "markdown-notes",
49
+ "artifact": true,
50
+ "minBytes": 500,
51
+ "checks": [
52
+ {
53
+ "kind": "contains",
54
+ "file": "tasks/eval/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": "tasks/eval/repro.md",
62
+ "minCitations": 2,
63
+ "artifact": true
64
+ }
65
+ ]
66
+ },
67
+ {
68
+ "path": "tasks/eval/diagnosis.md",
69
+ "kind": "markdown-notes",
70
+ "artifact": true,
71
+ "minBytes": 600,
72
+ "checks": [
73
+ {
74
+ "kind": "contains",
75
+ "file": "tasks/eval/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": "tasks/eval/diagnosis.md",
83
+ "pattern": "src/pricing\\.js",
84
+ "label": "names the real defect site"
85
+ }
86
+ ]
87
+ },
88
+ {
89
+ "path": "tasks/eval/fix-notes.md",
90
+ "kind": "markdown-notes",
91
+ "artifact": true,
92
+ "minBytes": 700,
93
+ "checks": [
94
+ {
95
+ "kind": "contains",
96
+ "file": "tasks/eval/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": "tasks/eval/fix-notes.md",
104
+ "minCitations": 2,
105
+ "artifact": true
106
+ }
107
+ ]
108
+ },
109
+ {
110
+ "path": "tasks/eval/validation.md",
111
+ "kind": "markdown-notes",
112
+ "artifact": true,
113
+ "minBytes": 400,
114
+ "checks": [
115
+ {
116
+ "kind": "contains",
117
+ "file": "tasks/eval/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": "tasks/eval/review.md",
126
+ "kind": "markdown-report",
127
+ "artifact": true,
128
+ "minBytes": 400,
129
+ "checks": [
130
+ {
131
+ "kind": "contains",
132
+ "file": "tasks/eval/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": "tasks/eval/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
+ }