@bendyline/gilde 0.1.4 → 0.1.5
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/README.md +1 -0
- package/data/chat-models/de/deepseek-v4-flash-284b-q2/manifest.json +4 -3
- package/data/chat-models/de/deepseek-v4-flash-284b-q4/manifest.json +4 -3
- package/data/chat-models/ge/gemma4-12b-q4/manifest.json +20 -11
- package/data/chat-models/ge/gemma4-12b-q4/versions/1.1.0/manifest.json +2 -8
- package/data/chat-models/ge/gemma4-12b-q4/versions/1.1.2/manifest.json +78 -0
- package/data/chat-models/ge/gemma4-12b-q8/manifest.json +23 -14
- package/data/chat-models/ge/gemma4-12b-q8/versions/1.0.0/manifest.json +2 -8
- package/data/chat-models/ge/gemma4-12b-q8/versions/1.0.2/manifest.json +78 -0
- package/data/chat-models/ge/gemma4-26b-q4/manifest.json +55 -46
- package/data/chat-models/ge/gemma4-26b-q4/versions/1.2.0/manifest.json +2 -8
- package/data/chat-models/ge/gemma4-26b-q4/versions/1.2.1/manifest.json +81 -0
- package/data/chat-models/ge/gemma4-31b-q4/manifest.json +36 -28
- package/data/chat-models/ge/gemma4-31b-q4/versions/1.2.0/manifest.json +2 -8
- package/data/chat-models/ge/gemma4-31b-q4/versions/1.2.1/manifest.json +87 -0
- package/data/chat-models/ge/gemma4-e2b-q8/manifest.json +76 -69
- package/data/chat-models/ge/gemma4-e2b-q8/versions/1.1.0/manifest.json +2 -8
- package/data/chat-models/ge/gemma4-e2b-q8/versions/1.1.2/manifest.json +71 -0
- package/data/chat-models/ge/gemma4-e4b-q8/manifest.json +71 -78
- package/data/chat-models/ge/gemma4-e4b-q8/versions/1.1.0/manifest.json +3 -9
- package/data/chat-models/ge/gemma4-e4b-q8/versions/1.1.2/manifest.json +71 -0
- package/data/chat-models/index.json +1 -1
- package/data/chat-models/la/laguna-s-2.1-118b-q4/manifest.json +17 -17
- package/data/chat-models/la/laguna-s-2.1-118b-q4/versions/1.0.1/manifest.json +124 -0
- package/data/chat-models/la/laguna-s-2.1-118b-q8/manifest.json +7 -7
- package/data/chat-models/la/laguna-s-2.1-118b-q8/versions/1.0.1/manifest.json +174 -0
- package/data/chat-models/mi/mistral-medium-3.5-128b-q4/manifest.json +4 -17
- package/data/chat-models/mi/mistral-medium-3.5-128b-q4/versions/1.0.0/manifest.json +2 -12
- package/data/chat-models/ne/nemotron3-nano-30b-q4/manifest.json +5 -0
- package/data/chat-models/qw/qwen3.5-122b-a10b-q4/manifest.json +27 -19
- package/data/chat-models/qw/qwen3.5-122b-a10b-q4/versions/1.0.1/manifest.json +164 -0
- package/data/chat-models/qw/qwen3.5-2b-q4/manifest.json +79 -77
- package/data/chat-models/qw/qwen3.5-2b-q4/versions/1.1.0/manifest.json +2 -8
- package/data/chat-models/qw/qwen3.5-2b-q4/versions/1.1.2/manifest.json +76 -0
- package/data/chat-models/qw/qwen3.5-4b-q4/manifest.json +79 -77
- package/data/chat-models/qw/qwen3.5-4b-q4/versions/1.1.0/manifest.json +2 -8
- package/data/chat-models/qw/qwen3.5-4b-q4/versions/1.1.2/manifest.json +76 -0
- package/data/chat-models/qw/qwen3.5-9b-q4/manifest.json +87 -85
- package/data/chat-models/qw/qwen3.5-9b-q4/versions/1.1.0/manifest.json +2 -8
- package/data/chat-models/qw/qwen3.5-9b-q4/versions/1.1.2/manifest.json +81 -0
- package/data/chat-models/qw/qwen3.6-27b-q4/manifest.json +99 -97
- package/data/chat-models/qw/qwen3.6-27b-q4/versions/1.1.0/manifest.json +2 -8
- package/data/chat-models/qw/qwen3.6-27b-q4/versions/1.1.4/manifest.json +91 -0
- package/data/chat-models/qw/qwen3.6-27b-q8/manifest.json +16 -12
- package/data/chat-models/qw/qwen3.6-27b-q8/versions/1.0.0/manifest.json +2 -8
- package/data/chat-models/qw/qwen3.6-27b-q8/versions/1.0.2/manifest.json +103 -0
- package/data/chat-models/qw/qwen3.6-35b-a3b-q4/manifest.json +18 -14
- package/data/chat-models/qw/qwen3.6-35b-a3b-q4/versions/1.0.0/manifest.json +2 -8
- package/data/chat-models/qw/qwen3.6-35b-a3b-q4/versions/1.0.1/manifest.json +93 -0
- package/data/chat-models/qw/qwen3.6-35b-a3b-q8/manifest.json +16 -12
- package/data/chat-models/qw/qwen3.6-35b-a3b-q8/versions/1.0.0/manifest.json +2 -8
- package/data/chat-models/qw/qwen3.6-35b-a3b-q8/versions/1.0.1/manifest.json +113 -0
- package/data/craftbook-templates/bu/bug-fix-tdd/versions/1.0.1/test.json +0 -5
- package/data/craftbook-templates/bu/build-loop/versions/1.1.0/craftbook.json +65 -0
- package/data/craftbook-templates/bu/build-loop/versions/1.1.0/test.json +121 -0
- package/data/craftbook-templates/ch/character-sheet/versions/1.0.0/test.json +1 -2
- package/data/craftbook-templates/ch/character-turnaround/versions/1.0.0/test.json +1 -2
- package/data/craftbook-templates/cl/cli-tool/versions/1.1.0/craftbook.json +139 -0
- package/data/craftbook-templates/cl/cli-tool/versions/1.1.0/test.json +128 -0
- package/data/craftbook-templates/cr/crossword-forge/manifest.json +1 -2
- package/data/craftbook-templates/de/deep-security-review/versions/1.1.0/craftbook.json +201 -0
- package/data/craftbook-templates/de/deep-security-review/versions/1.1.0/test.json +157 -0
- package/data/craftbook-templates/do/dockerize-app/versions/1.0.0/test.json +0 -5
- package/data/craftbook-templates/fr/freeze-scope/manifest.json +1 -2
- package/data/craftbook-templates/fr/freeze-scope/versions/{1.0.1 → 1.1.0}/craftbook.json +5 -17
- package/data/craftbook-templates/gr/graphql-api/versions/1.0.1/test.json +0 -5
- package/data/craftbook-templates/gr/grpc-service/versions/1.0.0/test.json +0 -5
- package/data/craftbook-templates/ho/hotfix-flow/versions/1.0.0/test.json +0 -5
- package/data/craftbook-templates/in/investigate/versions/1.1.0/craftbook.json +81 -0
- package/data/craftbook-templates/in/investigate/versions/1.1.0/test.json +122 -0
- package/data/craftbook-templates/in/invoice-run/manifest.json +1 -2
- package/data/craftbook-templates/in/invoice-run/versions/{1.0.1 → 1.1.0}/craftbook.json +4 -4
- package/data/craftbook-templates/index.json +1 -1
- package/data/craftbook-templates/li/library-package/versions/1.0.0/test.json +0 -5
- package/data/craftbook-templates/me/memory-prompt-session/manifest.json +1 -2
- package/data/craftbook-templates/me/message-queue-consumer/versions/1.0.0/test.json +0 -5
- package/data/craftbook-templates/of/office-hours/versions/1.1.0/craftbook.json +48 -0
- package/data/craftbook-templates/of/office-hours/versions/1.1.0/test.json +118 -0
- package/data/craftbook-templates/pa/page-spread/manifest.json +1 -2
- package/data/craftbook-templates/pa/parser-grammar/versions/1.0.0/test.json +0 -5
- package/data/craftbook-templates/pe/perf-optimization/versions/1.0.0/test.json +0 -5
- package/data/craftbook-templates/pl/plan/manifest.json +1 -2
- package/data/craftbook-templates/po/powerpoint-deck/versions/1.1.0/craftbook.json +128 -0
- package/data/craftbook-templates/{ro/root-cause-investigation/versions/1.0.1 → po/powerpoint-deck/versions/1.1.0}/test.json +6 -6
- package/data/craftbook-templates/pu/pull-request-review/versions/1.1.0/craftbook.json +118 -0
- package/data/craftbook-templates/pu/pull-request-review/versions/1.1.0/test.json +160 -0
- package/data/craftbook-templates/re/refactor-module/versions/1.0.1/test.json +0 -5
- package/data/craftbook-templates/re/regex-builder/versions/1.0.0/test.json +0 -5
- package/data/craftbook-templates/re/research-to-document/versions/1.1.0/craftbook.json +158 -0
- package/data/craftbook-templates/re/research-to-document/versions/1.1.0/test.json +97 -0
- package/data/craftbook-templates/ro/root-cause-investigation/manifest.json +1 -2
- package/data/craftbook-templates/sd/sdk-wrapper/versions/1.0.1/test.json +0 -5
- package/data/craftbook-templates/se/security-architecture-review/versions/1.1.0/craftbook.json +28 -0
- package/data/craftbook-templates/{te/technical-documentation/versions/1.0.1 → se/security-architecture-review/versions/1.1.0}/test.json +7 -7
- package/data/craftbook-templates/sh/ship/versions/1.1.0/craftbook.json +137 -0
- package/data/craftbook-templates/sh/ship/versions/1.1.0/test.json +225 -0
- package/data/craftbook-templates/st/state-machine/versions/1.0.0/test.json +0 -5
- package/data/craftbook-templates/te/technical-documentation/manifest.json +1 -2
- package/data/craftbook-templates/te/test-suite-backfill/versions/1.0.0/test.json +0 -5
- package/data/craftbook-templates/ti/tileset-batch/versions/1.0.0/test.json +1 -2
- package/data/craftbook-templates/ty/type-safety-pass/versions/1.0.0/test.json +0 -5
- package/data/craftbook-templates/ve/version-bump/versions/1.0.0/test.json +0 -5
- package/data/gezel-templates/ch/chess-player/manifest.json +20 -0
- package/data/gezel-templates/ch/chess-player/versions/1.0.0/about.md +21 -0
- package/data/gezel-templates/ch/chess-player/versions/1.0.0/manifest.json +10 -0
- package/data/gezel-templates/go/go-player/manifest.json +22 -0
- package/data/gezel-templates/go/go-player/versions/1.0.0/about.md +22 -0
- package/data/gezel-templates/go/go-player/versions/1.0.0/manifest.json +10 -0
- package/data/gezel-templates/index.json +1 -1
- package/data/project-types/ch/chess/manifest.json +20 -0
- package/data/project-types/ch/chess/versions/1.0.0/about.md +9 -0
- package/data/project-types/ch/chess/versions/1.0.0/game.json +127 -0
- package/data/project-types/ch/chess/versions/1.0.0/manifest.json +180 -0
- package/data/project-types/ch/chess/versions/1.0.0/mission.md +8 -0
- package/data/project-types/ch/chess/versions/1.0.0/pages/board/index.html +574 -0
- package/data/project-types/go/go/manifest.json +22 -0
- package/data/project-types/go/go/versions/1.0.0/about.md +9 -0
- package/data/project-types/go/go/versions/1.0.0/game.json +103 -0
- package/data/project-types/go/go/versions/1.0.0/manifest.json +166 -0
- package/data/project-types/go/go/versions/1.0.0/mission.md +8 -0
- package/data/project-types/go/go/versions/1.0.0/pages/board/index.html +637 -0
- package/data/project-types/index.json +1 -1
- package/package.json +2 -1
- package/schemas/chat-model-version.schema.json +22 -0
- package/schemas/craftbook-doc.schema.json +12 -0
- package/schemas/craftbook-template-version.schema.json +12 -0
- package/schemas/craftbook-test.schema.json +12 -0
- package/data/chat-models/gl/glm-5.2-754b-q2/manifest.json +0 -66
- package/data/chat-models/gl/glm-5.2-754b-q2/versions/1.0.0/manifest.json +0 -18
- package/data/craftbook-templates/cr/crossword-forge/versions/1.0.1/craftbook.json +0 -147
- package/data/craftbook-templates/cr/crossword-forge/versions/1.0.1/test.json +0 -135
- package/data/craftbook-templates/me/memory-prompt-session/versions/1.0.1/craftbook.json +0 -116
- package/data/craftbook-templates/me/memory-prompt-session/versions/1.0.1/test.json +0 -112
- package/data/craftbook-templates/pa/page-spread/versions/1.0.1/craftbook.json +0 -94
- package/data/craftbook-templates/pa/page-spread/versions/1.0.1/test.json +0 -133
- package/data/craftbook-templates/pl/plan/versions/1.0.1/craftbook.json +0 -104
- package/data/craftbook-templates/pl/plan/versions/1.0.1/test.json +0 -91
- package/data/craftbook-templates/ro/root-cause-investigation/versions/1.0.1/craftbook.json +0 -126
- package/data/craftbook-templates/te/technical-documentation/versions/1.0.1/craftbook.json +0 -152
- /package/data/craftbook-templates/fr/freeze-scope/versions/{1.0.1 → 1.1.0}/test.json +0 -0
- /package/data/craftbook-templates/in/invoice-run/versions/{1.0.1 → 1.1.0}/test.json +0 -0
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "memory-prompt-session",
|
|
3
|
-
"name": "Memory Session",
|
|
4
|
-
"description": "Run one guided memory session and bank it properly: pick the theme the timeline is hungriest for, follow the thread of feeling through the recorded conversation, and file the session with the follow-up questions that keep the next one alive. Locks the theme and question set FIRST, then captures the session in the teller's own words, then files it in the store with the threads to pull next time. Use for memory sessions, filing an interview with a parent or grandparent, memoir capture, and 'what should I ask next time'.\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\nPhases:\n\n1. Scope the session (planner) — theme from the timeline's gaps, question set, capture rules → gated on `notes/scope.md` (markdown-notes)\n2. Capture the session (interviewer) — session record in the teller's own words under sessions/\n3. File the session (archivist) — store record updated, chapter-worthy moments, follow-up threads → gated on `report.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": "scope",
|
|
6
|
-
"triggers": [
|
|
7
|
-
"file the memory session",
|
|
8
|
-
"run a memory session",
|
|
9
|
-
"we recorded a session with mom",
|
|
10
|
-
"what should I ask next time",
|
|
11
|
-
"bank the interview"
|
|
12
|
-
],
|
|
13
|
-
"steps": [
|
|
14
|
-
{
|
|
15
|
-
"id": "scope",
|
|
16
|
-
"name": "Scope the session",
|
|
17
|
-
"description": "theme from the timeline's gaps, question set, capture rules",
|
|
18
|
-
"prompt": "Choose the session's aim before pressing record — or before opening the transcript. Step 1: read sessions.json and timeline.md from the workspace — what has been captured already, and which years and themes the timeline is hungriest for. Step 2: pick the session theme with the owner and draft the question set — open questions that follow feeling, not chronology ('what did the kitchen smell like' beats 'what year was that'). Step 3: write an acceptance-criteria checklist ('the session file preserves the teller's own words and phrasings', 'the session is recorded in the store with its date and theme', 'the report names the moments worth a chapter, each with the teller's words', 'at least three follow-up threads, each with the question to open it'). Call write_task_note with the theme + question set + checklist and write notes/scope.md.",
|
|
19
|
-
"suggestedRole": "planner",
|
|
20
|
-
"advanceWhen": {
|
|
21
|
-
"file": "notes/scope.md",
|
|
22
|
-
"minBytes": 1,
|
|
23
|
-
"sniff": "nonempty"
|
|
24
|
-
},
|
|
25
|
-
"gate": {
|
|
26
|
-
"at": "completion",
|
|
27
|
-
"checks": [
|
|
28
|
-
{
|
|
29
|
-
"kind": "minBytes",
|
|
30
|
-
"file": "notes/scope.md",
|
|
31
|
-
"bytes": 120
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"kind": "sniff",
|
|
35
|
-
"file": "notes/scope.md",
|
|
36
|
-
"sniff": "nonempty"
|
|
37
|
-
}
|
|
38
|
-
],
|
|
39
|
-
"onReject": "scope",
|
|
40
|
-
"maxAttempts": 3
|
|
41
|
-
},
|
|
42
|
-
"next": "capture"
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"id": "capture",
|
|
46
|
-
"name": "Capture the session",
|
|
47
|
-
"description": "session record in the teller's own words under sessions/",
|
|
48
|
-
"prompt": "Bank the session from the recording. Step 1: work from the session recording's transcript — through the project's transcription capabilities, or from a transcript file the owner provides. Step 2: shape it gently into a session record: keep the teller's own words and phrasings verbatim, keep the digressions (they are where the good material lives), and mark the interviewer's questions so the thread stays followable. Step 3: note the moments where the feeling changed — a laugh, a pause, a subject change — right where they happened. Step 4: save the session record in the sessions/ folder named for the date (for example sessions/2026-07-18-session.md) and call write_task_note with the path and the themes touched.",
|
|
49
|
-
"suggestedRole": "interviewer",
|
|
50
|
-
"next": "file"
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
"id": "file",
|
|
54
|
-
"name": "File the session",
|
|
55
|
-
"description": "store record updated, chapter-worthy moments, follow-up threads",
|
|
56
|
-
"prompt": "File the session and set up the next one. Step 1: record the session in the store through the project's memoir capabilities — date, teller, theme, and the session file's path — so sessions.json stays the index of everything banked. Step 2: write report.md: what was captured this session in a few warm lines, the moments worth a chapter (quote the teller's words for each), and at least three follow-up threads — each one a specific question for next time, aimed at a gap the session opened. Step 3: note anything the teller said to come back to, or asked to keep private — that instruction outranks everything. Call write_task_note with the chapter-worthy count and the top follow-up question.",
|
|
57
|
-
"suggestedRole": "archivist",
|
|
58
|
-
"advanceWhen": {
|
|
59
|
-
"file": "report.md",
|
|
60
|
-
"minBytes": 1,
|
|
61
|
-
"sniff": "nonempty"
|
|
62
|
-
},
|
|
63
|
-
"gate": {
|
|
64
|
-
"at": "completion",
|
|
65
|
-
"checks": [
|
|
66
|
-
{
|
|
67
|
-
"kind": "minBytes",
|
|
68
|
-
"file": "report.md",
|
|
69
|
-
"bytes": 1000
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
"kind": "fileCount",
|
|
73
|
-
"ext": [
|
|
74
|
-
"md"
|
|
75
|
-
],
|
|
76
|
-
"min": 1,
|
|
77
|
-
"dir": "sessions",
|
|
78
|
-
"label": "the banked session record exists under sessions/"
|
|
79
|
-
}
|
|
80
|
-
],
|
|
81
|
-
"scripts": [
|
|
82
|
-
{
|
|
83
|
-
"name": "checkContains",
|
|
84
|
-
"scope": "standard",
|
|
85
|
-
"inputs": {
|
|
86
|
-
"file": "report.md",
|
|
87
|
-
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
88
|
-
"flags": "i"
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
],
|
|
92
|
-
"onReject": "file",
|
|
93
|
-
"maxAttempts": 4
|
|
94
|
-
},
|
|
95
|
-
"next": "evaluate"
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
"id": "evaluate",
|
|
99
|
-
"name": "Evaluate",
|
|
100
|
-
"description": "Grade the deliverable against every acceptance criterion. All pass → finish; any fail → loop back and fix the gap.",
|
|
101
|
-
"prompt": "Open report.md and the new session file under sessions/ and verify every criterion from notes/scope.md: the session file preserves the teller's own words (spot-check the report's quotes against the session file — they must be verbatim), the session is recorded in the store with date and theme, the chapter-worthy moments are named with the teller's words, and there are at least three follow-up threads each carrying a real question. Write PASS/FAIL per criterion; on any failure, name the gap and loop back to 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: \"file\" })` 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.",
|
|
102
|
-
"suggestedRole": "reviewer",
|
|
103
|
-
"next": "file"
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
"id": "finish",
|
|
107
|
-
"name": "Finish",
|
|
108
|
-
"description": "All acceptance criteria met. Stamp a short summary and report DONE.",
|
|
109
|
-
"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.",
|
|
110
|
-
"suggestedRole": "developer",
|
|
111
|
-
"terminal": true
|
|
112
|
-
}
|
|
113
|
-
],
|
|
114
|
-
"version": "1.0.1",
|
|
115
|
-
"releasedAt": "2026-07-26T00:20:00.000Z"
|
|
116
|
-
}
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schemaVersion": 1,
|
|
3
|
-
"title": "Memory Session — the bakery years",
|
|
4
|
-
"objective": "Measure whether the memory-prompt-session craftbook banks a recorded session in the teller's own words, files it in the store, and produces real follow-up threads.",
|
|
5
|
-
"tags": [
|
|
6
|
-
"corpus"
|
|
7
|
-
],
|
|
8
|
-
"prompt": "i recorded a long chat with mom about her bakery years — transcript is in recordings/session3.txt. can you file it as a sesion and tell me what to ask next time?",
|
|
9
|
-
"setup": {
|
|
10
|
-
"projectName": "Mam's Memoir",
|
|
11
|
-
"about": "Memoir studio project capturing Els's life story, one recorded session at a time. Session recordings land under workspace/recordings; banked sessions live under workspace/sessions with workspace/sessions.json as the index; workspace/timeline.md tracks which years are covered.",
|
|
12
|
-
"missionObjectives": "Bank every session faithfully — the teller's own words, filed and indexed — and keep the next session alive with follow-up questions. Grounded in the seeded transcript; no live services, no real credentials.",
|
|
13
|
-
"files": [
|
|
14
|
-
{
|
|
15
|
-
"path": "recordings/session3.txt",
|
|
16
|
-
"content": "Session 3 — recorded 2026-07-17, kitchen table. Teller: Mam (Els). Interviewer: Jip.\n\nJIP: You always call them the bakery years. Start wherever you want.\n\nELS: We took over the bakery on the Vissersdijk in 1978. Your father signed the papers with flour already on his sleeves, that is how sure he was. I was twenty-six and I had never once seen four o'clock in the morning. By that first winter I could tell the time by the ovens without looking at a clock.\n\nJIP: What did the mornings feel like?\n\nELS: Cold, then warm. That was the whole day, cold then warm. The front of the shop was ice until the ovens caught up. I kneaded with my coat on until six. The smell of the first proof — that is the smell I will want on my last day, I think. Yeast and warm linen.\n\nJIP: Who came in?\n\nELS: Everyone came in. The harbor men at five thirty, before anyone else was awake. They never spoke before the first roll, not one word, and I learned not to speak either. Mrs. Terpstra every Thursday for the raisin loaf, and she paid in coins she counted twice. Children after school with their cents pressed flat and sweaty in their hands.\n\nJIP: Was it ever bad?\n\nELS: The strike year was bad. I will not dress it up. Nineteen eighty-four, the flour price doubled in one season and we did not sleep for the mathematics of it. Your father wanted to sell. I said the ovens stay lit, and I took in mending in the afternoons so they could. Nobody in the town knew that. I did the mending in the back room with the curtain closed.\n\nJIP: I never knew that either.\n\nELS: You were four. You knew the mixing bowl and the licking spoon, that was your whole world. You used to sleep in the flour sacks like a cat. The customers asked after you like you were part of the inventory.\n\nJIP: Why did it end?\n\nELS: My hands, mostly. And the supermarket on the ring road, a little. We sold in 1990 to the Boonstra boy, who let it become a phone shop, which I have decided not to be bitter about. I kept the shop bell. It is in the box under the stairs with the wedding things. When I shake it I am twenty-six again, cold then warm.\n\nJIP: We should stop, your tea is cold.\n\nELS: The tea is always cold when the talking is good. Next time I will tell you about the wedding cakes. The ones I made and the one I never got to make. Ask me about that one, will you? Do not let me wriggle out of it.\n\n[recording ends 58:14]\n"
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
"path": "sessions.json",
|
|
20
|
-
"content": "{\n \"teller\": \"Els\",\n \"sessions\": [\n {\n \"date\": \"2026-06-07\",\n \"theme\": \"the childhood house on the dike\",\n \"summary\": \"Growing up in the 1950s, six siblings, the flood stories.\"\n },\n {\n \"date\": \"2026-06-28\",\n \"theme\": \"meeting Pa\",\n \"summary\": \"The dance hall in 1971, the borrowed bicycle, the first winter together.\"\n }\n ]\n}\n"
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"path": "timeline.md",
|
|
24
|
-
"content": "# Els — timeline coverage\n\n- 1950s — childhood on the dike: covered (session 1)\n- 1960s — school years, first job: thin, one anecdote only\n- 1971-1977 — meeting Pa, early marriage: covered (session 2)\n- 1978-1990 — the bakery years: BIGGEST GAP, nothing banked yet\n- 1990s — after the bakery: nothing\n"
|
|
25
|
-
}
|
|
26
|
-
],
|
|
27
|
-
"worker": {
|
|
28
|
-
"name": "Milan",
|
|
29
|
-
"role": "Archivist"
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
"mocks": [],
|
|
33
|
-
"success": {
|
|
34
|
-
"summary": "The session is banked under sessions/ in the teller's own words, and report.md names the chapter-worthy moments with verbatim quotes plus at least three follow-up questions.",
|
|
35
|
-
"deliverables": [
|
|
36
|
-
{
|
|
37
|
-
"path": "report.md",
|
|
38
|
-
"kind": "markdown-report",
|
|
39
|
-
"minBytes": 1000,
|
|
40
|
-
"checks": [
|
|
41
|
-
{
|
|
42
|
-
"kind": "contains",
|
|
43
|
-
"file": "report.md",
|
|
44
|
-
"pattern": "(?:^|\\n)#{1,3}\\s+\\S",
|
|
45
|
-
"flags": "i"
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
"kind": "contains",
|
|
49
|
-
"file": "report.md",
|
|
50
|
-
"pattern": "follow",
|
|
51
|
-
"flags": "i",
|
|
52
|
-
"label": "follow-up threads present"
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"kind": "contains",
|
|
56
|
-
"file": "report.md",
|
|
57
|
-
"pattern": "\\?",
|
|
58
|
-
"label": "real questions for next time"
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
"kind": "valuesSubsetOf",
|
|
62
|
-
"file": "report.md",
|
|
63
|
-
"sourceFiles": [
|
|
64
|
-
"recordings/session3.txt"
|
|
65
|
-
],
|
|
66
|
-
"pattern": "[\"“]([^\"”\\n]{15,120})[\"”]",
|
|
67
|
-
"label": "quoted teller phrases are verbatim from the transcript"
|
|
68
|
-
}
|
|
69
|
-
]
|
|
70
|
-
}
|
|
71
|
-
],
|
|
72
|
-
"checks": [
|
|
73
|
-
{
|
|
74
|
-
"kind": "fileCount",
|
|
75
|
-
"ext": [
|
|
76
|
-
"md"
|
|
77
|
-
],
|
|
78
|
-
"min": 1,
|
|
79
|
-
"dir": "sessions"
|
|
80
|
-
}
|
|
81
|
-
]
|
|
82
|
-
},
|
|
83
|
-
"rubric": {
|
|
84
|
-
"artifact": {
|
|
85
|
-
"path": "report.md",
|
|
86
|
-
"kind": "markdown"
|
|
87
|
-
},
|
|
88
|
-
"axes": [
|
|
89
|
-
{
|
|
90
|
-
"name": "listening",
|
|
91
|
-
"description": "The report follows the feeling of the session — the mending secret, the shop bell — not just the chronology."
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
"name": "capture fidelity",
|
|
95
|
-
"description": "The banked session preserves the teller's own words and phrasings; report quotes are verbatim."
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
"name": "follow-threads",
|
|
99
|
-
"description": "At least three specific follow-up questions aimed at gaps the session opened, including the one the teller explicitly asked to be asked."
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
"name": "warmth",
|
|
103
|
-
"description": "Reads like family archiving, not data entry."
|
|
104
|
-
}
|
|
105
|
-
]
|
|
106
|
-
},
|
|
107
|
-
"qualityFocus": [
|
|
108
|
-
"verbatim capture",
|
|
109
|
-
"follow-up questions",
|
|
110
|
-
"session filing"
|
|
111
|
-
]
|
|
112
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "page-spread",
|
|
3
|
-
"name": "Page Spread",
|
|
4
|
-
"description": "Produce one page spread from script to panels: beats planned, panel art generated against the character sheets — never freehand from memory — lettered and laid out as the page the reader turns to. Locks the panel plan FIRST — each panel naming the sheet references that anchor it and the caption text it carries — then generates the panels from those anchors, then assembles the lettered spread. Use for producing a comic page, 'let's do page three', panel-and-letter passes, turning a script page into art, and the per-page ritual of a whole book.\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\nPhases:\n\n1. Plan the panels (verhalenverteller) — script beats to panels, each anchored to a character sheet → gated on `notes/scope.md` (markdown-notes)\n2. Generate the panels (image-generator) — panel art from the sheet anchors, never from memory\n3. Assemble the spread (designer) — panels laid in reading order, captions and balloons lettered\n\nThe gates never advance with an unmet criterion, and loop back to the\nowning phase to fix named gaps.\n",
|
|
5
|
-
"entryStepId": "scope",
|
|
6
|
-
"triggers": [
|
|
7
|
-
"produce the page spread",
|
|
8
|
-
"let's do the next page",
|
|
9
|
-
"panel out the script",
|
|
10
|
-
"turn the script page into panels",
|
|
11
|
-
"lay up the spread"
|
|
12
|
-
],
|
|
13
|
-
"steps": [
|
|
14
|
-
{
|
|
15
|
-
"id": "scope",
|
|
16
|
-
"name": "Plan the panels",
|
|
17
|
-
"description": "script beats to panels, each anchored to a character sheet",
|
|
18
|
-
"prompt": "Break the page before generating a pixel. Step 1: read the page's script from the story notes and the character kits under characters/ — each character's manifest carries the references, seeds, and prompts that lock their look. Step 2: break the script into beats and assign each beat a panel — the moment, the framing, and who is in frame. Step 3: for every character in every panel, name the exact sheet reference (and its seed and prompt from the manifest) that anchors how they are drawn — a panel drawn from memory instead of the sheet is how page twelve stops matching page one. Step 4: copy the caption and balloon text for each panel verbatim from the script — the letterer changes nothing. Step 5: write an acceptance-criteria checklist ('every script beat has a panel', 'every figure anchored to a named sheet reference', 'captions and balloons verbatim from the script', 'panels read in order on the assembled page'). Call write_task_note with the panel count + checklist and write notes/scope.md.",
|
|
19
|
-
"suggestedRole": "verhalenverteller",
|
|
20
|
-
"advanceWhen": {
|
|
21
|
-
"file": "notes/scope.md",
|
|
22
|
-
"minBytes": 1,
|
|
23
|
-
"sniff": "nonempty"
|
|
24
|
-
},
|
|
25
|
-
"gate": {
|
|
26
|
-
"at": "completion",
|
|
27
|
-
"checks": [
|
|
28
|
-
{
|
|
29
|
-
"kind": "minBytes",
|
|
30
|
-
"file": "notes/scope.md",
|
|
31
|
-
"bytes": 120
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"kind": "sniff",
|
|
35
|
-
"file": "notes/scope.md",
|
|
36
|
-
"sniff": "nonempty"
|
|
37
|
-
}
|
|
38
|
-
],
|
|
39
|
-
"onReject": "scope",
|
|
40
|
-
"maxAttempts": 3
|
|
41
|
-
},
|
|
42
|
-
"next": "panels"
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"id": "panels",
|
|
46
|
-
"name": "Generate the panels",
|
|
47
|
-
"description": "panel art from the sheet anchors, never from memory",
|
|
48
|
-
"prompt": "Generate the page's panels into pages/<number>/ (the folder named for the page). Step 1: for each planned panel, build the generation prompt FROM the anchors — start from the sheet reference's persisted prompt and seed out of the character's manifest, then add the panel's moment and framing; the sheet is the source of truth for how every character looks. Step 2: generate through the project's image capabilities, at least three panels, saved as pages/<number>/panel-1.png, panel-2.png, and so on in reading order. Step 3: after each panel, check it against the plan — right characters, right moment, silhouette and palette matching the sheet; regenerate what drifted before moving on. Call write_task_note with the panel count and which sheet references anchored each. The gate counts the actual image files under `pages/` — a panel that was planned but never rendered does not count, and neither does a placeholder file with an image name. If a generation call fails, say so and retry it; do not move on to assembly with panels missing.",
|
|
49
|
-
"suggestedRole": "image-generator",
|
|
50
|
-
"next": "assemble",
|
|
51
|
-
"gate": {
|
|
52
|
-
"maxAttempts": 4,
|
|
53
|
-
"checks": [
|
|
54
|
-
{
|
|
55
|
-
"kind": "fileCount",
|
|
56
|
-
"ext": [
|
|
57
|
-
"png"
|
|
58
|
-
],
|
|
59
|
-
"min": 3,
|
|
60
|
-
"dir": "pages",
|
|
61
|
-
"label": "at least three rendered panel images exist under pages/ before lettering",
|
|
62
|
-
"verifyImageBytes": true
|
|
63
|
-
}
|
|
64
|
-
]
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
"id": "assemble",
|
|
69
|
-
"name": "Assemble the spread",
|
|
70
|
-
"description": "panels laid in reading order, captions and balloons lettered",
|
|
71
|
-
"prompt": "Assemble the page at pages/<number>/spread.html. Step 1: lay the panels in reading order with honest gutters — the eye should never wonder which panel is next. Step 2: letter it — the captions and balloon text from the plan, verbatim from the script, placed with the panel they belong to, tails pointing at the speaker. Step 3: style it as a page — panel borders, gutter rhythm, type that reads at page size, all in one self-contained file. Step 4: read the finished page top to bottom once as a reader would and fix anything that stumbles. Call write_task_note with the spread path and the panel order.",
|
|
72
|
-
"suggestedRole": "designer",
|
|
73
|
-
"next": "evaluate"
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
"id": "evaluate",
|
|
77
|
-
"name": "Evaluate",
|
|
78
|
-
"description": "Grade the deliverable against every acceptance criterion. All pass → finish; any fail → loop back and fix the gap.",
|
|
79
|
-
"prompt": "Open the page folder under pages/ beside notes/scope.md, the script, and the character manifests, and verify every criterion: every script beat has its panel and the panels sit in reading order; every figure traces to the sheet reference the plan named — check the plan's anchors against the characters/ manifests, continuity is the whole point of this book; the captions and balloons on the spread match the script verbatim — a letterer who paraphrases is rewriting the author; and the assembled page reads clean top to bottom. Write PASS/FAIL per criterion; on any failure, name the panel and the gap and loop back to panels.\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: \"panels\" })` 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.",
|
|
80
|
-
"suggestedRole": "reviewer",
|
|
81
|
-
"next": "panels"
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
"id": "finish",
|
|
85
|
-
"name": "Finish",
|
|
86
|
-
"description": "All acceptance criteria met. Stamp a short summary and report DONE.",
|
|
87
|
-
"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.",
|
|
88
|
-
"suggestedRole": "developer",
|
|
89
|
-
"terminal": true
|
|
90
|
-
}
|
|
91
|
-
],
|
|
92
|
-
"version": "1.0.1",
|
|
93
|
-
"releasedAt": "2026-07-26T01:30:00.000Z"
|
|
94
|
-
}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schemaVersion": 1,
|
|
3
|
-
"title": "Page Spread — page 3 from script to lettered panels",
|
|
4
|
-
"objective": "Measure whether the page-spread craftbook produces page 3 as planned panels generated against the character kit's anchors and an assembled spread whose captions and balloons are conserved verbatim from the script.",
|
|
5
|
-
"tags": [
|
|
6
|
-
"html-page"
|
|
7
|
-
],
|
|
8
|
-
"prompt": "lets do page 3 — the beats are in the story notes and Pips sheet is in the character kit. panel it out and lay up the sperad",
|
|
9
|
-
"setup": {
|
|
10
|
-
"projectName": "The Lighthouse Summer Comic",
|
|
11
|
-
"about": "Comic maker project. Scripts live under workspace/story (page 3 is workspace/story/page-3.md). Character kits live under workspace/characters — Pip's manifest is workspace/characters/pip/sheet.json. Page spreads land under workspace/pages/<number>: page 3's panels and spread.html go in workspace/pages/3.",
|
|
12
|
-
"missionObjectives": "Continuity over convenience: every figure anchored to the character kit's persisted references, captions and balloons verbatim from the script. No live services, no real credentials.",
|
|
13
|
-
"files": [
|
|
14
|
-
{
|
|
15
|
-
"path": "story/page-3.md",
|
|
16
|
-
"content": "# Page 3 — The Missed Ferry\n\nBEAT 1 — Wide on the empty dock, morning light. The ferry is a speck on the water.\nCAPTION: The ferry left without them.\n\nBEAT 2 — Pip at the dock's edge, scarf whipped by wind, determined face.\nPIP: We can still make the lighthouse by dark.\n\nBEAT 3 — Close on Marta hoisting the rowboat's rope, skeptical, hair escaping her cap.\nMARTA: In THAT boat? It leaks on Tuesdays.\n\nBEAT 4 — The little rowboat pushing off, Pip at the bow like a figurehead, town shrinking behind.\nCAPTION: It was, unfortunately, a Tuesday.\n"
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
"path": "characters/pip/sheet.json",
|
|
20
|
-
"content": "[\n {\n \"pose\": \"sitting\",\n \"file\": \"characters/pip/ref-sit.png\",\n \"seed\": 411203,\n \"prompt\": \"wire-haired terrier Pip, sand-yellow coat, mustard scarf, one ear up one folded, sitting on harbor wall, storm-blue background, clean comic ink and flat color\"\n },\n {\n \"pose\": \"running\",\n \"file\": \"characters/pip/ref-run.png\",\n \"seed\": 411207,\n \"prompt\": \"wire-haired terrier Pip, sand-yellow coat, mustard scarf streaming, one ear up one folded, running flat-out, side view, storm-blue background, clean comic ink and flat color\"\n },\n {\n \"pose\": \"determined\",\n \"file\": \"characters/pip/ref-determined.png\",\n \"seed\": 411211,\n \"prompt\": \"wire-haired terrier Pip, close-up, leaning forward, determined brow, mustard scarf, one ear up one folded, storm-blue background, clean comic ink and flat color\"\n },\n {\n \"pose\": \"worried\",\n \"file\": \"characters/pip/ref-worried.png\",\n \"seed\": 411219,\n \"prompt\": \"wire-haired terrier Pip, both ears down, knotted brow, mustard scarf, sitting small, storm-blue background, clean comic ink and flat color\"\n }\n]\n"
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"path": "characters/pip/ref-sit.png",
|
|
24
|
-
"content": "placeholder reference image: Pip sitting\n"
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"path": "characters/pip/ref-run.png",
|
|
28
|
-
"content": "placeholder reference image: Pip running\n"
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"path": "characters/pip/ref-determined.png",
|
|
32
|
-
"content": "placeholder reference image: Pip determined\n"
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"path": "characters/pip/ref-worried.png",
|
|
36
|
-
"content": "placeholder reference image: Pip worried\n"
|
|
37
|
-
}
|
|
38
|
-
],
|
|
39
|
-
"worker": {
|
|
40
|
-
"name": "Joost",
|
|
41
|
-
"role": "Verhalenverteller"
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
"mocks": [],
|
|
45
|
-
"success": {
|
|
46
|
-
"summary": "pages/3 holds 3+ panel images generated from the kit's anchors and a lettered spread.html whose captions and balloons match the script word for word.",
|
|
47
|
-
"checks": [
|
|
48
|
-
{
|
|
49
|
-
"kind": "fileCount",
|
|
50
|
-
"ext": [
|
|
51
|
-
"png"
|
|
52
|
-
],
|
|
53
|
-
"min": 3,
|
|
54
|
-
"dir": "pages/3",
|
|
55
|
-
"verifyImageBytes": true
|
|
56
|
-
}
|
|
57
|
-
],
|
|
58
|
-
"deliverables": [
|
|
59
|
-
{
|
|
60
|
-
"path": "pages/3/spread.html",
|
|
61
|
-
"kind": "html-page",
|
|
62
|
-
"minBytes": 1500,
|
|
63
|
-
"checks": [
|
|
64
|
-
{
|
|
65
|
-
"kind": "cssMinBytes",
|
|
66
|
-
"bytes": 650,
|
|
67
|
-
"file": "pages/3/spread.html"
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
"kind": "contains",
|
|
71
|
-
"file": "pages/3/spread.html",
|
|
72
|
-
"pattern": "make the lighthouse by dark",
|
|
73
|
-
"flags": "i",
|
|
74
|
-
"label": "Pip's balloon conserved verbatim"
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
"kind": "contains",
|
|
78
|
-
"file": "pages/3/spread.html",
|
|
79
|
-
"pattern": "The ferry left without them",
|
|
80
|
-
"flags": "i",
|
|
81
|
-
"label": "opening caption conserved verbatim"
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
"kind": "contains",
|
|
85
|
-
"file": "pages/3/spread.html",
|
|
86
|
-
"pattern": "It leaks on Tuesdays",
|
|
87
|
-
"flags": "i",
|
|
88
|
-
"label": "Marta's balloon conserved verbatim"
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
"kind": "judge",
|
|
92
|
-
"file": "pages/3/spread.html",
|
|
93
|
-
"rubric": "The spread lays the panels in reading order with captions and balloons attached to the right panels; the panel plan anchored every figure to the character manifest's references (seeds/prompts) rather than describing the characters from memory.",
|
|
94
|
-
"sourceFiles": [
|
|
95
|
-
"story/page-3.md",
|
|
96
|
-
"characters/pip/sheet.json"
|
|
97
|
-
],
|
|
98
|
-
"label": "continuity and lettering"
|
|
99
|
-
}
|
|
100
|
-
]
|
|
101
|
-
}
|
|
102
|
-
]
|
|
103
|
-
},
|
|
104
|
-
"rubric": {
|
|
105
|
-
"artifact": {
|
|
106
|
-
"path": "pages/3/spread.html",
|
|
107
|
-
"kind": "html"
|
|
108
|
-
},
|
|
109
|
-
"axes": [
|
|
110
|
-
{
|
|
111
|
-
"name": "continuity",
|
|
112
|
-
"description": "Figures are generated from the kit's persisted anchors — page 3's Pip is the sheet's Pip, same silhouette, palette, and scarf."
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
"name": "panel flow",
|
|
116
|
-
"description": "Panels follow the script's beats in reading order; the eye never wonders where to go next."
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
"name": "lettering",
|
|
120
|
-
"description": "Captions and balloons are verbatim from the script, placed with their panels, tails pointing at the speaker."
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
"name": "storytelling",
|
|
124
|
-
"description": "Framing choices serve the beats — the wide dock feels empty, the rowboat launch feels small and brave."
|
|
125
|
-
}
|
|
126
|
-
]
|
|
127
|
-
},
|
|
128
|
-
"qualityFocus": [
|
|
129
|
-
"sheet-anchored panels",
|
|
130
|
-
"verbatim lettering",
|
|
131
|
-
"reading order"
|
|
132
|
-
]
|
|
133
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "plan",
|
|
3
|
-
"name": "Plan",
|
|
4
|
-
"description": "Author a PLAN for a piece of work as a reviewable **draft task** — the gezel equivalent of `/plan` in other tools.\n\nUnlike a normal craftbook, this one's deliverable is not a workspace file: it's a high-quality *draft task* (a plan) that the user reviews and then activates to run. Invoke it via the `start_plan` tool, which creates the draft and an authoring task that walks this craftbook. The authoring gates inspect the draft being built (via the authoring task's `craftbookParams.draftRef`), so a weak model can't skip the parts that make a plan good.\n\nSteps:\n\n1. **Frame the goal** (planner) — write a strong \"about\" on the draft and set 3–8 concrete **outcomes** (what should be created or updated at success). Gated by `checkPlanFramed`.\n2. **Design the build steps** (planner) — add ordered build steps to the draft, each given a concrete static deliverable + enforced gate via `set_step_deliverable`. Gated by `checkStepsHaveDeliverables`.\n3. **Add the verification step** (planner) — append a terminal step (via `add_verification_step`) that confirms every outcome with evidence before the task can close. Gated by `checkVerificationStep`.\n4. **Review the plan** (planner) — sanity-check the whole graph. Gated by `checkPlanReady`, which returns one list of any remaining gaps.\n5. **Hand off to the user** (planner, terminal) — summarize the plan and tell the user to review and **activate** it.\n\nWhen activated (draft → active), the produced task runs its build steps — each looping back on a missed deliverable — and its terminal step verifies the outcomes were kept.\n",
|
|
5
|
-
"entryStepId": "frame",
|
|
6
|
-
"triggers": [
|
|
7
|
-
"plan this",
|
|
8
|
-
"make a plan",
|
|
9
|
-
"plan for",
|
|
10
|
-
"/plan"
|
|
11
|
-
],
|
|
12
|
-
"steps": [
|
|
13
|
-
{
|
|
14
|
-
"id": "frame",
|
|
15
|
-
"name": "Frame the goal",
|
|
16
|
-
"description": "Write a strong 'about' and set the outcomes on the draft plan.",
|
|
17
|
-
"prompt": "You are drafting a PLAN. The plan is a separate **draft task** — its ref is in your task's `craftbookParams.draftRef` (shown in your task description / entry note). Everything you author here targets that draft via the `task` argument.\n\nYour next message must START with a tool call — not a description of what you are about to do. Make exactly these two calls, in this order, then stop:\n\n1. `update_task({ task: \"<draftRef>\", description })` — the job-to-be-done from the user's perspective, 120+ characters.\n2. `set_outcomes({ task: \"<draftRef>\", outcomes: [ ... ] })` — 3–8 concrete, individually-verifiable statements of what gets created or updated.\n\nNeither call is optional and prose is not a substitute for either: the gate reads the draft itself and rejects until both landed.\n\n**Detail:**\n\n1. **Write a strong \"about\".** Call `update_task({ task: \"<draftRef>\", description })` with a clear job-to-be-done from the user's perspective — what success looks like, in 120+ characters.\n2. **Set the outcomes.** Call `set_outcomes({ task: \"<draftRef>\", outcomes: [ ... ] })` with 3–8 concrete, individually-verifiable statements of what should be **created or updated** at completion (e.g. \"An index.html with a playable snake game and a game-over/restart screen\", \"A README documenting how to run it\").\n\nWhen done, call `advance_task_step({ ref, stepId: \"frame\", next: \"outline\" })`. The gate rejects until the draft has a real about and at least 3 outcomes — fix what it names and advance again.",
|
|
18
|
-
"suggestedRole": "planner",
|
|
19
|
-
"gate": {
|
|
20
|
-
"at": "completion",
|
|
21
|
-
"scripts": [
|
|
22
|
-
{
|
|
23
|
-
"name": "checkPlanFramed",
|
|
24
|
-
"scope": "standard",
|
|
25
|
-
"inputs": {}
|
|
26
|
-
}
|
|
27
|
-
],
|
|
28
|
-
"onReject": "frame",
|
|
29
|
-
"maxAttempts": 4
|
|
30
|
-
},
|
|
31
|
-
"next": "outline"
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"id": "outline",
|
|
35
|
-
"name": "Design the build steps",
|
|
36
|
-
"description": "Add ordered build steps to the draft, each gated on a concrete static deliverable.",
|
|
37
|
-
"prompt": "Design the implementation as an ordered series of **build steps** on the draft (`craftbookParams.draftRef`). Each build step must produce a **concrete static file** with an enforced gate.\n\nThe draft starts with one placeholder step named **\"Implement\"**. First call `craftbook_read({ task: \"<draftRef>\" })` and note the actual id of that placeholder step. Then either:\n- repurpose that exact step with `craftbook_update_step({ task: \"<draftRef>\", stepId: \"<actualId>\", name, prompt, suggestedRole })`, then immediately call `set_step_deliverable({ task: \"<draftRef>\", stepId: \"<actualId>\", path, kind })`; or\n- remove that exact step with `craftbook_remove_step({ task: \"<draftRef>\", stepId: \"<actualId>\" })` after you have added the real build steps.\n\nFor each added step, in order:\n1. `craftbook_add_step({ task: \"<draftRef>\", name, prompt, suggestedRole })` — a concrete, instructive step (e.g. name \"Build the game\", role \"developer\", a prompt that says exactly what to make).\n2. Call `craftbook_read({ task: \"<draftRef>\" })` and use the actual id of the step you just added.\n3. `set_step_deliverable({ task: \"<draftRef>\", stepId: \"<actualId>\", path, kind })` — declare the named file it produces and auto-attach the gate. Pick `kind` to match the artifact: `html-page` / `html-game` / `markdown-report` / `code-with-tests` / `json` / etc.\n\nDo not invent step ids like `build` unless `craftbook_read` shows that exact id. Do not advance while any build step lacks `advanceWhen`/`gate`. Order the steps so each builds on the last. When every build step has a deliverable, call `advance_task_step({ ref, stepId: \"outline\", next: \"verify-step\" })`. The gate lists any step still missing a deliverable.",
|
|
38
|
-
"suggestedRole": "planner",
|
|
39
|
-
"gate": {
|
|
40
|
-
"at": "completion",
|
|
41
|
-
"scripts": [
|
|
42
|
-
{
|
|
43
|
-
"name": "checkStepsHaveDeliverables",
|
|
44
|
-
"scope": "standard",
|
|
45
|
-
"inputs": {}
|
|
46
|
-
}
|
|
47
|
-
],
|
|
48
|
-
"onReject": "outline",
|
|
49
|
-
"maxAttempts": 4
|
|
50
|
-
},
|
|
51
|
-
"next": "verify-step"
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
"id": "verify-step",
|
|
55
|
-
"name": "Add the verification step",
|
|
56
|
-
"description": "Append a terminal verification step that checks the outcomes were kept.",
|
|
57
|
-
"prompt": "Add the final **verification step** to the draft (`craftbookParams.draftRef`): call `add_verification_step({ task: \"<draftRef>\" })`. This appends a terminal step — gated by `checkOutcomesMet` — that makes the executor confirm each outcome (with evidence) before the task can close. Pass a custom `prompt` only if you need domain-specific verification instructions.\n\nThen call `advance_task_step({ ref, stepId: \"verify-step\", next: \"review\" })`. The gate rejects until the draft has a terminal step that verifies the outcomes.",
|
|
58
|
-
"suggestedRole": "planner",
|
|
59
|
-
"gate": {
|
|
60
|
-
"at": "completion",
|
|
61
|
-
"scripts": [
|
|
62
|
-
{
|
|
63
|
-
"name": "checkVerificationStep",
|
|
64
|
-
"scope": "standard",
|
|
65
|
-
"inputs": {}
|
|
66
|
-
}
|
|
67
|
-
],
|
|
68
|
-
"onReject": "verify-step",
|
|
69
|
-
"maxAttempts": 4
|
|
70
|
-
},
|
|
71
|
-
"next": "review"
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
"id": "review",
|
|
75
|
-
"name": "Review the plan",
|
|
76
|
-
"description": "Sanity-check the whole plan before handing it to the user.",
|
|
77
|
-
"prompt": "Final check before handing the plan to the user. `craftbook_read({ task: \"<draftRef>\" })` and sanity-check: the steps are ordered sensibly, each build step has a deliverable, and the last step verifies the outcomes. Fix anything off with the `craftbook_*` / `set_step_deliverable` tools on the draft.\n\nWhen the plan is solid, call `advance_task_step({ ref, stepId: \"review\", next: \"done\" })`. The gate returns a single list of anything still missing (thin about, fewer than 3 outcomes, ungated steps, or no verification step).",
|
|
78
|
-
"suggestedRole": "planner",
|
|
79
|
-
"gate": {
|
|
80
|
-
"at": "completion",
|
|
81
|
-
"scripts": [
|
|
82
|
-
{
|
|
83
|
-
"name": "checkPlanReady",
|
|
84
|
-
"scope": "standard",
|
|
85
|
-
"inputs": {}
|
|
86
|
-
}
|
|
87
|
-
],
|
|
88
|
-
"onReject": "review",
|
|
89
|
-
"maxAttempts": 4
|
|
90
|
-
},
|
|
91
|
-
"next": "done"
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
"id": "done",
|
|
95
|
-
"name": "Hand off to the user",
|
|
96
|
-
"description": "Summarize the plan and tell the user to review and activate it.",
|
|
97
|
-
"prompt": "The plan is ready. Summarize it for the user in your reply: mention the draft task **<draftRef>** by its ref (so it renders as a reviewable plan card), and recap the about, the outcomes, and the build steps. Tell the user they can **review and activate** the plan to run it — or ask you to tweak it first. Then report DONE.",
|
|
98
|
-
"suggestedRole": "planner",
|
|
99
|
-
"terminal": true
|
|
100
|
-
}
|
|
101
|
-
],
|
|
102
|
-
"version": "1.0.1",
|
|
103
|
-
"releasedAt": "2026-07-26T01:30:00.000Z"
|
|
104
|
-
}
|