session-orchestrator 3.23.0 → 4.0.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 (393) hide show
  1. package/.agents/skills/architecture/SKILL.md +18 -0
  2. package/.agents/skills/autopilot/SKILL.md +17 -0
  3. package/.agents/skills/bootstrap/SKILL.md +20 -0
  4. package/.agents/skills/brainstorm/SKILL.md +22 -0
  5. package/.agents/skills/claude-md-drift-check/SKILL.md +15 -0
  6. package/.agents/skills/convergence-monitoring/SKILL.md +22 -0
  7. package/.agents/skills/debug/SKILL.md +22 -0
  8. package/.agents/skills/discovery/SKILL.md +20 -0
  9. package/.agents/skills/dispatcher/SKILL.md +15 -0
  10. package/.agents/skills/docs-orchestrator/SKILL.md +18 -0
  11. package/.agents/skills/ecosystem-health/SKILL.md +20 -0
  12. package/.agents/skills/eli5/SKILL.md +20 -0
  13. package/.agents/skills/eval/SKILL.md +21 -0
  14. package/.agents/skills/evolve/SKILL.md +21 -0
  15. package/.agents/skills/frontmatter-guard/SKILL.md +15 -0
  16. package/.agents/skills/gitlab-ops/SKILL.md +20 -0
  17. package/.agents/skills/gitlab-portfolio/SKILL.md +15 -0
  18. package/.agents/skills/grill/SKILL.md +22 -0
  19. package/.agents/skills/hook-development/SKILL.md +15 -0
  20. package/.agents/skills/mcp-builder/SKILL.md +15 -0
  21. package/.agents/skills/memory-cleanup/SKILL.md +21 -0
  22. package/.agents/skills/mode-selector/SKILL.md +17 -0
  23. package/.agents/skills/npm-publish/SKILL.md +16 -0
  24. package/.agents/skills/peekaboo-driver/SKILL.md +18 -0
  25. package/.agents/skills/persona-panel/SKILL.md +17 -0
  26. package/.agents/skills/plan/SKILL.md +20 -0
  27. package/.agents/skills/playwright-driver/SKILL.md +20 -0
  28. package/.agents/skills/quality-gates/SKILL.md +20 -0
  29. package/.agents/skills/reconcile/SKILL.md +21 -0
  30. package/.agents/skills/remote-offload/SKILL.md +20 -0
  31. package/.agents/skills/repo-audit/SKILL.md +16 -0
  32. package/.agents/skills/session-end/SKILL.md +20 -0
  33. package/.agents/skills/session-plan/SKILL.md +20 -0
  34. package/.agents/skills/session-start/SKILL.md +20 -0
  35. package/.agents/skills/spinout/SKILL.md +16 -0
  36. package/.agents/skills/sunset-review/SKILL.md +16 -0
  37. package/.agents/skills/test-runner/SKILL.md +20 -0
  38. package/.agents/skills/tmux-layout/SKILL.md +21 -0
  39. package/.agents/skills/using-orchestrator/SKILL.md +17 -0
  40. package/.agents/skills/vault-mirror/SKILL.md +15 -0
  41. package/.agents/skills/vault-sync/SKILL.md +15 -0
  42. package/.agents/skills/wave-executor/SKILL.md +20 -0
  43. package/.agents/skills/write-executable-plan/SKILL.md +22 -0
  44. package/.claude-plugin/marketplace.json +1 -1
  45. package/.claude-plugin/plugin.json +1 -1
  46. package/.codex-plugin/plugin.json +1 -1
  47. package/.cursor/commands/autopilot.md +2 -2
  48. package/.cursor/commands/bootstrap.md +1 -1
  49. package/.cursor/commands/brainstorm.md +1 -1
  50. package/.cursor/commands/debug.md +1 -1
  51. package/.cursor/commands/discovery.md +1 -1
  52. package/.cursor/commands/dispatcher.md +2 -2
  53. package/.cursor/commands/eli5.md +2 -2
  54. package/.cursor/commands/eval.md +2 -2
  55. package/.cursor/commands/evolve.md +1 -1
  56. package/.cursor/commands/go.md +1 -1
  57. package/.cursor/commands/grill.md +2 -2
  58. package/.cursor/commands/memory-cleanup.md +2 -2
  59. package/.cursor/commands/persona-panel.md +1 -1
  60. package/.cursor/commands/plan.md +1 -1
  61. package/.cursor/commands/portfolio.md +1 -1
  62. package/.cursor/commands/reconcile.md +2 -2
  63. package/.cursor/commands/release.md +2 -2
  64. package/.cursor/commands/session.md +2 -2
  65. package/.cursor/commands/spinout.md +2 -2
  66. package/.cursor/commands/sunset-review.md +2 -2
  67. package/.cursor/commands/templates-ack.md +2 -2
  68. package/.cursor/commands/test.md +2 -2
  69. package/.cursor/skills/brainstorm/SKILL.md +1 -1
  70. package/.cursor/skills/eval/SKILL.md +1 -1
  71. package/.cursor/skills/quality-gates/SKILL.md +1 -1
  72. package/.cursor/skills/remote-offload/SKILL.md +13 -0
  73. package/.orchestrator/policy/blocked-commands.json +121 -0
  74. package/.orchestrator/policy/ecosystem.schema.json +66 -0
  75. package/.orchestrator/policy/quality-gates.example.json +16 -0
  76. package/.orchestrator/policy/quality-gates.schema.json +38 -0
  77. package/.orchestrator/policy/templates-policy.json +27 -0
  78. package/.orchestrator/policy/test-profiles.json +47 -0
  79. package/AGENTS.md +225 -0
  80. package/CHANGELOG.md +1401 -0
  81. package/NOTICE +11 -6
  82. package/README.md +127 -92
  83. package/agents/db-specialist.md +0 -1
  84. package/agents/eval-judge.md +1 -1
  85. package/agents/skill-applied-judge.md +1 -1
  86. package/assets/wave-lifecycle.svg +98 -0
  87. package/commands/release.md +6 -3
  88. package/commands/session.md +18 -3
  89. package/docs/README.md +4 -0
  90. package/{agents/AGENTS.md → docs/agent-authoring.md} +19 -26
  91. package/docs/baseline.md +67 -0
  92. package/docs/ci-setup.md +249 -48
  93. package/docs/codex-setup.md +66 -22
  94. package/docs/components.md +37 -16
  95. package/docs/cursor-setup.md +6 -2
  96. package/docs/events-schema.md +51 -10
  97. package/docs/instruction-delivery.md +62 -0
  98. package/{agents/memory-proposal-collector.md → docs/memory-proposal-flow.md} +1 -8
  99. package/docs/migration-v4.md +341 -0
  100. package/docs/pi-setup.md +6 -1
  101. package/docs/plugin-architecture-v3.md +1 -1
  102. package/docs/rule-authoring.md +85 -19
  103. package/docs/scope-collision-guard.md +8 -8
  104. package/docs/session-config-reference.md +120 -61
  105. package/docs/session-config-template.md +40 -33
  106. package/docs/telemetry/telemetry-claims.md +11 -10
  107. package/docs/telemetry.md +187 -4
  108. package/docs/vault-docs-architecture.md +50 -11
  109. package/hooks/_lib/atomic-json.mjs +111 -0
  110. package/hooks/_lib/hook-import-set.json +1487 -0
  111. package/hooks/_lib/subagent-paths.mjs +143 -0
  112. package/hooks/_lib/subagent-transcript.mjs +562 -0
  113. package/hooks/config-protection.mjs +2 -2
  114. package/hooks/cwd-change-restore.mjs +11 -31
  115. package/hooks/enforce-commands.mjs +69 -0
  116. package/hooks/enforce-scope.mjs +35 -6
  117. package/hooks/hooks-codex.json +1 -1
  118. package/hooks/hooks-cursor.json +10 -0
  119. package/hooks/hooks-pi.json +5 -0
  120. package/hooks/hooks.json +6 -1
  121. package/hooks/loop-guard.mjs +3 -3
  122. package/hooks/on-session-end.mjs +280 -14
  123. package/hooks/on-session-start.mjs +153 -4
  124. package/hooks/on-stop.mjs +371 -17
  125. package/hooks/operator-steer.mjs +2 -2
  126. package/hooks/post-bash-write-verify.mjs +189 -4
  127. package/hooks/post-edit-import-probe.mjs +344 -0
  128. package/hooks/post-subagent-discovery-validator.mjs +278 -392
  129. package/hooks/post-tool-batch-wave-signal.mjs +272 -44
  130. package/hooks/post-tool-failure-corrective-context.mjs +11 -34
  131. package/hooks/post-tooluse-frontend-slop.mjs +3 -3
  132. package/hooks/pre-bash-destructive-guard.mjs +39 -13
  133. package/hooks/pre-bash-memory-propose-audit.mjs +13 -7
  134. package/hooks/skill-invocation-telemetry.mjs +17 -5
  135. package/hooks/subagent-telemetry.mjs +24 -30
  136. package/monitors/monitors.json +3 -3
  137. package/package.json +9 -1
  138. package/pi/prompts/session.md +2 -2
  139. package/plugin.json +27 -0
  140. package/scripts/autopilot.mjs +26 -12
  141. package/scripts/backfill-abandoned-sessions.mjs +130 -15
  142. package/scripts/backfill-learnings-from-vault.mjs +9 -3
  143. package/scripts/dialectic-deriver.mjs +73 -8
  144. package/scripts/emit-event.mjs +10 -2
  145. package/scripts/export-hw-learnings.mjs +113 -1
  146. package/scripts/generate-agents-skills.mjs +378 -0
  147. package/scripts/generate-cursor-adapter.mjs +45 -8
  148. package/scripts/generate-hook-import-set.mjs +249 -0
  149. package/scripts/lib/agent-status.mjs +13 -2
  150. package/scripts/lib/auq/parse.mjs +5 -29
  151. package/scripts/lib/auto-dialectic.mjs +68 -0
  152. package/scripts/lib/auto-dream.mjs +38 -36
  153. package/scripts/lib/autonomy/suitability.mjs +6 -0
  154. package/scripts/lib/autopilot/loop.mjs +2 -2
  155. package/scripts/lib/autopilot/worktree-pipeline.mjs +82 -6
  156. package/scripts/lib/build-live-signals.mjs +25 -22
  157. package/scripts/lib/ci-status-banner.mjs +220 -75
  158. package/scripts/lib/codex/plugin-contract.mjs +82 -6
  159. package/scripts/lib/cold-start-detector.mjs +23 -14
  160. package/scripts/lib/config/auto-dream.mjs +2 -1
  161. package/scripts/lib/config/block-header.mjs +63 -0
  162. package/scripts/lib/config/block-preprocess.mjs +177 -0
  163. package/scripts/lib/config/broken-window.mjs +2 -1
  164. package/scripts/lib/config/cold-start.mjs +2 -1
  165. package/scripts/lib/config/config-protection.mjs +22 -2
  166. package/scripts/lib/config/context-coverage.mjs +2 -1
  167. package/scripts/lib/config/cross-repo.mjs +2 -1
  168. package/scripts/lib/config/custom-phases.mjs +2 -1
  169. package/scripts/lib/config/dialectic.mjs +2 -1
  170. package/scripts/lib/config/discovery-validator.mjs +9 -3
  171. package/scripts/lib/config/dispatcher-autonomy-capture.mjs +24 -1
  172. package/scripts/lib/config/dispatcher-autonomy.mjs +2 -1
  173. package/scripts/lib/config/docs-orchestrator.mjs +2 -1
  174. package/scripts/lib/config/docs-staleness.mjs +2 -1
  175. package/scripts/lib/config/drift-check.mjs +2 -1
  176. package/scripts/lib/config/eval.mjs +2 -1
  177. package/scripts/lib/config/events-rotation.mjs +2 -1
  178. package/scripts/lib/config/evolve.mjs +8 -2
  179. package/scripts/lib/config/frontend-slop-hook.mjs +7 -3
  180. package/scripts/lib/config/gitlab-portfolio.mjs +2 -1
  181. package/scripts/lib/config/handover-gate.mjs +2 -1
  182. package/scripts/lib/config/health-endpoints.mjs +388 -0
  183. package/scripts/lib/config/issue-budget.mjs +2 -1
  184. package/scripts/lib/config/loop-guard.mjs +2 -1
  185. package/scripts/lib/config/memory.mjs +2 -1
  186. package/scripts/lib/config/moc-staleness.mjs +2 -1
  187. package/scripts/lib/config/persona-gate-wave.mjs +2 -1
  188. package/scripts/lib/config/private-config-dir.mjs +67 -0
  189. package/scripts/lib/config/reconcile.mjs +2 -1
  190. package/scripts/lib/config/remote-hosts.mjs +234 -0
  191. package/scripts/lib/config/section-extractor.mjs +7 -1
  192. package/scripts/lib/config/skill-evolution.mjs +2 -1
  193. package/scripts/lib/config/slopcheck.mjs +2 -1
  194. package/scripts/lib/config/state-md-lock.mjs +2 -1
  195. package/scripts/lib/config/templates-first.mjs +2 -1
  196. package/scripts/lib/config/test.mjs +2 -1
  197. package/scripts/lib/config/vault-integration.mjs +7 -1
  198. package/scripts/lib/config/vault-mirror-quality.mjs +2 -1
  199. package/scripts/lib/config/vault-staleness.mjs +2 -1
  200. package/scripts/lib/config/vault-sync.mjs +2 -1
  201. package/scripts/lib/config/verification-auto-fix.mjs +2 -1
  202. package/scripts/lib/config/wave-reviewers.mjs +2 -1
  203. package/scripts/lib/config/worktree-orphans.mjs +2 -1
  204. package/scripts/lib/config.mjs +31 -3
  205. package/scripts/lib/convergence-monitor.mjs +82 -16
  206. package/scripts/lib/dispatcher/enumerate.mjs +2 -17
  207. package/scripts/lib/dispatcher/rank.mjs +124 -48
  208. package/scripts/lib/ecosystem-health.mjs +16 -2
  209. package/scripts/lib/eval/engine.mjs +9 -1
  210. package/scripts/lib/eval/session-resolve.mjs +23 -4
  211. package/scripts/lib/events-schema.mjs +48 -0
  212. package/scripts/lib/events.mjs +256 -7
  213. package/scripts/lib/evolve/autonomy-verdict.mjs +9 -4
  214. package/scripts/lib/evolve/autopilot-effectiveness.mjs +18 -1
  215. package/scripts/lib/frontmatter-guard.mjs +131 -13
  216. package/scripts/lib/gates/gate-full.mjs +26 -0
  217. package/scripts/lib/gates/gate-helpers.mjs +76 -0
  218. package/scripts/lib/gitlab-portfolio/cli.mjs +3 -15
  219. package/scripts/lib/hardware-pattern-detector.mjs +18 -1
  220. package/scripts/lib/harness-audit/categories/category1.mjs +17 -6
  221. package/scripts/lib/harness-audit/categories/category4.mjs +31 -11
  222. package/scripts/lib/host-identity.mjs +50 -11
  223. package/scripts/lib/instruction-budget-guard.mjs +171 -5
  224. package/scripts/lib/learnings/evolve-telemetry.mjs +178 -0
  225. package/scripts/lib/learnings/io.mjs +60 -6
  226. package/scripts/lib/memory-banner.mjs +20 -8
  227. package/scripts/lib/memory-proposals/store.mjs +30 -22
  228. package/scripts/lib/owner-config-banner.mjs +43 -6
  229. package/scripts/lib/owner-config-loader.mjs +21 -10
  230. package/scripts/lib/owner-interview.mjs +3 -3
  231. package/scripts/lib/owner-yaml.mjs +207 -14
  232. package/scripts/lib/peer-discovery.mjs +20 -2
  233. package/scripts/lib/platform.mjs +108 -15
  234. package/scripts/lib/plugin-update-banner.mjs +406 -0
  235. package/scripts/lib/project-hygiene.mjs +38 -2
  236. package/scripts/lib/qg-command-drift-banner.mjs +50 -12
  237. package/scripts/lib/quality-gate.mjs +133 -44
  238. package/scripts/lib/reconcile/emitter.mjs +68 -6
  239. package/scripts/lib/reconcile/engine.mjs +249 -9
  240. package/scripts/lib/reconcile/idempotency.mjs +37 -4
  241. package/scripts/lib/reconcile/writer.mjs +40 -18
  242. package/scripts/lib/scope-gate.mjs +36 -0
  243. package/scripts/lib/session-close-backfill.mjs +125 -18
  244. package/scripts/lib/session-discovery.mjs +57 -3
  245. package/scripts/lib/session-end/phase-skip.mjs +2 -2
  246. package/scripts/lib/session-id.mjs +12 -23
  247. package/scripts/lib/session-identity/own-session.mjs +187 -11
  248. package/scripts/lib/session-lock-shape.mjs +43 -0
  249. package/scripts/lib/session-lock.mjs +5 -10
  250. package/scripts/lib/session-registry.mjs +25 -9
  251. package/scripts/lib/session-schema/constants.mjs +36 -2
  252. package/scripts/lib/session-schema/validator.mjs +38 -4
  253. package/scripts/lib/session-start-probes.mjs +18 -1
  254. package/scripts/lib/session-transition.mjs +1 -1
  255. package/scripts/lib/sessions-canonical.mjs +446 -0
  256. package/scripts/lib/sessions-staleness-banner.mjs +18 -11
  257. package/scripts/lib/skill-health/join.mjs +17 -4
  258. package/scripts/lib/state-md.mjs +78 -0
  259. package/scripts/lib/sunset/walker.mjs +6 -0
  260. package/scripts/lib/telemetry/schema.mjs +255 -17
  261. package/scripts/lib/telemetry/sync.mjs +417 -24
  262. package/scripts/lib/tmux-layout/telemetry.mjs +14 -2
  263. package/scripts/lib/validate/check-agents-skills.mjs +327 -0
  264. package/scripts/lib/validate/check-agents.mjs +3 -3
  265. package/scripts/lib/validate/check-cursor-adapter.mjs +234 -72
  266. package/scripts/lib/validate/check-doc-cli-commands.mjs +9 -33
  267. package/scripts/lib/validate/check-hooks-emit-event-guard.mjs +370 -0
  268. package/scripts/lib/validate/check-hooks-symmetry.mjs +45 -16
  269. package/scripts/lib/validate/check-owner-leakage.mjs +281 -20
  270. package/scripts/lib/validate/check-skill-links.mjs +163 -0
  271. package/scripts/lib/validate/check-skill-script-paths.mjs +455 -0
  272. package/scripts/lib/validate/check-untracked-test-deps.mjs +10 -0
  273. package/scripts/lib/validate/check-unwired-features.mjs +0 -9
  274. package/scripts/lib/validate/check-validator-registration.mjs +254 -0
  275. package/scripts/lib/validate/check-vcs-repo-flag.mjs +6 -28
  276. package/scripts/lib/validate/enumerate-repo-files.mjs +317 -0
  277. package/scripts/lib/validate/markdown-fences.mjs +196 -0
  278. package/scripts/lib/vault-backfill/template.mjs +63 -6
  279. package/scripts/lib/vault-mirror/process.mjs +165 -42
  280. package/scripts/lib/vault-mirror/telemetry.mjs +2 -2
  281. package/scripts/lib/vault-status/board-lock.mjs +185 -0
  282. package/scripts/lib/vault-status/board-writer.mjs +174 -135
  283. package/scripts/lib/vault-status/narrative-mirror.mjs +129 -37
  284. package/scripts/lib/wave-executor/dispatch-common.mjs +164 -0
  285. package/scripts/lib/wave-executor/foreign-dispatch.mjs +7 -142
  286. package/scripts/lib/wave-executor/remote-dispatch.mjs +502 -0
  287. package/scripts/lib/wave-resource-gate.mjs +133 -7
  288. package/scripts/lib/wave-sizing.mjs +4 -1
  289. package/scripts/lib/wave-transcript-tail.mjs +142 -8
  290. package/scripts/materialize-wave-scope.mjs +32 -9
  291. package/scripts/memory-propose.mjs +146 -8
  292. package/scripts/migrate-cold-start-seed.mjs +4 -1
  293. package/scripts/parse-config.mjs +60 -3
  294. package/scripts/promote-vault-strict.mjs +4 -15
  295. package/scripts/release.mjs +337 -29
  296. package/scripts/repair-invalid-sessions.mjs +3 -3
  297. package/scripts/run-quality-gate.mjs +128 -11
  298. package/scripts/site-numbers.mjs +36 -4
  299. package/scripts/sweep-expired-learnings.mjs +90 -0
  300. package/scripts/sync-vault-schema.mjs +3 -1
  301. package/scripts/telemetry.mjs +2 -2
  302. package/scripts/validate-plugin.mjs +187 -0
  303. package/scripts/validate-wave-scope.mjs +28 -8
  304. package/scripts/vault-consolidate.mjs +3 -11
  305. package/scripts/vault-integration-watcher.mjs +2 -4
  306. package/scripts/vault-mirror.mjs +111 -26
  307. package/scripts/wave-scope-binding.mjs +215 -0
  308. package/skills/_shared/instruction-file-resolution.md +10 -0
  309. package/skills/_shared/parallel-aware-auq.md +31 -2
  310. package/skills/_shared/parallel-aware-preamble.md +18 -4
  311. package/skills/_shared/platform-tools.md +1 -1
  312. package/skills/_shared/state-ownership.md +1 -1
  313. package/skills/architecture/SKILL.md +7 -5
  314. package/skills/{domain-model/SKILL.md → architecture/references/domain-model.md} +9 -9
  315. package/skills/autopilot/SKILL.md +4 -18
  316. package/skills/claude-md-drift-check/SKILL.md +5 -1
  317. package/skills/claude-md-drift-check/checker.mjs +62 -2
  318. package/skills/convergence-monitoring/SIGNALS.md +55 -0
  319. package/skills/discovery/probes/vault-staleness.mjs +37 -13
  320. package/skills/discovery/probes-arch.md +20 -18
  321. package/skills/dispatcher/SKILL.md +3 -2
  322. package/skills/ecosystem-health/SKILL.md +4 -1
  323. package/skills/ecosystem-health/wizard.md +5 -0
  324. package/skills/evolve/SKILL.md +87 -11
  325. package/skills/frontmatter-guard/SKILL.md +11 -5
  326. package/skills/npm-publish/SKILL.md +1 -1
  327. package/skills/reconcile/SKILL.md +38 -2
  328. package/skills/remote-offload/SKILL.md +89 -0
  329. package/skills/session-end/SKILL.md +18 -905
  330. package/skills/session-end/phase-3-6-tail.md +19 -9
  331. package/skills/session-end/plan-verification.md +221 -155
  332. package/skills/session-end/references/phase-2-quality-gate.md +93 -0
  333. package/skills/session-end/references/phase-3-documentation-updates.md +229 -0
  334. package/skills/session-end/references/phase-4a-worktree-cleanup.md +120 -0
  335. package/skills/session-end/references/phase-4b-worktree-orphan-sweep.md +58 -0
  336. package/skills/session-end/references/phase-5-issue-cleanup.md +104 -0
  337. package/skills/session-end/references/session-summary-template.md +62 -0
  338. package/skills/session-plan/SKILL.md +49 -0
  339. package/skills/session-start/SKILL.md +41 -900
  340. package/skills/session-start/phase-8-5-express-path.md +1 -1
  341. package/skills/session-start/references/phase-1-1-dispatcher-autonomy-capture.md +55 -0
  342. package/skills/session-start/references/phase-1-2-session-lock.md +140 -0
  343. package/skills/session-start/references/phase-1-5-session-continuity.md +254 -0
  344. package/skills/session-start/references/phase-1-7-vault-status-board.md +53 -0
  345. package/skills/session-start/references/phase-2-7-portfolio-snapshot.md +75 -0
  346. package/skills/session-start/references/phase-4-ssot-environment-check.md +155 -0
  347. package/skills/session-start/references/phase-6-5-forced-reads.md +75 -0
  348. package/skills/session-start/references/phase-6-6-project-intelligence.md +81 -0
  349. package/skills/session-start/references/phase-6-7-memory-banner-telemetry-consent.md +103 -0
  350. package/skills/vault-sync/validator.mjs +21 -27
  351. package/skills/wave-executor/SKILL.md +16 -2
  352. package/skills/wave-executor/references/wave-loop-dispatch.md +612 -0
  353. package/skills/wave-executor/references/wave-loop-review.md +570 -0
  354. package/skills/wave-executor/references/wave-loop-scope-manifest.md +162 -0
  355. package/skills/wave-executor/wave-loop.md +14 -1271
  356. package/templates/_shared/journey-manifest.md +10 -6
  357. package/.cursor/commands/autopilot-multi.md +0 -14
  358. package/.cursor/commands/contract-version-bump.md +0 -14
  359. package/.cursor/commands/journey-audit.md +0 -14
  360. package/.cursor/skills/contract-version-bump/SKILL.md +0 -12
  361. package/.cursor/skills/daily/SKILL.md +0 -12
  362. package/.cursor/skills/domain-model/SKILL.md +0 -13
  363. package/.cursor/skills/journey-audit/SKILL.md +0 -13
  364. package/.cursor/skills/skill-creator/SKILL.md +0 -13
  365. package/.cursor/skills/ubiquitous-language/SKILL.md +0 -13
  366. package/commands/autopilot-multi.md +0 -74
  367. package/commands/contract-version-bump.md +0 -28
  368. package/commands/journey-audit.md +0 -43
  369. package/pi/prompts/autopilot-multi.md +0 -12
  370. package/pi/prompts/contract-version-bump.md +0 -12
  371. package/pi/prompts/journey-audit.md +0 -12
  372. package/scripts/autopilot-multi.mjs +0 -885
  373. package/scripts/backfill-learnings-expires.mjs +0 -196
  374. package/scripts/backfill-learnings.mjs +0 -203
  375. package/scripts/fleet-instruction-scan.mjs +0 -141
  376. package/scripts/lib/autopilot/dep-graph.mjs +0 -417
  377. package/scripts/lib/autopilot/multi-killswitch.mjs +0 -184
  378. package/scripts/lib/webhook-url.mjs +0 -105
  379. package/scripts/lifecycle-sim-v6.mjs +0 -347
  380. package/scripts/migrate-learnings-jsonl.mjs +0 -189
  381. package/scripts/migrate-subagents-jsonl.mjs +0 -196
  382. package/scripts/upload-social-preview.mjs +0 -316
  383. package/skills/_shared/model-selection.md +0 -64
  384. package/skills/contract-version-bump/SKILL.md +0 -219
  385. package/skills/daily/SKILL.md +0 -222
  386. package/skills/daily/generate.sh +0 -92
  387. package/skills/daily/templates/daily.md.tpl +0 -36
  388. package/skills/journey-audit/SKILL.md +0 -269
  389. package/skills/skill-creator/SKILL.md +0 -168
  390. package/skills/ubiquitous-language/SKILL.md +0 -97
  391. package/skills/vault-sync/package-lock.json +0 -40
  392. /package/skills/{domain-model → architecture/references}/ADR-FORMAT.md +0 -0
  393. /package/skills/{domain-model → architecture/references}/CONTEXT-FORMAT.md +0 -0
@@ -42,7 +42,7 @@ if (!shouldRunHook('on-session-start')) process.exit(0);
42
42
  import { emitEvent, eventsFilePath } from '../scripts/lib/events.mjs';
43
43
  import { maybeRotate } from '../scripts/lib/events-rotation.mjs';
44
44
  import { readConfigFile, parseSessionConfig } from '../scripts/lib/config.mjs';
45
- import { SO_PLATFORM, resolveProjectDir } from '../scripts/lib/platform.mjs';
45
+ import { getPlatform, resolveProjectDir } from '../scripts/lib/platform.mjs';
46
46
  import {
47
47
  registerSelf,
48
48
  detectPeers,
@@ -124,6 +124,30 @@ function shortSessionId(id) {
124
124
  return id.length > 24 ? id.slice(0, 8) : id;
125
125
  }
126
126
 
127
+ /**
128
+ * GH#67 — render the provenance marker for ONE mechanically-detected peer.
129
+ *
130
+ * `discoverActiveSessions()` annotates registry-sourced peers additively
131
+ * (`registryOnly` / `lockSuperseded` / `lockOwnerId`); lock-sourced peers carry
132
+ * none of the three, so they render byte-identically to the pre-GH#67 banner.
133
+ *
134
+ * `lockSuperseded: true` means a LIVE lock at THIS root is held by a different
135
+ * raw session_id than the registry entry — the common cause is a finished task
136
+ * whose SessionEnd never ran, leaving a fresh-but-orphaned registry record.
137
+ * It is a HINT, never a verdict: the session lock is advisory, so the entry may
138
+ * equally be a live peer that lost the acquire race (#1085). The marker is
139
+ * therefore purely additive — it never removes the peer, and never changes the
140
+ * count or the WARN decision (HR-106).
141
+ *
142
+ * @param {{registryOnly?:boolean, lockSuperseded?:boolean, lockOwnerId?:string|null}} peer
143
+ * @returns {string} '' for a lock-sourced peer, else a bracketed marker.
144
+ */
145
+ function supersessionMarker(peer) {
146
+ if (!peer || peer.registryOnly !== true) return '';
147
+ if (peer.lockSuperseded === true) return ' [registry-only, superseded]';
148
+ return ' [registry-only]';
149
+ }
150
+
127
151
  /**
128
152
  * Queue the ONE `additionalContext` string for the single end-of-hook flush.
129
153
  * Last writer wins; there is deliberately no accumulation, because every
@@ -380,6 +404,19 @@ async function resolveSessionId(input, projectRoot) {
380
404
  if (Object.prototype.hasOwnProperty.call(prev, 'last_batch')) {
381
405
  preserved.last_batch = prev.last_batch;
382
406
  }
407
+ // #1193 — the final-wave completion marker must survive a
408
+ // clear/compact too: dropping it re-arms a duplicate SessionEnd
409
+ // `orchestrator.wave.completed` for a wave already closed.
410
+ if (Object.prototype.hasOwnProperty.call(prev, 'last_wave_completed')) {
411
+ preserved.last_wave_completed = prev.last_wave_completed;
412
+ }
413
+ // #980 — the OPEN half of the wave-diff pair, written by
414
+ // post-tool-batch-wave-signal.mjs. Dropping it across a /clear leaves
415
+ // the running wave with no start point, so the next
416
+ // `orchestrator.wave.completed` silently omits `files_changed`.
417
+ if (Object.prototype.hasOwnProperty.call(prev, 'wave_start_sha')) {
418
+ preserved.wave_start_sha = prev.wave_start_sha;
419
+ }
383
420
  }
384
421
  } catch { /* absent / unparseable → no preservation (reset) */ }
385
422
  }
@@ -675,7 +712,15 @@ async function main() {
675
712
  // must never break the hook, which is informational-only.
676
713
  const input = await stdinPromise;
677
714
  const { sessionId, semanticSessionId, mode } = await resolveSessionId(input, projectRoot);
678
- const platform = process.env.SO_PLATFORM ?? SO_PLATFORM;
715
+ // getPlatform() ALREADY implements the SO_PLATFORM override as step 1 of its
716
+ // precedence — and, unlike a bare `??`, it validates the value against the
717
+ // four-platform allowlist and trims it. The former `process.env.SO_PLATFORM ??
718
+ // getPlatform()` therefore added nothing except the empty-string trap
719
+ // (`.claude/rules/development.md` § Env-var fallback whitespace trap): a key
720
+ // exported as `SO_PLATFORM=` is not nullish, so `??` short-circuited and this
721
+ // hook stamped `platform: ''` on the session event and handed '' down to the
722
+ // update probe. Measured 2026-09-06 by the codex test below.
723
+ const platform = getPlatform();
679
724
 
680
725
  // Epic #583 P3 — mechanical session.lock writer (closes D1+D2+D4 gaps).
681
726
  // Bootstrap the session-lock so discoverActiveSessions() picks us up even
@@ -738,6 +783,11 @@ async function main() {
738
783
  } catch { /* hook must remain non-blocking */ }
739
784
 
740
785
  let peers = [];
786
+ // GH#67 consumer half — how many mechanically-detected peers were registry-
787
+ // sourced entries that a LIVE lock at this root supersedes. Counted for the
788
+ // session.started payload below; NEVER subtracted from any peer count
789
+ // (HR-106: the banner reports the number the verdict judged).
790
+ let mechanicalPeersSuperseded = 0;
741
791
  try {
742
792
  await sweepZombies().catch(() => ({ removed: [], logged: 0 }));
743
793
  try {
@@ -839,6 +889,7 @@ async function main() {
839
889
  const { discoverActiveSessions } = await import('../scripts/lib/session-discovery.mjs');
840
890
  const allActive = await discoverActiveSessions(projectRoot);
841
891
  const mechanicalPeers = allActive.filter((s) => s.sessionId !== sessionId);
892
+ mechanicalPeersSuperseded = mechanicalPeers.filter((p) => p.lockSuperseded === true).length;
842
893
  if (mechanicalPeers.length > 0) {
843
894
  // #1137 part 1 — say WHERE, not just how many. discoverActiveSessions()
844
895
  // walks EVERY path `git worktree list` reports, which includes worktrees
@@ -862,11 +913,14 @@ async function main() {
862
913
  // a lock written without the field yields undefined here, while
863
914
  // sessionFromRegistryEntry() always defaults it to 'session'.
864
915
  const mode = typeof p.mode === 'string' && p.mode.length > 0 ? `:${p.mode}` : '';
865
- return `${where}:${shortSessionId(p.sessionId)}${mode}`;
916
+ return `${where}:${shortSessionId(p.sessionId)}${mode}${supersessionMarker(p)}`;
866
917
  })
867
918
  .join(', ');
868
919
  const overflow = mechanicalPeers.length > 3 ? ` +${mechanicalPeers.length - 3} more` : '';
869
920
  pushBanner(`🔍 Mechanical peer-detection: ${mechanicalPeers.length} active in this repo's worktree set (${summary}${overflow})`);
921
+ if (mechanicalPeersSuperseded > 0) {
922
+ pushBanner(` ${mechanicalPeersSuperseded} of them registry-only and superseded by this root's live lock — likely a finished task without SessionEnd (GH#67). Still counted above: the session lock is advisory.`);
923
+ }
870
924
  }
871
925
  } catch { /* best effort — banner is informational, never blocks */ }
872
926
  }
@@ -908,13 +962,79 @@ async function main() {
908
962
  } catch { /* hook must remain non-blocking */ }
909
963
  }
910
964
 
965
+ // Plugin-update probe (#nnn, d7 R2) — "is the plugin that is RUNNING behind
966
+ // the plugin that is PUBLISHED?".
967
+ //
968
+ // MEASURED 2026-09-06: this host ran the marketplace-cache copy at 3.19.0
969
+ // (installed 2026-08-09) while repo and npm stood at the 3.24 line — five minors,
970
+ // four weeks, zero warnings, because NO code anywhere compared installed
971
+ // against available (`grep -rln "registry.npmjs.org\|dist-tags" scripts/
972
+ // hooks/ skills/` → only scripts/release.mjs, the publisher).
973
+ //
974
+ // Placement mirrors the probe block above: BEFORE the payload (the event
975
+ // carries both versions) and BEFORE flushBanner(), so the line rides the ONE
976
+ // systemMessage envelope. A second stdout object would be silently discarded
977
+ // (HR-106) — the failure mode the bannerLines docstring describes.
978
+ //
979
+ // Same measurement/display split as the probes: the request and the event
980
+ // fields happen regardless, `pushBanner` is gated on `bannerData`. Network,
981
+ // cache and kill-switch behaviour live in the module.
982
+ let pluginUpdate = null;
983
+ try {
984
+ const { checkPluginUpdate } = await import('../scripts/lib/plugin-update-banner.mjs');
985
+ pluginUpdate = await checkPluginUpdate({
986
+ cacheDir: path.join(projectRoot, '.orchestrator', 'runtime'),
987
+ // The probe's own fallback is env-only (SO_PLATFORM, then each harness's
988
+ // compat var) and cannot run detectPlatform()'s third step, the marker-
989
+ // directory walk from cwd. This hook already resolved the platform at the
990
+ // top of run() through exactly that full precedence, so handing it over
991
+ // makes the remedy instruction MEASURED rather than guessed — a Codex or
992
+ // Cursor consumer with no compat var set would otherwise be told to run
993
+ // `/plugin update`, a command its harness does not have.
994
+ platform,
995
+ });
996
+ if (pluginUpdate && bannerData) pushBanner(pluginUpdate.message);
997
+ } catch { /* hook must remain non-blocking */ }
998
+
911
999
  const payload = {
912
1000
  platform,
913
1001
  project: projectName,
914
1002
  branch,
915
1003
  session_id: sessionId,
916
1004
  peer_count: peers.length,
1005
+ // GH#67 — additive: how many mechanically-detected peers a live lock at
1006
+ // this root supersedes. `peer_count` is deliberately unchanged; this field
1007
+ // makes the supersession rate measurable instead of inferred (HR-105).
1008
+ peers_superseded: mechanicalPeersSuperseded,
917
1009
  };
1010
+
1011
+ // #nnn — installed/latest plugin version on the session record.
1012
+ //
1013
+ // HR-105: a verdict nothing records is unfalsifiable. `installed` is stamped
1014
+ // on EVERY start (it is a local file read that cannot fail for network
1015
+ // reasons), and `latest` whenever it is known — including the runs where
1016
+ // checkPluginUpdate() stayed silent because the versions matched. Those runs
1017
+ // are the DENOMINATOR of the probe's firing rate; without them the fleet can
1018
+ // only ever see how often it warned, never how often it could have.
1019
+ //
1020
+ // Both keys are OMITTED rather than nulled when unknown (docs/events-schema.md
1021
+ // optional-field convention: absent ≠ zero) — a kill-switched or offline
1022
+ // session must not read as "latest is 0/unknown-but-measured".
1023
+ try {
1024
+ const { readInstalledPluginVersion, readCachedLatest, isUpdateCheckDisabled } =
1025
+ await import('../scripts/lib/plugin-update-banner.mjs');
1026
+ const installedVersion = readInstalledPluginVersion();
1027
+ if (installedVersion) payload.plugin_version_installed = installedVersion;
1028
+ // `latest` is gated on the kill switch, `installed` is not: reading this
1029
+ // repo's own package.json is not the thing an operator switched off.
1030
+ if (!isUpdateCheckDisabled()) {
1031
+ const latestVersion =
1032
+ pluginUpdate?.latest
1033
+ ?? readCachedLatest({ cacheDir: path.join(projectRoot, '.orchestrator', 'runtime') })?.version
1034
+ ?? null;
1035
+ if (latestVersion) payload.plugin_version_latest = latestVersion;
1036
+ }
1037
+ } catch { /* telemetry never blocks the hook */ }
918
1038
  if (bannerData) {
919
1039
  payload.host_class = bannerData.host.host_class;
920
1040
  payload.ram_free_gb = bannerData.resources.ram_free_gb;
@@ -935,7 +1055,12 @@ async function main() {
935
1055
  payload.memory_pressure_pct_free = bannerData.resources.memory_pressure_pct_free ?? null;
936
1056
  payload.peer_sessions_count = bannerData.resources.peer_sessions_count ?? null;
937
1057
  }
938
- await emitEvent('orchestrator.session.started', payload);
1058
+ // #1183 — a malformed record throws EventValidationError BEFORE any side
1059
+ // effect (scripts/lib/events.mjs); this hook must never abort on that, so
1060
+ // the emit is wrapped rather than left to propagate.
1061
+ try {
1062
+ await emitEvent('orchestrator.session.started', payload);
1063
+ } catch { /* telemetry never blocks the hook (#1183) */ }
939
1064
 
940
1065
  // #1138 — one-time telemetry-consent nudge. Queued (never written) here so it
941
1066
  // rides the single stdout envelope below.
@@ -945,6 +1070,30 @@ async function main() {
945
1070
  // only stdout write in the hook.
946
1071
  flushBanner();
947
1072
 
1073
+ // #1229 — refresh the session-lock heartbeat at the END of this hook's run.
1074
+ //
1075
+ // MEASURED (STATE.md deviation 2026-09-05T06:08:46Z): session-20's lock was
1076
+ // reaped as stale at 06:06Z by an UNRELATED session's SessionEnd, its
1077
+ // heartbeat 11.3 h old against a 4 h TTL. The session was not idle — it was
1078
+ // still inside session-start / session-plan, where no heartbeat writer
1079
+ // existed: `updateHeartbeat()` was called only from the wave loop, from
1080
+ // on-stop and from session-end. A session that never reached /go therefore
1081
+ // aged out of its own lock while working.
1082
+ //
1083
+ // bootstrapLock() above stamps `last_heartbeat = started_at` at LOCK GENESIS,
1084
+ // i.e. before the peer scan, the backfill and the Phase-4 probes have run.
1085
+ // Stamping again here moves the clock to the end of the hook and — more
1086
+ // importantly — makes session-start a heartbeat CALL SITE at all, so the
1087
+ // cadence no longer begins only when the first wave starts.
1088
+ //
1089
+ // `updateHeartbeat()` already carries the same-session guard this needs (it
1090
+ // returns false without writing when the lock belongs to another session),
1091
+ // so no `touchIfOwn()` wrapper is warranted — see scripts/lib/session-lock.mjs.
1092
+ try {
1093
+ const { updateHeartbeat } = await import('../scripts/lib/session-lock.mjs');
1094
+ updateHeartbeat({ repoRoot: projectRoot, sessionId });
1095
+ } catch { /* hook must remain non-blocking */ }
1096
+
948
1097
  // Size-based rotation of events.jsonl (#251). Session-start is the single
949
1098
  // rotation trigger — per-append overhead is rejected design. Any failure
950
1099
  // is swallowed: rotation must NEVER block the hook.