@event4u/agent-config 14.14.0 → 14.15.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 (72) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +63 -0
  5. package/README.md +1 -1
  6. package/dist/agent-src/commands/pr/create.md +16 -1
  7. package/dist/agent-src/contexts/execution/terminal-states.md +25 -4
  8. package/dist/agent-src/rules/missing-skill-recovery.md +2 -2
  9. package/dist/agent-src/rules/token-budget-discipline.md +2 -2
  10. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  11. package/dist/cli/registry.js +1 -0
  12. package/dist/cli-delegate/{chunk-ILMUPLGW.js → chunk-7RXIKF62.js} +159 -86
  13. package/dist/cli-delegate/cmd_conformance.js +513 -17
  14. package/dist/cli-delegate/cmd_doctor.js +1 -1
  15. package/dist/discovery/deprecation-report.md +1 -1
  16. package/dist/discovery/discovery-manifest.json +5 -5
  17. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  18. package/dist/discovery/discovery-manifest.summary.md +1 -1
  19. package/dist/discovery/dormancy-report.md +1 -1
  20. package/dist/discovery/orphan-report.md +1 -1
  21. package/dist/discovery/packs.json +2 -2
  22. package/dist/discovery/trust-report.md +1 -1
  23. package/dist/discovery/workspaces.json +2 -2
  24. package/dist/hooks/dispatch.js +1043 -390
  25. package/dist/mcp/registry-manifest.json +2 -2
  26. package/dist/mcp/server.json +2 -2
  27. package/dist/mcp/server.mjs +703 -115
  28. package/package.json +1 -1
  29. package/src/config/assurance-capability-registry.json +1 -1
  30. package/src/config/evaluator-budgets.json +4 -4
  31. package/src/config/gate-coverage.yml +62 -2
  32. package/src/config/gate-reachability-exemptions.json +1 -0
  33. package/src/config/gate-violation-baselines.json +4 -3
  34. package/src/config/rule-enforcement-baseline.json +0 -1
  35. package/src/config/web-launch-readiness.json +4 -2
  36. package/src/scripts/_cli/_doctor_emit.ts +71 -0
  37. package/src/scripts/_cli/_doctor_strict.ts +163 -0
  38. package/src/scripts/_cli/cmd_doctor.ts +16 -37
  39. package/src/scripts/_dispatch.bash +11 -0
  40. package/src/scripts/_lib/branch_convergence.ts +186 -0
  41. package/src/scripts/_lib/context_observation.ts +132 -0
  42. package/src/scripts/_lib/continuation_ladder.ts +188 -0
  43. package/src/scripts/_lib/experiment_binding.ts +95 -0
  44. package/src/scripts/_lib/ignored_blocker.ts +8 -1
  45. package/src/scripts/_lib/outcome_envelope.ts +6 -1
  46. package/src/scripts/_lib/outcome_vocabularies.ts +135 -5
  47. package/src/scripts/_lib/release_highlights.ts +75 -10
  48. package/src/scripts/_lib/repeated_failure.ts +19 -2
  49. package/src/scripts/_lib/runtime_journal.ts +11 -4
  50. package/src/scripts/check_agent_artifact_location.ts +337 -0
  51. package/src/scripts/check_artefact_count_messaging.ts +74 -8
  52. package/src/scripts/check_enforcement_coverage.ts +40 -1
  53. package/src/scripts/check_release_highlights.ts +17 -1
  54. package/src/scripts/check_web_launch_readiness.ts +310 -20
  55. package/src/scripts/evolution_lab.ts +53 -1
  56. package/src/scripts/generate_capability_matrix.ts +16 -9
  57. package/src/scripts/git_authorization_hook.ts +476 -6
  58. package/src/scripts/grade_target_readiness.ts +221 -2
  59. package/src/scripts/hook_effect_doctor.ts +47 -4
  60. package/src/scripts/hooks/block_unauthorized_git.ts +238 -9
  61. package/src/scripts/hooks/merge_impact.ts +207 -0
  62. package/src/scripts/hooks/run_continuation_hook.ts +78 -88
  63. package/src/scripts/hooks/session_eol_hook.ts +12 -1
  64. package/src/scripts/install-hooks.sh +18 -0
  65. package/src/scripts/lint_code_comments.ts +106 -1
  66. package/src/scripts/release.ts +5 -17
  67. package/src/scripts/release_drill.ts +76 -1
  68. package/src/scripts/release_env.ts +31 -0
  69. package/src/scripts/release_publication.ts +125 -1
  70. package/src/scripts/roadmap_context.ts +15 -0
  71. package/src/scripts/skill_scout.ts +633 -0
  72. package/src/scripts/sync_pr_branch.ts +521 -42
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "event4u-agent-config",
3
3
  "description": "Governed agent system — skills, rules, commands, and guidelines for AI-assisted development.",
4
- "version": "14.14.0",
4
+ "version": "14.15.0",
5
5
  "owner": {
6
6
  "name": "event4u",
7
7
  "email": "dev@event4u.app"
8
8
  },
9
9
  "metadata": {
10
10
  "description": "A policy-driven execution system that enforces quality, consistency, and developer-like behavior for AI agents.",
11
- "version": "14.14.0"
11
+ "version": "14.15.0"
12
12
  },
13
13
  "plugins": [
14
14
  {
15
15
  "name": "agent-config",
16
16
  "description": "Full governed agent system — rules, skills, commands, guidelines, and runtime tooling.",
17
- "version": "14.14.0",
17
+ "version": "14.15.0",
18
18
  "source": ".",
19
19
  "category": "governance",
20
20
  "tags": [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agent-config",
3
3
  "description": "A governed skill framework for AI agents — runtime execution, tooling, observability, feedback, and lifecycle management with policy-driven quality enforcement.",
4
- "version": "14.14.0",
4
+ "version": "14.15.0",
5
5
  "author": {
6
6
  "name": "event4u",
7
7
  "email": "dev@event4u.app"
@@ -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": "14.14.0",
9
+ "version": "14.15.0",
10
10
  "keywords": [
11
11
  "agent-config",
12
12
  "skills",
package/CHANGELOG.md CHANGED
@@ -434,6 +434,69 @@ Entry-shape contract: [`docs/contracts/CHANGELOG-conventions.md`](docs/contracts
434
434
  > that forces a new era split (`# Era: 14.15.x`, etc.) — see
435
435
  > [`docs/contracts/CHANGELOG-conventions.md § Era splits`](docs/contracts/CHANGELOG-conventions.md).
436
436
 
437
+ ## [14.15.0](https://github.com/event4u-app/agent-config/compare/14.14.1...14.15.0) (2026-09-03)
438
+
439
+ ### Release highlights
440
+
441
+ - **Behaviour changes:** stage-2 impact scan, so a refused merge can be answered in four words (5a3b7c5).
442
+ - **Default changes + migration:** _none_
443
+ - **Security and correctness:** make the derived head publishable, so a release stops halting by construction (e6f6744); ask for the curated head before the release commit, not after (e31f07a).
444
+ - **Honest nulls:** _none_
445
+ - **Known limitations:** _none_
446
+
447
+ ### Features
448
+
449
+ * **authz:** stage-2 impact scan, so a refused merge can be answered in four words ([5a3b7c5](https://github.com/event4u-app/agent-config/commit/5a3b7c5064b2e92523781530cbfe6ef09bd26f35))
450
+ * **authz:** classify the 17 destructive operations the guard could not see ([a1327b2](https://github.com/event4u-app/agent-config/commit/a1327b2767751d4ce6e680af1b8f9732faf97b88))
451
+ * **authz:** target-bound merge grants that outlive the clock ([c286570](https://github.com/event4u-app/agent-config/commit/c286570d1e9a421a51571bb27e3a2945a54e8f8c))
452
+
453
+ ### Bug Fixes
454
+
455
+ * **docs:** cite the head label as code, not bold — the ratchet counts bold ([3f78ead](https://github.com/event4u-app/agent-config/commit/3f78ead4fd9023ed189ccd15aac2659397072ca8))
456
+ * **release:** make the derived head publishable, so a release stops halting by construction ([e6f6744](https://github.com/event4u-app/agent-config/commit/e6f67444c0c11873f6231fd007b70b404f9e883a))
457
+ * **ci:** drop code-comment-discipline from the rule-enforcement baseline ([731924a](https://github.com/event4u-app/agent-config/commit/731924ae778191bafefb3bbcfcb92c2acf76b558))
458
+ * **release:** ask for the curated head before the release commit, not after ([e31f07a](https://github.com/event4u-app/agent-config/commit/e31f07ab8bb4b25e048f1b4c78ffa32b27fd59f5))
459
+
460
+ ### Documentation
461
+
462
+ * **adr:** ADR-252 evidence section, and the census it moves ([19e99a4](https://github.com/event4u-app/agent-config/commit/19e99a4febfc6e9f8d092ecafc8c8e23c8f1699e))
463
+ * **adr:** ADR-252 supersedes ADR-251 — specificity replaces recency, for merge only ([ef930e0](https://github.com/event4u-app/agent-config/commit/ef930e01d450a4b78730f545a4f04eab1812eccb))
464
+
465
+ Tests: 20922 (+146 since 14.14.1)
466
+
467
+ ## [14.14.1](https://github.com/event4u-app/agent-config/compare/14.14.0...14.14.1) (2026-09-03)
468
+
469
+ ### Release highlights
470
+
471
+ - **Behaviour changes:** four new read-only surfaces, all additive — `agent-config hooks:effect`, which dispatches each bound concern against a scratch root and reports whether it actually fired rather than whether the manifest binds it (b0a03a7); `doctor --strict`, carrying the failing exit as a separate mode so `doctor` itself keeps its always-zero exit and no existing caller changes (517afcb, the `doctor-exit-contract` choice); and the `dev:skill-scout` and `push-ready` Taskfile targets (576ff4f, 6735abf). No public artefact was removed in this span.
472
+ - **Default changes + migration:** _none_
473
+ - **Security and correctness:** `skill_scout` confines a human-supplied candidate name to a single path segment and asserts resolved-path containment BEFORE it reports a scan scope, so a traversing name is refused rather than normalised and the scan-scope line can never record a root it did not scan; it also re-checks file type and size at read time, closing a post-intake symlink that was followed out of the quarantine directory (576ff4f). Three runtime advisories that were failing the `npm audit --omit=dev --audit-level=high` gate are cleared (54f0242).
474
+ - **Honest nulls:** the deferred council-topology carrier's two resumption triggers were re-measured live and neither had moved — Phase 2 needs five independent eligible council seats and `council:status` reports two of five; Phase 3 needs a two-day spend reservation that does not exist. The carrier stays parked with all 38 obligations in place, and no third disposition record was written (1fe6fa0).
475
+ - **Known limitations:** the README daemon-claim repair is verified only one way. `check_claims` exiting 0 proves the retired phrasing is gone; it does NOT validate the replacement wording, because `README.md:30` is unmarkered prose (e200ba2). And `check_source_size_budget`'s excess is still five figures — this span lowered it 18,245 → 18,205 by moving prose and helpers under the 1500-line cap, not by removing debt.
476
+
477
+ ### Bug Fixes
478
+
479
+ * **deps:** clear the three runtime advisories failing the audit gate (#1822) ([54f0242](https://github.com/event4u-app/agent-config/commit/54f024250c67781e34e6242450fdf97d9165bfee))
480
+ * **release:** refuse an uncurated head before the first remote state (#1813) ([2b3d2b3](https://github.com/event4u-app/agent-config/commit/2b3d2b3474e6520ef696466aff583a76381f002c))
481
+
482
+ ### Documentation
483
+
484
+ * **evidence:** record drain run 18 (#1823) ([76ed568](https://github.com/event4u-app/agent-config/commit/76ed5684367667000ed5b1bd2bc5af13bdef8943))
485
+
486
+ ### Other
487
+
488
+ * complete road-to-wired-instruments (#1818) ([b0a03a7](https://github.com/event4u-app/agent-config/commit/b0a03a7af314cb231f4385005f7d73e8a6ca5dd4))
489
+ * complete road-to-self-description-truth (#1817) ([e200ba2](https://github.com/event4u-app/agent-config/commit/e200ba2f97590d2686bd9a292cf54025fb47cee2))
490
+ * complete road-to-governed-skill-scouting (#1815) ([576ff4f](https://github.com/event4u-app/agent-config/commit/576ff4fcc2568e7619ff489ddcf301f32f30da9f))
491
+ * complete road-to-ship-control-coverage (#1816) ([5a0ca3a](https://github.com/event4u-app/agent-config/commit/5a0ca3a16fb8f0ab54df734de885abee8c8fedff))
492
+ * complete road-to-artifact-location-and-doctor-reach (#1819) ([517afcb](https://github.com/event4u-app/agent-config/commit/517afcb524d201ad08b5d820638d84b2b3cdeb7b))
493
+ * complete road-to-cascading-base-integration (#1821) ([6735abf](https://github.com/event4u-app/agent-config/commit/6735abf3f789bd2d1549aa02937189ba9fe2b952))
494
+ * **topology:** repair three claims that went false, and record why the carrier stays parked (#1820) ([1fe6fa0](https://github.com/event4u-app/agent-config/commit/1fe6fa0fb3facfa7e735b68ee92e04616fbb3843))
495
+ * six survivors of the 2026-09-b inbox round (#1814) ([0415101](https://github.com/event4u-app/agent-config/commit/04151017860e0066e20832bdee49221e047ee33e))
496
+ * park governed-evidence-production to later/, and resolve metered-backend-park with (b) (#1811) ([c6b4f64](https://github.com/event4u-app/agent-config/commit/c6b4f640736c78554d7ce03f27257f44368ef1ae))
497
+
498
+ Tests: 20776 (+215 since 14.14.0)
499
+
437
500
  ## [14.14.0](https://github.com/event4u-app/agent-config/compare/14.13.0...14.14.0) (2026-09-02)
438
501
 
439
502
  ### Release highlights
package/README.md CHANGED
@@ -27,7 +27,7 @@ It is both deep **and** disciplined — and honest about what it deliberately is
27
27
  - **Surgical uninstall** — removes only its own keys from a shared host config (matched by JSON-pointer + SHA-256), never a neighbour tool's entries.<!-- claim:surgical-uninstall -->
28
28
  - **Pack-scoped install** — writes the active pack only, not a 500-artefact dump.
29
29
 
30
- **What it deliberately is *not*** — the core is a governance layer with optional, individually opt-in embedded engines (code intelligence, gated reach, the setup GUI, the bench lab — [ADR-124](docs/decisions/ADR-124-embedded-engine-doctrine.md)): **no background daemon, no separate state database, no self-rewriting memory, no auto-build pipeline.** Engines are never mandatory, never default-on without measured lift, and terminate with the command that invoked them. The host agent runs the loop; every learned change is human-reviewed; the same layer stays portable across tools. Capability without a process to babysit.
30
+ **What it deliberately is *not*** — the core is a governance layer with optional, individually opt-in embedded engines (code intelligence, gated reach, the setup GUI, the bench lab — [ADR-124](docs/decisions/ADR-124-embedded-engine-doctrine.md)): **no mandatory or always-on daemon, no separate state database, no self-rewriting memory, no auto-build pipeline.** Engines are never mandatory, never default-on without measured lift, and terminate with the command that invoked them. The host agent runs the loop; every learned change is human-reviewed; the same layer stays portable across tools. Capability without a process to babysit.
31
31
 
32
32
  > **Where this comes from (honest provenance).** The skills, rules and personas
33
33
  > are distilled from real production work on TypeScript and PHP codebases. The
@@ -149,10 +149,25 @@ than less: the gate can now read the PR's real `baseRefName` from the forge, so
149
149
  a stacked or release-line PR is measured against the branch it will actually
150
150
  merge into instead of against the repo default.
151
151
 
152
+ **The whole SEQUENCE is executable now, not just this step.** All six steps —
153
+ fetch, integrate the base set, regenerate, verify, re-check freshness, then hand
154
+ the push back to you — sit behind one runner, and a dry mode prints each step
155
+ with its outcome without touching the tree. In this package that runner is the
156
+ `push-ready` target in `taskfiles/dev.yml`; a consumer project wires the same
157
+ six steps behind whatever its own task runner is, with steps 3 and 4 being its
158
+ own generator and verify commands. The pre-push hook refuses and points at the
159
+ runner; the hook never merges, because a merge inside `pre-push` rewrites the
160
+ tree at the moment you believe your work is finished.
161
+
152
162
  **The resolution is executable now, not just described.**
153
163
  `./scripts-run src/scripts/sync_pr_branch` resolves the base from the open PR
154
164
  (so a stacked or release-line PR is measured against what it actually merges
155
- into), fetches, and merges it in when the branch is behind. On a conflict it
165
+ into), fetches, and merges it in when the branch is behind. The base is a
166
+ **set**: when the PR targets something other than the default branch, whether
167
+ the default branch joins the set is a per-target policy read from the *target's
168
+ own commit*, never from this branch — see `src/scripts/_lib/branch_convergence.ts`.
169
+ A non-default target with no policy entry is refused, not guessed. The default
170
+ is merged first, so a conflict surfaces against the broader base first. On a conflict it
156
171
  STOPS and splits the conflicted paths into generated, remeasured and authored —
157
172
  the first has one correct resolution (regenerate), the second's is to re-run the
158
173
  measurement on the merged tree (a ratchet baseline, where picking a side is how
@@ -10,7 +10,7 @@ identically to a win: a loop that hit its iteration cap, a gate that could not
10
10
  run, an approval that never came — each ending with a summary that says the work
11
11
  is done.
12
12
 
13
- ## The six states
13
+ ## The seven states
14
14
 
15
15
  | state | what it means | what it is NOT |
16
16
  |---|---|---|
@@ -20,6 +20,23 @@ is done.
20
20
  | `approval-required` | The work is ready and the next action crosses a gate the agent may not cross alone. | Not `blocked`: nothing is missing, and the run produced a deliverable. |
21
21
  | `exhausted` | A declared budget ran out — iterations, tokens, spend, wall-clock. | **Never** `success`, whatever partial progress exists. The cap firing IS the outcome. |
22
22
  | `stagnated` | The budget has not run out and progress has stopped: the same failure signature is repeating. | Not `exhausted`. Stagnation is detected by a NO-PROGRESS signal, not by a counter. |
23
+ | `premise-invalidated` | The plan premise moved: the situational-awareness fingerprint the run engaged under (`origin/main` plus every open PR head) was re-observed and differs. | Not `exhausted` — the budget is untouched. Not `stagnated` — progress may have been fine. Not `blocked` — nothing is missing; what the run knew went stale. |
24
+
25
+ **Why `premise-invalidated` is not `blocked` with a reason field.** Added
26
+ 2026-09-03 (AI council, unanimous) when the continuation ladder needed a word for
27
+ a run whose base ref and open-PR set had moved under it. Reusing `blocked` keeps
28
+ the arity at six and loses two things that are not decorative: the ability to
29
+ COUNT premise invalidation separately from a missing precondition, and
30
+ type-enforced exhaustive handling in the consumers that switch on the state. The
31
+ remedies differ as sharply as `exhausted` and `stagnated` do — `blocked` says
32
+ obtain the missing thing, `premise-invalidated` says re-probe and re-plan against
33
+ the world as it now is.
34
+
35
+ A consumer that cannot represent it reports `blocked`, which is the DECLARED
36
+ downgrade in `_lib/outcome_vocabularies.ts` and not an ad-hoc substitution. The
37
+ value domain is versioned (`RUN_TERMINAL_VOCABULARY_VERSION`, v2), and a reader
38
+ meeting an unrecognised persisted value reports it as not-recorded rather than
39
+ crashing or guessing.
23
40
 
24
41
  **Why `exhausted` and `stagnated` are separate**, when both stop a loop: they
25
42
  have different remedies and different next actions. `exhausted` says *the work
@@ -40,8 +57,8 @@ budget-exhausted stop indistinguishable from a completed one in a dashboard.
40
57
  | `[~]` | deferred | `blocked` or `approval-required`, undistinguished |
41
58
  | `[-]` | cancelled | *(a decision, not a run outcome)* |
42
59
 
43
- **Three states have no glyph, and they are exactly the ones a validation budget
44
- and a hard-blocker class produce:**
60
+ **Four states have no glyph, and they are exactly the ones a validation budget,
61
+ a hard-blocker class and a drift detector produce:**
45
62
 
46
63
  1. **`exhausted`** — the run stopped at its cap with the step still open. The
47
64
  glyph stays `[ ]`, which is identical to *never attempted*. A reader cannot
@@ -51,6 +68,8 @@ and a hard-blocker class produce:**
51
68
  3. **`approval-required`** — collapses into `[~]` alongside `blocked`, so a
52
69
  roadmap cannot show that the work is FINISHED and waiting on a human, versus
53
70
  not startable at all.
71
+ 4. **`premise-invalidated`** — same `[ ]` again, and the reader cannot see that
72
+ the step was not attempted because the plan it belonged to went stale.
54
73
 
55
74
  **This is recorded rather than fixed.** Adding glyphs would change a format that
56
75
  `update_roadmap_progress`, `check_roadmap_trackable`, `lint_empty_roadmaps` and
@@ -75,11 +94,13 @@ applies unchanged.
75
94
 
76
95
  ## Reporting contract
77
96
 
78
- A closing report names the state **by one of the six words above**, and where the
97
+ A closing report names the state **by one of the seven words above**, and where the
79
98
  state is not `success` it names what would change it:
80
99
 
81
100
  - `exhausted` — the budget that ran out, its value, and what was achieved inside it.
82
101
  - `stagnated` — the repeating failure signature, and the attempts it survived.
102
+ - `premise-invalidated` — which fingerprint was claimed, which was observed, and
103
+ that the next act is a re-probe rather than another iteration.
83
104
  - `blocked` — the missing thing, by name.
84
105
  - `approval-required` — the exact action awaiting approval.
85
106
  - `clean-no-op` — what was scanned, so "nothing to do" is distinguishable from
@@ -31,8 +31,8 @@ and dropped **402 entries** from the model-visible skills list
31
31
  projection moved that to 330 and stripped the descriptions anyway.
32
32
 
33
33
  402 is the **host's own count against the host's own denominator**, which is not
34
- this package's: the same install projects 297 skills, so the figure is a
35
- magnitude, never a subtraction anyone can perform. What it establishes is that
34
+ this package's: that install projected 297 skills <!-- count: dated -->, so the figure
35
+ is a magnitude, never a subtraction anyone can perform. What it establishes is that
36
36
  most of the catalogue is not model-visible — which is all this rule needs.
37
37
 
38
38
  So "I do not see a skill for this" is evidence about the **delivery**, never
@@ -57,8 +57,8 @@ A skill claiming `rich` MUST satisfy ALL three:
57
57
  carry a `load_context` pointer instead.
58
58
 
59
59
  3. **≤ 15 % of the suite's skills may claim `rich`** — the CI linter counts
60
- rich-tagged skills and hard-fails if the ratio is exceeded. With ~290 skills
61
- (288 as-of 2026-08), the cap is ~43. Do not claim `rich` for convenience; claim it only for
60
+ rich-tagged skills and hard-fails if the ratio is exceeded. With 299 skills
61
+ the cap is ~44. Do not claim `rich` for convenience; claim it only for
62
62
  irreducible-complexity skills.
63
63
 
64
64
  ## Telegraph-speak amendment
@@ -39,7 +39,7 @@ schema_version: 1
39
39
  # CI guard: a release bump of `package.json` must update this value
40
40
  # in lockstep — see scripts/check_template_pin_drift.ts (road-to-
41
41
  # portable-runtime-and-update-check P3.3).
42
- agent_config_version: "14.14.0"
42
+ agent_config_version: "14.15.0"
43
43
 
44
44
  # --- Project identity ---
45
45
  project:
@@ -77,6 +77,7 @@ export const REGISTRY = [
77
77
  { name: 'hooks:install', disposition: 'delegate', synopsis: 'Install the combined pre-commit hook.' },
78
78
  { name: 'hooks:status', disposition: 'delegate', synopsis: 'Print the runtime hook matrix (per-platform install + bindings).' },
79
79
  { name: 'hooks:doctor', disposition: 'delegate', synopsis: 'Diagnose hook health: concerns, posture, missing trampolines (read-only).' },
80
+ { name: 'hooks:effect', disposition: 'delegate', synopsis: 'Does a bound concern actually FIRE here? Sandboxed synthetic dispatch per concern; five per-concern states, four host verdicts (read-only).' },
80
81
  { name: 'routing:doctor', disposition: 'delegate', synopsis: 'Live routing diagnosis: per-gate ACTIVE/INACTIVE with reason, chain, freshness, orchestration state (read-only).' },
81
82
  { name: 'workspace:doctor', disposition: 'delegate', synopsis: 'Workspace identity with provenance (repo root, main worktree, current worktree, branch, PR base) + session claim and worktree pressure (read-only).' },
82
83
  { name: 'route:explain', disposition: 'delegate', synopsis: 'Deterministic rule-routing trace for one prompt: matched triggers, tier, disposition, budget, rejected candidates (trigger-match level only).' },