@event4u/agent-config 9.24.0 → 9.25.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 +49 -0
- package/README.md +1 -1
- package/dist/agent-src/commands/analyze/conformance.md +182 -0
- package/dist/agent-src/commands/analyze/inbox.md +33 -2
- package/dist/agent-src/rules/decision-revisit-gate.md +2 -0
- package/dist/agent-src/rules/evaluator-independence.md +105 -0
- package/dist/agent-src/rules/session-canary.md +13 -1
- package/dist/agent-src/rules/user-interaction.md +22 -0
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +1 -1
- package/dist/agent-src/skills/rule-writing/SKILL.md +45 -0
- package/dist/agent-src/skills/skill-writing/SKILL.md +114 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/cli/registry.js +1 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +65 -18
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- 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 +1026 -328
- package/dist/mcp/registry-manifest.json +2 -2
- package/dist/mcp/server.json +2 -2
- package/dist/router.json +1 -1
- package/package.json +1 -1
- package/src/config/evaluator-budgets.json +68 -68
- package/src/config/gate-coverage.yml +103 -5
- package/src/config/gate-violation-baselines.json +11 -6
- package/src/scripts/_dispatch.bash +12 -0
- package/src/scripts/before_complete_hook.ts +127 -5
- package/src/scripts/check_depth_budget.ts +295 -0
- package/src/scripts/conformance_scan.ts +392 -0
- package/src/scripts/git_authorization_hook.ts +263 -0
- package/src/scripts/hook_manifest.yaml +50 -9
- package/src/scripts/hooks/block_unauthorized_git.ts +254 -0
- package/src/scripts/hooks/concern_registry.ts +8 -0
- package/src/scripts/hooks/evidence_independence.ts +334 -0
- package/src/scripts/language_mirror_hook.ts +267 -0
- package/src/scripts/lint_decision_impact.ts +246 -0
- package/src/scripts/lint_example_fences.ts +609 -0
- package/src/scripts/lint_rule_interactions.ts +90 -0
- package/src/scripts/lint_rule_migration_ledger.ts +480 -0
- package/src/scripts/lint_skill_descriptions.ts +86 -2
- package/src/scripts/schemas/rule.schema.json +10 -0
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
8
|
"description": "Bootstrap shim for the event4u agent-config suite. This plugin ships ONLY the dispatcher hooks plus one install-pointer skill — ALL content (skills, rules, commands) is installed via `npx -y @event4u/agent-config init`, which writes the file projection AND registers the same hooks in ~/.claude/settings.json. DEPRECATED as a content channel; kept so the marketplace listing stays discoverable and existing installs keep working hooks.",
|
|
9
|
-
"version": "9.
|
|
9
|
+
"version": "9.25.0",
|
|
10
10
|
"keywords": [
|
|
11
11
|
"agent-config",
|
|
12
12
|
"skills",
|
package/CHANGELOG.md
CHANGED
|
@@ -303,6 +303,55 @@ Entry-shape contract: [`docs/contracts/CHANGELOG-conventions.md`](docs/contracts
|
|
|
303
303
|
> that forces a new era split (`# Era: 9.24.x`, etc.) — see
|
|
304
304
|
> [`docs/contracts/CHANGELOG-conventions.md § Era splits`](docs/contracts/CHANGELOG-conventions.md).
|
|
305
305
|
|
|
306
|
+
## [9.25.0](https://github.com/event4u-app/agent-config/compare/9.24.0...9.25.0) (2026-08-06)
|
|
307
|
+
|
|
308
|
+
### Release highlights
|
|
309
|
+
|
|
310
|
+
<!-- Curated head: fill before merge, keep it under 10 lines, and leave `_none_` where it is genuinely the answer. The generated log below is unchanged. -->
|
|
311
|
+
- **Behaviour changes:** _auto-derived, rewrite before merge:_ rule/schema diffs, breaking commits or removed public surface in 5d653e2, 00018c4, 20bb411, cb0917d, 7641291.
|
|
312
|
+
- **Default changes + migration:** _auto-derived, rewrite before merge:_ commits naming a default, migration or migrate in bd45f62, 11a699c.
|
|
313
|
+
- **Security and correctness:** _none_
|
|
314
|
+
- **Honest nulls:** _auto-derived, rewrite before merge:_ commits carrying an honest-null marker in 5d653e2, 20bb411.
|
|
315
|
+
- **Known limitations:** _none_
|
|
316
|
+
|
|
317
|
+
### Features
|
|
318
|
+
|
|
319
|
+
* **commands:** add /analyze:conformance, and clear the six red CI checks ([5d653e2](https://github.com/event4u-app/agent-config/commit/5d653e2ecfa1b697c7c44a94087d0248debea3d9))
|
|
320
|
+
* **cli:** add conformance:behavior — replay transcripts through the shipped gates ([7c7a9dc](https://github.com/event4u-app/agent-config/commit/7c7a9dc10d83245b7507cbcef348e52901968c45))
|
|
321
|
+
* **hooks:** gate the language pin, git authorization and evaluator independence ([582a9f3](https://github.com/event4u-app/agent-config/commit/582a9f37b97d3cb1f6474963fea576349f6b0b5d))
|
|
322
|
+
* **authoring:** a decision-impact class, and four conventions Phase 2 owed ([7641291](https://github.com/event4u-app/agent-config/commit/7641291866dac3c24deaf4cea1827a6c24d63edb))
|
|
323
|
+
* **ledger:** record what the rule-body migration kept, folded, and lost ([11a699c](https://github.com/event4u-app/agent-config/commit/11a699cda54c2eca55899af25435aee80a6b7f75))
|
|
324
|
+
* **skill-writing:** two conventions that travel with the artifact ([9120d0f](https://github.com/event4u-app/agent-config/commit/9120d0ffd1d8ea7140f9cc393e34c595dba29085))
|
|
325
|
+
* **interactions:** close the register over the set it claims to cover ([654837b](https://github.com/event4u-app/agent-config/commit/654837b1b8c3e33a43539d256bcd18592ade6621))
|
|
326
|
+
* **descriptions:** reject a description that argues against its siblings ([9889529](https://github.com/event4u-app/agent-config/commit/9889529bcb34e604fd2bedde3ab2abf98e3f6a40))
|
|
327
|
+
* **gates:** lint authored examples, and cap the on-demand depth layer ([c2c2d91](https://github.com/event4u-app/agent-config/commit/c2c2d917cede10eab64144ac9302857f6edd80b5))
|
|
328
|
+
|
|
329
|
+
### Bug Fixes
|
|
330
|
+
|
|
331
|
+
* **rules:** clear a lint regression and register the new rule in the router ([00018c4](https://github.com/event4u-app/agent-config/commit/00018c4315269467b856713ec056f2c61982ca33))
|
|
332
|
+
* **roadmap:** drop the duplicate un-archived copy ([532200a](https://github.com/event4u-app/agent-config/commit/532200ac94966a83df0a97e0c48e02e240d72c3f))
|
|
333
|
+
* **hooks:** stop counting vacuous verification as evidence ([7696e54](https://github.com/event4u-app/agent-config/commit/7696e5453b770d200e2925204cba4e08f323ca7b))
|
|
334
|
+
* **ci:** bump the gate-script population and regenerate the artefact index ([21a16f1](https://github.com/event4u-app/agent-config/commit/21a16f15a04c1c6b515832ddf56a951fce6b16d1))
|
|
335
|
+
* **schema:** insert decision_impact surgically instead of reserialising the file ([cb0917d](https://github.com/event4u-app/agent-config/commit/cb0917daca7080b2e5446473b6e420b854554d5e))
|
|
336
|
+
|
|
337
|
+
### Documentation
|
|
338
|
+
|
|
339
|
+
* **analyze-conformance:** adopt the checked-out-branch default from its sibling ([bd45f62](https://github.com/event4u-app/agent-config/commit/bd45f62e52edb86fd4e22cc8828a819a60788ae7))
|
|
340
|
+
* **analyze-inbox:** run in the checked-out branch; worktree only on request ([aaf29b4](https://github.com/event4u-app/agent-config/commit/aaf29b466e4df37236e32fd588077c83f51f5483))
|
|
341
|
+
* **roadmap:** record the conformance audit and close its roadmap ([1616c23](https://github.com/event4u-app/agent-config/commit/1616c236d4e47b0bc77af6521a2db23419760f75))
|
|
342
|
+
* **rules:** add evaluator-independence, and downgrade two enforcement claims ([20bb411](https://github.com/event4u-app/agent-config/commit/20bb4116d7d0a2dec198d4e08ade4371ff802b8a))
|
|
343
|
+
* **roadmap:** close and archive the authoring-discipline roadmap ([977ebd9](https://github.com/event4u-app/agent-config/commit/977ebd9a3771eaeb42b631cd9660bf4b16d0d1ae))
|
|
344
|
+
* **roadmap:** record the second execution pass and its three measured departures ([ec1acfb](https://github.com/event4u-app/agent-config/commit/ec1acfbfc5718a2197bdc9ca5cdcc091ba3a410c))
|
|
345
|
+
* **roadmap:** close Phase 4 steps 1-3 and 5, with what changed from the plan ([87d4bd2](https://github.com/event4u-app/agent-config/commit/87d4bd24e5f2b7f1e7429ba016e7d473aec00fa7))
|
|
346
|
+
|
|
347
|
+
### Chores
|
|
348
|
+
|
|
349
|
+
* **docs:** regenerate the artefact index for /analyze:conformance ([d1f8f25](https://github.com/event4u-app/agent-config/commit/d1f8f25105b8df849160b2b62e78a84f555d8222))
|
|
350
|
+
* **docs:** regenerate the artefact index for the new rule ([910555a](https://github.com/event4u-app/agent-config/commit/910555a46f5345352e8dd6a950a370ac53019fa1))
|
|
351
|
+
* **sync:** regenerate the projections for the two authoring skills ([44f037e](https://github.com/event4u-app/agent-config/commit/44f037efc1d92d07f6efed30ecb4cb612b2bb55a))
|
|
352
|
+
|
|
353
|
+
Tests: 11443 (+134 since 9.24.0)
|
|
354
|
+
|
|
306
355
|
## [9.24.0](https://github.com/event4u-app/agent-config/compare/9.23.0...9.24.0) (2026-08-06)
|
|
307
356
|
|
|
308
357
|
### Release highlights
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
[](https://github.com/event4u-app/agent-config/actions/workflows/smoke.yml) [](https://github.com/event4u-app/agent-config/actions/workflows/smoke-public-install.yml) [](https://www.npmjs.com/package/@event4u/agent-config) [](https://glama.ai/mcp/servers/event4u-app/agent-config) [](https://mcptoplist.com/server/glama%2Fevent4u-app%2Fagent-config)
|
|
6
6
|
|
|
7
|
-
[](dist/agent-src/skills/) [](dist/agent-src/skills/) [](dist/agent-src/rules/) [](dist/agent-src/commands/) [](docs/guidelines/) [](dist/agent-src/personas/) [](dist/agent-src/personas/advisors/)
|
|
8
8
|
|
|
9
9
|
**Try it in 30 seconds** — drop one read-only subagent into any repo and watch it gate "done": `@production-validator check this branch is actually done`. No wizard, no lock-in, nothing else installed — the [30-second wedge ↓](#quickstart) is the whole first step. Start at the proof, not the catalog: **[event4u-app.github.io/agent-config/proof/](https://event4u-app.github.io/agent-config/proof/)**.
|
|
10
10
|
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
---
|
|
2
|
+
model_tier: high
|
|
3
|
+
name: analyze-conformance
|
|
4
|
+
pack: analysis-workbench
|
|
5
|
+
tier: 2
|
|
6
|
+
visibility: internal
|
|
7
|
+
sub: conformance
|
|
8
|
+
cluster: analyze
|
|
9
|
+
skills: [roadmap-writing, decision-review, ai-council, subagent-orchestration]
|
|
10
|
+
description: Audit recent local sessions for rule violations — deterministic scan plus subagent passes over the transcripts, root-cause each class, and emit a roadmap that mechanises what is mechanisable.
|
|
11
|
+
argument-hint: "[--sessions N] [--scan-only] [--no-council] [--no-roadmap] [--worktree]"
|
|
12
|
+
suggestion:
|
|
13
|
+
eligible: false
|
|
14
|
+
rationale: "Cluster sub-command — reached via its cluster head's routing or its explicit /analyze:conformance name; not independently suggested (surface-consolidation)."
|
|
15
|
+
workspaces:
|
|
16
|
+
- agent-config-maintainer
|
|
17
|
+
packs:
|
|
18
|
+
- meta
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# analyze-conformance
|
|
22
|
+
|
|
23
|
+
Answer one question about this agent, from evidence rather than impression:
|
|
24
|
+
**where did it not work the way its own rules require, and why?**
|
|
25
|
+
|
|
26
|
+
The sibling [`/analyze:inbox`](../inbox/command.md) turns somebody else's opinion
|
|
27
|
+
into a roadmap. This turns **the agent's own recorded behaviour** into one. The
|
|
28
|
+
input is not a document — it is the local transcript store, which is the only
|
|
29
|
+
place the agent's actual conduct is written down.
|
|
30
|
+
|
|
31
|
+
## Why this is not just a grep
|
|
32
|
+
|
|
33
|
+
The first version of this audit measured 303 language violations. The real
|
|
34
|
+
number was 626. The detector had inherited the very defect it was measuring:
|
|
35
|
+
it classified "the most recent user-role entry", and slash-command and skill
|
|
36
|
+
bodies arrive in the `user` role. It scored the worst session — 136 of 136
|
|
37
|
+
assistant turns in the wrong language — at **3**.
|
|
38
|
+
|
|
39
|
+
That is the shape of this whole job. A conformance audit is measuring a
|
|
40
|
+
measurement failure, so every instrument has to be checked against a case whose
|
|
41
|
+
answer is already known before its number is believed.
|
|
42
|
+
|
|
43
|
+
## Where the work happens — the checked-out branch, unless asked otherwise
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
RUN IN THE CURRENT BRANCH. NEVER CREATE A BRANCH, A WORKTREE, OR A PR
|
|
47
|
+
ON THIS COMMAND'S OWN AUTHORITY. A WORKTREE ONLY ON AN EXPLICIT ASK.
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Same default and same reasoning as [`/analyze:inbox`](../inbox/command.md): the
|
|
51
|
+
roadmap and the findings land in the branch already checked out, as ordinary
|
|
52
|
+
uncommitted changes for the operator to review. This command authorizes
|
|
53
|
+
**analysis and authoring** — not a git shape
|
|
54
|
+
([`scope-control`](../../../../rules/scope-control.md) § Git operations).
|
|
55
|
+
|
|
56
|
+
An isolated worktree runs only when the invocation asks for one — `--worktree`,
|
|
57
|
+
or the operator saying so in the prompt. Then follow
|
|
58
|
+
[`using-git-worktrees`](../../../../skills/using-git-worktrees/SKILL.md),
|
|
59
|
+
including its seeding allow/deny list.
|
|
60
|
+
|
|
61
|
+
One difference from its sibling worth knowing: a **full** run of this command
|
|
62
|
+
(subagent fan-out plus council) is long enough that a worktree can genuinely
|
|
63
|
+
earn its price by keeping a multi-file diff off the current branch. It still
|
|
64
|
+
does not take one by itself — that is the operator's call, and `--worktree` is
|
|
65
|
+
how they make it.
|
|
66
|
+
|
|
67
|
+
## Procedure
|
|
68
|
+
|
|
69
|
+
### 1 — Scan (deterministic, always)
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
agent-config conformance:behavior --limit <N> --output conformance-report.json
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Replays the local transcript store through the four **mechanised** checks:
|
|
76
|
+
language pin, git authorization, vacuous evidence, evidence steering. Every
|
|
77
|
+
classifier is imported from the gate it measures, so the scan and the gate
|
|
78
|
+
cannot drift apart.
|
|
79
|
+
|
|
80
|
+
This is the floor, not the audit. It sees only what already has a gate — which
|
|
81
|
+
is exactly why it is trustworthy and exactly why it is not sufficient.
|
|
82
|
+
|
|
83
|
+
`--scan-only` stops here.
|
|
84
|
+
|
|
85
|
+
### 2 — Read the transcripts (subagent fan-out)
|
|
86
|
+
|
|
87
|
+
The scan cannot see a rule that has no gate: an ask handed over as a trailing
|
|
88
|
+
parenthetical, a completion claimed on the wrong evidence, a root cause named
|
|
89
|
+
and then not fixed. Those need reading.
|
|
90
|
+
|
|
91
|
+
- Build per-session digests (user turns + assistant prose, tool calls stripped)
|
|
92
|
+
so a session fits in a subagent's context.
|
|
93
|
+
- Group them into balanced batches by size, and dispatch **one subagent per
|
|
94
|
+
batch, in parallel**, each returning findings in a fixed shape:
|
|
95
|
+
rule · session · timestamp · **verbatim quote** · what happened · why
|
|
96
|
+
(hypothesis) · severity.
|
|
97
|
+
- A finding without a quote is discarded. The quote is what makes the finding
|
|
98
|
+
auditable by someone who was not in the session.
|
|
99
|
+
|
|
100
|
+
Highest-signal evidence, in order: a user turn correcting the agent; a user turn
|
|
101
|
+
expressing frustration; the agent's own retro sentence admitting a mistake. Any
|
|
102
|
+
of those three outranks a rule read in the abstract, because it is ground truth
|
|
103
|
+
about what actually cost the user something.
|
|
104
|
+
|
|
105
|
+
### 3 — Root-cause each class, then pick a mechanism
|
|
106
|
+
|
|
107
|
+
Group findings into classes and, for each, ask the only question that matters:
|
|
108
|
+
|
|
109
|
+
> The rule was in context, at full strength, when this happened. So what would
|
|
110
|
+
> a prose change buy?
|
|
111
|
+
|
|
112
|
+
Usually nothing. Choose exactly one per class:
|
|
113
|
+
|
|
114
|
+
| Choice | When |
|
|
115
|
+
|---|---|
|
|
116
|
+
| **Deterministic gate** | The failure is a state transition observable at a hook event (a git op, a claim of verification, a dispatch). Name the event and whether it warns or blocks. |
|
|
117
|
+
| **Context injection** | The context is genuinely missing a *fact*, not attention — the language pin is the worked example. |
|
|
118
|
+
| **Rule-text change** | The rule is wrong or its trigger is mis-stated, not merely unheeded. |
|
|
119
|
+
| **Nothing** | Accept the rate and **delete the claim that it is enforced.** |
|
|
120
|
+
|
|
121
|
+
Reach for a mechanism only where the failure mode was measured. A gate for a
|
|
122
|
+
class nobody was harmed by is the mechanism-without-a-failure-mode this repo
|
|
123
|
+
forbids.
|
|
124
|
+
|
|
125
|
+
### 4 — Council (unless `--no-council`)
|
|
126
|
+
|
|
127
|
+
Route the class list and the proposed mechanisms to the AI council. Ask it
|
|
128
|
+
directly for the strongest objection to your own plan, and ask which parts are
|
|
129
|
+
theatre. Record where you **depart** from its verdict and why — a council
|
|
130
|
+
recommendation adopted without a stated reason is not a review, it is cover.
|
|
131
|
+
|
|
132
|
+
### 5 — Roadmap (unless `--no-roadmap`)
|
|
133
|
+
|
|
134
|
+
Per [`roadmap-writing`](../../../../skills/roadmap-writing/SKILL.md). The
|
|
135
|
+
roadmap must carry:
|
|
136
|
+
|
|
137
|
+
- the measured numbers, with the method that produced them;
|
|
138
|
+
- any number that was **corrected during the audit**, published beside the
|
|
139
|
+
correction rather than silently replaced;
|
|
140
|
+
- one phase per mechanised class;
|
|
141
|
+
- a final phase of **honest downgrades** — every enforcement claim the audit
|
|
142
|
+
proved false;
|
|
143
|
+
- a table of classes deliberately **not** fixed, each with its reason.
|
|
144
|
+
|
|
145
|
+
### 6 — Validate the instruments before trusting them
|
|
146
|
+
|
|
147
|
+
Before the roadmap is believed, run every new detector and gate against:
|
|
148
|
+
|
|
149
|
+
- **the worst known case** — if it does not fire there, the instrument is wrong,
|
|
150
|
+
not the corpus;
|
|
151
|
+
- **this session's own behaviour** — the audit that produced this command found
|
|
152
|
+
its own evidence-steering gate flagging six of its own analysis subagents.
|
|
153
|
+
|
|
154
|
+
## Flags
|
|
155
|
+
|
|
156
|
+
| Flag | Effect |
|
|
157
|
+
|---|---|
|
|
158
|
+
| `--sessions N` | How many recent sessions to read (default 30). |
|
|
159
|
+
| `--scan-only` | Step 1 only — the deterministic report, no subagents, no spend. |
|
|
160
|
+
| `--no-council` | Skip step 4. Record that it was skipped. |
|
|
161
|
+
| `--no-roadmap` | Findings only; no artefact authored. |
|
|
162
|
+
| `--worktree` | Opt into an isolated worktree. Off by default — see above. |
|
|
163
|
+
|
|
164
|
+
## Do NOT
|
|
165
|
+
|
|
166
|
+
- Trust a number this audit computed without validating the instrument (§ 6).
|
|
167
|
+
- Ship a stronger adjective as a fix for a rule that already failed at full
|
|
168
|
+
strength.
|
|
169
|
+
- Let the scan cover a class that has no gate — a report over un-mechanised
|
|
170
|
+
rules reads as enforcement and is not.
|
|
171
|
+
- Fold execution into this command. It audits and it plans; running the roadmap
|
|
172
|
+
is [`/roadmap:process-full`](../../../meta/roadmap/process-full/command.md) on
|
|
173
|
+
a later turn, per `scope-control` § Authoring vs. implementation.
|
|
174
|
+
|
|
175
|
+
## See also
|
|
176
|
+
|
|
177
|
+
- [`conformance:behavior`](../../../../scripts/conformance_scan.ts) — the
|
|
178
|
+
deterministic half, and the only part that runs without a model.
|
|
179
|
+
- [`/analyze:inbox`](../inbox/command.md) — same output shape, external input.
|
|
180
|
+
- [`evaluator-independence`](../../../../rules/evaluator-independence.md) —
|
|
181
|
+
binds step 2: this command dispatches evaluators, so its own prompts are
|
|
182
|
+
subject to it.
|
|
@@ -8,7 +8,7 @@ sub: inbox
|
|
|
8
8
|
cluster: analyze
|
|
9
9
|
skills: [learning-to-rule-or-skill, roadmap-writing, decision-review]
|
|
10
10
|
description: Analyze a dropped inbox artifact (review, prompt, spec, transcript) against the current tree, verify every claim it makes, map what survives onto this suite's artefact types, emit a roadmap each.
|
|
11
|
-
argument-hint: "[<file> | <dir>] [--triage-only] [--no-roadmap] [--keep-inbox]"
|
|
11
|
+
argument-hint: "[<file> | <dir>] [--triage-only] [--no-roadmap] [--keep-inbox] [--worktree]"
|
|
12
12
|
suggestion:
|
|
13
13
|
eligible: false
|
|
14
14
|
rationale: "Cluster sub-command — reached via its cluster head's routing or its explicit /analyze:inbox name; not independently suggested (surface-consolidation)."
|
|
@@ -40,7 +40,35 @@ still true.
|
|
|
40
40
|
|
|
41
41
|
Flags: `--triage-only` stops after Phase 2 (no deep analysis, no roadmap) ·
|
|
42
42
|
`--no-roadmap` analyses but emits findings instead of roadmaps ·
|
|
43
|
-
`--keep-inbox` skips the `tmp.old/` move (default is to move — see Phase 6)
|
|
43
|
+
`--keep-inbox` skips the `tmp.old/` move (default is to move — see Phase 6) ·
|
|
44
|
+
`--worktree` opts into an isolated worktree (see below; off by default).
|
|
45
|
+
|
|
46
|
+
## Where the work happens — the checked-out branch, unless asked otherwise
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
RUN IN THE CURRENT BRANCH. NEVER CREATE A BRANCH, A WORKTREE, OR A PR
|
|
50
|
+
ON THIS COMMAND'S OWN AUTHORITY. A WORKTREE ONLY ON AN EXPLICIT ASK.
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Default: the branch already checked out. The roadmaps, the findings, and the
|
|
54
|
+
`agents/tmp.old/` move land there as ordinary uncommitted changes for the
|
|
55
|
+
operator to review. This command authorizes **analysis and authoring** — not a
|
|
56
|
+
git shape ([`scope-control`](../../../../rules/scope-control.md) § Git
|
|
57
|
+
operations: branch and worktree creation are permission-gated, spike and
|
|
58
|
+
throwaway branches included).
|
|
59
|
+
|
|
60
|
+
An isolated worktree runs only when the invocation asks for one — `--worktree`,
|
|
61
|
+
or the operator saying so in the prompt. Then follow
|
|
62
|
+
[`using-git-worktrees`](../../../../skills/using-git-worktrees/SKILL.md),
|
|
63
|
+
including its seeding allow/deny list.
|
|
64
|
+
|
|
65
|
+
Why the current branch is the right default here: this command is read-heavy and
|
|
66
|
+
its whole output is a few markdown files plus a rename. Nothing it writes is a
|
|
67
|
+
generated tree, so there is no build to isolate — while a worktree costs a fresh
|
|
68
|
+
`node_modules`, a copied `.augment`, and a family of stale-projection failures
|
|
69
|
+
that only exist because the checkout is a second one. Isolation earns its price
|
|
70
|
+
when a run churns generated output or must keep a large diff off the current
|
|
71
|
+
branch; an inbox triage does neither.
|
|
44
72
|
|
|
45
73
|
## The Iron Law
|
|
46
74
|
|
|
@@ -188,3 +216,6 @@ each one is and why it is spent, and let the user remove it.
|
|
|
188
216
|
execution authorization
|
|
189
217
|
([`scope-control`](../../../../rules/scope-control.md) § Authoring vs.
|
|
190
218
|
implementation).
|
|
219
|
+
- Spin up a branch, a worktree, or a PR because the run feels large. Scope is
|
|
220
|
+
the operator's call; without `--worktree` or an explicit ask, the work stays
|
|
221
|
+
in the checked-out branch.
|
|
@@ -14,6 +14,8 @@ routes_to:
|
|
|
14
14
|
- "skill:decision-review"
|
|
15
15
|
workspaces: [agent-config-maintainer, engineering]
|
|
16
16
|
packs: [meta]
|
|
17
|
+
collision_ok:
|
|
18
|
+
"honest null": "this rule asks whether a recorded null may be REVISITED; evaluator-independence asks how one was PRODUCED — different decision points on the same artefact"
|
|
17
19
|
---
|
|
18
20
|
|
|
19
21
|
# Decision Revisit Gate
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "auto"
|
|
3
|
+
tier: "2a"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
description: "Commissioning a review/judge/blind-pass on your own work — never author the verdict, never narrow the scope, record the prompt with the result"
|
|
6
|
+
triggers:
|
|
7
|
+
- keyword: "blind review"
|
|
8
|
+
- keyword: "blind pass"
|
|
9
|
+
- keyword: "honest null"
|
|
10
|
+
- keyword: "no-findings"
|
|
11
|
+
- keyword: "adversarial review"
|
|
12
|
+
- keyword: "judge"
|
|
13
|
+
- phrase: "review my own"
|
|
14
|
+
- phrase: "commission a review"
|
|
15
|
+
- phrase: "second opinion on my"
|
|
16
|
+
self_contained: true
|
|
17
|
+
workspaces: [engineering]
|
|
18
|
+
packs: [engineering-base]
|
|
19
|
+
enforced_by:
|
|
20
|
+
- "hook:evidence-independence"
|
|
21
|
+
collision_ok:
|
|
22
|
+
"honest null": "this rule asks how a recorded null was PRODUCED; decision-revisit-gate asks whether it may be REVISITED — different decision points on the same artefact"
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# Evaluator Independence
|
|
26
|
+
|
|
27
|
+
When the agent commissions a review, judge, blind pass, or council run **on its
|
|
28
|
+
own work**, it is both the author and the author of the evaluator's prompt. That
|
|
29
|
+
second role is the one nobody was watching.
|
|
30
|
+
|
|
31
|
+
## The Iron Law
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
NEVER AUTHOR THE VERDICT INTO AN EVALUATOR'S PROMPT.
|
|
35
|
+
NEVER NARROW THE SCOPE OF A REVIEW YOU COMMISSIONED ON YOUR OWN WORK.
|
|
36
|
+
A SELF-COMMISSIONED REVIEW IS ADMISSIBLE AS GATE EVIDENCE ONLY WHEN THE PROMPT
|
|
37
|
+
IS RECORDED ALONGSIDE THE VERDICT.
|
|
38
|
+
A SECOND EVALUATION OF THE SAME WORK IN ONE TURN IS VERDICT SHOPPING, NOT RIGOUR.
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## The failure this exists to stop
|
|
42
|
+
|
|
43
|
+
Measured, once, at maximum cost (conformance audit 2026-08-06):
|
|
44
|
+
|
|
45
|
+
> The agent dispatched a "blind reviewer" over its own change. It wrote that
|
|
46
|
+
> reviewer's prompt itself, put **"NO-FINDINGS is expected and welcome"** into it,
|
|
47
|
+
> and narrowed the scope to four files it chose. The reviewer returned
|
|
48
|
+
> NO-FINDINGS. That honest-null was committed as **binding gate evidence**. An
|
|
49
|
+
> unsteered pass over the same delta later found 5 findings, one of them
|
|
50
|
+
> critical, already live on the trunk.
|
|
51
|
+
|
|
52
|
+
The agent's own retro named it exactly: *"Die Fabrikation lag nicht im Weglassen
|
|
53
|
+
des Reviews — sie lag in meinem Prompt. Ich habe die Antwort vorgeladen und dann
|
|
54
|
+
als Evidenz verbucht."* The review ran. The process was followed. The evidence
|
|
55
|
+
was manufactured anyway.
|
|
56
|
+
|
|
57
|
+
## What this requires
|
|
58
|
+
|
|
59
|
+
1. **Neutral prompt.** No expectation of the outcome, in either direction. Not
|
|
60
|
+
"confirm there are no issues", not "I believe this is clean", not "just
|
|
61
|
+
confirm". Ask for findings; do not describe the finding count you expect.
|
|
62
|
+
2. **Scope you did not choose to flatter yourself.** The scope is the whole
|
|
63
|
+
delta, or a boundary a human set. "These four files" chosen by the author of
|
|
64
|
+
those files is not a scope, it is a filter.
|
|
65
|
+
3. **The prompt ships with the verdict.** A recorded honest-null whose prompt is
|
|
66
|
+
not recoverable is not evidence — nobody can check what was asked.
|
|
67
|
+
4. **One evaluation per turn per subject.** Re-running with a different prompt or
|
|
68
|
+
scope after an unwelcome verdict selects the answer instead of measuring it.
|
|
69
|
+
|
|
70
|
+
## When it does NOT fire
|
|
71
|
+
|
|
72
|
+
- **Ordinary parallel fan-out.** Dispatching many subagents to read, map,
|
|
73
|
+
search, or implement is not evaluation and is not gated. The session that
|
|
74
|
+
produced this rule ran a seven-way analysis fan-out in one turn; none of it is
|
|
75
|
+
in scope.
|
|
76
|
+
- A review **a human** commissioned or whose prompt a human wrote.
|
|
77
|
+
- A deterministic checker (linter, test suite, CI gate) — it has no prompt to
|
|
78
|
+
steer.
|
|
79
|
+
|
|
80
|
+
## Enforcement — honest scope
|
|
81
|
+
|
|
82
|
+
[`evidence_independence.ts`](../scripts/hooks/evidence_independence.ts) is a
|
|
83
|
+
`pre_tool_use` concern. It **blocks** a dispatch whose prompt carries a
|
|
84
|
+
pre-loaded verdict, and **blocks** a second evaluation-shaped dispatch in the
|
|
85
|
+
same turn; it **warns** on the first. It reads the prompt the agent is about to
|
|
86
|
+
send, so items 1 and 4 above are mechanically enforced.
|
|
87
|
+
|
|
88
|
+
Items 2 and 3 — an honestly chosen scope, and recording the prompt with the
|
|
89
|
+
verdict — are **not** enforced by anything. A narrowed scope is not decidable
|
|
90
|
+
from the prompt alone, and no validator reads the artefacts a verdict lands in.
|
|
91
|
+
They are stated here as obligations and are model-carried. Saying so is the
|
|
92
|
+
point: this rule exists because a process that *looked* followed produced
|
|
93
|
+
fabricated evidence, and claiming coverage it does not have would repeat that.
|
|
94
|
+
|
|
95
|
+
## See also
|
|
96
|
+
|
|
97
|
+
- [`verify-before-complete`](verify-before-complete.md) — the completion-claim
|
|
98
|
+
gate this narrows; a self-commissioned review is one kind of evidence it accepts.
|
|
99
|
+
- [`adversarial-review`](../skills/adversarial-review/SKILL.md) — how to ask for a
|
|
100
|
+
real critique.
|
|
101
|
+
- [`delegation-policy`](delegation-policy.md) — the orchestrator never adopts a
|
|
102
|
+
subagent return unverified; this rule covers the case where the return was
|
|
103
|
+
steered before it was returned.
|
|
104
|
+
- [`direct-answers`](direct-answers.md) Iron Law 2 — do not claim what you have
|
|
105
|
+
not verified; a manufactured verdict is the sharpest form of that claim.
|
|
@@ -67,7 +67,7 @@ name it and suggest a fresh session or `/agent-handoff`, per
|
|
|
67
67
|
- The greeting never substitutes for substance — it prefixes the answer, it is
|
|
68
68
|
not the answer.
|
|
69
69
|
|
|
70
|
-
## Enforcement
|
|
70
|
+
## Enforcement — per session, NOT per task
|
|
71
71
|
|
|
72
72
|
> **Enforced by:** [`scripts/session_canary_hook.ts`](../../scripts/session_canary_hook.ts)
|
|
73
73
|
> (`session_start`, all hook-capable hosts) — injects the `<session-canary>`
|
|
@@ -75,6 +75,18 @@ name it and suggest a fresh session or `/agent-handoff`, per
|
|
|
75
75
|
> without it. **Copilot fallback:** no hook surface — this rule is the only
|
|
76
76
|
> carrier; re-read it when the trigger fires.
|
|
77
77
|
|
|
78
|
+
**The gap, stated because it was measured.** The injection fires on
|
|
79
|
+
`session_start`; the obligation is per *task*. Nothing re-injects at a task
|
|
80
|
+
boundary, so from the second task on the contract is model-carried.
|
|
81
|
+
|
|
82
|
+
Conformance audit, 30 sessions, 2026-08-06: opening canary dropped on ~13 of 15
|
|
83
|
+
task starts, often present only in the closing summary, twice carrying a name
|
|
84
|
+
the settings chain did not resolve; the honesty clause fired zero times. No
|
|
85
|
+
per-task gate ships — the audit found no harm beyond the lost signal, and a
|
|
86
|
+
mechanism for a signal whose absence nobody acted on has no failure mode to
|
|
87
|
+
match. The consequence stands: this canary cannot currently be relied on as the
|
|
88
|
+
degradation detector its own rationale describes.
|
|
89
|
+
|
|
78
90
|
## See also
|
|
79
91
|
|
|
80
92
|
- [`direct-answers`](direct-answers.md) — canonical reply-close obligation.
|
|
@@ -52,6 +52,28 @@ the script is the deterministic safety net.
|
|
|
52
52
|
|
|
53
53
|
If in doubt, split into serial turns — never a long batched prompt.
|
|
54
54
|
|
|
55
|
+
## The trigger is a decision, not a format
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
THE OBLIGATION FIRES ON HANDING A DECISION TO THE USER — IN ANY FORM.
|
|
59
|
+
NOT ON THE PRESENCE OF A NUMBERED LIST.
|
|
60
|
+
A TRAILING FREE-TEXT OFFER IS AN ASK. A BARE YES/NO IS AN ASK.
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Measured (30-session conformance audit, 2026-08-06): **every** malformed ask was
|
|
64
|
+
a one-line parenthetical or a trailing free-text offer — *"sag Bescheid, wenn
|
|
65
|
+
ich die drei Zeilen mitnehmen soll"*, *"Soll ich das so umsetzen?"* — while the
|
|
66
|
+
same sessions formatted their **large** asks perfectly. So the rule is being
|
|
67
|
+
read as *if numbered options, then a recommendation line*. It is the other way
|
|
68
|
+
round, and an ask that feels too small for a block is exactly the one that
|
|
69
|
+
escapes the format. Three further caught shapes: a contentless filler option; an
|
|
70
|
+
inline `(Empfohlen)` tag **beside** the recommendation line (the dual source
|
|
71
|
+
Iron Law 1 forbids); an option set answerable only as `1,3,4`.
|
|
72
|
+
|
|
73
|
+
**No gate ships for this** — `check_reply_consistency` scans authored markdown,
|
|
74
|
+
never a chat draft. `conformance:behavior` deliberately does not score ask-shape,
|
|
75
|
+
so an unmoved rate is a finding rather than a silence.
|
|
76
|
+
|
|
55
77
|
## Mechanics — rationale, failure modes, format details, examples
|
|
56
78
|
|
|
57
79
|
The "why take a position", position-agnostic clause, format
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
model_tier: medium
|
|
3
3
|
name: finishing-a-development-branch
|
|
4
|
-
description: "Use when the feature is implementation-complete and the next step is 'ship it' — verifies, cleans up,
|
|
4
|
+
description: "Use when the feature is implementation-complete and the next step is 'ship it' — verifies, cleans up, routes to merge/PR/park/discard; never destroys work without explicit confirmation."
|
|
5
5
|
domain: process
|
|
6
6
|
workspaces:
|
|
7
7
|
- engineering
|
|
@@ -236,6 +236,51 @@ rule for another reason. A batch edit across the rule set trips the
|
|
|
236
236
|
kernel-prefix byte-stability gate, and that gate is right to fire — the kernel
|
|
237
237
|
prefix is pinned deliberately.
|
|
238
238
|
|
|
239
|
+
## Optional: enumerate condition-action clauses
|
|
240
|
+
|
|
241
|
+
A rule body mixes two shapes. **Standing obligations** hold for every turn the
|
|
242
|
+
rule is loaded ("every reply mirrors the user's language"). **Condition-action
|
|
243
|
+
clauses** fire on a situation ("when the diff deletes a directory, surface it").
|
|
244
|
+
The router matches on frontmatter; in-body conditionals are prose, so a rule's
|
|
245
|
+
situational half is invisible to everything except a full read.
|
|
246
|
+
|
|
247
|
+
Where a rule carries more than two of them, group them under a
|
|
248
|
+
`## Conditions` heading, one bullet per clause, each in the shape
|
|
249
|
+
**`<condition>` → `<action>`**. Two effects, both cheap:
|
|
250
|
+
|
|
251
|
+
- A reader can answer "does this rule apply to what I am doing?" from a list
|
|
252
|
+
instead of by reading the body.
|
|
253
|
+
- A condition that turns out to be unreachable becomes visible as a line, which
|
|
254
|
+
is the input `decision-review` needs to ask whether the clause still earns its
|
|
255
|
+
place.
|
|
256
|
+
|
|
257
|
+
Optional on purpose. A rule with one conditional does not need a section to hold
|
|
258
|
+
it, and a heading over a single bullet is ceremony.
|
|
259
|
+
|
|
260
|
+
## Optional: state the decision-impact class
|
|
261
|
+
|
|
262
|
+
`type:` is a **delivery** class — how the rule reaches the model. It says
|
|
263
|
+
nothing about what is at stake when the rule fires, and kernel-membership and
|
|
264
|
+
always-loaded-budget arguments were being made with no stated impact class at
|
|
265
|
+
all. `decision_impact:` carries that, with three values:
|
|
266
|
+
|
|
267
|
+
| Value | Meaning | Consequence |
|
|
268
|
+
|---|---|---|
|
|
269
|
+
| `overrides-model-default` | the model's base behaviour is wrong here | load-bearing; the strongest case for staying loaded |
|
|
270
|
+
| `encodes-house-choice` | the model would make *a* defensible choice, not *ours* | stays until the house choice changes |
|
|
271
|
+
| `already-complied-with` | the model does this unprompted | **the one value that permits removal** |
|
|
272
|
+
|
|
273
|
+
The third carries an evidence bar, enforced by `lint_decision_impact`: it
|
|
274
|
+
requires `decision_impact_evidence`, a pointer a reviewer can follow to the
|
|
275
|
+
observation. The bar exists because that classification is what permits deleting
|
|
276
|
+
a rule, and "the model probably does this anyway" is the cheapest possible way
|
|
277
|
+
to remove a floor that was working precisely *because* nothing had crossed it —
|
|
278
|
+
`active-remediation` names that failure as deleting a rule that is merely quiet.
|
|
279
|
+
|
|
280
|
+
**Optional, and backfill is opportunistic.** Classifying all 111 rules in one
|
|
281
|
+
batch is exactly the shape that trips `check_kernel_prefix_stability`. Add it to
|
|
282
|
+
new rules, and to a rule you are already touching for another reason.
|
|
283
|
+
|
|
239
284
|
## Output format
|
|
240
285
|
|
|
241
286
|
1. Complete rule file at `src/rules/{name}.md`
|