@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.
Files changed (160) hide show
  1. package/README.md +11 -2
  2. package/authoring/chat-models/README.md +26 -0
  3. package/authoring/chat-models/btl4-35b-q4.json +142 -0
  4. package/authoring/chat-models/btl4-compact-iq2.json +142 -0
  5. package/authoring/chat-models/deepseek-r1-8b-q4.json +53 -0
  6. package/authoring/chat-models/deepseek-v4-flash-284b-mxfp4.json +110 -0
  7. package/authoring/chat-models/deepseek-v4-flash-284b-q2.json +110 -0
  8. package/authoring/chat-models/deepseek-v4-flash-284b-q2q4.json +111 -0
  9. package/authoring/chat-models/deepseek-v4-flash-284b-q4.json +113 -0
  10. package/authoring/chat-models/gemma4-12b-q4.json +190 -0
  11. package/authoring/chat-models/gemma4-12b-q8.json +164 -0
  12. package/authoring/chat-models/gemma4-26b-q4.json +90 -0
  13. package/authoring/chat-models/gemma4-31b-q4.json +81 -0
  14. package/authoring/chat-models/gemma4-e2b-q4.json +76 -0
  15. package/authoring/chat-models/gemma4-e4b-q4.json +71 -0
  16. package/authoring/chat-models/glm-5.2-754b-q2.json +60 -0
  17. package/authoring/chat-models/gpt-oss-120b-q4.json +48 -0
  18. package/authoring/chat-models/gpt-oss-20b-q4.json +47 -0
  19. package/authoring/chat-models/laguna-s-2.1-118b-q4.json +127 -0
  20. package/authoring/chat-models/laguna-s-2.1-118b-q6.json +121 -0
  21. package/authoring/chat-models/laguna-s-2.1-118b-q8.json +127 -0
  22. package/authoring/chat-models/lfm2.5-2.6b-q4.json +39 -0
  23. package/authoring/chat-models/llama3.2-3b-q4.json +42 -0
  24. package/authoring/chat-models/mistral-7b-q4.json +53 -0
  25. package/authoring/chat-models/mistral-medium-3.5-128b-q4.json +57 -0
  26. package/authoring/chat-models/muse-glimmer-30b-q4.json +126 -0
  27. package/authoring/chat-models/nemotron3-nano-30b-q4.json +49 -0
  28. package/authoring/chat-models/nemotron3-super-120b-q4.json +41 -0
  29. package/authoring/chat-models/ornith-35b-q4.json +145 -0
  30. package/authoring/chat-models/ornith-35b-q8.json +145 -0
  31. package/authoring/chat-models/ornith-9b-q4.json +146 -0
  32. package/authoring/chat-models/qwen3.5-122b-a10b-q4.json +172 -0
  33. package/authoring/chat-models/qwen3.5-2b-q4.json +70 -0
  34. package/authoring/chat-models/qwen3.5-4b-q4.json +61 -0
  35. package/authoring/chat-models/qwen3.5-9b-q4.json +61 -0
  36. package/authoring/chat-models/qwen3.6-27b-q4.json +66 -0
  37. package/authoring/chat-models/qwen3.6-27b-q8.json +153 -0
  38. package/authoring/chat-models/qwen3.6-35b-a3b-q4.json +154 -0
  39. package/authoring/chat-models/qwen3.6-35b-a3b-q8.json +154 -0
  40. package/authoring/chat-models/talkie-1930-13b-q4.json +74 -0
  41. package/authoring/chat-models/ternary-bonsai-27b-q2.json +144 -0
  42. package/authoring/gstack/LICENSE.gstack +21 -0
  43. package/authoring/gstack/README.md +50 -0
  44. package/authoring/gstack/evals/cso.json +152 -0
  45. package/authoring/gstack/evals/design-consultation.json +201 -0
  46. package/authoring/gstack/evals/document-generate.json +174 -0
  47. package/authoring/gstack/evals/investigate.json +153 -0
  48. package/authoring/gstack/evals/office-hours.json +141 -0
  49. package/authoring/gstack/evals/plan-ceo-review.json +135 -0
  50. package/authoring/gstack/evals/qa-only.json +376 -0
  51. package/authoring/gstack/evals/retro.json +191 -0
  52. package/authoring/gstack/evals/spec.json +162 -0
  53. package/authoring/gstack/overlays/cso.json +132 -0
  54. package/authoring/gstack/overlays/design-consultation.json +153 -0
  55. package/authoring/gstack/overlays/document-generate.json +124 -0
  56. package/authoring/gstack/overlays/investigate.json +128 -0
  57. package/authoring/gstack/overlays/office-hours.json +119 -0
  58. package/authoring/gstack/overlays/plan-ceo-review.json +128 -0
  59. package/authoring/gstack/overlays/qa-only.json +145 -0
  60. package/authoring/gstack/overlays/retro.json +132 -0
  61. package/authoring/gstack/overlays/spec.json +140 -0
  62. package/authoring/gstack/persona-drafts/cso.about.md +9 -0
  63. package/authoring/gstack/persona-drafts/design-consultation.about.md +9 -0
  64. package/authoring/gstack/persona-drafts/office-hours.about.md +9 -0
  65. package/authoring/gstack/persona-drafts/qa-only.about.md +5 -0
  66. package/authoring/gstack/persona-drafts/spec.about.md +26 -0
  67. package/authoring/gstack/snapshots/cso/SKILL.md +1285 -0
  68. package/authoring/gstack/snapshots/design-consultation/SKILL.md +1230 -0
  69. package/authoring/gstack/snapshots/document-generate/SKILL.md +1252 -0
  70. package/authoring/gstack/snapshots/investigate/SKILL.md +1074 -0
  71. package/authoring/gstack/snapshots/office-hours/SKILL.md +1697 -0
  72. package/authoring/gstack/snapshots/plan-ceo-review/SKILL.md +1476 -0
  73. package/authoring/gstack/snapshots/qa-only/SKILL.md +1256 -0
  74. package/authoring/gstack/snapshots/retro/SKILL.md +1812 -0
  75. package/authoring/gstack/snapshots/spec/SKILL.md +2359 -0
  76. package/authoring/gstack/wave.json +103 -0
  77. package/data/chat-models/gl/glm-5.2-754b-q2/manifest.json +65 -0
  78. package/data/chat-models/gl/glm-5.2-754b-q2/versions/1.0.0/manifest.json +18 -0
  79. package/data/chat-models/gp/gpt-oss-120b-q4/manifest.json +5 -5
  80. package/data/chat-models/gp/gpt-oss-120b-q4/versions/1.1.0/manifest.json +135 -0
  81. package/data/chat-models/index.json +1 -1
  82. package/data/chat-models/mu/muse-glimmer-30b-q4/manifest.json +135 -0
  83. package/data/chat-models/mu/muse-glimmer-30b-q4/versions/1.0.0/manifest.json +20 -0
  84. package/data/connector-types/gi/github-releases/manifest.json +17 -0
  85. package/data/connector-types/gi/github-releases/versions/1.0.0/manifest.json +71 -0
  86. package/data/connector-types/index.json +1 -1
  87. package/data/craftbook-templates/br/branding-website/versions/1.1.0/craftbook.json +190 -0
  88. package/data/craftbook-templates/br/branding-website/versions/1.1.0/test.json +164 -0
  89. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.0/craftbook.json +358 -0
  90. package/data/craftbook-templates/br/browser-qa-audit/versions/2.0.0/test.json +376 -0
  91. package/data/craftbook-templates/ca/careful-mode/versions/1.1.0/craftbook.json +43 -0
  92. package/data/craftbook-templates/ca/careful-mode/versions/1.1.0/test.json +110 -0
  93. package/data/craftbook-templates/ca/careful-mode/versions/1.2.0/craftbook.json +43 -0
  94. package/data/craftbook-templates/ca/careful-mode/versions/1.2.0/test.json +110 -0
  95. package/data/craftbook-templates/co/content-deck/versions/1.1.0/craftbook.json +185 -0
  96. package/data/craftbook-templates/co/content-deck/versions/1.1.0/test.json +166 -0
  97. package/data/craftbook-templates/co/content-deck/versions/1.2.0/craftbook.json +185 -0
  98. package/data/craftbook-templates/co/content-deck/versions/1.2.0/test.json +169 -0
  99. package/data/craftbook-templates/co/corpus-email-digest/versions/1.1.0/craftbook.json +189 -0
  100. package/data/craftbook-templates/co/corpus-email-digest/versions/1.1.0/test.json +182 -0
  101. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.0/craftbook.json +189 -0
  102. package/data/craftbook-templates/co/corpus-email-digest/versions/1.2.0/test.json +187 -0
  103. package/data/craftbook-templates/de/design-system-consultation/versions/2.0.0/craftbook.json +385 -0
  104. package/data/craftbook-templates/de/design-system-consultation/versions/2.0.0/test.json +201 -0
  105. package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.0/craftbook.json +353 -0
  106. package/data/craftbook-templates/en/engineering-retrospective/versions/2.0.0/test.json +191 -0
  107. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.0/craftbook.json +347 -0
  108. package/data/craftbook-templates/ex/executive-level-review/versions/2.0.0/test.json +135 -0
  109. package/data/craftbook-templates/fr/freeze-scope/versions/1.2.0/craftbook.json +50 -0
  110. package/data/craftbook-templates/fr/freeze-scope/versions/1.2.0/test.json +131 -0
  111. package/data/craftbook-templates/fr/freeze-scope/versions/1.3.0/craftbook.json +50 -0
  112. package/data/craftbook-templates/fr/freeze-scope/versions/1.3.0/test.json +131 -0
  113. package/data/craftbook-templates/ht/html-arcade-game/versions/1.1.0/craftbook.json +197 -0
  114. package/data/craftbook-templates/ht/html-arcade-game/versions/1.1.0/test.json +173 -0
  115. package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.0/craftbook.json +197 -0
  116. package/data/craftbook-templates/ht/html-arcade-game/versions/1.2.0/test.json +176 -0
  117. package/data/craftbook-templates/id/idea-office-hours/versions/2.0.0/craftbook.json +333 -0
  118. package/data/craftbook-templates/id/idea-office-hours/versions/2.0.0/test.json +141 -0
  119. package/data/craftbook-templates/im/image-set-index/versions/1.1.0/craftbook.json +163 -0
  120. package/data/craftbook-templates/im/image-set-index/versions/1.1.0/test.json +177 -0
  121. package/data/craftbook-templates/im/image-set-index/versions/1.2.0/craftbook.json +163 -0
  122. package/data/craftbook-templates/im/image-set-index/versions/1.2.0/test.json +180 -0
  123. package/data/craftbook-templates/index.json +1 -1
  124. package/data/craftbook-templates/pu/pull-request-review/manifest.json +5 -1
  125. package/data/craftbook-templates/pu/pull-request-review/versions/1.2.0/craftbook.json +159 -0
  126. package/data/craftbook-templates/pu/pull-request-review/versions/1.2.0/test.json +172 -0
  127. package/data/craftbook-templates/re/release-artifact-sanity-check/art.json +13 -0
  128. package/data/craftbook-templates/re/release-artifact-sanity-check/logo.webp +0 -0
  129. package/data/craftbook-templates/re/release-artifact-sanity-check/manifest.json +24 -0
  130. package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.0/craftbook.json +202 -0
  131. package/data/craftbook-templates/re/release-artifact-sanity-check/versions/1.0.0/test.json +138 -0
  132. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.0/craftbook.json +348 -0
  133. package/data/craftbook-templates/ro/root-cause-investigation/versions/2.0.0/test.json +153 -0
  134. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.0/craftbook.json +353 -0
  135. package/data/craftbook-templates/se/security-architecture-review/versions/2.0.0/test.json +152 -0
  136. package/data/craftbook-templates/sp/spec-authoring/versions/2.0.0/craftbook.json +391 -0
  137. package/data/craftbook-templates/sp/spec-authoring/versions/2.0.0/test.json +162 -0
  138. package/data/craftbook-templates/te/technical-documentation/versions/2.0.0/craftbook.json +343 -0
  139. package/data/craftbook-templates/te/technical-documentation/versions/2.0.0/test.json +174 -0
  140. package/data/craftbook-templates/tr/translate-content/versions/1.1.0/craftbook.json +84 -0
  141. package/data/craftbook-templates/tr/translate-content/versions/1.1.0/test.json +141 -0
  142. package/package.json +10 -4
  143. package/schemas/chat-model-identity.schema.json +44 -0
  144. package/schemas/chat-model-version.schema.json +3 -0
  145. package/schemas/connector-type-identity.schema.json +3 -0
  146. package/schemas/connector-type-version.schema.json +3 -0
  147. package/schemas/craftbook-doc.schema.json +3 -0
  148. package/schemas/craftbook-template-identity.schema.json +3 -0
  149. package/schemas/craftbook-template-version.schema.json +3 -0
  150. package/schemas/craftbook-test.schema.json +232 -3
  151. package/schemas/gezel-template-identity.schema.json +3 -0
  152. package/schemas/gezel-template-version.schema.json +3 -0
  153. package/schemas/image-model-identity.schema.json +3 -0
  154. package/schemas/image-model-version.schema.json +3 -0
  155. package/schemas/project-type-identity.schema.json +3 -0
  156. package/schemas/project-type-version.schema.json +3 -0
  157. package/schemas/toolset-identity.schema.json +3 -0
  158. package/schemas/toolset-version.schema.json +3 -0
  159. package/schemas/video-model-identity.schema.json +3 -0
  160. package/schemas/video-model-version.schema.json +3 -0
@@ -0,0 +1,347 @@
1
+ {
2
+ "id": "executive-level-review",
3
+ "name": "Executive-Level Review",
4
+ "description": "A strategic, executive-level review of a plan or scope: challenge the premise, weigh alternatives, and score each dimension before committing — the 'should we even build this' pass.",
5
+ "basedOn": {
6
+ "name": "gstack",
7
+ "url": "https://github.com/garrytan/gstack"
8
+ },
9
+ "plan": "Review the decision, not just the document. Start from the premise, user value, and evidence; compare real alternatives; then test economics, sequencing, reversibility, operational load, and downside. Scores must be anchored to observed facts, with unknowns called out. The final verdict is one of SCOPE EXPANSION, SELECTIVE, HOLD, or SCOPE REDUCTION and includes explicit conditions for changing it.",
10
+ "entryStepId": "evidence",
11
+ "triggers": [
12
+ "think bigger",
13
+ "expand scope",
14
+ "strategy review",
15
+ "rethink this plan"
16
+ ],
17
+ "command": "executive-level-review",
18
+ "steps": [
19
+ {
20
+ "id": "evidence",
21
+ "name": "Build the executive evidence base",
22
+ "description": "Extract the proposal, intended outcome, proof, assumptions, constraints, and missing decisions.",
23
+ "prompt": "Read the plan and the workspace material it cites. Restate the decision being requested, target user and outcome, timing, constraints, dependencies, and claimed evidence. Verify cited project facts directly. Separate evidence, inference, and unsupported assumption. Identify the decision owner, irreversible choices, and the cost of waiting. Do not score or recommend yet.\n\nObservable handoff: write the completed result to `reviews/executive-evidence.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": "strategy analyst",
25
+ "advanceWhen": {
26
+ "file": "reviews/executive-evidence.md",
27
+ "minBytes": 800,
28
+ "sniff": "nonempty",
29
+ "requireChange": true,
30
+ "goto": "challenge"
31
+ },
32
+ "gate": {
33
+ "at": "completion",
34
+ "checks": [
35
+ {
36
+ "kind": "minBytes",
37
+ "file": "reviews/executive-evidence.md",
38
+ "bytes": 800
39
+ },
40
+ {
41
+ "kind": "sniff",
42
+ "file": "reviews/executive-evidence.md",
43
+ "sniff": "nonempty"
44
+ },
45
+ {
46
+ "kind": "contains",
47
+ "file": "reviews/executive-evidence.md",
48
+ "pattern": "^##\\s+Decision",
49
+ "flags": "im",
50
+ "label": "Decision section"
51
+ },
52
+ {
53
+ "kind": "contains",
54
+ "file": "reviews/executive-evidence.md",
55
+ "pattern": "^##\\s+Evidence",
56
+ "flags": "im",
57
+ "label": "Evidence section"
58
+ },
59
+ {
60
+ "kind": "contains",
61
+ "file": "reviews/executive-evidence.md",
62
+ "pattern": "^##\\s+Assumptions",
63
+ "flags": "im",
64
+ "label": "Assumptions section"
65
+ },
66
+ {
67
+ "kind": "contains",
68
+ "file": "reviews/executive-evidence.md",
69
+ "pattern": "^##\\s+Constraints",
70
+ "flags": "im",
71
+ "label": "Constraints section"
72
+ },
73
+ {
74
+ "kind": "contains",
75
+ "file": "reviews/executive-evidence.md",
76
+ "pattern": "^##\\s+Unknowns",
77
+ "flags": "im",
78
+ "label": "Unknowns section"
79
+ }
80
+ ],
81
+ "onReject": "evidence",
82
+ "maxAttempts": 3
83
+ },
84
+ "next": "challenge"
85
+ },
86
+ {
87
+ "id": "challenge",
88
+ "name": "Challenge the premise and options",
89
+ "description": "Compare the proposal with materially different ways to reach the outcome.",
90
+ "prompt": "Use `reviews/executive-evidence.md` to test whether the problem deserves action now and whether the proposal is the best vehicle. Develop at least three alternatives, including doing less or waiting. Compare value, confidence, time to learning, opportunity cost, reversibility, operating burden, security or compliance exposure, and failure mode. Identify which choice each key assumption favors and the cheapest evidence that would flip the ranking.\n\nObservable handoff: write the completed result to `reviews/executive-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.",
91
+ "suggestedRole": "executive strategist",
92
+ "advanceWhen": {
93
+ "file": "reviews/executive-options.md",
94
+ "minBytes": 1000,
95
+ "sniff": "nonempty",
96
+ "requireChange": true,
97
+ "goto": "verdict"
98
+ },
99
+ "gate": {
100
+ "at": "completion",
101
+ "checks": [
102
+ {
103
+ "kind": "minBytes",
104
+ "file": "reviews/executive-options.md",
105
+ "bytes": 1000
106
+ },
107
+ {
108
+ "kind": "sniff",
109
+ "file": "reviews/executive-options.md",
110
+ "sniff": "nonempty"
111
+ },
112
+ {
113
+ "kind": "contains",
114
+ "file": "reviews/executive-options.md",
115
+ "pattern": "^##\\s+Premise test",
116
+ "flags": "im",
117
+ "label": "Premise test section"
118
+ },
119
+ {
120
+ "kind": "contains",
121
+ "file": "reviews/executive-options.md",
122
+ "pattern": "^##\\s+Alternatives",
123
+ "flags": "im",
124
+ "label": "Alternatives section"
125
+ },
126
+ {
127
+ "kind": "contains",
128
+ "file": "reviews/executive-options.md",
129
+ "pattern": "^##\\s+Opportunity cost",
130
+ "flags": "im",
131
+ "label": "Opportunity cost section"
132
+ },
133
+ {
134
+ "kind": "contains",
135
+ "file": "reviews/executive-options.md",
136
+ "pattern": "^##\\s+Failure modes",
137
+ "flags": "im",
138
+ "label": "Failure modes section"
139
+ },
140
+ {
141
+ "kind": "contains",
142
+ "file": "reviews/executive-options.md",
143
+ "pattern": "^##\\s+Decision-changing evidence",
144
+ "flags": "im",
145
+ "label": "decision-changing evidence section"
146
+ }
147
+ ],
148
+ "onReject": "challenge",
149
+ "maxAttempts": 3
150
+ },
151
+ "next": "verdict"
152
+ },
153
+ {
154
+ "id": "verdict",
155
+ "name": "Write the executive review",
156
+ "description": "Deliver an evidence-anchored scorecard, verdict, and decision conditions.",
157
+ "prompt": "Write a decision-ready review using the evidence and options files. Score user value, strategic fit, evidence strength, feasibility, sequencing, reversibility, operating cost, and downside from 0 to 10; for each score cite the basis and say what would make it a 10. Choose exactly one mode verdict and explain the two or three decisive reasons. Recommend what to approve now, what to cut or defer, near-term validation, owners, and explicit go, pause, or stop conditions.\n\nObservable handoff: write the completed result to `reviews/executive-level-review.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.",
158
+ "suggestedRole": "executive reviewer",
159
+ "advanceWhen": {
160
+ "file": "reviews/executive-level-review.md",
161
+ "minBytes": 1400,
162
+ "sniff": "nonempty",
163
+ "requireChange": true,
164
+ "goto": "evaluate"
165
+ },
166
+ "gate": {
167
+ "at": "completion",
168
+ "checks": [
169
+ {
170
+ "kind": "minBytes",
171
+ "file": "reviews/executive-level-review.md",
172
+ "bytes": 1400
173
+ },
174
+ {
175
+ "kind": "sniff",
176
+ "file": "reviews/executive-level-review.md",
177
+ "sniff": "nonempty"
178
+ },
179
+ {
180
+ "kind": "contains",
181
+ "file": "reviews/executive-level-review.md",
182
+ "pattern": "^##\\s+Executive verdict",
183
+ "flags": "im",
184
+ "label": "Executive verdict section"
185
+ },
186
+ {
187
+ "kind": "contains",
188
+ "file": "reviews/executive-level-review.md",
189
+ "pattern": "(?:SCOPE EXPANSION|SELECTIVE|HOLD|SCOPE REDUCTION)",
190
+ "flags": "im",
191
+ "label": "allowed mode verdict"
192
+ },
193
+ {
194
+ "kind": "contains",
195
+ "file": "reviews/executive-level-review.md",
196
+ "pattern": "^##\\s+Scorecard",
197
+ "flags": "im",
198
+ "label": "Scorecard section"
199
+ },
200
+ {
201
+ "kind": "contains",
202
+ "file": "reviews/executive-level-review.md",
203
+ "pattern": "^##\\s+Alternatives",
204
+ "flags": "im",
205
+ "label": "Alternatives section"
206
+ },
207
+ {
208
+ "kind": "contains",
209
+ "file": "reviews/executive-level-review.md",
210
+ "pattern": "^##\\s+Recommendation",
211
+ "flags": "im",
212
+ "label": "Recommendation section"
213
+ },
214
+ {
215
+ "kind": "contains",
216
+ "file": "reviews/executive-level-review.md",
217
+ "pattern": "^##\\s+Decision conditions",
218
+ "flags": "im",
219
+ "label": "Decision conditions section"
220
+ }
221
+ ],
222
+ "onReject": "verdict",
223
+ "maxAttempts": 3
224
+ },
225
+ "next": "evaluate"
226
+ },
227
+ {
228
+ "id": "evaluate",
229
+ "name": "Evaluate the deliverable",
230
+ "description": "Independently grade the observable deliverable and route it to finish, repair, or user escalation.",
231
+ "prompt": "Review `reviews/executive-level-review.md`, `reviews/executive-evidence.md`, `reviews/executive-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 review tests whether action is warranted, not merely how to execute the supplied plan.\n2. Scores are individually justified by evidence and state what would improve them.\n3. At least three materially different alternatives, including doing less or waiting, are compared.\n4. Opportunity cost, reversibility, operating burden, and credible failure modes influence the recommendation.\n5. The allowed verdict follows from the scorecard and has explicit approval, deferral, and stop conditions.\n6. Unknowns remain visible and no unsupported fact is presented as evidence.\n\nWrite an evidence-backed review to `reviews/executive-level-review-evaluation.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.",
232
+ "suggestedRole": "strategy reviewer",
233
+ "gate": {
234
+ "at": "completion",
235
+ "checks": [
236
+ {
237
+ "kind": "minBytes",
238
+ "file": "reviews/executive-level-review-evaluation.md",
239
+ "bytes": 400
240
+ },
241
+ {
242
+ "kind": "contains",
243
+ "file": "reviews/executive-level-review-evaluation.md",
244
+ "pattern": "Verdict:\\s*(?:PASS|REVISE)",
245
+ "flags": "i",
246
+ "label": "explicit PASS or REVISE verdict"
247
+ }
248
+ ],
249
+ "onReject": "evaluate",
250
+ "maxAttempts": 3
251
+ },
252
+ "next": "repair"
253
+ },
254
+ {
255
+ "id": "repair",
256
+ "name": "Repair the deliverable",
257
+ "description": "Fix only the concrete gaps from the latest independent review.",
258
+ "prompt": "Read `reviews/executive-level-review-evaluation.md` and repair every failed criterion in `reviews/executive-level-review.md`, `reviews/executive-evidence.md`, `reviews/executive-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 `reviews/executive-level-review.md` is genuinely updated this turn so the repair is observable, then hand it back for independent evaluation.",
259
+ "suggestedRole": "executive reviewer",
260
+ "advanceWhen": {
261
+ "file": "reviews/executive-level-review.md",
262
+ "minBytes": 1400,
263
+ "sniff": "nonempty",
264
+ "requireChange": true,
265
+ "goto": "evaluate"
266
+ },
267
+ "gate": {
268
+ "at": "completion",
269
+ "checks": [
270
+ {
271
+ "kind": "minBytes",
272
+ "file": "reviews/executive-level-review.md",
273
+ "bytes": 1400
274
+ },
275
+ {
276
+ "kind": "sniff",
277
+ "file": "reviews/executive-level-review.md",
278
+ "sniff": "nonempty"
279
+ },
280
+ {
281
+ "kind": "contains",
282
+ "file": "reviews/executive-level-review.md",
283
+ "pattern": "^##\\s+Executive verdict",
284
+ "flags": "im",
285
+ "label": "Executive verdict section"
286
+ },
287
+ {
288
+ "kind": "contains",
289
+ "file": "reviews/executive-level-review.md",
290
+ "pattern": "(?:SCOPE EXPANSION|SELECTIVE|HOLD|SCOPE REDUCTION)",
291
+ "flags": "im",
292
+ "label": "allowed mode verdict"
293
+ },
294
+ {
295
+ "kind": "contains",
296
+ "file": "reviews/executive-level-review.md",
297
+ "pattern": "^##\\s+Scorecard",
298
+ "flags": "im",
299
+ "label": "Scorecard section"
300
+ },
301
+ {
302
+ "kind": "contains",
303
+ "file": "reviews/executive-level-review.md",
304
+ "pattern": "^##\\s+Alternatives",
305
+ "flags": "im",
306
+ "label": "Alternatives section"
307
+ },
308
+ {
309
+ "kind": "contains",
310
+ "file": "reviews/executive-level-review.md",
311
+ "pattern": "^##\\s+Recommendation",
312
+ "flags": "im",
313
+ "label": "Recommendation section"
314
+ },
315
+ {
316
+ "kind": "contains",
317
+ "file": "reviews/executive-level-review.md",
318
+ "pattern": "^##\\s+Decision conditions",
319
+ "flags": "im",
320
+ "label": "Decision conditions section"
321
+ }
322
+ ],
323
+ "onReject": "repair",
324
+ "maxAttempts": 3
325
+ },
326
+ "next": "evaluate"
327
+ },
328
+ {
329
+ "id": "finish",
330
+ "name": "Finish",
331
+ "description": "All deterministic and reviewer criteria passed.",
332
+ "prompt": "The independent review passed. Read `reviews/executive-level-review-evaluation.md`, then use `write_task_note` to record a concise DONE summary with the final deliverable paths (`reviews/executive-level-review.md`, `reviews/executive-evidence.md`, `reviews/executive-options.md`) and the evidence that each acceptance criterion passed. Report DONE without starting new work.",
333
+ "suggestedRole": "project lead",
334
+ "terminal": true
335
+ },
336
+ {
337
+ "id": "needs-user",
338
+ "name": "Escalate unresolved concerns",
339
+ "description": "The bounded repair loop ended without a defensible pass.",
340
+ "prompt": "The deliverable did not pass after 3 review rounds. Do not claim success. Read `reviews/executive-level-review-evaluation.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.",
341
+ "suggestedRole": "project lead",
342
+ "terminal": true
343
+ }
344
+ ],
345
+ "version": "2.0.0",
346
+ "releasedAt": "2026-08-09T00:00:00Z"
347
+ }
@@ -0,0 +1,135 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "title": "Executive-Level Review — analytics expansion decision",
4
+ "objective": "Test whether the Executive-Level Review craftbook challenges a proposal, compares lower-cost alternatives, and produces an evidence-anchored mode verdict with decision conditions.",
5
+ "tags": [
6
+ "workflow",
7
+ "strategy",
8
+ "executive-review",
9
+ "decision"
10
+ ],
11
+ "prompt": "Use the Executive-Level Review craftbook to review `source/analytics-proposal.md`. Challenge whether the proposed scope is the best way to reach the outcome; compare at least three alternatives including the two-day manual export and waiting. Produce all craftbook artifacts and a decision-ready `reviews/executive-level-review.md`. Use exactly one allowed mode verdict, score every required dimension from 0–10 with a factual basis, separate unknowns from evidence, and state explicit approve, pause, and stop conditions. Do not invent customer or financial evidence.",
12
+ "setup": {
13
+ "projectName": "Analytics expansion review",
14
+ "about": "A hermetic executive decision review. The seeded proposal is the complete evidence set.",
15
+ "missionObjectives": "Decide what, if anything, should be approved now while preserving the fastest credible route to learning.",
16
+ "files": [
17
+ {
18
+ "path": "source/analytics-proposal.md",
19
+ "content": "# Embedded analytics proposal\n\n## Requested decision\nApprove an eight-week build of customer-facing dashboards with scheduled PDF delivery and CSV export.\n\n## Evidence\nTwelve of 86 active customers requested better reporting in support conversations. Three customers agreed to a design pilot, but none signed a paid commitment. Support currently creates weekly exports for five customers.\n\n## Cost and constraints\n- Estimate: two engineers for 8 weeks.\n- New charting service: $4,000 per month at current volume.\n- Security review is complete; accessibility and data-retention reviews are not.\n- The enterprise renewal decision is in six weeks.\n- A manual scheduled-export workflow can be built in two engineer-days and would test delivery cadence, but not dashboard engagement.\n\n## Unknowns\nWillingness to pay, which metrics matter, PDF accessibility, and whether scheduled delivery or interactive dashboards drives retention.\n"
20
+ }
21
+ ]
22
+ },
23
+ "mocks": [],
24
+ "success": {
25
+ "summary": "The named craftbook produces a grounded executive verdict, alternatives, scorecard, and terminal task record.",
26
+ "deliverables": [
27
+ {
28
+ "path": "reviews/executive-level-review.md",
29
+ "kind": "markdown-report",
30
+ "minBytes": 1400,
31
+ "checks": [
32
+ {
33
+ "kind": "contains",
34
+ "file": "reviews/executive-level-review.md",
35
+ "pattern": "^#{1,3}\\s+Executive verdict\\b[\\s\\S]*(SCOPE EXPANSION|SELECTIVE|HOLD|SCOPE REDUCTION)[\\s\\S]*^#{1,3}\\s+Scorecard\\b[\\s\\S]*^#{1,3}\\s+Alternatives\\b[\\s\\S]*^#{1,3}\\s+Recommendation\\b[\\s\\S]*^#{1,3}\\s+Decision conditions\\b",
36
+ "flags": "im",
37
+ "label": "verdict, scorecard, alternatives, recommendation, and conditions"
38
+ },
39
+ {
40
+ "kind": "contains",
41
+ "file": "reviews/executive-level-review.md",
42
+ "pattern": "(user value).*?(strategic fit).*?(evidence strength).*?(feasibility).*?(sequencing).*?(reversibility).*?(operating cost).*?(downside)",
43
+ "flags": "is",
44
+ "label": "complete executive scorecard"
45
+ },
46
+ {
47
+ "kind": "valueGrounding",
48
+ "file": "reviews/executive-level-review.md",
49
+ "facts": [
50
+ {
51
+ "id": "customer-requests",
52
+ "required": [
53
+ "12\\s+(?:of\\s+86\\s+)?(?:active\\s+)?customers"
54
+ ]
55
+ },
56
+ {
57
+ "id": "pilot-evidence",
58
+ "required": [
59
+ "3\\s+customers?[^.]{0,60}(pilot|agreed)"
60
+ ]
61
+ },
62
+ {
63
+ "id": "build-duration",
64
+ "required": [
65
+ "8\\s+weeks?"
66
+ ]
67
+ },
68
+ {
69
+ "id": "operating-cost",
70
+ "required": [
71
+ "\\$4,?000\\s+per\\s+month"
72
+ ]
73
+ },
74
+ {
75
+ "id": "cheap-alternative",
76
+ "required": [
77
+ "(two|2)[ -]?(engineer[- ])?days?[\\s\\S]{0,120}(manual|scheduled)[ -]export"
78
+ ]
79
+ }
80
+ ]
81
+ },
82
+ {
83
+ "kind": "citationsResolve",
84
+ "file": "reviews/executive-level-review.md",
85
+ "minCitations": 1
86
+ }
87
+ ]
88
+ }
89
+ ],
90
+ "taskNotes": {
91
+ "minBytes": 160,
92
+ "checks": [
93
+ {
94
+ "kind": "contains",
95
+ "file": "task-notes.md",
96
+ "pattern": "\\bDONE\\b[\\s\\S]*reviews/executive-level-review\\.md",
97
+ "label": "terminal craftbook note names the review"
98
+ }
99
+ ],
100
+ "requireCraftbookTask": true
101
+ },
102
+ "taskGraph": {
103
+ "requireCraftbookTask": true,
104
+ "requireTerminalStep": true
105
+ },
106
+ "unchangedFixtures": [
107
+ "source/analytics-proposal.md"
108
+ ]
109
+ },
110
+ "rubric": {
111
+ "artifact": {
112
+ "path": "reviews/executive-level-review.md",
113
+ "kind": "markdown"
114
+ },
115
+ "axes": [
116
+ {
117
+ "name": "Premise challenge",
118
+ "description": "The review tests whether action is warranted now and compares materially different ways to learn or deliver value."
119
+ },
120
+ {
121
+ "name": "Evidence discipline",
122
+ "description": "Scores and conclusions trace to supplied facts, with unsupported assumptions and missing decisions called out."
123
+ },
124
+ {
125
+ "name": "Executive usefulness",
126
+ "description": "The verdict is decisive, sequenced, reversible where possible, and paired with clear decision-changing conditions."
127
+ }
128
+ ]
129
+ },
130
+ "qualityFocus": [
131
+ "One allowed mode verdict is selected",
132
+ "All scorecard dimensions have evidence-backed scores",
133
+ "The two-day alternative and missing willingness-to-pay evidence influence the decision"
134
+ ]
135
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "id": "freeze-scope",
3
+ "name": "Freeze Scope",
4
+ "description": "Confine Gezel’s built-in workspace mutation surface to one directory. Direct file writes, patches, renames, deletes, directory creation, copies, and archive extraction are allowed only inside the chosen boundary. Built-in code/package executors whose write targets cannot be proven are blocked until the task ends. Custom project-type and third-party tools are outside this hook contract and must not be used while frozen.",
5
+ "basedOn": {
6
+ "name": "gstack",
7
+ "url": "https://github.com/garrytan/gstack"
8
+ },
9
+ "plan": "Step 1 agrees the boundary with the user and records it at `.gezel/freeze.json`. From then on the PreToolUse hook checks every built-in workspace mutation destination and denies paths outside the frozen directory. It also fails closed on built-in code/package executors whose filesystem effects are not declared. Custom project-type and third-party tools are explicitly out of contract and must not be called while frozen (the state file itself stays writable so the boundary can be adjusted deliberately).",
10
+ "entryStepId": "set-boundary",
11
+ "triggers": [
12
+ "freeze scope",
13
+ "only touch",
14
+ "stay inside",
15
+ "lock edits to"
16
+ ],
17
+ "command": "freeze-scope",
18
+ "hooks": [
19
+ {
20
+ "phase": "PreToolUse",
21
+ "matcher": "^(write_file|append_to_file|replace_in_file|replace_lines|apply_patch|insert_at_marker|copy_artifact_to_workspace|make_dir|delete_path|rename|extract_archive|npm_install|run_package_script|run_npx|run_nodejs_script|derive_file|run_playwright_script|run_installed_script|apply_project_type)$",
22
+ "script": {
23
+ "name": "check-freeze",
24
+ "scope": "craftbook"
25
+ },
26
+ "label": "freeze: write-boundary check"
27
+ }
28
+ ],
29
+ "steps": [
30
+ {
31
+ "id": "set-boundary",
32
+ "name": "Agree the frozen directory",
33
+ "prompt": "Confirm with the user which single workspace directory edits are allowed in — use `ask_user_question` if the kickoff didn’t name one. Then record it by writing `.gezel/freeze.json` with exactly:\n\n```json\n{ \"dir\": \"<workspace-relative-directory>\" }\n```\n\nUse a relative path with no leading `./` and no trailing slash (e.g. `src/billing`). Tell the user the freeze is on and advance.",
34
+ "suggestedRole": "planner",
35
+ "next": "frozen"
36
+ },
37
+ {
38
+ "id": "frozen",
39
+ "name": "Freeze active",
40
+ "prompt": "The built-in write boundary is active: direct file mutations outside the frozen directory are denied automatically — you will see the denial as a tool error naming the boundary. Opaque built-in execution tools (`npm_install`, package/npx/Node/Playwright/installed scripts, `derive_file`, and project-type application) are blocked because their extra write targets cannot be proven. Custom project-type and third-party tools are not covered by this hook and must not be called while frozen. Work with direct workspace tools inside the directory. If the work genuinely needs an executor, custom tool, or outside path, do NOT fight the boundary: explain why and let the user widen `.gezel/freeze.json` or end this task.",
41
+ "suggestedRole": "developer",
42
+ "terminal": true
43
+ }
44
+ ],
45
+ "scripts": {
46
+ "check-freeze": "import { defineScript, gezel } from '@bendyline/gezel-sdk';\n\nexport const meta = defineScript({\n name: 'check-freeze',\n description: 'Block workspace writes outside the frozen directory (freeze scope).',\n inputs: {},\n outputs: {\n decision: { type: 'string', description: 'allow | deny' },\n message: { type: 'string', description: 'Reason shown on deny.' },\n },\n requires: ['workspace.read'],\n});\n\nconst STATE_FILE = '.gezel/freeze.json';\n\nfunction normalize(p: string): string {\n return p.replace(/\\\\/g, '/').replace(/\\/{2,}/g, '/').replace(/^\\.\\//, '').replace(/\\/$/, '');\n}\n\nasync function main(): Promise<void> {\n const input = gezel.input as { toolName?: unknown; args?: Record<string, unknown> };\n const toolName = String(input.toolName ?? '');\n const args = input.args ?? {};\n\n let frozenDir = '';\n try {\n const raw = await gezel.fs.read(STATE_FILE);\n frozenDir = normalize(String(JSON.parse(raw).dir ?? ''));\n } catch {\n // Not configured yet (the setup step writes it) — allow everything.\n gezel.output({ decision: 'allow', message: '' });\n return;\n }\n if (!frozenDir) {\n gezel.output({ decision: 'allow', message: '' });\n return;\n }\n\n // Arbitrary code and project-type application can write paths that are not\n // declared in their tool arguments. Fail closed: direct file tools remain\n // available inside the boundary, while opaque executors must wait until\n // the freeze is lifted.\n const unboundedWriteTools = new Set([\n 'npm_install',\n 'run_package_script',\n 'run_npx',\n 'run_nodejs_script',\n 'derive_file',\n 'run_playwright_script',\n 'run_installed_script',\n 'apply_project_type',\n ]);\n if (unboundedWriteTools.has(toolName)) {\n gezel.output({\n decision: 'deny',\n message:\n '[freeze] ' + toolName + ' can write undeclared paths, so it is blocked while freeze scope is active. Use direct workspace tools inside \"' + frozenDir + '/\", or end the freeze before running code.',\n });\n return;\n }\n\n // Only write destinations count. Source paths may live elsewhere and are\n // safe to read (copy_artifact_to_workspace and extract_archive).\n const candidateKeys =\n toolName === 'rename'\n ? ['fromPath', 'toPath']\n : toolName === 'copy_artifact_to_workspace'\n ? ['dest']\n : toolName === 'extract_archive'\n ? ['outputPath']\n : ['path'];\n const candidates = candidateKeys\n .map((key) => (args as Record<string, unknown>)[key])\n .filter((value): value is string => typeof value === 'string' && value.length > 0)\n .map(normalize);\n if (candidates.length === 0) {\n gezel.output({\n decision: 'deny',\n message: '[freeze] This write call did not expose a destination path, so its boundary cannot be verified.',\n });\n return;\n }\n\n for (const candidate of candidates) {\n const inside = candidate === frozenDir || candidate.startsWith(frozenDir + '/');\n const isStateFile = candidate === normalize(STATE_FILE);\n if (candidate.includes('..')) {\n gezel.output({ decision: 'deny', message: '[freeze] Path escapes are blocked while freeze scope is active.' });\n return;\n }\n if (!inside && !isStateFile) {\n gezel.output({\n decision: 'deny',\n message:\n '[freeze] Writes are frozen to \"' + frozenDir + '/\" — \"' + candidate + '\" is outside it. Finish the scoped work first, or end the freeze-scope task to lift the boundary.',\n });\n return;\n }\n }\n gezel.output({ decision: 'allow', message: '' });\n}\n\nawait main();\n"
47
+ },
48
+ "version": "1.2.0",
49
+ "releasedAt": "2026-08-09T00:00:00Z"
50
+ }