@bendyline/gilde 0.1.17 → 0.1.19
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 +11 -2
- package/authoring/chat-models/README.md +26 -0
- package/authoring/chat-models/btl4-35b-q4.json +142 -0
- package/authoring/chat-models/btl4-compact-iq2.json +142 -0
- package/authoring/chat-models/deepseek-r1-8b-q4.json +53 -0
- package/authoring/chat-models/deepseek-v4-flash-284b-mxfp4.json +110 -0
- package/authoring/chat-models/deepseek-v4-flash-284b-q2.json +110 -0
- package/authoring/chat-models/deepseek-v4-flash-284b-q2q4.json +111 -0
- package/authoring/chat-models/deepseek-v4-flash-284b-q4.json +113 -0
- package/authoring/chat-models/gemma4-12b-q4.json +190 -0
- package/authoring/chat-models/gemma4-12b-q8.json +164 -0
- package/authoring/chat-models/gemma4-26b-q4.json +90 -0
- package/authoring/chat-models/gemma4-31b-q4.json +81 -0
- package/authoring/chat-models/gemma4-e2b-q4.json +76 -0
- package/authoring/chat-models/gemma4-e4b-q4.json +71 -0
- package/authoring/chat-models/glm-5.2-754b-q2.json +60 -0
- package/authoring/chat-models/gpt-oss-120b-q4.json +48 -0
- package/authoring/chat-models/gpt-oss-20b-q4.json +47 -0
- package/authoring/chat-models/laguna-s-2.1-118b-q4.json +127 -0
- package/authoring/chat-models/laguna-s-2.1-118b-q6.json +121 -0
- package/authoring/chat-models/laguna-s-2.1-118b-q8.json +127 -0
- package/authoring/chat-models/lfm2.5-2.6b-q4.json +39 -0
- package/authoring/chat-models/llama3.2-3b-q4.json +42 -0
- package/authoring/chat-models/mistral-7b-q4.json +53 -0
- package/authoring/chat-models/mistral-medium-3.5-128b-q4.json +57 -0
- package/authoring/chat-models/muse-glimmer-30b-q4.json +126 -0
- package/authoring/chat-models/nemotron3-nano-30b-q4.json +49 -0
- package/authoring/chat-models/nemotron3-super-120b-q4.json +41 -0
- package/authoring/chat-models/ornith-35b-q4.json +145 -0
- package/authoring/chat-models/ornith-35b-q8.json +145 -0
- package/authoring/chat-models/ornith-9b-q4.json +146 -0
- package/authoring/chat-models/qwen3.5-122b-a10b-q4.json +172 -0
- package/authoring/chat-models/qwen3.5-2b-q4.json +70 -0
- package/authoring/chat-models/qwen3.5-4b-q4.json +61 -0
- package/authoring/chat-models/qwen3.5-9b-q4.json +61 -0
- package/authoring/chat-models/qwen3.6-27b-q4.json +66 -0
- package/authoring/chat-models/qwen3.6-27b-q8.json +153 -0
- package/authoring/chat-models/qwen3.6-35b-a3b-q4.json +154 -0
- package/authoring/chat-models/qwen3.6-35b-a3b-q8.json +154 -0
- package/authoring/chat-models/talkie-1930-13b-q4.json +74 -0
- package/authoring/chat-models/ternary-bonsai-27b-q2.json +144 -0
- package/authoring/gstack/LICENSE.gstack +21 -0
- package/authoring/gstack/README.md +50 -0
- package/authoring/gstack/evals/cso.json +152 -0
- package/authoring/gstack/evals/design-consultation.json +201 -0
- package/authoring/gstack/evals/document-generate.json +174 -0
- package/authoring/gstack/evals/investigate.json +153 -0
- package/authoring/gstack/evals/office-hours.json +141 -0
- package/authoring/gstack/evals/plan-ceo-review.json +135 -0
- package/authoring/gstack/evals/qa-only.json +376 -0
- package/authoring/gstack/evals/retro.json +191 -0
- package/authoring/gstack/evals/spec.json +162 -0
- package/authoring/gstack/overlays/cso.json +132 -0
- package/authoring/gstack/overlays/design-consultation.json +153 -0
- package/authoring/gstack/overlays/document-generate.json +124 -0
- package/authoring/gstack/overlays/investigate.json +128 -0
- package/authoring/gstack/overlays/office-hours.json +119 -0
- package/authoring/gstack/overlays/plan-ceo-review.json +128 -0
- package/authoring/gstack/overlays/qa-only.json +145 -0
- package/authoring/gstack/overlays/retro.json +132 -0
- package/authoring/gstack/overlays/spec.json +140 -0
- package/authoring/gstack/persona-drafts/cso.about.md +9 -0
- package/authoring/gstack/persona-drafts/design-consultation.about.md +9 -0
- package/authoring/gstack/persona-drafts/office-hours.about.md +9 -0
- package/authoring/gstack/persona-drafts/qa-only.about.md +5 -0
- package/authoring/gstack/persona-drafts/spec.about.md +26 -0
- package/authoring/gstack/snapshots/cso/SKILL.md +1285 -0
- package/authoring/gstack/snapshots/design-consultation/SKILL.md +1230 -0
- package/authoring/gstack/snapshots/document-generate/SKILL.md +1252 -0
- package/authoring/gstack/snapshots/investigate/SKILL.md +1074 -0
- package/authoring/gstack/snapshots/office-hours/SKILL.md +1697 -0
- package/authoring/gstack/snapshots/plan-ceo-review/SKILL.md +1476 -0
- package/authoring/gstack/snapshots/qa-only/SKILL.md +1256 -0
- package/authoring/gstack/snapshots/retro/SKILL.md +1812 -0
- package/authoring/gstack/snapshots/spec/SKILL.md +2359 -0
- package/authoring/gstack/wave.json +103 -0
- package/data/chat-models/gl/glm-5.2-754b-q2/manifest.json +65 -0
- package/data/chat-models/gl/glm-5.2-754b-q2/versions/1.0.0/manifest.json +18 -0
- package/data/chat-models/gp/gpt-oss-120b-q4/manifest.json +5 -5
- package/data/chat-models/gp/gpt-oss-120b-q4/versions/1.1.0/manifest.json +135 -0
- package/data/chat-models/index.json +1 -1
- package/data/chat-models/mu/muse-glimmer-30b-q4/manifest.json +135 -0
- package/data/chat-models/mu/muse-glimmer-30b-q4/versions/1.0.0/manifest.json +20 -0
- package/data/connector-types/gi/github-releases/manifest.json +17 -0
- package/data/connector-types/gi/github-releases/versions/1.0.0/manifest.json +71 -0
- package/data/connector-types/index.json +1 -1
- package/data/craftbook-templates/br/branding-website/versions/1.1.0/craftbook.json +190 -0
- package/data/craftbook-templates/br/branding-website/versions/1.1.0/test.json +164 -0
- package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.0/craftbook.json +358 -0
- package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.0/test.json +376 -0
- package/data/craftbook-templates/ca/careful-mode/versions/1.1.0/craftbook.json +43 -0
- package/data/craftbook-templates/ca/careful-mode/versions/1.1.0/test.json +110 -0
- package/data/craftbook-templates/ca/careful-mode/versions/1.2.0/craftbook.json +43 -0
- package/data/craftbook-templates/ca/careful-mode/versions/1.2.0/test.json +110 -0
- package/data/craftbook-templates/co/content-deck/versions/1.1.0/craftbook.json +185 -0
- package/data/craftbook-templates/co/content-deck/versions/1.1.0/test.json +166 -0
- package/data/craftbook-templates/co/content-deck/versions/1.2.0/craftbook.json +185 -0
- package/data/craftbook-templates/co/content-deck/versions/1.2.0/test.json +169 -0
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.1.0/craftbook.json +189 -0
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.1.0/test.json +182 -0
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.0/craftbook.json +189 -0
- package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.0/test.json +187 -0
- package/data/craftbook-templates/de/design-system-consultation/versions/2.0.0/craftbook.json +385 -0
- package/data/craftbook-templates/de/design-system-consultation/versions/2.0.0/test.json +201 -0
- package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.0/craftbook.json +353 -0
- package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.0/test.json +191 -0
- package/data/craftbook-templates/ex/executive-level-review/versions/2.0.0/craftbook.json +347 -0
- package/data/craftbook-templates/ex/executive-level-review/versions/2.0.0/test.json +135 -0
- package/data/craftbook-templates/fr/freeze-scope/versions/1.2.0/craftbook.json +50 -0
- package/data/craftbook-templates/fr/freeze-scope/versions/1.2.0/test.json +131 -0
- package/data/craftbook-templates/fr/freeze-scope/versions/1.3.0/craftbook.json +50 -0
- package/data/craftbook-templates/fr/freeze-scope/versions/1.3.0/test.json +131 -0
- package/data/craftbook-templates/ht/html-arcade-game/versions/1.1.0/craftbook.json +197 -0
- package/data/craftbook-templates/ht/html-arcade-game/versions/1.1.0/test.json +173 -0
- package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.0/craftbook.json +197 -0
- package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.0/test.json +176 -0
- package/data/craftbook-templates/id/idea-office-hours/versions/2.0.0/craftbook.json +333 -0
- package/data/craftbook-templates/id/idea-office-hours/versions/2.0.0/test.json +141 -0
- package/data/craftbook-templates/im/image-set-index/versions/1.1.0/craftbook.json +163 -0
- package/data/craftbook-templates/im/image-set-index/versions/1.1.0/test.json +177 -0
- package/data/craftbook-templates/im/image-set-index/versions/1.2.0/craftbook.json +163 -0
- package/data/craftbook-templates/im/image-set-index/versions/1.2.0/test.json +180 -0
- package/data/craftbook-templates/index.json +1 -1
- package/data/craftbook-templates/pu/pull-request-review/manifest.json +5 -1
- package/data/craftbook-templates/pu/pull-request-review/versions/1.2.0/craftbook.json +159 -0
- package/data/craftbook-templates/pu/pull-request-review/versions/1.2.0/test.json +172 -0
- package/data/craftbook-templates/re/release-artifact-sanity-check/art.json +13 -0
- package/data/craftbook-templates/re/release-artifact-sanity-check/logo.webp +0 -0
- package/data/craftbook-templates/re/release-artifact-sanity-check/manifest.json +24 -0
- package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.0/craftbook.json +202 -0
- package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.0/test.json +138 -0
- package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.0/craftbook.json +348 -0
- package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.0/test.json +153 -0
- package/data/craftbook-templates/se/security-architecture-review/versions/2.0.0/craftbook.json +353 -0
- package/data/craftbook-templates/se/security-architecture-review/versions/2.0.0/test.json +152 -0
- package/data/craftbook-templates/sp/spec-authoring/versions/2.0.0/craftbook.json +391 -0
- package/data/craftbook-templates/sp/spec-authoring/versions/2.0.0/test.json +162 -0
- package/data/craftbook-templates/te/technical-documentation/versions/2.0.0/craftbook.json +343 -0
- package/data/craftbook-templates/te/technical-documentation/versions/2.0.0/test.json +174 -0
- package/data/craftbook-templates/tr/translate-content/versions/1.1.0/craftbook.json +84 -0
- package/data/craftbook-templates/tr/translate-content/versions/1.1.0/test.json +141 -0
- package/package.json +10 -4
- package/schemas/chat-model-identity.schema.json +44 -0
- package/schemas/chat-model-version.schema.json +3 -0
- package/schemas/connector-type-identity.schema.json +3 -0
- package/schemas/connector-type-version.schema.json +3 -0
- package/schemas/craftbook-doc.schema.json +3 -0
- package/schemas/craftbook-template-identity.schema.json +3 -0
- package/schemas/craftbook-template-version.schema.json +3 -0
- package/schemas/craftbook-test.schema.json +232 -3
- package/schemas/gezel-template-identity.schema.json +3 -0
- package/schemas/gezel-template-version.schema.json +3 -0
- package/schemas/image-model-identity.schema.json +3 -0
- package/schemas/image-model-version.schema.json +3 -0
- package/schemas/project-type-identity.schema.json +3 -0
- package/schemas/project-type-version.schema.json +3 -0
- package/schemas/toolset-identity.schema.json +3 -0
- package/schemas/toolset-version.schema.json +3 -0
- package/schemas/video-model-identity.schema.json +3 -0
- package/schemas/video-model-version.schema.json +3 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "idea-office-hours",
|
|
3
|
+
"name": "Idea Office Hours",
|
|
4
|
+
"description": "Pressure-test a product idea with forcing questions before jumping to solutions, then capture the decision in a short design doc — a structured 'office hours' diagnostic.",
|
|
5
|
+
"basedOn": {
|
|
6
|
+
"name": "gstack",
|
|
7
|
+
"url": "https://github.com/garrytan/gstack"
|
|
8
|
+
},
|
|
9
|
+
"plan": "Use this workflow before committing implementation effort. Ground the conversation in the user's actual problem and available project evidence, ask one decision question at a time with `ask_user_question`, and distinguish facts from assumptions. In unattended runs, make the smallest reversible assumptions and label them. The output is a decision record, not brainstorming theater: it must end with a chosen wedge and a real next action.",
|
|
10
|
+
"entryStepId": "frame",
|
|
11
|
+
"triggers": [
|
|
12
|
+
"brainstorm this",
|
|
13
|
+
"is this worth building",
|
|
14
|
+
"help me think through",
|
|
15
|
+
"office hours"
|
|
16
|
+
],
|
|
17
|
+
"command": "idea-office-hours",
|
|
18
|
+
"steps": [
|
|
19
|
+
{
|
|
20
|
+
"id": "frame",
|
|
21
|
+
"name": "Frame the opportunity",
|
|
22
|
+
"description": "Turn the rough idea into a specific problem, audience, outcome, and assumption set.",
|
|
23
|
+
"prompt": "Inspect the project brief and relevant workspace material before asking anything already answered there. Establish who has the problem, what they do today, why that is inadequate, the desired outcome, constraints, and evidence already available. Ask one high-leverage question at a time. Separate verified facts from assumptions and record what evidence would falsify the idea.\n\nObservable handoff: write the completed result to `notes/idea-brief.md` in the workspace. Do not merely describe what the file would contain. Re-read it before finishing this phase and repair any incomplete sections.",
|
|
24
|
+
"suggestedRole": "product strategist",
|
|
25
|
+
"advanceWhen": {
|
|
26
|
+
"file": "notes/idea-brief.md",
|
|
27
|
+
"minBytes": 600,
|
|
28
|
+
"sniff": "nonempty",
|
|
29
|
+
"requireChange": true,
|
|
30
|
+
"goto": "pressure-test"
|
|
31
|
+
},
|
|
32
|
+
"gate": {
|
|
33
|
+
"at": "completion",
|
|
34
|
+
"checks": [
|
|
35
|
+
{
|
|
36
|
+
"kind": "minBytes",
|
|
37
|
+
"file": "notes/idea-brief.md",
|
|
38
|
+
"bytes": 600
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"kind": "sniff",
|
|
42
|
+
"file": "notes/idea-brief.md",
|
|
43
|
+
"sniff": "nonempty"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"kind": "contains",
|
|
47
|
+
"file": "notes/idea-brief.md",
|
|
48
|
+
"pattern": "^##\\s+Problem",
|
|
49
|
+
"flags": "im",
|
|
50
|
+
"label": "Problem section"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"kind": "contains",
|
|
54
|
+
"file": "notes/idea-brief.md",
|
|
55
|
+
"pattern": "^##\\s+Audience",
|
|
56
|
+
"flags": "im",
|
|
57
|
+
"label": "Audience section"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"kind": "contains",
|
|
61
|
+
"file": "notes/idea-brief.md",
|
|
62
|
+
"pattern": "^##\\s+Success criteria",
|
|
63
|
+
"flags": "im",
|
|
64
|
+
"label": "measurable Success criteria section"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"kind": "contains",
|
|
68
|
+
"file": "notes/idea-brief.md",
|
|
69
|
+
"pattern": "^##\\s+Assumptions",
|
|
70
|
+
"flags": "im",
|
|
71
|
+
"label": "Assumptions section"
|
|
72
|
+
}
|
|
73
|
+
],
|
|
74
|
+
"onReject": "frame",
|
|
75
|
+
"maxAttempts": 3
|
|
76
|
+
},
|
|
77
|
+
"next": "pressure-test"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "pressure-test",
|
|
81
|
+
"name": "Pressure-test the options",
|
|
82
|
+
"description": "Challenge the premise and compare meaningful alternatives before choosing a solution.",
|
|
83
|
+
"prompt": "Read `notes/idea-brief.md`. Test the strongest assumptions against workspace evidence and, when available and appropriate, research tools. Develop at least three materially different options, including a no-build or manual option. For each, compare user value, evidence, effort, reversibility, key risk, and the cheapest falsification test. Recommend one narrow wedge and explain what evidence would change that recommendation.\n\nObservable handoff: write the completed result to `notes/idea-options.md` in the workspace. Do not merely describe what the file would contain. Re-read it before finishing this phase and repair any incomplete sections.",
|
|
84
|
+
"suggestedRole": "product researcher",
|
|
85
|
+
"advanceWhen": {
|
|
86
|
+
"file": "notes/idea-options.md",
|
|
87
|
+
"minBytes": 900,
|
|
88
|
+
"sniff": "nonempty",
|
|
89
|
+
"requireChange": true,
|
|
90
|
+
"goto": "decide"
|
|
91
|
+
},
|
|
92
|
+
"gate": {
|
|
93
|
+
"at": "completion",
|
|
94
|
+
"checks": [
|
|
95
|
+
{
|
|
96
|
+
"kind": "minBytes",
|
|
97
|
+
"file": "notes/idea-options.md",
|
|
98
|
+
"bytes": 900
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"kind": "sniff",
|
|
102
|
+
"file": "notes/idea-options.md",
|
|
103
|
+
"sniff": "nonempty"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"kind": "contains",
|
|
107
|
+
"file": "notes/idea-options.md",
|
|
108
|
+
"pattern": "^##\\s+Evidence",
|
|
109
|
+
"flags": "im",
|
|
110
|
+
"label": "Evidence section"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"kind": "contains",
|
|
114
|
+
"file": "notes/idea-options.md",
|
|
115
|
+
"pattern": "^##\\s+Alternatives",
|
|
116
|
+
"flags": "im",
|
|
117
|
+
"label": "Alternatives section"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"kind": "contains",
|
|
121
|
+
"file": "notes/idea-options.md",
|
|
122
|
+
"pattern": "^##\\s+Risks",
|
|
123
|
+
"flags": "im",
|
|
124
|
+
"label": "Risks section"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"kind": "contains",
|
|
128
|
+
"file": "notes/idea-options.md",
|
|
129
|
+
"pattern": "^##\\s+Recommendation",
|
|
130
|
+
"flags": "im",
|
|
131
|
+
"label": "Recommendation section"
|
|
132
|
+
}
|
|
133
|
+
],
|
|
134
|
+
"onReject": "pressure-test",
|
|
135
|
+
"maxAttempts": 3
|
|
136
|
+
},
|
|
137
|
+
"next": "decide"
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"id": "decide",
|
|
141
|
+
"name": "Write the decision record",
|
|
142
|
+
"description": "Capture a defensible decision and the smallest useful real-world action.",
|
|
143
|
+
"prompt": "Synthesize the brief and options into a concise decision record. Preserve uncertainty instead of manufacturing confidence. State the chosen wedge, why it beats the alternatives now, boundaries that prevent scope creep, leading and lagging success measures, the next experiment or delivery action, its owner, and a decision date or trigger for revisiting the choice.\n\nObservable handoff: write the completed result to `decisions/idea-office-hours.md` in the workspace. Do not merely describe what the file would contain. Re-read it before finishing this phase and repair any incomplete sections.",
|
|
144
|
+
"suggestedRole": "product writer",
|
|
145
|
+
"advanceWhen": {
|
|
146
|
+
"file": "decisions/idea-office-hours.md",
|
|
147
|
+
"minBytes": 1100,
|
|
148
|
+
"sniff": "nonempty",
|
|
149
|
+
"requireChange": true,
|
|
150
|
+
"goto": "evaluate"
|
|
151
|
+
},
|
|
152
|
+
"gate": {
|
|
153
|
+
"at": "completion",
|
|
154
|
+
"checks": [
|
|
155
|
+
{
|
|
156
|
+
"kind": "minBytes",
|
|
157
|
+
"file": "decisions/idea-office-hours.md",
|
|
158
|
+
"bytes": 1100
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"kind": "sniff",
|
|
162
|
+
"file": "decisions/idea-office-hours.md",
|
|
163
|
+
"sniff": "nonempty"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"kind": "contains",
|
|
167
|
+
"file": "decisions/idea-office-hours.md",
|
|
168
|
+
"pattern": "^##\\s+Problem",
|
|
169
|
+
"flags": "im",
|
|
170
|
+
"label": "Problem section"
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"kind": "contains",
|
|
174
|
+
"file": "decisions/idea-office-hours.md",
|
|
175
|
+
"pattern": "^##\\s+Evidence heard from the user",
|
|
176
|
+
"flags": "im",
|
|
177
|
+
"label": "user evidence section"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"kind": "contains",
|
|
181
|
+
"file": "decisions/idea-office-hours.md",
|
|
182
|
+
"pattern": "^##\\s+Chosen wedge",
|
|
183
|
+
"flags": "im",
|
|
184
|
+
"label": "Chosen wedge section"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"kind": "contains",
|
|
188
|
+
"file": "decisions/idea-office-hours.md",
|
|
189
|
+
"pattern": "^##\\s+Alternatives considered",
|
|
190
|
+
"flags": "im",
|
|
191
|
+
"label": "Alternatives considered section"
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"kind": "contains",
|
|
195
|
+
"file": "decisions/idea-office-hours.md",
|
|
196
|
+
"pattern": "^##\\s+Decision",
|
|
197
|
+
"flags": "im",
|
|
198
|
+
"label": "Decision section"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"kind": "contains",
|
|
202
|
+
"file": "decisions/idea-office-hours.md",
|
|
203
|
+
"pattern": "^##\\s+Next real-world action",
|
|
204
|
+
"flags": "im",
|
|
205
|
+
"label": "Next real-world action section"
|
|
206
|
+
}
|
|
207
|
+
],
|
|
208
|
+
"onReject": "decide",
|
|
209
|
+
"maxAttempts": 3
|
|
210
|
+
},
|
|
211
|
+
"next": "evaluate"
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"id": "evaluate",
|
|
215
|
+
"name": "Evaluate the deliverable",
|
|
216
|
+
"description": "Independently grade the observable deliverable and route it to finish, repair, or user escalation.",
|
|
217
|
+
"prompt": "Review `decisions/idea-office-hours.md`, `notes/idea-brief.md`, `notes/idea-options.md` against every criterion below. Inspect the underlying evidence files named by the workflow; do not grade from the author's summary alone.\n\n1. The problem, audience, and success measures are specific enough to falsify.\n2. Verified evidence and assumptions are clearly distinguished.\n3. At least three meaningfully different alternatives, including no-build or manual work, were compared fairly.\n4. The chosen wedge follows from the evidence and has explicit scope boundaries.\n5. The next action has an owner, a measurable outcome, and a revisit trigger.\n\nWrite an evidence-backed review to `reviews/idea-office-hours-review.md`. Give each criterion a PASS or FAIL with a concrete path, excerpt, measurement, or observed behavior. End with exactly `Verdict: PASS` or `Verdict: REVISE`. Then use `advance_task_step` for the active task: PASS routes to `finish`; REVISE routes to `repair` for review rounds 1 through 2, and the 3th REVISE routes to `needs-user`. Never route to finish while a criterion is unmet.",
|
|
218
|
+
"suggestedRole": "product reviewer",
|
|
219
|
+
"gate": {
|
|
220
|
+
"at": "completion",
|
|
221
|
+
"checks": [
|
|
222
|
+
{
|
|
223
|
+
"kind": "minBytes",
|
|
224
|
+
"file": "reviews/idea-office-hours-review.md",
|
|
225
|
+
"bytes": 400
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"kind": "contains",
|
|
229
|
+
"file": "reviews/idea-office-hours-review.md",
|
|
230
|
+
"pattern": "Verdict:\\s*(?:PASS|REVISE)",
|
|
231
|
+
"flags": "i",
|
|
232
|
+
"label": "explicit PASS or REVISE verdict"
|
|
233
|
+
}
|
|
234
|
+
],
|
|
235
|
+
"onReject": "evaluate",
|
|
236
|
+
"maxAttempts": 3
|
|
237
|
+
},
|
|
238
|
+
"next": "repair"
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"id": "repair",
|
|
242
|
+
"name": "Repair the deliverable",
|
|
243
|
+
"description": "Fix only the concrete gaps from the latest independent review.",
|
|
244
|
+
"prompt": "Read `reviews/idea-office-hours-review.md` and repair every failed criterion in `decisions/idea-office-hours.md`, `notes/idea-brief.md`, `notes/idea-options.md`. Make the changes in the actual workspace files, not just in task notes or a reply. Preserve evidence that already passed. Re-run or re-check anything the reviewer found unproven. Ensure `decisions/idea-office-hours.md` is genuinely updated this turn so the repair is observable, then hand it back for independent evaluation.",
|
|
245
|
+
"suggestedRole": "product strategist",
|
|
246
|
+
"advanceWhen": {
|
|
247
|
+
"file": "decisions/idea-office-hours.md",
|
|
248
|
+
"minBytes": 1100,
|
|
249
|
+
"sniff": "nonempty",
|
|
250
|
+
"requireChange": true,
|
|
251
|
+
"goto": "evaluate"
|
|
252
|
+
},
|
|
253
|
+
"gate": {
|
|
254
|
+
"at": "completion",
|
|
255
|
+
"checks": [
|
|
256
|
+
{
|
|
257
|
+
"kind": "minBytes",
|
|
258
|
+
"file": "decisions/idea-office-hours.md",
|
|
259
|
+
"bytes": 1100
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"kind": "sniff",
|
|
263
|
+
"file": "decisions/idea-office-hours.md",
|
|
264
|
+
"sniff": "nonempty"
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
"kind": "contains",
|
|
268
|
+
"file": "decisions/idea-office-hours.md",
|
|
269
|
+
"pattern": "^##\\s+Problem",
|
|
270
|
+
"flags": "im",
|
|
271
|
+
"label": "Problem section"
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
"kind": "contains",
|
|
275
|
+
"file": "decisions/idea-office-hours.md",
|
|
276
|
+
"pattern": "^##\\s+Evidence heard from the user",
|
|
277
|
+
"flags": "im",
|
|
278
|
+
"label": "user evidence section"
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"kind": "contains",
|
|
282
|
+
"file": "decisions/idea-office-hours.md",
|
|
283
|
+
"pattern": "^##\\s+Chosen wedge",
|
|
284
|
+
"flags": "im",
|
|
285
|
+
"label": "Chosen wedge section"
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
"kind": "contains",
|
|
289
|
+
"file": "decisions/idea-office-hours.md",
|
|
290
|
+
"pattern": "^##\\s+Alternatives considered",
|
|
291
|
+
"flags": "im",
|
|
292
|
+
"label": "Alternatives considered section"
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
"kind": "contains",
|
|
296
|
+
"file": "decisions/idea-office-hours.md",
|
|
297
|
+
"pattern": "^##\\s+Decision",
|
|
298
|
+
"flags": "im",
|
|
299
|
+
"label": "Decision section"
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"kind": "contains",
|
|
303
|
+
"file": "decisions/idea-office-hours.md",
|
|
304
|
+
"pattern": "^##\\s+Next real-world action",
|
|
305
|
+
"flags": "im",
|
|
306
|
+
"label": "Next real-world action section"
|
|
307
|
+
}
|
|
308
|
+
],
|
|
309
|
+
"onReject": "repair",
|
|
310
|
+
"maxAttempts": 3
|
|
311
|
+
},
|
|
312
|
+
"next": "evaluate"
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
"id": "finish",
|
|
316
|
+
"name": "Finish",
|
|
317
|
+
"description": "All deterministic and reviewer criteria passed.",
|
|
318
|
+
"prompt": "The independent review passed. Read `reviews/idea-office-hours-review.md`, then use `write_task_note` to record a concise DONE summary with the final deliverable paths (`decisions/idea-office-hours.md`, `notes/idea-brief.md`, `notes/idea-options.md`) and the evidence that each acceptance criterion passed. Report DONE without starting new work.",
|
|
319
|
+
"suggestedRole": "project lead",
|
|
320
|
+
"terminal": true
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"id": "needs-user",
|
|
324
|
+
"name": "Escalate unresolved concerns",
|
|
325
|
+
"description": "The bounded repair loop ended without a defensible pass.",
|
|
326
|
+
"prompt": "The deliverable did not pass after 3 review rounds. Do not claim success. Read `reviews/idea-office-hours-review.md`, then use `write_task_note` to record DONE_WITH_CONCERNS: the unmet criteria, what was attempted, the affected paths, and the smallest user decision or missing input needed to continue.",
|
|
327
|
+
"suggestedRole": "project lead",
|
|
328
|
+
"terminal": true
|
|
329
|
+
}
|
|
330
|
+
],
|
|
331
|
+
"version": "2.0.0",
|
|
332
|
+
"releasedAt": "2026-08-09T00:00:00Z"
|
|
333
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"title": "Idea Office Hours — evidence-backed wedge decision",
|
|
4
|
+
"objective": "Exercise the Idea Office Hours craftbook end to end on a constrained product idea and require a grounded decision, explicit alternatives, and an auditable craftbook-task handoff.",
|
|
5
|
+
"tags": [
|
|
6
|
+
"workflow",
|
|
7
|
+
"product",
|
|
8
|
+
"ideation",
|
|
9
|
+
"decision"
|
|
10
|
+
],
|
|
11
|
+
"prompt": "Use the Idea Office Hours craftbook to pressure-test the QuietQueue idea in `source/idea-context.md`. Do not jump straight to implementation. Work through the evidence, compare at least three materially different options (including no-build/manual), choose a narrow pilot wedge, and write the craftbook's decision artifacts. The final decision at `decisions/idea-office-hours.md` must cite the supplied source, state what remains assumed, name a concrete next real-world action with an owner and measurement, and avoid inventing customer evidence.",
|
|
12
|
+
"setup": {
|
|
13
|
+
"projectName": "QuietQueue idea review",
|
|
14
|
+
"about": "A hermetic product-decision exercise for a small clinic scheduling concept. Only the seeded evidence is authoritative.",
|
|
15
|
+
"missionObjectives": "Decide whether there is a narrow, testable pilot worth running without handling PHI or committing to a full scheduling product.",
|
|
16
|
+
"files": [
|
|
17
|
+
{
|
|
18
|
+
"path": "source/idea-context.md",
|
|
19
|
+
"content": "# QuietQueue idea context\n\n## Audience\nBoutique physical-therapy clinics with 3–12 practitioners. The immediate user is the front-desk coordinator; clinic owners approve spend.\n\n## Observed problem\nAcross four discovery calls, coordinators described reminder calling as repetitive and hard to finish during busy afternoons. A two-week manual tally recorded **31 no-shows across 420 appointments** and about **6 staff hours per week** spent on reminder calls. These are directional observations, not a statistically representative study.\n\n## Constraints\n- A pilot must launch within two weeks.\n- It must not ingest protected health information.\n- The clinic can export appointment first name, mobile number, and time into a temporary CSV only after its privacy lead approves the fields.\n- The team has one product engineer and no native-mobile capacity.\n- Budget for the pilot is $750.\n\n## Candidate ideas raised so far\n1. A full scheduling and messaging platform.\n2. A CSV-driven reminder assistant that drafts messages for staff approval.\n3. A better call-list spreadsheet and a scripted reminder process (no new product).\n\n## Unknowns\nWhether patients will opt into SMS, whether approval adds too much staff friction, and whether fewer no-shows would persist beyond the pilot.\n"
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
"mocks": [],
|
|
24
|
+
"success": {
|
|
25
|
+
"summary": "The named craftbook produces a grounded wedge decision and records its terminal task handoff.",
|
|
26
|
+
"deliverables": [
|
|
27
|
+
{
|
|
28
|
+
"path": "decisions/idea-office-hours.md",
|
|
29
|
+
"kind": "markdown-report",
|
|
30
|
+
"minBytes": 1100,
|
|
31
|
+
"checks": [
|
|
32
|
+
{
|
|
33
|
+
"kind": "contains",
|
|
34
|
+
"file": "decisions/idea-office-hours.md",
|
|
35
|
+
"pattern": "^#{1,3}\\s+(Problem|Problem framing)\\b[\\s\\S]*^#{1,3}\\s+(User evidence|Evidence)\\b[\\s\\S]*^#{1,3}\\s+(Chosen wedge|Decision)\\b",
|
|
36
|
+
"flags": "im",
|
|
37
|
+
"label": "problem, evidence, and chosen-wedge sections"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"kind": "contains",
|
|
41
|
+
"file": "decisions/idea-office-hours.md",
|
|
42
|
+
"pattern": "^#{1,3}\\s+Alternatives considered\\b[\\s\\S]*(manual|no[- ]build)[\\s\\S]*^#{1,3}\\s+Next real-world action\\b",
|
|
43
|
+
"flags": "im",
|
|
44
|
+
"label": "manual alternative and next action"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"kind": "valueGrounding",
|
|
48
|
+
"file": "decisions/idea-office-hours.md",
|
|
49
|
+
"facts": [
|
|
50
|
+
{
|
|
51
|
+
"id": "observed-no-shows",
|
|
52
|
+
"label": "observed no-show evidence",
|
|
53
|
+
"required": [
|
|
54
|
+
"31\\s+no-shows?"
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "observed-appointments",
|
|
59
|
+
"label": "observed appointment denominator",
|
|
60
|
+
"required": [
|
|
61
|
+
"420\\s+appointments?"
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "staff-time",
|
|
66
|
+
"label": "weekly reminder effort",
|
|
67
|
+
"required": [
|
|
68
|
+
"6\\s+(staff\\s+)?hours?\\s+per\\s+week"
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": "pilot-duration",
|
|
73
|
+
"label": "two-week pilot constraint",
|
|
74
|
+
"required": [
|
|
75
|
+
"two[- ]week|2[- ]week"
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"id": "pilot-data-boundary",
|
|
80
|
+
"label": "no-PHI pilot constraint",
|
|
81
|
+
"required": [
|
|
82
|
+
"(no|without|not)\\s+(handling|ingesting|using)?\\s*PHI|protected health information"
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"kind": "citationsResolve",
|
|
89
|
+
"file": "decisions/idea-office-hours.md",
|
|
90
|
+
"minCitations": 1
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
"taskNotes": {
|
|
96
|
+
"minBytes": 160,
|
|
97
|
+
"checks": [
|
|
98
|
+
{
|
|
99
|
+
"kind": "contains",
|
|
100
|
+
"file": "task-notes.md",
|
|
101
|
+
"pattern": "\\bDONE\\b[\\s\\S]*decisions/idea-office-hours\\.md",
|
|
102
|
+
"label": "terminal craftbook note names the decision"
|
|
103
|
+
}
|
|
104
|
+
],
|
|
105
|
+
"requireCraftbookTask": true
|
|
106
|
+
},
|
|
107
|
+
"taskGraph": {
|
|
108
|
+
"requireCraftbookTask": true,
|
|
109
|
+
"requireTerminalStep": true
|
|
110
|
+
},
|
|
111
|
+
"unchangedFixtures": [
|
|
112
|
+
"source/idea-context.md"
|
|
113
|
+
]
|
|
114
|
+
},
|
|
115
|
+
"rubric": {
|
|
116
|
+
"artifact": {
|
|
117
|
+
"path": "decisions/idea-office-hours.md",
|
|
118
|
+
"kind": "markdown"
|
|
119
|
+
},
|
|
120
|
+
"axes": [
|
|
121
|
+
{
|
|
122
|
+
"name": "Diagnostic depth",
|
|
123
|
+
"description": "The decision separates observed evidence from assumptions and identifies the most consequential unknowns before proposing a solution."
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"name": "Option quality",
|
|
127
|
+
"description": "Alternatives are genuinely different, fairly compared, and include a credible manual or no-build path."
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"name": "Decision usefulness",
|
|
131
|
+
"description": "The chosen wedge is narrow, constraint-aware, measurable, and leads to a concrete owner-backed next action."
|
|
132
|
+
}
|
|
133
|
+
],
|
|
134
|
+
"contextNote": "Judge only against `source/idea-context.md`; unsupported market or customer claims are defects."
|
|
135
|
+
},
|
|
136
|
+
"qualityFocus": [
|
|
137
|
+
"Evidence is clearly distinguished from assumption",
|
|
138
|
+
"The selected wedge is smaller than a full scheduling platform",
|
|
139
|
+
"The next action has an owner, measurement, and decision-useful outcome"
|
|
140
|
+
]
|
|
141
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "image-set-index",
|
|
3
|
+
"name": "Index & Describe an Image Set",
|
|
4
|
+
"description": "Given a folder of images, produce a structured index that describes each one (caption, tags, notable content) in a consistent schema, then validates coverage and consistency. For cataloguing, search, or alt-text generation over an image collection.\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. Scope the index (planner) — fields per image + output schema + criteria → gated on artifact `image-index/schema.md` (markdown-notes)\n2. Describe each image (developer) — read each image, write structured descriptions → gated on `work/image-descriptions.json` (json)\n3. Assemble the index (developer) — write the index file in the chosen format → gated on `index.json` (json)\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
|
+
"index images",
|
|
8
|
+
"describe images",
|
|
9
|
+
"caption a folder",
|
|
10
|
+
"image catalog"
|
|
11
|
+
],
|
|
12
|
+
"steps": [
|
|
13
|
+
{
|
|
14
|
+
"id": "scope",
|
|
15
|
+
"name": "Scope the index",
|
|
16
|
+
"description": "fields per image + output schema + criteria",
|
|
17
|
+
"prompt": "Decide the index schema before describing anything. The final output is workspace `index.json` with an `images` array; define fields per image (filename, caption, tags, dominantColors, orientation, containsText, and qualityFlags), controlled vocabulary rules, and an **acceptance-criteria checklist** (\"every source image has exactly one record\", \"captions are 1-2 sentences\", \"tags use a consistent vocabulary\", \"the JSON parses\"). Save the schema + checklist to artifact `image-index/schema.md` with `write_artifact`; note the path in task notes.",
|
|
18
|
+
"suggestedRole": "planner",
|
|
19
|
+
"advanceWhen": {
|
|
20
|
+
"file": "image-index/schema.md",
|
|
21
|
+
"minBytes": 1,
|
|
22
|
+
"sniff": "nonempty",
|
|
23
|
+
"artifact": true
|
|
24
|
+
},
|
|
25
|
+
"gate": {
|
|
26
|
+
"at": "completion",
|
|
27
|
+
"checks": [
|
|
28
|
+
{
|
|
29
|
+
"kind": "minBytes",
|
|
30
|
+
"file": "image-index/schema.md",
|
|
31
|
+
"bytes": 500,
|
|
32
|
+
"artifact": true
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"kind": "sniff",
|
|
36
|
+
"file": "image-index/schema.md",
|
|
37
|
+
"sniff": "nonempty",
|
|
38
|
+
"artifact": true
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"kind": "contains",
|
|
42
|
+
"file": "image-index/schema.md",
|
|
43
|
+
"pattern": "filename[\\s\\S]*caption[\\s\\S]*tags",
|
|
44
|
+
"flags": "i",
|
|
45
|
+
"label": "core schema fields",
|
|
46
|
+
"artifact": true
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"kind": "contains",
|
|
50
|
+
"file": "image-index/schema.md",
|
|
51
|
+
"pattern": "every|coverage|exactly one",
|
|
52
|
+
"flags": "i",
|
|
53
|
+
"label": "coverage criterion",
|
|
54
|
+
"artifact": true
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
"onReject": "scope",
|
|
58
|
+
"maxAttempts": 3
|
|
59
|
+
},
|
|
60
|
+
"next": "describe"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"id": "describe",
|
|
64
|
+
"name": "Describe each image",
|
|
65
|
+
"description": "read each image, write structured descriptions",
|
|
66
|
+
"prompt": "Read artifact `image-index/schema.md` with `read_artifact`, then list the source image folder with workspace tools. For each image, use the available image-reading or description capability to populate the schema. If the user supplied an authoritative metadata sidecar because image binaries or vision are unavailable, read it with `read_file`, preserve only its facts, and record that limitation. Keep vocabulary consistent and do not skip or invent images. Stage the complete per-image array as valid workspace JSON at `work/image-descriptions.json` with `write_file`.",
|
|
67
|
+
"suggestedRole": "developer",
|
|
68
|
+
"advanceWhen": {
|
|
69
|
+
"file": "work/image-descriptions.json",
|
|
70
|
+
"minBytes": 1,
|
|
71
|
+
"sniff": "json-valid"
|
|
72
|
+
},
|
|
73
|
+
"gate": {
|
|
74
|
+
"at": "completion",
|
|
75
|
+
"checks": [
|
|
76
|
+
{
|
|
77
|
+
"kind": "minBytes",
|
|
78
|
+
"file": "work/image-descriptions.json",
|
|
79
|
+
"bytes": 300
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"kind": "contains",
|
|
83
|
+
"file": "work/image-descriptions.json",
|
|
84
|
+
"pattern": "\"filename\"[\\s\\S]*\"caption\"[\\s\\S]*\"tags\"",
|
|
85
|
+
"flags": "i",
|
|
86
|
+
"label": "per-image fields"
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
"scripts": [
|
|
90
|
+
{
|
|
91
|
+
"name": "checkJsonValid",
|
|
92
|
+
"scope": "standard",
|
|
93
|
+
"inputs": {
|
|
94
|
+
"file": "work/image-descriptions.json"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
"onReject": "describe",
|
|
99
|
+
"maxAttempts": 3
|
|
100
|
+
},
|
|
101
|
+
"next": "assemble"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": "assemble",
|
|
105
|
+
"name": "Assemble the index",
|
|
106
|
+
"description": "write the index file in the chosen format",
|
|
107
|
+
"prompt": "Read workspace `work/image-descriptions.json` with `read_file`, reconcile it against the complete source-folder or sidecar listing, and write the final JSON object to workspace `index.json` with `write_file`. Ensure the `images` array has exactly one record per source filename, every required field is present, and vocabulary is consistent. On a loop-back, fix only the named gaps (missing/extra records, malformed JSON, inconsistent tags). `write_task_note` the index path and an explicit coverage count (records vs source images).",
|
|
108
|
+
"suggestedRole": "developer",
|
|
109
|
+
"advanceWhen": {
|
|
110
|
+
"file": "index.json",
|
|
111
|
+
"minBytes": 1,
|
|
112
|
+
"sniff": "json-valid"
|
|
113
|
+
},
|
|
114
|
+
"gate": {
|
|
115
|
+
"at": "completion",
|
|
116
|
+
"checks": [
|
|
117
|
+
{
|
|
118
|
+
"kind": "minBytes",
|
|
119
|
+
"file": "index.json",
|
|
120
|
+
"bytes": 500
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"kind": "contains",
|
|
124
|
+
"file": "index.json",
|
|
125
|
+
"pattern": "\"images\"\\s*:",
|
|
126
|
+
"flags": "i",
|
|
127
|
+
"label": "images array"
|
|
128
|
+
}
|
|
129
|
+
],
|
|
130
|
+
"scripts": [
|
|
131
|
+
{
|
|
132
|
+
"name": "checkJsonValid",
|
|
133
|
+
"scope": "standard",
|
|
134
|
+
"inputs": {
|
|
135
|
+
"file": "index.json"
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
],
|
|
139
|
+
"onReject": "assemble",
|
|
140
|
+
"maxAttempts": 4
|
|
141
|
+
},
|
|
142
|
+
"next": "evaluate"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"id": "evaluate",
|
|
146
|
+
"name": "Evaluate",
|
|
147
|
+
"description": "Grade the deliverable against every acceptance criterion. All pass → finish; any fail → loop back and fix the gap.",
|
|
148
|
+
"prompt": "Read workspace `index.json`, `work/image-descriptions.json`, and the source-folder listing with workspace tools, plus artifact `image-index/schema.md` with `read_artifact`. Check coverage and consistency: does every source image have exactly one record, do all required fields exist, do captions/tags follow the schema and a consistent vocabulary, and does the file parse? Spot-check descriptions against actual images when available. 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: \"assemble\" })` 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.",
|
|
149
|
+
"suggestedRole": "reviewer",
|
|
150
|
+
"next": "assemble"
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"id": "finish",
|
|
154
|
+
"name": "Finish",
|
|
155
|
+
"description": "All acceptance criteria met. Stamp a short summary and report DONE.",
|
|
156
|
+
"prompt": "Every criterion passed. Write a DONE summary: index path, format, image count, and a one-line note that coverage is complete and the schema is consistent.",
|
|
157
|
+
"suggestedRole": "developer",
|
|
158
|
+
"terminal": true
|
|
159
|
+
}
|
|
160
|
+
],
|
|
161
|
+
"version": "1.1.0",
|
|
162
|
+
"releasedAt": "2026-08-09T00:00:00Z"
|
|
163
|
+
}
|