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
@@ -22,39 +22,13 @@
22
22
  * entry point that is COMPLETELY try/catch-wrapped (never throws) and returns
23
23
  * either `null` (silent no-op) or `{severity:'warn'|'alert', message, ...extra}`.
24
24
  *
25
- * TWO VALIDATORS OVER ONE STORE — why this banner reports both populations.
26
- * The repo has two independent notions of "a valid session record", and
27
- * neither one contains the other:
28
- *
29
- * - `validateSession()` (`scripts/lib/session-schema/validator.mjs`) — the
30
- * canonical write-path schema, enforced by `scripts/emit-session.mjs`.
31
- * It treats `effectiveness` as OPTIONAL/nullable — since #964 declared
32
- * explicitly in `OPTIONAL_FIELDS` (`session-schema/constants.mjs`) rather
33
- * than inferable only from an `if` — so a record vault-mirror refuses to
34
- * render can pass it cleanly.
35
- * - vault-mirror's render path — its own, differently-shaped requirement
36
- * set (`RENDERABLE_SESSION_FIELDS_V1` / `_V2` / `_V3`, exported from
37
- * `scripts/lib/vault-mirror/render-sessions.mjs` and consumed by the
38
- * matching `generateSessionNote*` generator, routed by
39
- * `detectSessionSchema`), which REQUIRES `effectiveness` to be present.
40
- * A record can therefore be schema-valid and still get no vault note.
41
- * Since #964 those lists are module-scope and pinned to the write-path
42
- * schema by a mechanical superset test (v1 ⊇ `REQUIRED_FIELDS`, with
43
- * measured carve-outs for the write-unreachable v2/v3) — so "renderable"
44
- * is now a stated strengthening of "schema-valid" rather than an
45
- * undeclared second opinion. That relationship is exactly why BOTH
46
- * populations still have to be reported: a superset can still exclude.
47
- *
48
- * Reporting one population would hide the other, so the banner names both and
49
- * attributes each to its own consequence.
50
- *
51
- * Live ledger at HEAD 730ee9d (measured 2026-08-03; 205 parseable records,
52
- * 146 of them `status: 'abandoned'`, all 205 routing to the v1 generator):
53
- * `validateSession` fails 0, vault-mirror render fails 10 — and all 10 of
54
- * those are abandoned, i.e. discarded by the #909 filter BEFORE the render
55
- * path (see `mirrorSkipReason` below), so the banner is correctly silent
56
- * here. The counts move as the ledger grows; treat them as a dated
57
- * measurement, never as an invariant — re-run the probe before quoting them.
25
+ * TWO CONTRACTS OVER ONE STORE — the banner reports schema failures and
26
+ * actual mirror failures independently. Effectiveness is optional/nullable in
27
+ * both contracts (#1575); its absence now renders unknown metrics instead of
28
+ * losing a note. Legacy V2/V3 shapes remain outside the canonical writer's
29
+ * schema even when the mirror renders them. A renderer-only failure does not
30
+ * prove the record bypassed the writer, so the remedy must name the observed
31
+ * failure rather than infer its provenance.
58
32
  *
59
33
  * The vault-mirror population is measured by CALLING THE REAL RENDER PATH in
60
34
  * a try/catch — never by re-deriving its required-field list here. A third
@@ -92,6 +66,7 @@
92
66
  import { existsSync, readFileSync } from 'node:fs';
93
67
  import path from 'node:path';
94
68
 
69
+ import { resolveEventsLedgerRoot } from './platform.mjs';
95
70
  import { isRealSession } from './session-schema/filters.mjs';
96
71
  import { validateSession } from './session-schema/validator.mjs';
97
72
  import {
@@ -224,7 +199,9 @@ export function checkSessionsIntegrity({ repoRoot } = {}) {
224
199
  try {
225
200
  if (!repoRoot || typeof repoRoot !== 'string') return null;
226
201
 
227
- const lines = readJsonlLines(path.join(repoRoot, SESSIONS_PATH));
202
+ // #1592: the repo's ONE ledger — the main checkout's for a linked worktree,
203
+ // where every writer appends. The worktree has none since #1584.
204
+ const lines = readJsonlLines(path.join(resolveEventsLedgerRoot(repoRoot), SESSIONS_PATH));
228
205
  if (lines === null || lines.length === 0) return null;
229
206
 
230
207
  /** @type {{line: number, sessionId: string, error: string}[]} */
@@ -284,11 +261,12 @@ export function checkSessionsIntegrity({ repoRoot } = {}) {
284
261
  );
285
262
  }
286
263
 
287
- const base =
288
- `sessions-integrity: ${parts.join('; ')} — records were appended without passing ` +
289
- `scripts/emit-session.mjs (which validates and would have refused). ` +
290
- `Inspect: node -e with validateSession from scripts/lib/session-schema/validator.mjs; ` +
291
- `re-emit affected records via scripts/emit-session.mjs`;
264
+ const remedy = schemaInvalid.length > 0
265
+ ? 'Inspect schema-invalid records with validateSession; preview repairs with ' +
266
+ 'node scripts/repair-invalid-sessions.mjs --dry-run; absolute --apply requires ' +
267
+ 'an explicit --repo-root equal to the canonical current Git top-level (no trailing slash or ..)'
268
+ : 'Inspect the reported vault-mirror rendering errors; schema-valid records need no schema repair';
269
+ const base = `sessions-integrity: ${parts.join('; ')} — ${remedy}`;
292
270
 
293
271
  const message = severity === 'alert' ? `🚨 ${base}.` : `⚠ ${base}.`;
294
272
 
@@ -146,7 +146,8 @@ import path from 'node:path';
146
146
  import { eventsFilePath } from './events.mjs';
147
147
  import { readLock, DEFAULT_TTL_HOURS } from './session-lock.mjs';
148
148
  import { isRealSession } from './session-schema/filters.mjs';
149
- import { readCanonicalSessions } from './sessions-canonical.mjs';
149
+ import { isMeasuredSession, readCanonicalSessions } from './sessions-canonical.mjs';
150
+ import { resolveEventsLedgerRoot } from './platform.mjs';
150
151
 
151
152
  /** Repo-relative path to the session ledger (one record per closed session). */
152
153
  const SESSIONS_PATH = '.orchestrator/metrics/sessions.jsonl';
@@ -238,11 +239,12 @@ function readJsonlLines(filePath) {
238
239
  }
239
240
 
240
241
  /**
241
- * True when a `sessions.jsonl` record is a backfill STUB — a reconstruction
242
- * whose `completed_at` is never an anchor candidate (module header,
242
+ * True when a `sessions.jsonl` record cannot supply a measured completion —
243
+ * unmeasured records retain only their `started_at` activity anchor (module header,
243
244
  * "Backfill-stub self-erasure fix").
244
245
  *
245
- * `isRealSession()` (`./session-schema/filters.mjs`) catches `status:
246
+ * `isMeasuredSession()` supplies the shared measured population. The legacy
247
+ * anchor rule also catches `status:
246
248
  * 'abandoned'`, the canonical phantom marker. A `_backfill_source` counts only
247
249
  * when the status is not `completed`: the `state-md-completed` supersede record
248
250
  * is the session's own completion claim. Same exclusion as
@@ -259,6 +261,7 @@ function readJsonlLines(filePath) {
259
261
  * @returns {boolean}
260
262
  */
261
263
  function isNonAnchorStub(record) {
264
+ if (!isMeasuredSession(record)) return true;
262
265
  if (!isRealSession(record)) return true;
263
266
  return typeof record._backfill_source === 'string' && record._backfill_source.length > 0
264
267
  && record.status !== 'completed';
@@ -515,7 +518,7 @@ export function checkSessionsStaleness({ repoRoot, now = Date.now() } = {}) {
515
518
 
516
519
  const nowMs = typeof now === 'number' && Number.isFinite(now) ? now : Date.now();
517
520
 
518
- const sessionsPath = path.join(repoRoot, SESSIONS_PATH);
521
+ const sessionsPath = path.join(resolveEventsLedgerRoot(repoRoot), SESSIONS_PATH);
519
522
  const sessionLines = readJsonlLines(sessionsPath);
520
523
  if (sessionLines === null || sessionLines.length === 0) return null;
521
524
 
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * sh-quote.mjs — the one POSIX shell-quoting helper (#1438).
3
+ * POSIX-only: this helper does not quote cmd.exe commands.
3
4
  *
4
5
  * Four byte-identical private copies (cursor-install, tmux-layout/layouts,
5
6
  * tmux-layout/tmux-shell, run-quality-gate) and one inline copy
@@ -53,6 +53,7 @@ import { join } from 'node:path';
53
53
  import { createInterface } from 'node:readline';
54
54
 
55
55
  import { readLock, isLockLive } from './session-lock.mjs';
56
+ import { readProcessLocalSessionIds } from './session-identity/own-session.mjs';
56
57
 
57
58
  // ---------------------------------------------------------------------------
58
59
  // Constants (every ceiling named, per .claude/rules/build-value.md BV-004)
@@ -693,7 +694,10 @@ export function resolveRawSessionId({ repoRoot, env = process.env } = {}) {
693
694
  }
694
695
  if (!lock || !isLockLive(lock)) return null;
695
696
  const fromLock = typeof lock.session_id === 'string' ? lock.session_id.trim() : '';
696
- return fromLock ? { sessionId: fromLock, source: 'session.lock' } : null;
697
+ // The repo-global lock may name a PEER (#1664, class #1663): count it only
698
+ // when it is among this process's own ids, never as a bare fallback.
699
+ if (!fromLock || !readProcessLocalSessionIds({ env }).includes(fromLock)) return null;
700
+ return { sessionId: fromLock, source: 'session.lock' };
697
701
  }
698
702
 
699
703
  /**
@@ -34,17 +34,17 @@ import { promises as fs } from 'node:fs';
34
34
  import path from 'node:path';
35
35
  import { fileURLToPath } from 'node:url';
36
36
 
37
- import { isRealSession } from '../session-schema/filters.mjs';
38
- import { readCanonicalSessions } from '../sessions-canonical.mjs';
37
+ import { isMeasuredSession, readCanonicalSessions } from '../sessions-canonical.mjs';
38
+ import { resolveEventsLedgerRoot } from '../platform.mjs';
39
39
 
40
40
  const DEFAULT_INVOCATIONS_PATH = path.resolve(
41
41
  fileURLToPath(import.meta.url),
42
42
  '../../../../.orchestrator/metrics/skill-invocations.jsonl',
43
43
  );
44
44
 
45
- const DEFAULT_SESSIONS_PATH = path.resolve(
46
- fileURLToPath(import.meta.url),
47
- '../../../../.orchestrator/metrics/sessions.jsonl',
45
+ const DEFAULT_SESSIONS_PATH = path.join(
46
+ resolveEventsLedgerRoot(fileURLToPath(new URL('../../../', import.meta.url))),
47
+ '.orchestrator', 'metrics', 'sessions.jsonl',
48
48
  );
49
49
 
50
50
  /**
@@ -78,8 +78,8 @@ async function readJsonl(filePath) {
78
78
  /**
79
79
  * Builds a Map<session_id, { agentSummary, real }> from sessions.jsonl records.
80
80
  * Records without a session_id or with a non-object agent_summary are skipped.
81
- * `real` is false for phantom `status: 'abandoned'` stubs (#834) — callers use
82
- * it to route the join to the `abandoned` outcome bucket instead of counting
81
+ * `real` uses the shared measured-session definition (#1584) — callers use
82
+ * it to route unmeasured joins to the legacy `abandoned` outcome bucket instead of counting
83
83
  * a zero-signal join as `sessionsJoined`.
84
84
  *
85
85
  * Callers pass `sessionRecords` from `readCanonicalSessions()` (#1209b) — one
@@ -99,7 +99,7 @@ function buildSessionMap(sessionRecords) {
99
99
  for (const rec of sessionRecords) {
100
100
  if (typeof rec.session_id !== 'string' || !rec.session_id) continue;
101
101
  if (rec.agent_summary && typeof rec.agent_summary === 'object') {
102
- map.set(rec.session_id, { agentSummary: rec.agent_summary, real: isRealSession(rec) });
102
+ map.set(rec.session_id, { agentSummary: rec.agent_summary, real: isMeasuredSession(rec) });
103
103
  }
104
104
  }
105
105
  return map;
@@ -186,9 +186,10 @@ export async function joinSkillOutcomes({
186
186
  record.outcomes.spiral += typeof summary.spiral === 'number' ? summary.spiral : 0;
187
187
  sessionsJoined += 1;
188
188
  } else if (entry && !entry.real) {
189
- // Found in sessions.jsonl but a phantom abandoned stub (#834) — a
189
+ // Found in sessions.jsonl but unmeasured (#1584) — a
190
190
  // zero-signal join. Route to a distinct bucket instead of inflating
191
191
  // sessionsJoined or conflating with "not found at all" (unknown).
192
+ // Keep the legacy output keys; this bucket includes completed synthetic stubs.
192
193
  record.outcomes.abandoned += 1;
193
194
  sessionsAbandoned += 1;
194
195
  } else {
@@ -22,6 +22,7 @@
22
22
  import { readFile, appendFile, mkdir } from 'node:fs/promises';
23
23
  import { existsSync } from 'node:fs';
24
24
  import path from 'node:path';
25
+ import { resolveLedgerPath } from './ledger-path.mjs';
25
26
 
26
27
  // ---------------------------------------------------------------------------
27
28
  // Constants
@@ -36,6 +37,18 @@ export const VALID_EVENTS = Object.freeze(['selected']);
36
37
  /** Default JSONL path for skill invocation records. */
37
38
  export const DEFAULT_SKILL_INVOCATIONS_PATH = '.orchestrator/metrics/skill-invocations.jsonl';
38
39
 
40
+ /**
41
+ * Absolute path of the skill-invocations ledger for a writer or reader rooted
42
+ * at `root` (#1722): the main checkout's copy when `root` is a linked worktree
43
+ * of a repo that ignores the ledger, otherwise `<root>/` + the default path.
44
+ *
45
+ * @param {string} [root] repo root; default `getProjectDir()`
46
+ * @returns {string}
47
+ */
48
+ export function defaultSkillInvocationsPath(root) {
49
+ return resolveLedgerPath(DEFAULT_SKILL_INVOCATIONS_PATH, root);
50
+ }
51
+
39
52
  // ---------------------------------------------------------------------------
40
53
  // ValidationError
41
54
  // ---------------------------------------------------------------------------
@@ -29,6 +29,7 @@
29
29
  import { readFile, appendFile, mkdir } from 'node:fs/promises';
30
30
  import { existsSync } from 'node:fs';
31
31
  import path from 'node:path';
32
+ import { resolveLedgerPath } from './ledger-path.mjs';
32
33
 
33
34
  // ---------------------------------------------------------------------------
34
35
  // Constants
@@ -215,7 +216,10 @@ export function normalizeSkillJudgment(entry) {
215
216
  * @returns {Promise<object>} the validated + normalized entry that was written
216
217
  * @throws {ValidationError} when the entry fails schema validation
217
218
  */
218
- export async function appendSkillJudgment(record, { path: filePath = DEFAULT_SKILL_JUDGMENTS_PATH } = {}) {
219
+ export async function appendSkillJudgment(
220
+ record,
221
+ { path: filePath = resolveLedgerPath(DEFAULT_SKILL_JUDGMENTS_PATH, process.cwd()) } = {},
222
+ ) {
219
223
  const stamped = {
220
224
  ...record,
221
225
  schema_version: record?.schema_version ?? CURRENT_SCHEMA_VERSION,
@@ -241,7 +245,7 @@ export async function appendSkillJudgment(record, { path: filePath = DEFAULT_SKI
241
245
  * @param {string} [filePath] — absolute path to target .jsonl file
242
246
  * @returns {Promise<object[]>} array of normalized skill-judgment records
243
247
  */
244
- export async function readSkillJudgments(filePath = DEFAULT_SKILL_JUDGMENTS_PATH) {
248
+ export async function readSkillJudgments(filePath = resolveLedgerPath(DEFAULT_SKILL_JUDGMENTS_PATH, process.cwd())) {
245
249
  if (!existsSync(filePath)) return [];
246
250
  let raw;
247
251
  try {