session-orchestrator 5.2.0 → 5.4.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 (427) hide show
  1. package/.agents/skills/architecture/SKILL.md +3 -1
  2. package/.agents/skills/autopilot/SKILL.md +5 -1
  3. package/.agents/skills/autopilot/agents/openai.yaml +5 -0
  4. package/.agents/skills/bootstrap/SKILL.md +5 -1
  5. package/.agents/skills/bootstrap/agents/openai.yaml +5 -0
  6. package/.agents/skills/brainstorm/SKILL.md +5 -1
  7. package/.agents/skills/brainstorm/agents/openai.yaml +5 -0
  8. package/.agents/skills/claude-md-drift-check/SKILL.md +4 -2
  9. package/.agents/skills/close/SKILL.md +5 -1
  10. package/.agents/skills/close/agents/openai.yaml +5 -0
  11. package/.agents/skills/convergence-monitoring/SKILL.md +4 -2
  12. package/.agents/skills/debug/SKILL.md +5 -1
  13. package/.agents/skills/debug/agents/openai.yaml +5 -0
  14. package/.agents/skills/discovery/SKILL.md +5 -1
  15. package/.agents/skills/discovery/agents/openai.yaml +5 -0
  16. package/.agents/skills/dispatcher/SKILL.md +5 -1
  17. package/.agents/skills/dispatcher/agents/openai.yaml +5 -0
  18. package/.agents/skills/docs-orchestrator/SKILL.md +3 -1
  19. package/.agents/skills/ecosystem-health/SKILL.md +3 -1
  20. package/.agents/skills/eli5/SKILL.md +5 -1
  21. package/.agents/skills/eli5/agents/openai.yaml +5 -0
  22. package/.agents/skills/eval/SKILL.md +6 -2
  23. package/.agents/skills/eval/agents/openai.yaml +5 -0
  24. package/.agents/skills/evolve/SKILL.md +6 -2
  25. package/.agents/skills/evolve/agents/openai.yaml +5 -0
  26. package/.agents/skills/frontmatter-guard/SKILL.md +3 -1
  27. package/.agents/skills/gitlab-ops/SKILL.md +3 -1
  28. package/.agents/skills/gitlab-portfolio/SKILL.md +3 -1
  29. package/.agents/skills/go/SKILL.md +5 -1
  30. package/.agents/skills/go/agents/openai.yaml +5 -0
  31. package/.agents/skills/grill/SKILL.md +5 -1
  32. package/.agents/skills/grill/agents/openai.yaml +5 -0
  33. package/.agents/skills/harness-audit/SKILL.md +5 -1
  34. package/.agents/skills/harness-audit/agents/openai.yaml +5 -0
  35. package/.agents/skills/hook-development/SKILL.md +3 -1
  36. package/.agents/skills/mcp-builder/SKILL.md +3 -1
  37. package/.agents/skills/memory-cleanup/SKILL.md +5 -1
  38. package/.agents/skills/memory-cleanup/agents/openai.yaml +5 -0
  39. package/.agents/skills/mode-selector/SKILL.md +3 -1
  40. package/.agents/skills/navigator/SKILL.md +22 -0
  41. package/.agents/skills/navigator/agents/openai.yaml +5 -0
  42. package/.agents/skills/npm-publish/SKILL.md +4 -2
  43. package/.agents/skills/peekaboo-driver/SKILL.md +3 -1
  44. package/.agents/skills/persona-panel/SKILL.md +5 -1
  45. package/.agents/skills/persona-panel/agents/openai.yaml +5 -0
  46. package/.agents/skills/plan/SKILL.md +5 -1
  47. package/.agents/skills/plan/agents/openai.yaml +5 -0
  48. package/.agents/skills/playwright-driver/SKILL.md +3 -1
  49. package/.agents/skills/portfolio/SKILL.md +5 -1
  50. package/.agents/skills/portfolio/agents/openai.yaml +5 -0
  51. package/.agents/skills/quality-gates/SKILL.md +3 -1
  52. package/.agents/skills/reconcile/SKILL.md +5 -1
  53. package/.agents/skills/reconcile/agents/openai.yaml +5 -0
  54. package/.agents/skills/release/SKILL.md +5 -1
  55. package/.agents/skills/release/agents/openai.yaml +5 -0
  56. package/.agents/skills/remote-offload/SKILL.md +3 -1
  57. package/.agents/skills/repo-audit/SKILL.md +5 -1
  58. package/.agents/skills/repo-audit/agents/openai.yaml +5 -0
  59. package/.agents/skills/session/SKILL.md +21 -0
  60. package/.agents/skills/session/agents/openai.yaml +5 -0
  61. package/.agents/skills/session-end/SKILL.md +3 -1
  62. package/.agents/skills/session-plan/SKILL.md +3 -1
  63. package/.agents/skills/session-start/SKILL.md +3 -1
  64. package/.agents/skills/spinout/SKILL.md +5 -1
  65. package/.agents/skills/spinout/agents/openai.yaml +5 -0
  66. package/.agents/skills/sunset-review/SKILL.md +5 -1
  67. package/.agents/skills/sunset-review/agents/openai.yaml +5 -0
  68. package/.agents/skills/templates-ack/SKILL.md +21 -0
  69. package/.agents/skills/templates-ack/agents/openai.yaml +5 -0
  70. package/.agents/skills/test/SKILL.md +5 -1
  71. package/.agents/skills/test/agents/openai.yaml +5 -0
  72. package/.agents/skills/test-audit/SKILL.md +21 -0
  73. package/.agents/skills/test-audit/agents/openai.yaml +5 -0
  74. package/.agents/skills/test-runner/SKILL.md +3 -1
  75. package/.agents/skills/tmux-layout/SKILL.md +3 -1
  76. package/.agents/skills/using-orchestrator/SKILL.md +3 -1
  77. package/.agents/skills/ux-grill/SKILL.md +5 -1
  78. package/.agents/skills/ux-grill/agents/openai.yaml +5 -0
  79. package/.agents/skills/vault-mirror/SKILL.md +3 -1
  80. package/.agents/skills/vault-sync/SKILL.md +3 -1
  81. package/.agents/skills/wave-executor/SKILL.md +3 -1
  82. package/.agents/skills/write-executable-plan/SKILL.md +3 -1
  83. package/.claude-plugin/marketplace.json +1 -1
  84. package/.claude-plugin/plugin.json +1 -1
  85. package/.codex-plugin/plugin.json +4 -4
  86. package/.codex-plugin/skills/claude-md-drift-check/SKILL.md +1 -1
  87. package/.codex-plugin/skills/convergence-monitoring/SKILL.md +1 -3
  88. package/.codex-plugin/skills/eval/SKILL.md +1 -1
  89. package/.codex-plugin/skills/evolve/SKILL.md +1 -1
  90. package/.codex-plugin/skills/navigator/SKILL.md +22 -0
  91. package/.codex-plugin/skills/{convergence-monitoring → navigator}/agents/openai.yaml +2 -2
  92. package/.codex-plugin/skills/npm-publish/SKILL.md +1 -3
  93. package/.codex-plugin/skills/session/SKILL.md +1 -1
  94. package/.codex-plugin/skills/test-audit/SKILL.md +21 -0
  95. package/.codex-plugin/skills/{npm-publish → test-audit}/agents/openai.yaml +1 -1
  96. package/.cursor/commands/eval.md +1 -1
  97. package/.cursor/commands/navigator.md +15 -0
  98. package/.cursor/commands/session.md +1 -1
  99. package/.cursor/commands/test-audit.md +14 -0
  100. package/.cursor/rules/000-session-orchestrator.mdc +0 -2
  101. package/.cursor/rules/050-plan.mdc +1 -1
  102. package/.cursor/rules/060-evolve.mdc +27 -12
  103. package/.cursor/skills/claude-md-drift-check/SKILL.md +1 -1
  104. package/.cursor/skills/convergence-monitoring/SKILL.md +1 -0
  105. package/.cursor/skills/eval/SKILL.md +1 -1
  106. package/.cursor/skills/navigator/SKILL.md +13 -0
  107. package/.cursor/skills/npm-publish/SKILL.md +1 -0
  108. package/.cursor/skills/test-audit/SKILL.md +12 -0
  109. package/.cursor-plugin/plugin.json +1 -1
  110. package/.orchestrator/policy/blocked-commands.json +12 -3
  111. package/AGENTS.md +9 -30
  112. package/CHANGELOG.md +206 -0
  113. package/README.md +13 -9
  114. package/SECURITY.md +12 -0
  115. package/agents/dialectic-deriver.md +13 -10
  116. package/agents/eval-judge.md +67 -45
  117. package/agents/skill-applied-judge.md +34 -19
  118. package/commands/session.md +7 -3
  119. package/docs/agent-authoring.md +2 -2
  120. package/docs/baseline.md +22 -7
  121. package/docs/ci-setup.md +57 -4
  122. package/docs/codex-setup.md +14 -2
  123. package/docs/components.md +12 -10
  124. package/docs/events-schema.md +65 -15
  125. package/docs/persona-panel.md +5 -4
  126. package/docs/rule-authoring.md +84 -17
  127. package/docs/scope-collision-guard.md +26 -4
  128. package/docs/session-config-reference.md +154 -12
  129. package/docs/session-config-template.md +41 -3
  130. package/docs/telemetry.md +2 -0
  131. package/hooks/_lib/hook-import-set.json +87 -6
  132. package/hooks/_lib/subagent-transcript.mjs +582 -31
  133. package/hooks/config-protection.mjs +11 -3
  134. package/hooks/cwd-change-restore.mjs +11 -3
  135. package/hooks/enforce-commands.mjs +70 -23
  136. package/hooks/enforce-scope.mjs +143 -33
  137. package/hooks/hooks-codex.json +1 -1
  138. package/hooks/hooks-cursor.json +5 -0
  139. package/hooks/hooks-pi.json +5 -0
  140. package/hooks/hooks.json +6 -1
  141. package/hooks/loop-guard.mjs +11 -3
  142. package/hooks/on-session-end.mjs +58 -23
  143. package/hooks/on-session-start.mjs +101 -11
  144. package/hooks/on-stop.mjs +170 -22
  145. package/hooks/operator-steer.mjs +11 -3
  146. package/hooks/post-bash-issue-budget-refund.mjs +18 -8
  147. package/hooks/post-bash-write-verify.mjs +3 -2
  148. package/hooks/post-edit-import-probe.mjs +17 -9
  149. package/hooks/post-edit-validate.mjs +13 -5
  150. package/hooks/post-subagent-discovery-validator.mjs +98 -13
  151. package/hooks/post-tool-batch-wave-signal.mjs +202 -38
  152. package/hooks/post-tool-failure-corrective-context.mjs +11 -5
  153. package/hooks/post-tooluse-frontend-slop.mjs +10 -4
  154. package/hooks/pre-auq-clarity.mjs +15 -2
  155. package/hooks/pre-bash-destructive-guard.mjs +80 -9
  156. package/hooks/pre-bash-issue-budget.mjs +16 -11
  157. package/hooks/pre-bash-memory-propose-audit.mjs +137 -56
  158. package/hooks/pre-bash-sessions-ledger-guard.mjs +419 -22
  159. package/hooks/pre-bash-staging-fence.mjs +335 -31
  160. package/hooks/pre-bash-templates-first.mjs +19 -14
  161. package/hooks/pre-edit-sessions-ledger-guard.mjs +162 -0
  162. package/hooks/pre-task-scope-disjoint.mjs +792 -74
  163. package/hooks/subagent-telemetry.mjs +111 -38
  164. package/hooks/wave-scope-commit-guard.mjs +197 -100
  165. package/monitors/monitors.json +1 -1
  166. package/output-styles/wave-summary.md +1 -1
  167. package/package.json +3 -3
  168. package/pi/prompts/eval.md +1 -1
  169. package/pi/prompts/navigator.md +12 -0
  170. package/pi/prompts/session.md +1 -1
  171. package/pi/prompts/test-audit.md +12 -0
  172. package/rules/README.md +7 -2
  173. package/rules/_index.md +3 -3
  174. package/rules/always-on/bash-harness-pitfalls.md +7 -1
  175. package/rules/opt-in-domain/prompt-caching.md +6 -2
  176. package/rules/opt-in-stack/backend-data.md +10 -2
  177. package/rules/opt-in-stack/backend.md +10 -4
  178. package/rules/opt-in-stack/frontend.md +7 -2
  179. package/rules/opt-in-stack/security-web.md +10 -4
  180. package/rules/opt-in-stack/swift.md +6 -2
  181. package/scripts/apply-session-learnings.mjs +492 -0
  182. package/scripts/archive-closed-prds.mjs +2 -1
  183. package/scripts/autopilot.mjs +70 -53
  184. package/scripts/backfill-abandoned-sessions.mjs +118 -16
  185. package/scripts/baseline-archetypes.mjs +1 -1
  186. package/scripts/check-package-manager.mjs +62 -5
  187. package/scripts/check-sessions-integrity.mjs +300 -0
  188. package/scripts/cursor-install.mjs +1 -4
  189. package/scripts/dialectic-deriver.mjs +50 -13
  190. package/scripts/emit-session.mjs +371 -31
  191. package/scripts/eval-session.mjs +65 -3
  192. package/scripts/export-hw-learnings.mjs +22 -3
  193. package/scripts/fleet-checkin.mjs +147 -0
  194. package/scripts/generate-agents-skills.mjs +102 -29
  195. package/scripts/generate-cursor-adapter.mjs +61 -16
  196. package/scripts/lib/agent-frontmatter.mjs +3 -3
  197. package/scripts/lib/agent-status.mjs +2 -31
  198. package/scripts/lib/auq/clarity.mjs +10 -2
  199. package/scripts/lib/auq/parse.mjs +12 -31
  200. package/scripts/lib/auq/schema.mjs +56 -41
  201. package/scripts/lib/auto-dialectic.mjs +304 -15
  202. package/scripts/lib/auto-dream.mjs +7 -6
  203. package/scripts/lib/autopilot/flags.mjs +18 -2
  204. package/scripts/lib/autopilot/kill-switches.mjs +6 -3
  205. package/scripts/lib/autopilot/loop.mjs +19 -2
  206. package/scripts/lib/autopilot/stall-sampler.mjs +80 -23
  207. package/scripts/lib/baseline-archetypes.mjs +41 -22
  208. package/scripts/lib/ci-status-banner.mjs +376 -16
  209. package/scripts/lib/command-blocker.mjs +275 -28
  210. package/scripts/lib/config/dialectic.mjs +12 -3
  211. package/scripts/lib/config/gate.mjs +74 -0
  212. package/scripts/lib/config/host-paths.mjs +79 -0
  213. package/scripts/lib/config/persona-gate-wave.mjs +3 -3
  214. package/scripts/lib/config/reaper.mjs +163 -0
  215. package/scripts/lib/config-schema.mjs +13 -0
  216. package/scripts/lib/config.mjs +85 -10
  217. package/scripts/lib/convergence-monitor.mjs +74 -11
  218. package/scripts/lib/ecosystem-health.mjs +11 -0
  219. package/scripts/lib/eval/engine.mjs +421 -53
  220. package/scripts/lib/eval/judge.mjs +463 -40
  221. package/scripts/lib/eval/schema.mjs +10 -1
  222. package/scripts/lib/events-rotation.mjs +221 -25
  223. package/scripts/lib/events-schema.mjs +114 -0
  224. package/scripts/lib/events.mjs +545 -7
  225. package/scripts/lib/fleet-protocol.mjs +270 -0
  226. package/scripts/lib/frontmatter-guard.mjs +21 -10
  227. package/scripts/lib/gates/gate-baseline.mjs +40 -5
  228. package/scripts/lib/gates/gate-full.mjs +35 -5
  229. package/scripts/lib/gates/gate-helpers.mjs +336 -23
  230. package/scripts/lib/gates/gate-incremental.mjs +49 -23
  231. package/scripts/lib/gates/gate-per-file.mjs +42 -8
  232. package/scripts/lib/gitlab-portfolio/markdown-writer.mjs +6 -1
  233. package/scripts/lib/instruction-budget-guard.mjs +208 -8
  234. package/scripts/lib/io.mjs +42 -8
  235. package/scripts/lib/issue-close-strip-labels.mjs +207 -49
  236. package/scripts/lib/js-mask.mjs +197 -0
  237. package/scripts/lib/learnings/evolve-telemetry.mjs +11 -7
  238. package/scripts/lib/learnings/expiry-sweep.mjs +34 -3
  239. package/scripts/lib/learnings/io.mjs +154 -26
  240. package/scripts/lib/learnings/schema.mjs +163 -15
  241. package/scripts/lib/learnings/sizing-subject.mjs +2 -2
  242. package/scripts/lib/maintenance-due-banner.mjs +53 -88
  243. package/scripts/lib/memory-proposals/schema.mjs +11 -5
  244. package/scripts/lib/named-baseline-resolver.mjs +53 -28
  245. package/scripts/lib/named-vault-resolver.mjs +104 -5
  246. package/scripts/lib/orphan-reaper/defaults.mjs +41 -0
  247. package/scripts/lib/orphan-reaper/ps-snapshot.mjs +181 -0
  248. package/scripts/lib/orphan-reaper/reaper-audit.mjs +291 -0
  249. package/scripts/lib/orphan-reaper/reaper-decide.mjs +395 -0
  250. package/scripts/lib/orphan-reaper/scan-throttle.mjs +92 -0
  251. package/scripts/lib/orphan-reaper/scan.mjs +506 -0
  252. package/scripts/lib/orphan-reaper.mjs +316 -0
  253. package/scripts/lib/owner-yaml.mjs +104 -6
  254. package/scripts/lib/peer-cards/merger.mjs +48 -10
  255. package/scripts/lib/peer-cards/reader.mjs +78 -2
  256. package/scripts/lib/persona-panel/catalog-loader.mjs +1 -1
  257. package/scripts/lib/process-group.mjs +950 -0
  258. package/scripts/lib/project-hygiene.mjs +21 -1
  259. package/scripts/lib/quality-gate.mjs +152 -33
  260. package/scripts/lib/reconcile/backlog.mjs +368 -0
  261. package/scripts/lib/reconcile/engine.mjs +55 -188
  262. package/scripts/lib/reconcile/rule-expiry-sweep.mjs +302 -60
  263. package/scripts/lib/reconcile/sanitize.mjs +69 -3
  264. package/scripts/lib/reconcile-nudge-banner.mjs +138 -45
  265. package/scripts/lib/resource-probe/parsers.mjs +31 -0
  266. package/scripts/lib/resource-probe.mjs +1 -1
  267. package/scripts/lib/rule-loader.mjs +141 -74
  268. package/scripts/lib/rules-sync.mjs +27 -12
  269. package/scripts/lib/scope-baseline.mjs +3 -4
  270. package/scripts/lib/scope-echo.mjs +39 -2
  271. package/scripts/lib/scope-gate.mjs +605 -1
  272. package/scripts/lib/session-close-backfill.mjs +33 -6
  273. package/scripts/lib/session-id.mjs +9 -20
  274. package/scripts/lib/session-invocation.mjs +20 -0
  275. package/scripts/lib/session-record-repair.mjs +183 -26
  276. package/scripts/lib/session-registry.mjs +27 -2
  277. package/scripts/lib/session-schema/constants.mjs +56 -2
  278. package/scripts/lib/session-schema/normalizer.mjs +56 -4
  279. package/scripts/lib/session-schema/validator.mjs +28 -1
  280. package/scripts/lib/session-schema.mjs +8 -3
  281. package/scripts/lib/session-start-probes.mjs +95 -10
  282. package/scripts/lib/session-token-rollup.mjs +245 -52
  283. package/scripts/lib/sessions-canonical.mjs +118 -4
  284. package/scripts/lib/sessions-integrity-banner.mjs +7 -1
  285. package/scripts/lib/sessions-staleness-banner.mjs +193 -51
  286. package/scripts/lib/sh-quote.mjs +29 -0
  287. package/scripts/lib/skill-evidence-window.mjs +891 -0
  288. package/scripts/lib/skill-evolution/candidate-intake.mjs +133 -12
  289. package/scripts/lib/skill-evolution/engine.mjs +18 -9
  290. package/scripts/lib/skill-judge.mjs +45 -3
  291. package/scripts/lib/subagents-schema.mjs +30 -3
  292. package/scripts/lib/tail-window.mjs +56 -0
  293. package/scripts/lib/telemetry/pricing.mjs +118 -71
  294. package/scripts/lib/telemetry/schema.mjs +30 -0
  295. package/scripts/lib/telemetry/sync.mjs +61 -6
  296. package/scripts/lib/telemetry-flush-health-banner.mjs +4 -22
  297. package/scripts/lib/test-runner/issue-reconcile.mjs +48 -16
  298. package/scripts/lib/tests-src-ratio.mjs +140 -23
  299. package/scripts/lib/tmux-layout/layouts.mjs +1 -11
  300. package/scripts/lib/tmux-layout/telemetry-stats.mjs +72 -13
  301. package/scripts/lib/tmux-layout/tmux-shell.mjs +2 -11
  302. package/scripts/lib/user-invocable-skills.mjs +23 -3
  303. package/scripts/lib/ux-grill/reconcile.mjs +48 -22
  304. package/scripts/lib/validate/check-agents-skills.mjs +26 -15
  305. package/scripts/lib/validate/check-agents.mjs +1 -1
  306. package/scripts/lib/validate/check-cursor-adapter.mjs +1 -0
  307. package/scripts/lib/validate/check-entry-guard.mjs +13 -50
  308. package/scripts/lib/validate/check-hook-entry-guards.mjs +636 -0
  309. package/scripts/lib/validate/check-hooks-symmetry.mjs +5 -0
  310. package/scripts/lib/validate/check-learnings-shell-writes.mjs +214 -0
  311. package/scripts/lib/validate/check-pi-prompts.mjs +1 -0
  312. package/scripts/lib/validate/check-rules.mjs +7 -5
  313. package/scripts/lib/validate/check-skill-links.mjs +9 -1
  314. package/scripts/lib/validate/check-skill-script-paths.mjs +239 -27
  315. package/scripts/lib/validate/check-test-git-config-target.mjs +24 -34
  316. package/scripts/lib/validate/check-test-value-bans.mjs +87 -14
  317. package/scripts/lib/validate/check-unicode-safety.mjs +1 -0
  318. package/scripts/lib/validate/check-untracked-test-deps.mjs +7 -102
  319. package/scripts/lib/validate/check-unwired-features.mjs +130 -27
  320. package/scripts/lib/validate/check-validator-registration.mjs +34 -10
  321. package/scripts/lib/validate/confidential-names.mjs +10 -0
  322. package/scripts/lib/validate-vendored-rules.mjs +210 -84
  323. package/scripts/lib/vault-mirror/namespace.mjs +46 -8
  324. package/scripts/lib/vault-mirror/process.mjs +10 -3
  325. package/scripts/lib/vault-mirror/render-sessions.mjs +12 -2
  326. package/scripts/lib/vault-mirror/telemetry.mjs +8 -1
  327. package/scripts/lib/vault-status/board-writer.mjs +48 -11
  328. package/scripts/lib/vault-status/narrative-mirror.mjs +71 -16
  329. package/scripts/lib/vault-yaml.mjs +118 -0
  330. package/scripts/lib/wave-executor/dispatch-common.mjs +10 -18
  331. package/scripts/lib/wave-executor/foreign-dispatch.mjs +1 -1
  332. package/scripts/lib/wave-executor/remote-dispatch.mjs +1 -1
  333. package/scripts/lib/wave-resource-gate.mjs +34 -8
  334. package/scripts/lib/worktree/lifecycle.mjs +153 -1
  335. package/scripts/memory-propose.mjs +18 -5
  336. package/scripts/release-session-lock.mjs +306 -0
  337. package/scripts/release.mjs +40 -8
  338. package/scripts/repair-invalid-sessions.mjs +37 -4
  339. package/scripts/resolve-session-invocation.mjs +59 -0
  340. package/scripts/run-migrate-v2-cross-repo.mjs +158 -30
  341. package/scripts/run-quality-gate.mjs +357 -197
  342. package/scripts/site-numbers.mjs +163 -5
  343. package/scripts/sweep-expired-learnings.mjs +56 -5
  344. package/scripts/sweep-expired-rules.mjs +16 -4
  345. package/scripts/validate-plugin.mjs +19 -0
  346. package/scripts/validate-wave-scope.mjs +32 -105
  347. package/scripts/vault-integration-watcher.mjs +2 -1
  348. package/scripts/vault-mirror.mjs +81 -47
  349. package/scripts/wave-scope-binding.mjs +2 -1
  350. package/skills/_shared/config-reading.md +3 -3
  351. package/skills/_shared/fleet-protocol.md +131 -0
  352. package/skills/_shared/platform-tools.md +23 -11
  353. package/skills/_shared/state-ownership.md +5 -0
  354. package/skills/autopilot/SKILL.md +47 -18
  355. package/skills/bootstrap/SKILL.md +1 -1
  356. package/skills/bootstrap/_shared-template.md +1 -1
  357. package/skills/bootstrap/fast-template.md +1 -1
  358. package/skills/bootstrap/private-contract.md +2 -1
  359. package/skills/bootstrap/public-fallback.md +6 -3
  360. package/skills/bootstrap/references/bootstrap-retroactive-flow.md +2 -1
  361. package/skills/claude-md-drift-check/SKILL.md +10 -10
  362. package/skills/claude-md-drift-check/checker.mjs +26 -18
  363. package/skills/convergence-monitoring/README.md +8 -1
  364. package/skills/convergence-monitoring/SIGNALS.md +50 -6
  365. package/skills/convergence-monitoring/SKILL.md +15 -6
  366. package/skills/eval/SKILL.md +39 -24
  367. package/skills/eval/rubric-v1.md +1 -0
  368. package/skills/eval/rubric-v2.md +457 -0
  369. package/skills/evolve/SKILL.md +3 -3
  370. package/skills/evolve/references/evolve-analyze-mode.md +10 -6
  371. package/skills/evolve/references/evolve-dialectic-mode.md +42 -25
  372. package/skills/gitlab-ops/SKILL.md +3 -2
  373. package/skills/memory-cleanup/SKILL.md +1 -1
  374. package/skills/navigator/SKILL.md +193 -0
  375. package/skills/navigator/references/account-check.sh +87 -0
  376. package/skills/navigator/references/fleet-decisions.mjs +231 -0
  377. package/skills/navigator/references/slot-check.sh +114 -0
  378. package/skills/npm-publish/SKILL.md +1 -1
  379. package/skills/persona-panel/SKILL.md +2 -2
  380. package/skills/persona-panel/persona-format.md +2 -2
  381. package/skills/persona-panel/presets/designer-lens.md +1 -1
  382. package/skills/persona-panel/presets/engineer-lens.md +1 -1
  383. package/skills/persona-panel/presets/pm-lens.md +1 -1
  384. package/skills/plan/mode-retro.md +19 -4
  385. package/skills/quality-gates/SKILL.md +6 -4
  386. package/skills/reconcile/SKILL.md +11 -0
  387. package/skills/remote-offload/SKILL.md +4 -2
  388. package/skills/session-end/SKILL.md +13 -16
  389. package/skills/session-end/discovery-scan.md +1 -1
  390. package/skills/session-end/learning-patterns.md +22 -12
  391. package/skills/session-end/metrics-collection.md +5 -6
  392. package/skills/session-end/phase-3-6-tail.md +55 -9
  393. package/skills/session-end/references/phase-3-documentation-updates.md +2 -2
  394. package/skills/session-end/references/phase-4a-worktree-cleanup.md +2 -0
  395. package/skills/session-end/references/phase-5-issue-cleanup.md +9 -14
  396. package/skills/session-end/references/session-summary-template.md +1 -1
  397. package/skills/session-end/session-metrics-write.md +32 -60
  398. package/skills/session-plan/SKILL.md +17 -8
  399. package/skills/session-plan/references/session-plan-task-classification.md +2 -2
  400. package/skills/session-start/SKILL.md +6 -0
  401. package/skills/session-start/references/operations-contract.md +4 -0
  402. package/skills/session-start/references/phase-1-7-vault-status-board.md +1 -1
  403. package/skills/session-start/references/phase-4-ssot-environment-check.md +4 -3
  404. package/skills/test-audit/SKILL.md +152 -0
  405. package/skills/test-audit/references/campaign.md +111 -0
  406. package/skills/test-audit/references/mutate.sh +50 -0
  407. package/skills/ux-grill/SKILL.md +1 -1
  408. package/skills/wave-executor/SKILL.md +9 -5
  409. package/skills/wave-executor/circuit-breaker.md +2 -0
  410. package/skills/wave-executor/references/wave-executor-state-init.md +8 -3
  411. package/skills/wave-executor/references/wave-loop-dispatch.md +5 -2
  412. package/skills/wave-executor/references/wave-loop-review.md +3 -5
  413. package/templates/personas/README.md +5 -5
  414. package/templates/personas/accounting-compliance.v1.md +1 -1
  415. package/templates/personas/accounting-tax-advisor.v1.md +1 -1
  416. package/templates/personas/buyer-p1-cto.v1.md +1 -1
  417. package/templates/personas/buyer-p2-kanzlei.v1.md +1 -1
  418. package/templates/personas/buyer-p3-build.v1.md +1 -1
  419. package/templates/personas/buyer-p4-tech-veto.v1.md +1 -1
  420. package/templates/personas/buyer-p5-solo.v1.md +1 -1
  421. package/templates/personas/buyer-p6-ld.v1.md +1 -1
  422. package/templates/personas/klima-ai-expert.v1.md +1 -1
  423. package/templates/personas/klima-physicist.v1.md +1 -1
  424. package/.cursor/commands/convergence-monitoring.md +0 -13
  425. package/.cursor/commands/npm-publish.md +0 -13
  426. package/pi/prompts/convergence-monitoring.md +0 -11
  427. package/pi/prompts/npm-publish.md +0 -11
@@ -5,12 +5,12 @@
5
5
  * Imports: constants.mjs. No imports from siblings (validator, timestamps,
6
6
  * aliases) or parent barrel.
7
7
  *
8
- * Exports: normalizeSession
8
+ * Exports: normalizeSession, normalizeWaveKeys
9
9
  * Module-private: _warnedMissingSchemaVersion (Set, per-process dedupe),
10
- * isPlainObject, _canonicalizeExpressPath
10
+ * isPlainObject, _canonicalizeExpressPath, _aliasWaves
11
11
  */
12
12
 
13
- import { SESSION_KEY_ALIASES } from './constants.mjs';
13
+ import { SESSION_KEY_ALIASES, WAVE_KEY_ALIASES } from './constants.mjs';
14
14
 
15
15
  // ---------------------------------------------------------------------------
16
16
  // Module-level state
@@ -79,12 +79,61 @@ function _canonicalizeExpressPath(next) {
79
79
  next.express_path = raw.activated;
80
80
  }
81
81
 
82
+ /**
83
+ * Apply WAVE_KEY_ALIASES to every plain-object wave, mirroring the top-level
84
+ * SESSION_KEY_ALIASES rule: the legacy key is preserved, and an existing
85
+ * canonical key is never clobbered. Copy-on-write — the caller's wave objects
86
+ * are never mutated (normalizeSession's `{ ...entry }` is shallow, so `waves`
87
+ * is still the caller's array).
88
+ *
89
+ * @param {any[]} waves
90
+ * @returns {any[]} the same array reference when no wave needed an alias
91
+ */
92
+ function _aliasWaves(waves) {
93
+ let changed = false;
94
+ const out = waves.map((w) => {
95
+ if (!isPlainObject(w)) return w;
96
+ let copy = null;
97
+ for (const [oldKey, newKey] of Object.entries(WAVE_KEY_ALIASES)) {
98
+ if (oldKey in w && !(newKey in w)) {
99
+ copy ??= { ...w };
100
+ copy[newKey] = w[oldKey];
101
+ }
102
+ }
103
+ if (copy === null) return w;
104
+ changed = true;
105
+ return copy;
106
+ });
107
+ return changed ? out : waves;
108
+ }
109
+
82
110
  // ---------------------------------------------------------------------------
83
111
  // Public API
84
112
  // ---------------------------------------------------------------------------
85
113
 
86
114
  /**
87
- * Normalize a session entry read from disk. Applies SAFE key aliases, collapses
115
+ * Apply ONLY the per-wave key aliases (WAVE_KEY_ALIASES) to a session entry —
116
+ * the subset of normalizeSession that is safe on the WRITE path
117
+ * (scripts/emit-session.mjs, #1390 P1). The rest of normalizeSession is not:
118
+ * it tags a missing `schema_version` as 0 where validateSession stamps the
119
+ * current version, and applies top-level aliases the write-path contract
120
+ * explicitly excludes.
121
+ *
122
+ * Never throws. Non-objects and entries without a `waves` array are returned
123
+ * unchanged; so is an entry none of whose waves needs an alias (same reference).
124
+ *
125
+ * @param {any} entry
126
+ * @returns {any} a new entry with aliased waves, or the input unchanged
127
+ */
128
+ export function normalizeWaveKeys(entry) {
129
+ if (!isPlainObject(entry) || !Array.isArray(entry.waves)) return entry;
130
+ const waves = _aliasWaves(entry.waves);
131
+ return waves === entry.waves ? entry : { ...entry, waves };
132
+ }
133
+
134
+ /**
135
+ * Normalize a session entry read from disk. Applies SAFE key aliases (top-level
136
+ * SESSION_KEY_ALIASES and per-wave WAVE_KEY_ALIASES), collapses
88
137
  * the legacy object form of `express_path` onto its canonical boolean, and tags
89
138
  * legacy entries without `schema_version` as 0 (distinct from
90
139
  * CURRENT_SESSION_SCHEMA_VERSION=2 which is stamped on new writes; bumped
@@ -112,6 +161,9 @@ export function normalizeSession(entry) {
112
161
  }
113
162
  }
114
163
 
164
+ // Per-wave aliases (#1390 P1) — same non-clobber rule, one level down.
165
+ if (Array.isArray(next.waves)) next.waves = _aliasWaves(next.waves);
166
+
115
167
  // express_path — same key, two shapes. Collapse onto the canonical boolean.
116
168
  _canonicalizeExpressPath(next);
117
169
 
@@ -386,7 +386,9 @@ function _validateOptionalFields(entry) {
386
386
  }
387
387
  // #1244 — cache buckets, cost estimate and the token-contract marker.
388
388
  // Same non-negative-finite-or-null contract as the two totals above;
389
- // total_cost_usd is fractional and null means "unknown model", never 0.
389
+ // total_cost_usd is fractional; null means "cost unknown" — at least one
390
+ // subagent record could not be priced (#1475: unknown model, no model, or no
391
+ // tokens; see cost_records_* below) — never 0.
390
392
  for (const field of [
391
393
  'total_token_input_uncached',
392
394
  'total_token_cache_read',
@@ -417,6 +419,31 @@ function _validateOptionalFields(entry) {
417
419
  }
418
420
  }
419
421
 
422
+ // #1436 — the session-level token total and the rollup's record count, merged
423
+ // by emit-session from subagents.jsonl. Same contract as subagents_with_tokens:
424
+ // a non-negative integer, null/absent = not measured. Before this, neither was
425
+ // checked and `total_tokens: "abc"` validated — the field the autopilot token
426
+ // budget reads. #1475 adds the rollup's cost-coverage counters under the same
427
+ // contract, plus the one relation between them: priced never exceeds total.
428
+ for (const field of ['total_tokens', 'matched_records', 'cost_records_priced', 'cost_records_total']) {
429
+ const value = entry[field];
430
+ if (value !== undefined && value !== null) {
431
+ if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {
432
+ throw new ValidationError(`${field} must be a non-negative integer, got: ${value}`);
433
+ }
434
+ }
435
+ }
436
+ if (
437
+ Number.isInteger(entry.cost_records_priced) &&
438
+ Number.isInteger(entry.cost_records_total) &&
439
+ entry.cost_records_priced > entry.cost_records_total
440
+ ) {
441
+ throw new ValidationError(
442
+ `cost_records_priced must not exceed cost_records_total, got: ` +
443
+ `${entry.cost_records_priced} > ${entry.cost_records_total}`
444
+ );
445
+ }
446
+
420
447
  // Epic #724 C1 — SessionEnd close-through backfill provenance fields.
421
448
  // All additive-optional; null/absent passes without further checks so that
422
449
  // pre-#724 records (and every normally-closed record) validate cleanly.
@@ -59,7 +59,7 @@
59
59
  * SESSION_KEY_ALIASES, VALID_SESSION_TYPES,
60
60
  * REQUIRED_FIELDS, AGENT_SUMMARY_FIELDS
61
61
  * session-schema/validator.mjs — ValidationError, validateSession
62
- * session-schema/normalizer.mjs — normalizeSession
62
+ * session-schema/normalizer.mjs — normalizeSession, normalizeWaveKeys
63
63
  * session-schema/timestamps.mjs — clampTimestampsMonotonic
64
64
  * session-schema/aliases.mjs — aliasLegacyEndedAt
65
65
  */
@@ -67,7 +67,12 @@
67
67
  export { CURRENT_SESSION_SCHEMA_VERSION, SESSION_KEY_ALIASES } from './session-schema/constants.mjs';
68
68
  export { ValidationError, validateSession } from './session-schema/validator.mjs';
69
69
  export { serializeSessionLineChecked } from './session-schema/serializer.mjs';
70
- export { normalizeSession } from './session-schema/normalizer.mjs';
70
+ export { normalizeSession, normalizeWaveKeys } from './session-schema/normalizer.mjs';
71
71
  export { clampTimestampsMonotonic } from './session-schema/timestamps.mjs';
72
72
  export { aliasLegacyEndedAt } from './session-schema/aliases.mjs';
73
- export { isRealSession, filterRealSessions, tailRealSessions } from './session-schema/filters.mjs';
73
+ export {
74
+ isRealSession,
75
+ filterRealSessions,
76
+ tailRealSessions,
77
+ isCoordinatorDirectHousekeeping,
78
+ } from './session-schema/filters.mjs';
@@ -70,11 +70,22 @@ const local = (rel) => pathToFileURL(path.join(import.meta.dirname, rel)).href;
70
70
  const CI_UNKNOWN_HINT_DEFAULT = 'run `glab ci status` on demand';
71
71
 
72
72
  /**
73
- * `ci-status` "no data for HEAD" reasons after which the last PUSHED commit is
74
- * worth asking about: GitLab's `no-pipeline-for-head-sha` and GitHub's
75
- * `no-check-runs-for-head` (both emitted by `checkCiStatus`).
73
+ * `ci-status` "no usable reading for HEAD" reasons after which the last PUSHED
74
+ * commit is worth asking about: GitLab's `no-pipeline-for-head-sha`, GitHub's
75
+ * `no-check-runs-for-head`, and GitLab's `pipeline-unmatched-ref` (all emitted
76
+ * by `checkCiStatus`).
77
+ *
78
+ * `pipeline-unmatched-ref` (#857) is not a "no data" state — pipelines EXIST for
79
+ * the sha, they just all sit on a foreign ref, so the reading stays `unknown`.
80
+ * For this consumer that is the same DARK outcome: the operator learns nothing
81
+ * about HEAD. Routing it to the pushed-commit re-query at least yields the
82
+ * pushed sha's own verdict instead of an unactionable line.
76
83
  */
77
- const PUSHED_FOLLOW_UP_REASONS = new Set(['no-pipeline-for-head-sha', 'no-check-runs-for-head']);
84
+ const PUSHED_FOLLOW_UP_REASONS = new Set([
85
+ 'no-pipeline-for-head-sha',
86
+ 'no-check-runs-for-head',
87
+ 'pipeline-unmatched-ref',
88
+ ]);
78
89
 
79
90
  /**
80
91
  * Full SHAs for `refs`, in order, from ONE `git rev-parse` — or `null` when
@@ -190,6 +201,22 @@ function pushedVerdictText(v) {
190
201
  return `CI ${v.status}${parts.length > 0 ? ` (${parts.join(', ')})` : ''}`;
191
202
  }
192
203
 
204
+ /**
205
+ * On-demand command listing every CI run of ONE commit, in the CLI that read
206
+ * CI — a glab command cannot answer in a GitHub repo (#1339 P1).
207
+ *
208
+ * Takes the FULL sha. Measured 2026-09-19, glab 1.117.0: `glab ci status` has
209
+ * no `--ref` flag ("Unknown flag: --ref.", exit 1), and `glab ci list --sha`
210
+ * matches exactly, so a short sha lists nothing.
211
+ *
212
+ * @param {boolean} gh The reading came from the gh CLI
213
+ * @param {string} sha Full commit sha
214
+ * @returns {string}
215
+ */
216
+ function commitRunsCommand(gh, sha) {
217
+ return gh ? `gh run list --commit ${sha}` : `glab ci list --sha ${sha}`;
218
+ }
219
+
193
220
  /**
194
221
  * Hint text for a `status: 'unknown'` ci-status reading.
195
222
  *
@@ -212,8 +239,7 @@ function ciUnknownHint(result, ctx) {
212
239
  if (pushed?.sameAsHead) return `last pushed: ${short} = HEAD — ${onDemand}`;
213
240
  const verdict = pushedVerdictText(pushed?.verdict);
214
241
  if (verdict) return `last pushed: ${short} — ${verdict}`;
215
- const check = gh ? `gh run list --commit ${sha}` : `glab ci status --ref ${short}`;
216
- return `last pushed: ${short} (pipeline not checked; run \`${check}\`)`;
242
+ return `last pushed: ${short} (pipeline not checked; run \`${commitRunsCommand(gh, sha)}\`)`;
217
243
  }
218
244
 
219
245
  /**
@@ -229,6 +255,53 @@ function hasFailedAllowFailureJobs(r) {
229
255
  return Array.isArray(r?.allowFailureJobs) && r.allowFailureJobs.length > 0;
230
256
  }
231
257
 
258
+ /**
259
+ * How many same-commit pipelines the ref preference SET ASIDE ended `failed`
260
+ * (#1390 P5) — the ONE predicate the `ci-status` renderer and its `severityOf`
261
+ * share, for the reason {@link hasFailedAllowFailureJobs} records (#1333).
262
+ * Only `failed` counts: a set-aside `canceled`/`skipped` run says nothing about
263
+ * the commit, and a line that fires on those would teach the operator to skip
264
+ * the banner (HR-101).
265
+ *
266
+ * @param {*} r
267
+ * @returns {number}
268
+ */
269
+ function droppedFailedCount(r) {
270
+ const statuses = r?.details?.droppedStatuses;
271
+ return Array.isArray(statuses) ? statuses.filter((s) => s === 'failed').length : 0;
272
+ }
273
+
274
+ /**
275
+ * Banner line for a `green` reading beside a FAILED pipeline of the same
276
+ * commit that the ref preference set aside (#1390 P5). The verdict stays the
277
+ * #857 ref-preference result; this only stops the failure from vanishing
278
+ * behind a silent green.
279
+ *
280
+ * NAMED CEILING (BV-004): one `git rev-parse HEAD` (2s timeout), run only on
281
+ * this branch — a green reading WITH a set-aside `failed` run, behind the
282
+ * network opt-in. The reading carries no sha, and the GitLab path read the
283
+ * local HEAD, so HEAD is the commit it spoke for. REVISIT TRIGGER: once
284
+ * `checkCiStatus` publishes the sha it read, take it from the reading.
285
+ *
286
+ * Only the GitLab path publishes `droppedStatuses` today (`candidateEvidence`
287
+ * is called from `checkGitlab` alone); the gh form exists so a GitHub producer
288
+ * can never print a glab command (#1339 P1 class) — see {@link commitRunsCommand}.
289
+ *
290
+ * @param {*} r A green reading with `droppedFailedCount(r) > 0`
291
+ * @param {{repoRoot?: string}} [ctx]
292
+ * @returns {string}
293
+ */
294
+ function droppedFailedLine(r, ctx) {
295
+ const sha = revParseShas(ctx?.repoRoot, ['HEAD'])?.[0] ?? null;
296
+ const gh = r.details.cliUsed === 'gh';
297
+ let check;
298
+ if (sha) check = commitRunsCommand(gh, sha);
299
+ else check = gh ? 'gh run list' : 'glab ci list --status=failed';
300
+ const ref = r.details.matchedRef ?? 'HEAD';
301
+ const on = sha ? `${ref} for ${sha.slice(0, 8)}` : ref;
302
+ return `⚠ CI green on ${on}, but ${droppedFailedCount(r)} other pipeline(s) for the same commit FAILED (set-aside statuses: ${r.details.droppedStatuses.join(', ')}) — check \`${check}\``;
303
+ }
304
+
232
305
  // ---------------------------------------------------------------------------
233
306
  // Budget
234
307
  // ---------------------------------------------------------------------------
@@ -476,9 +549,17 @@ export const PROBES = [
476
549
  const job = r.failingJobName ? ` Failing job: ${r.failingJobName}` : '';
477
550
  return `🚨 CI RED on HEAD (pipeline #${pid})${green}.${job}`;
478
551
  }
479
- if (r.status === 'green' && hasFailedAllowFailureJobs(r)) {
480
- const names = r.allowFailureJobs.map((j) => j?.name ?? String(j)).join(', ');
481
- return `⚠ CI green on HEAD, but ${r.allowFailureJobs.length} allow_failure job(s) FAILED: ${names}. A pipeline reports success regardless of these.`;
552
+ if (r.status === 'green') {
553
+ const lines = [];
554
+ if (hasFailedAllowFailureJobs(r)) {
555
+ const names = r.allowFailureJobs.map((j) => j?.name ?? String(j)).join(', ');
556
+ lines.push(`⚠ CI green on HEAD, but ${r.allowFailureJobs.length} allow_failure job(s) FAILED: ${names}. A pipeline reports success regardless of these.`);
557
+ }
558
+ // #1390 P5: a failed same-commit pipeline the ref preference set aside.
559
+ if (droppedFailedCount(r) > 0) lines.push(droppedFailedLine(r, ctx));
560
+ // Both findings can hold at once; `pushBanner` takes a multi-line
561
+ // string verbatim, so neither swallows the other.
562
+ return lines.length > 0 ? lines.join('\n') : null;
482
563
  }
483
564
  return null;
484
565
  },
@@ -493,7 +574,11 @@ export const PROBES = [
493
574
  if (!r || typeof r !== 'object') return 'ok';
494
575
  if (r.degraded) return 'warn';
495
576
  if (r.status === 'red') return 'alert';
496
- if (r.status === 'green') return hasFailedAllowFailureJobs(r) ? 'warn' : 'ok';
577
+ // A set-aside failed run (#1390 P5) is `warn`, never `alert`: the reading
578
+ // itself is green, and `alert` is what a red pipeline scores.
579
+ if (r.status === 'green') {
580
+ return hasFailedAllowFailureJobs(r) || droppedFailedCount(r) > 0 ? 'warn' : 'ok';
581
+ }
497
582
  // #1337: HEAD undetermined but the pushed commit's pipeline is red —
498
583
  // the code on origin is broken, so this is an alert, not a warning.
499
584
  if (r.pushed?.verdict?.status === 'red') return 'alert';