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
@@ -1,6 +1,6 @@
1
1
  ---
2
- description: Start a development session (housekeeping, feature, deep)
3
- argument-hint: "[housekeeping|feature|deep]"
2
+ description: Start a development session (housekeeping, feature, deep; ultradeep = deep + profile)
3
+ argument-hint: "[housekeeping|feature|deep|ultradeep]"
4
4
  ---
5
5
 
6
6
  # Session Start
@@ -9,7 +9,22 @@ You are beginning a new development session. The user has invoked `/session` wit
9
9
 
10
10
  **Default rationale (measured, not assumed):** `deep` is the default because it is what operators actually run — 77.3 % of 489 recorded sessions across 5 repos, and 115 of 228 (50.4 %) in this repo's own `.orchestrator/metrics/sessions.jsonl`. The former `feature` default made the majority case the one that had to be typed out every time. A `deep` default costs a downgrade keystroke in the minority case; a `feature` default cost an upgrade keystroke in the majority case.
11
11
 
12
- **Argument validation:** Valid session types are `housekeeping`, `feature`, and `deep`. An explicit `$ARGUMENTS` value ALWAYS wins over the default — `/session housekeeping` and `/session feature` behave exactly as before. If `$ARGUMENTS` is not empty and does not match any valid type, inform the user: "Invalid session type '$ARGUMENTS'. Valid types: housekeeping, feature, deep." Then fall back to `deep`.
12
+ **Argument validation:** Valid session types are `housekeeping`, `feature`, and `deep`. An explicit `$ARGUMENTS` value ALWAYS wins over the default — `/session housekeeping` and `/session feature` behave exactly as before. `ultradeep` is additionally accepted as an ARGUMENT ALIAS (see below); it is not a fourth type. If `$ARGUMENTS` is not empty and does not match any valid type or the alias, inform the user: "Invalid session type '$ARGUMENTS'. Valid types: housekeeping, feature, deep (alias: ultradeep)." Then fall back to `deep`.
13
+
14
+ ### Argument alias: `ultradeep` (PRD `docs/prd/2026-09-06-ultradeep-session-profile.md`)
15
+
16
+ `/session ultradeep` is an alias, NOT a fourth `session_type`. Resolve it to TWO STATE.md frontmatter values and then continue exactly as a `deep` session would:
17
+
18
+ ```yaml
19
+ session-type: deep # what every downstream consumer sees
20
+ session-profile: ultradeep # the only place the alias survives
21
+ ```
22
+
23
+ - **`session-type` NEVER becomes `ultradeep`.** The value is a closed set in `scripts/lib/session-schema/constants.mjs` (`VALID_SESSION_TYPES`) and in `scripts/lib/wave-sizing.mjs`; a fourth member would degrade silently in two places (`scripts/lib/telemetry/schema.mjs` maps an unknown type to `"other"`, `scripts/lib/session-close-backfill.mjs` labels it `housekeeping`). The alias exists so that no closed set has to change.
24
+ - **`session-profile` is optional and absent by default.** A plain `/session deep` writes NO `session-profile` key. Absent means "no profile" — never write an empty string, `none`, or `null` to mean absence. Read/write helpers: `readSessionProfile` / `setSessionProfile` in `scripts/lib/state-md.mjs`.
25
+ - **What the profile changes** is the WAVE SHAPE, not the session type: 7 waves with a coordinator-direct Synthesis-Gate at wave 2. See `skills/session-plan/SKILL.md` § Role-to-Wave Mapping and `skills/wave-executor/SKILL.md` § Ultradeep Profile.
26
+ - **Precondition.** The profile needs 7 waves. If Session Config sets `waves` below 7, do NOT silently plan 5 waves under an ultradeep label — name the conflict to the user and let them raise `waves` or drop the alias.
27
+ - **Budgets are deliberately not implemented yet** (PRD § 7): no `ultradeep.max-*` key is read anywhere. Do not invent one; the PRD defers thresholds until three runs have been measured.
13
28
 
14
29
  > **Not read from Session Config.** There is deliberately no `session-type:` (or equivalent) key in the `## Session Config` block — `scripts/lib/config.mjs` `parseSessionConfig()` does not emit one, so any such key in a repo's CLAUDE.md (or its Codex CLI equivalent AGENTS.md) is inert prose. The `session-type:` scalar that IS live lives in STATE.md frontmatter (read by `scripts/print-applicable-rules.mjs` for rule mode-gating) and is written per session, not configured per repo. Do not reintroduce a Session Config key here without wiring it into the parser first.
15
30
 
package/docs/README.md CHANGED
@@ -98,6 +98,10 @@ Two things worth knowing about this split:
98
98
  | `docs/plans/` | Active work document | `/write-executable-plan` artifacts for in-progress work. May not exist when nothing is mid-plan. |
99
99
  | `docs/_private/`, `docs/specs/` | Local-only (gitignored) | Operator scratch space; never tracked, out of scope for this classification. |
100
100
 
101
+ ### Superseded design notes
102
+
103
+ Because `docs/specs/` is gitignored, a correction written INTO a spec can never be committed — so the correction lives here instead. `docs/specs/2026-05-26-parallel-aware-sessions-design.md` (parallel-aware sessions) specifies PID-based lock liveness (`stale-pid-dead`). That is **superseded**: liveness is heartbeat-age based since #1137 (`isLockLive`; `acquire()` knows only `stale-heartbeat`), and the recorded PID is consulted nowhere since #1151 — it was the PID of the short-lived subprocess that wrote the lock, dead within a second. Read the local spec only with that correction applied.
104
+
101
105
  ## See Also
102
106
 
103
107
  - `docs/prd/2026-07-08-docs-public-split.md` — the epic that established this split (S1–S8, issues #775–#782).
@@ -1,37 +1,30 @@
1
- ---
2
- name: agents-authoring-spec
3
- description: NOT A DISPATCHABLE AGENT — never select this. It is the authoring specification that the agent definitions in this directory must follow, loaded as a nested instruction file. Claude Code's plugin loader registers every agents/*.md as an agent by directory convention, and the manifest's `agents` key is additive-only, so it cannot exclude a path. Without this frontmatter the file registered as an unnamed agent with FULL tool access; the minimal `tools` line below is what bounds that. If you need agent-authoring rules, read this file — do not dispatch it.
4
- tools: Read
5
- ---
1
+ <!-- Moved in v4.0.0 from `agents/AGENTS.md` (audit 2026-09-06 § 5A). It never was an agent: Claude Code's plugin loader registers every `agents/*.md` by directory convention and the manifest's `agents` key is additive-only, so no manifest entry could exclude it — only pseudo-frontmatter (`name: agents-authoring-spec`, `tools: Read`) kept the false registration bounded. Living under `docs/` removes the registration instead of bounding it. -->
6
2
 
7
- # `agents/` — Sub-Agent Authoring Conventions
3
+ # Sub-Agent Authoring Conventions (`agents/**`)
8
4
 
9
- > Nested instruction file for the `agents/` subtree. Claude Code / Cursor IDE
10
- > and Codex CLI both load this additively when working on files in this
11
- > directory (root `CLAUDE.md` for the big picture, this file for local
12
- > conventions). Resolution rule:
5
+ > Authoring spec for the sub-agent definitions in `agents/`. Read it together
6
+ > with the root `CLAUDE.md` (big picture) and, when working under `agents/`,
7
+ > whatever nested instruction file that subtree carries. Resolution rule:
13
8
  > [`../skills/_shared/instruction-file-resolution.md`](../skills/_shared/instruction-file-resolution.md).
14
9
  >
15
- > This is **not** an agent definition it is the authoring spec the agent
16
- > `*.md` definitions in this directory must follow. The plugin validator
17
- > (`scripts/lib/validate/check-agents.mjs`) excludes `AGENTS.md` / `CLAUDE.md`
18
- > from agent-frontmatter validation by name, and `measureDescriptionSurface`
19
- > excludes them from its walked corpus (#878).
20
- >
21
- > **Claude Code's plugin loader makes no such exception.** It registers every
22
- > `agents/*.md` as a dispatchable agent by directory convention, and the
23
- > manifest's `agents` key is documented as *additive* ("in addition to those in
24
- > the `agents/` directory"), so it cannot exclude a path. With no frontmatter
25
- > this file therefore registered as an agent named `AGENTS` with **full tool
26
- > access**. The frontmatter above is the containment: it names the file for what
27
- > it is, states in the `description` that it must never be dispatched, and caps
28
- > `tools` at `Read`. Do not remove it — and if you add another non-agent doc to
29
- > this directory, give it the same treatment.
10
+ > **This spec lives in `docs/`, not in `agents/`, on purpose.** Claude Code's
11
+ > plugin loader registers every `agents/*.md` as a dispatchable agent by
12
+ > directory convention, and the manifest's `agents` key is documented as
13
+ > *additive* ("in addition to those in the `agents/` directory"), so it cannot
14
+ > exclude a path. As `agents/AGENTS.md` this file was therefore a registered
15
+ > agent — first an unnamed one with **full tool access**, later a contained one
16
+ > whose pseudo-frontmatter capped `tools` at `Read`. Moving it out of the
17
+ > directory removes the registration rather than bounding it. The same applies
18
+ > to any future non-agent doc: put it under `docs/`, never in `agents/`.
19
+ > (`scripts/lib/validate/check-agents.mjs` still excludes `AGENTS.md` /
20
+ > `CLAUDE.md` by name, and `measureDescriptionSurface` still excludes them from
21
+ > its walked corpus (#878) both now vacuous for this file, and the safety net
22
+ > for anyone who reintroduces one.)
30
23
  >
31
24
  > Sibling spec: for `.claude/rules/*.md` frontmatter (conditional loading via
32
25
  > globs/mode/host-class/expiry, plus the never-always-on invariant for
33
26
  > auto-generated rules), see the canonical authoring spec
34
- > [`docs/rule-authoring.md`](../docs/rule-authoring.md).
27
+ > [`docs/rule-authoring.md`](./rule-authoring.md).
35
28
 
36
29
  ## Local Validation Commands
37
30
 
@@ -0,0 +1,67 @@
1
+ # The projects-baseline Relationship
2
+
3
+ **One line:** `projects-baseline` is a **private, optional** companion repository that
4
+ holds the operator's canonical rule and schema corpus. session-orchestrator reads
5
+ from it when it is present and degrades to a documented fallback when it is not.
6
+ Nothing in this plugin requires it, and no public consumer needs to obtain it.
7
+
8
+ ## What it is
9
+
10
+ A separate git repository (not vendored, not a submodule, not on npm) carrying:
11
+
12
+ - `packages/zod-schemas/src/vault-frontmatter.ts` — the canonical Zod schema for
13
+ Obsidian vault note frontmatter.
14
+ - `templates/shared/.vault.yaml.template` — the canonical `.vault.yaml` template.
15
+ - A `.claude/rules/` corpus. Measured: **26 rule files, all using `paths:`
16
+ frontmatter, 0 using `globs:`** (`scripts/lib/rule-loader.mjs` module doc;
17
+ restated in `scripts/lib/validate/check-rules.mjs`). That corpus is the reason
18
+ `paths:` exists as a same-shape alias for `globs:` at all (#795) — the fleet's
19
+ rules are read **from the baseline**, not from this plugin, so the plugin had to
20
+ learn the baseline's frontmatter convention rather than the other way round.
21
+
22
+ ## How the plugin finds it
23
+
24
+ Never by a hardcoded path. Resolution is host-local, most specific first:
25
+
26
+ 1. `SO_BASELINE_PATH` environment variable
27
+ 2. `owner.yaml` `paths.baseline-path` (`~/.config/session-orchestrator/owner.yaml`,
28
+ host-local, never committed — see `docs/owner-config-schema.md`)
29
+ 3. a sibling checkout at `<repoRoot>/../projects-baseline`
30
+ 4. `~/Projects/projects-baseline` (legacy default)
31
+
32
+ Tiers 1–2 go through `resolveHostPath('baseline-path', …)` in
33
+ `scripts/lib/config/host-paths.mjs`. `scripts/lib/vault-backfill/template.mjs`
34
+ additionally honours `PROJECTS_BASELINE_DIR` above all four, for back-compat.
35
+
36
+ ## The four hard-runtime touchpoints, and what each degrades to
37
+
38
+ | Touchpoint | Reads / writes | Without a baseline |
39
+ |---|---|---|
40
+ | `scripts/lib/frontmatter-guard.mjs` | the canonical vault-frontmatter Zod schema | `readVaultSchema()` → `null`; `generateFrontmatterSnippet()` falls back to an in-module enum set mirroring `skills/vault-sync/validator.mjs` and warns ONCE on stderr; `computeSchemaHash()` → `null` (never the empty-string hash) |
41
+ | `scripts/lib/vault-backfill/template.mjs` | `.vault.yaml.template` | `loadTemplate()` calls `dieFn(2, …)` with a message naming `owner.yaml paths.baseline-path`, `SO_BASELINE_PATH`, `PROJECTS_BASELINE_DIR`, and the sibling-checkout convention. Only `scripts/vault-backfill.mjs` is affected; nothing else aborts |
42
+ | `scripts/sync-vault-schema.mjs` | `--check` drift guard against the canonical schema | exits 2 (missing file). It is a maintenance script, never on a session path |
43
+ | `scripts/lib/reconcile/writer.mjs` + `scripts/lib/session-end/phase-skip.mjs` | writes rule proposals into the baseline (`reconcile.targets` containing `baseline`) | `baselineRoot` absent ⇒ the `baseline` target is a **no-op**; `repo-local` (the default target) is unaffected |
44
+
45
+ `scripts/promote-vault-strict.mjs` also uses a baseline template and already ships
46
+ an explicit `--no-baseline` opt-out.
47
+
48
+ ## The public fallback
49
+
50
+ A repository bootstrapped without the baseline is a normal, supported outcome —
51
+ `skills/bootstrap/public-fallback.md` owns that path. `bootstrap.lock` records
52
+ which source produced the scaffold in its `source:` field:
53
+
54
+ - `claude-init` — `claude init` ran successfully (Claude Code fast path)
55
+ - `plugin-template` — the plugin's own template was copied (every other case)
56
+ - `projects-baseline` — the private baseline was present and used
57
+
58
+ The first two are the **public** values. A consumer repo that shows either is
59
+ fully bootstrapped; the baseline adds the operator's private corpus on top, it
60
+ does not gate the scaffold.
61
+
62
+ ## See also
63
+
64
+ - `docs/owner-config-schema.md` — `owner.yaml` schema, including `paths.baseline-path`
65
+ - `docs/rule-authoring.md` — `paths:` / `globs:` frontmatter
66
+ - `skills/bootstrap/public-fallback.md` — the no-baseline bootstrap path
67
+ - `skills/frontmatter-guard/SKILL.md` — the schema-source resolution table
package/docs/ci-setup.md CHANGED
@@ -14,62 +14,78 @@ project-level Job Token allowlists are explicitly configured — an admin action
14
14
  in the foreign project that cannot be scripted from here. The fix is a deploy
15
15
  token or PAT stored as the masked CI variable `SCHEMA_DRIFT_TOKEN`.
16
16
 
17
- > **Current decision (2026-08-28, #1062): amber is the accepted normal state.**
18
- > `glab variable list` on this project returns zero CI variables — no
19
- > `SCHEMA_DRIFT_TOKEN` is set so every pipeline runs the job to exit 3
20
- > (`NOT VERIFIED`) and `pipeline-gate` prints the amber line. This is a
21
- > deliberate operator choice, not a defect: the job is correctly fail-loud
22
- > (exit taxonomy below), the vendored schema is compared manually at each
23
- > baseline refresh (#1100), and no token is rotated for a check that runs
24
- > against a private project of our own. Session-start's CI banner keeps
25
- > reporting the soft failure on purpose (`allow_failure` jobs are invisible
26
- > at pipeline level, which is what that banner exists to surface). Revisit
27
- > trigger: the first time a vendored-schema drift ships unnoticed, or when
28
- > the baseline gains a public mirror then set the token (Option A below)
29
- > and flip `SCHEMA_DRIFT_OPTIONAL` at both sites.
30
-
31
- ### Activation status (measured 2026-09-02)
32
-
33
- **Update, same day:** the token below was **revoked** — an unused credential is a
34
- liability per SEC-005's secrets-lifecycle discipline, and leaving a live,
35
- never-set-as-a-CI-variable token sitting in `infrastructure/projects-baseline`
36
- served no purpose once the control run below had already answered the
37
- question it was minted for. Re-minting it (same `glab api --method POST … --input -`
38
- recipe as Option A step 1) is now **Step 0** of the re-activation sequence
39
- below, not an assumed-still-valid token.
40
-
41
- A Project Access Token was provisioned today, scoped exactly as Option A
42
- below recommends:
17
+ > **Armed (2026-09-03, #1175): the hard gate is live.** #531 landed upstream
18
+ > `infrastructure/projects-baseline` commit `cb9ec97` adds `peer-card`,
19
+ > `board`, and `source-repo` to the canonical schema (the issue's AC named
20
+ > only `peer-card`; the close comment widened scope to all three values
21
+ > already vendored ahead here). That closed the vendored-schema divergence
22
+ > which had blocked activation since 2026-09-02; `skills/vault-sync/
23
+ > validator.mjs` was regenerated and `node scripts/sync-vault-schema.mjs
24
+ > --check` now exits 0. The Project Access Token was re-minted (id 53, see
25
+ > § Activation status below), the masked `SCHEMA_DRIFT_TOKEN` CI variable is
26
+ > set on this project, and `SCHEMA_DRIFT_OPTIONAL` is `"false"` at both
27
+ > sites in `.gitlab-ci.yml` a missing or expired token now hard-fails the
28
+ > pipeline (exit 4) instead of printing the amber `NOT VERIFIED` line that
29
+ > was the accepted state under the prior (2026-08-28, #1062) decision. Both
30
+ > directions were proven before the flip — see below. Revisit trigger for
31
+ > the token itself: expiry (2027-09-01) or a scope/rotation need — see
32
+ > § Rotation / re-arm sequence.
33
+
34
+ ### Activation status (token re-minted 2026-09-03, id 53)
35
+
36
+ The Project Access Token was revoked on 2026-09-02 once a control run had
37
+ answered the question it was minted for an unused credential is a
38
+ liability per SEC-005's secrets-lifecycle discipline. That control run had
39
+ also surfaced the real reason activation was still blocked:
40
+ `skills/vault-sync/validator.mjs`'s `vaultNoteTypeSchema` enum carried
41
+ `peer-card` and `board`, and `vaultFrontmatterSchema` carried
42
+ `source-repo: z.string().optional()`, none of which the canonical
43
+ `infrastructure/projects-baseline` source had yet — the documented
44
+ vendor-ahead state (`scripts/sync-vault-schema.mjs` header, "Vendor-ahead
45
+ state (2026-05-23, #503, I5)"), tracked as upstream-sync-debt in issue #531
46
+ (#503 itself was already closed).
47
+
48
+ **#531 landed upstream** as commit `cb9ec97`: `vaultNoteTypeSchema` gained
49
+ `peer-card` and `board`; `vaultFrontmatterSchema` gained `source-repo:
50
+ z.string().optional()`. With the canonical source caught up,
51
+ `node scripts/sync-vault-schema.mjs --check` exits 0 — no drift.
52
+
53
+ **Token, re-minted:**
43
54
 
44
55
  - **Name:** `session-orchestrator-ci-schema-drift`
45
56
  - **Project:** `infrastructure/projects-baseline` (id 52) — the TARGET repo,
46
57
  not this one
58
+ - **Token id:** 53
47
59
  - **Scopes:** `read_repository`
48
60
  - **Access level:** Reporter (20)
49
61
  - **Expires:** 2027-09-01
50
62
 
51
- The masked `SCHEMA_DRIFT_TOKEN` CI variable on this project (id 74) was set
52
- with that token, then **removed again**. A control run with the token set
53
- confirmed the clone step authenticates correctly — but the drift check itself
54
- then failed for a real, already-known reason:
55
- `skills/vault-sync/validator.mjs`'s `vaultNoteTypeSchema` enum carries
56
- `peer-card` and `board`, and the canonical `infrastructure/projects-baseline`
57
- source does not have either yet. This is the documented vendor-ahead state
58
- (`scripts/sync-vault-schema.mjs` header, "Vendor-ahead state (2026-05-23,
59
- #503, I5)") and tracked as upstream-sync-debt in issue #531 (#503 itself is
60
- closed). With the variable set and `SCHEMA_DRIFT_OPTIONAL` still `"true"`,
61
- this exit-1 `DRIFT` is a **hard** failure it is not in
62
- `allow_failure.exit_codes: [3]` so leaving the variable set today would turn
63
- the next push red for a fact already tracked in #531, not for a new defect.
64
- The variable was removed rather than left set; activation stays blocked until
65
- the canonical enum gains both values.
66
-
67
- **Re-activation sequence once #531 lands upstream:**
68
-
69
- 0. **Re-mint the token** it was revoked (see § Activation status above). Run
70
- the same `glab api --method POST --input -` recipe as Option A step 1,
71
- against the TARGET project (id 52), and copy the response's `token` field
72
- immediately it is shown exactly once.
63
+ The masked `SCHEMA_DRIFT_TOKEN` CI variable is set on this project (id 74),
64
+ **not** Protected same reasoning as Option A step 3 below.
65
+
66
+ **Proof pipelines, both directions, run before the flip:**
67
+
68
+ - **GREEN** pipeline 8358 @ `dc9522dd` (branch
69
+ `proof/1175-schema-drift-green`): job `schema-drift-check` #84625 ran with
70
+ the token, cloned the baseline, and printed `RESULT: IN-SYNC (exit 0)`;
71
+ `pipeline-gate` succeeded.
72
+ - **RED** pipelines 8355–8357 @ `bca78dae` (branch
73
+ `proof/1175-schema-drift-red`, a deliberately bogus enum value injected
74
+ into the vendored copy): `sync-vault-schema.mjs` reported drift, the job
75
+ failed with exit 1 outside `allow_failure.exit_codes: [3]` and
76
+ `pipeline-gate` never ran.
77
+
78
+ With both proofs recorded, `SCHEMA_DRIFT_OPTIONAL` is `"false"` at both
79
+ sites in `.gitlab-ci.yml` `schema-drift-check` and `pipeline-gate`.
80
+ `tests/ci/schema-drift-check.test.mjs` pins the committed value on both
81
+ jobs, so a half-revert or a template refresh flipping one site back to
82
+ `"true"` fails the suite locally, not silently in a pipeline.
83
+
84
+ **Rotation / re-arm sequence** (token expiry or replacement):
85
+
86
+ 0. **Re-mint the token.** Run the same `glab api --method POST … --input -`
87
+ recipe as Option A step 1, against the TARGET project (id 52), and copy
88
+ the response's `token` field immediately — it is shown exactly once.
73
89
  1. `read -rs TOKEN` at the prompt (no echo), then pipe it into `glab variable
74
90
  set` rather than passing it as a `--value` argument — a value passed on the
75
91
  command line is visible to any other process on the host via `ps`, while
@@ -92,10 +108,12 @@ the canonical enum gains both values.
92
108
  `RESULT: IN-SYNC` — and confirm the job DURATION is well over 20 seconds
93
109
  (see the pipeline-6815 warning above). A fast "success" is the exit-3
94
110
  soft-skip in disguise, not a real run.
95
- 3. Flip `SCHEMA_DRIFT_OPTIONAL` to `"false"` at **both** sites —
96
- `schema-drift-check` and `pipeline-gate` in one commit.
97
- `tests/ci/schema-drift-check.test.mjs` already asserts the two values are
98
- equal, so no test edit is needed to enforce the flip.
111
+ 3. `SCHEMA_DRIFT_OPTIONAL` stays `"false"` at **both** sites —
112
+ `schema-drift-check` and `pipeline-gate`. A rotation replaces only the
113
+ credential, never the flag; if the flag was ever reverted for an
114
+ emergency, flip it back to `"false"` at both sites in one commit —
115
+ `tests/ci/schema-drift-check.test.mjs` pins the committed value on both
116
+ jobs, so a half-flip fails the suite locally.
99
117
  4. Local counter-probe before trusting the pipeline: clone
100
118
  `infrastructure/projects-baseline` with the token, make a throwaway copy of
101
119
  `packages/zod-schemas/src/vault-frontmatter.ts` with one field
@@ -134,11 +152,12 @@ let alone diff a schema against it. Issue #933.
134
152
 
135
153
  ```yaml
136
154
  variables:
137
- SCHEMA_DRIFT_OPTIONAL: "true"
155
+ SCHEMA_DRIFT_OPTIONAL: "false"
138
156
  ```
139
157
 
140
- It is the review-visible declaration that "no token" is *currently* an accepted
141
- state. The behaviour matrix:
158
+ It is the review-visible declaration that "no token" is *no longer* an
159
+ accepted state armed 2026-09-03 (#1175, see § Activation status above).
160
+ The behaviour matrix:
142
161
 
143
162
  | `SCHEMA_DRIFT_TOKEN` | `SCHEMA_DRIFT_OPTIONAL` | Exit | State | Pipeline effect |
144
163
  |---|---|---|---|---|
@@ -169,14 +188,41 @@ note, not a blocker: the sentinels are intact today, and the fix — if it is
169
188
  ever needed — is giving `sync-vault-schema.mjs`'s malformed-sentinel case a
170
189
  distinct exit code, not a change here.
171
190
 
172
- **After completing the token setup below, change `SCHEMA_DRIFT_OPTIONAL` to
173
- `"false"` in `.gitlab-ci.yml`** in **both** places: the `schema-drift-check`
191
+ **This is what the armed state looks like.** `SCHEMA_DRIFT_OPTIONAL` is
192
+ `"false"` in `.gitlab-ci.yml` at **both** places: the `schema-drift-check`
174
193
  job and `pipeline-gate`. One flag, two enforcement points;
175
- `tests/ci/schema-drift-check.test.mjs` asserts the mirroring, so a half-flip
176
- fails the suite locally rather than silently leaving one point advisory. The
177
- flip is what converts a missing token from a tolerated warning into a hard red,
178
- and it is the whole point of the flag: the opt-out is a line in a reviewed file,
179
- not the accidental side effect of an unset CI variable.
194
+ `tests/ci/schema-drift-check.test.mjs` asserts the mirroring AND pins the
195
+ literal `"false"` value on both jobs, so a half-flip or a full revert —
196
+ fails the suite locally rather than silently leaving one point advisory. A
197
+ missing or expired token now hard-fails the pipeline (exit 4) instead of the
198
+ tolerated amber warning — that is the whole point of the flag: the opt-out is
199
+ a line in a reviewed file, not the accidental side effect of an unset CI
200
+ variable.
201
+
202
+ **To switch it back to amber temporarily** (a token rotation window, or
203
+ taking the check offline for an emergency): set `SCHEMA_DRIFT_OPTIONAL` to
204
+ `"true"` at **both** sites, in one commit — the same mirrored-pair discipline
205
+ applies in reverse, and the same test catches a half-revert. Re-arm by
206
+ flipping both sites back to `"false"` once the reason for the amber window is
207
+ resolved; see § Rotation / re-arm sequence above for the token side of that
208
+ operation.
209
+
210
+ **Fork / external-contributor MR caveat.** `.gate-rules` (`.gitlab-ci.yml:74`)
211
+ includes `if: $CI_PIPELINE_SOURCE == "merge_request_event"`, so a merge
212
+ request pipeline runs `schema-drift-check` regardless of who opened it — but
213
+ GitLab does not pass the target project's masked CI/CD variables to a
214
+ pipeline running a **forked** project's code, by design, so that an untrusted
215
+ fork cannot exfiltrate a secret. A fork/contributor MR therefore cannot read
216
+ `SCHEMA_DRIFT_TOKEN` even though the variable is set and unprotected on this
217
+ project, and with `SCHEMA_DRIFT_OPTIONAL: "false"` that reads as a genuinely
218
+ missing token: exit **4** (`MISCONFIGURED`), a hard pipeline failure — not the
219
+ amber `SKIPPED` a same-project branch would get. The accepted mitigation is
220
+ either of: a maintainer re-runs the pipeline from within this project (e.g.
221
+ pushing the same commit to a branch here, where the variable IS available),
222
+ or a maintainer temporarily sets `SCHEMA_DRIFT_OPTIONAL: "true"` on that one
223
+ MR/branch for the duration of review. Do not weaken the committed default in
224
+ `.gitlab-ci.yml` for this — it stays `"false"` at both sites per the armed
225
+ state above.
180
226
 
181
227
  > **Before you flip it, run ONE pipeline with the token present while
182
228
  > `SCHEMA_DRIFT_OPTIONAL` is still `"true"`, and check the job's DURATION.**