@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,236 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "title": "Measured near-linear fix for a quadratic hot path",
4
+ "objective": "The craftbook drives a measured optimization of a seeded O(n^2) duplicate finder: baseline numbers recorded with their method, one bottleneck fixed at the real site, the same measurement re-run to prove the gain, and an enforced review — verified mechanically via a deterministic instrumented op-count budget, reference-equal results, and a green-suite run.",
5
+ "tags": [
6
+ "code",
7
+ "performance",
8
+ "tactical-fleet"
9
+ ],
10
+ "prompt": "Use the Targeted Performance Fix craftbook for this: support says importing a 200-row sheet crawls, and profiling points at findDuplicates - a 200-item list burns about 40,000 comparisons. The brief is in source/perf-brief.md. Get findDuplicates near-linear without changing its results.",
11
+ "setup": {
12
+ "projectName": "Sheet Importer",
13
+ "about": "A tiny sheet-import module with an instrumented duplicate finder. Tests run with `npm run test` (node --test).",
14
+ "files": [
15
+ {
16
+ "path": "package.json",
17
+ "content": "{\n \"name\": \"sheet-importer\",\n \"private\": true,\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"test\": \"node --test\"\n }\n}\n"
18
+ },
19
+ {
20
+ "path": "src/instrument.js",
21
+ "content": "let comparisons = 0;\n\nexport function countComparison() {\n comparisons += 1;\n}\n\nexport function comparisonCount() {\n return comparisons;\n}\n\nexport function resetComparisons() {\n comparisons = 0;\n}\n"
22
+ },
23
+ {
24
+ "path": "src/find-duplicates.js",
25
+ "content": "import { countComparison } from './instrument.js';\n\nexport function findDuplicates(items) {\n const duplicates = [];\n for (let i = 0; i < items.length; i += 1) {\n let count = 0;\n for (let j = 0; j < items.length; j += 1) {\n countComparison();\n if (items[j] === items[i]) count += 1;\n }\n if (count > 1 && !duplicates.includes(items[i])) duplicates.push(items[i]);\n }\n return duplicates;\n}\n"
26
+ },
27
+ {
28
+ "path": "tests/duplicates.test.mjs",
29
+ "content": "import assert from 'node:assert/strict';\nimport { test } from 'node:test';\nimport { findDuplicates } from '../src/find-duplicates.js';\n\ntest('reports each duplicate once, in first-appearance order', () => {\n assert.deepEqual(findDuplicates(['a', 'b', 'a', 'c', 'b']), ['a', 'b']);\n});\n\ntest('returns empty for unique lists', () => {\n assert.deepEqual(findDuplicates(['x', 'y', 'z']), []);\n});\n\ntest('order pins to first appearance, not second occurrence', () => {\n assert.deepEqual(findDuplicates(['a', 'b', 'b', 'a']), ['a', 'b']);\n});\n"
30
+ },
31
+ {
32
+ "path": "source/perf-brief.md",
33
+ "content": "# Performance brief\n\nSupport reports that importing a 200-row sheet crawls. Profiling points at `findDuplicates` in src/find-duplicates.js: for a 200-item list it performs about 40,000 instrumented comparisons (200 x 200 full rescans). The counter lives in src/instrument.js - `comparisonCount()` reads it, `resetComparisons()` clears it.\n\nTarget: get `findDuplicates` near-linear - well under 2,000 instrumented comparisons for a 200-item list - WITHOUT changing its results. Each duplicated value is reported once, in order of FIRST appearance.\n\nRules:\n\n- src/instrument.js is measurement infrastructure; leave it exactly as it is.\n- Keep the measurement honest: keep calling `countComparison()` for every equality comparison the new implementation still performs. Deleting instrumentation instead of deleting work is measurement theater.\n- Measure with a repeatable command: a small script that builds a 200-item list, calls `findDuplicates`, and prints `comparisonCount()`.\n"
34
+ },
35
+ {
36
+ "path": "tests/verify-perf.mjs",
37
+ "content": "import assert from 'node:assert/strict';\nimport { execFileSync } from 'node:child_process';\nimport { findDuplicates } from '../src/find-duplicates.js';\nimport { comparisonCount, resetComparisons } from '../src/instrument.js';\n\n// Independent reference: each duplicated value once, first-appearance order.\nfunction referenceDuplicates(items) {\n const counts = new Map();\n for (const item of items) counts.set(item, (counts.get(item) ?? 0) + 1);\n const out = [];\n const added = new Set();\n for (const item of items) {\n if ((counts.get(item) ?? 0) > 1 && !added.has(item)) {\n added.add(item);\n out.push(item);\n }\n }\n return out;\n}\n\n// 1) Results identical to reference on small pinned cases.\nassert.deepEqual(findDuplicates(['a', 'b', 'a', 'c', 'b']), ['a', 'b']);\nassert.deepEqual(findDuplicates([]), []);\nassert.deepEqual(findDuplicates(['a', 'b', 'b', 'a']), ['a', 'b']);\n\n// 2) Deterministic 200-item workload: results equal reference AND the\n// instrumented op-count is under the stated budget (seeded code: 40000).\nconst items = [];\nfor (let i = 0; i < 200; i += 1) items.push('v' + ((i * 7) % 149));\nresetComparisons();\nconst result = findDuplicates(items);\nassert.deepEqual(result, referenceDuplicates(items), 'results changed - speed that changes answers is a bug');\nconsole.log('PERF_OPTIMIZATION_ORACLE results ok');\nconst ops = comparisonCount();\nassert.ok(\n ops <= 2000,\n 'findDuplicates on 200 items performed ' + ops + ' instrumented comparisons - the budget is 2000 and the seeded code did 40000',\n);\nconsole.log('PERF_OPTIMIZATION_ORACLE ops ' + ops + ' within budget');\n\n// 3) The whole suite is green on the optimized tree (real run).\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}\nassert.equal(runSuite(process.cwd()), 0, 'the suite must be green on the optimized tree');\nconsole.log('PERF_OPTIMIZATION_ORACLE suite green');\nconsole.log('PERF_OPTIMIZATION_ORACLE done');\n",
38
+ "surface": "harness"
39
+ }
40
+ ],
41
+ "craftbookParams": {
42
+ "workPath": "tasks/eval",
43
+ "scope": "findDuplicates in src/find-duplicates.js does about 40,000 instrumented comparisons for a 200-item list; get it near-linear (well under 2,000 comparisons) without changing its results. See source/perf-brief.md."
44
+ }
45
+ },
46
+ "mocks": [],
47
+ "success": {
48
+ "summary": "The quadratic rescan is gone, the instrumented op-count for 200 items is under budget, results are identical to the reference on a deterministic workload, the suite is green on a real run, and every fleet artifact exists with honest numbers and citations.",
49
+ "deliverables": [
50
+ {
51
+ "path": "tasks/eval/baseline.md",
52
+ "kind": "markdown-notes",
53
+ "artifact": true,
54
+ "minBytes": 500,
55
+ "checks": [
56
+ {
57
+ "kind": "contains",
58
+ "file": "tasks/eval/baseline.md",
59
+ "pattern": "^##\\s+Current behavior[\\s\\S]*^##\\s+Measurements[\\s\\S]*^##\\s+Guardrail",
60
+ "flags": "im",
61
+ "label": "baseline sections in order"
62
+ },
63
+ {
64
+ "kind": "contains",
65
+ "file": "tasks/eval/baseline.md",
66
+ "pattern": "^##\\s+Measurements[\\s\\S]*\\d",
67
+ "flags": "im",
68
+ "label": "baseline numbers recorded"
69
+ },
70
+ {
71
+ "kind": "citationsResolve",
72
+ "file": "tasks/eval/baseline.md",
73
+ "minCitations": 2,
74
+ "artifact": true
75
+ }
76
+ ]
77
+ },
78
+ {
79
+ "path": "tasks/eval/plan.md",
80
+ "kind": "markdown-notes",
81
+ "artifact": true,
82
+ "minBytes": 500,
83
+ "checks": [
84
+ {
85
+ "kind": "contains",
86
+ "file": "tasks/eval/plan.md",
87
+ "pattern": "^##\\s+Target[\\s\\S]*^##\\s+Stages[\\s\\S]*^##\\s+Acceptance criteria",
88
+ "flags": "im",
89
+ "label": "plan sections in order"
90
+ },
91
+ {
92
+ "kind": "citationsResolve",
93
+ "file": "tasks/eval/plan.md",
94
+ "minCitations": 2,
95
+ "artifact": true
96
+ }
97
+ ]
98
+ },
99
+ {
100
+ "path": "tasks/eval/change-notes.md",
101
+ "kind": "markdown-notes",
102
+ "artifact": true,
103
+ "minBytes": 600,
104
+ "checks": [
105
+ {
106
+ "kind": "contains",
107
+ "file": "tasks/eval/change-notes.md",
108
+ "pattern": "^##\\s+Stages executed[\\s\\S]*^##\\s+Files touched[\\s\\S]*^##\\s+Deviations from plan",
109
+ "flags": "im",
110
+ "label": "change-notes sections in order"
111
+ },
112
+ {
113
+ "kind": "citationsResolve",
114
+ "file": "tasks/eval/change-notes.md",
115
+ "minCitations": 2,
116
+ "artifact": true
117
+ }
118
+ ]
119
+ },
120
+ {
121
+ "path": "tasks/eval/verification.md",
122
+ "kind": "markdown-notes",
123
+ "artifact": true,
124
+ "minBytes": 400,
125
+ "checks": [
126
+ {
127
+ "kind": "contains",
128
+ "file": "tasks/eval/verification.md",
129
+ "pattern": "^##\\s+Before\\s*/\\s*after[\\s\\S]*^##\\s+Suite[\\s\\S]*^##\\s+Result",
130
+ "flags": "im",
131
+ "label": "verification sections in order"
132
+ },
133
+ {
134
+ "kind": "contains",
135
+ "file": "tasks/eval/verification.md",
136
+ "pattern": "^##\\s+Before\\s*/\\s*after[\\s\\S]*\\d",
137
+ "flags": "im",
138
+ "label": "both numbers quoted"
139
+ }
140
+ ]
141
+ },
142
+ {
143
+ "path": "tasks/eval/review.md",
144
+ "kind": "markdown-report",
145
+ "artifact": true,
146
+ "minBytes": 400,
147
+ "checks": [
148
+ {
149
+ "kind": "contains",
150
+ "file": "tasks/eval/review.md",
151
+ "pattern": "Verdict:\\s*(?:PASS|REVISE)",
152
+ "flags": "i",
153
+ "label": "explicit reviewer verdict"
154
+ }
155
+ ]
156
+ }
157
+ ],
158
+ "checks": [
159
+ {
160
+ "kind": "notContains",
161
+ "file": "src/find-duplicates.js",
162
+ "pattern": "for\\s*\\(let j = 0; j < items\\.length",
163
+ "label": "the seeded inner full-list rescan is gone"
164
+ },
165
+ {
166
+ "kind": "sourceParses",
167
+ "file": "src/find-duplicates.js"
168
+ },
169
+ {
170
+ "kind": "nodeScriptPasses",
171
+ "script": "tests/verify-perf.mjs",
172
+ "timeoutMs": 60000,
173
+ "requiredOutput": [
174
+ {
175
+ "pattern": "PERF_OPTIMIZATION_ORACLE results ok",
176
+ "label": "results identical to the reference"
177
+ },
178
+ {
179
+ "pattern": "PERF_OPTIMIZATION_ORACLE ops \\d+ within budget",
180
+ "label": "instrumented op-count under the stated budget"
181
+ },
182
+ {
183
+ "pattern": "PERF_OPTIMIZATION_ORACLE suite green",
184
+ "label": "suite green on the optimized tree"
185
+ }
186
+ ]
187
+ }
188
+ ],
189
+ "taskNotes": {
190
+ "minBytes": 120,
191
+ "checks": [
192
+ {
193
+ "kind": "contains",
194
+ "file": "task-notes.md",
195
+ "pattern": "\\bDONE\\b[\\s\\S]*(npm\\s+run\\s+test|node\\s+--test)",
196
+ "flags": "i",
197
+ "label": "DONE note names the real test command"
198
+ }
199
+ ]
200
+ },
201
+ "taskGraph": {
202
+ "requireCraftbookTask": true,
203
+ "requireTerminalStep": true
204
+ },
205
+ "unchangedFixtures": [
206
+ "source/perf-brief.md",
207
+ "package.json",
208
+ "src/instrument.js"
209
+ ]
210
+ },
211
+ "rubric": {
212
+ "artifact": {
213
+ "path": "tasks/eval/verification.md",
214
+ "kind": "markdown"
215
+ },
216
+ "axes": [
217
+ {
218
+ "name": "Measurement honesty",
219
+ "description": "Baseline numbers were gathered by a stated, repeatable method before the change, and verification re-ran the identical method and quoted both figures side by side - no adjectives standing in for numbers, no swapped workload."
220
+ },
221
+ {
222
+ "name": "Bottleneck focus",
223
+ "description": "One bottleneck was named with its mechanism and fixed at the real site by that mechanism - not a synthetic proxy, a weakened measurement, or scattered micro-tweaks."
224
+ },
225
+ {
226
+ "name": "Correctness under speed",
227
+ "description": "Results stayed identical on the same inputs, the suite stayed green between stages with real receipts, and residual risk or unverified claims are labeled honestly."
228
+ }
229
+ ]
230
+ },
231
+ "qualityFocus": [
232
+ "numbers with their method",
233
+ "same-method re-measurement",
234
+ "enforced review loop"
235
+ ]
236
+ }
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "pest-diagnosis",
5
5
  "role": "general",
6
+ "category": "personal",
6
7
  "name": "Pest & Problem Diagnosis",
7
8
  "description": "Turn 'something is wrong with the tomatoes' into a ranked differential: the likely culprits with the evidence for each, the gentlest treatment first, what to watch to confirm the diagnosis, and when to call in a professional — a garden clinic visit without the guesswork. Locks the diagnostic criteria FIRST, then builds the differential from the symptom notes and the plantings, then writes the treatment and monitoring plan. Use for garden pest problems, plant disease diagnosis, 'what is eating my plants', and sick-plant triage.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "photo-cull",
5
5
  "role": "general",
6
+ "category": "media",
6
7
  "name": "Photo Cull & Rank",
7
8
  "description": "Rank and cull a set of photos by objective quality — sharpness/focus, exposure, composition, eyes-open/expression for people, and duplicate-of-a-better-shot — to surface the keepers and justify the rejects. Lock the scoring CRITERIA and weights FIRST (what 'good' means for this set: a portrait shoot weights expression, a landscape weights sharpness and horizon) because an unstated rubric makes the cull arbitrary; then score every photo and produce a ranked report with keep/reject and reasons. Covers photo culling, image quality ranking, best-shot selection, photo curation, and burst/best-of selection.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "physics-toy",
5
5
  "role": "project-starter",
6
+ "category": "code-build",
6
7
  "name": "Interactive Physics Toy",
7
8
  "description": "Build a single-file interactive canvas physics or particle toy such as a bouncing-ball sandbox, gravity wells, springs, cloth, fluid, or a boids flock that the user can poke with the mouse. Defines the simulation model — forces, integration, collisions, and the interaction verbs — first, then implements a stable per-frame integrator. Physics toys feel magical only when the numerics are stable and the mouse interaction is responsive, so the concept phase pins the forces and integration scheme before any drawing, the ordering that keeps a small model from shipping a jittery or exploding sim.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "pitch-deck",
5
5
  "role": "general",
6
+ "category": "marketing",
6
7
  "name": "Investor Pitch Deck",
7
8
  "description": "Build a fundraising or sales pitch deck that tells a tight investor-grade story: problem, solution, market size, product, business model, traction, go-to-market, competition, team, and the ask. Locks the NARRATIVE arc and per-slide message FIRST (a deck lives or dies on story order, not visuals), then designs a single consistent slide system, then builds a navigable HTML deck — one idea per slide, big claim plus one supporting proof, ending on a crisp ask and use-of-funds. Use for seed/Series-A raises, sales decks, demo days, and investor updates.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "plan",
5
5
  "role": "general",
6
+ "category": "practice",
6
7
  "name": "Plan",
7
8
  "description": "Author a PLAN for a piece of work as a reviewable draft task: a strong 'about', a set of outcomes (what should be created or updated at success), an ordered series of build steps each gated on a concrete static deliverable, and a final verification step that checks the outcomes were kept. The user reviews the draft and activates it to run. Invoke via the start_plan tool. Use for 'plan this', 'make a plan', '/plan'.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "playtest-report",
5
5
  "role": "maintenance-review",
6
+ "category": "code-quality",
6
7
  "name": "Playtest Report",
7
8
  "description": "Playtest like it matters: a structured pass over the mechanics, the edge inputs, and the score loop, every finding written with its repro steps — a ranked fix list, not vibes. Locks the test plan FIRST — what to try and what correct looks like — then plays through it taking notes, then writes the findings with a ranked issue table. Use for playtesting a game before sharing it, 'is the game actually solid', bug hunts on an arcade page, pre-release game QA, and turning playtest feelings into a fix list.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "podcast-chaptering",
5
5
  "role": "general",
6
+ "category": "media",
6
7
  "name": "Podcast Chapters & Show Notes",
7
8
  "description": "Turn a podcast episode into navigable chapter markers plus publish-ready show notes — timestamped chapter titles, an episode summary, key takeaways, and linked mentions. Scopes the chapter format and show-notes structure FIRST, analyzes the transcript to find real topic boundaries with timestamps, then writes the listener-facing notes in the show's voice. Separating boundary-detection (analysis) from the write-up (copy) is what yields chapters that land on actual topic shifts and notes that read like a human wrote them.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "portfolio-site",
5
5
  "role": "project-starter",
6
+ "category": "code-build",
6
7
  "name": "Portfolio Site",
7
8
  "description": "Build a personal or professional portfolio site that showcases projects, an about/bio, and contact links in a single polished page. Locks the content inventory — which projects, what bio, which links — first, then a clean gallery-style visual design, then builds responsive HTML with a project grid and real CSS. Scoping the content before designing prevents a small model from inventing fake projects or building a layout the real content does not fit; the portfolio's job is to present a finite set of real work cleanly.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "powerpoint-deck",
5
5
  "role": "general",
6
+ "category": "design",
6
7
  "name": "PowerPoint from Content",
7
8
  "description": "Turn source content into a real editable PowerPoint file (.pptx), not an HTML deck. Locks the narrative and one message per slide, writes ordinary Markdown with one H1 per slide, then uses DocBlocks for theme-aware conversion, visual preview, and artifact saving. No Developer is needed merely to export the deck.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "pr-security-review",
5
5
  "role": "maintenance-review",
6
+ "category": "code-review",
6
7
  "name": "Security Review of a Diff",
7
8
  "description": "Perform a focused security review of a code change or diff and produce a vulnerability report mapped to a threat checklist. First scopes the change's attack surface and locks a security checklist (injection, authn/authz, secrets, deserialization, SSRF, crypto misuse, input validation, dependency risk), then audits the diff against each class while tracing tainted data from untrusted sources to dangerous sinks, then writes a findings report rating each issue by severity and likelihood with a concrete remediation. Use this for a security review, secure code review, vulnerability assessment of a diff, an AppSec pass, or checking a change for injection/auth/secret-leak risks before merge — it surfaces exploitable flaws tied to specific lines rather than generic security platitudes.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "practice-exam",
5
5
  "role": "general",
6
+ "category": "personal",
6
7
  "name": "Practice Exam",
7
8
  "description": "Take the exam before the exam: a timed, self-scoring practice paper blueprinted from the deck — weighted toward what the review record says is weak — with an answer key that explains, not just grades. Locks the blueprint FIRST — topic coverage, weak-spot weighting from the deck's boxes and miss counts, timing, honest scoring — then builds the interactive exam page, then writes the key. Use for practice exams, mock tests, 'test me before the test', timed practice papers, and exam-week dress rehearsals.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "practice-session",
5
5
  "role": "general",
6
+ "category": "personal",
6
7
  "name": "Log the Practice Session",
7
8
  "description": "Close out today's practice properly: log what was actually worked with honest minutes and tempo marks, and set up tomorrow's session so the next sit-down starts with intent instead of noodling. Locks the honest picture of the session FIRST, then logs it into the practice record, then writes tomorrow's targeted plan. Use for logging a practice session, ending today's practice, planning tomorrow's practice, and 'log my practice'.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "pre-departure-countdown",
5
5
  "role": "general",
6
+ "category": "personal",
6
7
  "name": "Pre-Departure Countdown",
7
8
  "description": "Audit a trip's readiness in the final stretch before departure: verify documents and bookings, close the packing gaps against the packing roster, sweep home-prep tasks, and produce a day-by-day countdown checklist to the departure date — so the last week runs on a list, not on 3am worry. Locks the audit areas and the days remaining FIRST, then audits each area against the trip record, then writes the countdown. Use for pre-trip checks, departure prep, 'are we ready for the trip', and travel countdown checklists.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "press-release",
5
5
  "role": "general",
6
+ "category": "marketing",
6
7
  "name": "Press Release",
7
8
  "description": "Write a professional, AP-style press release ready to send to journalists: it first locks the news angle, the five W's, the approved quote(s), and the boilerplate, then drafts the release in the standard format — dateline, inverted-pyramid lede, supporting body, quotes, boilerplate, and media contact — then a review pass enforces newsworthiness, factual accuracy, and house style. Covers press release, news announcement, PR writing, media release, product launch announcement, and corporate communications. The scope-first ordering is essential: a small model that pins the angle and quotes before drafting avoids the soft, promotional release that buries the news and no editor will run.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "price-tracker",
5
5
  "role": "general",
6
+ "category": "research",
6
7
  "name": "Track Prices Over Time",
7
8
  "description": "Build a price tracker that records the price of one or more products/SKUs each time it runs, appending a timestamped history so you can see trends, drops, and the lowest price seen. Scopes the SKUs, the price-extraction rule, and the history-file schema FIRST, then builds the fetch-and-append routine that is idempotent per day and computes drop-from-previous and all-time-low. Schema-before-build keeps the history a clean append-only time series instead of a pile of inconsistent snapshots — the foundation any later chart or alert reads from.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "pricing-page",
5
5
  "role": "project-starter",
6
+ "category": "marketing",
6
7
  "name": "Pricing Page",
7
8
  "description": "Build a single pricing or plan-comparison page with tiered plan cards, a feature comparison, a highlighted recommended plan, and optionally a monthly/annual toggle that updates prices. Scopes the plans, features, and pricing model first, designs a comparison layout that makes the recommended tier obvious, writes the plan copy, then builds responsive HTML with a working billing toggle. Pricing pages fail when the toggle does not update prices or the tiers are not genuinely comparable, so the offer-scope phase locks the exact plans and feature matrix before any markup.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "product-descriptions",
5
5
  "role": "general",
6
+ "category": "marketing",
6
7
  "name": "Bulk Product Descriptions",
7
8
  "description": "Generate consistent, on-brand product descriptions in bulk from a list of products and their attributes: it first locks the brand voice, the field schema (title, short blurb, long description, bullet features, SEO meta), and a worked exemplar, then drafts every product to that exact template so the whole catalog reads as one voice. Covers ecommerce product copy, catalog descriptions, Shopify/Amazon listings, bulk SKU copywriting, and product detail pages. Locking the voice and one exemplar before the batch is the key move: it stops a small model from drifting in tone and structure across items, which is the classic failure of bulk copy.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "proposal-sow",
5
5
  "role": "general",
6
+ "category": "business",
6
7
  "name": "Proposal / Statement of Work",
7
8
  "description": "Draft a client proposal or statement of work that wins the deal and prevents scope creep — covering objectives, scope, deliverables, timeline/milestones, pricing, assumptions, and acceptance criteria. Scopes the engagement and the in-scope/out-of-scope boundary FIRST (the boundary is what protects both sides), writes persuasive yet precise proposal copy, then formats it into a clean client-ready document with a structured deliverables-and-pricing table. Use for freelance/agency bids, consulting SOWs, and project proposals.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "pull-request-review",
5
5
  "role": "maintenance-review",
6
+ "category": "code-review",
6
7
  "name": "Pull Request Review",
7
8
  "description": "Staff-engineer-style PR review over a complete local PR corpus. Defaults to the open pull request for the project's checked-out branch when one exists, accepts an explicit PR number from any branch, reviews changed files in bounded batches with mechanical coverage accounting, verifies cross-file claims against the checkout, and produces a structured local verdict. Requires a GitHub-connected project.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "puzzle-pack-layout",
5
5
  "role": "general",
6
+ "category": "design",
6
7
  "name": "Lay Out the Puzzle Pack",
7
8
  "description": "Bind the month's puzzles into one print-ready pack: a cover, a page per puzzle, and the solutions gathered in the back where they belong — the thing that lands on the kitchen table and disappears into pencil marks. Locks the shelf inventory and the page rules FIRST, then lays out the pack, then proofs that every puzzle made it in and no solution leaks next to its puzzle. Use for laying out the puzzle pack, binding the month's puzzles, a printable puzzle booklet, and 'put the puzzles into one pack'.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "pwa-offline",
5
5
  "role": "project-starter",
6
+ "category": "code-build",
6
7
  "name": "Installable Offline PWA",
7
8
  "description": "Build an installable Progressive Web App that works offline — an HTML app shell, a web app manifest, and a service worker that caches the shell so it loads with no network. Scopes the app's one job and the offline strategy first, designs the app shell, then implements the manifest, registration, and a cache-first service worker. PWAs fail at installability and the service-worker caching contract, so the scope phase locks the cached asset list and the offline behavior before coding, keeping a small model from shipping a manifest that fails the install criteria or a service worker that never caches.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "qa",
5
5
  "role": "maintenance-review",
6
+ "category": "code-quality",
6
7
  "name": "QA",
7
8
  "description": "Live UI QA pass with a real browser. Navigates the target, interacts with the golden-path flow, captures findings, fixes atomically, re-tests.",
8
9
  "tags": [
@@ -14,6 +15,8 @@
14
15
  },
15
16
  "logo": "logo.webp",
16
17
  "license": "MIT",
17
- "yankedVersions": [],
18
+ "yankedVersions": [
19
+ "1.0.0"
20
+ ],
18
21
  "workflow": "qa"
19
22
  }
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "quarterly-summary",
5
5
  "role": "general",
6
+ "category": "business",
6
7
  "name": "Quarterly Shoebox Summary",
7
8
  "description": "Close the quarter the way your accountant wishes everyone did: totals by category computed from the ledger entries themselves, the missing-documentation list naming each entry that lacks its paperwork, and the estimated-payment reminder in plain words. Locks the target quarter and the checks FIRST, then reconciles the numbers, then writes the summary — twenty minutes, four times a year, instead of an April archaeology dig. Use for quarterly tax summaries, 'how did the quarter shake out', estimated payment prep, and shoebox quarter closes.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "reading-list",
5
5
  "role": "general",
6
+ "category": "research",
6
7
  "name": "Curated Annotated Reading List",
7
8
  "description": "Curate an annotated reading list on a topic for a defined reader: a planner sets the reader, their goal, and the selection and ordering criteria, then a researcher curates and annotates each pick with why it matters, what it covers, and a suggested reading order. The ordering matters because a list assembled without a reader and a goal becomes a random link dump, and one without annotations forces the reader to guess what to read first; fixing who it is for and what 'good for this reader' means up front turns it into a guided learning path. Use this for curated reading lists, a syllabus or learning path, 'what should I read to learn X', resource roundups, and annotated bibliographies of recommended materials.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "receipt-intake",
5
5
  "role": "general",
6
+ "category": "business",
6
7
  "name": "Receipt Intake",
7
8
  "description": "Empty the shoebox inbox properly: every waiting receipt becomes a dated, categorized ledger entry that names its source file, likely duplicates get flagged instead of double-counted, and the genuinely ambiguous ones become owner questions instead of guesses. Locks the intake rules FIRST, then works the inbox receipt by receipt, then reports the totals and the question list — the year-round habit that makes April an afternoon. Use for receipt intake, emptying the receipt inbox, 'get these into the ledger', and monthly shoebox catch-ups.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "receipt-ocr-ledger",
5
5
  "role": "general",
6
+ "category": "business",
6
7
  "name": "Receipts to Expense Ledger",
7
8
  "description": "Turn a folder of receipt photos/PDFs into a clean expense ledger: OCR each receipt, extract vendor, date, line items, tax, and total, assign an expense category, and reconcile that each extracted total matches its line items. Locks the per-receipt field schema, the category set, and the math/reconciliation rules FIRST, then OCRs and extracts each receipt into rows, then verifies every receipt was processed, totals reconcile, currencies/dates are normalized, and low-confidence reads are flagged for review. Defining the schema and the total-equals-line-items check before extraction is what keeps an expense ledger trustworthy for reimbursement or tax.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "reception-report",
5
5
  "role": "maintenance-review",
6
+ "category": "marketing",
6
7
  "name": "Reception Report",
7
8
  "description": "The weekly reception review for your social posting. Reconciles published posts with their live feed records (stamping the corpus reference onto any post that lost track of its live copy), builds a per-post engagement ledger of likes, reposts, and replies, compares each post against your account's recent baseline, and reports what landed, what did not, and what to post next — closing with a single one-click action that seeds the next draft from the strongest theme. Covers social media analytics, post performance review, engagement reporting, cadence tracking, Bluesky and X and Instagram metrics, and honest small-sample reading of your feeds. No connected feed? It still writes the ledger from what the workspace knows and names the gap.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "recipe-capture",
5
5
  "role": "general",
6
+ "category": "personal",
6
7
  "name": "Capture a Recipe Card",
7
8
  "description": "Rescue a handwritten recipe card without sanding off its soul: transcribe the original faithfully — spelling quirks, margin notes, and all — standardize quantities in a separate block alongside (never instead of) the original wording, and pin the provenance note: whose card, whose kitchen, what they always changed. Locks the capture rules FIRST, then captures each card into the book, then logs what needs a test-cook and what to ask the family. Use for capturing recipe cards, 'get oma's cards into the book', preserving family recipes, and recipe transcription.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "record-a-relative",
5
5
  "role": "general",
6
+ "category": "personal",
6
7
  "name": "Record a Relative",
7
8
  "description": "Bank an elder's interview while the telling is fresh: file the transcript, pull the people, places, and dates into the family record with their source, and write the follow-up questions — because the questions you didn't ask are the ones that vanish. Locks the extraction rules FIRST (every fact carries its quote, uncertain stays uncertain), then files the transcript, then updates the tree and surfaces the conflicts. Use for filing a family interview, recording a relative's stories, pulling facts into the tree, and 'we interviewed grandma'.",
8
9
  "tags": [
@@ -3,6 +3,7 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "recurring-invoice-run",
5
5
  "role": "general",
6
+ "category": "business",
6
7
  "name": "Generate and Send Recurring Invoices",
7
8
  "description": "Run a recurring billing batch: for each active client/subscription due this period, generate a correctly-numbered, line-itemed invoice with taxes and totals, render it, and send it — once, idempotently, with a sent-log. Locks the invoice template, the numbering scheme, the tax/total math, and the due/idempotency rules FIRST, then builds the generate-render-send batch keyed to a billing-run log, then verifies every due client was invoiced exactly once, totals are arithmetically correct, and numbers are sequential with no gaps or dupes. Locking numbering and math up front is what keeps recurring billing audit-clean instead of producing duplicate or mis-totaled invoices.",
8
9
  "tags": [
@@ -3,14 +3,15 @@
3
3
  "kind": "craftbook-template",
4
4
  "id": "refactor-module",
5
5
  "role": "maintenance-review",
6
+ "category": "code-quality",
6
7
  "name": "Behavior-Preserving Refactor",
7
- "description": "Refactor a module to improve its structure, readability, or design WITHOUT changing observable behavior the defining constraint is that the tests stay green throughout. Plans the refactor FIRST — the target structure, the seams to introduce, the safe step sequence, and the green-tests guardrail — then refactors in small reversible steps, then a reviewer confirms behavior is unchanged and the code is genuinely cleaner. Covers extract-function/module, dependency seams, removing duplication, naming, and test-green-as-invariant refactoring.",
8
+ "description": "Restructure code without changing what it does, with proof at every stage: a green suite recorded before anything moves (characterization tests pinned first when coverage is thin), small reversible stages that keep the tests green, a re-measured structure target, and an enforced independent review.",
8
9
  "tags": [
9
- "gallery",
10
10
  "refactor",
11
11
  "cleanup",
12
12
  "code-quality",
13
13
  "maintainability",
14
+ "duplication",
14
15
  "tests"
15
16
  ],
16
17
  "maintainer": {