@event4u/agent-config 14.6.0 → 14.8.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 (258) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +255 -145
  3. package/README.md +1 -1
  4. package/dist/agent-src/commands/analyze/inbox.md +264 -10
  5. package/dist/agent-src/commands/analyze.md +1 -1
  6. package/dist/agent-src/commands/evals/git-pr-merge.json +13 -0
  7. package/dist/agent-src/commands/evals/roadmap.json +17 -1
  8. package/dist/agent-src/commands/pr/create.md +14 -2
  9. package/dist/agent-src/commands/pr/merge.md +379 -0
  10. package/dist/agent-src/commands/roadmap/process-full.md +272 -32
  11. package/dist/agent-src/commands/roadmap.md +1 -1
  12. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +46 -36
  13. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +37 -2
  14. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +95 -2
  15. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +289 -106
  16. package/dist/agent-src/rules/artifact-drafting-protocol.md +5 -1
  17. package/dist/agent-src/rules/context-hygiene.md +2 -0
  18. package/dist/agent-src/rules/decision-revisit-gate.md +67 -32
  19. package/dist/agent-src/rules/fix-what-you-see.md +108 -0
  20. package/dist/agent-src/rules/no-roadmap-references.md +0 -5
  21. package/dist/agent-src/rules/recurring-criticism.md +110 -0
  22. package/dist/agent-src/rules/roadmap-progress-sync.md +20 -1
  23. package/dist/agent-src/rules/rule-type-governance.md +0 -2
  24. package/dist/agent-src/rules/self-repair-loop.md +17 -0
  25. package/dist/agent-src/rules/skill-quality.md +0 -2
  26. package/dist/agent-src/rules/source-confidentiality.md +37 -7
  27. package/dist/agent-src/scripts/archival_sweep.ts +117 -0
  28. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +26 -7
  29. package/dist/agent-src/scripts/dashboard_mode.ts +212 -0
  30. package/dist/agent-src/scripts/gate_budget.ts +282 -0
  31. package/dist/agent-src/scripts/gate_execute.ts +72 -31
  32. package/dist/agent-src/scripts/roadmap_gates.ts +74 -3
  33. package/dist/agent-src/scripts/update_roadmap_progress.ts +296 -53
  34. package/dist/agent-src/skills/adr-create/SKILL.md +124 -5
  35. package/dist/agent-src/skills/ai-council/SKILL.md +48 -807
  36. package/dist/agent-src/skills/ai-council/references/advanced-modes.md +320 -0
  37. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +99 -0
  38. package/dist/agent-src/skills/ai-council/references/execution-modes.md +162 -0
  39. package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +125 -0
  40. package/dist/agent-src/skills/ai-council/references/procedure.md +143 -0
  41. package/dist/agent-src/skills/decision-record/SKILL.md +61 -3
  42. package/dist/agent-src/skills/decision-review/SKILL.md +65 -0
  43. package/dist/agent-src/skills/merge-conflicts/SKILL.md +26 -0
  44. package/dist/agent-src/skills/quality-tools/SKILL.md +34 -326
  45. package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +113 -0
  46. package/dist/agent-src/skills/quality-tools/references/php-tools.md +222 -0
  47. package/dist/agent-src/skills/roadmap-management/SKILL.md +15 -409
  48. package/dist/agent-src/skills/roadmap-management/references/archival.md +226 -0
  49. package/dist/agent-src/skills/roadmap-management/references/authoring.md +107 -0
  50. package/dist/agent-src/skills/roadmap-management/references/dashboard.md +47 -0
  51. package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +58 -0
  52. package/dist/agent-src/skills/security/SKILL.md +8 -0
  53. package/dist/agent-src/skills/security-audit/SKILL.md +12 -1
  54. package/dist/agent-src/skills/skill-writing/SKILL.md +34 -570
  55. package/dist/agent-src/skills/skill-writing/references/procedure.md +275 -0
  56. package/dist/agent-src/skills/skill-writing/references/read-only-scripts.md +18 -0
  57. package/dist/agent-src/skills/skill-writing/references/section-patterns.md +298 -0
  58. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  59. package/dist/agent-src/templates/roadmaps.md +65 -4
  60. package/dist/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
  61. package/dist/agent-src/templates/scripts/telemetry/remote.ts +160 -7
  62. package/dist/agent-src/templates/scripts/telemetry/transport.ts +169 -0
  63. package/dist/cli/registry.js +2 -1
  64. package/dist/cli/registry.js.map +1 -1
  65. package/dist/cli-delegate/chunk-2GNWGMAL.js +172 -0
  66. package/dist/cli-delegate/{chunk-P6LQDIWK.js → chunk-7PRE6ZV2.js} +338 -0
  67. package/dist/cli-delegate/{chunk-BKO2AZ7Z.js → chunk-B2ERU2VA.js} +1 -1
  68. package/dist/cli-delegate/chunk-E4XIZDIB.js +402 -0
  69. package/dist/cli-delegate/{chunk-3UCJWMMP.js → chunk-EEJUMCDZ.js} +16 -16
  70. package/dist/cli-delegate/{chunk-NXFWFAYV.js → chunk-G23AT6GD.js} +1 -0
  71. package/dist/cli-delegate/{chunk-XURJ4AQC.js → chunk-H4VIVD4C.js} +385 -284
  72. package/dist/cli-delegate/chunk-I3EIN2YG.js +36 -0
  73. package/dist/cli-delegate/{chunk-RLN73PR5.js → chunk-LPPWO5CE.js} +12 -8
  74. package/dist/cli-delegate/chunk-MWRD5YOH.js +100 -0
  75. package/dist/cli-delegate/{chunk-UEZ7D35A.js → chunk-N7CDDGI3.js} +4 -23
  76. package/dist/cli-delegate/{chunk-63WSP6YZ.js → chunk-PMEKGDED.js} +74 -167
  77. package/dist/cli-delegate/{chunk-GRRPEPRN.js → chunk-T7L2QK3K.js} +24 -5
  78. package/dist/cli-delegate/{chunk-EVTY7ISR.js → chunk-YM4GZDJG.js} +9 -1
  79. package/dist/cli-delegate/cmd_adr_effective.js +1162 -0
  80. package/dist/cli-delegate/cmd_conformance.js +466 -716
  81. package/dist/cli-delegate/cmd_converge.js +3 -3
  82. package/dist/cli-delegate/cmd_doctor.js +10 -10
  83. package/dist/cli-delegate/cmd_explain.js +1 -1
  84. package/dist/cli-delegate/cmd_export.js +10 -9
  85. package/dist/cli-delegate/cmd_handoff.js +10 -9
  86. package/dist/cli-delegate/cmd_memory_get.js +2 -1
  87. package/dist/cli-delegate/cmd_migrate.js +2 -2
  88. package/dist/cli-delegate/cmd_packs_active.js +1 -1
  89. package/dist/cli-delegate/cmd_preflight.js +5 -5
  90. package/dist/cli-delegate/cmd_prune.js +11 -10
  91. package/dist/cli-delegate/cmd_route_audit.js +6 -5
  92. package/dist/cli-delegate/cmd_route_explain.js +3 -3
  93. package/dist/cli-delegate/cmd_session_recycle.js +840 -30
  94. package/dist/cli-delegate/cmd_settings_get.js +3 -3
  95. package/dist/cli-delegate/cmd_settings_migrate.js +10 -9
  96. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  97. package/dist/cli-delegate/cmd_sync.js +11 -10
  98. package/dist/cli-delegate/cmd_uninstall.js +13 -11
  99. package/dist/cli-delegate/cmd_update.js +4 -4
  100. package/dist/cli-delegate/cmd_upgrade.js +4 -4
  101. package/dist/cli-delegate/cmd_validate.js +11 -10
  102. package/dist/cli-delegate/cmd_versions.js +3 -3
  103. package/dist/discovery/deprecation-report.md +1 -1
  104. package/dist/discovery/discovery-manifest.json +111 -37
  105. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  106. package/dist/discovery/discovery-manifest.summary.md +5 -5
  107. package/dist/discovery/dormancy-report.md +1 -1
  108. package/dist/discovery/orphan-report.md +1 -1
  109. package/dist/discovery/packs.json +15 -12
  110. package/dist/discovery/trust-report.md +3 -3
  111. package/dist/discovery/workspaces.json +11 -8
  112. package/dist/hooks/dispatch.js +3165 -2192
  113. package/dist/install/claudePathsPlan.js +187 -0
  114. package/dist/install/claudePathsPlan.js.map +1 -0
  115. package/dist/install/globalRuleLayers.js +169 -0
  116. package/dist/install/globalRuleLayers.js.map +1 -0
  117. package/dist/install/hostLayerFingerprint.js +136 -0
  118. package/dist/install/hostLayerFingerprint.js.map +1 -0
  119. package/dist/install/install.mjs +553 -425
  120. package/dist/install/partitionEligibility.js +432 -0
  121. package/dist/install/partitionEligibility.js.map +1 -0
  122. package/dist/install/ruleLayerPartition.js +157 -0
  123. package/dist/install/ruleLayerPartition.js.map +1 -0
  124. package/dist/mcp/registry-manifest.json +3 -3
  125. package/dist/mcp/server.json +2 -2
  126. package/dist/mcp/server.mjs +1863 -1234
  127. package/dist/router.json +1 -1
  128. package/dist/scripts/_lib/agent_src.js +41 -0
  129. package/dist/scripts/_lib/agent_src.js.map +1 -1
  130. package/dist/scripts/_lib/install_layout.js +83 -0
  131. package/dist/scripts/_lib/install_layout.js.map +1 -0
  132. package/dist/scripts/_lib/installed_lock.js +444 -0
  133. package/dist/scripts/_lib/installed_lock.js.map +1 -0
  134. package/dist/scripts/_lib/prune_empty_dirs.js +85 -0
  135. package/dist/scripts/_lib/prune_empty_dirs.js.map +1 -0
  136. package/dist/scripts/condense.js +63 -251
  137. package/dist/scripts/condense.js.map +1 -1
  138. package/dist/server/schemas/settings.js +4 -0
  139. package/dist/server/schemas/settings.js.map +1 -1
  140. package/docs/contracts/settings-classes.md +12 -6
  141. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +8 -3
  142. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +45 -1
  143. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +26 -0
  144. package/docs/guidelines/agent-infra/false-green.md +47 -1
  145. package/docs/guidelines/agent-infra/memory-access.md +17 -0
  146. package/docs/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
  147. package/package.json +1 -1
  148. package/src/agent-src/scripts/archival_sweep.ts +117 -0
  149. package/src/agent-src/scripts/archive_completed_roadmaps.ts +26 -7
  150. package/src/agent-src/scripts/dashboard_mode.ts +212 -0
  151. package/src/agent-src/scripts/gate_budget.ts +282 -0
  152. package/src/agent-src/scripts/gate_execute.ts +72 -31
  153. package/src/agent-src/scripts/roadmap_gates.ts +74 -3
  154. package/src/agent-src/scripts/update_roadmap_progress.ts +296 -53
  155. package/src/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
  156. package/src/agent-src/templates/scripts/telemetry/remote.ts +160 -7
  157. package/src/agent-src/templates/scripts/telemetry/transport.ts +169 -0
  158. package/src/config/agent-settings.template.yml +27 -2
  159. package/src/config/ci-local-parity.yml +39 -0
  160. package/src/config/estate-count-budget.json +612 -3
  161. package/src/config/evaluator-budgets.json +3 -3
  162. package/src/config/gate-coverage.yml +220 -12
  163. package/src/config/gate-violation-baselines.json +73 -63
  164. package/src/config/gitignore-block.txt +15 -2
  165. package/src/config/hook-latency-budget.json +5 -0
  166. package/src/config/rule-activation-census.json +14 -6
  167. package/src/config/rule-stub-ceilings.json +34 -7
  168. package/src/install/claudePathsPlan.ts +196 -0
  169. package/src/install/globalRuleLayers.ts +197 -0
  170. package/src/install/hostLayerFingerprint.ts +145 -0
  171. package/src/install/partitionEligibility.ts +502 -0
  172. package/src/install/ruleLayerPartition.ts +212 -0
  173. package/src/scripts/_cli/cmd_adr_effective.ts +484 -0
  174. package/src/scripts/_cli/cmd_session_recycle.ts +9 -1
  175. package/src/scripts/_dispatch.bash +17 -1
  176. package/src/scripts/_lib/ac_heading.ts +30 -0
  177. package/src/scripts/_lib/adr_frontmatter.test.ts +365 -0
  178. package/src/scripts/_lib/adr_frontmatter.ts +459 -0
  179. package/src/scripts/_lib/agent_src.ts +42 -0
  180. package/src/scripts/_lib/bench_ab_pinned_repo.ts +162 -0
  181. package/src/scripts/_lib/bench_ab_workspace.ts +10 -1
  182. package/src/scripts/_lib/envelope_grounding.ts +49 -9
  183. package/src/scripts/_lib/installed_lock.ts +50 -5
  184. package/src/scripts/_lib/layer_overlap_notice.ts +11 -2
  185. package/src/scripts/_lib/md_section.ts +129 -0
  186. package/src/scripts/_lib/prune_empty_dirs.ts +80 -0
  187. package/src/scripts/_lib/scope_guard.sh +26 -3
  188. package/src/scripts/_lib/self_repair.ts +19 -0
  189. package/src/scripts/_lib/self_repair_class_b.ts +171 -0
  190. package/src/scripts/adr/evidence_census.ts +899 -0
  191. package/src/scripts/adr/regenerate_index.ts +12 -32
  192. package/src/scripts/adr_cite_check.ts +540 -39
  193. package/src/scripts/ai_council/cli_help.ts +55 -0
  194. package/src/scripts/audit_adr_coverage.ts +103 -17
  195. package/src/scripts/before_complete_hook.ts +153 -28
  196. package/src/scripts/bench_ab_v2_complexity.ts +27 -7
  197. package/src/scripts/bench_hook_latency.ts +204 -0
  198. package/src/scripts/build_archive_index.ts +34 -0
  199. package/src/scripts/check_adr_frontmatter.ts +574 -39
  200. package/src/scripts/check_hook_bundle_content.ts +219 -0
  201. package/src/scripts/check_new_adr_evidence.ts +529 -0
  202. package/src/scripts/check_references.ts +78 -0
  203. package/src/scripts/check_release_published.ts +32 -11
  204. package/src/scripts/check_rule_layer_partition.ts +531 -0
  205. package/src/scripts/check_single_delivery.ts +194 -17
  206. package/src/scripts/check_standing_rule_delivery.ts +8 -2
  207. package/src/scripts/ci_settle.ts +170 -0
  208. package/src/scripts/condense.ts +79 -259
  209. package/src/scripts/council_cli.ts +3 -3
  210. package/src/scripts/dispatch_r2_reviewer.ts +6 -14
  211. package/src/scripts/external_sources_denylist.json +4 -1
  212. package/src/scripts/hook_manifest.json +1 -1
  213. package/src/scripts/hook_manifest.yaml +77 -14
  214. package/src/scripts/hooks/block_no_verify.ts +61 -10
  215. package/src/scripts/hooks/block_unauthorized_git.ts +21 -1
  216. package/src/scripts/hooks/concern_registry.ts +4 -0
  217. package/src/scripts/hooks/dispatch_hook.ts +154 -187
  218. package/src/scripts/hooks/dispatch_issues.ts +38 -19
  219. package/src/scripts/hooks/fallback_yaml.ts +66 -0
  220. package/src/scripts/hooks/host_semantics.ts +21 -0
  221. package/src/scripts/hooks/injection_budget.ts +13 -3
  222. package/src/scripts/hooks/py_json_dumps.ts +103 -0
  223. package/src/scripts/hooks/rtk_wrap_hook.ts +8 -3
  224. package/src/scripts/hooks/run_continuation_hook.ts +8 -5
  225. package/src/scripts/hooks/ship_diff_volume_hook.ts +81 -15
  226. package/src/scripts/hooks/source_first_gate_hook.ts +464 -0
  227. package/src/scripts/hooks/state_io.ts +870 -21
  228. package/src/scripts/hooks/stdin_failure_policy.ts +96 -0
  229. package/src/scripts/hooks/subagent_ledger_hook.ts +44 -15
  230. package/src/scripts/hooks/telemetry_flush_hook.ts +139 -0
  231. package/src/scripts/hooks/telemetry_self_repair.ts +128 -0
  232. package/src/scripts/hooks/telemetry_usage_hook.ts +22 -4
  233. package/src/scripts/hooks/turn_end_gate_hook.ts +81 -15
  234. package/src/scripts/injection_scan_hook.ts +137 -5
  235. package/src/scripts/install.ts +16 -11
  236. package/src/scripts/language_mirror_hook.ts +561 -25
  237. package/src/scripts/lint_framework_leakage_allowlist.json +2 -2
  238. package/src/scripts/lint_hook_manifest.ts +49 -0
  239. package/src/scripts/lint_plan_risk_register.ts +4 -3
  240. package/src/scripts/lint_provenance_vocabulary.ts +472 -4
  241. package/src/scripts/lint_skill_router_head.ts +4 -4
  242. package/src/scripts/mcp_server/tools.ts +2 -2
  243. package/src/scripts/new_roadmap.ts +136 -0
  244. package/src/scripts/pack_mcp_content.ts +20 -5
  245. package/src/scripts/release.ts +37 -38
  246. package/src/scripts/report_layer_overlap.ts +6 -0
  247. package/src/scripts/routing_doctor.ts +5 -1
  248. package/src/scripts/self_repair_hook.ts +37 -5
  249. package/src/scripts/session_register_hook.ts +11 -0
  250. package/src/scripts/skill_usage_collect.ts +11 -1
  251. package/src/scripts/skill_usage_report.ts +278 -8
  252. package/src/scripts/sync_pr_branch.ts +170 -20
  253. package/src/server/schemas/settings.ts +8 -0
  254. package/dist/cli-delegate/chunk-EJITJBJX.js +0 -172
  255. package/dist/cli-delegate/chunk-PZWRPRWP.js +0 -38
  256. package/dist/cli-delegate/{chunk-PPQO4NGR.js → chunk-6RJA2F5A.js} +3 -3
  257. package/dist/cli-delegate/{chunk-RYNADUFG.js → chunk-LWTYTX6F.js} +0 -0
  258. package/dist/cli-delegate/{chunk-FBKL6JWT.js → chunk-MMSGVZKV.js} +3 -3
@@ -4,8 +4,8 @@ Loaded by [`roadmap-process-loop § 3`](roadmap-process-loop.md) when the run's
4
4
  **derived** mode is `autonomous` or `phase-checkpoints`. The mode comes from the
5
5
  § 3a ladder — explicit invocation suffix, then frontmatter `execution.mode`,
6
6
  then the invocation form — so an ABSENT frontmatter field no longer keeps this
7
- context unloaded: under `process-full` / `/roadmap:next` it derives
8
- `autonomous`, under `process-phase` it derives `phase-checkpoints`. Only a
7
+ context unloaded: under `process-full` it derives `autonomous`, and under
8
+ `/roadmap:next` or `process-phase` it derives `phase-checkpoints`. Only a
9
9
  *derived* `interactive` (asked for explicitly, declared in frontmatter, or
10
10
  `process-step`) leaves this context unloaded and falls back to the legacy
11
11
  commit-step scan. Defines the run-start pre-scan,
@@ -23,6 +23,21 @@ declared mode into this-turn grants **cached for this run only**
23
23
  (same mechanism as the commit pre-scan it extends). Stale frontmatter
24
24
  is harmless: no confirmation, no grants.
25
25
 
26
+ **`/roadmap:process-full` is the exception, per
27
+ [ADR-237](../../../docs/decisions/ADR-237-end-to-end-execution-authority.md):
28
+ the invocation IS the confirmation.** There is no separate acceptance round
29
+ and no contract screen to wait on — the user asked for the finished PR, and
30
+ the grants in § 3 activate on the invocation itself, whatever
31
+ `execution.mode` says or fails to say. **A missing `execution:` block does
32
+ not reduce the grant** under this wrapper; it only means the roadmap's author
33
+ declared nothing, which was never the authorization anyway. Waiting for an
34
+ acceptance the user already gave is the mid-run interruption
35
+ `process-full § Final-PR-only` forbids.
36
+
37
+ For `process-step` and `process-phase` the confirmation round stays: their
38
+ scope is narrow enough that a contract screen costs one line, and neither
39
+ carries ADR-237's end-to-end delegation.
40
+
26
41
  ## 1. Pre-scan — four detection classes
27
42
 
28
43
  Scan every open step (text + inline notes) for:
@@ -63,6 +78,8 @@ Artifacts: <N> planned (skills/rules/commands/guidelines) —
63
78
  Open questions: <N> → decision sheet below (<M> rows); the rest via AI
64
79
  council (<members | "none configured — will halt on ambiguity">)
65
80
  Quality: <cadence> · Dashboard: <cadence>
81
+ Late artifacts: <halt | auto-research> (default halt; cap 3 then halt)
82
+ Deferred items: <wait | spawn-follow-up-draft | cancel-with-memo> (default wait)
66
83
 
67
84
  <decision sheet, per contract-decision-sheet — omitted entirely when M = 0>
68
85
 
@@ -82,6 +99,66 @@ re-ask inside the run. Adjust → apply, re-show once. The contract is
82
99
  re-derived on every invocation — it always reflects the roadmap's and
83
100
  repo's current state.
84
101
 
102
+ ### 2a. `late_artifacts` — what happens to an artifact the plan did not name
103
+
104
+ An artifact discovered **after** Accept was outside the batched overlap check,
105
+ so the research the contract summary reported does not cover it. Two policies,
106
+ and the field is on the screen because the choice changes what the run may do
107
+ without asking:
108
+
109
+ | Value | Behaviour |
110
+ |---|---|
111
+ | `halt` (**default**) | The run stops at the discovery with the scope-out-of-roadmap halt. The artifact is reported, not authored. |
112
+ | `auto-research` | The run re-runs Phase B (Research) and the overlap pass mid-run against the *current* artifact state — the identical procedure already accepted as non-interactive at contract time, only later. An **extend** verdict extends silently; a **create** verdict derives its understand-answers from the step text and the sheet answers; only a genuine overlap conflict halts. Capped at **three** late artifacts per run, then halt regardless. |
113
+
114
+ <!-- decision 2026-08-20: the shipped default is `halt`, not `auto-research`.
115
+ AI council 2/2 (anthropic + openai) on the `autonomy-defaults-sheet` fork
116
+ of road-to-user-out-of-the-loop, record
117
+ agents/evidence/council/drain-blocker-dispositions-a.md. Reasoning: the
118
+ roadmap's own Risk 7 is that auto-research drifts the run's scope, and its
119
+ stated mitigation is the cap — but a cap of three is a bound on how far the
120
+ drift goes, not a check on whether it should happen at all. `halt` is also
121
+ the behaviour the tree already had, so shipping it as the default means
122
+ this field is purely additive: nothing that worked before changes, and the
123
+ aggressive path becomes a thing a run declares rather than a thing it
124
+ inherits. Reversibility: flipping the default is one word in this table
125
+ plus one word in the mechanics guideline, with no dependent mechanism to
126
+ unwind, and the roadmap's own kill criterion (late-artifact revisit rate)
127
+ only becomes measurable once some runs declare `auto-research` — which an
128
+ opt-in still permits and a silent default would have made unattributable. -->
129
+
130
+ The cap is not negotiable by the field: a run that keeps discovering artifacts
131
+ has a planning problem, not an autonomy problem, and the third discovery is the
132
+ signal to say so.
133
+
134
+ ### 2b. `deferred_policy` — the two autonomous exits for a `[~]` item
135
+
136
+ [`roadmap-progress-sync`](../../rules/roadmap-progress-sync.md) Iron Law 3
137
+ forbids a silent archive with unresolved deferred items. That gate is
138
+ unchanged. What this field changes is which dispositions a run may reach
139
+ **without a synchronous prompt**, and there are exactly two, because the
140
+ preservation test in that rule already splits them the same way:
141
+
142
+ | Value | Behaviour |
143
+ |---|---|
144
+ | `wait` (**default**) | The synchronous halt stands. Every disposition stays conversational. |
145
+ | `spawn-follow-up-draft` | A roadmap closing with `[~]` items spawns the follow-up draft automatically, carrying each item **and** its blocker. The item stays alive in the active estate, which is what makes this council-decidable rather than owner-reserved. |
146
+ | `cancel-with-memo` | An item the run can show is no longer wanted is recorded `[-]` with a reasoning memo naming what changed. This is a **drop**, so it is owner-reserved by the preservation test: the run WRITES the memo and the recommendation, and the archive still waits for the user on that item. |
147
+
148
+ <!-- decision 2026-08-20: the policy offers BOTH exits — a follow-up draft and
149
+ an explicit cancellation with a reasoning memo — not the follow-up draft
150
+ alone. AI council 2/2 (anthropic + openai), same record as above.
151
+ Reasoning: follow-up-draft-only means every deferred item must be carried,
152
+ and a carried item nobody wants becomes the parking lot the roadmap's own
153
+ Risk 5 describes for memos. Offering cancellation makes "this is no longer
154
+ wanted" a statable outcome with a written reason instead of an indefinite
155
+ deferral wearing a follow-up roadmap. Reversibility, and it is the load-
156
+ bearing half: the cancellation exit does NOT lower the gate, because a
157
+ drop stays owner-reserved — the run produces the memo, the user still
158
+ decides. Removing the value later removes an option nobody was obliged to
159
+ use; the default stays `wait` either way. -->
160
+
161
+
85
162
  ## 3. Grants activated by acceptance
86
163
 
87
164
  | Grant | Boundary |
@@ -93,6 +170,17 @@ repo's current state.
93
170
  | Batched artifact drafting | The drafting-protocol **Research/overlap pass runs NOW at contract time against current artifact state**; results cached; Understand/Draft phases run non-interactively during the run. Artifacts NOT in the batch still trigger the interactive protocol |
94
171
  | Council auto-enable | In-run open questions route to the AI council silently; `high_impact` / `user_required` classifications STILL escalate to the user per [`ask-when-uncertain`](../../rules/ask-when-uncertain.md). **No council configured** → the contract summary says so and in-run true ambiguity halts (never silent guessing) |
95
172
 
173
+ **`process-full` only — added by ADR-237**, because a delegation that ends at
174
+ the PR has to be able to reach one:
175
+
176
+ | Grant | Boundary |
177
+ |---|---|
178
+ | Update the PR after opening it — title, body, further pushes to the same branch | Still never merge, close or retarget |
179
+ | Reversible repository / branch settings the agent can change (branch protection included) | Only settings this run needs to reach a reviewable PR, and only reversible ones; a setting the agent changes it also restores if the run's need ends |
180
+ | Start, re-run and fix CI; update the merge base; resolve conflicts | Standard git and CI operations on the run's own branch |
181
+ | Install project-local dependencies | Inside the repo; never a global or system package manager without its own confirmation |
182
+ | Any tool, CLI, API, model, council or external service the work needs | Cumulative **USD 25** per run of variable spend; over that, the owner is asked BEFORE crossing. Uncertainty is not a reason to ask. Marginal cost of an existing subscription is $0. Splitting spend across services, subagents or rounds to keep each item under the ceiling is a violation |
183
+
96
184
  These grants satisfy [`scope-control`](../../rules/scope-control.md)'s
97
185
  "standing instruction" clause for the run — see
98
186
  [`scope-mechanics § Roadmap execution contract`](../authority/scope-mechanics.md).
@@ -111,6 +199,11 @@ git grants are omitted from the contract (nothing to authorize —
111
199
 
112
200
  ## 5. What acceptance can NEVER cover
113
201
 
202
+ **ADR-237 widens § 3 and leaves this section untouched — deliberately.** An
203
+ end-to-end delegation is tolerable precisely because a PR is reviewable before
204
+ it merges, so the boundary that keeps merging out is the one that makes the rest
205
+ safe. Nothing below is reachable by any invocation.
206
+
114
207
  - Any [`non-destructive-by-default`](../../rules/non-destructive-by-default.md)
115
208
  trigger beyond the two named grants (own-branch push, PR-open):
116
209
  prod-trunk anything, deploys, bulk deletions, infra commits.
@@ -112,7 +112,8 @@ Rung 3, by wrapper:
112
112
 
113
113
  | Wrapper | Derived mode | Contract |
114
114
  |---|---|---|
115
- | `/roadmap:process-full`, `/roadmap:next` | `autonomous`, **preselected** | offered |
115
+ | `/roadmap:process-full` | `autonomous`, **preselected** | offered |
116
+ | `/roadmap:next` | `phase-checkpoints`, **preselected** | offered |
116
117
  | `/roadmap:process-phase` | `phase-checkpoints` | offered |
117
118
  | `/roadmap:process-step` | — | none (one step needs no run contract) |
118
119
 
@@ -122,6 +123,25 @@ screen's `3. Run interactive instead` option
122
123
  ([`roadmap-execution-contract § 2`](roadmap-execution-contract.md)) stays on it
123
124
  in every case, so a derived mode is always one keystroke from being refused.
124
125
 
126
+ <!-- decision 2026-08-20: /roadmap:next preselects `phase-checkpoints`, not
127
+ `autonomous`. AI council 2/2 (anthropic + openai) on the
128
+ `autonomy-defaults-sheet` fork of road-to-user-out-of-the-loop, record
129
+ agents/evidence/council/drain-blocker-dispositions-a.md. Reasoning: the two
130
+ wrappers differ in what the user has actually seen at Accept time.
131
+ `process-full` names one roadmap the user chose, so `autonomous` is a
132
+ preselection over a scope they read. `/roadmap:next` SELECTS the roadmap
133
+ itself, so `autonomous` there preselects full autonomy over a target the
134
+ user has not seen — the one rung where the derivation picks the object and
135
+ the scope in the same keystroke. Reversibility: this is a preselected
136
+ option on a screen that still offers `1. Go — start processing
137
+ autonomously`, so the aggressive path costs one keystroke and no rebuild;
138
+ flipping the row back is a one-line edit with no dependent mechanism.
139
+ Deliberately scoped to `/roadmap:next` only — the blocker's question named
140
+ that wrapper, and Phase 1 Step 1 of the parent roadmap landed with
141
+ `process-full` → `autonomous` explicitly, so widening the change would
142
+ silently reverse an already-shipped step nobody asked to revisit. -->
143
+
144
+
125
145
  **Why the old fallback was a defect and not a conservative default.** Absent
126
146
  `execution.mode` used to mean the legacy commit-step scan, which derives no
127
147
  contract at all — no batched artifact drafting, no council auto-enable, no
@@ -132,6 +152,23 @@ path *under the wrapper built for the opposite*, and silently — the user saw a
132
152
  A default that contradicts the wrapper the user just typed is a wrong answer,
133
153
  not a safe one.
134
154
 
155
+ **Kill criteria — carried here, at the flip, not only in the roadmap that
156
+ made it.** A default flip whose reversal condition lives in a roadmap is a
157
+ flip nobody can reverse once that roadmap is archived, which is why both
158
+ conditions below sit next to the table they govern:
159
+
160
+ - **The ladder itself** (absent `execution.mode` derives a mode instead of
161
+ falling back to interactive): `3. Run interactive instead` chosen at the
162
+ contract screen in **more than 40 % of 20 runs** reverts rung 3, leaving
163
+ the ladder at explicit-suffix-then-frontmatter only. **No instrument
164
+ today** — nothing records which contract option was chosen, so the rate is
165
+ unmeasured rather than low. Stated so the gap is visible at the flip.
166
+ - **The `/roadmap:next` row** (`phase-checkpoints` rather than
167
+ `autonomous`): reverted if checkpoint-mode runs on that wrapper are
168
+ observed to stop at a phase boundary the user then waves through without
169
+ a change — that is a contact the preselection bought nothing for. Same
170
+ missing instrument, same honesty: this is a condition, not a reading.
171
+
135
172
  **What this does NOT change.** A derived mode grants nothing on its own:
136
173
  authorization is still the single Accept on the contract screen, per
137
174
  [`roadmap-execution-contract § Principle`](roadmap-execution-contract.md). The
@@ -180,82 +217,168 @@ change in § 3a.
180
217
  `commit-policy` § NEVER ask about committing holds regardless of
181
218
  autonomy).
182
219
 
183
- ### 3c. Runnable-work precondition — refuse a run with nothing to do
220
+ ### 3c. Capability screen — can the agent do this at all?
184
221
 
185
222
  ```
186
- A RUN WITH NO RUNNABLE OPEN STEP DOES NOT START.
187
- NAME THE BLOCKERS. CREATE NO BRANCH. WRITE NOTHING.
188
- THIS IS A PRECONDITION, NEVER A HALT — IT CANNOT FIRE MID-RUN.
223
+ A RUN ALWAYS STARTS. THERE IS NO PREFLIGHT REFUSAL.
224
+ PER OPEN STEP, ASK ONE QUESTION: CAN THE AGENT EXECUTE THIS AT ALL?
225
+ YES → IT IS WORK. NO → IT IS THE ONLY KIND OF BLOCKER LEFT.
226
+ WHO CONVENTIONALLY DOES A THING IS NOT A PROPERTY OF THE THING.
189
227
  ```
190
228
 
191
- Run once, at the end of the pre-scan, before any grant is exercised.
192
-
193
- **Runnable** is decided from the roadmap's own `## Blockers` section and nothing
194
- else. An open step is **not** runnable when a blocker satisfies all four:
195
-
196
- 1. it exists in `## Blockers` **before this run started** — a blocker the run
197
- itself authored does not count (see the gaming note below);
198
- 2. its `Class:` is `2` (consent-once) or `3` (human-only) — classes `0` and `1`
199
- are agent-runnable by construction and carry a `Run:` the agent executes,
200
- per [`templates/roadmaps.md`](../../templates/roadmaps.md);
201
- 3. its `Blocks:` field names this step, by phase-and-step identifier or by a
202
- phase whose scope contains it;
203
- 4. it names what would clear it.
204
-
205
- Every other open step is runnable. **No blocker citation → runnable**, and the
206
- default direction is deliberate: the failure this precondition must not have is
207
- refusing work an agent could have done.
208
-
209
- - **At least one runnable open step** → the run proceeds. It does *not* matter
210
- how many steps are blocked; the blocked ones are skipped in place (never
211
- flipped — see the terminal-outcomes section), and the run works the rest.
212
- - **Zero runnable open steps** → `blocked-preflight`. Report the roadmap, the
213
- open-step count, and each blocker with its class and its clearing action.
214
- Create no branch, write no state, take no grant.
215
-
216
- **A step this precondition judges non-runnable carries a `blocked-by:` marker on
217
- its own line.** The obligation is here because two mechanisms read blockedness
218
- from two different places and only one of them reads this section: `run-continuation`,
219
- the stop-slot concern that re-engages an autonomous run, decides open-vs-blocked
220
- from the inline `<!-- blocked-by: <id> -->` marker and never parses `## Blockers`
221
- at all. Without the marker a step that IS blocked per the four conditions above
222
- still counts as open work to the concern, which re-engages the agent into it every
223
- stop fire until the stall rung fires — the mechanism whose job is to detect a
224
- stall manufacturing one, which is the failure shape this file already records once
225
- for the roadmap-root split.
226
-
227
- Round 8 finding 7 caught the two predicates as disjoint. The fix is this coupling
228
- sentence rather than teaching the concern to parse `## Blockers`: a second
229
- implementation of the four conditions is a second thing to keep in step, and the
230
- one-line marker is checkable by eye at the step it belongs to. **The residual is
231
- real and is not papered over:** nothing enforces the pairing, so a `## Blockers`
232
- entry authored without its marker is caught by review or not at all.
233
-
234
- **Why a precondition and not a sixth halt.** The five halt conditions interrupt
235
- work that is still runnable; this decides whether any runnable work exists at
236
- all. Keeping them structurally separate is what preserves the forbidden-list's
237
- authority over mid-run stopping — an agent that may not stop for "this phase is
238
- large" also may not stop for "this feels human-gated". AI council 2026-08-19,
239
- 2/2 convergent, explicitly on this point: *"keep this structurally separate from
240
- 'five, and only five': the five are exceptional halts; `blocked` is an
241
- exhaustion-of-runnable-work terminal outcome."*
242
-
243
- **The gaming vector, named because it is the one thing that would make this
244
- worse than the gap it closes.** An agent meets a hard step, writes a `## Blockers`
245
- entry claiming Class 3, cites it, and stops — a comfort-stop wearing a citation.
246
- Condition 1 is the whole defence: a blocker must pre-date the run, which is
247
- checkable from git rather than from the agent's word. A blocker discovered
248
- mid-run is recorded (that is honest and useful) and does **not** make the step
249
- non-runnable in this run.
250
-
251
- **One imprecision, recorded rather than smoothed over.** The class taxonomy has
252
- four rows and none of them says *"waiting on time"* or *"waiting on another
253
- roadmap"*. A soak window and a cross-roadmap dependency are authored as `3`
254
- today, because absence of `Class:` already means `3` — so they are decidable but
255
- mislabelled as human-only. A fifth class is a taxonomy change with a linter
256
- behind it (`lint_roadmap_blockers`) and is not made here.
257
- *Revisit-if:* a run is refused on a blocker whose real content is "wait", and
258
- the report reads wrong to the person holding it.
229
+ **Rewritten by [ADR-237](../../../docs/decisions/ADR-237-end-to-end-execution-authority.md),
230
+ which supersedes ADR-235.** This section used to be a *preflight refusal*: a run
231
+ with no "runnable" open step created no branch and wrote nothing. That is gone.
232
+ The invocation is a delegation, so the question is no longer *is this step
233
+ runnable under current governance* but *is this step possible for the agent at
234
+ all.*
235
+
236
+ Run once at the end of the pre-scan, and again immediately before any `blocked`
237
+ report.
238
+
239
+ **The screen, in order:**
240
+
241
+ 1. **Can the agent execute it?** Through the filesystem, git, `gh`, an API, a
242
+ CLI, a tool, a model, a council — anything machine-executable. If yes, the
243
+ step is **work**. Stop here; no blocker citation changes that.
244
+ 2. **Is the authority already implied by the invocation?** For a `process-full`
245
+ run: branches, chunked commits, pushing that branch, opening and updating the
246
+ PR, reversible repository/branch settings, CI runs and re-runs, merge-base
247
+ updates, conflict resolution, project-local dependencies, and paid calls
248
+ inside the cumulative USD 25 ceiling. If yes → **run it**.
249
+ 3. **Is it on the EXCLUDED list?** Merging to a production trunk, deploying,
250
+ production data / secrets / IAM / DNS, bulk deletion outside the roadmap's
251
+ scope, an irreversible external action beyond the PR itself. Those keep their
252
+ own this-turn confirmation ([`non-destructive-by-default`](../../rules/non-destructive-by-default.md))
253
+ and are a **halt**, not a blocker.
254
+ 4. **Otherwise it is externally impossible**, and only then is it a blocker: a
255
+ credential that does not exist and cannot be created · a purchase beyond the
256
+ budget · physical hardware access · another person or organisation must act ·
257
+ a wait that is factually mandatory and unverifiable.
258
+
259
+ **A `## Blockers` entry is evidence, never a verdict.** A `Class: 3` label on an
260
+ action the agent can perform is a **defect in the roadmap**, and the run repairs
261
+ the label rather than obeying it — recording what it did and why. Class `0`/`1`
262
+ entries carry a `Run:` the agent executes, exactly as before. Class `2`
263
+ (consent-once) is pre-cleared for the duration of a `process-full` run when the
264
+ consent it wants is one the invocation already gave; a `2` asking for something
265
+ the invocation did NOT give (an EXCLUDED action, a spend crossing) still reaches
266
+ the owner.
267
+
268
+ **No citation → work**, and the default direction is unchanged: the failure this
269
+ screen must not have is declining work an agent could have done.
270
+
271
+ **A step this screen judges externally impossible carries a `blocked-by:` marker
272
+ on its own line.** The obligation is unchanged and its reason is unchanged: two
273
+ mechanisms read blockedness from two different places and only one reads this
274
+ section — `run-continuation`, the stop-slot concern that re-engages an autonomous
275
+ run, decides open-vs-blocked from the inline `<!-- blocked-by: <id> -->` marker
276
+ and never parses `## Blockers`. Without the marker a step that IS impossible
277
+ still counts as open work to the concern, which re-engages the agent into it
278
+ every stop fire until the stall rung fires — the mechanism whose job is to detect
279
+ a stall manufacturing one. **The residual is real and is not papered over:**
280
+ nothing enforces the pairing, so a `## Blockers` entry authored without its
281
+ marker is caught by review or not at all.
282
+
283
+ **The gaming vector inverted, and both directions are now named.** Under ADR-235
284
+ the vector was an agent writing itself a Class-3 blocker to stop early; the
285
+ defence was that a qualifying blocker must **pre-date the run**, checkable from
286
+ git. That defence is kept for the narrow blocker set that remains. ADR-237 adds
287
+ the opposite vector — an agent that keeps going past a spend ceiling or into an
288
+ EXCLUDED action under cover of "the roadmap needed it" — and its defences are
289
+ step 3 above being an enumerated list rather than a characterisation, and the
290
+ ceiling being cumulative per run rather than per action.
291
+
292
+ **One imprecision, inherited and now given a test.** The class taxonomy has no
293
+ row for *"waiting on time"* or *"waiting on another roadmap"*; both are authored
294
+ as `3` today because an absent `Class:` already means `3`. Under step 4 a wait is
295
+ a blocker only when it is factually mandatory and unverifiable — a soak window a
296
+ run can simply outlast, or a cross-roadmap dependency the run can satisfy itself,
297
+ is work. The taxonomy still lacks the row; the mislabel now has a stated test
298
+ instead of a default.
299
+
300
+ ### 3d. Set contract — one contract over an enumerated set
301
+
302
+ A **set contract** is the ordinary contract screen rendered over a closed,
303
+ ordered list of roadmaps instead of one. It grants
304
+ [`autonomy-mechanics § Task-scope`](autonomy-mechanics.md)'s **set-scoped**
305
+ shape, whose four conditions (enumerated before Accept · closed · ordered with
306
+ independence declared · one Accept) are the authorization contract — this
307
+ section is only the loop's side of it.
308
+
309
+ **What the screen must print, per member.** Roadmap path, derived branch name,
310
+ open-step count, artifact count from the pre-scan, and its dependency edges.
311
+ One decision sheet spans the whole set: a question that applies to several
312
+ members appears once, and its answer applies to all of them.
313
+
314
+ **Dependency edges come from two sources, unioned.**
315
+
316
+ | Source | Shape | Trust |
317
+ |---|---|---|
318
+ | Declared | `depends:` in the dependent roadmap's frontmatter — a list of roadmap slugs | authoritative; a declared edge is never overridden by the heuristic |
319
+ | Inferred | **file overlap**: the intersection of the owned-path sets the two pre-scans derived | advisory; an inferred edge orders the members and marks them non-parallelizable, and is printed as inferred so the user can see why |
320
+
321
+ The union feeds exactly two decisions and nothing else: **ordering** (a
322
+ dependent member runs after its parent) and **parallelizability** (only members
323
+ with no edge between them and disjoint owned paths are lane candidates). An
324
+ inferred edge is deliberately allowed to be wrong in the conservative
325
+ direction — a false edge costs serial execution, a missed edge costs a
326
+ collision, so overlap resolves toward *serial*.
327
+
328
+ #### Auto-continuity — the next member needs no new contact
329
+
330
+ Under an accepted set contract, when a member closes **green** the loop pulls
331
+ the next member whose dependencies are all satisfied and starts it without a
332
+ new contact. Green means: its own final report ran, its quality cadence passed,
333
+ and no halt class fired. Anything else is not green and does not continue —
334
+ see failure isolation below.
335
+
336
+ The default stays **this one only**: auto-continuity applies to
337
+ `/roadmap:next` and to any wrapper reaching this section **only when the set
338
+ option was chosen on the sheet**. A single-roadmap invocation is never widened
339
+ into a set because more roadmaps happened to be open, which is condition 4 of
340
+ the set-scoped shape read from the loop's side.
341
+
342
+ #### Failure isolation — a regression halts its own member, not the set
343
+
344
+ A quality regression, a failed verify probe, or a halt class firing inside one
345
+ member terminates **that member** and leaves the rest of the set running:
346
+
347
+ 1. Record the member's outcome as halted, with the halt class and the evidence.
348
+ 2. Skip every member that declares a dependency on it — transitively. A
349
+ dependent member of a halted parent is *blocked*, not failed, and is
350
+ reported as such.
351
+ 3. Continue with the next independent member.
352
+ 4. Report every member's outcome in one final report at the end of the set.
353
+
354
+ Two carve-outs, and they are the reason this is isolation rather than
355
+ tolerance. A **Hard-Floor** stop and a **locked decision class** stop the whole
356
+ set, not one member: both are about the user's authority rather than about the
357
+ member's code, and continuing past them under a set contract would be exactly
358
+ the "several authorizations from one Accept" failure the enumeration guards
359
+ against. Likewise the **N=3 validation budget** is per validation target and is
360
+ not reset by moving to the next member.
361
+
362
+ #### Parallel lanes — the shape, and why they are not on yet
363
+
364
+ Lanes are **staged**, not shipped: the gate is ten clean serial set runs, and
365
+ that gate has not been reached because no set run has happened. Recorded here
366
+ so the shape is settled before the runs rather than designed under pressure:
367
+
368
+ - **Cap: two lanes** in the first iteration — a recorded decision
369
+ (`decision 2026-08-20`, AI council 2/2 on the `autonomy-defaults-sheet`
370
+ fork), chosen over the configured `subagents.max_parallel` because a
371
+ collision at two lanes is diagnosable and one at N is not. Reversible: the
372
+ cap is one number in the set contract, and raising it after the first ten
373
+ clean parallel runs is strictly cheaper than recovering from a lost branch.
374
+ - **Candidate test:** no dependency edge in either direction, and disjoint
375
+ owned paths.
376
+ - **Isolation:** the existing worktree scope lock
377
+ ([`worktree-lifecycle`](../../skills/worktree-lifecycle/SKILL.md)).
378
+ - **Coordination:** session-register branch claims, so two sessions never share
379
+ a branch.
380
+ - **Delivery:** one branch and one PR per lane.
381
+ - **Immediate removal:** a single scope-lock collision with data loss.
259
382
 
260
383
  ## 4. Resolve cadences — read once, cache for the run
261
384
 
@@ -411,7 +534,39 @@ For each open step in the working set (scope-bound — see wrapper):
411
534
  Empty output → Iron Law 2 was violated this iteration: the step
412
535
  landed work but no checkbox flipped. **Halt loudly**, surface
413
536
  "step <N> landed without checkbox flip — flip then resume", and
414
- stop the run. Do not auto-fix; the user resumes on the next turn.
537
+ stop the run. Outside an accepted contract: do not auto-fix; the user
538
+ resumes on the next turn. Inside one: exactly one self-fix attempt, under
539
+ the four preconditions below.
540
+
541
+ **One deterministic self-fix, contract mode only.** A forgotten flip is the
542
+ one halt class whose repair is mechanical — the work is on disk, the step is
543
+ named, and the glyph follows from the outcome. Halting a contract run on it
544
+ spends a user contact to retype something the run can derive. So inside an
545
+ accepted contract the run may attempt the flip **once**, and only when all
546
+ four hold:
547
+
548
+ 1. **The work is citable.** The step's landed change is identifiable in this
549
+ iteration's own output — a diff, a file path, a command result. No
550
+ evidence, no flip: that is a genuine halt, not a forgotten one.
551
+ 2. **The glyph is unambiguous.** `[x]` only for a step whose evidence is
552
+ present and, where the step carries a `verify:` field, whose fresh green
553
+ run is in this reply. Anything that would be `[~]` or `[-]` is a
554
+ *disposition*, never a repair — those halt exactly as before, because a
555
+ deferral and a cancellation are decisions.
556
+ 3. **Exactly one attempt, per run.** Not per step. A second forgotten flip
557
+ in the same run halts: one is a slip, two is a broken loop, and the
558
+ difference is the whole justification for allowing the first.
559
+ 4. **The attempt is verified, then re-guarded.** Re-run the
560
+ `git status --porcelain` probe above after the flip. Still empty → halt
561
+ loudly as before. A self-fix that cannot prove itself is
562
+ indistinguishable from the failure it was repairing.
563
+
564
+ The attempt is recorded as a decision memo (§ 4 handling), so an auto-flip is
565
+ reviewable after the fact rather than invisible. **Kill criterion, from the
566
+ originating roadmap and repeated here because a flip is a write to the source
567
+ of truth: one wrong auto-flip removes this allowance** and returns the guard
568
+ to halt-always. Reversibility is the deletion of this block — the guard
569
+ underneath it never changed.
415
570
 
416
571
  This guard is the deterministic counterpart to the rule's
417
572
  pre-send self-check — it catches a forgotten flip per step, not
@@ -507,51 +662,68 @@ artifact drafting, council enablement), not safety.
507
662
 
508
663
  On halt: stop, surface state, do **not** auto-fix outside the failing step.
509
664
 
510
- ### Terminal outcomes — `complete`, `blocked`, or a halt
511
-
512
- The halt list above answers *"what interrupts runnable work"*. It does not answer
513
- *"what does the run report when there is no runnable work left and the roadmap is
514
- not finished"*, and until this section there was no answer: the wrapper's stop
515
- condition was `count_open == 0` or a halt, so a roadmap whose remaining steps all
516
- need a human had **no legal stopping point**.
517
-
518
- That is not a hypothetical. Measured 2026-08-19 across the twelve most nearly
519
- complete roadmaps in the estate: **zero** could reach `count_open == 0` in one
520
- PR. Every remaining open step needed a human action — flip branch protection,
521
- delete committed evidence, authorise paid spend, install an absent binary, wait
522
- out a soak window, use the maintainer's own machine, or edit a file an armed host
523
- hook denies.
665
+ ### Terminal outcomes — `complete`, or a genuine external impossibility
666
+
667
+ The halt list above answers *"what interrupts runnable work"*. This answers
668
+ *"what does the run report when the roadmap is not finished and the remaining
669
+ work is not the agent's to do"* — and under
670
+ [ADR-237](../../../docs/decisions/ADR-237-end-to-end-execution-authority.md) that
671
+ second set is much smaller than it looks.
672
+
673
+ **The measurement that motivated the old answer, and the reading that replaced
674
+ it.** Measured 2026-08-19 across the twelve most nearly complete roadmaps:
675
+ **zero** could reach `count_open == 0` in one PR, because every remaining step
676
+ needed "a human action" — flip branch protection, authorise paid spend, install a
677
+ binary, wait out a soak window, edit a file a hook denies. The census was sound.
678
+ The reading was not: it counted actions a human *conventionally* performs,
679
+ without asking per action whether a human was **necessary**. Flipping a branch
680
+ setting, pushing, opening a PR, re-running CI, updating a merge base, fixing a
681
+ test, spending inside a budget — the agent can do all of it. That is remediation
682
+ work, and a `process-full` invocation grants it.
524
683
 
525
684
  Three outcomes, and only one of them is success:
526
685
 
527
686
  | Outcome | When | What it reports |
528
687
  |---|---|---|
529
- | `complete` | `count_open == 0` | the roadmap is finished; archival check runs (§ 6) |
530
- | `blocked` | `count_open > 0` **and** no open step is runnable | the work that DID close, plus every blocker with its clearing action |
688
+ | `complete` | `count_open == 0` and the PR is open | the roadmap is finished; archival check runs (§ 6) |
689
+ | `blocked` | every remaining open step is **externally impossible** for the agent | the work that DID close, plus the specific impossibility |
531
690
  | a halt | one of the five conditions above fired | the halt, its evidence, and what remains |
532
691
 
692
+ `blocked-preflight` **no longer exists** (ADR-237 § 4). A run always starts.
693
+
533
694
  ```
534
695
  `blocked` IS NEVER PRESENTED AS COMPLETION.
535
696
  count_open STAYS > 0. NO CHECKBOX IS FLIPPED TO [~] TO REACH IT.
536
697
  A PR OPENED ON A BLOCKED RUN IS LABELLED PARTIAL PROGRESS.
537
- REVALIDATE IMMEDIATELY BEFORE REPORTING IT — ONE RUNNABLE STEP LEFT REJECTS THE CLAIM.
698
+ BEFORE REPORTING IT, ASK PER REMAINING STEP: CAN I DO THIS AT ALL?
699
+ ONE STEP THE AGENT COULD HAVE EXECUTED REJECTS THE CLAIM.
538
700
  ```
539
701
 
702
+ **Externally impossible — the whole list.** A required credential that does not
703
+ exist and the agent cannot create · a purchase beyond the delegated budget ·
704
+ physical hardware access · another person or organisation must act · a wait that
705
+ is factually mandatory and cannot be simulated or verified.
706
+
707
+ **Not externally impossible — every one of these is work.** An unprotected
708
+ branch · a branch to create · a push · a PR to open · a repository or branch
709
+ setting the agent can change · a workflow to start · CI to re-run · a merge base
710
+ to update · conflicts · failing tests · local configuration · a paid call under
711
+ the ceiling · "this could be risky" · "a maintainer should do this".
712
+
540
713
  The `[~]` prohibition is load-bearing and was the one point the council split on.
541
714
  Deferring a blocked step to `[~]` would let the run reach `count_open == 0` and
542
715
  report completion — laundering unfinished work through a glyph, which is exactly
543
716
  what Iron Law 3 of [`roadmap-progress-sync`](../../rules/roadmap-progress-sync.md)
544
717
  exists to catch on the archival side. So the boxes stay open and the outcome
545
- carries the truth instead.
546
-
547
- Revalidation is the second half of the same discipline: the runnable set is
548
- recomputed at the moment of reporting, because steps unblock during a run (a
549
- prerequisite closes, a `Run:` succeeds, a peer merges). If any open step is
550
- runnable, `blocked` is refused and the loop continues.
718
+ carries the truth instead. **ADR-237 keeps this clause verbatim** — narrowing
719
+ `blocked` makes it more important, not less, because a run with more authority
720
+ has more ways to reach a clean-looking count.
551
721
 
552
- **Runnability is decided by the § 3c test**, unchanged — the same four conditions,
553
- including that a qualifying blocker must pre-date the run. A blocker the run
554
- authored is recorded and does not make a step non-runnable in that run.
722
+ Revalidation is the second half of the same discipline: the set is recomputed at
723
+ the moment of reporting, because steps unblock during a run (a prerequisite
724
+ closes, a `Run:` succeeds, a peer merges, a setting the run itself changed). If
725
+ any remaining step is one the agent could execute, `blocked` is refused and the
726
+ loop continues.
555
727
 
556
728
  ### Forbidden non-halt reasons — agent-invented cautions
557
729
 
@@ -570,14 +742,25 @@ a violation of the command and the user's will:
570
742
  the stop-and-wait reading of `phase-checkpoints` applies only to
571
743
  `process-phase`.
572
744
  - **"this step looks human-gated"** — the `blocked` outcome above is reached by
573
- the § 3c test over blockers that pre-date the run, never by a judgement about
574
- how a step feels. A step with no qualifying blocker citation is runnable, and
575
- writing the citation yourself does not make it one. This entry exists because
576
- the terminal outcome is the single most abusable thing on this page.
745
+ the § 3c test, never by a judgement about how a step feels. A step with no
746
+ qualifying blocker citation is runnable, and writing the citation yourself does
747
+ not make it one. This entry exists because the terminal outcome is the single
748
+ most abusable thing on this page.
749
+ - **"the branch is not protected" / "a branch must be created" / "a PR must be
750
+ opened" / "a GitHub setting must change" / "CI must be re-run" / "the merge
751
+ base needs updating" / "there are conflicts" / "tests fail"** — every one is
752
+ remediation work the invocation authorised (ADR-237 § 1). Do it.
753
+ - **"a paid service is needed"** — authorised up to a cumulative USD 25 per run
754
+ (§ Spend in the wrapper). Uncertainty about the exact cost is explicitly NOT a
755
+ reason to ask.
756
+ - **"a maintainer should do this"** when the agent can perform the same action
757
+ through git, `gh`, an API or a CLI. **Capability before role**: the role of the
758
+ person who conventionally does a thing is not a property of the thing.
577
759
 
578
760
  If the work genuinely cannot continue, it will be because one of the five real
579
- halt conditions fired, or because the runnable set is empty by the § 3c test —
580
- surface THAT, with the blockers named, not a manufactured caution.
761
+ halt conditions fired, or because every remaining step is externally impossible
762
+ by the § 3c test — surface THAT, with the specific impossibility named, not a
763
+ manufactured caution and not a convention mistaken for a constraint.
581
764
 
582
765
  ### Non-halt — gating notes, "optional" tags
583
766