@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.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +297 -137
- package/CONTRIBUTING.md +9 -0
- package/README.md +2 -2
- package/dist/agent-src/commands/analyze/inbox.md +26 -0
- package/dist/agent-src/commands/analyze/roadmap-repos.md +27 -0
- package/dist/agent-src/commands/challenge-me/closure.md +178 -0
- package/dist/agent-src/commands/challenge-me.md +9 -2
- package/dist/agent-src/commands/council/default.md +25 -5
- package/dist/agent-src/commands/feature/plan.md +28 -1
- package/dist/agent-src/commands/feature/roadmap.md +28 -1
- package/dist/agent-src/commands/implement-ticket.md +27 -0
- package/dist/agent-src/commands/jira-ticket.md +27 -0
- package/dist/agent-src/commands/pr/create.md +29 -0
- package/dist/agent-src/commands/pr/merge.md +60 -9
- package/dist/agent-src/commands/roadmap/ai-council.md +7 -1
- package/dist/agent-src/commands/roadmap/create.md +74 -27
- package/dist/agent-src/commands/roadmap/materialize.md +27 -0
- package/dist/agent-src/commands/roadmap/process-full.md +123 -18
- package/dist/agent-src/commands/team.md +22 -0
- package/dist/agent-src/contexts/authority/scope-growth-ownership.md +80 -0
- package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +47 -0
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +44 -3
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +15 -15
- package/dist/agent-src/contexts/execution/decision-closure-execution.md +93 -0
- package/dist/agent-src/contexts/execution/fix-loop-ladder.md +108 -0
- package/dist/agent-src/contexts/execution/plan-confidence-gate.md +4 -2
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +75 -6
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
- package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +29 -0
- package/dist/agent-src/rules/autonomous-execution.md +15 -8
- package/dist/agent-src/rules/delegation-policy.md +23 -45
- package/dist/agent-src/rules/design-fidelity.md +32 -37
- package/dist/agent-src/rules/evaluator-independence.md +43 -49
- package/dist/agent-src/rules/test-first.md +41 -0
- package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
- package/dist/agent-src/skills/ai-council/SKILL.md +11 -3
- package/dist/agent-src/skills/api-design/data/manifest.json +3 -3
- package/dist/agent-src/skills/database/data/manifest.json +4 -4
- package/dist/agent-src/skills/database/data/query-tuning.csv +3 -3
- package/dist/agent-src/skills/design-review/SKILL.md +50 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +14 -4
- package/dist/agent-src/skills/experiment-loop/SKILL.md +31 -1
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +1 -1
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +42 -3
- package/dist/agent-src/skills/threat-modeling/SKILL.md +9 -4
- package/dist/agent-src/skills/threat-modeling/data/manifest.json +4 -4
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +37 -3
- package/dist/agent-src/templates/agent-settings.md +1 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +188 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -0
- package/dist/cli-delegate/check_update_banner.js +40 -2
- package/dist/cli-delegate/chunk-4E2W63DA.js +335 -0
- package/dist/cli-delegate/chunk-5R7HOLAF.js +99 -0
- package/dist/cli-delegate/{chunk-IVBPRCQO.js → chunk-6KFEC3G7.js} +1 -1
- package/dist/cli-delegate/{chunk-2TAQ2K4V.js → chunk-6KM6ORRY.js} +55 -386
- package/dist/cli-delegate/{chunk-2XY7ILBT.js → chunk-FC75PGJE.js} +42 -2
- package/dist/cli-delegate/{chunk-GYC3VRYN.js → chunk-FXYUYU4N.js} +57 -13
- package/dist/cli-delegate/{chunk-55ACLDUE.js → chunk-GJCBB2UG.js} +168 -10
- package/dist/cli-delegate/{chunk-AK6HODNQ.js → chunk-HDVVGPQW.js} +873 -539
- package/dist/cli-delegate/{chunk-H32DGUJH.js → chunk-P6ZHP5W2.js} +1 -1
- package/dist/cli-delegate/{chunk-57PN4GYJ.js → chunk-RGNIWTEA.js} +1 -1
- package/dist/cli-delegate/chunk-ROYYTEZU.js +39 -0
- package/dist/cli-delegate/{chunk-3FKR64R5.js → chunk-UNCRJBT3.js} +31 -7
- package/dist/cli-delegate/{chunk-2DK2VJWG.js → chunk-WGXTVKCQ.js} +20 -6
- package/dist/cli-delegate/chunk-YDPILCOL.js +152 -0
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +1 -1
- package/dist/cli-delegate/cmd_conformance.js +90 -56
- package/dist/cli-delegate/cmd_doctor.js +7 -5
- package/dist/cli-delegate/cmd_explain.js +2 -2
- package/dist/cli-delegate/cmd_export.js +9 -7
- package/dist/cli-delegate/cmd_fleet.js +4 -2
- package/dist/cli-delegate/cmd_handoff.js +4 -4
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +2 -2
- package/dist/cli-delegate/cmd_preflight.js +4 -2
- package/dist/cli-delegate/cmd_prune.js +10 -8
- package/dist/cli-delegate/cmd_route_audit.js +2 -2
- package/dist/cli-delegate/cmd_route_explain.js +1 -1
- package/dist/cli-delegate/cmd_session_recycle.js +2 -2
- package/dist/cli-delegate/cmd_settings_get.js +28 -2
- package/dist/cli-delegate/cmd_settings_migrate.js +9 -7
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +10 -8
- package/dist/cli-delegate/cmd_uninstall.js +16 -13
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +1 -1
- package/dist/cli-delegate/cmd_validate.js +12 -10
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +85 -38
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +10 -8
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +8 -6
- package/dist/hooks/dispatch.js +1832 -1007
- package/dist/install/claudeRuleRewrite.js +14 -3
- package/dist/install/conflict.js +60 -10
- package/dist/install/conflictTracker.js +218 -0
- package/dist/install/fsPrimitives.js +54 -0
- package/dist/install/install.mjs +2007 -1481
- package/dist/install/manifestFiles.js +259 -0
- package/dist/install/preflight.js +14 -2
- package/dist/install/preserve.js +157 -0
- package/dist/install/recordedOwnership.js +132 -0
- package/dist/install/txlog.js +11 -2
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +398 -39
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +3 -2
- package/dist/scripts/_lib/fs_atomic.js +167 -0
- package/dist/scripts/_lib/installed_tools.js +460 -0
- package/dist/scripts/_lib/lean_projection_mode.js +3 -2
- package/dist/scripts/_lib/settings_renamed_keys.js +78 -0
- package/dist/server/routes/install.js +8 -0
- package/dist/server/routes/wizard.js +9 -3
- package/dist/server/schemas/settings.js +17 -5
- package/dist/shared/missionExecution.js +97 -0
- package/dist/ui/assets/{index-D0jaCRPM.js → index-DH1xc62v.js} +17 -17
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +103 -0
- package/docs/contracts/settings-classes.md +26 -7
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
- package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
- package/docs/guidelines/design-fidelity-routing.md +29 -0
- package/package.json +1 -1
- package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
- package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -0
- package/src/config/agent-settings.template.yml +139 -27
- package/src/config/auto-rule-budget.json +16 -0
- package/src/config/ci-local-parity.yml +18 -5
- package/src/config/continuity-surface.json +21 -0
- package/src/config/gate-coverage.yml +146 -13
- package/src/config/gate-violation-baselines.json +6 -6
- package/src/config/hook-token-budget.json +2 -0
- package/src/config/loop-surfaces.yaml +215 -0
- package/src/config/platform-anchor.json +3 -2
- package/src/config/release-gate-locality.yml +11 -0
- package/src/config/routing-coverage-seed.json +18 -4
- package/src/config/rule-enforcement-baseline.json +0 -1
- package/src/install/claudeRuleRewrite.ts +16 -2
- package/src/install/conflict.ts +65 -9
- package/src/install/conflictTracker.ts +299 -0
- package/src/install/fsPrimitives.ts +54 -0
- package/src/install/manifestFiles.ts +312 -0
- package/src/install/preflight.ts +16 -2
- package/src/install/preserve.ts +205 -0
- package/src/install/recordedOwnership.ts +149 -0
- package/src/install/txlog.ts +11 -2
- package/src/install/types.ts +19 -4
- package/src/scripts/_cli/cmd_conformance.ts +88 -15
- package/src/scripts/_cli/cmd_doctor.ts +4 -3
- package/src/scripts/_cli/cmd_route_explain.ts +9 -2
- package/src/scripts/_cli/cmd_settings_get.ts +44 -0
- package/src/scripts/_cli/doctor_execution.ts +90 -0
- package/src/scripts/_lib/activation_payload.ts +247 -0
- package/src/scripts/_lib/agent_settings.ts +4 -2
- package/src/scripts/_lib/authority_path.ts +102 -0
- package/src/scripts/_lib/cascade_base.ts +94 -0
- package/src/scripts/_lib/changelog_eras.ts +7 -2
- package/src/scripts/_lib/continuation_ladder.ts +149 -2
- package/src/scripts/_lib/council_transport.ts +129 -0
- package/src/scripts/_lib/delivery_ready.ts +112 -0
- package/src/scripts/_lib/forge_protection.ts +267 -0
- package/src/scripts/_lib/hook_platform_keys.ts +27 -0
- package/src/scripts/_lib/json_python_parity.ts +127 -0
- package/src/scripts/_lib/lean_projection_mode.ts +14 -3
- package/src/scripts/_lib/loop_surfaces.ts +382 -0
- package/src/scripts/_lib/mission_record.ts +190 -0
- package/src/scripts/_lib/obligation_frequency.ts +217 -0
- package/src/scripts/_lib/obligations.ts +402 -0
- package/src/scripts/_lib/orchestration_record.ts +11 -20
- package/src/scripts/_lib/release_highlights.ts +199 -10
- package/src/scripts/_lib/release_holds.ts +493 -0
- package/src/scripts/_lib/release_migration_gate.ts +184 -0
- package/src/scripts/_lib/rides_along.ts +102 -0
- package/src/scripts/_lib/settings_renamed_keys.ts +82 -0
- package/src/scripts/_lib/test_delta.ts +166 -0
- package/src/scripts/_lib/test_provenance.ts +171 -0
- package/src/scripts/_lib/typed_op_grant.ts +246 -0
- package/src/scripts/_lib/typed_op_watch.ts +185 -0
- package/src/scripts/ai_council/config.ts +8 -11
- package/src/scripts/ai_council/fallback_config.ts +5 -3
- package/src/scripts/ai_council/ownership_classes.ts +118 -0
- package/src/scripts/ask_block_census.ts +285 -15
- package/src/scripts/check_enforcement_matrix.ts +624 -0
- package/src/scripts/check_gate_reachability.ts +173 -10
- package/src/scripts/check_generator_sync.ts +954 -0
- package/src/scripts/check_preamble_payload_budget.ts +75 -2
- package/src/scripts/check_release_highlights.ts +33 -1
- package/src/scripts/check_release_holds.ts +567 -0
- package/src/scripts/check_rule_projection_integrity.ts +22 -12
- package/src/scripts/check_test_delta.ts +294 -0
- package/src/scripts/check_test_weakening.ts +299 -0
- package/src/scripts/closure_scan.ts +333 -0
- package/src/scripts/compile_hook_manifest.ts +43 -3
- package/src/scripts/council_record_shape.ts +209 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +88 -9
- package/src/scripts/hooks/concern_registry.ts +4 -0
- package/src/scripts/hooks/design_pass_hook.ts +128 -3
- package/src/scripts/hooks/evidence_independence.ts +96 -0
- package/src/scripts/hooks/memory_recall_hook.ts +540 -0
- package/src/scripts/hooks/obligation_settle_hook.ts +182 -0
- package/src/scripts/hooks/rule_inject_hook.ts +49 -1
- package/src/scripts/hooks/run_continuation_hook.ts +17 -20
- package/src/scripts/hooks_doctor.ts +85 -0
- package/src/scripts/hooks_status.ts +19 -0
- package/src/scripts/install.ts +106 -206
- package/src/scripts/janitor.ts +7 -0
- package/src/scripts/lint_decision_classes.ts +464 -0
- package/src/scripts/lint_hook_manifest.ts +11 -0
- package/src/scripts/lint_major_migration_sections.ts +450 -0
- package/src/scripts/lint_plan_risk_register.ts +47 -3
- package/src/scripts/lint_roadmap_blockers.ts +61 -0
- package/src/scripts/lint_roadmap_producers.ts +202 -0
- package/src/scripts/measure_rule_budget.ts +101 -5
- package/src/scripts/new_roadmap.ts +37 -0
- package/src/scripts/orchestration_record.ts +0 -5
- package/src/scripts/release.ts +14 -98
- package/src/scripts/release_drill.ts +267 -1
- package/src/scripts/release_publication.ts +51 -0
- package/src/scripts/report_enforcement_drift.ts +566 -0
- package/src/scripts/report_host_injection_effect.ts +3 -11
- package/src/scripts/report_standing_payload_by_host.ts +26 -152
- package/src/scripts/schemas/agent-settings.schema.json +23 -0
- package/src/scripts/schemas/command.schema.json +4 -0
- package/src/scripts/scope_growth.ts +219 -0
- package/src/scripts/trigger_eval_grandfather.json +0 -1
- package/src/scripts/ui_conformance_probe.ts +622 -0
- package/src/server/schemas/settings.ts +31 -7
- package/src/shared/missionExecution.ts +126 -0
- 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
|
|
66
|
-
|
|
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
|
|
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
|
|
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
|
|
179
|
-
|
|
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
|
|
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
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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).
|
|
231
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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:** ≤
|
|
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
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
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 ·
|
|
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.
|