@bendyline/gilde 0.1.55 → 0.1.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/authoring/chat-models/glm-5.3-flash-320b-q2.json +129 -0
- package/authoring/gstack/wave.json +2 -2
- package/data/chat-models/gl/glm-5.3-flash-320b-q2/manifest.json +137 -0
- package/data/chat-models/gl/glm-5.3-flash-320b-q2/versions/1.0.0/manifest.json +23 -0
- package/data/chat-models/index.json +1 -1
- package/data/craftbook-templates/a1/a11y-audit/versions/1.1.3/test.json +16 -8
- package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.2/craftbook.json +618 -0
- package/data/craftbook-templates/ac/accessibility-retrofit/versions/2.0.2/test.json +228 -0
- package/data/craftbook-templates/al/album-curate/versions/1.0.3/test.json +6 -3
- package/data/craftbook-templates/al/alert-rules/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/an/anniversary-cut/versions/1.0.5/test.json +10 -5
- package/data/craftbook-templates/an/annual-document-review/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/an/anomaly-scan/versions/1.0.3/test.json +12 -6
- package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.2/craftbook.json +602 -0
- package/data/craftbook-templates/ap/apply-review-findings/versions/1.0.2/test.json +290 -0
- package/data/craftbook-templates/ar/artifact-integrity-review/versions/1.0.3/test.json +18 -9
- package/data/craftbook-templates/au/audiobook-master-pack/versions/1.0.5/test.json +10 -5
- package/data/craftbook-templates/au/auth-flow/versions/1.0.3/test.json +12 -6
- package/data/craftbook-templates/au/auth-flow/versions/1.0.4/craftbook.json +282 -0
- package/data/craftbook-templates/au/auth-flow/versions/1.0.4/test.json +143 -0
- package/data/craftbook-templates/au/automation-recipe/versions/1.0.3/test.json +12 -6
- package/data/craftbook-templates/ba/backup-routine/versions/1.0.4/craftbook.json +282 -0
- package/data/craftbook-templates/ba/backup-routine/versions/1.0.4/test.json +108 -0
- package/data/craftbook-templates/bl/blog-post/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/br/branding-website/versions/1.1.3/craftbook.json +335 -0
- package/data/craftbook-templates/br/branding-website/versions/1.1.3/test.json +164 -0
- package/data/craftbook-templates/br/broadcast-announcement/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.8/craftbook.json +621 -0
- package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.8/test.json +376 -0
- package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.2/craftbook.json +730 -0
- package/data/craftbook-templates/bu/bug-fix-tdd/versions/2.0.2/test.json +221 -0
- package/data/craftbook-templates/bu/build-loop/versions/1.1.1/test.json +8 -8
- package/data/craftbook-templates/ca/case-study/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/ch/chapter-narration-run/versions/1.0.4/test.json +10 -5
- package/data/craftbook-templates/ch/character-turnaround/versions/1.0.3/test.json +25 -11
- package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.2/craftbook.json +587 -0
- package/data/craftbook-templates/ci/ci-pipeline/versions/2.0.2/test.json +225 -0
- package/data/craftbook-templates/ci/citation-audit/versions/1.0.3/test.json +28 -14
- package/data/craftbook-templates/cl/cli-tool/versions/1.1.3/test.json +8 -8
- package/data/craftbook-templates/co/codebase-refactoring-review/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/co/codebase-ux-review/versions/1.0.3/test.json +18 -9
- package/data/craftbook-templates/co/codemod-sweep/versions/1.0.2/craftbook.json +605 -0
- package/data/craftbook-templates/co/codemod-sweep/versions/1.0.2/test.json +252 -0
- package/data/craftbook-templates/co/cohort-analysis/versions/1.0.3/test.json +18 -9
- package/data/craftbook-templates/co/competitive-analysis/versions/1.0.3/test.json +23 -15
- package/data/craftbook-templates/co/content-accuracy-review/versions/1.0.3/test.json +28 -14
- package/data/craftbook-templates/co/content-deck/versions/1.2.3/craftbook.json +4 -4
- package/data/craftbook-templates/co/content-deck/versions/1.2.3/test.json +3 -0
- package/data/craftbook-templates/co/content-deck/versions/1.2.4/craftbook.json +341 -0
- package/data/craftbook-templates/co/content-deck/versions/1.2.4/test.json +169 -0
- package/data/craftbook-templates/co/copy-review/versions/1.0.3/test.json +14 -7
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.3/craftbook.json +4 -4
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.3/test.json +3 -0
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.4/craftbook.json +345 -0
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.4/test.json +187 -0
- package/data/craftbook-templates/co/corpus-synthesis/versions/1.0.3/test.json +26 -13
- package/data/craftbook-templates/co/cover-letter/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/cs/csv-transformer/versions/1.2.4/test.json +7 -7
- package/data/craftbook-templates/da/dashboard-spec/versions/1.0.3/test.json +7 -7
- package/data/craftbook-templates/da/data-export-migrate/versions/1.0.4/craftbook.json +285 -0
- package/data/craftbook-templates/da/data-export-migrate/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/da/data-pipeline-etl/versions/1.0.5/craftbook.json +284 -0
- package/data/craftbook-templates/da/data-pipeline-etl/versions/1.0.5/test.json +162 -0
- package/data/craftbook-templates/da/data-quality-audit/versions/1.0.3/test.json +38 -19
- package/data/craftbook-templates/da/data-to-report/versions/1.0.3/test.json +12 -6
- package/data/craftbook-templates/db/db-index-tuning/versions/1.0.4/craftbook.json +286 -0
- package/data/craftbook-templates/db/db-index-tuning/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/de/dependency-audit/versions/1.1.3/test.json +14 -7
- package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.2/craftbook.json +621 -0
- package/data/craftbook-templates/de/dependency-upgrade/versions/1.0.2/test.json +235 -0
- package/data/craftbook-templates/de/design-review/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/de/design-system-consultation/versions/2.0.8/craftbook.json +616 -0
- package/data/craftbook-templates/de/design-system-consultation/versions/2.0.8/test.json +201 -0
- package/data/craftbook-templates/do/doc-intake-pipeline/versions/1.0.4/craftbook.json +285 -0
- package/data/craftbook-templates/do/doc-intake-pipeline/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/do/doc-rewrite/versions/1.0.3/test.json +119 -55
- package/data/craftbook-templates/do/dockerize-app/versions/1.0.4/craftbook.json +285 -0
- package/data/craftbook-templates/do/dockerize-app/versions/1.0.4/test.json +92 -0
- package/data/craftbook-templates/do/documentation-drift-review/versions/1.0.3/test.json +18 -9
- package/data/craftbook-templates/dr/draft-social-post/versions/1.0.2/craftbook.json +324 -0
- package/data/craftbook-templates/dr/draft-social-post/versions/1.0.2/test.json +161 -0
- package/data/craftbook-templates/ed/edit-notes/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.8/craftbook.json +566 -0
- package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.8/test.json +191 -0
- package/data/craftbook-templates/ep/episode-plan/versions/1.0.3/test.json +10 -5
- package/data/craftbook-templates/ex/executive-level-review/versions/2.0.7/test.json +7 -10
- package/data/craftbook-templates/ex/executive-level-review/versions/2.0.8/craftbook.json +595 -0
- package/data/craftbook-templates/ex/executive-level-review/versions/2.0.8/test.json +139 -0
- package/data/craftbook-templates/ex/expense-categorize/versions/1.0.4/craftbook.json +277 -0
- package/data/craftbook-templates/ex/expense-categorize/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.2/craftbook.json +327 -0
- package/data/craftbook-templates/fe/feature-flag-rollout/versions/1.1.2/test.json +162 -0
- package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.2/craftbook.json +718 -0
- package/data/craftbook-templates/fl/flaky-test-fix/versions/1.0.2/test.json +239 -0
- package/data/craftbook-templates/fo/form-fill-batch/versions/1.0.4/craftbook.json +285 -0
- package/data/craftbook-templates/fo/form-fill-batch/versions/1.0.4/test.json +162 -0
- package/data/craftbook-templates/fo/form-wizard/versions/1.0.3/test.json +8 -8
- package/data/craftbook-templates/ho/holiday-card-run/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.2/craftbook.json +610 -0
- package/data/craftbook-templates/ho/hotfix-flow/versions/2.0.2/test.json +220 -0
- package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.3/craftbook.json +343 -0
- package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.3/test.json +176 -0
- package/data/craftbook-templates/id/idea-office-hours/versions/2.0.8/craftbook.json +566 -0
- package/data/craftbook-templates/id/idea-office-hours/versions/2.0.8/test.json +141 -0
- package/data/craftbook-templates/im/image-set-index/versions/1.2.3/craftbook.json +298 -0
- package/data/craftbook-templates/im/image-set-index/versions/1.2.3/test.json +180 -0
- package/data/craftbook-templates/in/insurance-inventory/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/in/interactive-quiz/versions/1.0.3/test.json +48 -23
- package/data/craftbook-templates/in/invitation-design/versions/1.0.3/test.json +1 -1
- package/data/craftbook-templates/index.json +1 -1
- package/data/craftbook-templates/it/item-intake/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/le/lead-enrichment/versions/1.0.4/craftbook.json +277 -0
- package/data/craftbook-templates/le/lead-enrichment/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/me/meeting-prep-brief/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/me/memory-prompt-session/versions/1.0.3/test.json +3 -0
- package/data/craftbook-templates/mo/morning-report/versions/1.0.3/test.json +21 -9
- package/data/craftbook-templates/of/office-hours/versions/1.1.1/test.json +8 -8
- package/data/craftbook-templates/pe/perf-optimization/versions/2.0.2/craftbook.json +697 -0
- package/data/craftbook-templates/pe/perf-optimization/versions/2.0.2/test.json +235 -0
- package/data/craftbook-templates/pe/pest-diagnosis/versions/1.0.3/test.json +19 -8
- package/data/craftbook-templates/pl/plan/versions/1.0.2/test.json +8 -8
- package/data/craftbook-templates/pl/playtest-report/versions/1.0.3/test.json +17 -7
- package/data/craftbook-templates/pr/practice-exam/versions/1.0.3/test.json +7 -2
- package/data/craftbook-templates/pr/practice-session/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/pu/pull-request-review/versions/1.9.2/craftbook.json +435 -0
- package/data/craftbook-templates/pu/pull-request-review/versions/1.9.2/test.json +141 -0
- package/data/craftbook-templates/qu/quarterly-summary/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/re/receipt-intake/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/re/receipt-ocr-ledger/versions/1.0.4/craftbook.json +277 -0
- package/data/craftbook-templates/re/receipt-ocr-ledger/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/re/recipe-capture/versions/1.0.3/test.json +13 -5
- package/data/craftbook-templates/re/record-a-relative/versions/1.0.3/test.json +3 -0
- package/data/craftbook-templates/re/recurring-invoice-run/versions/1.0.4/craftbook.json +285 -0
- package/data/craftbook-templates/re/recurring-invoice-run/versions/1.0.4/test.json +104 -0
- package/data/craftbook-templates/re/refactor-module/versions/2.0.2/craftbook.json +695 -0
- package/data/craftbook-templates/re/refactor-module/versions/2.0.2/test.json +241 -0
- package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.4/craftbook.json +361 -0
- package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.4/test.json +138 -0
- package/data/craftbook-templates/re/release-notes/versions/1.0.4/test.json +8 -8
- package/data/craftbook-templates/re/release-notes/versions/1.0.5/craftbook.json +339 -0
- package/data/craftbook-templates/re/release-notes/versions/1.0.5/test.json +111 -0
- package/data/craftbook-templates/re/reliability-review/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/re/research-report/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.8/craftbook.json +596 -0
- package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.8/test.json +157 -0
- package/data/craftbook-templates/ro/rough-cut-assembly/versions/1.0.4/test.json +13 -5
- package/data/craftbook-templates/sc/schema-migration/versions/2.0.2/craftbook.json +624 -0
- package/data/craftbook-templates/sc/schema-migration/versions/2.0.2/test.json +225 -0
- package/data/craftbook-templates/sc/script-automation/versions/1.0.4/craftbook.json +284 -0
- package/data/craftbook-templates/sc/script-automation/versions/1.0.4/test.json +162 -0
- package/data/craftbook-templates/se/security-architecture-review/versions/2.0.7/test.json +10 -13
- package/data/craftbook-templates/se/security-architecture-review/versions/2.0.8/craftbook.json +597 -0
- package/data/craftbook-templates/se/security-architecture-review/versions/2.0.8/test.json +157 -0
- package/data/craftbook-templates/so/social-digest/versions/1.0.3/craftbook.json +239 -0
- package/data/craftbook-templates/so/social-digest/versions/1.0.3/test.json +168 -0
- package/data/craftbook-templates/so/source-quality-audit/versions/1.0.3/test.json +25 -11
- package/data/craftbook-templates/sp/spec-authoring/versions/2.0.8/craftbook.json +599 -0
- package/data/craftbook-templates/sp/spec-authoring/versions/2.0.8/test.json +162 -0
- package/data/craftbook-templates/te/technical-documentation/versions/2.0.8/craftbook.json +577 -0
- package/data/craftbook-templates/te/technical-documentation/versions/2.0.8/test.json +174 -0
- package/data/craftbook-templates/te/test-coverage-review/versions/1.2.1/test.json +16 -8
- package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.2/craftbook.json +592 -0
- package/data/craftbook-templates/te/test-suite-backfill/versions/2.0.2/test.json +195 -0
- package/data/craftbook-templates/th/thank-you-batch/versions/1.0.3/test.json +6 -3
- package/data/craftbook-templates/th/thank-you-sweep/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/ti/tileset-batch/versions/1.0.3/test.json +9 -3
- package/data/craftbook-templates/tr/transcribe-and-shownotes/versions/1.0.3/test.json +10 -5
- package/data/craftbook-templates/tr/transcribe-index/versions/1.0.3/test.json +6 -3
- package/data/craftbook-templates/tr/translate-content/versions/1.1.3/craftbook.json +140 -0
- package/data/craftbook-templates/tr/translate-content/versions/1.1.3/test.json +141 -0
- package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.2/craftbook.json +594 -0
- package/data/craftbook-templates/ty/type-safety-pass/versions/2.0.2/test.json +221 -0
- package/data/craftbook-templates/ux/ux-update/versions/1.0.2/craftbook.json +606 -0
- package/data/craftbook-templates/ux/ux-update/versions/1.0.2/test.json +206 -0
- package/data/craftbook-templates/we/weak-spot-drill/versions/1.0.3/test.json +11 -4
- package/data/craftbook-templates/we/weekly-walkthrough/versions/1.0.3/test.json +21 -9
- package/data/craftbook-templates/wh/whitepaper/versions/1.0.3/test.json +16 -8
- package/data/craftbook-templates/ye/year-in-review/versions/1.0.3/test.json +8 -4
- package/data/project-types/index.json +1 -1
- package/data/project-types/ju/just-chat/manifest.json +1 -1
- package/data/project-types/ju/just-chat/versions/1.0.1/about.md +5 -0
- package/data/project-types/ju/just-chat/versions/1.0.1/manifest.json +19 -0
- package/package.json +1 -1
- package/schemas/chat-model-identity.schema.json +27 -0
- package/schemas/chat-model-version.schema.json +22 -0
|
@@ -0,0 +1,220 @@
|
|
|
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
|
+
"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."
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"mocks": [],
|
|
50
|
+
"success": {
|
|
51
|
+
"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.",
|
|
52
|
+
"deliverables": [
|
|
53
|
+
{
|
|
54
|
+
"path": "{{task.dir}}/repro.md",
|
|
55
|
+
"kind": "markdown-notes",
|
|
56
|
+
"artifact": true,
|
|
57
|
+
"minBytes": 500,
|
|
58
|
+
"checks": [
|
|
59
|
+
{
|
|
60
|
+
"kind": "contains",
|
|
61
|
+
"file": "{{task.dir}}/repro.md",
|
|
62
|
+
"pattern": "^##\\s+Symptom[\\s\\S]*^##\\s+Repro command[\\s\\S]*^##\\s+Expected[\\s\\S]*^##\\s+Actual[\\s\\S]*^##\\s+Evidence",
|
|
63
|
+
"flags": "im",
|
|
64
|
+
"label": "reproduction sections in order"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"kind": "citationsResolve",
|
|
68
|
+
"file": "{{task.dir}}/repro.md",
|
|
69
|
+
"minCitations": 2,
|
|
70
|
+
"artifact": true
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"path": "{{task.dir}}/fix-notes.md",
|
|
76
|
+
"kind": "markdown-notes",
|
|
77
|
+
"artifact": true,
|
|
78
|
+
"minBytes": 700,
|
|
79
|
+
"checks": [
|
|
80
|
+
{
|
|
81
|
+
"kind": "contains",
|
|
82
|
+
"file": "{{task.dir}}/fix-notes.md",
|
|
83
|
+
"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",
|
|
84
|
+
"flags": "im",
|
|
85
|
+
"label": "fix-notes sections in order, Follow-up included"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"kind": "contains",
|
|
89
|
+
"file": "{{task.dir}}/fix-notes.md",
|
|
90
|
+
"pattern": "src/format-order\\.js",
|
|
91
|
+
"label": "names the real defect site"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"kind": "citationsResolve",
|
|
95
|
+
"file": "{{task.dir}}/fix-notes.md",
|
|
96
|
+
"minCitations": 2,
|
|
97
|
+
"artifact": true
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"path": "{{task.dir}}/validation.md",
|
|
103
|
+
"kind": "markdown-notes",
|
|
104
|
+
"artifact": true,
|
|
105
|
+
"minBytes": 400,
|
|
106
|
+
"checks": [
|
|
107
|
+
{
|
|
108
|
+
"kind": "contains",
|
|
109
|
+
"file": "{{task.dir}}/validation.md",
|
|
110
|
+
"pattern": "^##\\s+Repro re-run[\\s\\S]*^##\\s+Result[\\s\\S]*^##\\s+Rollback",
|
|
111
|
+
"flags": "im",
|
|
112
|
+
"label": "validation sections in order, Rollback included"
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"path": "{{task.dir}}/review.md",
|
|
118
|
+
"kind": "markdown-report",
|
|
119
|
+
"artifact": true,
|
|
120
|
+
"minBytes": 400,
|
|
121
|
+
"checks": [
|
|
122
|
+
{
|
|
123
|
+
"kind": "contains",
|
|
124
|
+
"file": "{{task.dir}}/review.md",
|
|
125
|
+
"pattern": "Verdict:\\s*(?:PASS|REVISE)",
|
|
126
|
+
"flags": "i",
|
|
127
|
+
"label": "explicit reviewer verdict"
|
|
128
|
+
}
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
],
|
|
132
|
+
"checks": [
|
|
133
|
+
{
|
|
134
|
+
"kind": "notContains",
|
|
135
|
+
"file": "src/format-order.js",
|
|
136
|
+
"pattern": "\\btry\\s*\\{|\\bcatch\\s*\\(",
|
|
137
|
+
"label": "the crash is fixed at the site, not swallowed with try/catch"
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"kind": "sourceParses",
|
|
141
|
+
"file": "src/format-order.js"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"kind": "nodeRuns",
|
|
145
|
+
"file": "scripts/print-receipts.mjs",
|
|
146
|
+
"timeoutMs": 30000
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"kind": "nodeScriptPasses",
|
|
150
|
+
"script": "tests/verify-hotfix.mjs",
|
|
151
|
+
"timeoutMs": 60000,
|
|
152
|
+
"requiredOutput": [
|
|
153
|
+
{
|
|
154
|
+
"pattern": "HOTFIX_ORACLE crash case fixed",
|
|
155
|
+
"label": "the null-guard crash is gone"
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"pattern": "HOTFIX_ORACLE neighborhood intact",
|
|
159
|
+
"label": "gift notes and totals still behave"
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"pattern": "HOTFIX_ORACLE export green",
|
|
163
|
+
"label": "the incident's export runs end to end"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"pattern": "HOTFIX_ORACLE mutant caught",
|
|
167
|
+
"label": "re-seeding the defect restores the crash"
|
|
168
|
+
}
|
|
169
|
+
]
|
|
170
|
+
}
|
|
171
|
+
],
|
|
172
|
+
"taskNotes": {
|
|
173
|
+
"minBytes": 120,
|
|
174
|
+
"checks": [
|
|
175
|
+
{
|
|
176
|
+
"kind": "contains",
|
|
177
|
+
"file": "task-notes.md",
|
|
178
|
+
"pattern": "\\bDONE\\b[\\s\\S]*validation\\.md",
|
|
179
|
+
"flags": "i",
|
|
180
|
+
"label": "DONE note names the validation deliverable"
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
},
|
|
184
|
+
"taskGraph": {
|
|
185
|
+
"requireCraftbookTask": true,
|
|
186
|
+
"requireTerminalStep": true
|
|
187
|
+
},
|
|
188
|
+
"unchangedFixtures": [
|
|
189
|
+
"source/incident.md",
|
|
190
|
+
"package.json",
|
|
191
|
+
"data/orders.json",
|
|
192
|
+
"scripts/print-receipts.mjs"
|
|
193
|
+
]
|
|
194
|
+
},
|
|
195
|
+
"rubric": {
|
|
196
|
+
"artifact": {
|
|
197
|
+
"path": "{{task.dir}}/fix-notes.md",
|
|
198
|
+
"kind": "markdown"
|
|
199
|
+
},
|
|
200
|
+
"axes": [
|
|
201
|
+
{
|
|
202
|
+
"name": "Minimal blast radius",
|
|
203
|
+
"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."
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"name": "Honest evidence under pressure",
|
|
207
|
+
"description": "Reproduction and validation quote real observed behavior, and anything that could not actually be run is labeled unverified rather than claimed."
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"name": "Deferred debt discipline",
|
|
211
|
+
"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."
|
|
212
|
+
}
|
|
213
|
+
]
|
|
214
|
+
},
|
|
215
|
+
"qualityFocus": [
|
|
216
|
+
"minimal-diff discipline",
|
|
217
|
+
"honest verification",
|
|
218
|
+
"runnable rollback"
|
|
219
|
+
]
|
|
220
|
+
}
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "html-arcade-game",
|
|
3
|
+
"name": "HTML Arcade Game",
|
|
4
|
+
"description": "Build a playable single-file HTML/canvas arcade game (shooter, runner, dodger, etc.). Splits design into game-mechanics and visual look, builds, then evaluates against a playability bar and loops until it is actually fun and bug-free.\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. Game design (game-designer) — mechanics, controls, win/lose, difficulty → gated on artifact `design/game-design.md` (markdown-notes)\n2. Visual design (visual-designer) — palette, shapes/sprites, layout, juice → gated on artifact `design/visual-design.md` (markdown-notes)\n3. Build (developer) — implement the game in one index.html → gated on `index.html` (html-game)\n\nThe gates never advance with an unmet criterion, and loop back to the\nowning phase to fix named gaps.\n",
|
|
5
|
+
"entryStepId": "game-design",
|
|
6
|
+
"triggers": [
|
|
7
|
+
"arcade game",
|
|
8
|
+
"space shooter",
|
|
9
|
+
"html game",
|
|
10
|
+
"build a game"
|
|
11
|
+
],
|
|
12
|
+
"steps": [
|
|
13
|
+
{
|
|
14
|
+
"id": "game-design",
|
|
15
|
+
"name": "Game design",
|
|
16
|
+
"description": "mechanics, controls, win/lose, difficulty",
|
|
17
|
+
"prompt": "Design the GAME, not the code. Decide: core mechanic (what the player does), controls (keys/mouse/touch), win and lose conditions, scoring, restart behavior, and the difficulty curve. Then write an **acceptance-criteria checklist** (4-8 concrete, checkable items, e.g. \"arrow keys move the ship\", \"colliding with an enemy ends the game\", \"score increments on hit\", \"restart resets the score\", \"game is playable for >30s without a JS error\"). Save the complete mechanics + checklist to artifact `design/game-design.md` with `write_artifact`, and summarize the path in task notes. No code, no visuals yet.",
|
|
18
|
+
"suggestedRole": "game-designer",
|
|
19
|
+
"toolPolicy": {
|
|
20
|
+
"disallowBuiltinToolsets": [
|
|
21
|
+
"ai-apps",
|
|
22
|
+
"archives",
|
|
23
|
+
"audio",
|
|
24
|
+
"browser-automation",
|
|
25
|
+
"code-execution",
|
|
26
|
+
"craftbooks",
|
|
27
|
+
"data-tables",
|
|
28
|
+
"entity-intel",
|
|
29
|
+
"git",
|
|
30
|
+
"image-intel",
|
|
31
|
+
"images",
|
|
32
|
+
"role-delegation",
|
|
33
|
+
"role-delegation-escalation",
|
|
34
|
+
"security-intel",
|
|
35
|
+
"team-management",
|
|
36
|
+
"videos",
|
|
37
|
+
"web",
|
|
38
|
+
"workspace-fs-write"
|
|
39
|
+
],
|
|
40
|
+
"outputMedium": "artifact",
|
|
41
|
+
"additionalOutputMedia": [
|
|
42
|
+
"task-note"
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
"advanceWhen": {
|
|
46
|
+
"file": "design/game-design.md",
|
|
47
|
+
"minBytes": 1,
|
|
48
|
+
"sniff": "nonempty",
|
|
49
|
+
"artifact": true
|
|
50
|
+
},
|
|
51
|
+
"gate": {
|
|
52
|
+
"at": "completion",
|
|
53
|
+
"checks": [
|
|
54
|
+
{
|
|
55
|
+
"kind": "minBytes",
|
|
56
|
+
"file": "design/game-design.md",
|
|
57
|
+
"bytes": 600,
|
|
58
|
+
"artifact": true
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"kind": "sniff",
|
|
62
|
+
"file": "design/game-design.md",
|
|
63
|
+
"sniff": "nonempty",
|
|
64
|
+
"artifact": true
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"kind": "contains",
|
|
68
|
+
"file": "design/game-design.md",
|
|
69
|
+
"pattern": "acceptance|criteria|checklist",
|
|
70
|
+
"flags": "i",
|
|
71
|
+
"label": "acceptance criteria",
|
|
72
|
+
"artifact": true
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"kind": "contains",
|
|
76
|
+
"file": "design/game-design.md",
|
|
77
|
+
"pattern": "control|input|keyboard|mouse|touch",
|
|
78
|
+
"flags": "i",
|
|
79
|
+
"label": "control scheme",
|
|
80
|
+
"artifact": true
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"kind": "contains",
|
|
84
|
+
"file": "design/game-design.md",
|
|
85
|
+
"pattern": "win|lose|game over|victory|defeat",
|
|
86
|
+
"flags": "i",
|
|
87
|
+
"label": "end-state rules",
|
|
88
|
+
"artifact": true
|
|
89
|
+
}
|
|
90
|
+
],
|
|
91
|
+
"onReject": "game-design",
|
|
92
|
+
"maxAttempts": 3
|
|
93
|
+
},
|
|
94
|
+
"next": "visual-design"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"id": "visual-design",
|
|
98
|
+
"name": "Visual design",
|
|
99
|
+
"description": "palette, shapes/sprites, layout, juice",
|
|
100
|
+
"prompt": "Read artifact `design/game-design.md` with `read_artifact`, then decide how the game LOOKS. Pick a palette with exact color values, the canvas shapes or sprites for player/enemies/projectiles, the HUD layout (score, lives or timer), and at least one feedback effect (hit flash, screen shake, or particles). Keep it self-contained — canvas drawing or CSS, no external asset downloads. Save the concrete visual target to artifact `design/visual-design.md` with `write_artifact`, and summarize the path in task notes. Still no game code.",
|
|
101
|
+
"suggestedRole": "visual-designer",
|
|
102
|
+
"toolPolicy": {
|
|
103
|
+
"disallowBuiltinToolsets": [
|
|
104
|
+
"ai-apps",
|
|
105
|
+
"archives",
|
|
106
|
+
"audio",
|
|
107
|
+
"browser-automation",
|
|
108
|
+
"code-execution",
|
|
109
|
+
"craftbooks",
|
|
110
|
+
"data-tables",
|
|
111
|
+
"entity-intel",
|
|
112
|
+
"git",
|
|
113
|
+
"image-intel",
|
|
114
|
+
"images",
|
|
115
|
+
"role-delegation",
|
|
116
|
+
"role-delegation-escalation",
|
|
117
|
+
"security-intel",
|
|
118
|
+
"team-management",
|
|
119
|
+
"videos",
|
|
120
|
+
"web",
|
|
121
|
+
"workspace-fs-write"
|
|
122
|
+
],
|
|
123
|
+
"outputMedium": "artifact",
|
|
124
|
+
"additionalOutputMedia": [
|
|
125
|
+
"task-note"
|
|
126
|
+
]
|
|
127
|
+
},
|
|
128
|
+
"consumes": [
|
|
129
|
+
{
|
|
130
|
+
"file": "design/game-design.md",
|
|
131
|
+
"artifact": true
|
|
132
|
+
}
|
|
133
|
+
],
|
|
134
|
+
"advanceWhen": {
|
|
135
|
+
"file": "design/visual-design.md",
|
|
136
|
+
"minBytes": 1,
|
|
137
|
+
"sniff": "nonempty",
|
|
138
|
+
"artifact": true
|
|
139
|
+
},
|
|
140
|
+
"gate": {
|
|
141
|
+
"at": "completion",
|
|
142
|
+
"checks": [
|
|
143
|
+
{
|
|
144
|
+
"kind": "minBytes",
|
|
145
|
+
"file": "design/visual-design.md",
|
|
146
|
+
"bytes": 450,
|
|
147
|
+
"artifact": true
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"kind": "sniff",
|
|
151
|
+
"file": "design/visual-design.md",
|
|
152
|
+
"sniff": "nonempty",
|
|
153
|
+
"artifact": true
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"kind": "contains",
|
|
157
|
+
"file": "design/visual-design.md",
|
|
158
|
+
"pattern": "#[0-9a-f]{3,8}|rgb\\(|hsl\\(",
|
|
159
|
+
"flags": "i",
|
|
160
|
+
"label": "concrete palette",
|
|
161
|
+
"artifact": true
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"kind": "contains",
|
|
165
|
+
"file": "design/visual-design.md",
|
|
166
|
+
"pattern": "HUD|score|lives|timer",
|
|
167
|
+
"flags": "i",
|
|
168
|
+
"label": "HUD design",
|
|
169
|
+
"artifact": true
|
|
170
|
+
}
|
|
171
|
+
],
|
|
172
|
+
"onReject": "visual-design",
|
|
173
|
+
"maxAttempts": 3
|
|
174
|
+
},
|
|
175
|
+
"next": "build"
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"id": "build",
|
|
179
|
+
"name": "Build",
|
|
180
|
+
"description": "implement the game in one index.html",
|
|
181
|
+
"prompt": "Read artifacts `design/game-design.md` and `design/visual-design.md` with `read_artifact`. Implement the game in workspace `index.html` with `write_file` (inline CSS + JS) so it satisfies the acceptance criteria and matches the visual spec. Include a real game loop, real input handling, score/state, a visible win or lose state, and an in-page restart path. Keep it self-contained with no network assets. On a loop-back, fix only the gaps the reviewer named — do not regress criteria that already passed. `write_task_note` the workspace path and which criteria now pass.",
|
|
182
|
+
"suggestedRole": "developer",
|
|
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
|
+
],
|
|
203
|
+
"outputMedium": "workspace",
|
|
204
|
+
"additionalOutputMedia": [
|
|
205
|
+
"task-note"
|
|
206
|
+
]
|
|
207
|
+
},
|
|
208
|
+
"consumes": [
|
|
209
|
+
{
|
|
210
|
+
"file": "design/game-design.md",
|
|
211
|
+
"artifact": true
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"file": "design/visual-design.md",
|
|
215
|
+
"artifact": true
|
|
216
|
+
}
|
|
217
|
+
],
|
|
218
|
+
"advanceWhen": {
|
|
219
|
+
"file": "index.html",
|
|
220
|
+
"minBytes": 1,
|
|
221
|
+
"sniff": "html-complete"
|
|
222
|
+
},
|
|
223
|
+
"gate": {
|
|
224
|
+
"at": "completion",
|
|
225
|
+
"checks": [
|
|
226
|
+
{
|
|
227
|
+
"kind": "minBytes",
|
|
228
|
+
"file": "index.html",
|
|
229
|
+
"bytes": 3200
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"kind": "htmlLint",
|
|
233
|
+
"file": "index.html"
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"kind": "contains",
|
|
237
|
+
"file": "index.html",
|
|
238
|
+
"pattern": "game\\s*-?\\s*over|you\\s+(?:win|won|lose|lost)|victory|defeat",
|
|
239
|
+
"flags": "i",
|
|
240
|
+
"label": "visible end state"
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"kind": "contains",
|
|
244
|
+
"file": "index.html",
|
|
245
|
+
"pattern": "restart|play\\s*again|new\\s*game|try\\s*again",
|
|
246
|
+
"flags": "i",
|
|
247
|
+
"label": "restart path"
|
|
248
|
+
}
|
|
249
|
+
],
|
|
250
|
+
"scripts": [
|
|
251
|
+
{
|
|
252
|
+
"name": "checkHtmlGame",
|
|
253
|
+
"scope": "standard",
|
|
254
|
+
"inputs": {
|
|
255
|
+
"file": "index.html"
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"name": "checkJsParses",
|
|
260
|
+
"scope": "standard",
|
|
261
|
+
"inputs": {
|
|
262
|
+
"file": "index.html"
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
],
|
|
266
|
+
"onReject": "build",
|
|
267
|
+
"maxAttempts": 4
|
|
268
|
+
},
|
|
269
|
+
"next": "evaluate"
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"id": "evaluate",
|
|
273
|
+
"name": "Evaluate",
|
|
274
|
+
"description": "Grade the deliverable against every acceptance criterion. All pass → finish; any fail → loop back and fix the gap.",
|
|
275
|
+
"prompt": "Read workspace `index.html` with `read_file` and actually exercise the game. If a browser/QA capability is available, load it, play it, test restart, and watch the console for errors; otherwise trace the game loop, input listeners, end-state transition, and reset path in source. Check every criterion from artifact `design/game-design.md` and write PASS/FAIL per criterion.\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: \"build\" })` 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.",
|
|
276
|
+
"suggestedRole": "reviewer",
|
|
277
|
+
"toolPolicy": {
|
|
278
|
+
"disallowBuiltinToolsets": [
|
|
279
|
+
"ai-apps",
|
|
280
|
+
"archives",
|
|
281
|
+
"artifacts",
|
|
282
|
+
"audio",
|
|
283
|
+
"browser-automation",
|
|
284
|
+
"code-execution",
|
|
285
|
+
"craftbooks",
|
|
286
|
+
"data-tables",
|
|
287
|
+
"entity-intel",
|
|
288
|
+
"git",
|
|
289
|
+
"image-intel",
|
|
290
|
+
"images",
|
|
291
|
+
"role-delegation",
|
|
292
|
+
"role-delegation-escalation",
|
|
293
|
+
"security-intel",
|
|
294
|
+
"team-management",
|
|
295
|
+
"videos",
|
|
296
|
+
"web",
|
|
297
|
+
"workspace-fs-write"
|
|
298
|
+
],
|
|
299
|
+
"outputMedium": "task-note"
|
|
300
|
+
},
|
|
301
|
+
"consumes": [
|
|
302
|
+
{
|
|
303
|
+
"file": "index.html"
|
|
304
|
+
}
|
|
305
|
+
],
|
|
306
|
+
"next": "build"
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"id": "finish",
|
|
310
|
+
"name": "Finish",
|
|
311
|
+
"description": "All acceptance criteria met. Stamp a short summary and report DONE.",
|
|
312
|
+
"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.",
|
|
313
|
+
"suggestedRole": "developer",
|
|
314
|
+
"toolPolicy": {
|
|
315
|
+
"disallowBuiltinToolsets": [
|
|
316
|
+
"ai-apps",
|
|
317
|
+
"archives",
|
|
318
|
+
"artifacts",
|
|
319
|
+
"audio",
|
|
320
|
+
"browser-automation",
|
|
321
|
+
"code-execution",
|
|
322
|
+
"craftbooks",
|
|
323
|
+
"data-tables",
|
|
324
|
+
"entity-intel",
|
|
325
|
+
"git",
|
|
326
|
+
"image-intel",
|
|
327
|
+
"images",
|
|
328
|
+
"role-delegation",
|
|
329
|
+
"role-delegation-escalation",
|
|
330
|
+
"security-intel",
|
|
331
|
+
"team-management",
|
|
332
|
+
"videos",
|
|
333
|
+
"web",
|
|
334
|
+
"workspace-fs-write"
|
|
335
|
+
],
|
|
336
|
+
"outputMedium": "task-note"
|
|
337
|
+
},
|
|
338
|
+
"terminal": true
|
|
339
|
+
}
|
|
340
|
+
],
|
|
341
|
+
"version": "1.2.3",
|
|
342
|
+
"releasedAt": "2026-09-05T03:30:00Z"
|
|
343
|
+
}
|