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
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: bootstrap
3
3
  user-invocable: true
4
+ disable-model-invocation: true
5
+ argument-hint: "[--upgrade <tier>]"
4
6
  tags: [bootstrap, setup, scaffold, init]
5
7
  model: sonnet
6
8
  model-preference: sonnet
@@ -15,6 +17,54 @@ description: >
15
17
 
16
18
  # Bootstrap Skill
17
19
 
20
+ ## Invocation
21
+
22
+ The user invokes `/bootstrap` with arguments: **$ARGUMENTS**. Direct invocation runs with
23
+ `INVOCATION_MODE = direct` (see § Invocation Context) and is standalone: after bootstrap
24
+ completes, report the files created and the git commit hash, and do NOT automatically
25
+ continue into any other skill.
26
+
27
+ **TL;DR — for first-time users:** Run `/bootstrap` with no flags. The skill auto-detects the right tier (fast/standard/deep) from your repo, recommends one with a one-line reason, then walks a **fixed questionnaire** — tier/stack (1–2 prompts), owner persona (5), dispatcher autonomy (1); **7–9 prompts** on a first-run full bootstrap. Bestätigen → fertig. Keine weiteren Schritte.
28
+
29
+ The flags below cover special cases (re-adopting an existing repo, upgrading a tier, syncing rules). If you don't recognize the case in the description, you don't need the flag.
30
+
31
+ > **Instruction file alias:** Bootstrap creates and reads `CLAUDE.md` (or `AGENTS.md` on Codex CLI). The two are transparent aliases — pick one, never both. Resolution rule: see `skills/_shared/instruction-file-resolution.md`.
32
+
33
+ ### Standard usage (no flags)
34
+
35
+ This is the path 95 % of users want.
36
+
37
+ | Invocation | Behavior |
38
+ |------------|----------|
39
+ | `/bootstrap` | Auto-detect tier (fast / standard / deep) from repo context. Present recommendation via `AskUserQuestion` with options to confirm or override. Tier/stack: 1–2 questions; first-run full bootstrap adds owner interview (5, `owner-interview.mjs`) + dispatcher-autonomy capture (1). Then scaffold files + commit. |
40
+
41
+ What the user sees:
42
+
43
+ ```
44
+ Skill: "Repo leer. Empfehle 'standard' weil <reason>. Passt das?"
45
+ User: [Enter on "standard (Empfohlen)"]
46
+ Skill: <writes files, commits, prints summary>
47
+ ```
48
+
49
+ ### Flag reference (special cases)
50
+
51
+ Only use a flag if you have one of the situations described. Parsed flags decide the mode
52
+ dispatch in § Invocation Context — `--fast` / `--standard` / `--deep` skip the tier
53
+ confirmation question, while `--retroactive`, `--refresh-lock`, `--sync-rules` and
54
+ `--ecosystem-health` are standalone short-circuit flows that run to completion in this
55
+ skill without dispatching to a tier template.
56
+
57
+ | Flag | When to use it |
58
+ |------|----------------|
59
+ | `--upgrade <tier>` | You bootstrapped `fast` earlier and now need `standard` or `deep`. Idempotent — writes only the delta. Refuses downgrade. Valid: `fast → standard`, `fast → deep`, `standard → deep`. |
60
+ | `--retroactive` | The repo already has `CLAUDE.md` (or `AGENTS.md` on Codex CLI) + `## Session Config` but no `bootstrap.lock` (manually bootstrapped before the gate existed). Writes the lock based on file inventory; **makes no scaffolding changes**. Commit: `chore: bootstrap lock (retroactive)`. |
61
+ | `--refresh-lock` | Your `bootstrap.lock` already has valid `version`/`tier` fields but the freshness probe flags it as stale or plugin-version-drifted — `--retroactive` is a no-op here. Acknowledges the current plugin version and resets the freshness clock (`refreshed-at` + `refreshed-plugin-version`) without touching the lock's original bootstrap provenance. No scaffolding, no auto-commit. |
62
+ | `--sync-rules` | Pull canonical rules from the plugin's `rules/` library into `.claude/rules/`. Preserves local rules (files without the plugin source header). Standalone — does not touch `bootstrap.lock`. |
63
+ | `--ecosystem-health` | Run the ecosystem-health wizard: detects CI provider + package manager, prompts for health endpoints, pipelines, and critical issue labels. Writes the config block + `.orchestrator/policy/ecosystem.json`. No scaffolding, no auto-commit. |
64
+ | `--fast` / `--standard` / `--deep` | Skip the tier confirmation question (e.g., for scripted runs). Equivalent to running `/bootstrap` and selecting that option. |
65
+
66
+ All flag-driven flows are idempotent — running twice with no upstream change is a no-op.
67
+
18
68
  ## Overview
19
69
 
20
70
  This skill runs when the Bootstrap Gate is closed (missing CLAUDE.md, Session Config, or `.orchestrator/bootstrap.lock`) or when the user invokes `/bootstrap` directly. It scaffolds the minimum structure required by all session-orchestrator skills, commits it, and writes the lock file that opens the gate for all future invocations.
@@ -26,7 +76,7 @@ This skill runs when the Bootstrap Gate is closed (missing CLAUDE.md, Session Co
26
76
  Before starting, determine how this skill was invoked:
27
77
 
28
78
  - **Transitive (gate-closed):** Invoked from another skill's Phase 0. The user's original intent (their first prompt) is available in context. After bootstrap completes, execution must return to the original skill's Phase 1.
29
- - **Direct (`/bootstrap`):** User invoked manually. Parse `$ARGUMENTS` for flags: `--fast`, `--standard`, `--deep`, `--upgrade <tier>`, `--retroactive`. See `commands/bootstrap.md` for flag semantics.
79
+ - **Direct (`/bootstrap`):** User invoked manually. Parse `$ARGUMENTS` for flags: `--fast`, `--standard`, `--deep`, `--upgrade <tier>`, `--retroactive`. See § Invocation above for flag semantics.
30
80
 
31
81
  Store `INVOCATION_MODE = transitive | direct`.
32
82
 
@@ -3,6 +3,9 @@ name: brainstorm
3
3
  description: Use when you have a feature idea but the scope or UX is still ambiguous — runs a lightweight Socratic design dialogue (3-5 AUQ rounds) and writes a spec markdown file. Use BEFORE /plan feature when product intent needs validation; skip to /plan feature when scope is already clear. HARD-GATE prevents any code work until the design is user-approved.
4
4
  model: inherit
5
5
  color: cyan
6
+ user-invocable: true
7
+ disable-model-invocation: true
8
+ argument-hint: "[topic-or-feature-slug]"
6
9
  tools: Read, Grep, Glob, Bash, Write
7
10
  ---
8
11
 
@@ -10,6 +13,19 @@ tools: Read, Grep, Glob, Bash, Write
10
13
 
11
14
  > Lightweight Socratic design dialogue for per-feature exploration. Sibling to `/plan feature`, not a replacement. Produces `docs/specs/YYYY-MM-DD-<slug>-design.md` after the user approves an approach.
12
15
 
16
+ ## Invocation
17
+
18
+ The user invokes `/brainstorm` with arguments: **$ARGUMENTS**.
19
+
20
+ The optional argument is a topic or feature slug used in the spec filename (lowercase, hyphens, no special characters). If absent, the skill derives a slug from the user's Phase 1 answer.
21
+
22
+ Examples:
23
+ - `/brainstorm` — no slug; skill prompts for the problem in Phase 1
24
+ - `/brainstorm export-to-csv` — slug pre-set to `export-to-csv`
25
+ - `/brainstorm "user notification system"` — normalize to `user-notification-system`
26
+
27
+ The HARD-GATE in Phase 0 below prevents any Edit, Write (code), or Bash (implementation) call until the user approves the design in Phase 6 — the only Write permitted before approval is the spec file itself in Phase 4.
28
+
13
29
  ## Soul Reference
14
30
 
15
31
  Read `soul.md` in this skill directory before anything else. It defines WHO you are — a Design Facilitator who shapes vague ideas into approved designs through Socratic questioning. Every interaction in this skill should reflect that identity.
@@ -38,6 +38,7 @@ import { _parseDriftCheck } from '../../scripts/lib/config/drift-check.mjs';
38
38
  import { isSessionConfigHeading } from '../../scripts/lib/config/section-extractor.mjs';
39
39
  import { parseGlobsFrontmatter } from '../../scripts/lib/rule-loader.mjs';
40
40
  import { resolveRepoSpec } from '../../scripts/lib/vcs-repo-spec.mjs';
41
+ import { userInvocableSkills } from '../../scripts/lib/user-invocable-skills.mjs';
41
42
 
42
43
  const FORWARD_HEADING_RE =
43
44
  /(?:^|\b)(what'?s?\s+next|backlog|open\s+issues?|offene\s+(?:issues?|themen)|todo|next\s+steps?|roadmap)(?:$|\b)/i;
@@ -412,6 +413,45 @@ function countTestFiles(vaultDir) {
412
413
  return n;
413
414
  }
414
415
 
416
+ /**
417
+ * The product's slash-command count: `commands/*.md` ∪ skills carrying an
418
+ * explicit `user-invocable: true`, deduplicated by name — the same union
419
+ * `scripts/site-numbers.mjs` and
420
+ * `tests/commands/headless-bare-command-availability.test.mjs` use. In a
421
+ * consumer repo without `skills/` (or without `commands/`) the union
422
+ * collapses to whichever side is present, so nothing changes there.
423
+ *
424
+ * ONE implementation shared by the `command-count` surface (Check 5) and the
425
+ * `docs-parity` sub-check (a) `commands` actual (Check 10) — the two counters
426
+ * drifted independently before this extraction (#1370 fold left the
427
+ * docs-parity side on a raw `commands/` `readdirSync`, undercounting after 24
428
+ * `commands/*.md` files were folded into skills).
429
+ *
430
+ * Returns `null` when NEITHER `commands/` NOR `skills/` exists — the caller's
431
+ * "artifact absent" skip path. A `skills/` directory that exists but contains
432
+ * zero `user-invocable: true` skills is a measured `0`, not a skip — matching
433
+ * `scripts/site-numbers.mjs` `countCommands`, whose gate is
434
+ * `isDir(commands) || isDir(skills)` (#1370 follow-up: the old gate skipped on
435
+ * `fromSkills.length === 0`, which conflated "no skills/ dir" with "skills/
436
+ * dir present, nothing user-invocable yet").
437
+ *
438
+ * @param {string} vaultDir
439
+ * @param {string|null} [commandsDir] `--commands-dir` override
440
+ * @returns {number|null}
441
+ */
442
+ function countSlashCommands(vaultDir, commandsDir) {
443
+ const dir = commandsDir || join(vaultDir, 'commands');
444
+ const dirExists = existsSync(dir) && statSync(dir).isDirectory();
445
+ const fromDir = dirExists
446
+ ? readdirSync(dir).filter((f) => f.endsWith('.md') && !f.startsWith('.')).map((f) => f.replace(/\.md$/, ''))
447
+ : [];
448
+ const fromSkills = userInvocableSkills(vaultDir);
449
+ const skillsDir = join(vaultDir, 'skills');
450
+ const skillsDirExists = existsSync(skillsDir) && statSync(skillsDir).isDirectory();
451
+ if (!dirExists && !skillsDirExists) return null;
452
+ return new Set([...fromDir, ...fromSkills]).size;
453
+ }
454
+
415
455
  /**
416
456
  * Build the surface-count descriptor table for the given vault. `hookCounts`
417
457
  * is computed once and shared by the two hook surfaces. Each descriptor's
@@ -427,14 +467,13 @@ function buildSurfaceDescriptors(vaultDir, commandsDir) {
427
467
  {
428
468
  id: 'command-count',
429
469
  noun: 'commands',
430
- actual: (() => {
431
- const dir = commandsDir || join(vaultDir, 'commands');
432
- if (!existsSync(dir) || !statSync(dir).isDirectory()) return null;
433
- return readdirSync(dir).filter((f) => f.endsWith('.md') && !f.startsWith('.')).length;
434
- })(),
470
+ // A slash command is a `commands/*.md` file OR a skill whose frontmatter
471
+ // says `user-invocable: true` see countSlashCommands() for the shared
472
+ // union derivation (also used by docs-parity sub-check (a) below).
473
+ actual: countSlashCommands(vaultDir, commandsDir),
435
474
  // "8 commands", "8 /commands", "8 slash commands"
436
475
  claimRe: /\b(\d+)\s+(?:\/)?commands?\b/gi,
437
- skipMsg: 'command-count: no commands/ directory found (use --commands-dir to override)',
476
+ skipMsg: 'command-count: no commands/ or skills/ directory found (use --commands-dir to override)',
438
477
  },
439
478
  {
440
479
  id: 'skill-count',
@@ -1485,11 +1524,10 @@ function main() {
1485
1524
  },
1486
1525
  {
1487
1526
  noun: 'commands',
1488
- actual: (() => {
1489
- const dir = commandsDir || join(vaultDir, 'commands');
1490
- if (!existsSync(dir) || !statSync(dir).isDirectory()) return null;
1491
- return readdirSync(dir).filter((f) => f.endsWith('.md') && !f.startsWith('.')).length;
1492
- })(),
1527
+ // Shared with the command-count surface (Check 5) see
1528
+ // countSlashCommands() doc-comment for why this must be ONE
1529
+ // implementation, not a second `commands/` readdirSync.
1530
+ actual: countSlashCommands(vaultDir, commandsDir),
1493
1531
  re: /^##\s+Commands\s+\((\d+)\)/i,
1494
1532
  },
1495
1533
  {
@@ -1,17 +1,23 @@
1
1
  ---
2
+ name: close
2
3
  description: End session with verification, commits, and documentation
4
+ user-invocable: true
3
5
  disable-model-invocation: true
6
+ model: inherit
4
7
  ---
5
-
6
8
  # Close Session
7
9
 
10
+ ## Invocation
11
+
12
+ The user invokes `/close` (arguments: **$ARGUMENTS** — none are interpreted; anything passed is context only) to end the current session. Run the STATE.md pre-check below, then hand off to `skills/session-end/SKILL.md`. Do NOT skip any verification step — evidence before assertions.
13
+
8
14
  The user wants to end the current session.
9
15
 
10
16
  **Pre-check before invoking session-end:** Determine `<state-dir>` from the current platform (`.claude/`, `.codex/`, `.cursor/`, or `.pi/`). Check if `<state-dir>/STATE.md` exists and read its `status` field. Three exit conditions:
11
17
 
12
18
  1. **STATE.md does not exist:** Read Session Config to check `persistence`. If `persistence: false`, inform the user: "Session completed (persistence is off — STATE.md was never created). Use `/session` to start a new session." If `persistence: true` (or Session Config unavailable), inform the user: "No active session found. Use `/session` to start a session first." Either way, stop.
13
- 2. **STATE.md exists and `status: completed`:** `status: completed` alone is NOT proof that session-end's Phase 3.7 writer ever ran (#429) — the field can be set by hand, or by any path that stops short of that write. Parse STATE.md with `parseStateMd` and parse `.orchestrator/metrics/sessions.jsonl` as JSONL. Import `findRecordedSession` from the plugin's `scripts/lib/session-close-backfill.mjs` and call it with the parsed records and `{ sessionId: frontmatter['session-id'], semanticSessionId: frontmatter.session, startedAt: frontmatter.started_at }`. This is the shared backfill identity reader: native UUIDs take precedence, conflicting native IDs never match through a label, and legacy semantic records remain readable. Do not substitute a text grep or compare the semantic label only against `session_id`. A missing ledger means no record; an unreadable or malformed ledger is inconclusive — report the read/parse failure and stop before repeating close side effects.
14
- - **A matching completed record exists (including a legacy authoritative record without a `status` field):** Inform the user: "Previous session was already finalized by session-end. Start a new session with `/session`, or inspect `<state-dir>/STATE.md` to review the prior close. (Note: if this is unexpected after an Express Path session, `commands/go.md` should have auto-invoked /close — check that STATE.md `## Deviations` contains an `Express path:` entry.)" and stop.
19
+ 2. **STATE.md exists and `status: completed`:** `status: completed` alone is NOT proof that session-end's Phase 3.7 writer ever ran (#429) — the field can be set by hand, or by any path that stops short of that write. Parse STATE.md with `parseStateMd` and parse `.orchestrator/metrics/sessions.jsonl` as JSONL. Import `findRecordedSession` from the plugin's `scripts/lib/session-close-backfill.mjs` and call it with the parsed records and `{ sessionId: frontmatter['session-id'] ?? readLock({ repoRoot })?.session_id ?? null, semanticSessionId: frontmatter.session, startedAt: frontmatter.started_at }` (`readLock` from `scripts/lib/session-lock.mjs`). The lock fallback is sound here and ONLY here: `/close` runs inside the very session whose STATE.md it is reading, so the live lock names that same session — it is never a peer's id. STATE.md files written before #1368 carry no `session-id` key at all, and without the fallback every one of them misses the native fast path. This is the shared backfill identity reader: native UUIDs take precedence, conflicting native IDs never match through a label, and legacy semantic records remain readable. Do not substitute a text grep or compare the semantic label only against `session_id`. A missing ledger means no record; an unreadable or malformed ledger is inconclusive — report the read/parse failure and stop before repeating close side effects.
20
+ - **A matching completed record exists (including a legacy authoritative record without a `status` field):** Inform the user: "Previous session was already finalized by session-end. Start a new session with `/session`, or inspect `<state-dir>/STATE.md` to review the prior close. (Note: if this is unexpected after an Express Path session, `skills/go/SKILL.md` should have auto-invoked /close — check that STATE.md `## Deviations` contains an `Express path:` entry.)" and stop.
15
21
  - **No matching completed record exists:** Warn the user: "STATE.md completed ohne passenden Abschluss im Ledger — session-end wird zur Vervollständigung ausgeführt (#429)." An abandoned backfill stub does not prove finalization. Do NOT stop — proceed to invoke the session-end skill exactly as in exit condition 3, so the missing completion gets written this time. (The SessionEnd hook's `backfillCompletedFromStateMd` independently self-heals this same gap on a later session's teardown; this Pre-Check branch covers the case where /close is re-run before that hook has had a chance to fire.)
16
22
  3. **STATE.md exists and `status: active` or `status: paused`:** Proceed to invoke the session-end skill.
17
23
 
@@ -6,6 +6,8 @@ description: >
6
6
  INVESTIGATION FIRST. Produces a `.orchestrator/debug/` artifact the fixer agent must reference.
7
7
  model: inherit
8
8
  color: red
9
+ user-invocable: true
10
+ argument-hint: "[bug-description-or-issue-ref]"
9
11
  tools: Read, Grep, Glob, Bash, Write
10
12
  ---
11
13
 
@@ -13,6 +15,14 @@ tools: Read, Grep, Glob, Bash, Write
13
15
 
14
16
  > 4-phase root-cause investigation. Iron Law: no fix without root cause.
15
17
 
18
+ ## Invocation
19
+
20
+ The user invokes `/debug` with arguments: **$ARGUMENTS**.
21
+
22
+ The optional argument is a short bug description or issue reference (e.g. `"test timeout in CI"` or `#408`). If absent, inspect recent errors and `git log` to surface the most likely candidate, then confirm it with the user before starting Phase 1.
23
+
24
+ The four phases (Root Cause → Pattern → Impact → Solution) run in order, and the Phase-1 artifact at `.orchestrator/debug/<session-id>-<sequence>.md` is written before any fix code exists — it is a prerequisite for Phase 4, not optional documentation.
25
+
16
26
  ## When to use
17
27
 
18
28
  - Any test failure (unit, integration, E2E)
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: discovery
3
- user-invocable: false
3
+ user-invocable: true
4
+ argument-hint: "[all|code|infra|ui|arch|session|audit|vault|feature] [--since <git-ref>] [--full]"
4
5
  tags: [quality, discovery, probes, issues]
5
6
  model: sonnet
6
7
  model-preference: sonnet
@@ -15,6 +16,28 @@ description: >
15
16
 
16
17
  # Discovery Skill
17
18
 
19
+ ## Invocation
20
+
21
+ The user invokes `/discovery` with scope: **$ARGUMENTS** (if empty, default to `all`).
22
+
23
+ Parse `$ARGUMENTS` before doing anything else. Extract the following flags and tokens in any order:
24
+
25
+ - `--since <git-ref>` — restrict discovery to files changed since the given git ref (e.g. `HEAD~5`, `main`, a commit hash). Sets `since_ref = <git-ref>`, which is passed into Phase 3 plumbing.
26
+ - `--full` — explicit full-repo scan. Sets `full_scan = true`.
27
+ - Any remaining tokens are treated as scope specifiers (see the scope enum in § Invocation Modes).
28
+
29
+ **Conflict check:** If BOTH `--since` and `--full` are present, stop immediately and report:
30
+
31
+ ```
32
+ Error: Cannot use --since with --full. Provide one, not both.
33
+ ```
34
+
35
+ Do NOT proceed with discovery when this conflict is present.
36
+
37
+ **Argument validation:** Valid scopes: `all`, `code`, `infra`, `ui`, `arch`, `session`, `audit`, `vault`, `feature` (comma-separated for multiple). If any scope is invalid, inform the user: "Invalid scope '[token]'. Valid scopes: all, code, infra, ui, arch, session, audit, vault, feature." and default that token to `all`.
38
+
39
+ Scan the codebase for quality issues, technical debt, and improvement opportunities within the requested scope. Do NOT skip the interactive triage phase — every finding must be confirmed by the user before issue creation. Evidence before assertions.
40
+
18
41
  ## Invocation Modes
19
42
 
20
43
  Two modes of operation:
@@ -506,11 +506,11 @@ Violations:
506
506
  - tools (no-json-array): tools must be a comma-separated string, not a JSON array
507
507
  - description (no-block-scalar): description must be inline, not a block scalar
508
508
  - color (enum): color must be one of "blue"|"cyan"|"green"|"yellow"|"magenta"|"red"
509
- Recommendation: Run /bootstrap --retroactive to auto-surface violations, or manually fix per CLAUDE.md Agent Authoring Rules.
509
+ Recommendation: Run node scripts/validate-plugin.mjs to surface every violation, or manually fix per CLAUDE.md Agent Authoring Rules.
510
510
  ```
511
511
 
512
512
  **Default Severity:** High — broken agents fail at runtime silently.
513
513
 
514
- **Remediation:** Run `/bootstrap --retroactive` (validator auto-surfaces violations) or manually fix per CLAUDE.md Agent Authoring Rules.
514
+ **Remediation:** Run `node scripts/validate-plugin.mjs` (the agent-frontmatter validator lists every violation; `/bootstrap --retroactive` only writes a missing lock, it does not validate) or manually fix per CLAUDE.md Agent Authoring Rules.
515
515
 
516
516
  **Dependencies:** Requires `${PLUGIN_ROOT}/scripts/lib/agent-frontmatter.mjs` (issue #189). Degrades gracefully when the helper is absent — skip with a note, do not fabricate findings.
@@ -10,6 +10,8 @@ description: >
10
10
  portfolio. user: "/dispatcher" assistant: "Ranked 18 free repos — top recommendation: Pencil-Designs
11
11
  (score 4.50, 90d stale). Confirm via the picker, I'll claim its lease atomically, then route you to
12
12
  /session deep."</example>
13
+ user-invocable: true
14
+ argument-hint: "[--dry-run] [--repo <name>]"
13
15
  model: sonnet
14
16
  ---
15
17
 
@@ -17,6 +19,25 @@ model: sonnet
17
19
 
18
20
  > Cross-repo autopilot front-door — enumerate → rank → owner-AUQ → atomic claim → route. Read-only until the operator confirms; the only mutating step is the atomic `session.lock` claim, and it happens BEFORE any launch.
19
21
 
22
+ ## Invocation
23
+
24
+ Invoked as `/dispatcher [--dry-run] [--repo <name>]` with arguments: **$ARGUMENTS**.
25
+
26
+ Parse `$ARGUMENTS` before doing anything else. The recognized flags are exactly those of the CLI table below and are passed straight through to `scripts/lib/dispatcher/cli.mjs`:
27
+
28
+ - `--dry-run` — run the non-mutating rank only; print the recommendation and the free-candidate table; do NOT claim any lease (skip Phase 3).
29
+ - `--repo <name>` — limit the human-readable output to a single `repoName` (informational; does not change ranking).
30
+ - `--start-dir <path>` — override the scan root (defaults to the confinement root).
31
+ - `--json` — emit the full `{ candidates, free, ranked, warnings, recommended }` object to stdout.
32
+
33
+ If `$ARGUMENTS` contains an unrecognized flag (starts with `--` but is not one of the above), inform the user:
34
+
35
+ ```
36
+ Unknown flag '<flag>'. Recognized flags: --dry-run, --repo <name>, --start-dir <path>, --json.
37
+ ```
38
+
39
+ Then continue with the remaining valid arguments.
40
+
20
41
  ## Soul
21
42
 
22
43
  The dispatcher answers one question: *"of all my repos, which is the most worthwhile to work on right now, and is it free?"* It scans the confinement-root children, resolves each repo's free/busy status from its `session.lock` v2 lease (same lease semantics as the vault-status board), ranks only the FREE ones by `priority × staleness × readiness`, and recommends the single best one. You confirm via a picker, it claims the lease atomically (winning the race or excluding-and-re-ranking on a loss), then routes you to the entry command for that repo. Busy repos are listed-as-such, never selected.
@@ -119,13 +140,23 @@ Do NOT reinvent the claim — always go through `claimRepo`/`acquire`. The `ok:f
119
140
 
120
141
  ## Phase 4: Route
121
142
 
122
- With the lease held, the **coordinator** invokes the chosen entry slash-command for repo R:
123
-
124
- - `/session housekeeping` or `/session deep` execution modes.
125
- - `/plan` — read-only planning precursor (produces a wave plan; does not execute).
126
- - `/discovery` read-only investigation precursor (maps scope; does not execute).
127
-
128
- `/plan` and `/discovery` are **read-only precursors**, NOT execution modes — the menu may route to them, but they only produce artifacts for a later execution session. The full mode taxonomy lives in the mode-selector surface (P2 of this epic); the dispatcher only routes to the entry command the operator picked.
143
+ With the lease held, routing splits on whether the chosen entry is model-invocable:
144
+
145
+ - **`/session housekeeping` or `/session deep`** (execution modes) and **`/plan`** (read-only
146
+ planning precursor) are NOT something the coordinator can invoke itself. `commands/session.md`
147
+ documents `session` and `plan` as **reserved terminal-only built-in names** under
148
+ non-interactive (`claude -p`) invocation the bare form answers `"isn't available in this
149
+ environment"` and `skills/plan/SKILL.md` additionally carries
150
+ `disable-model-invocation: true`, which blocks the `Skill` tool from invoking it regardless of
151
+ interactivity. The coordinator therefore **hands the operator the exact command to type**, one
152
+ line per option — `/session-orchestrator:session <mode>` or `/session-orchestrator:plan
153
+ [new|feature|retro]` — rather than attempting to invoke either itself.
154
+ - **`/discovery`** — read-only investigation precursor (maps scope; does not execute).
155
+ `skills/discovery/SKILL.md` carries no `disable-model-invocation` flag, so the coordinator MAY
156
+ invoke it directly via the `Skill` tool when the operator picks this option — no hand-off line
157
+ needed.
158
+
159
+ `/plan` and `/discovery` remain **read-only precursors**, NOT execution modes — the menu may route to them, but they only produce artifacts for a later execution session. The full mode taxonomy lives in the mode-selector surface (P2 of this epic); the dispatcher only routes to the entry command the operator picked.
129
160
 
130
161
  ## Phase 5: Edge cases
131
162
 
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: eli5
3
3
  description: Explain a topic like I'm a 5 year old — restate my last output, or a named topic, in plain words without dropping a single fact. Use when the user types /eli5 [topic], or says an answer was too technical, too long, or unclear about what he now has to do.
4
+ user-invocable: true
5
+ argument-hint: "[topic]"
4
6
  model: inherit
5
7
  tools: Read, Grep, Glob, Bash
6
8
  ---
@@ -9,6 +11,15 @@ tools: Read, Grep, Glob, Bash
9
11
 
10
12
  Say it again in plain words. Same facts, in the order he needs them.
11
13
 
14
+ ## Invocation
15
+
16
+ Invoked as `/eli5 [topic]` with arguments: **$ARGUMENTS**.
17
+
18
+ The argument is optional and is a topic, in prose. If `$ARGUMENTS` is empty, the target is my own last substantial output in this conversation; if there is none yet, say so rather than picking a topic for him.
19
+
20
+ - `/eli5` — restate what I just said.
21
+ - `/eli5 warum ist der Regel-Korpus voll?` — explain that, grounded in what this session measured.
22
+
12
23
  ## The frame
13
24
 
14
25
  **Write for someone who knows this project but has not seen what you just saw.**
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: eval
3
3
  user-invocable: true
4
+ argument-hint: "[--session <id>] [--no-write] [--verify <run-id>]"
4
5
  tags: [eval, measurement, quality, meta, standard]
5
6
  model: sonnet
6
7
  model-preference: sonnet
@@ -31,6 +32,19 @@ renders an HTML report. An opt-in LLM judge overlays two advisory dimensions.
31
32
  The standard this skill implements is [`docs/eval/aiat-llm-eval-v1.md`](../../docs/eval/aiat-llm-eval-v1.md);
32
33
  the frozen, content-hashed check set is [`skills/eval/rubric-v1.md`](./rubric-v1.md).
33
34
 
35
+ ## Invocation
36
+
37
+ Invoked as `/eval [--session <id>] [--no-write] [--verify <run-id>]` with arguments: **$ARGUMENTS** (parsed in Phase 1.2).
38
+
39
+ - `/eval` — evaluate the last completed session (resolution cascade), append the record, render the report.
40
+ - `/eval --session <id>` — evaluate a specific `session_id`.
41
+ - `/eval --no-write` — evaluate + report without appending to the journal (dry-run).
42
+ - `/eval --verify <run-id>` — re-score a stored run and diff for drift (the reproducibility proof; exit 1 on drift).
43
+
44
+ **On-demand `/eval` runs regardless of `eval.enabled`** — that flag gates only the automatic session-end eval phase (see Phase 1.1).
45
+
46
+ **Seams used:** `scripts/eval-session.mjs` (deterministic CLI) · `runEvalJudge` / `mergeJudgeDimensions` (`scripts/lib/eval/judge.mjs`, opt-in) · `writeEvalReport` (`scripts/lib/eval/report.mjs`) · `appendEvalRecord` (`scripts/lib/eval/sink.mjs`) · the `eval` config block · [`skills/eval/rubric-v1.md`](./rubric-v1.md) (frozen check set).
47
+
34
48
  ## Posture Contract (load-bearing — read before executing)
35
49
 
36
50
  - **No global score, by construction.** The record has no overall/total/mean
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  name: evolve
3
- user-invocable: false
3
+ user-invocable: true
4
+ argument-hint: "[analyze|review|list|dialectic [--apply]]"
4
5
  tags: [learning, intelligence, meta]
5
6
  model: sonnet
6
7
  model-preference: sonnet
@@ -24,6 +25,12 @@ description: >
24
25
 
25
26
  # Evolve Skill
26
27
 
28
+ ## Invocation
29
+
30
+ Invoked as `/evolve [analyze|review|list|dialectic [--apply]]` with mode: **$ARGUMENTS** (if empty, default to `analyze` — parsed in Step 1.3).
31
+
32
+ Analyze session history for patterns, review existing learnings, list active intelligence, or derive USER.md/AGENT.md peer-card updates via the dialectic mode. Every learning must be confirmed by the user before persisting. Evidence before assertions.
33
+
27
34
  ## Phase 0: Bootstrap Gate
28
35
 
29
36
  Read `skills/_shared/bootstrap-gate.md` and execute the gate check. If the gate is CLOSED, invoke `skills/bootstrap/SKILL.md` and wait for completion before proceeding. If the gate is OPEN, continue to Phase 1.
@@ -67,9 +67,11 @@ const result = await runDialecticDeriver({
67
67
  ```
68
68
 
69
69
  ### Step 6.4: Diff Output & Apply Gate
70
- - If dry-run (default): present diff inline; write to `.orchestrator/dialectic-pending.md` (atomic tmp+rename); EXIT. Suggestion: "Re-run with `/evolve --dialectic --apply` to apply." <!-- path-check: example -->
70
+ - If dry-run (default): present diff inline; write to `.orchestrator/dialectic-pending.md` via `writeDialecticPending({ repoRoot, diff })` from `scripts/lib/auto-dialectic.mjs` (path constant `DIALECTIC_PENDING_PATH`; atomic tmp+rename). `runDialecticDeriver()` does NOT write this file itself — the dry-run branch returns the diff and the caller persists it. The body parameter is named `diff`, not `body`: a non-string or empty value throws `TypeError`, as does a missing `repoRoot`. EXIT. Suggestion: "Re-run with `/evolve --dialectic --apply` to apply." <!-- path-check: example -->
71
71
  - If `--apply`: call **`mergeDerivedBody(existingBody, result.diff[target])`** from `scripts/lib/peer-cards/merger.mjs` for each card target, then `writePeerCard(repoRoot, 'user', mergedUserCard)` and `writePeerCard(repoRoot, 'agent', mergedAgentCard)` from `scripts/lib/peer-cards/writer.mjs`. Update the `updated:` frontmatter.
72
72
 
73
+ **`writePeerCard` shape (#1303).** `writePeerCard(repoRoot, target, card)` takes `card = { frontmatter, body }`. `frontmatter.id` (kebab-case slug, 2..128 chars) is **required and never auto-filled**; `type: 'peer-card'`, `target`, `updated` (defaults to `new Date().toISOString()`) and `created` (defaults to `updated`) are filled by the writer. ISO timestamps may carry optional milliseconds (`scripts/lib/peer-cards/schema.mjs` `ISO_DATETIME_REGEX`). A missing `id` returns `{ ok: false, errors: [...] }` and leaves the target file untouched — it does **not** throw; branch on `result.ok`.
74
+
73
75
  **Why `mergeDerivedBody` and not `mergePeerCard` directly (#1310):** the deriver emits a FULL BODY STRING per target (`agents/dialectic-deriver.md` § Output format); `mergePeerCard` consumes a SECTION MAP keyed by sentinel name. `mergeDerivedBody` is the adapter between the two — it splits the proposed body at `## ` headings and maps each heading to a sentinel section. `mergePeerCard` stays available as the section-map primitive. Handling per heading class, all of it in `mergeDerivedBody`'s return value:
74
76
 
75
77
  | Heading in the proposed body | Section name | Merge effect | Surfaced as |
@@ -77,6 +79,7 @@ const result = await runDialecticDeriver({
77
79
  | Matches an existing managed section's own `## ` heading | that section's EXISTING name (read from the card, NOT re-slugified) | REPLACE | `mapping[].origin === 'existing'` |
78
80
  | No existing section | slugified heading (`[a-z0-9-]+`, collisions suffixed `-2`) | APPEND | `mapping[].origin === 'new'` |
79
81
  | Existing managed section the proposal omits | — | KEPT (no auto-delete, per `mergePeerCard` semantics) | — |
82
+ | Section name outside `[A-Za-z0-9_-]+` | — | `mergePeerCard` **throws** `invalid section name` | fix the name before merging |
80
83
  | Text before the first `## ` heading | — | NOT applied | `preamble` + a `{ type: 'unmapped-preamble' }` entry in `conflicts[]` |
81
84
 
82
85
  Existing names are read back out of the card rather than re-derived because the live names are not a pure function of their headings — measured 2026-09-11 in `.orchestrator/peers/AGENT.md`: `## Guard and protocol-migration discipline` → `guard-and-protocol-migration`. Re-slugifying would APPEND a duplicate section instead of replacing one.
@@ -113,7 +116,8 @@ await recordDialecticRun({
113
116
 
114
117
  ### Step 6.5: Error Handling
115
118
  - `status: 'unknown-model'` → fail with clear error (already thrown by validateModel)
116
- - `status: 'budget-exceeded'` → emit `{status:'budget-exceeded', used:N, budget:M}`, do NOT truncate
119
+ - `status: 'budget-exceeded'` → emit `{status:'budget-exceeded', used:N, budget:M}`, do NOT truncate.
120
+ Measured in a consumer repo (S119, 2026-09-10): 12 learnings + 127 sessions estimated at 11 158 input tokens against the 8000 default. Raise with `--budget-tokens 16000` or `dialectic.budget-tokens` in Session Config rather than trimming inputs.
117
121
  - `status: 'would-empty-card'` → warn + require `--allow-emptying` flag
118
122
  - `status: 'empty-input'` → exit clean with message "dialectic: skipped (no input)"
119
123
  - subagent crash → log ⚠, exit cleanly (do NOT write to `.orchestrator/dialectic-pending.md`) <!-- path-check: example -->
@@ -1,13 +1,21 @@
1
1
  ---
2
+ name: go
2
3
  description: Approve session plan and begin wave execution
4
+ user-invocable: true
3
5
  disable-model-invocation: true
4
6
  argument-hint: "[optional instructions]"
7
+ model: inherit
5
8
  ---
6
-
7
9
  # Execute Session Plan
8
10
 
9
11
  The user has approved the session plan. Begin execution immediately.
10
12
 
13
+ ## Invocation
14
+
15
+ Invoked as `/go [optional instructions]` with arguments: **$ARGUMENTS**. The user has approved the session plan; begin execution immediately.
16
+
17
+ `$ARGUMENTS` is optional priority guidance, forwarded verbatim to `skills/wave-executor/SKILL.md` for agent prompts (see "Standard Execution" below). It never re-opens the plan: do NOT re-plan, do NOT re-analyze — execute the agreed plan NOW with maximum efficiency.
18
+
11
19
  ## Express Path Detection
12
20
 
13
21
  Before invoking the wave-executor, check the conversation context for the Express Path activation banner — printed by `node scripts/express-path.mjs` in session-start Phase 8.5, and carried through session-plan's Short-Circuit (#1146):
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: grill
3
3
  description: Use when the user wants a plan, design, or PRD stress-tested before any build — relentlessly interrogates one decision at a time, grounds every question in the codebase, hunts contradictions against the domain language and the code, and challenges the load-bearing assumptions. Triggered by "grill me", "stress-test this plan", "poke holes in my design". Composable — run standalone or as an adversarial pass before /plan feature.
4
+ user-invocable: true
5
+ argument-hint: "[file-path-or-topic]"
4
6
  model: inherit
5
7
  color: red
6
8
  tools: Read, Grep, Glob, Bash, Write
@@ -10,6 +12,23 @@ tools: Read, Grep, Glob, Bash, Write
10
12
 
11
13
  > Adversarial pressure-test for a plan, design, or PRD the user already believes in. The complement to `/brainstorm`: brainstorm *narrows* an ambiguous design space cooperatively; grill *attacks* a settled-feeling plan to find what's wrong before it's built. Optionally writes `docs/specs/YYYY-MM-DD-<slug>-grill.md`. No HARD-GATE — composable by design.
12
14
 
15
+ ## Invocation
16
+
17
+ Invoked as `/grill [file-path-or-topic]` with arguments: **$ARGUMENTS** (resolved in Phase 0).
18
+
19
+ The argument is optional and is either a file path to grill (a PRD, spec, `STATE.md`) or a topic/slug. If absent, grill the plan already present in the current conversation; if there is none, ask the user — via AUQ — to state it first.
20
+
21
+ - `/grill` — grills the plan in the current conversation context.
22
+ - `/grill docs/prd/2026-06-09-export.md` — grills a specific PRD file. <!-- path-check: example -->
23
+ - `/grill "partial order cancellation"` — grills the named idea, slug pre-set.
24
+
25
+ | Situation | Use |
26
+ |-----------|-----|
27
+ | A settled-feeling plan needs stress-testing before build | `/grill` |
28
+ | The design is still ambiguous and needs narrowing | `/brainstorm` |
29
+ | Scope is clear, need a formal PRD + issues | `/plan feature` |
30
+ | Adversarial pass before formalizing | `/grill` → `/plan feature` |
31
+
13
32
  ## Soul Reference
14
33
 
15
34
  Read `soul.md` in this skill directory before anything else. It defines WHO you are — the Interrogator, a staff engineer playing devil's advocate. The Six Tactics in soul.md (glossary conflict, sharpen fuzzy language, code contradiction, edge-case scenario, assumption audit, pre-mortem) are the substance of every grill; internalize them before Phase 0.
@@ -1,10 +1,15 @@
1
1
  ---
2
+ name: harness-audit
2
3
  description: Run the harness audit and report the rubric score for this repository
3
- argument-hint: ""
4
+ user-invocable: true
5
+ model: inherit
4
6
  ---
5
-
6
7
  # Harness Audit
7
8
 
9
+ ## Invocation
10
+
11
+ `/harness-audit` takes no arguments — `$ARGUMENTS` is always ignored; anything passed is discarded without a warning. Run the audit exactly as described below and report the rubric score.
12
+
8
13
  The user wants to audit this repository against the session-orchestrator harness rubric. There are no arguments.
9
14
 
10
15
  Run the audit script and surface the results: