@event4u/agent-config 14.7.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 +245 -388
- package/README.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 +157 -3
- 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 +64 -2
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +154 -2
- package/dist/agent-src/rules/artifact-drafting-protocol.md +5 -1
- package/dist/agent-src/rules/decision-revisit-gate.md +65 -33
- package/dist/agent-src/rules/recurring-criticism.md +1 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +19 -0
- package/dist/agent-src/rules/source-confidentiality.md +1 -1
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +7 -4
- package/dist/agent-src/scripts/dashboard_mode.ts +212 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +47 -48
- package/dist/agent-src/skills/adr-create/SKILL.md +124 -5
- 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/security/SKILL.md +8 -0
- package/dist/agent-src/skills/security-audit/SKILL.md +12 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +20 -2
- package/dist/cli/registry.js +1 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli-delegate/{chunk-JZ4NR2TW.js → chunk-7PRE6ZV2.js} +1 -1
- package/dist/cli-delegate/{chunk-7F3VYSM2.js → chunk-EEJUMCDZ.js} +14 -14
- package/dist/cli-delegate/{chunk-74E3TKWV.js → chunk-H4VIVD4C.js} +5 -5
- package/dist/cli-delegate/chunk-I3EIN2YG.js +36 -0
- package/dist/cli-delegate/{chunk-4VR4ORQ6.js → chunk-LPPWO5CE.js} +4 -3
- package/dist/cli-delegate/{chunk-UEZ7D35A.js → chunk-N7CDDGI3.js} +4 -23
- package/dist/cli-delegate/cmd_adr_effective.js +1162 -0
- package/dist/cli-delegate/cmd_conformance.js +14 -14
- package/dist/cli-delegate/cmd_converge.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +7 -7
- package/dist/cli-delegate/cmd_export.js +6 -6
- package/dist/cli-delegate/cmd_handoff.js +7 -6
- package/dist/cli-delegate/cmd_memory_get.js +2 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_preflight.js +5 -5
- package/dist/cli-delegate/cmd_prune.js +6 -6
- 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 +3 -3
- package/dist/cli-delegate/cmd_settings_get.js +3 -3
- package/dist/cli-delegate/cmd_settings_migrate.js +6 -6
- package/dist/cli-delegate/cmd_sync.js +6 -6
- package/dist/cli-delegate/cmd_uninstall.js +6 -6
- package/dist/cli-delegate/cmd_update.js +3 -3
- package/dist/cli-delegate/cmd_upgrade.js +3 -3
- package/dist/cli-delegate/cmd_validate.js +6 -6
- package/dist/cli-delegate/cmd_versions.js +3 -3
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +53 -22
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +7 -6
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +6 -5
- package/dist/hooks/dispatch.js +806 -681
- package/dist/install/globalRuleLayers.js +169 -0
- package/dist/install/globalRuleLayers.js.map +1 -0
- package/dist/install/partitionEligibility.js +156 -0
- package/dist/install/partitionEligibility.js.map +1 -1
- 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 +654 -578
- 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 +52 -89
- package/dist/scripts/condense.js.map +1 -1
- package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +45 -1
- package/docs/guidelines/agent-infra/false-green.md +47 -1
- package/package.json +1 -1
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +7 -4
- package/src/agent-src/scripts/dashboard_mode.ts +212 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +47 -48
- package/src/config/ci-local-parity.yml +21 -0
- package/src/config/estate-count-budget.json +275 -2
- 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-stub-ceilings.json +17 -3
- package/src/install/globalRuleLayers.ts +197 -0
- package/src/install/partitionEligibility.ts +177 -0
- package/src/install/ruleLayerPartition.ts +212 -0
- package/src/scripts/_cli/cmd_adr_effective.ts +484 -0
- package/src/scripts/_dispatch.bash +11 -0
- package/src/scripts/_lib/adr_frontmatter.test.ts +365 -0
- package/src/scripts/_lib/adr_frontmatter.ts +459 -0
- package/src/scripts/_lib/envelope_grounding.ts +11 -1
- package/src/scripts/_lib/layer_overlap_notice.ts +11 -2
- package/src/scripts/_lib/prune_empty_dirs.ts +80 -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/audit_adr_coverage.ts +103 -17
- 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 +18 -0
- package/src/scripts/check_rule_layer_partition.ts +531 -0
- package/src/scripts/check_single_delivery.ts +137 -4
- package/src/scripts/check_standing_rule_delivery.ts +8 -2
- package/src/scripts/condense.ts +61 -91
- package/src/scripts/external_sources_denylist.json +4 -1
- package/src/scripts/hooks/block_unauthorized_git.ts +22 -2
- 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/state_io.ts +88 -1
- package/src/scripts/hooks/stdin_failure_policy.ts +96 -0
- package/src/scripts/injection_scan_hook.ts +137 -5
- package/src/scripts/lint_hook_manifest.ts +49 -0
- package/src/scripts/lint_provenance_vocabulary.ts +472 -4
- package/src/scripts/routing_doctor.ts +5 -1
- package/src/scripts/sync_pr_branch.ts +163 -20
- package/dist/cli-delegate/{chunk-PPQO4NGR.js → chunk-6RJA2F5A.js} +3 -3
- package/dist/cli-delegate/{chunk-6EOCNQAM.js → chunk-E4XIZDIB.js} +0 -0
- package/dist/cli-delegate/{chunk-FBKL6JWT.js → chunk-MMSGVZKV.js} +3 -3
- package/dist/cli-delegate/{chunk-GJ5BVHXM.js → chunk-PMEKGDED.js} +3 -3
|
@@ -38,7 +38,7 @@ paused for confirmation before every step) was removed —
|
|
|
38
38
|
| `/roadmap:materialize` | `commands/roadmap/materialize.md` | Turn an accepted roadmap into the concrete artefacts it plans |
|
|
39
39
|
| `/roadmap:process-step` | `commands/roadmap/process-step.md` | Autonomously process the next open step, then stop |
|
|
40
40
|
| `/roadmap:process-phase` (**default execution scope**) | `commands/roadmap/process-phase.md` | Autonomously process every open step in the current phase |
|
|
41
|
-
| `/roadmap:process-full` | `commands/roadmap/process-full.md` | Autonomously process every open step across every phase |
|
|
41
|
+
| `/roadmap:process-full` | `commands/roadmap/process-full.md` | Autonomously process every open step across every phase; `--all` iterates the whole active estate, `--worktree` isolates the workspace |
|
|
42
42
|
| `/roadmap:next` | `commands/roadmap/next.md` | Screen for the next executable roadmap, then carry it to a reviewable PR (selection + `process-full` + delivery) |
|
|
43
43
|
|
|
44
44
|
Sub-command names match the locked contract in
|
|
@@ -89,14 +89,11 @@ evaluation-order accident.
|
|
|
89
89
|
|
|
90
90
|
**Recursive-dispatch guard (2.3) — honest scope.** No verified host
|
|
91
91
|
discriminator exists for "is this classification running inside a
|
|
92
|
-
subagent/teammate session"
|
|
93
|
-
|
|
94
|
-
NOT_PLANNED, and no field in this repo's hook envelope carries session
|
|
95
|
-
lineage. The guard is therefore a CALLER-SUPPLIED fact
|
|
92
|
+
subagent/teammate session", and no field in this repo's hook envelope carries
|
|
93
|
+
session lineage. The guard is therefore a CALLER-SUPPLIED fact
|
|
96
94
|
(`insideSubagentSession`), never a `process.env` probe for an unverified
|
|
97
|
-
variable name
|
|
98
|
-
|
|
99
|
-
(in-session) for rungs 1-4; rung 0 is exempt (it never spawns).
|
|
95
|
+
variable name. When set, it resolves ∅ (in-session) for rungs 1-4; rung 0 is
|
|
96
|
+
exempt (it never spawns).
|
|
100
97
|
|
|
101
98
|
**Relationship to the council's own necessity gate.** Rung 4's three
|
|
102
99
|
signals (design decision / security downgrade / release-gate escalation)
|
|
@@ -127,6 +124,32 @@ Criteria are independent and additive in the obvious way (a slice matching
|
|
|
127
124
|
two rows takes the higher of the two tiers); this table never lowers a
|
|
128
125
|
tier `inferSliceTier` (§ below) already raised.
|
|
129
126
|
|
|
127
|
+
## Cross-vendor worker direction (declared, not implemented)
|
|
128
|
+
|
|
129
|
+
Deny-by-default — a direction not listed here is denied. Direction rules,
|
|
130
|
+
payload allow/deny lists, the report-only boundary, the no-recursion clause and
|
|
131
|
+
the human egress gate:
|
|
132
|
+
[`cross-vendor-worker-direction`](../../../../docs/contracts/cross-vendor-worker-direction.md).
|
|
133
|
+
Role pairs, never vendor names — `classifyLadder` carries no vendor identity
|
|
134
|
+
([`subagent-routing`](subagent-routing.md) § Why vendor-neutral).
|
|
135
|
+
|
|
136
|
+
Rung-1/2 slices only.
|
|
137
|
+
|
|
138
|
+
| # | Direction (role pair) | Resolves to |
|
|
139
|
+
|---|---|---|
|
|
140
|
+
| CV-1 | a worker on the **non-authoring** vendor reviews the **authoring** vendor's output | report-only worker |
|
|
141
|
+
| CV-2 | the mirror of CV-1 | report-only worker |
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
DIRECTION PERMITTED + PAYLOAD ALLOWED + HUMAN APPROVED = MAY SEND.
|
|
145
|
+
ANY ONE MISSING = MAY NOT.
|
|
146
|
+
A CROSS-VENDOR WORKER NEVER IMPLEMENTS, WRITES, COMMITS, ACTS,
|
|
147
|
+
OR DISPATCHES ONWARD.
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Nothing reads CV-1/CV-2 at runtime: a contract surface a future implementation
|
|
151
|
+
must satisfy, replacing the phantom artefact the original survey cited.
|
|
152
|
+
|
|
130
153
|
## Per-slice tier inference (v1.5 — deterministic, task-TYPE-keyed)
|
|
131
154
|
|
|
132
155
|
Once a slice is classified **delegable**, a second deterministic table infers
|
|
@@ -206,15 +229,11 @@ NEVER A SILENTLY DEGRADED ANSWER. NO LLM CLASSIFIER FALLBACK (CUT C3).
|
|
|
206
229
|
| "does string Y exist" / "probe candidate strings" | `string-existence` | FTS one-shot (`memory_lookup` for the knowledge corpus) or capped `rg -n --max-count` for the codebase |
|
|
207
230
|
| "run report Z" / "run check_*" | `report-run` | direct script run, wrapped per the **measured** rtk allowlist (`internal/bench/rtk-savings/RESULTS.md` — wrap only the ~55%-savings class) |
|
|
208
231
|
|
|
209
|
-
**Why rg-first
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
lookups exactly as it hits NL retrieval — and the recorded consequence bound
|
|
215
|
-
keeps `code_graph.enabled` false permanently. The accelerant clause is the
|
|
216
|
-
escape hatch that bound names ("unless external evidence appears"); today it
|
|
217
|
-
is inert.
|
|
232
|
+
**Why rg-first** (council 2026-07-28, 2 rounds): the pre-registered benchmark
|
|
233
|
+
behind the `code-graph-retrieval-null` claim (`docs/CLAIMS.md`) measured
|
|
234
|
+
native-graph recall 0.365 vs grep 0.797 on graph-shaped questions — an
|
|
235
|
+
indexing gap that keeps `code_graph.enabled` false permanently. The accelerant
|
|
236
|
+
clause in the table above is that bound's escape hatch and is inert today.
|
|
218
237
|
|
|
219
238
|
**Escalation, not degradation:** a primitive that returns nothing (index miss,
|
|
220
239
|
pattern too ambiguous, report script absent) — **or an unusable result**
|
|
@@ -238,26 +257,17 @@ budgeted (consume part of the N=3 autonomous budget) and opt-in. Not in v1.
|
|
|
238
257
|
|
|
239
258
|
## Reference implementation
|
|
240
259
|
|
|
241
|
-
|
|
242
|
-
[`
|
|
243
|
-
|
|
244
|
-
[`
|
|
245
|
-
|
|
246
|
-
[`
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
by
|
|
253
|
-
[`tests/scripts/_lib_judgment_ladder.test.ts`](../../../../tests/scripts/_lib_judgment_ladder.test.ts)
|
|
254
|
-
(every rung, the rung-3 degrade path, the recursive-dispatch guard, and every
|
|
255
|
-
∅ case). The delegation-nudge hook
|
|
256
|
-
([`delegation_nudge_hook.ts`](../../../../src/scripts/hooks/delegation_nudge_hook.ts))
|
|
257
|
-
is its first production caller — its injected line cites the resolved rung
|
|
258
|
-
(`rung-2: dispatch do-in-parallel …`), scoped to the subagent dispatch rungs
|
|
259
|
-
(1/2); a rung-0/3/4 verdict stays silent on this carrier until Phase 3/4 give
|
|
260
|
-
team/council their own.
|
|
260
|
+
- `classifyTask` / `classifyLookup` —
|
|
261
|
+
[`auto_dispatch.ts`](../../../../src/scripts/_lib/auto_dispatch.ts)
|
|
262
|
+
- `classifyLadder` + the rung-0/1/3/4 signal detectors —
|
|
263
|
+
[`judgment_ladder.ts`](../../../../src/scripts/_lib/judgment_ladder.ts)
|
|
264
|
+
- First production caller —
|
|
265
|
+
[`delegation_nudge_hook.ts`](../../../../src/scripts/hooks/delegation_nudge_hook.ts):
|
|
266
|
+
its injected line cites the resolved rung, scoped to the dispatch rungs
|
|
267
|
+
(1/2); a rung-0/3/4 verdict stays silent on this carrier.
|
|
268
|
+
|
|
269
|
+
Each has a sibling `*.test.ts` under `tests/scripts/` covering every rung, the
|
|
270
|
+
rung-3 degrade path, the recursive-dispatch guard and every ∅ case.
|
|
261
271
|
|
|
262
272
|
## Related
|
|
263
273
|
|
|
@@ -86,18 +86,53 @@ In `auto` mode, flip to `on` for the rest of the conversation when the user expr
|
|
|
86
86
|
|
|
87
87
|
Algorithm and speech-act heuristic: [`autonomy-detection.md`](autonomy-detection.md). Anchor phrases (DE+EN), no-flip patterns, counter-examples, trivial-vs-blocking taxonomy, commit-policy summary, and named failure modes: this file + [`autonomy-examples.md`](autonomy-examples.md).
|
|
88
88
|
|
|
89
|
-
## Task-scope —
|
|
89
|
+
## Task-scope — three autonomy shapes
|
|
90
90
|
|
|
91
91
|
Depth for the rule's task-scope Iron Law (`NEW TASK → FRESH CONFIRMATION`).
|
|
92
|
-
|
|
92
|
+
Three distinct autonomy shapes — keep them apart:
|
|
93
93
|
|
|
94
94
|
| Shape | Trigger | Scope |
|
|
95
95
|
|---|---|---|
|
|
96
96
|
| **Conversation-wide trivial-question suppression** | "stop asking on trivial steps, just work" — no deliverable named. | Sticky for the rest of the conversation. Suppresses trivial workflow questions only; never lifts blocking, Hard Floor, or [`scope-control`](../../rules/scope-control.md) gates. |
|
|
97
97
|
| **Task-scoped autonomous execution** | "work autonomously on X", "arbeite die Roadmap Y komplett ab", "do PROJ-123 end-to-end" — a deliverable / artifact / ticket is named. | Bound to **that** task. Ends when the task ends. Does **not** authorize starting a new, distinct task autonomously. |
|
|
98
|
+
| **Set-scoped autonomous execution** | An accepted execution contract whose pre-scan **enumerated** a closed, ordered set of deliverables — the set members are named on the contract screen before the single Accept. | Bound to **that enumerated set**. The loop may move from one listed member to the next without a new contact. A member not on the accepted list is a new task and needs fresh confirmation. |
|
|
98
99
|
|
|
99
100
|
Litmus test: does the directive name (or unambiguously point to) a single concrete deliverable? Yes → task-scoped, scope ends with the deliverable. No → conversation-wide, trivial-question suppression only.
|
|
100
101
|
|
|
102
|
+
Set-scoped is the same litmus applied to a **list** instead of a single item, and
|
|
103
|
+
it is deliberately the narrowest thing that makes a set run possible:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
SET-SCOPED AUTONOMY IS BOUNDED BY THE ENUMERATION THE USER SAW.
|
|
107
|
+
A MEMBER ON THE ACCEPTED LIST IS CONTINUATION. ANYTHING ELSE IS A NEW TASK,
|
|
108
|
+
AND `NEW TASK → FRESH CONFIRMATION` APPLIES TO IT VERBATIM.
|
|
109
|
+
THE SET IS CLOSED AT ACCEPT TIME AND NEVER GROWS DURING THE RUN.
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Four conditions, all of which must hold before a run may claim set scope. They
|
|
113
|
+
exist because "a set" is exactly the phrasing under which an unbounded backlog
|
|
114
|
+
could be smuggled in as one authorization:
|
|
115
|
+
|
|
116
|
+
1. **Enumerated before Accept.** Every member is printed on the contract screen
|
|
117
|
+
— name, branch, and its own artifact count. A set the user did not read is
|
|
118
|
+
not a set they authorized.
|
|
119
|
+
2. **Closed.** The list cannot grow after Accept. A roadmap discovered mid-run
|
|
120
|
+
is a new task, not a late set member; it waits.
|
|
121
|
+
3. **Ordered, with independence declared.** The contract states the order and
|
|
122
|
+
which members carry no declared dependency, because that is what decides
|
|
123
|
+
whether the loop may continue past a failure (see
|
|
124
|
+
[`roadmap-process-loop § 3d`](roadmap-process-loop.md)).
|
|
125
|
+
4. **One contract, one Accept.** Set scope is granted by the same single Accept
|
|
126
|
+
as any other mode. It is never inferred from the fact that several roadmaps
|
|
127
|
+
happen to be open.
|
|
128
|
+
|
|
129
|
+
What set scope does **not** touch: the Hard Floor, the locked decision classes,
|
|
130
|
+
the kernel-edit soak, and every
|
|
131
|
+
[`scope-control`](../../rules/scope-control.md) gate. It removes the *re-ask
|
|
132
|
+
between listed members* and nothing else — a set run that reaches a Hard-Floor
|
|
133
|
+
action stops there exactly as a single-task run would.
|
|
134
|
+
|
|
135
|
+
|
|
101
136
|
When the user later issues a **new** request — different ticket, different roadmap, different artifact, different feature — treat it as a fresh task. Re-confirm autonomy for the new scope before:
|
|
102
137
|
|
|
103
138
|
- creating a branch / worktree / PR / tag for the new work,
|
|
@@ -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,
|
|
@@ -78,6 +78,8 @@ Artifacts: <N> planned (skills/rules/commands/guidelines) —
|
|
|
78
78
|
Open questions: <N> → decision sheet below (<M> rows); the rest via AI
|
|
79
79
|
council (<members | "none configured — will halt on ambiguity">)
|
|
80
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)
|
|
81
83
|
|
|
82
84
|
<decision sheet, per contract-decision-sheet — omitted entirely when M = 0>
|
|
83
85
|
|
|
@@ -97,6 +99,66 @@ re-ask inside the run. Adjust → apply, re-show once. The contract is
|
|
|
97
99
|
re-derived on every invocation — it always reflects the roadmap's and
|
|
98
100
|
repo's current state.
|
|
99
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
|
+
|
|
100
162
|
## 3. Grants activated by acceptance
|
|
101
163
|
|
|
102
164
|
| Grant | Boundary |
|
|
@@ -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
|
|
@@ -260,6 +297,89 @@ run can simply outlast, or a cross-roadmap dependency the run can satisfy itself
|
|
|
260
297
|
is work. The taxonomy still lacks the row; the mislabel now has a stated test
|
|
261
298
|
instead of a default.
|
|
262
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.
|
|
382
|
+
|
|
263
383
|
## 4. Resolve cadences — read once, cache for the run
|
|
264
384
|
|
|
265
385
|
Read both keys from `.agent-settings.yml` once and cache for the whole
|
|
@@ -414,7 +534,39 @@ For each open step in the working set (scope-bound — see wrapper):
|
|
|
414
534
|
Empty output → Iron Law 2 was violated this iteration: the step
|
|
415
535
|
landed work but no checkbox flipped. **Halt loudly**, surface
|
|
416
536
|
"step <N> landed without checkbox flip — flip then resume", and
|
|
417
|
-
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.
|
|
418
570
|
|
|
419
571
|
This guard is the deterministic counterpart to the rule's
|
|
420
572
|
pre-send self-check — it catches a forgotten flip per step, not
|
|
@@ -55,8 +55,12 @@ Fires once per creation task, not once per edit.
|
|
|
55
55
|
- At most two propose → reject cycles; then stop.
|
|
56
56
|
- Commit only on approval.
|
|
57
57
|
- Bypass is legitimate — *"just write it"* drops the protocol immediately.
|
|
58
|
+
- An artifact discovered **after** an accepted contract halts by default;
|
|
59
|
+
`late_artifacts: auto-research` is the only declared value that continues,
|
|
60
|
+
capped at three per run (mechanics guideline § Late artifacts).
|
|
58
61
|
|
|
59
|
-
Body migrated to [`guideline:agent-infra/artifact-drafting-protocol-mechanics`](../docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md) (per P4 of `road-to-kernel-and-router.md`) — Phase A/B/C procedure detail + the roadmap-run batch-mode carve-out (Research-once-at-contract-time, batch scope, no `artifact_protocol: skip`)
|
|
62
|
+
Body migrated to [`guideline:agent-infra/artifact-drafting-protocol-mechanics`](../docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md) (per P4 of `road-to-kernel-and-router.md`) — Phase A/B/C procedure detail + the roadmap-run batch-mode carve-out (Research-once-at-contract-time, batch scope, no `artifact_protocol: skip`) + § Late artifacts (the `halt` default
|
|
63
|
+
and the five-step `auto-research` procedure).
|
|
60
64
|
Trigger-set above activates this routing on demand, independent of the discipline profile (ADR-110).
|
|
61
65
|
|
|
62
66
|
Extends (cross-link, don't restate): `ask-when-uncertain`,
|
|
@@ -39,25 +39,21 @@ THE USER IS REACHED FOR THE RESERVED SET — AND ALWAYS FOR IT.
|
|
|
39
39
|
NEVER CITE A LOCK YOU HAVE NOT EVALUATED THIS TURN.
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
An agent that finds a
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
true when they were written, not a ceiling on what the package may ever become.
|
|
42
|
+
An agent that finds a beneficial change blocked by a recorded decision — an
|
|
43
|
+
honest-null verdict, a "don't relitigate" note, a budget-canon line, or an ADR —
|
|
44
|
+
does not quietly comply and drop it. It surfaces the conflict and re-evaluates
|
|
45
|
+
the lock **in the council by default**, reaching the user only for the reserved
|
|
46
|
+
set below. Locks encode what was true when they were written, not a ceiling on
|
|
47
|
+
what the package may ever become.
|
|
49
48
|
|
|
50
49
|
**The default venue is the council, and this is a correction, not a new
|
|
51
|
-
policy.** [`ai-council`](../skills/ai-council/SKILL.md)
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
work resumed — in the two clearest cases the lock report is timestamped **before**
|
|
59
|
-
the override demand. The ordering was the defect; the permission was never
|
|
60
|
-
missing.
|
|
50
|
+
policy.** [`ai-council`](../skills/ai-council/SKILL.md)'s Iron Law already sends
|
|
51
|
+
a decision the agent cannot settle from the tree to the council first, and its
|
|
52
|
+
class table lists "reopening a recorded decision". The old "offers the user a
|
|
53
|
+
path" wording made every lock an owner interrupt; measured across 26 days of
|
|
54
|
+
transcripts, the agent reported a lock and waited while the owner voided the
|
|
55
|
+
decision retroactively — twice with the lock report timestamped **before** the
|
|
56
|
+
override demand. The ordering was the defect; the permission was never missing.
|
|
61
57
|
|
|
62
58
|
**Mechanism-match check comes FIRST**: a verdict settles the *mechanism it
|
|
63
59
|
tested*, not every future proposal that resembles it — if the blocked change
|
|
@@ -81,20 +77,54 @@ distinction.
|
|
|
81
77
|
4. **Route it** — council by default (below), user only for the reserved set.
|
|
82
78
|
5. **Record** the outcome with scope and `revisit-if`.
|
|
83
79
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
[`decision-review`](../skills/decision-review/SKILL.md) stays optional, which is
|
|
91
|
-
the correct status for depth.
|
|
80
|
+
The five are stated here, not only behind a route, because the route was
|
|
81
|
+
measurably unreachable: `decision-review` ships `install.default: false` in the
|
|
82
|
+
non-default `analysis-workbench` pack, so a pack-legal install received the
|
|
83
|
+
obligation and not the procedure. `routes_to` now names two always-on skills;
|
|
84
|
+
the backward-audit depth in
|
|
85
|
+
[`decision-review`](../skills/decision-review/SKILL.md) stays optional.
|
|
92
86
|
|
|
93
87
|
Full catalog (honest nulls, don't-relitigate notes, budget-canon lines, ADRs,
|
|
94
88
|
hard structural caps), the per-step detail, when-NOT-to-fire and the failure
|
|
95
89
|
modes remain in [`skill:decision-review` § Decision-revisit gate — mechanics](../skills/decision-review/SKILL.md).
|
|
96
90
|
Trigger-set above activates this routing on demand, independent of the discipline profile (ADR-110).
|
|
97
91
|
|
|
92
|
+
## Reading a lock — the two descriptive axes
|
|
93
|
+
|
|
94
|
+
Step 2 reads, in order: **effective state** (status · amendments · successors) →
|
|
95
|
+
**provenance** → **evidence strength** → **discovery** → **current evidence**
|
|
96
|
+
(does the basis still resolve in a clone?) → **reversibility of the proposed
|
|
97
|
+
transition** → **reserved dimensions**. `adr_cite_check` prints six of them —
|
|
98
|
+
read 6 is the agent's, because reversibility belongs to the proposed transition
|
|
99
|
+
and no tool reading one record supplies it. What each field means, and what a
|
|
100
|
+
`[found]` basis ref does NOT claim, is in that script's module docstring. The
|
|
101
|
+
evidence-priced burden table stays in
|
|
102
|
+
[`adr-layout § The reopen record`](../docs/contracts/adr-layout.md).
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
A GRADE IS A MEASUREMENT, NOT A PERMISSION — IT GRANTS NOTHING.
|
|
106
|
+
CITING AN E0 LOCK AS A HARD BLOCKER WITHOUT SURFACING ITS GRADE IS A VIOLATION.
|
|
107
|
+
NO GRADE LETS AN AGENT SUPERSEDE A RECORD, SKIP A COUNCIL, OR TAKE ANY ACTION
|
|
108
|
+
IT COULD NOT TAKE YESTERDAY. THE COUNCIL-FIRST VENUE STAYS, AT EVERY GRADE.
|
|
109
|
+
AN ADR'S HISTORICAL DECISION-MAKER DOES NOT DETERMINE ITS REOPEN VENUE.
|
|
110
|
+
A LOW-EVIDENCE RECORD MAY STATE A DECISION; IT DOES NOT ESTABLISH THAT ITS
|
|
111
|
+
ALTERNATIVES REMAIN INVALID.
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Venue comes from the proposed transition, the trust boundaries it touches and
|
|
115
|
+
the reserved dimensions below — never from who decided originally, and never
|
|
116
|
+
from a grade. A weak grade changes how much a reopen must **do**, never who may
|
|
117
|
+
do it: `authority_basis: owner_intent` is surfaced with its accumulated cost and
|
|
118
|
+
never overruled, and council agreement never raises `evidence.strength` —
|
|
119
|
+
sources and measurements do.
|
|
120
|
+
|
|
121
|
+
**No E0/E1 agent path is enabled here, and no reading of this rule enables
|
|
122
|
+
one.** Whether an independently validated grade may ever reduce the
|
|
123
|
+
*authorization* burden is an owner-reserved open question — the
|
|
124
|
+
`authority-coupling-decision` blocker — left unanswered because the party
|
|
125
|
+
assigning a grade would be the party gaining authority from it, and would be
|
|
126
|
+
self-classifying the transition as reversible-internal on top.
|
|
127
|
+
|
|
98
128
|
## Who decides — the owner-reserved set
|
|
99
129
|
|
|
100
130
|
The discriminator, in one question: **does the proposed transition weaken an
|
|
@@ -121,27 +151,24 @@ forever. Availability is `agent-config council:status`, never a project file
|
|
|
121
151
|
([`council-availability`](council-availability.md)).
|
|
122
152
|
|
|
123
153
|
Field on the ADR: `reopen_policy: directional | owner | unclassified`, absent →
|
|
124
|
-
**`unclassified
|
|
125
|
-
|
|
154
|
+
**`unclassified`** — council investigation and reversible experiments are
|
|
155
|
+
permitted; only execution of a reserved transition is gated. Absent is
|
|
126
156
|
deliberately not `owner`: with 146 accepted ADRs that default would encode
|
|
127
|
-
today's blockage into the new schema. Full contract, the reopen record
|
|
157
|
+
today's blockage into the new schema. Full contract, the reopen record and the
|
|
128
158
|
precedent-creates-no-authority clause: [`adr-layout § Reopen authority`](../docs/contracts/adr-layout.md).
|
|
129
159
|
|
|
130
160
|
## See also
|
|
131
161
|
|
|
132
162
|
- [`recurring-criticism`](recurring-criticism.md) — the **other entrance**: this
|
|
133
163
|
rule fires when a lock blocks a change, that one when the same criticism arrives
|
|
134
|
-
again. It reuses the five steps and the owner-reserved table
|
|
164
|
+
again. It reuses the five steps and the owner-reserved table above.
|
|
135
165
|
- [`decision-review`](../skills/decision-review/SKILL.md) — the backward-audit
|
|
136
166
|
procedure + the migrated gate mechanics.
|
|
137
167
|
- [`ai-council`](../skills/ai-council/SKILL.md) — the re-evaluation mechanism;
|
|
138
168
|
owns the convergence-summary scope + `revisit-if` contract.
|
|
139
169
|
- [`decision-record`](../skills/decision-record/SKILL.md) — forward-flow decision
|
|
140
170
|
locking; its **§ 4 Lock the choice + consequences** requires the `Revisit-if:`
|
|
141
|
-
line that names the reopening condition up front.
|
|
142
|
-
"escalation litmus" heading; `grep` over `src/` + `docs/` returns two hits and
|
|
143
|
-
neither is in that file — the heading never existed, so the pointer led
|
|
144
|
-
nowhere. Corrected to the section that carries the obligation.)
|
|
171
|
+
line that names the reopening condition up front.
|
|
145
172
|
- [`token-budget-discipline`](token-budget-discipline.md) — the frugality-canon
|
|
146
173
|
value-over-budget escalation this rule's budget-lock case defers to.
|
|
147
174
|
- [`no-cheap-questions`](no-cheap-questions.md) — the question-quality floor a
|
|
@@ -164,3 +191,8 @@ plus the curated `dist/agent-src/scripts/` list and is deliberately out of this
|
|
|
164
191
|
change. And `docs/decisions/` is projected into no agent-visible tree at all —
|
|
165
192
|
the agent sees ADR *numbers* cited across rules and skills, almost never ADR
|
|
166
193
|
*text*. Until that changes, "evaluate before citing" means opening the file.
|
|
194
|
+
|
|
195
|
+
`docs/contracts/` is unprojected on the same terms (`dist/agent-src/` carries no
|
|
196
|
+
`docs/`), so the burden table this rule points at is maintainer-reachable only.
|
|
197
|
+
That is why the reserved-set table above stays here rather than becoming a
|
|
198
|
+
pointer: a consumer install receives these lines and not the contract.
|
|
@@ -107,4 +107,4 @@ inflate it, so it is not claimed — skipping this rule is caught by nothing.
|
|
|
107
107
|
- [`decision-revisit-gate`](decision-revisit-gate.md) — the other entrance; owns the five steps and the owner-reserved routing this rule reuses instead of restating. Separate file only because that one sits four lines under the 200-line cap.
|
|
108
108
|
- [`self-repair-loop`](self-repair-loop.md) — the single-occurrence intake; this rule is what its `occurrences` counter is for.
|
|
109
109
|
- [`active-remediation`](active-remediation.md) — the terminal "leave it" this rule does not override (see `collision_ok`).
|
|
110
|
-
- [`/analyze:inbox`](../
|
|
110
|
+
- [`/analyze:inbox`](../commands/analyze/inbox.md) § Phase 4c — the artifact-side detection that routes here.
|