session-orchestrator 5.1.0 → 5.3.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 (484) hide show
  1. package/.agents/skills/architecture/SKILL.md +3 -1
  2. package/.agents/skills/autopilot/SKILL.md +6 -1
  3. package/.agents/skills/autopilot/agents/openai.yaml +5 -0
  4. package/.agents/skills/bootstrap/SKILL.md +7 -1
  5. package/.agents/skills/bootstrap/agents/openai.yaml +5 -0
  6. package/.agents/skills/brainstorm/SKILL.md +8 -1
  7. package/.agents/skills/brainstorm/agents/openai.yaml +5 -0
  8. package/.agents/skills/claude-md-drift-check/SKILL.md +3 -1
  9. package/.agents/skills/close/SKILL.md +21 -0
  10. package/.agents/skills/close/agents/openai.yaml +5 -0
  11. package/.agents/skills/convergence-monitoring/SKILL.md +4 -2
  12. package/.agents/skills/debug/SKILL.md +7 -1
  13. package/.agents/skills/debug/agents/openai.yaml +5 -0
  14. package/.agents/skills/discovery/SKILL.md +7 -2
  15. package/.agents/skills/discovery/agents/openai.yaml +5 -0
  16. package/.agents/skills/dispatcher/SKILL.md +7 -1
  17. package/.agents/skills/dispatcher/agents/openai.yaml +5 -0
  18. package/.agents/skills/docs-orchestrator/SKILL.md +3 -1
  19. package/.agents/skills/ecosystem-health/SKILL.md +3 -1
  20. package/.agents/skills/eli5/SKILL.md +7 -1
  21. package/.agents/skills/eli5/agents/openai.yaml +5 -0
  22. package/.agents/skills/eval/SKILL.md +7 -2
  23. package/.agents/skills/eval/agents/openai.yaml +5 -0
  24. package/.agents/skills/evolve/SKILL.md +8 -3
  25. package/.agents/skills/evolve/agents/openai.yaml +5 -0
  26. package/.agents/skills/frontmatter-guard/SKILL.md +3 -1
  27. package/.agents/skills/gitlab-ops/SKILL.md +3 -1
  28. package/.agents/skills/gitlab-portfolio/SKILL.md +3 -1
  29. package/.agents/skills/go/SKILL.md +22 -0
  30. package/.agents/skills/go/agents/openai.yaml +5 -0
  31. package/.agents/skills/grill/SKILL.md +7 -1
  32. package/.agents/skills/grill/agents/openai.yaml +5 -0
  33. package/.agents/skills/harness-audit/SKILL.md +20 -0
  34. package/.agents/skills/harness-audit/agents/openai.yaml +5 -0
  35. package/.agents/skills/hook-development/SKILL.md +3 -1
  36. package/.agents/skills/mcp-builder/SKILL.md +3 -1
  37. package/.agents/skills/memory-cleanup/SKILL.md +6 -1
  38. package/.agents/skills/memory-cleanup/agents/openai.yaml +5 -0
  39. package/.agents/skills/mode-selector/SKILL.md +3 -1
  40. package/.agents/skills/npm-publish/SKILL.md +4 -2
  41. package/.agents/skills/peekaboo-driver/SKILL.md +3 -1
  42. package/.agents/skills/persona-panel/SKILL.md +6 -1
  43. package/.agents/skills/persona-panel/agents/openai.yaml +5 -0
  44. package/.agents/skills/plan/SKILL.md +8 -2
  45. package/.agents/skills/plan/agents/openai.yaml +5 -0
  46. package/.agents/skills/playwright-driver/SKILL.md +3 -1
  47. package/.agents/skills/portfolio/SKILL.md +21 -0
  48. package/.agents/skills/portfolio/agents/openai.yaml +5 -0
  49. package/.agents/skills/quality-gates/SKILL.md +3 -1
  50. package/.agents/skills/reconcile/SKILL.md +6 -1
  51. package/.agents/skills/reconcile/agents/openai.yaml +5 -0
  52. package/.agents/skills/release/SKILL.md +22 -0
  53. package/.agents/skills/release/agents/openai.yaml +5 -0
  54. package/.agents/skills/remote-offload/SKILL.md +3 -1
  55. package/.agents/skills/repo-audit/SKILL.md +6 -1
  56. package/.agents/skills/repo-audit/agents/openai.yaml +5 -0
  57. package/.agents/skills/session/SKILL.md +21 -0
  58. package/.agents/skills/session/agents/openai.yaml +5 -0
  59. package/.agents/skills/session-end/SKILL.md +3 -1
  60. package/.agents/skills/session-plan/SKILL.md +3 -1
  61. package/.agents/skills/session-start/SKILL.md +3 -1
  62. package/.agents/skills/spinout/SKILL.md +6 -1
  63. package/.agents/skills/spinout/agents/openai.yaml +5 -0
  64. package/.agents/skills/sunset-review/SKILL.md +7 -1
  65. package/.agents/skills/sunset-review/agents/openai.yaml +5 -0
  66. package/.agents/skills/templates-ack/SKILL.md +21 -0
  67. package/.agents/skills/templates-ack/agents/openai.yaml +5 -0
  68. package/.agents/skills/test/SKILL.md +21 -0
  69. package/.agents/skills/test/agents/openai.yaml +5 -0
  70. package/.agents/skills/test-runner/SKILL.md +3 -1
  71. package/.agents/skills/tmux-layout/SKILL.md +3 -1
  72. package/.agents/skills/using-orchestrator/SKILL.md +3 -1
  73. package/.agents/skills/ux-grill/SKILL.md +7 -1
  74. package/.agents/skills/ux-grill/agents/openai.yaml +5 -0
  75. package/.agents/skills/vault-mirror/SKILL.md +3 -1
  76. package/.agents/skills/vault-sync/SKILL.md +3 -1
  77. package/.agents/skills/wave-executor/SKILL.md +3 -1
  78. package/.agents/skills/write-executable-plan/SKILL.md +3 -1
  79. package/.claude-plugin/marketplace.json +1 -1
  80. package/.claude-plugin/plugin.json +1 -1
  81. package/.codex-plugin/plugin.json +4 -4
  82. package/.codex-plugin/skills/autopilot/SKILL.md +5 -4
  83. package/.codex-plugin/skills/bootstrap/SKILL.md +8 -4
  84. package/.codex-plugin/skills/brainstorm/SKILL.md +11 -4
  85. package/.codex-plugin/skills/close/SKILL.md +3 -3
  86. package/.codex-plugin/skills/convergence-monitoring/SKILL.md +1 -1
  87. package/.codex-plugin/skills/debug/SKILL.md +11 -4
  88. package/.codex-plugin/skills/discovery/SKILL.md +8 -4
  89. package/.codex-plugin/skills/dispatcher/SKILL.md +4 -4
  90. package/.codex-plugin/skills/eli5/SKILL.md +9 -4
  91. package/.codex-plugin/skills/eval/SKILL.md +9 -4
  92. package/.codex-plugin/skills/evolve/SKILL.md +9 -4
  93. package/.codex-plugin/skills/go/SKILL.md +3 -3
  94. package/.codex-plugin/skills/grill/SKILL.md +11 -4
  95. package/.codex-plugin/skills/harness-audit/SKILL.md +4 -3
  96. package/.codex-plugin/skills/memory-cleanup/SKILL.md +9 -4
  97. package/.codex-plugin/skills/npm-publish/SKILL.md +1 -1
  98. package/.codex-plugin/skills/persona-panel/SKILL.md +5 -5
  99. package/.codex-plugin/skills/plan/SKILL.md +8 -4
  100. package/.codex-plugin/skills/portfolio/SKILL.md +3 -3
  101. package/.codex-plugin/skills/reconcile/SKILL.md +9 -4
  102. package/.codex-plugin/skills/release/SKILL.md +3 -3
  103. package/.codex-plugin/skills/repo-audit/SKILL.md +6 -4
  104. package/.codex-plugin/skills/session/SKILL.md +1 -1
  105. package/.codex-plugin/skills/spinout/SKILL.md +4 -4
  106. package/.codex-plugin/skills/sunset-review/SKILL.md +5 -4
  107. package/.codex-plugin/skills/test/SKILL.md +3 -3
  108. package/.codex-plugin/skills/ux-grill/SKILL.md +11 -4
  109. package/.cursor/commands/autopilot.md +4 -4
  110. package/.cursor/commands/bootstrap.md +5 -4
  111. package/.cursor/commands/brainstorm.md +5 -4
  112. package/.cursor/commands/close.md +4 -3
  113. package/.cursor/commands/debug.md +4 -4
  114. package/.cursor/commands/discovery.md +4 -4
  115. package/.cursor/commands/dispatcher.md +4 -4
  116. package/.cursor/commands/eli5.md +4 -4
  117. package/.cursor/commands/eval.md +4 -4
  118. package/.cursor/commands/evolve.md +4 -4
  119. package/.cursor/commands/go.md +4 -3
  120. package/.cursor/commands/grill.md +4 -4
  121. package/.cursor/commands/harness-audit.md +3 -3
  122. package/.cursor/commands/memory-cleanup.md +4 -4
  123. package/.cursor/commands/persona-panel.md +4 -4
  124. package/.cursor/commands/plan.md +5 -4
  125. package/.cursor/commands/portfolio.md +3 -3
  126. package/.cursor/commands/reconcile.md +4 -4
  127. package/.cursor/commands/release.md +4 -3
  128. package/.cursor/commands/repo-audit.md +4 -4
  129. package/.cursor/commands/session.md +1 -1
  130. package/.cursor/commands/spinout.md +4 -4
  131. package/.cursor/commands/sunset-review.md +4 -4
  132. package/.cursor/commands/test.md +3 -3
  133. package/.cursor/commands/ux-grill.md +4 -4
  134. package/.cursor/rules/000-session-orchestrator.mdc +0 -2
  135. package/.cursor/rules/010-session-workflow.mdc +2 -2
  136. package/.cursor/rules/050-plan.mdc +1 -1
  137. package/.cursor/skills/bootstrap/SKILL.md +1 -0
  138. package/.cursor/skills/close/SKILL.md +13 -0
  139. package/.cursor/skills/convergence-monitoring/SKILL.md +1 -0
  140. package/.cursor/skills/debug/SKILL.md +0 -1
  141. package/.cursor/skills/discovery/SKILL.md +0 -1
  142. package/.cursor/skills/dispatcher/SKILL.md +0 -1
  143. package/.cursor/skills/eli5/SKILL.md +0 -1
  144. package/.cursor/skills/eval/SKILL.md +1 -1
  145. package/.cursor/skills/evolve/SKILL.md +0 -1
  146. package/.cursor/skills/go/SKILL.md +13 -0
  147. package/.cursor/skills/grill/SKILL.md +0 -1
  148. package/.cursor/skills/harness-audit/SKILL.md +12 -0
  149. package/.cursor/skills/npm-publish/SKILL.md +1 -0
  150. package/.cursor/skills/portfolio/SKILL.md +12 -0
  151. package/.cursor/skills/release/SKILL.md +13 -0
  152. package/.cursor/skills/repo-audit/SKILL.md +0 -1
  153. package/.cursor/skills/sunset-review/SKILL.md +0 -1
  154. package/.cursor/skills/test/SKILL.md +12 -0
  155. package/.cursor/skills/ux-grill/SKILL.md +0 -1
  156. package/.cursor-plugin/plugin.json +1 -1
  157. package/.orchestrator/policy/blocked-commands.json +13 -4
  158. package/AGENTS.md +3 -2
  159. package/CHANGELOG.md +197 -0
  160. package/README.md +11 -9
  161. package/SECURITY.md +12 -0
  162. package/agents/dialectic-deriver.md +13 -10
  163. package/agents/eval-judge.md +67 -45
  164. package/agents/skill-applied-judge.md +34 -19
  165. package/commands/session.md +17 -3
  166. package/docs/baseline.md +12 -6
  167. package/docs/ci-setup.md +53 -0
  168. package/docs/codex-setup.md +15 -3
  169. package/docs/components.md +13 -6
  170. package/docs/events-schema.md +59 -9
  171. package/docs/install.md +16 -0
  172. package/docs/persona-panel.md +1 -1
  173. package/docs/pi-setup.md +1 -1
  174. package/docs/rule-authoring.md +135 -14
  175. package/docs/scope-collision-guard.md +2 -0
  176. package/docs/session-config-reference.md +106 -11
  177. package/docs/session-config-template.md +31 -2
  178. package/docs/telemetry.md +2 -0
  179. package/hooks/_lib/hook-import-set.json +125 -8
  180. package/hooks/_lib/subagent-paths.mjs +15 -0
  181. package/hooks/_lib/subagent-transcript.mjs +582 -31
  182. package/hooks/_lib/vcs-create-matcher.mjs +217 -62
  183. package/hooks/config-protection.mjs +11 -3
  184. package/hooks/cwd-change-restore.mjs +11 -3
  185. package/hooks/enforce-commands.mjs +70 -23
  186. package/hooks/enforce-scope.mjs +143 -33
  187. package/hooks/hooks-codex.json +1 -1
  188. package/hooks/hooks.json +1 -1
  189. package/hooks/loop-guard.mjs +11 -3
  190. package/hooks/on-session-end.mjs +72 -25
  191. package/hooks/on-session-start.mjs +48 -11
  192. package/hooks/on-stop.mjs +211 -23
  193. package/hooks/operator-steer.mjs +11 -3
  194. package/hooks/post-bash-issue-budget-refund.mjs +18 -8
  195. package/hooks/post-bash-write-verify.mjs +6 -2
  196. package/hooks/post-edit-import-probe.mjs +17 -9
  197. package/hooks/post-edit-validate.mjs +13 -5
  198. package/hooks/post-subagent-discovery-validator.mjs +98 -13
  199. package/hooks/post-tool-batch-wave-signal.mjs +200 -38
  200. package/hooks/post-tool-failure-corrective-context.mjs +11 -5
  201. package/hooks/post-tooluse-frontend-slop.mjs +10 -4
  202. package/hooks/pre-auq-clarity.mjs +18 -2
  203. package/hooks/pre-bash-destructive-guard.mjs +80 -9
  204. package/hooks/pre-bash-issue-budget.mjs +119 -28
  205. package/hooks/pre-bash-memory-propose-audit.mjs +86 -54
  206. package/hooks/pre-bash-sessions-ledger-guard.mjs +391 -20
  207. package/hooks/pre-bash-staging-fence.mjs +335 -31
  208. package/hooks/pre-bash-templates-first.mjs +19 -14
  209. package/hooks/pre-task-scope-disjoint.mjs +385 -5
  210. package/hooks/skill-invocation-telemetry.mjs +2 -1
  211. package/hooks/subagent-telemetry.mjs +15 -19
  212. package/hooks/wave-scope-commit-guard.mjs +197 -100
  213. package/monitors/monitors.json +1 -1
  214. package/output-styles/wave-summary.md +1 -1
  215. package/package.json +2 -1
  216. package/pi/prompts/autopilot.md +3 -3
  217. package/pi/prompts/bootstrap.md +3 -3
  218. package/pi/prompts/brainstorm.md +3 -3
  219. package/pi/prompts/close.md +2 -2
  220. package/pi/prompts/debug.md +3 -3
  221. package/pi/prompts/discovery.md +3 -3
  222. package/pi/prompts/dispatcher.md +3 -3
  223. package/pi/prompts/eli5.md +3 -3
  224. package/pi/prompts/eval.md +3 -3
  225. package/pi/prompts/evolve.md +3 -3
  226. package/pi/prompts/go.md +2 -2
  227. package/pi/prompts/grill.md +3 -3
  228. package/pi/prompts/harness-audit.md +2 -3
  229. package/pi/prompts/memory-cleanup.md +3 -3
  230. package/pi/prompts/persona-panel.md +3 -3
  231. package/pi/prompts/plan.md +3 -3
  232. package/pi/prompts/portfolio.md +2 -2
  233. package/pi/prompts/reconcile.md +3 -3
  234. package/pi/prompts/release.md +3 -3
  235. package/pi/prompts/repo-audit.md +3 -4
  236. package/pi/prompts/session.md +2 -2
  237. package/pi/prompts/spinout.md +3 -3
  238. package/pi/prompts/sunset-review.md +3 -3
  239. package/pi/prompts/templates-ack.md +1 -1
  240. package/pi/prompts/test.md +3 -3
  241. package/pi/prompts/ux-grill.md +3 -3
  242. package/rules/README.md +1 -1
  243. package/rules/opt-in-domain/prompt-caching.md +1 -1
  244. package/rules/opt-in-stack/backend-data.md +1 -1
  245. package/rules/opt-in-stack/backend.md +3 -3
  246. package/rules/opt-in-stack/frontend.md +1 -1
  247. package/rules/opt-in-stack/security-web.md +3 -3
  248. package/rules/opt-in-stack/swift.md +1 -1
  249. package/scripts/archive-closed-prds.mjs +2 -2
  250. package/scripts/auq-audit.mjs +2 -3
  251. package/scripts/autopilot.mjs +23 -2
  252. package/scripts/backfill-abandoned-sessions.mjs +171 -15
  253. package/scripts/backfill-evidence-digest.mjs +2 -1
  254. package/scripts/backfill-learnings-from-vault.mjs +2 -2
  255. package/scripts/check-package-manager.mjs +2 -2
  256. package/scripts/check-sessions-integrity.mjs +300 -0
  257. package/scripts/ci/assert-vitest-green.mjs +2 -1
  258. package/scripts/dialectic-deriver.mjs +50 -13
  259. package/scripts/emit-session.mjs +77 -32
  260. package/scripts/eval-session.mjs +65 -3
  261. package/scripts/export-hw-learnings.mjs +2 -1
  262. package/scripts/express-path.mjs +1 -1
  263. package/scripts/gc-stale-worktrees.mjs +2 -1
  264. package/scripts/generate-agents-skills.mjs +102 -29
  265. package/scripts/generate-codex-skills.mjs +48 -4
  266. package/scripts/generate-cursor-adapter.mjs +220 -11
  267. package/scripts/generate-hook-import-set.mjs +12 -27
  268. package/scripts/generate-pi-prompts.mjs +183 -13
  269. package/scripts/github-protection-audit.mjs +2 -3
  270. package/scripts/lib/agent-frontmatter.mjs +23 -1
  271. package/scripts/lib/agent-status.mjs +2 -31
  272. package/scripts/lib/auq/clarity.mjs +10 -2
  273. package/scripts/lib/auq/parse.mjs +12 -31
  274. package/scripts/lib/auq/schema.mjs +56 -41
  275. package/scripts/lib/auto-dialectic.mjs +304 -15
  276. package/scripts/lib/autopilot/flags.mjs +12 -1
  277. package/scripts/lib/autopilot/kill-switches.mjs +6 -3
  278. package/scripts/lib/autopilot/loop.mjs +14 -1
  279. package/scripts/lib/autopilot/stall-sampler.mjs +80 -23
  280. package/scripts/lib/ci-status-banner.mjs +376 -16
  281. package/scripts/lib/claude-md-budget-lint.mjs +2 -5
  282. package/scripts/lib/command-blocker.mjs +408 -33
  283. package/scripts/lib/config/dialectic.mjs +12 -3
  284. package/scripts/lib/config/drift-check.mjs +19 -0
  285. package/scripts/lib/config/gate.mjs +74 -0
  286. package/scripts/lib/config/reaper.mjs +162 -0
  287. package/scripts/lib/config.mjs +14 -0
  288. package/scripts/lib/convergence-monitor.mjs +76 -13
  289. package/scripts/lib/cursor-hook-bridge.mjs +2 -2
  290. package/scripts/lib/description-surface.mjs +2 -5
  291. package/scripts/lib/dispatcher/cli.mjs +2 -1
  292. package/scripts/lib/ecosystem-health.mjs +11 -0
  293. package/scripts/lib/ecosystem-wizard.mjs +2 -1
  294. package/scripts/lib/eval/engine.mjs +421 -53
  295. package/scripts/lib/eval/judge.mjs +463 -40
  296. package/scripts/lib/eval/schema.mjs +10 -1
  297. package/scripts/lib/events-rotation.mjs +221 -25
  298. package/scripts/lib/events-schema.mjs +114 -0
  299. package/scripts/lib/events.mjs +524 -5
  300. package/scripts/lib/fetch-baseline.mjs +3 -8
  301. package/scripts/lib/frontmatter-guard.mjs +21 -10
  302. package/scripts/lib/gates/gate-baseline.mjs +27 -2
  303. package/scripts/lib/gates/gate-full.mjs +28 -3
  304. package/scripts/lib/gates/gate-helpers.mjs +243 -21
  305. package/scripts/lib/gates/gate-incremental.mjs +28 -3
  306. package/scripts/lib/gates/gate-per-file.mjs +27 -2
  307. package/scripts/lib/gitlab-ops/stale-mr-sweep.mjs +2 -1
  308. package/scripts/lib/gitlab-portfolio/cli.mjs +2 -1
  309. package/scripts/lib/gitlab-portfolio/markdown-writer.mjs +6 -1
  310. package/scripts/lib/instruction-budget-guard.mjs +332 -50
  311. package/scripts/lib/io.mjs +42 -8
  312. package/scripts/lib/is-main-module.mjs +82 -0
  313. package/scripts/lib/issue-close-strip-labels.mjs +207 -49
  314. package/scripts/lib/js-mask.mjs +197 -0
  315. package/scripts/lib/learnings/evolve-telemetry.mjs +11 -7
  316. package/scripts/lib/locks/index.mjs +32 -25
  317. package/scripts/lib/maintenance-due-banner.mjs +122 -91
  318. package/scripts/lib/orphan-reaper.mjs +1588 -0
  319. package/scripts/lib/peer-cards/merger.mjs +48 -10
  320. package/scripts/lib/peer-cards/reader.mjs +78 -2
  321. package/scripts/lib/peer-discovery.mjs +2 -5
  322. package/scripts/lib/playwright-driver/runner.mjs +2 -1
  323. package/scripts/lib/process-group.mjs +899 -0
  324. package/scripts/lib/quality-gate.mjs +107 -28
  325. package/scripts/lib/reconcile/backlog.mjs +368 -0
  326. package/scripts/lib/reconcile/engine.mjs +55 -188
  327. package/scripts/lib/reconcile/rule-expiry-sweep.mjs +884 -0
  328. package/scripts/lib/reconcile/sanitize.mjs +69 -3
  329. package/scripts/lib/reconcile-nudge-banner.mjs +138 -45
  330. package/scripts/lib/resource-probe/parsers.mjs +31 -0
  331. package/scripts/lib/rule-loader.mjs +41 -12
  332. package/scripts/lib/rules-sync.mjs +2 -5
  333. package/scripts/lib/scope-echo.mjs +429 -7
  334. package/scripts/lib/scope-gate.mjs +605 -1
  335. package/scripts/lib/session-close-backfill.mjs +91 -12
  336. package/scripts/lib/session-id.mjs +9 -20
  337. package/scripts/lib/session-invocation.mjs +20 -0
  338. package/scripts/lib/session-schema/constants.mjs +30 -2
  339. package/scripts/lib/session-schema/normalizer.mjs +56 -4
  340. package/scripts/lib/session-schema.mjs +8 -3
  341. package/scripts/lib/session-start-probes.mjs +95 -10
  342. package/scripts/lib/sessions-canonical.mjs +23 -0
  343. package/scripts/lib/sessions-integrity-banner.mjs +7 -1
  344. package/scripts/lib/sessions-staleness-banner.mjs +193 -51
  345. package/scripts/lib/skill-evidence-window.mjs +891 -0
  346. package/scripts/lib/skill-evolution/candidate-intake.mjs +133 -12
  347. package/scripts/lib/skill-evolution/engine.mjs +18 -9
  348. package/scripts/lib/skill-judge.mjs +45 -3
  349. package/scripts/lib/state-md.mjs +84 -3
  350. package/scripts/lib/sunset/walker.mjs +31 -4
  351. package/scripts/lib/tail-window.mjs +56 -0
  352. package/scripts/lib/telemetry/schema.mjs +30 -0
  353. package/scripts/lib/telemetry/sync.mjs +61 -6
  354. package/scripts/lib/telemetry-flush-health-banner.mjs +4 -22
  355. package/scripts/lib/test-runner/issue-reconcile.mjs +48 -16
  356. package/scripts/lib/tests-src-ratio.mjs +2 -6
  357. package/scripts/lib/tmux-layout/telemetry-stats.mjs +74 -14
  358. package/scripts/lib/user-invocable-skills.mjs +205 -0
  359. package/scripts/lib/ux-grill/reconcile.mjs +48 -22
  360. package/scripts/lib/validate/check-agents-skills.mjs +26 -15
  361. package/scripts/lib/validate/check-banner-parity.mjs +2 -2
  362. package/scripts/lib/validate/check-cursor-adapter.mjs +3 -2
  363. package/scripts/lib/validate/check-dead-bridge.mjs +2 -2
  364. package/scripts/lib/validate/check-doc-cli-commands.mjs +2 -2
  365. package/scripts/lib/validate/check-entry-guard.mjs +329 -0
  366. package/scripts/lib/validate/check-guard-requires-parity.mjs +2 -2
  367. package/scripts/lib/validate/check-hook-entry-guards.mjs +636 -0
  368. package/scripts/lib/validate/check-hooks-emit-event-guard.mjs +2 -2
  369. package/scripts/lib/validate/check-learning-provenance.mjs +2 -2
  370. package/scripts/lib/validate/check-pi-prompts.mjs +1 -0
  371. package/scripts/lib/validate/check-rules.mjs +7 -5
  372. package/scripts/lib/validate/check-skill-links.mjs +35 -6
  373. package/scripts/lib/validate/check-skill-script-paths.mjs +241 -29
  374. package/scripts/lib/validate/check-test-git-config-target.mjs +26 -36
  375. package/scripts/lib/validate/check-unicode-safety.mjs +2 -2
  376. package/scripts/lib/validate/check-untracked-test-deps.mjs +9 -104
  377. package/scripts/lib/validate/check-unwired-features.mjs +220 -33
  378. package/scripts/lib/validate/check-validator-registration.mjs +36 -12
  379. package/scripts/lib/validate/check-vcs-repo-flag.mjs +2 -2
  380. package/scripts/lib/validate/confidential-names.mjs +10 -0
  381. package/scripts/lib/validate-vendored-rules.mjs +39 -12
  382. package/scripts/lib/vault-mirror/namespace.mjs +46 -8
  383. package/scripts/lib/vault-mirror/process.mjs +10 -3
  384. package/scripts/lib/vault-mirror/render-sessions.mjs +12 -2
  385. package/scripts/lib/vault-status/narrative-mirror.mjs +31 -7
  386. package/scripts/lib/vault-yaml.mjs +118 -0
  387. package/scripts/lib/wave-transcript-tail.mjs +2 -2
  388. package/scripts/lib/worktree/lifecycle.mjs +153 -1
  389. package/scripts/lock-reaper.mjs +2 -1
  390. package/scripts/materialize-wave-scope.mjs +87 -4
  391. package/scripts/migrate-sessions-jsonl.mjs +2 -1
  392. package/scripts/migrate-vault-paths.mjs +2 -3
  393. package/scripts/release-session-lock.mjs +305 -0
  394. package/scripts/release.mjs +109 -39
  395. package/scripts/relocate-vault-corpus.mjs +2 -3
  396. package/scripts/repair-invalid-sessions.mjs +2 -2
  397. package/scripts/resolve-session-invocation.mjs +59 -0
  398. package/scripts/run-quality-gate.mjs +156 -17
  399. package/scripts/session-shape.mjs +2 -2
  400. package/scripts/site-numbers.mjs +35 -11
  401. package/scripts/sweep-expired-rules.mjs +227 -0
  402. package/scripts/validate-plugin.mjs +21 -0
  403. package/scripts/validate-wave-scope.mjs +32 -105
  404. package/scripts/vault-consolidate.mjs +2 -2
  405. package/scripts/vault-mirror.mjs +11 -4
  406. package/scripts/wave-scope-binding.mjs +2 -3
  407. package/skills/_shared/bootstrap-gate.md +1 -1
  408. package/skills/_shared/monitor-patterns.md +1 -1
  409. package/skills/_shared/platform-tools.md +23 -11
  410. package/skills/_shared/research-evidence.md +53 -0
  411. package/skills/_shared/state-ownership.md +3 -0
  412. package/skills/autopilot/SKILL.md +80 -11
  413. package/skills/bootstrap/SKILL.md +51 -1
  414. package/skills/brainstorm/SKILL.md +16 -0
  415. package/skills/claude-md-drift-check/SKILL.md +1 -1
  416. package/skills/claude-md-drift-check/checker.mjs +49 -11
  417. package/{commands/close.md → skills/close/SKILL.md} +9 -3
  418. package/skills/convergence-monitoring/README.md +8 -1
  419. package/skills/convergence-monitoring/SIGNALS.md +50 -6
  420. package/skills/convergence-monitoring/SKILL.md +15 -6
  421. package/skills/debug/SKILL.md +10 -0
  422. package/skills/discovery/SKILL.md +24 -1
  423. package/skills/discovery/probes-session.md +2 -2
  424. package/skills/dispatcher/SKILL.md +38 -7
  425. package/skills/eli5/SKILL.md +11 -0
  426. package/skills/eval/SKILL.md +52 -23
  427. package/skills/eval/rubric-v1.md +1 -0
  428. package/skills/eval/rubric-v2.md +457 -0
  429. package/skills/evolve/SKILL.md +9 -2
  430. package/skills/evolve/references/evolve-dialectic-mode.md +46 -25
  431. package/skills/gitlab-ops/SKILL.md +3 -2
  432. package/{commands/go.md → skills/go/SKILL.md} +9 -1
  433. package/skills/grill/SKILL.md +19 -0
  434. package/{commands/harness-audit.md → skills/harness-audit/SKILL.md} +7 -2
  435. package/skills/hook-development/SKILL.md +46 -41
  436. package/skills/memory-cleanup/SKILL.md +7 -0
  437. package/skills/npm-publish/SKILL.md +2 -2
  438. package/skills/persona-panel/SKILL.md +56 -1
  439. package/skills/persona-panel/persona-format.md +1 -1
  440. package/skills/plan/SKILL.md +28 -1
  441. package/{commands/portfolio.md → skills/portfolio/SKILL.md} +8 -2
  442. package/skills/reconcile/SKILL.md +21 -0
  443. package/{commands/release.md → skills/release/SKILL.md} +16 -2
  444. package/skills/repo-audit/SKILL.md +7 -0
  445. package/skills/session-end/SKILL.md +13 -16
  446. package/skills/session-end/discovery-scan.md +1 -1
  447. package/skills/session-end/phase-3-6-tail.md +55 -9
  448. package/skills/session-end/plan-verification.md +2 -2
  449. package/skills/session-end/references/phase-5-issue-cleanup.md +9 -14
  450. package/skills/session-end/session-metrics-write.md +10 -0
  451. package/skills/session-plan/SKILL.md +18 -6
  452. package/skills/session-plan/references/session-plan-task-classification.md +2 -2
  453. package/skills/session-start/SKILL.md +5 -4
  454. package/skills/session-start/phase-8-5-express-path.md +6 -6
  455. package/skills/session-start/references/phase-1-5-session-continuity.md +1 -1
  456. package/skills/session-start/references/phase-2-7-portfolio-snapshot.md +1 -1
  457. package/skills/session-start/references/phase-4-ssot-environment-check.md +6 -4
  458. package/skills/spinout/SKILL.md +12 -1
  459. package/skills/sunset-review/SKILL.md +13 -0
  460. package/{commands/test.md → skills/test/SKILL.md} +10 -4
  461. package/skills/ux-grill/SKILL.md +20 -2
  462. package/skills/wave-executor/SKILL.md +14 -7
  463. package/skills/wave-executor/circuit-breaker.md +2 -0
  464. package/skills/wave-executor/references/wave-executor-state-init.md +18 -4
  465. package/skills/wave-executor/references/wave-loop-dispatch.md +5 -2
  466. package/skills/wave-executor/references/wave-loop-review.md +17 -1
  467. package/commands/autopilot.md +0 -80
  468. package/commands/bootstrap.md +0 -56
  469. package/commands/brainstorm.md +0 -48
  470. package/commands/debug.md +0 -36
  471. package/commands/discovery.md +0 -32
  472. package/commands/dispatcher.md +0 -59
  473. package/commands/eli5.md +0 -33
  474. package/commands/eval.md +0 -28
  475. package/commands/evolve.md +0 -10
  476. package/commands/grill.md +0 -45
  477. package/commands/memory-cleanup.md +0 -26
  478. package/commands/persona-panel.md +0 -121
  479. package/commands/plan.md +0 -15
  480. package/commands/reconcile.md +0 -23
  481. package/commands/repo-audit.md +0 -24
  482. package/commands/spinout.md +0 -15
  483. package/commands/sunset-review.md +0 -27
  484. package/commands/ux-grill.md +0 -51
@@ -41,63 +41,7 @@ import { join } from 'node:path';
41
41
  // consumer repo or a test tmp-dir.
42
42
  import { pathMatchesPattern, findScopeFile } from '../scripts/lib/hardening.mjs';
43
43
  import { withStagingFenceLock } from '../scripts/lib/session-lock.mjs';
44
-
45
- const repoRoot = execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();
46
- // #801: resolve wave-scope.json via the same precedence every other reader
47
- // uses (.pi/.cursor/.codex/.claude — scope-gate.mjs findScopeFile). The prior
48
- // hardcoded `.orchestrator/wave-scope.json` path was DEAD — the coordinator
49
- // writes wave-scope.json to the state dir (.claude/ on Claude Code; see
50
- // skills/wave-executor/wave-loop.md), so this guard never fired. findScopeFile
51
- // returns null when no scope file exists at any precedence dir, preserving
52
- // the "no active wave → exit 0" semantics below.
53
- const scopePath = findScopeFile(repoRoot);
54
- const fenceDir = join(repoRoot, '.orchestrator', 'staging-fence');
55
-
56
- // ---------------------------------------------------------------------------
57
- // Sub-mode B — allowedPaths check
58
- // ---------------------------------------------------------------------------
59
-
60
- const stagedOutput = execSync('git diff --cached --name-only', { encoding: 'utf8' });
61
- const stagedFiles = stagedOutput.split('\n').filter(Boolean);
62
-
63
- if (scopePath) {
64
- let scope;
65
- try {
66
- scope = JSON.parse(readFileSync(scopePath, 'utf8'));
67
- } catch (err) {
68
- process.stderr.write(`wave-scope-commit-guard: failed to parse wave-scope.json: ${err.message}\n`);
69
- process.exit(1);
70
- }
71
-
72
- const allowedPaths = Array.isArray(scope.allowedPaths) ? scope.allowedPaths : [];
73
- if (allowedPaths.length > 0) {
74
- const violations = stagedFiles.filter(
75
- (f) => !allowedPaths.some((pattern) => pathMatchesPattern(f, pattern)),
76
- );
77
-
78
- if (violations.length > 0) {
79
- process.stderr.write('✗ wave-scope-commit-guard: staged paths outside wave-scope.allowedPaths:\n');
80
- for (const v of violations) process.stderr.write(` - ${v}\n`);
81
- process.stderr.write('\nThese files were likely added by lint-staged eslint --fix / prettier --write.\n');
82
- process.stderr.write('To proceed:\n');
83
- process.stderr.write(' 1) git restore --staged <path> # for each foreign path\n');
84
- process.stderr.write(' 2) git commit # retry\n');
85
- process.exit(1);
86
- }
87
- }
88
- }
89
-
90
- // ---------------------------------------------------------------------------
91
- // Sub-mode C — cross-agent staging-fence reconciliation (issue #552)
92
- // ---------------------------------------------------------------------------
93
- //
94
- // Skip entirely when no fence dir exists OR no staged files. The fence dir
95
- // only appears when a wave-agent invoked `git add` while SO_WAVE_AGENT=1.
96
- // Manual / coordinator commits never write a fence file, so this branch
97
- // short-circuits to exit 0 for them (AC5 safe-default).
98
- if (!existsSync(fenceDir) || stagedFiles.length === 0) {
99
- process.exit(0);
100
- }
44
+ import { isMainModule } from '../scripts/lib/is-main-module.mjs';
101
45
 
102
46
  // Resolve the "current" agent id from SO_WAVE_AGENT_ID (when set by the
103
47
  // caller) or fall back to a PID-derived marker. The fence files themselves
@@ -105,11 +49,20 @@ if (!existsSync(fenceDir) || stagedFiles.length === 0) {
105
49
  // fence entries (we cross-check against SIBLINGS, not ourselves).
106
50
  const ownAgentId = process.env.SO_WAVE_AGENT_ID ?? null;
107
51
 
52
+ /**
53
+ * Recorded by the writer when a staging command stages a set no path operand
54
+ * names (`git add -A`, `git add .`, `git add -u`). Overlaps everything.
55
+ * Mirrors ALL_PATHS_MARKER in hooks/pre-bash-staging-fence.mjs.
56
+ */
57
+ const ALL_PATHS_MARKER = '*';
58
+
108
59
  /**
109
60
  * Build a regex that finds a staged path inside a `git add` command string.
110
61
  * Word-boundary on both sides so `src/foo.ts` does not match `src/foo.ts.bak`.
111
62
  * The path is escaped so glob metacharacters (`*`, `?`) and shell metas
112
63
  * cannot be reinterpreted.
64
+ *
65
+ * LEGACY PATH ONLY since #1404 — see the fallback branch in findOverlaps.
113
66
  */
114
67
  function pathRegex(p) {
115
68
  const escaped = p.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
@@ -117,8 +70,56 @@ function pathRegex(p) {
117
70
  }
118
71
 
119
72
  /**
120
- * Walk a single sibling fence file and return the staged paths whose path
121
- * pattern matches any of our staged files.
73
+ * Normalise a path token so reader and writer compare the same spelling.
74
+ *
75
+ * DELIBERATE DUPLICATE of the identically-named function in
76
+ * hooks/pre-bash-staging-fence.mjs: this guard is a husky pre-commit hook
77
+ * outside the Claude-Code hook import set, and the two sides must agree byte
78
+ * for byte. Change one, change both.
79
+ *
80
+ * @param {string} raw
81
+ * @returns {string}
82
+ */
83
+ function normalizeStagedPath(raw) {
84
+ let p = String(raw).trim();
85
+ while (p.startsWith('./')) p = p.slice(2);
86
+ p = p.replace(/\/{2,}/g, '/');
87
+ while (p.length > 1 && p.endsWith('/')) p = p.slice(0, -1);
88
+ return p;
89
+ }
90
+
91
+ /**
92
+ * Does a path a sibling recorded overlap one of OUR staged files? Both sides
93
+ * arrive already normalised. A DIRECTORY entry overlaps every file beneath it
94
+ * (`src` overlaps `src/foo.ts`); the marker overlaps everything.
95
+ *
96
+ * @param {string} fencePath
97
+ * @param {string} ourPath
98
+ * @returns {boolean}
99
+ */
100
+ function pathsOverlap(fencePath, ourPath) {
101
+ if (fencePath === ALL_PATHS_MARKER) return true;
102
+ if (fencePath === ourPath) return true;
103
+ return ourPath.startsWith(`${fencePath}/`);
104
+ }
105
+
106
+ /**
107
+ * Walk a single sibling fence file and return the staged paths a sibling
108
+ * agent also recorded an intent to stage.
109
+ *
110
+ * Two entry shapes are accepted:
111
+ * - #1404 shape `{ paths, command_hash, timestamp }` — path LISTS compared
112
+ * against our staged set.
113
+ * - LEGACY shape `{ command, timestamp }` — a fence file written by a
114
+ * pre-#1404 hook version. Live sessions on this host may hold such files
115
+ * RIGHT NOW, and dropping them would read as "no overlap" — silently
116
+ * weaker than before the change. So the old raw-command regex still runs
117
+ * for an entry that has `command` and no `paths`.
118
+ * NAMED CEILING (BV-004): this fallback exists only to span the sessions
119
+ * running across the upgrade. REVISIT TRIGGER — remove it one minor
120
+ * release after 5.3.0 (i.e. in 5.4.0), by which point no process started
121
+ * before the upgrade can still be writing fence files. The command text it
122
+ * reads is never PRINTED (issue #1404) — only the fact of the match is.
122
123
  */
123
124
  function findOverlaps(fenceJsonPath, ourStaged) {
124
125
  let body;
@@ -131,61 +132,157 @@ function findOverlaps(fenceJsonPath, ourStaged) {
131
132
  if (!Array.isArray(body.staged_paths)) return [];
132
133
  if (ownAgentId && body.agent_id === ownAgentId) return []; // skip self
133
134
 
135
+ const siblingAgent = body.agent_id ?? '<unknown>';
134
136
  const matches = [];
135
137
  for (const entry of body.staged_paths) {
138
+ if (Array.isArray(entry?.paths)) {
139
+ const hash = typeof entry.command_hash === 'string' ? entry.command_hash : '<no-hash>';
140
+ for (const raw of entry.paths) {
141
+ if (typeof raw !== 'string') continue;
142
+ const fencePath = normalizeStagedPath(raw);
143
+ for (const ours of ourStaged) {
144
+ if (pathsOverlap(fencePath, normalizeStagedPath(ours))) {
145
+ matches.push({ ourPath: ours, siblingAgent, fencePath, hash });
146
+ }
147
+ }
148
+ }
149
+ continue;
150
+ }
151
+
136
152
  const cmd = entry?.command;
137
153
  if (typeof cmd !== 'string') continue;
138
154
  for (const ours of ourStaged) {
139
155
  if (pathRegex(ours).test(cmd)) {
140
- matches.push({ ourPath: ours, siblingAgent: body.agent_id ?? '<unknown>', cmd });
156
+ matches.push({
157
+ ourPath: ours,
158
+ siblingAgent,
159
+ fencePath: '<legacy entry, pre-#1404>',
160
+ hash: '<legacy entry, pre-#1404>',
161
+ });
141
162
  }
142
163
  }
143
164
  }
144
165
  return matches;
145
166
  }
146
167
 
147
- let overlaps = [];
148
-
149
- try {
150
- await withStagingFenceLock(
151
- repoRoot,
152
- async () => {
153
- let entries;
154
- try {
155
- entries = readdirSync(fenceDir);
156
- } catch {
157
- return;
158
- }
159
- for (const name of entries) {
160
- if (!name.endsWith('.json')) continue;
161
- if (name.startsWith('.')) continue; // skip .commit.lock, tmp files
162
- const overlapsFromFile = findOverlaps(join(fenceDir, name), stagedFiles);
163
- overlaps = overlaps.concat(overlapsFromFile);
168
+ /**
169
+ * Both sub-modes, in the order the pre-commit hook needs them. Every statement
170
+ * here used to sit at module top level, which meant a bare `import()` of this
171
+ * file ran `git rev-parse` / `git diff --cached` and could exit the IMPORTING
172
+ * process with 1 (#1393). Moved into a function so the entry guard below can
173
+ * gate it; the logic and its exit codes are unchanged.
174
+ */
175
+ async function main() {
176
+ const repoRoot = execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();
177
+ // #801: resolve wave-scope.json via the same precedence every other reader
178
+ // uses (.pi/.cursor/.codex/.claude — scope-gate.mjs findScopeFile). The prior
179
+ // hardcoded `.orchestrator/wave-scope.json` path was DEAD — the coordinator
180
+ // writes wave-scope.json to the state dir (.claude/ on Claude Code; see
181
+ // skills/wave-executor/wave-loop.md), so this guard never fired. findScopeFile
182
+ // returns null when no scope file exists at any precedence dir, preserving
183
+ // the "no active wave → exit 0" semantics below.
184
+ const scopePath = findScopeFile(repoRoot);
185
+ const fenceDir = join(repoRoot, '.orchestrator', 'staging-fence');
186
+
187
+ // -------------------------------------------------------------------------
188
+ // Sub-mode B — allowedPaths check
189
+ // -------------------------------------------------------------------------
190
+
191
+ const stagedOutput = execSync('git diff --cached --name-only', { encoding: 'utf8' });
192
+ const stagedFiles = stagedOutput.split('\n').filter(Boolean);
193
+
194
+ if (scopePath) {
195
+ let scope;
196
+ try {
197
+ scope = JSON.parse(readFileSync(scopePath, 'utf8'));
198
+ } catch (err) {
199
+ process.stderr.write(`wave-scope-commit-guard: failed to parse wave-scope.json: ${err.message}\n`);
200
+ process.exit(1);
201
+ }
202
+
203
+ const allowedPaths = Array.isArray(scope.allowedPaths) ? scope.allowedPaths : [];
204
+ if (allowedPaths.length > 0) {
205
+ const violations = stagedFiles.filter(
206
+ (f) => !allowedPaths.some((pattern) => pathMatchesPattern(f, pattern)),
207
+ );
208
+
209
+ if (violations.length > 0) {
210
+ process.stderr.write('✗ wave-scope-commit-guard: staged paths outside wave-scope.allowedPaths:\n');
211
+ for (const v of violations) process.stderr.write(` - ${v}\n`);
212
+ process.stderr.write('\nThese files were likely added by lint-staged eslint --fix / prettier --write.\n');
213
+ process.stderr.write('To proceed:\n');
214
+ process.stderr.write(' 1) git restore --staged <path> # for each foreign path\n');
215
+ process.stderr.write(' 2) git commit # retry\n');
216
+ process.exit(1);
164
217
  }
165
- },
166
- { timeoutMs: 5000 },
167
- );
168
- } catch (err) {
169
- // Lock acquisition failed — emit a warning but do NOT block the commit.
170
- // The race-detection layer is opportunistic; a lock-acquire timeout is
171
- // strictly less severe than blocking a legitimate commit on flaky FS.
172
- process.stderr.write(
173
- `⚠ wave-scope-commit-guard: staging-fence lock failed — ${err?.message ?? err}\n`,
174
- );
175
- process.exit(0);
176
- }
218
+ }
219
+ }
177
220
 
178
- if (overlaps.length > 0) {
179
- process.stderr.write('✗ wave-scope-commit-guard: staging-fence: cross-agent overlap detected:\n');
180
- for (const o of overlaps) {
181
- process.stderr.write(` - ${o.ourPath} (also staged by sibling agent ${o.siblingAgent})\n`);
221
+ // -------------------------------------------------------------------------
222
+ // Sub-mode C — cross-agent staging-fence reconciliation (issue #552)
223
+ // -------------------------------------------------------------------------
224
+ //
225
+ // Skip entirely when no fence dir exists OR no staged files. The fence dir
226
+ // only appears when a wave-agent invoked `git add` while SO_WAVE_AGENT=1.
227
+ // Manual / coordinator commits never write a fence file, so this branch
228
+ // short-circuits to exit 0 for them (AC5 safe-default).
229
+ if (!existsSync(fenceDir) || stagedFiles.length === 0) {
230
+ process.exit(0);
182
231
  }
183
- process.stderr.write('\nAnother wave-agent recorded a `git add` for one or more of your staged paths.\n');
184
- process.stderr.write('To proceed:\n');
185
- process.stderr.write(' 1) Coordinate with the sibling agent OR\n');
186
- process.stderr.write(' 2) git restore --staged <path> # for each conflicting path, then retry\n');
187
- process.stderr.write(' 3) git commit --no-verify # bypass (PSA-001/PSA-003 risk — operator opt-out)\n');
188
- process.exit(1);
232
+
233
+ let overlaps = [];
234
+
235
+ try {
236
+ await withStagingFenceLock(
237
+ repoRoot,
238
+ async () => {
239
+ let entries;
240
+ try {
241
+ entries = readdirSync(fenceDir);
242
+ } catch {
243
+ return;
244
+ }
245
+ for (const name of entries) {
246
+ if (!name.endsWith('.json')) continue;
247
+ if (name.startsWith('.')) continue; // skip .commit.lock, tmp files
248
+ const overlapsFromFile = findOverlaps(join(fenceDir, name), stagedFiles);
249
+ overlaps = overlaps.concat(overlapsFromFile);
250
+ }
251
+ },
252
+ { timeoutMs: 5000 },
253
+ );
254
+ } catch (err) {
255
+ // Lock acquisition failed — emit a warning but do NOT block the commit.
256
+ // The race-detection layer is opportunistic; a lock-acquire timeout is
257
+ // strictly less severe than blocking a legitimate commit on flaky FS.
258
+ process.stderr.write(
259
+ `⚠ wave-scope-commit-guard: staging-fence lock failed — ${err?.message ?? err}\n`,
260
+ );
261
+ process.exit(0);
262
+ }
263
+
264
+ if (overlaps.length > 0) {
265
+ process.stderr.write('✗ wave-scope-commit-guard: staging-fence: cross-agent overlap detected:\n');
266
+ for (const o of overlaps) {
267
+ process.stderr.write(
268
+ ` - ${o.ourPath} (sibling agent ${o.siblingAgent} recorded ${o.fencePath}, command ${o.hash})\n`,
269
+ );
270
+ }
271
+ process.stderr.write('\nAnother wave-agent recorded a `git add` for one or more of your staged paths.\n');
272
+ process.stderr.write('To proceed:\n');
273
+ process.stderr.write(' 1) Coordinate with the sibling agent OR\n');
274
+ process.stderr.write(' 2) git restore --staged <path> # for each conflicting path, then retry\n');
275
+ process.stderr.write(' 3) git commit --no-verify # bypass (PSA-001/PSA-003 risk — operator opt-out)\n');
276
+ process.exit(1);
277
+ }
278
+
279
+ process.exit(0);
189
280
  }
190
281
 
191
- process.exit(0);
282
+ // Entry guard (#1393): run only as the node script `.husky/pre-commit` execs —
283
+ // a bare `import()` must run no git command and must not exit the importing
284
+ // process. No shouldRunHook gate here: this file is NOT registered in
285
+ // hooks/hooks.json, so the profile-gate never governed it.
286
+ if (isMainModule(import.meta.url)) {
287
+ await main();
288
+ }
@@ -2,7 +2,7 @@
2
2
  {
3
3
  "name": "ecosystem-health",
4
4
  "command": "node \"${CLAUDE_PLUGIN_ROOT}\"/scripts/lib/ecosystem-health.mjs --watch",
5
- "description": "Ecosystem repo health watcher (CI status, branch drift, stale baselines across vault-registered projects). Emits one NDJSON line per detected state change. Hung on session-start because the previous trigger (on-skill-invoke:ecosystem-health) was self-referential: it could only start when the ecosystem-health skill ran, and that skill has 0 recorded invocations fleet-wide, so the watcher never started once.",
5
+ "description": "Local state-file watcher: every 900 s it stats and reads ONE file, .orchestrator/metrics/ecosystem-health.jsonl under the plugin root, and emits one NDJSON line per change (appeared / disappeared / changed). No network, no CI or branch probing, no repo enumeration, no Session Config read. Nothing writes that file yet (0 writers, measured 2026-09-18), so every run emits `no-state-yet` and idles until SIGTERM — ceiling and revisit trigger at DEFAULT_INTERVAL_S in scripts/lib/ecosystem-health.mjs. Hung on session-start because the previous trigger (on-skill-invoke:ecosystem-health) was self-referential: it could only start when the ecosystem-health skill ran, and that skill has 0 recorded invocations fleet-wide, so the watcher never started once.",
6
6
  "when": "on-skill-invoke:session-start"
7
7
  },
8
8
  {
@@ -32,7 +32,7 @@ Only include if the plan changed:
32
32
 
33
33
  - One table row per agent — no nested details
34
34
  - Status is exactly one of: `done`, `partial`, `failed`
35
- - File lists use short relative paths (e.g., `hooks/on-stop.sh`)
35
+ - File lists use short relative paths (e.g., `hooks/on-stop.mjs`)
36
36
  - Quality gates are pass/fail — no ambiguity
37
37
  - Adaptations only when deviating from plan — omit if on track
38
38
  - Keep under 20 lines total
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "session-orchestrator",
3
- "version": "5.1.0",
3
+ "version": "5.3.0",
4
4
  "description": "A repeatable Plan, Go, Close workflow for AI coding sessions: /session reads your repo and agrees the scope, /go runs the work in waves with a quality gate between each, /close verifies and commits. Runs on Claude Code, Codex CLI, Cursor and Pi.",
5
5
  "type": "module",
6
6
  "homepage": "https://session-orchestrator.com",
@@ -57,6 +57,7 @@
57
57
  "test": "node scripts/check-package-manager.mjs && vitest --run",
58
58
  "test:coverage": "node scripts/check-package-manager.mjs && vitest --run --coverage",
59
59
  "test:watch": "node scripts/check-package-manager.mjs && vitest",
60
+ "test:pack": "node scripts/check-package-manager.mjs && SO_PACK_TEST=1 vitest --run tests/scripts/pack-install-lifecycle.test.mjs",
60
61
  "quality-gate": "node scripts/run-quality-gate.mjs --variant full-gate",
61
62
  "lint": "eslint .",
62
63
  "lint:fix": "eslint . --fix",
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: Autonomous session-orchestration loop with kill-switches (Phase C-1.b all 10 kill-switches shipped)
2
+ description: "Use this skill when running an autonomous session-orchestration loop. Chains session-start → session-plan → wave-executor → session-end for N iterations with all 10 kill-switches (SPIRAL, FAILED wave, carryover > 50%, max-hours, max-sessions, resource-overload, token-budget, stall-timeout, sub-threshold confidence, user-abort). Reads Mode-Selector output (Phase B) to decide auto-execute vs. fallback. Writes one autopilot.jsonl record per loop run. Phase C scaffold (issue #277); implementation lives in scripts/lib/autopilot.mjs (Phase C-1 follow-up)."
3
3
  argument-hint: "[--headless] [--verbose] [--max-sessions=N] [--max-hours=H] [--confidence-threshold=0.X] [--dry-run]"
4
4
  ---
5
5
 
6
6
  # /autopilot
7
7
 
8
- Use the Session Orchestrator command definition at `commands/autopilot.md`.
8
+ Use the Session Orchestrator skill definition at `skills/autopilot/SKILL.md`.
9
9
 
10
10
  Arguments: $@
11
11
 
12
- Read that command file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
12
+ Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: Scaffold the minimum repo structure required by session-orchestrator
2
+ description: "Use this skill when scaffolding the minimum repository structure required by session-orchestrator. Invoked automatically by the Bootstrap Gate when CLAUDE.md, Session Config, or bootstrap.lock is missing. Also available as /bootstrap for manual invocation. Three intensity tiers: fast (demos/spikes), standard (MVPs), deep (production/team)."
3
3
  argument-hint: "[--upgrade <tier>]"
4
4
  ---
5
5
 
6
6
  # /bootstrap
7
7
 
8
- Use the Session Orchestrator command definition at `commands/bootstrap.md`.
8
+ Use the Session Orchestrator skill definition at `skills/bootstrap/SKILL.md`.
9
9
 
10
10
  Arguments: $@
11
11
 
12
- Read that command file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
12
+ Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: Run a lightweight Socratic design dialogue (3-5 AUQ rounds) and write a spec markdown file before any implementation work. Use BEFORE /plan feature when scope/UX is ambiguous.
2
+ 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."
3
3
  argument-hint: "[topic-or-feature-slug]"
4
4
  ---
5
5
 
6
6
  # /brainstorm
7
7
 
8
- Use the Session Orchestrator command definition at `commands/brainstorm.md`.
8
+ Use the Session Orchestrator skill definition at `skills/brainstorm/SKILL.md`.
9
9
 
10
10
  Arguments: $@
11
11
 
12
- Read that command file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
12
+ Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
@@ -4,8 +4,8 @@ description: End session with verification, commits, and documentation
4
4
 
5
5
  # /close
6
6
 
7
- Use the Session Orchestrator command definition at `commands/close.md`.
7
+ Use the Session Orchestrator skill definition at `skills/close/SKILL.md`.
8
8
 
9
9
  Arguments: $@
10
10
 
11
- Read that command file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
11
+ Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: Run a 4-phase systematic debugging investigation before proposing any fix. Iron Law NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST. Produces a `.orchestrator/debug/` artifact the fixer agent must reference.
2
+ description: "Use when encountering any bug, test failure, build break, or unexpected behavior — runs a 4-phase systematic debugging process before proposing any fix. Iron Law: NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST. Produces a `.orchestrator/debug/` artifact the fixer agent must reference."
3
3
  argument-hint: "[bug-description-or-issue-ref]"
4
4
  ---
5
5
 
6
6
  # /debug
7
7
 
8
- Use the Session Orchestrator command definition at `commands/debug.md`.
8
+ Use the Session Orchestrator skill definition at `skills/debug/SKILL.md`.
9
9
 
10
10
  Arguments: $@
11
11
 
12
- Read that command file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
12
+ Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: Systematic quality discovery and issue detection
2
+ description: "Use this skill when running systematic quality discovery and issue detection. Runs modular probes adapted to the project's tech stack, presents findings interactively for user triage, and creates VCS issues for confirmed problems. Invoked standalone via /discovery or embedded in session-end."
3
3
  argument-hint: "[all|code|infra|ui|arch|session|audit|vault|feature] [--since <git-ref>] [--full]"
4
4
  ---
5
5
 
6
6
  # /discovery
7
7
 
8
- Use the Session Orchestrator command definition at `commands/discovery.md`.
8
+ Use the Session Orchestrator skill definition at `skills/discovery/SKILL.md`.
9
9
 
10
10
  Arguments: $@
11
11
 
12
- Read that command file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
12
+ Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: Pick the next-best repo to work on across the portfolio — rank free repos, recommend one, claim its lease atomically, and route to the entry command
2
+ description: "Use when you want the orchestrator to pick the next repo to work on across your whole portfolio — it enumerates candidate repos below the confinement root, resolves free/busy from each repo's session.lock lease, ranks the FREE ones by backlog priority × staleness × readiness, recommends the single most worthwhile one via AskUserQuestion, atomically claims it, and routes you to the chosen entry command. Triggers: \"what should I work on next\", \"dispatch me to a repo\", \"pick the next project\", \"run /dispatcher\". <example>Context: operator finished a session and wants the next-best repo across the portfolio. user: \"/dispatcher\" assistant: \"Ranked 18 free repos — top recommendation: Pencil-Designs (score 4.50, 90d stale). Confirm via the picker, I'll claim its lease atomically, then route you to /session deep.\"</example>"
3
3
  argument-hint: "[--dry-run] [--repo <name>]"
4
4
  ---
5
5
 
6
6
  # /dispatcher
7
7
 
8
- Use the Session Orchestrator command definition at `commands/dispatcher.md`.
8
+ Use the Session Orchestrator skill definition at `skills/dispatcher/SKILL.md`.
9
9
 
10
10
  Arguments: $@
11
11
 
12
- Read that command file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
12
+ Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: Say the last answer again in plain words same facts, in the order the operator needs them. Optional topic argument.
2
+ 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."
3
3
  argument-hint: "[topic]"
4
4
  ---
5
5
 
6
6
  # /eli5
7
7
 
8
- Use the Session Orchestrator command definition at `commands/eli5.md`.
8
+ Use the Session Orchestrator skill definition at `skills/eli5/SKILL.md`.
9
9
 
10
10
  Arguments: $@
11
11
 
12
- Read that command file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
12
+ Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: Run an honest session-process evaluation (Standard v1, aiat-llm-eval/1.0) — score the last completed session against the pre-registered rubric-v1 dimensions
2
+ description: "Use this skill to run an honest session-process evaluation (Standard v1, aiat-llm-eval/1.0) — score the last completed orchestrator session against the pre-registered rubric-v2 dimensions, run /eval, evaluate this session, produce an eval report, or re-verify a stored eval run for reproducibility. Deterministic-first with an optional advisory LLM judge; never produces a global score."
3
3
  argument-hint: "[--session <id>] [--no-write] [--verify <run-id>]"
4
4
  ---
5
5
 
6
6
  # /eval
7
7
 
8
- Use the Session Orchestrator command definition at `commands/eval.md`.
8
+ Use the Session Orchestrator skill definition at `skills/eval/SKILL.md`.
9
9
 
10
10
  Arguments: $@
11
11
 
12
- Read that command file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
12
+ Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: Extract session patterns into reusable learnings
2
+ description: "Use this skill when extracting session patterns into reusable learnings. Three modes: analyze (extract from session history), review (edit/manage existing learnings), list (display active learnings). Manages .orchestrator/metrics/learnings.jsonl."
3
3
  argument-hint: "[analyze|review|list|dialectic [--apply]]"
4
4
  ---
5
5
 
6
6
  # /evolve
7
7
 
8
- Use the Session Orchestrator command definition at `commands/evolve.md`.
8
+ Use the Session Orchestrator skill definition at `skills/evolve/SKILL.md`.
9
9
 
10
10
  Arguments: $@
11
11
 
12
- Read that command file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
12
+ Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
package/pi/prompts/go.md CHANGED
@@ -5,8 +5,8 @@ argument-hint: "[optional instructions]"
5
5
 
6
6
  # /go
7
7
 
8
- Use the Session Orchestrator command definition at `commands/go.md`.
8
+ Use the Session Orchestrator skill definition at `skills/go/SKILL.md`.
9
9
 
10
10
  Arguments: $@
11
11
 
12
- Read that command file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
12
+ Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: Stress-test a plan, design, or PRD before any build — relentless one-question-at-a-time interrogation that hunts contradictions against the code and challenges assumptions. Composable; no HARD-GATE.
2
+ 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."
3
3
  argument-hint: "[file-path-or-topic]"
4
4
  ---
5
5
 
6
6
  # /grill
7
7
 
8
- Use the Session Orchestrator command definition at `commands/grill.md`.
8
+ Use the Session Orchestrator skill definition at `skills/grill/SKILL.md`.
9
9
 
10
10
  Arguments: $@
11
11
 
12
- Read that command file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
12
+ Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
@@ -1,12 +1,11 @@
1
1
  ---
2
2
  description: Run the harness audit and report the rubric score for this repository
3
- argument-hint: ""
4
3
  ---
5
4
 
6
5
  # /harness-audit
7
6
 
8
- Use the Session Orchestrator command definition at `commands/harness-audit.md`.
7
+ Use the Session Orchestrator skill definition at `skills/harness-audit/SKILL.md`.
9
8
 
10
9
  Arguments: $@
11
10
 
12
- Read that command file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
11
+ Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: Manual memory consolidation review, consolidate, and prune memory files (Dream-equivalent)
2
+ description: "Use this skill when performing manual memory consolidation (Dream-equivalent). Reviews, consolidates, and prunes memory files under ~/.claude/projects/*/memory/. Run after major refactors, every 5+ sessions, or when memory quality degrades (broken links, stale references, contradictions, MEMORY.md > 200 lines). Invoke with /memory-cleanup."
3
3
  argument-hint: "[--dry-run | --apply-pending]"
4
4
  ---
5
5
 
6
6
  # /memory-cleanup
7
7
 
8
- Use the Session Orchestrator command definition at `commands/memory-cleanup.md`.
8
+ Use the Session Orchestrator skill definition at `skills/memory-cleanup/SKILL.md`.
9
9
 
10
10
  Arguments: $@
11
11
 
12
- Read that command file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
12
+ Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
@@ -1,12 +1,12 @@
1
1
  ---
2
- description: Run a parallel multi-persona domain-expert review panel against a file, directory, or output range
2
+ description: "Use this skill when you need multi-persona parallel content review domain experts, buyer personas, compliance reviewers, or custom catalog entries reviewing a target file or output. Dispatches N persona agents in parallel, consolidates verdicts via a configurable mode (voting-quorum, hard-gate-threshold, or coordinator-summary), and writes a timestamped sidecar to .orchestrator/persona-panel/. Invoked via /persona-panel <target-path>."
3
3
  argument-hint: "<target> [--personas <names,...>] [--mode <voting|hard-gate|summary>] [--threshold <M-of-N|all|any>] [--grounding <off|re-derive>] [--dry-run]"
4
4
  ---
5
5
 
6
6
  # /persona-panel
7
7
 
8
- Use the Session Orchestrator command definition at `commands/persona-panel.md`.
8
+ Use the Session Orchestrator skill definition at `skills/persona-panel/SKILL.md`.
9
9
 
10
10
  Arguments: $@
11
11
 
12
- Read that command file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
12
+ Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.