@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +175 -390
- package/README.md +1 -1
- package/agents/templates/.ai-council.yml.example +34 -4
- 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 +383 -0
- package/dist/agent-src/commands/review/changes.md +95 -14
- 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/host-capability-manifest.md +77 -0
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +100 -2
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +154 -2
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +80 -0
- 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/rules/untrusted-input-defense.md +9 -3
- 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/code-review/evals/evals.json +87 -46
- 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/humanizer/SKILL.md +39 -0
- package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +57 -0
- package/dist/agent-src/skills/humanizer/references/fixtures.md +54 -0
- package/dist/agent-src/skills/judge-spec-compliance/SKILL.md +154 -0
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +45 -0
- package/dist/agent-src/skills/merge-conflicts/SKILL.md +26 -0
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +18 -18
- 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 +28 -2
- package/dist/cli/registry.js +3 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli-delegate/{chunk-FBKL6JWT.js → chunk-77GR3VD4.js} +68 -43
- package/dist/cli-delegate/{chunk-JZ4NR2TW.js → chunk-7PRE6ZV2.js} +1 -1
- package/dist/cli-delegate/{chunk-UEZ7D35A.js → chunk-CYH5SP6M.js} +4 -23
- package/dist/cli-delegate/{chunk-Q26HT4QT.js → chunk-E46KPN6K.js} +251 -150
- 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-7F3VYSM2.js → chunk-PLSG6UL5.js} +14 -14
- package/dist/cli-delegate/cmd_adr_effective.js +1162 -0
- package/dist/cli-delegate/cmd_conformance.js +101 -25
- 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 +4 -4
- package/dist/cli-delegate/cmd_settings_migrate.js +6 -6
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- 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 +83 -30
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +11 -9
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +9 -7
- package/dist/hooks/dispatch.js +1295 -812
- 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 +1358 -805
- package/dist/scripts/_lib/claude_plugin.js +162 -0
- package/dist/scripts/_lib/claude_plugin.js.map +1 -0
- package/dist/scripts/_lib/environment_detector.js +397 -0
- package/dist/scripts/_lib/environment_detector.js.map +1 -0
- package/dist/scripts/_lib/prune_empty_dirs.js +85 -0
- package/dist/scripts/_lib/prune_empty_dirs.js.map +1 -0
- package/dist/scripts/_lib/spawn_env.js +129 -0
- package/dist/scripts/_lib/spawn_env.js.map +1 -0
- package/dist/scripts/ai_council/modes.js +199 -0
- package/dist/scripts/ai_council/modes.js.map +1 -0
- package/dist/scripts/ai_council/transport_resolver.js +418 -0
- package/dist/scripts/ai_council/transport_resolver.js.map +1 -0
- package/dist/scripts/condense.js +52 -89
- package/dist/scripts/condense.js.map +1 -1
- package/dist/server/routes/wizard.js +3 -2
- package/dist/server/routes/wizard.js.map +1 -1
- package/dist/ui/assets/index-Cxgy63kz.js +26 -0
- package/dist/ui/assets/index-Cxgy63kz.js.map +1 -0
- package/dist/ui/index.html +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/docs/guidelines/agent-infra/traceability-field-mechanics.md +50 -0
- package/docs/guidelines/agent-infra/untrusted-input-spotlighting.md +17 -0
- package/package.json +7 -3
- 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 +13 -471
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +458 -12
- package/src/config/gate-violation-baselines.json +18 -8
- package/src/config/gitignore-block.txt +15 -2
- package/src/config/hook-latency-budget.json +5 -0
- package/src/config/publish-surface.json +60 -0
- package/src/config/requirements-trace-budget.json +32 -0
- package/src/config/rule-stub-ceilings.json +25 -4
- 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 +18 -0
- package/src/scripts/_lib/adr_frontmatter.test.ts +365 -0
- package/src/scripts/_lib/adr_frontmatter.ts +459 -0
- package/src/scripts/_lib/base_tree.ts +175 -0
- package/src/scripts/_lib/billing_grant.ts +165 -0
- package/src/scripts/_lib/billing_grant_cli.ts +123 -0
- package/src/scripts/_lib/council_fallback_posture.ts +53 -6
- package/src/scripts/_lib/council_fallback_wiring.ts +61 -1
- package/src/scripts/_lib/envelope_grounding.ts +11 -1
- package/src/scripts/_lib/host_capability.ts +59 -5
- package/src/scripts/_lib/layer_overlap_notice.ts +11 -2
- package/src/scripts/_lib/prune_empty_dirs.ts +80 -0
- package/src/scripts/_lib/quota_parked.ts +133 -0
- package/src/scripts/_lib/retrieval_sanitize.ts +62 -0
- package/src/scripts/_lib/review_telemetry.ts +196 -0
- package/src/scripts/_lib/subagent_response.ts +92 -0
- package/src/scripts/adr/evidence_census.ts +899 -0
- package/src/scripts/adr/regenerate_index.ts +25 -38
- package/src/scripts/adr_cite_check.ts +540 -39
- package/src/scripts/ai_council/clients.ts +12 -1
- package/src/scripts/ai_council/config.ts +72 -115
- package/src/scripts/ai_council/fallback_config.ts +19 -7
- package/src/scripts/ai_council/mid_flight_fallback.ts +88 -7
- package/src/scripts/ai_council/orchestrator.ts +2 -2
- package/src/scripts/ai_council/py_format.ts +124 -0
- package/src/scripts/ai_council/transport_resolver.ts +65 -2
- package/src/scripts/audit_adr_coverage.ts +134 -21
- 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_council_pin_staleness.ts +300 -0
- package/src/scripts/check_estate_count.ts +420 -293
- package/src/scripts/check_gate_coverage.ts +91 -0
- package/src/scripts/check_hook_bundle_content.ts +219 -0
- package/src/scripts/check_new_adr_evidence.ts +529 -0
- package/src/scripts/check_no_stub_inventory_table.ts +292 -0
- package/src/scripts/check_pack_size.ts +234 -1
- package/src/scripts/check_publish_surface.ts +297 -0
- package/src/scripts/check_references.ts +18 -0
- package/src/scripts/check_requirements_trace.ts +378 -0
- package/src/scripts/check_rule_layer_partition.ts +531 -0
- package/src/scripts/check_secret_leak.ts +166 -12
- package/src/scripts/check_single_delivery.ts +137 -4
- package/src/scripts/check_standing_rule_delivery.ts +8 -2
- package/src/scripts/code_graph/cli.ts +44 -5
- package/src/scripts/code_graph/extract.ts +87 -0
- package/src/scripts/condense.ts +61 -91
- package/src/scripts/council_cli.ts +12 -16
- package/src/scripts/detect_ai_tells.ts +87 -0
- package/src/scripts/dispatch_r2_reviewer.ts +42 -0
- package/src/scripts/external_sources_denylist.json +4 -1
- package/src/scripts/generate_capabilities_index.ts +41 -0
- package/src/scripts/git_authorization_hook.ts +54 -4
- package/src/scripts/hooks/block_unauthorized_git.ts +41 -3
- 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/run_continuation_hook.ts +3 -1
- package/src/scripts/hooks/state_io.ts +88 -1
- package/src/scripts/hooks/stdin_failure_policy.ts +96 -0
- package/src/scripts/hooks/subagent_ledger_hook.ts +76 -11
- package/src/scripts/injection_scan_hook.ts +257 -15
- package/src/scripts/lint_adr_sweep_routing.ts +365 -0
- package/src/scripts/lint_hook_manifest.ts +49 -0
- package/src/scripts/lint_provenance_vocabulary.ts +472 -4
- package/src/scripts/lint_workflow_security.ts +53 -10
- package/src/scripts/lint_workflow_security_allowlist.json +2 -18
- package/src/scripts/report_envelope_rate.ts +166 -0
- package/src/scripts/review_axis_report.ts +218 -0
- package/src/scripts/routing_doctor.ts +5 -1
- package/src/scripts/run_supervise.ts +46 -1
- package/src/scripts/schemas/evals.schema.json +5 -0
- package/src/scripts/sync_pr_branch.ts +170 -20
- package/dist/cli/commands/commands.candidates.test.js +0 -257
- package/dist/cli/commands/commands.candidates.test.js.map +0 -1
- package/dist/cli/commands/profiles.test.js +0 -88
- package/dist/cli/commands/profiles.test.js.map +0 -1
- package/dist/cli/commands/recordTriggerEval.test.js +0 -113
- package/dist/cli/commands/recordTriggerEval.test.js.map +0 -1
- package/dist/cli/configRoot.test.js +0 -97
- package/dist/cli/configRoot.test.js.map +0 -1
- package/dist/cli/mcp/content.test.js +0 -54
- package/dist/cli/mcp/content.test.js.map +0 -1
- package/dist/cli/mcp/dispatch.test.js +0 -108
- package/dist/cli/mcp/dispatch.test.js.map +0 -1
- package/dist/server/writeRoot.test.js +0 -91
- package/dist/server/writeRoot.test.js.map +0 -1
- package/dist/shared/capabilities.test.js +0 -39
- package/dist/shared/capabilities.test.js.map +0 -1
- package/dist/ui/assets/index-C1pBRm1f.js +0 -26
- package/dist/ui/assets/index-C1pBRm1f.js.map +0 -1
- 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-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
|
|
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
|
|
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
|
-
###
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 **
|
|
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
|
|
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"
|
|
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,
|