session-orchestrator 5.1.0 → 5.2.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 (293) hide show
  1. package/.agents/skills/autopilot/SKILL.md +1 -0
  2. package/.agents/skills/bootstrap/SKILL.md +2 -0
  3. package/.agents/skills/brainstorm/SKILL.md +3 -0
  4. package/.agents/skills/close/SKILL.md +17 -0
  5. package/.agents/skills/debug/SKILL.md +2 -0
  6. package/.agents/skills/discovery/SKILL.md +2 -1
  7. package/.agents/skills/dispatcher/SKILL.md +2 -0
  8. package/.agents/skills/eli5/SKILL.md +2 -0
  9. package/.agents/skills/eval/SKILL.md +1 -0
  10. package/.agents/skills/evolve/SKILL.md +2 -1
  11. package/.agents/skills/go/SKILL.md +18 -0
  12. package/.agents/skills/grill/SKILL.md +2 -0
  13. package/.agents/skills/harness-audit/SKILL.md +16 -0
  14. package/.agents/skills/memory-cleanup/SKILL.md +1 -0
  15. package/.agents/skills/persona-panel/SKILL.md +1 -0
  16. package/.agents/skills/plan/SKILL.md +3 -1
  17. package/.agents/skills/portfolio/SKILL.md +17 -0
  18. package/.agents/skills/reconcile/SKILL.md +1 -0
  19. package/.agents/skills/release/SKILL.md +18 -0
  20. package/.agents/skills/repo-audit/SKILL.md +1 -0
  21. package/.agents/skills/spinout/SKILL.md +1 -0
  22. package/.agents/skills/sunset-review/SKILL.md +2 -0
  23. package/.agents/skills/test/SKILL.md +17 -0
  24. package/.agents/skills/ux-grill/SKILL.md +2 -0
  25. package/.claude-plugin/marketplace.json +1 -1
  26. package/.claude-plugin/plugin.json +1 -1
  27. package/.codex-plugin/plugin.json +1 -1
  28. package/.codex-plugin/skills/autopilot/SKILL.md +5 -4
  29. package/.codex-plugin/skills/bootstrap/SKILL.md +8 -4
  30. package/.codex-plugin/skills/brainstorm/SKILL.md +11 -4
  31. package/.codex-plugin/skills/close/SKILL.md +3 -3
  32. package/.codex-plugin/skills/convergence-monitoring/SKILL.md +2 -0
  33. package/.codex-plugin/skills/convergence-monitoring/agents/openai.yaml +5 -0
  34. package/.codex-plugin/skills/debug/SKILL.md +11 -4
  35. package/.codex-plugin/skills/discovery/SKILL.md +8 -4
  36. package/.codex-plugin/skills/dispatcher/SKILL.md +4 -4
  37. package/.codex-plugin/skills/eli5/SKILL.md +9 -4
  38. package/.codex-plugin/skills/eval/SKILL.md +9 -4
  39. package/.codex-plugin/skills/evolve/SKILL.md +9 -4
  40. package/.codex-plugin/skills/go/SKILL.md +3 -3
  41. package/.codex-plugin/skills/grill/SKILL.md +11 -4
  42. package/.codex-plugin/skills/harness-audit/SKILL.md +4 -3
  43. package/.codex-plugin/skills/memory-cleanup/SKILL.md +9 -4
  44. package/.codex-plugin/skills/npm-publish/SKILL.md +2 -0
  45. package/.codex-plugin/skills/npm-publish/agents/openai.yaml +5 -0
  46. package/.codex-plugin/skills/persona-panel/SKILL.md +5 -5
  47. package/.codex-plugin/skills/plan/SKILL.md +8 -4
  48. package/.codex-plugin/skills/portfolio/SKILL.md +3 -3
  49. package/.codex-plugin/skills/reconcile/SKILL.md +9 -4
  50. package/.codex-plugin/skills/release/SKILL.md +3 -3
  51. package/.codex-plugin/skills/repo-audit/SKILL.md +6 -4
  52. package/.codex-plugin/skills/spinout/SKILL.md +4 -4
  53. package/.codex-plugin/skills/sunset-review/SKILL.md +5 -4
  54. package/.codex-plugin/skills/test/SKILL.md +3 -3
  55. package/.codex-plugin/skills/ux-grill/SKILL.md +11 -4
  56. package/.cursor/commands/autopilot.md +4 -4
  57. package/.cursor/commands/bootstrap.md +5 -4
  58. package/.cursor/commands/brainstorm.md +5 -4
  59. package/.cursor/commands/close.md +4 -3
  60. package/.cursor/commands/convergence-monitoring.md +13 -0
  61. package/.cursor/commands/debug.md +4 -4
  62. package/.cursor/commands/discovery.md +4 -4
  63. package/.cursor/commands/dispatcher.md +4 -4
  64. package/.cursor/commands/eli5.md +4 -4
  65. package/.cursor/commands/eval.md +4 -4
  66. package/.cursor/commands/evolve.md +4 -4
  67. package/.cursor/commands/go.md +4 -3
  68. package/.cursor/commands/grill.md +4 -4
  69. package/.cursor/commands/harness-audit.md +3 -3
  70. package/.cursor/commands/memory-cleanup.md +4 -4
  71. package/.cursor/commands/npm-publish.md +13 -0
  72. package/.cursor/commands/persona-panel.md +4 -4
  73. package/.cursor/commands/plan.md +5 -4
  74. package/.cursor/commands/portfolio.md +3 -3
  75. package/.cursor/commands/reconcile.md +4 -4
  76. package/.cursor/commands/release.md +4 -3
  77. package/.cursor/commands/repo-audit.md +4 -4
  78. package/.cursor/commands/spinout.md +4 -4
  79. package/.cursor/commands/sunset-review.md +4 -4
  80. package/.cursor/commands/test.md +3 -3
  81. package/.cursor/commands/ux-grill.md +4 -4
  82. package/.cursor/rules/010-session-workflow.mdc +2 -2
  83. package/.cursor/skills/bootstrap/SKILL.md +1 -0
  84. package/.cursor/skills/close/SKILL.md +13 -0
  85. package/.cursor/skills/debug/SKILL.md +0 -1
  86. package/.cursor/skills/discovery/SKILL.md +0 -1
  87. package/.cursor/skills/dispatcher/SKILL.md +0 -1
  88. package/.cursor/skills/eli5/SKILL.md +0 -1
  89. package/.cursor/skills/evolve/SKILL.md +0 -1
  90. package/.cursor/skills/go/SKILL.md +13 -0
  91. package/.cursor/skills/grill/SKILL.md +0 -1
  92. package/.cursor/skills/harness-audit/SKILL.md +12 -0
  93. package/.cursor/skills/portfolio/SKILL.md +12 -0
  94. package/.cursor/skills/release/SKILL.md +13 -0
  95. package/.cursor/skills/repo-audit/SKILL.md +0 -1
  96. package/.cursor/skills/sunset-review/SKILL.md +0 -1
  97. package/.cursor/skills/test/SKILL.md +12 -0
  98. package/.cursor/skills/ux-grill/SKILL.md +0 -1
  99. package/.cursor-plugin/plugin.json +1 -1
  100. package/.orchestrator/policy/blocked-commands.json +1 -1
  101. package/AGENTS.md +1 -1
  102. package/CHANGELOG.md +61 -0
  103. package/README.md +11 -9
  104. package/commands/session.md +10 -0
  105. package/docs/ci-setup.md +53 -0
  106. package/docs/codex-setup.md +1 -1
  107. package/docs/components.md +11 -6
  108. package/docs/events-schema.md +4 -1
  109. package/docs/install.md +16 -0
  110. package/docs/persona-panel.md +1 -1
  111. package/docs/pi-setup.md +1 -1
  112. package/docs/rule-authoring.md +83 -14
  113. package/docs/scope-collision-guard.md +2 -0
  114. package/docs/session-config-reference.md +6 -4
  115. package/hooks/_lib/hook-import-set.json +46 -6
  116. package/hooks/_lib/subagent-paths.mjs +15 -0
  117. package/hooks/_lib/vcs-create-matcher.mjs +217 -62
  118. package/hooks/hooks-codex.json +1 -1
  119. package/hooks/hooks.json +1 -1
  120. package/hooks/on-session-end.mjs +14 -2
  121. package/hooks/on-stop.mjs +43 -1
  122. package/hooks/post-bash-write-verify.mjs +3 -0
  123. package/hooks/pre-auq-clarity.mjs +3 -0
  124. package/hooks/pre-bash-issue-budget.mjs +103 -17
  125. package/hooks/pre-task-scope-disjoint.mjs +152 -3
  126. package/hooks/skill-invocation-telemetry.mjs +2 -1
  127. package/package.json +2 -1
  128. package/pi/prompts/autopilot.md +3 -3
  129. package/pi/prompts/bootstrap.md +3 -3
  130. package/pi/prompts/brainstorm.md +3 -3
  131. package/pi/prompts/close.md +2 -2
  132. package/pi/prompts/convergence-monitoring.md +11 -0
  133. package/pi/prompts/debug.md +3 -3
  134. package/pi/prompts/discovery.md +3 -3
  135. package/pi/prompts/dispatcher.md +3 -3
  136. package/pi/prompts/eli5.md +3 -3
  137. package/pi/prompts/eval.md +3 -3
  138. package/pi/prompts/evolve.md +3 -3
  139. package/pi/prompts/go.md +2 -2
  140. package/pi/prompts/grill.md +3 -3
  141. package/pi/prompts/harness-audit.md +2 -3
  142. package/pi/prompts/memory-cleanup.md +3 -3
  143. package/pi/prompts/npm-publish.md +11 -0
  144. package/pi/prompts/persona-panel.md +3 -3
  145. package/pi/prompts/plan.md +3 -3
  146. package/pi/prompts/portfolio.md +2 -2
  147. package/pi/prompts/reconcile.md +3 -3
  148. package/pi/prompts/release.md +3 -3
  149. package/pi/prompts/repo-audit.md +3 -4
  150. package/pi/prompts/session.md +1 -1
  151. package/pi/prompts/spinout.md +3 -3
  152. package/pi/prompts/sunset-review.md +3 -3
  153. package/pi/prompts/templates-ack.md +1 -1
  154. package/pi/prompts/test.md +3 -3
  155. package/pi/prompts/ux-grill.md +3 -3
  156. package/scripts/archive-closed-prds.mjs +2 -2
  157. package/scripts/auq-audit.mjs +2 -3
  158. package/scripts/backfill-abandoned-sessions.mjs +57 -3
  159. package/scripts/backfill-evidence-digest.mjs +2 -1
  160. package/scripts/backfill-learnings-from-vault.mjs +2 -2
  161. package/scripts/check-package-manager.mjs +2 -2
  162. package/scripts/ci/assert-vitest-green.mjs +2 -1
  163. package/scripts/emit-session.mjs +2 -3
  164. package/scripts/export-hw-learnings.mjs +2 -1
  165. package/scripts/express-path.mjs +1 -1
  166. package/scripts/gc-stale-worktrees.mjs +2 -1
  167. package/scripts/generate-codex-skills.mjs +48 -4
  168. package/scripts/generate-cursor-adapter.mjs +173 -9
  169. package/scripts/generate-hook-import-set.mjs +12 -27
  170. package/scripts/generate-pi-prompts.mjs +183 -13
  171. package/scripts/github-protection-audit.mjs +2 -3
  172. package/scripts/lib/agent-frontmatter.mjs +23 -1
  173. package/scripts/lib/claude-md-budget-lint.mjs +2 -5
  174. package/scripts/lib/command-blocker.mjs +133 -5
  175. package/scripts/lib/config/drift-check.mjs +19 -0
  176. package/scripts/lib/convergence-monitor.mjs +2 -2
  177. package/scripts/lib/cursor-hook-bridge.mjs +2 -2
  178. package/scripts/lib/description-surface.mjs +2 -5
  179. package/scripts/lib/dispatcher/cli.mjs +2 -1
  180. package/scripts/lib/ecosystem-wizard.mjs +2 -1
  181. package/scripts/lib/fetch-baseline.mjs +3 -8
  182. package/scripts/lib/gitlab-ops/stale-mr-sweep.mjs +2 -1
  183. package/scripts/lib/gitlab-portfolio/cli.mjs +2 -1
  184. package/scripts/lib/instruction-budget-guard.mjs +186 -46
  185. package/scripts/lib/is-main-module.mjs +82 -0
  186. package/scripts/lib/locks/index.mjs +32 -25
  187. package/scripts/lib/maintenance-due-banner.mjs +69 -3
  188. package/scripts/lib/peer-discovery.mjs +2 -5
  189. package/scripts/lib/playwright-driver/runner.mjs +2 -1
  190. package/scripts/lib/reconcile/rule-expiry-sweep.mjs +642 -0
  191. package/scripts/lib/rules-sync.mjs +2 -5
  192. package/scripts/lib/scope-echo.mjs +392 -7
  193. package/scripts/lib/session-close-backfill.mjs +58 -6
  194. package/scripts/lib/state-md.mjs +84 -3
  195. package/scripts/lib/sunset/walker.mjs +31 -4
  196. package/scripts/lib/tests-src-ratio.mjs +2 -6
  197. package/scripts/lib/tmux-layout/telemetry-stats.mjs +2 -1
  198. package/scripts/lib/user-invocable-skills.mjs +185 -0
  199. package/scripts/lib/validate/check-banner-parity.mjs +2 -2
  200. package/scripts/lib/validate/check-cursor-adapter.mjs +2 -2
  201. package/scripts/lib/validate/check-dead-bridge.mjs +2 -2
  202. package/scripts/lib/validate/check-doc-cli-commands.mjs +2 -2
  203. package/scripts/lib/validate/check-entry-guard.mjs +366 -0
  204. package/scripts/lib/validate/check-guard-requires-parity.mjs +2 -2
  205. package/scripts/lib/validate/check-hooks-emit-event-guard.mjs +2 -2
  206. package/scripts/lib/validate/check-learning-provenance.mjs +2 -2
  207. package/scripts/lib/validate/check-skill-links.mjs +27 -6
  208. package/scripts/lib/validate/check-skill-script-paths.mjs +2 -2
  209. package/scripts/lib/validate/check-test-git-config-target.mjs +2 -2
  210. package/scripts/lib/validate/check-unicode-safety.mjs +2 -2
  211. package/scripts/lib/validate/check-untracked-test-deps.mjs +2 -2
  212. package/scripts/lib/validate/check-unwired-features.mjs +91 -7
  213. package/scripts/lib/validate/check-validator-registration.mjs +2 -2
  214. package/scripts/lib/validate/check-vcs-repo-flag.mjs +2 -2
  215. package/scripts/lib/validate-vendored-rules.mjs +35 -9
  216. package/scripts/lib/wave-transcript-tail.mjs +2 -2
  217. package/scripts/lock-reaper.mjs +2 -1
  218. package/scripts/materialize-wave-scope.mjs +87 -4
  219. package/scripts/migrate-sessions-jsonl.mjs +2 -1
  220. package/scripts/migrate-vault-paths.mjs +2 -3
  221. package/scripts/release.mjs +80 -35
  222. package/scripts/relocate-vault-corpus.mjs +2 -3
  223. package/scripts/repair-invalid-sessions.mjs +2 -2
  224. package/scripts/session-shape.mjs +2 -2
  225. package/scripts/site-numbers.mjs +35 -11
  226. package/scripts/sweep-expired-rules.mjs +216 -0
  227. package/scripts/validate-plugin.mjs +9 -0
  228. package/scripts/vault-consolidate.mjs +2 -2
  229. package/scripts/vault-mirror.mjs +2 -3
  230. package/scripts/wave-scope-binding.mjs +2 -3
  231. package/skills/_shared/bootstrap-gate.md +1 -1
  232. package/skills/_shared/monitor-patterns.md +1 -1
  233. package/skills/_shared/research-evidence.md +53 -0
  234. package/skills/_shared/state-ownership.md +3 -0
  235. package/skills/autopilot/SKILL.md +58 -4
  236. package/skills/bootstrap/SKILL.md +51 -1
  237. package/skills/brainstorm/SKILL.md +16 -0
  238. package/skills/claude-md-drift-check/checker.mjs +49 -11
  239. package/{commands/close.md → skills/close/SKILL.md} +9 -3
  240. package/skills/debug/SKILL.md +10 -0
  241. package/skills/discovery/SKILL.md +24 -1
  242. package/skills/discovery/probes-session.md +2 -2
  243. package/skills/dispatcher/SKILL.md +38 -7
  244. package/skills/eli5/SKILL.md +11 -0
  245. package/skills/eval/SKILL.md +14 -0
  246. package/skills/evolve/SKILL.md +8 -1
  247. package/skills/evolve/references/evolve-dialectic-mode.md +6 -2
  248. package/{commands/go.md → skills/go/SKILL.md} +9 -1
  249. package/skills/grill/SKILL.md +19 -0
  250. package/{commands/harness-audit.md → skills/harness-audit/SKILL.md} +7 -2
  251. package/skills/hook-development/SKILL.md +46 -41
  252. package/skills/memory-cleanup/SKILL.md +7 -0
  253. package/skills/npm-publish/SKILL.md +1 -1
  254. package/skills/persona-panel/SKILL.md +56 -1
  255. package/skills/persona-panel/persona-format.md +1 -1
  256. package/skills/plan/SKILL.md +28 -1
  257. package/{commands/portfolio.md → skills/portfolio/SKILL.md} +8 -2
  258. package/skills/reconcile/SKILL.md +10 -0
  259. package/{commands/release.md → skills/release/SKILL.md} +16 -2
  260. package/skills/repo-audit/SKILL.md +7 -0
  261. package/skills/session-end/plan-verification.md +2 -2
  262. package/skills/session-plan/SKILL.md +1 -1
  263. package/skills/session-start/SKILL.md +5 -4
  264. package/skills/session-start/phase-8-5-express-path.md +6 -6
  265. package/skills/session-start/references/phase-1-5-session-continuity.md +1 -1
  266. package/skills/session-start/references/phase-2-7-portfolio-snapshot.md +1 -1
  267. package/skills/session-start/references/phase-4-ssot-environment-check.md +4 -3
  268. package/skills/spinout/SKILL.md +12 -1
  269. package/skills/sunset-review/SKILL.md +13 -0
  270. package/{commands/test.md → skills/test/SKILL.md} +10 -4
  271. package/skills/ux-grill/SKILL.md +19 -1
  272. package/skills/wave-executor/SKILL.md +7 -4
  273. package/skills/wave-executor/references/wave-executor-state-init.md +13 -1
  274. package/skills/wave-executor/references/wave-loop-dispatch.md +3 -1
  275. package/skills/wave-executor/references/wave-loop-review.md +17 -1
  276. package/commands/autopilot.md +0 -80
  277. package/commands/bootstrap.md +0 -56
  278. package/commands/brainstorm.md +0 -48
  279. package/commands/debug.md +0 -36
  280. package/commands/discovery.md +0 -32
  281. package/commands/dispatcher.md +0 -59
  282. package/commands/eli5.md +0 -33
  283. package/commands/eval.md +0 -28
  284. package/commands/evolve.md +0 -10
  285. package/commands/grill.md +0 -45
  286. package/commands/memory-cleanup.md +0 -26
  287. package/commands/persona-panel.md +0 -121
  288. package/commands/plan.md +0 -15
  289. package/commands/reconcile.md +0 -23
  290. package/commands/repo-audit.md +0 -24
  291. package/commands/spinout.md +0 -15
  292. package/commands/sunset-review.md +0 -27
  293. package/commands/ux-grill.md +0 -51
@@ -6,21 +6,23 @@ model: sonnet
6
6
 
7
7
  # Hook Development for Claude Code Plugins
8
8
 
9
- Adapted from [claude-plugins-official/plugin-dev/skills/hook-development](https://github.com/anthropics/claude-plugins-official/tree/main/plugins/plugin-dev/skills/hook-development). Trimmed to what we actually author (our plugin already has 6 event matchers covering 7 hook handlers see `hooks/hooks.json`).
9
+ Use the [official Claude Code hooks reference](https://code.claude.com/docs/en/hooks) as the source of truth for current events and schemas. This skill keeps only the conventions needed to author this plugin's hooks.
10
10
 
11
- ## Hook types
11
+ ## Hook types used in this plugin
12
+
13
+ Claude Code also documents `http`, `mcp_tool`, and experimental `agent` handlers. Use those only after checking their current fields and event support in the official reference.
12
14
 
13
15
  ### Prompt-based (LLM-driven, for complex reasoning)
14
16
 
15
17
  ```json
16
18
  {
17
19
  "type": "prompt",
18
- "prompt": "Evaluate if this tool use is appropriate: $TOOL_INPUT",
20
+ "prompt": "Evaluate whether this event should proceed: $ARGUMENTS",
19
21
  "timeout": 30
20
22
  }
21
23
  ```
22
24
 
23
- Supported events: `Stop`, `SubagentStop`, `UserPromptSubmit`, `PreToolUse`.
25
+ Prompt hooks are supported only on events documented for that handler type. `$ARGUMENTS` contains the hook input JSON.
24
26
 
25
27
  Use for: context-aware decisions, flexible evaluation, natural-language reasoning.
26
28
 
@@ -36,11 +38,11 @@ Use for: context-aware decisions, flexible evaluation, natural-language reasonin
36
38
 
37
39
  Use for: fast deterministic validations, file-system ops, external tools, performance-critical paths.
38
40
 
39
- **Our convention:** all our command hooks are `.mjs` (Node.js) — see `hooks/pre-bash-destructive-guard.mjs`, `hooks/enforce-scope.mjs`. The v3.0 migration moved us off bash for native Windows support.
41
+ **Our convention:** hook logic lives in `.mjs` files — see `hooks/pre-bash-destructive-guard.mjs` and `hooks/enforce-scope.mjs`. The manifest invokes them through the repository's runtime wrapper.
40
42
 
41
43
  ## Configuration formats
42
44
 
43
- This is where people trip up. Two formats exist; they are NOT interchangeable.
45
+ Keep the file location and its outer document shape explicit when copying an example.
44
46
 
45
47
  ### Plugin `hooks/hooks.json` — wrapper format
46
48
 
@@ -63,25 +65,27 @@ This is where people trip up. Two formats exist; they are NOT interchangeable.
63
65
  - `hooks` wrapper is required
64
66
  - `description` is optional
65
67
 
66
- ### User `.claude/settings.json` — direct format
68
+ ### User or project `.claude/settings.json` — settings format
67
69
 
68
70
  ```json
69
71
  {
70
- "PreToolUse": [
71
- {
72
- "matcher": "Write|Edit",
73
- "hooks": [
74
- { "type": "command", "command": "~/my-hook.sh" }
75
- ]
76
- }
77
- ]
72
+ "hooks": {
73
+ "PreToolUse": [
74
+ {
75
+ "matcher": "Write|Edit",
76
+ "hooks": [
77
+ { "type": "command", "command": "~/my-hook.sh" }
78
+ ]
79
+ }
80
+ ]
81
+ }
78
82
  }
79
83
  ```
80
84
 
81
- - No wrapper
82
- - No description
85
+ - The top-level `hooks` key is required in settings.
86
+ - Plugin `hooks/hooks.json` may additionally carry a top-level `description`.
83
87
 
84
- Mixing these up is the #1 reason new hooks don't fire.
88
+ The distinction is registration and scope: settings hooks belong to a user, project, or managed policy; plugin hooks run while the plugin is enabled. The nested event → matcher group → handler shape is the same.
85
89
 
86
90
  ## Hook events
87
91
 
@@ -92,7 +96,7 @@ Mixing these up is the #1 reason new hooks don't fire.
92
96
  | `UserPromptSubmit` | User submits prompt | Add context, validate |
93
97
  | `Stop` | Main agent stopping | Completeness check |
94
98
  | `SubagentStop` | Subagent stopping | Task validation |
95
- | `SessionStart` | Session begins | Context load |
99
+ | `SessionStart` | Session begins or resumes | Context load |
96
100
  | `SessionEnd` | Session ends | Cleanup, logging |
97
101
  | `PreCompact` | Before compaction | Preserve critical state |
98
102
  | `Notification` | User notified | Logging, reactions |
@@ -102,7 +106,9 @@ Mixing these up is the #1 reason new hooks don't fire.
102
106
  ```json
103
107
  {
104
108
  "hookSpecificOutput": {
105
- "permissionDecision": "allow|deny|ask",
109
+ "hookEventName": "PreToolUse",
110
+ "permissionDecision": "deny",
111
+ "permissionDecisionReason": "Why this decision was made",
106
112
  "updatedInput": { "field": "modified_value" }
107
113
  },
108
114
  "systemMessage": "Explanation shown to Claude"
@@ -113,12 +119,14 @@ Mixing these up is the #1 reason new hooks don't fire.
113
119
 
114
120
  ```json
115
121
  {
116
- "decision": "approve|block",
117
- "reason": "Why blocked / approved",
122
+ "decision": "block",
123
+ "reason": "Why Claude should continue",
118
124
  "systemMessage": "Additional context"
119
125
  }
120
126
  ```
121
127
 
128
+ Omit `decision` to allow stopping. `approve` is not a valid Stop decision. For non-error feedback that keeps the conversation running, use `hookSpecificOutput.additionalContext` with `hookEventName` set to `Stop` or `SubagentStop`.
129
+
122
130
  ### SessionStart: persist env vars
123
131
 
124
132
  ```bash
@@ -136,17 +144,18 @@ All hooks receive JSON on stdin:
136
144
  "session_id": "abc123",
137
145
  "transcript_path": "/path/to/transcript.jsonl",
138
146
  "cwd": "/current/working/dir",
139
- "permission_mode": "ask|allow",
147
+ "permission_mode": "default",
140
148
  "hook_event_name": "PreToolUse"
141
149
  }
142
150
  ```
143
151
 
144
152
  Event-specific extras:
145
- - `PreToolUse`/`PostToolUse`: `tool_name`, `tool_input`, `tool_result`
146
- - `UserPromptSubmit`: `user_prompt`
147
- - `Stop`/`SubagentStop`: `reason`
153
+ - `PreToolUse`: `tool_name`, `tool_input`, `tool_use_id`
154
+ - `PostToolUse`: `tool_name`, `tool_input`, `tool_response`, `tool_use_id`
155
+ - `UserPromptSubmit`: `prompt`
156
+ - `Stop`: `stop_hook_active`, `last_assistant_message`; `SubagentStop` also carries agent identity and transcript fields
148
157
 
149
- Access in prompt hooks via `$TOOL_INPUT`, `$TOOL_RESULT`, `$USER_PROMPT`.
158
+ Event fields vary and evolve. Parse only fields needed by the hook and consult the official event section before depending on one. The `UserPromptSubmit` field name above was last checked against the official reference on 2026-09-15 (branch `codex/ecc-systematic-review`); this plugin registers no `UserPromptSubmit` handler, so no code here exercises either spelling — verify before depending on it. Prompt and agent hooks receive the complete input through `$ARGUMENTS`.
150
159
 
151
160
  ## Environment variables
152
161
 
@@ -222,7 +231,7 @@ echo $file_path # ❌ unquoted injection risk
222
231
 
223
232
  ### Timeouts
224
233
 
225
- Defaults: command hooks 60s, prompt hooks 30s. Set explicitly when the work is known-slow:
234
+ Current defaults are 600 seconds for command/HTTP/MCP-tool hooks, 30 seconds for prompt hooks, and 60 seconds for agent hooks, with shorter defaults for some events. `SessionEnd` also has a shared time budget. Set a short explicit timeout appropriate to the hook; a timed-out `PreToolUse` command hook does not block the tool call.
226
235
 
227
236
  ```json
228
237
  { "type": "command", "command": "...", "timeout": 10 }
@@ -232,17 +241,13 @@ Defaults: command hooks 60s, prompt hooks 30s. Set explicitly when the work is k
232
241
 
233
242
  All matching hooks run **in parallel** — they don't see each other's output, ordering is non-deterministic. Design for independence.
234
243
 
235
- ## Lifecycle limitation NO hot-swap
244
+ ## Registration and reload behavior
236
245
 
237
- Hooks load at session start. Changes to `hooks.json` or hook scripts do **not** affect the running session.
246
+ Installed capability and active registration are different. A plugin can ship hook files without those hooks running when the plugin is disabled. Settings hooks merge with plugin and managed hooks; `/hooks` shows the active sources.
238
247
 
239
- To test hook changes:
240
- 1. Edit hook
241
- 2. Exit Claude Code
242
- 3. Restart (`claude` or `cc`)
243
- 4. Verify with `/hooks` command or `claude --debug`
248
+ Direct edits to hooks in settings files are normally picked up by Claude Code's file watcher. Plugin registration changes may require disabling/re-enabling the plugin or starting a fresh session. A command hook's script is launched when the event fires, so editing the script itself can affect the next invocation without re-registering the manifest.
244
249
 
245
- This is the #2 reason "my hook isn't working" the change hasn't loaded yet.
250
+ To test a registration change, inspect `/hooks`, trigger the matching event, and use `claude --debug` when the source, matcher, output, or timeout remains unclear.
246
251
 
247
252
  ## Debugging
248
253
 
@@ -269,7 +274,7 @@ output=$(./your-hook.mjs < test-input.json)
269
274
  echo "$output" | jq .
270
275
  ```
271
276
 
272
- Invalid JSON breaks silently always verify.
277
+ Invalid structured output is normally reported as a non-blocking hook error and the action proceeds, so always verify the output and the resulting decision.
273
278
 
274
279
  ## Conditional activation
275
280
 
@@ -292,8 +297,8 @@ enabled=$(jq -r '.strictMode // false' "$CONFIG_FILE" 2>/dev/null)
292
297
 
293
298
  ## Our in-house examples (read these, not the upstream `examples/`)
294
299
 
295
- - `hooks/pre-bash-destructive-guard.mjs` — policy-driven command blocker, 14 rules in `.orchestrator/policy/blocked-commands.json`
296
- - `hooks/enforce-scope.mjs` — wave-scope boundary enforcement using `.orchestrator/wave-scope.json`
300
+ - `hooks/pre-bash-destructive-guard.mjs` — policy-driven command blocker backed by `.orchestrator/policy/blocked-commands.json`
301
+ - `hooks/enforce-scope.mjs` — scope enforcement using `wave-scope.json` in the platform's state directory
297
302
  - `hooks/on-session-start.mjs` — banner + session init
298
303
  - `hooks/post-edit-validate.mjs` — validates edits after the fact
299
304
  - `hooks/on-stop.mjs` — session-event capture + metrics
@@ -306,7 +311,7 @@ enabled=$(jq -r '.strictMode // false' "$CONFIG_FILE" 2>/dev/null)
306
311
  - Validate every input field before trusting it
307
312
  - Quote all shell variables
308
313
  - Set explicit timeouts for known-slow work
309
- - Return structured JSON on stdout
314
+ - Return only schema-valid structured JSON when the event needs a decision or context; emit nothing on a silent allow
310
315
 
311
316
  **Don't:**
312
317
  - Hardcoded paths
@@ -409,5 +414,5 @@ env-precedence, PluginRootResolutionError class shape.
409
414
 
410
415
  ## References
411
416
 
412
- - [Official hooks docs](https://docs.claude.com/en/docs/claude-code/hooks)
417
+ - [Official hooks reference](https://code.claude.com/docs/en/hooks)
413
418
  - Upstream: [patterns.md](https://github.com/anthropics/claude-plugins-official/tree/main/plugins/plugin-dev/skills/hook-development/references/patterns.md), [advanced.md](https://github.com/anthropics/claude-plugins-official/tree/main/plugins/plugin-dev/skills/hook-development/references/advanced.md) — read these for edge cases we haven't hit yet
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: memory-cleanup
3
3
  user-invocable: true
4
+ argument-hint: "[--dry-run | --apply-pending]"
4
5
  tags: [memory, maintenance, meta, dream]
5
6
  model: sonnet
6
7
  model-preference: sonnet
@@ -20,6 +21,12 @@ description: >
20
21
 
21
22
  # Memory Cleanup — Manual Dream Process
22
23
 
24
+ ## Invocation
25
+
26
+ The user invoked `/memory-cleanup` with arguments: **$ARGUMENTS**. Parse them before anything else — two optional, mutually-exclusive flags are recognised (`--dry-run`, `--apply-pending`, see PRD #502); passing both is an error, and the absence of both selects the legacy interactive 4-phase mode. The per-flag behaviour, the exact status lines and the exit codes are in § Argument Handling (Phase 0) below; the interactive default runs Phases 1-4 (Orient → Gather Signal → Consolidate → Prune & Index) against `~/.claude/projects/<encoded-cwd>/memory/` and reports per § Output.
27
+
28
+ Sidecar producer/consumer contract: session-end Phase 3.6.5 (`scripts/lib/auto-dream.mjs`) is nudge-only (#614) — it never dispatches a subagent to write the sidecar. The only real producer of `.orchestrator/pending-dream.md` is a manual `/memory-cleanup --dry-run` run; `--apply-pending` is the operator-confirmed consumer in a later session. The sidecar file is single-writer — concurrent sessions cannot collide because the writer holds the session-lock. <!-- path-check: example -->
29
+
23
30
  Implements the 4-phase memory consolidation process modelled after Claude Code's Auto Dream feature. Run after major refactors, framework migrations, or every 5+ sessions in a repo.
24
31
 
25
32
  The memory system lives at `~/.claude/projects/<encoded-cwd>/memory/` and consists of:
@@ -39,7 +39,7 @@ The script gates mechanics. These three are yours, and it will not make them for
39
39
 
40
40
  **2. What a leak means when one is found.** A hit from the leakage gate is not a pattern to silence. Decide which of two it is: a real leak (fix `package.json` `files`, re-pack, re-check) or genuine over-matching (fix `LEAKAGE_PATTERNS` in `scripts/release.mjs` **with a test**). There is no third option, and neither is "publish anyway and clean it up in the next version" — an npm publish is not revocable, and unpublishing burns the version number permanently. Operator handling detail: `docs/distribution/npm-publish-checklist.md` § 3.
41
41
 
42
- **3. When to abort instead of repair.** Abort — do not patch forward — when the failure is upstream of the target-confirmed npm receipt: a red preflight row, a lagging `github` mirror, CI not green on the exact commit **on either platform** (`--check` carries both `ci-green-on-head` for GitLab and `ci-green-on-head-github` for the mirror, whose macOS matrix leg has no GitLab equivalent), a dead token, or a publish that did not issue the target receipt. These are cheap to fix and re-run from the top. Repair-in-place is only appropriate *after* that receipt, where the version is already immutable: registry propagation, a missing GitHub release, or a lagging site deploy can be reconciled because npm already has the correct artifact. When `--publish` reports **Post-publish reconciliation required**, **do not rerun `--publish`**; repair the listed state directly. `commands/release.md` § Abort criteria is the operative list.
42
+ **3. When to abort instead of repair.** Abort — do not patch forward — when the failure is upstream of the target-confirmed npm receipt: a red preflight row, a lagging `github` mirror, CI not green on the exact commit **on either platform** (`--check` carries both `ci-green-on-head` for GitLab and `ci-green-on-head-github` for the mirror, whose macOS matrix leg has no GitLab equivalent), a dead token, or a publish that did not issue the target receipt. These are cheap to fix and re-run from the top. Repair-in-place is only appropriate *after* that receipt, where the version is already immutable: registry propagation, a missing GitHub release, or a lagging site deploy can be reconciled because npm already has the correct artifact. When `--publish` reports **Post-publish reconciliation required**, **do not rerun `--publish`**; repair the listed state directly. `skills/release/SKILL.md` § Abort criteria is the operative list.
43
43
 
44
44
  ## Failure-mode table
45
45
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: persona-panel
3
3
  user-invocable: true
4
+ argument-hint: "<target> [--personas <names,...>] [--mode <voting|hard-gate|summary>] [--threshold <M-of-N|all|any>] [--grounding <off|re-derive>] [--dry-run]"
4
5
  tags: [review, personas, content, quality, multi-agent]
5
6
  model: inherit
6
7
  description: >
@@ -13,6 +14,60 @@ description: >
13
14
 
14
15
  # Persona Panel Skill
15
16
 
17
+ ## Invocation
18
+
19
+ The user invoked `/persona-panel` with arguments: **$ARGUMENTS**. Parse them before doing anything else — including before the Phase 0 bootstrap gate's side effects.
20
+
21
+ **Positional argument (required):**
22
+
23
+ - `<target>` — file path, directory, or range to review. Must be resolvable via `validatePathInsideProject` against the current project root (Phase 2). Relative paths are resolved from the project root. Globs are accepted (e.g. `src/app/api/*.ts`).
24
+
25
+ **Recognized flags:**
26
+
27
+ - `--personas <names,...>` — comma-separated subset of catalog names to include (e.g. `physicist,ai-expert`). Default: all personas discovered in `.claude/personas/`. Names are matched case-insensitively against `<name>.md` catalog files.
28
+ - `--mode <voting|hard-gate|summary>` — consolidation mode; the short forms are aliases of the Phase 4 mode names `voting-quorum`, `hard-gate-threshold` and `coordinator-summary` respectively. Default: `voting-quorum`. `summary` emits an explicit WARN that this mode adds one additional LLM call.
29
+ - `--threshold <spec>` — quorum spec. Accepted forms: `M-of-N` where M and N are integers 1..20, `all`, or `any`. Parsed by `scripts/lib/persona-panel/threshold.mjs::parseThreshold()`. Default: `all` for `hard-gate-threshold`. In `voting-quorum` the majority default of Phase 4 applies unless `--quorum <M>` overrides it.
30
+ - `--quorum <M>` — integer M-of-N override for `voting-quorum` (see Phase 4).
31
+ - `--grounding <off|re-derive>` — Grounding-Review mode (#730 Epic H). `off` (default): personas evaluate the target as-is. `re-derive`: each persona independently re-derives supporting sources via Read/Grep/Glob instead of trusting a "Sources" section the target may already assert, and reports them as `derived_sources`. Advisory-only in v1 — never influences `final_verdict`. See `skills/persona-panel/persona-format.md` § "Grounding Mode (optional)".
32
+ - `--lines <start>-<end>` — restrict the review to a line range of the target (validated in Phase 2: start ≤ end, both positive integers).
33
+ - `--dry-run` — resolve catalog and target, print the dispatch plan (persona names, models, target), do NOT call `Agent()`, do NOT write a sidecar. Exit 0 on success.
34
+
35
+ **Validation errors (all exit 1):**
36
+
37
+ - Missing `<target>`: `missing required arg <target>` — print the usage line and exit 1 without running any phase.
38
+ - Unknown flag (starts with `--` but not in the list above): `unknown flag: --<name>. Valid: --personas, --mode, --threshold, --quorum, --grounding, --lines, --dry-run`.
39
+ - `--mode` value not in enum: `invalid --mode value: '<value>'. Valid: voting, hard-gate, summary`.
40
+ - `--threshold` value fails `parseThreshold()`: echo the parser error verbatim, e.g. `invalid threshold 'foo': expected M-of-N (M,N integers 1..20), 'all', or 'any'`.
41
+ - `--grounding` value not in enum: `invalid --grounding value: '<value>'. Valid: off, re-derive`.
42
+ - `<target>` outside project root: `target path outside project: <path>`.
43
+
44
+ ### Examples
45
+
46
+ ```
47
+ /persona-panel src/app/api/invoices.ts
48
+ ```
49
+ All `.claude/personas/*.md` are dispatched, voting consolidation, sidecar written.
50
+
51
+ ```
52
+ /persona-panel src/app/api/invoices.ts --personas physicist,ai-expert
53
+ ```
54
+ Only the `physicist` and `ai-expert` catalog entries are dispatched.
55
+
56
+ ```
57
+ /persona-panel notes/draft.md --mode hard-gate --threshold all
58
+ ```
59
+ All resolved personas must return PASS; a single FAIL produces a final FAIL verdict.
60
+
61
+ ```
62
+ /persona-panel src/ --dry-run
63
+ ```
64
+ Prints the planned dispatch list and exits 0 without calling `Agent()` or writing a sidecar.
65
+
66
+ ```
67
+ /persona-panel docs/design-doc.md --grounding re-derive
68
+ ```
69
+ Each persona re-derives its own supporting sources rather than trusting a "Sources" section already present in the input document (for example, `docs/design-doc.md`), reporting them as `derived_sources`. Advisory-only — `final_verdict` is unaffected. <!-- path-check: example -->
70
+
16
71
  ## Overview
17
72
 
18
73
  Persona Panel runs any number of catalog-defined personas in parallel against a single target
@@ -355,7 +410,7 @@ result. If `final_verdict == "warn"`: exit 0 with a warning line on stderr. If
355
410
 
356
411
  ## See Also
357
412
 
358
- - `commands/persona-panel.md` — argument parsing and CLI contract
413
+ - `scripts/lib/persona-panel/threshold.mjs` — parseThreshold() for `--threshold` specs
359
414
  - `agents/schemas/persona-panel-sidecar.schema.json` — sidecar JSON Schema (Draft 2020-12)
360
415
  - `scripts/lib/persona-panel/catalog-loader.mjs` — loadCatalog() implementation
361
416
  - `scripts/lib/persona-panel/persona-runner.mjs` — buildPersonaPrompt() implementation
@@ -170,7 +170,7 @@ diff is reported alongside the panel result and has **zero influence on `final_v
170
170
  is signal for the operator to review, not a consolidation input. `consolidate()` and `tally()`
171
171
  in `consolidator.mjs` are deliberately unaware of grounding data.
172
172
 
173
- **Enabling it:** pass `--grounding re-derive` to `/persona-panel` (see `commands/persona-panel.md`).
173
+ **Enabling it:** pass `--grounding re-derive` to `/persona-panel` (see `skills/persona-panel/SKILL.md`).
174
174
  Default remains `--grounding off`.
175
175
 
176
176
  ---
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: plan
3
- user-invocable: false
3
+ user-invocable: true
4
+ disable-model-invocation: true
5
+ argument-hint: "[new|feature|retro]"
4
6
  tags: [planning, prd, requirements, research]
5
7
  model: inherit
6
8
  model-preference: opus
@@ -19,6 +21,24 @@ description: >
19
21
 
20
22
  > Project-instruction file resolution: CLAUDE.md and AGENTS.md (Codex CLI) are transparent aliases — see [skills/_shared/instruction-file-resolution.md](../_shared/instruction-file-resolution.md). All references below to `CLAUDE.md` resolve via that precedence rule.
21
23
 
24
+ ## Invocation
25
+
26
+ You are beginning a structured planning session. The user invoked `/plan` with mode: **$ARGUMENTS** (if empty, Phase 2's Mode Router asks which mode they want: `new`, `feature`, or `retro`).
27
+
28
+ **Modes:** `new` = project kickoff, `feature` = feature PRD, `retro` = retrospective.
29
+
30
+ **Your job: guide the user through structured requirement gathering and produce a complete plan document for the chosen mode.** Follow the phases below precisely. Do NOT skip any phase. Do NOT make assumptions — gather requirements interactively.
31
+
32
+ ### Headless (`claude -p`)
33
+
34
+ `session` and `plan` are **reserved terminal-only built-in names** in non-interactive sessions — under `claude -p` the bare form answers `"/plan isn't available in this environment."`, and no frontmatter or manifest field overrides that (reproduced with an empty `CLAUDE_CONFIG_DIR` and no plugin loaded, claude 2.1.273, measured 2026-09-16). Use the namespaced form, which does resolve:
35
+
36
+ ```bash
37
+ claude -p "/session-orchestrator:plan feature" --plugin-dir "$PWD"
38
+ ```
39
+
40
+ Interactive sessions are unaffected — `/plan` works there as it always has.
41
+
22
42
  ## File Structure
23
43
 
24
44
  - `SKILL.md` — Core framework: mode router, Q&A engine, shared phases
@@ -92,6 +112,13 @@ This is the distinctive mechanic shared by all three modes. Every question wave
92
112
 
93
113
  ### 3.1 Pre-Question Research
94
114
 
115
+ Read [Research Evidence Contract](../_shared/research-evidence.md) before the
116
+ first research wave. Apply it to findings that materially affect an option or
117
+ recommendation; keep trivial local lookups concise. Carry the source revision or
118
+ date, evidence basis, local equivalent, disposition, and any falsifiable next
119
+ check into each research brief and the synthesis so documented claims and
120
+ inferences remain distinct.
121
+
95
122
  Before each Q&A wave, dispatch 2-3 `Agent()` tool calls in a single message (parallel execution) with `subagent_type: "Explore"`:
96
123
 
97
124
  1. **Market/online context agent** — searches for relevant market data, best practices, competitor analysis, or technical patterns depending on the questions to be asked. Tools: WebSearch, WebFetch.
@@ -1,11 +1,17 @@
1
1
  ---
2
+ name: portfolio
2
3
  description: Aggregate cross-repo issue/MR/CI health across vault-registered projects into a single Markdown dashboard
4
+ user-invocable: true
3
5
  argument-hint: "[--dry-run] [--repo <name>]"
6
+ model: inherit
4
7
  ---
5
-
6
8
  # Portfolio
7
9
 
8
- Aggregates open issues, MRs, and staleness signals across all vault-registered repositories and writes a structured dashboard to `<vault-dir>/01-projects/_PORTFOLIO.md`. Invoke the `gitlab-portfolio` skill with arguments: **$ARGUMENTS**
10
+ ## Invocation
11
+
12
+ The user invoked `/portfolio` with arguments: **$ARGUMENTS**. This skill carries the argument validation (`--dry-run`, `--repo <name>`), the config/mode/vault gates, the dispatch into `scripts/lib/gitlab-portfolio/cli.mjs`, and the exit-code table — all below; `skills/gitlab-portfolio/SKILL.md` owns the dashboard schema.
13
+
14
+ Aggregates open issues, MRs, and staleness signals across all vault-registered repositories and writes a structured dashboard to `<vault-dir>/01-projects/_PORTFOLIO.md`.
9
15
 
10
16
  ## Argument Validation
11
17
 
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: reconcile
3
3
  user-invocable: true
4
+ argument-hint: "[--dry-run]"
4
5
  tags: [learning, rules, intelligence, meta]
5
6
  model: sonnet
6
7
  model-preference: sonnet
@@ -19,6 +20,15 @@ description: >
19
20
 
20
21
  # Reconcile Skill
21
22
 
23
+ ## Invocation
24
+
25
+ The user invoked `/reconcile` with arguments: **$ARGUMENTS** — parsed in Phase 1.3 below.
26
+
27
+ - `/reconcile` — full approval flow: engine → AUQ → write approved rules.
28
+ - `/reconcile --dry-run` — print proposals and rejections without writing anything or rendering the AUQ prompt.
29
+
30
+ **Engine seams used:** `runReconcile` (engine.mjs) · `writeApprovedRules` (writer.mjs) · `reconcile` config block · `.claude/rules/` write target.
31
+
22
32
  On-demand version of the session-end Phase 3.6.8 reconciliation flow. Turns eligible learnings
23
33
  from `.orchestrator/metrics/learnings.jsonl` into proposed `.claude/rules/<slug>.md` entries,
24
34
  presenting each batch of 4 to the coordinator via AUQ multiSelect for operator approval before
@@ -1,14 +1,28 @@
1
1
  ---
2
+ name: release
2
3
  description: Cut a release — the order the steps must run in, and the criteria that abort a release
4
+ user-invocable: true
3
5
  disable-model-invocation: true
4
6
  argument-hint: "[X.Y.Z]"
7
+ model: inherit
5
8
  ---
6
-
7
9
  # Release
8
10
 
9
11
  The user wants to cut a release of this package. Optional argument — the target version: **$ARGUMENTS**.
10
12
 
11
- **The mechanism is `scripts/release.mjs`.** It exists, it is executable, and its pure half is unit-tested (`tests/scripts/release.test.mjs`). This command carries only the two things the script cannot carry: the **order**, and the **criteria that stop a release**. Do not restate the script's internals here — `node scripts/release.mjs --help` and the file header are the reference.
13
+ **The mechanism is `scripts/release.mjs`.** It exists, it is executable, and its pure half is unit-tested (`tests/scripts/release.test.mjs`). This skill carries only the two things the script cannot carry: the **order**, and the **criteria that stop a release**. Do not restate the script's internals here — `node scripts/release.mjs --help` and the file header are the reference.
14
+
15
+ ## Invocation
16
+
17
+ `$ARGUMENTS` is optional and holds the target version `X.Y.Z`. When it is empty, resolve the target from `package.json` and the CHANGELOG before step 2.
18
+
19
+ The flags this repo's release path uses — the operator-facing entry points, in the order they run:
20
+
21
+ - `node scripts/release.mjs --set-version X.Y.Z` — rewrite every version surface and sync `package-lock.json`.
22
+ - `node scripts/release.mjs --check --json` — the preflight gate; every row must be green.
23
+ - `node scripts/release.mjs --publish` — the irreversible step; give it ≥600 s of wall clock.
24
+
25
+ `--skip-ci` marks the CI row green without checking anything and is **refused by the script** when combined with `--publish`; it is an inspection aid for `--check`, never a release path.
12
26
 
13
27
  ## Why the order is written down
14
28
 
@@ -10,6 +10,7 @@ description: >
10
10
  (optional), and MCP Configuration. Will produce a Markdown checklist report and JSON sidecar."
11
11
  <commentary>The user wants a compliance check; this skill is appropriate because it runs all 9
12
12
  categories with pass/fail/warn/skipped statuses and writes structured output.</commentary></example>
13
+ user-invocable: true
13
14
  model: inherit
14
15
  color: cyan
15
16
  ---
@@ -18,6 +19,12 @@ color: cyan
18
19
 
19
20
  Perform a comprehensive audit of the host repository against the ecosystem baseline. Emits a structured Markdown checklist report and a JSON sidecar for trend tracking.
20
21
 
22
+ ## Invocation
23
+
24
+ There are no arguments — ignore `$ARGUMENTS`; anything passed is discarded.
25
+
26
+ Do NOT skip any category (except Clank when not detected). Do NOT auto-fix findings — report only.
27
+
21
28
  ## Purpose
22
29
 
23
30
  Answer the question: "Does this repo match the ecosystem baseline?" — a compliance-focused, checkable question with a fixed 9-category checklist. Distinct from `/discovery` (broad quality probes) and `/harness-audit` (plugin installation health).
@@ -14,8 +14,8 @@ Read `session-start-ref` from STATE.md frontmatter. If the field is missing (old
14
14
  ```bash
15
15
  SESSION_START_REF=$(node --input-type=module -e "
16
16
  import {readFileSync} from 'node:fs';
17
- import {parseFrontmatter} from '${PLUGIN_ROOT}/scripts/lib/state-md.mjs';
18
- const fm = parseFrontmatter(readFileSync('<state-dir>/STATE.md', 'utf8'));
17
+ import {parseStateMd} from '${PLUGIN_ROOT}/scripts/lib/state-md.mjs';
18
+ const fm = parseStateMd(readFileSync('<state-dir>/STATE.md', 'utf8')).frontmatter;
19
19
  process.stdout.write(fm['session-start-ref'] ?? '');
20
20
  " 2>/dev/null)
21
21
  # Fallback when field absent
@@ -224,7 +224,7 @@ It prints one JSON line carrying:
224
224
 
225
225
  **Ultradeep agent counts per wave:** take each wave's cap from that wave's `agentCap` in the shape — there is no second table here to disagree with it. The caps are ceilings, not targets, and the Quality wave's cap is still EARNED per the Step 3 rule (the shape marks it `qualityEarned: true`); Research and Code-Discovery share wave 1's cap across their two separately-scoped groups; the Synthesis-Gate wave carries `agentCap: 0` with `coordinatorDirect: true` and writes only the coordinator's own artifacts (audit report, STATE.md, plan).
226
226
 
227
- Wave 1 splits into two disjointly-scoped groups: **Research** agents (web-enabled, see `skills/wave-executor/SKILL.md` § Ultradeep Profile) and **Code-Discovery** agents (repo-only). Both are read-only. Wave 2 dispatches NO agents — the coordinator consolidates wave 1, writes `docs/audits/<YYYY-MM-DD>-<slug>.md`, and asks ONE blocking `AskUserQuestion` before wave 3.
227
+ Wave 1 splits into two disjointly-scoped groups: **Research** agents (web-enabled, see `skills/wave-executor/SKILL.md` § Ultradeep Profile) and **Code-Discovery** agents (repo-only). Both are read-only. Research briefs and synthesis follow [Research Evidence Contract](../_shared/research-evidence.md): material findings retain source revision/date, evidence basis, local equivalent, disposition, and a falsifiable next check when uncertain. This adds no mandatory external search; repository evidence is sufficient when proportionate to the task. Wave 2 dispatches NO agents — the coordinator consolidates wave 1, writes `docs/audits/<YYYY-MM-DD>-<slug>.md`, and asks ONE blocking `AskUserQuestion` before wave 3.
228
228
 
229
229
  When roles are combined into a single wave, agents from both roles execute in that wave.
230
230
 
@@ -303,10 +303,11 @@ Propose the **ordered default scope** below in the Phase 8 Q&A. Every step is AU
303
303
 
304
304
  1. **Drift-check as a work-list** — `checker.mjs --mode warn` (procedure below); its `errors[]`/`warnings[]` become candidate scope.
305
305
  2. **Expired-learnings sweep** — the same sweep session-end 3.6.4 applies mechanically (`runTailPhases` / `runExpiredSweep`), run here when the `sweep` signal is due.
306
- 3. **`/evolve analyze`**extract this period's session patterns into learnings.
307
- 4. **`/reconcile`** — turn high-confidence learnings into operator-approved `.claude/rules/` proposals.
308
- 5. **`/evolve dialectic`** — dry-run first, review `.orchestrator/dialectic-pending.md`, then apply. This step dispatches the read-only `dialectic-deriver` agent, so **"coordinator-direct" means no wave-executor, not zero subagents**. <!-- path-check: example -->
309
- 6. **`/memory-cleanup`** — `--dry-run` writes the MEMORY.md proposal to `.orchestrator/pending-dream.md`; `--apply-pending` applies it. <!-- path-check: example -->
306
+ 3. **Expired-generated-rules sweep**`node scripts/sweep-expired-rules.mjs` (`--dry-run` first, then `--apply`). AUQ-gated: it rewrites and can DELETE tracked `.claude/rules/*.md` files. Runs directly after step 2 because its evidence comes from step 2's corpus an entry's date is recoverable only via its `learning-id` → `learnings.jsonl` `expires_at`. <!-- path-check: example -->
307
+ 4. **`/evolve analyze`** — extract this period's session patterns into learnings.
308
+ 5. **`/reconcile`** — turn high-confidence learnings into operator-approved `.claude/rules/` proposals.
309
+ 6. **`/evolve dialectic`** — dry-run first, review `.orchestrator/dialectic-pending.md`, then apply. This step dispatches the read-only `dialectic-deriver` agent, so **"coordinator-direct" means no wave-executor, not zero subagents**. <!-- path-check: example -->
310
+ 7. **`/memory-cleanup`** — `--dry-run` writes the MEMORY.md proposal to `.orchestrator/pending-dream.md`; `--apply-pending` applies it. <!-- path-check: example -->
310
311
 
311
312
  Operator-selected issues (from Phase 6) are appended AFTER this loop, not interleaved with it — the loop's outputs (new learnings, new rules) are inputs the issue work should already see.
312
313
 
@@ -70,7 +70,7 @@ Express path activated — <N> tasks, coordinator-direct, no inter-wave checks.
70
70
 
71
71
  > **RESOLVED (#1146, operator decision) — session-plan RUNS, in shortened form.** Five documents
72
72
  > described the post-activation routing and two of them said session-plan was skipped entirely.
73
- > That reading cannot work: `commands/go.md` gates on a 1-wave Express Path plan, which under a
73
+ > That reading cannot work: `skills/go/SKILL.md` gates on a 1-wave Express Path plan, which under a
74
74
  > skipped session-plan would never have been produced — `/go` would look for a plan that does not
75
75
  > exist. The routing is now one sentence everywhere:
76
76
  >
@@ -78,13 +78,13 @@ Express path activated — <N> tasks, coordinator-direct, no inter-wave checks.
78
78
  > to Phase 9 → session-plan.** session-plan detects the banner and its
79
79
  > `## Express Path Short-Circuit (#214)` section emits a minimal 1-wave `coordinator-direct` plan
80
80
  > (0 agents dispatched, no role decomposition, no wave splitting). `/go` detects that plan per
81
- > `commands/go.md` § Express Path Detection and routes to coord-direct execution plus
81
+ > `skills/go/SKILL.md` § Express Path Detection and routes to coord-direct execution plus
82
82
  > session-end auto-invocation — never to wave-executor.
83
83
  >
84
84
  > What activation skips is the WAVE MACHINERY (subagent dispatch, role decomposition, inter-wave
85
85
  > checkpoints), not the planning handoff. The two sites that said otherwise —
86
86
  > this file and `skills/session-start/SKILL.md` — were corrected in the same pass;
87
- > `docs/session-config-reference.md`, `skills/session-plan/SKILL.md` and `commands/go.md`
87
+ > `docs/session-config-reference.md`, `skills/session-plan/SKILL.md` and `skills/go/SKILL.md`
88
88
  > already carried the surviving reading.
89
89
 
90
90
  Hand off to Phase 9 as usual. The coordinator then executes the 1-wave plan session-plan emits directly, without dispatching subagents:
@@ -104,7 +104,7 @@ Step 1 is the Phase 9 handoff and ends the session-start turn — the operator t
104
104
  - Step 4b (invoke session-end) flips `status` to `completed`, writes the metrics record to `.orchestrator/metrics/sessions.jsonl`, and runs the standard close flow. Session-end has no Express Path-specific logic — it treats this run identically to any other completed session.
105
105
  - Step 5 (verification) is the coordinator's final action before returning control. The verification check uses `parseStateMd()` from `scripts/lib/state-md.mjs` to read the file and check `frontmatter.status === 'completed'` and that the body contains the literal string `Express path:`.
106
106
 
107
- When `/go` is invoked and session-plan emitted a 1-wave Express Path plan (per `skills/session-plan/SKILL.md` § "Express Path Short-Circuit"), the `/go` command MUST detect this and route to coord-direct execution + session-end auto-invocation, NOT to wave-executor. See `commands/go.md` for the detection branch — that plan is the artifact `/go` keys on, which is why Phase 8.5 hands off to session-plan rather than skipping it.
107
+ When `/go` is invoked and session-plan emitted a 1-wave Express Path plan (per `skills/session-plan/SKILL.md` § "Express Path Short-Circuit"), the `/go` command MUST detect this and route to coord-direct execution + session-end auto-invocation, NOT to wave-executor. See `skills/go/SKILL.md` for the detection branch — that plan is the artifact `/go` keys on, which is why Phase 8.5 hands off to session-plan rather than skipping it.
108
108
 
109
109
  **When Express Path does NOT activate** (conditions not met):
110
110
 
@@ -124,6 +124,6 @@ Proceed normally to Phase 9 (session-plan handoff). The express-path evaluation
124
124
 
125
125
  - `scripts/express-path.mjs` — the CLI this phase runs; `scripts/lib/express-path.mjs` holds the decision + its `orchestrator.express_path.evaluated` record
126
126
  - `skills/session-plan/SKILL.md` § "Express Path Short-Circuit (#214)" — the 1-wave plan Phase 9 emits when the banner is present
127
- - `commands/go.md` — Express Path detection and auto-invocation of session-end after coord-direct tasks
127
+ - `skills/go/SKILL.md` — Express Path detection and auto-invocation of session-end after coord-direct tasks
128
128
  - `skills/session-end/SKILL.md` — Phase 1 pre-check (Rule 2) blocks `/close` when STATE.md `status: completed`; auto-invocation from express-path bypasses this
129
- - `commands/close.md` — Rule 2 wording the user sees if express-path persistence breaks
129
+ - `skills/close/SKILL.md` — Rule 2 wording the user sees if express-path persistence breaks
@@ -16,7 +16,7 @@ Before reading STATE.md contents, validate the branch field:
16
16
  - If STATE.md's `branch` does not match `git rev-parse --abbrev-ref HEAD`, log: "⚠ STATE.md from branch [X], current branch is [Y] — treating as stale." Skip to step 2 (treat as if STATE.md does not exist).
17
17
 
18
18
  1. **STATE.md exists** — read it and inspect the `status` field:
19
- - `status: active` — previous session crashed or was interrupted. Use the AskUserQuestion tool to present: "Found unfinished session from [started_at]. [N] waves completed. Resume or start fresh?" with options to resume the previous plan or start a new session. After a resume choice, proceed to **Snapshot Recovery** subsection below. **HISTORICAL guard (mandatory, #621):** when the user chooses resume, any surfaced prior-session plan, wave-history, deviations, or recommendations MUST be presented wrapped in the HISTORICAL guard banner BEFORE you act on them — never treat the recovered record as a live instruction.
19
+ - `status: active` — previous session crashed or was interrupted. `started_at` is the prior session's LOCK-sourced start instant, not the moment its STATE.md was written (#1368 — see `skills/wave-executor/references/wave-executor-state-init.md` § Pre-Wave 1b for the template that sources it); surface it verbatim, do not recompute it. Use the AskUserQuestion tool to present: "Found unfinished session from [started_at]. [N] waves completed. Resume or start fresh?" with options to resume the previous plan or start a new session. After a resume choice, proceed to **Snapshot Recovery** subsection below. **HISTORICAL guard (mandatory, #621):** when the user chooses resume, any surfaced prior-session plan, wave-history, deviations, or recommendations MUST be presented wrapped in the HISTORICAL guard banner BEFORE you act on them — never treat the recovered record as a live instruction.
20
20
  - `status: paused` — session was intentionally paused. Use AskUserQuestion to offer resuming from the pause point or starting fresh. After a resume choice, proceed to **Snapshot Recovery** subsection below. **HISTORICAL guard (mandatory, #621):** as on the `active` branch, surface the resumed prior-session plan / wave-history / deviations wrapped in the HISTORICAL guard banner before acting on it.
21
21
  - `status: completed` — previous session ended cleanly. Note the summary for context (what was done, what was deferred), then **render the Recommendations Banner** (see subsection below) and **reset STATE.md to idle** before any new session state is written (see "Idle Reset" below). Continue with normal initialization.
22
22
  2. **STATE.md does not exist** — first session or persistence was previously off. Continue normally.
@@ -71,5 +71,5 @@ Proceed to Phase 3 without blocking.
71
71
 
72
72
  ### Cross-reference
73
73
 
74
- See `commands/portfolio.md` for the `/portfolio` command (full write path, `--dry-run`, `--repo` single-repo testing).
74
+ See `skills/portfolio/SKILL.md` for the `/portfolio` command (full write path, `--dry-run`, `--repo` single-repo testing).
75
75