session-orchestrator 3.22.0 → 3.23.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 (268) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.cursor/commands/autopilot-multi.md +14 -0
  5. package/.cursor/commands/autopilot.md +14 -0
  6. package/.cursor/commands/bootstrap.md +14 -0
  7. package/.cursor/commands/brainstorm.md +14 -0
  8. package/.cursor/commands/close.md +13 -0
  9. package/.cursor/commands/contract-version-bump.md +14 -0
  10. package/.cursor/commands/debug.md +14 -0
  11. package/.cursor/commands/discovery.md +14 -0
  12. package/.cursor/commands/dispatcher.md +14 -0
  13. package/.cursor/commands/eli5.md +14 -0
  14. package/.cursor/commands/eval.md +14 -0
  15. package/.cursor/commands/evolve.md +14 -0
  16. package/.cursor/commands/go.md +14 -0
  17. package/.cursor/commands/grill.md +14 -0
  18. package/.cursor/commands/harness-audit.md +13 -0
  19. package/.cursor/commands/journey-audit.md +14 -0
  20. package/.cursor/commands/memory-cleanup.md +14 -0
  21. package/.cursor/commands/persona-panel.md +14 -0
  22. package/.cursor/commands/plan.md +14 -0
  23. package/.cursor/commands/portfolio.md +14 -0
  24. package/.cursor/commands/reconcile.md +14 -0
  25. package/.cursor/commands/release.md +14 -0
  26. package/.cursor/commands/repo-audit.md +13 -0
  27. package/.cursor/commands/session.md +14 -0
  28. package/.cursor/commands/spinout.md +14 -0
  29. package/.cursor/commands/sunset-review.md +14 -0
  30. package/.cursor/commands/templates-ack.md +14 -0
  31. package/.cursor/commands/test.md +14 -0
  32. package/.cursor/hooks.json +60 -0
  33. package/.cursor/rules/000-session-orchestrator.mdc +8 -0
  34. package/.cursor/rules/010-session-workflow.mdc +9 -1
  35. package/.cursor/rules/020-quality-gates.mdc +1 -1
  36. package/.cursor/rules/030-wave-execution.mdc +1 -1
  37. package/.cursor/rules/050-plan.mdc +2 -2
  38. package/.cursor/rules/070-gitlab-ops.mdc +73 -57
  39. package/.cursor/rules/080-ecosystem-health.mdc +7 -7
  40. package/.cursor/skills/architecture/SKILL.md +13 -0
  41. package/.cursor/skills/autopilot/SKILL.md +12 -0
  42. package/.cursor/skills/bootstrap/SKILL.md +12 -0
  43. package/.cursor/skills/brainstorm/SKILL.md +13 -0
  44. package/.cursor/skills/claude-md-drift-check/SKILL.md +13 -0
  45. package/.cursor/skills/contract-version-bump/SKILL.md +12 -0
  46. package/.cursor/skills/convergence-monitoring/SKILL.md +12 -0
  47. package/.cursor/skills/daily/SKILL.md +12 -0
  48. package/.cursor/skills/debug/SKILL.md +13 -0
  49. package/.cursor/skills/discovery/SKILL.md +13 -0
  50. package/.cursor/skills/dispatcher/SKILL.md +13 -0
  51. package/.cursor/skills/docs-orchestrator/SKILL.md +13 -0
  52. package/.cursor/skills/domain-model/SKILL.md +13 -0
  53. package/.cursor/skills/ecosystem-health/SKILL.md +13 -0
  54. package/.cursor/skills/eli5/SKILL.md +13 -0
  55. package/.cursor/skills/eval/SKILL.md +12 -0
  56. package/.cursor/skills/evolve/SKILL.md +13 -0
  57. package/.cursor/skills/frontmatter-guard/SKILL.md +13 -0
  58. package/.cursor/skills/gitlab-ops/SKILL.md +13 -0
  59. package/.cursor/skills/gitlab-portfolio/SKILL.md +13 -0
  60. package/.cursor/skills/grill/SKILL.md +13 -0
  61. package/.cursor/skills/hook-development/SKILL.md +13 -0
  62. package/.cursor/skills/journey-audit/SKILL.md +13 -0
  63. package/.cursor/skills/mcp-builder/SKILL.md +13 -0
  64. package/.cursor/skills/memory-cleanup/SKILL.md +12 -0
  65. package/.cursor/skills/mode-selector/SKILL.md +13 -0
  66. package/.cursor/skills/npm-publish/SKILL.md +12 -0
  67. package/.cursor/skills/peekaboo-driver/SKILL.md +13 -0
  68. package/.cursor/skills/persona-panel/SKILL.md +12 -0
  69. package/.cursor/skills/plan/SKILL.md +13 -0
  70. package/.cursor/skills/playwright-driver/SKILL.md +13 -0
  71. package/.cursor/skills/quality-gates/SKILL.md +13 -0
  72. package/.cursor/skills/reconcile/SKILL.md +12 -0
  73. package/.cursor/skills/repo-audit/SKILL.md +13 -0
  74. package/.cursor/skills/session-end/SKILL.md +13 -0
  75. package/.cursor/skills/session-plan/SKILL.md +13 -0
  76. package/.cursor/skills/session-start/SKILL.md +13 -0
  77. package/.cursor/skills/skill-creator/SKILL.md +13 -0
  78. package/.cursor/skills/spinout/SKILL.md +12 -0
  79. package/.cursor/skills/sunset-review/SKILL.md +13 -0
  80. package/.cursor/skills/test-runner/SKILL.md +13 -0
  81. package/.cursor/skills/tmux-layout/SKILL.md +13 -0
  82. package/.cursor/skills/ubiquitous-language/SKILL.md +13 -0
  83. package/.cursor/skills/using-orchestrator/SKILL.md +13 -0
  84. package/.cursor/skills/vault-mirror/SKILL.md +13 -0
  85. package/.cursor/skills/vault-sync/SKILL.md +13 -0
  86. package/.cursor/skills/wave-executor/SKILL.md +13 -0
  87. package/.cursor/skills/write-executable-plan/SKILL.md +13 -0
  88. package/.mcp.json +4 -1
  89. package/CHANGELOG.md +168 -0
  90. package/README.md +18 -15
  91. package/agents/AGENTS.md +23 -4
  92. package/agents/code-implementer.md +2 -1
  93. package/agents/db-specialist.md +2 -1
  94. package/agents/docs-writer.md +3 -1
  95. package/agents/eval-judge.md +1 -1
  96. package/agents/session-reviewer.md +7 -1
  97. package/agents/test-writer.md +2 -1
  98. package/agents/ui-developer.md +2 -1
  99. package/commands/bootstrap.md +2 -2
  100. package/commands/close.md +3 -1
  101. package/commands/go.md +1 -1
  102. package/commands/journey-audit.md +43 -0
  103. package/docs/USER-GUIDE.md +2 -2
  104. package/docs/ci-setup.md +14 -0
  105. package/docs/codex-setup.md +64 -0
  106. package/docs/components.md +6 -6
  107. package/docs/cursor-setup.md +26 -47
  108. package/docs/events-schema.md +76 -4
  109. package/docs/github-mirror-protection.md +197 -0
  110. package/docs/pi-setup.md +2 -0
  111. package/docs/rule-authoring.md +3 -1
  112. package/docs/scope-collision-guard.md +49 -2
  113. package/docs/session-config-reference.md +26 -4
  114. package/docs/session-config-template.md +4 -3
  115. package/docs/telemetry.md +22 -0
  116. package/hooks/_lib/lock-bootstrap.mjs +8 -4
  117. package/hooks/_lib/vcs-create-matcher.mjs +397 -38
  118. package/hooks/enforce-scope.mjs +64 -0
  119. package/hooks/hooks-codex.json +1 -1
  120. package/hooks/hooks-cursor.json +201 -20
  121. package/hooks/hooks-pi.json +1 -1
  122. package/hooks/hooks.json +2 -2
  123. package/hooks/on-session-end.mjs +211 -10
  124. package/hooks/on-session-start.mjs +214 -11
  125. package/hooks/on-stop.mjs +48 -9
  126. package/hooks/post-subagent-discovery-validator.mjs +34 -3
  127. package/hooks/post-tool-batch-wave-signal.mjs +11 -2
  128. package/hooks/pre-bash-issue-budget.mjs +117 -4
  129. package/hooks/pre-bash-sessions-ledger-guard.mjs +159 -0
  130. package/hooks/pre-bash-staging-fence.mjs +4 -0
  131. package/hooks/pre-task-scope-disjoint.mjs +368 -35
  132. package/hooks/skill-invocation-telemetry.mjs +21 -10
  133. package/monitors/monitors.json +6 -0
  134. package/package.json +1 -1
  135. package/pi/prompts/journey-audit.md +12 -0
  136. package/rules/_index.md +9 -1
  137. package/rules/always-on/ask-via-tool.md +62 -0
  138. package/rules/always-on/bash-harness-pitfalls.md +168 -0
  139. package/rules/always-on/build-value.md +47 -0
  140. package/rules/always-on/cross-session-messaging.md +59 -0
  141. package/rules/always-on/loop-and-monitor.md +221 -0
  142. package/rules/always-on/parallel-sessions.md +142 -12
  143. package/rules/always-on/receiving-review.md +108 -0
  144. package/rules/always-on/test-value.md +40 -0
  145. package/rules/always-on/verification-before-completion.md +77 -0
  146. package/scripts/archive-closed-prds.mjs +258 -18
  147. package/scripts/autopilot.mjs +5 -0
  148. package/scripts/backfill-evidence-digest.mjs +376 -0
  149. package/scripts/cursor-install.mjs +89 -48
  150. package/scripts/export-hw-learnings.mjs +143 -2
  151. package/scripts/express-path.mjs +299 -0
  152. package/scripts/generate-cursor-adapter.mjs +253 -0
  153. package/scripts/github-protection-audit.mjs +358 -0
  154. package/scripts/lib/autopilot/worktree-pipeline.mjs +240 -16
  155. package/scripts/lib/build-live-signals.mjs +24 -5
  156. package/scripts/lib/ci-status-banner.mjs +158 -11
  157. package/scripts/lib/command-blocker.mjs +70 -0
  158. package/scripts/lib/config/reconcile.mjs +79 -4
  159. package/scripts/lib/config/section-extractor.mjs +235 -36
  160. package/scripts/lib/config-schema.mjs +9 -1
  161. package/scripts/lib/config.mjs +57 -6
  162. package/scripts/lib/convergence-monitor.mjs +13 -2
  163. package/scripts/lib/cursor-hook-bridge.mjs +443 -0
  164. package/scripts/lib/dispatcher/cli.mjs +2 -2
  165. package/scripts/lib/express-path.mjs +327 -0
  166. package/scripts/lib/file-lock.mjs +22 -4
  167. package/scripts/lib/gates/gate-full.mjs +81 -8
  168. package/scripts/lib/gates/gate-helpers.mjs +76 -15
  169. package/scripts/lib/git-config-drift.mjs +134 -5
  170. package/scripts/lib/host-identity.mjs +247 -2
  171. package/scripts/lib/instruction-budget-guard.mjs +31 -1
  172. package/scripts/lib/issue-budget.mjs +229 -30
  173. package/scripts/lib/learnings/io.mjs +55 -10
  174. package/scripts/lib/learnings/schema.mjs +95 -28
  175. package/scripts/lib/lock-reaper.mjs +7 -1
  176. package/scripts/lib/locks/staging-fence-lock.mjs +5 -1
  177. package/scripts/lib/locks/state-md-lock.mjs +8 -1
  178. package/scripts/lib/memory-banner.mjs +5 -2
  179. package/scripts/lib/memory-paths.mjs +15 -6
  180. package/scripts/lib/mode-selector/scoring.mjs +53 -6
  181. package/scripts/lib/platform.mjs +72 -9
  182. package/scripts/lib/plugin-root.mjs +143 -19
  183. package/scripts/lib/project-hygiene.mjs +43 -3
  184. package/scripts/lib/quality-gate.mjs +271 -13
  185. package/scripts/lib/reconcile/emitter.mjs +87 -19
  186. package/scripts/lib/reconcile/engine.mjs +281 -13
  187. package/scripts/lib/reconcile/idempotency.mjs +102 -1
  188. package/scripts/lib/reconcile/renderer.mjs +148 -3
  189. package/scripts/lib/reconcile/sanitize.mjs +40 -17
  190. package/scripts/lib/reconcile/writer.mjs +415 -84
  191. package/scripts/lib/rule-loader.mjs +37 -2
  192. package/scripts/lib/rules-sync.mjs +51 -8
  193. package/scripts/lib/scope-gate.mjs +90 -0
  194. package/scripts/lib/session-close-backfill.mjs +369 -28
  195. package/scripts/lib/session-discovery.mjs +13 -3
  196. package/scripts/lib/session-end/phase-skip.mjs +37 -4
  197. package/scripts/lib/session-end/worktree-cleanup.mjs +154 -7
  198. package/scripts/lib/session-id.mjs +30 -14
  199. package/scripts/lib/session-identity/own-session.mjs +159 -0
  200. package/scripts/lib/session-lock.mjs +85 -30
  201. package/scripts/lib/session-schema/normalizer.mjs +70 -3
  202. package/scripts/lib/session-schema/validator.mjs +40 -0
  203. package/scripts/lib/session-start-probes.mjs +608 -0
  204. package/scripts/lib/session-transition.mjs +277 -0
  205. package/scripts/lib/sessions-staleness-banner.mjs +124 -57
  206. package/scripts/lib/spiral-carryover.mjs +90 -9
  207. package/scripts/lib/state-md/frontmatter-mutators.mjs +41 -8
  208. package/scripts/lib/state-md/mission-status.mjs +350 -52
  209. package/scripts/lib/state-md/yaml-parser.mjs +145 -16
  210. package/scripts/lib/state-md.mjs +12 -2
  211. package/scripts/lib/telemetry/sync.mjs +46 -8
  212. package/scripts/lib/validate/check-agents.mjs +66 -0
  213. package/scripts/lib/validate/check-cursor-adapter.mjs +102 -0
  214. package/scripts/lib/validate/check-dead-bridge.mjs +24 -2
  215. package/scripts/lib/validate/check-doc-cli-commands.mjs +16 -32
  216. package/scripts/lib/validate/check-hooks-symmetry.mjs +29 -63
  217. package/scripts/lib/validate/check-playwright-mcp-canary.mjs +13 -22
  218. package/scripts/lib/validate/check-plugin-monitors.mjs +10 -4
  219. package/scripts/lib/validate/check-test-value-bans.mjs +165 -17
  220. package/scripts/lib/validate/check-unwired-features.mjs +340 -32
  221. package/scripts/lib/validate/repo-files.mjs +275 -0
  222. package/scripts/lib/validate-vendored-rules.mjs +229 -7
  223. package/scripts/lib/vault-mirror/process.mjs +99 -43
  224. package/scripts/lib/vault-mirror/telemetry.mjs +210 -0
  225. package/scripts/lib/vault-staleness-banner.mjs +76 -6
  226. package/scripts/lib/vault-status/board-writer.mjs +211 -10
  227. package/scripts/lib/vault-status/narrative-mirror.mjs +188 -8
  228. package/scripts/lib/wave-executor/foreign-dispatch.mjs +832 -0
  229. package/scripts/lib/wave-transcript-tail.mjs +869 -0
  230. package/scripts/materialize-wave-scope.mjs +209 -12
  231. package/scripts/mcp-server.sh +11 -2
  232. package/scripts/parse-config.mjs +65 -0
  233. package/scripts/token-audit.sh +9 -2
  234. package/scripts/validate-plugin.mjs +3 -0
  235. package/scripts/validate-wave-scope.mjs +67 -0
  236. package/scripts/vault-mirror.mjs +203 -34
  237. package/skills/_shared/monitor-patterns.md +31 -5
  238. package/skills/_shared/parallel-aware-auq.md +1 -1
  239. package/skills/_shared/parallel-aware-preamble.md +4 -2
  240. package/skills/_shared/platform-tools.md +11 -5
  241. package/skills/_shared/state-ownership.md +29 -2
  242. package/skills/autopilot/SKILL.md +5 -1
  243. package/skills/bootstrap/SKILL.md +3 -3
  244. package/skills/bootstrap/_shared-template.md +18 -10
  245. package/skills/bootstrap/deep-template.md +10 -6
  246. package/skills/bootstrap/fast-template.md +15 -8
  247. package/skills/bootstrap/standard-template.md +10 -6
  248. package/skills/claude-md-drift-check/checker.mjs +39 -11
  249. package/skills/dispatcher/SKILL.md +1 -1
  250. package/skills/journey-audit/SKILL.md +269 -0
  251. package/skills/peekaboo-driver/SKILL.md +15 -3
  252. package/skills/persona-panel/SKILL.md +1 -1
  253. package/skills/reconcile/SKILL.md +41 -1
  254. package/skills/session-end/SKILL.md +17 -4
  255. package/skills/session-end/metrics-collection.md +7 -4
  256. package/skills/session-end/phase-3-6-tail.md +11 -3
  257. package/skills/session-end/phase-3-7a-recommendations.md +16 -2
  258. package/skills/session-plan/SKILL.md +6 -1
  259. package/skills/session-plan/wave-template.md +1 -0
  260. package/skills/session-start/SKILL.md +30 -16
  261. package/skills/session-start/phase-7-5-mode-selector.md +15 -3
  262. package/skills/session-start/phase-8-5-express-path.md +77 -12
  263. package/skills/vault-sync/validator.mjs +31 -0
  264. package/skills/wave-executor/SKILL.md +4 -2
  265. package/skills/wave-executor/circuit-breaker.md +34 -9
  266. package/skills/wave-executor/wave-loop.md +102 -19
  267. package/templates/_shared/journey-manifest.md +110 -0
  268. package/templates/_shared/rules/parallel-sessions.md +0 -77
@@ -0,0 +1,12 @@
1
+ ---
2
+ name: npm-publish
3
+ description: "Use when publishing this package to npm — a version release (npm publish), verifying the registry/pi.dev listing, or diagnosing npm auth failures (E403 2FA/token errors). Token-based flow via NPM_TOKEN in .env.local with a temp userconfig, the leakage gate before every publish, post-publish verification and marker/badge upkeep. Trigger on \"publish to npm\", \"npm release\", \"E403 publish error\"."
4
+ ---
5
+
6
+ # npm-publish
7
+
8
+ Canonical skill: `skills/npm-publish/SKILL.md`
9
+
10
+ Read that file and follow it exactly. Resolve relative links against `skills/npm-publish/`, not this wrapper.
11
+
12
+ Cursor has no Skill tool. Treat "invoke the npm-publish skill" as: Read `skills/npm-publish/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: peekaboo-driver
3
+ description: "Use this skill when driving native-UI AX-tree snapshots and screenshots via steipete/peekaboo (MIT, macOS-only). Dispatched by `skills/test-runner/` to capture native-UI AX-tree snapshots + screenshots on macOS 15+ targets, and exits with deterministic JSON output the orchestrator can parse."
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # peekaboo-driver
8
+
9
+ Canonical skill: `skills/peekaboo-driver/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/peekaboo-driver/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the peekaboo-driver skill" as: Read `skills/peekaboo-driver/SKILL.md`.
@@ -0,0 +1,12 @@
1
+ ---
2
+ name: persona-panel
3
+ 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>."
4
+ ---
5
+
6
+ # persona-panel
7
+
8
+ Canonical skill: `skills/persona-panel/SKILL.md`
9
+
10
+ Read that file and follow it exactly. Resolve relative links against `skills/persona-panel/`, not this wrapper.
11
+
12
+ Cursor has no Skill tool. Treat "invoke the persona-panel skill" as: Read `skills/persona-panel/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: plan
3
+ description: "Use this skill when performing structured project planning and PRD generation with three modes: new (project kickoff with repo scaffolding), feature (compact feature PRD), retro (data-driven retrospective). All modes share a researched Q&A engine that dispatches parallel Explore agents before each question wave, presents options via AskUserQuestion with recommendations, and produces documents with prioritized issue creation."
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # plan
8
+
9
+ Canonical skill: `skills/plan/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/plan/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the plan skill" as: Read `skills/plan/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: playwright-driver
3
+ description: "Use this skill when executing web tests via the canonical `playwright` npm package (Microsoft, Apache-2.0). Dispatched by `skills/test-runner/` to execute web tests against a target, captures token-frugal AX-tree snapshots + screenshots + console output under `.orchestrator/metrics/test-runs/<run-id>/`, and exits with deterministic JSON output the orchestrator can parse."
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # playwright-driver
8
+
9
+ Canonical skill: `skills/playwright-driver/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/playwright-driver/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the playwright-driver skill" as: Read `skills/playwright-driver/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: quality-gates
3
+ description: Use this skill when referencing canonical quality check commands for typecheck, test, and lint. Defines 4 variants (Baseline, Incremental, Full Gate, Per-File) used by session-start, wave-executor, session-end, and session-reviewer. Reference skill — not invoked directly.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # quality-gates
8
+
9
+ Canonical skill: `skills/quality-gates/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/quality-gates/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the quality-gates skill" as: Read `skills/quality-gates/SKILL.md`.
@@ -0,0 +1,12 @@
1
+ ---
2
+ name: reconcile
3
+ description: Use this skill when the user wants to reconcile learnings into rules, run /reconcile, propose rules from learnings, turn learnings into .claude/rules/ entries, or review what rules would be generated from current session learnings. On-demand version of session-end Phase 3.6.8.
4
+ ---
5
+
6
+ # reconcile
7
+
8
+ Canonical skill: `skills/reconcile/SKILL.md`
9
+
10
+ Read that file and follow it exactly. Resolve relative links against `skills/reconcile/`, not this wrapper.
11
+
12
+ Cursor has no Skill tool. Treat "invoke the reconcile skill" as: Read `skills/reconcile/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: repo-audit
3
+ description: "Use this skill when the user wants to audit a repository for baseline compliance, check code quality, security posture, CI/CD setup, testing, documentation, and ecosystem configuration. Runs 9 checklist categories and emits a Markdown report plus JSON sidecar at .orchestrator/metrics/repo-audit-<timestamp>.json. <example>Context: User is in a project repo and wants a baseline compliance check. user: \"/repo-audit\" assistant: \"Running repo-audit across 9 categories — Configuration, Code Quality, Git Hygiene, CI/CD, Testing, Security, Documentation, Clank Integration (optional), and MCP Configuration. Will produce a Markdown checklist report and JSON sidecar.\" <commentary>The user wants a compliance check; this skill is appropriate because it runs all 9 categories with pass/fail/warn/skipped statuses and writes structured output.</commentary></example>"
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # repo-audit
8
+
9
+ Canonical skill: `skills/repo-audit/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/repo-audit/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the repo-audit skill" as: Read `skills/repo-audit/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: session-end
3
+ description: "Use this skill when performing a full session close-out: verifies all planned work against the agreed plan, creates issues for gaps, runs quality gates, commits cleanly, mirrors to GitHub, and produces a session summary. Triggered by /close command."
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # session-end
8
+
9
+ Canonical skill: `skills/session-end/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/session-end/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the session-end skill" as: Read `skills/session-end/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: session-plan
3
+ description: "Creates a structured wave execution plan with role-based assignment after user alignment. Decomposes agreed tasks into configurable waves (default 5) with optimal agent assignment, dependency ordering, and inter-wave checkpoints. Activated by session-start after Q&A phase completes."
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # session-plan
8
+
9
+ Canonical skill: `skills/session-plan/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/session-plan/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the session-plan skill" as: Read `skills/session-plan/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: session-start
3
+ description: "Use this skill when initializing a session for any project repo. Autonomously analyzes git state, VCS issues, SSOT files, branches, environment, and cross-repo status. Then presents structured findings with recommendations for user alignment before creating a wave plan. Triggered by /session [housekeeping|feature|deep] command."
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # session-start
8
+
9
+ Canonical skill: `skills/session-start/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/session-start/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the session-start skill" as: Read `skills/session-start/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: skill-creator
3
+ description: "Use when creating a new skill from scratch, modifying an existing skill, or optimizing a skill's triggering description. Guides intent capture, structure, writing patterns, and progressive-disclosure organization so skills reliably trigger and stay maintainable. Trigger on phrases like \"turn this into a skill\", \"write a skill for X\", \"improve this skill\", \"my skill isn't triggering\"."
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # skill-creator
8
+
9
+ Canonical skill: `skills/skill-creator/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/skill-creator/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the skill-creator skill" as: Read `skills/skill-creator/SKILL.md`.
@@ -0,0 +1,12 @@
1
+ ---
2
+ name: spinout
3
+ description: "Use when extracting a project into its own repo — a venture spinout (e.g. a product leaving its incubator repo) or a sanitized content-snapshot fork. Guided 5-step runbook: target sphere + path, confidentiality/sanitize check, copy + fresh git init, SNAPSHOT-FREEZE marker in the source repo, remotes + registration. Trigger on 'spin out X', 'extract this into its own repo', 'fork X sanitized'."
4
+ ---
5
+
6
+ # spinout
7
+
8
+ Canonical skill: `skills/spinout/SKILL.md`
9
+
10
+ Read that file and follow it exactly. Resolve relative links against `skills/spinout/`, not this wrapper.
11
+
12
+ Cursor has no Skill tool. Treat "invoke the spinout skill" as: Read `skills/spinout/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: sunset-review
3
+ description: "Use this skill when the user wants to identify unused, near-zero-use, or stale skills/agents/commands in the plugin surface so they can be demoted or retired. Combines agent-dispatch telemetry (start-events only) with static reference scanning, classifies every surface item into Active / Investigate / Demote / Retire, and emits a Markdown report plus JSON sidecar. NEVER auto-deletes — surfaces candidates for human decision. Quarterly cadence. <example>Context: The plugin surface has grown and the maintainer wants to prune dead weight. user: \"/sunset-review\" assistant: \"Running the sunset walk — classifying skills, agents, and commands by usage telemetry + static refs, grouped by Retire / Demote / Investigate / Active. No item is deleted automatically; I'll surface Retire/Demote candidates for your decision.\" <commentary>The user wants a usage-driven prune candidate list; this skill runs the read-only walker, presents grouped verdicts, and writes a sidecar — it never deletes.</commentary></example>"
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # sunset-review
8
+
9
+ Canonical skill: `skills/sunset-review/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/sunset-review/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the sunset-review skill" as: Read `skills/sunset-review/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: test-runner
3
+ description: "Use this skill when orchestrating agentic end-to-end tests. Resolves target + profile, dispatches the right driver(s) (playwright for web today, peekaboo for macOS (issue #381)), invokes the ux-evaluator agent (opus, read-only) against driver artifacts, reconciles findings with the open issue tracker via scripts/lib/test-runner/issue-reconcile.mjs, and writes report.md + JSONL roll-up. Wraps upstream tools (no forks). Hard-gates Playwright MCP for browser drive (4× token cost vs CLI per Microsoft's own benchmark)."
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # test-runner
8
+
9
+ Canonical skill: `skills/test-runner/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/test-runner/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the test-runner skill" as: Read `skills/test-runner/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: tmux-layout
3
+ description: "Use this skill when the operator wants a prepared tmux visualization layout for the session's side-channels (STATE.md tail, CI-watch, events.jsonl tail). Renders a 4-pane default layout or debug layout. Read-only side-channel observability — the coordinator chat stays in the operator's original terminal. Trigger phrases: \"tmux layout\", \"split panes for ci watch\", \"visualize session side-channels\", \"show me state-md tail and ci\"."
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # tmux-layout
8
+
9
+ Canonical skill: `skills/tmux-layout/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/tmux-layout/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the tmux-layout skill" as: Read `skills/tmux-layout/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: ubiquitous-language
3
+ description: "Use when the user wants to define domain terms, build a glossary, harden terminology, create a ubiquitous language, or mentions \"domain model\" or \"DDD\". Extracts a DDD-style glossary from the current conversation into UBIQUITOUS_LANGUAGE.md, flags ambiguities and synonyms, and proposes opinionated canonical terms."
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # ubiquitous-language
8
+
9
+ Canonical skill: `skills/ubiquitous-language/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/ubiquitous-language/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the ubiquitous-language skill" as: Read `skills/ubiquitous-language/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: using-orchestrator
3
+ description: "Use this skill when dispatching implicit slash-command intent from the user's first message. Inspects the user's first message for implicit slash-command intent and dispatches to the highest-confidence matching entry-point skill via the Skill tool. Only active when `auto-skill-dispatch: true` in Session Config. Silent no-op otherwise."
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # using-orchestrator
8
+
9
+ Canonical skill: `skills/using-orchestrator/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/using-orchestrator/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the using-orchestrator skill" as: Read `skills/using-orchestrator/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: vault-mirror
3
+ description: "Use when you need to populate the Meta-Vault with machine-generated notes derived from session-orchestrator JSONL records. Converts entries from `.orchestrator/metrics/sessions.jsonl` and `.orchestrator/metrics/learnings.jsonl` into vault-conformant Markdown under `50-sessions/` and `40-learnings/`. Called automatically at session-end Phase 3.7 and after evolve Phase 3.5 — only when `vault-integration.enabled=true` and `vault-integration.mode != \"off\"`. Idempotent: re-runs safely; skips hand-authored notes. Triggers: \"mirror to vault\", \"sync session notes to vault\", \"write learning notes to vault\", \"vault-mirror failed at session close\". <example>Context: session-end is finalizing, vault-integration.mode is \"warn\". user: \"/close\" assistant: \"Running vault-mirror to write 50-sessions/session-2026-05-17.md from the closing session record — 1 created, 0 skipped.\"</example>"
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # vault-mirror
8
+
9
+ Canonical skill: `skills/vault-mirror/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/vault-mirror/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the vault-mirror skill" as: Read `skills/vault-mirror/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: vault-sync
3
+ description: "Use when you need to validate the Meta-Vault's Markdown frontmatter and wiki-link integrity before closing a session or after vault edits. Runs as a hard gate at session-end Phase 1 — blocks close if any `.md` file fails the Zod frontmatter schema or has dangling `[[wiki-links]]`. Supports three modes: `hard` (blocks on errors), `warn` (reports without blocking), `off` (skip). Reads `vault-sync.*` from Session Config; respects per-vault exclude globs from `CLAUDE.md`. Triggers: \"vault validation failed at session close\", \"fix vault frontmatter errors\", \"check vault wiki-links\", \"why is session-end blocked by vault-sync\". <example>Context: session-end Phase 1 quality gate, vault-sync.enabled=true, vault-sync.mode=\"hard\". user: \"/close\" assistant: \"vault-sync found 2 frontmatter errors in vault/40-learnings/ml-notes.md — missing required `id` field. Fixing before close.\"</example>"
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # vault-sync
8
+
9
+ Canonical skill: `skills/vault-sync/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/vault-sync/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the vault-sync skill" as: Read `skills/vault-sync/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: wave-executor
3
+ description: Use this skill when executing the agreed session plan in waves with role-based execution and parallel subagents. Handles inter-wave quality checks, plan adaptation, and progress tracking. Core orchestration engine for feature and deep sessions. Triggered by /go command.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # wave-executor
8
+
9
+ Canonical skill: `skills/wave-executor/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/wave-executor/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the wave-executor skill" as: Read `skills/wave-executor/SKILL.md`.
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: write-executable-plan
3
+ description: "Use when you have a PRD or design spec and need a bite-sized, executable implementation plan that any agent can follow without re-deriving structure. Produces `docs/plans/YYYY-MM-DD-<feature>.md` with per-task Files block, complete code per step (no placeholders), and exact verification commands. Rejects \"TBD\", \"TODO\", \"add error handling\", \"similar to Task N\"."
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # write-executable-plan
8
+
9
+ Canonical skill: `skills/write-executable-plan/SKILL.md`
10
+
11
+ Read that file and follow it exactly. Resolve relative links against `skills/write-executable-plan/`, not this wrapper.
12
+
13
+ Cursor has no Skill tool. Treat "invoke the write-executable-plan skill" as: Read `skills/write-executable-plan/SKILL.md`.
package/.mcp.json CHANGED
@@ -2,7 +2,10 @@
2
2
  "mcpServers": {
3
3
  "session-orchestrator": {
4
4
  "command": "bash",
5
- "args": ["-c", "exec bash \"${CLAUDE_PLUGIN_ROOT:-${CODEX_PLUGIN_ROOT:-$(git rev-parse --show-toplevel)}}/scripts/mcp-server.sh\""]
5
+ "args": [
6
+ "-c",
7
+ "# Tier order MIRRORS resolvePluginRoot() — see scripts/lib/plugin-root.mjs § TIER ORDER (the single source of truth). That list is the original, this is the mirror: change both together. The env list, the CODEX_HOME trim, the package.json{name} test and the newest-wins-by-mtime tiebreak are all mirrored EXACTLY; only tier 6 (walk up from import.meta.url) has no shell analogue.\nr=\"\"; ch=\"$CODEX_HOME\"; ch=\"${ch#\"${ch%%[![:space:]]*}\"}\"; ch=\"${ch%\"${ch##*[![:space:]]}\"}\"; [ -n \"$ch\" ] || ch=\"$HOME/.codex\"; for c in \"$PLUGIN_ROOT\" \"$CLAUDE_PLUGIN_ROOT\" \"$CODEX_PLUGIN_ROOT\" \"$CURSOR_RULES_DIR\" \"$PI_PLUGIN_ROOT\" \"$(git rev-parse --show-toplevel 2>/dev/null)\"; do if [ -n \"$c\" ] && [ -f \"$c/scripts/mcp-server.sh\" ]; then r=\"$c\"; break; fi; done; if [ -z \"$r\" ]; then r=\"$(NODE_PATH=\"$(npm root -g 2>/dev/null)\" node -e 'import(require(`node:url`).pathToFileURL(require.resolve(`session-orchestrator/scripts/lib/plugin-root.mjs`))).then(m=>process.stdout.write(m.resolvePluginRoot()))' 2>/dev/null)\"; fi; if [ -z \"$r\" ]; then for b in \"$ch\" \"$HOME/.claude\"; do for c in \"$b\"/plugins/cache/*/session-orchestrator/*; do if [ -f \"$c/scripts/mcp-server.sh\" ] && node -e 'process.exit(JSON.parse(require(\"fs\").readFileSync(process.argv[1],\"utf8\")).name===\"session-orchestrator\"?0:1)' \"$c/package.json\" 2>/dev/null && { [ -z \"$r\" ] || [ \"$c\" -nt \"$r\" ]; }; then r=\"$c\"; fi; done; done; fi; if [ -n \"$r\" ] && [ -f \"$r/scripts/mcp-server.sh\" ]; then exec bash \"$r/scripts/mcp-server.sh\"; fi; { echo \"session-orchestrator: cannot locate the plugin root — the MCP server did not start.\"; echo \" Tried: PLUGIN_ROOT=${PLUGIN_ROOT:-(unset)}, CLAUDE_PLUGIN_ROOT=${CLAUDE_PLUGIN_ROOT:-(unset)}, CODEX_PLUGIN_ROOT=${CODEX_PLUGIN_ROOT:-(unset)}, CURSOR_RULES_DIR=${CURSOR_RULES_DIR:-(unset)}, PI_PLUGIN_ROOT=${PI_PLUGIN_ROOT:-(unset)}, git rev-parse --show-toplevel (cwd=$PWD), node resolve of session-orchestrator/scripts/lib/plugin-root.mjs, plugin caches $ch/plugins/cache/*/session-orchestrator/* and $HOME/.claude/plugins/cache/*/session-orchestrator/*.\"; echo \" Fix: reinstall the plugin so its cached copy is refreshed (codex plugin marketplace add Kanevry/session-orchestrator), or set CLAUDE_PLUGIN_ROOT / CODEX_PLUGIN_ROOT to the plugin directory in this server's env block.\"; echo \" Note: CODEX_PLUGIN_ROOT is session-orchestrator's own compatibility export, not a variable Codex provides. See docs/codex-setup.md § Troubleshooting.\"; } >&2; exit 1"
8
+ ]
6
9
  }
7
10
  }
8
11
  }
package/CHANGELOG.md CHANGED
@@ -7,6 +7,174 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [3.23.0] - 2026-08-28
11
+
12
+ Two commits today (1 `feat`, 1 `fix`; 64 files, +4,971/−184) close Waves 3 and 4 of the
13
+ resumed session, plus eight items carried forward from Wave 2 (`36aa605`, 2026-08-26,
14
+ never previously changelogged). No `BREAKING CHANGE:` footer and no `!` subject. The
15
+ pattern repeats across both waves: a guard, sanitizer, or census that already existed but
16
+ checked the wrong population or stopped short of the surface it needed to reach — a parity
17
+ guard sampling five rule files by name instead of reading the directory, a sanitizer whose
18
+ findings never reached stderr, a byte-count drifting 338 lines from the line it cited, a
19
+ tracked directory hiding an untracked hook beside it.
20
+
21
+ One `feat` commit (session-2, `30940cb`, 2026-08-28; 39 files, +2,475/−405) closes Wave 2
22
+ with three GitHub-mirror fixes and a session-identity cluster at the process boundary. No
23
+ `BREAKING CHANGE:` footer and no `!` subject. The through-line: identifiers the platforms
24
+ mint (UUIDv7, semantic session ids) were rejected or dropped by readers built for UUIDv4
25
+ only — every resume looked foreign — and call sites that needed a repo root passed
26
+ `undefined` instead, so fail-open paths ran on every invocation.
27
+
28
+ ### Added
29
+
30
+ - **Eight core rules ship as sanitized copies, with a report-only leak scanner (#1098).**
31
+ `rules/always-on/` holds sanitized copies of `ask-via-tool`, `build-value`,
32
+ `loop-and-monitor` and five more; `scanVendoringLeaks()` now reaches stderr as one line
33
+ per finding in both CLIs, folded into `validate-vendored-rules` with a rule-ID census.
34
+ - **Session Config fails loud on an unparsable line (#1097).** `collectUnparsableLines`
35
+ gates warn/strict via one `htmlCommentSkipper` shared by extractor and classifier — a
36
+ commented-out `enforcement: strict` had been reading as live config.
37
+ - **A read-only protection-audit CLI, with a runbook naming the order (#1079).** States
38
+ the required sequence; never flips a setting itself.
39
+ - **The scope guard now emits `orchestrator.wave_dispatch.scope_checked` (#1092).** Closes
40
+ the ledger half that never recorded a signal-free ALLOW.
41
+ - **`/journey-audit` — a user-facing product audit as a repeatable skill (#1161).** Skill,
42
+ command and manifest template; skill/command counts measured at 48/28.
43
+ - **A Cursor `.mdc` parity guard that reads the directory, not a fixed list (#1093).**
44
+ Catches bare `PID=`/`${VAR}` IDs a name-sampling guard had missed; `priority::` swept
45
+ across all 5 files.
46
+ - **The old root now formally leaves before the new one claims it, wired at all four
47
+ promotion sites (#1069).** `scripts/lib/session-transition.mjs` → `leaveSourceRoot()`:
48
+ `deregisterSelf()` → lock-release (reusing `on-session-end`'s ownership rules) →
49
+ `orchestrator.session.root_left` (carries `source_root_hash`/`source_root_basename`,
50
+ never an absolute path — the payload also travels over the optional webhook). Review
51
+ found the Phase-1.2.1 promotion site had been missing the call; it is now wired at
52
+ session-start Phase 0.5, Phase 1.2.1, and both `parallel-aware-*` docs. A real
53
+ `git worktree` two-root integration test goes phantom-peer red → green.
54
+
55
+ ### Fixed
56
+
57
+ - **Six onboarding contradictions + a `cursor-install` TARGET guard (#1078).** First
58
+ production diff authored by a foreign model (composer-2.5) under mandatory Claude review.
59
+ - **Amber is now a documented normal state (#1062).** `docs/ci-setup.md` names it instead
60
+ of leaving it an unexplained CI color.
61
+ - **A tracked directory no longer hides an untracked hook beside it (#1158).**
62
+ `hooksPathIsTracked` now requires a GIT-tracked file directly under `core.hooksPath`.
63
+ - **`probe-stale` collapses to one vocabulary term (#1159).** A record older than 7 days
64
+ is `probe-stale`, severity `warn`, never a live finding; the registry remap is gone.
65
+ - **The scope-cap saw operators, not shell keywords (#1145).** `splitSegments` now splits
66
+ on keywords too, so `for t in a b c; do glab issue create; done` no longer slips a
67
+ compound-statement head past the cap.
68
+ - **A missing `.claude/rules/` was misdiagnosed as a loop (#1132).** `err.code` now
69
+ separates silent `ENOENT`/`ENOTDIR` from loud `EACCES`; the repeat was caller fan-out.
70
+ - **Two probes measured the wrong population (#1143/#1148).** One counted a whole file and
71
+ cited a line that had already drifted 338 lines from the finding; both scanners read the
72
+ filesystem instead of the git index, censoring 5 gitignored files as documentation.
73
+ - **Generated rules now self-verify offline (#1101).** Each carries a sha256 seal over its
74
+ own Evidence block instead of a learning-key into a gitignored file; 23 rules sealed,
75
+ fresh-clone warnings 23 → 0.
76
+ - **`reconcile.targets` had zero consumers (#1099).** Now wired through with a closed enum,
77
+ visible rejection of unknowns, and per-target path confinement.
78
+ - **Orphaned wave-scope files survived re-materialization (#1103).** Reconciled by
79
+ ownership proof now, never a blind directory wipe — two parallel sessions can share one
80
+ wave-N directory (PSA-003).
81
+ - **Two rival vendoring paths wrote the same rule file (#1060).** `rules/` is now sole SSOT
82
+ for PSA-001..007; `templates/_shared/rules/` is deleted.
83
+ - **`parseSessionId` accepted only UUIDv4; Codex mints v7 (#66/#1091).**
84
+ `scripts/lib/session-id.mjs` now accepts RFC-9562 v1–8 (`UUID_RE`, additive `version`
85
+ field — see `### Removed` below for the alias this superseded). Every SessionStart had
86
+ minted a fresh v4; a
87
+ resumed/compacted thread read its own lock as a foreign session. `hooks/on-stop.mjs` and
88
+ `hooks/on-session-end.mjs` now apply the writer's acceptance rule, closing a lock-leak via
89
+ non-UUID stdin ids.
90
+ - **phase-3-7a called `updateFrontmatterFieldsOnDisk(undefined, …)` (#65/#1036).**
91
+ `skills/session-end/phase-3-7a-recommendations.md` requires a repo root; every `/close`
92
+ took the fail-open path — 0 of 5 recommendation fields were ever written. The snippet now
93
+ binds `repoRoot` via `git rev-parse --show-toplevel`; the catch logs the cause.
94
+ - **Codex MCP launch resolved to `/scripts/mcp-server.sh` from non-git cwd (#64).** Codex
95
+ copies a marketplace plugin to
96
+ `~/.codex/plugins/cache/<marketplace>/session-orchestrator/<version>/` and starts the MCP
97
+ child with no plugin-root env var. `.mcp.json` and `scripts/lib/plugin-root.mjs` gained a
98
+ plugin-cache scan tier (name-matched `package.json`, newest by mtime). Codex snapshots
99
+ `.mcp.json` at install time — existing installs need a reinstall.
100
+ - **`scoring.mjs` read a flat `completion_rate` 0 of 281 records carry (#1071).** The value
101
+ lives under `effectiveness`, so the high-completion bonus was unreachable.
102
+ `resolveMemoryDir`/`buildLiveSignals` now take an explicit `repoRoot` instead of
103
+ `process.cwd()`.
104
+ - **mission-status recovery aborted on the first non-canonical body line (#1104).**
105
+ `scripts/lib/state-md/mission-status.mjs` now skips per line, reports skipped lines
106
+ (`recoverFrontmatterMissionStatusDetailed`). `setMissionStatus` refuses ids outside the
107
+ grammar with a stderr WARN from the on-disk wrapper.
108
+ - **`enterWorktree` failed with `already used by worktree` when the source branch was
109
+ checked out (#1067).** `scripts/lib/autopilot/worktree-pipeline.mjs` now creates
110
+ `so/<sessionId>` from that branch and returns `branch`/`promotedFrom`.
111
+ - **Phase 4a auto-promoted-worktree cleanup was dead under the #1069 process boundary.**
112
+ Since the promoted worktree runs as a brand-new session with its own id,
113
+ `detectAutoPromotedWorktree()`'s basename match against the CURRENT session id could
114
+ never fire post-#1069. `enterWorktree()` now writes `.orchestrator/promoted-from.json`
115
+ (source-root hash + basename, source session id, branch) at creation time;
116
+ `detectAutoPromotedWorktree()` tries this marker FIRST (`source: 'marker'`), falling back
117
+ to the legacy basename match (`source: 'basename'`) for pre-marker worktrees.
118
+ `isWorktreeClean()` discounts exactly the marker's own untracked line so the marker never
119
+ reads as dirty by itself. Re-promoting onto an existing `so/<sessionId>` branch now reuses
120
+ it (`reusedBranch: true`) or reports a typed refusal, instead of failing outright. See
121
+ ADR-0013.
122
+ - **`.mcp.json`'s bash bootstrap had silently drifted from `resolvePluginRoot()`'s tier
123
+ order.** The shell mirror now matches the same five env tiers in the same order, tests
124
+ `package.json`'s `name` field via `node -e JSON.parse(...)` instead of a substring `grep`
125
+ (which had matched `session-orchestrator-fork`), and ties the newest-by-mtime cache scan
126
+ to the same strict `-nt` comparison as the JS side. Two drift tests pin JS and shell
127
+ staying in sync.
128
+ - **`ci-status-banner.mjs` escaped control bytes in the JSON preview but not in the
129
+ parse-error message.** `JSON.stringify()` alone is not enough — V8 quotes the raw
130
+ offending input inside `SyntaxError.message`, carrying control bytes straight to the
131
+ terminal. `escapeControlBytes()` now covers both the preview AND `err.message`;
132
+ `parseCliJson()` also gained a shape-gate against `null`/`[]`/a bare `"ok"` string, all of
133
+ which parse as valid JSON but are not the object/array shape callers expect.
134
+ - **A refused mission-status write warned on only 1 of 5 call paths.**
135
+ `setMissionStatusDetailed()` now reports the refusal reason (e.g. `id-grammar`) to every
136
+ caller, and the on-disk wrapper emits the stderr WARN on all 5 paths instead of the one it
137
+ happened to cover before.
138
+ - **`check-unwired-features` exempted itself from its own edge census via its allowlist
139
+ string, hiding a real orphan behind it.** The `SELF_REL` self-reference correctly
140
+ contributes zero edges by design, but the same code path was masking that
141
+ `scripts/lib/webhook-url.mjs` has zero callers repo-wide — genuinely unreachable, not a
142
+ false positive. Follow-up issue pending to wire it in or remove it.
143
+ - **Three load-sensitive tests hardened with margin instead of being disabled.**
144
+ `tests/scripts/validate-plugin.test.mjs`'s child-process timeout moved from 30s to 120s (a
145
+ killed child returns `status: null`, which had read as a different failure than a real
146
+ one) plus a matching `hookTimeout` bump, and two further spawn-timeout assertions gained
147
+ the same discriminating margin between contention and a genuine failure.
148
+
149
+ ### Changed
150
+
151
+ - **Host-registry census counts `semantic_session_id` (#1066).** `hooks/on-session-start.mjs`
152
+ falls back to `session_id` only when it is itself semantic. Before, only UUIDs were
153
+ projected — the n-increment discards them — so the registry contributed nothing to
154
+ numbering.
155
+ - **Session end events carry `semantic_session_id`; backfill event + supersede (#1068).**
156
+ `orchestrator.session.ended` / `.stopped` carry `semantic_session_id` (omitted when
157
+ unknown). A new `orchestrator.session.backfill_completed` event records each backfill outcome. A
158
+ completed record may now supersede an `abandoned` stub (append-only, `supersedes` marker).
159
+ Readers preferring the newest record are a follow-up.
160
+ - **`.semgrep.yml` regains two taint-mode rules (#1129).** `json-parse-untrusted-input` and
161
+ `prototype-pollution-object-assign` aimed at this repo's real trust boundary (hook stdin,
162
+ child-process stdout); 27 rules total. `unsafe-llm-output-rendering` stays excluded with a
163
+ measured reason (no DOM code).
164
+
165
+ ### Removed
166
+
167
+ - **`UUID_V4_RE` removed** from `scripts/lib/session-id.mjs` — deprecated alias of
168
+ `UUID_RE` with zero importers repo-wide (measured @ 7daa3d2; hits in
169
+ `tests/telemetry/anon-id.test.mjs` and `server/ingest/validate.mjs` are unrelated local
170
+ constants of the same name). Use `UUID_RE`, any RFC 9562 version 1–8.
171
+
172
+ ### Notes
173
+
174
+ Two of this session's diffs were authored by foreign models under the #1150 adapter —
175
+ #1078 by composer-2.5, #1093 by grok-4.6 — each passing mandatory Claude review before
176
+ landing. First production use of the foreign-dispatch path.
177
+
10
178
  ## [3.22.0] - 2026-08-22
11
179
 
12
180
  Twenty commits (12 `fix`, 5 `docs`, 2 `feat`, 1 `chore`; 150 files, +17,312/−2,575), no