@bendyline/gilde 0.1.40 → 0.1.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/authoring/gstack/overlays/investigate.json +1 -0
  2. package/authoring/gstack/overlays/qa-only.json +1 -0
  3. package/authoring/gstack/wave.json +12 -2
  4. package/authoring/tactical/books/accessibility-retrofit.json +188 -0
  5. package/authoring/tactical/books/apply-review-findings.json +189 -0
  6. package/authoring/tactical/books/bug-fix-tdd.json +237 -0
  7. package/authoring/tactical/books/ci-pipeline.json +168 -0
  8. package/authoring/tactical/books/codemod-sweep.json +182 -0
  9. package/authoring/tactical/books/dependency-upgrade.json +196 -0
  10. package/authoring/tactical/books/flaky-test-fix.json +238 -0
  11. package/authoring/tactical/books/hotfix-flow.json +187 -0
  12. package/authoring/tactical/books/perf-optimization.json +219 -0
  13. package/authoring/tactical/books/refactor-module.json +217 -0
  14. package/authoring/tactical/books/schema-migration.json +192 -0
  15. package/authoring/tactical/books/test-suite-backfill.json +172 -0
  16. package/authoring/tactical/books/type-safety-pass.json +185 -0
  17. package/authoring/tactical/books/ux-update.json +178 -0
  18. package/authoring/tactical/evals/accessibility-retrofit.json +230 -0
  19. package/authoring/tactical/evals/apply-review-findings.json +290 -0
  20. package/authoring/tactical/evals/bug-fix-tdd.json +221 -0
  21. package/authoring/tactical/evals/ci-pipeline.json +227 -0
  22. package/authoring/tactical/evals/codemod-sweep.json +252 -0
  23. package/authoring/tactical/evals/dependency-upgrade.json +235 -0
  24. package/authoring/tactical/evals/flaky-test-fix.json +239 -0
  25. package/authoring/tactical/evals/hotfix-flow.json +220 -0
  26. package/authoring/tactical/evals/perf-optimization.json +235 -0
  27. package/authoring/tactical/evals/refactor-module.json +241 -0
  28. package/authoring/tactical/evals/schema-migration.json +225 -0
  29. package/authoring/tactical/evals/test-suite-backfill.json +197 -0
  30. package/authoring/tactical/evals/type-safety-pass.json +221 -0
  31. package/authoring/tactical/evals/ux-update.json +206 -0
  32. package/authoring/tactical/wave.json +89 -0
  33. package/data/chat-models/de/deepseek-r1-8b-q4/manifest.json +56 -1
  34. package/data/chat-models/gl/glm-5.2-754b-q2/manifest.json +56 -0
  35. package/data/chat-models/gp/gpt-oss-120b-q4/manifest.json +73 -1
  36. package/data/chat-models/gp/gpt-oss-20b-q4/manifest.json +77 -1
  37. package/data/chat-models/index.json +1 -1
  38. package/data/chat-models/ll/llama3.2-3b-q4/manifest.json +3 -1
  39. package/data/chat-models/mi/mistral-7b-q4/manifest.json +54 -3
  40. package/data/chat-models/mi/mistral-medium-3.5-128b-q4/manifest.json +76 -1
  41. package/data/craftbook-templates/ac/accessibility-retrofit/manifest.json +5 -4
  42. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.0/craftbook.json +451 -0
  43. package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.0/test.json +231 -0
  44. package/data/craftbook-templates/al/alt-text-pass/manifest.json +5 -1
  45. package/data/craftbook-templates/ap/apply-review-findings/art.json +12 -0
  46. package/data/craftbook-templates/ap/apply-review-findings/logo.webp +0 -0
  47. package/data/craftbook-templates/ap/apply-review-findings/manifest.json +23 -0
  48. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.0/craftbook.json +436 -0
  49. package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.0/test.json +291 -0
  50. package/data/craftbook-templates/br/browser-qa-audit/manifest.json +5 -1
  51. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.5/craftbook.json +438 -0
  52. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.5/test.json +379 -0
  53. package/data/craftbook-templates/bu/bug-fix-tdd/manifest.json +3 -3
  54. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.0/craftbook.json +545 -0
  55. package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.0/test.json +222 -0
  56. package/data/craftbook-templates/ch/changelog-cut/manifest.json +5 -1
  57. package/data/craftbook-templates/ch/changelog-writeup/manifest.json +5 -1
  58. package/data/craftbook-templates/ci/ci-pipeline/manifest.json +5 -3
  59. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.0/craftbook.json +423 -0
  60. package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.0/test.json +228 -0
  61. package/data/craftbook-templates/co/codemod-sweep/art.json +12 -0
  62. package/data/craftbook-templates/co/codemod-sweep/logo.webp +0 -0
  63. package/data/craftbook-templates/co/codemod-sweep/manifest.json +23 -0
  64. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.0/craftbook.json +441 -0
  65. package/data/craftbook-templates/co/codemod-sweep/versions/1.0.0/test.json +253 -0
  66. package/data/craftbook-templates/de/dependency-upgrade/art.json +12 -0
  67. package/data/craftbook-templates/de/dependency-upgrade/logo.webp +0 -0
  68. package/data/craftbook-templates/de/dependency-upgrade/manifest.json +23 -0
  69. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.0/craftbook.json +459 -0
  70. package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.0/test.json +236 -0
  71. package/data/craftbook-templates/fe/feature-flag-release/manifest.json +5 -1
  72. package/data/craftbook-templates/fe/feature-flag-rollout/manifest.json +4 -1
  73. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.0/craftbook.json +203 -0
  74. package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.0/test.json +165 -0
  75. package/data/craftbook-templates/fl/flaky-test-fix/art.json +12 -0
  76. package/data/craftbook-templates/fl/flaky-test-fix/logo.webp +0 -0
  77. package/data/craftbook-templates/fl/flaky-test-fix/manifest.json +24 -0
  78. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.0/craftbook.json +534 -0
  79. package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.0/test.json +240 -0
  80. package/data/craftbook-templates/ho/hotfix-flow/manifest.json +5 -3
  81. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.0/craftbook.json +442 -0
  82. package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.0/test.json +221 -0
  83. package/data/craftbook-templates/in/investigate/manifest.json +4 -1
  84. package/data/craftbook-templates/in/investigate-root-cause/manifest.json +5 -1
  85. package/data/craftbook-templates/index.json +1 -1
  86. package/data/craftbook-templates/li/live-browser-qa/manifest.json +5 -1
  87. package/data/craftbook-templates/ni/nightly-fix-sweep/art.json +12 -0
  88. package/data/craftbook-templates/ni/nightly-fix-sweep/logo.webp +0 -0
  89. package/data/craftbook-templates/ni/nightly-fix-sweep/manifest.json +23 -0
  90. package/data/craftbook-templates/ni/nightly-fix-sweep/versions/1.0.0/craftbook.json +145 -0
  91. package/data/craftbook-templates/ni/nightly-fix-sweep/versions/1.0.0/test.json +121 -0
  92. package/data/craftbook-templates/pe/perf-audit/versions/1.1.0/craftbook.json +195 -0
  93. package/data/craftbook-templates/pe/perf-audit/versions/1.1.0/test.json +165 -0
  94. package/data/craftbook-templates/pe/perf-optimization/manifest.json +3 -3
  95. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.0/craftbook.json +511 -0
  96. package/data/craftbook-templates/pe/perf-optimization/versions/2.0.0/test.json +236 -0
  97. package/data/craftbook-templates/qa/qa/manifest.json +3 -1
  98. package/data/craftbook-templates/re/refactor-module/manifest.json +2 -2
  99. package/data/craftbook-templates/re/refactor-module/versions/1.0.4/craftbook.json +150 -0
  100. package/data/craftbook-templates/re/refactor-module/versions/1.0.4/test.json +95 -0
  101. package/data/craftbook-templates/re/refactor-module/versions/2.0.0/craftbook.json +509 -0
  102. package/data/craftbook-templates/re/refactor-module/versions/2.0.0/test.json +242 -0
  103. package/data/craftbook-templates/re/release-notes/manifest.json +5 -1
  104. package/data/craftbook-templates/re/release-notes/versions/1.0.3/craftbook.json +220 -0
  105. package/data/craftbook-templates/re/release-notes/versions/1.0.3/test.json +114 -0
  106. package/data/craftbook-templates/re/release-pipeline-ci/manifest.json +5 -1
  107. package/data/craftbook-templates/re/release-readiness-review/versions/1.1.0/craftbook.json +192 -0
  108. package/data/craftbook-templates/re/release-readiness-review/versions/1.1.0/test.json +113 -0
  109. package/data/craftbook-templates/ro/root-cause-investigation/manifest.json +7 -1
  110. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.5/craftbook.json +433 -0
  111. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.5/test.json +157 -0
  112. package/data/craftbook-templates/sc/schema-migration/manifest.json +4 -4
  113. package/data/craftbook-templates/sc/schema-migration/versions/2.0.0/craftbook.json +459 -0
  114. package/data/craftbook-templates/sc/schema-migration/versions/2.0.0/test.json +226 -0
  115. package/data/craftbook-templates/te/test-coverage-review/versions/1.2.0/craftbook.json +195 -0
  116. package/data/craftbook-templates/te/test-coverage-review/versions/1.2.0/test.json +116 -0
  117. package/data/craftbook-templates/te/test-suite-backfill/manifest.json +1 -2
  118. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.0/craftbook.json +428 -0
  119. package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.0/test.json +198 -0
  120. package/data/craftbook-templates/ty/type-safety-pass/manifest.json +3 -3
  121. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.0/craftbook.json +428 -0
  122. package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.0/test.json +222 -0
  123. package/data/craftbook-templates/ux/ux-update/art.json +12 -0
  124. package/data/craftbook-templates/ux/ux-update/logo.webp +0 -0
  125. package/data/craftbook-templates/ux/ux-update/manifest.json +22 -0
  126. package/data/craftbook-templates/ux/ux-update/versions/1.0.0/craftbook.json +439 -0
  127. package/data/craftbook-templates/ux/ux-update/versions/1.0.0/test.json +207 -0
  128. package/data/craftbook-templates/ve/version-bump/versions/1.1.0/craftbook.json +206 -0
  129. package/data/craftbook-templates/ve/version-bump/versions/1.1.0/test.json +95 -0
  130. package/data/gezel-templates/bo/boekwachter/versions/1.1.0/about.md +29 -0
  131. package/data/gezel-templates/bo/boekwachter/versions/1.1.0/manifest.json +16 -0
  132. package/data/gezel-templates/bu/builder/versions/1.5.0/about.md +34 -0
  133. package/data/gezel-templates/bu/builder/versions/1.5.0/manifest.json +16 -0
  134. package/data/gezel-templates/de/developer/versions/1.5.0/about.md +34 -0
  135. package/data/gezel-templates/de/developer/versions/1.5.0/manifest.json +21 -0
  136. package/data/gezel-templates/index.json +1 -1
  137. package/data/gezel-templates/re/reviewer/versions/1.4.0/about.md +49 -0
  138. package/data/gezel-templates/re/reviewer/versions/1.4.0/manifest.json +21 -0
  139. package/data/project-types/index.json +1 -1
  140. package/data/project-types/so/software-project/manifest.json +20 -0
  141. package/data/project-types/so/software-project/versions/1.0.0/about.md +3 -0
  142. package/data/project-types/so/software-project/versions/1.0.0/manifest.json +41 -0
  143. package/data/project-types/so/software-project/versions/1.0.0/mission.md +4 -0
  144. package/package.json +1 -1
  145. package/schemas/craftbook-doc.schema.json +248 -0
  146. package/schemas/craftbook-template-version.schema.json +248 -0
  147. package/schemas/craftbook-test.schema.json +200 -0
@@ -0,0 +1,221 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "title": "Hotfix with minimal blast radius and a rollback path",
4
+ "objective": "The craftbook drives an urgent fix of a seeded null-guard crash in a receipts formatter: reproduction with the least machinery, the smallest change at the real defect site, honest validation with a rollback path, and an enforced review — verified mechanically, including a mutant re-seed proving the patch engaged the real site.",
5
+ "tags": [
6
+ "code",
7
+ "bug-fix",
8
+ "hotfix",
9
+ "tactical-fleet"
10
+ ],
11
+ "prompt": "Use the Hotfix Flow craftbook for this emergency: the nightly receipts export is crashing in production on orders without a gift note. The incident report is in source/incident.md. Reproduce it with the least machinery that shows it, patch minimally at the real defect site, and leave a rollback path.",
12
+ "setup": {
13
+ "projectName": "Receiptline",
14
+ "about": "A tiny order-receipt formatting module behind a nightly export. No test suite - the export script is the only runnable surface.",
15
+ "files": [
16
+ {
17
+ "path": "package.json",
18
+ "content": "{\n \"name\": \"receiptline\",\n \"private\": true,\n \"version\": \"1.0.0\",\n \"type\": \"module\"\n}\n",
19
+ "modelInput": false
20
+ },
21
+ {
22
+ "path": "src/format-order.js",
23
+ "content": "export function formatOrder(order) {\n const lines = [];\n lines.push('Order ' + order.id + ' for ' + order.customer);\n for (const item of order.items) {\n lines.push(' ' + item.qty + ' x ' + item.name + ' @ ' + money(item.unitPrice));\n }\n lines.push('Total: ' + money(orderTotal(order)));\n lines.push('Gift note: ' + order.giftNote.trim());\n return lines.join('\\n');\n}\n\nexport function orderTotal(order) {\n let total = 0;\n for (const item of order.items) {\n total += item.qty * item.unitPrice;\n }\n return Math.round(total * 100) / 100;\n}\n\nfunction money(value) {\n return value.toFixed(2);\n}\n"
24
+ },
25
+ {
26
+ "path": "data/orders.json",
27
+ "content": "[\n {\n \"id\": \"A-1041\",\n \"customer\": \"Ana Torres\",\n \"items\": [{ \"qty\": 1, \"name\": \"Ceramic Vase\", \"unitPrice\": 30 }],\n \"giftNote\": \" Happy birthday, Ana! \"\n },\n {\n \"id\": \"A-1042\",\n \"customer\": \"Ben Ito\",\n \"items\": [{ \"qty\": 2, \"name\": \"Stone Mug\", \"unitPrice\": 9.5 }]\n },\n {\n \"id\": \"A-1043\",\n \"customer\": \"Priya Shah\",\n \"items\": [\n { \"qty\": 3, \"name\": \"Linen Napkin\", \"unitPrice\": 4 },\n { \"qty\": 1, \"name\": \"Oak Tray\", \"unitPrice\": 18 }\n ]\n }\n]\n",
28
+ "modelInput": false
29
+ },
30
+ {
31
+ "path": "scripts/print-receipts.mjs",
32
+ "content": "import { readFileSync } from 'node:fs';\nimport { formatOrder } from '../src/format-order.js';\n\nconst orders = JSON.parse(\n readFileSync(new URL('../data/orders.json', import.meta.url), 'utf8'),\n);\nfor (const order of orders) {\n console.log(formatOrder(order));\n console.log('---');\n}\n",
33
+ "modelInput": false
34
+ },
35
+ {
36
+ "path": "source/incident.md",
37
+ "content": "# Incident: receipts export crashing\n\n02:14 - the nightly receipts export died partway through and retail has no morning receipts. Support traced it to orders without a gift note:\n\n TypeError: Cannot read properties of undefined (reading 'trim')\n at formatOrder (src/format-order.js)\n\n`node scripts/print-receipts.mjs` reproduces it: the first order (which has a gift note) prints fine, then the export falls over on the second order in `data/orders.json`.\n\nWhat must hold once this is fixed:\n\n- Orders with a gift note keep printing the trimmed note line.\n- Orders without one print a normal receipt with NO gift-note line.\n- Item lines and totals unchanged.\n\nWe need the smallest safe patch now. The proper cleanup of the formatter can wait for daylight - write it down instead of doing it.\n"
38
+ },
39
+ {
40
+ "path": "tests/verify-hotfix.mjs",
41
+ "content": "import assert from 'node:assert/strict';\nimport { execFileSync } from 'node:child_process';\nimport { cpSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { formatOrder, orderTotal } from '../src/format-order.js';\n\nconst root = process.cwd();\n\n// 1) The crash case is fixed: an order without a gift note formats cleanly.\nconst plain = {\n id: 'A-1042',\n customer: 'Ben Ito',\n items: [{ qty: 2, name: 'Stone Mug', unitPrice: 9.5 }],\n};\nconst plainReceipt = formatOrder(plain);\nassert.ok(!plainReceipt.includes('undefined'), 'a receipt must not leak \"undefined\"');\nassert.ok(!/Gift note:/.test(plainReceipt), 'an order without a gift note must not print a gift-note line');\nassert.ok(plainReceipt.includes('Total: 19.00'), 'totals must survive the patch');\nconsole.log('HOTFIX_ORACLE crash case fixed');\n\n// 2) Neighborhood intact: gift notes still print trimmed, totals still add up.\nconst gifted = {\n id: 'A-1041',\n customer: 'Ana Torres',\n items: [{ qty: 1, name: 'Ceramic Vase', unitPrice: 30 }],\n giftNote: ' Happy birthday, Ana! ',\n};\nconst giftedReceipt = formatOrder(gifted);\nassert.ok(giftedReceipt.includes('Gift note: Happy birthday, Ana!'), 'gift notes must still print, trimmed');\nconst multi = {\n id: 'A-1043',\n customer: 'Priya Shah',\n items: [\n { qty: 3, name: 'Linen Napkin', unitPrice: 4 },\n { qty: 1, name: 'Oak Tray', unitPrice: 18 },\n ],\n};\nassert.equal(orderTotal(multi), 30, 'orderTotal must be untouched');\nconsole.log('HOTFIX_ORACLE neighborhood intact');\n\n// 3) The export the incident names runs clean end to end.\nconst exportOut = execFileSync(process.execPath, ['scripts/print-receipts.mjs'], {\n cwd: root,\n stdio: 'pipe',\n timeout: 30000,\n}).toString();\nassert.ok(exportOut.includes('A-1043'), 'the export must reach the last order');\nconsole.log('HOTFIX_ORACLE export green');\n\n// 4) Re-seed the original defect into a mutant tree: the crash must come\n// back, proving the patch engaged the real site rather than the callers\n// or the data (both of which are pinned fixtures anyway).\nconst ORIGINAL = `export function formatOrder(order) {\n const lines = [];\n lines.push('Order ' + order.id + ' for ' + order.customer);\n for (const item of order.items) {\n lines.push(' ' + item.qty + ' x ' + item.name + ' @ ' + money(item.unitPrice));\n }\n lines.push('Total: ' + money(orderTotal(order)));\n lines.push('Gift note: ' + order.giftNote.trim());\n return lines.join('\\\\n');\n}\n\nexport function orderTotal(order) {\n let total = 0;\n for (const item of order.items) {\n total += item.qty * item.unitPrice;\n }\n return Math.round(total * 100) / 100;\n}\n\nfunction money(value) {\n return value.toFixed(2);\n}\n`;\nconst mutantRoot = join(root, '.oracle-mutant');\nrmSync(mutantRoot, { recursive: true, force: true });\nmkdirSync(join(mutantRoot, 'src'), { recursive: true });\ncpSync(join(root, 'scripts'), join(mutantRoot, 'scripts'), { recursive: true });\ncpSync(join(root, 'data'), join(mutantRoot, 'data'), { recursive: true });\ncpSync(join(root, 'package.json'), join(mutantRoot, 'package.json'));\nwriteFileSync(join(mutantRoot, 'src', 'format-order.js'), ORIGINAL);\nlet mutantStatus = 0;\ntry {\n execFileSync(process.execPath, ['scripts/print-receipts.mjs'], {\n cwd: mutantRoot,\n stdio: 'pipe',\n timeout: 30000,\n });\n} catch (err) {\n mutantStatus = typeof err.status === 'number' ? err.status : 1;\n}\nassert.notEqual(mutantStatus, 0, 're-seeding the original defect must restore the crash - the patch did not engage the real site');\nconsole.log('HOTFIX_ORACLE mutant caught');\nconsole.log('HOTFIX_ORACLE done');\n",
42
+ "surface": "harness"
43
+ }
44
+ ],
45
+ "craftbookParams": {
46
+ "workPath": "tasks/eval",
47
+ "scope": "The nightly receipts export crashes on orders without a gift note; see source/incident.md. Smallest safe patch now - the proper cleanup is deferred, not attempted."
48
+ }
49
+ },
50
+ "mocks": [],
51
+ "success": {
52
+ "summary": "The seeded null-guard crash is fixed at the real site with minimal blast radius, the export runs clean, a mutant re-seed restores the crash, and the fleet artifacts carry honest evidence, a Follow-up debt record, and a runnable rollback.",
53
+ "deliverables": [
54
+ {
55
+ "path": "tasks/eval/repro.md",
56
+ "kind": "markdown-notes",
57
+ "artifact": true,
58
+ "minBytes": 500,
59
+ "checks": [
60
+ {
61
+ "kind": "contains",
62
+ "file": "tasks/eval/repro.md",
63
+ "pattern": "^##\\s+Symptom[\\s\\S]*^##\\s+Repro command[\\s\\S]*^##\\s+Expected[\\s\\S]*^##\\s+Actual[\\s\\S]*^##\\s+Evidence",
64
+ "flags": "im",
65
+ "label": "reproduction sections in order"
66
+ },
67
+ {
68
+ "kind": "citationsResolve",
69
+ "file": "tasks/eval/repro.md",
70
+ "minCitations": 2,
71
+ "artifact": true
72
+ }
73
+ ]
74
+ },
75
+ {
76
+ "path": "tasks/eval/fix-notes.md",
77
+ "kind": "markdown-notes",
78
+ "artifact": true,
79
+ "minBytes": 700,
80
+ "checks": [
81
+ {
82
+ "kind": "contains",
83
+ "file": "tasks/eval/fix-notes.md",
84
+ "pattern": "^##\\s+Problem[\\s\\S]*^##\\s+Change[\\s\\S]*^##\\s+Files touched[\\s\\S]*^##\\s+Risk[\\s\\S]*^##\\s+How to verify[\\s\\S]*^##\\s+Follow-up",
85
+ "flags": "im",
86
+ "label": "fix-notes sections in order, Follow-up included"
87
+ },
88
+ {
89
+ "kind": "contains",
90
+ "file": "tasks/eval/fix-notes.md",
91
+ "pattern": "src/format-order\\.js",
92
+ "label": "names the real defect site"
93
+ },
94
+ {
95
+ "kind": "citationsResolve",
96
+ "file": "tasks/eval/fix-notes.md",
97
+ "minCitations": 2,
98
+ "artifact": true
99
+ }
100
+ ]
101
+ },
102
+ {
103
+ "path": "tasks/eval/validation.md",
104
+ "kind": "markdown-notes",
105
+ "artifact": true,
106
+ "minBytes": 400,
107
+ "checks": [
108
+ {
109
+ "kind": "contains",
110
+ "file": "tasks/eval/validation.md",
111
+ "pattern": "^##\\s+Repro re-run[\\s\\S]*^##\\s+Result[\\s\\S]*^##\\s+Rollback",
112
+ "flags": "im",
113
+ "label": "validation sections in order, Rollback included"
114
+ }
115
+ ]
116
+ },
117
+ {
118
+ "path": "tasks/eval/review.md",
119
+ "kind": "markdown-report",
120
+ "artifact": true,
121
+ "minBytes": 400,
122
+ "checks": [
123
+ {
124
+ "kind": "contains",
125
+ "file": "tasks/eval/review.md",
126
+ "pattern": "Verdict:\\s*(?:PASS|REVISE)",
127
+ "flags": "i",
128
+ "label": "explicit reviewer verdict"
129
+ }
130
+ ]
131
+ }
132
+ ],
133
+ "checks": [
134
+ {
135
+ "kind": "notContains",
136
+ "file": "src/format-order.js",
137
+ "pattern": "\\btry\\s*\\{|\\bcatch\\s*\\(",
138
+ "label": "the crash is fixed at the site, not swallowed with try/catch"
139
+ },
140
+ {
141
+ "kind": "sourceParses",
142
+ "file": "src/format-order.js"
143
+ },
144
+ {
145
+ "kind": "nodeRuns",
146
+ "file": "scripts/print-receipts.mjs",
147
+ "timeoutMs": 30000
148
+ },
149
+ {
150
+ "kind": "nodeScriptPasses",
151
+ "script": "tests/verify-hotfix.mjs",
152
+ "timeoutMs": 60000,
153
+ "requiredOutput": [
154
+ {
155
+ "pattern": "HOTFIX_ORACLE crash case fixed",
156
+ "label": "the null-guard crash is gone"
157
+ },
158
+ {
159
+ "pattern": "HOTFIX_ORACLE neighborhood intact",
160
+ "label": "gift notes and totals still behave"
161
+ },
162
+ {
163
+ "pattern": "HOTFIX_ORACLE export green",
164
+ "label": "the incident's export runs end to end"
165
+ },
166
+ {
167
+ "pattern": "HOTFIX_ORACLE mutant caught",
168
+ "label": "re-seeding the defect restores the crash"
169
+ }
170
+ ]
171
+ }
172
+ ],
173
+ "taskNotes": {
174
+ "minBytes": 120,
175
+ "checks": [
176
+ {
177
+ "kind": "contains",
178
+ "file": "task-notes.md",
179
+ "pattern": "\\bDONE\\b[\\s\\S]*validation\\.md",
180
+ "flags": "i",
181
+ "label": "DONE note names the validation deliverable"
182
+ }
183
+ ]
184
+ },
185
+ "taskGraph": {
186
+ "requireCraftbookTask": true,
187
+ "requireTerminalStep": true
188
+ },
189
+ "unchangedFixtures": [
190
+ "source/incident.md",
191
+ "package.json",
192
+ "data/orders.json",
193
+ "scripts/print-receipts.mjs"
194
+ ]
195
+ },
196
+ "rubric": {
197
+ "artifact": {
198
+ "path": "tasks/eval/fix-notes.md",
199
+ "kind": "markdown"
200
+ },
201
+ "axes": [
202
+ {
203
+ "name": "Minimal blast radius",
204
+ "description": "The change is the smallest that stops the failure at the real defect site - no refactor, rename, or cleanup rode along with the emergency patch."
205
+ },
206
+ {
207
+ "name": "Honest evidence under pressure",
208
+ "description": "Reproduction and validation quote real observed behavior, and anything that could not actually be run is labeled unverified rather than claimed."
209
+ },
210
+ {
211
+ "name": "Deferred debt discipline",
212
+ "description": "Follow-up records the proper fix and the debt the patch leaves (with a backport note where relevant) instead of attempting a deeper repair mid-incident, and Rollback is a concrete, runnable path."
213
+ }
214
+ ]
215
+ },
216
+ "qualityFocus": [
217
+ "minimal-diff discipline",
218
+ "honest verification",
219
+ "runnable rollback"
220
+ ]
221
+ }
@@ -15,6 +15,9 @@
15
15
  },
16
16
  "logo": "logo.webp",
17
17
  "license": "MIT",
18
- "yankedVersions": [],
18
+ "yankedVersions": [
19
+ "1.0.0",
20
+ "1.1.0"
21
+ ],
19
22
  "workflow": "investigation"
20
23
  }
@@ -19,6 +19,10 @@
19
19
  },
20
20
  "logo": "logo.webp",
21
21
  "license": "MIT",
22
- "yankedVersions": [],
22
+ "yankedVersions": [
23
+ "1.0.0",
24
+ "1.0.1",
25
+ "1.0.2"
26
+ ],
23
27
  "workflow": "build-loop"
24
28
  }