session-orchestrator 5.12.0 → 5.13.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 (385) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +4 -1
  3. package/.codex-plugin/agents/explorer.toml +1 -1
  4. package/.codex-plugin/agents/session-reviewer.toml +2 -2
  5. package/.codex-plugin/agents/wave-worker.toml +1 -1
  6. package/.codex-plugin/plugin.json +1 -1
  7. package/.cursor-plugin/plugin.json +1 -1
  8. package/.orchestrator/policy/blocked-commands.json +8 -0
  9. package/.orchestrator/policy/public-export.json +30 -0
  10. package/CHANGELOG.md +162 -4
  11. package/README.md +126 -127
  12. package/agents/analyst.md +7 -2
  13. package/agents/architect-reviewer.md +7 -2
  14. package/agents/code-implementer.md +4 -2
  15. package/agents/db-specialist.md +9 -2
  16. package/agents/dialectic-deriver.md +9 -3
  17. package/agents/docs-writer.md +7 -2
  18. package/agents/eval-judge.md +7 -1
  19. package/agents/qa-strategist.md +7 -2
  20. package/agents/security-reviewer.md +9 -2
  21. package/agents/session-reviewer.md +18 -2
  22. package/agents/skill-applied-judge.md +7 -1
  23. package/agents/test-writer.md +9 -2
  24. package/agents/ui-developer.md +9 -2
  25. package/agents/ux-evaluator.md +6 -1
  26. package/commands/session.md +1 -1
  27. package/commands/templates-ack.md +89 -18
  28. package/docs/agent-authoring.md +30 -11
  29. package/docs/ci-setup.md +38 -2
  30. package/docs/codex-setup.md +33 -9
  31. package/docs/components.md +13 -2
  32. package/docs/cursor-setup.md +3 -3
  33. package/docs/events-schema.md +5 -4
  34. package/docs/evidence-candidates.md +63 -0
  35. package/docs/fleet-checkin-audit.md +7 -4
  36. package/docs/github-mirror-protection.md +150 -3
  37. package/docs/install.md +90 -17
  38. package/docs/instruction-delivery.md +1 -1
  39. package/docs/migration-v4.md +2 -2
  40. package/docs/mods.md +118 -0
  41. package/docs/owner-config-schema.md +1 -0
  42. package/docs/plugin-architecture-v3.md +1 -1
  43. package/docs/pm-skills-marketplace.md +4 -3
  44. package/docs/rule-authoring.md +24 -13
  45. package/docs/scope-collision-guard.md +2 -1
  46. package/docs/session-config-reference.md +49 -15
  47. package/docs/session-config-template.md +30 -22
  48. package/docs/sessions-ledger-repair.md +137 -0
  49. package/docs/vault-docs-architecture.md +1 -1
  50. package/hooks/_lib/hook-import-set.json +406 -73
  51. package/hooks/_lib/hook-root.mjs +301 -0
  52. package/hooks/_lib/lock-bootstrap.mjs +434 -4
  53. package/hooks/_lib/orchestrator-ignore.mjs +3 -0
  54. package/hooks/_lib/subagent-transcript.mjs +2 -2
  55. package/hooks/_lib/vcs-create-matcher.mjs +13 -17
  56. package/hooks/cwd-change-restore.mjs +5 -1
  57. package/hooks/enforce-commands.mjs +4 -3
  58. package/hooks/enforce-scope.mjs +11 -1
  59. package/hooks/hooks-codex.json +48 -2
  60. package/hooks/hooks.json +31 -31
  61. package/hooks/on-session-end.mjs +38 -15
  62. package/hooks/on-session-start.mjs +139 -49
  63. package/hooks/on-stop.mjs +11 -6
  64. package/hooks/post-bash-issue-budget-refund.mjs +6 -1
  65. package/hooks/post-bash-write-verify.mjs +8 -4
  66. package/hooks/post-edit-validate.mjs +45 -52
  67. package/hooks/post-subagent-discovery-validator.mjs +2 -2
  68. package/hooks/post-tool-batch-wave-signal.mjs +8 -4
  69. package/hooks/post-tool-failure-corrective-context.mjs +5 -1
  70. package/hooks/pre-bash-destructive-guard.mjs +220 -8
  71. package/hooks/pre-bash-issue-budget.mjs +6 -1
  72. package/hooks/pre-bash-sessions-ledger-guard.mjs +691 -123
  73. package/hooks/pre-bash-staging-fence.mjs +258 -14
  74. package/hooks/pre-bash-templates-first.mjs +28 -27
  75. package/hooks/run-node.sh +1 -1
  76. package/hooks/skill-invocation-telemetry.mjs +15 -8
  77. package/hooks/subagent-telemetry.mjs +77 -14
  78. package/hooks/wave-scope-commit-guard.mjs +143 -14
  79. package/mods/so-hud/.claude-plugin/plugin.json +11 -0
  80. package/mods/so-hud/README.md +57 -0
  81. package/mods/so-hud/hooks/beacon-io.mjs +101 -0
  82. package/mods/so-hud/hooks/heredoc-scan.ts +394 -0
  83. package/mods/so-hud/hooks/hooks.json +1 -0
  84. package/mods/so-hud/hooks/logic.ts +182 -0
  85. package/mods/so-hud/hooks/register.tsx +670 -0
  86. package/mods/so-hud/hooks/rules.ts +2998 -0
  87. package/mods/so-hud/tsconfig.json +8 -0
  88. package/mods/so-hud/types/index.d.ts +36 -0
  89. package/package.json +4 -2
  90. package/rules/_index.md +1 -1
  91. package/rules/always-on/ask-via-tool.md +1 -1
  92. package/rules/always-on/loop-and-monitor.md +17 -194
  93. package/rules/always-on/parallel-sessions.md +3 -1
  94. package/rules/opt-in-stack/backend-data.md +1 -1
  95. package/rules/opt-in-stack/backend.md +1 -1
  96. package/rules/opt-in-stack/security-web.md +5 -1
  97. package/scripts/agent-usage-census.mjs +79 -0
  98. package/scripts/apply-session-learnings.mjs +34 -6
  99. package/scripts/archive-closed-prds.mjs +21 -5
  100. package/scripts/autopilot.mjs +11 -5
  101. package/scripts/backfill-abandoned-sessions.mjs +13 -3
  102. package/scripts/backfill-evidence-digest.mjs +2 -1
  103. package/scripts/backfill-learnings-from-vault.mjs +61 -6
  104. package/scripts/backfill-sessions.mjs +16 -2
  105. package/scripts/check-package-manager.mjs +26 -8
  106. package/scripts/check-sessions-integrity.mjs +4 -1
  107. package/scripts/ci/assert-vitest-green.mjs +3 -0
  108. package/scripts/ci/windows-smoke.mjs +201 -0
  109. package/scripts/close-precheck.mjs +55 -0
  110. package/scripts/dialectic-deriver.mjs +20 -12
  111. package/scripts/emit-event.mjs +2 -2
  112. package/scripts/emit-session.mjs +239 -20
  113. package/scripts/eval-session.mjs +17 -3
  114. package/scripts/export-hw-learnings.mjs +29 -2
  115. package/scripts/fleet-checkin-audit.mjs +8 -4
  116. package/scripts/fleet-checkin.mjs +39 -27
  117. package/scripts/gc-stale-worktrees.mjs +6 -1
  118. package/scripts/github-export.mjs +128 -0
  119. package/scripts/github-protection-audit.mjs +3 -1
  120. package/scripts/handover-queue-check.mjs +209 -0
  121. package/scripts/harness-audit.mjs +6 -4
  122. package/scripts/lib/agent-frontmatter.mjs +57 -10
  123. package/scripts/lib/agent-status.mjs +125 -7
  124. package/scripts/lib/agent-usage-census.mjs +394 -0
  125. package/scripts/lib/auto-dialectic.mjs +17 -10
  126. package/scripts/lib/auto-dream.mjs +22 -14
  127. package/scripts/lib/autopilot/loop.mjs +3 -1
  128. package/scripts/lib/autopilot/recent-runs.mjs +4 -2
  129. package/scripts/lib/autopilot/stall-sampler.mjs +2 -1
  130. package/scripts/lib/autopilot/telemetry.mjs +5 -1
  131. package/scripts/lib/autopilot/worktree-pipeline.mjs +5 -5
  132. package/scripts/lib/baseline-archetypes.mjs +10 -2
  133. package/scripts/lib/blocked-commands-policy.mjs +4 -3
  134. package/scripts/lib/build-live-signals.mjs +13 -9
  135. package/scripts/lib/ci-status-banner.mjs +329 -24
  136. package/scripts/lib/codex/plugin-contract.mjs +8 -0
  137. package/scripts/lib/cold-start-detector.mjs +5 -2
  138. package/scripts/lib/command-blocker.mjs +603 -43
  139. package/scripts/lib/common.mjs +3 -2
  140. package/scripts/lib/config/cross-repo.mjs +74 -7
  141. package/scripts/lib/config/host-paths.mjs +6 -2
  142. package/scripts/lib/config/section-extractor.mjs +65 -11
  143. package/scripts/lib/config/template-keys.mjs +153 -0
  144. package/scripts/lib/config/vault-integration.mjs +1 -0
  145. package/scripts/lib/config.mjs +2 -2
  146. package/scripts/lib/coordinator-snapshot.mjs +1 -1
  147. package/scripts/lib/discovery/triage-state.mjs +2 -1
  148. package/scripts/lib/dispatcher/rank.mjs +5 -7
  149. package/scripts/lib/ecosystem-health.mjs +2 -2
  150. package/scripts/lib/eval/engine.mjs +3 -2
  151. package/scripts/lib/eval/session-resolve.mjs +6 -2
  152. package/scripts/lib/eval/sink.mjs +4 -3
  153. package/scripts/lib/events-retention-banner.mjs +3 -2
  154. package/scripts/lib/events-schema.mjs +10 -0
  155. package/scripts/lib/events.mjs +23 -12
  156. package/scripts/lib/evolve/autonomy-verdict.mjs +4 -9
  157. package/scripts/lib/evolve/autopilot-effectiveness.mjs +8 -18
  158. package/scripts/lib/fleet-protocol.mjs +4 -0
  159. package/scripts/lib/gates/gate-full.mjs +172 -11
  160. package/scripts/lib/gates/gate-helpers.mjs +236 -23
  161. package/scripts/lib/git-config-drift.mjs +141 -7
  162. package/scripts/lib/github-export.mjs +447 -0
  163. package/scripts/lib/gitlab-portfolio/cli.mjs +16 -5
  164. package/scripts/lib/handover-queue-marks.mjs +159 -0
  165. package/scripts/lib/hardware-pattern-detector.mjs +103 -13
  166. package/scripts/lib/harness-audit/categories/category1.mjs +16 -4
  167. package/scripts/lib/harness-audit/categories/category4.mjs +11 -8
  168. package/scripts/lib/harness-audit/categories/category6.mjs +25 -5
  169. package/scripts/lib/harness-audit/categories/category9.mjs +10 -4
  170. package/scripts/lib/host-identity.mjs +9 -5
  171. package/scripts/lib/http-request.mjs +64 -0
  172. package/scripts/lib/instruction-budget-guard.mjs +30 -22
  173. package/scripts/lib/io.mjs +6 -3
  174. package/scripts/lib/issue-budget-reconcile.mjs +3 -2
  175. package/scripts/lib/issue-budget.mjs +36 -7
  176. package/scripts/lib/learnings/evidence-candidates.mjs +154 -0
  177. package/scripts/lib/learnings/expiry-sweep.mjs +99 -7
  178. package/scripts/lib/learnings/io.mjs +289 -15
  179. package/scripts/lib/learnings/select.mjs +53 -4
  180. package/scripts/lib/learnings/store-role.mjs +209 -0
  181. package/scripts/lib/learnings/surface.mjs +46 -7
  182. package/scripts/lib/ledger-path.mjs +113 -0
  183. package/scripts/lib/maintenance-due-banner.mjs +63 -12
  184. package/scripts/lib/memory-banner.mjs +5 -6
  185. package/scripts/lib/memory-proposals/collector.mjs +5 -2
  186. package/scripts/lib/memory-proposals/sink.mjs +7 -4
  187. package/scripts/lib/memory-proposals/store.mjs +22 -5
  188. package/scripts/lib/mode-selector-accuracy.mjs +2 -1
  189. package/scripts/lib/no-follow-open.mjs +57 -0
  190. package/scripts/lib/orphan-reaper/reaper-audit.mjs +4 -2
  191. package/scripts/lib/own-lock-root.mjs +95 -0
  192. package/scripts/lib/owner-interview.mjs +2 -1
  193. package/scripts/lib/owner-yaml.mjs +70 -7
  194. package/scripts/lib/platform.mjs +161 -9
  195. package/scripts/lib/plugin-update-banner.mjs +15 -11
  196. package/scripts/lib/pre-push-local-partial.mjs +117 -0
  197. package/scripts/lib/pre-push-remote-gate.mjs +151 -25
  198. package/scripts/lib/process-group.mjs +270 -34
  199. package/scripts/lib/project-hygiene.mjs +28 -0
  200. package/scripts/lib/quality-gate.mjs +33 -9
  201. package/scripts/lib/reconcile/backlog.mjs +29 -15
  202. package/scripts/lib/reconcile/engine.mjs +26 -2
  203. package/scripts/lib/reconcile/idempotency.mjs +65 -3
  204. package/scripts/lib/reconcile/rule-expiry-sweep.mjs +53 -12
  205. package/scripts/lib/reconcile/verdict-ledger.mjs +224 -0
  206. package/scripts/lib/reconcile-nudge-banner.mjs +40 -6
  207. package/scripts/lib/resource-probe/evaluate.mjs +32 -9
  208. package/scripts/lib/resource-probe/probe-platform.mjs +3 -1
  209. package/scripts/lib/rule-loader.mjs +20 -10
  210. package/scripts/lib/scope-baseline.mjs +123 -8
  211. package/scripts/lib/scope-echo.mjs +5 -2
  212. package/scripts/lib/scope-gate.mjs +55 -20
  213. package/scripts/lib/session-close-backfill.mjs +75 -7
  214. package/scripts/lib/session-end/close-precheck.mjs +151 -0
  215. package/scripts/lib/session-end/phase-skip.mjs +8 -7
  216. package/scripts/lib/session-end/tail-runner.mjs +7 -2
  217. package/scripts/lib/session-id.mjs +9 -1
  218. package/scripts/lib/session-identity/own-session.mjs +63 -0
  219. package/scripts/lib/session-lock.mjs +114 -0
  220. package/scripts/lib/session-record-repair.mjs +245 -35
  221. package/scripts/lib/session-registry.mjs +72 -9
  222. package/scripts/lib/session-schema/constants.mjs +9 -0
  223. package/scripts/lib/session-schema/filters.mjs +56 -1
  224. package/scripts/lib/session-schema/validator.mjs +15 -5
  225. package/scripts/lib/session-start-probes.mjs +149 -22
  226. package/scripts/lib/session-token-rollup.mjs +2 -1
  227. package/scripts/lib/session-work-trees.mjs +166 -0
  228. package/scripts/lib/sessions-canonical.mjs +61 -3
  229. package/scripts/lib/sessions-integrity-banner.mjs +17 -39
  230. package/scripts/lib/sessions-staleness-banner.mjs +8 -5
  231. package/scripts/lib/sh-quote.mjs +1 -0
  232. package/scripts/lib/skill-evidence-window.mjs +5 -1
  233. package/scripts/lib/skill-health/join.mjs +10 -9
  234. package/scripts/lib/skill-invocations-schema.mjs +13 -0
  235. package/scripts/lib/skill-judgments-schema.mjs +6 -2
  236. package/scripts/lib/snapshot-probe.mjs +414 -0
  237. package/scripts/lib/so-hud/collect.mjs +49 -5
  238. package/scripts/lib/so-hud/runtime.mjs +15 -4
  239. package/scripts/lib/spiral-carryover.mjs +8 -1
  240. package/scripts/lib/state-md/frontmatter-mutators.mjs +266 -8
  241. package/scripts/lib/state-md/idle-reset.mjs +14 -5
  242. package/scripts/lib/state-md/mission-status.mjs +5 -1
  243. package/scripts/lib/state-md-peer-guard.mjs +2 -0
  244. package/scripts/lib/state-md.mjs +31 -8
  245. package/scripts/lib/sunset/walker.mjs +4 -3
  246. package/scripts/lib/telemetry/consent.mjs +4 -2
  247. package/scripts/lib/telemetry/queue.mjs +3 -3
  248. package/scripts/lib/telemetry/sync.mjs +45 -9
  249. package/scripts/lib/test-runner/artifact-paths.mjs +10 -2
  250. package/scripts/lib/tmux-layout/layouts.mjs +20 -3
  251. package/scripts/lib/ux-grill/paths.mjs +5 -1
  252. package/scripts/lib/validate/check-agents.mjs +37 -6
  253. package/scripts/lib/validate/check-component-paths.mjs +25 -1
  254. package/scripts/lib/validate/check-guard-requires-parity.mjs +3 -3
  255. package/scripts/lib/validate/check-hooks-symmetry.mjs +53 -32
  256. package/scripts/lib/validate/check-json-files.mjs +3 -1
  257. package/scripts/lib/validate/check-learning-provenance.mjs +3 -2
  258. package/scripts/lib/validate/check-learnings-shell-writes.mjs +10 -4
  259. package/scripts/lib/validate/check-metrics-ledger-root.mjs +234 -0
  260. package/scripts/lib/validate/check-owner-leakage.mjs +159 -11
  261. package/scripts/lib/validate/check-test-posix-shell.mjs +246 -0
  262. package/scripts/lib/validate/check-unwired-features.mjs +4 -2
  263. package/scripts/lib/validate/check-vcs-repo-flag-positional.mjs +58 -0
  264. package/scripts/lib/validate/check-vcs-repo-flag.mjs +259 -73
  265. package/scripts/lib/validate/check-workflow-continue-on-error.mjs +63 -0
  266. package/scripts/lib/validate/confidential-names.mjs +3 -1
  267. package/scripts/lib/vault-mirror/migrate-ids.mjs +321 -0
  268. package/scripts/lib/vault-mirror/namespace.mjs +19 -7
  269. package/scripts/lib/vault-mirror/process.mjs +56 -27
  270. package/scripts/lib/vault-mirror/prune.mjs +5 -2
  271. package/scripts/lib/vault-mirror/render-learnings.mjs +3 -3
  272. package/scripts/lib/vault-mirror/render-sessions.mjs +36 -53
  273. package/scripts/lib/vault-mirror/retention.mjs +2 -2
  274. package/scripts/lib/vault-mirror/utils.mjs +79 -0
  275. package/scripts/lib/vault-staleness-banner.mjs +4 -7
  276. package/scripts/lib/vault-status/board-writer.mjs +2 -1
  277. package/scripts/lib/vault-status/narrative-mirror.mjs +66 -7
  278. package/scripts/lib/wave-executor/foreign-dispatch.mjs +20 -0
  279. package/scripts/lib/win-process-tree.mjs +137 -0
  280. package/scripts/lib/workspace.mjs +1 -1
  281. package/scripts/lib/worktree/constants.mjs +1 -1
  282. package/scripts/lib/worktree/lifecycle.mjs +1 -1
  283. package/scripts/lib/worktree/listing.mjs +1 -1
  284. package/scripts/lib/zx.mjs +50 -0
  285. package/scripts/mcp-server.mjs +16 -7
  286. package/scripts/mcp-server.sh +13 -83
  287. package/scripts/measure-policy-cache-effectiveness.mjs +7 -5
  288. package/scripts/memory-propose.mjs +10 -3
  289. package/scripts/migrate-cold-start-seed.mjs +7 -0
  290. package/scripts/migrate-legacy-learnings.sh +22 -0
  291. package/scripts/migrate-sessions-jsonl.mjs +16 -2
  292. package/scripts/migrate-vault-paths.mjs +29 -13
  293. package/scripts/parse-config.mjs +71 -14
  294. package/scripts/print-learnings-index.mjs +25 -2
  295. package/scripts/release-session-lock.mjs +94 -7
  296. package/scripts/release.mjs +451 -24
  297. package/scripts/relocate-vault-corpus.mjs +11 -7
  298. package/scripts/repair-invalid-sessions.mjs +68 -3
  299. package/scripts/resolve-session-invocation.mjs +10 -17
  300. package/scripts/run-migrate-v2-cross-repo.mjs +56 -1
  301. package/scripts/run-quality-gate.mjs +33 -7
  302. package/scripts/self-update.mjs +56 -7
  303. package/scripts/session-commit-files.mjs +133 -0
  304. package/scripts/site-numbers.mjs +52 -9
  305. package/scripts/snapshot-probe.mjs +156 -0
  306. package/scripts/so-hud.mjs +29 -6
  307. package/scripts/state-md-idle-reset.mjs +2 -1
  308. package/scripts/sweep-expired-learnings.mjs +54 -6
  309. package/scripts/sweep-expired-rules.mjs +4 -1
  310. package/scripts/validate-plugin.mjs +22 -0
  311. package/scripts/vault-integration-watcher.mjs +54 -6
  312. package/scripts/vault-mirror.mjs +9 -0
  313. package/skills/_shared/fleet-protocol.md +142 -1
  314. package/skills/_shared/instruction-file-resolution.md +1 -1
  315. package/skills/_shared/monitor-patterns.md +44 -25
  316. package/skills/_shared/platform-tools.md +7 -0
  317. package/skills/_shared/state-ownership.md +3 -2
  318. package/skills/architecture/references/domain-model.md +1 -1
  319. package/skills/bootstrap/SKILL.md +3 -1
  320. package/skills/bootstrap/_shared-template.md +4 -4
  321. package/skills/bootstrap/fast-template.md +1 -1
  322. package/skills/bootstrap/private-contract.md +1 -1
  323. package/skills/bootstrap/references/bootstrap-retroactive-flow.md +17 -9
  324. package/skills/bootstrap/templates/agents/project-code-review.md +5 -1
  325. package/skills/bootstrap/templates/agents/project-discovery.md +5 -1
  326. package/skills/bootstrap/templates/agents/project-quality-gate.md +5 -1
  327. package/skills/claude-md-drift-check/SKILL.md +3 -3
  328. package/skills/claude-md-drift-check/checker.mjs +61 -101
  329. package/skills/close/SKILL.md +20 -7
  330. package/skills/discovery/probes/docs-staleness.mjs +7 -5
  331. package/skills/discovery/probes/frontend-slop.mjs +7 -3
  332. package/skills/discovery/probes/ssot-code-diff.mjs +5 -3
  333. package/skills/discovery/probes/supply-chain-slopcheck.mjs +10 -8
  334. package/skills/discovery/probes/vault-narrative-staleness.mjs +30 -10
  335. package/skills/discovery/probes/vault-staleness.mjs +5 -3
  336. package/skills/discovery/probes-session.md +3 -0
  337. package/skills/discovery/probes-vault.md +2 -0
  338. package/skills/dispatcher/SKILL.md +1 -1
  339. package/skills/eval/SKILL.md +3 -1
  340. package/skills/evolve/SKILL.md +2 -0
  341. package/skills/evolve/references/evolve-analyze-mode.md +3 -3
  342. package/skills/evolve/references/evolve-dialectic-mode.md +1 -1
  343. package/skills/gitlab-ops/SKILL.md +7 -6
  344. package/skills/gitlab-portfolio/SKILL.md +2 -2
  345. package/skills/go/SKILL.md +13 -1
  346. package/skills/npm-publish/SKILL.md +5 -2
  347. package/skills/plan/SKILL.md +23 -10
  348. package/skills/plan/mode-feature.md +13 -8
  349. package/skills/plan/mode-new.md +6 -14
  350. package/skills/plan/prd-feature-template.md +19 -0
  351. package/skills/plan/prd-full-template.md +12 -5
  352. package/skills/plan/prd-premortem-panel.md +48 -0
  353. package/skills/plan/prd-reviewer-prompt.md +11 -3
  354. package/skills/plan/soul.md +1 -1
  355. package/skills/portfolio/SKILL.md +5 -6
  356. package/skills/quality-gates/SKILL.md +2 -4
  357. package/skills/reconcile/SKILL.md +27 -4
  358. package/skills/release/SKILL.md +16 -8
  359. package/skills/session-end/SKILL.md +94 -11
  360. package/skills/session-end/phase-3-2-docs-verification.md +1 -0
  361. package/skills/session-end/phase-3-6-tail.md +11 -7
  362. package/skills/session-end/phase-3-7a-recommendations.md +9 -2
  363. package/skills/session-end/plan-verification.md +16 -1
  364. package/skills/session-end/references/phase-3-documentation-updates.md +14 -12
  365. package/skills/session-end/references/phase-5-issue-cleanup.md +1 -1
  366. package/skills/session-end/references/session-summary-template.md +4 -0
  367. package/skills/session-end/session-metrics-write.md +7 -4
  368. package/skills/session-plan/SKILL.md +5 -3
  369. package/skills/session-start/SKILL.md +9 -3
  370. package/skills/session-start/phase-4-5-resource-health.md +11 -5
  371. package/skills/session-start/phase-8-5-express-path.md +4 -3
  372. package/skills/session-start/references/phase-1-2-session-lock.md +7 -5
  373. package/skills/session-start/references/phase-1-5-session-continuity.md +2 -2
  374. package/skills/session-start/references/phase-1-7-vault-status-board.md +1 -1
  375. package/skills/session-start/references/phase-4-ssot-environment-check.md +3 -2
  376. package/skills/tmux-layout/SKILL.md +2 -2
  377. package/skills/vault-sync/validator.mjs +3 -2
  378. package/skills/wave-executor/SKILL.md +5 -4
  379. package/skills/wave-executor/references/wave-executor-state-init.md +3 -3
  380. package/skills/wave-executor/references/wave-loop-dispatch.md +11 -5
  381. package/skills/wave-executor/references/wave-loop-review.md +13 -5
  382. package/skills/wave-executor/references/wave-loop-scope-manifest.md +1 -1
  383. package/assets/og-card.png +0 -0
  384. package/assets/og-card.svg +0 -47
  385. package/assets/wave-lifecycle.svg +0 -98
@@ -101,6 +101,7 @@ import { join, dirname } from 'node:path';
101
101
  import { fileURLToPath } from 'node:url';
102
102
 
103
103
  import { findProjectRoot } from './lib/common.mjs';
104
+ import { resolveLedgerPath } from './lib/ledger-path.mjs';
104
105
  import { eventsFilePath } from './lib/events.mjs';
105
106
  import { resolveStateArtifactPath } from './lib/state-md.mjs';
106
107
  import {
@@ -154,6 +155,11 @@ Options:
154
155
  --max-chars <n> Hard cap on the rendered index body (default: ${LEARNINGS_INDEX_MAX_CHARS}).
155
156
  --pool-size <n> Active entries pulled before ranking (default: ${CANDIDATE_POOL_SIZE}).
156
157
  --learnings <path> Learnings JSONL (default: .orchestrator/metrics/learnings.jsonl).
158
+ --evidence-candidates <path> Opt into a bounded local candidate JSON artifact.
159
+ Requires --source-repo and an exact non-empty --task-text.
160
+ Invalid/unavailable artifacts keep the baseline output;
161
+ provider status/counts go to stderr. No provider is run.
162
+ --source-repo <id> Explicit opaque repo ID bound to the candidate artifact.
157
163
  --rules-dir <path> Natively-delivered rule corpus (default: .claude/rules).
158
164
  Learnings already delivered as a rule file there are
159
165
  excluded from the index (#1019). A path that does not
@@ -208,6 +214,8 @@ try {
208
214
  'max-chars': { type: 'string' },
209
215
  'pool-size': { type: 'string' },
210
216
  learnings: { type: 'string' },
217
+ 'evidence-candidates': { type: 'string' },
218
+ 'source-repo': { type: 'string' },
211
219
  'rules-dir': { type: 'string' },
212
220
  'no-event': { type: 'boolean', default: false },
213
221
  json: { type: 'boolean', default: false },
@@ -219,6 +227,14 @@ try {
219
227
  }
220
228
 
221
229
  const opts = parsed.values;
230
+ if (opts['evidence-candidates'] !== undefined &&
231
+ (!opts['evidence-candidates'] || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/.test(opts['source-repo'] ?? '') ||
232
+ !opts['task-text']?.trim() || opts['task-text'].length > 4000)) {
233
+ fail('--evidence-candidates requires a path, --source-repo ID and non-empty --task-text (at most 4000 characters)', 1);
234
+ }
235
+ if (opts['source-repo'] !== undefined && opts['evidence-candidates'] === undefined) {
236
+ fail('--source-repo requires --evidence-candidates', 1);
237
+ }
222
238
 
223
239
  /**
224
240
  * Parse a `--max-*` value: a non-negative integer. Anything else is a
@@ -249,7 +265,7 @@ const poolSize = parseCap(opts['pool-size'], CANDIDATE_POOL_SIZE, '--pool-size')
249
265
  const repoRoot = findProjectRoot(process.cwd());
250
266
  const learningsPath = opts.learnings
251
267
  ? opts.learnings
252
- : join(repoRoot, '.orchestrator', 'metrics', 'learnings.jsonl');
268
+ : resolveLedgerPath('.orchestrator/metrics/learnings.jsonl', repoRoot); // #1722
253
269
  const eventsPath = eventsFilePath(repoRoot); // #1514 point 1: the repo's one ledger
254
270
  // #1019 — the natively-delivered rule corpus. Every `.claude/rules/*.md` reaches
255
271
  // a dispatched agent in FULL through Claude Code's own project-instruction
@@ -338,7 +354,11 @@ try {
338
354
  selection = await selectLearningsFromFile(
339
355
  learningsPath,
340
356
  { file_paths: scopePaths, text: taskText },
341
- { maxScoped, maxGlobal, maxChars, poolSize, rulesDir },
357
+ { maxScoped, maxGlobal, maxChars, poolSize, rulesDir,
358
+ ...(opts['evidence-candidates'] !== undefined ? {
359
+ evidenceCandidates: opts['evidence-candidates'], sourceRepo: opts['source-repo'],
360
+ } : {}),
361
+ },
342
362
  );
343
363
  } catch (err) {
344
364
  // `selectLearningsFromFile` is contractually total (contract point 1), so this
@@ -350,6 +370,9 @@ try {
350
370
 
351
371
  const selected = selection.entries;
352
372
  const scopeMatched = selection.scopeMatched;
373
+ if (selection.evidence) {
374
+ process.stderr.write(`[evidence-candidates] ${JSON.stringify(selection.evidence)}\n`);
375
+ }
353
376
 
354
377
  // ---------------------------------------------------------------------------
355
378
  // Render — the WRAPPER only; per-entry lines come from the selector
@@ -43,12 +43,15 @@
43
43
  */
44
44
 
45
45
  import { parseArgs } from 'node:util';
46
+ import { existsSync, realpathSync } from 'node:fs';
46
47
  import path from 'node:path';
47
48
 
48
- import { readLockDetailed, loadOwnerProof, release } from './lib/session-lock.mjs';
49
+ import { readLockDetailed, loadOwnerProof, release, writeReleaseMarker } from './lib/session-lock.mjs';
49
50
  import { LOCK_RELEASED_EVENT } from './lib/session-transition.mjs';
50
51
  import { emitEvent } from './lib/events.mjs';
51
52
  import { isMainModule } from './lib/is-main-module.mjs';
53
+ import { registrySessionRoot, resolveOwnLockRootFor } from './lib/own-lock-root.mjs';
54
+ import { dotGitAncestor } from './lib/platform.mjs';
52
55
 
53
56
  /**
54
57
  * `caller` value stamped into the breadcrumb, so this fourth release site stays
@@ -69,18 +72,31 @@ WHAT IT DOES
69
72
  3. Emits orchestrator.session.lock.released with the ids read BEFORE the
70
73
  delete, plus caller="${PHASE_CALLER}".
71
74
  4. RE-READS the lock path and exits 0 only when our lock is provably gone.
75
+ 5. Leaves .orchestrator/runtime/lock-released/<raw-id>.json, so a compaction
76
+ or resume of this session does not re-create the lock (#1651); the
77
+ session's next deliberate acquire() removes it.
72
78
 
73
79
  FLAGS
74
80
  --session-id <id> REQUIRED. The RAW (physical) session id that owns the lock
75
81
  — .orchestrator/session.lock "session_id", never STATE.md
76
82
  "session" and never the semantic id. A lock owned by a
77
83
  different id is NEVER released.
78
- --repo-root <path> Repo whose lock is released (default: cwd).
84
+ --repo-root <path> Repo whose lock is released. Default: the checkout whose
85
+ lock carries --session-id — the host registry's
86
+ session_root, the cwd's checkout, its main checkout, or a
87
+ registered linked worktree, in that order; with none of
88
+ them, the cwd's checkout (#1730). The JSON result names
89
+ the root (repo_root) and how it was found (root_source:
90
+ flag|registry|cwd|main-checkout|worktree|none).
79
91
  --json Machine-readable result on stdout.
80
92
  -h, --help Show this help and exit 0.
81
93
 
82
94
  OUTCOMES
83
95
  absent no lock file — nothing released, NO event, exit 0.
96
+
97
+ Without --repo-root the #1651 marker (absent and released alike) goes to the
98
+ lock's root, the cwd's checkout and the registry's session_root, existing
99
+ checkouts only; release_marker_roots lists each root with its result.
84
100
  deleted our lock was removed and re-read as gone.
85
101
  already-gone ownership matched but the lock had already vanished; the event
86
102
  is still written, because a lock removed by a third party while
@@ -137,6 +153,53 @@ function ourLockIsGone(repoRoot, sessionId) {
137
153
  return false;
138
154
  }
139
155
 
156
+ /** @param {string} p */
157
+ function canonical(p) {
158
+ try { return realpathSync.native(p); } catch { return path.resolve(p); }
159
+ }
160
+
161
+ /**
162
+ * Where the #1651 marker goes (#1730). A later compaction's SessionStart looks
163
+ * for it at `resolveSessionStartRoot`, which depends on THAT compaction's cwd —
164
+ * unknown here. So it goes to every root that reader can land on: the lock's
165
+ * root, the cwd's checkout and the registry's session_root. Only existing
166
+ * checkouts (a `.git` entry): a stale registry entry must not re-create the
167
+ * directory tree of a removed worktree. The marker is keyed on this session's
168
+ * own raw id, so an extra copy changes nothing for another session. With
169
+ * --repo-root the given root alone, as before.
170
+ *
171
+ * @param {{ root: string, source: string }} resolved
172
+ * @param {string} sessionId
173
+ * @returns {string[]}
174
+ */
175
+ function markerRootsFor(resolved, sessionId) {
176
+ if (resolved.source === 'flag') return [resolved.root];
177
+ const cwdTop = dotGitAncestor(process.cwd()) || path.resolve(process.cwd());
178
+ const extra = [cwdTop, registrySessionRoot(sessionId)]
179
+ .filter((r) => typeof r === 'string' && existsSync(path.join(r, '.git')));
180
+ return [...new Set([resolved.root, ...extra].map(canonical))];
181
+ }
182
+
183
+ /**
184
+ * Write the marker at each root; a failed copy is named on stderr and in the
185
+ * result, never hidden behind one that was written.
186
+ *
187
+ * @param {string[]} roots
188
+ * @param {string} sessionId
189
+ * @returns {Array<{ root: string, ok: boolean }>}
190
+ */
191
+ function writeMarkers(roots, sessionId) {
192
+ return roots.map((root) => {
193
+ const marker = writeReleaseMarker({ repoRoot: root, sessionId });
194
+ if (marker.ok !== true) {
195
+ process.stderr.write(
196
+ `release-session-lock: release marker not written at ${root} (${marker.reason}) — a compaction there may re-create the lock\n`,
197
+ );
198
+ }
199
+ return { root, ok: marker.ok === true };
200
+ });
201
+ }
202
+
140
203
  /**
141
204
  * CLI entry point.
142
205
  *
@@ -175,11 +238,20 @@ export async function main({ argv = process.argv.slice(2) } = {}) {
175
238
  return 1;
176
239
  }
177
240
 
178
- const repoRoot = path.resolve(values['repo-root'] ?? process.cwd());
241
+ // #1730: `/close` runs this without --repo-root, and its cwd is often not the
242
+ // checkout holding the lock — a worktree session's lock sits in the main
243
+ // checkout, or the shell cwd reset to the main checkout while the lock is in
244
+ // a worktree. Reading at the cwd answered `absent` with exit 0 and the lock
245
+ // stayed. An explicit --repo-root is taken as given.
246
+ const resolved = values['repo-root'] !== undefined
247
+ ? { root: path.resolve(values['repo-root']), source: 'flag' }
248
+ : resolveOwnLockRootFor({ sessionId, cwd: process.cwd() });
249
+ const repoRoot = resolved.root;
179
250
 
180
251
  const emitResult = async (result) => {
181
- if (values.json) process.stdout.write(JSON.stringify(result, null, 2) + '\n');
182
- else printHuman(result);
252
+ const located = { ...result, repo_root: repoRoot, root_source: resolved.source };
253
+ if (values.json) process.stdout.write(JSON.stringify(located, null, 2) + '\n');
254
+ else printHuman(located);
183
255
  };
184
256
 
185
257
  // -- Step 1: read the lock, and capture the ids BEFORE anything is deleted --
@@ -188,8 +260,14 @@ export async function main({ argv = process.argv.slice(2) } = {}) {
188
260
  if (lockDetail.status === 'absent') {
189
261
  // Nothing was released, so nothing terminal happened: NO event. Writing one
190
262
  // here would put a fictional lifecycle end into the stream — the idempotent
191
- // re-run case is not a release.
192
- const result = { ok: true, outcome: 'absent', verified: true, session_id: sessionId, event_emitted: false };
263
+ // re-run case is not a release. The #1651 marker IS written: a session that
264
+ // closes without a lock (bootstrap fs-error, or an earlier release) must not
265
+ // get one re-created by a later compaction either (roots: markerRootsFor).
266
+ const markers = writeMarkers(markerRootsFor(resolved, sessionId), sessionId);
267
+ const result = {
268
+ ok: true, outcome: 'absent', verified: true, session_id: sessionId, event_emitted: false,
269
+ release_marker: markers.every((m) => m.ok), release_marker_roots: markers,
270
+ };
193
271
  await emitResult(result);
194
272
  return 0;
195
273
  }
@@ -249,6 +327,13 @@ export async function main({ argv = process.argv.slice(2) } = {}) {
249
327
  const verified = ourLockIsGone(repoRoot, sessionId);
250
328
  const outcome = alreadyGone ? 'already-gone' : 'deleted';
251
329
 
330
+ // #1651: leave "released on purpose" behind, so the SessionStart bootstrap
331
+ // does not re-create this lock after a compaction or resume of the same raw
332
+ // session (a headless run may hold the slot by then). Best-effort: a failed
333
+ // marker write is reported, but the release itself stands.
334
+ const markers = verified ? writeMarkers(markerRootsFor(resolved, sessionId), sessionId) : [];
335
+ const markerWritten = verified && markers.every((m) => m.ok);
336
+
252
337
  // -- Step 4: the terminal breadcrumb --------------------------------------
253
338
  // The ids are passed EXPLICITLY: the lock is gone by now, so emitEvent's
254
339
  // lock-derived correlation would find nothing to attribute this record to.
@@ -275,6 +360,8 @@ export async function main({ argv = process.argv.slice(2) } = {}) {
275
360
  ...(semanticSessionId !== null ? { semantic_session_id: semanticSessionId } : {}),
276
361
  event_emitted: eventEmitted,
277
362
  ...(emitError !== null ? { event_error: emitError } : {}),
363
+ release_marker: markerWritten,
364
+ release_marker_roots: markers,
278
365
  };
279
366
  await emitResult(result);
280
367