@event4u/agent-config 14.5.0 → 14.7.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 +384 -3
- package/README.md +1 -1
- package/dist/agent-src/commands/analyze/decision.md +7 -0
- package/dist/agent-src/commands/analyze/inbox.md +264 -10
- package/dist/agent-src/commands/analyze.md +1 -1
- package/dist/agent-src/commands/optimize/project.md +10 -0
- package/dist/agent-src/commands/roadmap/process-full.md +132 -4
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +31 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +161 -1
- package/dist/agent-src/rules/context-hygiene.md +2 -0
- package/dist/agent-src/rules/decision-revisit-gate.md +111 -7
- package/dist/agent-src/rules/fix-what-you-see.md +108 -0
- package/dist/agent-src/rules/no-roadmap-references.md +0 -5
- package/dist/agent-src/rules/recurring-criticism.md +110 -0
- package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
- package/dist/agent-src/rules/rule-type-governance.md +0 -2
- package/dist/agent-src/rules/self-repair-loop.md +17 -0
- package/dist/agent-src/rules/skill-quality.md +0 -2
- package/dist/agent-src/rules/source-confidentiality.md +37 -7
- package/dist/agent-src/scripts/archival_sweep.ts +117 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +19 -3
- package/dist/agent-src/scripts/gate_budget.ts +282 -0
- package/dist/agent-src/scripts/gate_execute.ts +72 -31
- package/dist/agent-src/scripts/roadmap_gates.ts +74 -3
- package/dist/agent-src/scripts/update_roadmap_progress.ts +251 -7
- package/dist/agent-src/skills/adr-create/SKILL.md +25 -3
- package/dist/agent-src/skills/ai-council/SKILL.md +48 -807
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +320 -0
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +99 -0
- package/dist/agent-src/skills/ai-council/references/execution-modes.md +162 -0
- package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +125 -0
- package/dist/agent-src/skills/ai-council/references/procedure.md +143 -0
- package/dist/agent-src/skills/decision-review/SKILL.md +18 -0
- package/dist/agent-src/skills/quality-tools/SKILL.md +34 -326
- package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +113 -0
- package/dist/agent-src/skills/quality-tools/references/php-tools.md +222 -0
- package/dist/agent-src/skills/roadmap-management/SKILL.md +15 -409
- package/dist/agent-src/skills/roadmap-management/references/archival.md +226 -0
- package/dist/agent-src/skills/roadmap-management/references/authoring.md +107 -0
- package/dist/agent-src/skills/roadmap-management/references/dashboard.md +47 -0
- package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +58 -0
- package/dist/agent-src/skills/skill-writing/SKILL.md +34 -570
- package/dist/agent-src/skills/skill-writing/references/procedure.md +275 -0
- package/dist/agent-src/skills/skill-writing/references/read-only-scripts.md +18 -0
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +298 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +45 -2
- package/dist/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
- package/dist/agent-src/templates/scripts/telemetry/remote.ts +160 -7
- package/dist/agent-src/templates/scripts/telemetry/transport.ts +169 -0
- package/dist/cli/registry.js +1 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli-delegate/chunk-2GNWGMAL.js +172 -0
- package/dist/cli-delegate/{chunk-RLN73PR5.js → chunk-4VR4ORQ6.js} +10 -7
- package/dist/cli-delegate/chunk-6EOCNQAM.js +402 -0
- package/dist/cli-delegate/{chunk-XURJ4AQC.js → chunk-74E3TKWV.js} +381 -280
- package/dist/cli-delegate/{chunk-3UCJWMMP.js → chunk-7F3VYSM2.js} +4 -4
- package/dist/cli-delegate/{chunk-BKO2AZ7Z.js → chunk-B2ERU2VA.js} +1 -1
- package/dist/cli-delegate/{chunk-NXFWFAYV.js → chunk-G23AT6GD.js} +1 -0
- package/dist/cli-delegate/{chunk-63WSP6YZ.js → chunk-GJ5BVHXM.js} +72 -165
- package/dist/cli-delegate/{chunk-ZPSXJTLI.js → chunk-JZ4NR2TW.js} +353 -1
- package/dist/cli-delegate/chunk-MWRD5YOH.js +100 -0
- package/dist/cli-delegate/{chunk-GRRPEPRN.js → chunk-T7L2QK3K.js} +24 -5
- package/dist/cli-delegate/{chunk-EVTY7ISR.js → chunk-YM4GZDJG.js} +9 -1
- package/dist/cli-delegate/cmd_conformance.js +459 -709
- package/dist/cli-delegate/cmd_doctor.js +6 -6
- package/dist/cli-delegate/cmd_explain.js +1 -1
- package/dist/cli-delegate/cmd_export.js +7 -6
- package/dist/cli-delegate/cmd_handoff.js +6 -6
- package/dist/cli-delegate/cmd_packs_active.js +1 -1
- package/dist/cli-delegate/cmd_preflight.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +7 -6
- package/dist/cli-delegate/cmd_session_recycle.js +840 -30
- package/dist/cli-delegate/cmd_settings_migrate.js +7 -6
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +7 -6
- package/dist/cli-delegate/cmd_uninstall.js +9 -7
- 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 +7 -6
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +72 -29
- 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 +3127 -2022
- package/dist/install/claudePathsPlan.js +187 -0
- package/dist/install/claudePathsPlan.js.map +1 -0
- package/dist/install/hostLayerFingerprint.js +136 -0
- package/dist/install/hostLayerFingerprint.js.map +1 -0
- package/dist/install/install.mjs +553 -425
- package/dist/install/partitionEligibility.js +276 -0
- package/dist/install/partitionEligibility.js.map +1 -0
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1744 -1191
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_src.js +41 -0
- package/dist/scripts/_lib/agent_src.js.map +1 -1
- package/dist/scripts/_lib/install_layout.js +83 -0
- package/dist/scripts/_lib/install_layout.js.map +1 -0
- package/dist/scripts/_lib/installed_lock.js +444 -0
- package/dist/scripts/_lib/installed_lock.js.map +1 -0
- package/dist/scripts/condense.js +13 -164
- package/dist/scripts/condense.js.map +1 -1
- package/dist/server/schemas/settings.js +4 -0
- package/dist/server/schemas/settings.js.map +1 -1
- package/docs/contracts/settings-classes.md +12 -6
- package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +8 -3
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +26 -0
- package/docs/guidelines/agent-infra/engineering-memory-data-format.md +49 -0
- package/docs/guidelines/agent-infra/memory-access.md +17 -0
- package/docs/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
- package/package.json +1 -1
- package/src/agent-src/scripts/archival_sweep.ts +117 -0
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +19 -3
- package/src/agent-src/scripts/gate_budget.ts +282 -0
- package/src/agent-src/scripts/gate_execute.ts +72 -31
- package/src/agent-src/scripts/roadmap_gates.ts +74 -3
- package/src/agent-src/scripts/update_roadmap_progress.ts +251 -7
- package/src/agent-src/templates/scripts/telemetry/flush_sender.mjs +163 -0
- package/src/agent-src/templates/scripts/telemetry/remote.ts +160 -7
- package/src/agent-src/templates/scripts/telemetry/transport.ts +169 -0
- package/src/config/agent-settings.template.yml +27 -2
- package/src/config/ci-local-parity.yml +18 -0
- package/src/config/estate-count-budget.json +367 -3
- package/src/config/gate-violation-baselines.json +41 -41
- package/src/config/pack-size-budget.json +3 -2
- package/src/config/rule-activation-census.json +14 -6
- package/src/config/rule-stub-ceilings.json +19 -6
- package/src/install/claudePathsPlan.ts +196 -0
- package/src/install/hostLayerFingerprint.ts +145 -0
- package/src/install/partitionEligibility.ts +325 -0
- package/src/scripts/_cli/cmd_session_recycle.ts +9 -1
- package/src/scripts/_dispatch.bash +6 -1
- package/src/scripts/_lib/ac_heading.ts +30 -0
- package/src/scripts/_lib/agent_src.ts +42 -0
- package/src/scripts/_lib/bench_ab_pinned_repo.ts +162 -0
- package/src/scripts/_lib/bench_ab_workspace.ts +10 -1
- package/src/scripts/_lib/envelope_grounding.ts +38 -8
- package/src/scripts/_lib/installed_lock.ts +50 -5
- package/src/scripts/_lib/layer_overlap_notice.ts +85 -0
- package/src/scripts/_lib/md_section.ts +129 -0
- package/src/scripts/_lib/scope_guard.sh +86 -4
- package/src/scripts/_lib/self_repair.ts +19 -0
- package/src/scripts/_lib/self_repair_class_b.ts +171 -0
- package/src/scripts/_lib/subagent_capsule.ts +81 -1
- package/src/scripts/adr/regenerate_index.ts +13 -2
- package/src/scripts/adr_cite_check.ts +424 -0
- package/src/scripts/ai_council/cli_help.ts +55 -0
- package/src/scripts/before_complete_hook.ts +153 -28
- package/src/scripts/bench_ab_v2_complexity.ts +27 -7
- package/src/scripts/check_adr_frontmatter.ts +187 -1
- package/src/scripts/check_references.ts +60 -0
- package/src/scripts/check_release_published.ts +32 -11
- package/src/scripts/check_single_delivery.ts +517 -0
- package/src/scripts/ci_settle.ts +170 -0
- package/src/scripts/condense.ts +20 -170
- package/src/scripts/council_cli.ts +3 -3
- package/src/scripts/dispatch_r2_reviewer.ts +6 -14
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +77 -14
- package/src/scripts/hooks/block_no_verify.ts +61 -10
- package/src/scripts/hooks/block_unauthorized_git.ts +1 -1
- package/src/scripts/hooks/concern_registry.ts +4 -0
- package/src/scripts/hooks/rtk_wrap_hook.ts +8 -3
- package/src/scripts/hooks/run_continuation_hook.ts +887 -68
- package/src/scripts/hooks/ship_diff_volume_hook.ts +81 -15
- package/src/scripts/hooks/source_first_gate_hook.ts +464 -0
- package/src/scripts/hooks/state_io.ts +782 -20
- package/src/scripts/hooks/subagent_ledger_hook.ts +44 -15
- package/src/scripts/hooks/telemetry_flush_hook.ts +139 -0
- package/src/scripts/hooks/telemetry_self_repair.ts +128 -0
- package/src/scripts/hooks/telemetry_usage_hook.ts +22 -4
- package/src/scripts/hooks/turn_end_gate_hook.ts +81 -15
- package/src/scripts/install.sh +12 -2
- package/src/scripts/install.ts +16 -11
- package/src/scripts/language_mirror_hook.ts +561 -25
- package/src/scripts/lint_framework_leakage_allowlist.json +2 -2
- package/src/scripts/lint_plan_risk_register.ts +4 -3
- package/src/scripts/lint_skill_router_head.ts +4 -4
- package/src/scripts/mcp_server/tools.ts +2 -2
- package/src/scripts/memory_consolidation.ts +189 -0
- package/src/scripts/memory_eviction.ts +384 -0
- package/src/scripts/new_roadmap.ts +136 -0
- package/src/scripts/pack_mcp_content.ts +20 -5
- package/src/scripts/release.ts +37 -38
- package/src/scripts/report_layer_overlap.ts +78 -0
- package/src/scripts/report_memory_pointers.ts +622 -0
- package/src/scripts/self_repair_hook.ts +37 -5
- package/src/scripts/session_register_hook.ts +115 -15
- package/src/scripts/skill_usage_collect.ts +11 -1
- package/src/scripts/skill_usage_report.ts +278 -8
- package/src/scripts/sync_pr_branch.ts +7 -0
- package/src/server/schemas/settings.ts +8 -0
- package/dist/cli-delegate/chunk-EJITJBJX.js +0 -172
- package/dist/cli-delegate/chunk-PZWRPRWP.js +0 -38
- /package/dist/cli-delegate/{chunk-RYNADUFG.js → chunk-LWTYTX6F.js} +0 -0
|
@@ -180,6 +180,86 @@ change in § 3a.
|
|
|
180
180
|
`commit-policy` § NEVER ask about committing holds regardless of
|
|
181
181
|
autonomy).
|
|
182
182
|
|
|
183
|
+
### 3c. Capability screen — can the agent do this at all?
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
A RUN ALWAYS STARTS. THERE IS NO PREFLIGHT REFUSAL.
|
|
187
|
+
PER OPEN STEP, ASK ONE QUESTION: CAN THE AGENT EXECUTE THIS AT ALL?
|
|
188
|
+
YES → IT IS WORK. NO → IT IS THE ONLY KIND OF BLOCKER LEFT.
|
|
189
|
+
WHO CONVENTIONALLY DOES A THING IS NOT A PROPERTY OF THE THING.
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**Rewritten by [ADR-237](../../../docs/decisions/ADR-237-end-to-end-execution-authority.md),
|
|
193
|
+
which supersedes ADR-235.** This section used to be a *preflight refusal*: a run
|
|
194
|
+
with no "runnable" open step created no branch and wrote nothing. That is gone.
|
|
195
|
+
The invocation is a delegation, so the question is no longer *is this step
|
|
196
|
+
runnable under current governance* but *is this step possible for the agent at
|
|
197
|
+
all.*
|
|
198
|
+
|
|
199
|
+
Run once at the end of the pre-scan, and again immediately before any `blocked`
|
|
200
|
+
report.
|
|
201
|
+
|
|
202
|
+
**The screen, in order:**
|
|
203
|
+
|
|
204
|
+
1. **Can the agent execute it?** Through the filesystem, git, `gh`, an API, a
|
|
205
|
+
CLI, a tool, a model, a council — anything machine-executable. If yes, the
|
|
206
|
+
step is **work**. Stop here; no blocker citation changes that.
|
|
207
|
+
2. **Is the authority already implied by the invocation?** For a `process-full`
|
|
208
|
+
run: branches, chunked commits, pushing that branch, opening and updating the
|
|
209
|
+
PR, reversible repository/branch settings, CI runs and re-runs, merge-base
|
|
210
|
+
updates, conflict resolution, project-local dependencies, and paid calls
|
|
211
|
+
inside the cumulative USD 25 ceiling. If yes → **run it**.
|
|
212
|
+
3. **Is it on the EXCLUDED list?** Merging to a production trunk, deploying,
|
|
213
|
+
production data / secrets / IAM / DNS, bulk deletion outside the roadmap's
|
|
214
|
+
scope, an irreversible external action beyond the PR itself. Those keep their
|
|
215
|
+
own this-turn confirmation ([`non-destructive-by-default`](../../rules/non-destructive-by-default.md))
|
|
216
|
+
and are a **halt**, not a blocker.
|
|
217
|
+
4. **Otherwise it is externally impossible**, and only then is it a blocker: a
|
|
218
|
+
credential that does not exist and cannot be created · a purchase beyond the
|
|
219
|
+
budget · physical hardware access · another person or organisation must act ·
|
|
220
|
+
a wait that is factually mandatory and unverifiable.
|
|
221
|
+
|
|
222
|
+
**A `## Blockers` entry is evidence, never a verdict.** A `Class: 3` label on an
|
|
223
|
+
action the agent can perform is a **defect in the roadmap**, and the run repairs
|
|
224
|
+
the label rather than obeying it — recording what it did and why. Class `0`/`1`
|
|
225
|
+
entries carry a `Run:` the agent executes, exactly as before. Class `2`
|
|
226
|
+
(consent-once) is pre-cleared for the duration of a `process-full` run when the
|
|
227
|
+
consent it wants is one the invocation already gave; a `2` asking for something
|
|
228
|
+
the invocation did NOT give (an EXCLUDED action, a spend crossing) still reaches
|
|
229
|
+
the owner.
|
|
230
|
+
|
|
231
|
+
**No citation → work**, and the default direction is unchanged: the failure this
|
|
232
|
+
screen must not have is declining work an agent could have done.
|
|
233
|
+
|
|
234
|
+
**A step this screen judges externally impossible carries a `blocked-by:` marker
|
|
235
|
+
on its own line.** The obligation is unchanged and its reason is unchanged: two
|
|
236
|
+
mechanisms read blockedness from two different places and only one reads this
|
|
237
|
+
section — `run-continuation`, the stop-slot concern that re-engages an autonomous
|
|
238
|
+
run, decides open-vs-blocked from the inline `<!-- blocked-by: <id> -->` marker
|
|
239
|
+
and never parses `## Blockers`. Without the marker a step that IS impossible
|
|
240
|
+
still counts as open work to the concern, which re-engages the agent into it
|
|
241
|
+
every stop fire until the stall rung fires — the mechanism whose job is to detect
|
|
242
|
+
a stall manufacturing one. **The residual is real and is not papered over:**
|
|
243
|
+
nothing enforces the pairing, so a `## Blockers` entry authored without its
|
|
244
|
+
marker is caught by review or not at all.
|
|
245
|
+
|
|
246
|
+
**The gaming vector inverted, and both directions are now named.** Under ADR-235
|
|
247
|
+
the vector was an agent writing itself a Class-3 blocker to stop early; the
|
|
248
|
+
defence was that a qualifying blocker must **pre-date the run**, checkable from
|
|
249
|
+
git. That defence is kept for the narrow blocker set that remains. ADR-237 adds
|
|
250
|
+
the opposite vector — an agent that keeps going past a spend ceiling or into an
|
|
251
|
+
EXCLUDED action under cover of "the roadmap needed it" — and its defences are
|
|
252
|
+
step 3 above being an enumerated list rather than a characterisation, and the
|
|
253
|
+
ceiling being cumulative per run rather than per action.
|
|
254
|
+
|
|
255
|
+
**One imprecision, inherited and now given a test.** The class taxonomy has no
|
|
256
|
+
row for *"waiting on time"* or *"waiting on another roadmap"*; both are authored
|
|
257
|
+
as `3` today because an absent `Class:` already means `3`. Under step 4 a wait is
|
|
258
|
+
a blocker only when it is factually mandatory and unverifiable — a soak window a
|
|
259
|
+
run can simply outlast, or a cross-roadmap dependency the run can satisfy itself,
|
|
260
|
+
is work. The taxonomy still lacks the row; the mislabel now has a stated test
|
|
261
|
+
instead of a default.
|
|
262
|
+
|
|
183
263
|
## 4. Resolve cadences — read once, cache for the run
|
|
184
264
|
|
|
185
265
|
Read both keys from `.agent-settings.yml` once and cache for the whole
|
|
@@ -430,6 +510,69 @@ artifact drafting, council enablement), not safety.
|
|
|
430
510
|
|
|
431
511
|
On halt: stop, surface state, do **not** auto-fix outside the failing step.
|
|
432
512
|
|
|
513
|
+
### Terminal outcomes — `complete`, or a genuine external impossibility
|
|
514
|
+
|
|
515
|
+
The halt list above answers *"what interrupts runnable work"*. This answers
|
|
516
|
+
*"what does the run report when the roadmap is not finished and the remaining
|
|
517
|
+
work is not the agent's to do"* — and under
|
|
518
|
+
[ADR-237](../../../docs/decisions/ADR-237-end-to-end-execution-authority.md) that
|
|
519
|
+
second set is much smaller than it looks.
|
|
520
|
+
|
|
521
|
+
**The measurement that motivated the old answer, and the reading that replaced
|
|
522
|
+
it.** Measured 2026-08-19 across the twelve most nearly complete roadmaps:
|
|
523
|
+
**zero** could reach `count_open == 0` in one PR, because every remaining step
|
|
524
|
+
needed "a human action" — flip branch protection, authorise paid spend, install a
|
|
525
|
+
binary, wait out a soak window, edit a file a hook denies. The census was sound.
|
|
526
|
+
The reading was not: it counted actions a human *conventionally* performs,
|
|
527
|
+
without asking per action whether a human was **necessary**. Flipping a branch
|
|
528
|
+
setting, pushing, opening a PR, re-running CI, updating a merge base, fixing a
|
|
529
|
+
test, spending inside a budget — the agent can do all of it. That is remediation
|
|
530
|
+
work, and a `process-full` invocation grants it.
|
|
531
|
+
|
|
532
|
+
Three outcomes, and only one of them is success:
|
|
533
|
+
|
|
534
|
+
| Outcome | When | What it reports |
|
|
535
|
+
|---|---|---|
|
|
536
|
+
| `complete` | `count_open == 0` and the PR is open | the roadmap is finished; archival check runs (§ 6) |
|
|
537
|
+
| `blocked` | every remaining open step is **externally impossible** for the agent | the work that DID close, plus the specific impossibility |
|
|
538
|
+
| a halt | one of the five conditions above fired | the halt, its evidence, and what remains |
|
|
539
|
+
|
|
540
|
+
`blocked-preflight` **no longer exists** (ADR-237 § 4). A run always starts.
|
|
541
|
+
|
|
542
|
+
```
|
|
543
|
+
`blocked` IS NEVER PRESENTED AS COMPLETION.
|
|
544
|
+
count_open STAYS > 0. NO CHECKBOX IS FLIPPED TO [~] TO REACH IT.
|
|
545
|
+
A PR OPENED ON A BLOCKED RUN IS LABELLED PARTIAL PROGRESS.
|
|
546
|
+
BEFORE REPORTING IT, ASK PER REMAINING STEP: CAN I DO THIS AT ALL?
|
|
547
|
+
ONE STEP THE AGENT COULD HAVE EXECUTED REJECTS THE CLAIM.
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
**Externally impossible — the whole list.** A required credential that does not
|
|
551
|
+
exist and the agent cannot create · a purchase beyond the delegated budget ·
|
|
552
|
+
physical hardware access · another person or organisation must act · a wait that
|
|
553
|
+
is factually mandatory and cannot be simulated or verified.
|
|
554
|
+
|
|
555
|
+
**Not externally impossible — every one of these is work.** An unprotected
|
|
556
|
+
branch · a branch to create · a push · a PR to open · a repository or branch
|
|
557
|
+
setting the agent can change · a workflow to start · CI to re-run · a merge base
|
|
558
|
+
to update · conflicts · failing tests · local configuration · a paid call under
|
|
559
|
+
the ceiling · "this could be risky" · "a maintainer should do this".
|
|
560
|
+
|
|
561
|
+
The `[~]` prohibition is load-bearing and was the one point the council split on.
|
|
562
|
+
Deferring a blocked step to `[~]` would let the run reach `count_open == 0` and
|
|
563
|
+
report completion — laundering unfinished work through a glyph, which is exactly
|
|
564
|
+
what Iron Law 3 of [`roadmap-progress-sync`](../../rules/roadmap-progress-sync.md)
|
|
565
|
+
exists to catch on the archival side. So the boxes stay open and the outcome
|
|
566
|
+
carries the truth instead. **ADR-237 keeps this clause verbatim** — narrowing
|
|
567
|
+
`blocked` makes it more important, not less, because a run with more authority
|
|
568
|
+
has more ways to reach a clean-looking count.
|
|
569
|
+
|
|
570
|
+
Revalidation is the second half of the same discipline: the set is recomputed at
|
|
571
|
+
the moment of reporting, because steps unblock during a run (a prerequisite
|
|
572
|
+
closes, a `Run:` succeeds, a peer merges, a setting the run itself changed). If
|
|
573
|
+
any remaining step is one the agent could execute, `blocked` is refused and the
|
|
574
|
+
loop continues.
|
|
575
|
+
|
|
433
576
|
### Forbidden non-halt reasons — agent-invented cautions
|
|
434
577
|
|
|
435
578
|
The halt list above is **exhaustive**. An agent running `process-full` (or any
|
|
@@ -446,9 +589,26 @@ a violation of the command and the user's will:
|
|
|
446
589
|
a phase boundary emits a non-blocking status line and the run **continues**;
|
|
447
590
|
the stop-and-wait reading of `phase-checkpoints` applies only to
|
|
448
591
|
`process-phase`.
|
|
592
|
+
- **"this step looks human-gated"** — the `blocked` outcome above is reached by
|
|
593
|
+
the § 3c test, never by a judgement about how a step feels. A step with no
|
|
594
|
+
qualifying blocker citation is runnable, and writing the citation yourself does
|
|
595
|
+
not make it one. This entry exists because the terminal outcome is the single
|
|
596
|
+
most abusable thing on this page.
|
|
597
|
+
- **"the branch is not protected" / "a branch must be created" / "a PR must be
|
|
598
|
+
opened" / "a GitHub setting must change" / "CI must be re-run" / "the merge
|
|
599
|
+
base needs updating" / "there are conflicts" / "tests fail"** — every one is
|
|
600
|
+
remediation work the invocation authorised (ADR-237 § 1). Do it.
|
|
601
|
+
- **"a paid service is needed"** — authorised up to a cumulative USD 25 per run
|
|
602
|
+
(§ Spend in the wrapper). Uncertainty about the exact cost is explicitly NOT a
|
|
603
|
+
reason to ask.
|
|
604
|
+
- **"a maintainer should do this"** when the agent can perform the same action
|
|
605
|
+
through git, `gh`, an API or a CLI. **Capability before role**: the role of the
|
|
606
|
+
person who conventionally does a thing is not a property of the thing.
|
|
449
607
|
|
|
450
608
|
If the work genuinely cannot continue, it will be because one of the five real
|
|
451
|
-
halt conditions fired
|
|
609
|
+
halt conditions fired, or because every remaining step is externally impossible
|
|
610
|
+
by the § 3c test — surface THAT, with the specific impossibility named, not a
|
|
611
|
+
manufactured caution and not a convention mistaken for a constraint.
|
|
452
612
|
|
|
453
613
|
### Non-halt — gating notes, "optional" tags
|
|
454
614
|
|
|
@@ -93,6 +93,8 @@ one shape the loop test above systematically misses, in both of its clauses.
|
|
|
93
93
|
available were wait, or stop and report, and 34 licensed neither more than 31
|
|
94
94
|
did. **The discriminator is the decision, not the digits.**
|
|
95
95
|
|
|
96
|
+
For CI, do not hand-write the loop: `ci_settle <pr>` (mechanics below).
|
|
97
|
+
|
|
96
98
|
So state it separately: pick **one** waiter for the condition and let it finish.
|
|
97
99
|
Where the harness re-invokes on completion, waiting costs nothing and polling
|
|
98
100
|
costs a turn per expiry — and every stacked waiter is a turn that arrives *after*
|
|
@@ -10,8 +10,14 @@ triggers:
|
|
|
10
10
|
- keyword: "already decided"
|
|
11
11
|
- keyword: "locked decision"
|
|
12
12
|
- keyword: "budget blocks"
|
|
13
|
+
- keyword: "adr-"
|
|
14
|
+
- keyword: "adrs"
|
|
15
|
+
- keyword: "superseded"
|
|
16
|
+
- keyword: "review_trigger"
|
|
17
|
+
- phrase: "the adr"
|
|
13
18
|
routes_to:
|
|
14
|
-
- "skill:
|
|
19
|
+
- "skill:ai-council"
|
|
20
|
+
- "skill:decision-record"
|
|
15
21
|
workspaces: [agent-config-maintainer, engineering]
|
|
16
22
|
packs: [meta]
|
|
17
23
|
collision_ok:
|
|
@@ -28,35 +34,133 @@ obligation_frequency: "per-task"
|
|
|
28
34
|
A LOCK IS A DECISION UNDER PAST CONDITIONS, NOT A PERMANENT LAW.
|
|
29
35
|
BENEFIT BLOCKED BY A LOCK → SURFACE + OFFER RE-EVALUATION.
|
|
30
36
|
NEVER SILENT COMPLIANCE. NEVER SILENT DROP OF A GOOD CHANGE.
|
|
37
|
+
RE-EVALUATION GOES TO THE COUNCIL FIRST, NOT TO THE USER FIRST.
|
|
38
|
+
THE USER IS REACHED FOR THE RESERVED SET — AND ALWAYS FOR IT.
|
|
39
|
+
NEVER CITE A LOCK YOU HAVE NOT EVALUATED THIS TURN.
|
|
31
40
|
```
|
|
32
41
|
|
|
33
42
|
An agent that finds a genuinely beneficial change blocked by a recorded
|
|
34
43
|
past decision — an honest-null eval verdict, a "don't relitigate"
|
|
35
44
|
memory or context note, a token-frugality/budget canon line, or an ADR —
|
|
36
|
-
does not quietly comply and drop the change. It surfaces the conflict
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
ceiling on what the package may ever become.
|
|
45
|
+
does not quietly comply and drop the change. It surfaces the conflict and
|
|
46
|
+
re-evaluates the lock — **in the council by default**, reaching the user only
|
|
47
|
+
for the reserved set below. Progress means adaptation: locks encode what was
|
|
48
|
+
true when they were written, not a ceiling on what the package may ever become.
|
|
49
|
+
|
|
50
|
+
**The default venue is the council, and this is a correction, not a new
|
|
51
|
+
policy.** [`ai-council`](../skills/ai-council/SKILL.md) has said since its own
|
|
52
|
+
Iron Law that *"a design decision the agent cannot settle from the tree goes to
|
|
53
|
+
the council first, not to the user first"*, and its class table already lists
|
|
54
|
+
"reopening a recorded decision". This rule used to say "offers the user a path",
|
|
55
|
+
which contradicted that and made every lock an owner interrupt. The measured
|
|
56
|
+
cost of the contradiction: across 26 days of transcripts, the agent reported a
|
|
57
|
+
lock and waited, and the owner had to void the decision retroactively before the
|
|
58
|
+
work resumed — in the two clearest cases the lock report is timestamped **before**
|
|
59
|
+
the override demand. The ordering was the defect; the permission was never
|
|
60
|
+
missing.
|
|
40
61
|
|
|
41
62
|
**Mechanism-match check comes FIRST**: a verdict settles the *mechanism it
|
|
42
63
|
tested*, not every future proposal that resembles it — if the blocked change
|
|
43
64
|
is a different mechanism, the lock does not apply; proceed, noting the
|
|
44
65
|
distinction.
|
|
45
66
|
|
|
46
|
-
|
|
67
|
+
## The five steps, carried here — the depth is elsewhere, the obligation is not
|
|
68
|
+
|
|
69
|
+
1. **Mechanism-match** (above) — different mechanism, no lock, proceed.
|
|
70
|
+
2. **Evaluate the lock before citing it.** An ADR may not be presented as a
|
|
71
|
+
reason not to act until its status, `review_trigger` state, amendments and
|
|
72
|
+
successors have been read. In this repository that is one command —
|
|
73
|
+
`./scripts-run src/scripts/adr_cite_check <ADR-NNN>`; elsewhere it is the
|
|
74
|
+
same four reads done by hand. A `superseded` / `deprecated` status means it is
|
|
75
|
+
not a live lock at all; a fired or indeterminate trigger means it is not an
|
|
76
|
+
**unqualified** one. `rejected` is NOT in the dead set — on an ADR it records
|
|
77
|
+
a rejected *proposal*, so the rejection binds until its premise is shown to
|
|
78
|
+
have changed.
|
|
79
|
+
3. **Surface** the change, the lock, the condition it recorded, and what has
|
|
80
|
+
changed since.
|
|
81
|
+
4. **Route it** — council by default (below), user only for the reserved set.
|
|
82
|
+
5. **Record** the outcome with scope and `revisit-if`.
|
|
83
|
+
|
|
84
|
+
These five are the obligation and they are stated here rather than only behind
|
|
85
|
+
a route, because the route was measurably unreachable: `decision-revisit-gate`
|
|
86
|
+
lives in the always-on `meta` pack while `decision-review` ships
|
|
87
|
+
`install.default: false` in the non-default `analysis-workbench` pack, so a
|
|
88
|
+
pack-legal install received the obligation and not the procedure. `routes_to`
|
|
89
|
+
now names two always-on skills; the backward-audit depth in
|
|
90
|
+
[`decision-review`](../skills/decision-review/SKILL.md) stays optional, which is
|
|
91
|
+
the correct status for depth.
|
|
92
|
+
|
|
93
|
+
Full catalog (honest nulls, don't-relitigate notes, budget-canon lines, ADRs,
|
|
94
|
+
hard structural caps), the per-step detail, when-NOT-to-fire and the failure
|
|
95
|
+
modes remain in [`skill:decision-review` § Decision-revisit gate — mechanics](../skills/decision-review/SKILL.md).
|
|
47
96
|
Trigger-set above activates this routing on demand, independent of the discipline profile (ADR-110).
|
|
48
97
|
|
|
98
|
+
## Who decides — the owner-reserved set
|
|
99
|
+
|
|
100
|
+
The discriminator, in one question: **does the proposed transition weaken an
|
|
101
|
+
owner-reserved invariant, or create an undelegated external, irreversible, or
|
|
102
|
+
destructive commitment?** No, and reversible inside the authorised envelope →
|
|
103
|
+
the council decides. Yes, or not establishable from tree evidence → the owner.
|
|
104
|
+
|
|
105
|
+
The routing unit is the **transition**, never the document: the same ADR may be
|
|
106
|
+
strengthened by the council and weakened only by the owner.
|
|
107
|
+
|
|
108
|
+
| Reserved to the owner | Council-decidable |
|
|
109
|
+
|---|---|
|
|
110
|
+
| Changes the project's purpose or a declared non-negotiable outcome | Any mechanism serving that purpose |
|
|
111
|
+
| **Lowers or removes** a recorded security / privacy / safety / data-handling floor | Strengthening a floor, or an equivalent swap above it |
|
|
112
|
+
| Irreversible or materially destructive | Reversible within the envelope |
|
|
113
|
+
| Spend or liability **above** a delegated threshold | Budgeted, threshold-bounded spend |
|
|
114
|
+
| Creates / removes / weakens a legal, regulatory, contractual, licensing, compatibility, or public commitment | Internal-only commitments |
|
|
115
|
+
| Governance self-amendment — reopening authority, quorum, escalation, this set | What the rules already permit |
|
|
116
|
+
| Cannot be bounded from available evidence | Bounded, with the evidence cited |
|
|
117
|
+
|
|
118
|
+
Council split, abstention, or no quorum is an **escalation condition**, not a
|
|
119
|
+
class: that transition escalates, the ADR does not become owner-reserved
|
|
120
|
+
forever. Availability is `agent-config council:status`, never a project file
|
|
121
|
+
([`council-availability`](council-availability.md)).
|
|
122
|
+
|
|
123
|
+
Field on the ADR: `reopen_policy: directional | owner | unclassified`, absent →
|
|
124
|
+
**`unclassified`**, which permits council investigation and reversible
|
|
125
|
+
experiments and gates only execution of a reserved transition. Absent is
|
|
126
|
+
deliberately not `owner`: with 146 accepted ADRs that default would encode
|
|
127
|
+
today's blockage into the new schema. Full contract, the reopen record, and the
|
|
128
|
+
precedent-creates-no-authority clause: [`adr-layout § Reopen authority`](../docs/contracts/adr-layout.md).
|
|
129
|
+
|
|
49
130
|
## See also
|
|
50
131
|
|
|
132
|
+
- [`recurring-criticism`](recurring-criticism.md) — the **other entrance**: this
|
|
133
|
+
rule fires when a lock blocks a change, that one when the same criticism arrives
|
|
134
|
+
again. It reuses the five steps and the owner-reserved table below.
|
|
51
135
|
- [`decision-review`](../skills/decision-review/SKILL.md) — the backward-audit
|
|
52
136
|
procedure + the migrated gate mechanics.
|
|
53
137
|
- [`ai-council`](../skills/ai-council/SKILL.md) — the re-evaluation mechanism;
|
|
54
138
|
owns the convergence-summary scope + `revisit-if` contract.
|
|
55
139
|
- [`decision-record`](../skills/decision-record/SKILL.md) — forward-flow decision
|
|
56
|
-
locking;
|
|
140
|
+
locking; its **§ 4 Lock the choice + consequences** requires the `Revisit-if:`
|
|
141
|
+
line that names the reopening condition up front. (This pointer used to cite an
|
|
142
|
+
"escalation litmus" heading; `grep` over `src/` + `docs/` returns two hits and
|
|
143
|
+
neither is in that file — the heading never existed, so the pointer led
|
|
144
|
+
nowhere. Corrected to the section that carries the obligation.)
|
|
57
145
|
- [`token-budget-discipline`](token-budget-discipline.md) — the frugality-canon
|
|
58
146
|
value-over-budget escalation this rule's budget-lock case defers to.
|
|
59
147
|
- [`no-cheap-questions`](no-cheap-questions.md) — the question-quality floor a
|
|
60
148
|
revisit-offer must still clear.
|
|
61
149
|
- [`ask-when-uncertain`](ask-when-uncertain.md) — the numbered-options shape
|
|
62
150
|
used to present the revisit offer.
|
|
151
|
+
|
|
152
|
+
## Honest enforcement — `enforced_by: none`
|
|
153
|
+
|
|
154
|
+
`adr_cite_check` is deterministic where it runs, and nothing makes it run. No
|
|
155
|
+
gate can observe an agent citing a decision it never opened, so step 2 above is
|
|
156
|
+
model-carried — the same honesty boundary
|
|
157
|
+
[`security-sensitive-stop`](security-sensitive-stop.md) and
|
|
158
|
+
[`active-remediation`](active-remediation.md) state for their own obligations.
|
|
159
|
+
|
|
160
|
+
Two reach limits, named rather than implied. The tool lives in this repository's
|
|
161
|
+
`src/scripts/` and is **not** exposed as an `agent-config` verb, so a consumer
|
|
162
|
+
install performs step 2 by hand; wiring the verb touches six further surfaces
|
|
163
|
+
plus the curated `dist/agent-src/scripts/` list and is deliberately out of this
|
|
164
|
+
change. And `docs/decisions/` is projected into no agent-visible tree at all —
|
|
165
|
+
the agent sees ADR *numbers* cited across rules and skills, almost never ADR
|
|
166
|
+
*text*. Until that changes, "evaluate before citing" means opening the file.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "auto"
|
|
3
|
+
tier: "2a"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
description: "Saw a red check or a real defect — fix it, whoever wrote it; if you cannot, ship a tracked follow-up roadmap in the same change. Ownership is never a disposition"
|
|
6
|
+
# Due when a defect is OBSERVED, not on a clock: a turn that sees nothing owes
|
|
7
|
+
# nothing; a turn that sees a red check owes a disposition.
|
|
8
|
+
obligation_frequency: "per-event"
|
|
9
|
+
routes_to:
|
|
10
|
+
- "guideline:agent-infra/active-remediation-mechanics"
|
|
11
|
+
triggers:
|
|
12
|
+
- keyword: "failing"
|
|
13
|
+
- keyword: "fails"
|
|
14
|
+
- keyword: "broken"
|
|
15
|
+
- keyword: "regression"
|
|
16
|
+
- phrase: "is red"
|
|
17
|
+
- phrase: "ci failed"
|
|
18
|
+
- phrase: "ci is"
|
|
19
|
+
- phrase: "not my"
|
|
20
|
+
- phrase: "nicht mein"
|
|
21
|
+
- phrase: "someone else's"
|
|
22
|
+
- phrase: "whose test"
|
|
23
|
+
workspaces: [engineering]
|
|
24
|
+
packs: [engineering-base]
|
|
25
|
+
enforced_by:
|
|
26
|
+
- "none"
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
# Fix What You See
|
|
30
|
+
|
|
31
|
+
## The Iron Law
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
YOU SAW IT, YOU FIX IT — WHOEVER WROTE IT.
|
|
35
|
+
"NOT MY CODE" / "NOT MY TEST" / "ANOTHER SESSION OWNS THAT FILE" IS NOT A
|
|
36
|
+
DISPOSITION. CANNOT FIX IT NOW → A TRACKED FOLLOW-UP ROADMAP SHIPS IN THE
|
|
37
|
+
SAME CHANGE. A CHAT MENTION IS NOT ONE EITHER, NOR A "KNOWN-OPEN" LINE IN A
|
|
38
|
+
PR BODY. A RED CHECK IS NEVER HANDED BACK WITH ITS CAUSE NAMED AND UNFIXED.
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Saw it** = a red check already in front of you (test, lint, type, CI), or a
|
|
42
|
+
defect you pass while working — in your diff, a neighbouring file, a file
|
|
43
|
+
another agent or a parallel session wrote. The author is irrelevant.
|
|
44
|
+
|
|
45
|
+
**Two dispositions, and only two:** fix it with its verification, or land a
|
|
46
|
+
roadmap under `agents/roadmaps/` in the SAME change naming the defect, its
|
|
47
|
+
evidence, and what closes it.
|
|
48
|
+
|
|
49
|
+
**Read the red before fixing it, with the narrowest tool.** A CI job:
|
|
50
|
+
`gh run view --job <id> --log-failed | grep -E '×|FAIL|Error'` — never the whole
|
|
51
|
+
log into context, and never `--watch`'s exit code, which is 0 even on a failure.
|
|
52
|
+
A local red: the test runner with a filter on the one failing name, `tsc
|
|
53
|
+
--noEmit` for a type error, the linter scoped to the changed files. **Reproduce
|
|
54
|
+
it before you believe your diagnosis** — an environment-dependent red reproduces
|
|
55
|
+
under the condition, not on your machine's defaults.
|
|
56
|
+
|
|
57
|
+
Match the probe to the surface, because a passing unit test is not evidence for
|
|
58
|
+
a broken surface: an HTTP red is proven with `curl` against the running
|
|
59
|
+
endpoint, a UI red with a Playwright spec, a runtime red with the debugger
|
|
60
|
+
(`xdebug`, breakpoints) rather than by reading the diff again.
|
|
61
|
+
|
|
62
|
+
**Prove the fix with the same tool that showed the red**, in the same change.
|
|
63
|
+
For a guard or a concurrency fix, prove SENSITIVITY too: neutralise the mechanism,
|
|
64
|
+
watch the test fail, restore it. A test never seen red has unknown sensitivity.
|
|
65
|
+
|
|
66
|
+
## Bounds
|
|
67
|
+
|
|
68
|
+
Removes *ownership* as an excuse, not the diff limit:
|
|
69
|
+
[`minimal-safe-diff`](minimal-safe-diff.md) still caps the change — too large
|
|
70
|
+
IS the roadmap case. A fix crossing
|
|
71
|
+
[`non-destructive-by-default`](non-destructive-by-default.md) still stops and
|
|
72
|
+
asks; the ask becomes the work, not the exit.
|
|
73
|
+
|
|
74
|
+
**Does NOT fire:** user fenced the scope this turn · no falsifiable break (a
|
|
75
|
+
preference, not a red) · already decided by the user.
|
|
76
|
+
|
|
77
|
+
## Why separate from `active-remediation`
|
|
78
|
+
|
|
79
|
+
That rule forbids ignoring a spotted issue and its ladder permits **note + ask**.
|
|
80
|
+
Two properties made it insufficient, both measured 2026-08-20: it is `type: auto`
|
|
81
|
+
on `refactor`/`legacy`/`cleanup` triggers — **none of which a failing CI job
|
|
82
|
+
matches**, so it does not load when the obligation matters most — and its
|
|
83
|
+
note-and-ask tier is what let a session name a red check's cause, name the
|
|
84
|
+
file's author, and hand it back still red.
|
|
85
|
+
|
|
86
|
+
Mechanics (fix-now size criteria, follow-up shape) stay there; this rule only
|
|
87
|
+
deletes the two escapes.
|
|
88
|
+
|
|
89
|
+
## Honest activation gap — this rule is `auto`, and it wanted to be `always`
|
|
90
|
+
|
|
91
|
+
It shipped `auto` for a budget reason, not a design one, and the gap that leaves
|
|
92
|
+
is exactly the one it was written to close: **a red check the agent sees in tool
|
|
93
|
+
output triggers nothing.** Keyword triggers match the PROMPT. So the rule loads
|
|
94
|
+
when a human says "CI is red" or "not my test", and does NOT load when a test
|
|
95
|
+
run comes back red and nobody has said a word.
|
|
96
|
+
|
|
97
|
+
`check_always_budget` is the reason: the extended always-budget sat at
|
|
98
|
+
60,252 / 60,254 chars — **two characters of headroom** — and the cap is a
|
|
99
|
+
ratchet that may only move down. The other nine always-rules are the kernel,
|
|
100
|
+
which `block_kernel_rule_writes` denies agent writes to, so no room can be made
|
|
101
|
+
from this side. A 2,332-char rule puts the total at 103.9 %.
|
|
102
|
+
|
|
103
|
+
Closing the gap needs one of: the ext-cap ratchet opened deliberately (a
|
|
104
|
+
maintainer decision, recorded), a kernel rule shortened to make room, or a
|
|
105
|
+
`post_tool_use` carrier that notices a non-zero verification exit — the only
|
|
106
|
+
option that would fire on tool output rather than on wording. Until then, `auto`
|
|
107
|
+
plus this paragraph is the honest state: the obligation is real, its delivery is
|
|
108
|
+
partial, and the partiality is named rather than implied away.
|
|
@@ -3,11 +3,6 @@ type: "auto"
|
|
|
3
3
|
tier: "mechanical-already"
|
|
4
4
|
description: "Linking transient files (agents/roadmaps/, agents/runtime/council/) from stable artifacts — both expire; promote findings"
|
|
5
5
|
alwaysApply: false
|
|
6
|
-
triggers:
|
|
7
|
-
- path_prefix: "agents/roadmaps/"
|
|
8
|
-
- path_prefix: "agents/runtime/council/questions/"
|
|
9
|
-
- path_prefix: "agents/runtime/council/responses/"
|
|
10
|
-
- path_prefix: "agents/runtime/council/sessions/"
|
|
11
6
|
routes_to:
|
|
12
7
|
- "skill:ai-council"
|
|
13
8
|
- "skill:agent-docs-writing"
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "auto"
|
|
3
|
+
tier: "2b"
|
|
4
|
+
description: "The same criticism arriving again indicts the system, not only the item — reopen the disposition that dismissed it, resolve on evidence, never on the repetition count"
|
|
5
|
+
alwaysApply: false
|
|
6
|
+
triggers:
|
|
7
|
+
- phrase: "schon mehrfach"
|
|
8
|
+
- phrase: "schon wieder"
|
|
9
|
+
- phrase: "zum dritten mal"
|
|
10
|
+
- phrase: "wie oft noch"
|
|
11
|
+
- phrase: "wie oft soll ich"
|
|
12
|
+
- phrase: "immer noch nicht"
|
|
13
|
+
- phrase: "i already told you"
|
|
14
|
+
- phrase: "told you this"
|
|
15
|
+
- phrase: "how many times"
|
|
16
|
+
- phrase: "as i mentioned before"
|
|
17
|
+
routes_to:
|
|
18
|
+
- "guideline:agent-infra/recurring-criticism-mechanics"
|
|
19
|
+
- "skill:skill-improvement-pipeline"
|
|
20
|
+
workspaces: [agent-config-maintainer, engineering]
|
|
21
|
+
packs: [meta]
|
|
22
|
+
collision_ok:
|
|
23
|
+
"schon wieder": "active-remediation makes a user 'leave it' terminal against the AGENT re-raising a closed item; this rule fires only when the USER brings it back — a decision-maker reopening their own decision is not the nagging that rule prevents"
|
|
24
|
+
obligation_frequency: "per-task"
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# Recurring Criticism
|
|
28
|
+
|
|
29
|
+
[`decision-revisit-gate`](decision-revisit-gate.md) has one entrance: the agent
|
|
30
|
+
wants to act and a lock is in the way. This is the other — **the same criticism
|
|
31
|
+
arrives again**, from the user or from a re-arrived artifact.
|
|
32
|
+
|
|
33
|
+
## The Iron Law
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
THE SAME CRITICISM ARRIVING AGAIN IS EVIDENCE ABOUT THE SYSTEM,
|
|
37
|
+
NOT ONLY ABOUT THE ITEM.
|
|
38
|
+
REOPEN THE DISPOSITION THAT DISMISSED IT. NAME WHICH ASSUMPTION BROKE.
|
|
39
|
+
NEVER RESOLVE IT ON THE REPETITION COUNT — RESOLVE IT ON EVIDENCE.
|
|
40
|
+
CAPITULATING BECAUSE IT WAS SAID TWICE IS THE SAME FAILURE
|
|
41
|
+
AS DISMISSING IT TWICE.
|
|
42
|
+
A LEARNING THAT DOES NOT CONSTRAIN THE NEXT RUN IS NOT A LEARNING.
|
|
43
|
+
NEVER BUY A HARDENING BY WEAKENING A SAFETY FLOOR.
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**The repetition reverses the burden of proof.** The standing rule is: same
|
|
47
|
+
mechanism, no new evidence → the lock applies. Recurrence *is* the new evidence —
|
|
48
|
+
not that the item is right, that the disposition did not hold. Whoever keeps the
|
|
49
|
+
lock now carries the argument. **Mechanism-match still runs first**: a complaint
|
|
50
|
+
resembling the old one but testing a different mechanism is a new finding.
|
|
51
|
+
|
|
52
|
+
**Resolve on evidence, never on the count.** Challenging a model's answer —
|
|
53
|
+
including a correct one — reliably makes it capitulate and revise toward the
|
|
54
|
+
perceived expectation rather than toward truth
|
|
55
|
+
<!-- harvest:reflection-sycophancy-flipflop -->, so a rule reading "said twice" as
|
|
56
|
+
proof of error would be that failure mode with a procedure attached. The
|
|
57
|
+
repetition opens the question; it never answers it.
|
|
58
|
+
|
|
59
|
+
## Exactly three outcomes
|
|
60
|
+
|
|
61
|
+
The repetition proves the **system** failed <!-- harvest:recurrence-indicts-the-system -->;
|
|
62
|
+
it does not prove the **decision** was wrong. Own analysis, from that split:
|
|
63
|
+
|
|
64
|
+
| Outcome | What actually broke | Hardening means |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| The disposition was **wrong** | the decision | reverse it, record what would have caught it |
|
|
67
|
+
| **Right, never recorded** | the record | make it durable + citable, with `revisit-if` |
|
|
68
|
+
| **Right, recorded, unreachable** | reachability | move it onto a surface the next run reads |
|
|
69
|
+
|
|
70
|
+
In all three the system failed — only in the first was the decision wrong. A
|
|
71
|
+
resolution naming none of them is an unresolved recurrence.
|
|
72
|
+
|
|
73
|
+
**Look up the earlier disposition before re-deriving anything, and name the store
|
|
74
|
+
you checked** — addresses, the mechanism-is-the-defect classification, the
|
|
75
|
+
hardening floor and the failure modes are in
|
|
76
|
+
[`recurring-criticism-mechanics`](../docs/guidelines/agent-infra/recurring-criticism-mechanics.md).
|
|
77
|
+
One line does not migrate, because acting on it wrong is silent: rejections live in
|
|
78
|
+
analysis prose by design, so "I found nothing" means *prose was grepped*, never
|
|
79
|
+
*nothing was decided*.
|
|
80
|
+
|
|
81
|
+
## When NOT to fire
|
|
82
|
+
|
|
83
|
+
- **A repeated task instruction**, not a criticism — that is an instruction, do it.
|
|
84
|
+
- **Mechanism-match fails** — a resemblance is not a recurrence.
|
|
85
|
+
- **The agent is the one repeating** — that is [`no-cheap-questions`](no-cheap-questions.md).
|
|
86
|
+
- **Already resolved this task.** Once decided, it is decided.
|
|
87
|
+
|
|
88
|
+
## Honest enforcement — `enforced_by: none`
|
|
89
|
+
|
|
90
|
+
One narrow deterministic signal exists. `src/scripts/_lib/self_repair.ts` keeps one
|
|
91
|
+
record per defect fingerprint with an `occurrences` counter and reopens a released
|
|
92
|
+
record when the user re-reports it — literally this rule's trigger state — and the
|
|
93
|
+
injected queue line now carries that number, so above 1 an agent sees it. Three
|
|
94
|
+
limits: `agents/runtime/` is gitignored, so the store is one machine's and empty on
|
|
95
|
+
a fresh checkout; it covers only defects the complaint detector matched, where a
|
|
96
|
+
phrasing outside the added patterns is a paraphrase away from silence; and it is
|
|
97
|
+
hook-carried, so on a host without the slot nothing fires.
|
|
98
|
+
|
|
99
|
+
The rest is model-carried, named rather than implied: **nothing** observes whether
|
|
100
|
+
the earlier disposition was opened, for rejections there is nothing structured to
|
|
101
|
+
open, and no gate can tell a resolution that named one of the three outcomes from
|
|
102
|
+
one that asserted it. Claiming the counter as coverage for any of that would
|
|
103
|
+
inflate it, so it is not claimed — skipping this rule is caught by nothing.
|
|
104
|
+
|
|
105
|
+
## See also
|
|
106
|
+
|
|
107
|
+
- [`decision-revisit-gate`](decision-revisit-gate.md) — the other entrance; owns the five steps and the owner-reserved routing this rule reuses instead of restating. Separate file only because that one sits four lines under the 200-line cap.
|
|
108
|
+
- [`self-repair-loop`](self-repair-loop.md) — the single-occurrence intake; this rule is what its `occurrences` counter is for.
|
|
109
|
+
- [`active-remediation`](active-remediation.md) — the terminal "leave it" this rule does not override (see `collision_ok`).
|
|
110
|
+
- [`/analyze:inbox`](../domains/analysis-workbench/analyze/inbox/command.md) § Phase 4c — the artifact-side detection that routes here.
|
|
@@ -29,7 +29,7 @@ ANY ROADMAP TOUCH → REGENERATE THE DASHBOARD, SAME RESPONSE.
|
|
|
29
29
|
NO EXCEPTIONS. NO "I'LL DO IT AT THE END". NO BATCHING ACROSS TURNS.
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
Roadmap touch = create / rename / delete / move file, add/rename/remove a phase, OR flip any checkbox (`[ ]` ↔ `[x]` ↔ `[~]` ↔ `[-]`). Regen command: `./agent-config roadmap:progress
|
|
32
|
+
Roadmap touch = create / rename / delete / move file, add/rename/remove a phase, OR flip any checkbox (`[ ]` ↔ `[x]` ↔ `[~]` ↔ `[-]`). Regen command: `./agent-config roadmap:progress` — it passes `--archive`, so a roadmap at `count_open == 0` with no deferred item and no open blocker is `git mv`'d to `archive/` by the same run, not reported for someone to do later. `--check` never archives, and the PostToolUse hook never archives (contract + the council's recorded dissent: the `--archive` block in `update_roadmap_progress.ts`).
|
|
33
33
|
|
|
34
34
|
## Iron Law 2 — real-time checkbox cadence (autonomous execution)
|
|
35
35
|
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
type: "auto"
|
|
3
3
|
tier: "2a"
|
|
4
4
|
description: "Creating/editing rules, or auditing rule types — decides when a rule should be always vs auto"
|
|
5
|
-
triggers:
|
|
6
|
-
- path_prefix: "src/rules/"
|
|
7
5
|
routes_to:
|
|
8
6
|
- "guideline:agent-infra/rule-type-governance"
|
|
9
7
|
workspaces: [agent-config-maintainer]
|
|
@@ -52,6 +52,16 @@ work, not a notification:
|
|
|
52
52
|
the user's call, per
|
|
53
53
|
[`non-destructive-by-default`](non-destructive-by-default.md).
|
|
54
54
|
|
|
55
|
+
**When the line says the record has recurred, step 2 changes target.** The store
|
|
56
|
+
keeps one record per fingerprint and increments it, so a repeat does not raise
|
|
57
|
+
`count` — the line now carries the newest record's `occurrences` instead, and
|
|
58
|
+
above 1 it is the only deterministic "this came back" signal in the session. A
|
|
59
|
+
recurrence means the *earlier* fix or dismissal did not hold, so the surface that
|
|
60
|
+
failed is the one that let it be closed prematurely, not only the one that let the
|
|
61
|
+
behaviour happen. Resolve it through
|
|
62
|
+
[`recurring-criticism`](recurring-criticism.md) — which also states the part that
|
|
63
|
+
matters most here: resolve on evidence, never on the repetition count.
|
|
64
|
+
|
|
55
65
|
## Correct openly, never silently
|
|
56
66
|
|
|
57
67
|
Reported by the user → redo the task properly in the same turn, visibly, saying
|
|
@@ -84,6 +94,13 @@ The user is criticising the **code**, not the agent's conduct; the fingerprint
|
|
|
84
94
|
is already an open record (the hook increments it); or a one-off caused by
|
|
85
95
|
information the agent could not have had — note it, do not queue it.
|
|
86
96
|
|
|
97
|
+
**The already-an-open-record case suppresses a duplicate QUEUE ENTRY, never the
|
|
98
|
+
response.** Read on its own the clause above inverts into "it came back, so do
|
|
99
|
+
nothing new", which is the opposite of what a repeat means. The counter exists
|
|
100
|
+
precisely so a recurrence is visible without a second entry: no new record, and a
|
|
101
|
+
**stronger** obligation — [`recurring-criticism`](recurring-criticism.md) fires,
|
|
102
|
+
because the earlier disposition demonstrably did not hold.
|
|
103
|
+
|
|
87
104
|
## Enforcement
|
|
88
105
|
|
|
89
106
|
The hook is `fail_closed: false` and always exits 0: it records, it never
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
type: "auto"
|
|
3
3
|
tier: "mechanical-already"
|
|
4
4
|
description: "Creating/editing/reviewing skills — minimum quality standard; every skill executable, validated, self-contained"
|
|
5
|
-
triggers:
|
|
6
|
-
- path_prefix: "src/skills/"
|
|
7
5
|
routes_to:
|
|
8
6
|
- "guideline:agent-infra/skill-quality-checklist"
|
|
9
7
|
workspaces: [agent-config-maintainer]
|