@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
@@ -62,12 +62,53 @@ choice.
62
62
  ## Safety floors are never lifted
63
63
 
64
64
  Auto-dispatch never bypasses a floor. The cross-model judge Iron Law
65
- (`subagent-orchestration`), `verify-before-complete`, the N=3 autonomous
66
- budget, `scope-control`, and `non-destructive-by-default` all apply to
67
- auto-delegated work exactly as they do to in-session work.
65
+ (`subagent-orchestration`), `verify-before-complete`, the fix-loop bound of
66
+ `autonomous-execution`, `scope-control`, and `non-destructive-by-default` all
67
+ apply to auto-delegated work exactly as they do to in-session work.
68
68
  `emergency.orchestration_halt: true` disables the layer for the duration of an
69
69
  incident; it never disables a floor.
70
70
 
71
+ ## Carriers — how the delegation obligation reaches a session
72
+
73
+ Migrated out of `delegation-policy` on 2026-09-13 under the P4 pattern: the rule
74
+ keeps the obligation, this page carries how it travels and what stays
75
+ model-carried. The rule was re-sending all of it on every session and every
76
+ spawn, and the standing-payload ceiling is measured per spawn.
77
+
78
+ No host runs the tier-2 rule router, so that rule's triggers alone never load it.
79
+ The obligation travels on three carriers instead:
80
+
81
+ 1. the always-loaded **AGENTS.md line** (delegate-by-default + end-review);
82
+ 2. the **`delegation-nudge`** concern on `user_prompt_submit` — runs
83
+ `classifyTask` on cheap prompt signals and injects a one-line verdict ONLY
84
+ when the classifier says `do-in-parallel` / `do-in-steps`, silence otherwise.
85
+ Delivery on `user_prompt_submit` is end-to-end verified;
86
+ 3. the **`end-review-nudge`** concern on `stop` — ONE `review_skipped` telemetry
87
+ line per mutating no-review session, verified. Its advisory line reaches the
88
+ dispatcher output, but host-side forwarding of stop-slot context to the model
89
+ is unverified, so the model-facing end-review carrier is the AGENTS.md line
90
+ plus this telemetry.
91
+
92
+ The capability gate itself resolves from the committed host registry merged with
93
+ a live environment probe in `src/scripts/_lib/host_capability.ts`
94
+ (`probeHostCapabilities`) — capability is a fact about the host, never a settings
95
+ override.
96
+
97
+ **Never read a `false` capability as a host limitation without checking where it
98
+ came from.** The registry holds one row, so on every other host all six fields are
99
+ the all-false safe default — which records that *nobody answered*, not that the
100
+ host cannot spawn. `agent-config routing:doctor [--platform <host>]` prints the
101
+ value **and** its provenance per field (`registry` = a committed observation this
102
+ repo made once · `live-probe` = established in this process · `default` = no
103
+ answer). Run it before concluding delegation is unavailable here; the same-shaped
104
+ wrong guess about the council is the incident
105
+ [`council-availability`](../../rules/council-availability.md) exists for.
106
+
107
+ What stays model-carried, honestly: the decomposition itself, the per-return
108
+ verification, and every dispatch on hosts without hook slots. The nudges are
109
+ advisory by design — whether they change behavior is measured by the telemetry,
110
+ not assumed.
111
+
71
112
  ## Related
72
113
 
73
114
  - [`subagent-configuration`](../subagent-configuration.md) — model / parallelism keys.
@@ -141,12 +141,14 @@ When the user later issues a **new** request — different ticket, different roa
141
141
 
142
142
  In doubt whether the new request inherits or needs fresh confirmation → fresh confirmation. The Hard Floor and [`scope-control`](../../rules/scope-control.md) gates apply to every task regardless.
143
143
 
144
- ## Validation-loop budget — mechanics (N=3)
144
+ ## Validation-loop budget — mechanics
145
145
 
146
146
  Autonomous flows must not iterate indefinitely on the same validation target. **Validation target** = a single identifiable artefact: a file path, a lint rule ID, a test name, a CI sub-task name. Natural-language clustering ("the linter stuff") does **not** count as a target — agents will rename their way out of the budget.
147
147
 
148
148
  A "failed attempt" is an iteration that did not move the target from red to green. Tuning the tool around the target (e.g. growing an allowlist, loosening a threshold, suppressing a check) counts as an attempt — and is usually a sign the **tool**, not the content, is wrong.
149
149
 
150
+ Bands, bound outcomes, reading a red: [`fix-loop-ladder`](fix-loop-ladder.md).
151
+
150
152
  ### Allowlist-growth antipattern — detail
151
153
 
152
154
  Crossing the 20-entry threshold counts as the 3rd validation-target failure for the linter in question, regardless of prior attempt count. The fix is a tool-shape change (heuristic tightening, scope narrowing, deletion), not more entries. Same logic for: warning-suppression lists growing past ~20, `// noqa` / `# type: ignore` sweeps over many files in one session, test `skip` / `xfail` bulk-adds to chase green.
@@ -161,7 +163,7 @@ Concrete tool mapping — verify with the narrowest tool that proves the target
161
163
 
162
164
  Where the objective is **countable** — findings closed, tests passing,
163
165
  occurrences remaining — the primary stop signal is **no progress** or a **new
164
- minimum**, and the N=3 iteration cap is the **backstop**. A counter alone cannot
166
+ minimum**, and the fix-loop bound is the **backstop**. A counter alone cannot
165
167
  tell three attempts that each closed a finding from three that changed nothing.
166
168
 
167
169
  **Do not remove the cap.** A no-progress signal is only as good as the metric
@@ -175,13 +177,13 @@ firing is `exhausted`, a repeating failure signature with budget left is
175
177
  [`terminal-states`](terminal-states.md). Collapsing them invites the wrong
176
178
  remedy, because raising a budget helps the first and never the second.
177
179
 
178
- Where the objective is NOT countable, the cap is the only signal and the N=3
179
- budget above applies unchanged.
180
+ Where the objective is NOT countable, the cap is the only signal and the
181
+ fix-loop bound above applies unchanged.
180
182
 
181
183
  ## Adaptive effort & stop (RDP)
182
184
 
183
185
  Scale effort to task difficulty, and stop when marginal evidence drops — coupled
184
- to the N=3 budget above, never replacing it. On a host with a native effort knob
186
+ to the fix-loop bound above, never replacing it. On a host with a native effort knob
185
187
  (e.g. an `effort` parameter), the right move is to **set it high** for hard tasks
186
188
  rather than scaffold; the scaffold here is for a standard host **without** such a
187
189
  knob. The per-dimension uncertainty score (see
@@ -211,13 +213,11 @@ ladder on the same failing target**, not competing budgets:
211
213
  attempts, switch approach when the same signature repeats
212
214
  ([`context-hygiene`](../../rules/context-hygiene.md) "same failure
213
215
  signature twice → pivot").
214
- 2. **The 3rd consecutive failed attempt on the target trips N=3**
215
- (this file, above): 2 retries + the initial attempt ARE the three
216
- attempts N=3 counts. Terminal action: STOP, surface the attempts,
217
- ask the user.
218
- 3. **Repeated N=3 cycles on the same task** escalate to
219
- [`context-hygiene`](../../rules/context-hygiene.md)'s 3-Failure Rule:
220
- state dump + recommend a fresh session.
216
+ 2. **The 3rd consecutive failed attempt closes band 1** — terminal for the BAND,
217
+ not the run: band 2 begins, a strategy shift is mandatory.
218
+ 3. **Repeated EPOCHS** — not attempts — escalate to
219
+ [`context-hygiene`](../../rules/context-hygiene.md)'s 3-Failure Rule. Three
220
+ failed strategies is evidence about the TASK.
221
221
 
222
222
  No artifact may mint a fourth budget or a stricter one-strike cap for the
223
223
  same subject; per-tool loop caps (`token-efficiency` >2 same-tool calls)
@@ -227,8 +227,8 @@ are a different subject (tool-call repetition, not fix attempts).
227
227
  otherwise fuzzy; operationalize it so it is checkable, not vibes: when **two
228
228
  consecutive investigative probes** (a read, a grep, a query) yield **no new
229
229
  load-bearing information** — nothing that changes the plan or the hypothesis —
230
- stop gathering and act on what you have (or ask). This is the diminishing-returns
231
- twin of the N=3 hard cap: N=3 stops fruitless *fixing*, this stops fruitless
230
+ stop gathering and act on what you have (or ask). The fix-loop bound stops
231
+ fruitless *fixing*; this stops fruitless
232
232
  *searching*. It never overrides the read-loop abort in
233
233
  [`context-hygiene`](../../rules/context-hygiene.md) — that is the hard ceiling;
234
234
  this is the earlier soft signal.
@@ -240,6 +240,6 @@ plan, an open question the context already answers, or a promise of
240
240
  unexecuted work ("I'll…", "next I will…"), do that work now with tool
241
241
  calls instead of ending the turn — this is what "the turn isn't done
242
242
  until it's done" means in practice. This checkpoint operates inside the
243
- existing bounds: the N=3 validation-loop budget and the Hard Floor
243
+ existing bounds: the fix-loop validation budget and the Hard Floor
244
244
  still apply unchanged; the checkpoint closes out work already in scope,
245
245
  it never licenses continuing past either limit.
@@ -0,0 +1,93 @@
1
+ # Decision Closure — Execution Side
2
+
3
+ Loaded from [`roadmap-process-loop`](roadmap-process-loop.md) § 3-0 and
4
+ § 5a-residue. Planning closes what it can foresee; this is what the RUN does
5
+ with the record it was handed, and with the residue planning could not see.
6
+
7
+ ```
8
+ THE `## Decisions` TABLE IS READ BEFORE THE FIRST STEP, NOT WHEN A STEP TRIPS OVER IT.
9
+ A ROW IN IT IS A CLOSED DECISION. NEVER RE-DERIVE ONE. NEVER RE-ASK ONE.
10
+ A CLOSED DECISION REOPENS ONLY WHEN ITS `revisit if` CONDITION BECAME TRUE —
11
+ NEVER BECAUSE A CONTEXT RESET LOST IT, AND NEVER BECAUSE THE ANSWER LOOKS ODD.
12
+ ```
13
+
14
+ If the roadmap carries a `## Decisions` section, read it whole and cache it for
15
+ the run alongside the cadences (§ 4). Each row is `ID | ownership | resolved by
16
+ | decision | evidence | revisit if`, and the contract that governs it is
17
+ rule 27 of [the roadmap template](../../templates/roadmaps.md).
18
+
19
+ Three consequences during the run:
20
+
21
+ 1. **A step whose question is already a row executes on that row's answer.**
22
+ The decision was closed in planning; re-deriving it is the repeat the ask
23
+ census counts as a defect, and re-asking it is worse.
24
+ 2. **A `revisit if` condition that became true reopens exactly that row** —
25
+ resolve it again through the ownership ladder, append the new answer, and
26
+ say which condition fired. One reopen per row per run.
27
+ 3. **A decision NOT in the table is mid-run residue**, handled by § 5's residue
28
+ rule: technical residue resolves inline through the agent, an independent
29
+ session, the council or the team and is appended to `## Decisions` with the
30
+ step id; owner-owned residue is asked only when the step cannot progress,
31
+ and otherwise the step is parked while independent phases continue.
32
+
33
+ No `## Decisions` section is not an error: a plan that closed everything inline
34
+ carries none. It is a finding only when the plan ALSO carries an unresolved
35
+ marker, which `lint_decision_classes` reds at authoring time rather than here.
36
+
37
+
38
+
39
+ ```
40
+ A DECISION THE RUN MEETS MID-STEP IS ROUTED BY THE SAME TABLE THAT CLOSED THE
41
+ PLAN. TECHNICAL RESIDUE RESOLVES INLINE AND IS APPENDED TO `## Decisions` WITH
42
+ THE STEP ID. IT NEVER BECOMES A QUESTION, AND IT NEVER BECOMES A HALT.
43
+ OWNER-OWNED RESIDUE ASKS **ONLY IF THE STEP CANNOT PROGRESS**. OTHERWISE THE
44
+ STEP IS PARKED, INDEPENDENT PHASES CONTINUE, AND THE RUN COMES BACK TO IT.
45
+ MISSION-LEVEL `BLOCKED` ONLY PER THE TERMINAL-OUTCOMES LIST BELOW.
46
+ ```
47
+
48
+ Planning closed what it could foresee (§ 3-0). What is left is residue, and it
49
+ is routed identically:
50
+
51
+ | Residue | What happens |
52
+ |---|---|
53
+ | `deterministic`, `reversible-technical` | the agent decides and says why |
54
+ | `contested-technical` | an independent session, then the council, then the team |
55
+ | `critical-technical` | a provider-diverse council; the owner only where a typed op or an owner-reserved dimension is touched |
56
+ | `spend-exhaustion` | pause and report — never a question |
57
+ | `product-owned`, `business-owned`, `destructive-owned` | the step's progress decides: **blocked on it** → ask now, one question, record the answer · **not blocked** → park the step, continue elsewhere, return |
58
+
59
+ Every resolution is appended to `## Decisions` **with the step id in the
60
+ evidence column**, so a later reader can tell a decision planning closed from
61
+ one the run met. `./scripts-run src/scripts/lint_decision_classes` validates
62
+ the row.
63
+
64
+ **Parking is not deferring.** A parked step keeps its `[ ]`, keeps its place in
65
+ the count, and is returned to in the same run once the answer lands. It does
66
+ **not** take `[~]`, which is a deferral by decision and would let the run reach
67
+ `count_open == 0` on work nobody did.
68
+
69
+ **Scope discovered mid-step is the other table** — agent-owned growth is done
70
+ and recorded as a scope delta, council-owned growth routes through the ladder,
71
+ and a larger unrelated opportunity becomes a follow-up artifact rather than
72
+ expanding the mission. Both lists, closed:
73
+ [`scope-growth-ownership`](../authority/scope-growth-ownership.md), with
74
+ `./scripts-run src/scripts/scope_growth "<description>"` for a single item.
75
+
76
+
77
+ ## What `blocked-by:` may point at, after the retirement
78
+
79
+ The marker itself is unchanged — `run-continuation` reads blockedness from it
80
+ and from nothing else. What narrows is its contents.
81
+
82
+ A `## Blockers` entry is the record of a decision the agent **correctly did not
83
+ own**. An entry that declares `- **Ownership:**` must therefore name one of the
84
+ three owner-owned classes: `product-owned`, `business-owned`,
85
+ `destructive-owned`. A technical class there says a decision the ownership
86
+ ladder could have closed was filed instead, and `lint_roadmap_blockers` reds
87
+ it. The field is optional and the check is HARD rather than ratcheted, on the
88
+ no-backlog-to-grandfather ground: it is new, so it fires on nothing in the tree
89
+ today.
90
+
91
+ A technical judgement call therefore has no file-shaped home. It routes back
92
+ through the closure pass, resolves at the lowest rung that owns it, and lands
93
+ as a `## Decisions` row.
@@ -0,0 +1,108 @@
1
+ # The fix-loop ladder — bands, bound outcomes, and how to read a red
2
+
3
+ `road-to-adversarial-verification-and-long-runs` Phase 4. The obligation lives in
4
+ [`autonomous-execution`](../../rules/autonomous-execution.md) § Validation-loop
5
+ budget; this page carries the bands, what happens at the bound, and the probe
6
+ discipline each band starts from.
7
+
8
+ **Its own file rather than a section of
9
+ [`autonomy-mechanics`](autonomy-mechanics.md), and the reason is measured.** That
10
+ page sat at 16,040 chars against a 16,000-char depth ceiling — marginally under by
11
+ the gate's own measure — so adding ~5,600 chars of ladder to it crossed the
12
+ ceiling and added a violation to a shrink-only ratchet. Splitting a distinct
13
+ subject out is the repair the ratchet is asking for; raising the baseline would
14
+ have been the defect it names.
15
+
16
+ ## The three bands, and what makes a band a band
17
+
18
+ The bound was a hard cap of 3 whose remedy was *STOP. SURFACE. ASK USER FOR
19
+ GUIDANCE.* It is now `execution.fix_loop_max` — default 10 — divided into three
20
+ bands, and the division is the substance: a larger number alone would only buy
21
+ more of the same attempt.
22
+
23
+ | Attempts | What is required | What is NOT an attempt |
24
+ |---|---|---|
25
+ | 1-3 | root-cause, then a targeted fix | — |
26
+ | 4-6 | a **mandatory strategy shift**: re-examine the assumptions, read the history, build a minimal reproduction, find the last known good state, check upstream docs and issues, or try an alternative implementation | repeating the previous approach with a smaller edit. That is the same attempt again, and it does not advance the band |
27
+ | 7-10 | **independent escalation**: a second session, a provider-diverse reviewer, the council, the team with repository access, or a rollback of the slice | anything the same session can decide alone |
28
+
29
+ ## At the bound — five outcomes, in order, and none of them is a count
30
+
31
+ ```
32
+ A COUNT IS NOT A REASON TO ASK. THE BOUND ENDS A STRATEGY, NEVER THE RUN.
33
+ ```
34
+
35
+ 1. **The escalation yielded a new strategy** → open a **new epoch**: the attempt
36
+ counter resets against the new strategy, because the thing the budget was
37
+ bounding is gone.
38
+ 2. **An independent phase can proceed** → continue it. A blocked target is not a
39
+ blocked run, and the run's other work does not wait on this one.
40
+ 3. **The residue is owner-owned** per the ownership table → **one** native ask,
41
+ naming the residue. This rung is reached by the OWNERSHIP test, never by the
42
+ count that got here.
43
+ 4. **An external prerequisite is objectively missing** — an absent credential, an
44
+ unreachable service, a decision only the forge can carry → `BLOCKED`, with the
45
+ evidence that establishes the absence.
46
+ 5. **Otherwise** → a new epoch. Running out of ideas is not one of the four above,
47
+ and converting it into an owner ask is the failure this ladder replaces.
48
+
49
+ Council and team verdicts reached during band 3 append to the run's
50
+ `## Decisions` — so the next epoch starts from a record rather than from the
51
+ previous epoch's memory of it.
52
+
53
+ **The allowlist-growth counter is a separate mechanism** with its own threshold
54
+ and its own remedy (fix the tool's shape). It is not a band of this ladder, and
55
+ crossing it does not advance the attempt count — it spends the whole bound for
56
+ that target at once, which is a different statement.
57
+
58
+ ## Read the red before diagnosing it, with the narrowest probe
59
+
60
+ An attempt that begins from a guess about the failure is not a band-1 attempt; it
61
+ is the first of three that will be spent learning what band 1 was supposed to
62
+ start from. So, before the fix:
63
+
64
+ - **A CI red** is read with `gh run view --job <id> --log-failed`, filtered
65
+ (`| grep -E '×|FAIL|Error'`) — never the whole log into context, and **never**
66
+ `gh pr checks --watch`'s exit code, which is 0 on a failure and 1 when no
67
+ checks exist at all. Two different wrong answers from one number.
68
+ - **The CI waiter is `ci_settle`**, and it is ONE waiter for the condition: its
69
+ LAST OUTPUT LINE is the verdict, and a run that reaches no verdict can still
70
+ exit 0. A hand-written poll loop beside it is the fleet
71
+ [`context-hygiene`](../../rules/context-hygiene.md) § Waiting is one
72
+ waiter forbids.
73
+ - **A local red** is read with the runner filtered to the failing name — not the
74
+ suite, and not a meta-pipeline. Match the probe to the surface: `curl` or a
75
+ Playwright spec for an HTTP or UI red, the debugger for a runtime frame, the
76
+ test runner with a filter for a behavior.
77
+ - **Reproduce before believing the diagnosis.** An environment-dependent red
78
+ reproduces under its condition, not on the machine's defaults.
79
+
80
+ ## The allowlist guard's host reach, and the two corrections it has taken
81
+
82
+ Migrated out of `autonomous-execution` on 2026-09-13 (P4): the rule keeps the
83
+ obligation, this page carries the host claim and its history. The rule was
84
+ re-sending all of it on every session and every spawn.
85
+
86
+ `block_config_weakening.ts` counts allowlist entries added per session, warns from
87
+ 5, and blocks past 20 — **on `claude` alone**, the one host that both binds
88
+ `pre_tool_use` and honours a deny. It is *bound* on augment and cowork as well and
89
+ ignored there: `host_semantics.ts` verifies claude alone, and both trampolines
90
+ discard dispatcher output and `exit 0` unconditionally. Everywhere else the cap is
91
+ model-carried and "enforced at tool-call time" is not a claim that can be made.
92
+
93
+ **Corrected 2026-08-17, in both directions.** The sentence used to certify
94
+ augment, claude and cowork as the enforcing set — an over-claim of two hosts — and
95
+ to explain the rest with "the guard has nowhere to bind", which is false for
96
+ cursor, cline and gemini, whose native pre-tool events `native_event_aliases`
97
+ already maps onto `pre_tool_use`: there it is **unbound, not unbindable**. Only
98
+ windsurf and copilot carry no alias row. The four states are tabulated once in
99
+ [`hook-architecture-v1 § Which hosts carry pre_tool_use`](../../docs/contracts/hook-architecture-v1.md).
100
+
101
+ The sibling rules `git-history-discipline` and `evaluator-independence` qualify
102
+ the identical slot, so an unqualified claim in any of them would read as a
103
+ guarantee the manifest does not give.
104
+
105
+ ## Related
106
+
107
+ - [`autonomy-mechanics`](autonomy-mechanics.md) — the rest of the autonomy body: opt-in detection, task scope, probe efficiency, the retry-budget ladder.
108
+ - [`terminal-states`](terminal-states.md) — `exhausted` vs `stagnated`, the two words the bound and a repeating signature report.
@@ -12,7 +12,9 @@ this context carries the agent-side procedure.
12
12
 
13
13
  ## Activation
14
14
 
15
- Read `planning.challenge_on_create` from `.agent-settings.yml` once per task
15
+ Read `planning.closure_pass` from `.agent-settings.yml` once per task
16
+ (`planning.challenge_on_create` is the deprecated alias, accepted for one
17
+ minor)
16
18
  and cache it. `true` or **missing key** → the gate is active. `false` → the
17
19
  gate is inert: proceed with the surface's normal flow, no marker line, no
18
20
  interview.
@@ -61,7 +63,7 @@ All four hold → emit **exactly one** marker line, then proceed with the
61
63
  surface's normal flow:
62
64
 
63
65
  ```
64
- > Confidence ≥ 95% — creating directly (planning.challenge_on_create)
66
+ > Confidence ≥ 95% — creating directly (planning.closure_pass)
65
67
  ```
66
68
 
67
69
  No second marker, no summary of the assessment — one line, then the work.
@@ -8,7 +8,30 @@ resolution, commit-step pre-scan, halt conditions, and archival check.
8
8
  The three command files are thin wrappers that bind only the **scope
9
9
  delta**.
10
10
 
11
- **Size budget:** ≤ 57,000 chars — restated from the original 4,000.
11
+ **Size budget:** ≤ 62,000 chars — restated from 57,000, which the file had
12
+ already outgrown before this edit.
13
+
14
+ **Restated 2026-09-13, with the reason, because the contract below demands
15
+ one.** The line read 57,000 and the file measured **57,906** on `origin/main`:
16
+ the budget was already false, so the first honest act is to say so rather than
17
+ to inherit it. What this change then added is halt-list CONTENT — the
18
+ `BLOCKED` list aligned row-for-row with ADR-268 § 7, which gained a missing
19
+ owner-owned-decision row, contradictory requirements, technical impossibility
20
+ under the stated constraints and an authority crossing, and moved a failed
21
+ first approach and dependency trouble to the not-blocked side. That list is
22
+ read at the moment a run decides whether it may stop; behind a pointer it
23
+ would be read later or not at all, which is the one place in this file where
24
+ depth is the point.
25
+
26
+ Everything about the change that is EXPLANATORY rather than decisive was moved
27
+ out instead, to [`decision-closure-execution`](decision-closure-execution.md):
28
+ the `## Decisions` row shape and reopen rule, the per-class mid-run residue
29
+ table, and what `blocked-by:` may point at after the retirement. The file grew
30
+ by 2.4k where a naive edit would have grown it by 7.6k.
31
+
32
+ **Still a ratchet, and still enforced by nothing.** The next edit inherits
33
+ 62,000, not a license to keep restating. Splitting the halt list out is the
34
+ real repair and it is a change of its own.
12
35
 
13
36
  The old figure described nothing: the file measured 47,115 bytes against it, a
14
37
  factor of 11.8, so it was a dead budget rather than a typo. Restated at the
@@ -143,6 +166,20 @@ does not fire.
143
166
 
144
167
  ## 3. Pre-scan — execution contract or commit-step ask
145
168
 
169
+ ### 3-0. Read `## Decisions` — before any step, once per run
170
+
171
+ ```
172
+ THE `## Decisions` TABLE IS READ BEFORE THE FIRST STEP, NOT WHEN A STEP TRIPS OVER IT.
173
+ A ROW IN IT IS A CLOSED DECISION. NEVER RE-DERIVE ONE. NEVER RE-ASK ONE.
174
+ A CLOSED DECISION REOPENS ONLY WHEN ITS `revisit if` CONDITION BECAME TRUE —
175
+ NEVER BECAUSE A CONTEXT RESET LOST IT, AND NEVER BECAUSE THE ANSWER LOOKS ODD.
176
+ ```
177
+
178
+ Read it whole and cache it for the run alongside the cadences (§ 4). No section
179
+ is not an error — a plan that closed everything inline carries none. Row shape,
180
+ the three consequences during a run, and the reopen rule:
181
+ [`decision-closure-execution`](decision-closure-execution.md).
182
+
146
183
  ### 3a. Mode derivation ladder — first source wins
147
184
 
148
185
  ```
@@ -651,6 +688,19 @@ For each open step in the working set (scope-bound — see wrapper):
651
688
  A loop iteration that lands work without flipping its box is a
652
689
  rule violation. Do not save flips for the archive commit.
653
690
 
691
+ ### 5a-residue. Mid-run residue — the same ownership table, inline
692
+
693
+ ```
694
+ A DECISION THE RUN MEETS MID-STEP IS ROUTED BY THE SAME TABLE THAT CLOSED THE
695
+ PLAN. TECHNICAL RESIDUE RESOLVES INLINE AND IS APPENDED TO `## Decisions` WITH
696
+ THE STEP ID. IT NEVER BECOMES A QUESTION, AND IT NEVER BECOMES A HALT.
697
+ OWNER-OWNED RESIDUE ASKS **ONLY IF THE STEP CANNOT PROGRESS**. OTHERWISE THE
698
+ STEP IS PARKED, INDEPENDENT PHASES CONTINUE, AND THE RUN COMES BACK TO IT.
699
+ ```
700
+
701
+ Per-class routing, why parking is not deferring, and the scope-growth pointer:
702
+ [`decision-closure-execution`](decision-closure-execution.md).
703
+
654
704
  ### 5b. Flip-guard — deterministic
655
705
 
656
706
  Before advancing to step 6, run:
@@ -884,16 +934,35 @@ BEFORE REPORTING IT, ASK PER REMAINING STEP: CAN I DO THIS AT ALL?
884
934
  ONE STEP THE AGENT COULD HAVE EXECUTED REJECTS THE CLAIM.
885
935
  ```
886
936
 
887
- **Externally impossible — the whole list.** A required credential that does not
888
- exist and the agent cannot create · a purchase beyond the delegated budget ·
889
- physical hardware access · another person or organisation must act · a wait that
890
- is factually mandatory and cannot be simulated or verified.
937
+ **Externally impossible — the whole list**, aligned with ADR-268 § 7. A missing
938
+ **owner-owned** decision — `product-owned`, `business-owned` or
939
+ `destructive-owned`, and nothing else · a missing permission, secret or access ·
940
+ a required credential that does not exist and the agent cannot create · a
941
+ purchase beyond the delegated budget · physical hardware access · another person
942
+ or organisation must act · a wait that is factually mandatory and cannot be
943
+ simulated or verified · contradictory requirements · technical impossibility
944
+ under the stated constraints · a needed crossing of a real authority boundary.
891
945
 
892
946
  **Not externally impossible — every one of these is work.** An unprotected
893
947
  branch · a branch to create · a push · a PR to open · a repository or branch
894
948
  setting the agent can change · a workflow to start · CI to re-run · a merge base
895
949
  to update · conflicts · failing tests · local configuration · a paid call under
896
- the ceiling · "this could be risky" · "a maintainer should do this".
950
+ the ceiling · a failed first approach · dependency trouble · "this could be
951
+ risky" · "a maintainer should do this".
952
+
953
+ ```
954
+ A SOLVABLE ARCHITECTURAL AMBIGUITY IS NOT `BLOCKED`. IT IS A DECISION.
955
+ A TECHNICAL JUDGEMENT CALL IS NEVER PARKED IN A FILE — IT ROUTES BACK THROUGH
956
+ CLOSURE AND IS RESOLVED AT THE LOWEST RUNG THAT OWNS IT: EVIDENCE, CONVENTION,
957
+ THE AGENT, AN INDEPENDENT SESSION, THE COUNCIL, THE TEAM.
958
+ A COUNT IS NEVER A QUESTION — A BOUNDED LOOP'S BOUND TRIGGERS A STRATEGY CHANGE
959
+ AND THE ESCALATION LADDER, NEVER AN OWNER QUESTION (ADR-268 § 7).
960
+ ```
961
+
962
+ `blocked-by:` stays — it is how `run-continuation` reads blockedness — but a
963
+ blocker entry is the record of a decision the agent **correctly did not own**;
964
+ what it may point at narrows accordingly
965
+ ([`decision-closure-execution`](decision-closure-execution.md)).
897
966
 
898
967
  The `[~]` prohibition is load-bearing and was the one point the council split on.
899
968
  Deferring a blocked step to `[~]` would let the run reach `count_open == 0` and
@@ -93,6 +93,63 @@ Update stale idioms to the version the project **actually runs** — but only wh
93
93
  - Subordinate to `no-cheap-questions` (self-check items 3 & 14 — real trade-off, not a disguised continuation/commit ask), `autonomous-execution` (the end-of-session batch must not read as "shall I continue?"), `user-interaction`, `ask-when-uncertain` (one batched prompt = one question).
94
94
  - Threshold to surface at all: a **real, nameable** improvement with a concrete benefit. Cosmetic nitpicks with no trade-off → drop silently. The live-security carve-out is the only case that interrupts or overrides autonomy.
95
95
 
96
+ ## The other axis — who owns the growth
97
+
98
+ The ladder above sizes a change: *is this small and aligned enough to do now.*
99
+ It does not say **whose decision it is**, and both must clear before work
100
+ happens inline — something small and council-owned is still not the agent's to
101
+ decide, and something agent-owned and large is still bounded by
102
+ `minimal-safe-diff`.
103
+
104
+ Three closed lists answer the ownership half: six agent-owned kinds (done
105
+ inline, recorded as a scope delta in the PR body, never asked about), four
106
+ council-owned (routed through the ownership ladder, reaching the owner in none
107
+ of them), and two owner-owned. Anything matching none of them is not scope
108
+ growth at all — it is a follow-up artifact, and the mission does not expand to
109
+ hold it.
110
+
111
+ Full enumeration: [`scope-growth-ownership`](../../contexts/authority/scope-growth-ownership.md).
112
+ One item classifies deterministically with
113
+ `./scripts-run src/scripts/scope_growth "<description>"`; `unknown` is a real
114
+ verdict there, never a fallback to the cheapest rung.
115
+
116
+ ## Inside a mission — the middle rung becomes an artifact
117
+
118
+ `road-to-adversarial-verification-and-long-runs` 6.1. The ladder's middle rung is
119
+ **note + ask**, and inside an autonomous mission there is nobody to ask. Left
120
+ unreplaced the rung collapses in one of two bad directions, and both are failures
121
+ this suite already names: every spotted issue becomes a fix (the scope creep
122
+ [`minimal-safe-diff`](minimal-safe-diff-mechanics.md) exists to stop), or every
123
+ one becomes silence (the look-away `active-remediation` exists to stop).
124
+
125
+ So under a mission the middle rung is **emit a follow-up artifact and leave the
126
+ code alone**.
127
+
128
+ **What may ride along at all** — nine kinds, and the list is closed:
129
+ characterization tests · regression tests · a small adjacent bug · naming · types
130
+ · robustness · local dead code · simplifying code the mission already touched ·
131
+ testability.
132
+
133
+ **Six criteria, ALL of which must hold** for one of those to ride along: local to
134
+ the path the mission is already touching · small · low blast radius · clearly
135
+ correct · testable in the same commit · carries no new product decision.
136
+
137
+ ```
138
+ THE SIX ARE AND-ED, NEVER SCORED.
139
+ A SCORED VERSION LETS A LARGE CHANGE BUY ITS WAY IN WITH FIVE CHEAP YESES,
140
+ WHICH IS HOW A BOY-SCOUT RULE BECOMES A REFACTOR LICENCE.
141
+ ```
142
+
143
+ The **characterisation is the agent's judgement; the DECISION is mechanical** —
144
+ `_lib/rides_along.ts` takes the six booleans and returns the rung, so the same
145
+ inputs always land the same way and a later reader can check the call rather than
146
+ re-litigate the taste.
147
+
148
+ **A deferral states every reason it was deferred**, not the first one it hit. The
149
+ artifact exists because the issue is still owed, and "it failed one of six" is not
150
+ something a later triage can act on. A deferral with no reason is the
151
+ note-and-forget this rule already forbids, wearing an artifact's clothes.
152
+
96
153
  ## See also
97
154
 
98
155
  - [`active-remediation`](../../rules/active-remediation.md) — the rule this file details (Iron Law + ladder + live-security carve-out).
@@ -86,6 +86,108 @@ point: this rule exists because a process that *looked* followed produced
86
86
  fabricated evidence, and claiming coverage it does not have would repeat that.
87
87
 
88
88
 
89
+ ## The audited failure, in full
90
+
91
+ Migrated out of the rule on 2026-09-13 under the same P4 pattern the rest of this
92
+ page follows: the rule keeps the obligation, this page carries the record. The
93
+ rule was re-sending all of it on every session and every spawn.
94
+
95
+ Measured, once, at maximum cost (conformance audit 2026-08-06):
96
+
97
+ > The agent dispatched a "blind reviewer" over its own change. It wrote that
98
+ > reviewer's prompt itself, put **"NO-FINDINGS is expected and welcome"** into it,
99
+ > and narrowed the scope to four files it chose. The reviewer returned
100
+ > NO-FINDINGS. That honest-null was committed as **binding gate evidence**. An
101
+ > unsteered pass over the same delta later found 5 findings, one of them
102
+ > critical, already live on the trunk.
103
+
104
+ The agent's own retro named it exactly, in the maintainer's own words:
105
+
106
+ *DE: "Die Fabrikation lag nicht im Weglassen des Reviews — sie lag in meinem Prompt. Ich habe die Antwort vorgeladen und dann als Evidenz verbucht." · EN: "The fabrication was not in skipping the review — it was in my prompt. I pre-loaded the answer and then booked it as evidence."*
107
+
108
+ The review ran. The process was followed. The evidence was manufactured anyway.
109
+
110
+ ## The softer form — why the phrase list cannot see it
111
+
112
+ The Iron Law forbids **authoring the verdict** into an evaluator's prompt. There
113
+ is a weaker move that evades it while doing the same work, and it is the one an
114
+ orchestrator reaches for without noticing: **stating an expectation**.
115
+
116
+ *"NO-FINDINGS is expected"* is a prediction, not a verdict — and it steered a real
117
+ review into an honest-null that five findings on the trunk later refuted. A prompt
118
+ that says what the author thinks the answer is has authored the answer, whatever
119
+ grammatical mood it used. The guard's pre-loaded-verdict detector is a PHRASE
120
+ list, so it catches recurrences of known steering wording and not steering as
121
+ such; this distinction is the gap it cannot close, which is why the obligation is
122
+ stated in the rule rather than delegated to the detector.
123
+
124
+ ## Tests are evaluators — levels, workflow, and the weakening ladder
125
+
126
+ `road-to-adversarial-verification-and-long-runs` Phase 2. The rule states the
127
+ obligation; this section carries the detail it points at.
128
+
129
+ ### The five levels
130
+
131
+ | Level | Author | What it actually buys |
132
+ |---|---|---|
133
+ | **L0** | the same agent, same session | nothing against self-confirmation. **Fallback only** — permitted when no other route exists, and then said out loud. |
134
+ | **L1** | another session, same model | a fresh context. **Not** a different judgement: with one provider configured this is the same model reviewing its own work, holding a label that says otherwise. |
135
+ | **L2** | another model | different training, different blind spots. The first level that buys a genuinely second opinion. |
136
+ | **L3** | another provider | independent training data, independent failure modes, independent incentives. |
137
+ | **L4** | a multi-provider council or team | L3 plus disagreement that is visible rather than averaged away. |
138
+
139
+ **Critical behavior — security, authority, data loss, merge control — targets
140
+ L3 or L4 wherever two providers are configured.** Wherever, not always: with one
141
+ provider the honest ceiling is L2, and the level is read from `agent-config
142
+ council:status`'s actual provider count rather than assumed from a config file
143
+ that may describe an intention.
144
+
145
+ ### The workflow
146
+
147
+ ```
148
+ acceptance behaviour → INDEPENDENT AUTHOR → RED evidence → implementer → GREEN
149
+ → INDEPENDENT VALIDATOR
150
+ ```
151
+
152
+ Five arrows, and the two capitalised roles are the ones that may not be the
153
+ implementer. **RED evidence** is not ceremony: a test never shown red has unknown
154
+ sensitivity, so a suite that was green from the first run has proven nothing
155
+ about the code and everything about the assertions being vacuous.
156
+
157
+ ### What an implementer may never do silently
158
+
159
+ Weaken an assertion · delete a failing test · skip or `xfail` it · loosen a
160
+ threshold · change fixture semantics to fit the code.
161
+
162
+ Each of these is a legitimate change *sometimes*, which is exactly why the
163
+ prohibition is on doing it **silently** rather than on doing it. Where the test
164
+ genuinely looks wrong, the ladder is: **evidence** (what the test asserts, what
165
+ the code does, why they disagree) → **independent test review** → **council or
166
+ team** → change only after an independent verdict.
167
+
168
+ **The owner is not the arbiter.** Routing this to the owner converts a technical
169
+ disagreement the tree can settle into an interrupt only the owner can clear, and
170
+ it is the same count-to-an-ask move the recovery ladder removes.
171
+
172
+ ### Test-quality validation — one question, before delivery
173
+
174
+ *Would these tests fail under plausible wrong implementations?* An independent
175
+ instance answers it, looking for: tautologies · algorithm duplication (the test
176
+ re-implements the thing it is testing, so both are wrong together) · snapshot
177
+ overuse · missing boundary and error cases · over-mocking (the mock, not the
178
+ code, is what passes) · expectations changed to fit the code · a test never shown
179
+ red.
180
+
181
+ The validator's **identity and provider go into the evidence**. An unattributed
182
+ validation is not one — it cannot be checked for the independence it claims, and
183
+ `evaluator-independence`'s own recorded failure is exactly a verdict nobody could
184
+ trace back to the prompt that produced it.
185
+
186
+ This is deliberately **not** mutation-testing infrastructure (K3 of that
187
+ roadmap). Mutation testing is the industrial form of the same question; one
188
+ independent instance asking it in prose is the cheap first form, and shipping the
189
+ cheap form now beats deferring the question until the infrastructure exists.
190
+
89
191
  ## See also
90
192
 
91
193
  - [`evaluator-independence`](../../rules/evaluator-independence.md) — the rule this page carries the argument for.