@event4u/agent-config 15.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 +301 -347
- 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 +77 -29
- 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 +97 -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/rules/user-interaction.md +31 -30
- 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/error-handling-patterns/SKILL.md +9 -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-NUHLI2RX.js +80 -0
- package/dist/cli-delegate/{chunk-HZ52BRGG.js → chunk-P6ZHP5W2.js} +15 -90
- package/dist/cli-delegate/{chunk-TYSY33MD.js → chunk-QJWAUMJW.js} +12 -2
- 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-2KKXJW25.js → chunk-S3VFXMTM.js} +1 -1
- 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 +918 -325
- package/dist/cli-delegate/cmd_doctor.js +7 -5
- package/dist/cli-delegate/cmd_explain.js +5 -3
- 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 +6 -6
- 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 +3 -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 +4 -4
- 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 +14 -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 +87 -40
- 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 +2601 -1073
- 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 +2008 -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 +1612 -667
- 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_lock.js +1 -1
- 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/io/yamlIO.js +50 -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 +28 -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/host-injection-effect.json +1 -1
- package/src/config/loop-surfaces.yaml +215 -0
- package/src/config/platform-anchor.json +3 -2
- package/src/config/preamble-payload-budget.json +12 -7
- package/src/config/preamble-payload-exceptions.json +28 -0
- 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/_dispatch.bash +3 -1
- 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/base_ref_payload.ts +315 -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/dropped_decision.ts +142 -0
- package/src/scripts/_lib/forge_protection.ts +267 -0
- package/src/scripts/_lib/hook_platform_keys.ts +27 -0
- package/src/scripts/_lib/installed_lock.ts +1 -1
- 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/measured_payload_ceiling.ts +424 -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/payload_catalogue_completeness.ts +211 -0
- package/src/scripts/_lib/release_findings_ingest.ts +324 -0
- 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/release_tag_dispatch.ts +63 -0
- package/src/scripts/_lib/review_baseline.ts +254 -0
- package/src/scripts/_lib/review_skipped_record.ts +61 -1
- package/src/scripts/_lib/rides_along.ts +102 -0
- package/src/scripts/_lib/settings_renamed_keys.ts +82 -0
- package/src/scripts/_lib/standing_bound_ratchet.ts +216 -103
- package/src/scripts/_lib/test_delta.ts +166 -0
- package/src/scripts/_lib/test_provenance.ts +171 -0
- package/src/scripts/_lib/turn_end_refusals.ts +51 -4
- 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_beta_review_markers.ts +35 -4
- package/src/scripts/check_enforcement_matrix.ts +624 -0
- package/src/scripts/check_finding_dispositions.ts +167 -16
- package/src/scripts/check_gate_reachability.ts +173 -10
- package/src/scripts/check_generator_sync.ts +954 -0
- package/src/scripts/check_held_object_arrivals.ts +381 -0
- package/src/scripts/check_preamble_payload_budget.ts +474 -124
- package/src/scripts/check_release_highlights.ts +33 -1
- package/src/scripts/check_release_holds.ts +567 -0
- package/src/scripts/check_release_published.ts +1 -1
- package/src/scripts/check_reply_consistency.ts +86 -17
- 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 +127 -12
- package/src/scripts/hooks/block_kernel_rule_writes.ts +12 -2
- package/src/scripts/hooks/concern_registry.ts +6 -0
- package/src/scripts/hooks/design_pass_hook.ts +128 -3
- package/src/scripts/hooks/end_review_nudge_hook.ts +101 -21
- 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/review_baseline_hook.ts +130 -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/turn_end_gate_hook.ts +232 -14
- package/src/scripts/hooks_doctor.ts +89 -1
- package/src/scripts/hooks_status.ts +19 -0
- package/src/scripts/install.ts +107 -207
- package/src/scripts/interruption_report.ts +8 -2
- package/src/scripts/janitor.ts +15 -1
- 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/measure_turn_end_gate.ts +302 -5
- package/src/scripts/new_roadmap.ts +37 -0
- package/src/scripts/orchestration_record.ts +0 -5
- package/src/scripts/release.ts +66 -162
- package/src/scripts/release_drill.ts +460 -15
- package/src/scripts/release_env.ts +1 -1
- package/src/scripts/release_publication.ts +52 -1
- package/src/scripts/report_enforcement_drift.ts +566 -0
- package/src/scripts/report_held_object_arrivals.ts +456 -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/sync_agent_settings.ts +140 -18
- package/src/scripts/trigger_eval_grandfather.json +0 -1
- package/src/scripts/ui_conformance_probe.ts +622 -0
- package/src/server/io/yamlIO.ts +48 -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
|
@@ -202,3 +202,100 @@ After completing a batch of actions, provide a summary table:
|
|
|
202
202
|
| 2 | `test.php` | Updated assertion |
|
|
203
203
|
| 3 | `config.php` | Skipped (intentional) |
|
|
204
204
|
```
|
|
205
|
+
|
|
206
|
+
## The trigger is a decision, not a format — the measurement behind it
|
|
207
|
+
|
|
208
|
+
Migrated out of `user-interaction.md` on 2026-09-11 to pay for Iron Law 3
|
|
209
|
+
under the per-spawn preamble budget. The obligation stays in the rule; this
|
|
210
|
+
is the evidence for it.
|
|
211
|
+
|
|
212
|
+
Measured (30-session conformance audit, 2026-08-06): **every** malformed ask
|
|
213
|
+
was a one-line parenthetical or a trailing free-text offer — a German
|
|
214
|
+
"say the word if I should take the three lines along", an English "shall I
|
|
215
|
+
implement it this way?" — while the same sessions formatted their **large**
|
|
216
|
+
asks perfectly. So the rule is being read as *if numbered options, then a
|
|
217
|
+
recommendation line*. It is the other way round, and an ask that feels too
|
|
218
|
+
small for a block is exactly the one that escapes the format.
|
|
219
|
+
|
|
220
|
+
Three further caught shapes: a contentless filler option; an inline
|
|
221
|
+
"(recommended)" tag **beside** the recommendation line (the dual source
|
|
222
|
+
Iron Law 1 forbids); an option set answerable only as `1,3,4`.
|
|
223
|
+
|
|
224
|
+
**No gate ships for this.** `check_reply_consistency` can read a draft on
|
|
225
|
+
stdin, but it inspects *numbered-option blocks* — and every measured failure
|
|
226
|
+
had no block by construction, so it scans exactly the surface that did not
|
|
227
|
+
fail. `conformance:behavior` deliberately does not score ask-shape, so an
|
|
228
|
+
unmoved rate is a finding rather than a silence.
|
|
229
|
+
|
|
230
|
+
## Iron Law 3 — why laws 1 and 2 do not reach across a turn boundary
|
|
231
|
+
|
|
232
|
+
Iron Laws 1 and 2 are discharged by the shape of the reply that carries the
|
|
233
|
+
block. Neither survives a turn boundary, which is the gap Iron Law 3 closes:
|
|
234
|
+
a second assistant execution with no user message between it and the ask is
|
|
235
|
+
not a new conversation, and from the user's side a thread that ends without
|
|
236
|
+
the question ended without the question.
|
|
237
|
+
|
|
238
|
+
**The measured failure.** A turn put three numbered options and a
|
|
239
|
+
recommendation line to the user. A `stop` concern then produced a second
|
|
240
|
+
assistant execution with no intervening user message, and that second reply
|
|
241
|
+
handled the concern while demoting the open question to a subordinate clause.
|
|
242
|
+
The four rules that could have caught it did not, each for a stated reason:
|
|
243
|
+
Iron Law 1 inspects a reply that HAS an options block, `check_reply_consistency`
|
|
244
|
+
receives a draft rather than a transcript, `active-remediation` governs
|
|
245
|
+
findings rather than issued decisions, and `no-cheap-questions` guards the
|
|
246
|
+
opposite direction.
|
|
247
|
+
|
|
248
|
+
**Carrier, stated honestly.** The deterministic half is the
|
|
249
|
+
`pending-decision` detector in `src/scripts/hooks/turn_end_gate_hook.ts` —
|
|
250
|
+
it refuses a turn-end when an earlier reply in the same user turn carried a
|
|
251
|
+
block and the closing reply carries none. It sees one user turn on one host,
|
|
252
|
+
so everything outside that is model-carried, exactly like Iron Law 2's own
|
|
253
|
+
"no gate ships for this" note. `check_reply_consistency` reads a single draft
|
|
254
|
+
and holds no cross-turn state; it cannot see this law at all.
|
|
255
|
+
|
|
256
|
+
## The native ask — per host, and what it changes
|
|
257
|
+
|
|
258
|
+
> **Why this is here and not in the rule.** `user-interaction` is a
|
|
259
|
+
> project-scope rule, so its every byte is re-written into the preamble on
|
|
260
|
+
> **every subagent spawn**, and `check_preamble_payload_budget` is a measured
|
|
261
|
+
> ratchet with no headroom — a four-line addition to the rule measured +219
|
|
262
|
+
> tokens per spawn and failed it. The rule's own § Mechanics already routes
|
|
263
|
+
> "everything you look up rather than obey" here, and the ask SHAPE is lookup
|
|
264
|
+
> material: Iron Law 1 governs the recommendation identically on both shapes,
|
|
265
|
+
> so the rule needed no new obligation, only this contract to point at.
|
|
266
|
+
|
|
267
|
+
`ask: native | text` is declared per host in `src/scripts/hook_manifest.yaml`
|
|
268
|
+
and printed by `agent-config hooks:status`. It is **declared, not probed**: the
|
|
269
|
+
row records what the host's documented tool surface offers. A host declaring
|
|
270
|
+
`native` whose primitive turns out to be absent degrades to the text block —
|
|
271
|
+
the same question, the same content — so a wrong row costs a missed upgrade and
|
|
272
|
+
never a broken ask. Absent reads `text`.
|
|
273
|
+
|
|
274
|
+
| Shape | What the ask is | Where the recommendation lives |
|
|
275
|
+
|---|---|---|
|
|
276
|
+
| `native` | the host's structured-ask tool call | the **default option** of the native ask |
|
|
277
|
+
| `text` | the numbered block, per Iron Law 1 | the `Recommendation:` / `Empfehlung:` line directly under the block |
|
|
278
|
+
|
|
279
|
+
Four obligations hold on both shapes, and three of them are why the native
|
|
280
|
+
form is preferred rather than merely available:
|
|
281
|
+
|
|
282
|
+
1. **One decision point per turn.** A native ask presenting several unrelated
|
|
283
|
+
questions is the same violation as several text blocks. One number — or one
|
|
284
|
+
selection — answers it, or it is two asks.
|
|
285
|
+
2. **Every option says what changes by answering it.** Not the option's name
|
|
286
|
+
again: the consequence. A native ask makes this structural, because an
|
|
287
|
+
option carries a description field the text form leaves to discipline.
|
|
288
|
+
3. **The recommendation has exactly ONE source.** On a native ask that source
|
|
289
|
+
is the default option; naming it a second time in the prose above is the
|
|
290
|
+
drift Iron Law 1 exists to make structurally impossible.
|
|
291
|
+
4. **The answer is recorded before the next step runs.** Where the ask came out
|
|
292
|
+
of a plan-closure pass, it becomes a `## Decisions` row — id, ownership,
|
|
293
|
+
`resolved by: owner`, the decision, its evidence, its `revisit if`. An
|
|
294
|
+
answer that lives only in the transcript is re-derived after the next
|
|
295
|
+
context reset, which is the repeat the ask census counts as a defect.
|
|
296
|
+
|
|
297
|
+
**What the native shape does NOT change.** It is not a license to ask more: the
|
|
298
|
+
one-question-per-turn floor, the no-cheap-questions floor and the ownership
|
|
299
|
+
routing all run first, and a question that should not have been asked is not
|
|
300
|
+
improved by a better widget. Nor does it change who may be asked — a technical
|
|
301
|
+
decision does not reach the owner on any host.
|
|
@@ -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).
|