@event4u/agent-config 16.0.0 → 16.1.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 (246) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +297 -137
  5. package/CONTRIBUTING.md +9 -0
  6. package/README.md +2 -2
  7. package/dist/agent-src/commands/analyze/inbox.md +26 -0
  8. package/dist/agent-src/commands/analyze/roadmap-repos.md +27 -0
  9. package/dist/agent-src/commands/challenge-me/closure.md +178 -0
  10. package/dist/agent-src/commands/challenge-me.md +9 -2
  11. package/dist/agent-src/commands/council/default.md +25 -5
  12. package/dist/agent-src/commands/feature/plan.md +28 -1
  13. package/dist/agent-src/commands/feature/roadmap.md +28 -1
  14. package/dist/agent-src/commands/implement-ticket.md +27 -0
  15. package/dist/agent-src/commands/jira-ticket.md +27 -0
  16. package/dist/agent-src/commands/pr/create.md +29 -0
  17. package/dist/agent-src/commands/pr/merge.md +60 -9
  18. package/dist/agent-src/commands/roadmap/ai-council.md +7 -1
  19. package/dist/agent-src/commands/roadmap/create.md +74 -27
  20. package/dist/agent-src/commands/roadmap/materialize.md +27 -0
  21. package/dist/agent-src/commands/roadmap/process-full.md +123 -18
  22. package/dist/agent-src/commands/team.md +22 -0
  23. package/dist/agent-src/contexts/authority/scope-growth-ownership.md +80 -0
  24. package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +47 -0
  25. package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +44 -3
  26. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +15 -15
  27. package/dist/agent-src/contexts/execution/decision-closure-execution.md +93 -0
  28. package/dist/agent-src/contexts/execution/fix-loop-ladder.md +108 -0
  29. package/dist/agent-src/contexts/execution/plan-confidence-gate.md +4 -2
  30. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +75 -6
  31. package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
  32. package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
  33. package/dist/agent-src/guidelines/design-fidelity-routing.md +29 -0
  34. package/dist/agent-src/rules/autonomous-execution.md +15 -8
  35. package/dist/agent-src/rules/delegation-policy.md +23 -45
  36. package/dist/agent-src/rules/design-fidelity.md +32 -37
  37. package/dist/agent-src/rules/evaluator-independence.md +43 -49
  38. package/dist/agent-src/rules/test-first.md +41 -0
  39. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
  40. package/dist/agent-src/skills/ai-council/SKILL.md +11 -3
  41. package/dist/agent-src/skills/api-design/data/manifest.json +3 -3
  42. package/dist/agent-src/skills/database/data/manifest.json +4 -4
  43. package/dist/agent-src/skills/database/data/query-tuning.csv +3 -3
  44. package/dist/agent-src/skills/design-review/SKILL.md +50 -0
  45. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +14 -4
  46. package/dist/agent-src/skills/experiment-loop/SKILL.md +31 -1
  47. package/dist/agent-src/skills/roadmap-writing/SKILL.md +1 -1
  48. package/dist/agent-src/skills/storybook-workshop/SKILL.md +42 -3
  49. package/dist/agent-src/skills/threat-modeling/SKILL.md +9 -4
  50. package/dist/agent-src/skills/threat-modeling/data/manifest.json +4 -4
  51. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +37 -3
  52. package/dist/agent-src/templates/agent-settings.md +1 -1
  53. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  54. package/dist/agent-src/templates/roadmaps.md +188 -0
  55. package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
  56. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
  57. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -0
  58. package/dist/cli-delegate/check_update_banner.js +40 -2
  59. package/dist/cli-delegate/chunk-4E2W63DA.js +335 -0
  60. package/dist/cli-delegate/chunk-5R7HOLAF.js +99 -0
  61. package/dist/cli-delegate/{chunk-IVBPRCQO.js → chunk-6KFEC3G7.js} +1 -1
  62. package/dist/cli-delegate/{chunk-2TAQ2K4V.js → chunk-6KM6ORRY.js} +55 -386
  63. package/dist/cli-delegate/{chunk-2XY7ILBT.js → chunk-FC75PGJE.js} +42 -2
  64. package/dist/cli-delegate/{chunk-GYC3VRYN.js → chunk-FXYUYU4N.js} +57 -13
  65. package/dist/cli-delegate/{chunk-55ACLDUE.js → chunk-GJCBB2UG.js} +168 -10
  66. package/dist/cli-delegate/{chunk-AK6HODNQ.js → chunk-HDVVGPQW.js} +873 -539
  67. package/dist/cli-delegate/{chunk-H32DGUJH.js → chunk-P6ZHP5W2.js} +1 -1
  68. package/dist/cli-delegate/{chunk-57PN4GYJ.js → chunk-RGNIWTEA.js} +1 -1
  69. package/dist/cli-delegate/chunk-ROYYTEZU.js +39 -0
  70. package/dist/cli-delegate/{chunk-3FKR64R5.js → chunk-UNCRJBT3.js} +31 -7
  71. package/dist/cli-delegate/{chunk-2DK2VJWG.js → chunk-WGXTVKCQ.js} +20 -6
  72. package/dist/cli-delegate/chunk-YDPILCOL.js +152 -0
  73. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  74. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  75. package/dist/cli-delegate/cmd_conformance.js +90 -56
  76. package/dist/cli-delegate/cmd_doctor.js +7 -5
  77. package/dist/cli-delegate/cmd_explain.js +2 -2
  78. package/dist/cli-delegate/cmd_export.js +9 -7
  79. package/dist/cli-delegate/cmd_fleet.js +4 -2
  80. package/dist/cli-delegate/cmd_handoff.js +4 -4
  81. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  82. package/dist/cli-delegate/cmd_migrate.js +2 -2
  83. package/dist/cli-delegate/cmd_packs_active.js +2 -2
  84. package/dist/cli-delegate/cmd_preflight.js +4 -2
  85. package/dist/cli-delegate/cmd_prune.js +10 -8
  86. package/dist/cli-delegate/cmd_route_audit.js +2 -2
  87. package/dist/cli-delegate/cmd_route_explain.js +1 -1
  88. package/dist/cli-delegate/cmd_session_recycle.js +2 -2
  89. package/dist/cli-delegate/cmd_settings_get.js +28 -2
  90. package/dist/cli-delegate/cmd_settings_migrate.js +9 -7
  91. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  92. package/dist/cli-delegate/cmd_sync.js +10 -8
  93. package/dist/cli-delegate/cmd_uninstall.js +16 -13
  94. package/dist/cli-delegate/cmd_update.js +1 -1
  95. package/dist/cli-delegate/cmd_upgrade.js +1 -1
  96. package/dist/cli-delegate/cmd_validate.js +12 -10
  97. package/dist/cli-delegate/cmd_versions.js +1 -1
  98. package/dist/discovery/deprecation-report.md +1 -1
  99. package/dist/discovery/discovery-manifest.json +85 -38
  100. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  101. package/dist/discovery/discovery-manifest.summary.md +4 -4
  102. package/dist/discovery/dormancy-report.md +1 -1
  103. package/dist/discovery/orphan-report.md +1 -1
  104. package/dist/discovery/packs.json +10 -8
  105. package/dist/discovery/trust-report.md +3 -3
  106. package/dist/discovery/workspaces.json +8 -6
  107. package/dist/hooks/dispatch.js +1832 -1007
  108. package/dist/install/claudeRuleRewrite.js +14 -3
  109. package/dist/install/conflict.js +60 -10
  110. package/dist/install/conflictTracker.js +218 -0
  111. package/dist/install/fsPrimitives.js +54 -0
  112. package/dist/install/install.mjs +2007 -1481
  113. package/dist/install/manifestFiles.js +259 -0
  114. package/dist/install/preflight.js +14 -2
  115. package/dist/install/preserve.js +157 -0
  116. package/dist/install/recordedOwnership.js +132 -0
  117. package/dist/install/txlog.js +11 -2
  118. package/dist/mcp/registry-manifest.json +3 -3
  119. package/dist/mcp/server.json +2 -2
  120. package/dist/mcp/server.mjs +398 -39
  121. package/dist/router.json +1 -1
  122. package/dist/scripts/_lib/agent_settings.js +3 -2
  123. package/dist/scripts/_lib/fs_atomic.js +167 -0
  124. package/dist/scripts/_lib/installed_tools.js +460 -0
  125. package/dist/scripts/_lib/lean_projection_mode.js +3 -2
  126. package/dist/scripts/_lib/settings_renamed_keys.js +78 -0
  127. package/dist/server/routes/install.js +8 -0
  128. package/dist/server/routes/wizard.js +9 -3
  129. package/dist/server/schemas/settings.js +17 -5
  130. package/dist/shared/missionExecution.js +97 -0
  131. package/dist/ui/assets/{index-D0jaCRPM.js → index-DH1xc62v.js} +17 -17
  132. package/dist/ui/index.html +1 -1
  133. package/docs/MIGRATION.md +103 -0
  134. package/docs/contracts/settings-classes.md +26 -7
  135. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
  136. package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
  137. package/docs/guidelines/design-fidelity-routing.md +29 -0
  138. package/package.json +1 -1
  139. package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
  140. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
  141. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -0
  142. package/src/config/agent-settings.template.yml +139 -27
  143. package/src/config/auto-rule-budget.json +16 -0
  144. package/src/config/ci-local-parity.yml +18 -5
  145. package/src/config/continuity-surface.json +21 -0
  146. package/src/config/gate-coverage.yml +146 -13
  147. package/src/config/gate-violation-baselines.json +6 -6
  148. package/src/config/hook-token-budget.json +2 -0
  149. package/src/config/loop-surfaces.yaml +215 -0
  150. package/src/config/platform-anchor.json +3 -2
  151. package/src/config/release-gate-locality.yml +11 -0
  152. package/src/config/routing-coverage-seed.json +18 -4
  153. package/src/config/rule-enforcement-baseline.json +0 -1
  154. package/src/install/claudeRuleRewrite.ts +16 -2
  155. package/src/install/conflict.ts +65 -9
  156. package/src/install/conflictTracker.ts +299 -0
  157. package/src/install/fsPrimitives.ts +54 -0
  158. package/src/install/manifestFiles.ts +312 -0
  159. package/src/install/preflight.ts +16 -2
  160. package/src/install/preserve.ts +205 -0
  161. package/src/install/recordedOwnership.ts +149 -0
  162. package/src/install/txlog.ts +11 -2
  163. package/src/install/types.ts +19 -4
  164. package/src/scripts/_cli/cmd_conformance.ts +88 -15
  165. package/src/scripts/_cli/cmd_doctor.ts +4 -3
  166. package/src/scripts/_cli/cmd_route_explain.ts +9 -2
  167. package/src/scripts/_cli/cmd_settings_get.ts +44 -0
  168. package/src/scripts/_cli/doctor_execution.ts +90 -0
  169. package/src/scripts/_lib/activation_payload.ts +247 -0
  170. package/src/scripts/_lib/agent_settings.ts +4 -2
  171. package/src/scripts/_lib/authority_path.ts +102 -0
  172. package/src/scripts/_lib/cascade_base.ts +94 -0
  173. package/src/scripts/_lib/changelog_eras.ts +7 -2
  174. package/src/scripts/_lib/continuation_ladder.ts +149 -2
  175. package/src/scripts/_lib/council_transport.ts +129 -0
  176. package/src/scripts/_lib/delivery_ready.ts +112 -0
  177. package/src/scripts/_lib/forge_protection.ts +267 -0
  178. package/src/scripts/_lib/hook_platform_keys.ts +27 -0
  179. package/src/scripts/_lib/json_python_parity.ts +127 -0
  180. package/src/scripts/_lib/lean_projection_mode.ts +14 -3
  181. package/src/scripts/_lib/loop_surfaces.ts +382 -0
  182. package/src/scripts/_lib/mission_record.ts +190 -0
  183. package/src/scripts/_lib/obligation_frequency.ts +217 -0
  184. package/src/scripts/_lib/obligations.ts +402 -0
  185. package/src/scripts/_lib/orchestration_record.ts +11 -20
  186. package/src/scripts/_lib/release_highlights.ts +199 -10
  187. package/src/scripts/_lib/release_holds.ts +493 -0
  188. package/src/scripts/_lib/release_migration_gate.ts +184 -0
  189. package/src/scripts/_lib/rides_along.ts +102 -0
  190. package/src/scripts/_lib/settings_renamed_keys.ts +82 -0
  191. package/src/scripts/_lib/test_delta.ts +166 -0
  192. package/src/scripts/_lib/test_provenance.ts +171 -0
  193. package/src/scripts/_lib/typed_op_grant.ts +246 -0
  194. package/src/scripts/_lib/typed_op_watch.ts +185 -0
  195. package/src/scripts/ai_council/config.ts +8 -11
  196. package/src/scripts/ai_council/fallback_config.ts +5 -3
  197. package/src/scripts/ai_council/ownership_classes.ts +118 -0
  198. package/src/scripts/ask_block_census.ts +285 -15
  199. package/src/scripts/check_enforcement_matrix.ts +624 -0
  200. package/src/scripts/check_gate_reachability.ts +173 -10
  201. package/src/scripts/check_generator_sync.ts +954 -0
  202. package/src/scripts/check_preamble_payload_budget.ts +75 -2
  203. package/src/scripts/check_release_highlights.ts +33 -1
  204. package/src/scripts/check_release_holds.ts +567 -0
  205. package/src/scripts/check_rule_projection_integrity.ts +22 -12
  206. package/src/scripts/check_test_delta.ts +294 -0
  207. package/src/scripts/check_test_weakening.ts +299 -0
  208. package/src/scripts/closure_scan.ts +333 -0
  209. package/src/scripts/compile_hook_manifest.ts +43 -3
  210. package/src/scripts/council_record_shape.ts +209 -0
  211. package/src/scripts/hook_manifest.json +1 -1
  212. package/src/scripts/hook_manifest.yaml +88 -9
  213. package/src/scripts/hooks/concern_registry.ts +4 -0
  214. package/src/scripts/hooks/design_pass_hook.ts +128 -3
  215. package/src/scripts/hooks/evidence_independence.ts +96 -0
  216. package/src/scripts/hooks/memory_recall_hook.ts +540 -0
  217. package/src/scripts/hooks/obligation_settle_hook.ts +182 -0
  218. package/src/scripts/hooks/rule_inject_hook.ts +49 -1
  219. package/src/scripts/hooks/run_continuation_hook.ts +17 -20
  220. package/src/scripts/hooks_doctor.ts +85 -0
  221. package/src/scripts/hooks_status.ts +19 -0
  222. package/src/scripts/install.ts +106 -206
  223. package/src/scripts/janitor.ts +7 -0
  224. package/src/scripts/lint_decision_classes.ts +464 -0
  225. package/src/scripts/lint_hook_manifest.ts +11 -0
  226. package/src/scripts/lint_major_migration_sections.ts +450 -0
  227. package/src/scripts/lint_plan_risk_register.ts +47 -3
  228. package/src/scripts/lint_roadmap_blockers.ts +61 -0
  229. package/src/scripts/lint_roadmap_producers.ts +202 -0
  230. package/src/scripts/measure_rule_budget.ts +101 -5
  231. package/src/scripts/new_roadmap.ts +37 -0
  232. package/src/scripts/orchestration_record.ts +0 -5
  233. package/src/scripts/release.ts +14 -98
  234. package/src/scripts/release_drill.ts +267 -1
  235. package/src/scripts/release_publication.ts +51 -0
  236. package/src/scripts/report_enforcement_drift.ts +566 -0
  237. package/src/scripts/report_host_injection_effect.ts +3 -11
  238. package/src/scripts/report_standing_payload_by_host.ts +26 -152
  239. package/src/scripts/schemas/agent-settings.schema.json +23 -0
  240. package/src/scripts/schemas/command.schema.json +4 -0
  241. package/src/scripts/scope_growth.ts +219 -0
  242. package/src/scripts/trigger_eval_grandfather.json +0 -1
  243. package/src/scripts/ui_conformance_probe.ts +622 -0
  244. package/src/server/schemas/settings.ts +31 -7
  245. package/src/shared/missionExecution.ts +126 -0
  246. package/dist/cli-delegate/chunk-523HCFYO.js +0 -90
package/CONTRIBUTING.md CHANGED
@@ -101,6 +101,15 @@ task lint-skills # ./scripts-run src/scripts/skill_linter --all
101
101
  - Keep commits focused. Split mechanical renames from logic changes.
102
102
  - Open the PR against `main` with a short description of the change,
103
103
  motivation, and any notes for reviewers.
104
+ - **Fixed a diagnosed, non-deterministic CI flake with a reusable root cause?**
105
+ Add a `Flake-diagnosis:` trailer to the fixing commit's body naming the
106
+ class in a few words, e.g. `Flake-diagnosis: gitignored-dir-watch-scope |
107
+ parallel writes to an unrelated ignored dir trip a whole-worktree witness`.
108
+ Scope it narrowly — a diagnosed, non-deterministic failure whose root cause
109
+ could plausibly recur, never a deterministic bug or an unexplained one — so
110
+ the convention stays a one-line note, not a registry. Search prior
111
+ diagnoses with `git log --all --grep="Flake-diagnosis:"` before
112
+ re-investigating a failure shape from scratch.
104
113
 
105
114
  ### Branch names, PR text and commit messages are a gated surface
106
115
 
package/README.md CHANGED
@@ -4,9 +4,9 @@
4
4
 
5
5
  [![Smoke](https://github.com/event4u-app/agent-config/actions/workflows/smoke.yml/badge.svg)](https://github.com/event4u-app/agent-config/actions/workflows/smoke.yml) [![Public install smoke (3 OS × 2 Node)](https://github.com/event4u-app/agent-config/actions/workflows/smoke-public-install.yml/badge.svg)](https://github.com/event4u-app/agent-config/actions/workflows/smoke-public-install.yml) [![npm](https://img.shields.io/npm/v/@event4u/agent-config?style=flat-square&label=npm&color=orange)](https://www.npmjs.com/package/@event4u/agent-config) [![agent-config MCP server](https://glama.ai/mcp/servers/event4u-app/agent-config/badges/score.svg)](https://glama.ai/mcp/servers/event4u-app/agent-config) [![MCP Toplist](https://mcptoplist.com/badge/glama%2Fevent4u-app%2Fagent-config.svg)](https://mcptoplist.com/server/glama%2Fevent4u-app%2Fagent-config)
6
6
 
7
- [![Skills](https://img.shields.io/badge/Skills-299-orange?style=flat-square)](dist/agent-src/skills/) [![Rules](https://img.shields.io/badge/Rules-120-orange?style=flat-square)](dist/agent-src/rules/) [![Commands](https://img.shields.io/badge/Commands-202-orange?style=flat-square)](dist/agent-src/commands/) [![Guidelines](https://img.shields.io/badge/Guidelines-121-orange?style=flat-square)](docs/guidelines/) [![Personas](https://img.shields.io/badge/Personas-29-orange?style=flat-square)](dist/agent-src/personas/) [![Advisors](https://img.shields.io/badge/Advisors-5-orange?style=flat-square)](dist/agent-src/personas/advisors/) <!-- claim:published-artifact-counts -->
7
+ [![Skills](https://img.shields.io/badge/Skills-299-orange?style=flat-square)](dist/agent-src/skills/) [![Rules](https://img.shields.io/badge/Rules-121-orange?style=flat-square)](dist/agent-src/rules/) [![Commands](https://img.shields.io/badge/Commands-203-orange?style=flat-square)](dist/agent-src/commands/) [![Guidelines](https://img.shields.io/badge/Guidelines-121-orange?style=flat-square)](docs/guidelines/) [![Personas](https://img.shields.io/badge/Personas-29-orange?style=flat-square)](dist/agent-src/personas/) [![Advisors](https://img.shields.io/badge/Advisors-5-orange?style=flat-square)](dist/agent-src/personas/advisors/) <!-- claim:published-artifact-counts -->
8
8
 
9
- <sub>**How these are counted** — one canonical counter, `agent-config` → `update_counts --check`, re-derives all six from the tree and fails CI on a drift of one. Two bases are not what the linked directory shows, so they are stated here rather than left to be inferred: **Commands 202** counts every command file **recursively** (the linked directory holds 61 at its top level), and **Rules 120** counts the **source** rules while the linked projection holds 119 — one rule is dormant and is not projected. **Personas 29** excludes the directory README. Counts are of files and directories: none of them measures quality, activation, or adoption. <!-- claim:published-artifact-counts --></sub>
9
+ <sub>**How these are counted** — one canonical counter, `agent-config` → `update_counts --check`, re-derives all six from the tree and fails CI on a drift of one. Two bases are not what the linked directory shows, so they are stated here rather than left to be inferred: **Commands 202** counts every command file **recursively** (the linked directory holds 61 at its top level), and **Rules 121** counts the **source** rules while the linked projection holds 120 — one rule is dormant and is not projected. **Personas 29** excludes the directory README. Counts are of files and directories: none of them measures quality, activation, or adoption. <!-- claim:published-artifact-counts --></sub>
10
10
 
11
11
  **Try it in 30 seconds** — drop one read-only subagent into any repo and watch it gate "done": `@production-validator check this branch is actually done`. No wizard, no lock-in, nothing else installed — the [30-second wedge ↓](#quickstart) is the whole first step. Start at the proof, not the catalog: **[event4u-app.github.io/agent-config/proof/](https://event4u-app.github.io/agent-config/proof/)**.
12
12
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  model_tier: high
3
3
  name: analyze-inbox
4
+ produces_roadmap: true
4
5
  pack: analysis-workbench
5
6
  visibility: internal
6
7
  sub: inbox
@@ -1177,3 +1178,28 @@ prompted this section could not be given.
1177
1178
  orchestrator.
1178
1179
  - Collapse a multi-topic round into fewer artifacts than it had topics without
1179
1180
  saying, per topic, where its content went.
1181
+ ## Closure — the last step, always
1182
+
1183
+ ```
1184
+ THIS COMMAND PRODUCES A ROADMAP, SO IT ENDS IN CLOSURE.
1185
+ NEVER HAND BACK A PLAN CARRYING A DECISION PLANNING COULD HAVE CLOSED.
1186
+ ```
1187
+
1188
+ Declared by `produces_roadmap: true` in the frontmatter and enforced by
1189
+ `lint_roadmap_producers`: a producer that does not end here reds CI.
1190
+
1191
+ Read `planning.closure_pass` (missing = `true`). When active, run
1192
+ [`/challenge-me closure`](../../../meta/challenge-me/closure/command.md) on the
1193
+ roadmap this command just produced, before handing back:
1194
+
1195
+ ```bash
1196
+ ./scripts-run src/scripts/closure_scan <roadmap-path>
1197
+ ```
1198
+
1199
+ Every detected decision is resolved at the lowest rung that owns it and written
1200
+ into the roadmap's `## Decisions` table. Owner-owned residue is asked **now**,
1201
+ one question per turn, and its answer recorded — never handed back as *"the
1202
+ open questions are in the file"*.
1203
+
1204
+ An explicit *just write it* drops the pass and is recorded as a **bypass** on
1205
+ its own axis, never as an absent closure. A mission grant is not a bypass.
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  model_tier: medium
3
3
  name: analyze-roadmap-repos
4
+ produces_roadmap: true
4
5
  pack: analysis-workbench
5
6
  visibility: internal
6
7
  sub: roadmap-repos
@@ -127,3 +128,29 @@ any other.
127
128
  - Script: `src/scripts/harvest_reference_tokens.ts` — discovery, the only one.
128
129
  - Rule: [`source-confidentiality`](../../../../rules/source-confidentiality.md)
129
130
  — why the identities stay in the gitignored area.
131
+
132
+ ## Closure — the last step, always
133
+
134
+ ```
135
+ THIS COMMAND PRODUCES A ROADMAP, SO IT ENDS IN CLOSURE.
136
+ NEVER HAND BACK A PLAN CARRYING A DECISION PLANNING COULD HAVE CLOSED.
137
+ ```
138
+
139
+ Declared by `produces_roadmap: true` in the frontmatter and enforced by
140
+ `lint_roadmap_producers`: a producer that does not end here reds CI.
141
+
142
+ Read `planning.closure_pass` (missing = `true`). When active, run
143
+ [`/challenge-me closure`](../../../meta/challenge-me/closure/command.md) on the
144
+ roadmap this command just produced, before handing back:
145
+
146
+ ```bash
147
+ ./scripts-run src/scripts/closure_scan <roadmap-path>
148
+ ```
149
+
150
+ Every detected decision is resolved at the lowest rung that owns it and written
151
+ into the roadmap's `## Decisions` table. Owner-owned residue is asked **now**,
152
+ one question per turn, and its answer recorded — never handed back as *"the
153
+ open questions are in the file"*.
154
+
155
+ An explicit *just write it* drops the pass and is recorded as a **bypass** on
156
+ its own axis, never as an absent closure. A mission grant is not a bypass.
@@ -0,0 +1,178 @@
1
+ ---
2
+ model_tier: medium
3
+ name: challenge-me-closure
4
+ pack: product-reasoning
5
+ visibility: internal
6
+ cluster: challenge-me
7
+ sub: closure
8
+ description: "Close every foreseeable decision in a roadmap before execution — detect the open ones, resolve each at the lowest rung that owns it, and write the answers into a `## Decisions` table."
9
+ argument-hint: "<roadmap-path>"
10
+ suggestion:
11
+ eligible: false
12
+ rationale: "Cluster sub-command — reached via its cluster head's routing or its explicit /cluster:sub name; not independently suggested (surface-consolidation)."
13
+ workspaces:
14
+ - agent-config-maintainer
15
+ packs:
16
+ - product-reasoning
17
+ ---
18
+
19
+ # /challenge-me closure
20
+
21
+ > Take a roadmap that is about to enter execution and make it an **execution
22
+ > contract**: every foreseeable decision closed, the closing done council-first,
23
+ > the owner reached only for product, business, taste or destructive residue.
24
+
25
+ ```
26
+ A QUESTION PLANNING COULD HAVE CLOSED AND EXECUTION MEETS INSTEAD IS A DEFECT.
27
+ RESOLVE AT THE LOWEST RUNG THAT OWNS THE DECISION. THE OWNER IS THE LAST RUNG,
28
+ NEVER THE FIRST, AND NEVER REACHED FOR A TECHNICAL DECISION AT ALL.
29
+ NEVER ASK ABOUT PR TOPOLOGY. NEVER RAISE MERGE UNLESS THE OWNER RAISED IT.
30
+ EVERY ANSWER IS WRITTEN INTO `## Decisions` BEFORE THE RUN STARTS.
31
+ ```
32
+
33
+ Input is a roadmap path. Output is the same file with a `## Decisions` table
34
+ and, where residue was genuinely owner-owned, at most one host-native ask per
35
+ turn whose answer is recorded immediately.
36
+
37
+ ## Step 1 — Detect
38
+
39
+ Run the deterministic detector. It finds and classifies; it resolves nothing.
40
+
41
+ ```bash
42
+ ./scripts-run src/scripts/closure_scan <roadmap-path>
43
+ ```
44
+
45
+ It reports one row per open decision: an id, a line, a detector kind, and the
46
+ **ownership class** that kind maps to. The families are `tbd`,
47
+ `unpicked-alternative`, `unchecked-assumption`, `missing-verify`,
48
+ `ambiguous-acceptance`, `contradictory`, `product-semantics`, `typed-op` and
49
+ `spend`.
50
+
51
+ Then add what a scanner cannot see, reading the file yourself:
52
+
53
+ - the prose checks `lint_roadmap_complexity` already runs — vague steps, human
54
+ gates in steps, headings or exit criteria, external-population gates;
55
+ - an **unresolved typed-op need**: work that cannot finish without an operation
56
+ from the typed vocabulary for which no grant exists;
57
+ - a **product semantics** fork the scanner's phrasing missed — two valid
58
+ user-visible outcomes with no source of truth to pick between them.
59
+
60
+ `--rows` prints the `## Decisions` skeleton; `--json` is the machine form.
61
+
62
+ ## Step 2 — Resolve, in this order, stopping at the first rung that can
63
+
64
+ For each detected decision, in order, and never skipping a rung upward:
65
+
66
+ 1. **Evidence** — the tree answers it. Read the file, run the probe, check the
67
+ schema. A decision the code already made is not a decision.
68
+ 2. **Convention, ADR or contract** — a recorded rule answers it. Cite the ADR
69
+ number or the contract path.
70
+ 3. **The agent** — reversible and inside the stated convention
71
+ (`deterministic`, `reversible-technical`). Pick, and say why.
72
+ 4. **An independent session** — a second instance with no stake in the first
73
+ answer. This is the first rung for `contested-technical`.
74
+ 5. **The council** — `agent-config council:status` decides availability, never
75
+ the project tree. `critical-technical` targets a **provider-diverse**
76
+ council; with one provider configured the class degrades to owner-confirm of
77
+ the agent's proposal rather than one model reviewing itself.
78
+ 6. **The team** — where a council is unavailable and `ai_team` is configured.
79
+ 7. **The owner** — **only** for `product-owned`, `business-owned` and
80
+ `destructive-owned`. A technical decision never reaches here, however hard
81
+ it is.
82
+
83
+ `spend-exhaustion` leaves the ladder entirely: it **pauses and reports** — what
84
+ needed the council, why the CLI rung was unavailable, the estimated spend, the
85
+ mission state, and what can still proceed.
86
+
87
+ ## Step 3 — What is never asked
88
+
89
+ - **PR topology.** Stacked, split, one branch or five is the agent's call.
90
+ - **Merge intent**, unless the owner already discussed merge for this work. A
91
+ merge grant is a typed op the owner grants; it is not a question closure
92
+ invents.
93
+ - **A count.** "Three attempts failed, continue?" is a strategy change, never a
94
+ question.
95
+ - **A continuation.** "Shall I go on?" after a clean batch is not a decision.
96
+
97
+ ## Step 4 — Write the answers down
98
+
99
+ Append or update a `## Decisions` section with one row per decision:
100
+
101
+ ```
102
+ | ID | ownership | resolved by | decision | evidence | revisit if |
103
+ ```
104
+
105
+ `ownership` is one of the eight ownership classes. `resolved by` is one of
106
+ `evidence`, `agent`, `independent:<session or model>`, `council:<record>`,
107
+ `team:<record>`, `owner`. `revisit if` names the condition that reopens it — a
108
+ closed decision is re-asked only when that condition became true.
109
+
110
+ `lint_decision_classes` enforces both vocabularies. Run it before handing back:
111
+
112
+ ```bash
113
+ ./scripts-run src/scripts/lint_decision_classes
114
+ ```
115
+
116
+ ## Step 5 — Residue is asked now, never filed
117
+
118
+ ```
119
+ OWNER-OWNED RESIDUE IS ASKED THIS TURN. ONE QUESTION PER TURN.
120
+ THE ANSWER IS WRITTEN INTO `## Decisions` BEFORE THE NEXT QUESTION IS PUT.
121
+ NEVER HAND BACK "THE FOUR OPEN QUESTIONS ARE IN FILE X" — A FILED QUESTION IS
122
+ AN UNCLOSED ONE WEARING A RECORD'S CLOTHES, AND THE FILE IS WHERE IT DIES.
123
+ NEVER HAND BACK A COUNT — "3 QUESTIONS OUTSTANDING" IS A NUMBER RENDERED WHERE
124
+ A DECISION BELONGS.
125
+ ```
126
+
127
+ Ask using the host's own primitive where one exists — `agent-config
128
+ hooks:status` prints the shape, and the numbered text block is the named
129
+ fallback (see `user-interaction`). Each option carries what changes by
130
+ answering it, and the recommendation has exactly one source.
131
+
132
+ Two mechanical consequences, both already enforced:
133
+
134
+ - `ask_block_census` classifies a question written into a section instead of
135
+ asked as `file-parked`, and a count rendered where a question belongs as
136
+ `count-only`. Both are their own axes; neither is an ask.
137
+ - `lint_decision_classes` reds a `ready` roadmap carrying an unresolved marker
138
+ outside `## Decisions`. A question that exists only as prose in the plan is
139
+ exactly that marker, so the prose form cannot survive to `ready`.
140
+
141
+ **Where the residue genuinely cannot be asked** — the run is non-interactive,
142
+ or the answer needs something the owner has not got yet — the step is parked
143
+ and independent phases continue (§ 4 of the process loop), and the plan records
144
+ a structured `## Blockers` entry naming one of the three owner-owned classes.
145
+ That is the one legal file-shaped home, and it is legal because a five-field
146
+ blocker is decidable: recommendation, cost of the non-decision, what to do, and
147
+ what resolves it. A bare sentence in `## Notes` is none of those.
148
+
149
+ ## Bypass
150
+
151
+ An explicit *just write it* / *skip closure* / *einfach machen* drops this pass
152
+ entirely. The bypass is **recorded** as a bypass — it is its own axis in the ask
153
+ census, not an absent closure — and it is never inferred from a mission grant,
154
+ an autonomy setting or momentum. Only the owner's words this turn are a bypass.
155
+
156
+ ## Fixtures
157
+
158
+ Under `tests/fixtures/decision-closure/`:
159
+
160
+ | Fixture | What it must produce |
161
+ |---|---|
162
+ | `F1-technical-ambiguities.md` | twelve findings, **zero** owner questions |
163
+ | `F2-product-semantics.md` | **exactly one** owner question, `product-owned` |
164
+ | `F0-closed-plan.md` | nothing — a plan already closed |
165
+ | `R1-ready-unresolved.md` / `R2-ready-resolved.md` | red, then green on the same plan once the marker is recorded |
166
+ | `F3a-conclusive-technical.md` / `F3b-non-convergent-product.md` | no options block, then a proposal |
167
+
168
+ Each pair is required and neither half alone is evidence: a detector weakened
169
+ until it finds nothing passes F0 and fails F1, and one that fires on ordinary
170
+ prose does the reverse. F1 against F2 is the ownership discrimination — twelve
171
+ technical ambiguities cost the owner nothing, one product fork costs exactly
172
+ one question.
173
+
174
+ ## See also
175
+
176
+ - [`/challenge-me`](../command.md) — the cluster head.
177
+ - [`/challenge-me vision`](../vision/command.md) — the interview loop this reuses.
178
+ - `docs/contracts/ai-council-config.md` § Decision resolution by ownership — the eight classes and their Iron Laws.
@@ -3,8 +3,8 @@ model_tier: medium
3
3
  name: challenge-me
4
4
  pack: product-reasoning
5
5
  visibility: internal
6
- description: Challenge-me orchestrator — routes to vision, with-docs
7
- argument-hint: "[vision|with-docs] [flags] [seed]"
6
+ description: Challenge-me orchestrator — routes to vision, with-docs, closure
7
+ argument-hint: "[vision|with-docs|closure] [flags] [seed]"
8
8
  cluster: challenge-me
9
9
  type: orchestrator
10
10
  suggestion:
@@ -32,12 +32,17 @@ enough to emit a copyable Markdown pitch.
32
32
  |---|---|---|
33
33
  | `/challenge-me vision` | `commands/challenge-me/vision.md` | Standard variant — interrogate a fuzzy plan / idea / ticket draft to 95% confidence, emit a vision pitch |
34
34
  | `/challenge-me with-docs` | `commands/challenge-me/with-docs.md` | Doc-aware variant — same flow plus session glossary against `CONTEXT.md`, load-bearing claim-vs-code verification, optional `CONTEXT.md` patch + ADR candidates in the pitch |
35
+ | `/challenge-me closure` | `commands/challenge-me/closure.md` | Plan-closure variant — take a roadmap about to enter execution, detect every open decision, resolve each at the lowest rung that owns it, and write the answers into a `## Decisions` table |
35
36
 
36
37
  ## When to pick which
37
38
 
38
39
  - **`vision`** — greenfield idea, fresh ticket draft, or a plan with no
39
40
  existing project glossary / domain docs. Default for "challenge me on
40
41
  this plan".
42
+ - **`closure`** — the input is a **roadmap path**, not a fuzzy idea, and the
43
+ goal is an execution contract rather than a pitch. Pick it when a plan is
44
+ about to be executed: it closes the decisions a twelve-hour run would
45
+ otherwise meet mid-flight.
41
46
  - **`with-docs`** — the project has `CONTEXT.md`, an ADR directory
42
47
  (`docs/adr/`, `docs/decisions/`, `agents/decisions/`), or the user
43
48
  uses domain terms that may already be defined. The variant catches
@@ -54,6 +59,8 @@ enough to emit a copyable Markdown pitch.
54
59
  > 1. vision — standard 95%-confidence interview, emits a copyable pitch
55
60
  > 2. with-docs — same flow, but checks the seed against `CONTEXT.md` /
56
61
  > ADRs and emits an optional doc patch in the pitch
62
+ > 3. closure — take a roadmap path and close every open decision in it
63
+ > before execution, recording the answers in `## Decisions`
57
64
 
58
65
  ## In-interview triggers (both sub-commands)
59
66
 
@@ -279,12 +279,32 @@ The host is the convener **and** the skeptic — never paraphrase
279
279
  council output as host reasoning, and never auto-promote convergence
280
280
  to correctness.
281
281
 
282
- ### 5b. Translate verdicts into user options
282
+ ### 5b. Translate verdicts into user options — when the verdict is owed to the owner
283
283
 
284
- End with a numbered-options block carrying the host verdict per
285
- finding (e.g. `1. [accept] Apply finding 1 — <patch summary>`,
286
- `2. [reject] Skip finding 2 — <reason>` — user can override). Always
287
- include "discard council input" as an option.
284
+ ```
285
+ THE OPTIONS BLOCK IS CONDITIONAL, AND THE CONDITION IS OWNERSHIP.
286
+ A CONCLUSIVE **TECHNICAL** VERDICT EMITS NO OWNER-FACING OPTIONS BLOCK —
287
+ IT IS A RESOLUTION, AND HANDING IT OVER AS OPTIONS ROUTES A TECHNICAL
288
+ DECISION TO A PERSON BECAUSE IT WAS HARD (ADR-268 § 10).
289
+ THE BLOCK IS OWED WHEN THE VERDICT IS OWNER-OWNED — `product-owned`,
290
+ `business-owned`, `destructive-owned` — OR WHEN THE COUNCIL DID NOT
291
+ CONVERGE. THEN IT CARRIES THE COUNCIL'S PROPOSAL FOR THE OWNER TO CONFIRM.
292
+ CONVERGENCE IS READ FROM THE RECORD, NEVER INFERRED: A RECORD THAT DOES
293
+ NOT SAY WHETHER ITS MEMBERS CONVERGED IS ITSELF THE FINDING.
294
+ ```
295
+
296
+ A conclusive technical verdict still produces the full record — question,
297
+ evidence, member positions, convergence, verdict, confidence, revisit
298
+ condition — and the run continues on it. The resolution is written into the
299
+ consuming artifact's `## Decisions` table with `resolved by: council:<record>`.
300
+
301
+ `./scripts-run src/scripts/council_record_shape <record.md>` checks a record
302
+ against this contract in both directions.
303
+
304
+ When the block IS owed, it is a numbered-options block carrying the host
305
+ verdict per finding (e.g. `1. [accept] Apply finding 1 — <patch summary>`,
306
+ `2. [reject] Skip finding 2 — <reason>` — user can override), with "discard
307
+ council input" always present as an option.
288
308
 
289
309
  ### 6. Hard floor — text only
290
310
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  model_tier: inherit
3
3
  name: feature-plan
4
+ produces_roadmap: true
4
5
  pack: engineering-base
5
6
  visibility: internal
6
7
  cluster: feature
@@ -24,7 +25,7 @@ packs:
24
25
 
25
26
  Before gathering, run the plan-confidence gate per
26
27
  [`plan-confidence-gate`](../../contexts/execution/plan-confidence-gate.md):
27
- read `planning.challenge_on_create` (missing = `true`), do the codebase
28
+ read `planning.closure_pass` (missing = `true`), do the codebase
28
29
  lookup, and assess the four 95%-conditions — **seed = the provided
29
30
  description** (when none was provided, step 1's ask supplies it first).
30
31
  Confident → single marker line, continue with step 1. Uncertain → route
@@ -389,3 +390,29 @@ What's next?
389
390
  - [`role-contracts`](../../guidelines/agent-infra/role-contracts.md#po) — PO mode output contract (Goal / Assumptions / Acceptance criteria / Impacted modules / Risks / Open questions for stakeholder)
390
391
  - [`refine-ticket`](refine-ticket.md) — optional upstream step: run first when the input is a Jira/Linear ticket rather than a fresh idea
391
392
  - [`estimate-ticket`](estimate-ticket.md) — sibling of `refine-ticket`; size + risk + split recommendation for an already-refined ticket
393
+
394
+ ## Closure — the last step, always
395
+
396
+ ```
397
+ THIS COMMAND PRODUCES A ROADMAP, SO IT ENDS IN CLOSURE.
398
+ NEVER HAND BACK A PLAN CARRYING A DECISION PLANNING COULD HAVE CLOSED.
399
+ ```
400
+
401
+ Declared by `produces_roadmap: true` in the frontmatter and enforced by
402
+ `lint_roadmap_producers`: a producer that does not end here reds CI.
403
+
404
+ Read `planning.closure_pass` (missing = `true`). When active, run
405
+ [`/challenge-me closure`](../../../meta/challenge-me/closure/command.md) on the
406
+ roadmap this command just produced, before handing back:
407
+
408
+ ```bash
409
+ ./scripts-run src/scripts/closure_scan <roadmap-path>
410
+ ```
411
+
412
+ Every detected decision is resolved at the lowest rung that owns it and written
413
+ into the roadmap's `## Decisions` table. Owner-owned residue is asked **now**,
414
+ one question per turn, and its answer recorded — never handed back as *"the
415
+ open questions are in the file"*.
416
+
417
+ An explicit *just write it* drops the pass and is recorded as a **bypass** on
418
+ its own axis, never as an absent closure. A mission grant is not a bypass.
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  model_tier: inherit
3
3
  name: feature-roadmap
4
+ produces_roadmap: true
4
5
  pack: engineering-base
5
6
  visibility: internal
6
7
  cluster: feature
@@ -56,7 +57,7 @@ Stop.
56
57
 
57
58
  **Confidence gate (Gate C)** — after reading the feature plan, run
58
59
  [`plan-confidence-gate`](../../contexts/execution/plan-confidence-gate.md)
59
- with the **feature document as seed** (`planning.challenge_on_create`,
60
+ with the **feature document as seed** (`planning.closure_pass`,
60
61
  missing = `true`). All four 95%-conditions hold → single marker line,
61
62
  continue. A gap that would change the phases or acceptance criteria →
62
63
  `/challenge-me vision` interview (or inline degrade protocol) **before**
@@ -239,3 +240,29 @@ What's next?
239
240
  ## See also
240
241
 
241
242
  - [`role-contracts`](../../guidelines/agent-infra/role-contracts.md#planner) — Planner mode output contract (Goal / Constraints / Option set / Recommendation / Dependencies / Rollback)
243
+
244
+ ## Closure — the last step, always
245
+
246
+ ```
247
+ THIS COMMAND PRODUCES A ROADMAP, SO IT ENDS IN CLOSURE.
248
+ NEVER HAND BACK A PLAN CARRYING A DECISION PLANNING COULD HAVE CLOSED.
249
+ ```
250
+
251
+ Declared by `produces_roadmap: true` in the frontmatter and enforced by
252
+ `lint_roadmap_producers`: a producer that does not end here reds CI.
253
+
254
+ Read `planning.closure_pass` (missing = `true`). When active, run
255
+ [`/challenge-me closure`](../../../meta/challenge-me/closure/command.md) on the
256
+ roadmap this command just produced, before handing back:
257
+
258
+ ```bash
259
+ ./scripts-run src/scripts/closure_scan <roadmap-path>
260
+ ```
261
+
262
+ Every detected decision is resolved at the lowest rung that owns it and written
263
+ into the roadmap's `## Decisions` table. Owner-owned residue is asked **now**,
264
+ one question per turn, and its answer recorded — never handed back as *"the
265
+ open questions are in the file"*.
266
+
267
+ An explicit *just write it* drops the pass and is recorded as a **bypass** on
268
+ its own axis, never as an absent closure. A mission grant is not a bypass.
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  model_tier: inherit
3
3
  name: implement-ticket
4
+ produces_roadmap: true
4
5
  pack: engineering-base
5
6
  intent: "Implement a tracker ticket end-to-end from its id"
6
7
  routes_to: [refine-ticket, feature-planning]
@@ -200,3 +201,29 @@ permission-gated.
200
201
 
201
202
  - [`refine-ticket`](refine-ticket.md), [`feature-plan`](feature-plan.md), [`tests-execute`](tests-execute.md), [`review-changes`](review-changes.md) — skills the directives delegate to
202
203
  - [`commit`](commit.md), [`create-pr`](create-pr.md) — post-delivery commands the user runs explicitly
204
+
205
+ ## Closure — the last step, always
206
+
207
+ ```
208
+ THIS COMMAND PRODUCES A ROADMAP, SO IT ENDS IN CLOSURE.
209
+ NEVER HAND BACK A PLAN CARRYING A DECISION PLANNING COULD HAVE CLOSED.
210
+ ```
211
+
212
+ Declared by `produces_roadmap: true` in the frontmatter and enforced by
213
+ `lint_roadmap_producers`: a producer that does not end here reds CI.
214
+
215
+ Read `planning.closure_pass` (missing = `true`). When active, run
216
+ [`/challenge-me closure`](../../meta/challenge-me/closure/command.md) on the
217
+ roadmap this command just produced, before handing back:
218
+
219
+ ```bash
220
+ ./scripts-run src/scripts/closure_scan <roadmap-path>
221
+ ```
222
+
223
+ Every detected decision is resolved at the lowest rung that owns it and written
224
+ into the roadmap's `## Decisions` table. Owner-owned residue is asked **now**,
225
+ one question per turn, and its answer recorded — never handed back as *"the
226
+ open questions are in the file"*.
227
+
228
+ An explicit *just write it* drops the pass and is recorded as a **bypass** on
229
+ its own axis, never as an absent closure. A mission grant is not a bypass.
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  model_tier: inherit
3
3
  name: jira-ticket
4
+ produces_roadmap: true
4
5
  pack: product-basic
5
6
  intent: "Read a Jira ticket from the branch and implement the feature or fix the bug"
6
7
  routes_to: [jira-integration, feature-planning]
@@ -82,3 +83,29 @@ packs:
82
83
  ## See also
83
84
 
84
85
  - [`role-contracts`](../guidelines/agent-infra/role-contracts.md#developer) — Developer mode output contract (Goal / Plan / Changes / Tests / Open questions)
86
+
87
+ ## Closure — the last step, always
88
+
89
+ ```
90
+ THIS COMMAND PRODUCES A ROADMAP, SO IT ENDS IN CLOSURE.
91
+ NEVER HAND BACK A PLAN CARRYING A DECISION PLANNING COULD HAVE CLOSED.
92
+ ```
93
+
94
+ Declared by `produces_roadmap: true` in the frontmatter and enforced by
95
+ `lint_roadmap_producers`: a producer that does not end here reds CI.
96
+
97
+ Read `planning.closure_pass` (missing = `true`). When active, run
98
+ [`/challenge-me closure`](../../meta/challenge-me/closure/command.md) on the
99
+ roadmap this command just produced, before handing back:
100
+
101
+ ```bash
102
+ ./scripts-run src/scripts/closure_scan <roadmap-path>
103
+ ```
104
+
105
+ Every detected decision is resolved at the lowest rung that owns it and written
106
+ into the roadmap's `## Decisions` table. Owner-owned residue is asked **now**,
107
+ one question per turn, and its answer recorded — never handed back as *"the
108
+ open questions are in the file"*.
109
+
110
+ An explicit *just write it* drops the pass and is recorded as a **bypass** on
111
+ its own axis, never as an absent closure. A mission grant is not a bypass.
@@ -276,6 +276,35 @@ fallback structure defined in `/create-pr:description-only`. NEVER invent a cust
276
276
  title and body as copyable blocks and ask for adjustments before
277
277
  proceeding. The user reviews and adjusts the content in that step.
278
278
 
279
+ ### 2a. Scope delta — what grew, and why it was the agent's
280
+
281
+ ```
282
+ AGENT-OWNED SCOPE GROWTH IS RECORDED IN THE PR BODY. ONE LINE PER ITEM.
283
+ GROWTH DONE AND NOT RECORDED IS INDISTINGUISHABLE FROM SCOPE CREEP.
284
+ A FOLLOW-UP ARTIFACT IS NAMED HERE TOO — IT IS WHAT THE MISSION DID NOT ABSORB.
285
+ ```
286
+
287
+ Where the run did work beyond the literal task, add a `## Scope delta` section
288
+ to the body — one line per item, naming what grew and which row of the
289
+ agent-owned list it matched (a necessary internal refactor · a missing test on
290
+ a touched path · a regression on a touched path · a small dependency
291
+ adjustment · a local API change inside defined semantics · a Boy-Scout cleanup
292
+ that is small, local, low blast radius, testable and carries no new product
293
+ decision). Full enumeration and the council / owner rows:
294
+ [`scope-mechanics`](../../../../agent-src/contexts/authority/scope-mechanics.md)
295
+ section Scope growth.
296
+
297
+ `./scripts-run src/scripts/scope_growth "<one-line description>"` classifies a
298
+ single item when the row is not obvious. `unknown` is a real verdict: growth
299
+ nothing classifies is growth nobody decided, and it does not silently become
300
+ agent work.
301
+
302
+ A larger unrelated opportunity is **not** a scope delta. It is a follow-up
303
+ artifact, named in the same section under *Not absorbed* with its roadmap path,
304
+ because a mission delivering everything it met would deliver none of it.
305
+
306
+ Omit the section entirely when the diff is the task and nothing grew.
307
+
279
308
  ### 2b. Council review — explicitly excluded
280
309
 
281
310
  `/create-pr` does **not** prompt for council review, even when