@event4u/agent-config 9.25.0 → 9.26.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 +87 -0
- package/README.md +1 -1
- package/dist/agent-src/commands/analyze/conformance.md +2 -2
- package/dist/agent-src/commands/review/changes.md +6 -5
- package/dist/agent-src/commands/roadmap/next.md +194 -0
- package/dist/agent-src/commands/roadmap.md +12 -4
- package/dist/agent-src/contexts/execution/subagent-routing.md +4 -1
- package/dist/agent-src/rules/delegation-policy.md +3 -2
- package/dist/agent-src/rules/design-fidelity.md +17 -1
- package/dist/agent-src/rules/design-review-after-ui-write.md +116 -0
- package/dist/agent-src/rules/evaluator-independence.md +9 -3
- package/dist/agent-src/rules/session-canary.md +2 -0
- package/dist/agent-src/rules/settings-ask-protocol.md +176 -0
- package/dist/agent-src/rules/token-budget-discipline.md +6 -3
- package/dist/agent-src/rules/ui-audit-gate.md +3 -0
- package/dist/agent-src/rules/user-interaction.md +3 -2
- package/dist/agent-src/skills/recursive-verification/SKILL.md +13 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/cli-delegate/cmd_route_audit.js +4 -1
- package/dist/cli-delegate/cmd_route_explain.js +4 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +94 -23
- 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 +11 -8
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +9 -6
- package/dist/hooks/dispatch.js +355 -63
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/router.json +1 -1
- package/dist/server/nicknameResolver.js +116 -0
- package/dist/server/nicknameResolver.js.map +1 -0
- package/dist/server/routes/ping.js +29 -11
- package/dist/server/routes/ping.js.map +1 -1
- package/dist/shared/interactiveContext.js +73 -0
- package/dist/shared/interactiveContext.js.map +1 -0
- package/dist/shared/nicknamePrefill.js +59 -0
- package/dist/shared/nicknamePrefill.js.map +1 -0
- package/dist/shared/settingsAsks.js +128 -0
- package/dist/shared/settingsAsks.js.map +1 -0
- package/dist/shared/settingsConsent.js +93 -0
- package/dist/shared/settingsConsent.js.map +1 -0
- package/package.json +1 -1
- package/src/config/agents-paths.yml +15 -0
- package/src/config/gate-coverage.yml +29 -1
- package/src/config/gate-violation-baselines.json +13 -7
- package/src/scripts/_cli/cmd_route_audit.ts +4 -1
- package/src/scripts/_cli/cmd_route_explain.ts +9 -1
- package/src/scripts/ai-video/stitch.sh +27 -9
- package/src/scripts/before_complete_hook.ts +23 -4
- package/src/scripts/bench_ab_v2_run.ts +272 -16
- package/src/scripts/bench_ab_v2_stats.ts +156 -3
- package/src/scripts/check_completion_review.ts +80 -3
- package/src/scripts/check_corpus_staleness.ts +692 -0
- package/src/scripts/check_gate_coverage.ts +67 -0
- package/src/scripts/check_hook_bundle_freshness.ts +183 -0
- package/src/scripts/conformance_scan.ts +47 -17
- package/src/scripts/dispatch_r2_reviewer.ts +31 -2
- package/src/scripts/git_authorization_hook.ts +75 -10
- package/src/scripts/hook_manifest.yaml +19 -0
- package/src/scripts/hooks/block_no_verify.ts +3 -1
- package/src/scripts/hooks/block_unauthorized_git.ts +133 -16
- package/src/scripts/hooks/design_slop_hook.ts +13 -1
- package/src/scripts/hooks/dispatch_hook.ts +97 -2
- package/src/scripts/hooks/evidence_independence.ts +40 -6
- package/src/scripts/language_mirror_hook.ts +200 -11
- package/src/scripts/lint_abstraction_thresholds.ts +41 -8
- package/src/scripts/lint_agents_layout.ts +2 -0
- package/src/scripts/lint_hook_manifest.ts +29 -0
- package/src/scripts/memory_learn_hook.ts +109 -6
- package/src/scripts/pr_url_reminder_hook.ts +17 -2
- package/src/scripts/release.ts +38 -1
- package/src/scripts/schemas/review-findings.schema.json +99 -0
- package/src/shared/interactiveContext.ts +98 -0
- package/src/shared/nicknamePrefill.ts +96 -0
- package/src/shared/settingsAsks.ts +176 -0
- package/src/shared/settingsConsent.ts +136 -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.26.0",
|
|
10
10
|
"keywords": [
|
|
11
11
|
"agent-config",
|
|
12
12
|
"skills",
|
package/CHANGELOG.md
CHANGED
|
@@ -303,6 +303,93 @@ 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.26.0](https://github.com/event4u-app/agent-config/compare/9.25.0...9.26.0) (2026-08-07)
|
|
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 17c3716, 27e6649, f352c7a, 8fdcc7b, 581dfa0, a396442 +1 more.
|
|
312
|
+
- **Default changes + migration:** _auto-derived, rewrite before merge:_ commits naming a default, migration or migrate in 3bae006.
|
|
313
|
+
- **Security and correctness:** _none_
|
|
314
|
+
- **Honest nulls:** _auto-derived, rewrite before merge:_ commits carrying an honest-null marker in cefcd37.
|
|
315
|
+
- **Known limitations:** _none_
|
|
316
|
+
|
|
317
|
+
### Features
|
|
318
|
+
|
|
319
|
+
* **memory:** gate the session-end learning hook on the recorded consent ([79a6aa8](https://github.com/event4u-app/agent-config/commit/79a6aa892f2d772254ef91c0b19cb93007da2d70))
|
|
320
|
+
* **settings:** resolve the nickname prefill through the documented chain ([e98a7cb](https://github.com/event4u-app/agent-config/commit/e98a7cba5cc76ccd62ab7b84be4b2a2b749d96e5))
|
|
321
|
+
* **bench:** price the cost axis per token bucket in the v2 report ([b234b3e](https://github.com/event4u-app/agent-config/commit/b234b3e7076d401f9201610545528097e84490f2))
|
|
322
|
+
* **bench:** preserve per-trial workspaces and add a real no-network selftest ([12df43b](https://github.com/event4u-app/agent-config/commit/12df43bc6e1ac2be87e62128accc00d1296db991))
|
|
323
|
+
* **bench:** add the package-ladder and bare-principle arms ([c3f1c31](https://github.com/event4u-app/agent-config/commit/c3f1c316c270aa166ed3164165a02c083345319c))
|
|
324
|
+
* **gates:** assert every authored skill REACHES the Claude tree, not just that it parses ([c42b1ad](https://github.com/event4u-app/agent-config/commit/c42b1adb2afb237d45182a59af705ef64eb4fe66))
|
|
325
|
+
* **settings:** make the provenance stamp decide something, and condense the rule ([27e6649](https://github.com/event4u-app/agent-config/commit/27e664999a8894e1b146a556fa114daee3511676))
|
|
326
|
+
* **settings:** normalise the just-in-time settings ask and compute its budget ([f352c7a](https://github.com/event4u-app/agent-config/commit/f352c7aea72beab330f1abd625041f7bcb46df3a))
|
|
327
|
+
* **language-mirror:** fall back to the system locale on a terse first prompt ([784ee64](https://github.com/event4u-app/agent-config/commit/784ee64307086a28e9657b0a0ae5ae2fac94309a))
|
|
328
|
+
* **gates:** fail the pre-push chain when the running hook bundle predates its sources ([a829a7c](https://github.com/event4u-app/agent-config/commit/a829a7cb50fac0fe02fc4af80c7083a890312913))
|
|
329
|
+
* **review:** one findings schema both tracks validate against ([581dfa0](https://github.com/event4u-app/agent-config/commit/581dfa079ee333edcba920b464a19c11542db4c8))
|
|
330
|
+
* **review:** make prompt provenance and author-vs-reviewer checkable ([cefcd37](https://github.com/event4u-app/agent-config/commit/cefcd37ae8a4b0ee5e42ee0514e9b09399f98870))
|
|
331
|
+
* **gate:** enforce the corpus refresh cadence and open the CSVs nobody opened ([c946769](https://github.com/event4u-app/agent-config/commit/c9467697823b5a0b82d8f3e4b4d34c8bd8fe813f))
|
|
332
|
+
* **rules:** close the write side of the UI loop ([a396442](https://github.com/event4u-app/agent-config/commit/a396442da455b6e02afddacc87c462f80b198499))
|
|
333
|
+
* **hooks:** per-concern tools: filter, applied by the dispatcher ([28a8f96](https://github.com/event4u-app/agent-config/commit/28a8f96ee413083e3f451f1bf49b5588483ae9aa))
|
|
334
|
+
* **gate:** ratchet gate_self_test adoption as a shrink-only non-adopter count ([99e3656](https://github.com/event4u-app/agent-config/commit/99e36560c208904510bc0525122ad2549d697bea))
|
|
335
|
+
* **agents:** create agents/proposals — the directory seven artefacts pointed at ([64717a9](https://github.com/event4u-app/agent-config/commit/64717a96680cc70d3de7c4dd9a853d92952fbb53))
|
|
336
|
+
* **design:** route a capability URL and a design-system dir to design-fidelity ([85b1562](https://github.com/event4u-app/agent-config/commit/85b1562c193f9eaf6ed63f8692f79e0b9d2eda3f))
|
|
337
|
+
* **commands:** add /roadmap:next — screen, select, then ship a roadmap ([459211c](https://github.com/event4u-app/agent-config/commit/459211cadcc7682f26c8b081ac6c87c2a4712e46))
|
|
338
|
+
|
|
339
|
+
### Bug Fixes
|
|
340
|
+
|
|
341
|
+
* **release:** stop masking every push failure as a moved remote ref ([47faa19](https://github.com/event4u-app/agent-config/commit/47faa19e080bbe27c3cd8dfeb0bee67a10acfbf8))
|
|
342
|
+
* **settings:** retract an overclaim and take the fork off the request path ([2139b17](https://github.com/event4u-app/agent-config/commit/2139b174c8e4afad3f7294bfc196ad0e79801cec))
|
|
343
|
+
* **settings:** close the R2 review findings on the prefill and the pins ([fe35e63](https://github.com/event4u-app/agent-config/commit/fe35e63702661f34e55345c5c4fa7e2cd6b34fa4))
|
|
344
|
+
* **tests:** narrow the ARMS lookup for noUncheckedIndexedAccess ([3b3e1b1](https://github.com/event4u-app/agent-config/commit/3b3e1b14ee8bb588004410d901835d35649b2544))
|
|
345
|
+
* **roadmaps:** make solution-minimalism report its own spend gate ([3d9ceef](https://github.com/event4u-app/agent-config/commit/3d9ceef6153ed6df35292bf74d9a48b1e83dd982))
|
|
346
|
+
* **cli:** both routing commands were dead through the shipped binary ([c2b38e2](https://github.com/event4u-app/agent-config/commit/c2b38e2263e9b27401ea38bb2782b0d7532c4527))
|
|
347
|
+
* **gates:** emit the freshness verdict via stdout, not console.log ([fa06eea](https://github.com/event4u-app/agent-config/commit/fa06eea18620e671f3c09ac877cb094c6022c0aa))
|
|
348
|
+
* **hooks:** design-slop read the tool fields where the dispatcher does not put them ([3ca190f](https://github.com/event4u-app/agent-config/commit/3ca190f0b2364c785f791dc106086209d86f1983))
|
|
349
|
+
* **ci:** close the five surfaces this change reds, one of them a real gate gap ([c7c25ff](https://github.com/event4u-app/agent-config/commit/c7c25ffc1eac8f8b73776c5655f35af42f9eb9f7))
|
|
350
|
+
* **conformance:** round 2 — the shipped gates did not fire, and four reasons were wrong ([8fdcc7b](https://github.com/event4u-app/agent-config/commit/8fdcc7b9d2de7c3239af7e809e86933e41cf44e2))
|
|
351
|
+
* **gate:** close the word-form count hole in lint_abstraction_thresholds ([d5c294c](https://github.com/event4u-app/agent-config/commit/d5c294c4cf547696bf452a385ea0935b191283cd))
|
|
352
|
+
* **video:** refuse --crossfade instead of silently delivering a hard cut ([6eea400](https://github.com/event4u-app/agent-config/commit/6eea4000146d1de2c8de703e046aa8072e9e4d96))
|
|
353
|
+
* **ci:** close the two count-and-fixture surfaces a new sub-command reds ([f8d9566](https://github.com/event4u-app/agent-config/commit/f8d9566ca568c45c18cb2ec62d72492eaecf7570))
|
|
354
|
+
|
|
355
|
+
### Reverts
|
|
356
|
+
|
|
357
|
+
* **gates:** drop the skill-completeness check — its premise is false and it blocks the release ([5473a92](https://github.com/event4u-app/agent-config/commit/5473a925e13989fc6ba382145ab20c485dae2995))
|
|
358
|
+
|
|
359
|
+
### Documentation
|
|
360
|
+
|
|
361
|
+
* **roadmap:** reopen step 4.2 — the prefill shipped, the ask did not ([5fb6c05](https://github.com/event4u-app/agent-config/commit/5fb6c053a587440749af0b6d29b37c00fc1c03d1))
|
|
362
|
+
* **roadmap:** close Phases 4 and 5 from evidence, re-encode the blocked steps ([2c70288](https://github.com/event4u-app/agent-config/commit/2c70288e372254be0cd0a23acfdd76f3b1318cb1))
|
|
363
|
+
* **bench:** add the ab-v2 reproduce path and the Phase-3 pre-registration ([bb0ad48](https://github.com/event4u-app/agent-config/commit/bb0ad480deddf4ee3739d80d795a6c8546de9ffc))
|
|
364
|
+
* cancel P1.2 on measurement, close the P2.1 null-scope check ([81fce51](https://github.com/event4u-app/agent-config/commit/81fce5189b88b9d64051cbf9d58e4322a783ca57))
|
|
365
|
+
* **roadmap:** close P1.3 and P5.3 with their measured departures ([1c101db](https://github.com/event4u-app/agent-config/commit/1c101db9a045cc0b298927ef3d8d2622e8ec6625))
|
|
366
|
+
* **roadmap:** close the four verified-fix steps of the inbox harvest ([b0cd2f4](https://github.com/event4u-app/agent-config/commit/b0cd2f4773b0f9a97135ecc5ff2432e0ae2513ab))
|
|
367
|
+
|
|
368
|
+
### Refactoring
|
|
369
|
+
|
|
370
|
+
* **settings:** point the four bespoke ask sites at the shared protocol ([17c3716](https://github.com/event4u-app/agent-config/commit/17c371647eddc5945dbbcc03e1cb2e698c63cf55))
|
|
371
|
+
|
|
372
|
+
### Tests
|
|
373
|
+
|
|
374
|
+
* **settings:** pin the ask-shaped settings migration ([3bae006](https://github.com/event4u-app/agent-config/commit/3bae00676daa7ae0e8c195fd2b6e00a2a25c60bb))
|
|
375
|
+
|
|
376
|
+
### Chores
|
|
377
|
+
|
|
378
|
+
* **ci:** retrigger pull_request event delivery ([a20088f](https://github.com/event4u-app/agent-config/commit/a20088f328d533827fac1de60273a3f206aceef1))
|
|
379
|
+
* **roadmaps:** record the cost endpoint against the Endpoints step ([a3585ad](https://github.com/event4u-app/agent-config/commit/a3585ad7152b64fbe250ea294d242ab5a86a693b))
|
|
380
|
+
* **roadmaps:** close the thresholds step, record the reproducibility residue ([39a93d3](https://github.com/event4u-app/agent-config/commit/39a93d33a3e69b132f643fe97380e2a7804d1acb))
|
|
381
|
+
* **reports:** refresh the originality report round 2 left stale ([a65f929](https://github.com/event4u-app/agent-config/commit/a65f92939bae5b170a3cf58464579ccf774c5a9e))
|
|
382
|
+
* regenerate router.json after the trunk merge ([0af3e84](https://github.com/event4u-app/agent-config/commit/0af3e8425106ccc395be79f66faacc3f8b45a5b1))
|
|
383
|
+
* regenerate router.json and the routed-rule count for the new rule ([f262b83](https://github.com/event4u-app/agent-config/commit/f262b83fdba6b71905b03333fd93f657ae0905a3))
|
|
384
|
+
* regenerate the tool trees and indices for the new rule ([2788940](https://github.com/event4u-app/agent-config/commit/2788940cc55326e125c2000ad3cf0e90fe2b5c51))
|
|
385
|
+
* **router:** regenerate router.json for the two new design-fidelity triggers ([20aee52](https://github.com/event4u-app/agent-config/commit/20aee52cb1d440d77ec4b9e712164addfd0a83de))
|
|
386
|
+
|
|
387
|
+
### Other
|
|
388
|
+
|
|
389
|
+
* **settings:** record the R2 findings, and announce the Iron Law 3 recurrence ([63e2f09](https://github.com/event4u-app/agent-config/commit/63e2f094c57c77ec18ecf4cf449e7682597be29f))
|
|
390
|
+
|
|
391
|
+
Tests: 11643 (+200 since 9.25.0)
|
|
392
|
+
|
|
306
393
|
## [9.25.0](https://github.com/event4u-app/agent-config/compare/9.24.0...9.25.0) (2026-08-06)
|
|
307
394
|
|
|
308
395
|
### 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
|
|
|
@@ -8,7 +8,7 @@ sub: conformance
|
|
|
8
8
|
cluster: analyze
|
|
9
9
|
skills: [roadmap-writing, decision-review, ai-council, subagent-orchestration]
|
|
10
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: "[--
|
|
11
|
+
argument-hint: "[--limit N] [--scan-only] [--no-council] [--no-roadmap] [--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:conformance name; not independently suggested (surface-consolidation)."
|
|
@@ -155,7 +155,7 @@ Before the roadmap is believed, run every new detector and gate against:
|
|
|
155
155
|
|
|
156
156
|
| Flag | Effect |
|
|
157
157
|
|---|---|
|
|
158
|
-
| `--
|
|
158
|
+
| `--limit N` | How many recent sessions to read (default 30). |
|
|
159
159
|
| `--scan-only` | Step 1 only — the deterministic report, no subagents, no spend. |
|
|
160
160
|
| `--no-council` | Skip step 4. Record that it was skipped. |
|
|
161
161
|
| `--no-roadmap` | Findings only; no artefact authored. |
|
|
@@ -136,11 +136,12 @@ Read `subagents.adversarial_council` from `.agent-settings.yml` (default
|
|
|
136
136
|
|
|
137
137
|
- `off` (default): skip silently.
|
|
138
138
|
- `ask`: when the diff is explicitly high-risk (security, tenant, migration,
|
|
139
|
-
public API), offer it
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
139
|
+
public API), offer it — in the shape
|
|
140
|
+
[`settings-ask-protocol`](../../../../rules/settings-ask-protocol.md) fixes,
|
|
141
|
+
which supplies the four slots, the one-question budget, and the storage line
|
|
142
|
+
(not persisted: `subagents.adversarial_council` is class C). What only this
|
|
143
|
+
command knows is *why now*: the diff is high-risk, and the offer is a paid
|
|
144
|
+
distinct-model red-team for finding coverage against the five internal judges.
|
|
144
145
|
- `on`: run it automatically on a high-risk diff.
|
|
145
146
|
|
|
146
147
|
When run, dispatch the
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
---
|
|
2
|
+
model_tier: medium
|
|
3
|
+
name: roadmap-next
|
|
4
|
+
pack: product-basic
|
|
5
|
+
tier: 2
|
|
6
|
+
visibility: internal
|
|
7
|
+
cluster: roadmap
|
|
8
|
+
sub: next
|
|
9
|
+
skills: [roadmap-management, agent-docs-writing, ai-council, subagent-orchestration, worktree-lifecycle, git-workflow]
|
|
10
|
+
description: Pick the next executable roadmap and carry it to a reviewable PR — live remote screen, five-disqualifier feasibility pass, council on the pick, process-full, chunked commits, PR, CI fix.
|
|
11
|
+
argument-hint: "[--worktree] [roadmap]"
|
|
12
|
+
suggestion:
|
|
13
|
+
eligible: false
|
|
14
|
+
rationale: "Cluster sub-command — reached via its cluster head's routing or its explicit /cluster:sub name; not independently suggested (surface-consolidation)."
|
|
15
|
+
workspaces:
|
|
16
|
+
- agent-config-maintainer
|
|
17
|
+
packs:
|
|
18
|
+
- meta
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# /roadmap:next
|
|
22
|
+
|
|
23
|
+
Selection + delivery scope of the [`/roadmap`](../roadmap.md) cluster.
|
|
24
|
+
The three `process-*` subs take a roadmap **as given** and vary the
|
|
25
|
+
scope inside it. `/roadmap:next` varies the **selection**: it screens
|
|
26
|
+
what is actually executable right now, picks one, pins the scope to
|
|
27
|
+
`full`, and carries the run to a PR that is ready for review.
|
|
28
|
+
|
|
29
|
+
One invocation = one roadmap = one branch = one PR.
|
|
30
|
+
|
|
31
|
+
## Instructions
|
|
32
|
+
|
|
33
|
+
### 1. Live remote screen — before any selection reasoning
|
|
34
|
+
|
|
35
|
+
Selection reads live state, never memory, a dashboard count, or an
|
|
36
|
+
earlier fetch (per [`direct-answers`](../../rules/direct-answers.md)
|
|
37
|
+
Iron Law 2 and [`roadmap-process-loop § 1`](../../contexts/execution/roadmap-process-loop.md#1-resolve-roadmap)).
|
|
38
|
+
Run as ONE block:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
git fetch origin --prune
|
|
42
|
+
git ls-tree --name-only origin/main agents/roadmaps/ # still active?
|
|
43
|
+
git ls-tree --name-only origin/main agents/roadmaps/archive/ # already closed?
|
|
44
|
+
gh pr list --state open --json number,title,headRefName # in flight?
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Excluded from the candidate set: `template.md`, `archive/`,
|
|
48
|
+
`skipped/`, `later/`, anything with `status: draft` whose promotion
|
|
49
|
+
trigger has not fired, and any roadmap whose slug matches an **open
|
|
50
|
+
PR's** branch — that one is taken.
|
|
51
|
+
|
|
52
|
+
A roadmap completes by an archive move **inside its merging PR**, so a
|
|
53
|
+
local checkout can show a closed roadmap as open. That is why this step
|
|
54
|
+
precedes the screen instead of following it.
|
|
55
|
+
|
|
56
|
+
### 2. Screen the survivors — five disqualifiers
|
|
57
|
+
|
|
58
|
+
For each candidate read its frontmatter, its open-step count, and every
|
|
59
|
+
`### blocker:` section. Disqualify on:
|
|
60
|
+
|
|
61
|
+
1. **A blocker whose resolution is a human ACTION** — install a secret,
|
|
62
|
+
click a repo setting, recruit a participant, approve spend, let a
|
|
63
|
+
date pass. Apply the action-vs-judgement split: a blocker that is a
|
|
64
|
+
**judgement call** (which option, whether to reopen a recorded
|
|
65
|
+
decision, is the evidence sufficient) is **not** a disqualifier — it
|
|
66
|
+
is council-resolvable in step 3.
|
|
67
|
+
2. **Spend** — paid bench or API runs, an npm publish, a public release.
|
|
68
|
+
3. **A date that must pass.**
|
|
69
|
+
4. **A kernel-rule edit** — [`scope-control`](../../rules/scope-control.md)
|
|
70
|
+
demands its own PR plus a ≥24 h soak, so it cannot close in this run
|
|
71
|
+
(kernel list: [`kernel-membership`](../../../docs/contracts/kernel-membership.md)).
|
|
72
|
+
5. **Phases gated on a spike verdict** that may return FINDING.
|
|
73
|
+
|
|
74
|
+
Also check the **family concurrency cap** (`lint_roadmap_family_cap`) —
|
|
75
|
+
adding a third `road-to-<family>-*` roadmap without archiving one reds
|
|
76
|
+
CI.
|
|
77
|
+
|
|
78
|
+
Partial disqualification is normal and does **not** drop a candidate:
|
|
79
|
+
record which phases the blocker actually blocks. A roadmap whose blocker
|
|
80
|
+
touches one deferred step still has a full working set.
|
|
81
|
+
|
|
82
|
+
Delegate the per-candidate reads to parallel subagents when more than
|
|
83
|
+
three candidates survive step 1 (per
|
|
84
|
+
[`delegation-policy`](../../rules/delegation-policy.md)); each returns
|
|
85
|
+
`{slug, open_steps, blockers[], disqualifiers[], blocked_phases[]}` and
|
|
86
|
+
nothing else.
|
|
87
|
+
|
|
88
|
+
### 3. Rank, then let the council settle a genuine tie
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
RANK BY DEFECT SEVERITY, NEVER BY PERCENT-DONE OR STEP COUNT.
|
|
92
|
+
A ROADMAP THAT REPAIRS A LIVE, USER-VISIBLE WRONGNESS OUTRANKS
|
|
93
|
+
ONE THAT MOVES MORE CHECKBOXES. PICKING BY CHECKBOX COUNT IS THE
|
|
94
|
+
GOODHART MOVE THIS PACKAGE'S OWN DISCIPLINE FORBIDS.
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
- **Exactly one survivor, or one that dominates** → take it, state the
|
|
98
|
+
one-line reason inline, proceed. Do not ask
|
|
99
|
+
([`no-cheap-questions`](../../rules/no-cheap-questions.md)).
|
|
100
|
+
- **Two or more with a real trade-off** → put the pick to the AI
|
|
101
|
+
council with the constraint set stated (survivors, open-step counts,
|
|
102
|
+
blocked phases, severity read) per
|
|
103
|
+
[`ai-council`](../../skills/ai-council/SKILL.md). Check the council's
|
|
104
|
+
decisive premise against the tree before adopting it — twice recorded,
|
|
105
|
+
the load-bearing claim was falsifiable in-repo.
|
|
106
|
+
- **Zero survivors** → emit the screen table (candidate · open steps ·
|
|
107
|
+
disqualifier) and stop. Suggest
|
|
108
|
+
[`/roadmap:create`](create.md) or a blocker the user can clear. Do
|
|
109
|
+
not manufacture a pick.
|
|
110
|
+
|
|
111
|
+
### 4. Workspace — branch by default, worktree on request
|
|
112
|
+
|
|
113
|
+
Default: a feature branch in the current checkout, named
|
|
114
|
+
`feat/<roadmap-slug>` per [`commit-conventions`](../../rules/commit-conventions.md).
|
|
115
|
+
Propose the name once and proceed; no naming menu.
|
|
116
|
+
|
|
117
|
+
`--worktree` — or the user saying "in a worktree" — routes through
|
|
118
|
+
[`/worktree:create`](../../worktree/create.md) in full, including its
|
|
119
|
+
[seeding allow/deny list](../../../skills/using-git-worktrees/SKILL.md#4b-seed-the-worktree--allow--deny-list).
|
|
120
|
+
Two entries decide whether the run's gate results mean anything:
|
|
121
|
+
dependencies are symlinked or installed **fully**, and
|
|
122
|
+
`.agent-settings.yml` is **never** copied — absent IS the CI shape.
|
|
123
|
+
|
|
124
|
+
### 5. Run it
|
|
125
|
+
|
|
126
|
+
Hand off to [`/roadmap:process-full`](process-full.md) and follow it
|
|
127
|
+
verbatim, including its Iron Law — full is full, and its five halt
|
|
128
|
+
conditions are the only stops. The execution contract from
|
|
129
|
+
[`roadmap-execution-contract`](../../contexts/execution/roadmap-execution-contract.md)
|
|
130
|
+
is derived once; the user's single Accept covers branch, chunked
|
|
131
|
+
commits, push to that branch, and the PR.
|
|
132
|
+
|
|
133
|
+
### 6. Deliver
|
|
134
|
+
|
|
135
|
+
Chunked commits (the agent picks the split — never ask how, per
|
|
136
|
+
[`commit-policy`](../../rules/commit-policy.md)), then
|
|
137
|
+
[`/create-pr`](../../git/pr/create.md): archival sweep, preflight,
|
|
138
|
+
push, PR opened **ready for review** (not draft).
|
|
139
|
+
|
|
140
|
+
### 7. CI — fix locally, honour the push gate
|
|
141
|
+
|
|
142
|
+
Follow [`/create-pr` § 4d](../../git/pr/create.md): wait for the
|
|
143
|
+
verdict in the background, never end the turn on "CI is running",
|
|
144
|
+
diagnose and fix in the working tree on red, within the N=3 budget per
|
|
145
|
+
[`autonomous-execution`](../../rules/autonomous-execution.md).
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
THE LOCAL FIX IS AUTONOMOUS. THE RE-PUSH IS NOT.
|
|
149
|
+
git push IS A HARD-FLOOR TRIGGER AND THE FLOOR REFUSES A STANDING
|
|
150
|
+
DIRECTIVE BY CONSTRUCTION. FIX, VERIFY, THEN SAY WHAT IS READY.
|
|
151
|
+
NEVER INVENT A PER-PR "STANDING MANDATE" WORKAROUND.
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
The cheapest CI-fix loop is the one that never fires: run `task
|
|
155
|
+
preflight` before the first push, which runs the same
|
|
156
|
+
`skill_linter --changed` gate CI does.
|
|
157
|
+
|
|
158
|
+
### 8. Report
|
|
159
|
+
|
|
160
|
+
Roadmap picked + the screen result that picked it · steps closed /
|
|
161
|
+
total · commits · PR URL as the literal last line (per
|
|
162
|
+
[`direct-answers`](../../rules/direct-answers.md) reply-close) · CI
|
|
163
|
+
verdict · anything left open with its reason.
|
|
164
|
+
|
|
165
|
+
## Iron Law — screened, never guessed
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
NEVER PICK A ROADMAP FROM MEMORY, A DASHBOARD COUNT, OR AN EARLIER SESSION.
|
|
169
|
+
THE THREE LIVE CHECKS RUN FIRST, EVERY INVOCATION.
|
|
170
|
+
A ROADMAP CLAIMED "IN FLIGHT", "MERGED", OR "DONE" WITHOUT A LIVE CHECK
|
|
171
|
+
AT THE MOMENT OF THE CLAIM IS AN UNVERIFIED CLAIM.
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Rules
|
|
175
|
+
|
|
176
|
+
- **One roadmap per invocation.** Never chain a second pick after the
|
|
177
|
+
first closes — the user re-invokes.
|
|
178
|
+
- **The screen is reported, not just used.** State which candidates were
|
|
179
|
+
disqualified and on what, so the pick is auditable.
|
|
180
|
+
- **A judgement-call blocker goes to the council, not to the user.**
|
|
181
|
+
A human-ACTION blocker goes to neither — it disqualifies.
|
|
182
|
+
- **No merge, ever.** The PR is opened for review; merging is
|
|
183
|
+
conversational ([`non-destructive-by-default`](../../rules/non-destructive-by-default.md)).
|
|
184
|
+
- All rules from [`/roadmap:process-full`](process-full.md#rules) apply
|
|
185
|
+
unchanged to the execution half.
|
|
186
|
+
|
|
187
|
+
## See also
|
|
188
|
+
|
|
189
|
+
- [`/roadmap`](../roadmap.md) — cluster orchestrator
|
|
190
|
+
- [`/roadmap:process-full`](process-full.md) — the execution half this wraps
|
|
191
|
+
- [`/roadmap:ai-council`](ai-council.md) — challenge a roadmap before running it
|
|
192
|
+
- [`/worktree:create`](../../worktree/create.md) — the `--worktree` path
|
|
193
|
+
- [`/create-pr`](../../git/pr/create.md) — delivery + the CI wait contract
|
|
194
|
+
- [`roadmap-process-loop`](../../contexts/execution/roadmap-process-loop.md) — canonical mechanics
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
model_tier: medium
|
|
3
3
|
name: roadmap
|
|
4
4
|
disable-model-invocation: true
|
|
5
|
-
argument-hint: "[create|ai-council|process-step|process-phase|process-full] [args]"
|
|
5
|
+
argument-hint: "[create|ai-council|process-step|process-phase|process-full|next] [args]"
|
|
6
6
|
pack: product-basic
|
|
7
|
-
intent: "Roadmap dispatcher — create, process-step, process-phase, process-full, ai-council"
|
|
8
|
-
routes_to: [roadmap-create, roadmap-ai-council, roadmap-materialize, roadmap-process-step, roadmap-process-phase, roadmap-process-full]
|
|
7
|
+
intent: "Roadmap dispatcher — create, process-step, process-phase, process-full, next, ai-council"
|
|
8
|
+
routes_to: [roadmap-create, roadmap-ai-council, roadmap-materialize, roadmap-process-step, roadmap-process-phase, roadmap-process-full, roadmap-next]
|
|
9
9
|
replaces: []
|
|
10
10
|
tier: 1
|
|
11
11
|
visibility: advanced
|
|
12
|
-
description: Roadmap orchestrator — routes to create (authoring)
|
|
12
|
+
description: Roadmap orchestrator — routes to create (authoring), process-step / process-phase / process-full (autonomous execution), and next (pick a roadmap and ship it).
|
|
13
13
|
cluster: roadmap
|
|
14
14
|
type: orchestrator
|
|
15
15
|
suggestion:
|
|
@@ -40,6 +40,7 @@ paused for confirmation before every step) was removed —
|
|
|
40
40
|
| `/roadmap:process-step` | `commands/roadmap/process-step.md` | Autonomously process the next open step, then stop |
|
|
41
41
|
| `/roadmap:process-phase` (**default execution scope**) | `commands/roadmap/process-phase.md` | Autonomously process every open step in the current phase |
|
|
42
42
|
| `/roadmap:process-full` | `commands/roadmap/process-full.md` | Autonomously process every open step across every phase |
|
|
43
|
+
| `/roadmap:next` | `commands/roadmap/next.md` | Screen for the next executable roadmap, then carry it to a reviewable PR (selection + `process-full` + delivery) |
|
|
43
44
|
|
|
44
45
|
Sub-command names match the locked contract in
|
|
45
46
|
[`docs/contracts/command-clusters.md`](../docs/contracts/command-clusters.md).
|
|
@@ -70,6 +71,7 @@ each only binds a scope delta.
|
|
|
70
71
|
> 3. process-step — process the next open step, then stop
|
|
71
72
|
> 4. process-phase — process the current phase (default)
|
|
72
73
|
> 5. process-full — process every open step across every phase
|
|
74
|
+
> 6. next — pick the next executable roadmap and ship it to a PR
|
|
73
75
|
|
|
74
76
|
## Rules
|
|
75
77
|
|
|
@@ -84,3 +86,9 @@ each only binds a scope delta.
|
|
|
84
86
|
*"finish this phase"*) default to
|
|
85
87
|
[`/roadmap:process-phase`](roadmap/process-phase.md) unless the user
|
|
86
88
|
named a different scope.
|
|
89
|
+
- **Selection intents** (*"take the next sensible roadmap"*, *"nimm dir
|
|
90
|
+
die nächste Roadmap vor"*, *"pick a roadmap and ship it"*) — i.e. the
|
|
91
|
+
user has NOT named a roadmap and wants one chosen — route to
|
|
92
|
+
[`/roadmap:next`](roadmap/next.md), which is the only sub that
|
|
93
|
+
screens and selects. The three `process-*` subs never choose across
|
|
94
|
+
roadmaps.
|
|
@@ -48,7 +48,10 @@ THE SAME MINUS THE QUOTA WIN.
|
|
|
48
48
|
tier <t>`); a 429/quota error trips `tripCooldown` for that tier and
|
|
49
49
|
falls back per the relation — never a retry loop. Under
|
|
50
50
|
`budget_routing: ask`, the FIRST budget-motivated downshift of a session
|
|
51
|
-
is confirmed once
|
|
51
|
+
is confirmed once, in the shape
|
|
52
|
+
[`settings-ask-protocol`](../../rules/settings-ask-protocol.md) fixes and
|
|
53
|
+
without persisting the answer (`subagents.budget_routing` is class C);
|
|
54
|
+
`auto` proceeds silently. Every budget-routed
|
|
52
55
|
dispatch emits one `orchestration_record` line (tier + provenance-tagged
|
|
53
56
|
token delta) so realized savings are measured, not asserted.
|
|
54
57
|
|
|
@@ -50,8 +50,9 @@ clears — all of:
|
|
|
50
50
|
[`auto-dispatch-classification`](../contexts/execution/auto-dispatch-classification.md)
|
|
51
51
|
(≥1 independent, well-specified slice above the size floor).
|
|
52
52
|
|
|
53
|
-
`subagents.auto: ask` → ask once before dispatching
|
|
54
|
-
[`
|
|
53
|
+
`subagents.auto: ask` → ask once before dispatching, in the shape
|
|
54
|
+
[`settings-ask-protocol`](settings-ask-protocol.md) fixes (the answer is not
|
|
55
|
+
persisted — `subagents.auto` is class C); `auto: on` → surface the chosen mode
|
|
55
56
|
+ per-subtask tiers in one line. Any gate failing, or `auto: off`, or no host
|
|
56
57
|
primitive → run in-session (clean no-op).
|
|
57
58
|
|
|
@@ -23,7 +23,9 @@ triggers:
|
|
|
23
23
|
- phrase: "bau das nach"
|
|
24
24
|
- phrase: "1:1 um"
|
|
25
25
|
- phrase: "1:1 nach"
|
|
26
|
+
- phrase: "claude.site/artifacts"
|
|
26
27
|
- file_pattern: "*design.html"
|
|
28
|
+
- path_prefix: ".claude/design-system/"
|
|
27
29
|
applies_to_user_types:
|
|
28
30
|
- "creator"
|
|
29
31
|
- "developer"
|
|
@@ -96,13 +98,27 @@ artifact is simply attached. The last is covered by `file_pattern: *design.html`
|
|
|
96
98
|
HTML edit in every project and be strictly worse than the gap it closes. A
|
|
97
99
|
handover under some other filename needs one word in the prompt.
|
|
98
100
|
|
|
101
|
+
Two further handover shapes carry the artifact without any of the above:
|
|
102
|
+
|
|
103
|
+
- **A capability URL.** A published artifact is handed over as a link, not a
|
|
104
|
+
file — so `phrase: "claude.site/artifacts"` fires on the *published-artifact
|
|
105
|
+
path*, not on the host. `claude.ai` alone is a chat link and must stay quiet:
|
|
106
|
+
a keyword on the bare domain would fire on "I pasted this from claude.ai",
|
|
107
|
+
which is a conversation reference, not a spec.
|
|
108
|
+
- **A design-system directory.** `path_prefix: ".claude/design-system/"` — the
|
|
109
|
+
conventional location for a handed-over token/component set. The prefix is the
|
|
110
|
+
vendor-scoped directory, never a bare `design-system/`, which is a normal
|
|
111
|
+
source folder in a large fraction of frontend repos.
|
|
112
|
+
|
|
99
113
|
The trigger set is deliberately phrase-heavy on the German side and on
|
|
100
114
|
`artifact`: a bare `artifact` keyword fires on "the CI build artifact is 40 MB".
|
|
101
115
|
`ROUTING_MATRIX` in
|
|
102
116
|
[`design_fidelity_routing.test.ts`](../../tests/scripts/design_fidelity_routing.test.ts)
|
|
103
117
|
pins both halves — every class that must route, and the near-misses that must
|
|
104
118
|
stay silent (fixture `daf-port-trigger-de`). Extending the set without adding a
|
|
105
|
-
near-miss row there is how an over-broad trigger lands
|
|
119
|
+
near-miss row there is how an over-broad trigger lands: each of the two triggers
|
|
120
|
+
above ships with its own near-miss row (`near-claude-ai-chat-link`,
|
|
121
|
+
`near-generic-design-system-dir`).
|
|
106
122
|
|
|
107
123
|
Body migrated to [`guideline:design-fidelity-mechanics`](../docs/guidelines/design-fidelity-mechanics.md) (per P4 of `road-to-kernel-and-router.md`) — surgical visual edits (targeted-edit vs redesign-trigger discipline, stable anchors), asset & imagery discipline (owned-asset path, third-party delivery is self-hosted by default, real-imagery-as-proof, iconography floor, no unrequested filler), deviation-surfacing shape, failure-mode catalog, `daf-*` fixtures.
|
|
108
124
|
Trigger-set above activates this routing on demand, independent of the discipline profile (ADR-110).
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "auto"
|
|
3
|
+
tier: "2b"
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
description: "UI written or changed — review it against the design contract before calling it done; the write-side twin of ui-audit-gate"
|
|
6
|
+
triggers:
|
|
7
|
+
- path_prefix: "resources/views/"
|
|
8
|
+
- path_prefix: "resources/js/"
|
|
9
|
+
- keyword: "component"
|
|
10
|
+
- keyword: "design token"
|
|
11
|
+
routes_to:
|
|
12
|
+
- "skill:design-review"
|
|
13
|
+
- "skill:accessibility-auditor"
|
|
14
|
+
workspaces: [agent-config-maintainer, engineering]
|
|
15
|
+
packs: [frontend-design]
|
|
16
|
+
collision_ok:
|
|
17
|
+
"component": "a written component is reviewed before it is called done — the write-side half"
|
|
18
|
+
"design token": "same surface, opposite side: ui-audit-gate inventories tokens before the write, this reviews what the write emitted"
|
|
19
|
+
"resources/views/": "both halves of one UI loop fire on the same path — audit before, review after; neither substitutes for the other"
|
|
20
|
+
"resources/js/": "both halves of one UI loop fire on the same path — audit before, review after; neither substitutes for the other"
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# Design Review After UI Write
|
|
24
|
+
|
|
25
|
+
The UI loop was closed on one side only. [`ui-audit-gate`](ui-audit-gate.md)
|
|
26
|
+
covers the **read** side — inventory what exists before adding a component — and
|
|
27
|
+
routes to `existing-ui-audit`. Nothing covered the **write** side: **zero rules
|
|
28
|
+
routed to `skill:design-review`**, so a component could be written, declared
|
|
29
|
+
done, and never looked at against the contract it was supposed to satisfy.
|
|
30
|
+
|
|
31
|
+
This is that rule's twin, deliberately built to the same shape: same tier, same
|
|
32
|
+
pack, same diff-decidable allow-list, and the same honest scope.
|
|
33
|
+
|
|
34
|
+
## The Iron Law
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
UI WRITTEN OR CHANGED IS NOT DONE UNTIL IT IS REVIEWED.
|
|
38
|
+
NEVER CLAIM A UI CHANGE IS COMPLETE ON "IT LOOKS RIGHT" — THAT IS A VERDICT
|
|
39
|
+
WITHOUT EVIDENCE. NO RENDER CAPABILITY → SCOPE THE VERDICT TO WHAT WAS
|
|
40
|
+
STATICALLY CHECKED AND SAY SO. NEVER "LOOKS GOOD" WITH NOTHING BEHIND IT.
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## What "reviewed" means
|
|
44
|
+
|
|
45
|
+
The verdict is gated on evidence, not on having run a skill:
|
|
46
|
+
|
|
47
|
+
- **Render capability present** (Playwright MCP, Chrome DevTools, or a live
|
|
48
|
+
preview URL) → the [design-artifact verification checklist](../docs/contracts/design-artifact-verification.md#verification-checklist)
|
|
49
|
+
steps 1–5. A UI task does not pass without render evidence.
|
|
50
|
+
- **Render capability absent** → the verdict is **scoped to the static checks
|
|
51
|
+
that actually ran** and says which those were. This is not a downgrade to be
|
|
52
|
+
hidden; `design-review` itself states it ("scope the verdict to what was
|
|
53
|
+
statically checked and say so"). An unscoped "looks good" is the failure.
|
|
54
|
+
- **A provided artifact is the spec** → findings the artifact *covers* are
|
|
55
|
+
informational, not defects, per [`design-fidelity`](design-fidelity.md). The
|
|
56
|
+
review does not "improve" the user's own design.
|
|
57
|
+
|
|
58
|
+
## Allow-list — `ui-trivial`, decidable from the diff alone
|
|
59
|
+
|
|
60
|
+
Skip only when **all** hold:
|
|
61
|
+
|
|
62
|
+
- ≤ 1 file, ≤ 5 changed lines, no new component, no new state, no new dependency.
|
|
63
|
+
- Inside the work engine, `directive_set == "ui-trivial"` — the dispatcher states
|
|
64
|
+
it directly. Outside it, the same conditions are read **off the diff**, which
|
|
65
|
+
is observable without any dispatcher state.
|
|
66
|
+
|
|
67
|
+
The list is deliberately the engine's five conditions, not the four its
|
|
68
|
+
sibling rule's prose carries: `ui_trivial/apply.ts` enforces `new_dependency`
|
|
69
|
+
too, and a twin that copied the shorter prose would inherit a gap the engine
|
|
70
|
+
does not have.
|
|
71
|
+
|
|
72
|
+
## Honest scope — what this rule does NOT enforce
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
THE REVIEW OBLIGATION IS MODEL-CARRIED. NEVER CLAIM THE REVIEW RAN
|
|
76
|
+
AS IF IT WERE VERIFIED.
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
There is no artefact a chat session can point at to prove a design review
|
|
80
|
+
happened — "I ran `design-review`" is self-report, and self-report is not
|
|
81
|
+
enforcement. So this rule ships `enforced_by: none`, the same honesty boundary
|
|
82
|
+
`ui-audit-gate`, `security-sensitive-stop`, and `untrusted-input-defense` state
|
|
83
|
+
for their own obligations, rather than pretending a satisfiable-by-assertion
|
|
84
|
+
condition is a gate.
|
|
85
|
+
|
|
86
|
+
What that leaves, and it is the useful part: the write side now has a named
|
|
87
|
+
obligation and a route to the skill that discharges it, where before it had
|
|
88
|
+
neither. Full enforcement needs the work-engine `review`/`polish` gates (which
|
|
89
|
+
already act on `a11y_violation` and `token_violation` findings) or pack-scoped
|
|
90
|
+
rule projection — a maintainer decision, never an automated one.
|
|
91
|
+
|
|
92
|
+
One asymmetry worth stating: `design-review` lives in `engineering-base` while
|
|
93
|
+
this rule is scoped to `frontend-design`. The route still resolves — a rule may
|
|
94
|
+
name a skill from another pack — but a consumer with `frontend-design` and
|
|
95
|
+
without `engineering-base` gets the obligation without the skill. That is why
|
|
96
|
+
`accessibility-auditor` is a second route: it is the part of the review that
|
|
97
|
+
must not depend on the pairing.
|
|
98
|
+
|
|
99
|
+
## Failure modes
|
|
100
|
+
|
|
101
|
+
- Writing the component and calling it done because the tests pass — tests do not
|
|
102
|
+
look at it.
|
|
103
|
+
- "Looks good" as a verdict with no render, no static check named, and no scope.
|
|
104
|
+
- Running the review and acting on findings the provided artifact covers, i.e.
|
|
105
|
+
redesigning the user's spec under the banner of quality.
|
|
106
|
+
- Treating the a11y half as optional because the visual half looked fine.
|
|
107
|
+
- Skipping the review for "just one tile" — the same bypass `ui-audit-gate`
|
|
108
|
+
names on its own side.
|
|
109
|
+
|
|
110
|
+
## See also
|
|
111
|
+
|
|
112
|
+
- [`ui-audit-gate`](ui-audit-gate.md) — the read-side twin; audit before writing.
|
|
113
|
+
- [`design-review`](../skills/design-review/SKILL.md) — the 7-phase review this routes to.
|
|
114
|
+
- [`accessibility-auditor`](../skills/accessibility-auditor/SKILL.md) — the WCAG half.
|
|
115
|
+
- [`design-fidelity`](design-fidelity.md) — a provided artifact is the spec; covered findings are informational.
|
|
116
|
+
- [`verify-before-complete`](verify-before-complete.md) — the general no-claim-without-evidence gate this applies to UI.
|
|
@@ -81,9 +81,15 @@ was manufactured anyway.
|
|
|
81
81
|
|
|
82
82
|
[`evidence_independence.ts`](../scripts/hooks/evidence_independence.ts) is a
|
|
83
83
|
`pre_tool_use` concern. It **blocks** a dispatch whose prompt carries a
|
|
84
|
-
pre-loaded verdict, and **blocks** a second
|
|
85
|
-
same turn; it **warns** on the first. It reads the prompt the agent is about
|
|
86
|
-
send, so items 1 and 4 above are mechanically enforced.
|
|
84
|
+
pre-loaded verdict, and **blocks** a second *self-scoped* evaluation dispatch in
|
|
85
|
+
the same turn; it **warns** on the first. It reads the prompt the agent is about
|
|
86
|
+
to send, so items 1 and 4 above are mechanically enforced.
|
|
87
|
+
|
|
88
|
+
Two limits, stated because round 2 measured them. The pre-loaded-verdict list is
|
|
89
|
+
a **phrase list**, so a paraphrase evades it — it catches recurrences of known
|
|
90
|
+
steering wording, not steering as such. And the turn boundary is the
|
|
91
|
+
authorization ledger's `detected_at` stamp, because the envelope carries no turn
|
|
92
|
+
id; with no ledger yet, the counter falls back to session scope.
|
|
87
93
|
|
|
88
94
|
Items 2 and 3 — an honestly chosen scope, and recording the prompt with the
|
|
89
95
|
verdict — are **not** enforced by anything. A narrowed scope is not decidable
|
|
@@ -12,6 +12,8 @@ workspaces: [agent-config-maintainer, construction, engineering, finance, founde
|
|
|
12
12
|
packs: [meta]
|
|
13
13
|
enforced_by:
|
|
14
14
|
- "hook:session-canary"
|
|
15
|
+
collision_ok:
|
|
16
|
+
"canary_name": "this rule owns what the NAME does once set and which of the three layers already supplies it; settings-ask-protocol owns how it is asked for and where the answer goes"
|
|
15
17
|
---
|
|
16
18
|
|
|
17
19
|
# Session Canary
|