session-orchestrator 3.23.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/.agents/skills/architecture/SKILL.md +18 -0
  2. package/.agents/skills/autopilot/SKILL.md +17 -0
  3. package/.agents/skills/bootstrap/SKILL.md +20 -0
  4. package/.agents/skills/brainstorm/SKILL.md +22 -0
  5. package/.agents/skills/claude-md-drift-check/SKILL.md +15 -0
  6. package/.agents/skills/convergence-monitoring/SKILL.md +22 -0
  7. package/.agents/skills/debug/SKILL.md +22 -0
  8. package/.agents/skills/discovery/SKILL.md +20 -0
  9. package/.agents/skills/dispatcher/SKILL.md +15 -0
  10. package/.agents/skills/docs-orchestrator/SKILL.md +18 -0
  11. package/.agents/skills/ecosystem-health/SKILL.md +20 -0
  12. package/.agents/skills/eli5/SKILL.md +20 -0
  13. package/.agents/skills/eval/SKILL.md +21 -0
  14. package/.agents/skills/evolve/SKILL.md +21 -0
  15. package/.agents/skills/frontmatter-guard/SKILL.md +15 -0
  16. package/.agents/skills/gitlab-ops/SKILL.md +20 -0
  17. package/.agents/skills/gitlab-portfolio/SKILL.md +15 -0
  18. package/.agents/skills/grill/SKILL.md +22 -0
  19. package/.agents/skills/hook-development/SKILL.md +15 -0
  20. package/.agents/skills/mcp-builder/SKILL.md +15 -0
  21. package/.agents/skills/memory-cleanup/SKILL.md +21 -0
  22. package/.agents/skills/mode-selector/SKILL.md +17 -0
  23. package/.agents/skills/npm-publish/SKILL.md +16 -0
  24. package/.agents/skills/peekaboo-driver/SKILL.md +18 -0
  25. package/.agents/skills/persona-panel/SKILL.md +17 -0
  26. package/.agents/skills/plan/SKILL.md +20 -0
  27. package/.agents/skills/playwright-driver/SKILL.md +20 -0
  28. package/.agents/skills/quality-gates/SKILL.md +20 -0
  29. package/.agents/skills/reconcile/SKILL.md +21 -0
  30. package/.agents/skills/remote-offload/SKILL.md +20 -0
  31. package/.agents/skills/repo-audit/SKILL.md +16 -0
  32. package/.agents/skills/session-end/SKILL.md +20 -0
  33. package/.agents/skills/session-plan/SKILL.md +20 -0
  34. package/.agents/skills/session-start/SKILL.md +20 -0
  35. package/.agents/skills/spinout/SKILL.md +16 -0
  36. package/.agents/skills/sunset-review/SKILL.md +16 -0
  37. package/.agents/skills/test-runner/SKILL.md +20 -0
  38. package/.agents/skills/tmux-layout/SKILL.md +21 -0
  39. package/.agents/skills/using-orchestrator/SKILL.md +17 -0
  40. package/.agents/skills/vault-mirror/SKILL.md +15 -0
  41. package/.agents/skills/vault-sync/SKILL.md +15 -0
  42. package/.agents/skills/wave-executor/SKILL.md +20 -0
  43. package/.agents/skills/write-executable-plan/SKILL.md +22 -0
  44. package/.claude-plugin/marketplace.json +1 -1
  45. package/.claude-plugin/plugin.json +1 -1
  46. package/.codex-plugin/plugin.json +1 -1
  47. package/.cursor/commands/autopilot.md +2 -2
  48. package/.cursor/commands/bootstrap.md +1 -1
  49. package/.cursor/commands/brainstorm.md +1 -1
  50. package/.cursor/commands/debug.md +1 -1
  51. package/.cursor/commands/discovery.md +1 -1
  52. package/.cursor/commands/dispatcher.md +2 -2
  53. package/.cursor/commands/eli5.md +2 -2
  54. package/.cursor/commands/eval.md +2 -2
  55. package/.cursor/commands/evolve.md +1 -1
  56. package/.cursor/commands/go.md +1 -1
  57. package/.cursor/commands/grill.md +2 -2
  58. package/.cursor/commands/memory-cleanup.md +2 -2
  59. package/.cursor/commands/persona-panel.md +1 -1
  60. package/.cursor/commands/plan.md +1 -1
  61. package/.cursor/commands/portfolio.md +1 -1
  62. package/.cursor/commands/reconcile.md +2 -2
  63. package/.cursor/commands/release.md +2 -2
  64. package/.cursor/commands/session.md +2 -2
  65. package/.cursor/commands/spinout.md +2 -2
  66. package/.cursor/commands/sunset-review.md +2 -2
  67. package/.cursor/commands/templates-ack.md +2 -2
  68. package/.cursor/commands/test.md +2 -2
  69. package/.cursor/skills/brainstorm/SKILL.md +1 -1
  70. package/.cursor/skills/eval/SKILL.md +1 -1
  71. package/.cursor/skills/quality-gates/SKILL.md +1 -1
  72. package/.cursor/skills/remote-offload/SKILL.md +13 -0
  73. package/.orchestrator/policy/blocked-commands.json +121 -0
  74. package/.orchestrator/policy/ecosystem.schema.json +66 -0
  75. package/.orchestrator/policy/quality-gates.example.json +16 -0
  76. package/.orchestrator/policy/quality-gates.schema.json +38 -0
  77. package/.orchestrator/policy/templates-policy.json +27 -0
  78. package/.orchestrator/policy/test-profiles.json +47 -0
  79. package/AGENTS.md +225 -0
  80. package/CHANGELOG.md +1401 -0
  81. package/NOTICE +11 -6
  82. package/README.md +127 -92
  83. package/agents/db-specialist.md +0 -1
  84. package/agents/eval-judge.md +1 -1
  85. package/agents/skill-applied-judge.md +1 -1
  86. package/assets/wave-lifecycle.svg +98 -0
  87. package/commands/release.md +6 -3
  88. package/commands/session.md +18 -3
  89. package/docs/README.md +4 -0
  90. package/{agents/AGENTS.md → docs/agent-authoring.md} +19 -26
  91. package/docs/baseline.md +67 -0
  92. package/docs/ci-setup.md +249 -48
  93. package/docs/codex-setup.md +66 -22
  94. package/docs/components.md +37 -16
  95. package/docs/cursor-setup.md +6 -2
  96. package/docs/events-schema.md +51 -10
  97. package/docs/instruction-delivery.md +62 -0
  98. package/{agents/memory-proposal-collector.md → docs/memory-proposal-flow.md} +1 -8
  99. package/docs/migration-v4.md +341 -0
  100. package/docs/pi-setup.md +6 -1
  101. package/docs/plugin-architecture-v3.md +1 -1
  102. package/docs/rule-authoring.md +85 -19
  103. package/docs/scope-collision-guard.md +8 -8
  104. package/docs/session-config-reference.md +120 -61
  105. package/docs/session-config-template.md +40 -33
  106. package/docs/telemetry/telemetry-claims.md +11 -10
  107. package/docs/telemetry.md +187 -4
  108. package/docs/vault-docs-architecture.md +50 -11
  109. package/hooks/_lib/atomic-json.mjs +111 -0
  110. package/hooks/_lib/hook-import-set.json +1487 -0
  111. package/hooks/_lib/subagent-paths.mjs +143 -0
  112. package/hooks/_lib/subagent-transcript.mjs +562 -0
  113. package/hooks/config-protection.mjs +2 -2
  114. package/hooks/cwd-change-restore.mjs +11 -31
  115. package/hooks/enforce-commands.mjs +69 -0
  116. package/hooks/enforce-scope.mjs +35 -6
  117. package/hooks/hooks-codex.json +1 -1
  118. package/hooks/hooks-cursor.json +10 -0
  119. package/hooks/hooks-pi.json +5 -0
  120. package/hooks/hooks.json +6 -1
  121. package/hooks/loop-guard.mjs +3 -3
  122. package/hooks/on-session-end.mjs +280 -14
  123. package/hooks/on-session-start.mjs +153 -4
  124. package/hooks/on-stop.mjs +371 -17
  125. package/hooks/operator-steer.mjs +2 -2
  126. package/hooks/post-bash-write-verify.mjs +189 -4
  127. package/hooks/post-edit-import-probe.mjs +344 -0
  128. package/hooks/post-subagent-discovery-validator.mjs +278 -392
  129. package/hooks/post-tool-batch-wave-signal.mjs +272 -44
  130. package/hooks/post-tool-failure-corrective-context.mjs +11 -34
  131. package/hooks/post-tooluse-frontend-slop.mjs +3 -3
  132. package/hooks/pre-bash-destructive-guard.mjs +39 -13
  133. package/hooks/pre-bash-memory-propose-audit.mjs +13 -7
  134. package/hooks/skill-invocation-telemetry.mjs +17 -5
  135. package/hooks/subagent-telemetry.mjs +24 -30
  136. package/monitors/monitors.json +3 -3
  137. package/package.json +9 -1
  138. package/pi/prompts/session.md +2 -2
  139. package/plugin.json +27 -0
  140. package/scripts/autopilot.mjs +26 -12
  141. package/scripts/backfill-abandoned-sessions.mjs +130 -15
  142. package/scripts/backfill-learnings-from-vault.mjs +9 -3
  143. package/scripts/dialectic-deriver.mjs +73 -8
  144. package/scripts/emit-event.mjs +10 -2
  145. package/scripts/export-hw-learnings.mjs +113 -1
  146. package/scripts/generate-agents-skills.mjs +378 -0
  147. package/scripts/generate-cursor-adapter.mjs +45 -8
  148. package/scripts/generate-hook-import-set.mjs +249 -0
  149. package/scripts/lib/agent-status.mjs +13 -2
  150. package/scripts/lib/auq/parse.mjs +5 -29
  151. package/scripts/lib/auto-dialectic.mjs +68 -0
  152. package/scripts/lib/auto-dream.mjs +38 -36
  153. package/scripts/lib/autonomy/suitability.mjs +6 -0
  154. package/scripts/lib/autopilot/loop.mjs +2 -2
  155. package/scripts/lib/autopilot/worktree-pipeline.mjs +82 -6
  156. package/scripts/lib/build-live-signals.mjs +25 -22
  157. package/scripts/lib/ci-status-banner.mjs +220 -75
  158. package/scripts/lib/codex/plugin-contract.mjs +82 -6
  159. package/scripts/lib/cold-start-detector.mjs +23 -14
  160. package/scripts/lib/config/auto-dream.mjs +2 -1
  161. package/scripts/lib/config/block-header.mjs +63 -0
  162. package/scripts/lib/config/block-preprocess.mjs +177 -0
  163. package/scripts/lib/config/broken-window.mjs +2 -1
  164. package/scripts/lib/config/cold-start.mjs +2 -1
  165. package/scripts/lib/config/config-protection.mjs +22 -2
  166. package/scripts/lib/config/context-coverage.mjs +2 -1
  167. package/scripts/lib/config/cross-repo.mjs +2 -1
  168. package/scripts/lib/config/custom-phases.mjs +2 -1
  169. package/scripts/lib/config/dialectic.mjs +2 -1
  170. package/scripts/lib/config/discovery-validator.mjs +9 -3
  171. package/scripts/lib/config/dispatcher-autonomy-capture.mjs +24 -1
  172. package/scripts/lib/config/dispatcher-autonomy.mjs +2 -1
  173. package/scripts/lib/config/docs-orchestrator.mjs +2 -1
  174. package/scripts/lib/config/docs-staleness.mjs +2 -1
  175. package/scripts/lib/config/drift-check.mjs +2 -1
  176. package/scripts/lib/config/eval.mjs +2 -1
  177. package/scripts/lib/config/events-rotation.mjs +2 -1
  178. package/scripts/lib/config/evolve.mjs +8 -2
  179. package/scripts/lib/config/frontend-slop-hook.mjs +7 -3
  180. package/scripts/lib/config/gitlab-portfolio.mjs +2 -1
  181. package/scripts/lib/config/handover-gate.mjs +2 -1
  182. package/scripts/lib/config/health-endpoints.mjs +388 -0
  183. package/scripts/lib/config/issue-budget.mjs +2 -1
  184. package/scripts/lib/config/loop-guard.mjs +2 -1
  185. package/scripts/lib/config/memory.mjs +2 -1
  186. package/scripts/lib/config/moc-staleness.mjs +2 -1
  187. package/scripts/lib/config/persona-gate-wave.mjs +2 -1
  188. package/scripts/lib/config/private-config-dir.mjs +67 -0
  189. package/scripts/lib/config/reconcile.mjs +2 -1
  190. package/scripts/lib/config/remote-hosts.mjs +234 -0
  191. package/scripts/lib/config/section-extractor.mjs +7 -1
  192. package/scripts/lib/config/skill-evolution.mjs +2 -1
  193. package/scripts/lib/config/slopcheck.mjs +2 -1
  194. package/scripts/lib/config/state-md-lock.mjs +2 -1
  195. package/scripts/lib/config/templates-first.mjs +2 -1
  196. package/scripts/lib/config/test.mjs +2 -1
  197. package/scripts/lib/config/vault-integration.mjs +7 -1
  198. package/scripts/lib/config/vault-mirror-quality.mjs +2 -1
  199. package/scripts/lib/config/vault-staleness.mjs +2 -1
  200. package/scripts/lib/config/vault-sync.mjs +2 -1
  201. package/scripts/lib/config/verification-auto-fix.mjs +2 -1
  202. package/scripts/lib/config/wave-reviewers.mjs +2 -1
  203. package/scripts/lib/config/worktree-orphans.mjs +2 -1
  204. package/scripts/lib/config.mjs +31 -3
  205. package/scripts/lib/convergence-monitor.mjs +82 -16
  206. package/scripts/lib/dispatcher/enumerate.mjs +2 -17
  207. package/scripts/lib/dispatcher/rank.mjs +124 -48
  208. package/scripts/lib/ecosystem-health.mjs +16 -2
  209. package/scripts/lib/eval/engine.mjs +9 -1
  210. package/scripts/lib/eval/session-resolve.mjs +23 -4
  211. package/scripts/lib/events-schema.mjs +48 -0
  212. package/scripts/lib/events.mjs +256 -7
  213. package/scripts/lib/evolve/autonomy-verdict.mjs +9 -4
  214. package/scripts/lib/evolve/autopilot-effectiveness.mjs +18 -1
  215. package/scripts/lib/frontmatter-guard.mjs +131 -13
  216. package/scripts/lib/gates/gate-full.mjs +26 -0
  217. package/scripts/lib/gates/gate-helpers.mjs +76 -0
  218. package/scripts/lib/gitlab-portfolio/cli.mjs +3 -15
  219. package/scripts/lib/hardware-pattern-detector.mjs +18 -1
  220. package/scripts/lib/harness-audit/categories/category1.mjs +17 -6
  221. package/scripts/lib/harness-audit/categories/category4.mjs +31 -11
  222. package/scripts/lib/host-identity.mjs +50 -11
  223. package/scripts/lib/instruction-budget-guard.mjs +171 -5
  224. package/scripts/lib/learnings/evolve-telemetry.mjs +178 -0
  225. package/scripts/lib/learnings/io.mjs +60 -6
  226. package/scripts/lib/memory-banner.mjs +20 -8
  227. package/scripts/lib/memory-proposals/store.mjs +30 -22
  228. package/scripts/lib/owner-config-banner.mjs +43 -6
  229. package/scripts/lib/owner-config-loader.mjs +21 -10
  230. package/scripts/lib/owner-interview.mjs +3 -3
  231. package/scripts/lib/owner-yaml.mjs +207 -14
  232. package/scripts/lib/peer-discovery.mjs +20 -2
  233. package/scripts/lib/platform.mjs +108 -15
  234. package/scripts/lib/plugin-update-banner.mjs +406 -0
  235. package/scripts/lib/project-hygiene.mjs +38 -2
  236. package/scripts/lib/qg-command-drift-banner.mjs +50 -12
  237. package/scripts/lib/quality-gate.mjs +133 -44
  238. package/scripts/lib/reconcile/emitter.mjs +68 -6
  239. package/scripts/lib/reconcile/engine.mjs +249 -9
  240. package/scripts/lib/reconcile/idempotency.mjs +37 -4
  241. package/scripts/lib/reconcile/writer.mjs +40 -18
  242. package/scripts/lib/scope-gate.mjs +36 -0
  243. package/scripts/lib/session-close-backfill.mjs +125 -18
  244. package/scripts/lib/session-discovery.mjs +57 -3
  245. package/scripts/lib/session-end/phase-skip.mjs +2 -2
  246. package/scripts/lib/session-id.mjs +12 -23
  247. package/scripts/lib/session-identity/own-session.mjs +187 -11
  248. package/scripts/lib/session-lock-shape.mjs +43 -0
  249. package/scripts/lib/session-lock.mjs +5 -10
  250. package/scripts/lib/session-registry.mjs +25 -9
  251. package/scripts/lib/session-schema/constants.mjs +36 -2
  252. package/scripts/lib/session-schema/validator.mjs +38 -4
  253. package/scripts/lib/session-start-probes.mjs +18 -1
  254. package/scripts/lib/session-transition.mjs +1 -1
  255. package/scripts/lib/sessions-canonical.mjs +446 -0
  256. package/scripts/lib/sessions-staleness-banner.mjs +18 -11
  257. package/scripts/lib/skill-health/join.mjs +17 -4
  258. package/scripts/lib/state-md.mjs +78 -0
  259. package/scripts/lib/sunset/walker.mjs +6 -0
  260. package/scripts/lib/telemetry/schema.mjs +255 -17
  261. package/scripts/lib/telemetry/sync.mjs +417 -24
  262. package/scripts/lib/tmux-layout/telemetry.mjs +14 -2
  263. package/scripts/lib/validate/check-agents-skills.mjs +327 -0
  264. package/scripts/lib/validate/check-agents.mjs +3 -3
  265. package/scripts/lib/validate/check-cursor-adapter.mjs +234 -72
  266. package/scripts/lib/validate/check-doc-cli-commands.mjs +9 -33
  267. package/scripts/lib/validate/check-hooks-emit-event-guard.mjs +370 -0
  268. package/scripts/lib/validate/check-hooks-symmetry.mjs +45 -16
  269. package/scripts/lib/validate/check-owner-leakage.mjs +281 -20
  270. package/scripts/lib/validate/check-skill-links.mjs +163 -0
  271. package/scripts/lib/validate/check-skill-script-paths.mjs +455 -0
  272. package/scripts/lib/validate/check-untracked-test-deps.mjs +10 -0
  273. package/scripts/lib/validate/check-unwired-features.mjs +0 -9
  274. package/scripts/lib/validate/check-validator-registration.mjs +254 -0
  275. package/scripts/lib/validate/check-vcs-repo-flag.mjs +6 -28
  276. package/scripts/lib/validate/enumerate-repo-files.mjs +317 -0
  277. package/scripts/lib/validate/markdown-fences.mjs +196 -0
  278. package/scripts/lib/vault-backfill/template.mjs +63 -6
  279. package/scripts/lib/vault-mirror/process.mjs +165 -42
  280. package/scripts/lib/vault-mirror/telemetry.mjs +2 -2
  281. package/scripts/lib/vault-status/board-lock.mjs +185 -0
  282. package/scripts/lib/vault-status/board-writer.mjs +174 -135
  283. package/scripts/lib/vault-status/narrative-mirror.mjs +129 -37
  284. package/scripts/lib/wave-executor/dispatch-common.mjs +164 -0
  285. package/scripts/lib/wave-executor/foreign-dispatch.mjs +7 -142
  286. package/scripts/lib/wave-executor/remote-dispatch.mjs +502 -0
  287. package/scripts/lib/wave-resource-gate.mjs +133 -7
  288. package/scripts/lib/wave-sizing.mjs +4 -1
  289. package/scripts/lib/wave-transcript-tail.mjs +142 -8
  290. package/scripts/materialize-wave-scope.mjs +32 -9
  291. package/scripts/memory-propose.mjs +146 -8
  292. package/scripts/migrate-cold-start-seed.mjs +4 -1
  293. package/scripts/parse-config.mjs +60 -3
  294. package/scripts/promote-vault-strict.mjs +4 -15
  295. package/scripts/release.mjs +337 -29
  296. package/scripts/repair-invalid-sessions.mjs +3 -3
  297. package/scripts/run-quality-gate.mjs +128 -11
  298. package/scripts/site-numbers.mjs +36 -4
  299. package/scripts/sweep-expired-learnings.mjs +90 -0
  300. package/scripts/sync-vault-schema.mjs +3 -1
  301. package/scripts/telemetry.mjs +2 -2
  302. package/scripts/validate-plugin.mjs +187 -0
  303. package/scripts/validate-wave-scope.mjs +28 -8
  304. package/scripts/vault-consolidate.mjs +3 -11
  305. package/scripts/vault-integration-watcher.mjs +2 -4
  306. package/scripts/vault-mirror.mjs +111 -26
  307. package/scripts/wave-scope-binding.mjs +215 -0
  308. package/skills/_shared/instruction-file-resolution.md +10 -0
  309. package/skills/_shared/parallel-aware-auq.md +31 -2
  310. package/skills/_shared/parallel-aware-preamble.md +18 -4
  311. package/skills/_shared/platform-tools.md +1 -1
  312. package/skills/_shared/state-ownership.md +1 -1
  313. package/skills/architecture/SKILL.md +7 -5
  314. package/skills/{domain-model/SKILL.md → architecture/references/domain-model.md} +9 -9
  315. package/skills/autopilot/SKILL.md +4 -18
  316. package/skills/claude-md-drift-check/SKILL.md +5 -1
  317. package/skills/claude-md-drift-check/checker.mjs +62 -2
  318. package/skills/convergence-monitoring/SIGNALS.md +55 -0
  319. package/skills/discovery/probes/vault-staleness.mjs +37 -13
  320. package/skills/discovery/probes-arch.md +20 -18
  321. package/skills/dispatcher/SKILL.md +3 -2
  322. package/skills/ecosystem-health/SKILL.md +4 -1
  323. package/skills/ecosystem-health/wizard.md +5 -0
  324. package/skills/evolve/SKILL.md +87 -11
  325. package/skills/frontmatter-guard/SKILL.md +11 -5
  326. package/skills/npm-publish/SKILL.md +1 -1
  327. package/skills/reconcile/SKILL.md +38 -2
  328. package/skills/remote-offload/SKILL.md +89 -0
  329. package/skills/session-end/SKILL.md +18 -905
  330. package/skills/session-end/phase-3-6-tail.md +19 -9
  331. package/skills/session-end/plan-verification.md +221 -155
  332. package/skills/session-end/references/phase-2-quality-gate.md +93 -0
  333. package/skills/session-end/references/phase-3-documentation-updates.md +229 -0
  334. package/skills/session-end/references/phase-4a-worktree-cleanup.md +120 -0
  335. package/skills/session-end/references/phase-4b-worktree-orphan-sweep.md +58 -0
  336. package/skills/session-end/references/phase-5-issue-cleanup.md +104 -0
  337. package/skills/session-end/references/session-summary-template.md +62 -0
  338. package/skills/session-plan/SKILL.md +49 -0
  339. package/skills/session-start/SKILL.md +41 -900
  340. package/skills/session-start/phase-8-5-express-path.md +1 -1
  341. package/skills/session-start/references/phase-1-1-dispatcher-autonomy-capture.md +55 -0
  342. package/skills/session-start/references/phase-1-2-session-lock.md +140 -0
  343. package/skills/session-start/references/phase-1-5-session-continuity.md +254 -0
  344. package/skills/session-start/references/phase-1-7-vault-status-board.md +53 -0
  345. package/skills/session-start/references/phase-2-7-portfolio-snapshot.md +75 -0
  346. package/skills/session-start/references/phase-4-ssot-environment-check.md +155 -0
  347. package/skills/session-start/references/phase-6-5-forced-reads.md +75 -0
  348. package/skills/session-start/references/phase-6-6-project-intelligence.md +81 -0
  349. package/skills/session-start/references/phase-6-7-memory-banner-telemetry-consent.md +103 -0
  350. package/skills/vault-sync/validator.mjs +21 -27
  351. package/skills/wave-executor/SKILL.md +16 -2
  352. package/skills/wave-executor/references/wave-loop-dispatch.md +612 -0
  353. package/skills/wave-executor/references/wave-loop-review.md +570 -0
  354. package/skills/wave-executor/references/wave-loop-scope-manifest.md +162 -0
  355. package/skills/wave-executor/wave-loop.md +14 -1271
  356. package/templates/_shared/journey-manifest.md +10 -6
  357. package/.cursor/commands/autopilot-multi.md +0 -14
  358. package/.cursor/commands/contract-version-bump.md +0 -14
  359. package/.cursor/commands/journey-audit.md +0 -14
  360. package/.cursor/skills/contract-version-bump/SKILL.md +0 -12
  361. package/.cursor/skills/daily/SKILL.md +0 -12
  362. package/.cursor/skills/domain-model/SKILL.md +0 -13
  363. package/.cursor/skills/journey-audit/SKILL.md +0 -13
  364. package/.cursor/skills/skill-creator/SKILL.md +0 -13
  365. package/.cursor/skills/ubiquitous-language/SKILL.md +0 -13
  366. package/commands/autopilot-multi.md +0 -74
  367. package/commands/contract-version-bump.md +0 -28
  368. package/commands/journey-audit.md +0 -43
  369. package/pi/prompts/autopilot-multi.md +0 -12
  370. package/pi/prompts/contract-version-bump.md +0 -12
  371. package/pi/prompts/journey-audit.md +0 -12
  372. package/scripts/autopilot-multi.mjs +0 -885
  373. package/scripts/backfill-learnings-expires.mjs +0 -196
  374. package/scripts/backfill-learnings.mjs +0 -203
  375. package/scripts/fleet-instruction-scan.mjs +0 -141
  376. package/scripts/lib/autopilot/dep-graph.mjs +0 -417
  377. package/scripts/lib/autopilot/multi-killswitch.mjs +0 -184
  378. package/scripts/lib/webhook-url.mjs +0 -105
  379. package/scripts/lifecycle-sim-v6.mjs +0 -347
  380. package/scripts/migrate-learnings-jsonl.mjs +0 -189
  381. package/scripts/migrate-subagents-jsonl.mjs +0 -196
  382. package/scripts/upload-social-preview.mjs +0 -316
  383. package/skills/_shared/model-selection.md +0 -64
  384. package/skills/contract-version-bump/SKILL.md +0 -219
  385. package/skills/daily/SKILL.md +0 -222
  386. package/skills/daily/generate.sh +0 -92
  387. package/skills/daily/templates/daily.md.tpl +0 -36
  388. package/skills/journey-audit/SKILL.md +0 -269
  389. package/skills/skill-creator/SKILL.md +0 -168
  390. package/skills/ubiquitous-language/SKILL.md +0 -97
  391. package/skills/vault-sync/package-lock.json +0 -40
  392. /package/skills/{domain-model → architecture/references}/ADR-FORMAT.md +0 -0
  393. /package/skills/{domain-model → architecture/references}/CONTEXT-FORMAT.md +0 -0
@@ -0,0 +1,370 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * check-hooks-emit-event-guard.mjs — every `emitEvent(...)` call site under
4
+ * `hooks/**\/*.mjs` must sit lexically inside a `try {} catch {}`, because
5
+ * `emitEvent()` THROWS `EventValidationError` on a malformed record
6
+ * (`scripts/lib/events.mjs`, #1177). An unguarded call site turns a
7
+ * telemetry-shape defect into an uncaught exception inside a
8
+ * PreToolUse/PostToolUse/Stop/SessionEnd/SessionStart hook — several of
9
+ * which are deny-capable. Per `.claude/rules/` "moving a guard from
10
+ * exit-code signalling to stdout-JSON inverts its failure direction": an
11
+ * aborted hook process writes no `permissionDecision` envelope at all, which
12
+ * several harnesses read as fail-OPEN (no decision → default allow) rather
13
+ * than fail-closed. #1183.
14
+ *
15
+ * SCOPE. `hooks/` is out of the file-scope this checker's OWNING task may
16
+ * edit (see the dispatching wave's FILE-SCOPE) — this checker only REPORTS,
17
+ * it never fixes. Five pre-existing unguarded call sites were census'd at
18
+ * HEAD 2ccea0f2 (2026-09-02, GitLab #1183) and were BASELINED below; all
19
+ * five were fixed in the same wave that added the reason/staleness
20
+ * discipline described next (FX-C, MED-3), so `BASELINE_UNGUARDED` is EMPTY
21
+ * on arrival. It stays a `Map<key, reason>`, not a bare `Set`, so the NEXT
22
+ * addition carries a reason from day one — mirroring
23
+ * `check-unwired-features.mjs`'s `ALLOWLIST` precedent verbatim: "Add an
24
+ * entry to `ALLOWLIST` keyed by the FULL dotted key path, whose value is a
25
+ * non-empty reason naming the actual consumer ... Every entry needs a
26
+ * reason — an empty or whitespace-only one is itself reported
27
+ * (`allowlist-missing-reason`) ... The list also drains itself: an entry is
28
+ * reported as `allowlist-stale` both when its key has left every config
29
+ * surface AND when the key stops triggering a finding (i.e. it finally got
30
+ * wired), so a fixed key does not leave a permanent exemption behind." Any
31
+ * unguarded call NOT in the baseline is a genuine regression and FAILs the
32
+ * build; a baseline entry whose site is now guarded or gone FAILs as
33
+ * `baseline-stale`; an entry with an empty reason FAILs as
34
+ * `baseline-missing-reason`. A baselined-but-still-unguarded site (a valid,
35
+ * reasoned entry that still matches) reports as a WARN, never a FAIL, so
36
+ * this checker can ship blocking-by-default without going red on arrival.
37
+ *
38
+ * METHOD (BV-001.5 substitution). A real AST scope-walk via `@babel/parser`
39
+ * (`sourceType: 'module'`, `topLevelAwait` + `importMeta` plugins — the same
40
+ * combination `check-guard-requires-parity.mjs` already parses every hook
41
+ * with), not brace-depth counting over source text. Brace-depth counting is
42
+ * fooled by a `{`/`}` inside a string, template literal, regex literal or
43
+ * comment; a real parser is immune to that class entirely, and
44
+ * `@babel/parser` is already an installed `dependencies` entry (not just
45
+ * `devDependencies`) used for the identical domain — reasoning about the
46
+ * lexical nesting of `hooks/**\/*.mjs`.
47
+ *
48
+ * GUARD DEFINITION. An `emitEvent(...)` `CallExpression` counts as guarded
49
+ * when walking its AST ancestor chain OUTWARD reaches a `TryStatement` —
50
+ * entered via its `.block` property specifically (not `.handler` /
51
+ * `.finalizer`: sitting INSIDE a catch or finally block is not "guarded by"
52
+ * that try) AND carrying a non-null `.handler` (an actual `catch` clause — a
53
+ * bare `try {} finally {}` does not swallow the throw, so it doesn't count
54
+ * either) — BEFORE crossing a function boundary (`FunctionDeclaration`,
55
+ * `FunctionExpression`, `ArrowFunctionExpression`, `ObjectMethod`,
56
+ * `ClassMethod`, `ClassPrivateMethod`). Crossing a function boundary first
57
+ * means the call can only be guarded by ITS OWN function's try, never by an
58
+ * outer function's — this is what makes the textbook false-negative case
59
+ * (`await helper()` inside an outer `try`, where `helper()` itself calls
60
+ * `emitEvent()` unguarded) correctly report unguarded rather than a false
61
+ * negative from naive text-proximity matching.
62
+ *
63
+ * NAMED CEILING (BV-004): a hook file that fails to parse under the plugin
64
+ * set above is reported as a tool-error FAIL for that file — never silently
65
+ * skipped, because a parse failure hiding a finding is worse than a loud
66
+ * one. REVISIT if `hooks/` ever needs syntax outside `topLevelAwait` +
67
+ * `importMeta` (e.g. decorators) — this repo's own ESLint config would need
68
+ * the same addition first, so the two drift together, not silently.
69
+ *
70
+ * Usage: check-hooks-emit-event-guard.mjs <repo-root>
71
+ * Output: ` PASS: …` / ` WARN: …` / ` FAIL: …` lines (two leading
72
+ * spaces), then `Results: N passed, M failed`. Exit 0 = clean (WARNs do not
73
+ * fail the build), 1 = at least one NEW (non-baselined) finding, 2 = tool
74
+ * error.
75
+ *
76
+ * Import-safety: importing this module MUST NOT execute anything — the
77
+ * isMain guard at the bottom is the only side-effecting path.
78
+ */
79
+
80
+ import { readFileSync } from 'node:fs';
81
+ import path from 'node:path';
82
+ import { pathToFileURL } from 'node:url';
83
+ import { parse } from '@babel/parser';
84
+ import { listRepoFiles } from './repo-files.mjs';
85
+
86
+ // ---------------------------------------------------------------------------
87
+ // Baseline — Map<key, reason>, keyed on
88
+ // `<repo-relative-file>::<event-type-literal>` rather than a line number:
89
+ // `hooks/` churns under other waves in this repo's normal operation, and a
90
+ // line-number key would silently stop matching (or worse, mismatch a
91
+ // DIFFERENT call) on any unrelated edit above a baselined site. A static
92
+ // string-literal first argument (as every real emitEvent() call in this
93
+ // repo uses) makes the key stable.
94
+ //
95
+ // Empty on arrival (MED-3, FX-C, 2026-09-02): the five sites census'd at
96
+ // HEAD 2ccea0f2 (#1183) were guarded in the same wave that added this Map
97
+ // plus the baseline-stale / baseline-missing-reason detection below. A
98
+ // future addition MUST carry a non-empty reason naming the linked issue —
99
+ // an empty reason fails as `baseline-missing-reason`, and an entry whose
100
+ // site is later guarded (or removed) fails as `baseline-stale` rather than
101
+ // lingering as a silent, permanent WARN exemption.
102
+ // ---------------------------------------------------------------------------
103
+
104
+ const BASELINE_UNGUARDED = new Map();
105
+
106
+ const HOOKS_DIR_REL = 'hooks';
107
+
108
+ const FUNCTION_TYPES = new Set([
109
+ 'FunctionDeclaration',
110
+ 'FunctionExpression',
111
+ 'ArrowFunctionExpression',
112
+ 'ObjectMethod',
113
+ 'ClassMethod',
114
+ 'ClassPrivateMethod',
115
+ ]);
116
+
117
+ /** AST metadata keys that are never worth descending into (no code nesting). */
118
+ const SKIP_KEYS = new Set([
119
+ 'loc',
120
+ 'start',
121
+ 'end',
122
+ 'extra',
123
+ 'tokens',
124
+ 'comments',
125
+ 'errors',
126
+ 'leadingComments',
127
+ 'trailingComments',
128
+ 'innerComments',
129
+ ]);
130
+
131
+ /**
132
+ * Parse a source module with the same syntax family used by this repository
133
+ * for `hooks/**\/*.mjs` (mirrors `check-guard-requires-parity.mjs`).
134
+ *
135
+ * @param {string} source
136
+ * @param {string} filename
137
+ * @returns {import('@babel/parser').ParseResult<import('@babel/types').File>}
138
+ */
139
+ function parseModule(source, filename) {
140
+ return parse(source, {
141
+ sourceType: 'module',
142
+ sourceFilename: filename,
143
+ errorRecovery: false,
144
+ plugins: ['topLevelAwait', 'importMeta'],
145
+ });
146
+ }
147
+
148
+ /**
149
+ * @param {{node: any, key: string | number}[]} ancestors outer→inner
150
+ * @returns {boolean}
151
+ */
152
+ function isGuardedByTry(ancestors) {
153
+ for (let i = ancestors.length - 1; i >= 0; i -= 1) {
154
+ const { node, key } = ancestors[i];
155
+ if (FUNCTION_TYPES.has(node.type)) return false; // own function's scope — stop here
156
+ if (node.type === 'TryStatement' && key === 'block' && node.handler !== null && node.handler !== undefined) return true;
157
+ }
158
+ return false;
159
+ }
160
+
161
+ /**
162
+ * @param {any} callNode a CallExpression node
163
+ * @returns {string | null} the first argument's literal string value, else null
164
+ */
165
+ function eventTypeLiteral(callNode) {
166
+ const arg = callNode.arguments?.[0];
167
+ return arg && arg.type === 'StringLiteral' ? arg.value : null;
168
+ }
169
+
170
+ /**
171
+ * Find every `emitEvent(...)` call site in `source` and classify each as
172
+ * guarded/unguarded per {@link isGuardedByTry}.
173
+ *
174
+ * @param {string} source
175
+ * @param {string} filename repo-relative path, used only for parse error messages
176
+ * @returns {{line: number, guarded: boolean, eventType: string | null}[]}
177
+ */
178
+ export function findEmitEventCalls(source, filename) {
179
+ const ast = parseModule(source, filename);
180
+ const calls = [];
181
+
182
+ /**
183
+ * @param {any} node
184
+ * @param {{node: any, key: string | number}[]} ancestors
185
+ */
186
+ function visit(node, ancestors) {
187
+ if (Array.isArray(node)) {
188
+ for (const item of node) visit(item, ancestors);
189
+ return;
190
+ }
191
+ if (!node || typeof node !== 'object' || typeof node.type !== 'string') return;
192
+
193
+ if (
194
+ node.type === 'CallExpression' &&
195
+ node.callee?.type === 'Identifier' &&
196
+ node.callee.name === 'emitEvent'
197
+ ) {
198
+ calls.push({
199
+ line: node.loc?.start?.line ?? 0,
200
+ guarded: isGuardedByTry(ancestors),
201
+ eventType: eventTypeLiteral(node),
202
+ });
203
+ }
204
+
205
+ for (const [key, child] of Object.entries(node)) {
206
+ if (SKIP_KEYS.has(key)) continue;
207
+ if (child && typeof child === 'object') {
208
+ ancestors.push({ node, key });
209
+ visit(child, ancestors);
210
+ ancestors.pop();
211
+ }
212
+ }
213
+ }
214
+
215
+ visit(ast.program, []);
216
+ return calls;
217
+ }
218
+
219
+ /**
220
+ * @typedef {{kind: 'unguarded', file: string, line: number, eventType: string | null, baselined: boolean}} UnguardedFinding
221
+ * @typedef {{kind: 'baseline-stale' | 'baseline-missing-reason', key: string, message: string}} BaselineFinding
222
+ * @typedef {UnguardedFinding | BaselineFinding} Finding
223
+ */
224
+
225
+ /**
226
+ * @param {string} repoRoot
227
+ * @param {{baseline?: Map<string, string>}} [options] `baseline` defaults to
228
+ * the module-level `BASELINE_UNGUARDED` (empty in production); injectable
229
+ * so tests can exercise `baseline-stale` / `baseline-missing-reason`
230
+ * against a synthetic map without mutating the shipped baseline.
231
+ * @returns {{findings: Finding[], parseErrors: {file: string, message: string}[]}}
232
+ */
233
+ export function scanHooksEmitEventGuard(repoRoot, { baseline = BASELINE_UNGUARDED } = {}) {
234
+ const files = listRepoFiles(repoRoot, { dirs: [HOOKS_DIR_REL], exts: ['mjs'] });
235
+ /** @type {Finding[]} */
236
+ const findings = [];
237
+ /** @type {{file: string, message: string}[]} */
238
+ const parseErrors = [];
239
+ /** @type {Set<string>} baseline keys that matched a real unguarded call site this scan */
240
+ const flagged = new Set();
241
+
242
+ for (const absFile of files) {
243
+ const rel = path.relative(repoRoot, absFile).split(path.sep).join('/');
244
+ let source;
245
+ try {
246
+ source = readFileSync(absFile, 'utf8');
247
+ } catch (err) {
248
+ parseErrors.push({ file: rel, message: `unreadable: ${err?.message ?? String(err)}` });
249
+ continue;
250
+ }
251
+ if (!source.includes('emitEvent(')) continue; // cheap textual pre-filter
252
+
253
+ let calls;
254
+ try {
255
+ calls = findEmitEventCalls(source, rel);
256
+ } catch (err) {
257
+ parseErrors.push({ file: rel, message: err?.message ?? String(err) });
258
+ continue;
259
+ }
260
+
261
+ for (const call of calls) {
262
+ if (call.guarded) continue;
263
+ const key = `${rel}::${call.eventType ?? `L${call.line}`}`;
264
+ const isBaselined = baseline.has(key);
265
+ if (isBaselined) {
266
+ flagged.add(key);
267
+ const reason = baseline.get(key);
268
+ if (String(reason ?? '').trim() === '') {
269
+ findings.push({
270
+ kind: 'baseline-missing-reason',
271
+ key,
272
+ message: 'baseline entry has no reason — name the linked issue or remove the entry',
273
+ });
274
+ }
275
+ }
276
+ findings.push({
277
+ kind: 'unguarded',
278
+ file: rel,
279
+ line: call.line,
280
+ eventType: call.eventType,
281
+ baselined: isBaselined,
282
+ });
283
+ }
284
+ }
285
+
286
+ // Mirrors check-unwired-features.mjs's ALLOWLIST drain (see the header
287
+ // quote above): a baseline entry that no longer matches ANY unguarded call
288
+ // site this scan found — because the site is now guarded, or gone
289
+ // entirely — is stale and must be removed, not left as a permanent
290
+ // exemption.
291
+ for (const key of baseline.keys()) {
292
+ if (flagged.has(key)) continue;
293
+ findings.push({
294
+ kind: 'baseline-stale',
295
+ key,
296
+ message: 'baseline entry no longer matches an unguarded call site (guarded or removed) — remove the entry',
297
+ });
298
+ }
299
+
300
+ return { findings, parseErrors };
301
+ }
302
+
303
+ // ---------------------------------------------------------------------------
304
+ // CLI
305
+ // ---------------------------------------------------------------------------
306
+
307
+ /**
308
+ * Run the check against a repo root, printing the validate-plugin line
309
+ * vocabulary.
310
+ *
311
+ * @param {string} repoRoot
312
+ * @param {{baseline?: Map<string, string>}} [options] forwarded to
313
+ * {@link scanHooksEmitEventGuard} — see its JSDoc for why this is
314
+ * injectable (test-only; the CLI entrypoint below never passes it).
315
+ * @returns {number} 0 = clean (baselined WARNs allowed), 1 = new finding(s), 2 = tool error
316
+ */
317
+ export function runCheckHooksEmitEventGuard(repoRoot, options) {
318
+ console.log('--- Check: hooks emitEvent() try/catch guard (#1183) ---');
319
+
320
+ const { findings, parseErrors } = scanHooksEmitEventGuard(repoRoot, options);
321
+
322
+ if (parseErrors.length > 0) {
323
+ for (const e of parseErrors) console.log(` FAIL: ${e.file} — ${e.message}`);
324
+ console.log('');
325
+ console.log(`Results: 0 passed, ${parseErrors.length} failed`);
326
+ return 2;
327
+ }
328
+
329
+ const unguarded = findings.filter((f) => f.kind === 'unguarded');
330
+ const baselineIssues = findings.filter((f) => f.kind === 'baseline-stale' || f.kind === 'baseline-missing-reason');
331
+
332
+ const newUnguarded = unguarded.filter((f) => !f.baselined);
333
+ const baselinedUnguarded = unguarded.filter((f) => f.baselined);
334
+
335
+ if (newUnguarded.length === 0 && baselineIssues.length === 0) {
336
+ console.log(
337
+ baselinedUnguarded.length === 0
338
+ ? ' PASS: every hooks/**/*.mjs emitEvent() call site is try/catch-guarded'
339
+ : ` PASS: no NEW unguarded emitEvent() call sites (${baselinedUnguarded.length} pre-existing, baselined — see #1183)`,
340
+ );
341
+ }
342
+ for (const f of baselinedUnguarded) {
343
+ console.log(
344
+ ` WARN: ${f.file}:${f.line} — emitEvent('${f.eventType ?? '?'}') not inside a try/catch (pre-existing, baselined #1183 — out of this checker's file-scope to fix)`,
345
+ );
346
+ }
347
+ for (const f of newUnguarded) {
348
+ console.log(
349
+ ` FAIL: ${f.file}:${f.line} — emitEvent('${f.eventType ?? '?'}') not inside a try/catch — a throw here aborts the hook process`,
350
+ );
351
+ }
352
+ for (const f of baselineIssues) {
353
+ console.log(` FAIL: ${f.key} — ${f.message} (${f.kind})`);
354
+ }
355
+
356
+ const failCount = newUnguarded.length + baselineIssues.length;
357
+ console.log('');
358
+ console.log(`Results: ${failCount === 0 ? 1 : 0} passed, ${failCount} failed`);
359
+ return failCount > 0 ? 1 : 0;
360
+ }
361
+
362
+ const isMain = import.meta.url === pathToFileURL(process.argv[1] || '').href;
363
+ if (isMain) {
364
+ const root = process.argv[2];
365
+ if (!root) {
366
+ console.error('Usage: check-hooks-emit-event-guard.mjs <repo-root>');
367
+ process.exit(2);
368
+ }
369
+ process.exit(runCheckHooksEmitEventGuard(path.resolve(root)));
370
+ }
@@ -66,11 +66,33 @@ const DOCUMENTED_ASYMMETRIES = {
66
66
  // A handler missing on a shared event and NOT listed here → FAIL.
67
67
  handlerAsymmetries: {
68
68
  codex: {
69
- // Codex 0.144.4 has no payload adapter (docs/codex-setup.md § Hook
70
- // Surface and Trust): Edit/Write handlers expect Claude payload shapes,
71
- // Bash guards expect tool_name === 'Bash'. Wiring them would be a silent
72
- // no-op, not enforcement (#919-P2 class) — "pretending the payloads are
73
- // compatible would create false enforcement".
69
+ // WHY these stay unwired corrected 2026-09-06 against the shipped
70
+ // codex-cli 0.144.4 binary, because the previous rationale here was
71
+ // measurably wrong and pointed at the wrong repair.
72
+ //
73
+ // REFUTED: "no Codex bridge delivers tool_name (grep scripts/lib/codex/
74
+ // *.mjs -> 0 matches)". That grep measured OUR adapter code, not the
75
+ // Codex payload contract. There is no bridge because none is needed:
76
+ // `pre-tool-use.command.input`, embedded verbatim in the binary, lists
77
+ // `tool_name` and `tool_input` among its REQUIRED fields (with `cwd`,
78
+ // `hook_event_name`, `model`, `permission_mode`, `session_id`,
79
+ // `tool_use_id`, `transcript_path`, `turn_id`). The output envelope is
80
+ // `hookSpecificOutput.{hookEventName,permissionDecision,
81
+ // permissionDecisionReason}` — byte-identical to what `emitDeny()`
82
+ // writes, and Codex's own error strings show it enforces exactly that
83
+ // shape ("PreToolUse hook returned permissionDecision:deny without a
84
+ // non-empty permissionDecisionReason").
85
+ //
86
+ // THE ACTUAL BLOCKER is the tool-name VOCABULARY, not the payload shape.
87
+ // Codex ships no `Bash`, `Edit`, `Write` or `MultiEdit` tool — it has
88
+ // `shell` / `exec_command` / `unified_exec` / `apply_patch`
89
+ // (`strings -a <codex> | grep -c '"Bash"'` -> 0). Every handler below
90
+ // opens with an equality gate on a Claude tool name and returns
91
+ // `emitAllow()` otherwise, so wiring one produces a hook that runs,
92
+ // matches nothing and allows everything: FALSE enforcement, which is
93
+ // strictly worse than the registered gap (#919-P2 class). The repair is
94
+ // a tool-name map (see CODEX_TOOL_NAMES in scripts/lib/codex/
95
+ // plugin-contract.mjs), not a manifest entry.
74
96
  PreToolUse: [
75
97
  // pre-task-scope-disjoint (#1020): NOT ported by construction. The hook
76
98
  // matches the `Agent` dispatch tool, which this platform does not have —
@@ -94,25 +116,32 @@ const DOCUMENTED_ASYMMETRIES = {
94
116
  'pre-bash-destructive-guard.mjs',
95
117
  'pre-bash-staging-fence.mjs',
96
118
  'pre-bash-memory-propose-audit.mjs',
97
- // pre-bash-sessions-ledger-guard (#958): same Bash-payload dependency
98
- // as the guards above — it reads tool_name === 'Bash' and
99
- // tool_input.command, neither of which any Codex bridge delivers
100
- // (measured 2026-07-31: `grep -rn "tool_name" scripts/lib/codex/*.mjs`
101
- // 0 matches, exit 1). A manifest entry would be a silent no-op, not
102
- // enforcement — #919-P2 class. Gap registered, not faked.
119
+ // pre-bash-sessions-ledger-guard (#958): same tool-name-vocabulary
120
+ // dependency as the guards above — it gates on tool_name === 'Bash',
121
+ // and Codex names its shell tools `shell` / `exec_command` /
122
+ // `unified_exec`. The fields it reads ARE delivered; the value it
123
+ // compares against never occurs. A manifest entry would be a silent
124
+ // no-op, not enforcement — #919-P2 class. Gap registered, not faked.
103
125
  'pre-bash-sessions-ledger-guard.mjs',
104
126
  'pre-bash-templates-first.mjs',
105
127
  'pre-bash-issue-budget.mjs',
106
128
  'enforce-commands.mjs',
107
129
  ],
108
- // post-bash-write-verify (#942): needs tool_name === 'Bash', which no
109
- // Codex bridge delivers documented exception until an adapter exists.
110
- // Measured 2026-07-31: `grep -rn "tool_name" scripts/lib/codex/*.mjs`
111
- // → 0 matches (exit 1), so a manifest entry here would be a silent
112
- // no-op, not enforcement. Same #919-P2 class as the PreToolUse block.
130
+ // post-bash-write-verify (#942): gates on tool_name === 'Bash', a value
131
+ // Codex never emits (its shell tools are `shell` / `exec_command` /
132
+ // `unified_exec`). Documented exception until a tool-name map exists —
133
+ // a manifest entry today would be a silent no-op, not enforcement. Same
134
+ // #919-P2 class as the PreToolUse block. `post-tool-use.command.input`
135
+ // at 0.144.4 does require `tool_name`, `tool_input` AND `tool_response`,
136
+ // so the port is a rename map, not a payload bridge.
113
137
  PostToolUse: [
114
138
  'post-edit-validate.mjs',
115
139
  'post-tooluse-frontend-slop.mjs',
140
+ // post-edit-import-probe (#1224): same missing Edit/Write payload
141
+ // adapter as post-edit-validate — the hook reads tool_name and
142
+ // tool_input.file_path, neither of which any Codex bridge delivers.
143
+ // A manifest entry would be a silent no-op, not enforcement.
144
+ 'post-edit-import-probe.mjs',
116
145
  'post-bash-write-verify.mjs',
117
146
  ],
118
147
  SubagentStart: ['subagent-telemetry.mjs'],