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