@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
@@ -127,8 +127,8 @@ So the record carries **two** SHAs per PR and they mean different things:
127
127
  Before every merge, re-read the PR and refuse when the live head is **neither**
128
128
  the snapshot head **nor** the head this run last pushed. That is the
129
129
  force-push-after-authorization case, and it is the only one the check exists
130
- for. A PR that appeared after the snapshot is not in scope for this run — § 6
131
- says what happens to it.
130
+ for. A PR that appeared after the snapshot is never merged by this run — § 6
131
+ says what happens to it instead.
132
132
 
133
133
  ## 2. Sync with the base
134
134
 
@@ -161,13 +161,44 @@ it now means two humans edited the same policy sentence — read both sides.
161
161
  | Evidence files | `agents/evidence/**` | Append-only. Keep both sides. |
162
162
 
163
163
  ```
164
- A CONFLICT OUTSIDE THESE FOUR CLASSES HALTS THE RUN.
165
- IT IS NOT RESOLVED BY JUDGEMENT AND NOT ESCALATED TO A WARNING.
164
+ THE FOUR CLASSES ARE AIDS, NOT EXHAUSTIVE AUTHORITY.
165
+ AN UNENUMERATED CONFLICT IS ROUTED, NOT HALTED — AND NEVER RESOLVED SILENTLY.
166
+ UNDERSTAND BOTH INTENTS → INSPECT RECENCY, AUTHORS AND OPEN PRs →
167
+ PRESERVE BOTH WHERE COMPATIBLE → INDEPENDENT REVIEW FOR A RISKY MERGE →
168
+ COUNCIL OR TEAM → THE OWNER ONLY FOR A PRODUCT-SEMANTIC INCOMPATIBILITY.
166
169
  ```
167
170
 
168
- The classes exist so a merge resolution is reproducible by a second reader. An
169
- unenumerated conflict is a case nobody has decided yet, and deciding it silently
170
- inside a drain loop is how work disappears.
171
+ The classes exist so a merge resolution is reproducible by a second reader, and
172
+ that is still their job. What changed is what happens when a conflict falls
173
+ outside them: **`road-to-adversarial-verification-and-long-runs` 5.2** replaced
174
+ the halt with the ladder above, because "nobody has decided this yet" describes
175
+ a class of conflict, not a class of thing only an owner may touch. Most
176
+ unenumerated conflicts are two branches editing adjacent prose, and halting a run
177
+ on one converts a two-minute read into an owner interrupt.
178
+
179
+ Read the ladder as ordered, and note where the owner sits. The first three rungs
180
+ are the agent's own work — **understand what each side was trying to do**,
181
+ **inspect recency, authorship and the open PRs** that produced them, and
182
+ **preserve both where they are compatible**, which most textual conflicts are.
183
+ The fourth and fifth escalate *laterally* — an independent reviewer for a merge
184
+ whose risk the run cannot bound alone, then the council or the team. The owner is
185
+ the **last** rung and is reached on one condition: the two sides encode
186
+ incompatible PRODUCT semantics, where choosing is a decision about what the thing
187
+ should do rather than about how to combine two edits.
188
+
189
+ ```
190
+ A CONFLICT THE RUN CANNOT UNDERSTAND IS NOT AUTOMATICALLY OWNER-OWNED.
191
+ "I DO NOT KNOW WHICH SIDE IS RIGHT" IS A REASON TO ESCALATE INDEPENDENTLY,
192
+ NOT A REASON TO ASK. THE OWNER RUNG IS REACHED BY THE SEMANTIC TEST,
193
+ NEVER BY THE RUN'S OWN UNCERTAINTY.
194
+ ```
195
+
196
+ Deciding it **silently** inside a drain loop is still how work disappears, and
197
+ that prohibition is unchanged: an unenumerated resolution is recorded — which
198
+ rung settled it, what both intents were, and why the chosen resolution preserves
199
+ them — so the second reader the classes exist for can still follow it.
200
+
201
+ **`process-full`'s halt 6 retires with this**, per that command's own halt table.
171
202
 
172
203
  ## 4. Superseded check — before any CI is spent
173
204
 
@@ -258,11 +289,19 @@ a PR its own predecessor invalidated, because it has no predecessor that
258
289
  landed. The cutoff below bounds both forms.
259
290
 
260
291
  **Cutoff.** When the manifest is exhausted, recompute the open-PR list
261
- **exactly once**. PRs that appeared during the run are drained as ONE final
292
+ **exactly once**. PRs that appeared during the run are **prepared** as ONE final
262
293
  straggler batch. After that batch the run ends unconditionally; anything
263
294
  arriving during or after it is recorded as `arrived-after-cutoff` and is not
264
295
  processed.
265
296
 
297
+ **The straggler batch is prepared and never merged — in both forms.** It is not
298
+ in § 1's manifest, so the invocation does not reach it (the Iron Law above § 1,
299
+ and § 7's first rule). "Drained" is therefore preparation here: each straggler
300
+ is synced, classified, greened and reported, ends at mergeable-and-open exactly
301
+ as under `--no-merge`, and is recorded `unauthorized` with the go-ahead it needs.
302
+ Reading "drained" as "merged" is the one way `all` could merge a PR the owner
303
+ never named, which is why the word is pinned rather than left to context.
304
+
266
305
  ```
267
306
  THE CUTOFF IS THE TERMINATION PROOF.
268
307
  WITHOUT IT, "THE QUEUE MUST SHRINK" DOES NOT TERMINATE AGAINST A SECOND
@@ -315,6 +354,11 @@ Write the summary as-is with an `unauthorized` disposition per unprocessed PR
315
354
  and name the exact authorization needed. Then STOP and wait — do not end the
316
355
  run, and do not proceed to the next PR.
317
356
 
357
+ That is the same `unauthorized` row § 6's straggler batch carries, and
358
+ deliberately one token rather than two: both mean *prepared by this run, not
359
+ authorized for it to merge*, and a reader of the summary needs the distinction
360
+ between merged and not-merged, not between two reasons for the same outcome.
361
+
318
362
  ## 8. Kill switches, and what happens after a merge
319
363
 
320
364
  **Armed during preparation, not only before a merge** — otherwise a
@@ -369,7 +413,14 @@ conflict classes hit, CI iterations used, disposition, and any edits dropped in
369
413
  conflict resolution. The disposition set is closed:
370
414
 
371
415
  `merged <sha>` · `superseded-closed` · `blocked-external` · `twice-exhausted` ·
372
- `window-expired` · `arrived-after-cutoff`
416
+ `unauthorized` · `arrived-after-cutoff`
417
+
418
+ `unauthorized` replaces `window-expired`, and the swap is one-for-one on
419
+ purpose. `window-expired` named a clock ADR-254 removed on 2026-09-04, so no run
420
+ can produce that row any more, and a closed set holding an unproducible member
421
+ is a set nobody can check a run against. `unauthorized` names what actually
422
+ happens in its place — § 7's pause and § 6's straggler batch, the two ways a PR
423
+ ends this run prepared and unmerged.
373
424
 
374
425
  ## Rules
375
426
 
@@ -132,7 +132,13 @@ Append a **Host verdict** sub-block under the Council review block in the roadma
132
132
  | 4 | <one-line> | `needs-input` | open question — user picks below |
133
133
  ```
134
134
 
135
- Then surface a single numbered-options block per [`user-interaction`](../../rules/user-interaction.md), carrying the verdict per option:
135
+ Then, **when the verdict is owed to the owner** — it is owner-owned
136
+ (`product-owned`, `business-owned`, `destructive-owned`) or the council did not
137
+ converge — surface a single numbered-options block per
138
+ [`user-interaction`](../../rules/user-interaction.md), carrying the verdict per
139
+ option. A conclusive **technical** verdict emits no block at all: it is a
140
+ resolution, it is recorded in the roadmap's `## Decisions` table as
141
+ `resolved by: council:<record>`, and the run continues on it (ADR-268 § 10).
136
142
 
137
143
  > 1. `[accept]` Apply finding 1 — <one-line patch summary>
138
144
  > 2. `[accept-with-modification]` Apply finding 2 (modified) — <one-line patch summary + adjustment>
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  model_tier: inherit
3
3
  name: roadmap-create
4
+ produces_roadmap: true
4
5
  pack: product-basic
5
6
  visibility: internal
6
7
  cluster: roadmap
@@ -23,7 +24,7 @@ packs:
23
24
 
24
25
  Before anything else, run the plan-confidence gate per
25
26
  [`plan-confidence-gate`](../../contexts/execution/plan-confidence-gate.md):
26
- read `planning.challenge_on_create` (missing = `true`), do the codebase
27
+ read `planning.closure_pass` (missing = `true`), do the codebase
27
28
  lookup, and assess the four 95%-conditions against the seed.
28
29
 
29
30
  - **Confident** (all four hold) → emit the single marker line and continue
@@ -171,6 +172,23 @@ exact honest-null grammar from the contract. Self-review suffices.
171
172
  `lint_plan_risk_register` enforces this at pre-push + CI; drafts are
172
173
  exempt until flipped to ready.
173
174
 
175
+ ### 5c. Release-holds self-check (template rule 28) — before save
176
+
177
+ Ask once: *does any intermediate tree state of this roadmap have to stay
178
+ unpublished?* The default answer is **no**, and a roadmap declaring no hold is
179
+ the normal shape. Roadmap *incompleteness* is never a release condition.
180
+
181
+ If the answer is yes, walk rule 28's authoring order and stop at the first rung
182
+ that works — **re-sequence → guard → hold**. A hold is the last resort and its
183
+ entry carries a mandatory `Why not a guard:` field.
184
+
185
+ **Record the outcome either way.** Reaching rung 1 or 2 writes the one-line
186
+ `resequenced:` / `guarded:` note inside the commented `## Release holds` block
187
+ the skeleton emits; reaching rung 3 uncomments the entry. A considered hold that
188
+ was avoided is a counted outcome — see
189
+ [`roadmap-writing § 5b-holds`](../../../../skills/roadmap-writing/SKILL.md).
190
+ Checked by `./scripts-run src/scripts/check_release_holds --lint`.
191
+
174
192
  ### 6. Save the file
175
193
 
176
194
  - Generate a filename from the title: kebab-case, e.g. `optimize-webhook-jobs.md`.
@@ -234,37 +252,40 @@ Regenerate `agents/roadmaps-progress.md` so the new roadmap shows up:
234
252
 
235
253
  Mention the new overall count to the user.
236
254
 
237
- ### 9. Offer council review (B1 hook, verbosity-gated)
238
-
239
- Read `verbosity.offer_council_in_delivery` from `.agent-settings.yml`
240
- (default `false`):
241
-
242
- - `false` (default): skip the prompt silently. When `ai_council.enabled:
243
- true` AND at least one member enabled, emit one line: `→ council
244
- skipped (set verbosity.offer_council_in_delivery: true to enable, or
245
- run /council roadmap:<path> directly)`. Otherwise emit nothing.
246
- - `true`: when `ai_council.enabled: true` **and** at least one member
247
- enabled (`anthropic` or `openai`), ask (in the user's language):
255
+ ### 9. Council review — a step, not an offer
248
256
 
249
- > 1. Run the council on this roadmap before execution? (billable)
250
- > 2. Skip council review
257
+ ```
258
+ UNDER A MISSION THE COUNCIL IS A STEP. NEVER AN OFFER.
259
+ AVAILABILITY IS `agent-config council:status`. NOTHING ELSE DECIDES IT.
260
+ ```
251
261
 
252
- Also suppress when `personal.autonomy: on` (council is billable; see
253
- `road-to-ai-council.md` Decision 3 / Q47).
262
+ The offer that used to sit here was verbosity-gated and suppressed under
263
+ `personal.autonomy: on`, on the stated ground that the council is billable.
264
+ That premise is false: the transport resolves CLI-first
265
+ (`src/scripts/ai_council/transport_resolver.ts`), so the ordinary path spends
266
+ no metered USD, and a question asked to avoid spend that does not happen is a
267
+ cheap question under `no-cheap-questions`. Where an API rung genuinely would
268
+ cross the configured ceiling, the answer is `spend-exhaustion` — pause and
269
+ report (ADR-268 § 8) — never a question either.
254
270
 
255
- If the user picks **1**:
271
+ Run the free availability probe — no API call, no spend, any directory:
256
272
 
257
- - Run `/council roadmap:<path>` with the user's original ask captured
258
- in step 1 as `original_ask` (the handoff preamble carries it
259
- verbatim, see `scripts/ai_council/prompts.ts`).
260
- - Append the council findings as a `## Council review (<UTC date>)`
261
- section at the bottom of the roadmap. Include the trace path to
262
- `agents/runtime/council/sessions/<timestamp>/raw-text.md` so future readers
263
- can audit.
264
- - Do **not** rewrite the roadmap based on the findings — surface them,
265
- let the user decide what to act on.
273
+ ```bash
274
+ agent-config council:status
275
+ ```
266
276
 
267
- If the user picks **2** → continue.
277
+ - **CONFIGURED** → run `/council roadmap:<path>` as a step, carrying the
278
+ user's original ask from step 1 as `original_ask` (the handoff preamble
279
+ carries it verbatim, see `scripts/ai_council/prompts.ts`). Append the
280
+ findings as a `## Council review (<UTC date>)` section at the bottom of the
281
+ roadmap, inlined with date and members per the council record contract.
282
+ Do **not** rewrite the roadmap from the findings — surface them; a technical
283
+ verdict resolves per the ownership table, an owner-owned one becomes a
284
+ `## Decisions` row.
285
+ - **NOT CONFIGURED** → state the resolver's own message in one line and
286
+ continue. Never infer this from the project tree: the config is
287
+ user-global (ADR-104), and the missing-file reflex is the measured failure
288
+ `council-availability` exists over.
268
289
 
269
290
  ### 10. Ask the execution mode — ONE question, then write frontmatter
270
291
 
@@ -384,3 +405,29 @@ Failure modes covered by this hard stop:
384
405
  - Follow the roadmap template from `.augment/templates/roadmaps.md`; write in English (project convention).
385
406
  - Keep the file focused: 500–1000 lines max. If larger, suggest splitting.
386
407
  - **Never overwrite an existing roadmap.** Step 6 scans `active/`, `archive/`, `skipped/` (+ subdirs); on collision → STOP, present rename / open / abort. Auto-suffix requires explicit pick.
408
+
409
+ ## Closure — the last step, always
410
+
411
+ ```
412
+ THIS COMMAND PRODUCES A ROADMAP, SO IT ENDS IN CLOSURE.
413
+ NEVER HAND BACK A PLAN CARRYING A DECISION PLANNING COULD HAVE CLOSED.
414
+ ```
415
+
416
+ Declared by `produces_roadmap: true` in the frontmatter and enforced by
417
+ `lint_roadmap_producers`: a producer that does not end here reds CI.
418
+
419
+ Read `planning.closure_pass` (missing = `true`). When active, run
420
+ [`/challenge-me closure`](../../../meta/challenge-me/closure/command.md) on the
421
+ roadmap this command just produced, before handing back:
422
+
423
+ ```bash
424
+ ./scripts-run src/scripts/closure_scan <roadmap-path>
425
+ ```
426
+
427
+ Every detected decision is resolved at the lowest rung that owns it and written
428
+ into the roadmap's `## Decisions` table. Owner-owned residue is asked **now**,
429
+ one question per turn, and its answer recorded — never handed back as *"the
430
+ open questions are in the file"*.
431
+
432
+ An explicit *just write it* drops the pass and is recorded as a **bypass** on
433
+ 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: high
3
3
  name: roadmap-materialize
4
+ produces_roadmap: true
4
5
  pack: product-basic
5
6
  visibility: internal
6
7
  cluster: roadmap
@@ -70,3 +71,29 @@ pastes a ticket into Linear/Jira (or creates it via MCP), or runs a per-ticket b
70
71
  - **Do NOT commit or push.**
71
72
  - Bundle is the source of truth; the tracker is a projection
72
73
  ([`ticket-bundle-format`](../../docs/contracts/ticket-bundle-format.md)).
74
+
75
+ ## Closure — the last step, always
76
+
77
+ ```
78
+ THIS COMMAND PRODUCES A ROADMAP, SO IT ENDS IN CLOSURE.
79
+ NEVER HAND BACK A PLAN CARRYING A DECISION PLANNING COULD HAVE CLOSED.
80
+ ```
81
+
82
+ Declared by `produces_roadmap: true` in the frontmatter and enforced by
83
+ `lint_roadmap_producers`: a producer that does not end here reds CI.
84
+
85
+ Read `planning.closure_pass` (missing = `true`). When active, run
86
+ [`/challenge-me closure`](../../../meta/challenge-me/closure/command.md) on the
87
+ roadmap this command just produced, before handing back:
88
+
89
+ ```bash
90
+ ./scripts-run src/scripts/closure_scan <roadmap-path>
91
+ ```
92
+
93
+ Every detected decision is resolved at the lowest rung that owns it and written
94
+ into the roadmap's `## Decisions` table. Owner-owned residue is asked **now**,
95
+ one question per turn, and its answer recorded — never handed back as *"the
96
+ open questions are in the file"*.
97
+
98
+ An explicit *just write it* drops the pass and is recorded as a **bypass** on
99
+ its own axis, never as an absent closure. A mission grant is not a bypass.
@@ -153,6 +153,46 @@ waiting on that remote CI is part of the run per the Iron Law below. It is
153
153
  the whole of what this command delivers: there is no flag that carries it
154
154
  further, and § Merging below says why.
155
155
 
156
+ ### The six required layers, in order, each with the command that runs it
157
+
158
+ `road-to-adversarial-verification-and-long-runs` 3.1. Correctness is owned by the
159
+ forge and CI, not by an owner reading a diff — so the layers are named, ordered,
160
+ and each one carries the command that produces its verdict. A layer with no
161
+ command is a claim; a layer with one is a check.
162
+
163
+ | # | Layer | Command that runs it |
164
+ |---|---|---|
165
+ | 1 | A targeted local RED, then GREEN | the test runner filtered to the failing name — `npm run test:ts -- <file>`, never the suite |
166
+ | 2 | Quality scoped to the changed surface | the type-checker and linter over the diff — `npm run typecheck`, the linter on changed files |
167
+ | 3 | Per-phase fast CI | `roadmap.quality_cadence: per_phase` (Phase 0.2) at each phase boundary |
168
+ | 4 | The final full required CI | `./scripts-run src/scripts/ci_settle <PR> --timeout 1700` — its LAST OUTPUT LINE is the verdict |
169
+ | 5 | Forge branch protection | `agent-config doctor --json` → `forge_protection` (Phase 3.2), read from the forge |
170
+ | 6 | Final-head verification | `ci_settle`'s verdict line names the head; it must be the head that was pushed last |
171
+
172
+ **Layer 1 before layer 2 before layer 3, and the order is the substance.** Each
173
+ layer is cheaper and narrower than the one after it, so running them out of order
174
+ spends the expensive verdict on a failure the cheap one would have named. A run
175
+ that reaches layer 4 with layer 1 unrun has not saved a step; it has moved the
176
+ same failure to where it costs a CI cycle.
177
+
178
+ ```
179
+ CI REJECTS: A SKIPPED OR DISABLED REQUIRED CHECK · UNRESOLVED GENERATED DRIFT ·
180
+ POLICY-PROJECTION DRIFT · A STALE-HEAD MERGE · A CONFLICT RESOLUTION THAT WAS
181
+ NOT REVALIDATED.
182
+ CI NEVER REQUIRES A HUMAN APPROVAL MERELY BECAUSE A CHANGE IS LARGE.
183
+ ```
184
+
185
+ That last line is not a courtesy. Size is the one property of a diff that
186
+ correlates with nothing a reviewer can check mechanically, and gating on it is
187
+ how *ask the owner* re-enters through a door marked prudence — which is the loop
188
+ ADR-268 § 0 is trying to end. Gate on the five conditions above, which are
189
+ falsifiable, and never on how big the change looks.
190
+
191
+ **A disabled required check cannot reach delivery-ready**, and that is the
192
+ condition to test rather than assert: a PR whose required context is skipped has
193
+ a green rollup and an unenforced gate, so a delivery-ready test that reads only
194
+ the rollup passes exactly when it should fail.
195
+
156
196
  ### Merging — out of scope, cancelled rather than deferred
157
197
 
158
198
  ```
@@ -219,7 +259,7 @@ RUNNING" IS NOT A BOUNDARY, NOT A HALT, AND NOT A REPORT — THE RUN ENDS
219
259
  AT A MERGEABLE PR, NEVER AT AN OFFER TO GO CHECK ON ONE.
220
260
  ```
221
261
 
222
- The **six — and only six — halt conditions** (exhaustive; nothing else
262
+ The **five — and only five — live halt conditions** (exhaustive; nothing else
223
263
  stops the run):
224
264
 
225
265
  1. **Hard-Floor** trigger ([`non-destructive-by-default`](../../rules/non-destructive-by-default.md)).
@@ -227,13 +267,21 @@ stops the run):
227
267
  3. **Security-sensitive** surface reached.
228
268
  4. **Scope-out-of-roadmap** work discovered.
229
269
  5. **Test / quality red** that cannot be cleared within the N=3 budget.
230
- 6. **A merge conflict outside the four enumerated classes** of
231
- [`/pr:merge` § 3](../../../git/pr/merge/command.md), during the delivery
232
- loop. Added when delivery became unconditional: the loop runs on every
233
- completed run, `--all` or not, so its stop is a stop of this command and
234
- calling it "a kill switch rather than a halt reason" would not change that —
235
- a run that stops has stopped. It fires only where a run reaches delivery,
236
- which is the one thing that distinguishes it from the five above.
270
+ 6. **RETIRED 2026-09-13** by `road-to-adversarial-verification-and-long-runs`
271
+ 5.2. This read *a merge conflict outside the four enumerated classes of
272
+ [`/pr:merge` § 3](../../../git/pr/merge/command.md)*. That section now ROUTES
273
+ an unenumerated conflict — understand both intents, inspect recency and
274
+ authorship, preserve both where compatible, independent review, council or
275
+ team, and the owner **only** for a product-semantic incompatibility — so
276
+ there is no longer a conflict class whose arrival ends a run. Numbered rather
277
+ than renumbered: the list is cited by index from several places, and silently
278
+ shifting five conditions up one is how a citation comes to name a different
279
+ halt. **Five live halt conditions, not six.**
280
+
281
+ What did NOT change: an unenumerated conflict may still never be resolved
282
+ silently. The ladder's own record — which rung settled it, both intents, why
283
+ the resolution preserves them — is the replacement for the stop, and the
284
+ reason the stop could be removed at all.
237
285
 
238
286
  **Under `--all`, which of these end the roadmap and which end the loop.** Two
239
287
  of the five are safety floors and they end the **whole run**, not the current
@@ -246,7 +294,7 @@ roadmap:
246
294
  | 2. Council-off + genuine ambiguity | Ends the roadmap; the loop records it and continues. |
247
295
  | 4. Scope-out-of-roadmap work | Ends the roadmap; the loop records it and continues. |
248
296
  | 5. Test / quality red past N=3 | Ends the roadmap; the loop records it and continues. |
249
- | 6. Unenumerated merge conflict in delivery | Ends the roadmap; the loop records it and continues. |
297
+ | ~~6. Unenumerated merge conflict in delivery~~ | **RETIRED** — `/pr:merge` § 3 routes it instead of stopping. |
250
298
 
251
299
  **And the conditions that end the loop without ending a roadmap:**
252
300
  estate-queue exhaustion (always), a
@@ -257,8 +305,9 @@ authorization-window expiry — which is **unreachable in this command**,
257
305
  because it never performs a `BLOCK_OPS` operation for the window to govern. Three conditions, one of them currently inert, and this
258
306
  table is the only place the set is stated.
259
307
 
260
- Nothing here widens a run without `--all`: it still has exactly the six
261
- above, all of them ending the run because there is no loop to continue.
308
+ Nothing here widens a run without `--all`: it still has exactly the five live
309
+ conditions above, all of them ending the run because there is no loop to
310
+ continue.
262
311
 
263
312
  ```
264
313
  FORBIDDEN NON-HALT REASONS — NEVER STOP THE RUN FOR ANY OF THESE:
@@ -272,12 +321,13 @@ FORBIDDEN NON-HALT REASONS — NEVER STOP THE RUN FOR ANY OF THESE:
272
321
  · "the branch is not protected" / "a branch must be created"
273
322
  · "a PR must be opened" / "a GitHub setting must change"
274
323
  · "CI must be re-run" / "the merge base needs updating" / "there are
275
- conflicts" — resolving these IS the work. The one exception, and it is a
276
- kill switch rather than a halt reason: a conflict **outside** the four
277
- enumerated classes of [`/pr:merge` § 3](../../../git/pr/merge/command.md)
278
- stops the delivery loop, because that is a case nobody has decided yet and
279
- deciding it silently is how work disappears. An enumerated conflict is
280
- never a stop.
324
+ conflicts" — resolving these IS the work, and since 2026-09-13 that holds
325
+ for an UNENUMERATED conflict too: [`/pr:merge` § 3](../../../git/pr/merge/command.md)
326
+ routes it (understand both intents → recency and authorship → preserve both
327
+ where compatible → independent review → council or team → the owner only for
328
+ a product-semantic incompatibility) instead of stopping. The prohibition that
329
+ survives is on resolving one SILENTLY: the rung that settled it, both
330
+ intents, and why the resolution preserves them are recorded.
281
331
  · "a paid service is needed" — authorised under the ceiling below
282
332
  · "a maintainer should do this" when the agent can perform the same action
283
333
  · any agent-invented caution not in the five halt conditions above.
@@ -313,9 +363,64 @@ branch setting, push, open a PR, re-run CI, update a merge base, fix a failing
313
363
  test, authorise spend inside a budget — is machine-executable by the agent, and
314
364
  is therefore remediation work rather than a blocker.
315
365
 
366
+ ### `complete` requires DELIVERY, not only checkboxes
367
+
368
+ ```
369
+ A RUN WHOSE CHECKBOXES READ COMPLETE AND WHOSE PR SITS ON RED CI OR ON A
370
+ MOVED TARGET HAS NOT COMPLETED. CHECKBOXES ARE ONE COMPLETION; DELIVERY IS
371
+ THE OTHER, AND ONLY TWO POSITIONS END A RUN: `merged` AND `open-green`.
372
+ ```
373
+
374
+ `road-to-adversarial-verification-and-long-runs` 8.1. The delivery machine is
375
+ `working → local-green → pushed → pr-open → ci-pending → (red → the recovery
376
+ ladder → pushed | green) → target-sync-check → (moved → sync → tests → pushed |
377
+ current) → delivery-ready → (grant → merged | no grant → open-green)`.
378
+
379
+ `run_continuation_hook` reads the position the run RECORDED — it does not probe
380
+ the forge, because a `gh` call on the stop path is the cost the premise rung
381
+ already declined — and any position that is not an ending keeps the run engaged
382
+ at zero open steps. Two bounds survive that hold, and one is deliberately lifted:
383
+ the iteration and wall-clock caps still end it, while the **stall** rung is
384
+ skipped, because during delivery the open-step count it measures cannot move and
385
+ a metric that cannot move is not a stall signal. A run that recorded no position
386
+ decides exactly as it did before.
387
+
388
+ ```
389
+ THE CONSUMER IS LIVE. NO PRODUCER SHIPS YET — NOTHING WRITES `delivery` INTO
390
+ THE RUN-STATE FILE, SO ON EVERY RUN TODAY THE POSITION IS ABSENT AND THE HOLD
391
+ DOES NOT FIRE. READ THE PARAGRAPH ABOVE AS THE CONTRACT, NOT AS BEHAVIOR YOU
392
+ WILL OBSERVE.
393
+ ```
394
+
395
+ Said in a fence because the surrounding prose reads as a description of live
396
+ behavior and an independent review of the change that introduced it read it
397
+ exactly that way. The ladder, the round-trip and the ledger field are built,
398
+ tested and correct for any recorded value; what is missing is the step that
399
+ records one, and a run that wants the hold must write the position itself until
400
+ that lands.
401
+
402
+ **`open-green` is a success, not a shortfall.** A run with no merge grant is not
403
+ supposed to merge; what it owes is an open PR whose CI is green **on the head CI
404
+ actually observed**, and a report that says so.
405
+
406
+ ### The PR body is one page for the owner's review
407
+
408
+ 8.2. The end-of-run PR body carries these six, each as its own named section:
409
+
410
+ 1. **Delivery target reached** — `merged` or `open-green`, and the head SHA CI observed.
411
+ 2. **Decisions taken, and by whom** — agent, council, team or owner, per decision.
412
+ 3. **Open owner-owned residue** — what is left that only the owner can settle, or *none*.
413
+ 4. **Scope delta** — what the run added to or dropped from the roadmap's stated scope.
414
+ 5. **Spend** — actual against the authorised ceiling.
415
+ 6. **Fix-loop epochs** — how many strategies were opened, and what ended each.
416
+
417
+ Six sections because each answers a different question the owner would otherwise
418
+ have to ask, and a run that omits one has moved that question back into the
419
+ conversation this roadmap exists to end.
420
+
316
421
  | Outcome | When | Success? | terminal state |
317
422
  |---|---|---|---|
318
- | `complete` | `count_open == 0` and the PR is open | yes — archival check runs | `success` |
423
+ | `complete` | `count_open == 0`, the PR is open, and delivery reached an ending | yes — archival check runs | `success` |
319
424
  | `blocked` | every remaining open step is **externally impossible** for the agent | **no** — partial progress, labelled as such | `blocked`, or `approval-required` where the work is finished and waiting on a human |
320
425
  | a halt | one of the five conditions fired | **no** — the halt is reported | `exhausted` when a declared budget ran out; `stagnated` when the same failure signature repeated with budget left |
321
426
 
@@ -130,6 +130,28 @@ control, no background jobs, no delegate write path; the capability delta
130
130
  vs. the native plugin is stated in the output. When the codex CLI itself is
131
131
  absent, the same fail-closed principle applies: state it plainly and stop.
132
132
 
133
+ ## Records — the same shape and the same place as a council record
134
+
135
+ ```
136
+ A TEAM VERDICT IS RECORDED THE WAY A COUNCIL VERDICT IS. NO SECOND FORMAT.
137
+ THE OPTIONS BLOCK IS CONDITIONAL ON OWNERSHIP HERE TOO.
138
+ ```
139
+
140
+ A team run produces the same seven fields a council record carries — question,
141
+ evidence, member positions, convergence, verdict, confidence, revisit
142
+ condition — and lives in the same place: the dev-time artifact under
143
+ `agents/runtime/` (gitignored, pruned on the configured retention window), and
144
+ the **durable** record inlined into the artifact the decision serves, with date
145
+ and members. Never a link to the scratch file; it is not in a clone.
146
+
147
+ Where the decision closes a roadmap question, the durable record is one
148
+ `## Decisions` row with `resolved by: team:<record>`.
149
+
150
+ The options block follows the same ownership condition as a council record: a
151
+ conclusive **technical** verdict emits none, an owner-owned or non-convergent
152
+ one carries the proposal the owner confirms. Both directions are checkable —
153
+ `./scripts-run src/scripts/council_record_shape <record.md>`.
154
+
133
155
  ## No-claims note
134
156
 
135
157
  The review-lift value of cross-model team review is **unproven** until the
@@ -0,0 +1,80 @@
1
+ # Scope Growth — Ownership
2
+
3
+ Loaded from [`scope-mechanics`](scope-mechanics.md). The size question — *is
4
+ this small and aligned enough to do now* — is the remediation ladder's. This is
5
+ the other axis, *whose decision is it*, and a change must clear BOTH to be done
6
+ inline: something small and council-owned is still not the agent's to decide,
7
+ and something agent-owned and large is still bounded by the smallest-diff rule.
8
+
9
+ ```
10
+ SCOPE GROWTH DISCOVERED MID-MISSION IS ROUTED BY WHO OWNS IT, NOT BY HOW BIG
11
+ IT LOOKS. THE THREE LISTS BELOW ARE CLOSED. GROWTH THAT MATCHES THE FIRST IS
12
+ DONE AND RECORDED AS A SCOPE DELTA — IT IS NEVER ASKED ABOUT.
13
+ GROWTH THAT MATCHES NEITHER OF THE FIRST TWO IS NOT SCOPE GROWTH AT ALL:
14
+ IT IS A FOLLOW-UP ARTIFACT, AND THE MISSION DOES NOT EXPAND TO HOLD IT.
15
+ ```
16
+
17
+ `active-remediation`'s ladder answers *how big is this and is it aligned*.
18
+ This answers the other axis — *whose decision is it* — and the two run
19
+ together: a change must clear BOTH to be done inline. Something small and
20
+ council-owned is still not the agent's to decide; something agent-owned and
21
+ large is still bounded by `minimal-safe-diff`.
22
+
23
+ ### Agent-owned growth — done, recorded, never asked about
24
+
25
+ Six kinds, and the list is closed:
26
+
27
+ 1. **A necessary internal refactor** — the change cannot land correctly
28
+ without it, and it changes no public surface.
29
+ 2. **A missing test** on a path this change touched.
30
+ 3. **A regression on a touched path** — the change surfaced it, so the change
31
+ owns it.
32
+ 4. **A small dependency adjustment** inside the existing major, no new
33
+ dependency.
34
+ 5. **A local API change inside already-defined semantics** — the contract does
35
+ not move, only its implementation.
36
+ 6. **A Boy-Scout cleanup** that is ALL of: small, local, low blast radius,
37
+ testable, and carrying no new product decision. Any one of the five
38
+ missing and it is not this row.
39
+
40
+ Each is **recorded as a scope delta in the PR body** — one line naming what
41
+ grew and why it was the agent's. The record is what makes the autonomy
42
+ reviewable afterwards, which is the condition under which it is legitimate at
43
+ all; growth done and not recorded is indistinguishable from scope creep.
44
+
45
+ ### Council-owned growth — resolved by the council, still not asked of the owner
46
+
47
+ Four kinds:
48
+
49
+ 1. **A larger internal re-cut** — the shape of the change, not its size.
50
+ 2. **Two equal technical strategies** with no evidence between them.
51
+ 3. **A risky compatibility design** — a technical risk, which is still
52
+ technical.
53
+ 4. **An unclear boundary carrying no new product semantics.**
54
+
55
+ These route through the ownership ladder — independent session → council →
56
+ team — and the verdict becomes a `## Decisions` row. None of them reaches the
57
+ owner, however consequential: a technical decision does not become owner-owned
58
+ because it is hard.
59
+
60
+ ### Owner-owned growth — the only rows that reach a person
61
+
62
+ Two, and only two:
63
+
64
+ 1. **The work changes what the product or the business does.** New
65
+ user-visible semantics, a commitment, a price, a policy.
66
+ 2. **It needs a typed op** — an operation from ADR-260's eleven-op vocabulary
67
+ for which no grant exists.
68
+
69
+ ### Everything else is a follow-up artifact
70
+
71
+ A larger unrelated opportunity — a refactor the mission did not touch, a
72
+ subsystem that deserves attention, a debt the change merely passed — does
73
+ **not** expand the mission. It becomes a follow-up artifact (a roadmap under
74
+ `agents/roadmaps/`, per `active-remediation`'s third tier), named in the PR
75
+ body, and the mission delivers what it was given.
76
+
77
+ The failure this prevents is the one that looks like diligence: a mission that
78
+ absorbs every good idea it meets delivers none of them, and the PR that
79
+ carries it cannot be reviewed against anything.
80
+
@@ -252,3 +252,50 @@ block and the closing reply carries none. It sees one user turn on one host,
252
252
  so everything outside that is model-carried, exactly like Iron Law 2's own
253
253
  "no gate ships for this" note. `check_reply_consistency` reads a single draft
254
254
  and holds no cross-turn state; it cannot see this law at all.
255
+
256
+ ## The native ask — per host, and what it changes
257
+
258
+ > **Why this is here and not in the rule.** `user-interaction` is a
259
+ > project-scope rule, so its every byte is re-written into the preamble on
260
+ > **every subagent spawn**, and `check_preamble_payload_budget` is a measured
261
+ > ratchet with no headroom — a four-line addition to the rule measured +219
262
+ > tokens per spawn and failed it. The rule's own § Mechanics already routes
263
+ > "everything you look up rather than obey" here, and the ask SHAPE is lookup
264
+ > material: Iron Law 1 governs the recommendation identically on both shapes,
265
+ > so the rule needed no new obligation, only this contract to point at.
266
+
267
+ `ask: native | text` is declared per host in `src/scripts/hook_manifest.yaml`
268
+ and printed by `agent-config hooks:status`. It is **declared, not probed**: the
269
+ row records what the host's documented tool surface offers. A host declaring
270
+ `native` whose primitive turns out to be absent degrades to the text block —
271
+ the same question, the same content — so a wrong row costs a missed upgrade and
272
+ never a broken ask. Absent reads `text`.
273
+
274
+ | Shape | What the ask is | Where the recommendation lives |
275
+ |---|---|---|
276
+ | `native` | the host's structured-ask tool call | the **default option** of the native ask |
277
+ | `text` | the numbered block, per Iron Law 1 | the `Recommendation:` / `Empfehlung:` line directly under the block |
278
+
279
+ Four obligations hold on both shapes, and three of them are why the native
280
+ form is preferred rather than merely available:
281
+
282
+ 1. **One decision point per turn.** A native ask presenting several unrelated
283
+ questions is the same violation as several text blocks. One number — or one
284
+ selection — answers it, or it is two asks.
285
+ 2. **Every option says what changes by answering it.** Not the option's name
286
+ again: the consequence. A native ask makes this structural, because an
287
+ option carries a description field the text form leaves to discipline.
288
+ 3. **The recommendation has exactly ONE source.** On a native ask that source
289
+ is the default option; naming it a second time in the prose above is the
290
+ drift Iron Law 1 exists to make structurally impossible.
291
+ 4. **The answer is recorded before the next step runs.** Where the ask came out
292
+ of a plan-closure pass, it becomes a `## Decisions` row — id, ownership,
293
+ `resolved by: owner`, the decision, its evidence, its `revisit if`. An
294
+ answer that lives only in the transcript is re-derived after the next
295
+ context reset, which is the repeat the ask census counts as a defect.
296
+
297
+ **What the native shape does NOT change.** It is not a license to ask more: the
298
+ one-question-per-turn floor, the no-cheap-questions floor and the ownership
299
+ routing all run first, and a question that should not have been asked is not
300
+ improved by a better widget. Nor does it change who may be asked — a technical
301
+ decision does not reach the owner on any host.