@event4u/agent-config 10.2.0 → 10.4.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.
Files changed (96) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +168 -256
  3. package/README.md +1 -1
  4. package/dist/agent-src/commands/analyze/reference-repo.md +62 -0
  5. package/dist/agent-src/commands/analyze.md +2 -1
  6. package/dist/agent-src/commands/design-system/capture.md +44 -0
  7. package/dist/agent-src/commands/design-system/generate.md +53 -0
  8. package/dist/agent-src/commands/design-system/import.md +63 -0
  9. package/dist/agent-src/commands/design-system.md +66 -0
  10. package/dist/agent-src/commands/roadmap/create.md +4 -1
  11. package/dist/agent-src/personas/advisors/first-principles.md +6 -0
  12. package/dist/agent-src/rules/active-remediation.md +53 -2
  13. package/dist/agent-src/rules/code-provenance.md +66 -4
  14. package/dist/agent-src/rules/content-quoting-floor.md +6 -0
  15. package/dist/agent-src/rules/design-fidelity.md +49 -3
  16. package/dist/agent-src/skills/design-review/references/verification-automation.md +23 -1
  17. package/dist/agent-src/skills/design-system-capture/SKILL.md +9 -0
  18. package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +70 -0
  19. package/dist/agent-src/skills/fe-design/SKILL.md +27 -3
  20. package/dist/agent-src/skills/judge-synthesis/SKILL.md +30 -0
  21. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +11 -0
  22. package/dist/agent-src/skills/roadmap-writing/SKILL.md +8 -8
  23. package/dist/agent-src/skills/skill-writing/SKILL.md +4 -0
  24. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  25. package/dist/agent-src/templates/persona.md +26 -0
  26. package/dist/agent-src/templates/roadmaps.md +27 -7
  27. package/dist/agent-src/templates/scripts/work_engine/directives/ui/design.ts +4 -1
  28. package/dist/agent-src/templates/skill.md +35 -1
  29. package/dist/cli/commands/commands.candidates.test.js +257 -0
  30. package/dist/cli/commands/commands.candidates.test.js.map +1 -0
  31. package/dist/cli/commands/commands.js +199 -0
  32. package/dist/cli/commands/commands.js.map +1 -1
  33. package/dist/cli/main.js +1 -0
  34. package/dist/cli/main.js.map +1 -1
  35. package/dist/cli/registry.js +1 -1
  36. package/dist/cli/registry.js.map +1 -1
  37. package/dist/cli-delegate/{chunk-E4RUZKXB.js → chunk-FV34EGEX.js} +1 -1
  38. package/dist/cli-delegate/chunk-RLN73PR5.js +157 -0
  39. package/dist/cli-delegate/{chunk-I5EAFRII.js → chunk-ZPSXJTLI.js} +2 -154
  40. package/dist/cli-delegate/cmd_conformance.js +672 -214
  41. package/dist/cli-delegate/cmd_doctor.js +1 -1
  42. package/dist/cli-delegate/cmd_handoff.js +8 -6
  43. package/dist/cli-delegate/cmd_session_recycle.js +5 -3
  44. package/dist/discovery/deprecation-report.md +1 -1
  45. package/dist/discovery/discovery-manifest.json +127 -22
  46. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  47. package/dist/discovery/discovery-manifest.summary.md +3 -3
  48. package/dist/discovery/dormancy-report.md +1 -1
  49. package/dist/discovery/orphan-report.md +1 -1
  50. package/dist/discovery/packs.json +9 -5
  51. package/dist/discovery/trust-report.md +2 -2
  52. package/dist/discovery/workspaces.json +8 -4
  53. package/dist/hooks/dispatch.js +1056 -411
  54. package/dist/mcp/registry-manifest.json +3 -3
  55. package/dist/mcp/server.json +2 -2
  56. package/dist/mcp/server.mjs +1103 -593
  57. package/dist/router.json +1 -1
  58. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +54 -0
  59. package/docs/guidelines/design-antipatterns.md +79 -10
  60. package/docs/guidelines/design-fidelity-mechanics.md +120 -2
  61. package/package.json +1 -1
  62. package/src/agent-src/templates/scripts/work_engine/directives/ui/design.ts +4 -1
  63. package/src/config/gate-coverage.yml +65 -10
  64. package/src/config/gate-violation-baselines.json +6 -0
  65. package/src/config/review-prompt-binding-baseline.json +19 -0
  66. package/src/config/rule-enforcement-baseline.json +0 -1
  67. package/src/scripts/_dispatch.bash +1 -0
  68. package/src/scripts/_lib/design_system_import.ts +987 -0
  69. package/src/scripts/ai_council/clients.ts +15 -1
  70. package/src/scripts/check_ci_local_parity.ts +60 -6
  71. package/src/scripts/check_review_prompt_binding.ts +553 -0
  72. package/src/scripts/check_suppression_hygiene.ts +19 -3
  73. package/src/scripts/design_slop_rules.test.ts +37 -6
  74. package/src/scripts/design_slop_rules.ts +150 -22
  75. package/src/scripts/design_system_import.ts +264 -0
  76. package/src/scripts/dispatch_r2_reviewer.ts +15 -1
  77. package/src/scripts/hook_manifest.yaml +71 -2
  78. package/src/scripts/hooks/concern_registry.ts +4 -0
  79. package/src/scripts/hooks/dispatch_hook.ts +10 -0
  80. package/src/scripts/hooks/host_semantics.ts +2 -0
  81. package/src/scripts/hooks/spawn_guard_shadow_hook.ts +212 -0
  82. package/src/scripts/hooks/subagent_ledger_hook.ts +723 -0
  83. package/src/scripts/hooks/turn_end_gate_hook.ts +39 -2
  84. package/src/scripts/hooks/ui_route_nudge_hook.ts +55 -2
  85. package/src/scripts/lint_design_antipattern_parity.ts +201 -0
  86. package/src/scripts/lint_harvest_provenance.ts +483 -0
  87. package/src/scripts/lint_hook_manifest.ts +2 -0
  88. package/src/scripts/lint_rule_skill_pack_reach.ts +194 -13
  89. package/src/scripts/lint_skill_router_head.ts +254 -0
  90. package/src/scripts/report_consultation_rate.ts +126 -1
  91. package/src/scripts/run_skill_evals.ts +10 -5
  92. package/src/scripts/schemas/persona.schema.json +8 -0
  93. package/src/scripts/schemas/provenance-harvest.schema.json +39 -0
  94. package/src/scripts/sweep_dead_scan_roots.ts +51 -0
  95. package/tests/fixtures/hooks/subagent_start.json +7 -0
  96. package/tests/fixtures/hooks/subagent_stop.json +8 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@event4u/agent-config",
3
3
  "mcpName": "io.github.event4u-app/agent-config",
4
- "version": "10.2.0",
4
+ "version": "10.4.0",
5
5
  "description": "Governed skills, rules and commands for AI coding tools (Claude Code, Cursor, Windsurf, Copilot) — every claim machine-checked, including \"zero runtime daemon\".",
6
6
  "license": "MIT",
7
7
  "private": false,
@@ -345,7 +345,10 @@ function _halt_provided_without_contract(
345
345
  '> 1. Proceed — port it with those five losses on the record; `apply` ' +
346
346
  'still has to report what it honoured, translated, and flagged',
347
347
  '> 2. Supply a `design-system.json` — its token values are then ' +
348
- 'honoured verbatim instead of re-derived',
348
+ 'honoured verbatim instead of re-derived. Already have an ' +
349
+ "extractor's output in another shape? `/design-system:import " +
350
+ '<file>` maps a DTCG token file or an extraction tool\'s raw JSON ' +
351
+ 'into this contract offline.',
349
352
  '> 3. Abort — drop this UI request',
350
353
  '',
351
354
  '**Recommendation: 2 — Supply the contract** — it is the only option ' +
@@ -40,16 +40,29 @@
40
40
  # visible, or it repeats the sin it exists to catch.
41
41
  # canary optional mutation recipe (Phase 7) — see CANARY below
42
42
  #
43
- # COVERAGE — THE HONEST DENOMINATOR (re-measured 2026-08-10)
43
+ # COVERAGE — THE HONEST DENOMINATOR (re-measured 2026-08-13)
44
44
  # ----------------------------------------------------------
45
- # 251 `lint_*` / `check_*` / `audit_*` scripts live under `src/scripts/`
45
+ # 257 `lint_*` / `check_*` / `audit_*` scripts live under `src/scripts/`
46
46
  # (the count is computed, not asserted — `check_gate_coverage.count_gate_scripts`).
47
- # **33 of them emit the machine-readable `scanned: <N>` line under their
48
- # CI-identical argv, and all 33 are listed below.** The manifest is therefore
49
- # complete with respect to its own contract, and covers ~13 % of the population.
50
- # (The 2026-08-05 reading said "32 … and all 31 are listed": the two halves of
51
- # one sentence disagreed by one, which is the drift this paragraph exists to
52
- # make visible. Both are recounted above, not adjusted toward each other.)
47
+ # **35 of them emit the machine-readable `scanned: <N>` line under their
48
+ # CI-identical argv, and all 35 are listed below.** The manifest is therefore
49
+ # complete with respect to its own contract, and covers ~14 % of the population.
50
+ # (The 2026-08-05 reading said "32 … and all 31 are listed"; the 2026-08-10
51
+ # reading said "33 … and all 33" while 34 entries were listed. Both halves are
52
+ # RECOUNTED here: 257 is what `count_gate_scripts()` returns on the tree that
53
+ # carries this change, and 35 is the entries counted directly. It read 255 while
54
+ # this change was being written and 257 after `main` merged in two further gate
55
+ # scripts — re-measured at the merge rather than left at the earlier reading,
56
+ # which is the same discipline the note below records failing.)
57
+ #
58
+ # A 2026-08-13 revision of this paragraph first wrote 256, derived as "255 before
59
+ # this change plus the one it adds" — inside the sentence claiming to have
60
+ # recounted. It was wrong twice over: 255 was already the reading WITH the new
61
+ # script present, and arithmetic on the previous prose is the exact move this
62
+ # paragraph forbids. Recorded rather than quietly corrected, because a
63
+ # denominator that goes stale by being adjusted is the failure documented here
64
+ # twice before, and the third instance is the one that shows the note is not
65
+ # enough on its own.
53
66
  #
54
67
  # Two revisions of this header have now gone stale the same way. It claimed
55
68
  # "8 of 211", then "22 of 223" while 26 entries were listed. Both halves drift
@@ -292,8 +305,8 @@ gates:
292
305
 
293
306
  - id: check_ci_local_parity
294
307
  argv: ["--quiet"]
295
- min_scanned: 380
296
- corpus: "CI + local gate invocations parsed from .github/workflows + taskfiles (443 at baseline)"
308
+ min_scanned: 340
309
+ corpus: "CI + local gate invocations parsed from .github/workflows + taskfiles (360 measured 2026-08-13: 109 CI + 251 local)"
297
310
  status: enforced
298
311
  note: >
299
312
  Registered 2026-08-02. It already emitted the contract line on every path,
@@ -304,6 +317,27 @@ gates:
304
317
  taskfile set, so the only plantable violation is a new file under
305
318
  .github/workflows — a surface the canary must not write to. Reported
306
319
  UNPROVEN by --canary, never green.
320
+ FLOOR RE-ANCHORED 380 → 340 on 2026-08-13, and the direction deserves an
321
+ argument rather than a diff.
322
+ The claim is NOT that 443 minus phantoms equals 360 — that arithmetic does
323
+ not close, and pretending otherwise would be the false-precision this
324
+ manifest exists to prevent. 443 was measured on 2026-08-02 against a
325
+ different tree: both a CI-side set inflated by 167 phantoms AND a smaller
326
+ local set than today's. The two totals are not comparable term by term.
327
+ What IS comparable is the repair's own before/after on ONE tree, which is
328
+ the measurement that matters here: CI-side 273 → 106, because gate names
329
+ were being read out of workflow COMMENTS by an extraction bug this gate's
330
+ own repair removed. So the fall is entries that never existed ceasing to be
331
+ counted, not reach being lost — the discriminator false-green.md § 5 asks
332
+ for ("a legitimate ratchet lowers severity while keeping reach"). Reach over
333
+ the real corpus is one unit HIGHER than before this change: the two gates
334
+ wired into consistency.yml were previously reachable from neither side.
335
+ Why 340 and not 360, the measured value: gate-authoring.md § registration
336
+ requires a floor BELOW the live count, because a floor pinned at today's
337
+ number reds on the very change that legitimately retires one unit. 340
338
+ leaves ~20 units (~5.5%) of headroom while still catching the collapse this
339
+ floor exists for — a re-broken extractor would drop the count by 164, not
340
+ by 20.
307
341
 
308
342
  - id: check_site_links
309
343
  argv: []
@@ -677,6 +711,27 @@ gates:
677
711
  a gate scanning nothing — it plants the removal-permitting class with no
678
712
  evidence and the gate reds.
679
713
 
714
+ - id: check_review_prompt_binding
715
+ argv: []
716
+ min_scanned: 15
717
+ corpus: "agents/evidence/reviews/<slug>.review-input/prompt.md paired with a prompt_hash in <slug>.findings.md (19 at baseline)"
718
+ status: enforced
719
+ canary:
720
+ class: unbound-review-prompt
721
+ path: agents/evidence/reviews/zcs-closure.review-input/prompt.md
722
+ content: |
723
+ Planted canary: a reviewer prompt whose sha256 cannot equal the
724
+ prompt_hash recorded in zcs-closure.findings.md.
725
+ note: >
726
+ The plant needs a slug that already carries a `prompt_hash` but no committed
727
+ package — a brand-new `zz-canary` slug is skipped, not caught, because an
728
+ artefact without a package is deliberately out of scope. `zcs-closure` is a
729
+ closed round, so it will not gain a real package and the plant cannot
730
+ collide with one. The two planted failures the roadmap asked for (a one-byte
731
+ prompt edit, a pre-loaded verdict) are pinned in
732
+ tests/scripts/check_review_prompt_binding.test.ts, which is where the
733
+ two-file plants this single-file recipe cannot express are exercised.
734
+
680
735
  - id: check_corpus_staleness
681
736
  argv: ["--quiet", "--today", "2026-08-06"]
682
737
  min_scanned: 5
@@ -1,6 +1,12 @@
1
1
  {
2
2
  "$comment": "Violation ratchet for gates whose dead scan root was repaired. A repair REVEALS pre-existing debt; it does not create it. Each entry records the count revealed at repair time — the gate fails only when its count RISES. Lowering a count is a normal commit; raising one is a defect. Entries expire: a baseline that has not dropped within 56 days of `landed` (or of `reaffirmed.date`) fails its gate, because a number that never moves is suppression with extra steps. Mechanism + rationale: src/scripts/_lib/gate_baseline.ts. Decision: AI council 2026-08-02, roadmap road-to-gates-that-can-fail blocker `dead-gate-finding-triage`.",
3
3
  "gates": {
4
+ "ci-parity:local-only": {
5
+ "count": 166,
6
+ "landed": "2026-08-13",
7
+ "note": "Gates that `task ci` runs and no workflow does — the direction this manifest's own header calls the one that let real defects merge (16 stale index rows reached the trunk behind a local-only check-index). Revealed, not created, by repairing the checker's extraction: check_ci_local_parity built its CI-side set by regexing RAW workflow text for `task <name>` and expanding each closure, comments included. Several workflow comments contain the literal string `task ci` while stating that no workflow invokes it, so `ci` was read as an invocation and its full 247-gate closure entered the 'runs in CI' set. The count was therefore 0 BY CONSTRUCTION, and the prose documenting the gap was what suppressed it. Measured at the repair: CI-side 273 → 106, undeclared_local_only 0 → 167 of 247 local gates (68%). Baselined rather than hard-failed because 167 findings nobody can clear in the change that reveals them is the gate-that-lands-as-N-instant-blockers failure this repository has refused before; shrink-only keeps the property that matters, namely that a NEW gate registered in `task ci` with no workflow reds immediately. Lowering happens by wiring gates into workflows or declaring them under `local_only:` with a reason. Note the punchline, because it bounds the risk of this entry: check_ci_local_parity ITSELF runs in no workflow, so it is its own finding and this ratchet has no remote reach either — clearing the backlog is what gives it teeth. DRAINED BY ONE, 2026-08-13: check_ci_local_parity itself was wired into consistency.yml, so it left the set it exists to report. That is the whole shape of a legitimate drain here — the gate stops being local-only because a workflow now runs it, not because the declaration list grew. The floor in gate-coverage.yml moved in the same change and for the same reason: wiring two gates raised the parsed population 357 -> 359.",
8
+ "falsifier": "./scripts-run src/scripts/check_ci_local_parity"
9
+ },
4
10
  "check_no_new_legacy_path:hardcoded-scan-roots": {
5
11
  "count": 48,
6
12
  "landed": "2026-08-09",
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema_note": "Consumed by src/scripts/check_review_prompt_binding.ts. An entry EXEMPTS one committed review prompt from the sha256(prompt.md) == prompt_hash check. Both hashes are pinned on purpose: if either moves, the entry stops matching and the gate reds, so a later repair and a further corruption are equally visible. A pre-loaded verdict is NEVER suppressed by the hash exemption alone — it needs its own `steered_ack` block on the entry, which pins the exact matched phrase, so growth of the shared steering predicate cannot turn committed prompts into permanent unfixable blocks and cannot be waved through silently either.",
3
+ "entries": [
4
+ {
5
+ "slug": "zcs-close-2026-08-09",
6
+ "declared": "48eae5ad829b375c4667fcd72ecc482cbd62ae90788134ca46a81eacce267d49",
7
+ "actual": "f83ee959abb7f8c333bc89f117d3dee93f0e7b2a816c4593471aeda9b18c302d",
8
+ "reason": "Explained and closed at the cause: the archival sweep rewrote a roadmap path INSIDE this committed reviewer prompt while migrating inbound references. The cause was fixed on 2026-08-11 by _FROZEN_RECORD_PREFIXES in the sweep. Not repaired because repair is not available here: the recorded hash was produced by the ORIGINAL prompt text, so rewriting the hash to match the corrupted text would fabricate a binding that never existed, and restoring the text from history would erase the only evidence that the sweep reached inside a committed round at all. An earlier revision of this entry cited section 2.7 as forbidding the edit; that citation was wrong and is corrected here, because section 2.7 says the rename is an archival step and never an edit ban on a live artefact.",
9
+ "falsifier": "npx tsx src/scripts/check_review_prompt_binding.ts --json # the recorded actual hash stops matching the committed prompt.md, i.e. the record moved after all"
10
+ },
11
+ {
12
+ "slug": "feat-parallel-session-collision-hardening",
13
+ "declared": "d996e8e86a6e21a7cad66963f70219e59fe8cb96bca0bd1adceeea7ad2565c4b",
14
+ "actual": "dae1f14e90be94e71415e520b08222ea819488188d670de280d874803de1035c",
15
+ "reason": "Current and UNEXPLAINED, and it is the empirical justification for this gate. The prompt.md has a single commit dated 2026-08-12, after the sweep fix, so the sweep did not cause it; the declared hash never matched the committed text. CRLF/LF and trailing-newline variants were all tried and none reproduces the declared hash. Not repaired because no repair is knowable: with the cause unidentified, neither side can be established as the correct one, and editing either to make them agree would assert a binding nobody has evidence for. Recording it keeps the discrepancy visible until someone can explain it.",
16
+ "falsifier": "npx tsx src/scripts/check_review_prompt_binding.ts --json # a cause is found and the entry is replaced by the repair, or the recorded actual hash stops matching"
17
+ }
18
+ ]
19
+ }
@@ -1,5 +1,4 @@
1
1
  [
2
- "active-remediation.md",
3
2
  "agent-authority.md",
4
3
  "analysis-skill-routing.md",
5
4
  "architecture.md",
@@ -80,6 +80,7 @@ TS-shell native (run via the installed `agent-config` binary):
80
80
  Names the degraded case (settings file without a
81
81
  profile.id → zero packs) that nothing else reports.
82
82
  commands [ls|explain] List/explain the command surface from the discovery manifest
83
+ (ls --candidates: surface-reduction report, report-only)
83
84
  mcp-server Turnkey read-only stdio MCP server (no repo clone; ADR-085)
84
85
  doctor-shell Probe the TS-shell environment
85
86
  rtk:detect rtk (Rust Token Killer) presence + identity readout (--json)