@event4u/agent-config 14.7.0 → 14.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +175 -390
  3. package/README.md +1 -1
  4. package/agents/templates/.ai-council.yml.example +34 -4
  5. package/dist/agent-src/commands/evals/git-pr-merge.json +13 -0
  6. package/dist/agent-src/commands/evals/roadmap.json +17 -1
  7. package/dist/agent-src/commands/pr/create.md +14 -2
  8. package/dist/agent-src/commands/pr/merge.md +383 -0
  9. package/dist/agent-src/commands/review/changes.md +95 -14
  10. package/dist/agent-src/commands/roadmap/process-full.md +157 -3
  11. package/dist/agent-src/commands/roadmap.md +1 -1
  12. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +46 -36
  13. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +37 -2
  14. package/dist/agent-src/contexts/execution/host-capability-manifest.md +77 -0
  15. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +100 -2
  16. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +154 -2
  17. package/dist/agent-src/contexts/execution/subagent-response-contract.md +80 -0
  18. package/dist/agent-src/rules/artifact-drafting-protocol.md +5 -1
  19. package/dist/agent-src/rules/decision-revisit-gate.md +65 -33
  20. package/dist/agent-src/rules/recurring-criticism.md +1 -1
  21. package/dist/agent-src/rules/roadmap-progress-sync.md +19 -0
  22. package/dist/agent-src/rules/source-confidentiality.md +1 -1
  23. package/dist/agent-src/rules/untrusted-input-defense.md +9 -3
  24. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +7 -4
  25. package/dist/agent-src/scripts/dashboard_mode.ts +212 -0
  26. package/dist/agent-src/scripts/update_roadmap_progress.ts +47 -48
  27. package/dist/agent-src/skills/adr-create/SKILL.md +124 -5
  28. package/dist/agent-src/skills/code-review/evals/evals.json +87 -46
  29. package/dist/agent-src/skills/decision-record/SKILL.md +61 -3
  30. package/dist/agent-src/skills/decision-review/SKILL.md +65 -0
  31. package/dist/agent-src/skills/humanizer/SKILL.md +39 -0
  32. package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +57 -0
  33. package/dist/agent-src/skills/humanizer/references/fixtures.md +54 -0
  34. package/dist/agent-src/skills/judge-spec-compliance/SKILL.md +154 -0
  35. package/dist/agent-src/skills/judge-synthesis/SKILL.md +45 -0
  36. package/dist/agent-src/skills/merge-conflicts/SKILL.md +26 -0
  37. package/dist/agent-src/skills/roadmap-writing/SKILL.md +18 -18
  38. package/dist/agent-src/skills/security/SKILL.md +8 -0
  39. package/dist/agent-src/skills/security-audit/SKILL.md +12 -1
  40. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  41. package/dist/agent-src/templates/roadmaps.md +28 -2
  42. package/dist/cli/registry.js +3 -0
  43. package/dist/cli/registry.js.map +1 -1
  44. package/dist/cli-delegate/{chunk-FBKL6JWT.js → chunk-77GR3VD4.js} +68 -43
  45. package/dist/cli-delegate/{chunk-JZ4NR2TW.js → chunk-7PRE6ZV2.js} +1 -1
  46. package/dist/cli-delegate/{chunk-UEZ7D35A.js → chunk-CYH5SP6M.js} +4 -23
  47. package/dist/cli-delegate/{chunk-Q26HT4QT.js → chunk-E46KPN6K.js} +251 -150
  48. package/dist/cli-delegate/{chunk-74E3TKWV.js → chunk-H4VIVD4C.js} +5 -5
  49. package/dist/cli-delegate/chunk-I3EIN2YG.js +36 -0
  50. package/dist/cli-delegate/{chunk-4VR4ORQ6.js → chunk-LPPWO5CE.js} +4 -3
  51. package/dist/cli-delegate/{chunk-7F3VYSM2.js → chunk-PLSG6UL5.js} +14 -14
  52. package/dist/cli-delegate/cmd_adr_effective.js +1162 -0
  53. package/dist/cli-delegate/cmd_conformance.js +101 -25
  54. package/dist/cli-delegate/cmd_converge.js +3 -3
  55. package/dist/cli-delegate/cmd_doctor.js +7 -7
  56. package/dist/cli-delegate/cmd_export.js +6 -6
  57. package/dist/cli-delegate/cmd_handoff.js +7 -6
  58. package/dist/cli-delegate/cmd_memory_get.js +2 -1
  59. package/dist/cli-delegate/cmd_migrate.js +2 -2
  60. package/dist/cli-delegate/cmd_preflight.js +5 -5
  61. package/dist/cli-delegate/cmd_prune.js +6 -6
  62. package/dist/cli-delegate/cmd_route_audit.js +6 -5
  63. package/dist/cli-delegate/cmd_route_explain.js +3 -3
  64. package/dist/cli-delegate/cmd_session_recycle.js +3 -3
  65. package/dist/cli-delegate/cmd_settings_get.js +4 -4
  66. package/dist/cli-delegate/cmd_settings_migrate.js +6 -6
  67. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  68. package/dist/cli-delegate/cmd_sync.js +6 -6
  69. package/dist/cli-delegate/cmd_uninstall.js +6 -6
  70. package/dist/cli-delegate/cmd_update.js +3 -3
  71. package/dist/cli-delegate/cmd_upgrade.js +3 -3
  72. package/dist/cli-delegate/cmd_validate.js +6 -6
  73. package/dist/cli-delegate/cmd_versions.js +3 -3
  74. package/dist/discovery/deprecation-report.md +1 -1
  75. package/dist/discovery/discovery-manifest.json +83 -30
  76. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  77. package/dist/discovery/discovery-manifest.summary.md +4 -4
  78. package/dist/discovery/dormancy-report.md +1 -1
  79. package/dist/discovery/orphan-report.md +1 -1
  80. package/dist/discovery/packs.json +11 -9
  81. package/dist/discovery/trust-report.md +2 -2
  82. package/dist/discovery/workspaces.json +9 -7
  83. package/dist/hooks/dispatch.js +1295 -812
  84. package/dist/install/globalRuleLayers.js +169 -0
  85. package/dist/install/globalRuleLayers.js.map +1 -0
  86. package/dist/install/partitionEligibility.js +156 -0
  87. package/dist/install/partitionEligibility.js.map +1 -1
  88. package/dist/install/ruleLayerPartition.js +157 -0
  89. package/dist/install/ruleLayerPartition.js.map +1 -0
  90. package/dist/mcp/registry-manifest.json +3 -3
  91. package/dist/mcp/server.json +2 -2
  92. package/dist/mcp/server.mjs +1358 -805
  93. package/dist/scripts/_lib/claude_plugin.js +162 -0
  94. package/dist/scripts/_lib/claude_plugin.js.map +1 -0
  95. package/dist/scripts/_lib/environment_detector.js +397 -0
  96. package/dist/scripts/_lib/environment_detector.js.map +1 -0
  97. package/dist/scripts/_lib/prune_empty_dirs.js +85 -0
  98. package/dist/scripts/_lib/prune_empty_dirs.js.map +1 -0
  99. package/dist/scripts/_lib/spawn_env.js +129 -0
  100. package/dist/scripts/_lib/spawn_env.js.map +1 -0
  101. package/dist/scripts/ai_council/modes.js +199 -0
  102. package/dist/scripts/ai_council/modes.js.map +1 -0
  103. package/dist/scripts/ai_council/transport_resolver.js +418 -0
  104. package/dist/scripts/ai_council/transport_resolver.js.map +1 -0
  105. package/dist/scripts/condense.js +52 -89
  106. package/dist/scripts/condense.js.map +1 -1
  107. package/dist/server/routes/wizard.js +3 -2
  108. package/dist/server/routes/wizard.js.map +1 -1
  109. package/dist/ui/assets/index-Cxgy63kz.js +26 -0
  110. package/dist/ui/assets/index-Cxgy63kz.js.map +1 -0
  111. package/dist/ui/index.html +1 -1
  112. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +45 -1
  113. package/docs/guidelines/agent-infra/false-green.md +47 -1
  114. package/docs/guidelines/agent-infra/traceability-field-mechanics.md +50 -0
  115. package/docs/guidelines/agent-infra/untrusted-input-spotlighting.md +17 -0
  116. package/package.json +7 -3
  117. package/src/agent-src/scripts/archive_completed_roadmaps.ts +7 -4
  118. package/src/agent-src/scripts/dashboard_mode.ts +212 -0
  119. package/src/agent-src/scripts/update_roadmap_progress.ts +47 -48
  120. package/src/config/ci-local-parity.yml +21 -0
  121. package/src/config/estate-count-budget.json +13 -471
  122. package/src/config/evaluator-budgets.json +4 -4
  123. package/src/config/gate-coverage.yml +458 -12
  124. package/src/config/gate-violation-baselines.json +18 -8
  125. package/src/config/gitignore-block.txt +15 -2
  126. package/src/config/hook-latency-budget.json +5 -0
  127. package/src/config/publish-surface.json +60 -0
  128. package/src/config/requirements-trace-budget.json +32 -0
  129. package/src/config/rule-stub-ceilings.json +25 -4
  130. package/src/install/globalRuleLayers.ts +197 -0
  131. package/src/install/partitionEligibility.ts +177 -0
  132. package/src/install/ruleLayerPartition.ts +212 -0
  133. package/src/scripts/_cli/cmd_adr_effective.ts +484 -0
  134. package/src/scripts/_dispatch.bash +18 -0
  135. package/src/scripts/_lib/adr_frontmatter.test.ts +365 -0
  136. package/src/scripts/_lib/adr_frontmatter.ts +459 -0
  137. package/src/scripts/_lib/base_tree.ts +175 -0
  138. package/src/scripts/_lib/billing_grant.ts +165 -0
  139. package/src/scripts/_lib/billing_grant_cli.ts +123 -0
  140. package/src/scripts/_lib/council_fallback_posture.ts +53 -6
  141. package/src/scripts/_lib/council_fallback_wiring.ts +61 -1
  142. package/src/scripts/_lib/envelope_grounding.ts +11 -1
  143. package/src/scripts/_lib/host_capability.ts +59 -5
  144. package/src/scripts/_lib/layer_overlap_notice.ts +11 -2
  145. package/src/scripts/_lib/prune_empty_dirs.ts +80 -0
  146. package/src/scripts/_lib/quota_parked.ts +133 -0
  147. package/src/scripts/_lib/retrieval_sanitize.ts +62 -0
  148. package/src/scripts/_lib/review_telemetry.ts +196 -0
  149. package/src/scripts/_lib/subagent_response.ts +92 -0
  150. package/src/scripts/adr/evidence_census.ts +899 -0
  151. package/src/scripts/adr/regenerate_index.ts +25 -38
  152. package/src/scripts/adr_cite_check.ts +540 -39
  153. package/src/scripts/ai_council/clients.ts +12 -1
  154. package/src/scripts/ai_council/config.ts +72 -115
  155. package/src/scripts/ai_council/fallback_config.ts +19 -7
  156. package/src/scripts/ai_council/mid_flight_fallback.ts +88 -7
  157. package/src/scripts/ai_council/orchestrator.ts +2 -2
  158. package/src/scripts/ai_council/py_format.ts +124 -0
  159. package/src/scripts/ai_council/transport_resolver.ts +65 -2
  160. package/src/scripts/audit_adr_coverage.ts +134 -21
  161. package/src/scripts/bench_hook_latency.ts +204 -0
  162. package/src/scripts/build_archive_index.ts +34 -0
  163. package/src/scripts/check_adr_frontmatter.ts +574 -39
  164. package/src/scripts/check_council_pin_staleness.ts +300 -0
  165. package/src/scripts/check_estate_count.ts +420 -293
  166. package/src/scripts/check_gate_coverage.ts +91 -0
  167. package/src/scripts/check_hook_bundle_content.ts +219 -0
  168. package/src/scripts/check_new_adr_evidence.ts +529 -0
  169. package/src/scripts/check_no_stub_inventory_table.ts +292 -0
  170. package/src/scripts/check_pack_size.ts +234 -1
  171. package/src/scripts/check_publish_surface.ts +297 -0
  172. package/src/scripts/check_references.ts +18 -0
  173. package/src/scripts/check_requirements_trace.ts +378 -0
  174. package/src/scripts/check_rule_layer_partition.ts +531 -0
  175. package/src/scripts/check_secret_leak.ts +166 -12
  176. package/src/scripts/check_single_delivery.ts +137 -4
  177. package/src/scripts/check_standing_rule_delivery.ts +8 -2
  178. package/src/scripts/code_graph/cli.ts +44 -5
  179. package/src/scripts/code_graph/extract.ts +87 -0
  180. package/src/scripts/condense.ts +61 -91
  181. package/src/scripts/council_cli.ts +12 -16
  182. package/src/scripts/detect_ai_tells.ts +87 -0
  183. package/src/scripts/dispatch_r2_reviewer.ts +42 -0
  184. package/src/scripts/external_sources_denylist.json +4 -1
  185. package/src/scripts/generate_capabilities_index.ts +41 -0
  186. package/src/scripts/git_authorization_hook.ts +54 -4
  187. package/src/scripts/hooks/block_unauthorized_git.ts +41 -3
  188. package/src/scripts/hooks/dispatch_hook.ts +154 -187
  189. package/src/scripts/hooks/dispatch_issues.ts +38 -19
  190. package/src/scripts/hooks/fallback_yaml.ts +66 -0
  191. package/src/scripts/hooks/host_semantics.ts +21 -0
  192. package/src/scripts/hooks/injection_budget.ts +13 -3
  193. package/src/scripts/hooks/py_json_dumps.ts +103 -0
  194. package/src/scripts/hooks/run_continuation_hook.ts +3 -1
  195. package/src/scripts/hooks/state_io.ts +88 -1
  196. package/src/scripts/hooks/stdin_failure_policy.ts +96 -0
  197. package/src/scripts/hooks/subagent_ledger_hook.ts +76 -11
  198. package/src/scripts/injection_scan_hook.ts +257 -15
  199. package/src/scripts/lint_adr_sweep_routing.ts +365 -0
  200. package/src/scripts/lint_hook_manifest.ts +49 -0
  201. package/src/scripts/lint_provenance_vocabulary.ts +472 -4
  202. package/src/scripts/lint_workflow_security.ts +53 -10
  203. package/src/scripts/lint_workflow_security_allowlist.json +2 -18
  204. package/src/scripts/report_envelope_rate.ts +166 -0
  205. package/src/scripts/review_axis_report.ts +218 -0
  206. package/src/scripts/routing_doctor.ts +5 -1
  207. package/src/scripts/run_supervise.ts +46 -1
  208. package/src/scripts/schemas/evals.schema.json +5 -0
  209. package/src/scripts/sync_pr_branch.ts +170 -20
  210. package/dist/cli/commands/commands.candidates.test.js +0 -257
  211. package/dist/cli/commands/commands.candidates.test.js.map +0 -1
  212. package/dist/cli/commands/profiles.test.js +0 -88
  213. package/dist/cli/commands/profiles.test.js.map +0 -1
  214. package/dist/cli/commands/recordTriggerEval.test.js +0 -113
  215. package/dist/cli/commands/recordTriggerEval.test.js.map +0 -1
  216. package/dist/cli/configRoot.test.js +0 -97
  217. package/dist/cli/configRoot.test.js.map +0 -1
  218. package/dist/cli/mcp/content.test.js +0 -54
  219. package/dist/cli/mcp/content.test.js.map +0 -1
  220. package/dist/cli/mcp/dispatch.test.js +0 -108
  221. package/dist/cli/mcp/dispatch.test.js.map +0 -1
  222. package/dist/server/writeRoot.test.js +0 -91
  223. package/dist/server/writeRoot.test.js.map +0 -1
  224. package/dist/shared/capabilities.test.js +0 -39
  225. package/dist/shared/capabilities.test.js.map +0 -1
  226. package/dist/ui/assets/index-C1pBRm1f.js +0 -26
  227. package/dist/ui/assets/index-C1pBRm1f.js.map +0 -1
  228. package/dist/cli-delegate/{chunk-PPQO4NGR.js → chunk-6RJA2F5A.js} +3 -3
  229. package/dist/cli-delegate/{chunk-6EOCNQAM.js → chunk-E4XIZDIB.js} +0 -0
  230. package/dist/cli-delegate/{chunk-GJ5BVHXM.js → chunk-PMEKGDED.js} +3 -3
@@ -9,7 +9,7 @@ visibility: internal
9
9
  sub: changes
10
10
  cluster: review
11
11
  skills: [code-review, subagent-orchestration, judge-bug-hunter, judge-security-auditor, judge-test-coverage, judge-code-quality, architecture-review-lens, judge-synthesis, git-workflow]
12
- description: Self-review local changes before creating a PR — dispatches to five specialized judges (bug, security, tests, quality, architecture) and consolidates verdicts
12
+ description: Self-review local changes before creating a PR — dispatches to six specialized judges (bug, security, tests, quality, architecture, spec) and consolidates verdicts
13
13
  suggestion:
14
14
  eligible: false
15
15
  rationale: "Cluster sub-command — reached via its cluster head's routing or its explicit /cluster:sub name; not independently suggested (surface-consolidation)."
@@ -24,7 +24,7 @@ packs:
24
24
  ## Instructions
25
25
 
26
26
  Review all uncommitted and committed-but-not-pushed changes against
27
- the default branch (`main`) by dispatching to four specialized judge
27
+ the default branch (`main`) by dispatching to six specialized judge
28
28
  sub-skills and consolidating their verdicts.
29
29
 
30
30
  ### 1. Update the current branch
@@ -51,6 +51,18 @@ to make sure the current branch is up to date with its base chain:
51
51
 
52
52
  ### 2. Gather the diff
53
53
 
54
+ **Verify the base ref before diffing against it.** The commands below assume
55
+ `origin/main` exists and is the right base, and nothing checked. This step
56
+ already knows how to ask git a question — `git rev-parse --abbrev-ref HEAD`
57
+ above — so the shape was present and simply not applied to the base:
58
+
59
+ - `git rev-parse --verify origin/main` — the base ref resolves.
60
+ - **Does not resolve → stop here and say so.** Do not fall back to a
61
+ different base, and do not diff against `HEAD` alone. A review whose scope
62
+ silently became "the whole branch" or "the last commit" reports findings
63
+ against a diff nobody asked about, and the reader has no way to see that the
64
+ scope moved. Name the ref that failed.
65
+
54
66
  - `git diff origin/main..HEAD --stat` — overview of changed files
55
67
  - `git diff origin/main..HEAD` — full committed-but-not-pushed diff
56
68
  - `git diff --stat` + `git diff` — unstaged changes on top
@@ -65,7 +77,39 @@ Read `.agent-settings.yml`:
65
77
 
66
78
  Unknown alias → stop. Never silently fall back.
67
79
 
68
- ### 4. Dispatch to the five judges
80
+ ### 3b. Bind the criteria source before dispatching
81
+
82
+ The spec judge below is only as good as the criteria it reads, so where they
83
+ came from is recorded **before** the dispatch, not reconstructed after it.
84
+ Exactly one of three states, and the state is written into the review report:
85
+
86
+ | `criteria_source` | When | What the report says |
87
+ |---|---|---|
88
+ | `supplied` | a roadmap, ticket, issue or AC block was explicitly handed in — name it by path or id | the criteria, verbatim, and where they came from |
89
+ | `not_provided` | an ad-hoc branch review with no criteria anywhere | "no acceptance criteria supplied — requirement compliance NOT verified" |
90
+ | `supplied_unparseable` | criteria were handed over and could not be read in a recognised shape | an **error**: the review skipped a dimension it was asked to check |
91
+
92
+ ```
93
+ CRITERIA ARE READ ONLY WHEN SUPPLIED. NEVER DERIVED FROM THE BRANCH,
94
+ THE COMMIT MESSAGES, OR THE PR BODY — AND NEVER FROM THE DIFF.
95
+ A JUDGE THAT INFERS THE REQUIREMENT FROM THE CHANGE IT IS JUDGING
96
+ ALWAYS FINDS THE CHANGE COMPLIANT. SILENCE IS `not_provided`, NEVER A PASS.
97
+ ```
98
+
99
+ There is deliberately **no `derived` state**. Deriving criteria from the branch
100
+ was the alternative considered and rejected: the `derived` label would have to
101
+ be honoured by every consumer of the report to be worth anything, and a label
102
+ that is requested rather than enforced degrades to silence exactly when it
103
+ matters. Decided by AI council on 2026-08-22 (degraded, 1 of 2 seats — the
104
+ second returned an empty response), and the alternative is recorded here rather
105
+ than only in the decision so a later reader can see it was weighed.
106
+
107
+ `supplied_unparseable` is separated from `not_provided` for the same reason:
108
+ folded together, a handover the reviewer could not parse would report as "there
109
+ was nothing to check", which is the one outcome that hides a real failure
110
+ behind a benign one.
111
+
112
+ ### 4. Dispatch to the six judges
69
113
 
70
114
  Each judge receives **the same diff plus the task context** (ticket,
71
115
  PR body, commit messages) and runs independently. The judges are:
@@ -77,20 +121,37 @@ PR body, commit messages) and runs independently. The judges are:
77
121
  | [`judge-test-coverage`](../../skills/judge-test-coverage/SKILL.md) | Missing assertions, uncovered branches, over-mocking, regression-test gaps |
78
122
  | [`judge-code-quality`](../../skills/judge-code-quality/SKILL.md) | Naming, SRP, DRY, dead code, consistency with codebase conventions |
79
123
  | [`architecture-review-lens`](../../skills/architecture-review-lens/SKILL.md) | Layer violations, dependency direction, leaky abstractions, cross-service contract drift |
124
+ | [`judge-spec-compliance`](../../skills/judge-spec-compliance/SKILL.md) | Does the diff satisfy every acceptance criterion **as stated**? Reads the criteria before the diff, and never infers them from it |
80
125
 
81
- The five judges weight equally in the consolidated verdict — none
126
+ The six judges weight equally in the consolidated verdict — none
82
127
  overrides another.
83
128
 
129
+ **Why the sixth exists, and why it is not a severity.** The other five all ask a
130
+ craft-or-correctness question, so a change that is correct, clean, well-tested
131
+ and architecturally sound — and **does not do what was asked** — used to pass
132
+ this path with five green verdicts. Its finding does **not** enter the shared
133
+ severity axis: `judge-synthesis` carries it on its own dimension, because "this
134
+ does not do what was asked" is not comparable to "this variable is badly named",
135
+ and on one scale the second can outrank the first whenever three judges raise
136
+ nits and one raises the spec gap.
137
+
138
+ **When no criteria were supplied** — an ad-hoc branch review — this judge
139
+ returns a no-criteria verdict, never `SATISFIED`. That is not an abstention the
140
+ consolidated verdict may drop: it changes what "done" is allowed to claim to
141
+ *"craft quality verified; requirement compliance NOT verified"*. If that reads as
142
+ most reviews, the honest reading is that most reviews were previously reporting a
143
+ confidence they had not earned.
144
+
84
145
  Pick dispatch mode based on diff size and environment:
85
146
 
86
147
  - **Sequential** (default, simplest) — run bug-hunter → security-auditor
87
- → test-coverage → code-quality → architecture-review-lens, collect
88
- each verdict
148
+ → test-coverage → code-quality → architecture-review-lens →
149
+ spec-compliance, collect each verdict
89
150
  - **Parallel** — if `subagents.max_parallel` in `.agent-settings.yml` is
90
- ≥ 5 and subagent dispatch is available, run all five concurrently
151
+ ≥ 5 and subagent dispatch is available, run all six concurrently
91
152
  following the `do-in-parallel` pattern in
92
153
  [`subagent-orchestration`](../../skills/subagent-orchestration/SKILL.md);
93
- the five judges operate on the same diff but produce independent
154
+ the six judges operate on the same diff but produce independent
94
155
  reports, so no shared-state risk
95
156
 
96
157
  Each judge returns its own `Judge / Model / Target / Verdict /
@@ -108,14 +169,14 @@ Read `verbosity.offer_council_in_delivery` from `.agent-settings.yml`
108
169
  - `true`: when `ai_council.enabled: true` **and** at least one member
109
170
  enabled, ask (in the user's language):
110
171
 
111
- > 1. Add an external council review alongside the four internal judges? (billable)
172
+ > 1. Add an external council review alongside the six internal judges? (billable)
112
173
  > 2. Skip — internal judges only
113
174
 
114
175
  Also suppress when `personal.autonomy: on` (council is billable).
115
176
 
116
177
  If picked **1**:
117
178
 
118
- - Run `/council diff:<base>..<head>` in parallel with the four
179
+ - Run `/council diff:<base>..<head>` in parallel with the six
119
180
  internal judges (or sequentially after them — whichever the
120
181
  dispatch mode picked in step 4 supports).
121
182
  - Treat each council member as one extra "judge" in the consolidated
@@ -140,7 +201,7 @@ Read `subagents.adversarial_council` from `.agent-settings.yml` (default
140
201
  which supplies the four slots, the one-question budget, and the storage line
141
202
  (not persisted: `subagents.adversarial_council` is class C). What only this
142
203
  command knows is *why now*: the diff is high-risk, and the offer is a paid
143
- distinct-model red-team for finding coverage against the five internal judges.
204
+ distinct-model red-team for finding coverage against the six internal judges.
144
205
  - `on`: run it automatically on a high-risk diff.
145
206
 
146
207
  When run, dispatch the
@@ -164,16 +225,36 @@ step 4 (plus any external council blocks from 4b) and produces one report:
164
225
  - A **must-fix / should-fix / advisory** split, each entry tagged with the
165
226
  judge(s) that raised it
166
227
 
228
+ - A **spec-compliance block**, kept apart from that split — the
229
+ `criteria_source` state from step 3b, the per-criterion verdicts, and the
230
+ count of `MISSING` plus `PARTIAL`. See
231
+ [`judge-synthesis` § 4c](../../skills/judge-synthesis/SKILL.md); a spec
232
+ finding never becomes a craft finding.
233
+
167
234
  `judge-synthesis` emits no single quality score and never auto-gates — it
168
235
  structures the verdicts so the next step's decision is informed.
169
236
 
237
+ **The report names its criteria source, always.** A reader six months later
238
+ cannot otherwise tell "we checked the requirements and they were met" from
239
+ "nobody checked" — and those are the two readings a bare `proceed` collapses.
240
+ Where the state is `not_provided`, the overall sentence says *craft quality
241
+ verified; requirement compliance NOT verified*, never a plain pass.
242
+
243
+ **One telemetry line per review** records the structural outcome: which judges
244
+ ran, whether the spec axis was reachable, and whether it changed the
245
+ recommendation. Built and validated by
246
+ `src/scripts/_lib/review_telemetry.ts::buildReviewLine`, which carries no field
247
+ able to hold free-form content and **rejects** an input that adds one. Read the
248
+ window back with `./scripts-run src/scripts/review_axis_report`; it reports
249
+ "nothing observed" and "the axis changed nothing" as two different answers.
250
+
170
251
  ### 6. Decide next steps
171
252
 
172
253
  - If **any** judge returned `reject` → stop; the approach must change
173
254
  before proceeding
174
255
  - If **any** judge returned `revise` → fix 🔴 findings automatically,
175
256
  ask before fixing 🟡 findings, report 🟢 as suggestions
176
- - If all five returned `apply` → the diff is ready; report and stop
257
+ - If all six returned `apply` → the diff is ready; report and stop
177
258
 
178
259
  **Opt-in (never auto-on):** when the `revise` findings are *test-driven*
179
260
  (failing checks, not subjective craft) and you want bounded auto-repair
@@ -218,7 +299,7 @@ Per `verbosity.routine_confirmations` (default `false`):
218
299
  ## Use this command when
219
300
 
220
301
  - Preparing a self-review before opening a PR
221
- - Stress-testing a local branch with the same five lenses a reviewer
302
+ - Stress-testing a local branch with the same six lenses a reviewer
222
303
  would apply
223
304
  - Sanity-checking a diff before handing it to `/create-pr`
224
305
 
@@ -247,6 +328,6 @@ Per `verbosity.routine_confirmations` (default `false`):
247
328
 
248
329
  - **LLM-as-a-Judge** — [arxiv.org/abs/2306.05685](https://arxiv.org/abs/2306.05685)
249
330
  MT-Bench and Chatbot Arena — judging LLM outputs with LLM judges.
250
- This command adapts the pattern by dispatching to four specialized
331
+ This command adapts the pattern by dispatching to six specialized
251
332
  judges (bug, security, tests, quality) instead of a single generic
252
333
  judge, and consolidating their verdicts.
@@ -7,7 +7,7 @@ cluster: roadmap
7
7
  sub: process-full
8
8
  skills: [agent-docs-writing, ai-council, roadmap-management]
9
9
  description: Autonomously process every open step across every phase of a roadmap until the file is fully closed. Largest execution scope of the /roadmap cluster — runs continuously across phase boundaries.
10
- argument-hint: "[roadmap]"
10
+ argument-hint: "[roadmap] [--all] [--worktree]"
11
11
  suggestion:
12
12
  eligible: false
13
13
  rationale: "Cluster sub-command — reached via its cluster head's routing or its explicit /cluster:sub name; not independently suggested (surface-consolidation)."
@@ -80,6 +80,116 @@ with the **scope delta below**.
80
80
  archival check from
81
81
  [`roadmap-process-loop § 6`](../../contexts/execution/roadmap-process-loop.md#6-final-report-and-archival).
82
82
 
83
+ ## The three flags
84
+
85
+ ### `--all` — the estate, one roadmap at a time
86
+
87
+ `--all` changes **cardinality, not lifecycle**: the same single-roadmap loop,
88
+ iterated over the whole active estate. It is a flag rather than a
89
+ `/roadmap:process-all` command because
90
+ [`command-clusters`](../../../../../docs/contracts/command-clusters.md) says
91
+ sibling variants become a flag, and a drain is a count of the thing this
92
+ command already does.
93
+
94
+ 1. **Recompute the inventory live.** Never from memory, never from the
95
+ dashboard count — the same live-screen rule
96
+ [`/roadmap:next` § 1](../next/command.md) already carries. The corpus is the
97
+ non-draft roadmaps directly under `agents/roadmaps/`; `later/`, `skipped/`,
98
+ `archive/` and `stubs/` are out of scope.
99
+ 2. **Order the queue.** Roadmaps at or above 10 % checkbox progress first, in
100
+ **descending** progress — nearly-done first, because they convert soonest.
101
+ Roadmaps below 10 % are appended after, ascending by declared `complexity:`
102
+ tier (lightweight → bounded → structural), tiebreak ascending total
103
+ checkbox count. Both buckets need a **total** order or two runs over the
104
+ same estate disagree: within the first, ties on progress break by ascending
105
+ total checkbox count and then by ascending filename; within the second, by
106
+ ascending filename after the checkbox count.
107
+ 3. **Loop.** Per roadmap: branch from the updated default, run this command's
108
+ normal single-roadmap loop, deliver per § Delivery, then take the next
109
+ roadmap against the default **as it stands at that moment** — re-fetched,
110
+ never assumed. One roadmap = one branch = one PR, the existing invariant
111
+ iterated, not a new one.
112
+
113
+ **What `--all` can and cannot promise, stated plainly because the honest
114
+ version is weaker than the obvious one.** Nothing in the run
115
+ merges, so the default does not advance because of this run, and every PR after
116
+ the first is mergeable *against the base recorded when it was prepared* rather
117
+ than against the base after its predecessors land. In a repository where every
118
+ roadmap PR touches the same generated files, that means an `--all` hand-off is
119
+ **one immediately-mergeable PR plus N−1 prepared ones**, each needing a
120
+ re-sync at merge time. That is still the expensive half — conflicts classified,
121
+ CI green once, superseded PRs closed — but it is not "N mergeable PRs", and the
122
+ run reports it in those words.
123
+
124
+ **A blocked roadmap never stalls the estate queue.** Inside a roadmap the five
125
+ halt conditions and the terminal outcomes keep full authority. Between
126
+ roadmaps, the § Halt-conditions table below is the single statement of what
127
+ ends the roadmap and what ends the loop — including the two halts that are
128
+ safety floors and therefore end the run. A `blocked` roadmap is recorded and
129
+ the loop continues to the next one.
130
+
131
+ ### Delivery — every run, flag or not
132
+
133
+ On outcome `complete`, open the PR as today, then run
134
+ [`/pr:merge <N> --no-merge`](../../../git/pr/merge/command.md) on it: sync the
135
+ base in, resolve conflicts by that command's four enumerated classes, drive the
136
+ required checks green on the pushed head. **This is unconditional** — a bare
137
+ `/roadmap:process-full` delivers a mergeable PR, not merely an open one, and
138
+ waiting on that remote CI is part of the run per the Iron Law below. It is
139
+ the whole of what this command delivers: there is no flag that carries it
140
+ further, and § Merging below says why.
141
+
142
+ ### Merging — out of scope, cancelled rather than deferred
143
+
144
+ ```
145
+ THIS COMMAND NEVER MERGES. THERE IS NO FLAG THAT MAKES IT MERGE.
146
+ THE RUN ENDS AT MERGEABLE-AND-OPEN, ALWAYS, AND SAYS SO.
147
+ A FUTURE MERGE CAPABILITY NEEDS A NEW ROADMAP AND AN OWNER RULING —
148
+ NOT A COMMAND EDIT, AND NOT A FLAG THAT ALREADY SITS HERE INERT.
149
+ ```
150
+
151
+ A `--merge` flag was specified here and has been **removed**. The
152
+ `merge-authority` blocker of `road-to-drain-commands` closed as *not authorized
153
+ in this roadmap*: activating the flag would have lowered
154
+ [`non-destructive-by-default`](../../../../rules/non-destructive-by-default.md)'s
155
+ per-turn confirmation floor for a production-branch merge, which
156
+ [`decision-revisit-gate`](../../../../rules/decision-revisit-gate.md)'s
157
+ owner-reserved table reserves to the owner. No owner ruling was available to the
158
+ run that closed the roadmap, and an AI-council pass (2/2 convergent, 2026-08-22)
159
+ ruled that a council may cancel an unauthorized implementation but may not
160
+ manufacture the owner decision. The policy question is therefore **undecided,
161
+ not rejected** — see
162
+ [ADR-239](../../../../../docs/decisions/ADR-239-drain-command-surface-and-merge-authority.md)
163
+ § Disposition.
164
+
165
+ The flag was removed rather than left inert deliberately: an archived roadmap
166
+ must not leave latent executable authority behind a documented switch.
167
+
168
+ Three independent findings stand behind the safety requirement, and any future
169
+ attempt starts from them rather than re-deriving them: the AI council's Q1
170
+ verdict (2026-08-21 — mergeability-only until authorization is target-bound and
171
+ tamper-resistant), the committed `road-to-gate-preauth-authorization` stub (an
172
+ authorization the agent can write is not an authorization), and the runtime
173
+ guard that refused this roadmap's own attempt to edit the canonical loop
174
+ contract.
175
+
176
+ **Mergeability is per-PR against a recorded base, never a queue property.**
177
+ When every PR in the estate touches the same generated files — in this
178
+ repository `agents/roadmaps-progress.md` and the archive index — making PR *n*
179
+ mergeable against base
180
+ SHA `M` says nothing about its state once PR *n−1* advances the base to `M1`.
181
+ Report "mergeable against base `<SHA>`", never "the queue is mergeable".
182
+
183
+ ### `--worktree` — isolate the workspace
184
+
185
+ Route workspace creation through [`/worktree:create`](../../../engineering-base/worktree/create/command.md)
186
+ in full, including its
187
+ [§ 4b seeding allow/deny list](../../../../skills/using-git-worktrees/SKILL.md#4b-seed-the-worktree--allow--deny-list),
188
+ which is the authority on what may be copied and what must never be — not
189
+ restated here, because a second copy of a safety list is a copy that can
190
+ drift. Under `--all` the worktree is created
191
+ once and re-branched per roadmap; `/worktree:cleanup` runs at end of run.
192
+
83
193
  ## Iron Law — Full is Full
84
194
 
85
195
  ```
@@ -87,9 +197,15 @@ with the **scope delta below**.
87
197
  TO COMPLETION, ACROSS EVERY PHASE. ONLY THE FIVE HALT CONDITIONS STOP IT.
88
198
  PHASE-INTERNAL "(DEFERRED)" / "(OPTIONAL)" / "GATED ON PHASE X" NOTES DO
89
199
  NOT NARROW THE WORKING SET. A PHASE BOUNDARY IS NOT A STOP.
200
+ UNDER `--all`, A ROADMAP BOUNDARY IS NOT A STOP EITHER — BUT A HARD-FLOOR OR
201
+ SECURITY-SENSITIVE HALT ENDS THE WHOLE RUN, NOT JUST THE ROADMAP. THE TABLE
202
+ UNDER THE HALT CONDITIONS IS THE ONLY STATEMENT OF WHICH ENDS WHICH.
203
+ WAITING ON REMOTE CI FOR THE DELIVERY LOOP IS PART OF THE RUN. "CI IS
204
+ RUNNING" IS NOT A BOUNDARY, NOT A HALT, AND NOT A REPORT — THE RUN ENDS
205
+ AT A MERGEABLE PR, NEVER AT AN OFFER TO GO CHECK ON ONE.
90
206
  ```
91
207
 
92
- The **five — and only five — halt conditions** (exhaustive; nothing else
208
+ The **six — and only six — halt conditions** (exhaustive; nothing else
93
209
  stops the run):
94
210
 
95
211
  1. **Hard-Floor** trigger ([`non-destructive-by-default`](../../rules/non-destructive-by-default.md)).
@@ -97,6 +213,38 @@ stops the run):
97
213
  3. **Security-sensitive** surface reached.
98
214
  4. **Scope-out-of-roadmap** work discovered.
99
215
  5. **Test / quality red** that cannot be cleared within the N=3 budget.
216
+ 6. **A merge conflict outside the four enumerated classes** of
217
+ [`/pr:merge` § 3](../../../git/pr/merge/command.md), during the delivery
218
+ loop. Added when delivery became unconditional: the loop runs on every
219
+ completed run, `--all` or not, so its stop is a stop of this command and
220
+ calling it "a kill switch rather than a halt reason" would not change that —
221
+ a run that stops has stopped. It fires only where a run reaches delivery,
222
+ which is the one thing that distinguishes it from the five above.
223
+
224
+ **Under `--all`, which of these end the roadmap and which end the loop.** Two
225
+ of the five are safety floors and they end the **whole run**, not the current
226
+ roadmap:
227
+
228
+ | Halt | Under `--all` |
229
+ |---|---|
230
+ | 1. Hard-Floor trigger | **Ends the run.** Stop and obtain this-turn confirmation. [`non-destructive-by-default`](../../rules/non-destructive-by-default.md) states that no roadmap authorization lifts the floor, and "record it and take the next roadmap" is exactly the roadmap-as-authorization bypass it names. |
231
+ | 3. Security-sensitive surface | **Ends the run**, same reasoning. |
232
+ | 2. Council-off + genuine ambiguity | Ends the roadmap; the loop records it and continues. |
233
+ | 4. Scope-out-of-roadmap work | Ends the roadmap; the loop records it and continues. |
234
+ | 5. Test / quality red past N=3 | Ends the roadmap; the loop records it and continues. |
235
+ | 6. Unenumerated merge conflict in delivery | Ends the roadmap; the loop records it and continues. |
236
+
237
+ **And the conditions that end the loop without ending a roadmap:**
238
+ estate-queue exhaustion (always), a
239
+ [`/pr:merge` § 8](../../../git/pr/merge/command.md) kill switch (always — that
240
+ section arms its checks during **preparation**, not only before a merge, which
241
+ is what keeps them reachable while the merge step is gated), and
242
+ authorization-window expiry — which is **unreachable in this command**,
243
+ because it never performs a `BLOCK_OPS` operation for the window to govern. Three conditions, one of them currently inert, and this
244
+ table is the only place the set is stated.
245
+
246
+ Nothing here widens a run without `--all`: it still has exactly the six
247
+ above, all of them ending the run because there is no loop to continue.
100
248
 
101
249
  ```
102
250
  FORBIDDEN NON-HALT REASONS — NEVER STOP THE RUN FOR ANY OF THESE:
@@ -109,7 +257,13 @@ FORBIDDEN NON-HALT REASONS — NEVER STOP THE RUN FOR ANY OF THESE:
109
257
  runnable test over PRE-EXISTING blockers, never by how a step feels
110
258
  · "the branch is not protected" / "a branch must be created"
111
259
  · "a PR must be opened" / "a GitHub setting must change"
112
- · "CI must be re-run" / "the merge base needs updating" / "there are conflicts"
260
+ · "CI must be re-run" / "the merge base needs updating" / "there are
261
+ conflicts" — resolving these IS the work. The one exception, and it is a
262
+ kill switch rather than a halt reason: a conflict **outside** the four
263
+ enumerated classes of [`/pr:merge` § 3](../../../git/pr/merge/command.md)
264
+ stops the delivery loop, because that is a case nobody has decided yet and
265
+ deciding it silently is how work disappears. An enumerated conflict is
266
+ never a stop.
113
267
  · "a paid service is needed" — authorised under the ceiling below
114
268
  · "a maintainer should do this" when the agent can perform the same action
115
269
  · any agent-invented caution not in the five halt conditions above.
@@ -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" — this roadmap's own `point-of-action-carrier`
93
- blocker records the upstream PreToolUse agent-identity request as closed
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 — the same "no discriminator is publishable" null the
98
- `point-of-action-carrier` blocker already names. When set, it resolves ∅
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 for definition/references** (council debate 2026-07-28,
210
- claude-sonnet-4-5 + gpt-4o, 2 rounds): the pre-registered benchmark behind the
211
- `code-graph-retrieval-null` claim (`docs/CLAIMS.md`) measured native-graph
212
- recall 0.365 vs grep 0.797 on graph-shaped questions, root cause an **indexing
213
- gap** (TS arrow-function exports produce no symbol nodes) that hits structured
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
- The deterministic rules are encoded in
242
- [`src/scripts/_lib/auto_dispatch.ts`](../../../../src/scripts/_lib/auto_dispatch.ts)
243
- (`classifyTask`, `classifyLookup` for the lookup-class rung), covered by
244
- [`tests/scripts/_lib_auto_dispatch.test.ts`](../../../../tests/scripts/_lib_auto_dispatch.test.ts)
245
- and the lookup corpus in
246
- [`src/scripts/_lib/auto_dispatch.corpus.test.ts`](../../../../src/scripts/_lib/auto_dispatch.corpus.test.ts)
247
- (`LOOKUP_CORPUS` — the four live-observed shapes + negative controls).
248
-
249
- The judgment ladder (§ above) is encoded in
250
- [`src/scripts/_lib/judgment_ladder.ts`](../../../../src/scripts/_lib/judgment_ladder.ts)
251
- (`classifyLadder`, plus the rung-0/1/3/4 signal-detection functions), covered
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 — two autonomy shapes
89
+ ## Task-scope — three autonomy shapes
90
90
 
91
91
  Depth for the rule's task-scope Iron Law (`NEW TASK → FRESH CONFIRMATION`).
92
- Two distinct autonomy shapes — keep them apart:
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,