session-orchestrator 3.24.0 → 4.0.1

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 (435) 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 +3 -2
  47. package/.codex-plugin/skills/architecture/SKILL.md +20 -0
  48. package/.codex-plugin/skills/autopilot/SKILL.md +21 -0
  49. package/.codex-plugin/skills/autopilot/agents/openai.yaml +5 -0
  50. package/.codex-plugin/skills/bootstrap/SKILL.md +22 -0
  51. package/.codex-plugin/skills/bootstrap/agents/openai.yaml +5 -0
  52. package/.codex-plugin/skills/brainstorm/SKILL.md +22 -0
  53. package/.codex-plugin/skills/brainstorm/agents/openai.yaml +5 -0
  54. package/.codex-plugin/skills/claude-md-drift-check/SKILL.md +17 -0
  55. package/.codex-plugin/skills/close/SKILL.md +21 -0
  56. package/.codex-plugin/skills/close/agents/openai.yaml +5 -0
  57. package/.codex-plugin/skills/convergence-monitoring/SKILL.md +24 -0
  58. package/.codex-plugin/skills/debug/SKILL.md +21 -0
  59. package/.codex-plugin/skills/debug/agents/openai.yaml +5 -0
  60. package/.codex-plugin/skills/discovery/SKILL.md +21 -0
  61. package/.codex-plugin/skills/discovery/agents/openai.yaml +5 -0
  62. package/.codex-plugin/skills/dispatcher/SKILL.md +21 -0
  63. package/.codex-plugin/skills/dispatcher/agents/openai.yaml +5 -0
  64. package/.codex-plugin/skills/docs-orchestrator/SKILL.md +20 -0
  65. package/.codex-plugin/skills/ecosystem-health/SKILL.md +22 -0
  66. package/.codex-plugin/skills/eli5/SKILL.md +21 -0
  67. package/.codex-plugin/skills/eli5/agents/openai.yaml +5 -0
  68. package/.codex-plugin/skills/eval/SKILL.md +21 -0
  69. package/.codex-plugin/skills/eval/agents/openai.yaml +5 -0
  70. package/.codex-plugin/skills/evolve/SKILL.md +21 -0
  71. package/.codex-plugin/skills/evolve/agents/openai.yaml +5 -0
  72. package/.codex-plugin/skills/frontmatter-guard/SKILL.md +17 -0
  73. package/.codex-plugin/skills/gitlab-ops/SKILL.md +22 -0
  74. package/.codex-plugin/skills/gitlab-portfolio/SKILL.md +17 -0
  75. package/.codex-plugin/skills/go/SKILL.md +22 -0
  76. package/.codex-plugin/skills/go/agents/openai.yaml +5 -0
  77. package/.codex-plugin/skills/grill/SKILL.md +21 -0
  78. package/.codex-plugin/skills/grill/agents/openai.yaml +5 -0
  79. package/.codex-plugin/skills/harness-audit/SKILL.md +19 -0
  80. package/.codex-plugin/skills/harness-audit/agents/openai.yaml +5 -0
  81. package/.codex-plugin/skills/hook-development/SKILL.md +17 -0
  82. package/.codex-plugin/skills/mcp-builder/SKILL.md +17 -0
  83. package/.codex-plugin/skills/memory-cleanup/SKILL.md +21 -0
  84. package/.codex-plugin/skills/memory-cleanup/agents/openai.yaml +5 -0
  85. package/.codex-plugin/skills/mode-selector/SKILL.md +19 -0
  86. package/.codex-plugin/skills/npm-publish/SKILL.md +18 -0
  87. package/.codex-plugin/skills/peekaboo-driver/SKILL.md +20 -0
  88. package/.codex-plugin/skills/persona-panel/SKILL.md +22 -0
  89. package/.codex-plugin/skills/persona-panel/agents/openai.yaml +5 -0
  90. package/.codex-plugin/skills/plan/SKILL.md +22 -0
  91. package/.codex-plugin/skills/plan/agents/openai.yaml +5 -0
  92. package/.codex-plugin/skills/playwright-driver/SKILL.md +22 -0
  93. package/.codex-plugin/skills/portfolio/SKILL.md +21 -0
  94. package/.codex-plugin/skills/portfolio/agents/openai.yaml +5 -0
  95. package/.codex-plugin/skills/quality-gates/SKILL.md +22 -0
  96. package/.codex-plugin/skills/reconcile/SKILL.md +21 -0
  97. package/.codex-plugin/skills/reconcile/agents/openai.yaml +5 -0
  98. package/.codex-plugin/skills/release/SKILL.md +22 -0
  99. package/.codex-plugin/skills/release/agents/openai.yaml +5 -0
  100. package/.codex-plugin/skills/remote-offload/SKILL.md +22 -0
  101. package/.codex-plugin/skills/repo-audit/SKILL.md +19 -0
  102. package/.codex-plugin/skills/repo-audit/agents/openai.yaml +5 -0
  103. package/.codex-plugin/skills/session/SKILL.md +21 -0
  104. package/.codex-plugin/skills/session/agents/openai.yaml +5 -0
  105. package/.codex-plugin/skills/session-end/SKILL.md +22 -0
  106. package/.codex-plugin/skills/session-plan/SKILL.md +22 -0
  107. package/.codex-plugin/skills/session-start/SKILL.md +22 -0
  108. package/.codex-plugin/skills/spinout/SKILL.md +21 -0
  109. package/.codex-plugin/skills/spinout/agents/openai.yaml +5 -0
  110. package/.codex-plugin/skills/sunset-review/SKILL.md +21 -0
  111. package/.codex-plugin/skills/sunset-review/agents/openai.yaml +5 -0
  112. package/.codex-plugin/skills/templates-ack/SKILL.md +21 -0
  113. package/.codex-plugin/skills/templates-ack/agents/openai.yaml +5 -0
  114. package/.codex-plugin/skills/test/SKILL.md +21 -0
  115. package/.codex-plugin/skills/test/agents/openai.yaml +5 -0
  116. package/.codex-plugin/skills/test-runner/SKILL.md +22 -0
  117. package/.codex-plugin/skills/tmux-layout/SKILL.md +23 -0
  118. package/.codex-plugin/skills/using-orchestrator/SKILL.md +19 -0
  119. package/.codex-plugin/skills/vault-mirror/SKILL.md +17 -0
  120. package/.codex-plugin/skills/vault-sync/SKILL.md +17 -0
  121. package/.codex-plugin/skills/wave-executor/SKILL.md +22 -0
  122. package/.codex-plugin/skills/write-executable-plan/SKILL.md +24 -0
  123. package/.cursor/commands/autopilot.md +2 -2
  124. package/.cursor/commands/bootstrap.md +1 -1
  125. package/.cursor/commands/brainstorm.md +1 -1
  126. package/.cursor/commands/debug.md +1 -1
  127. package/.cursor/commands/discovery.md +1 -1
  128. package/.cursor/commands/dispatcher.md +2 -2
  129. package/.cursor/commands/eli5.md +2 -2
  130. package/.cursor/commands/eval.md +2 -2
  131. package/.cursor/commands/evolve.md +1 -1
  132. package/.cursor/commands/go.md +1 -1
  133. package/.cursor/commands/grill.md +2 -2
  134. package/.cursor/commands/memory-cleanup.md +2 -2
  135. package/.cursor/commands/persona-panel.md +1 -1
  136. package/.cursor/commands/plan.md +1 -1
  137. package/.cursor/commands/portfolio.md +1 -1
  138. package/.cursor/commands/reconcile.md +2 -2
  139. package/.cursor/commands/release.md +2 -2
  140. package/.cursor/commands/session.md +2 -2
  141. package/.cursor/commands/spinout.md +2 -2
  142. package/.cursor/commands/sunset-review.md +2 -2
  143. package/.cursor/commands/templates-ack.md +2 -2
  144. package/.cursor/commands/test.md +2 -2
  145. package/.cursor/skills/brainstorm/SKILL.md +1 -1
  146. package/.cursor/skills/eval/SKILL.md +1 -1
  147. package/.cursor/skills/quality-gates/SKILL.md +1 -1
  148. package/.cursor/skills/remote-offload/SKILL.md +1 -1
  149. package/.cursor-plugin/plugin.json +30 -0
  150. package/.orchestrator/policy/blocked-commands.json +121 -0
  151. package/.orchestrator/policy/ecosystem.schema.json +66 -0
  152. package/.orchestrator/policy/quality-gates.example.json +16 -0
  153. package/.orchestrator/policy/quality-gates.schema.json +38 -0
  154. package/.orchestrator/policy/templates-policy.json +27 -0
  155. package/.orchestrator/policy/test-profiles.json +47 -0
  156. package/AGENTS.md +225 -0
  157. package/CHANGELOG.md +1314 -2
  158. package/NOTICE +11 -6
  159. package/README.md +135 -94
  160. package/agents/eval-judge.md +1 -1
  161. package/agents/skill-applied-judge.md +1 -1
  162. package/assets/wave-lifecycle.svg +98 -0
  163. package/commands/release.md +6 -3
  164. package/commands/session.md +18 -3
  165. package/docs/README.md +4 -0
  166. package/{agents/AGENTS.md → docs/agent-authoring.md} +19 -26
  167. package/docs/baseline.md +67 -0
  168. package/docs/ci-setup.md +108 -62
  169. package/docs/codex-setup.md +107 -29
  170. package/docs/components.md +38 -16
  171. package/docs/cursor-setup.md +6 -2
  172. package/docs/events-schema.md +9 -6
  173. package/docs/instruction-delivery.md +69 -0
  174. package/{agents/memory-proposal-collector.md → docs/memory-proposal-flow.md} +1 -8
  175. package/docs/migration-v4.md +365 -0
  176. package/docs/pi-setup.md +6 -1
  177. package/docs/plugin-architecture-v3.md +1 -1
  178. package/docs/rule-authoring.md +85 -19
  179. package/docs/scope-collision-guard.md +5 -5
  180. package/docs/session-config-reference.md +57 -56
  181. package/docs/session-config-template.md +6 -29
  182. package/docs/telemetry.md +157 -3
  183. package/docs/vault-docs-architecture.md +50 -11
  184. package/hooks/_lib/hook-import-set.json +1488 -0
  185. package/hooks/_lib/subagent-transcript.mjs +562 -0
  186. package/hooks/config-protection.mjs +2 -2
  187. package/hooks/cwd-change-restore.mjs +2 -2
  188. package/hooks/enforce-commands.mjs +69 -0
  189. package/hooks/hooks-codex.json +1 -1
  190. package/hooks/hooks-cursor.json +10 -0
  191. package/hooks/hooks-pi.json +5 -0
  192. package/hooks/hooks.json +6 -1
  193. package/hooks/loop-guard.mjs +3 -3
  194. package/hooks/on-session-end.mjs +2 -2
  195. package/hooks/on-session-start.mjs +103 -2
  196. package/hooks/on-stop.mjs +60 -14
  197. package/hooks/operator-steer.mjs +2 -2
  198. package/hooks/post-bash-write-verify.mjs +85 -0
  199. package/hooks/post-edit-import-probe.mjs +344 -0
  200. package/hooks/post-subagent-discovery-validator.mjs +187 -431
  201. package/hooks/post-tool-batch-wave-signal.mjs +118 -4
  202. package/hooks/post-tool-failure-corrective-context.mjs +2 -2
  203. package/hooks/post-tooluse-frontend-slop.mjs +3 -3
  204. package/hooks/pre-bash-destructive-guard.mjs +39 -13
  205. package/hooks/skill-invocation-telemetry.mjs +17 -5
  206. package/hooks/subagent-telemetry.mjs +13 -4
  207. package/monitors/monitors.json +3 -3
  208. package/package.json +9 -1
  209. package/pi/prompts/session.md +2 -2
  210. package/scripts/backfill-abandoned-sessions.mjs +50 -4
  211. package/scripts/backfill-learnings-from-vault.mjs +9 -3
  212. package/scripts/dialectic-deriver.mjs +73 -8
  213. package/scripts/export-hw-learnings.mjs +113 -1
  214. package/scripts/generate-agents-skills.mjs +378 -0
  215. package/scripts/generate-codex-skills.mjs +246 -0
  216. package/scripts/generate-cursor-adapter.mjs +45 -8
  217. package/scripts/generate-hook-import-set.mjs +292 -0
  218. package/scripts/lib/agent-status.mjs +13 -2
  219. package/scripts/lib/auto-dream.mjs +38 -36
  220. package/scripts/lib/autonomy/suitability.mjs +6 -0
  221. package/scripts/lib/autopilot/loop.mjs +2 -2
  222. package/scripts/lib/ci-status-banner.mjs +220 -75
  223. package/scripts/lib/codex/plugin-contract.mjs +88 -6
  224. package/scripts/lib/config/auto-dream.mjs +2 -1
  225. package/scripts/lib/config/block-header.mjs +8 -0
  226. package/scripts/lib/config/block-preprocess.mjs +177 -0
  227. package/scripts/lib/config/broken-window.mjs +2 -1
  228. package/scripts/lib/config/cold-start.mjs +2 -1
  229. package/scripts/lib/config/config-protection.mjs +22 -2
  230. package/scripts/lib/config/context-coverage.mjs +2 -1
  231. package/scripts/lib/config/cross-repo.mjs +2 -1
  232. package/scripts/lib/config/custom-phases.mjs +2 -1
  233. package/scripts/lib/config/dialectic.mjs +2 -1
  234. package/scripts/lib/config/discovery-validator.mjs +2 -1
  235. package/scripts/lib/config/dispatcher-autonomy-capture.mjs +24 -1
  236. package/scripts/lib/config/dispatcher-autonomy.mjs +2 -1
  237. package/scripts/lib/config/docs-orchestrator.mjs +2 -1
  238. package/scripts/lib/config/docs-staleness.mjs +2 -1
  239. package/scripts/lib/config/drift-check.mjs +2 -1
  240. package/scripts/lib/config/eval.mjs +2 -1
  241. package/scripts/lib/config/events-rotation.mjs +2 -1
  242. package/scripts/lib/config/evolve.mjs +8 -2
  243. package/scripts/lib/config/frontend-slop-hook.mjs +7 -3
  244. package/scripts/lib/config/gitlab-portfolio.mjs +2 -1
  245. package/scripts/lib/config/handover-gate.mjs +2 -1
  246. package/scripts/lib/config/health-endpoints.mjs +7 -2
  247. package/scripts/lib/config/host-paths.mjs +20 -4
  248. package/scripts/lib/config/issue-budget.mjs +2 -1
  249. package/scripts/lib/config/loop-guard.mjs +2 -1
  250. package/scripts/lib/config/memory.mjs +2 -1
  251. package/scripts/lib/config/moc-staleness.mjs +2 -1
  252. package/scripts/lib/config/persona-gate-wave.mjs +2 -1
  253. package/scripts/lib/config/private-config-dir.mjs +67 -0
  254. package/scripts/lib/config/reconcile.mjs +2 -1
  255. package/scripts/lib/config/remote-hosts.mjs +2 -1
  256. package/scripts/lib/config/section-extractor.mjs +7 -1
  257. package/scripts/lib/config/skill-evolution.mjs +2 -1
  258. package/scripts/lib/config/slopcheck.mjs +2 -1
  259. package/scripts/lib/config/state-md-lock.mjs +2 -1
  260. package/scripts/lib/config/templates-first.mjs +2 -1
  261. package/scripts/lib/config/test.mjs +2 -1
  262. package/scripts/lib/config/vault-integration.mjs +7 -1
  263. package/scripts/lib/config/vault-mirror-quality.mjs +2 -1
  264. package/scripts/lib/config/vault-staleness.mjs +2 -1
  265. package/scripts/lib/config/vault-sync.mjs +2 -1
  266. package/scripts/lib/config/verification-auto-fix.mjs +2 -1
  267. package/scripts/lib/config/wave-reviewers.mjs +2 -1
  268. package/scripts/lib/config/worktree-orphans.mjs +2 -1
  269. package/scripts/lib/convergence-monitor.mjs +82 -16
  270. package/scripts/lib/dispatcher/rank.mjs +124 -48
  271. package/scripts/lib/ecosystem-health.mjs +16 -2
  272. package/scripts/lib/eval/engine.mjs +9 -1
  273. package/scripts/lib/eval/session-resolve.mjs +23 -4
  274. package/scripts/lib/events.mjs +22 -6
  275. package/scripts/lib/frontmatter-guard.mjs +131 -13
  276. package/scripts/lib/gates/gate-full.mjs +30 -0
  277. package/scripts/lib/gates/gate-helpers.mjs +76 -0
  278. package/scripts/lib/hardware-pattern-detector.mjs +18 -1
  279. package/scripts/lib/harness-audit/categories/category4.mjs +31 -11
  280. package/scripts/lib/host-identity.mjs +50 -11
  281. package/scripts/lib/instruction-budget-guard.mjs +171 -5
  282. package/scripts/lib/learnings/evolve-telemetry.mjs +178 -0
  283. package/scripts/lib/learnings/io.mjs +60 -6
  284. package/scripts/lib/memory-proposals/store.mjs +30 -22
  285. package/scripts/lib/owner-config-banner.mjs +41 -6
  286. package/scripts/lib/owner-config-loader.mjs +21 -10
  287. package/scripts/lib/owner-interview.mjs +3 -3
  288. package/scripts/lib/owner-yaml.mjs +215 -15
  289. package/scripts/lib/platform.mjs +108 -15
  290. package/scripts/lib/plugin-update-banner.mjs +414 -0
  291. package/scripts/lib/project-hygiene.mjs +38 -2
  292. package/scripts/lib/qg-command-drift-banner.mjs +50 -12
  293. package/scripts/lib/quality-gate.mjs +133 -44
  294. package/scripts/lib/reconcile/emitter.mjs +68 -6
  295. package/scripts/lib/reconcile/engine.mjs +51 -11
  296. package/scripts/lib/reconcile/idempotency.mjs +37 -4
  297. package/scripts/lib/reconcile/writer.mjs +40 -18
  298. package/scripts/lib/session-close-backfill.mjs +67 -9
  299. package/scripts/lib/session-id.mjs +12 -23
  300. package/scripts/lib/session-identity/own-session.mjs +125 -10
  301. package/scripts/lib/session-lock-shape.mjs +43 -0
  302. package/scripts/lib/session-lock.mjs +5 -10
  303. package/scripts/lib/session-registry.mjs +25 -9
  304. package/scripts/lib/session-schema/constants.mjs +64 -3
  305. package/scripts/lib/session-schema/validator.mjs +38 -4
  306. package/scripts/lib/session-start-probes.mjs +30 -1
  307. package/scripts/lib/sessions-staleness-banner.mjs +18 -11
  308. package/scripts/lib/skill-health/join.mjs +17 -4
  309. package/scripts/lib/state-md.mjs +78 -0
  310. package/scripts/lib/sunset/walker.mjs +6 -0
  311. package/scripts/lib/telemetry/schema.mjs +202 -9
  312. package/scripts/lib/telemetry/sync.mjs +368 -12
  313. package/scripts/lib/telemetry-flush-health-banner.mjs +211 -0
  314. package/scripts/lib/validate/check-agents-skills.mjs +327 -0
  315. package/scripts/lib/validate/check-agents.mjs +3 -3
  316. package/scripts/lib/validate/check-codex-skills.mjs +191 -0
  317. package/scripts/lib/validate/check-cursor-adapter.mjs +234 -72
  318. package/scripts/lib/validate/check-hooks-symmetry.mjs +45 -16
  319. package/scripts/lib/validate/check-owner-leakage.mjs +319 -22
  320. package/scripts/lib/validate/check-skill-links.mjs +193 -0
  321. package/scripts/lib/validate/check-skill-script-paths.mjs +47 -28
  322. package/scripts/lib/validate/check-test-git-config-target.mjs +192 -12
  323. package/scripts/lib/validate/check-unwired-features.mjs +163 -15
  324. package/scripts/lib/validate/check-validator-registration.mjs +10 -4
  325. package/scripts/lib/validate/confidential-names.mjs +95 -30
  326. package/scripts/lib/validate/enumerate-repo-files.mjs +317 -0
  327. package/scripts/lib/validate/repo-files.mjs +48 -14
  328. package/scripts/lib/vault-backfill/template.mjs +63 -6
  329. package/scripts/lib/vault-mirror/process.mjs +165 -42
  330. package/scripts/lib/vault-mirror/telemetry.mjs +2 -2
  331. package/scripts/lib/vault-status/narrative-mirror.mjs +127 -18
  332. package/scripts/lib/wave-executor/dispatch-common.mjs +164 -0
  333. package/scripts/lib/wave-executor/foreign-dispatch.mjs +7 -142
  334. package/scripts/lib/wave-executor/remote-dispatch.mjs +5 -7
  335. package/scripts/lib/wave-resource-gate.mjs +8 -2
  336. package/scripts/lib/wave-sizing.mjs +4 -1
  337. package/scripts/lib/wave-transcript-tail.mjs +118 -4
  338. package/scripts/materialize-wave-scope.mjs +12 -5
  339. package/scripts/memory-propose.mjs +19 -5
  340. package/scripts/migrate-cold-start-seed.mjs +4 -1
  341. package/scripts/parse-config.mjs +60 -3
  342. package/scripts/release.mjs +430 -31
  343. package/scripts/repair-invalid-sessions.mjs +3 -3
  344. package/scripts/run-quality-gate.mjs +128 -11
  345. package/scripts/site-numbers.mjs +344 -8
  346. package/scripts/sweep-expired-learnings.mjs +90 -0
  347. package/scripts/sync-vault-schema.mjs +3 -1
  348. package/scripts/telemetry.mjs +2 -2
  349. package/scripts/validate-plugin.mjs +164 -0
  350. package/scripts/validate-wave-scope.mjs +28 -8
  351. package/scripts/wave-scope-binding.mjs +215 -0
  352. package/skills/_shared/instruction-file-resolution.md +10 -0
  353. package/skills/_shared/parallel-aware-preamble.md +1 -0
  354. package/skills/_shared/platform-tools.md +1 -1
  355. package/skills/_shared/state-ownership.md +1 -1
  356. package/skills/architecture/SKILL.md +7 -5
  357. package/skills/{domain-model/SKILL.md → architecture/references/domain-model.md} +9 -9
  358. package/skills/autopilot/SKILL.md +4 -18
  359. package/skills/claude-md-drift-check/SKILL.md +5 -1
  360. package/skills/claude-md-drift-check/checker.mjs +62 -2
  361. package/skills/convergence-monitoring/SIGNALS.md +55 -0
  362. package/skills/discovery/probes/vault-staleness.mjs +37 -13
  363. package/skills/discovery/probes-arch.md +20 -18
  364. package/skills/dispatcher/SKILL.md +3 -2
  365. package/skills/evolve/SKILL.md +65 -26
  366. package/skills/frontmatter-guard/SKILL.md +11 -5
  367. package/skills/npm-publish/SKILL.md +1 -1
  368. package/skills/reconcile/SKILL.md +33 -0
  369. package/skills/remote-offload/SKILL.md +1 -1
  370. package/skills/session-end/SKILL.md +18 -905
  371. package/skills/session-end/phase-3-6-tail.md +10 -3
  372. package/skills/session-end/plan-verification.md +221 -155
  373. package/skills/session-end/references/phase-2-quality-gate.md +93 -0
  374. package/skills/session-end/references/phase-3-documentation-updates.md +229 -0
  375. package/skills/session-end/references/phase-4a-worktree-cleanup.md +120 -0
  376. package/skills/session-end/references/phase-4b-worktree-orphan-sweep.md +58 -0
  377. package/skills/session-end/references/phase-5-issue-cleanup.md +104 -0
  378. package/skills/session-end/references/session-summary-template.md +62 -0
  379. package/skills/session-plan/SKILL.md +49 -0
  380. package/skills/session-start/SKILL.md +22 -904
  381. package/skills/session-start/phase-8-5-express-path.md +1 -1
  382. package/skills/session-start/references/phase-1-1-dispatcher-autonomy-capture.md +55 -0
  383. package/skills/session-start/references/phase-1-2-session-lock.md +140 -0
  384. package/skills/session-start/references/phase-1-5-session-continuity.md +254 -0
  385. package/skills/session-start/references/phase-1-7-vault-status-board.md +53 -0
  386. package/skills/session-start/references/phase-2-7-portfolio-snapshot.md +75 -0
  387. package/skills/session-start/references/phase-4-ssot-environment-check.md +160 -0
  388. package/skills/session-start/references/phase-6-5-forced-reads.md +75 -0
  389. package/skills/session-start/references/phase-6-6-project-intelligence.md +81 -0
  390. package/skills/session-start/references/phase-6-7-memory-banner-telemetry-consent.md +103 -0
  391. package/skills/vault-sync/SKILL.md +10 -0
  392. package/skills/vault-sync/validator.mjs +21 -27
  393. package/skills/wave-executor/SKILL.md +15 -1
  394. package/skills/wave-executor/references/wave-loop-dispatch.md +612 -0
  395. package/skills/wave-executor/references/wave-loop-review.md +570 -0
  396. package/skills/wave-executor/references/wave-loop-scope-manifest.md +162 -0
  397. package/skills/wave-executor/wave-loop.md +14 -1309
  398. package/templates/_shared/journey-manifest.md +10 -6
  399. package/.cursor/commands/autopilot-multi.md +0 -14
  400. package/.cursor/commands/contract-version-bump.md +0 -14
  401. package/.cursor/commands/journey-audit.md +0 -14
  402. package/.cursor/skills/contract-version-bump/SKILL.md +0 -12
  403. package/.cursor/skills/daily/SKILL.md +0 -12
  404. package/.cursor/skills/domain-model/SKILL.md +0 -13
  405. package/.cursor/skills/journey-audit/SKILL.md +0 -13
  406. package/.cursor/skills/skill-creator/SKILL.md +0 -13
  407. package/.cursor/skills/ubiquitous-language/SKILL.md +0 -13
  408. package/commands/autopilot-multi.md +0 -74
  409. package/commands/contract-version-bump.md +0 -28
  410. package/commands/journey-audit.md +0 -43
  411. package/pi/prompts/autopilot-multi.md +0 -12
  412. package/pi/prompts/contract-version-bump.md +0 -12
  413. package/pi/prompts/journey-audit.md +0 -12
  414. package/scripts/autopilot-multi.mjs +0 -885
  415. package/scripts/backfill-learnings-expires.mjs +0 -196
  416. package/scripts/backfill-learnings.mjs +0 -203
  417. package/scripts/fleet-instruction-scan.mjs +0 -141
  418. package/scripts/lib/autopilot/dep-graph.mjs +0 -417
  419. package/scripts/lib/autopilot/multi-killswitch.mjs +0 -184
  420. package/scripts/lib/webhook-url.mjs +0 -105
  421. package/scripts/lifecycle-sim-v6.mjs +0 -347
  422. package/scripts/migrate-learnings-jsonl.mjs +0 -189
  423. package/scripts/migrate-subagents-jsonl.mjs +0 -196
  424. package/scripts/upload-social-preview.mjs +0 -316
  425. package/skills/_shared/model-selection.md +0 -64
  426. package/skills/contract-version-bump/SKILL.md +0 -219
  427. package/skills/daily/SKILL.md +0 -222
  428. package/skills/daily/generate.sh +0 -92
  429. package/skills/daily/templates/daily.md.tpl +0 -36
  430. package/skills/journey-audit/SKILL.md +0 -270
  431. package/skills/skill-creator/SKILL.md +0 -168
  432. package/skills/ubiquitous-language/SKILL.md +0 -97
  433. package/skills/vault-sync/package-lock.json +0 -40
  434. /package/skills/{domain-model → architecture/references}/ADR-FORMAT.md +0 -0
  435. /package/skills/{domain-model → architecture/references}/CONTEXT-FORMAT.md +0 -0
@@ -47,6 +47,8 @@ import { randomBytes } from 'node:crypto';
47
47
 
48
48
  import { readPeerCards } from './lib/peer-cards/reader.mjs';
49
49
  import { filterRealSessions } from './lib/session-schema/filters.mjs';
50
+ import { readCanonicalSessions } from './lib/sessions-canonical.mjs';
51
+ import { recordDialecticRun } from './lib/learnings/evolve-telemetry.mjs';
50
52
 
51
53
  // ---------------------------------------------------------------------------
52
54
  // Constants
@@ -174,6 +176,30 @@ function countContentLines(body) {
174
176
  return n;
175
177
  }
176
178
 
179
+ /**
180
+ * Count the peer-card sections a proposed diff body would change (#1206 —
181
+ * `orchestrator.dialectic.completed`'s `user_deltas` / `agent_deltas` in
182
+ * dry-run mode, where there is no `mergePeerCard()` stats object to read).
183
+ * Pure function — no I/O.
184
+ *
185
+ * Counts `<!-- BEGIN MANAGED: <name> -->` sentinels (the same grammar
186
+ * `scripts/lib/peer-cards/merger.mjs` parses). A proposed body that carries
187
+ * none — the LLM emits a bare full-body replacement per the current prompt
188
+ * contract in {@link buildPrompt}, not per-section sentinels — still counts
189
+ * as ONE delta: a non-empty full-body replacement is a real change to the
190
+ * target, and an empty proposed body counts as zero (nothing to report for a
191
+ * target the response never touched).
192
+ *
193
+ * @param {string | undefined} diffText — `diff.user` or `diff.agent` from
194
+ * {@link parseResponse}; `undefined` when the target was not emitted.
195
+ * @returns {number}
196
+ */
197
+ export function countManagedSections(diffText) {
198
+ if (typeof diffText !== 'string' || diffText.length === 0) return 0;
199
+ const matches = diffText.match(/<!--\s*BEGIN\s+MANAGED:\s*[\w-]+\s*-->/g);
200
+ return matches && matches.length > 0 ? matches.length : 1;
201
+ }
202
+
177
203
  /**
178
204
  * Assemble the prompt-ready payload object. Pure function — no I/O.
179
205
  *
@@ -393,19 +419,25 @@ async function readTopLearnings(repoRoot, topN) {
393
419
  }
394
420
 
395
421
  /**
396
- * Read and rank sessions: filter out phantom `status: 'abandoned'` stubs
397
- * (#834, session-close-backfill), sort by `completed_at` DESC, take last K.
422
+ * Read and rank sessions: collapse ledger duplicates (#1209 the ledger is
423
+ * append-only and can carry more than one raw line per physical session, see
424
+ * `scripts/lib/sessions-canonical.mjs` header), filter out phantom
425
+ * `status: 'abandoned'` stubs (#834, session-close-backfill), sort by
426
+ * `completed_at` DESC, take last K.
427
+ *
428
+ * Without the dedup, a duplicate ledger line for the SAME session can occupy
429
+ * two of the K context slots and evict a genuinely distinct, older session.
430
+ * Without the phantom filter, phantoms (0 waves, seconds of runtime) can
431
+ * displace REAL session context out of the K-window the derivation prompt sees.
398
432
  *
399
- * Without the filter, phantoms (0 waves, seconds of runtime) can displace
400
- * REAL session context out of the K-window the derivation prompt sees.
433
+ * Synchronous `readCanonicalSessions()` reads the file itself.
401
434
  *
402
435
  * @param {string} repoRoot
403
436
  * @param {number} lastK
404
- * @returns {Promise<Array<object>>}
437
+ * @returns {Array<object>}
405
438
  */
406
- async function readLastSessions(repoRoot, lastK) {
407
- const path = join(repoRoot, '.orchestrator', 'metrics', 'sessions.jsonl');
408
- const entries = filterRealSessions(await readJsonlBestEffort(path));
439
+ function readLastSessions(repoRoot, lastK) {
440
+ const entries = filterRealSessions(readCanonicalSessions({ repoRoot }));
409
441
  entries.sort((a, b) => {
410
442
  const ta = typeof a?.completed_at === 'string' ? a.completed_at : '';
411
443
  const tb = typeof b?.completed_at === 'string' ? b.completed_at : '';
@@ -488,6 +520,15 @@ export async function runDialecticDeriver({
488
520
  throw new TypeError('runDialecticDeriver: repoRoot (absolute path) is required');
489
521
  }
490
522
 
523
+ // #1206 — telemetry start marker for the mechanical `orchestrator.dialectic.
524
+ // completed` emits below. Mechanical (measured), not the coordinator's own
525
+ // typed DURATION_MS placeholder — covers every return path THIS function
526
+ // can determine on its own; see the module header for the two abort classes
527
+ // (`unknown-model`, thrown above; `subagent-crash`) and APPLY-mode success
528
+ // that only the skill-prose caller can record (merge + Agent() dispatch
529
+ // both happen one layer up, outside this pure pipeline).
530
+ const t0 = Date.now();
531
+
491
532
  // Gate 1: model fail-fast. Throws Error with the canonical message.
492
533
  validateModel(model);
493
534
 
@@ -516,6 +557,7 @@ export async function runDialecticDeriver({
516
557
  && (peerCards.agent === null || peerCards.agent === undefined)
517
558
  && (steering === null || steering === undefined)
518
559
  ) {
560
+ await recordDialecticRun({ repoRoot, status: 'empty-input', durationMs: Date.now() - t0 });
519
561
  return { status: 'empty-input', skipped_reason: 'no-input', diff: {} };
520
562
  }
521
563
 
@@ -533,6 +575,7 @@ export async function runDialecticDeriver({
533
575
  const estimatedInput = estimateInputTokens(prompt);
534
576
  const verdict = checkBudget(estimatedInput, budget);
535
577
  if (verdict.ok === false) {
578
+ await recordDialecticRun({ repoRoot, status: 'budget-exceeded', durationMs: Date.now() - t0 });
536
579
  return {
537
580
  status: 'budget-exceeded',
538
581
  used: verdict.used,
@@ -551,6 +594,7 @@ export async function runDialecticDeriver({
551
594
 
552
595
  // Gate 4: would-empty-card — refuse unless caller passed allowEmptying.
553
596
  if (!allowEmptying && detectEmptying(diff, peerCards)) {
597
+ await recordDialecticRun({ repoRoot, status: 'would-empty-card', durationMs: Date.now() - t0 });
554
598
  return {
555
599
  status: 'would-empty-card',
556
600
  skipped_reason: 'detected-empty-card-target',
@@ -563,6 +607,27 @@ export async function runDialecticDeriver({
563
607
  };
564
608
  }
565
609
 
610
+ // #1206 success telemetry — DRY-RUN ONLY. `diff` here is the run's FINAL
611
+ // artefact in dry-run mode (Step 6.4 writes it verbatim to
612
+ // `.orchestrator/dialectic-pending.md`), so the delta counts are knowable
613
+ // right here via the pure `countManagedSections()` helper. In APPLY mode
614
+ // the artefact is NOT final yet — `mergePeerCard()` still has to run, and
615
+ // that happens one layer up in `skills/evolve/SKILL.md` Step 6.4 — so the
616
+ // success emit for that branch is that caller's job, using the SAME
617
+ // `recordDialecticRun()` with the real merge-stats deltas.
618
+ if (dryRun) {
619
+ await recordDialecticRun({
620
+ repoRoot,
621
+ status: 'ok',
622
+ mode: 'dry-run',
623
+ userDeltas: countManagedSections(diff.user),
624
+ agentDeltas: countManagedSections(diff.agent),
625
+ tokensIn: response?.usage?.input_tokens,
626
+ tokensOut: response?.usage?.output_tokens,
627
+ durationMs: Date.now() - t0,
628
+ });
629
+ }
630
+
566
631
  return {
567
632
  status: 'ok',
568
633
  diff,
@@ -62,6 +62,7 @@ import { findProjectRoot, resolveInstructionFile, expandTilde } from './lib/comm
62
62
  import { parseSessionConfig } from './lib/config.mjs';
63
63
  import { createSecretValueMasker } from './lib/secret-masker.mjs';
64
64
  import { stableHostname, readHostAliases } from './lib/host-identity.mjs';
65
+ import { emitEvent, sessionAttribution } from './lib/events.mjs';
65
66
 
66
67
  // Vault-relative default write target (Epic #774 — docs Public-Split removed
67
68
  // the prior in-repo generated telemetry doc in favor of the private Meta-Vault).
@@ -310,6 +311,15 @@ export function redactLocalHostNames(s, names) {
310
311
  */
311
312
  let _secretMasker = null;
312
313
 
314
+ /**
315
+ * Learning entries handed to `anonymizeLearning` this process. Counts only
316
+ * (#1028 residue 2) — mirrors `_maskedRecords` in
317
+ * `scripts/lib/vault-mirror/process.mjs`.
318
+ */
319
+ let _maskedRecords = 0;
320
+ /** String values this process that masking actually CHANGED. Counts only. */
321
+ let _maskHits = 0;
322
+
313
323
  /**
314
324
  * Mask env-derived secret VALUES in a free-form string.
315
325
  *
@@ -322,7 +332,68 @@ let _secretMasker = null;
322
332
  function maskSecretValues(s) {
323
333
  if (typeof s !== 'string') return s;
324
334
  if (_secretMasker === null) _secretMasker = createSecretValueMasker(process.env);
325
- return _secretMasker.mask(s);
335
+ const masked = _secretMasker.mask(s);
336
+ if (masked !== s) _maskHits++;
337
+ return masked;
338
+ }
339
+
340
+ /**
341
+ * Counts-only view of the masking that happened in this process (#1028
342
+ * residue 2). FORCE-BUILDS the masker rather than reporting 0 for an unbuilt
343
+ * one — same reasoning as `getMaskerStats()` in
344
+ * `scripts/lib/vault-mirror/process.mjs`: at 0 anonymized entries the lazy
345
+ * build in `maskSecretValues` above never fires, and a `needle_count: 0` from
346
+ * that path would be indistinguishable from "this channel has no masking
347
+ * wired at all" — the exact ambiguity the telemetry exists to remove.
348
+ *
349
+ * NEVER returns a needle, a prefix of one, or any masked text — only cardinals.
350
+ *
351
+ * @returns {{ needleCount: number, records: number, hits: number }}
352
+ */
353
+ function getExportMaskerStats() {
354
+ if (_secretMasker === null) _secretMasker = createSecretValueMasker(process.env);
355
+ return { needleCount: _secretMasker.needleCount, records: _maskedRecords, hits: _maskHits };
356
+ }
357
+
358
+ /**
359
+ * Emit this channel's `orchestrator.secret_masker.applied` record — the third
360
+ * of the three masker channels (`vault-mirror`, `narrative-mirror`,
361
+ * `export-hw-learnings`) to wire it (#1028 residue 2). Same core field set as
362
+ * the sibling channels (`channel`, `needle_count`, `records`, `hits`,
363
+ * `dry_run`), plus `session_id`/`semantic_session_id` via `sessionAttribution`
364
+ * — matching the `narrative-mirror` channel's shape, since this CLI (like
365
+ * `mirrorNarrative`) always resolves a concrete `repoRoot` to attribute
366
+ * against, unlike the `vault-mirror` CLI's 2-arg `emitEvent` call.
367
+ *
368
+ * `repoRoot` is REQUIRED here rather than left to `emitEvent`'s own
369
+ * cwd-derived default (#941/#1147) — a bare 2-arg call would attribute a run
370
+ * to whatever directory the process happens to sit in rather than to the repo
371
+ * whose `learnings.jsonl` was actually exported.
372
+ *
373
+ * Best-effort: never throws, never alters the export/promote result.
374
+ *
375
+ * @param {{ repoRoot: string, dryRun: boolean }} opts
376
+ * @returns {Promise<void>}
377
+ */
378
+ async function emitMaskerTelemetry({ repoRoot, dryRun }) {
379
+ if (typeof repoRoot !== 'string' || repoRoot.length === 0) return;
380
+ try {
381
+ const stats = getExportMaskerStats();
382
+ await emitEvent(
383
+ 'orchestrator.secret_masker.applied',
384
+ {
385
+ channel: 'export-hw-learnings',
386
+ needle_count: stats.needleCount,
387
+ records: stats.records,
388
+ hits: stats.hits,
389
+ dry_run: !!dryRun,
390
+ ...sessionAttribution(repoRoot),
391
+ },
392
+ { repoRoot },
393
+ );
394
+ } catch {
395
+ /* Best-effort telemetry — a broken ledger must never fail the export. */
396
+ }
326
397
  }
327
398
 
328
399
  /**
@@ -379,6 +450,11 @@ export function bucketCpuPct(pct) {
379
450
  */
380
451
  export function anonymizeLearning(entry) {
381
452
  const e = normalizeLearning(entry);
453
+ // #1028 residue 2: counted BEFORE the masking calls below, unconditionally —
454
+ // "records handed to the masker choke-point" must not depend on whether this
455
+ // particular entry's insight/evidence happened to contain a needle. Mirrors
456
+ // `_maskedRecords++` in `scripts/lib/vault-mirror/process.mjs`.
457
+ _maskedRecords++;
382
458
  const out = {
383
459
  ...e,
384
460
  // #1025: value-mask BEFORE form-anonymize — see the ORDER IS LOAD-BEARING
@@ -488,6 +564,11 @@ function parseArgs(argv) {
488
564
  input: '.orchestrator/metrics/learnings.jsonl',
489
565
  output: undefined, // resolved lazily below (default = vault-dir target)
490
566
  generatedAt: new Date().toISOString(),
567
+ // #1028 residue 2: resolved explicitly HERE, at the CLI boundary, so the
568
+ // masker-telemetry emit in promoteHwLearnings/exportHwLearnings gets a
569
+ // real repoRoot — those library functions deliberately never default it
570
+ // themselves (see their opts.repoRoot doc for why).
571
+ repoRoot: findProjectRoot(),
491
572
  };
492
573
  for (let i = 0; i < argv.length; i++) {
493
574
  const a = argv[i];
@@ -541,9 +622,18 @@ function parseArgs(argv) {
541
622
  * @param {object} opts
542
623
  * @param {string} opts.input — path to learnings.jsonl
543
624
  * @param {boolean} opts.dryRun — if true, do not write any files
625
+ * @param {string} [opts.repoRoot] — repo whose ledger the masker-telemetry
626
+ * event (#1028 residue 2) is pinned to. EXPLICIT ONLY — never defaulted to
627
+ * `findProjectRoot()`/cwd inside this library function (#941/#1147: a
628
+ * silent cwd-derived default is exactly what let earlier callers, including
629
+ * plain test invocations, write into whichever repo the process happened to
630
+ * sit in). The CLI entrypoint below resolves and passes it explicitly;
631
+ * library callers that omit it simply get no masker-telemetry emit — see
632
+ * `emitMaskerTelemetry`'s own repoRoot guard.
544
633
  * @returns {Promise<{promoted: number, skipped: number, flags: string[]}>}
545
634
  */
546
635
  export async function promoteHwLearnings(opts) {
636
+ const repoRoot = opts.repoRoot;
547
637
  const { entries, malformed } = await readLearnings(opts.input);
548
638
 
549
639
  const hwPrivate = filterByScope(filterByType(entries, 'hardware-pattern'), 'private');
@@ -555,6 +645,10 @@ export async function promoteHwLearnings(opts) {
555
645
  }
556
646
 
557
647
  if (hwPrivate.length === 0) {
648
+ // #1028 residue 2: emitted here too — a run that anonymizes 0 entries
649
+ // still ran, and `getExportMaskerStats()` force-builds the masker so
650
+ // `needle_count` is real even though `_maskedRecords` stays 0.
651
+ await emitMaskerTelemetry({ repoRoot, dryRun: !!opts.dryRun });
558
652
  return { promoted: 0, skipped: hwPublicExisting.length, flags };
559
653
  }
560
654
 
@@ -595,10 +689,23 @@ export async function promoteHwLearnings(opts) {
595
689
  await rewriteLearnings(opts.input, allEntries);
596
690
  }
597
691
 
692
+ // #1028 residue 2: one masker-telemetry record per promote run.
693
+ await emitMaskerTelemetry({ repoRoot, dryRun: !!opts.dryRun });
694
+
598
695
  return { promoted: promotedEntries.length, skipped: hwPublicExisting.length, flags };
599
696
  }
600
697
 
698
+ /**
699
+ * @param {object} opts
700
+ * @param {string} opts.input — path to learnings.jsonl
701
+ * @param {string} opts.output — write target
702
+ * @param {boolean} opts.dryRun — if true, do not write any files
703
+ * @param {string} opts.generatedAt — ISO timestamp for the rendered doc
704
+ * @param {string} [opts.repoRoot] — see `promoteHwLearnings` opts.repoRoot doc.
705
+ * @returns {Promise<{markdown: string, count: number}>}
706
+ */
601
707
  export async function exportHwLearnings(opts) {
708
+ const repoRoot = opts.repoRoot;
602
709
  const { entries } = await readLearnings(opts.input);
603
710
  const hwPublic = filterByScope(filterByType(entries, 'hardware-pattern'), 'public');
604
711
  const anonymized = hwPublic.map((e) => anonymizeLearning(e));
@@ -608,6 +715,11 @@ export async function exportHwLearnings(opts) {
608
715
  await mkdir(path.dirname(opts.output), { recursive: true });
609
716
  await writeFile(opts.output, md, 'utf8');
610
717
  }
718
+ // #1028 residue 2: one masker-telemetry record per export run, whether or
719
+ // not any hardware-pattern entry was actually public (`hwPublic.length`
720
+ // can legitimately be 0 — `getExportMaskerStats()` still force-builds the
721
+ // masker so `needle_count` is a real measured value).
722
+ await emitMaskerTelemetry({ repoRoot, dryRun: !!opts.dryRun });
611
723
  return { markdown: md, count: hwPublic.length };
612
724
  }
613
725