mandrel 1.92.0 → 1.94.0

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 (144) hide show
  1. package/.agents/agents/acceptance-critic.md +129 -0
  2. package/.agents/agents/retro.md +42 -0
  3. package/.agents/agents/story-worker.md +162 -0
  4. package/.agents/docs/configuration.md +7 -1
  5. package/.agents/docs/execution-reference.md +27 -2
  6. package/.agents/instructions.md +43 -33
  7. package/.agents/personas/engineer.md +26 -112
  8. package/.agents/personas/security-engineer.md +1 -2
  9. package/.agents/rules/git-conventions-reference.md +225 -0
  10. package/.agents/rules/git-conventions.md +25 -200
  11. package/.agents/rules/security-baseline.md +5 -0
  12. package/.agents/rules/testing-standards.md +106 -13
  13. package/.agents/schemas/agentrc.schema.json +31 -1
  14. package/.agents/schemas/lifecycle/slice.end.schema.json +21 -0
  15. package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +20 -0
  16. package/.agents/schemas/lifecycle/slice.start.schema.json +17 -0
  17. package/.agents/scripts/acceptance-eval.js +62 -18
  18. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  19. package/.agents/scripts/bookkeeping-reconcile.js +117 -0
  20. package/.agents/scripts/check-context-budget.js +62 -5
  21. package/.agents/scripts/diagnose-friction.js +0 -6
  22. package/.agents/scripts/epic-deliver-prepare.js +272 -10
  23. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +56 -18
  24. package/.agents/scripts/lib/close-validation/gates.js +159 -21
  25. package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
  26. package/.agents/scripts/lib/config/delivery-routing.js +87 -0
  27. package/.agents/scripts/lib/config/explain.js +2 -0
  28. package/.agents/scripts/lib/config-resolver.js +1 -1
  29. package/.agents/scripts/lib/config-settings-schema-delivery.js +37 -3
  30. package/.agents/scripts/lib/config-settings-schema-quality.js +9 -0
  31. package/.agents/scripts/lib/doc-tiers.js +37 -2
  32. package/.agents/scripts/lib/observability/active-story-env.js +111 -2
  33. package/.agents/scripts/lib/observability/hook-heartbeat.js +219 -0
  34. package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
  35. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
  36. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
  37. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +270 -0
  38. package/.agents/scripts/lib/orchestration/ceremony-routing.js +141 -0
  39. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +3 -124
  40. package/.agents/scripts/lib/orchestration/deliver-route.js +173 -0
  41. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/authoring-context.js +1 -1
  42. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +233 -0
  43. package/.agents/scripts/lib/orchestration/file-assumptions.js +68 -7
  44. package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +270 -0
  45. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +83 -2
  46. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +6 -0
  47. package/.agents/scripts/lib/orchestration/plan-context.js +189 -3
  48. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +3 -2
  49. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +99 -0
  50. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +38 -1
  51. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +16 -1
  52. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +1 -0
  53. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +1 -0
  54. package/.agents/scripts/lib/orchestration/ticket-validator.js +19 -2
  55. package/.agents/scripts/lib/provider-factory.js +1 -1
  56. package/.agents/scripts/lib/templates/decomposer-prompts.js +1 -1
  57. package/.agents/scripts/plan-context.js +28 -10
  58. package/.agents/scripts/post-structured-comment.js +38 -0
  59. package/.agents/scripts/slice-phase.js +361 -0
  60. package/.agents/scripts/sync-claude-agents.js +165 -0
  61. package/.agents/scripts/update-ticket-state.js +31 -0
  62. package/.agents/scripts/wave-tick.js +138 -9
  63. package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
  64. package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
  65. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
  66. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +5 -5
  67. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +8 -8
  68. package/.agents/skills/core/epic-plan-premortem/SKILL.md +4 -4
  69. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +26 -56
  70. package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
  71. package/.agents/skills/core/idea-refinement/SKILL.md +2 -8
  72. package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
  73. package/.agents/skills/skills.index.json +11 -381
  74. package/.agents/workflows/deliver.md +47 -4
  75. package/.agents/workflows/helpers/acceptance-self-eval.md +38 -13
  76. package/.agents/workflows/helpers/deliver-epic-reference.md +18 -5
  77. package/.agents/workflows/helpers/deliver-epic-single.md +331 -0
  78. package/.agents/workflows/helpers/deliver-epic.md +51 -8
  79. package/.agents/workflows/helpers/deliver-stories.md +15 -5
  80. package/.agents/workflows/helpers/epic-deliver-story.md +12 -3
  81. package/.agents/workflows/helpers/mandrel-sync-config.md +1 -1
  82. package/.agents/workflows/helpers/plan-epic-reference.md +19 -8
  83. package/.agents/workflows/helpers/plan-epic.md +95 -27
  84. package/.agents/workflows/helpers/scope-triage-gate.md +9 -0
  85. package/.agents/workflows/mandrel-update.md +1 -1
  86. package/.agents/workflows/plan.md +16 -4
  87. package/docs/CHANGELOG.md +23 -0
  88. package/lib/cli/registry.js +95 -0
  89. package/package.json +4 -2
  90. package/.agents/personas/engineer-mobile.md +0 -120
  91. package/.agents/personas/engineer-web.md +0 -111
  92. package/.agents/personas/product.md +0 -94
  93. package/.agents/personas/refactorer.md +0 -113
  94. package/.agents/personas/sre.md +0 -86
  95. package/.agents/personas/ux-designer.md +0 -95
  96. package/.agents/scripts/epic-plan-decompose.js +0 -54
  97. package/.agents/scripts/epic-plan-spec.js +0 -64
  98. package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +0 -109
  99. package/.agents/scripts/plan-critics.js +0 -227
  100. package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
  101. package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
  102. package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
  103. package/.agents/skills/core/code-simplification/SKILL.md +0 -389
  104. package/.agents/skills/core/context-engineering/SKILL.md +0 -309
  105. package/.agents/skills/core/context-engineering/examples.md +0 -58
  106. package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
  107. package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
  108. package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
  109. package/.agents/skills/core/idea-refinement/examples.md +0 -437
  110. package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
  111. package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
  112. package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
  113. package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
  114. package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
  115. package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
  116. package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
  117. package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
  118. package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
  119. package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
  120. package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
  121. package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
  122. package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
  123. package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
  124. package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
  125. package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
  126. package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
  127. package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
  128. package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
  129. package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
  130. package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
  131. package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
  132. package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
  133. package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
  134. package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
  135. package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
  136. package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
  137. package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
  138. package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
  139. package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
  140. package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
  141. package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
  142. package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
  143. package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
  144. package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-07-11T11:32:48.235Z",
2
+ "generatedAt": "2026-07-13T15:00:10.171Z",
3
3
  "generator": "generate-skills-index.js@1",
4
4
  "skills": [
5
5
  {
@@ -22,16 +22,6 @@
22
22
  "allowedTools": null,
23
23
  "vendor": null
24
24
  },
25
- {
26
- "name": "baseline-refresh",
27
- "tier": "core",
28
- "category": "core",
29
- "path": ".agents/skills/core/baseline-refresh/SKILL.md",
30
- "description": "Author a refresh commit for any of the unified-baseline snapshots (CRAP, maintainability, dead-exports, lighthouse). Use whenever an intentional code change resets a baseline key (rename, deliberate complexity bump, perf regression with operator sign-off) and the close-validation chain needs the refreshed snapshot to land on the same Story branch as the triggering edit.",
31
- "policyCapsuleBullets": 10,
32
- "allowedTools": ["Read", "Write", "Bash"],
33
- "vendor": null
34
- },
35
25
  {
36
26
  "name": "browser-testing-with-devtools",
37
27
  "tier": "core",
@@ -42,43 +32,13 @@
42
32
  "allowedTools": null,
43
33
  "vendor": null
44
34
  },
45
- {
46
- "name": "ci-cd-and-automation",
47
- "tier": "core",
48
- "category": "core",
49
- "path": ".agents/skills/core/ci-cd-and-automation/SKILL.md",
50
- "description": "Automates CI/CD pipeline setup. Use when setting up or modifying build and deployment pipelines. Use when you need to automate quality gates, configure test runners in CI, or establish deployment strategies.",
51
- "policyCapsuleBullets": 9,
52
- "allowedTools": null,
53
- "vendor": null
54
- },
55
35
  {
56
36
  "name": "code-review-and-quality",
57
37
  "tier": "core",
58
38
  "category": "core",
59
39
  "path": ".agents/skills/core/code-review-and-quality/SKILL.md",
60
- "description": "Conducts multi-axis code review. Use before merging any change. Use when reviewing code written by yourself, another agent, or a human. Use when you need to assess code quality across multiple dimensions before it enters the main branch.",
61
- "policyCapsuleBullets": 10,
62
- "allowedTools": null,
63
- "vendor": null
64
- },
65
- {
66
- "name": "code-simplification",
67
- "tier": "core",
68
- "category": "core",
69
- "path": ".agents/skills/core/code-simplification/SKILL.md",
70
- "description": "Simplifies code for clarity. Use when refactoring code for clarity without changing behavior. Use when code works but is harder to read, maintain, or extend than it should be. Use when reviewing code that has accumulated unnecessary complexity.",
71
- "policyCapsuleBullets": 9,
72
- "allowedTools": null,
73
- "vendor": null
74
- },
75
- {
76
- "name": "context-engineering",
77
- "tier": "core",
78
- "category": "core",
79
- "path": ".agents/skills/core/context-engineering/SKILL.md",
80
- "description": "Optimizes agent context setup. Use when starting a new session, when agent output quality degrades, when switching between tasks, or when you need to configure rules files and context for a project.",
81
- "policyCapsuleBullets": 9,
40
+ "description": "Conducts multi-axis code review and runs the disciplined post-green refactor pass. Use before merging any change, when reviewing code written by yourself, another agent, or a human, or when the opt-in `delivery.refactorStage` checkpoint asks for a behaviour-preserving CRAP/duplication pass after the suite is green.",
41
+ "policyCapsuleBullets": 12,
82
42
  "allowedTools": null,
83
43
  "vendor": null
84
44
  },
@@ -92,16 +52,6 @@
92
52
  "allowedTools": null,
93
53
  "vendor": null
94
54
  },
95
- {
96
- "name": "deprecation-and-migration",
97
- "tier": "core",
98
- "category": "core",
99
- "path": ".agents/skills/core/deprecation-and-migration/SKILL.md",
100
- "description": "Manages deprecation and migration. Use when removing old systems, APIs, or features. Use when migrating users from one implementation to another. Use when deciding whether to maintain or sunset existing code.",
101
- "policyCapsuleBullets": 10,
102
- "allowedTools": null,
103
- "vendor": null
104
- },
105
55
  {
106
56
  "name": "diagnose-friction",
107
57
  "tier": "core",
@@ -127,7 +77,7 @@
127
77
  "tier": "core",
128
78
  "category": "core",
129
79
  "path": ".agents/skills/core/epic-plan-consolidate/SKILL.md",
130
- "description": "Run a holistic, pre-persist consolidation pass over the draft Story ticket array an Epic's decompose phase produced. Use during Phase 8 of `/plan`, after `epic-plan-decompose-author` writes `temp/epic-<Epic_ID>/tickets.json` and before `epic-plan-decompose.js` validates and persists it. Reconciles the draft against the Tech Spec \"Delivery Slicing\" ceiling via scope-preserving operations only.",
80
+ "description": "Run a holistic, pre-persist consolidation pass over the draft Story ticket array an Epic's decompose phase produced. Use during Phase 8 of `/plan`, after `epic-plan-decompose-author` writes `temp/epic-<Epic_ID>/tickets.json` and before `plan-persist.js` validates and persists it. Reconciles the draft against the Tech Spec \"Delivery Slicing\" ceiling via scope-preserving operations only.",
131
81
  "policyCapsuleBullets": 9,
132
82
  "allowedTools": ["Read", "Write", "Bash"],
133
83
  "vendor": null
@@ -137,7 +87,7 @@
137
87
  "tier": "core",
138
88
  "category": "core",
139
89
  "path": ".agents/skills/core/epic-plan-decompose-author/SKILL.md",
140
- "description": "Author the Story ticket JSON for an Epic from the decomposer authoring context emitted by `epic-plan-decompose.js --emit-context`. Use during Phase 8 of `/plan` when the host LLM needs to write the ticket array before `epic-plan-decompose.js` validates and persists it.",
90
+ "description": "Author the Story ticket JSON for an Epic from the decomposer authoring context emitted by `plan-context.js --epic <Epic_ID>`. Use during Phase 8 of `/plan` when the host LLM needs to write the ticket array before `plan-persist.js` validates and persists it.",
141
91
  "policyCapsuleBullets": 15,
142
92
  "allowedTools": ["Read", "Write", "Bash"],
143
93
  "vendor": null
@@ -147,7 +97,7 @@
147
97
  "tier": "core",
148
98
  "category": "core",
149
99
  "path": ".agents/skills/core/epic-plan-premortem/SKILL.md",
150
- "description": "Run a fresh-context, code-reading pre-mortem critic over the draft Story ticket array an Epic's decompose phase produced. Use during Phase 8 of `/plan`, after `epic-plan-decompose-author` / `epic-plan-consolidate` write `temp/epic-<Epic_ID>/tickets.json` and before `epic-plan-decompose.js` validates and persists it. Reads the sectioned Epic body AND the cited code surfaces, then emits predicted-rework findings before any GitHub write.",
100
+ "description": "Run a fresh-context, code-reading pre-mortem critic over the draft Story ticket array an Epic's decompose phase produced. Use during Phase 8 of `/plan`, after `epic-plan-decompose-author` / `epic-plan-consolidate` write `temp/epic-<Epic_ID>/tickets.json` and before `plan-persist.js` validates and persists it. Reads the sectioned Epic body AND the cited code surfaces, then emits predicted-rework findings before any GitHub write.",
151
101
  "policyCapsuleBullets": 7,
152
102
  "allowedTools": ["Read", "Write", "Bash", "Grep"],
153
103
  "vendor": null
@@ -157,19 +107,19 @@
157
107
  "tier": "core",
158
108
  "category": "core",
159
109
  "path": ".agents/skills/core/epic-plan-spec-author/SKILL.md",
160
- "description": "Author the Tech Spec, Acceptance Table markdown, and risk-verdict JSON for an Epic from the planner authoring context emitted by `epic-plan-spec.js --emit-context`. Use during Phase 7 of `/plan` when the host LLM needs to write the three artifacts before `epic-plan-spec.js` folds them into the Epic body's managed sections.",
110
+ "description": "Author the Tech Spec, Acceptance Table markdown, and risk-verdict JSON for an Epic from the planner authoring context emitted by `plan-context.js --epic <Epic_ID>`. Use during Phase 7 of `/plan` when the host LLM needs to write the three artifacts before `plan-persist.js` folds them into the Epic body's managed sections.",
161
111
  "policyCapsuleBullets": 14,
162
112
  "allowedTools": ["Read", "Write", "Bash"],
163
113
  "vendor": null
164
114
  },
165
115
  {
166
- "name": "frontend-ui-engineering",
116
+ "name": "gates-and-baselines",
167
117
  "tier": "core",
168
118
  "category": "core",
169
- "path": ".agents/skills/core/frontend-ui-engineering/SKILL.md",
170
- "description": "Builds production-quality UIs. Use when building or modifying user-facing interfaces. Use when creating components, implementing layouts, managing state, or when the output needs to look and feel production-quality rather than AI-generated.",
119
+ "path": ".agents/skills/core/gates-and-baselines/SKILL.md",
120
+ "description": "Governs quality gates and the unified-baseline snapshots. Use when authoring a baseline refresh commit (CRAP, maintainability, dead-exports, lighthouse), when setting up or modifying CI quality gates, or when introducing a new gate that asserts on pre-existing state without turning the integration branch red.",
171
121
  "policyCapsuleBullets": 9,
172
- "allowedTools": null,
122
+ "allowedTools": ["Read", "Write", "Bash"],
173
123
  "vendor": null
174
124
  },
175
125
  {
@@ -182,16 +132,6 @@
182
132
  "allowedTools": null,
183
133
  "vendor": null
184
134
  },
185
- {
186
- "name": "hydrate-context",
187
- "tier": "core",
188
- "category": "core",
189
- "path": ".agents/skills/core/hydrate-context/SKILL.md",
190
- "description": "Hydrate a Story ticket into a structured ContextEnvelope (or the legacy `{ prompt }` stdout wrapper). Reads the ticket body, resolves the parent Epic, embeds the sectioned Epic body (acceptance-table section stripped), and assembles named sections with provenance and section-aware elision. Successor to the retired mandrel MCP `context.hydrate` tool.",
191
- "policyCapsuleBullets": 7,
192
- "allowedTools": ["Read", "Bash"],
193
- "vendor": null
194
- },
195
135
  {
196
136
  "name": "idea-refinement",
197
137
  "tier": "core",
@@ -202,76 +142,6 @@
202
142
  "allowedTools": null,
203
143
  "vendor": null
204
144
  },
205
- {
206
- "name": "incremental-implementation",
207
- "tier": "core",
208
- "category": "core",
209
- "path": ".agents/skills/core/incremental-implementation/SKILL.md",
210
- "description": "Delivers changes incrementally. Use when implementing any feature or change that touches more than one file. Use when you're about to write a large amount of code at once, or when a task feels too big to land in one step.",
211
- "policyCapsuleBullets": 9,
212
- "allowedTools": null,
213
- "vendor": null
214
- },
215
- {
216
- "name": "introducing-a-baseline-gate",
217
- "tier": "core",
218
- "category": "core",
219
- "path": ".agents/skills/core/introducing-a-baseline-gate/SKILL.md",
220
- "description": "Land a new CI check that asserts on a body of pre-existing state (doc-drift, lint-vocabulary, dependency-cycle, missing-test-coverage, unused-export). Use when introducing a gate whose first run would surface latent findings — the introducing Story MUST guarantee the gate exits 0 at merge, not just that the cited discrepancies pass.",
221
- "policyCapsuleBullets": 6,
222
- "allowedTools": null,
223
- "vendor": null
224
- },
225
- {
226
- "name": "knowledge-transfer",
227
- "tier": "core",
228
- "category": "core",
229
- "path": ".agents/skills/core/knowledge-transfer/SKILL.md",
230
- "description": "Verifies that a human operator actually understands a plan or a code change through restate-first probing, a why-ladder, incremental mastery gates, and a persistent comprehension checklist. Use \"explain\", \"walk me through\", \"help me understand\", \"teach me this change/plan\", or \"do I understand this?\" to trigger. Operator-facing and interactive only.",
231
- "policyCapsuleBullets": 1,
232
- "allowedTools": null,
233
- "vendor": null
234
- },
235
- {
236
- "name": "mutation-survivor-remediation",
237
- "tier": "core",
238
- "category": "core",
239
- "path": ".agents/skills/core/mutation-survivor-remediation/SKILL.md",
240
- "description": "Turn surviving mutants into killed ones. Use after a Stryker mutation run reports a leaky score, when the mutation gate regresses, or when you want to harden a specific module's tests. The mutation-score gate and baseline ratchet live in the mutation baseline kind and `stryker-runner.js`; this skill shows how to read the survivor report, pick targets, and write the test that kills each survivor without inflating the suite.",
241
- "policyCapsuleBullets": 8,
242
- "allowedTools": null,
243
- "vendor": null
244
- },
245
- {
246
- "name": "performance-optimization",
247
- "tier": "core",
248
- "category": "core",
249
- "path": ".agents/skills/core/performance-optimization/SKILL.md",
250
- "description": "Optimizes application performance. Use when performance requirements exist, when you suspect performance regressions, or when Core Web Vitals or load times need improvement. Use when profiling reveals bottlenecks that need fixing.",
251
- "policyCapsuleBullets": 10,
252
- "allowedTools": null,
253
- "vendor": null
254
- },
255
- {
256
- "name": "planning-and-task-breakdown",
257
- "tier": "core",
258
- "category": "core",
259
- "path": ".agents/skills/core/planning-and-task-breakdown/SKILL.md",
260
- "description": "Breaks work into ordered tasks. Use when you have a spec or clear requirements and need to break work into implementable tasks. Use when a task feels too large to start, when you need to estimate scope, or when parallel work is possible.",
261
- "policyCapsuleBullets": 9,
262
- "allowedTools": null,
263
- "vendor": null
264
- },
265
- {
266
- "name": "property-based-testing",
267
- "tier": "core",
268
- "category": "core",
269
- "path": ".agents/skills/core/property-based-testing/SKILL.md",
270
- "description": "Generative testing of invariants. Use when a unit has properties that should hold across a whole input domain — round-trips, idempotence, ordering, conservation — rather than a handful of hand-picked examples. The test-tier, mocking, and assertion-placement MUSTs live in `.agents/rules/testing-standards.md`; this skill shows how to find properties, pick the right per-stack library, and keep generative tests deterministic and fast.",
271
- "policyCapsuleBullets": 8,
272
- "allowedTools": null,
273
- "vendor": null
274
- },
275
145
  {
276
146
  "name": "qa-coverage-mapping",
277
147
  "tier": "core",
@@ -282,16 +152,6 @@
282
152
  "allowedTools": ["Read", "Bash"],
283
153
  "vendor": null
284
154
  },
285
- {
286
- "name": "refactoring-discipline",
287
- "tier": "core",
288
- "category": "core",
289
- "path": ".agents/skills/core/refactoring-discipline/SKILL.md",
290
- "description": "Run a post-green refactor pass that lowers CRAP and removes duplication without changing behaviour. Use after tests pass and gates are green, when a function's CRAP score is high but well-covered, or when the same logic is duplicated across files. Pairs with the `refactorer` persona and the opt-in `delivery.refactorStage` checkpoint; complements `core/code-simplification` (clarity) by focusing on the measured CRAP/duplication axes.",
291
- "policyCapsuleBullets": 9,
292
- "allowedTools": null,
293
- "vendor": null
294
- },
295
155
  {
296
156
  "name": "scope-triage",
297
157
  "tier": "core",
@@ -312,216 +172,6 @@
312
172
  "allowedTools": null,
313
173
  "vendor": null
314
174
  },
315
- {
316
- "name": "shipping-and-launch",
317
- "tier": "core",
318
- "category": "core",
319
- "path": ".agents/skills/core/shipping-and-launch/SKILL.md",
320
- "description": "Prepares production launches. Use when preparing to deploy to production. Use when you need a pre-launch checklist, when setting up monitoring, when planning a staged rollout, or when you need a rollback strategy.",
321
- "policyCapsuleBullets": 9,
322
- "allowedTools": null,
323
- "vendor": null
324
- },
325
- {
326
- "name": "spec-driven-development",
327
- "tier": "core",
328
- "category": "core",
329
- "path": ".agents/skills/core/spec-driven-development/SKILL.md",
330
- "description": "Creates specs before coding. Use when starting a new project, feature, or significant change and no specification exists yet. Use when requirements are unclear, ambiguous, or only exist as a vague idea.",
331
- "policyCapsuleBullets": 9,
332
- "allowedTools": null,
333
- "vendor": null
334
- },
335
- {
336
- "name": "test-driven-development",
337
- "tier": "core",
338
- "category": "core",
339
- "path": ".agents/skills/core/test-driven-development/SKILL.md",
340
- "description": "Drives development with tests. Use when implementing any logic, fixing any bug, or changing any behavior. The non-negotiable test-tier placement, mocking, assertion-placement, and coverage rules live in `.agents/rules/testing-standards.md`; this skill shows how to apply them via the TDD cycle, the Prove-It Pattern, and good-test style.",
341
- "policyCapsuleBullets": 10,
342
- "allowedTools": null,
343
- "vendor": null
344
- },
345
- {
346
- "name": "using-agent-skills",
347
- "tier": "core",
348
- "category": "core",
349
- "path": ".agents/skills/core/using-agent-skills/SKILL.md",
350
- "description": "Discovers and invokes agent skills. Use when starting a session or when you need to discover which skill applies to the current task. This is the meta-skill that governs how all other skills are discovered and invoked.",
351
- "policyCapsuleBullets": 9,
352
- "allowedTools": null,
353
- "vendor": null
354
- },
355
- {
356
- "name": "monorepo-path-strategist",
357
- "tier": "stack",
358
- "category": "architecture",
359
- "path": ".agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md",
360
- "description": "Enforces strict workspace package routing and dependency boundaries. Use when working in a monorepo with workspace aliases (e.g. `@repo/shared/*`, `@repo/ui/*`) and you need to prevent deep relative imports, cross-workspace contamination, or dependencies added at the wrong package.json level.",
361
- "policyCapsuleBullets": 5,
362
- "allowedTools": null,
363
- "vendor": null
364
- },
365
- {
366
- "name": "structured-output-zod",
367
- "tier": "stack",
368
- "category": "architecture",
369
- "path": ".agents/skills/stack/architecture/structured-output-zod/SKILL.md",
370
- "description": "Validates external and structured data with Zod schemas. Use when accepting untrusted input at API boundaries, validating environment variables on startup, parsing third-party responses, or generating typed shapes via `z.infer`. Parse, don't validate.",
371
- "policyCapsuleBullets": 7,
372
- "allowedTools": null,
373
- "vendor": "zod"
374
- },
375
- {
376
- "name": "subagent-orchestration",
377
- "tier": "stack",
378
- "category": "architecture",
379
- "path": ".agents/skills/stack/architecture/subagent-orchestration/SKILL.md",
380
- "description": "Coordinates complex tasks via task-isolated subagents. Use when one objective is too large for a single agent or when independent work streams should run concurrently with minimal context bleed. One objective per subagent; summarize before returning to keep the orchestrator's context window clean. Applies recursively — an orchestrator at any supported nesting depth applies the same policy to its own children.",
381
- "policyCapsuleBullets": 8,
382
- "allowedTools": null,
383
- "vendor": null
384
- },
385
- {
386
- "name": "cloudflare-hono-architect",
387
- "tier": "stack",
388
- "category": "backend",
389
- "path": ".agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md",
390
- "description": "Prevents Node.js module hallucinations in Cloudflare Worker (V8 isolate) edge environments. Use when writing Hono routes deployed to Workers — prefer Web APIs (Fetch, Web Crypto) over Node built-ins (`fs`, `path`, `child_process`, `crypto`), and access bindings via Hono's `c.env`.",
391
- "policyCapsuleBullets": 5,
392
- "allowedTools": null,
393
- "vendor": "cloudflare"
394
- },
395
- {
396
- "name": "cloudflare-queue-manager",
397
- "tier": "stack",
398
- "category": "backend",
399
- "path": ".agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md",
400
- "description": "Ensures idempotent and resilient background job execution on Cloudflare Queues. Use when writing consumer handlers — design for at-least-once delivery, wrap processing in try/catch with `message.retry()`, and order cascading deletes so the database row drops last.",
401
- "policyCapsuleBullets": 5,
402
- "allowedTools": null,
403
- "vendor": "cloudflare"
404
- },
405
- {
406
- "name": "cloudflare-workers",
407
- "tier": "stack",
408
- "category": "backend",
409
- "path": ".agents/skills/stack/backend/cloudflare-workers/SKILL.md",
410
- "description": "Builds and deploys high-performance edge logic on Cloudflare Workers. Use when working within Workers' 128MB memory and 5–50ms CPU constraints, integrating KV/R2/D1 storage, or writing Wrangler-managed edge-first request/response code.",
411
- "policyCapsuleBullets": 8,
412
- "allowedTools": null,
413
- "vendor": "cloudflare"
414
- },
415
- {
416
- "name": "highlevel-crm",
417
- "tier": "stack",
418
- "category": "backend",
419
- "path": ".agents/skills/stack/backend/highlevel-crm/SKILL.md",
420
- "description": "Integrates with the HighLevel (GoHighLevel) CRM API v2 and its automation engine. Use when synchronizing data via OAuth 2.0, building custom widgets, handling sub-account `locationId` scoping, or implementing webhook-driven workflows with rate-limit-aware retries.",
421
- "policyCapsuleBullets": 8,
422
- "allowedTools": null,
423
- "vendor": "highlevel"
424
- },
425
- {
426
- "name": "sqlite-drizzle-expert",
427
- "tier": "stack",
428
- "category": "backend",
429
- "path": ".agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md",
430
- "description": "Enforces SQLite dialect for Drizzle ORM and Turso (libSQL). Use when writing schema or queries with `drizzle-orm/sqlite-core` — avoid PostgreSQL-only types (`serial`, `jsonb`, `uuid`), use `text()` for IDs and dates, and define relations explicitly via the `relations` API.",
431
- "policyCapsuleBullets": 5,
432
- "allowedTools": null,
433
- "vendor": "drizzle"
434
- },
435
- {
436
- "name": "stripe-integration",
437
- "tier": "stack",
438
- "category": "backend",
439
- "path": ".agents/skills/stack/backend/stripe-integration/SKILL.md",
440
- "description": "Implements secure Stripe payments and subscription billing. Use when handling card data (PCI compliance via Elements/Checkout), verifying webhook signatures, attaching `idempotencyKey` to mutations, or treating the server-side webhook as the source of truth for entitlement changes.",
441
- "policyCapsuleBullets": 8,
442
- "allowedTools": null,
443
- "vendor": "stripe"
444
- },
445
- {
446
- "name": "turso-sqlite",
447
- "tier": "stack",
448
- "category": "backend",
449
- "path": ".agents/skills/stack/backend/turso-sqlite/SKILL.md",
450
- "description": "Develops with Turso's distributed SQLite (libSQL) platform. Use when working with the `@libsql/client` driver — leverage edge replicas for low-latency reads, route writes to the primary, and use parameterized queries plus a versioned migration tool (drizzle-kit, atlas) for schema changes.",
451
- "policyCapsuleBullets": 6,
452
- "allowedTools": null,
453
- "vendor": "turso"
454
- },
455
- {
456
- "name": "astro-react-island-strategist",
457
- "tier": "stack",
458
- "category": "frontend",
459
- "path": ".agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md",
460
- "description": "Maintains strict boundaries between Astro server components and React client islands in hybrid Astro/React workspaces. Use when keeping `.astro` files for static HTML/SEO and `.tsx` for interactive islands — embed React only with explicit `client:*` directives and pass serializable props.",
461
- "policyCapsuleBullets": 5,
462
- "allowedTools": null,
463
- "vendor": "astro"
464
- },
465
- {
466
- "name": "astro",
467
- "tier": "stack",
468
- "category": "frontend",
469
- "path": ".agents/skills/stack/frontend/astro/SKILL.md",
470
- "description": "Builds ultra-fast content-driven websites with Astro. Use when defaulting to SSG, opting into SSR only for dynamic data, picking the most restrictive `client:*` hydration directive, leveraging Server Islands (`server:defer`), Astro Actions for type-safe mutations, and the Content Layer with Zod- validated collections.",
471
- "policyCapsuleBullets": 8,
472
- "allowedTools": null,
473
- "vendor": "astro"
474
- },
475
- {
476
- "name": "expo-react-native-developer",
477
- "tier": "stack",
478
- "category": "frontend",
479
- "path": ".agents/skills/stack/frontend/expo-react-native-developer/SKILL.md",
480
- "description": "Prevents DOM element usage in React Native (Expo) workspaces. Use when writing components for Expo apps — `<View>`, `<Text>`, `<TouchableOpacity>` instead of `<div>`/`<span>`/`<p>`, no `window`/`document`, and styling through the project's established solution.",
481
- "policyCapsuleBullets": 5,
482
- "allowedTools": null,
483
- "vendor": "expo"
484
- },
485
- {
486
- "name": "google-analytics-v4",
487
- "tier": "stack",
488
- "category": "frontend",
489
- "path": ".agents/skills/stack/frontend/google-analytics-v4/SKILL.md",
490
- "description": "Implements privacy-compliant event tracking with Google Analytics 4. Use when wiring analytics that must comply with GDPR/CCPA via Consent Mode V2 — `snake_case` event names, no PII to GA servers, GTM-driven event firing, and DebugView verification before deploy.",
491
- "policyCapsuleBullets": 8,
492
- "allowedTools": null,
493
- "vendor": "google"
494
- },
495
- {
496
- "name": "tailwind-v4",
497
- "tier": "stack",
498
- "category": "frontend",
499
- "path": ".agents/skills/stack/frontend/tailwind-v4/SKILL.md",
500
- "description": "Implements maintainable styling with Tailwind CSS v4. Use when writing styles in v4 projects — CSS-first configuration via `@theme` blocks (never `tailwind.config.ts/js`), mobile-first breakpoints, full class names (no string interpolation), and no arbitrary `p-[13px]`-style values.",
501
- "policyCapsuleBullets": 8,
502
- "allowedTools": null,
503
- "vendor": "tailwind"
504
- },
505
- {
506
- "name": "ui-accessibility-engineer",
507
- "tier": "stack",
508
- "category": "frontend",
509
- "path": ".agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md",
510
- "description": "Enforces mobile-first Tailwind CSS and strict WCAG 2.1 AA compliance for user-facing UI. Use when building UI components — utility classes only (no custom CSS or inline `style={{}}`), mobile-first breakpoints, visible focus states, alt text, and 4.5:1 contrast.",
511
- "policyCapsuleBullets": 7,
512
- "allowedTools": null,
513
- "vendor": "tailwind"
514
- },
515
- {
516
- "name": "audit-accessibility",
517
- "tier": "stack",
518
- "category": "qa",
519
- "path": ".agents/skills/stack/qa/audit-accessibility/SKILL.md",
520
- "description": "Audits sites and apps for WCAG 2.1 Level AA compliance using automated and manual testing tools. Use when running an accessibility audit or building a remediation plan — semantic HTML, contrast, focus management, keyboard reachability, and axe-core integration in Vitest/Playwright.",
521
- "policyCapsuleBullets": 8,
522
- "allowedTools": null,
523
- "vendor": null
524
- },
525
175
  {
526
176
  "name": "gherkin-authoring",
527
177
  "tier": "stack",
@@ -532,16 +182,6 @@
532
182
  "allowedTools": null,
533
183
  "vendor": null
534
184
  },
535
- {
536
- "name": "lighthouse-baseline",
537
- "tier": "stack",
538
- "category": "qa",
539
- "path": ".agents/skills/stack/qa/lighthouse-baseline/SKILL.md",
540
- "description": "Codifies the capture-and-check baseline pattern for long-running quality signals (Lighthouse scores, bundle size, p95 latency, runtime memory). Use when wiring a new metric that needs a baseline file, paired :capture / :check npm scripts, a tolerance-bounded gate, and a weekly refresh cadence — the goal is a hard CI signal that ratchets only with intent.",
541
- "policyCapsuleBullets": 8,
542
- "allowedTools": null,
543
- "vendor": null
544
- },
545
185
  {
546
186
  "name": "playwright-bdd",
547
187
  "tier": "stack",
@@ -591,16 +231,6 @@
591
231
  "policyCapsuleBullets": 8,
592
232
  "allowedTools": null,
593
233
  "vendor": "vitest"
594
- },
595
- {
596
- "name": "backend-security-patterns",
597
- "tier": "stack",
598
- "category": "security",
599
- "path": ".agents/skills/stack/security/backend-security-patterns/SKILL.md",
600
- "description": "Combined backend protocols for authentication (Clerk JWT verification) and PII-safe observability. Use when handling auth on the server, verifying Clerk webhooks via `svix`, scoping metadata via `publicMetadata`/ `privateMetadata`, or sanitizing logs to keep emails, tokens, and request bodies out of telemetry.",
601
- "policyCapsuleBullets": 8,
602
- "allowedTools": null,
603
- "vendor": "clerk"
604
234
  }
605
235
  ]
606
236
  }
@@ -32,7 +32,7 @@ reference) before routing:
32
32
 
33
33
  | Input | Route |
34
34
  | --- | --- |
35
- | Exactly one `type::epic` ID | **Epic path** — run [`helpers/deliver-epic.md`](helpers/deliver-epic.md) Phases 1–9 unchanged (single-segment plan; no confirmation prompt). |
35
+ | Exactly one `type::epic` ID | **Epic path** — resolve the Epic's delivery route (see [Epic delivery-route resolution](#epic-delivery-route-resolution) below), then run the selected helper's phases unchanged (single-segment plan; no confirmation prompt). |
36
36
  | One or more `type::story` IDs, none carrying an `Epic: #N` reference | **Standalone path** — run [`helpers/deliver-stories.md`](helpers/deliver-stories.md) Phases 0–3 (single-segment plan; no confirmation prompt). |
37
37
  | Any combination of ≥1 `type::epic` IDs and ≥0 standalone `type::story` IDs | **Segment plan** — compose and execute the sequential segment plan below. |
38
38
  | Any Story carrying an `Epic: #N` reference (alone or mixed into an otherwise-valid set) | **Error**, naming every affected ID and the fix: `Story #<id> belongs to Epic #<n> — run /deliver <n>`. |
@@ -40,6 +40,45 @@ reference) before routing:
40
40
  Per-ID classification is unchanged: fetch the `type::*` label and probe the
41
41
  body for an `Epic: #N` reference before routing. Never guess a route.
42
42
 
43
+ ## Epic delivery-route resolution
44
+
45
+ Every `type::epic` segment resolves to one of two delivery shapes before its
46
+ helper runs. The routing is a pure function of the Epic's labels, its
47
+ `epic-plan-state` checkpoint, and the config kill-switch — implemented in
48
+ [`lib/orchestration/deliver-route.js`](../scripts/lib/orchestration/deliver-route.js)
49
+ (`resolveEpicDeliveryRoute(epic, checkpoint, config)`), mirroring how the
50
+ code-review depth resolver reads `planningRisk`/`decompose` off the same
51
+ checkpoint. Fetch the Epic's labels and read its `epic-plan-state` structured
52
+ comment, then apply the precedence (highest wins):
53
+
54
+ 1. **Kill-switch — overrides all.** `delivery.routing.singleDelivery === false`
55
+ (default `true`, read via `getDeliveryRouting`) forces **fan-out** for
56
+ *every* Epic, even a single-marked one. This is the instant, per-consumer
57
+ global revert that ships before the default flips — no code rollback, no
58
+ re-plan.
59
+ 2. **Single marker → single route.** The `delivery::single` label (primary)
60
+ **or** `decompose.shape === "single"` on the checkpoint (secondary). A
61
+ spec-only plan authored no Story tree; its `## Delivery Slicing` table is
62
+ the audit trail.
63
+ 3. **No marker → fan-out.** A legacy Epic (no marker, an authored Story tree)
64
+ or a genuinely-wide DAG. Deliver-time width only *advises* — it never
65
+ reroutes a single-marked Epic (that would orphan a tree that does not
66
+ exist; re-route = re-plan).
67
+
68
+ **Route dispatch.**
69
+
70
+ - **`fan-out`** → run [`helpers/deliver-epic.md`](helpers/deliver-epic.md)
71
+ Phases 1–9 unchanged (the wave loop fanning out per-Story sub-agents).
72
+ - **`single`** → run
73
+ [`helpers/deliver-epic-single.md`](helpers/deliver-epic-single.md) (the
74
+ live flip, M4-B): a one-worktree in-session slice walk (prepare `--single` →
75
+ ordered `## Delivery Slicing` walk on `epic/<id>` → per-AC-cluster
76
+ acceptance critics) that **reuses `helpers/deliver-epic.md` Phases 3–9
77
+ byte-for-byte** for the merge tail. This is now the **default** shape for a
78
+ single-marked Epic. The kill-switch (`delivery.routing.singleDelivery=false`)
79
+ still forces this verdict back to `fan-out` — an instant global revert with
80
+ no code rollback.
81
+
43
82
  ## Segment plan (mixed / multi-Epic input)
44
83
 
45
84
  When the supplied IDs span more than one Epic, or mix Epics with standalone
@@ -54,9 +93,13 @@ Stories, the router composes a **segment plan** and executes the segments
54
93
  Phase 7.0 base-sync then integrates those merges naturally instead of
55
94
  the Epic PR opening behind base.
56
95
  2. **Epic segments in input order**: each `type::epic` ID forms its own
57
- segment, delivered via
58
- [`helpers/deliver-epic.md`](helpers/deliver-epic.md) Phases 1–9
59
- unchanged.
96
+ segment. Resolve its delivery route (see [Epic delivery-route
97
+ resolution](#epic-delivery-route-resolution)) and run the selected helper
98
+ unchanged — the `fan-out` route dispatches
99
+ [`helpers/deliver-epic.md`](helpers/deliver-epic.md) Phases 1–9, the
100
+ `single` route dispatches
101
+ [`helpers/deliver-epic-single.md`](helpers/deliver-epic-single.md) (which
102
+ reuses that helper's Phases 3–9 for the merge tail).
60
103
 
61
104
  Sequential execution is a deliberate design decision: the Epic path assumes
62
105
  a single main checkout (prepare's checkout guard, Phase 7.0
@@ -33,20 +33,45 @@ per-criterion, mid-delivery, and evaluates the actual work product.
33
33
  ## Per round
34
34
 
35
35
  1. **Eval pass (fresh context, independent of the author).** Run a **separate
36
- critic pass** — a fresh-context sub-agent (`Agent` tool,
37
- `subagent_type: general-purpose`), *not* a continuation of your implementing
38
- turn — so the evaluator does not grade its own homework.
36
+ critic pass** — a fresh-context sub-agent (`Agent` tool), *not* a
37
+ continuation of your implementing turn so the evaluator does not grade its
38
+ own homework.
39
39
 
40
- > **Inline-critic fallback (nesting-absent harness).** Dispatching the
41
- > critic as a nested `Agent` is the preferred shape — it gives genuine
42
- > fresh-context isolation and works on any harness that carries `Agent`
43
- > into sub-agents (Claude Code ≥ 2.1.202; see
44
- > [#2870](https://github.com/dsj1984/mandrel/issues/2870)). This eval loop
45
- > itself runs inside a Story delivery sub-agent, so the nested critic sits
46
- > at nesting depth 2. If the host does **not** support nested `Agent`
47
- > dispatch at that depth — the tool is absent, or a spawn attempt returns
48
- > an unsupported-capability error — do **not** stall the Story. Fall back
49
- > to authoring the verdict **inline**: in a deliberately scoped,
40
+ > **Sub-agent type + risk-routed ceremony (Epic #4478, M7-B).** When
41
+ > `delivery.routing.roleScopedAgents` is enabled (the **default**), dispatch
42
+ > the critic with `subagent_type: acceptance-critic` it boots on the
43
+ > role-scoped [`acceptance-critic`](../../agents/acceptance-critic.md) context
44
+ > (its own system prompt, no `CLAUDE.md` @-closure) that carries the
45
+ > maker-blind invariant and the verdict schema standalone. When the
46
+ > kill-switch is **off** (`roleScopedAgents: false`), fall back to
47
+ > `subagent_type: general-purpose`.
48
+ >
49
+ > **Whether to spawn fresh at all is risk-routed** (mirrors the risk
50
+ > review-depth and risk → audit-lens routers). Resolve it per cluster with
51
+ > `resolveCeremonyForRisk` from
52
+ > [`ceremony-routing.js`](../../scripts/lib/orchestration/ceremony-routing.js)
53
+ > using the Epic's `planningRisk.overallLevel` and
54
+ > `delivery.routing.freshCriticSampleRate`:
55
+ > **`high`/`medium` risk → `fresh`** (spawn the critic); **`low` risk →
56
+ > `inline`** (the contract-identical inline fallback below), **except** the
57
+ > `freshCriticSampleRate` fraction of low-risk clusters the sampling floor
58
+ > forces `fresh` so low risk never means zero independent checking; **missing
59
+ > / unknown risk → `fresh` + full ceremony** (fail-safe). This chooses
60
+ > fresh-vs-inline **per cluster only — it never changes the cluster count**.
61
+ >
62
+ > **Inline-critic path (low-risk-routed OR nesting-absent harness).** The
63
+ > verdict is authored **inline** whenever the risk router above resolves to
64
+ > `inline` (a low-risk cluster not caught by the sampling floor), and also as
65
+ > a **fallback** on any harness that cannot spawn the fresh critic.
66
+ > Dispatching the critic as a nested `Agent` is the fresh-context shape and
67
+ > works on any harness that carries `Agent` into sub-agents (Claude Code ≥
68
+ > 2.1.202; see [#2870](https://github.com/dsj1984/mandrel/issues/2870)). This
69
+ > eval loop itself runs inside a Story delivery sub-agent, so the nested
70
+ > critic sits at nesting depth 2. If the host does **not** support nested
71
+ > `Agent` dispatch at that depth — the tool is absent, or a spawn attempt
72
+ > returns an unsupported-capability error — do **not** stall the Story
73
+ > regardless of the risk verdict. Author the verdict **inline**: in a
74
+ > deliberately scoped,
50
75
  > self-critical pass (re-read only the diff, the `acceptance[]` /
51
76
  > `verify[]` arrays, and the `verify[]` command output — treat the
52
77
  > implementation reasoning as untrusted and score against the criteria