@event4u/agent-config 16.0.0 → 16.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +297 -137
- package/CONTRIBUTING.md +9 -0
- package/README.md +2 -2
- package/dist/agent-src/commands/analyze/inbox.md +26 -0
- package/dist/agent-src/commands/analyze/roadmap-repos.md +27 -0
- package/dist/agent-src/commands/challenge-me/closure.md +178 -0
- package/dist/agent-src/commands/challenge-me.md +9 -2
- package/dist/agent-src/commands/council/default.md +25 -5
- package/dist/agent-src/commands/feature/plan.md +28 -1
- package/dist/agent-src/commands/feature/roadmap.md +28 -1
- package/dist/agent-src/commands/implement-ticket.md +27 -0
- package/dist/agent-src/commands/jira-ticket.md +27 -0
- package/dist/agent-src/commands/pr/create.md +29 -0
- package/dist/agent-src/commands/pr/merge.md +60 -9
- package/dist/agent-src/commands/roadmap/ai-council.md +7 -1
- package/dist/agent-src/commands/roadmap/create.md +74 -27
- package/dist/agent-src/commands/roadmap/materialize.md +27 -0
- package/dist/agent-src/commands/roadmap/process-full.md +123 -18
- package/dist/agent-src/commands/team.md +22 -0
- package/dist/agent-src/contexts/authority/scope-growth-ownership.md +80 -0
- package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +47 -0
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +44 -3
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +15 -15
- package/dist/agent-src/contexts/execution/decision-closure-execution.md +93 -0
- package/dist/agent-src/contexts/execution/fix-loop-ladder.md +108 -0
- package/dist/agent-src/contexts/execution/plan-confidence-gate.md +4 -2
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +75 -6
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
- package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +29 -0
- package/dist/agent-src/rules/autonomous-execution.md +15 -8
- package/dist/agent-src/rules/delegation-policy.md +23 -45
- package/dist/agent-src/rules/design-fidelity.md +32 -37
- package/dist/agent-src/rules/evaluator-independence.md +43 -49
- package/dist/agent-src/rules/test-first.md +41 -0
- package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
- package/dist/agent-src/skills/ai-council/SKILL.md +11 -3
- package/dist/agent-src/skills/api-design/data/manifest.json +3 -3
- package/dist/agent-src/skills/database/data/manifest.json +4 -4
- package/dist/agent-src/skills/database/data/query-tuning.csv +3 -3
- package/dist/agent-src/skills/design-review/SKILL.md +50 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +14 -4
- package/dist/agent-src/skills/experiment-loop/SKILL.md +31 -1
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +1 -1
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +42 -3
- package/dist/agent-src/skills/threat-modeling/SKILL.md +9 -4
- package/dist/agent-src/skills/threat-modeling/data/manifest.json +4 -4
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +37 -3
- package/dist/agent-src/templates/agent-settings.md +1 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +188 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -0
- package/dist/cli-delegate/check_update_banner.js +40 -2
- package/dist/cli-delegate/chunk-4E2W63DA.js +335 -0
- package/dist/cli-delegate/chunk-5R7HOLAF.js +99 -0
- package/dist/cli-delegate/{chunk-IVBPRCQO.js → chunk-6KFEC3G7.js} +1 -1
- package/dist/cli-delegate/{chunk-2TAQ2K4V.js → chunk-6KM6ORRY.js} +55 -386
- package/dist/cli-delegate/{chunk-2XY7ILBT.js → chunk-FC75PGJE.js} +42 -2
- package/dist/cli-delegate/{chunk-GYC3VRYN.js → chunk-FXYUYU4N.js} +57 -13
- package/dist/cli-delegate/{chunk-55ACLDUE.js → chunk-GJCBB2UG.js} +168 -10
- package/dist/cli-delegate/{chunk-AK6HODNQ.js → chunk-HDVVGPQW.js} +873 -539
- package/dist/cli-delegate/{chunk-H32DGUJH.js → chunk-P6ZHP5W2.js} +1 -1
- package/dist/cli-delegate/{chunk-57PN4GYJ.js → chunk-RGNIWTEA.js} +1 -1
- package/dist/cli-delegate/chunk-ROYYTEZU.js +39 -0
- package/dist/cli-delegate/{chunk-3FKR64R5.js → chunk-UNCRJBT3.js} +31 -7
- package/dist/cli-delegate/{chunk-2DK2VJWG.js → chunk-WGXTVKCQ.js} +20 -6
- package/dist/cli-delegate/chunk-YDPILCOL.js +152 -0
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +1 -1
- package/dist/cli-delegate/cmd_conformance.js +90 -56
- package/dist/cli-delegate/cmd_doctor.js +7 -5
- package/dist/cli-delegate/cmd_explain.js +2 -2
- package/dist/cli-delegate/cmd_export.js +9 -7
- package/dist/cli-delegate/cmd_fleet.js +4 -2
- package/dist/cli-delegate/cmd_handoff.js +4 -4
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +2 -2
- package/dist/cli-delegate/cmd_preflight.js +4 -2
- package/dist/cli-delegate/cmd_prune.js +10 -8
- package/dist/cli-delegate/cmd_route_audit.js +2 -2
- package/dist/cli-delegate/cmd_route_explain.js +1 -1
- package/dist/cli-delegate/cmd_session_recycle.js +2 -2
- package/dist/cli-delegate/cmd_settings_get.js +28 -2
- package/dist/cli-delegate/cmd_settings_migrate.js +9 -7
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +10 -8
- package/dist/cli-delegate/cmd_uninstall.js +16 -13
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +1 -1
- package/dist/cli-delegate/cmd_validate.js +12 -10
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +85 -38
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +10 -8
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +8 -6
- package/dist/hooks/dispatch.js +1832 -1007
- package/dist/install/claudeRuleRewrite.js +14 -3
- package/dist/install/conflict.js +60 -10
- package/dist/install/conflictTracker.js +218 -0
- package/dist/install/fsPrimitives.js +54 -0
- package/dist/install/install.mjs +2007 -1481
- package/dist/install/manifestFiles.js +259 -0
- package/dist/install/preflight.js +14 -2
- package/dist/install/preserve.js +157 -0
- package/dist/install/recordedOwnership.js +132 -0
- package/dist/install/txlog.js +11 -2
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +398 -39
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +3 -2
- package/dist/scripts/_lib/fs_atomic.js +167 -0
- package/dist/scripts/_lib/installed_tools.js +460 -0
- package/dist/scripts/_lib/lean_projection_mode.js +3 -2
- package/dist/scripts/_lib/settings_renamed_keys.js +78 -0
- package/dist/server/routes/install.js +8 -0
- package/dist/server/routes/wizard.js +9 -3
- package/dist/server/schemas/settings.js +17 -5
- package/dist/shared/missionExecution.js +97 -0
- package/dist/ui/assets/{index-D0jaCRPM.js → index-DH1xc62v.js} +17 -17
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +103 -0
- package/docs/contracts/settings-classes.md +26 -7
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
- package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
- package/docs/guidelines/design-fidelity-routing.md +29 -0
- package/package.json +1 -1
- package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
- package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -0
- package/src/config/agent-settings.template.yml +139 -27
- package/src/config/auto-rule-budget.json +16 -0
- package/src/config/ci-local-parity.yml +18 -5
- package/src/config/continuity-surface.json +21 -0
- package/src/config/gate-coverage.yml +146 -13
- package/src/config/gate-violation-baselines.json +6 -6
- package/src/config/hook-token-budget.json +2 -0
- package/src/config/loop-surfaces.yaml +215 -0
- package/src/config/platform-anchor.json +3 -2
- package/src/config/release-gate-locality.yml +11 -0
- package/src/config/routing-coverage-seed.json +18 -4
- package/src/config/rule-enforcement-baseline.json +0 -1
- package/src/install/claudeRuleRewrite.ts +16 -2
- package/src/install/conflict.ts +65 -9
- package/src/install/conflictTracker.ts +299 -0
- package/src/install/fsPrimitives.ts +54 -0
- package/src/install/manifestFiles.ts +312 -0
- package/src/install/preflight.ts +16 -2
- package/src/install/preserve.ts +205 -0
- package/src/install/recordedOwnership.ts +149 -0
- package/src/install/txlog.ts +11 -2
- package/src/install/types.ts +19 -4
- package/src/scripts/_cli/cmd_conformance.ts +88 -15
- package/src/scripts/_cli/cmd_doctor.ts +4 -3
- package/src/scripts/_cli/cmd_route_explain.ts +9 -2
- package/src/scripts/_cli/cmd_settings_get.ts +44 -0
- package/src/scripts/_cli/doctor_execution.ts +90 -0
- package/src/scripts/_lib/activation_payload.ts +247 -0
- package/src/scripts/_lib/agent_settings.ts +4 -2
- package/src/scripts/_lib/authority_path.ts +102 -0
- package/src/scripts/_lib/cascade_base.ts +94 -0
- package/src/scripts/_lib/changelog_eras.ts +7 -2
- package/src/scripts/_lib/continuation_ladder.ts +149 -2
- package/src/scripts/_lib/council_transport.ts +129 -0
- package/src/scripts/_lib/delivery_ready.ts +112 -0
- package/src/scripts/_lib/forge_protection.ts +267 -0
- package/src/scripts/_lib/hook_platform_keys.ts +27 -0
- package/src/scripts/_lib/json_python_parity.ts +127 -0
- package/src/scripts/_lib/lean_projection_mode.ts +14 -3
- package/src/scripts/_lib/loop_surfaces.ts +382 -0
- package/src/scripts/_lib/mission_record.ts +190 -0
- package/src/scripts/_lib/obligation_frequency.ts +217 -0
- package/src/scripts/_lib/obligations.ts +402 -0
- package/src/scripts/_lib/orchestration_record.ts +11 -20
- package/src/scripts/_lib/release_highlights.ts +199 -10
- package/src/scripts/_lib/release_holds.ts +493 -0
- package/src/scripts/_lib/release_migration_gate.ts +184 -0
- package/src/scripts/_lib/rides_along.ts +102 -0
- package/src/scripts/_lib/settings_renamed_keys.ts +82 -0
- package/src/scripts/_lib/test_delta.ts +166 -0
- package/src/scripts/_lib/test_provenance.ts +171 -0
- package/src/scripts/_lib/typed_op_grant.ts +246 -0
- package/src/scripts/_lib/typed_op_watch.ts +185 -0
- package/src/scripts/ai_council/config.ts +8 -11
- package/src/scripts/ai_council/fallback_config.ts +5 -3
- package/src/scripts/ai_council/ownership_classes.ts +118 -0
- package/src/scripts/ask_block_census.ts +285 -15
- package/src/scripts/check_enforcement_matrix.ts +624 -0
- package/src/scripts/check_gate_reachability.ts +173 -10
- package/src/scripts/check_generator_sync.ts +954 -0
- package/src/scripts/check_preamble_payload_budget.ts +75 -2
- package/src/scripts/check_release_highlights.ts +33 -1
- package/src/scripts/check_release_holds.ts +567 -0
- package/src/scripts/check_rule_projection_integrity.ts +22 -12
- package/src/scripts/check_test_delta.ts +294 -0
- package/src/scripts/check_test_weakening.ts +299 -0
- package/src/scripts/closure_scan.ts +333 -0
- package/src/scripts/compile_hook_manifest.ts +43 -3
- package/src/scripts/council_record_shape.ts +209 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +88 -9
- package/src/scripts/hooks/concern_registry.ts +4 -0
- package/src/scripts/hooks/design_pass_hook.ts +128 -3
- package/src/scripts/hooks/evidence_independence.ts +96 -0
- package/src/scripts/hooks/memory_recall_hook.ts +540 -0
- package/src/scripts/hooks/obligation_settle_hook.ts +182 -0
- package/src/scripts/hooks/rule_inject_hook.ts +49 -1
- package/src/scripts/hooks/run_continuation_hook.ts +17 -20
- package/src/scripts/hooks_doctor.ts +85 -0
- package/src/scripts/hooks_status.ts +19 -0
- package/src/scripts/install.ts +106 -206
- package/src/scripts/janitor.ts +7 -0
- package/src/scripts/lint_decision_classes.ts +464 -0
- package/src/scripts/lint_hook_manifest.ts +11 -0
- package/src/scripts/lint_major_migration_sections.ts +450 -0
- package/src/scripts/lint_plan_risk_register.ts +47 -3
- package/src/scripts/lint_roadmap_blockers.ts +61 -0
- package/src/scripts/lint_roadmap_producers.ts +202 -0
- package/src/scripts/measure_rule_budget.ts +101 -5
- package/src/scripts/new_roadmap.ts +37 -0
- package/src/scripts/orchestration_record.ts +0 -5
- package/src/scripts/release.ts +14 -98
- package/src/scripts/release_drill.ts +267 -1
- package/src/scripts/release_publication.ts +51 -0
- package/src/scripts/report_enforcement_drift.ts +566 -0
- package/src/scripts/report_host_injection_effect.ts +3 -11
- package/src/scripts/report_standing_payload_by_host.ts +26 -152
- package/src/scripts/schemas/agent-settings.schema.json +23 -0
- package/src/scripts/schemas/command.schema.json +4 -0
- package/src/scripts/scope_growth.ts +219 -0
- package/src/scripts/trigger_eval_grandfather.json +0 -1
- package/src/scripts/ui_conformance_probe.ts +622 -0
- package/src/server/schemas/settings.ts +31 -7
- package/src/shared/missionExecution.ts +126 -0
- package/dist/cli-delegate/chunk-523HCFYO.js +0 -90
|
@@ -127,8 +127,8 @@ So the record carries **two** SHAs per PR and they mean different things:
|
|
|
127
127
|
Before every merge, re-read the PR and refuse when the live head is **neither**
|
|
128
128
|
the snapshot head **nor** the head this run last pushed. That is the
|
|
129
129
|
force-push-after-authorization case, and it is the only one the check exists
|
|
130
|
-
for. A PR that appeared after the snapshot is
|
|
131
|
-
says what happens to it.
|
|
130
|
+
for. A PR that appeared after the snapshot is never merged by this run — § 6
|
|
131
|
+
says what happens to it instead.
|
|
132
132
|
|
|
133
133
|
## 2. Sync with the base
|
|
134
134
|
|
|
@@ -161,13 +161,44 @@ it now means two humans edited the same policy sentence — read both sides.
|
|
|
161
161
|
| Evidence files | `agents/evidence/**` | Append-only. Keep both sides. |
|
|
162
162
|
|
|
163
163
|
```
|
|
164
|
-
|
|
165
|
-
|
|
164
|
+
THE FOUR CLASSES ARE AIDS, NOT EXHAUSTIVE AUTHORITY.
|
|
165
|
+
AN UNENUMERATED CONFLICT IS ROUTED, NOT HALTED — AND NEVER RESOLVED SILENTLY.
|
|
166
|
+
UNDERSTAND BOTH INTENTS → INSPECT RECENCY, AUTHORS AND OPEN PRs →
|
|
167
|
+
PRESERVE BOTH WHERE COMPATIBLE → INDEPENDENT REVIEW FOR A RISKY MERGE →
|
|
168
|
+
COUNCIL OR TEAM → THE OWNER ONLY FOR A PRODUCT-SEMANTIC INCOMPATIBILITY.
|
|
166
169
|
```
|
|
167
170
|
|
|
168
|
-
The classes exist so a merge resolution is reproducible by a second reader
|
|
169
|
-
|
|
170
|
-
|
|
171
|
+
The classes exist so a merge resolution is reproducible by a second reader, and
|
|
172
|
+
that is still their job. What changed is what happens when a conflict falls
|
|
173
|
+
outside them: **`road-to-adversarial-verification-and-long-runs` 5.2** replaced
|
|
174
|
+
the halt with the ladder above, because "nobody has decided this yet" describes
|
|
175
|
+
a class of conflict, not a class of thing only an owner may touch. Most
|
|
176
|
+
unenumerated conflicts are two branches editing adjacent prose, and halting a run
|
|
177
|
+
on one converts a two-minute read into an owner interrupt.
|
|
178
|
+
|
|
179
|
+
Read the ladder as ordered, and note where the owner sits. The first three rungs
|
|
180
|
+
are the agent's own work — **understand what each side was trying to do**,
|
|
181
|
+
**inspect recency, authorship and the open PRs** that produced them, and
|
|
182
|
+
**preserve both where they are compatible**, which most textual conflicts are.
|
|
183
|
+
The fourth and fifth escalate *laterally* — an independent reviewer for a merge
|
|
184
|
+
whose risk the run cannot bound alone, then the council or the team. The owner is
|
|
185
|
+
the **last** rung and is reached on one condition: the two sides encode
|
|
186
|
+
incompatible PRODUCT semantics, where choosing is a decision about what the thing
|
|
187
|
+
should do rather than about how to combine two edits.
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
A CONFLICT THE RUN CANNOT UNDERSTAND IS NOT AUTOMATICALLY OWNER-OWNED.
|
|
191
|
+
"I DO NOT KNOW WHICH SIDE IS RIGHT" IS A REASON TO ESCALATE INDEPENDENTLY,
|
|
192
|
+
NOT A REASON TO ASK. THE OWNER RUNG IS REACHED BY THE SEMANTIC TEST,
|
|
193
|
+
NEVER BY THE RUN'S OWN UNCERTAINTY.
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Deciding it **silently** inside a drain loop is still how work disappears, and
|
|
197
|
+
that prohibition is unchanged: an unenumerated resolution is recorded — which
|
|
198
|
+
rung settled it, what both intents were, and why the chosen resolution preserves
|
|
199
|
+
them — so the second reader the classes exist for can still follow it.
|
|
200
|
+
|
|
201
|
+
**`process-full`'s halt 6 retires with this**, per that command's own halt table.
|
|
171
202
|
|
|
172
203
|
## 4. Superseded check — before any CI is spent
|
|
173
204
|
|
|
@@ -258,11 +289,19 @@ a PR its own predecessor invalidated, because it has no predecessor that
|
|
|
258
289
|
landed. The cutoff below bounds both forms.
|
|
259
290
|
|
|
260
291
|
**Cutoff.** When the manifest is exhausted, recompute the open-PR list
|
|
261
|
-
**exactly once**. PRs that appeared during the run are
|
|
292
|
+
**exactly once**. PRs that appeared during the run are **prepared** as ONE final
|
|
262
293
|
straggler batch. After that batch the run ends unconditionally; anything
|
|
263
294
|
arriving during or after it is recorded as `arrived-after-cutoff` and is not
|
|
264
295
|
processed.
|
|
265
296
|
|
|
297
|
+
**The straggler batch is prepared and never merged — in both forms.** It is not
|
|
298
|
+
in § 1's manifest, so the invocation does not reach it (the Iron Law above § 1,
|
|
299
|
+
and § 7's first rule). "Drained" is therefore preparation here: each straggler
|
|
300
|
+
is synced, classified, greened and reported, ends at mergeable-and-open exactly
|
|
301
|
+
as under `--no-merge`, and is recorded `unauthorized` with the go-ahead it needs.
|
|
302
|
+
Reading "drained" as "merged" is the one way `all` could merge a PR the owner
|
|
303
|
+
never named, which is why the word is pinned rather than left to context.
|
|
304
|
+
|
|
266
305
|
```
|
|
267
306
|
THE CUTOFF IS THE TERMINATION PROOF.
|
|
268
307
|
WITHOUT IT, "THE QUEUE MUST SHRINK" DOES NOT TERMINATE AGAINST A SECOND
|
|
@@ -315,6 +354,11 @@ Write the summary as-is with an `unauthorized` disposition per unprocessed PR
|
|
|
315
354
|
and name the exact authorization needed. Then STOP and wait — do not end the
|
|
316
355
|
run, and do not proceed to the next PR.
|
|
317
356
|
|
|
357
|
+
That is the same `unauthorized` row § 6's straggler batch carries, and
|
|
358
|
+
deliberately one token rather than two: both mean *prepared by this run, not
|
|
359
|
+
authorized for it to merge*, and a reader of the summary needs the distinction
|
|
360
|
+
between merged and not-merged, not between two reasons for the same outcome.
|
|
361
|
+
|
|
318
362
|
## 8. Kill switches, and what happens after a merge
|
|
319
363
|
|
|
320
364
|
**Armed during preparation, not only before a merge** — otherwise a
|
|
@@ -369,7 +413,14 @@ conflict classes hit, CI iterations used, disposition, and any edits dropped in
|
|
|
369
413
|
conflict resolution. The disposition set is closed:
|
|
370
414
|
|
|
371
415
|
`merged <sha>` · `superseded-closed` · `blocked-external` · `twice-exhausted` ·
|
|
372
|
-
`
|
|
416
|
+
`unauthorized` · `arrived-after-cutoff`
|
|
417
|
+
|
|
418
|
+
`unauthorized` replaces `window-expired`, and the swap is one-for-one on
|
|
419
|
+
purpose. `window-expired` named a clock ADR-254 removed on 2026-09-04, so no run
|
|
420
|
+
can produce that row any more, and a closed set holding an unproducible member
|
|
421
|
+
is a set nobody can check a run against. `unauthorized` names what actually
|
|
422
|
+
happens in its place — § 7's pause and § 6's straggler batch, the two ways a PR
|
|
423
|
+
ends this run prepared and unmerged.
|
|
373
424
|
|
|
374
425
|
## Rules
|
|
375
426
|
|
|
@@ -132,7 +132,13 @@ Append a **Host verdict** sub-block under the Council review block in the roadma
|
|
|
132
132
|
| 4 | <one-line> | `needs-input` | open question — user picks below |
|
|
133
133
|
```
|
|
134
134
|
|
|
135
|
-
Then
|
|
135
|
+
Then, **when the verdict is owed to the owner** — it is owner-owned
|
|
136
|
+
(`product-owned`, `business-owned`, `destructive-owned`) or the council did not
|
|
137
|
+
converge — surface a single numbered-options block per
|
|
138
|
+
[`user-interaction`](../../rules/user-interaction.md), carrying the verdict per
|
|
139
|
+
option. A conclusive **technical** verdict emits no block at all: it is a
|
|
140
|
+
resolution, it is recorded in the roadmap's `## Decisions` table as
|
|
141
|
+
`resolved by: council:<record>`, and the run continues on it (ADR-268 § 10).
|
|
136
142
|
|
|
137
143
|
> 1. `[accept]` Apply finding 1 — <one-line patch summary>
|
|
138
144
|
> 2. `[accept-with-modification]` Apply finding 2 (modified) — <one-line patch summary + adjustment>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
model_tier: inherit
|
|
3
3
|
name: roadmap-create
|
|
4
|
+
produces_roadmap: true
|
|
4
5
|
pack: product-basic
|
|
5
6
|
visibility: internal
|
|
6
7
|
cluster: roadmap
|
|
@@ -23,7 +24,7 @@ packs:
|
|
|
23
24
|
|
|
24
25
|
Before anything else, run the plan-confidence gate per
|
|
25
26
|
[`plan-confidence-gate`](../../contexts/execution/plan-confidence-gate.md):
|
|
26
|
-
read `planning.
|
|
27
|
+
read `planning.closure_pass` (missing = `true`), do the codebase
|
|
27
28
|
lookup, and assess the four 95%-conditions against the seed.
|
|
28
29
|
|
|
29
30
|
- **Confident** (all four hold) → emit the single marker line and continue
|
|
@@ -171,6 +172,23 @@ exact honest-null grammar from the contract. Self-review suffices.
|
|
|
171
172
|
`lint_plan_risk_register` enforces this at pre-push + CI; drafts are
|
|
172
173
|
exempt until flipped to ready.
|
|
173
174
|
|
|
175
|
+
### 5c. Release-holds self-check (template rule 28) — before save
|
|
176
|
+
|
|
177
|
+
Ask once: *does any intermediate tree state of this roadmap have to stay
|
|
178
|
+
unpublished?* The default answer is **no**, and a roadmap declaring no hold is
|
|
179
|
+
the normal shape. Roadmap *incompleteness* is never a release condition.
|
|
180
|
+
|
|
181
|
+
If the answer is yes, walk rule 28's authoring order and stop at the first rung
|
|
182
|
+
that works — **re-sequence → guard → hold**. A hold is the last resort and its
|
|
183
|
+
entry carries a mandatory `Why not a guard:` field.
|
|
184
|
+
|
|
185
|
+
**Record the outcome either way.** Reaching rung 1 or 2 writes the one-line
|
|
186
|
+
`resequenced:` / `guarded:` note inside the commented `## Release holds` block
|
|
187
|
+
the skeleton emits; reaching rung 3 uncomments the entry. A considered hold that
|
|
188
|
+
was avoided is a counted outcome — see
|
|
189
|
+
[`roadmap-writing § 5b-holds`](../../../../skills/roadmap-writing/SKILL.md).
|
|
190
|
+
Checked by `./scripts-run src/scripts/check_release_holds --lint`.
|
|
191
|
+
|
|
174
192
|
### 6. Save the file
|
|
175
193
|
|
|
176
194
|
- Generate a filename from the title: kebab-case, e.g. `optimize-webhook-jobs.md`.
|
|
@@ -234,37 +252,40 @@ Regenerate `agents/roadmaps-progress.md` so the new roadmap shows up:
|
|
|
234
252
|
|
|
235
253
|
Mention the new overall count to the user.
|
|
236
254
|
|
|
237
|
-
### 9.
|
|
238
|
-
|
|
239
|
-
Read `verbosity.offer_council_in_delivery` from `.agent-settings.yml`
|
|
240
|
-
(default `false`):
|
|
241
|
-
|
|
242
|
-
- `false` (default): skip the prompt silently. When `ai_council.enabled:
|
|
243
|
-
true` AND at least one member enabled, emit one line: `→ council
|
|
244
|
-
skipped (set verbosity.offer_council_in_delivery: true to enable, or
|
|
245
|
-
run /council roadmap:<path> directly)`. Otherwise emit nothing.
|
|
246
|
-
- `true`: when `ai_council.enabled: true` **and** at least one member
|
|
247
|
-
enabled (`anthropic` or `openai`), ask (in the user's language):
|
|
255
|
+
### 9. Council review — a step, not an offer
|
|
248
256
|
|
|
249
|
-
|
|
250
|
-
|
|
257
|
+
```
|
|
258
|
+
UNDER A MISSION THE COUNCIL IS A STEP. NEVER AN OFFER.
|
|
259
|
+
AVAILABILITY IS `agent-config council:status`. NOTHING ELSE DECIDES IT.
|
|
260
|
+
```
|
|
251
261
|
|
|
252
|
-
|
|
253
|
-
|
|
262
|
+
The offer that used to sit here was verbosity-gated and suppressed under
|
|
263
|
+
`personal.autonomy: on`, on the stated ground that the council is billable.
|
|
264
|
+
That premise is false: the transport resolves CLI-first
|
|
265
|
+
(`src/scripts/ai_council/transport_resolver.ts`), so the ordinary path spends
|
|
266
|
+
no metered USD, and a question asked to avoid spend that does not happen is a
|
|
267
|
+
cheap question under `no-cheap-questions`. Where an API rung genuinely would
|
|
268
|
+
cross the configured ceiling, the answer is `spend-exhaustion` — pause and
|
|
269
|
+
report (ADR-268 § 8) — never a question either.
|
|
254
270
|
|
|
255
|
-
|
|
271
|
+
Run the free availability probe — no API call, no spend, any directory:
|
|
256
272
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
- Append the council findings as a `## Council review (<UTC date>)`
|
|
261
|
-
section at the bottom of the roadmap. Include the trace path to
|
|
262
|
-
`agents/runtime/council/sessions/<timestamp>/raw-text.md` so future readers
|
|
263
|
-
can audit.
|
|
264
|
-
- Do **not** rewrite the roadmap based on the findings — surface them,
|
|
265
|
-
let the user decide what to act on.
|
|
273
|
+
```bash
|
|
274
|
+
agent-config council:status
|
|
275
|
+
```
|
|
266
276
|
|
|
267
|
-
|
|
277
|
+
- **CONFIGURED** → run `/council roadmap:<path>` as a step, carrying the
|
|
278
|
+
user's original ask from step 1 as `original_ask` (the handoff preamble
|
|
279
|
+
carries it verbatim, see `scripts/ai_council/prompts.ts`). Append the
|
|
280
|
+
findings as a `## Council review (<UTC date>)` section at the bottom of the
|
|
281
|
+
roadmap, inlined with date and members per the council record contract.
|
|
282
|
+
Do **not** rewrite the roadmap from the findings — surface them; a technical
|
|
283
|
+
verdict resolves per the ownership table, an owner-owned one becomes a
|
|
284
|
+
`## Decisions` row.
|
|
285
|
+
- **NOT CONFIGURED** → state the resolver's own message in one line and
|
|
286
|
+
continue. Never infer this from the project tree: the config is
|
|
287
|
+
user-global (ADR-104), and the missing-file reflex is the measured failure
|
|
288
|
+
`council-availability` exists over.
|
|
268
289
|
|
|
269
290
|
### 10. Ask the execution mode — ONE question, then write frontmatter
|
|
270
291
|
|
|
@@ -384,3 +405,29 @@ Failure modes covered by this hard stop:
|
|
|
384
405
|
- Follow the roadmap template from `.augment/templates/roadmaps.md`; write in English (project convention).
|
|
385
406
|
- Keep the file focused: 500–1000 lines max. If larger, suggest splitting.
|
|
386
407
|
- **Never overwrite an existing roadmap.** Step 6 scans `active/`, `archive/`, `skipped/` (+ subdirs); on collision → STOP, present rename / open / abort. Auto-suffix requires explicit pick.
|
|
408
|
+
|
|
409
|
+
## Closure — the last step, always
|
|
410
|
+
|
|
411
|
+
```
|
|
412
|
+
THIS COMMAND PRODUCES A ROADMAP, SO IT ENDS IN CLOSURE.
|
|
413
|
+
NEVER HAND BACK A PLAN CARRYING A DECISION PLANNING COULD HAVE CLOSED.
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
Declared by `produces_roadmap: true` in the frontmatter and enforced by
|
|
417
|
+
`lint_roadmap_producers`: a producer that does not end here reds CI.
|
|
418
|
+
|
|
419
|
+
Read `planning.closure_pass` (missing = `true`). When active, run
|
|
420
|
+
[`/challenge-me closure`](../../../meta/challenge-me/closure/command.md) on the
|
|
421
|
+
roadmap this command just produced, before handing back:
|
|
422
|
+
|
|
423
|
+
```bash
|
|
424
|
+
./scripts-run src/scripts/closure_scan <roadmap-path>
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
Every detected decision is resolved at the lowest rung that owns it and written
|
|
428
|
+
into the roadmap's `## Decisions` table. Owner-owned residue is asked **now**,
|
|
429
|
+
one question per turn, and its answer recorded — never handed back as *"the
|
|
430
|
+
open questions are in the file"*.
|
|
431
|
+
|
|
432
|
+
An explicit *just write it* drops the pass and is recorded as a **bypass** on
|
|
433
|
+
its own axis, never as an absent closure. A mission grant is not a bypass.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
model_tier: high
|
|
3
3
|
name: roadmap-materialize
|
|
4
|
+
produces_roadmap: true
|
|
4
5
|
pack: product-basic
|
|
5
6
|
visibility: internal
|
|
6
7
|
cluster: roadmap
|
|
@@ -70,3 +71,29 @@ pastes a ticket into Linear/Jira (or creates it via MCP), or runs a per-ticket b
|
|
|
70
71
|
- **Do NOT commit or push.**
|
|
71
72
|
- Bundle is the source of truth; the tracker is a projection
|
|
72
73
|
([`ticket-bundle-format`](../../docs/contracts/ticket-bundle-format.md)).
|
|
74
|
+
|
|
75
|
+
## Closure — the last step, always
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
THIS COMMAND PRODUCES A ROADMAP, SO IT ENDS IN CLOSURE.
|
|
79
|
+
NEVER HAND BACK A PLAN CARRYING A DECISION PLANNING COULD HAVE CLOSED.
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Declared by `produces_roadmap: true` in the frontmatter and enforced by
|
|
83
|
+
`lint_roadmap_producers`: a producer that does not end here reds CI.
|
|
84
|
+
|
|
85
|
+
Read `planning.closure_pass` (missing = `true`). When active, run
|
|
86
|
+
[`/challenge-me closure`](../../../meta/challenge-me/closure/command.md) on the
|
|
87
|
+
roadmap this command just produced, before handing back:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
./scripts-run src/scripts/closure_scan <roadmap-path>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Every detected decision is resolved at the lowest rung that owns it and written
|
|
94
|
+
into the roadmap's `## Decisions` table. Owner-owned residue is asked **now**,
|
|
95
|
+
one question per turn, and its answer recorded — never handed back as *"the
|
|
96
|
+
open questions are in the file"*.
|
|
97
|
+
|
|
98
|
+
An explicit *just write it* drops the pass and is recorded as a **bypass** on
|
|
99
|
+
its own axis, never as an absent closure. A mission grant is not a bypass.
|
|
@@ -153,6 +153,46 @@ waiting on that remote CI is part of the run per the Iron Law below. It is
|
|
|
153
153
|
the whole of what this command delivers: there is no flag that carries it
|
|
154
154
|
further, and § Merging below says why.
|
|
155
155
|
|
|
156
|
+
### The six required layers, in order, each with the command that runs it
|
|
157
|
+
|
|
158
|
+
`road-to-adversarial-verification-and-long-runs` 3.1. Correctness is owned by the
|
|
159
|
+
forge and CI, not by an owner reading a diff — so the layers are named, ordered,
|
|
160
|
+
and each one carries the command that produces its verdict. A layer with no
|
|
161
|
+
command is a claim; a layer with one is a check.
|
|
162
|
+
|
|
163
|
+
| # | Layer | Command that runs it |
|
|
164
|
+
|---|---|---|
|
|
165
|
+
| 1 | A targeted local RED, then GREEN | the test runner filtered to the failing name — `npm run test:ts -- <file>`, never the suite |
|
|
166
|
+
| 2 | Quality scoped to the changed surface | the type-checker and linter over the diff — `npm run typecheck`, the linter on changed files |
|
|
167
|
+
| 3 | Per-phase fast CI | `roadmap.quality_cadence: per_phase` (Phase 0.2) at each phase boundary |
|
|
168
|
+
| 4 | The final full required CI | `./scripts-run src/scripts/ci_settle <PR> --timeout 1700` — its LAST OUTPUT LINE is the verdict |
|
|
169
|
+
| 5 | Forge branch protection | `agent-config doctor --json` → `forge_protection` (Phase 3.2), read from the forge |
|
|
170
|
+
| 6 | Final-head verification | `ci_settle`'s verdict line names the head; it must be the head that was pushed last |
|
|
171
|
+
|
|
172
|
+
**Layer 1 before layer 2 before layer 3, and the order is the substance.** Each
|
|
173
|
+
layer is cheaper and narrower than the one after it, so running them out of order
|
|
174
|
+
spends the expensive verdict on a failure the cheap one would have named. A run
|
|
175
|
+
that reaches layer 4 with layer 1 unrun has not saved a step; it has moved the
|
|
176
|
+
same failure to where it costs a CI cycle.
|
|
177
|
+
|
|
178
|
+
```
|
|
179
|
+
CI REJECTS: A SKIPPED OR DISABLED REQUIRED CHECK · UNRESOLVED GENERATED DRIFT ·
|
|
180
|
+
POLICY-PROJECTION DRIFT · A STALE-HEAD MERGE · A CONFLICT RESOLUTION THAT WAS
|
|
181
|
+
NOT REVALIDATED.
|
|
182
|
+
CI NEVER REQUIRES A HUMAN APPROVAL MERELY BECAUSE A CHANGE IS LARGE.
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
That last line is not a courtesy. Size is the one property of a diff that
|
|
186
|
+
correlates with nothing a reviewer can check mechanically, and gating on it is
|
|
187
|
+
how *ask the owner* re-enters through a door marked prudence — which is the loop
|
|
188
|
+
ADR-268 § 0 is trying to end. Gate on the five conditions above, which are
|
|
189
|
+
falsifiable, and never on how big the change looks.
|
|
190
|
+
|
|
191
|
+
**A disabled required check cannot reach delivery-ready**, and that is the
|
|
192
|
+
condition to test rather than assert: a PR whose required context is skipped has
|
|
193
|
+
a green rollup and an unenforced gate, so a delivery-ready test that reads only
|
|
194
|
+
the rollup passes exactly when it should fail.
|
|
195
|
+
|
|
156
196
|
### Merging — out of scope, cancelled rather than deferred
|
|
157
197
|
|
|
158
198
|
```
|
|
@@ -219,7 +259,7 @@ RUNNING" IS NOT A BOUNDARY, NOT A HALT, AND NOT A REPORT — THE RUN ENDS
|
|
|
219
259
|
AT A MERGEABLE PR, NEVER AT AN OFFER TO GO CHECK ON ONE.
|
|
220
260
|
```
|
|
221
261
|
|
|
222
|
-
The **
|
|
262
|
+
The **five — and only five — live halt conditions** (exhaustive; nothing else
|
|
223
263
|
stops the run):
|
|
224
264
|
|
|
225
265
|
1. **Hard-Floor** trigger ([`non-destructive-by-default`](../../rules/non-destructive-by-default.md)).
|
|
@@ -227,13 +267,21 @@ stops the run):
|
|
|
227
267
|
3. **Security-sensitive** surface reached.
|
|
228
268
|
4. **Scope-out-of-roadmap** work discovered.
|
|
229
269
|
5. **Test / quality red** that cannot be cleared within the N=3 budget.
|
|
230
|
-
6. **
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
270
|
+
6. **RETIRED 2026-09-13** by `road-to-adversarial-verification-and-long-runs`
|
|
271
|
+
5.2. This read *a merge conflict outside the four enumerated classes of
|
|
272
|
+
[`/pr:merge` § 3](../../../git/pr/merge/command.md)*. That section now ROUTES
|
|
273
|
+
an unenumerated conflict — understand both intents, inspect recency and
|
|
274
|
+
authorship, preserve both where compatible, independent review, council or
|
|
275
|
+
team, and the owner **only** for a product-semantic incompatibility — so
|
|
276
|
+
there is no longer a conflict class whose arrival ends a run. Numbered rather
|
|
277
|
+
than renumbered: the list is cited by index from several places, and silently
|
|
278
|
+
shifting five conditions up one is how a citation comes to name a different
|
|
279
|
+
halt. **Five live halt conditions, not six.**
|
|
280
|
+
|
|
281
|
+
What did NOT change: an unenumerated conflict may still never be resolved
|
|
282
|
+
silently. The ladder's own record — which rung settled it, both intents, why
|
|
283
|
+
the resolution preserves them — is the replacement for the stop, and the
|
|
284
|
+
reason the stop could be removed at all.
|
|
237
285
|
|
|
238
286
|
**Under `--all`, which of these end the roadmap and which end the loop.** Two
|
|
239
287
|
of the five are safety floors and they end the **whole run**, not the current
|
|
@@ -246,7 +294,7 @@ roadmap:
|
|
|
246
294
|
| 2. Council-off + genuine ambiguity | Ends the roadmap; the loop records it and continues. |
|
|
247
295
|
| 4. Scope-out-of-roadmap work | Ends the roadmap; the loop records it and continues. |
|
|
248
296
|
| 5. Test / quality red past N=3 | Ends the roadmap; the loop records it and continues. |
|
|
249
|
-
| 6. Unenumerated merge conflict in delivery |
|
|
297
|
+
| ~~6. Unenumerated merge conflict in delivery~~ | **RETIRED** — `/pr:merge` § 3 routes it instead of stopping. |
|
|
250
298
|
|
|
251
299
|
**And the conditions that end the loop without ending a roadmap:**
|
|
252
300
|
estate-queue exhaustion (always), a
|
|
@@ -257,8 +305,9 @@ authorization-window expiry — which is **unreachable in this command**,
|
|
|
257
305
|
because it never performs a `BLOCK_OPS` operation for the window to govern. Three conditions, one of them currently inert, and this
|
|
258
306
|
table is the only place the set is stated.
|
|
259
307
|
|
|
260
|
-
Nothing here widens a run without `--all`: it still has exactly the
|
|
261
|
-
above, all of them ending the run because there is no loop to
|
|
308
|
+
Nothing here widens a run without `--all`: it still has exactly the five live
|
|
309
|
+
conditions above, all of them ending the run because there is no loop to
|
|
310
|
+
continue.
|
|
262
311
|
|
|
263
312
|
```
|
|
264
313
|
FORBIDDEN NON-HALT REASONS — NEVER STOP THE RUN FOR ANY OF THESE:
|
|
@@ -272,12 +321,13 @@ FORBIDDEN NON-HALT REASONS — NEVER STOP THE RUN FOR ANY OF THESE:
|
|
|
272
321
|
· "the branch is not protected" / "a branch must be created"
|
|
273
322
|
· "a PR must be opened" / "a GitHub setting must change"
|
|
274
323
|
· "CI must be re-run" / "the merge base needs updating" / "there are
|
|
275
|
-
conflicts" — resolving these IS the work
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
324
|
+
conflicts" — resolving these IS the work, and since 2026-09-13 that holds
|
|
325
|
+
for an UNENUMERATED conflict too: [`/pr:merge` § 3](../../../git/pr/merge/command.md)
|
|
326
|
+
routes it (understand both intents → recency and authorship → preserve both
|
|
327
|
+
where compatible → independent review → council or team → the owner only for
|
|
328
|
+
a product-semantic incompatibility) instead of stopping. The prohibition that
|
|
329
|
+
survives is on resolving one SILENTLY: the rung that settled it, both
|
|
330
|
+
intents, and why the resolution preserves them are recorded.
|
|
281
331
|
· "a paid service is needed" — authorised under the ceiling below
|
|
282
332
|
· "a maintainer should do this" when the agent can perform the same action
|
|
283
333
|
· any agent-invented caution not in the five halt conditions above.
|
|
@@ -313,9 +363,64 @@ branch setting, push, open a PR, re-run CI, update a merge base, fix a failing
|
|
|
313
363
|
test, authorise spend inside a budget — is machine-executable by the agent, and
|
|
314
364
|
is therefore remediation work rather than a blocker.
|
|
315
365
|
|
|
366
|
+
### `complete` requires DELIVERY, not only checkboxes
|
|
367
|
+
|
|
368
|
+
```
|
|
369
|
+
A RUN WHOSE CHECKBOXES READ COMPLETE AND WHOSE PR SITS ON RED CI OR ON A
|
|
370
|
+
MOVED TARGET HAS NOT COMPLETED. CHECKBOXES ARE ONE COMPLETION; DELIVERY IS
|
|
371
|
+
THE OTHER, AND ONLY TWO POSITIONS END A RUN: `merged` AND `open-green`.
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
`road-to-adversarial-verification-and-long-runs` 8.1. The delivery machine is
|
|
375
|
+
`working → local-green → pushed → pr-open → ci-pending → (red → the recovery
|
|
376
|
+
ladder → pushed | green) → target-sync-check → (moved → sync → tests → pushed |
|
|
377
|
+
current) → delivery-ready → (grant → merged | no grant → open-green)`.
|
|
378
|
+
|
|
379
|
+
`run_continuation_hook` reads the position the run RECORDED — it does not probe
|
|
380
|
+
the forge, because a `gh` call on the stop path is the cost the premise rung
|
|
381
|
+
already declined — and any position that is not an ending keeps the run engaged
|
|
382
|
+
at zero open steps. Two bounds survive that hold, and one is deliberately lifted:
|
|
383
|
+
the iteration and wall-clock caps still end it, while the **stall** rung is
|
|
384
|
+
skipped, because during delivery the open-step count it measures cannot move and
|
|
385
|
+
a metric that cannot move is not a stall signal. A run that recorded no position
|
|
386
|
+
decides exactly as it did before.
|
|
387
|
+
|
|
388
|
+
```
|
|
389
|
+
THE CONSUMER IS LIVE. NO PRODUCER SHIPS YET — NOTHING WRITES `delivery` INTO
|
|
390
|
+
THE RUN-STATE FILE, SO ON EVERY RUN TODAY THE POSITION IS ABSENT AND THE HOLD
|
|
391
|
+
DOES NOT FIRE. READ THE PARAGRAPH ABOVE AS THE CONTRACT, NOT AS BEHAVIOR YOU
|
|
392
|
+
WILL OBSERVE.
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
Said in a fence because the surrounding prose reads as a description of live
|
|
396
|
+
behavior and an independent review of the change that introduced it read it
|
|
397
|
+
exactly that way. The ladder, the round-trip and the ledger field are built,
|
|
398
|
+
tested and correct for any recorded value; what is missing is the step that
|
|
399
|
+
records one, and a run that wants the hold must write the position itself until
|
|
400
|
+
that lands.
|
|
401
|
+
|
|
402
|
+
**`open-green` is a success, not a shortfall.** A run with no merge grant is not
|
|
403
|
+
supposed to merge; what it owes is an open PR whose CI is green **on the head CI
|
|
404
|
+
actually observed**, and a report that says so.
|
|
405
|
+
|
|
406
|
+
### The PR body is one page for the owner's review
|
|
407
|
+
|
|
408
|
+
8.2. The end-of-run PR body carries these six, each as its own named section:
|
|
409
|
+
|
|
410
|
+
1. **Delivery target reached** — `merged` or `open-green`, and the head SHA CI observed.
|
|
411
|
+
2. **Decisions taken, and by whom** — agent, council, team or owner, per decision.
|
|
412
|
+
3. **Open owner-owned residue** — what is left that only the owner can settle, or *none*.
|
|
413
|
+
4. **Scope delta** — what the run added to or dropped from the roadmap's stated scope.
|
|
414
|
+
5. **Spend** — actual against the authorised ceiling.
|
|
415
|
+
6. **Fix-loop epochs** — how many strategies were opened, and what ended each.
|
|
416
|
+
|
|
417
|
+
Six sections because each answers a different question the owner would otherwise
|
|
418
|
+
have to ask, and a run that omits one has moved that question back into the
|
|
419
|
+
conversation this roadmap exists to end.
|
|
420
|
+
|
|
316
421
|
| Outcome | When | Success? | terminal state |
|
|
317
422
|
|---|---|---|---|
|
|
318
|
-
| `complete` | `count_open == 0
|
|
423
|
+
| `complete` | `count_open == 0`, the PR is open, and delivery reached an ending | yes — archival check runs | `success` |
|
|
319
424
|
| `blocked` | every remaining open step is **externally impossible** for the agent | **no** — partial progress, labelled as such | `blocked`, or `approval-required` where the work is finished and waiting on a human |
|
|
320
425
|
| a halt | one of the five conditions fired | **no** — the halt is reported | `exhausted` when a declared budget ran out; `stagnated` when the same failure signature repeated with budget left |
|
|
321
426
|
|
|
@@ -130,6 +130,28 @@ control, no background jobs, no delegate write path; the capability delta
|
|
|
130
130
|
vs. the native plugin is stated in the output. When the codex CLI itself is
|
|
131
131
|
absent, the same fail-closed principle applies: state it plainly and stop.
|
|
132
132
|
|
|
133
|
+
## Records — the same shape and the same place as a council record
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
A TEAM VERDICT IS RECORDED THE WAY A COUNCIL VERDICT IS. NO SECOND FORMAT.
|
|
137
|
+
THE OPTIONS BLOCK IS CONDITIONAL ON OWNERSHIP HERE TOO.
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
A team run produces the same seven fields a council record carries — question,
|
|
141
|
+
evidence, member positions, convergence, verdict, confidence, revisit
|
|
142
|
+
condition — and lives in the same place: the dev-time artifact under
|
|
143
|
+
`agents/runtime/` (gitignored, pruned on the configured retention window), and
|
|
144
|
+
the **durable** record inlined into the artifact the decision serves, with date
|
|
145
|
+
and members. Never a link to the scratch file; it is not in a clone.
|
|
146
|
+
|
|
147
|
+
Where the decision closes a roadmap question, the durable record is one
|
|
148
|
+
`## Decisions` row with `resolved by: team:<record>`.
|
|
149
|
+
|
|
150
|
+
The options block follows the same ownership condition as a council record: a
|
|
151
|
+
conclusive **technical** verdict emits none, an owner-owned or non-convergent
|
|
152
|
+
one carries the proposal the owner confirms. Both directions are checkable —
|
|
153
|
+
`./scripts-run src/scripts/council_record_shape <record.md>`.
|
|
154
|
+
|
|
133
155
|
## No-claims note
|
|
134
156
|
|
|
135
157
|
The review-lift value of cross-model team review is **unproven** until the
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Scope Growth — Ownership
|
|
2
|
+
|
|
3
|
+
Loaded from [`scope-mechanics`](scope-mechanics.md). The size question — *is
|
|
4
|
+
this small and aligned enough to do now* — is the remediation ladder's. This is
|
|
5
|
+
the other axis, *whose decision is it*, and a change must clear BOTH to be done
|
|
6
|
+
inline: something small and council-owned is still not the agent's to decide,
|
|
7
|
+
and something agent-owned and large is still bounded by the smallest-diff rule.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
SCOPE GROWTH DISCOVERED MID-MISSION IS ROUTED BY WHO OWNS IT, NOT BY HOW BIG
|
|
11
|
+
IT LOOKS. THE THREE LISTS BELOW ARE CLOSED. GROWTH THAT MATCHES THE FIRST IS
|
|
12
|
+
DONE AND RECORDED AS A SCOPE DELTA — IT IS NEVER ASKED ABOUT.
|
|
13
|
+
GROWTH THAT MATCHES NEITHER OF THE FIRST TWO IS NOT SCOPE GROWTH AT ALL:
|
|
14
|
+
IT IS A FOLLOW-UP ARTIFACT, AND THE MISSION DOES NOT EXPAND TO HOLD IT.
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`active-remediation`'s ladder answers *how big is this and is it aligned*.
|
|
18
|
+
This answers the other axis — *whose decision is it* — and the two run
|
|
19
|
+
together: a change must clear BOTH to be done inline. Something small and
|
|
20
|
+
council-owned is still not the agent's to decide; something agent-owned and
|
|
21
|
+
large is still bounded by `minimal-safe-diff`.
|
|
22
|
+
|
|
23
|
+
### Agent-owned growth — done, recorded, never asked about
|
|
24
|
+
|
|
25
|
+
Six kinds, and the list is closed:
|
|
26
|
+
|
|
27
|
+
1. **A necessary internal refactor** — the change cannot land correctly
|
|
28
|
+
without it, and it changes no public surface.
|
|
29
|
+
2. **A missing test** on a path this change touched.
|
|
30
|
+
3. **A regression on a touched path** — the change surfaced it, so the change
|
|
31
|
+
owns it.
|
|
32
|
+
4. **A small dependency adjustment** inside the existing major, no new
|
|
33
|
+
dependency.
|
|
34
|
+
5. **A local API change inside already-defined semantics** — the contract does
|
|
35
|
+
not move, only its implementation.
|
|
36
|
+
6. **A Boy-Scout cleanup** that is ALL of: small, local, low blast radius,
|
|
37
|
+
testable, and carrying no new product decision. Any one of the five
|
|
38
|
+
missing and it is not this row.
|
|
39
|
+
|
|
40
|
+
Each is **recorded as a scope delta in the PR body** — one line naming what
|
|
41
|
+
grew and why it was the agent's. The record is what makes the autonomy
|
|
42
|
+
reviewable afterwards, which is the condition under which it is legitimate at
|
|
43
|
+
all; growth done and not recorded is indistinguishable from scope creep.
|
|
44
|
+
|
|
45
|
+
### Council-owned growth — resolved by the council, still not asked of the owner
|
|
46
|
+
|
|
47
|
+
Four kinds:
|
|
48
|
+
|
|
49
|
+
1. **A larger internal re-cut** — the shape of the change, not its size.
|
|
50
|
+
2. **Two equal technical strategies** with no evidence between them.
|
|
51
|
+
3. **A risky compatibility design** — a technical risk, which is still
|
|
52
|
+
technical.
|
|
53
|
+
4. **An unclear boundary carrying no new product semantics.**
|
|
54
|
+
|
|
55
|
+
These route through the ownership ladder — independent session → council →
|
|
56
|
+
team — and the verdict becomes a `## Decisions` row. None of them reaches the
|
|
57
|
+
owner, however consequential: a technical decision does not become owner-owned
|
|
58
|
+
because it is hard.
|
|
59
|
+
|
|
60
|
+
### Owner-owned growth — the only rows that reach a person
|
|
61
|
+
|
|
62
|
+
Two, and only two:
|
|
63
|
+
|
|
64
|
+
1. **The work changes what the product or the business does.** New
|
|
65
|
+
user-visible semantics, a commitment, a price, a policy.
|
|
66
|
+
2. **It needs a typed op** — an operation from ADR-260's eleven-op vocabulary
|
|
67
|
+
for which no grant exists.
|
|
68
|
+
|
|
69
|
+
### Everything else is a follow-up artifact
|
|
70
|
+
|
|
71
|
+
A larger unrelated opportunity — a refactor the mission did not touch, a
|
|
72
|
+
subsystem that deserves attention, a debt the change merely passed — does
|
|
73
|
+
**not** expand the mission. It becomes a follow-up artifact (a roadmap under
|
|
74
|
+
`agents/roadmaps/`, per `active-remediation`'s third tier), named in the PR
|
|
75
|
+
body, and the mission delivers what it was given.
|
|
76
|
+
|
|
77
|
+
The failure this prevents is the one that looks like diligence: a mission that
|
|
78
|
+
absorbs every good idea it meets delivers none of them, and the PR that
|
|
79
|
+
carries it cannot be reviewed against anything.
|
|
80
|
+
|
|
@@ -252,3 +252,50 @@ block and the closing reply carries none. It sees one user turn on one host,
|
|
|
252
252
|
so everything outside that is model-carried, exactly like Iron Law 2's own
|
|
253
253
|
"no gate ships for this" note. `check_reply_consistency` reads a single draft
|
|
254
254
|
and holds no cross-turn state; it cannot see this law at all.
|
|
255
|
+
|
|
256
|
+
## The native ask — per host, and what it changes
|
|
257
|
+
|
|
258
|
+
> **Why this is here and not in the rule.** `user-interaction` is a
|
|
259
|
+
> project-scope rule, so its every byte is re-written into the preamble on
|
|
260
|
+
> **every subagent spawn**, and `check_preamble_payload_budget` is a measured
|
|
261
|
+
> ratchet with no headroom — a four-line addition to the rule measured +219
|
|
262
|
+
> tokens per spawn and failed it. The rule's own § Mechanics already routes
|
|
263
|
+
> "everything you look up rather than obey" here, and the ask SHAPE is lookup
|
|
264
|
+
> material: Iron Law 1 governs the recommendation identically on both shapes,
|
|
265
|
+
> so the rule needed no new obligation, only this contract to point at.
|
|
266
|
+
|
|
267
|
+
`ask: native | text` is declared per host in `src/scripts/hook_manifest.yaml`
|
|
268
|
+
and printed by `agent-config hooks:status`. It is **declared, not probed**: the
|
|
269
|
+
row records what the host's documented tool surface offers. A host declaring
|
|
270
|
+
`native` whose primitive turns out to be absent degrades to the text block —
|
|
271
|
+
the same question, the same content — so a wrong row costs a missed upgrade and
|
|
272
|
+
never a broken ask. Absent reads `text`.
|
|
273
|
+
|
|
274
|
+
| Shape | What the ask is | Where the recommendation lives |
|
|
275
|
+
|---|---|---|
|
|
276
|
+
| `native` | the host's structured-ask tool call | the **default option** of the native ask |
|
|
277
|
+
| `text` | the numbered block, per Iron Law 1 | the `Recommendation:` / `Empfehlung:` line directly under the block |
|
|
278
|
+
|
|
279
|
+
Four obligations hold on both shapes, and three of them are why the native
|
|
280
|
+
form is preferred rather than merely available:
|
|
281
|
+
|
|
282
|
+
1. **One decision point per turn.** A native ask presenting several unrelated
|
|
283
|
+
questions is the same violation as several text blocks. One number — or one
|
|
284
|
+
selection — answers it, or it is two asks.
|
|
285
|
+
2. **Every option says what changes by answering it.** Not the option's name
|
|
286
|
+
again: the consequence. A native ask makes this structural, because an
|
|
287
|
+
option carries a description field the text form leaves to discipline.
|
|
288
|
+
3. **The recommendation has exactly ONE source.** On a native ask that source
|
|
289
|
+
is the default option; naming it a second time in the prose above is the
|
|
290
|
+
drift Iron Law 1 exists to make structurally impossible.
|
|
291
|
+
4. **The answer is recorded before the next step runs.** Where the ask came out
|
|
292
|
+
of a plan-closure pass, it becomes a `## Decisions` row — id, ownership,
|
|
293
|
+
`resolved by: owner`, the decision, its evidence, its `revisit if`. An
|
|
294
|
+
answer that lives only in the transcript is re-derived after the next
|
|
295
|
+
context reset, which is the repeat the ask census counts as a defect.
|
|
296
|
+
|
|
297
|
+
**What the native shape does NOT change.** It is not a license to ask more: the
|
|
298
|
+
one-question-per-turn floor, the no-cheap-questions floor and the ownership
|
|
299
|
+
routing all run first, and a question that should not have been asked is not
|
|
300
|
+
improved by a better widget. Nor does it change who may be asked — a technical
|
|
301
|
+
decision does not reach the owner on any host.
|