@bendyline/gilde 0.1.51 → 0.1.52

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 (583) hide show
  1. package/authoring/chat-models/nanbeige4.2-3b-q4.json +133 -0
  2. package/data/chat-models/index.json +1 -1
  3. package/data/chat-models/na/nanbeige4.2-3b-q4/manifest.json +138 -0
  4. package/data/chat-models/na/nanbeige4.2-3b-q4/versions/1.0.0/manifest.json +14 -0
  5. package/data/craftbook-templates/a1/a11y-audit/versions/1.1.3/craftbook.json +278 -0
  6. package/data/craftbook-templates/a1/a11y-audit/versions/1.1.3/test.json +118 -0
  7. package/data/craftbook-templates/ab/ab-test-readout/versions/1.0.3/craftbook.json +277 -0
  8. package/data/craftbook-templates/ab/ab-test-readout/versions/1.0.3/test.json +189 -0
  9. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.1/craftbook.json +616 -0
  10. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.1/test.json +228 -0
  11. package/data/craftbook-templates/ad/ad-variations/versions/1.0.3/craftbook.json +213 -0
  12. package/data/craftbook-templates/ad/ad-variations/versions/1.0.3/test.json +108 -0
  13. package/data/craftbook-templates/al/album-curate/versions/1.0.3/craftbook.json +250 -0
  14. package/data/craftbook-templates/al/album-curate/versions/1.0.3/test.json +147 -0
  15. package/data/craftbook-templates/al/alert-rules/versions/1.0.3/craftbook.json +213 -0
  16. package/data/craftbook-templates/al/alert-rules/versions/1.0.3/test.json +145 -0
  17. package/data/craftbook-templates/an/anniversary-cut/versions/1.0.5/craftbook.json +381 -0
  18. package/data/craftbook-templates/an/anniversary-cut/versions/1.0.5/test.json +157 -0
  19. package/data/craftbook-templates/an/annotated-bibliography/versions/1.0.3/craftbook.json +279 -0
  20. package/data/craftbook-templates/an/annotated-bibliography/versions/1.0.3/test.json +102 -0
  21. package/data/craftbook-templates/an/annual-document-review/versions/1.0.3/craftbook.json +277 -0
  22. package/data/craftbook-templates/an/annual-document-review/versions/1.0.3/test.json +113 -0
  23. package/data/craftbook-templates/an/anomaly-scan/versions/1.0.3/craftbook.json +277 -0
  24. package/data/craftbook-templates/an/anomaly-scan/versions/1.0.3/test.json +123 -0
  25. package/data/craftbook-templates/ap/api-contract-review/versions/1.1.3/craftbook.json +278 -0
  26. package/data/craftbook-templates/ap/api-contract-review/versions/1.1.3/test.json +192 -0
  27. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.1/craftbook.json +600 -0
  28. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.1/test.json +290 -0
  29. package/data/craftbook-templates/ar/artifact-integrity-review/versions/1.0.3/craftbook.json +282 -0
  30. package/data/craftbook-templates/ar/artifact-integrity-review/versions/1.0.3/test.json +139 -0
  31. package/data/craftbook-templates/au/audio-ad-spot/versions/1.0.3/craftbook.json +265 -0
  32. package/data/craftbook-templates/au/audio-ad-spot/versions/1.0.3/test.json +103 -0
  33. package/data/craftbook-templates/au/audio-highlight-reel/versions/1.0.3/craftbook.json +259 -0
  34. package/data/craftbook-templates/au/audio-highlight-reel/versions/1.0.3/test.json +103 -0
  35. package/data/craftbook-templates/au/audiobook-master-pack/versions/1.0.5/craftbook.json +370 -0
  36. package/data/craftbook-templates/au/audiobook-master-pack/versions/1.0.5/test.json +221 -0
  37. package/data/craftbook-templates/au/auth-flow/versions/1.0.3/craftbook.json +279 -0
  38. package/data/craftbook-templates/au/auth-flow/versions/1.0.3/test.json +143 -0
  39. package/data/craftbook-templates/au/automation-recipe/versions/1.0.3/craftbook.json +324 -0
  40. package/data/craftbook-templates/au/automation-recipe/versions/1.0.3/test.json +296 -0
  41. package/data/craftbook-templates/ba/backup-routine/versions/1.0.3/craftbook.json +279 -0
  42. package/data/craftbook-templates/ba/backup-routine/versions/1.0.3/test.json +108 -0
  43. package/data/craftbook-templates/bl/blog-post/versions/1.0.3/craftbook.json +278 -0
  44. package/data/craftbook-templates/bl/blog-post/versions/1.0.3/test.json +118 -0
  45. package/data/craftbook-templates/bo/board-deck/versions/1.0.3/craftbook.json +279 -0
  46. package/data/craftbook-templates/bo/board-deck/versions/1.0.3/test.json +100 -0
  47. package/data/craftbook-templates/bo/board-game-web/versions/1.0.3/craftbook.json +288 -0
  48. package/data/craftbook-templates/bo/board-game-web/versions/1.0.3/test.json +99 -0
  49. package/data/craftbook-templates/bo/booking-automation/versions/1.0.3/craftbook.json +294 -0
  50. package/data/craftbook-templates/bo/booking-automation/versions/1.0.3/test.json +162 -0
  51. package/data/craftbook-templates/br/branding-website/versions/1.1.2/craftbook.json +329 -0
  52. package/data/craftbook-templates/br/branding-website/versions/1.1.2/test.json +164 -0
  53. package/data/craftbook-templates/br/broadcast-announcement/versions/1.0.3/craftbook.json +219 -0
  54. package/data/craftbook-templates/br/broadcast-announcement/versions/1.0.3/test.json +103 -0
  55. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.6/craftbook.json +620 -0
  56. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.6/test.json +376 -0
  57. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.1/craftbook.json +728 -0
  58. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.1/test.json +221 -0
  59. package/data/craftbook-templates/bu/build-loop/versions/1.1.1/craftbook.json +139 -0
  60. package/data/craftbook-templates/bu/build-loop/versions/1.1.1/test.json +121 -0
  61. package/data/craftbook-templates/ca/calendar-brief/versions/1.0.3/craftbook.json +219 -0
  62. package/data/craftbook-templates/ca/calendar-brief/versions/1.0.3/test.json +102 -0
  63. package/data/craftbook-templates/ca/canvas-generative-art/versions/1.0.3/craftbook.json +222 -0
  64. package/data/craftbook-templates/ca/canvas-generative-art/versions/1.0.3/test.json +106 -0
  65. package/data/craftbook-templates/ca/careful-mode/versions/1.2.1/craftbook.json +64 -0
  66. package/data/craftbook-templates/ca/careful-mode/versions/1.2.1/test.json +110 -0
  67. package/data/craftbook-templates/ca/case-study/versions/1.0.3/craftbook.json +275 -0
  68. package/data/craftbook-templates/ca/case-study/versions/1.0.3/test.json +112 -0
  69. package/data/craftbook-templates/ca/case-study-writeup/versions/1.0.3/craftbook.json +289 -0
  70. package/data/craftbook-templates/ca/case-study-writeup/versions/1.0.3/test.json +105 -0
  71. package/data/craftbook-templates/ch/chapter-narration-run/versions/1.0.4/craftbook.json +279 -0
  72. package/data/craftbook-templates/ch/chapter-narration-run/versions/1.0.4/test.json +155 -0
  73. package/data/craftbook-templates/ch/chapter-weave/versions/1.0.3/craftbook.json +184 -0
  74. package/data/craftbook-templates/ch/chapter-weave/versions/1.0.3/test.json +98 -0
  75. package/data/craftbook-templates/ch/character-sheet/versions/1.0.3/craftbook.json +216 -0
  76. package/data/craftbook-templates/ch/character-sheet/versions/1.0.3/test.json +143 -0
  77. package/data/craftbook-templates/ch/character-turnaround/versions/1.0.3/craftbook.json +256 -0
  78. package/data/craftbook-templates/ch/character-turnaround/versions/1.0.3/test.json +178 -0
  79. package/data/craftbook-templates/ch/chart-pack/versions/1.0.3/craftbook.json +285 -0
  80. package/data/craftbook-templates/ch/chart-pack/versions/1.0.3/test.json +104 -0
  81. package/data/craftbook-templates/ch/chrome-extension/versions/1.0.3/craftbook.json +286 -0
  82. package/data/craftbook-templates/ch/chrome-extension/versions/1.0.3/test.json +97 -0
  83. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.1/craftbook.json +585 -0
  84. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.1/test.json +225 -0
  85. package/data/craftbook-templates/ci/citation-audit/versions/1.0.3/craftbook.json +278 -0
  86. package/data/craftbook-templates/ci/citation-audit/versions/1.0.3/test.json +152 -0
  87. package/data/craftbook-templates/cl/cli-tool/versions/1.1.3/craftbook.json +283 -0
  88. package/data/craftbook-templates/cl/cli-tool/versions/1.1.3/test.json +128 -0
  89. package/data/craftbook-templates/co/code-review/versions/1.0.1/craftbook.json +229 -0
  90. package/data/craftbook-templates/co/code-review/versions/1.0.1/test.json +249 -0
  91. package/data/craftbook-templates/co/codebase-refactoring-review/versions/1.0.3/craftbook.json +280 -0
  92. package/data/craftbook-templates/co/codebase-refactoring-review/versions/1.0.3/test.json +119 -0
  93. package/data/craftbook-templates/co/codebase-ux-review/versions/1.0.3/craftbook.json +279 -0
  94. package/data/craftbook-templates/co/codebase-ux-review/versions/1.0.3/test.json +122 -0
  95. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.0/test.json +1 -1
  96. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.1/craftbook.json +603 -0
  97. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.1/test.json +252 -0
  98. package/data/craftbook-templates/co/cohort-analysis/versions/1.0.3/craftbook.json +277 -0
  99. package/data/craftbook-templates/co/cohort-analysis/versions/1.0.3/test.json +229 -0
  100. package/data/craftbook-templates/co/company-research-brief/versions/1.0.3/craftbook.json +272 -0
  101. package/data/craftbook-templates/co/company-research-brief/versions/1.0.3/test.json +97 -0
  102. package/data/craftbook-templates/co/comparison-matrix/versions/1.0.3/craftbook.json +286 -0
  103. package/data/craftbook-templates/co/comparison-matrix/versions/1.0.3/test.json +109 -0
  104. package/data/craftbook-templates/co/compat-check/versions/1.0.3/craftbook.json +285 -0
  105. package/data/craftbook-templates/co/compat-check/versions/1.0.3/test.json +148 -0
  106. package/data/craftbook-templates/co/competitive-analysis/versions/1.0.3/craftbook.json +273 -0
  107. package/data/craftbook-templates/co/competitive-analysis/versions/1.0.3/test.json +119 -0
  108. package/data/craftbook-templates/co/comprehensive-codebase-review/versions/1.0.1/craftbook.json +518 -0
  109. package/data/craftbook-templates/co/comprehensive-codebase-review/versions/1.0.1/test.json +160 -0
  110. package/data/craftbook-templates/co/config-scaffold/versions/1.0.3/craftbook.json +215 -0
  111. package/data/craftbook-templates/co/config-scaffold/versions/1.0.3/test.json +120 -0
  112. package/data/craftbook-templates/co/content-accuracy-review/versions/1.0.3/craftbook.json +277 -0
  113. package/data/craftbook-templates/co/content-accuracy-review/versions/1.0.3/test.json +152 -0
  114. package/data/craftbook-templates/co/content-deck/versions/1.2.3/craftbook.json +335 -0
  115. package/data/craftbook-templates/co/content-deck/versions/1.2.3/test.json +169 -0
  116. package/data/craftbook-templates/co/contract-template/versions/1.0.3/craftbook.json +283 -0
  117. package/data/craftbook-templates/co/contract-template/versions/1.0.3/test.json +102 -0
  118. package/data/craftbook-templates/co/cookbook-layout/versions/1.0.3/craftbook.json +233 -0
  119. package/data/craftbook-templates/co/cookbook-layout/versions/1.0.3/test.json +159 -0
  120. package/data/craftbook-templates/co/copy-review/versions/1.0.3/craftbook.json +278 -0
  121. package/data/craftbook-templates/co/copy-review/versions/1.0.3/test.json +105 -0
  122. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.3/craftbook.json +339 -0
  123. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.3/test.json +187 -0
  124. package/data/craftbook-templates/co/corpus-synthesis/versions/1.0.3/craftbook.json +279 -0
  125. package/data/craftbook-templates/co/corpus-synthesis/versions/1.0.3/test.json +159 -0
  126. package/data/craftbook-templates/co/cover-letter/versions/1.0.3/craftbook.json +216 -0
  127. package/data/craftbook-templates/co/cover-letter/versions/1.0.3/test.json +100 -0
  128. package/data/craftbook-templates/cr/crm-update-batch/versions/1.0.3/craftbook.json +212 -0
  129. package/data/craftbook-templates/cr/crm-update-batch/versions/1.0.3/test.json +207 -0
  130. package/data/craftbook-templates/cr/cron-job/versions/1.0.3/craftbook.json +282 -0
  131. package/data/craftbook-templates/cr/cron-job/versions/1.0.3/test.json +104 -0
  132. package/data/craftbook-templates/cr/crossword-forge/versions/1.0.3/craftbook.json +301 -0
  133. package/data/craftbook-templates/cr/crossword-forge/versions/1.0.3/test.json +138 -0
  134. package/data/craftbook-templates/cs/csv-transformer/versions/1.2.4/craftbook.json +211 -0
  135. package/data/craftbook-templates/cs/csv-transformer/versions/1.2.4/test.json +102 -0
  136. package/data/craftbook-templates/da/dashboard-spec/versions/1.0.3/craftbook.json +219 -0
  137. package/data/craftbook-templates/da/dashboard-spec/versions/1.0.3/test.json +114 -0
  138. package/data/craftbook-templates/da/data-dictionary/versions/1.0.3/craftbook.json +219 -0
  139. package/data/craftbook-templates/da/data-dictionary/versions/1.0.3/test.json +101 -0
  140. package/data/craftbook-templates/da/data-export-migrate/versions/1.0.3/craftbook.json +282 -0
  141. package/data/craftbook-templates/da/data-export-migrate/versions/1.0.3/test.json +104 -0
  142. package/data/craftbook-templates/da/data-join-merge/versions/1.0.3/craftbook.json +212 -0
  143. package/data/craftbook-templates/da/data-join-merge/versions/1.0.3/test.json +104 -0
  144. package/data/craftbook-templates/da/data-pipeline-etl/versions/1.0.4/craftbook.json +281 -0
  145. package/data/craftbook-templates/da/data-pipeline-etl/versions/1.0.4/test.json +162 -0
  146. package/data/craftbook-templates/da/data-quality-audit/versions/1.0.3/craftbook.json +277 -0
  147. package/data/craftbook-templates/da/data-quality-audit/versions/1.0.3/test.json +329 -0
  148. package/data/craftbook-templates/da/data-to-report/versions/1.0.3/craftbook.json +277 -0
  149. package/data/craftbook-templates/da/data-to-report/versions/1.0.3/test.json +98 -0
  150. package/data/craftbook-templates/da/data-viz-page/versions/1.0.3/craftbook.json +281 -0
  151. package/data/craftbook-templates/da/data-viz-page/versions/1.0.3/test.json +117 -0
  152. package/data/craftbook-templates/da/dataset-clean/versions/1.2.4/craftbook.json +212 -0
  153. package/data/craftbook-templates/da/dataset-clean/versions/1.2.4/test.json +95 -0
  154. package/data/craftbook-templates/db/db-index-tuning/versions/1.0.3/craftbook.json +283 -0
  155. package/data/craftbook-templates/db/db-index-tuning/versions/1.0.3/test.json +104 -0
  156. package/data/craftbook-templates/de/deep-security-review/versions/1.1.3/craftbook.json +378 -0
  157. package/data/craftbook-templates/de/deep-security-review/versions/1.1.3/test.json +184 -0
  158. package/data/craftbook-templates/de/dependency-audit/versions/1.1.3/craftbook.json +275 -0
  159. package/data/craftbook-templates/de/dependency-audit/versions/1.1.3/test.json +111 -0
  160. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.1/craftbook.json +619 -0
  161. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.1/test.json +235 -0
  162. package/data/craftbook-templates/de/deploy-checklist/versions/1.0.3/craftbook.json +288 -0
  163. package/data/craftbook-templates/de/deploy-checklist/versions/1.0.3/test.json +165 -0
  164. package/data/craftbook-templates/de/design-review/versions/1.0.3/craftbook.json +277 -0
  165. package/data/craftbook-templates/de/design-review/versions/1.0.3/test.json +121 -0
  166. package/data/craftbook-templates/de/design-system-consultation/versions/2.0.5/craftbook.json +627 -0
  167. package/data/craftbook-templates/de/design-system-consultation/versions/2.0.5/test.json +201 -0
  168. package/data/craftbook-templates/di/diagram-from-text/versions/1.0.3/craftbook.json +221 -0
  169. package/data/craftbook-templates/di/diagram-from-text/versions/1.0.3/test.json +97 -0
  170. package/data/craftbook-templates/di/digest-from-feeds/versions/1.0.3/craftbook.json +283 -0
  171. package/data/craftbook-templates/di/digest-from-feeds/versions/1.0.3/test.json +162 -0
  172. package/data/craftbook-templates/do/doc-intake-pipeline/versions/1.0.3/craftbook.json +282 -0
  173. package/data/craftbook-templates/do/doc-intake-pipeline/versions/1.0.3/test.json +104 -0
  174. package/data/craftbook-templates/do/doc-rewrite/versions/1.0.3/craftbook.json +216 -0
  175. package/data/craftbook-templates/do/doc-rewrite/versions/1.0.3/test.json +110 -0
  176. package/data/craftbook-templates/do/dockerize-app/versions/1.0.3/craftbook.json +282 -0
  177. package/data/craftbook-templates/do/dockerize-app/versions/1.0.3/test.json +92 -0
  178. package/data/craftbook-templates/do/docs-site/versions/1.0.3/craftbook.json +281 -0
  179. package/data/craftbook-templates/do/docs-site/versions/1.0.3/test.json +97 -0
  180. package/data/craftbook-templates/do/documentation-drift-review/versions/1.0.3/craftbook.json +279 -0
  181. package/data/craftbook-templates/do/documentation-drift-review/versions/1.0.3/test.json +135 -0
  182. package/data/craftbook-templates/dr/draft-social-post/versions/1.0.1/craftbook.json +321 -0
  183. package/data/craftbook-templates/dr/draft-social-post/versions/1.0.1/test.json +161 -0
  184. package/data/craftbook-templates/dr/drive-wrap-up/versions/1.0.3/craftbook.json +277 -0
  185. package/data/craftbook-templates/dr/drive-wrap-up/versions/1.0.3/test.json +104 -0
  186. package/data/craftbook-templates/du/due-diligence-brief/versions/1.0.3/craftbook.json +278 -0
  187. package/data/craftbook-templates/du/due-diligence-brief/versions/1.0.3/test.json +110 -0
  188. package/data/craftbook-templates/eb/ebook-compile/versions/1.0.3/craftbook.json +280 -0
  189. package/data/craftbook-templates/eb/ebook-compile/versions/1.0.3/test.json +97 -0
  190. package/data/craftbook-templates/ed/edit-notes/versions/1.0.3/craftbook.json +312 -0
  191. package/data/craftbook-templates/ed/edit-notes/versions/1.0.3/test.json +146 -0
  192. package/data/craftbook-templates/em/email-sequence/versions/1.0.3/craftbook.json +274 -0
  193. package/data/craftbook-templates/em/email-sequence/versions/1.0.3/test.json +97 -0
  194. package/data/craftbook-templates/em/email-template/versions/1.0.3/craftbook.json +281 -0
  195. package/data/craftbook-templates/em/email-template/versions/1.0.3/test.json +97 -0
  196. package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.5/craftbook.json +577 -0
  197. package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.5/test.json +191 -0
  198. package/data/craftbook-templates/ep/episode-plan/versions/1.0.3/craftbook.json +277 -0
  199. package/data/craftbook-templates/ep/episode-plan/versions/1.0.3/test.json +100 -0
  200. package/data/craftbook-templates/es/escalation-playbook/versions/1.0.3/craftbook.json +219 -0
  201. package/data/craftbook-templates/es/escalation-playbook/versions/1.0.3/test.json +110 -0
  202. package/data/craftbook-templates/ev/evidence-brief/versions/1.0.3/craftbook.json +279 -0
  203. package/data/craftbook-templates/ev/evidence-brief/versions/1.0.3/test.json +110 -0
  204. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.5/craftbook.json +606 -0
  205. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.5/test.json +139 -0
  206. package/data/craftbook-templates/ex/expense-categorize/versions/1.0.3/craftbook.json +274 -0
  207. package/data/craftbook-templates/ex/expense-categorize/versions/1.0.3/test.json +104 -0
  208. package/data/craftbook-templates/fa/fact-check/versions/1.0.3/craftbook.json +278 -0
  209. package/data/craftbook-templates/fa/fact-check/versions/1.0.3/test.json +110 -0
  210. package/data/craftbook-templates/fa/family-story-chapter/versions/1.0.3/craftbook.json +184 -0
  211. package/data/craftbook-templates/fa/family-story-chapter/versions/1.0.3/test.json +111 -0
  212. package/data/craftbook-templates/fa/faq-from-docs/versions/1.0.3/craftbook.json +215 -0
  213. package/data/craftbook-templates/fa/faq-from-docs/versions/1.0.3/test.json +110 -0
  214. package/data/craftbook-templates/fa/favicon-set/versions/1.0.3/craftbook.json +284 -0
  215. package/data/craftbook-templates/fa/favicon-set/versions/1.0.3/test.json +103 -0
  216. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.1/craftbook.json +324 -0
  217. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.1/test.json +162 -0
  218. package/data/craftbook-templates/fe/feedback-widget/versions/1.0.3/craftbook.json +281 -0
  219. package/data/craftbook-templates/fe/feedback-widget/versions/1.0.3/test.json +97 -0
  220. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.1/craftbook.json +716 -0
  221. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.1/test.json +239 -0
  222. package/data/craftbook-templates/fo/folder-to-audio/versions/1.0.3/craftbook.json +215 -0
  223. package/data/craftbook-templates/fo/folder-to-audio/versions/1.0.3/test.json +103 -0
  224. package/data/craftbook-templates/fo/forecast-model/versions/1.0.3/craftbook.json +216 -0
  225. package/data/craftbook-templates/fo/forecast-model/versions/1.0.3/test.json +104 -0
  226. package/data/craftbook-templates/fo/form-fill-batch/versions/1.0.3/craftbook.json +282 -0
  227. package/data/craftbook-templates/fo/form-fill-batch/versions/1.0.3/test.json +162 -0
  228. package/data/craftbook-templates/fo/form-wizard/versions/1.0.3/craftbook.json +222 -0
  229. package/data/craftbook-templates/fo/form-wizard/versions/1.0.3/test.json +110 -0
  230. package/data/craftbook-templates/fr/freeze-scope/versions/1.3.1/craftbook.json +96 -0
  231. package/data/craftbook-templates/fr/freeze-scope/versions/1.3.1/test.json +131 -0
  232. package/data/craftbook-templates/ga/game-with-screens/versions/1.0.3/craftbook.json +306 -0
  233. package/data/craftbook-templates/ga/game-with-screens/versions/1.0.3/test.json +99 -0
  234. package/data/craftbook-templates/gl/glossary-build/versions/1.0.3/craftbook.json +274 -0
  235. package/data/craftbook-templates/gl/glossary-build/versions/1.0.3/test.json +110 -0
  236. package/data/craftbook-templates/gr/graphql-api/versions/1.0.4/craftbook.json +281 -0
  237. package/data/craftbook-templates/gr/graphql-api/versions/1.0.4/test.json +92 -0
  238. package/data/craftbook-templates/gr/grpc-service/versions/1.0.3/craftbook.json +283 -0
  239. package/data/craftbook-templates/gr/grpc-service/versions/1.0.3/test.json +92 -0
  240. package/data/craftbook-templates/ha/handbook-section/versions/1.0.3/craftbook.json +283 -0
  241. package/data/craftbook-templates/ha/handbook-section/versions/1.0.3/test.json +110 -0
  242. package/data/craftbook-templates/he/hero-image/versions/1.0.3/craftbook.json +289 -0
  243. package/data/craftbook-templates/he/hero-image/versions/1.0.3/test.json +103 -0
  244. package/data/craftbook-templates/ho/holiday-card-run/versions/1.0.3/craftbook.json +365 -0
  245. package/data/craftbook-templates/ho/holiday-card-run/versions/1.0.3/test.json +128 -0
  246. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.1/craftbook.json +605 -0
  247. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.1/test.json +220 -0
  248. package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.2/craftbook.json +337 -0
  249. package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.2/test.json +176 -0
  250. package/data/craftbook-templates/ht/html-puzzle-game/versions/1.0.3/craftbook.json +288 -0
  251. package/data/craftbook-templates/ht/html-puzzle-game/versions/1.0.3/test.json +99 -0
  252. package/data/craftbook-templates/ic/icon-pack/versions/1.0.3/craftbook.json +281 -0
  253. package/data/craftbook-templates/ic/icon-pack/versions/1.0.3/test.json +103 -0
  254. package/data/craftbook-templates/id/idea-office-hours/versions/2.0.5/craftbook.json +571 -0
  255. package/data/craftbook-templates/id/idea-office-hours/versions/2.0.5/test.json +141 -0
  256. package/data/craftbook-templates/id/idle-clicker-game/versions/1.0.3/craftbook.json +288 -0
  257. package/data/craftbook-templates/id/idle-clicker-game/versions/1.0.3/test.json +99 -0
  258. package/data/craftbook-templates/im/image-batch-edit/versions/1.0.3/craftbook.json +277 -0
  259. package/data/craftbook-templates/im/image-batch-edit/versions/1.0.3/test.json +103 -0
  260. package/data/craftbook-templates/im/image-dedup-cluster/versions/1.0.3/craftbook.json +276 -0
  261. package/data/craftbook-templates/im/image-dedup-cluster/versions/1.0.3/test.json +103 -0
  262. package/data/craftbook-templates/im/image-palette-extract/versions/1.0.3/craftbook.json +221 -0
  263. package/data/craftbook-templates/im/image-palette-extract/versions/1.0.3/test.json +97 -0
  264. package/data/craftbook-templates/im/image-seo-rename/versions/1.0.3/craftbook.json +216 -0
  265. package/data/craftbook-templates/im/image-seo-rename/versions/1.0.3/test.json +103 -0
  266. package/data/craftbook-templates/im/image-set-index/versions/1.2.2/craftbook.json +295 -0
  267. package/data/craftbook-templates/im/image-set-index/versions/1.2.2/test.json +180 -0
  268. package/data/craftbook-templates/in/inbox-triage/versions/1.0.3/craftbook.json +276 -0
  269. package/data/craftbook-templates/in/inbox-triage/versions/1.0.3/test.json +104 -0
  270. package/data/craftbook-templates/in/incident-comms-templates/versions/1.0.3/craftbook.json +219 -0
  271. package/data/craftbook-templates/in/incident-comms-templates/versions/1.0.3/test.json +110 -0
  272. package/data/craftbook-templates/in/incident-postmortem/versions/1.0.3/craftbook.json +288 -0
  273. package/data/craftbook-templates/in/incident-postmortem/versions/1.0.3/test.json +109 -0
  274. package/data/craftbook-templates/in/insurance-inventory/versions/1.0.3/craftbook.json +288 -0
  275. package/data/craftbook-templates/in/insurance-inventory/versions/1.0.3/test.json +121 -0
  276. package/data/craftbook-templates/in/interactive-quiz/versions/1.0.3/craftbook.json +281 -0
  277. package/data/craftbook-templates/in/interactive-quiz/versions/1.0.3/test.json +99 -0
  278. package/data/craftbook-templates/in/invitation-design/versions/1.0.3/craftbook.json +240 -0
  279. package/data/craftbook-templates/in/invitation-design/versions/1.0.3/test.json +121 -0
  280. package/data/craftbook-templates/in/invoice-generator/versions/1.0.3/craftbook.json +222 -0
  281. package/data/craftbook-templates/in/invoice-generator/versions/1.0.3/test.json +97 -0
  282. package/data/craftbook-templates/in/invoice-run/versions/1.1.3/craftbook.json +354 -0
  283. package/data/craftbook-templates/in/invoice-run/versions/1.1.3/test.json +140 -0
  284. package/data/craftbook-templates/index.json +1 -1
  285. package/data/craftbook-templates/it/item-intake/versions/1.0.3/craftbook.json +276 -0
  286. package/data/craftbook-templates/it/item-intake/versions/1.0.3/test.json +145 -0
  287. package/data/craftbook-templates/ju/juice-pass/versions/1.0.3/craftbook.json +228 -0
  288. package/data/craftbook-templates/ju/juice-pass/versions/1.0.3/test.json +116 -0
  289. package/data/craftbook-templates/kn/knowledge-base-article/versions/1.0.3/craftbook.json +275 -0
  290. package/data/craftbook-templates/kn/knowledge-base-article/versions/1.0.3/test.json +110 -0
  291. package/data/craftbook-templates/kp/kpi-scorecard/versions/1.0.3/craftbook.json +285 -0
  292. package/data/craftbook-templates/kp/kpi-scorecard/versions/1.0.3/test.json +97 -0
  293. package/data/craftbook-templates/la/landing-copy/versions/1.0.3/craftbook.json +275 -0
  294. package/data/craftbook-templates/la/landing-copy/versions/1.0.3/test.json +110 -0
  295. package/data/craftbook-templates/la/landing-page/versions/1.0.3/craftbook.json +348 -0
  296. package/data/craftbook-templates/la/landing-page/versions/1.0.3/test.json +97 -0
  297. package/data/craftbook-templates/le/lead-enrichment/versions/1.0.3/craftbook.json +274 -0
  298. package/data/craftbook-templates/le/lead-enrichment/versions/1.0.3/test.json +104 -0
  299. package/data/craftbook-templates/li/library-package/versions/1.0.3/craftbook.json +284 -0
  300. package/data/craftbook-templates/li/library-package/versions/1.0.3/test.json +92 -0
  301. package/data/craftbook-templates/li/literature-review/versions/1.0.3/craftbook.json +279 -0
  302. package/data/craftbook-templates/li/literature-review/versions/1.0.3/test.json +110 -0
  303. package/data/craftbook-templates/lo/localize-content/versions/1.0.3/craftbook.json +275 -0
  304. package/data/craftbook-templates/lo/localize-content/versions/1.0.3/test.json +110 -0
  305. package/data/craftbook-templates/lo/logo-set/versions/1.0.3/craftbook.json +281 -0
  306. package/data/craftbook-templates/lo/logo-set/versions/1.0.3/test.json +103 -0
  307. package/data/craftbook-templates/ma/market-scan/versions/1.0.3/craftbook.json +279 -0
  308. package/data/craftbook-templates/ma/market-scan/versions/1.0.3/test.json +213 -0
  309. package/data/craftbook-templates/me/meeting-minutes/versions/1.0.3/craftbook.json +220 -0
  310. package/data/craftbook-templates/me/meeting-minutes/versions/1.0.3/test.json +110 -0
  311. package/data/craftbook-templates/me/meeting-notes-to-actions/versions/1.0.3/craftbook.json +219 -0
  312. package/data/craftbook-templates/me/meeting-notes-to-actions/versions/1.0.3/test.json +110 -0
  313. package/data/craftbook-templates/me/meeting-prep-brief/versions/1.0.3/craftbook.json +218 -0
  314. package/data/craftbook-templates/me/meeting-prep-brief/versions/1.0.3/test.json +187 -0
  315. package/data/craftbook-templates/me/meeting-summary-audio/versions/1.0.3/craftbook.json +220 -0
  316. package/data/craftbook-templates/me/meeting-summary-audio/versions/1.0.3/test.json +103 -0
  317. package/data/craftbook-templates/me/memory-prompt-session/versions/1.0.3/craftbook.json +250 -0
  318. package/data/craftbook-templates/me/memory-prompt-session/versions/1.0.3/test.json +112 -0
  319. package/data/craftbook-templates/me/message-queue-consumer/versions/1.0.3/craftbook.json +283 -0
  320. package/data/craftbook-templates/me/message-queue-consumer/versions/1.0.3/test.json +92 -0
  321. package/data/craftbook-templates/mi/micro-game-jam/versions/1.0.3/craftbook.json +229 -0
  322. package/data/craftbook-templates/mi/micro-game-jam/versions/1.0.3/test.json +99 -0
  323. package/data/craftbook-templates/mo/mock-interview/versions/1.0.3/craftbook.json +270 -0
  324. package/data/craftbook-templates/mo/mock-interview/versions/1.0.3/test.json +110 -0
  325. package/data/craftbook-templates/mo/mod-scaffold/versions/1.0.3/craftbook.json +293 -0
  326. package/data/craftbook-templates/mo/mod-scaffold/versions/1.0.3/test.json +136 -0
  327. package/data/craftbook-templates/mo/monitor-and-alert/versions/1.0.3/craftbook.json +294 -0
  328. package/data/craftbook-templates/mo/monitor-and-alert/versions/1.0.3/test.json +197 -0
  329. package/data/craftbook-templates/mo/month-close/versions/1.0.3/craftbook.json +277 -0
  330. package/data/craftbook-templates/mo/month-close/versions/1.0.3/test.json +97 -0
  331. package/data/craftbook-templates/mo/monthly-recording-review/versions/1.0.3/craftbook.json +277 -0
  332. package/data/craftbook-templates/mo/monthly-recording-review/versions/1.0.3/test.json +120 -0
  333. package/data/craftbook-templates/mo/moodboard/versions/1.0.3/craftbook.json +221 -0
  334. package/data/craftbook-templates/mo/moodboard/versions/1.0.3/test.json +103 -0
  335. package/data/craftbook-templates/mo/morning-brief/versions/1.0.3/craftbook.json +241 -0
  336. package/data/craftbook-templates/mo/morning-brief/versions/1.0.3/test.json +225 -0
  337. package/data/craftbook-templates/mo/morning-report/versions/1.0.3/craftbook.json +289 -0
  338. package/data/craftbook-templates/mo/morning-report/versions/1.0.3/test.json +250 -0
  339. package/data/craftbook-templates/mu/music-metadata-tag/versions/1.0.3/craftbook.json +212 -0
  340. package/data/craftbook-templates/mu/music-metadata-tag/versions/1.0.3/test.json +103 -0
  341. package/data/craftbook-templates/na/narrated-slideshow/versions/1.1.3/craftbook.json +324 -0
  342. package/data/craftbook-templates/na/narrated-slideshow/versions/1.1.3/test.json +86 -0
  343. package/data/craftbook-templates/ne/newsletter-issue/versions/1.0.3/craftbook.json +281 -0
  344. package/data/craftbook-templates/ne/newsletter-issue/versions/1.0.3/test.json +110 -0
  345. package/data/craftbook-templates/ni/nightly-fix-sweep/versions/1.0.1/craftbook.json +242 -0
  346. package/data/craftbook-templates/ni/nightly-fix-sweep/versions/1.0.1/test.json +120 -0
  347. package/data/craftbook-templates/no/notification-router/versions/1.0.3/craftbook.json +293 -0
  348. package/data/craftbook-templates/no/notification-router/versions/1.0.3/test.json +162 -0
  349. package/data/craftbook-templates/oc/ocr-extract/versions/1.0.3/craftbook.json +275 -0
  350. package/data/craftbook-templates/oc/ocr-extract/versions/1.0.3/test.json +103 -0
  351. package/data/craftbook-templates/of/offer-compare/versions/1.0.3/craftbook.json +214 -0
  352. package/data/craftbook-templates/of/offer-compare/versions/1.0.3/test.json +110 -0
  353. package/data/craftbook-templates/of/office-hours/versions/1.1.1/craftbook.json +150 -0
  354. package/data/craftbook-templates/of/office-hours/versions/1.1.1/test.json +118 -0
  355. package/data/craftbook-templates/on/onboarding-checklist/versions/1.0.3/craftbook.json +219 -0
  356. package/data/craftbook-templates/on/onboarding-checklist/versions/1.0.3/test.json +110 -0
  357. package/data/craftbook-templates/on/onboarding-flow/versions/1.0.3/craftbook.json +281 -0
  358. package/data/craftbook-templates/on/onboarding-flow/versions/1.0.3/test.json +97 -0
  359. package/data/craftbook-templates/on/oncall-handoff/versions/1.0.3/craftbook.json +219 -0
  360. package/data/craftbook-templates/on/oncall-handoff/versions/1.0.3/test.json +110 -0
  361. package/data/craftbook-templates/on/one-pager/versions/1.0.3/craftbook.json +281 -0
  362. package/data/craftbook-templates/on/one-pager/versions/1.0.3/test.json +110 -0
  363. package/data/craftbook-templates/op/ops-runbook/versions/1.0.3/craftbook.json +197 -0
  364. package/data/craftbook-templates/op/ops-runbook/versions/1.0.3/test.json +104 -0
  365. package/data/craftbook-templates/pa/page-spread/versions/1.0.3/craftbook.json +216 -0
  366. package/data/craftbook-templates/pa/page-spread/versions/1.0.3/test.json +132 -0
  367. package/data/craftbook-templates/pa/parser-grammar/versions/1.0.3/craftbook.json +283 -0
  368. package/data/craftbook-templates/pa/parser-grammar/versions/1.0.3/test.json +92 -0
  369. package/data/craftbook-templates/pe/perf-audit/versions/1.1.1/craftbook.json +320 -0
  370. package/data/craftbook-templates/pe/perf-audit/versions/1.1.1/test.json +162 -0
  371. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.1/craftbook.json +695 -0
  372. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.1/test.json +235 -0
  373. package/data/craftbook-templates/pe/pest-diagnosis/versions/1.0.3/craftbook.json +276 -0
  374. package/data/craftbook-templates/pe/pest-diagnosis/versions/1.0.3/test.json +122 -0
  375. package/data/craftbook-templates/ph/photo-cull/versions/1.0.3/craftbook.json +277 -0
  376. package/data/craftbook-templates/ph/photo-cull/versions/1.0.3/test.json +103 -0
  377. package/data/craftbook-templates/ph/physics-toy/versions/1.0.3/craftbook.json +222 -0
  378. package/data/craftbook-templates/ph/physics-toy/versions/1.0.3/test.json +99 -0
  379. package/data/craftbook-templates/pi/pitch-deck/versions/1.0.3/craftbook.json +279 -0
  380. package/data/craftbook-templates/pi/pitch-deck/versions/1.0.3/test.json +97 -0
  381. package/data/craftbook-templates/pl/plan/versions/1.0.1/craftbook.json +222 -0
  382. package/data/craftbook-templates/pl/plan/versions/1.0.1/test.json +91 -0
  383. package/data/craftbook-templates/pl/playtest-report/versions/1.0.3/craftbook.json +277 -0
  384. package/data/craftbook-templates/pl/playtest-report/versions/1.0.3/test.json +111 -0
  385. package/data/craftbook-templates/po/podcast-chaptering/versions/1.0.3/craftbook.json +276 -0
  386. package/data/craftbook-templates/po/podcast-chaptering/versions/1.0.3/test.json +103 -0
  387. package/data/craftbook-templates/po/portfolio-site/versions/1.0.3/craftbook.json +289 -0
  388. package/data/craftbook-templates/po/portfolio-site/versions/1.0.3/test.json +97 -0
  389. package/data/craftbook-templates/po/powerpoint-deck/versions/1.7.9/craftbook.json +589 -0
  390. package/data/craftbook-templates/po/powerpoint-deck/versions/1.7.9/test.json +240 -0
  391. package/data/craftbook-templates/pr/pr-security-review/versions/1.0.3/craftbook.json +273 -0
  392. package/data/craftbook-templates/pr/pr-security-review/versions/1.0.3/test.json +110 -0
  393. package/data/craftbook-templates/pr/practice-exam/versions/1.0.3/craftbook.json +296 -0
  394. package/data/craftbook-templates/pr/practice-exam/versions/1.0.3/test.json +117 -0
  395. package/data/craftbook-templates/pr/practice-session/versions/1.0.3/craftbook.json +250 -0
  396. package/data/craftbook-templates/pr/practice-session/versions/1.0.3/test.json +114 -0
  397. package/data/craftbook-templates/pr/pre-departure-countdown/versions/1.0.3/craftbook.json +277 -0
  398. package/data/craftbook-templates/pr/pre-departure-countdown/versions/1.0.3/test.json +97 -0
  399. package/data/craftbook-templates/pr/press-release/versions/1.0.3/craftbook.json +275 -0
  400. package/data/craftbook-templates/pr/press-release/versions/1.0.3/test.json +356 -0
  401. package/data/craftbook-templates/pr/price-tracker/versions/1.0.3/craftbook.json +220 -0
  402. package/data/craftbook-templates/pr/price-tracker/versions/1.0.3/test.json +150 -0
  403. package/data/craftbook-templates/pr/pricing-page/versions/1.0.3/craftbook.json +348 -0
  404. package/data/craftbook-templates/pr/pricing-page/versions/1.0.3/test.json +97 -0
  405. package/data/craftbook-templates/pr/product-descriptions/versions/1.0.3/craftbook.json +213 -0
  406. package/data/craftbook-templates/pr/product-descriptions/versions/1.0.3/test.json +110 -0
  407. package/data/craftbook-templates/pr/proposal-sow/versions/1.0.3/craftbook.json +281 -0
  408. package/data/craftbook-templates/pr/proposal-sow/versions/1.0.3/test.json +110 -0
  409. package/data/craftbook-templates/pu/pull-request-review/versions/1.9.1/craftbook.json +432 -0
  410. package/data/craftbook-templates/pu/pull-request-review/versions/1.9.1/test.json +141 -0
  411. package/data/craftbook-templates/pu/puzzle-pack-layout/versions/1.0.3/craftbook.json +233 -0
  412. package/data/craftbook-templates/pu/puzzle-pack-layout/versions/1.0.3/test.json +123 -0
  413. package/data/craftbook-templates/pw/pwa-offline/versions/1.0.3/craftbook.json +293 -0
  414. package/data/craftbook-templates/pw/pwa-offline/versions/1.0.3/test.json +97 -0
  415. package/data/craftbook-templates/qu/quarterly-summary/versions/1.0.3/craftbook.json +277 -0
  416. package/data/craftbook-templates/qu/quarterly-summary/versions/1.0.3/test.json +116 -0
  417. package/data/craftbook-templates/re/reading-list/versions/1.0.3/craftbook.json +218 -0
  418. package/data/craftbook-templates/re/reading-list/versions/1.0.3/test.json +110 -0
  419. package/data/craftbook-templates/re/receipt-intake/versions/1.0.3/craftbook.json +277 -0
  420. package/data/craftbook-templates/re/receipt-intake/versions/1.0.3/test.json +149 -0
  421. package/data/craftbook-templates/re/receipt-ocr-ledger/versions/1.0.3/craftbook.json +274 -0
  422. package/data/craftbook-templates/re/receipt-ocr-ledger/versions/1.0.3/test.json +104 -0
  423. package/data/craftbook-templates/re/reception-report/versions/1.0.2/craftbook.json +295 -0
  424. package/data/craftbook-templates/re/reception-report/versions/1.0.2/test.json +168 -0
  425. package/data/craftbook-templates/re/recipe-capture/versions/1.0.3/craftbook.json +277 -0
  426. package/data/craftbook-templates/re/recipe-capture/versions/1.0.3/test.json +128 -0
  427. package/data/craftbook-templates/re/record-a-relative/versions/1.0.3/craftbook.json +250 -0
  428. package/data/craftbook-templates/re/record-a-relative/versions/1.0.3/test.json +110 -0
  429. package/data/craftbook-templates/re/recurring-invoice-run/versions/1.0.3/craftbook.json +282 -0
  430. package/data/craftbook-templates/re/recurring-invoice-run/versions/1.0.3/test.json +104 -0
  431. package/data/craftbook-templates/re/refactor-module/versions/2.0.1/craftbook.json +693 -0
  432. package/data/craftbook-templates/re/refactor-module/versions/2.0.1/test.json +241 -0
  433. package/data/craftbook-templates/re/regex-builder/versions/1.0.3/craftbook.json +283 -0
  434. package/data/craftbook-templates/re/regex-builder/versions/1.0.3/test.json +92 -0
  435. package/data/craftbook-templates/re/release-announcement/versions/1.0.3/craftbook.json +290 -0
  436. package/data/craftbook-templates/re/release-announcement/versions/1.0.3/test.json +202 -0
  437. package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.3/craftbook.json +358 -0
  438. package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.3/test.json +138 -0
  439. package/data/craftbook-templates/re/release-notes/versions/1.0.4/craftbook.json +336 -0
  440. package/data/craftbook-templates/re/release-notes/versions/1.0.4/test.json +111 -0
  441. package/data/craftbook-templates/re/release-readiness-review/versions/1.1.1/craftbook.json +317 -0
  442. package/data/craftbook-templates/re/release-readiness-review/versions/1.1.1/test.json +110 -0
  443. package/data/craftbook-templates/re/reliability-review/versions/1.0.3/craftbook.json +281 -0
  444. package/data/craftbook-templates/re/reliability-review/versions/1.0.3/test.json +115 -0
  445. package/data/craftbook-templates/re/report-pdf/versions/1.1.3/craftbook.json +317 -0
  446. package/data/craftbook-templates/re/report-pdf/versions/1.1.3/test.json +98 -0
  447. package/data/craftbook-templates/re/research-report/versions/1.0.3/craftbook.json +279 -0
  448. package/data/craftbook-templates/re/research-report/versions/1.0.3/test.json +113 -0
  449. package/data/craftbook-templates/re/research-to-document/versions/1.2.3/craftbook.json +388 -0
  450. package/data/craftbook-templates/re/research-to-document/versions/1.2.3/test.json +243 -0
  451. package/data/craftbook-templates/re/rest-api/versions/1.0.4/craftbook.json +282 -0
  452. package/data/craftbook-templates/re/rest-api/versions/1.0.4/test.json +387 -0
  453. package/data/craftbook-templates/re/resume-cv/versions/1.0.3/craftbook.json +281 -0
  454. package/data/craftbook-templates/re/resume-cv/versions/1.0.3/test.json +97 -0
  455. package/data/craftbook-templates/re/reviewer-loop/versions/1.0.1/craftbook.json +144 -0
  456. package/data/craftbook-templates/re/reviewer-loop/versions/1.0.1/test.json +135 -0
  457. package/data/craftbook-templates/ro/rollback-plan/versions/1.0.3/craftbook.json +290 -0
  458. package/data/craftbook-templates/ro/rollback-plan/versions/1.0.3/test.json +162 -0
  459. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.6/craftbook.json +595 -0
  460. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.6/test.json +157 -0
  461. package/data/craftbook-templates/ro/rough-cut-assembly/versions/1.0.4/craftbook.json +302 -0
  462. package/data/craftbook-templates/ro/rough-cut-assembly/versions/1.0.4/test.json +137 -0
  463. package/data/craftbook-templates/ru/runbook/versions/1.0.3/craftbook.json +282 -0
  464. package/data/craftbook-templates/ru/runbook/versions/1.0.3/test.json +118 -0
  465. package/data/craftbook-templates/sc/schema-migration/versions/2.0.1/craftbook.json +619 -0
  466. package/data/craftbook-templates/sc/schema-migration/versions/2.0.1/test.json +225 -0
  467. package/data/craftbook-templates/sc/scrape-to-structured/versions/1.0.4/craftbook.json +274 -0
  468. package/data/craftbook-templates/sc/scrape-to-structured/versions/1.0.4/test.json +162 -0
  469. package/data/craftbook-templates/sc/script-automation/versions/1.0.3/craftbook.json +281 -0
  470. package/data/craftbook-templates/sc/script-automation/versions/1.0.3/test.json +162 -0
  471. package/data/craftbook-templates/sd/sdk-wrapper/versions/1.0.4/craftbook.json +282 -0
  472. package/data/craftbook-templates/sd/sdk-wrapper/versions/1.0.4/test.json +90 -0
  473. package/data/craftbook-templates/se/seasonal-maintenance-sweep/versions/1.0.3/craftbook.json +277 -0
  474. package/data/craftbook-templates/se/seasonal-maintenance-sweep/versions/1.0.3/test.json +110 -0
  475. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.5/craftbook.json +608 -0
  476. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.5/test.json +157 -0
  477. package/data/craftbook-templates/se/seo-meta-pack/versions/1.0.3/craftbook.json +213 -0
  478. package/data/craftbook-templates/se/seo-meta-pack/versions/1.0.3/test.json +97 -0
  479. package/data/craftbook-templates/sh/ship/versions/1.1.1/craftbook.json +301 -0
  480. package/data/craftbook-templates/sh/ship/versions/1.1.1/test.json +225 -0
  481. package/data/craftbook-templates/so/social-digest/versions/1.0.2/craftbook.json +233 -0
  482. package/data/craftbook-templates/so/social-digest/versions/1.0.2/test.json +168 -0
  483. package/data/craftbook-templates/so/social-thread/versions/1.0.3/craftbook.json +216 -0
  484. package/data/craftbook-templates/so/social-thread/versions/1.0.3/test.json +110 -0
  485. package/data/craftbook-templates/so/source-quality-audit/versions/1.0.3/craftbook.json +277 -0
  486. package/data/craftbook-templates/so/source-quality-audit/versions/1.0.3/test.json +158 -0
  487. package/data/craftbook-templates/sp/spa-dashboard/versions/1.0.3/craftbook.json +280 -0
  488. package/data/craftbook-templates/sp/spa-dashboard/versions/1.0.3/test.json +97 -0
  489. package/data/craftbook-templates/sp/spec-authoring/versions/2.0.5/craftbook.json +610 -0
  490. package/data/craftbook-templates/sp/spec-authoring/versions/2.0.5/test.json +162 -0
  491. package/data/craftbook-templates/sp/spec-doc/versions/1.0.3/craftbook.json +280 -0
  492. package/data/craftbook-templates/sp/spec-doc/versions/1.0.3/test.json +104 -0
  493. package/data/craftbook-templates/sp/spreadsheet-model/versions/1.0.3/craftbook.json +221 -0
  494. package/data/craftbook-templates/sp/spreadsheet-model/versions/1.0.3/test.json +160 -0
  495. package/data/craftbook-templates/sp/sprite-sheet/versions/1.0.3/craftbook.json +271 -0
  496. package/data/craftbook-templates/sp/sprite-sheet/versions/1.0.3/test.json +103 -0
  497. package/data/craftbook-templates/sq/sql-analysis/versions/1.0.3/craftbook.json +218 -0
  498. package/data/craftbook-templates/sq/sql-analysis/versions/1.0.3/test.json +104 -0
  499. package/data/craftbook-templates/st/standup-summary/versions/1.0.3/craftbook.json +219 -0
  500. package/data/craftbook-templates/st/standup-summary/versions/1.0.3/test.json +110 -0
  501. package/data/craftbook-templates/st/state-machine/versions/1.0.3/craftbook.json +283 -0
  502. package/data/craftbook-templates/st/state-machine/versions/1.0.3/test.json +92 -0
  503. package/data/craftbook-templates/st/status-report/versions/1.0.3/craftbook.json +283 -0
  504. package/data/craftbook-templates/st/status-report/versions/1.0.3/test.json +110 -0
  505. package/data/craftbook-templates/su/subscription-audit/versions/1.0.3/craftbook.json +277 -0
  506. package/data/craftbook-templates/su/subscription-audit/versions/1.0.3/test.json +104 -0
  507. package/data/craftbook-templates/su/subtitle-generator/versions/1.0.3/craftbook.json +264 -0
  508. package/data/craftbook-templates/su/subtitle-generator/versions/1.0.3/test.json +103 -0
  509. package/data/craftbook-templates/su/summarize-long/versions/1.0.3/craftbook.json +216 -0
  510. package/data/craftbook-templates/su/summarize-long/versions/1.0.3/test.json +110 -0
  511. package/data/craftbook-templates/su/survey-analysis/versions/1.0.3/craftbook.json +277 -0
  512. package/data/craftbook-templates/su/survey-analysis/versions/1.0.3/test.json +104 -0
  513. package/data/craftbook-templates/sv/svg-animation/versions/1.0.3/craftbook.json +219 -0
  514. package/data/craftbook-templates/sv/svg-animation/versions/1.0.3/test.json +97 -0
  515. package/data/craftbook-templates/ta/tailor-resume/versions/1.0.3/craftbook.json +226 -0
  516. package/data/craftbook-templates/ta/tailor-resume/versions/1.0.3/test.json +97 -0
  517. package/data/craftbook-templates/te/technical-documentation/versions/2.0.5/craftbook.json +582 -0
  518. package/data/craftbook-templates/te/technical-documentation/versions/2.0.5/test.json +174 -0
  519. package/data/craftbook-templates/te/test-coverage-review/versions/1.2.1/craftbook.json +320 -0
  520. package/data/craftbook-templates/te/test-coverage-review/versions/1.2.1/test.json +116 -0
  521. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.1/craftbook.json +590 -0
  522. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.1/test.json +195 -0
  523. package/data/craftbook-templates/th/thank-you-batch/versions/1.0.3/craftbook.json +280 -0
  524. package/data/craftbook-templates/th/thank-you-batch/versions/1.0.3/test.json +144 -0
  525. package/data/craftbook-templates/th/thank-you-sweep/versions/1.0.3/craftbook.json +280 -0
  526. package/data/craftbook-templates/th/thank-you-sweep/versions/1.0.3/test.json +142 -0
  527. package/data/craftbook-templates/th/threat-model/versions/1.0.3/craftbook.json +274 -0
  528. package/data/craftbook-templates/th/threat-model/versions/1.0.3/test.json +110 -0
  529. package/data/craftbook-templates/th/thumbnail-generator/versions/1.0.3/craftbook.json +214 -0
  530. package/data/craftbook-templates/th/thumbnail-generator/versions/1.0.3/test.json +103 -0
  531. package/data/craftbook-templates/ti/tileset-batch/versions/1.0.3/craftbook.json +321 -0
  532. package/data/craftbook-templates/ti/tileset-batch/versions/1.0.3/test.json +159 -0
  533. package/data/craftbook-templates/to/tone-rewrite/versions/1.0.3/craftbook.json +216 -0
  534. package/data/craftbook-templates/to/tone-rewrite/versions/1.0.3/test.json +110 -0
  535. package/data/craftbook-templates/to/topic-explainer/versions/1.0.3/craftbook.json +274 -0
  536. package/data/craftbook-templates/to/topic-explainer/versions/1.0.3/test.json +110 -0
  537. package/data/craftbook-templates/tr/transcribe-and-shownotes/versions/1.0.3/craftbook.json +250 -0
  538. package/data/craftbook-templates/tr/transcribe-and-shownotes/versions/1.0.3/test.json +101 -0
  539. package/data/craftbook-templates/tr/transcribe-audio/versions/1.0.3/craftbook.json +218 -0
  540. package/data/craftbook-templates/tr/transcribe-audio/versions/1.0.3/test.json +103 -0
  541. package/data/craftbook-templates/tr/transcribe-index/versions/1.0.3/craftbook.json +329 -0
  542. package/data/craftbook-templates/tr/transcribe-index/versions/1.0.3/test.json +154 -0
  543. package/data/craftbook-templates/tr/translate-content/versions/1.1.2/craftbook.json +139 -0
  544. package/data/craftbook-templates/tr/translate-content/versions/1.1.2/test.json +141 -0
  545. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.1/craftbook.json +589 -0
  546. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.1/test.json +221 -0
  547. package/data/craftbook-templates/ux/ux-update/versions/1.0.1/craftbook.json +604 -0
  548. package/data/craftbook-templates/ux/ux-update/versions/1.0.1/test.json +206 -0
  549. package/data/craftbook-templates/ve/version-bump/versions/1.1.1/craftbook.json +322 -0
  550. package/data/craftbook-templates/ve/version-bump/versions/1.1.1/test.json +92 -0
  551. package/data/craftbook-templates/vi/video-storyboard/versions/1.0.3/craftbook.json +221 -0
  552. package/data/craftbook-templates/vi/video-storyboard/versions/1.0.3/test.json +103 -0
  553. package/data/craftbook-templates/vi/visit-prep/versions/1.0.3/craftbook.json +274 -0
  554. package/data/craftbook-templates/vi/visit-prep/versions/1.0.3/test.json +97 -0
  555. package/data/craftbook-templates/vo/voiceover-script/versions/1.0.3/craftbook.json +216 -0
  556. package/data/craftbook-templates/vo/voiceover-script/versions/1.0.3/test.json +103 -0
  557. package/data/craftbook-templates/we/weak-spot-drill/versions/1.0.3/craftbook.json +291 -0
  558. package/data/craftbook-templates/we/weak-spot-drill/versions/1.0.3/test.json +124 -0
  559. package/data/craftbook-templates/we/web-app-crud/versions/1.0.3/craftbook.json +281 -0
  560. package/data/craftbook-templates/we/web-app-crud/versions/1.0.3/test.json +97 -0
  561. package/data/craftbook-templates/we/web-component/versions/1.0.3/craftbook.json +222 -0
  562. package/data/craftbook-templates/we/web-component/versions/1.0.3/test.json +97 -0
  563. package/data/craftbook-templates/we/webhook-handler/versions/1.0.3/craftbook.json +283 -0
  564. package/data/craftbook-templates/we/webhook-handler/versions/1.0.3/test.json +162 -0
  565. package/data/craftbook-templates/we/week-plan/versions/1.0.3/craftbook.json +276 -0
  566. package/data/craftbook-templates/we/week-plan/versions/1.0.3/test.json +258 -0
  567. package/data/craftbook-templates/we/weekly-menu-plan/versions/1.0.3/craftbook.json +277 -0
  568. package/data/craftbook-templates/we/weekly-menu-plan/versions/1.0.3/test.json +97 -0
  569. package/data/craftbook-templates/we/weekly-pipeline-review/versions/1.0.3/craftbook.json +214 -0
  570. package/data/craftbook-templates/we/weekly-pipeline-review/versions/1.0.3/test.json +104 -0
  571. package/data/craftbook-templates/we/weekly-review/versions/1.0.3/craftbook.json +219 -0
  572. package/data/craftbook-templates/we/weekly-review/versions/1.0.3/test.json +110 -0
  573. package/data/craftbook-templates/we/weekly-walkthrough/versions/1.0.3/craftbook.json +277 -0
  574. package/data/craftbook-templates/we/weekly-walkthrough/versions/1.0.3/test.json +138 -0
  575. package/data/craftbook-templates/wh/whitepaper/versions/1.0.3/craftbook.json +277 -0
  576. package/data/craftbook-templates/wh/whitepaper/versions/1.0.3/test.json +113 -0
  577. package/data/craftbook-templates/ye/year-in-review/versions/1.0.3/craftbook.json +250 -0
  578. package/data/craftbook-templates/ye/year-in-review/versions/1.0.3/test.json +145 -0
  579. package/data/craftbook-templates/yo/youtube-chapters-seo/versions/1.0.3/craftbook.json +271 -0
  580. package/data/craftbook-templates/yo/youtube-chapters-seo/versions/1.0.3/test.json +103 -0
  581. package/package.json +1 -1
  582. package/schemas/craftbook-doc.schema.json +86 -0
  583. package/schemas/craftbook-template-version.schema.json +86 -0
@@ -0,0 +1,249 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "title": "Snapshot-driven code review with a gated artifact report",
4
+ "objective": "Measure the snapshot-review class under volume: read a staged change-set snapshot from the artifacts drawer, ground findings in the actual diff, catch every seeded defect, raise nothing against the constructs that only look like defects, and produce a severity-ranked, file-cited report artifact whose verdict follows from the findings.",
5
+ "tags": [],
6
+ "prompt": "A change-set snapshot for review rev-eval-1 is staged in this project's artifacts drawer: reviews/rev-eval-1/manifest.json and reviews/rev-eval-1/changes.diff. Run the code-review craftbook against it and write the gated report artifact to reviews/rev-eval-1/report.md with write_artifact. The diff is the change set under review; the matching source files are in the workspace, and docs/review-conventions.md is the house style this codebase is reviewed against. Also leave the machine-readable finding list at the workspace path review-output/findings.json with write_file - a JSON array with one record per finding, each record naming the file (the path as it appears in the diff), the line, a severity of critical, major, minor or nit, a category, and a recommendation - so the follow-up fix pass can pick it up. Do not change any source file: review-output/findings.json is the only workspace file you write.",
7
+ "setup": {
8
+ "projectName": "Code Review Eval",
9
+ "about": "A small payments service. A seven-file change set is staged for review in the artifacts drawer; the house style it is reviewed against is documented in docs/review-conventions.md.",
10
+ "worker": {
11
+ "name": "Rex",
12
+ "role": "Reviewer"
13
+ },
14
+ "files": [
15
+ {
16
+ "path": "src/payment.js",
17
+ "content": "const db = require('./db');\n\nasync function chargeCustomer(req) {\n const amount = req.body.amount;\n const customerId = req.body.customerId;\n // TODO: validate amount server-side\n const rows = await db.query(\"SELECT * FROM customers WHERE id = '\" + customerId + \"'\");\n const customer = rows[0];\n console.log('charging', customerId, amount);\n const receipt = await db.query(\n \"INSERT INTO charges (customer_id, amount) VALUES ('\" + customerId + \"', \" + amount + \") RETURNING id\",\n );\n return { chargeId: receipt[0].id, customer: customer.name };\n}\n\nmodule.exports = { chargeCustomer };\n"
18
+ },
19
+ {
20
+ "path": "src/util.js",
21
+ "content": "function formatCents(cents) {\n return `$${(cents / 100).toFixed(2)}`;\n}\n\nmodule.exports = { formatCents };\n",
22
+ "modelInput": false
23
+ },
24
+ {
25
+ "path": "src/pagination.js",
26
+ "content": "const DEFAULT_PAGE_SIZE = 25;\n\nfunction pageOf(items, page, pageSize = DEFAULT_PAGE_SIZE) {\n const start = (page - 1) * pageSize;\n const end = start + pageSize + 1;\n return items.slice(start, end);\n}\n\nfunction pageCount(items, pageSize = DEFAULT_PAGE_SIZE) {\n return Math.ceil(items.length / pageSize);\n}\n\nmodule.exports = { pageOf, pageCount, DEFAULT_PAGE_SIZE };\n",
27
+ "modelInput": false
28
+ },
29
+ {
30
+ "path": "src/settings.js",
31
+ "content": "const fs = require('fs');\n\nfunction loadSettings(path) {\n try {\n return { ok: true, settings: JSON.parse(fs.readFileSync(path, 'utf8')) };\n } catch (err) {\n return { ok: true, settings: {} };\n }\n}\n\nmodule.exports = { loadSettings };\n",
32
+ "modelInput": false
33
+ },
34
+ {
35
+ "path": "src/export.js",
36
+ "content": "const fs = require('fs/promises');\n\nasync function exportCharges(db, outPath) {\n const handle = await fs.open(outPath, 'w');\n const rows = await db.query('SELECT id, customer_id, amount FROM charges ORDER BY id');\n for (const row of rows) {\n await handle.write(`${row.id},${row.customer_id},${row.amount}\\n`);\n }\n await handle.close();\n}\n\nmodule.exports = { exportCharges };\n",
37
+ "modelInput": false
38
+ },
39
+ {
40
+ "path": "src/customer.js",
41
+ "content": "// `== null` is the one loose comparison the house style allows: it matches\n// null and undefined together and nothing else, which is exactly what an\n// optional field needs. See docs/review-conventions.md.\nfunction displayName(customer) {\n if (customer.nickname == null) return customer.legalName;\n return customer.nickname;\n}\n\nfunction billingEmail(customer) {\n return customer.billingEmail == null ? customer.email : customer.billingEmail;\n}\n\nmodule.exports = { displayName, billingEmail };\n",
42
+ "modelInput": false
43
+ },
44
+ {
45
+ "path": "src/audit.js",
46
+ "content": "const logger = require('./logger');\n\n// Audit writes are best-effort: they must never delay or break the charge\n// that triggered them, so this call is deliberately not awaited. The\n// attached .catch is what keeps a rejected write from becoming an\n// unhandled rejection. See docs/review-conventions.md.\nfunction recordAudit(db, event) {\n db.insertAudit(event).catch((err) => logger.warn('audit write skipped', err));\n}\n\nmodule.exports = { recordAudit };\n",
47
+ "modelInput": false
48
+ },
49
+ {
50
+ "path": "src/errors.js",
51
+ "content": "const logger = require('./logger');\n\n// Express selects error middleware by ARITY: a handler is only registered\n// as an error handler when it declares exactly four parameters. `req` and\n// `next` are required by that signature even though this terminal handler\n// uses neither. See docs/review-conventions.md.\nfunction errorHandler(err, req, res, next) {\n logger.error('unhandled request error', err);\n res.status(500).json({ error: 'internal_error' });\n}\n\nfunction register(app) {\n app.use(errorHandler);\n}\n\nmodule.exports = { errorHandler, register };\n",
52
+ "modelInput": false
53
+ },
54
+ {
55
+ "path": "src/logger.js",
56
+ "content": "function warn(message, err) {\n process.stderr.write(`[warn] ${message}: ${err && err.message}\\n`);\n}\n\nfunction error(message, err) {\n process.stderr.write(`[error] ${message}: ${err && err.stack}\\n`);\n}\n\nmodule.exports = { warn, error };\n",
57
+ "modelInput": false
58
+ },
59
+ {
60
+ "path": "docs/review-conventions.md",
61
+ "content": "# Review conventions\n\nThe house rules this codebase is reviewed against.\n\n- Every SQL statement uses placeholders. A request value is never\n concatenated or interpolated into a query string.\n- Every acquired resource (file handle, connection, lock) is released on\n every path out of the function, including the error path.\n- A caught error is either handled or re-thrown. A catch block never\n reports success.\n- Slice and range bounds are half-open: `slice(start, start + size)`.\n- Debug logging does not ship.\n\n## Deliberate patterns - correct as written\n\nThese three shapes look like common smells and are not. They are house\nstyle, and a review must not raise them as findings.\n\n- `== null` is the one loose comparison the style allows. It matches null\n and undefined together and nothing else, which is precisely what an\n optional field needs. It is not to be tightened to `===`.\n- Best-effort background writes (audit, telemetry) are deliberately not\n awaited, so they cannot delay or break the request that triggered them.\n A `.catch` handler attached at the call site is the required form; a\n promise carrying a `.catch` is not a floating promise.\n- Express selects error middleware by arity: a handler is only registered\n as an error handler when it declares exactly four parameters. The\n parameters such a handler does not use are required by that signature\n and stay.\n"
62
+ },
63
+ {
64
+ "path": "reviews/rev-eval-1/manifest.json",
65
+ "surface": "artifact",
66
+ "content": "{\n \"version\": 1,\n \"reviewId\": \"rev-eval-1\",\n \"kind\": \"commit\",\n \"createdAt\": \"2026-07-29T09:00:00Z\",\n \"branch\": \"main\",\n \"headSha\": \"3d0c1a2\",\n \"baseRef\": \"HEAD\",\n \"files\": [\n {\n \"path\": \"src/payment.js\",\n \"kind\": \"modified\",\n \"additions\": 8,\n \"deletions\": 2\n },\n {\n \"path\": \"src/audit.js\",\n \"kind\": \"added\",\n \"additions\": 11,\n \"deletions\": 0\n },\n {\n \"path\": \"src/customer.js\",\n \"kind\": \"added\",\n \"additions\": 13,\n \"deletions\": 0\n },\n {\n \"path\": \"src/errors.js\",\n \"kind\": \"added\",\n \"additions\": 16,\n \"deletions\": 0\n },\n {\n \"path\": \"src/export.js\",\n \"kind\": \"added\",\n \"additions\": 12,\n \"deletions\": 0\n },\n {\n \"path\": \"src/pagination.js\",\n \"kind\": \"added\",\n \"additions\": 13,\n \"deletions\": 0\n },\n {\n \"path\": \"src/settings.js\",\n \"kind\": \"added\",\n \"additions\": 11,\n \"deletions\": 0\n }\n ],\n \"totalFiles\": 7,\n \"filesTruncated\": false,\n \"diffFile\": \"changes.diff\",\n \"diffChars\": 4396,\n \"diffTruncated\": false,\n \"notes\": []\n}\n"
67
+ },
68
+ {
69
+ "path": "reviews/rev-eval-1/changes.diff",
70
+ "surface": "artifact",
71
+ "content": "diff --git a/src/payment.js b/src/payment.js\nindex 3d0c1a2..9f4b7e1 100644\n--- a/src/payment.js\n+++ b/src/payment.js\n@@ -1,12 +1,16 @@\n const db = require('./db');\n \n async function chargeCustomer(req) {\n const amount = req.body.amount;\n const customerId = req.body.customerId;\n- const rows = await db.query('SELECT * FROM customers WHERE id = $1', [customerId]);\n+ // TODO: validate amount server-side\n+ const rows = await db.query(\"SELECT * FROM customers WHERE id = '\" + customerId + \"'\");\n const customer = rows[0];\n- const receipt = await db.query('INSERT INTO charges (customer_id, amount) VALUES ($1, $2) RETURNING id', [customerId, amount]);\n+ console.log('charging', customerId, amount);\n+ const receipt = await db.query(\n+ \"INSERT INTO charges (customer_id, amount) VALUES ('\" + customerId + \"', \" + amount + \") RETURNING id\",\n+ );\n return { chargeId: receipt[0].id, customer: customer.name };\n }\n \n module.exports = { chargeCustomer };\ndiff --git a/src/audit.js b/src/audit.js\nnew file mode 100644\nindex 0000000..297df83\n--- /dev/null\n+++ b/src/audit.js\n@@ -0,0 +1,11 @@\n+const logger = require('./logger');\n+\n+// Audit writes are best-effort: they must never delay or break the charge\n+// that triggered them, so this call is deliberately not awaited. The\n+// attached .catch is what keeps a rejected write from becoming an\n+// unhandled rejection. See docs/review-conventions.md.\n+function recordAudit(db, event) {\n+ db.insertAudit(event).catch((err) => logger.warn('audit write skipped', err));\n+}\n+\n+module.exports = { recordAudit };\ndiff --git a/src/customer.js b/src/customer.js\nnew file mode 100644\nindex 0000000..c722780\n--- /dev/null\n+++ b/src/customer.js\n@@ -0,0 +1,13 @@\n+// `== null` is the one loose comparison the house style allows: it matches\n+// null and undefined together and nothing else, which is exactly what an\n+// optional field needs. See docs/review-conventions.md.\n+function displayName(customer) {\n+ if (customer.nickname == null) return customer.legalName;\n+ return customer.nickname;\n+}\n+\n+function billingEmail(customer) {\n+ return customer.billingEmail == null ? customer.email : customer.billingEmail;\n+}\n+\n+module.exports = { displayName, billingEmail };\ndiff --git a/src/errors.js b/src/errors.js\nnew file mode 100644\nindex 0000000..7107b89\n--- /dev/null\n+++ b/src/errors.js\n@@ -0,0 +1,16 @@\n+const logger = require('./logger');\n+\n+// Express selects error middleware by ARITY: a handler is only registered\n+// as an error handler when it declares exactly four parameters. `req` and\n+// `next` are required by that signature even though this terminal handler\n+// uses neither. See docs/review-conventions.md.\n+function errorHandler(err, req, res, next) {\n+ logger.error('unhandled request error', err);\n+ res.status(500).json({ error: 'internal_error' });\n+}\n+\n+function register(app) {\n+ app.use(errorHandler);\n+}\n+\n+module.exports = { errorHandler, register };\ndiff --git a/src/export.js b/src/export.js\nnew file mode 100644\nindex 0000000..01f5dcf\n--- /dev/null\n+++ b/src/export.js\n@@ -0,0 +1,12 @@\n+const fs = require('fs/promises');\n+\n+async function exportCharges(db, outPath) {\n+ const handle = await fs.open(outPath, 'w');\n+ const rows = await db.query('SELECT id, customer_id, amount FROM charges ORDER BY id');\n+ for (const row of rows) {\n+ await handle.write(`${row.id},${row.customer_id},${row.amount}\\n`);\n+ }\n+ await handle.close();\n+}\n+\n+module.exports = { exportCharges };\ndiff --git a/src/pagination.js b/src/pagination.js\nnew file mode 100644\nindex 0000000..008b78a\n--- /dev/null\n+++ b/src/pagination.js\n@@ -0,0 +1,13 @@\n+const DEFAULT_PAGE_SIZE = 25;\n+\n+function pageOf(items, page, pageSize = DEFAULT_PAGE_SIZE) {\n+ const start = (page - 1) * pageSize;\n+ const end = start + pageSize + 1;\n+ return items.slice(start, end);\n+}\n+\n+function pageCount(items, pageSize = DEFAULT_PAGE_SIZE) {\n+ return Math.ceil(items.length / pageSize);\n+}\n+\n+module.exports = { pageOf, pageCount, DEFAULT_PAGE_SIZE };\ndiff --git a/src/settings.js b/src/settings.js\nnew file mode 100644\nindex 0000000..b7c463b\n--- /dev/null\n+++ b/src/settings.js\n@@ -0,0 +1,11 @@\n+const fs = require('fs');\n+\n+function loadSettings(path) {\n+ try {\n+ return { ok: true, settings: JSON.parse(fs.readFileSync(path, 'utf8')) };\n+ } catch (err) {\n+ return { ok: true, settings: {} };\n+ }\n+}\n+\n+module.exports = { loadSettings };\n"
72
+ },
73
+ {
74
+ "path": "tests/code-review-oracle.mjs",
75
+ "content": "// Precision/recall oracle for the snapshot code review.\n//\n// Run by the harness with the reviewed workspace as cwd. It grades the two\n// halves of a real review separately, because recall alone is passed by a\n// review that flags everything:\n//\n// RECALL - each of the four seeded defects in the change set is\n// reported, against the right file and as the right class.\n// PRECISION - no finding repeats one of the three shotgun smells the\n// change set deliberately baits, and no finding is raised\n// against a file outside the change set.\n//\n// Two rules keep this from punishing correct work.\n//\n// First, defect classes are matched by the ordinary vocabulary of the\n// class, never by wording this fixture invented: \"26 items per page\",\n// \"the end index is one too high\" and \"half-open range\" all count as the\n// pagination defect. The bar is \"a real review of this class\", not this\n// scenario's phrasing.\n//\n// Second, the precision half is scoped to the SMELL, not to the file.\n// src/customer.js, src/audit.js and src/errors.js are baited with a\n// documented house-style construct that must not be flagged - but they\n// are still ordinary code, and a reviewer may legitimately find\n// something else in them (a missing res.headersSent guard in the error\n// handler, say, or a synchronous throw escaping the best-effort audit\n// call). Failing those would punish the exact deep reading this eval is\n// trying to reward, so only a finding that IS the baited smell counts\n// against precision. Whole-file scope is reserved for the two files that\n// are not in the change set at all, where any finding is out of scope by\n// the book's own rule.\n//\n// Precision is graded on the finding records only: a report that\n// discusses a correct construct and explicitly clears it is good\n// reviewing, and is not penalised here.\nimport { readFileSync } from 'node:fs';\n\n/**\n * Fail with the message ALONE on stderr.\n *\n * A thrown Error would work, but the harness feeds this script's stderr\n * into the model's repair nudge verbatim, and an uncaught throw pads that\n * nudge with a Node stack trace and a version banner. The actionable\n * sentence is what the next attempt needs; the stack is noise that pushes\n * it out of view on a small model.\n */\nfunction fail(message) {\n console.error(message);\n process.exit(1);\n}\n\n\nconst FINDINGS = 'review-output/findings.json';\n\nlet raw;\ntry {\n raw = readFileSync(FINDINGS, 'utf8');\n} catch {\n fail(FINDINGS + ' does not exist - the machine-readable finding list is required');\n}\n\nlet findings;\ntry {\n findings = JSON.parse(raw.replace(/^\\uFEFF/, ''));\n} catch (err) {\n fail(FINDINGS + ' is not valid JSON: ' + err.message);\n}\nif (!Array.isArray(findings)) {\n const nested =\n findings && typeof findings === 'object'\n ? Object.values(findings).find((value) => Array.isArray(value))\n : null;\n if (!nested) fail(FINDINGS + ' must be an array of finding records');\n findings = nested;\n}\nfindings = findings.filter((finding) => finding && typeof finding === 'object');\n\n// Every PROSE string anywhere in the record, nested objects and arrays\n// included - a reviewer who nests the explanation under `detail` or\n// splits it across an array is saying the same thing. Citation and\n// identifier fields are excluded: they are addresses, not description,\n// and letting them through means a line number or a path fragment can\n// satisfy a defect-class matcher by coincidence.\nconst CITATION_KEYS = new Set([\n 'file',\n 'path',\n 'filename',\n 'location',\n 'line',\n 'lines',\n 'endline',\n 'startline',\n 'column',\n 'col',\n 'id',\n '#',\n]);\nconst collectStrings = (value, out) => {\n if (typeof value === 'string') out.push(value);\n else if (Array.isArray(value)) for (const item of value) collectStrings(item, out);\n else if (value && typeof value === 'object') {\n for (const [key, item] of Object.entries(value)) {\n if (CITATION_KEYS.has(key.toLowerCase())) continue;\n collectStrings(item, out);\n }\n }\n return out;\n};\nconst text = (finding) => collectStrings(finding, []).join(' ').toLowerCase();\n\nconst fileOf = (finding) =>\n String(finding.file ?? finding.path ?? finding.filename ?? finding.location ?? '')\n .replace(/\\\\/g, '/')\n .replace(/^\\.\\//, '')\n .replace(/^[ab]\\//, '')\n .replace(/\\s*\\([^()]*\\)\\s*$/, '')\n .replace(/[:#]\\s*L?\\d+(?:\\s*-\\s*L?\\d+)?\\s*$/, '')\n .trim();\n\n// Basenames are unique across every seeded file, so a bare `payment.js`\n// citation resolves the same as `src/payment.js`.\nconst onFile = (path) => {\n const base = path.slice(path.lastIndexOf('/') + 1);\n const full = new RegExp('(^|/)' + path.replace(/\\./g, '\\\\.') + '$');\n const bare = new RegExp('^' + base.replace(/\\./g, '\\\\.') + '$');\n return findings.filter((finding) => {\n const cited = fileOf(finding);\n return full.test(cited) || bare.test(cited);\n });\n};\n\nconst REQUIRED = [\n {\n file: 'src/payment.js',\n label: 'the customer and charge queries build SQL by string concatenation from req.body',\n match: (t) =>\n /injection|sqli\\b|parameteri|parametri|placeholder|prepared statement|\\bbind\\b|\\bbinding\\b|bound parameter|concatenat|interpolat|escap|sanitiz|quoting/.test(\n t,\n ) ||\n (/\\bsql\\b|\\bquery\\b|\\bqueries\\b|statement/.test(t) &&\n /untrusted|user[- ](?:input|supplied|controlled|data)|req\\.body|request (?:value|data|input|body)|unsafe|unsanitiz|unvalidated|string (?:concat|building|built)|built from|splic/.test(\n t,\n )),\n },\n {\n file: 'src/pagination.js',\n label: 'pageOf is off by one on its slice end bound, so pages overlap by a row',\n match: (t) =>\n /off.?by.?one|\\bslice\\b|\\bbound(?:ary|aries|s)?\\b|half.?open|exclusive|inclusive|overlap|duplicat|repeat|reappear|one too many|one (?:extra|more)|too many|extra (?:item|row|record|element|entry|result)|\\+\\s?1\\b|pagesize \\+|\\+ pagesize|increment|\\b26\\b|end (?:index|bound|offset|position)|last (?:item|row|record|element)/.test(\n t,\n ),\n },\n {\n file: 'src/settings.js',\n label: 'loadSettings swallows the parse error and still reports ok: true',\n match: (t) =>\n /swallow|silent|suppress|\\bmask|\\bhid(?:e|es|den|ing)|\\bignor|empty catch|catch block|\\bok\\b|\\btrue\\b|success|succeed|re-?throw|rethrow|propagat|bubble|surfac|indistinguishable|no indication|cannot tell|unaware|misleading|misreport|false (?:success|positive)|as if|pretend/.test(\n t,\n ),\n },\n {\n file: 'src/export.js',\n label: 'exportCharges leaks the file handle when the query or a write throws',\n match: (t) =>\n /leak|\\bclos(?:e|es|ed|ing)\\b|\\bfinally\\b|clean.?up|releas|dispos|\\bhandle\\b|descriptor|\\bfd\\b|resource|left open|remains open|stays open|still open|dangling|exhaust|unclosed/.test(\n t,\n ),\n },\n];\n\nconst missing = REQUIRED.filter(\n (required) => !onFile(required.file).some((finding) => required.match(text(finding))),\n);\nif (missing.length > 0) {\n const reported = findings.map((finding) => fileOf(finding) || '?').join(', ') || '(nothing)';\n fail(\n 'RECALL SHORTFALL - the change set holds four separate defects and these were not reported: ' +\n missing.map((entry) => entry.file + ' (' + entry.label + ')').join('; ') +\n '. Files carrying a reported finding: ' +\n reported +\n '. Re-walk changes.diff hunk by hunk; every defect above is visible in the added lines.',\n );\n}\n\n// Baited smells. Each of these three files carries a construct that looks\n// like a common lint smell and is documented house style in\n// docs/review-conventions.md. Only a finding that raises THAT construct\n// is a precision failure; any other observation about the file is fair\n// review work and passes.\nconst BAITED = [\n {\n file: 'src/customer.js',\n smell: 'loose equality',\n matches: (t) =>\n /[=!]==?|loose equal|strict equal|\\bequality\\b|double equals|triple equals|coerc|nullish|\\?\\?/.test(\n t,\n ),\n why: '`== null` is the documented house idiom for a null-or-undefined check (docs/review-conventions.md) and is not to be tightened',\n },\n {\n file: 'src/audit.js',\n smell: 'floating / unawaited promise',\n matches: (t) =>\n /floating|un-?awaited|not awaited|missing await|no await|without await|should (?:be )?await|add (?:an )?await|\\bawait\\b|fire.?and.?forget|dangling promise|unhandled (?:promise )?rejection/.test(\n t,\n ) &&\n // A reviewer who spots that a SYNCHRONOUS throw from insertAudit\n // still escapes into the charge path has found something real, not\n // the bait. That finding is welcome.\n !/synchronous|synchronously|thenable|non-?promise|not (?:return )?a promise|does not return|returns undefined|before the promise/.test(\n t,\n ),\n why: 'the audit write is deliberately not awaited and carries a .catch, which is the required form for a best-effort write (docs/review-conventions.md)',\n },\n {\n file: 'src/errors.js',\n smell: 'unused parameters',\n matches: (t) =>\n /unused|not used|never used|un-?referenced|no-unused-vars|underscore|_req|_next|dead (?:parameter|argument)|(?:remove|drop|omit) (?:the )?(?:`?req`?|`?next`?|parameter|argument)|unnecessary (?:parameter|argument)/.test(\n t,\n ),\n why: \"Express registers error middleware by arity, so the four-parameter signature and the parameters it does not use are required (docs/review-conventions.md)\",\n },\n];\n\n// Not in manifest.json's seven-file list and not in changes.diff. The\n// book says to discuss only files in the change set, so any finding here\n// is out of scope whatever it says.\nconst OUT_OF_SCOPE = [\n { file: 'src/util.js', why: 'it is not one of the seven files in manifest.json' },\n { file: 'src/logger.js', why: 'it is not one of the seven files in manifest.json' },\n];\n\nconst nameOf = (finding) =>\n String(finding.category ?? finding.finding ?? finding.title ?? 'unnamed');\n\nconst wrong = [];\nfor (const bait of BAITED) {\n for (const finding of onFile(bait.file)) {\n if (!bait.matches(text(finding))) continue;\n wrong.push(bait.file + ' (' + nameOf(finding) + ' - ' + bait.smell + ') - ' + bait.why);\n }\n}\nfor (const out of OUT_OF_SCOPE) {\n for (const finding of onFile(out.file)) {\n wrong.push(out.file + ' (' + nameOf(finding) + ') - ' + out.why);\n }\n}\nif (wrong.length > 0) {\n fail(\n 'PRECISION SHORTFALL - drop these records from ' +\n FINDINGS +\n ': ' +\n wrong.join('; ') +\n '. A review that raises everything is not usable. Re-read docs/review-conventions.md, ' +\n 'which names the shapes that are deliberate house style, and re-read manifest.json for ' +\n 'which files are actually under review. Discussing a construct in report.md and clearing ' +\n 'it is fine - listing it as a finding is not. Any OTHER defect you find in these files is ' +\n 'welcome; only the constructs named above are off limits.',\n );\n}\n\nconsole.log(\n 'CODEREVIEW_ORACLE ok - all 4 seeded defects reported (src/payment.js, src/pagination.js, ' +\n 'src/settings.js, src/export.js) and none of the 3 baited house-style smells or 2 ' +\n 'out-of-scope files carries a finding.',\n);\n",
76
+ "surface": "harness",
77
+ "modelInput": false
78
+ }
79
+ ]
80
+ },
81
+ "mocks": [],
82
+ "success": {
83
+ "summary": "reviews/rev-eval-1/report.md exists in the artifacts drawer with Summary/Findings/Verdict sections, a severity table citing the flawed files, and a request-changes verdict; review-output/findings.json holds one record per finding carrying at least file, line, severity, category and recommendation (extra context such as a title or a cwe is welcome), lists every seeded defect (unparameterized SQL, the off-by-one page bound, the swallowed settings error, the leaked export file handle), repeats none of the three documented house-style smells, and raises nothing against the two files outside the change set.",
84
+ "deliverables": [
85
+ {
86
+ "path": "reviews/rev-eval-1/report.md",
87
+ "kind": "markdown-report",
88
+ "artifact": true,
89
+ "minBytes": 400,
90
+ "checks": [
91
+ {
92
+ "kind": "contains",
93
+ "file": "reviews/rev-eval-1/report.md",
94
+ "pattern": "##\\s+Summary",
95
+ "label": "Summary section",
96
+ "artifact": true
97
+ },
98
+ {
99
+ "kind": "contains",
100
+ "file": "reviews/rev-eval-1/report.md",
101
+ "pattern": "##\\s+Findings",
102
+ "label": "Findings section",
103
+ "artifact": true
104
+ },
105
+ {
106
+ "kind": "contains",
107
+ "file": "reviews/rev-eval-1/report.md",
108
+ "pattern": "Verdict:\\s*request-changes",
109
+ "label": "request-changes verdict (SQL concat is at least major)",
110
+ "artifact": true
111
+ },
112
+ {
113
+ "kind": "contains",
114
+ "file": "reviews/rev-eval-1/report.md",
115
+ "pattern": "src/payment\\.js",
116
+ "label": "cites the flawed file",
117
+ "artifact": true
118
+ },
119
+ {
120
+ "kind": "tableShape",
121
+ "file": "reviews/rev-eval-1/report.md",
122
+ "requiredColumns": [
123
+ "Severity",
124
+ "File",
125
+ "Finding"
126
+ ],
127
+ "minRows": 1,
128
+ "artifact": true
129
+ }
130
+ ]
131
+ },
132
+ {
133
+ "path": "review-output/findings.json",
134
+ "kind": "json",
135
+ "minBytes": 300,
136
+ "checks": [
137
+ {
138
+ "kind": "sniff",
139
+ "file": "review-output/findings.json",
140
+ "sniff": "json-valid"
141
+ },
142
+ {
143
+ "kind": "recordSchema",
144
+ "file": "review-output/findings.json",
145
+ "format": "json",
146
+ "minRows": 4,
147
+ "fields": [
148
+ {
149
+ "name": "file",
150
+ "type": "nonempty",
151
+ "required": true
152
+ },
153
+ {
154
+ "name": "line",
155
+ "type": "^\\d+(\\s*-\\s*\\d+)?$",
156
+ "required": true
157
+ },
158
+ {
159
+ "name": "severity",
160
+ "type": "^([Cc]ritical|[Mm]ajor|[Mm]inor|[Nn]it|CRITICAL|MAJOR|MINOR|NIT)$",
161
+ "required": true
162
+ },
163
+ {
164
+ "name": "category",
165
+ "type": "nonempty",
166
+ "required": true
167
+ },
168
+ {
169
+ "name": "recommendation",
170
+ "type": "nonempty",
171
+ "required": true
172
+ }
173
+ ],
174
+ "allowExtraFields": true
175
+ },
176
+ {
177
+ "kind": "nodeScriptPasses",
178
+ "script": "tests/code-review-oracle.mjs",
179
+ "timeoutMs": 30000,
180
+ "requiredOutput": [
181
+ {
182
+ "pattern": "CODEREVIEW_ORACLE ok",
183
+ "label": "every seeded defect reported, and no correct-as-written construct reported"
184
+ }
185
+ ]
186
+ }
187
+ ]
188
+ }
189
+ ],
190
+ "taskNotes": {
191
+ "requireCraftbookTask": true,
192
+ "checks": [
193
+ {
194
+ "kind": "contains",
195
+ "file": "task-notes.md",
196
+ "pattern": "Verdict:",
197
+ "flags": "i"
198
+ }
199
+ ]
200
+ },
201
+ "unchangedFixtures": [
202
+ "src/payment.js",
203
+ "src/util.js",
204
+ "src/pagination.js",
205
+ "src/settings.js",
206
+ "src/export.js",
207
+ "src/customer.js",
208
+ "src/audit.js",
209
+ "src/errors.js",
210
+ "src/logger.js",
211
+ "docs/review-conventions.md"
212
+ ]
213
+ },
214
+ "rubric": {
215
+ "artifact": {
216
+ "path": "reviews/rev-eval-1/report.md",
217
+ "kind": "markdown"
218
+ },
219
+ "axes": [
220
+ {
221
+ "name": "grounding",
222
+ "description": "Findings reference code that actually appears in changes.diff; nothing is invented and cited lines exist."
223
+ },
224
+ {
225
+ "name": "precision",
226
+ "description": "The three documented house-style constructs (the `== null` check, the unawaited best-effort audit write with its .catch, the four-parameter Express error handler) are not raised as findings, and the two files outside the change set (src/util.js, src/logger.js) carry no findings at all; if a house-style construct is discussed it is to clear it. A different, real defect found in one of those three files is good review work and counts in its favour, not against it."
227
+ },
228
+ {
229
+ "name": "severity-judgment",
230
+ "description": "The SQL string concatenation, the off-by-one page bound, the swallowed settings error and the leaked export file handle are rated critical or major; the console.log and TODO are minor or nit - severities proportionate to impact."
231
+ },
232
+ {
233
+ "name": "actionability",
234
+ "description": "Every finding carries a concrete, minimal recommendation (e.g. return to parameterized queries, close the handle in a finally), not generic advice."
235
+ },
236
+ {
237
+ "name": "verdict-consistency",
238
+ "description": "The verdict follows mechanically from the findings table: any critical or major finding yields request-changes."
239
+ }
240
+ ],
241
+ "contextNote": "The report is an artifacts-drawer file and review-output/findings.json is the single workspace file the reviewer writes - no source file may change. Some of the reviewed code only looks wrong: docs/review-conventions.md records which shapes are deliberate house style. src/util.js and src/logger.js are in the workspace as context but are not in the change set - manifest.json's seven files are."
242
+ },
243
+ "qualityFocus": [
244
+ "evidence-grounded review",
245
+ "review precision",
246
+ "file citations",
247
+ "artifact deliverable discipline"
248
+ ]
249
+ }
@@ -0,0 +1,280 @@
1
+ {
2
+ "id": "codebase-refactoring-review",
3
+ "name": "Codebase Refactoring Review",
4
+ "description": "Review an entire codebase for the least cogent, highest-leverage refactoring opportunities without changing source. Uses the repository map and per-file AI health index to rank weak areas, then verifies each lead in the real code and leaves a file-and-line-cited morning report with sequenced refactor plans, risk, effort, and tests that must protect behavior. Use for a weekly code-health sweep, refactoring review, technical-debt triage, finding code smells, or deciding which files should be refactored first.\n\nA gallery craftbook generated from an archetype spec. It runs\n`phase → (per-phase gate) → … → evaluate → (loop) → finish`. Each build\nphase that produces a checkable artifact is followed by a **runtime\ngate-checkpoint** — the runtime verifies the artifact and routes with no\nmodel turn, looping back to redo the phase on a miss. The final `evaluate`\nstep holds a static deliverable gate plus a reviewer QA pass. What it adds\nover the generic `build-loop`: a specialist role per phase, a\ndomain-correct ordering, and a concrete per-phase quality bar.\n\nDeliverables marked \"artifact\" land in the project's artifacts drawer (`write_artifact` / `read_artifact`), not the shipped workspace — review output is not product source.\n\nPhases:\n\n1. Rank weak areas (reviewer) — use the repo map and per-file health index to build a coverage-aware candidate list → gated on artifact `{{workPath}}/refactoring/candidates.md` (markdown-notes)\n2. Verify refactoring candidates (reviewer) — inspect candidate symbols, responsibilities, callers, and tests in real source → gated on artifact `{{workPath}}/refactoring/verified.md` (markdown-notes)\n3. Write the refactoring report (reviewer) — prioritized code-health report with safe, sequenced refactor plans → gated on artifact `{{workPath}}/refactoring-review.md` (markdown-report)\n\nThe gates never advance with an unmet criterion, and loop back to the\nowning phase to fix named gaps.\n",
5
+ "entryStepId": "rank",
6
+ "triggers": [
7
+ "codebase refactoring review",
8
+ "what should we refactor",
9
+ "find the least cogent code",
10
+ "weekly code health review",
11
+ "technical debt sweep",
12
+ "nightly refactoring review"
13
+ ],
14
+ "toolsets": [
15
+ {
16
+ "toolsetId": "builtin.code-intel",
17
+ "autoAllow": true,
18
+ "reason": "rank indexed file-health leads and inspect only the relevant symbols"
19
+ },
20
+ {
21
+ "toolsetId": "builtin.git",
22
+ "autoAllow": true,
23
+ "reason": "read-only history and churn evidence for prioritizing refactors"
24
+ }
25
+ ],
26
+ "paramSchema": {
27
+ "type": "object",
28
+ "properties": {
29
+ "workPath": {
30
+ "type": "string",
31
+ "title": "Working folder",
32
+ "description": "Per-task working folder in the artifacts drawer. Defaults to this task's own folder so runs never collide; override with a stable name when you deliberately want runs to share files.",
33
+ "default": "{{task.dir}}"
34
+ }
35
+ }
36
+ },
37
+ "steps": [
38
+ {
39
+ "id": "rank",
40
+ "name": "Rank weak areas",
41
+ "description": "use the repo map and per-file health index to build a coverage-aware candidate list",
42
+ "prompt": "Start with `map_repo` and record the indexed review coverage (reviewed/eligible), average health, major-issue count, and worst files. Call `list_file_issues` across the repo, then use `search_code` for cross-cutting duplication, oversized orchestration, unclear ownership, error handling, and tightly coupled state. If git history is available, use read-only `run_git` queries to add churn/fix-frequency evidence; missing history is not a failure. Rank candidate files or cohesive areas using explicit factors: low indexed health, confirmed major issues, too many responsibilities, coupling/fan-out, duplication, change frequency, test difficulty, and blast radius. Do not call an indexed lead a finding yet and do not modify source. Write the coverage statement, ranking method, and top candidates to `{{workPath}}/refactoring/candidates.md`.\n\nThe deliverable `{{workPath}}/refactoring/candidates.md` lands in the project's artifacts drawer — write it with `write_artifact` and read it back with `read_artifact`; the shipped workspace stays untouched.",
43
+ "suggestedRole": "reviewer",
44
+ "advanceWhen": {
45
+ "file": "{{workPath}}/refactoring/candidates.md",
46
+ "minBytes": 1,
47
+ "sniff": "nonempty",
48
+ "artifact": true
49
+ },
50
+ "gate": {
51
+ "at": "completion",
52
+ "checks": [
53
+ {
54
+ "kind": "minBytes",
55
+ "file": "{{workPath}}/refactoring/candidates.md",
56
+ "bytes": 120,
57
+ "artifact": true
58
+ },
59
+ {
60
+ "kind": "sniff",
61
+ "file": "{{workPath}}/refactoring/candidates.md",
62
+ "sniff": "nonempty",
63
+ "artifact": true
64
+ }
65
+ ],
66
+ "onReject": "rank",
67
+ "maxAttempts": 3
68
+ },
69
+ "next": "verify",
70
+ "toolPolicy": {
71
+ "disallowBuiltinToolsets": [
72
+ "ai-apps",
73
+ "archives",
74
+ "audio",
75
+ "browser-automation",
76
+ "code-execution",
77
+ "craftbooks",
78
+ "data-tables",
79
+ "entity-intel",
80
+ "image-intel",
81
+ "images",
82
+ "role-delegation",
83
+ "role-delegation-escalation",
84
+ "security-intel",
85
+ "team-management",
86
+ "videos",
87
+ "web",
88
+ "workspace-fs-write"
89
+ ],
90
+ "outputMedium": "artifact"
91
+ }
92
+ },
93
+ {
94
+ "id": "verify",
95
+ "name": "Verify refactoring candidates",
96
+ "description": "inspect candidate symbols, responsibilities, callers, and tests in real source",
97
+ "prompt": "Verify every shortlisted candidate in source. Call `file_review` for the indexed rationale, `outline_file` before reading a large file, `read_symbol` for the implicated units, and `find_references` to understand callers and blast radius. Locate tests with `search_code`/`grep_files`. For each confirmed candidate record real file:line evidence, the current responsibilities, the specific cohesion/coupling/duplication/testability problem, why it matters, a bounded refactor seam, dependencies and migration order, behavior-preserving tests required first, effort, risk, and expected payoff. Reject false-positive index leads explicitly. Prefer a smaller ranked list of verified opportunities over a long smell inventory. Write the evidence matrix to `{{workPath}}/refactoring/verified.md`; do not change code.\n\nThe deliverable `{{workPath}}/refactoring/verified.md` lands in the project's artifacts drawer — write it with `write_artifact` and read it back with `read_artifact`; the shipped workspace stays untouched.",
98
+ "suggestedRole": "reviewer",
99
+ "advanceWhen": {
100
+ "file": "{{workPath}}/refactoring/verified.md",
101
+ "minBytes": 1,
102
+ "sniff": "nonempty",
103
+ "artifact": true
104
+ },
105
+ "gate": {
106
+ "at": "completion",
107
+ "checks": [
108
+ {
109
+ "kind": "minBytes",
110
+ "file": "{{workPath}}/refactoring/verified.md",
111
+ "bytes": 120,
112
+ "artifact": true
113
+ },
114
+ {
115
+ "kind": "sniff",
116
+ "file": "{{workPath}}/refactoring/verified.md",
117
+ "sniff": "nonempty",
118
+ "artifact": true
119
+ }
120
+ ],
121
+ "onReject": "verify",
122
+ "maxAttempts": 3
123
+ },
124
+ "next": "report",
125
+ "toolPolicy": {
126
+ "disallowBuiltinToolsets": [
127
+ "ai-apps",
128
+ "archives",
129
+ "audio",
130
+ "browser-automation",
131
+ "code-execution",
132
+ "craftbooks",
133
+ "data-tables",
134
+ "entity-intel",
135
+ "git",
136
+ "image-intel",
137
+ "images",
138
+ "role-delegation",
139
+ "role-delegation-escalation",
140
+ "security-intel",
141
+ "team-management",
142
+ "videos",
143
+ "web",
144
+ "workspace-fs-write"
145
+ ],
146
+ "outputMedium": "artifact"
147
+ }
148
+ },
149
+ {
150
+ "id": "report",
151
+ "name": "Write the refactoring report",
152
+ "description": "prioritized code-health report with safe, sequenced refactor plans",
153
+ "prompt": "Write `{{workPath}}/refactoring-review.md` for an admin to read in the morning. Use these exact sections: `## Executive summary`, `## Index coverage`, `## Ranked opportunities`, `## Cross-cutting themes`, `## Defer or leave alone`, and `## Recommended sequence`. Each ranked opportunity must cite real file:line evidence; state why the area is insufficiently cogent; name the proposed seam and steps; list behavior-preserving tests; and include impact, effort, risk, and dependencies. Separate systemic themes from individual files. State index gaps and unreviewed areas so a quiet report is not mistaken for a clean codebase. Do not include style-only churn or recommend rewrites without a migration boundary. On a loop-back, repair only the named report gaps.\n\nThe deliverable `{{workPath}}/refactoring-review.md` lands in the project's artifacts drawer — write it with `write_artifact` and read it back with `read_artifact`; the shipped workspace stays untouched.",
154
+ "suggestedRole": "reviewer",
155
+ "advanceWhen": {
156
+ "file": "{{workPath}}/refactoring-review.md",
157
+ "minBytes": 1,
158
+ "sniff": "nonempty",
159
+ "artifact": true
160
+ },
161
+ "gate": {
162
+ "at": "completion",
163
+ "checks": [
164
+ {
165
+ "kind": "minBytes",
166
+ "file": "{{workPath}}/refactoring-review.md",
167
+ "bytes": 1800,
168
+ "artifact": true
169
+ },
170
+ {
171
+ "kind": "contains",
172
+ "file": "{{workPath}}/refactoring-review.md",
173
+ "pattern": "(?:^|\\n)#{1,3}\\s+\\S",
174
+ "flags": "i",
175
+ "label": "at least one markdown heading",
176
+ "artifact": true
177
+ }
178
+ ],
179
+ "onReject": "report",
180
+ "maxAttempts": 4
181
+ },
182
+ "next": "evaluate",
183
+ "toolPolicy": {
184
+ "disallowBuiltinToolsets": [
185
+ "ai-apps",
186
+ "archives",
187
+ "audio",
188
+ "browser-automation",
189
+ "code-execution",
190
+ "craftbooks",
191
+ "data-tables",
192
+ "entity-intel",
193
+ "git",
194
+ "image-intel",
195
+ "images",
196
+ "role-delegation",
197
+ "role-delegation-escalation",
198
+ "security-intel",
199
+ "team-management",
200
+ "videos",
201
+ "web",
202
+ "workspace-fs-write"
203
+ ],
204
+ "outputMedium": "artifact"
205
+ }
206
+ },
207
+ {
208
+ "id": "evaluate",
209
+ "name": "Evaluate",
210
+ "description": "Grade the deliverable against every acceptance criterion. All pass → finish; any fail → loop back and fix the gap.",
211
+ "prompt": "Grade `{{workPath}}/refactoring-review.md`: (1) index coverage and limitations are explicit; (2) every ranked item was verified in source and cites a real file:line; (3) ranking uses impact, evidence, effort, risk, and blast radius rather than file size alone; (4) each recommendation names a bounded seam, sequence, and behavior-preserving tests; (5) systemic themes are distinguished from local smells; (6) false positives and areas to leave alone are recorded; (7) no source was changed and no vague rewrite advice remains. PASS every item or loop back with exact gaps.\n\nThe deliverable lives in the project's artifacts drawer — open `{{workPath}}/refactoring-review.md` with `read_artifact`, not `read_file`.\n\nThen route — this is the whole point of the loop:\n\n- **Every criterion PASSES →** call `advance_task_step({ ref, stepId: \"evaluate\", next: \"finish\" })`.\n- **Any criterion FAILS →** write the specific gaps to notes, then call `advance_task_step({ ref, stepId: \"evaluate\", next: \"report\" })` to loop back. The builder fixes exactly those gaps.\n\nNever route to `finish` while any criterion is unmet. The build phase's completion gate already blocked a grossly-incomplete deliverable; your job is the judgment an automated check cannot make (does it actually work, read well, look right). After ~3 unproductive loops, stop and report DONE_WITH_CONCERNS so the user can step in.",
212
+ "suggestedRole": "reviewer",
213
+ "consumes": [
214
+ {
215
+ "file": "{{workPath}}/refactoring-review.md",
216
+ "artifact": true
217
+ }
218
+ ],
219
+ "next": "report",
220
+ "toolPolicy": {
221
+ "disallowBuiltinToolsets": [
222
+ "ai-apps",
223
+ "archives",
224
+ "audio",
225
+ "browser-automation",
226
+ "code-execution",
227
+ "craftbooks",
228
+ "data-tables",
229
+ "entity-intel",
230
+ "git",
231
+ "image-intel",
232
+ "images",
233
+ "role-delegation",
234
+ "role-delegation-escalation",
235
+ "security-intel",
236
+ "team-management",
237
+ "videos",
238
+ "web",
239
+ "workspace-fs-write"
240
+ ],
241
+ "outputMedium": "task-note"
242
+ }
243
+ },
244
+ {
245
+ "id": "finish",
246
+ "name": "Finish",
247
+ "description": "All acceptance criteria met. Stamp a short summary and report DONE.",
248
+ "prompt": "Every acceptance criterion passed. Write a one-paragraph DONE summary to task notes via `write_task_note`: what was built, the deliverable path(s), and a one-line confirmation that each criterion is met. Then report DONE.",
249
+ "suggestedRole": "developer",
250
+ "terminal": true,
251
+ "toolPolicy": {
252
+ "disallowBuiltinToolsets": [
253
+ "ai-apps",
254
+ "archives",
255
+ "artifacts",
256
+ "audio",
257
+ "browser-automation",
258
+ "code-execution",
259
+ "craftbooks",
260
+ "data-tables",
261
+ "entity-intel",
262
+ "git",
263
+ "image-intel",
264
+ "images",
265
+ "role-delegation",
266
+ "role-delegation-escalation",
267
+ "security-intel",
268
+ "team-management",
269
+ "videos",
270
+ "web",
271
+ "workspace-fs-write"
272
+ ],
273
+ "outputMedium": "task-note"
274
+ }
275
+ }
276
+ ],
277
+ "version": "1.0.3",
278
+ "releasedAt": "2026-09-01T20:00:00Z",
279
+ "minGezelVersion": "1.26233"
280
+ }