@jtf19/vibecoding-kit 0.1.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 (619) hide show
  1. package/AGENTS.md +84 -0
  2. package/CHANGELOG.md +28 -0
  3. package/CLAUDE.md +137 -0
  4. package/CODE_OF_CONDUCT.md +30 -0
  5. package/CONTRIBUTING.md +69 -0
  6. package/LICENSE +67 -0
  7. package/README.md +162 -0
  8. package/SECURITY.md +34 -0
  9. package/adapters/claude/install.md +70 -0
  10. package/adapters/claude/plugin.json +38 -0
  11. package/adapters/claude/settings.example.json +15 -0
  12. package/adapters/codex/hooks.example.json +15 -0
  13. package/adapters/codex/install.md +72 -0
  14. package/adapters/codex/plugin.json +58 -0
  15. package/adapters/cursor/hooks.example.json +17 -0
  16. package/adapters/cursor/install.md +72 -0
  17. package/adapters/cursor/plugin.json +42 -0
  18. package/adapters/opencode/install.md +95 -0
  19. package/adapters/opencode/plugin.js +56 -0
  20. package/adapters/opencode/plugin.json +58 -0
  21. package/adapters/pi/extension.ts +56 -0
  22. package/adapters/pi/install.md +95 -0
  23. package/adapters/pi/plugin.json +58 -0
  24. package/bin/vibe-cli-usage.mjs +43 -0
  25. package/bin/vibe.mjs +120 -0
  26. package/docs/acceptance-checklist.md +1226 -0
  27. package/docs/architecture-debt-burndown.md +537 -0
  28. package/docs/architecture.md +77 -0
  29. package/docs/ci-evidence-onboarding.md +143 -0
  30. package/docs/development.md +71 -0
  31. package/docs/evidence-authoring.md +188 -0
  32. package/docs/golden-path.md +179 -0
  33. package/docs/install-acceptance-checklist.md +90 -0
  34. package/docs/install-claude.md +41 -0
  35. package/docs/install-codex.md +41 -0
  36. package/docs/install-cursor.md +41 -0
  37. package/docs/install-experience-roadmap.md +394 -0
  38. package/docs/install.md +119 -0
  39. package/docs/maintainer-guide.md +197 -0
  40. package/docs/phase-1-implementation.md +848 -0
  41. package/docs/phase-2-roadmap.md +142 -0
  42. package/docs/quick-recipes.md +115 -0
  43. package/docs/readiness-interpretation.md +105 -0
  44. package/docs/readiness-troubleshooting.md +209 -0
  45. package/docs/release-check-reference.md +63 -0
  46. package/docs/release-guide.md +481 -0
  47. package/docs/release-notes.md +75 -0
  48. package/docs/runtime-contract.md +1010 -0
  49. package/docs/runtime-maintainer-validation.md +212 -0
  50. package/docs/runtime-roadmap.md +2265 -0
  51. package/docs/skill-authoring-guide.md +150 -0
  52. package/docs/submodule-guide.md +131 -0
  53. package/docs/team-adoption.md +113 -0
  54. package/docs/user-guide.md +108 -0
  55. package/docs/vibecoding-fork-analysis.md +398 -0
  56. package/docs/workflow-chaining.md +539 -0
  57. package/examples/ci/README.md +61 -0
  58. package/examples/ci/ci-evidence-input.example.json +56 -0
  59. package/examples/ci/generate-diff-coverage.mjs +90 -0
  60. package/examples/ci/generate-test-evidence.mjs +82 -0
  61. package/examples/ci/github-actions-readiness.yml +108 -0
  62. package/examples/claude-project/README.md +57 -0
  63. package/examples/codex-project/README.md +57 -0
  64. package/examples/cursor-project/README.md +57 -0
  65. package/examples/full-chain/README.md +63 -0
  66. package/examples/full-chain/architecture-design.md +128 -0
  67. package/examples/full-chain/commit-readiness.json +31 -0
  68. package/examples/full-chain/delivery-traceability.yaml +32 -0
  69. package/examples/full-chain/diff-coverage.json +73 -0
  70. package/examples/full-chain/evidence.json +20 -0
  71. package/examples/full-chain/implementation-plan.md +54 -0
  72. package/examples/full-chain/product-acceptance.md +86 -0
  73. package/examples/full-chain/product-discovery.md +84 -0
  74. package/examples/full-chain/product-spec.md +88 -0
  75. package/examples/full-chain/scenario-acceptance.yaml +32 -0
  76. package/examples/full-chain/test-evidence.json +29 -0
  77. package/examples/full-chain/ui-design-contract.md +87 -0
  78. package/examples/golden-path/README.md +84 -0
  79. package/examples/golden-path/diff-coverage.json +66 -0
  80. package/examples/golden-path/implementation-plan.md +62 -0
  81. package/examples/golden-path/product-spec.md +96 -0
  82. package/examples/golden-path/test-evidence.json +29 -0
  83. package/examples/runtime-fixtures/architecture-design.md +128 -0
  84. package/examples/runtime-fixtures/commit-readiness.json +31 -0
  85. package/examples/runtime-fixtures/delivery-traceability.yaml +32 -0
  86. package/examples/runtime-fixtures/diff-coverage.json +73 -0
  87. package/examples/runtime-fixtures/evidence.json +20 -0
  88. package/examples/runtime-fixtures/implementation-plan.md +54 -0
  89. package/examples/runtime-fixtures/negative/commit-readiness-boundary-escalated.json +27 -0
  90. package/examples/runtime-fixtures/negative/delivery-traceability-bad-ref.yaml +32 -0
  91. package/examples/runtime-fixtures/negative/diff-coverage-changed-file-without-task-ref.json +40 -0
  92. package/examples/runtime-fixtures/negative/diff-coverage-operation-mismatch.json +38 -0
  93. package/examples/runtime-fixtures/negative/diff-coverage-required-task-missing.json +24 -0
  94. package/examples/runtime-fixtures/negative/diff-coverage-unexpected-file.json +20 -0
  95. package/examples/runtime-fixtures/negative/test-evidence-missing-output-digest.json +23 -0
  96. package/examples/runtime-fixtures/negative/test-evidence-risky-task-missing.json +29 -0
  97. package/examples/runtime-fixtures/product-acceptance.md +86 -0
  98. package/examples/runtime-fixtures/product-discovery.md +84 -0
  99. package/examples/runtime-fixtures/product-spec.md +88 -0
  100. package/examples/runtime-fixtures/scenario-acceptance.yaml +32 -0
  101. package/examples/runtime-fixtures/test-evidence.json +29 -0
  102. package/examples/runtime-fixtures/ui-design-contract.md +87 -0
  103. package/hooks/post-tool-compact/README.md +47 -0
  104. package/hooks/session-start/README.md +112 -0
  105. package/hooks/session-start/session-start-state-boundary-contract.mjs +161 -0
  106. package/hooks/session-start/session-start.md +29 -0
  107. package/hooks/session-start/session-start.mjs +49 -0
  108. package/hooks/workflow-handoff/README.md +44 -0
  109. package/hooks/workflow-handoff/workflow-handoff.md +11 -0
  110. package/package.json +72 -0
  111. package/skills/using-vibecoding/SKILL.md +396 -0
  112. package/skills/vibe-brainstorming/SKILL.md +98 -0
  113. package/skills/vibe-context-compact/SKILL.md +95 -0
  114. package/skills/vibe-debugging/SKILL.md +87 -0
  115. package/skills/vibe-dispatching-parallel-work/SKILL.md +144 -0
  116. package/skills/vibe-executing-plans/SKILL.md +114 -0
  117. package/skills/vibe-finishing-a-development-branch/SKILL.md +110 -0
  118. package/skills/vibe-implementation/SKILL.md +84 -0
  119. package/skills/vibe-planning/SKILL.md +102 -0
  120. package/skills/vibe-product-acceptance/SKILL.md +106 -0
  121. package/skills/vibe-product-discovery/SKILL.md +107 -0
  122. package/skills/vibe-product-spec/SKILL.md +105 -0
  123. package/skills/vibe-receiving-code-review/SKILL.md +110 -0
  124. package/skills/vibe-requesting-code-review/SKILL.md +106 -0
  125. package/skills/vibe-review/SKILL.md +106 -0
  126. package/skills/vibe-subagent-driven-development/SKILL.md +198 -0
  127. package/skills/vibe-systematic-debugging/SKILL.md +106 -0
  128. package/skills/vibe-test-driven-development/SKILL.md +112 -0
  129. package/skills/vibe-ui-design/SKILL.md +107 -0
  130. package/skills/vibe-verification/SKILL.md +84 -0
  131. package/skills/vibe-verification-before-completion/SKILL.md +170 -0
  132. package/skills/vibe-workspace-isolation/SKILL.md +158 -0
  133. package/skills/vibe-writing-plans/SKILL.md +137 -0
  134. package/skills/vibe-writing-skills/SKILL.md +118 -0
  135. package/templates/AGENTS.md +88 -0
  136. package/templates/CLAUDE.md +88 -0
  137. package/templates/VIBE-CODING.md +157 -0
  138. package/templates/architecture-design.md +139 -0
  139. package/templates/delivery-traceability.yaml +52 -0
  140. package/templates/evidence/README.md +117 -0
  141. package/templates/evidence/diff-coverage.json +34 -0
  142. package/templates/evidence/test-evidence.json +29 -0
  143. package/templates/implementation-plan.md +73 -0
  144. package/templates/product-acceptance.md +84 -0
  145. package/templates/product-discovery.md +81 -0
  146. package/templates/product-spec.md +84 -0
  147. package/templates/scenario-acceptance.yaml +37 -0
  148. package/templates/ui-design-contract.md +86 -0
  149. package/tools/vibe-architecture-check/README.md +66 -0
  150. package/tools/vibe-architecture-check/index.mjs +691 -0
  151. package/tools/vibe-compact/README.md +65 -0
  152. package/tools/vibe-compact/compact-contract.mjs +63 -0
  153. package/tools/vibe-compact/index.mjs +111 -0
  154. package/tools/vibe-doctor/README.md +200 -0
  155. package/tools/vibe-doctor/index.mjs +1721 -0
  156. package/tools/vibe-init/README.md +231 -0
  157. package/tools/vibe-init/index.mjs +369 -0
  158. package/tools/vibe-init/init-cli-args.mjs +100 -0
  159. package/tools/vibe-init/init-entry-merge-model.mjs +33 -0
  160. package/tools/vibe-init/init-install-manifest-model.mjs +137 -0
  161. package/tools/vibe-init/init-installed-agent-experience-contract.mjs +172 -0
  162. package/tools/vibe-init/init-platform-model.mjs +11 -0
  163. package/tools/vibe-init/init-presentation.mjs +149 -0
  164. package/tools/vibe-lifecycle/README.md +37 -0
  165. package/tools/vibe-lifecycle/index.mjs +365 -0
  166. package/tools/vibe-lifecycle/lifecycle-cli-args.mjs +104 -0
  167. package/tools/vibe-lifecycle/lifecycle-summary-model.mjs +67 -0
  168. package/tools/vibe-lifecycle/lifecycle-uninstall-plan-model.mjs +11 -0
  169. package/tools/vibe-plugin-pack/README.md +105 -0
  170. package/tools/vibe-plugin-pack/index.mjs +302 -0
  171. package/tools/vibe-plugin-pack/plugin-pack-cli.mjs +39 -0
  172. package/tools/vibe-plugin-pack/plugin-pack-manifest.mjs +37 -0
  173. package/tools/vibe-profile/index.mjs +212 -0
  174. package/tools/vibe-release-check/README.md +123 -0
  175. package/tools/vibe-release-check/command-manifest/release-check-base-commands.mjs +23 -0
  176. package/tools/vibe-release-check/command-manifest/release-check-closeout-commands.mjs +16 -0
  177. package/tools/vibe-release-check/command-manifest/release-check-command-metadata.mjs +32 -0
  178. package/tools/vibe-release-check/command-manifest/release-check-completion-commands.mjs +41 -0
  179. package/tools/vibe-release-check/command-manifest/release-check-full-chain-commands.mjs +12 -0
  180. package/tools/vibe-release-check/command-manifest/release-check-golden-path-commands.mjs +12 -0
  181. package/tools/vibe-release-check/command-manifest/release-check-install-commands.mjs +26 -0
  182. package/tools/vibe-release-check/command-manifest/release-check-learning-smoke-commands.mjs +21 -0
  183. package/tools/vibe-release-check/command-manifest/release-check-methodology-commands.mjs +27 -0
  184. package/tools/vibe-release-check/command-manifest/release-check-runtime-smoke-commands.mjs +116 -0
  185. package/tools/vibe-release-check/command-manifest/release-check-token-smoke-commands.mjs +21 -0
  186. package/tools/vibe-release-check/index.mjs +223 -0
  187. package/tools/vibe-release-check/release-check-behavior-smoke.mjs +177 -0
  188. package/tools/vibe-release-check/release-check-cli.mjs +37 -0
  189. package/tools/vibe-release-check/release-check-command-manifest.mjs +49 -0
  190. package/tools/vibe-release-check/release-check-completion-fixtures.mjs +151 -0
  191. package/tools/vibe-release-check/release-check-completion-suite.mjs +110 -0
  192. package/tools/vibe-release-check/release-check-dispatch.mjs +116 -0
  193. package/tools/vibe-release-check/release-check-full-chain-suite.mjs +55 -0
  194. package/tools/vibe-release-check/release-check-golden-path-suite.mjs +85 -0
  195. package/tools/vibe-release-check/release-check-install-marker-specs.mjs +133 -0
  196. package/tools/vibe-release-check/release-check-install-suite.mjs +112 -0
  197. package/tools/vibe-release-check/release-check-json-assertion-helpers.mjs +157 -0
  198. package/tools/vibe-release-check/release-check-json-markers.mjs +33 -0
  199. package/tools/vibe-release-check/release-check-learning-fixture-specs.mjs +199 -0
  200. package/tools/vibe-release-check/release-check-learning-suite.mjs +249 -0
  201. package/tools/vibe-release-check/release-check-live-behavior-smoke-fixture.mjs +406 -0
  202. package/tools/vibe-release-check/release-check-methodology-suite.mjs +108 -0
  203. package/tools/vibe-release-check/release-check-package-boundary-smoke.mjs +111 -0
  204. package/tools/vibe-release-check/release-check-platform-transcript-smoke-fixture.mjs +150 -0
  205. package/tools/vibe-release-check/release-check-readonly-marker-data.mjs +1 -0
  206. package/tools/vibe-release-check/release-check-readonly-marker-smoke-specs.mjs +170 -0
  207. package/tools/vibe-release-check/release-check-run-summary.mjs +67 -0
  208. package/tools/vibe-release-check/release-check-runtime-automation-fixtures.mjs +1 -0
  209. package/tools/vibe-release-check/release-check-runtime-automation-governance-reply-trace-smoke-helpers.mjs +224 -0
  210. package/tools/vibe-release-check/release-check-runtime-automation-governance-smoke-specs.mjs +215 -0
  211. package/tools/vibe-release-check/release-check-runtime-automation-governance-suite.mjs +5 -0
  212. package/tools/vibe-release-check/release-check-runtime-automation-methodology-smoke-specs.mjs +157 -0
  213. package/tools/vibe-release-check/release-check-runtime-automation-methodology-suite.mjs +130 -0
  214. package/tools/vibe-release-check/release-check-runtime-automation-platform-smoke-helpers.mjs +306 -0
  215. package/tools/vibe-release-check/release-check-runtime-automation-platform-suite.mjs +30 -0
  216. package/tools/vibe-release-check/release-check-runtime-automation-smoke-fixtures.mjs +53 -0
  217. package/tools/vibe-release-check/release-check-runtime-automation-source-candidate-smoke-helpers.mjs +506 -0
  218. package/tools/vibe-release-check/release-check-runtime-automation-source-suite.mjs +5 -0
  219. package/tools/vibe-release-check/release-check-runtime-automation-subagents-lifecycle-smoke-helpers.mjs +305 -0
  220. package/tools/vibe-release-check/release-check-runtime-automation-subagents-suite.mjs +25 -0
  221. package/tools/vibe-release-check/release-check-runtime-automation-suite.mjs +25 -0
  222. package/tools/vibe-release-check/release-check-runtime-daemon-bounded-run-smoke-helpers.mjs +243 -0
  223. package/tools/vibe-release-check/release-check-runtime-daemon-suite.mjs +5 -0
  224. package/tools/vibe-release-check/release-check-runtime-dispatch-fixtures.mjs +129 -0
  225. package/tools/vibe-release-check/release-check-runtime-dispatch-suite.mjs +5 -0
  226. package/tools/vibe-release-check/release-check-runtime-execution-approval-smoke-helpers.mjs +274 -0
  227. package/tools/vibe-release-check/release-check-runtime-execution-approval-suite.mjs +5 -0
  228. package/tools/vibe-release-check/release-check-runtime-execution-base-suite.mjs +388 -0
  229. package/tools/vibe-release-check/release-check-runtime-execution-recovery-suite.mjs +412 -0
  230. package/tools/vibe-release-check/release-check-runtime-execution-scheduler-suite.mjs +261 -0
  231. package/tools/vibe-release-check/release-check-runtime-execution-suite.mjs +11 -0
  232. package/tools/vibe-release-check/release-check-runtime-flow-smoke.mjs +347 -0
  233. package/tools/vibe-release-check/release-check-runtime-handoff-fixture-specs.mjs +211 -0
  234. package/tools/vibe-release-check/release-check-runtime-handoff-fixtures.mjs +11 -0
  235. package/tools/vibe-release-check/release-check-runtime-handoff-smoke-specs.mjs +86 -0
  236. package/tools/vibe-release-check/release-check-runtime-handoff-suite.mjs +316 -0
  237. package/tools/vibe-release-check/release-check-runtime-ledger-fixture-specs.mjs +9 -0
  238. package/tools/vibe-release-check/release-check-runtime-ledger-fixtures.mjs +51 -0
  239. package/tools/vibe-release-check/release-check-runtime-ledger-suite.mjs +24 -0
  240. package/tools/vibe-release-check/release-check-runtime-scheduler-fixture-specs.mjs +129 -0
  241. package/tools/vibe-release-check/release-check-runtime-scheduler-fixtures.mjs +10 -0
  242. package/tools/vibe-release-check/release-check-runtime-sdd-suite.mjs +535 -0
  243. package/tools/vibe-release-check/release-check-runtime-smoke-harness.mjs +140 -0
  244. package/tools/vibe-release-check/release-check-runtime-surface-expectations.mjs +106 -0
  245. package/tools/vibe-release-check/release-check-runtime-surface-smoke.mjs +112 -0
  246. package/tools/vibe-release-check/release-check-runtime-task-artifact-suite.mjs +105 -0
  247. package/tools/vibe-release-check/release-check-runtime-task-fixture-specs.mjs +270 -0
  248. package/tools/vibe-release-check/release-check-runtime-task-fixtures.mjs +19 -0
  249. package/tools/vibe-release-check/release-check-runtime.mjs +53 -0
  250. package/tools/vibe-release-check/release-check-stage103-118-fixtures.mjs +214 -0
  251. package/tools/vibe-release-check/release-check-stage103-118-smoke-specs.mjs +97 -0
  252. package/tools/vibe-release-check/release-check-stage103-118-smoke.mjs +861 -0
  253. package/tools/vibe-release-check/release-check-stage11-smoke.mjs +66 -0
  254. package/tools/vibe-release-check/release-check-stage119-120-fixture-specs.mjs +119 -0
  255. package/tools/vibe-release-check/release-check-stage119-120-smoke.mjs +325 -0
  256. package/tools/vibe-release-check/release-check-stage12-smoke.mjs +59 -0
  257. package/tools/vibe-release-check/release-check-stage121-136-fixture-specs.mjs +26 -0
  258. package/tools/vibe-release-check/release-check-stage121-136-fixtures.mjs +591 -0
  259. package/tools/vibe-release-check/release-check-stage121-136-smoke.mjs +917 -0
  260. package/tools/vibe-release-check/release-check-stage13-smoke.mjs +78 -0
  261. package/tools/vibe-release-check/release-check-stage137-140-smoke.mjs +534 -0
  262. package/tools/vibe-release-check/release-check-stage14-smoke.mjs +101 -0
  263. package/tools/vibe-release-check/release-check-stage141-148-smoke.mjs +1143 -0
  264. package/tools/vibe-release-check/release-check-stage15-smoke.mjs +132 -0
  265. package/tools/vibe-release-check/release-check-stage50-53-smoke.mjs +429 -0
  266. package/tools/vibe-release-check/release-check-subagent-adapter-bridge-smoke.mjs +162 -0
  267. package/tools/vibe-release-check/release-check-suite-plan-smoke.mjs +86 -0
  268. package/tools/vibe-release-check/release-check-suites.mjs +164 -0
  269. package/tools/vibe-release-check/release-check-test-run-smoke.mjs +59 -0
  270. package/tools/vibe-release-check/release-check-timing.mjs +98 -0
  271. package/tools/vibe-release-check/release-check-token-suite.mjs +260 -0
  272. package/tools/vibe-release-check/release-check-workflow-entry-suite.mjs +195 -0
  273. package/tools/vibe-release-check/release-check-workflow-governance-fixtures.mjs +138 -0
  274. package/tools/vibe-release-check/release-check-workflow-governance-smoke-suite.mjs +768 -0
  275. package/tools/vibe-release-check/release-check-workflow-ux-smoke.mjs +456 -0
  276. package/tools/vibe-runtime/README.md +2637 -0
  277. package/tools/vibe-runtime/index.mjs +3117 -0
  278. package/tools/vibe-runtime/runtime-adapter-bootstrap-matrix.mjs +264 -0
  279. package/tools/vibe-runtime/runtime-adapter-entry-acceptance.mjs +310 -0
  280. package/tools/vibe-runtime/runtime-adapter-packaging-consistency-command.mjs +131 -0
  281. package/tools/vibe-runtime/runtime-adapter-packaging-consistency.mjs +253 -0
  282. package/tools/vibe-runtime/runtime-advice-hub-model.mjs +175 -0
  283. package/tools/vibe-runtime/runtime-agent-session-start-contract.mjs +138 -0
  284. package/tools/vibe-runtime/runtime-artifact-ref-validation.mjs +281 -0
  285. package/tools/vibe-runtime/runtime-automatic-verification-gate-contract.mjs +134 -0
  286. package/tools/vibe-runtime/runtime-automation-boundary-text.mjs +7 -0
  287. package/tools/vibe-runtime/runtime-automation-command.mjs +367 -0
  288. package/tools/vibe-runtime/runtime-automation-plan-model.mjs +239 -0
  289. package/tools/vibe-runtime/runtime-automation-policy-model.mjs +175 -0
  290. package/tools/vibe-runtime/runtime-automation-readiness.mjs +347 -0
  291. package/tools/vibe-runtime/runtime-autopilot-lab-profile-contract.mjs +223 -0
  292. package/tools/vibe-runtime/runtime-behavioral-evaluation-contract.mjs +529 -0
  293. package/tools/vibe-runtime/runtime-behavioral-negative-gate-matrix.mjs +274 -0
  294. package/tools/vibe-runtime/runtime-bounded-attempt-policy-model.mjs +13 -0
  295. package/tools/vibe-runtime/runtime-bounded-foreground-command-executor-contract.mjs +288 -0
  296. package/tools/vibe-runtime/runtime-capability-registry.mjs +250 -0
  297. package/tools/vibe-runtime/runtime-cli-args.mjs +550 -0
  298. package/tools/vibe-runtime/runtime-cli-command-specs.mjs +63 -0
  299. package/tools/vibe-runtime/runtime-cli-dispatch.mjs +21 -0
  300. package/tools/vibe-runtime/runtime-cli-evidence-option-specs.mjs +193 -0
  301. package/tools/vibe-runtime/runtime-cli-evidence-options.mjs +28 -0
  302. package/tools/vibe-runtime/runtime-cli-from-options.mjs +222 -0
  303. package/tools/vibe-runtime/runtime-cli-low-risk-option-specs.mjs +128 -0
  304. package/tools/vibe-runtime/runtime-cli-main.mjs +32 -0
  305. package/tools/vibe-runtime/runtime-cli-option-default-families.mjs +454 -0
  306. package/tools/vibe-runtime/runtime-cli-option-defaults.mjs +33 -0
  307. package/tools/vibe-runtime/runtime-cli-option-handlers.mjs +82 -0
  308. package/tools/vibe-runtime/runtime-cli-usage.mjs +316 -0
  309. package/tools/vibe-runtime/runtime-cli-value-options.mjs +74 -0
  310. package/tools/vibe-runtime/runtime-close-loop-dashboard.mjs +283 -0
  311. package/tools/vibe-runtime/runtime-closeout-parity-contract.mjs +214 -0
  312. package/tools/vibe-runtime/runtime-command-container.mjs +26 -0
  313. package/tools/vibe-runtime/runtime-command-surface-registry.mjs +383 -0
  314. package/tools/vibe-runtime/runtime-command-wrapper-deps.mjs +13 -0
  315. package/tools/vibe-runtime/runtime-commit-readiness-envelope.mjs +281 -0
  316. package/tools/vibe-runtime/runtime-completion-boundary-text.mjs +7 -0
  317. package/tools/vibe-runtime/runtime-completion-bundle-contract.mjs +71 -0
  318. package/tools/vibe-runtime/runtime-completion-chain-assembly.mjs +48 -0
  319. package/tools/vibe-runtime/runtime-completion-command.mjs +50 -0
  320. package/tools/vibe-runtime/runtime-completion-evidence-bundle.mjs +269 -0
  321. package/tools/vibe-runtime/runtime-completion-evidence-descriptors.mjs +156 -0
  322. package/tools/vibe-runtime/runtime-completion-local-evidence-gates.mjs +164 -0
  323. package/tools/vibe-runtime/runtime-completion-presentation.mjs +71 -0
  324. package/tools/vibe-runtime/runtime-completion-readiness-summary.mjs +159 -0
  325. package/tools/vibe-runtime/runtime-confirmed-one-shot-plan.mjs +300 -0
  326. package/tools/vibe-runtime/runtime-context-budget-entry-defaults-command.mjs +77 -0
  327. package/tools/vibe-runtime/runtime-context-budget-entry-defaults.mjs +341 -0
  328. package/tools/vibe-runtime/runtime-contract-marker-registry.mjs +13 -0
  329. package/tools/vibe-runtime/runtime-contributor-guardrail-command.mjs +78 -0
  330. package/tools/vibe-runtime/runtime-contributor-guardrail-evidence.mjs +319 -0
  331. package/tools/vibe-runtime/runtime-control-plane-command.mjs +237 -0
  332. package/tools/vibe-runtime/runtime-control-plane-evals-artifacts.mjs +123 -0
  333. package/tools/vibe-runtime/runtime-control-plane-evals-boundary-model.mjs +75 -0
  334. package/tools/vibe-runtime/runtime-control-plane-evals-cases.mjs +547 -0
  335. package/tools/vibe-runtime/runtime-control-plane-evals-command.mjs +527 -0
  336. package/tools/vibe-runtime/runtime-control-plane-evals-report-validation.mjs +209 -0
  337. package/tools/vibe-runtime/runtime-control-plane-planner-artifacts.mjs +457 -0
  338. package/tools/vibe-runtime/runtime-control-plane-planning-command.mjs +563 -0
  339. package/tools/vibe-runtime/runtime-control-plane-planning-input.mjs +99 -0
  340. package/tools/vibe-runtime/runtime-control-plane-planning-listing.mjs +48 -0
  341. package/tools/vibe-runtime/runtime-control-plane-planning-presentation.mjs +246 -0
  342. package/tools/vibe-runtime/runtime-control-plane-planning-validation.mjs +529 -0
  343. package/tools/vibe-runtime/runtime-control-plane-readonly-command.mjs +537 -0
  344. package/tools/vibe-runtime/runtime-control-plane-readonly-deps.mjs +146 -0
  345. package/tools/vibe-runtime/runtime-control-plane-release-evidence.mjs +525 -0
  346. package/tools/vibe-runtime/runtime-control-plane-release-gates.mjs +369 -0
  347. package/tools/vibe-runtime/runtime-control-plane-router-planning-model.mjs +152 -0
  348. package/tools/vibe-runtime/runtime-control-plane-routing-artifacts.mjs +588 -0
  349. package/tools/vibe-runtime/runtime-controlled-change-delivery-contract.mjs +165 -0
  350. package/tools/vibe-runtime/runtime-controlled-execution-gate-contract.mjs +141 -0
  351. package/tools/vibe-runtime/runtime-controlled-long-running-automation-contract.mjs +184 -0
  352. package/tools/vibe-runtime/runtime-controlled-subagent-orchestration-contract.mjs +169 -0
  353. package/tools/vibe-runtime/runtime-daemon-command.mjs +166 -0
  354. package/tools/vibe-runtime/runtime-daemon-state-lifecycle-model.mjs +359 -0
  355. package/tools/vibe-runtime/runtime-delivery-methodology-command.mjs +17 -0
  356. package/tools/vibe-runtime/runtime-delivery-methodology-gates.mjs +277 -0
  357. package/tools/vibe-runtime/runtime-diff-coverage-envelope.mjs +301 -0
  358. package/tools/vibe-runtime/runtime-dispatch-command.mjs +484 -0
  359. package/tools/vibe-runtime/runtime-dispatch-readonly-artifacts.mjs +406 -0
  360. package/tools/vibe-runtime/runtime-dispatch-state-lifecycle-model.mjs +199 -0
  361. package/tools/vibe-runtime/runtime-durable-state-recovery-contract.mjs +172 -0
  362. package/tools/vibe-runtime/runtime-entry-advice-model.mjs +201 -0
  363. package/tools/vibe-runtime/runtime-entry-deps-builder.mjs +54 -0
  364. package/tools/vibe-runtime/runtime-entry-presentation.mjs +82 -0
  365. package/tools/vibe-runtime/runtime-entry-summary-model.mjs +343 -0
  366. package/tools/vibe-runtime/runtime-entry-trigger-discipline.mjs +341 -0
  367. package/tools/vibe-runtime/runtime-entry-trigger-tightening-command.mjs +79 -0
  368. package/tools/vibe-runtime/runtime-entry-trigger-tightening.mjs +357 -0
  369. package/tools/vibe-runtime/runtime-eval-catalog-model.mjs +101 -0
  370. package/tools/vibe-runtime/runtime-eval-transcript-fixtures.mjs +218 -0
  371. package/tools/vibe-runtime/runtime-evidence-intake-envelope.mjs +278 -0
  372. package/tools/vibe-runtime/runtime-evidence-repair-model.mjs +180 -0
  373. package/tools/vibe-runtime/runtime-executable-plan-contract.mjs +428 -0
  374. package/tools/vibe-runtime/runtime-execution-approval-lifecycle-models.mjs +278 -0
  375. package/tools/vibe-runtime/runtime-execution-candidate-approval-artifacts.mjs +227 -0
  376. package/tools/vibe-runtime/runtime-execution-command.mjs +544 -0
  377. package/tools/vibe-runtime/runtime-execution-enabled-bridge-model.mjs +113 -0
  378. package/tools/vibe-runtime/runtime-execution-enabled-closeout-boundary.mjs +89 -0
  379. package/tools/vibe-runtime/runtime-execution-enabled-preflight-model.mjs +185 -0
  380. package/tools/vibe-runtime/runtime-execution-enabled-profile-contract.mjs +127 -0
  381. package/tools/vibe-runtime/runtime-execution-enabled-run-envelope.mjs +153 -0
  382. package/tools/vibe-runtime/runtime-execution-evidence-binder.mjs +537 -0
  383. package/tools/vibe-runtime/runtime-execution-plan-artifacts.mjs +136 -0
  384. package/tools/vibe-runtime/runtime-execution-policy-artifacts.mjs +377 -0
  385. package/tools/vibe-runtime/runtime-execution-presentation.mjs +174 -0
  386. package/tools/vibe-runtime/runtime-execution-readonly-artifacts.mjs +228 -0
  387. package/tools/vibe-runtime/runtime-execution-run-preflight-artifacts.mjs +265 -0
  388. package/tools/vibe-runtime/runtime-execution-safety-artifacts.mjs +131 -0
  389. package/tools/vibe-runtime/runtime-execution-state-write-lifecycle-model.mjs +99 -0
  390. package/tools/vibe-runtime/runtime-experience-friction-matrix.mjs +395 -0
  391. package/tools/vibe-runtime/runtime-experience-learning-pattern.mjs +354 -0
  392. package/tools/vibe-runtime/runtime-experience-regression-dashboard.mjs +398 -0
  393. package/tools/vibe-runtime/runtime-experience-upgrade-command.mjs +92 -0
  394. package/tools/vibe-runtime/runtime-experience-upgrade-prioritizer.mjs +451 -0
  395. package/tools/vibe-runtime/runtime-foreground-worker-plan.mjs +275 -0
  396. package/tools/vibe-runtime/runtime-git-diff-read-model.mjs +322 -0
  397. package/tools/vibe-runtime/runtime-governance-attestation.mjs +304 -0
  398. package/tools/vibe-runtime/runtime-governance-command.mjs +609 -0
  399. package/tools/vibe-runtime/runtime-governance-convergence-reports.mjs +601 -0
  400. package/tools/vibe-runtime/runtime-governance-pr-models.mjs +551 -0
  401. package/tools/vibe-runtime/runtime-governance-presentation.mjs +67 -0
  402. package/tools/vibe-runtime/runtime-governance-route-model.mjs +194 -0
  403. package/tools/vibe-runtime/runtime-governance-surface-reports.mjs +495 -0
  404. package/tools/vibe-runtime/runtime-hooks-boundary-model.mjs +356 -0
  405. package/tools/vibe-runtime/runtime-hooks-command.mjs +286 -0
  406. package/tools/vibe-runtime/runtime-human-completion-evidence-model.mjs +220 -0
  407. package/tools/vibe-runtime/runtime-human-friendly-aliases.mjs +250 -0
  408. package/tools/vibe-runtime/runtime-implementation-methodology-command.mjs +17 -0
  409. package/tools/vibe-runtime/runtime-implementation-methodology-gates.mjs +164 -0
  410. package/tools/vibe-runtime/runtime-implementation-task-registry.mjs +334 -0
  411. package/tools/vibe-runtime/runtime-install-experience-command.mjs +120 -0
  412. package/tools/vibe-runtime/runtime-install-experience-score.mjs +334 -0
  413. package/tools/vibe-runtime/runtime-installed-multiround-ux-acceptance.mjs +149 -0
  414. package/tools/vibe-runtime/runtime-interaction-command-domain-registry.mjs +46 -0
  415. package/tools/vibe-runtime/runtime-interaction-command.mjs +648 -0
  416. package/tools/vibe-runtime/runtime-interaction-completion-command.mjs +220 -0
  417. package/tools/vibe-runtime/runtime-interaction-entry-command.mjs +130 -0
  418. package/tools/vibe-runtime/runtime-interaction-workflow-envelopes.mjs +412 -0
  419. package/tools/vibe-runtime/runtime-learning-advice-model.mjs +157 -0
  420. package/tools/vibe-runtime/runtime-learning-artifact-model.mjs +509 -0
  421. package/tools/vibe-runtime/runtime-learning-audit-model.mjs +106 -0
  422. package/tools/vibe-runtime/runtime-learning-interaction-command.mjs +220 -0
  423. package/tools/vibe-runtime/runtime-learning-observation-model.mjs +124 -0
  424. package/tools/vibe-runtime/runtime-learning-presentation.mjs +84 -0
  425. package/tools/vibe-runtime/runtime-learning-run-preview-model.mjs +184 -0
  426. package/tools/vibe-runtime/runtime-lease-command.mjs +95 -0
  427. package/tools/vibe-runtime/runtime-lease-state-lifecycle-model.mjs +247 -0
  428. package/tools/vibe-runtime/runtime-list-presentation.mjs +7 -0
  429. package/tools/vibe-runtime/runtime-live-behavior-transcript-model.mjs +164 -0
  430. package/tools/vibe-runtime/runtime-local-behavior-eval-contracts-command.mjs +76 -0
  431. package/tools/vibe-runtime/runtime-local-behavior-eval-contracts.mjs +382 -0
  432. package/tools/vibe-runtime/runtime-local-commit-automation-gate.mjs +254 -0
  433. package/tools/vibe-runtime/runtime-local-json-input.mjs +32 -0
  434. package/tools/vibe-runtime/runtime-methodology-coverage-map.mjs +398 -0
  435. package/tools/vibe-runtime/runtime-methodology-coverage-marker-specs.mjs +61 -0
  436. package/tools/vibe-runtime/runtime-methodology-coverage-presentation.mjs +26 -0
  437. package/tools/vibe-runtime/runtime-methodology-gate-model.mjs +154 -0
  438. package/tools/vibe-runtime/runtime-methodology-gate-output-envelope.mjs +4 -0
  439. package/tools/vibe-runtime/runtime-methodology-interaction-command.mjs +147 -0
  440. package/tools/vibe-runtime/runtime-methodology-presentation.mjs +76 -0
  441. package/tools/vibe-runtime/runtime-methodology-route-model.mjs +93 -0
  442. package/tools/vibe-runtime/runtime-next-action-console.mjs +388 -0
  443. package/tools/vibe-runtime/runtime-next-action-evidence-prompts-command.mjs +84 -0
  444. package/tools/vibe-runtime/runtime-next-action-evidence-prompts.mjs +327 -0
  445. package/tools/vibe-runtime/runtime-observability-command.mjs +96 -0
  446. package/tools/vibe-runtime/runtime-observability-presentation.mjs +30 -0
  447. package/tools/vibe-runtime/runtime-observability-readiness-model.mjs +204 -0
  448. package/tools/vibe-runtime/runtime-patch-queue-contract.mjs +151 -0
  449. package/tools/vibe-runtime/runtime-plan-action-manifest.mjs +334 -0
  450. package/tools/vibe-runtime/runtime-planner-route-model.mjs +75 -0
  451. package/tools/vibe-runtime/runtime-platform-acceptance-command.mjs +216 -0
  452. package/tools/vibe-runtime/runtime-platform-capability-artifacts.mjs +156 -0
  453. package/tools/vibe-runtime/runtime-platform-capability-model.mjs +105 -0
  454. package/tools/vibe-runtime/runtime-platform-command.mjs +329 -0
  455. package/tools/vibe-runtime/runtime-platform-presentation.mjs +78 -0
  456. package/tools/vibe-runtime/runtime-platform-session-artifacts.mjs +857 -0
  457. package/tools/vibe-runtime/runtime-platform-transcript-example-pack.mjs +293 -0
  458. package/tools/vibe-runtime/runtime-platform-transcript-intake-model.mjs +247 -0
  459. package/tools/vibe-runtime/runtime-platform-transcript-replay-model.mjs +371 -0
  460. package/tools/vibe-runtime/runtime-policy-catalog.mjs +54 -0
  461. package/tools/vibe-runtime/runtime-product-methodology-command.mjs +17 -0
  462. package/tools/vibe-runtime/runtime-product-methodology-gates.mjs +316 -0
  463. package/tools/vibe-runtime/runtime-progressive-entry-ux.mjs +237 -0
  464. package/tools/vibe-runtime/runtime-queue-command.mjs +98 -0
  465. package/tools/vibe-runtime/runtime-queue-state-lifecycle-model.mjs +318 -0
  466. package/tools/vibe-runtime/runtime-readiness-gate-split.mjs +196 -0
  467. package/tools/vibe-runtime/runtime-readonly-local-json-output-envelope.mjs +24 -0
  468. package/tools/vibe-runtime/runtime-recovery-classification-models.mjs +412 -0
  469. package/tools/vibe-runtime/runtime-recovery-command.mjs +107 -0
  470. package/tools/vibe-runtime/runtime-recovery-presentation.mjs +65 -0
  471. package/tools/vibe-runtime/runtime-recovery-state-lifecycle-model.mjs +419 -0
  472. package/tools/vibe-runtime/runtime-release-command-deps.mjs +4 -0
  473. package/tools/vibe-runtime/runtime-release-command.mjs +225 -0
  474. package/tools/vibe-runtime/runtime-release-state-lifecycle-model.mjs +48 -0
  475. package/tools/vibe-runtime/runtime-reply-artifact-lifecycle-model.mjs +84 -0
  476. package/tools/vibe-runtime/runtime-reply-command.mjs +488 -0
  477. package/tools/vibe-runtime/runtime-retry-command.mjs +223 -0
  478. package/tools/vibe-runtime/runtime-retry-run-gate-model.mjs +151 -0
  479. package/tools/vibe-runtime/runtime-review-envelope.mjs +449 -0
  480. package/tools/vibe-runtime/runtime-review-feedback-gate.mjs +160 -0
  481. package/tools/vibe-runtime/runtime-runbook-executor-preview-contract.mjs +361 -0
  482. package/tools/vibe-runtime/runtime-scheduler-command.mjs +8 -0
  483. package/tools/vibe-runtime/runtime-scheduler-risk-artifacts.mjs +775 -0
  484. package/tools/vibe-runtime/runtime-scheduler-state-lifecycle-model.mjs +53 -0
  485. package/tools/vibe-runtime/runtime-sdd-consumption-command.mjs +386 -0
  486. package/tools/vibe-runtime/runtime-sdd-evidence-chain-model.mjs +200 -0
  487. package/tools/vibe-runtime/runtime-sdd-handoff-chain-model.mjs +168 -0
  488. package/tools/vibe-runtime/runtime-sdd-implementer-artifact-model.mjs +90 -0
  489. package/tools/vibe-runtime/runtime-sdd-loop-command.mjs +659 -0
  490. package/tools/vibe-runtime/runtime-sdd-plan-preflight-model.mjs +121 -0
  491. package/tools/vibe-runtime/runtime-sdd-review-package-command.mjs +197 -0
  492. package/tools/vibe-runtime/runtime-sdd-review-package-model.mjs +183 -0
  493. package/tools/vibe-runtime/runtime-sdd-task-brief-model.mjs +144 -0
  494. package/tools/vibe-runtime/runtime-self-test-gate-profile.mjs +225 -0
  495. package/tools/vibe-runtime/runtime-sequential-stage-runbook.mjs +406 -0
  496. package/tools/vibe-runtime/runtime-session-checkpoint-model.mjs +217 -0
  497. package/tools/vibe-runtime/runtime-session-skill-command.mjs +241 -0
  498. package/tools/vibe-runtime/runtime-session-start-example-command.mjs +122 -0
  499. package/tools/vibe-runtime/runtime-session-start-example-pack.mjs +290 -0
  500. package/tools/vibe-runtime/runtime-session-start-shape-acceptance.mjs +344 -0
  501. package/tools/vibe-runtime/runtime-skill-contract-schema.mjs +221 -0
  502. package/tools/vibe-runtime/runtime-skill-route-registry.mjs +47 -0
  503. package/tools/vibe-runtime/runtime-skill-runtime-traceability-map.mjs +268 -0
  504. package/tools/vibe-runtime/runtime-source-merge-apply-boundary-model.mjs +130 -0
  505. package/tools/vibe-runtime/runtime-source-merge-artifacts.mjs +920 -0
  506. package/tools/vibe-runtime/runtime-source-merge-command.mjs +160 -0
  507. package/tools/vibe-runtime/runtime-source-merge-entry-command.mjs +153 -0
  508. package/tools/vibe-runtime/runtime-source-patch-plan-model.mjs +119 -0
  509. package/tools/vibe-runtime/runtime-stage-scriptlet.mjs +430 -0
  510. package/tools/vibe-runtime/runtime-staged-commit-readiness.mjs +469 -0
  511. package/tools/vibe-runtime/runtime-state-directory-model.mjs +7 -0
  512. package/tools/vibe-runtime/runtime-state-io.mjs +41 -0
  513. package/tools/vibe-runtime/runtime-state-paths.mjs +231 -0
  514. package/tools/vibe-runtime/runtime-state-presence-model.mjs +6 -0
  515. package/tools/vibe-runtime/runtime-state-risk-paths.mjs +70 -0
  516. package/tools/vibe-runtime/runtime-subagent-adapter-dispatch-command.mjs +266 -0
  517. package/tools/vibe-runtime/runtime-subagent-boundary-contracts.mjs +118 -0
  518. package/tools/vibe-runtime/runtime-subagent-permission-command.mjs +78 -0
  519. package/tools/vibe-runtime/runtime-subagent-permission-gate-model.mjs +131 -0
  520. package/tools/vibe-runtime/runtime-subagent-permission-visibility.mjs +294 -0
  521. package/tools/vibe-runtime/runtime-subagents-artifact-specs.mjs +257 -0
  522. package/tools/vibe-runtime/runtime-subagents-command.mjs +10 -0
  523. package/tools/vibe-runtime/runtime-subagents-eligibility-model.mjs +340 -0
  524. package/tools/vibe-runtime/runtime-subagents-platform-session-proxies.mjs +54 -0
  525. package/tools/vibe-runtime/runtime-subagents-presentation.mjs +91 -0
  526. package/tools/vibe-runtime/runtime-subagents-risk-artifacts.mjs +853 -0
  527. package/tools/vibe-runtime/runtime-subagents-stage-artifact-model.mjs +538 -0
  528. package/tools/vibe-runtime/runtime-subagents-tail-routing-model.mjs +48 -0
  529. package/tools/vibe-runtime/runtime-suite-plan-model.mjs +194 -0
  530. package/tools/vibe-runtime/runtime-superpowers-comparison-matrix.mjs +399 -0
  531. package/tools/vibe-runtime/runtime-superpowers-gap-matrix.mjs +307 -0
  532. package/tools/vibe-runtime/runtime-superpowers-parity-command.mjs +102 -0
  533. package/tools/vibe-runtime/runtime-superpowers-parity-profile-contract.mjs +183 -0
  534. package/tools/vibe-runtime/runtime-superpowers-parity-scorecard.mjs +460 -0
  535. package/tools/vibe-runtime/runtime-superpowers-regression-guard.mjs +270 -0
  536. package/tools/vibe-runtime/runtime-superpowers-style-eval-pack.mjs +367 -0
  537. package/tools/vibe-runtime/runtime-task-commit-gates.mjs +62 -0
  538. package/tools/vibe-runtime/runtime-task-commit-readiness.mjs +66 -0
  539. package/tools/vibe-runtime/runtime-task-commit-sidecar.mjs +65 -0
  540. package/tools/vibe-runtime/runtime-tdd-trace-contract.mjs +277 -0
  541. package/tools/vibe-runtime/runtime-test-evidence-model.mjs +196 -0
  542. package/tools/vibe-runtime/runtime-test-run-command-deps.mjs +7 -0
  543. package/tools/vibe-runtime/runtime-test-run-command.mjs +108 -0
  544. package/tools/vibe-runtime/runtime-token-economy-model.mjs +336 -0
  545. package/tools/vibe-runtime/runtime-token-interaction-command.mjs +381 -0
  546. package/tools/vibe-runtime/runtime-token-savior-budget.mjs +370 -0
  547. package/tools/vibe-runtime/runtime-tokens-command-deps.mjs +17 -0
  548. package/tools/vibe-runtime/runtime-tokens-command.mjs +117 -0
  549. package/tools/vibe-runtime/runtime-tokens-presentation.mjs +45 -0
  550. package/tools/vibe-runtime/runtime-trace-command.mjs +283 -0
  551. package/tools/vibe-runtime/runtime-trace-source-registry.mjs +132 -0
  552. package/tools/vibe-runtime/runtime-verification-gate-chain-model.mjs +131 -0
  553. package/tools/vibe-runtime/runtime-verification-repair-loop-plan.mjs +188 -0
  554. package/tools/vibe-runtime/runtime-workflow-alias-boundary-text.mjs +7 -0
  555. package/tools/vibe-runtime/runtime-workflow-alias-interaction-command.mjs +145 -0
  556. package/tools/vibe-runtime/runtime-workflow-command-deps.mjs +41 -0
  557. package/tools/vibe-runtime/runtime-workflow-command.mjs +191 -0
  558. package/tools/vibe-runtime/runtime-workflow-discipline-summary.mjs +164 -0
  559. package/tools/vibe-runtime/runtime-workflow-entry-envelopes.mjs +156 -0
  560. package/tools/vibe-runtime/runtime-workflow-ledger-command.mjs +239 -0
  561. package/tools/vibe-runtime/runtime-workflow-ledger-state-lifecycle-model.mjs +46 -0
  562. package/tools/vibe-runtime/runtime-workflow-loop-contract.mjs +259 -0
  563. package/tools/vibe-runtime/runtime-workflow-next-step-gate-model.mjs +106 -0
  564. package/tools/vibe-runtime/runtime-workflow-presentation.mjs +355 -0
  565. package/tools/vibe-runtime/runtime-workflow-readiness-model.mjs +176 -0
  566. package/tools/vibe-runtime/runtime-workflow-run-plan-model.mjs +207 -0
  567. package/tools/vibe-runtime/runtime-workflow-start-model.mjs +229 -0
  568. package/tools/vibe-runtime/runtime-workflow-state-artifacts.mjs +381 -0
  569. package/tools/vibe-runtime/runtime-workflow-state-helpers.mjs +456 -0
  570. package/tools/vibe-runtime/runtime-workflow-state-summary.mjs +65 -0
  571. package/tools/vibe-runtime/runtime-workflow-state-validation.mjs +104 -0
  572. package/tools/vibe-runtime/runtime-workflow-ux-model.mjs +205 -0
  573. package/tools/vibe-runtime/runtime-workspace-boundary-text.mjs +7 -0
  574. package/tools/vibe-runtime/runtime-workspace-isolation-command.mjs +295 -0
  575. package/tools/vibe-runtime/state-core-paths.mjs +113 -0
  576. package/tools/vibe-runtime/state-extension-paths.mjs +198 -0
  577. package/tools/vibe-runtime/state-safe-paths.mjs +2 -0
  578. package/tools/vibe-runtime-check/README.md +110 -0
  579. package/tools/vibe-runtime-check/architecture-tool-contracts.mjs +150 -0
  580. package/tools/vibe-runtime-check/index.mjs +186 -0
  581. package/tools/vibe-runtime-check/install-summary-adoption-contracts.mjs +115 -0
  582. package/tools/vibe-runtime-check/marker-contract-core.mjs +20 -0
  583. package/tools/vibe-runtime-check/product-artifact-contracts.mjs +24 -0
  584. package/tools/vibe-runtime-check/release-check-install-placement-contracts.mjs +166 -0
  585. package/tools/vibe-runtime-check/release-runtime-suite-layer-contracts.mjs +137 -0
  586. package/tools/vibe-runtime-check/runtime-architecture-manifest-drift-contracts.mjs +128 -0
  587. package/tools/vibe-runtime-check/runtime-automation-readiness-contracts.mjs +404 -0
  588. package/tools/vibe-runtime-check/runtime-capability-registry-contracts.mjs +299 -0
  589. package/tools/vibe-runtime-check/runtime-check-diagnostics-presentation.mjs +71 -0
  590. package/tools/vibe-runtime-check/runtime-cli-surface-contracts.mjs +156 -0
  591. package/tools/vibe-runtime-check/runtime-close-loop-contracts.mjs +163 -0
  592. package/tools/vibe-runtime-check/runtime-contract-delivery-registry.mjs +19 -0
  593. package/tools/vibe-runtime-check/runtime-contract-implementation-registry.mjs +23 -0
  594. package/tools/vibe-runtime-check/runtime-contract-local-evidence-registry.mjs +43 -0
  595. package/tools/vibe-runtime-check/runtime-contract-product-registry.mjs +83 -0
  596. package/tools/vibe-runtime-check/runtime-contract-registry.mjs +19 -0
  597. package/tools/vibe-runtime-check/runtime-control-plane-contracts.mjs +14 -0
  598. package/tools/vibe-runtime-check/runtime-doc-contract-marker-specs.mjs +349 -0
  599. package/tools/vibe-runtime-check/runtime-doc-contracts.mjs +24 -0
  600. package/tools/vibe-runtime-check/runtime-doc-marker-contracts.mjs +25 -0
  601. package/tools/vibe-runtime-check/runtime-entry-size-contracts.mjs +477 -0
  602. package/tools/vibe-runtime-check/runtime-experience-cli-contract-specs.mjs +98 -0
  603. package/tools/vibe-runtime-check/runtime-experience-cli-contracts.mjs +12 -0
  604. package/tools/vibe-runtime-check/runtime-experience-contracts.mjs +187 -0
  605. package/tools/vibe-runtime-check/runtime-governance-learning-token-contract-specs.mjs +92 -0
  606. package/tools/vibe-runtime-check/runtime-governance-learning-token-contracts.mjs +12 -0
  607. package/tools/vibe-runtime-check/runtime-high-risk-boundary-contracts.mjs +35 -0
  608. package/tools/vibe-runtime-check/runtime-high-risk-boundary-matrix.mjs +75 -0
  609. package/tools/vibe-runtime-check/runtime-index-import-boundary-contracts.mjs +192 -0
  610. package/tools/vibe-runtime-check/runtime-optimization-boundary-contracts.mjs +49 -0
  611. package/tools/vibe-runtime-check/runtime-pure-model-boundary-contracts.mjs +176 -0
  612. package/tools/vibe-runtime-check/runtime-release-closeout-contracts.mjs +25 -0
  613. package/tools/vibe-runtime-check/runtime-roadmap-marker-specs.mjs +559 -0
  614. package/tools/vibe-runtime-check/runtime-source-bundle.mjs +119 -0
  615. package/tools/vibe-runtime-check/runtime-tool-readme-contracts.mjs +93 -0
  616. package/tools/vibe-runtime-check/runtime-tool-readme-marker-specs.mjs +952 -0
  617. package/tools/vibe-runtime-check/workflow-skill-contracts.mjs +129 -0
  618. package/tools/vibe-runtime-check/workflow-skill-route-registry-contracts.mjs +106 -0
  619. package/tools/vibe-runtime-check/workflow-ux-contracts.mjs +46 -0
@@ -0,0 +1,775 @@
1
+ import { createRuntimeSchedulerStateLifecycleModel } from './runtime-scheduler-state-lifecycle-model.mjs';
2
+ import { buildControlledLongRunningAutomationContract } from './runtime-controlled-long-running-automation-contract.mjs';
3
+
4
+ export function createRuntimeSchedulerRiskArtifacts(deps) {
5
+ const {
6
+ fs, path, process, jsonSchemaVersion, stateDirectoryName, schedulerPlansDirectoryName, schedulerHookPlansDirectoryName,
7
+ schedulerRunsDirectoryName, schedulerLeasesDirectoryName, stage11RuntimeActionName, stage11AllowedExecutionSkills,
8
+ schedulerPolicyProfiles, schedulerRuntimeBudget,
9
+ } = deps;
10
+ const {
11
+ ensureRoot, workflowPath, writeJsonEnvelope, printList,
12
+ readJsonArtifact, writeStateArtifact, fileDigest, digestObject, validateCommonArtifactSafety, schedulerPlansDirectory,
13
+ schedulerHookPlansDirectory, schedulerPlanFilePath, schedulerHookPlanFilePath, hookIntentFilePath,
14
+ validateHookIntentArtifact, listSchedulerPlanFiles, listSchedulerHookPlanFiles, queueScanEnvelope, recoveryClassificationEnvelope,
15
+ executionPolicySnapshot, runtimeActionCatalogDigest, listDispatchEvents, listDispatchClaims, claimSummary, listExecutionFiles,
16
+ readExecutionFile, executionsDirectory, executionSummary, validateExecutionEnvelope, dispatchesDirectory, readDispatchEventFile,
17
+ verifyDispatchEvent, daemonSafety, activeSchedulerLease, writeSchedulerLease, completeSchedulerLease, controlledAutoRunEnvelope,
18
+ writeRunningThenCompleteExecution, recoveryPolicySnapshot, recoveryActionCatalogSnapshot, validateRecoveryClassificationArtifact,
19
+ writeRecoveryClassification, selectRecoveryFinding, recoveryApplyEnvelopeFromClassification, writeRecoveryApply,
20
+ } = deps;
21
+
22
+ function schedulerPolicySnapshot(profileName = 'single-local-auto-run') {
23
+ const profile = schedulerPolicyProfiles[profileName];
24
+ if (!profile) throw new Error(`Unknown scheduler policy profile: ${profileName}`);
25
+ const snapshot = {
26
+ name: 'stage-22-scheduler-policy',
27
+ version: 1,
28
+ stage: 'Stage 22',
29
+ profile: profile.profile,
30
+ mode: profile.mode,
31
+ default_enabled: profile.default_enabled,
32
+ allowed_scheduler_actions: [...profile.allowed_scheduler_actions].sort(),
33
+ allowed_runtime_actions: [...profile.allowed_runtime_actions].sort(),
34
+ auto_run_allowed: profile.auto_run_allowed,
35
+ recovery_apply_allowed: profile.recovery_apply_allowed,
36
+ retry_allowed: profile.retry_allowed,
37
+ source: 'builtin-data-only',
38
+ dynamic_code: false,
39
+ remote_config: false,
40
+ };
41
+ return { ...snapshot, scheduler_policy_digest: digestObject(snapshot) };
42
+ }
43
+
44
+ function runtimeBudgetSnapshot() {
45
+ const snapshot = { ...schedulerRuntimeBudget, source: 'builtin-data-only', dynamic_code: false, remote_config: false };
46
+ return { ...snapshot, runtime_budget_digest: digestObject(snapshot) };
47
+ }
48
+
49
+ function validateSchedulerPolicySnapshot(policy) {
50
+ const failures = [];
51
+ if (!policy || typeof policy !== 'object') return ['scheduler policy snapshot is required'];
52
+ if (policy.name !== 'stage-22-scheduler-policy') failures.push('scheduler policy.name must be stage-22-scheduler-policy');
53
+ if (policy.version !== 1) failures.push('scheduler policy.version must be 1');
54
+ if (policy.stage !== 'Stage 22') failures.push('scheduler policy.stage must be Stage 22');
55
+ if (!Object.hasOwn(schedulerPolicyProfiles, policy.profile || '')) failures.push('scheduler policy.profile must be known');
56
+ if (policy.default_enabled !== false) failures.push('scheduler policy.default_enabled must be false');
57
+ if (policy.dynamic_code !== false) failures.push('scheduler policy.dynamic_code must be false');
58
+ if (policy.remote_config !== false) failures.push('scheduler policy.remote_config must be false');
59
+ for (const key of ['allowed_scheduler_actions', 'allowed_runtime_actions']) {
60
+ if (!Array.isArray(policy[key])) failures.push(`scheduler policy.${key} must be an array`);
61
+ }
62
+ const { scheduler_policy_digest: _digest, ...unsigned } = policy;
63
+ if (!policy.scheduler_policy_digest) failures.push('scheduler policy digest is required');
64
+ else if (digestObject(unsigned) !== policy.scheduler_policy_digest) failures.push('scheduler policy digest mismatch');
65
+ const current = Object.hasOwn(schedulerPolicyProfiles, policy.profile || '') ? schedulerPolicySnapshot(policy.profile) : null;
66
+ if (current && policy.scheduler_policy_digest && policy.scheduler_policy_digest !== current.scheduler_policy_digest) failures.push('scheduler policy digest must match current builtin profile');
67
+ return failures;
68
+ }
69
+
70
+ function validateRuntimeBudgetSnapshot(budget) {
71
+ const failures = [];
72
+ if (!budget || typeof budget !== 'object') return ['runtime budget snapshot is required'];
73
+ if (budget.stage !== 'Stage 22') failures.push('runtime budget.stage must be Stage 22');
74
+ if (budget.kill_switch !== false) failures.push('runtime budget.kill_switch must be false');
75
+ if (budget.retry_allowed !== false) failures.push('runtime budget.retry_allowed must be false');
76
+ if (budget.recovery_apply_allowed !== false) failures.push('runtime budget.recovery_apply_allowed must be false');
77
+ if (budget.max_runs_per_invocation !== 1) failures.push('runtime budget.max_runs_per_invocation must be 1');
78
+ for (const key of ['max_active_scheduler_runs', 'max_retry_attempts', 'max_consecutive_failures', 'max_lock_age_ms']) {
79
+ if (typeof budget[key] !== 'number') failures.push(`runtime budget.${key} must be a number`);
80
+ }
81
+ const { runtime_budget_digest: _digest, ...unsigned } = budget;
82
+ if (!budget.runtime_budget_digest) failures.push('runtime budget digest is required');
83
+ else if (digestObject(unsigned) !== budget.runtime_budget_digest) failures.push('runtime budget digest mismatch');
84
+ const current = runtimeBudgetSnapshot();
85
+ if (budget.runtime_budget_digest && budget.runtime_budget_digest !== current.runtime_budget_digest) failures.push('runtime budget digest must match current builtin budget');
86
+ return failures;
87
+ }
88
+
89
+ function schedulerSafety({ writes = false, once = false } = {}) {
90
+ return {
91
+ stage: once ? 'Stage 23' : 'Stage 21',
92
+ writes: Boolean(writes),
93
+ scheduler_plan_artifact: Boolean(writes && !once),
94
+ scheduler_run_artifact: Boolean(writes && once),
95
+ scheduler_lease_artifact: Boolean(writes && once),
96
+ single_shot: Boolean(once),
97
+ loop: false,
98
+ watcher: false,
99
+ daemon: false,
100
+ auto_recovery: false,
101
+ auto_retry: false,
102
+ auto_reply: false,
103
+ platform_api: false,
104
+ skill_execution: false,
105
+ business_source_write: false,
106
+ subagent: false,
107
+ mcp: false,
108
+ git: false,
109
+ worktree: false,
110
+ dispatch_event_modified: false,
111
+ claim_modified: false,
112
+ };
113
+ }
114
+
115
+ function controlledLongRunningAutomationForEnvelope(envelope, phase) {
116
+ const schedulerDetail = envelope.scheduler || envelope.scheduler_hook_plan || envelope.scheduler_run || {};
117
+ const policy = envelope.policy || envelope.plan?.policy || {};
118
+ const runtimeBudget = envelope.runtime_budget || envelope.plan?.runtime_budget || {};
119
+ const lockEvidence = schedulerDetail.lock || schedulerDetail.lease || schedulerDetail.scheduler_lease_file || '';
120
+ return buildControlledLongRunningAutomationContract({
121
+ phase,
122
+ artifactSummary: envelope.summary || {
123
+ mode: envelope.mode || '',
124
+ state_present: envelope.state_present === true,
125
+ writes: envelope.safety?.writes === true,
126
+ selected: schedulerDetail.selected_candidate || schedulerDetail.selected?.candidate_file || '',
127
+ queue_state: schedulerDetail.queue || schedulerDetail.queue_state || '',
128
+ },
129
+ policyBound: Boolean(policy.scheduler_policy_digest),
130
+ loopPolicyBound: envelope.safety?.loop === false || envelope.safety?.single_shot === true,
131
+ lockAuditBound: Boolean(lockEvidence),
132
+ heartbeatPolicyBound: Boolean(schedulerDetail.lock?.heartbeat_required || schedulerDetail.heartbeat_required),
133
+ stopFilePolicyBound: false,
134
+ iterationBudgetBound: Boolean(runtimeBudget.runtime_budget_digest || runtimeBudget.max_runs_per_invocation),
135
+ killSwitchBound: Object.hasOwn(runtimeBudget, 'kill_switch'),
136
+ blockedReasons: envelope.quality || schedulerDetail.blocked_reasons || [],
137
+ nextManualAction: 'Review scheduler policy, runtime budget, lock, heartbeat, and queue evidence before any separate human-approved foreground action.',
138
+ });
139
+ }
140
+
141
+ function withControlledLongRunningAutomation(envelope, phase) {
142
+ return {
143
+ ...envelope,
144
+ controlled_long_running_automation: controlledLongRunningAutomationForEnvelope(envelope, phase),
145
+ };
146
+ }
147
+
148
+ const schedulerStateLifecycle = createRuntimeSchedulerStateLifecycleModel(deps);
149
+ const schedulerPlanSnapshotPath = schedulerStateLifecycle.schedulerPlanSnapshotPath;
150
+ const schedulerHookPlanSnapshotPath = schedulerStateLifecycle.schedulerHookPlanSnapshotPath;
151
+ const schedulerRunPath = schedulerStateLifecycle.schedulerRunPath;
152
+ const writeSchedulerPlan = schedulerStateLifecycle.writeSchedulerPlan;
153
+ const writeSchedulerRun = schedulerStateLifecycle.writeSchedulerRun;
154
+
155
+ function schedulerPlanEnvelope(root, { persist = false, profile = 'single-local-auto-run' } = {}) {
156
+ const queue = queueScanEnvelope(root, { persist: false });
157
+ const recovery = recoveryClassificationEnvelope(root, { persist: false });
158
+ const schedulerPolicy = schedulerPolicySnapshot(profile);
159
+ const runtimeBudget = runtimeBudgetSnapshot();
160
+ const executionPolicy = executionPolicySnapshot();
161
+ const selected = queue.queue.promotion_preview[0] || null;
162
+ const blocked = queue.queue.blocked.map((item) => ({ ...item, scheduler_blocked_reasons: item.blocked_reasons }));
163
+ const planCore = {
164
+ created_at: new Date().toISOString(),
165
+ queue_digest: digestObject({ items: queue.queue.items, ready: queue.queue.ready, blocked: queue.queue.blocked }),
166
+ execution_policy_digest: executionPolicy.policy_digest,
167
+ scheduler_policy_digest: schedulerPolicy.scheduler_policy_digest,
168
+ runtime_budget_digest: runtimeBudget.runtime_budget_digest,
169
+ action_catalog_digest: runtimeActionCatalogDigest(),
170
+ recovery_classification_digest: recovery.recovery_classification.classification_digest,
171
+ recovery_hints: {
172
+ classification_digest: recovery.recovery_classification.classification_digest,
173
+ eligible_count: recovery.recovery_classification.eligible_count,
174
+ blocked_count: recovery.recovery_classification.blocked_count,
175
+ top_finding: recovery.recovery_classification.findings.find((finding) => finding.eligible) || recovery.recovery_classification.findings[0] || null,
176
+ },
177
+ eligible: queue.queue.ready.slice(0, runtimeBudget.max_runs_per_invocation),
178
+ blocked,
179
+ selected,
180
+ planned_writes: selected ? [path.join(stateDirectoryName, schedulerRunsDirectoryName, '<timestamp>.scheduler-run.json').replace(/\\/g, '/'), path.join(stateDirectoryName, schedulerLeasesDirectoryName, '<plan-hash>.scheduler-lease.json').replace(/\\/g, '/')] : [],
181
+ next_scan_after_ms: 60 * 1000,
182
+ };
183
+ const planId = digestObject(planCore).slice(0, 16);
184
+ const envelope = {
185
+ mode: 'scheduler-plan',
186
+ ok: true,
187
+ state_present: fs.existsSync(workflowPath(root)),
188
+ scheduler: {
189
+ default_enabled: false,
190
+ worker: false,
191
+ watcher: false,
192
+ loop: false,
193
+ writes: Boolean(persist),
194
+ plan_id: planId,
195
+ ...planCore,
196
+ },
197
+ policy: schedulerPolicy,
198
+ runtime_budget: runtimeBudget,
199
+ execution_policy: executionPolicy,
200
+ queue: {
201
+ items: queue.queue.items.length,
202
+ ready: queue.queue.ready.length,
203
+ blocked: queue.queue.blocked.length,
204
+ },
205
+ safety: schedulerSafety({ writes: persist, once: false }),
206
+ quality: [...queue.quality, ...recovery.quality],
207
+ action: persist
208
+ ? 'scheduler plan artifact was written. No auto-run, loop, daemon, recovery, retry, platform API, subagent, MCP, git, worktree, or business source write occurred.'
209
+ : 'scheduler plan was previewed read-only. No files were written and no runtime action occurred.',
210
+ };
211
+ return withControlledLongRunningAutomation(envelope, 'scheduler-plan');
212
+ }
213
+
214
+ function validateSchedulerPlanArtifact(plan) {
215
+ const failures = [];
216
+ if (plan.schema_version !== jsonSchemaVersion) failures.push('schema_version must be 1');
217
+ if (plan.command !== 'scheduler') failures.push('command must be scheduler');
218
+ if (plan.mode !== 'scheduler-plan') failures.push('mode must be scheduler-plan');
219
+ if (!plan.scheduler?.plan_id) failures.push('scheduler.plan_id is required');
220
+ if (!Array.isArray(plan.scheduler?.eligible)) failures.push('scheduler.eligible must be an array');
221
+ if (!Array.isArray(plan.scheduler?.blocked)) failures.push('scheduler.blocked must be an array');
222
+ if (typeof plan.scheduler?.queue_digest !== 'string' || !plan.scheduler.queue_digest) failures.push('scheduler.queue_digest is required');
223
+ if (typeof plan.scheduler?.recovery_classification_digest !== 'string' || !plan.scheduler.recovery_classification_digest) failures.push('scheduler.recovery_classification_digest is required');
224
+ if (!plan.scheduler?.recovery_hints || typeof plan.scheduler.recovery_hints !== 'object') failures.push('scheduler.recovery_hints is required');
225
+ if (plan.scheduler?.action_catalog_digest !== runtimeActionCatalogDigest()) failures.push('scheduler action catalog digest mismatch');
226
+ if (plan.scheduler?.execution_policy_digest !== executionPolicySnapshot().policy_digest) failures.push('scheduler execution policy digest mismatch');
227
+ if (plan.scheduler?.scheduler_policy_digest !== schedulerPolicySnapshot(plan.policy?.profile || 'single-local-auto-run').scheduler_policy_digest) failures.push('scheduler policy digest mismatch');
228
+ if (plan.scheduler?.runtime_budget_digest !== runtimeBudgetSnapshot().runtime_budget_digest) failures.push('runtime budget digest mismatch');
229
+ failures.push(...validateSchedulerPolicySnapshot(plan.policy));
230
+ failures.push(...validateRuntimeBudgetSnapshot(plan.runtime_budget));
231
+ if (plan.safety?.stage !== 'Stage 21') failures.push('safety.stage must be Stage 21');
232
+ if (plan.safety?.scheduler_plan_artifact !== true) failures.push('safety.scheduler_plan_artifact must be true');
233
+ for (const key of ['loop', 'watcher', 'daemon', 'auto_recovery', 'auto_retry', 'auto_reply', 'platform_api', 'skill_execution', 'business_source_write', 'subagent', 'mcp', 'git', 'worktree']) {
234
+ if (plan.safety?.[key] !== false) failures.push(`safety.${key} must be false`);
235
+ }
236
+ return { ok: failures.length === 0, failures };
237
+ }
238
+
239
+ function schedulerHookPlanEnvelope(root, hookIntentFile, { persist = false } = {}) {
240
+ const hookIntentPath = hookIntentFilePath(root, hookIntentFile);
241
+ const hookIntent = readJsonArtifact(hookIntentPath, 'Hook intent');
242
+ const hookVerification = validateHookIntentArtifact(root, hookIntent);
243
+ if (!hookVerification.ok) throw new Error(`hook intent verification failed: ${hookVerification.failures.join('; ')}`);
244
+ const schedulerPreview = schedulerPlanEnvelope(root, { persist: false, profile: 'scheduler-dry-run' });
245
+ const hookIntentDigest = fileDigest(hookIntentPath);
246
+ const queueState = schedulerPreview.queue.ready > 0 ? 'ready' : schedulerPreview.queue.items > 0 ? 'blocked' : 'deferred';
247
+ const blockedReasons = [...schedulerPreview.quality];
248
+ if (schedulerPreview.queue.items === 0) blockedReasons.push('queue is empty');
249
+ if (schedulerPreview.queue.ready === 0 && schedulerPreview.queue.items > 0) blockedReasons.push('no ready queue item');
250
+ const planCore = {
251
+ version: 1,
252
+ stage: 'Stage 34',
253
+ created_at: new Date().toISOString(),
254
+ writes: Boolean(persist),
255
+ hook_intent_file: path.basename(hookIntentPath),
256
+ hook_intent_digest: hookIntentDigest,
257
+ hook_source: hookIntent.hook_intent?.hook_source || '',
258
+ allowed_followup: hookIntent.hook_intent?.allowed_followup || [],
259
+ scheduler_profile: 'scheduler-dry-run',
260
+ scheduler_plan_id: schedulerPreview.scheduler.plan_id,
261
+ scheduler_plan_digest: digestObject(schedulerPreview.scheduler),
262
+ queue_state: queueState,
263
+ queue_summary: schedulerPreview.queue,
264
+ selected: schedulerPreview.scheduler.selected,
265
+ eligible: schedulerPreview.scheduler.eligible,
266
+ blocked: schedulerPreview.scheduler.blocked,
267
+ blocked_reasons: blockedReasons,
268
+ budget: {
269
+ lease_required: true,
270
+ approval_required: true,
271
+ max_runs_per_invocation: 0,
272
+ runtime_action_allowed: false,
273
+ subagent_dispatch_allowed: false,
274
+ },
275
+ required_approvals: ['scheduler-hook-plan-review'],
276
+ planned_writes: persist ? [path.join(stateDirectoryName, schedulerHookPlansDirectoryName, '<timestamp>.scheduler-hook-plan.json').replace(/\\/g, '/')] : [],
277
+ no_execution: true,
278
+ no_scheduler_run: true,
279
+ no_subagent_dispatch: true,
280
+ no_session_create: true,
281
+ no_platform_api: true,
282
+ };
283
+ const envelope = {
284
+ mode: 'scheduler-hook-plan',
285
+ ok: hookVerification.ok,
286
+ state_present: fs.existsSync(workflowPath(root)),
287
+ scheduler_hook_plan: { ...planCore, plan_digest: digestObject(planCore) },
288
+ hook_intent: {
289
+ file: path.basename(hookIntentPath),
290
+ digest: hookIntentDigest,
291
+ verification: hookVerification,
292
+ },
293
+ scheduler_plan: schedulerPreview,
294
+ safety: {
295
+ stage: 'Stage 34',
296
+ writes: Boolean(persist),
297
+ scheduler_hook_plan_artifact: Boolean(persist),
298
+ hook_triggered: false,
299
+ scheduler_selected: false,
300
+ scheduler_plan: true,
301
+ scheduler_run: false,
302
+ session_create: false,
303
+ subagent_dispatch: false,
304
+ external_api: false,
305
+ external_delivery: false,
306
+ model_invocation: false,
307
+ runtime_action: false,
308
+ auto_execution: false,
309
+ controlled_auto_execution: false,
310
+ platform_api: false,
311
+ skill_execution: false,
312
+ business_source_write: false,
313
+ subagent: false,
314
+ mcp: false,
315
+ daemon: false,
316
+ git: false,
317
+ worktree: false,
318
+ dispatch_event_modified: false,
319
+ claim_modified: false,
320
+ },
321
+ quality: blockedReasons,
322
+ action: persist
323
+ ? 'scheduler hook plan artifact was written. No scheduler run, subagent dispatch, session creation, platform API, git, worktree, or business source write occurred.'
324
+ : 'scheduler hook plan was previewed read-only. No files were written and no scheduler run or subagent dispatch occurred.',
325
+ };
326
+ return withControlledLongRunningAutomation(envelope, 'scheduler-hook-plan');
327
+ }
328
+
329
+ function validateSchedulerHookPlanArtifact(root, artifact) {
330
+ const failures = [];
331
+ if (artifact.schema_version !== jsonSchemaVersion) failures.push('schema_version must be 1');
332
+ if (artifact.command !== 'scheduler') failures.push('command must be scheduler');
333
+ if (artifact.mode !== 'scheduler-hook-plan') failures.push('mode must be scheduler-hook-plan');
334
+ const plan = artifact.scheduler_hook_plan || {};
335
+ if (plan.stage !== 'Stage 34') failures.push('scheduler_hook_plan.stage must be Stage 34');
336
+ if (!plan.hook_intent_file || !String(plan.hook_intent_file).endsWith('.hook-intent.json')) failures.push('scheduler_hook_plan.hook_intent_file must be a hook intent artifact');
337
+ if (plan.hook_source !== 'session_start') failures.push('scheduler_hook_plan.hook_source must be session_start');
338
+ if (!Array.isArray(plan.allowed_followup) || digestObject(plan.allowed_followup) !== digestObject(['scheduler-plan-only'])) failures.push('scheduler_hook_plan.allowed_followup must equal scheduler-plan-only');
339
+ if (plan.scheduler_profile !== 'scheduler-dry-run') failures.push('scheduler_hook_plan.scheduler_profile must be scheduler-dry-run');
340
+ const embeddedPolicy = artifact.scheduler_plan?.policy || null;
341
+ const embeddedBudget = artifact.scheduler_plan?.runtime_budget || null;
342
+ const embeddedSchedulerPlan = artifact.scheduler_plan?.scheduler || null;
343
+ if (!embeddedPolicy) failures.push('scheduler_hook_plan embedded scheduler policy is required');
344
+ else {
345
+ failures.push(...validateSchedulerPolicySnapshot(embeddedPolicy));
346
+ if (embeddedPolicy.profile !== 'scheduler-dry-run') failures.push('scheduler_hook_plan policy.profile must be scheduler-dry-run');
347
+ if (embeddedPolicy.mode !== 'plan-only') failures.push('scheduler_hook_plan policy.mode must be plan-only');
348
+ if (digestObject(embeddedPolicy.allowed_scheduler_actions || []) !== digestObject(['plan'])) failures.push('scheduler_hook_plan policy.allowed_scheduler_actions must equal plan');
349
+ if (digestObject(embeddedPolicy.allowed_runtime_actions || []) !== digestObject([])) failures.push('scheduler_hook_plan policy.allowed_runtime_actions must be empty');
350
+ for (const key of ['default_enabled', 'auto_run_allowed', 'recovery_apply_allowed', 'retry_allowed', 'dynamic_code', 'remote_config']) {
351
+ if (embeddedPolicy[key] !== false) failures.push(`scheduler_hook_plan policy.${key} must be false`);
352
+ }
353
+ }
354
+ if (!embeddedBudget) failures.push('scheduler_hook_plan embedded runtime budget is required');
355
+ else {
356
+ failures.push(...validateRuntimeBudgetSnapshot(embeddedBudget));
357
+ if (embeddedBudget.max_runs_per_invocation !== 1) failures.push('scheduler_hook_plan embedded runtime budget max_runs_per_invocation must be 1');
358
+ for (const key of ['kill_switch', 'retry_allowed', 'recovery_apply_allowed', 'dynamic_code', 'remote_config']) {
359
+ if (embeddedBudget[key] !== false) failures.push(`scheduler_hook_plan embedded runtime budget.${key} must be false`);
360
+ }
361
+ }
362
+ const embeddedSafety = artifact.scheduler_plan?.safety || null;
363
+ if (!embeddedSafety) failures.push('scheduler_hook_plan embedded scheduler safety is required');
364
+ else {
365
+ if (embeddedSafety.stage !== 'Stage 21') failures.push('scheduler_hook_plan embedded scheduler safety.stage must be Stage 21');
366
+ if (embeddedSafety.scheduler_plan_artifact !== false) failures.push('scheduler_hook_plan embedded scheduler safety.scheduler_plan_artifact must be false');
367
+ for (const key of ['writes', 'scheduler_run_artifact', 'scheduler_lease_artifact', 'single_shot', 'loop', 'watcher', 'daemon', 'auto_recovery', 'auto_retry', 'auto_reply', 'platform_api', 'skill_execution', 'business_source_write', 'subagent', 'mcp', 'git', 'worktree', 'dispatch_event_modified', 'claim_modified']) {
368
+ if (embeddedSafety[key] !== false) failures.push(`scheduler_hook_plan embedded scheduler safety.${key} must be false`);
369
+ }
370
+ }
371
+ if (!embeddedSchedulerPlan) failures.push('scheduler_hook_plan embedded scheduler plan is required');
372
+ else {
373
+ if (plan.scheduler_plan_id !== embeddedSchedulerPlan.plan_id) failures.push('scheduler_hook_plan scheduler_plan_id mismatch');
374
+ if (plan.scheduler_plan_digest !== digestObject(embeddedSchedulerPlan)) failures.push('scheduler_hook_plan scheduler_plan_digest mismatch');
375
+ if (digestObject(plan.queue_summary || {}) !== digestObject(artifact.scheduler_plan?.queue || {})) failures.push('scheduler_hook_plan queue_summary mismatch');
376
+ if (digestObject(plan.selected || null) !== digestObject(embeddedSchedulerPlan.selected || null)) failures.push('scheduler_hook_plan selected mismatch');
377
+ if (digestObject(plan.eligible || []) !== digestObject(embeddedSchedulerPlan.eligible || [])) failures.push('scheduler_hook_plan eligible mismatch');
378
+ if (digestObject(plan.blocked || []) !== digestObject(embeddedSchedulerPlan.blocked || [])) failures.push('scheduler_hook_plan blocked mismatch');
379
+ }
380
+ if (plan.no_execution !== true) failures.push('scheduler_hook_plan.no_execution must be true');
381
+ if (plan.no_scheduler_run !== true) failures.push('scheduler_hook_plan.no_scheduler_run must be true');
382
+ if (plan.no_subagent_dispatch !== true) failures.push('scheduler_hook_plan.no_subagent_dispatch must be true');
383
+ if (plan.no_session_create !== true) failures.push('scheduler_hook_plan.no_session_create must be true');
384
+ if (plan.no_platform_api !== true) failures.push('scheduler_hook_plan.no_platform_api must be true');
385
+ if (!Array.isArray(plan.required_approvals) || digestObject(plan.required_approvals) !== digestObject(['scheduler-hook-plan-review'])) failures.push('scheduler_hook_plan.required_approvals must equal scheduler-hook-plan-review');
386
+ if (!Array.isArray(plan.planned_writes)) failures.push('scheduler_hook_plan.planned_writes must be an array');
387
+ else if (plan.writes === false && plan.planned_writes.length !== 0) failures.push('scheduler_hook_plan.planned_writes must be empty for preview');
388
+ else if (plan.writes === true && digestObject(plan.planned_writes) !== digestObject([path.join(stateDirectoryName, schedulerHookPlansDirectoryName, '<timestamp>.scheduler-hook-plan.json').replace(/\\/g, '/')])) failures.push('scheduler_hook_plan.planned_writes must only contain scheduler hook plan artifact');
389
+ if (plan.writes !== false && plan.writes !== true) failures.push('scheduler_hook_plan.writes must be boolean');
390
+ if (!['ready', 'blocked', 'deferred'].includes(plan.queue_state || '')) failures.push('scheduler_hook_plan.queue_state must be ready, blocked, or deferred');
391
+ if (!plan.budget || plan.budget.runtime_action_allowed !== false || plan.budget.subagent_dispatch_allowed !== false) failures.push('scheduler_hook_plan budget must disable runtime action and subagent dispatch');
392
+ if (plan.budget?.lease_required !== true) failures.push('scheduler_hook_plan budget.lease_required must be true');
393
+ if (plan.budget?.approval_required !== true) failures.push('scheduler_hook_plan budget.approval_required must be true');
394
+ if (plan.budget?.max_runs_per_invocation !== 0) failures.push('scheduler_hook_plan budget.max_runs_per_invocation must be 0');
395
+ const digestPayload = { ...plan };
396
+ delete digestPayload.plan_digest;
397
+ if (plan.plan_digest !== digestObject(digestPayload)) failures.push('scheduler_hook_plan digest mismatch');
398
+ if (root && plan.hook_intent_file && plan.hook_intent_digest) {
399
+ try {
400
+ const hookPath = hookIntentFilePath(root, plan.hook_intent_file);
401
+ if (fileDigest(hookPath) !== plan.hook_intent_digest) failures.push('scheduler_hook_plan hook intent digest mismatch');
402
+ const hookIntent = readJsonArtifact(hookPath, 'Hook intent');
403
+ const hookVerification = validateHookIntentArtifact(root, hookIntent);
404
+ failures.push(...hookVerification.failures.map((failure) => `hook intent: ${failure}`));
405
+ } catch (error) {
406
+ failures.push(error.message);
407
+ }
408
+ }
409
+ failures.push(...validateCommonArtifactSafety(artifact.safety, 'Stage 34'));
410
+ for (const key of ['hook_triggered', 'scheduler_selected', 'scheduler_run', 'session_create', 'subagent_dispatch', 'external_api', 'external_delivery', 'model_invocation', 'runtime_action', 'auto_execution', 'platform_api', 'skill_execution', 'business_source_write', 'subagent', 'mcp', 'daemon', 'git', 'worktree']) {
411
+ if (artifact.safety?.[key] !== false) failures.push(`safety.${key} must be false`);
412
+ }
413
+ if (artifact.safety?.scheduler_plan !== true) failures.push('safety.scheduler_plan must be true');
414
+ return { ok: failures.length === 0, failures };
415
+ }
416
+
417
+ function writeSchedulerHookPlan(root, envelope) {
418
+ const file = schedulerHookPlanSnapshotPath(root);
419
+ const payload = { schema_version: jsonSchemaVersion, command: 'scheduler', ...envelope, safety: { ...envelope.safety, scheduler_hook_plan_artifact: true } };
420
+ const verification = validateSchedulerHookPlanArtifact(root, payload);
421
+ if (!verification.ok) throw new Error(`scheduler hook plan verification failed: ${verification.failures.join('; ')}`);
422
+ return writeStateArtifact(path.dirname(file), path.basename(file), payload);
423
+ }
424
+
425
+ function schedulerHookPlanAuditEnvelope(root, mode, planFile = '') {
426
+ if (mode === 'list') {
427
+ const plans = listSchedulerHookPlanFiles(root).map((fileName) => {
428
+ try {
429
+ const plan = readJsonArtifact(path.join(schedulerHookPlansDirectory(root), fileName), 'Scheduler hook plan');
430
+ const verification = validateSchedulerHookPlanArtifact(root, plan);
431
+ return { file: fileName, hook_intent_file: plan.scheduler_hook_plan?.hook_intent_file || '', queue_state: plan.scheduler_hook_plan?.queue_state || '', verification_ok: verification.ok, verification_failures: verification.failures };
432
+ } catch (error) {
433
+ return { file: fileName, hook_intent_file: '', queue_state: '', verification_ok: false, verification_failures: [error.message] };
434
+ }
435
+ });
436
+ return { mode: 'scheduler-hook-plan-list', ok: true, plans, summary: { count: plans.length, failed_count: plans.filter((plan) => !plan.verification_ok).length }, quality: [], action: 'read-only scheduler hook plan audit listed hook-derived plans. No scheduler execution occurred.' };
437
+ }
438
+ const file = schedulerHookPlanFilePath(root, planFile);
439
+ const plan = readJsonArtifact(file, 'Scheduler hook plan');
440
+ const verification = validateSchedulerHookPlanArtifact(root, plan);
441
+ if (mode === 'verify' && !verification.ok) throw new Error(`scheduler hook plan verification failed: ${verification.failures.join('; ')}`);
442
+ return { mode: mode === 'verify' ? 'scheduler-hook-plan-verify' : 'scheduler-hook-plan-show', ok: verification.ok, summary: { file: path.basename(file), hook_intent_file: plan.scheduler_hook_plan?.hook_intent_file || '', queue_state: plan.scheduler_hook_plan?.queue_state || '' }, verification, plan, quality: verification.failures, action: 'read-only scheduler hook plan audit inspected one hook-derived plan. No scheduler execution occurred.' };
443
+ }
444
+
445
+ function printSchedulerHookPlan(envelope, file = '') {
446
+ console.log('Vibecoding Runtime Scheduler Hook Plan');
447
+ console.log(`Mode: ${envelope.mode === 'scheduler-hook-plan' ? 'from-hook-plan' : envelope.mode}`);
448
+ console.log(`Hook intent: ${envelope.scheduler_hook_plan.hook_intent_file}`);
449
+ console.log(`Queue state: ${envelope.scheduler_hook_plan.queue_state}`);
450
+ console.log(`Scheduler plan id: ${envelope.scheduler_hook_plan.scheduler_plan_id}`);
451
+ if (file) console.log(`Scheduler hook plan: ${path.relative(process.cwd(), file)}`);
452
+ if (envelope.quality.length > 0) printList('Blocked reasons', envelope.quality);
453
+ console.log(`Action: ${envelope.action}`);
454
+ }
455
+
456
+ function printSchedulerHookPlanAudit(envelope) {
457
+ console.log('Vibecoding Runtime Scheduler Hook Plan Audit');
458
+ console.log(`Mode: ${envelope.mode.replace('scheduler-hook-plan-', '')}`);
459
+ if (envelope.mode === 'scheduler-hook-plan-list') {
460
+ console.log(`Hook plans: ${envelope.summary.count}; Failed: ${envelope.summary.failed_count}`);
461
+ for (const plan of envelope.plans) console.log(`- ${plan.file}: hook=${plan.hook_intent_file || 'none'}; queue=${plan.queue_state || 'unknown'}; verification=${plan.verification_ok ? 'passed' : 'failed'}`);
462
+ } else {
463
+ console.log(`File: ${envelope.summary.file}`);
464
+ console.log(`Hook intent: ${envelope.summary.hook_intent_file}`);
465
+ console.log(`Queue state: ${envelope.summary.queue_state}`);
466
+ console.log(`Verification: ${envelope.verification.ok ? 'passed' : 'failed'}`);
467
+ if (envelope.verification.failures.length > 0) printList('Verification failures', envelope.verification.failures);
468
+ }
469
+ console.log(`Action: ${envelope.action}`);
470
+ }
471
+
472
+ function schedulerPlanAuditEnvelope(root, mode, planFile = '') {
473
+ if (mode === 'list') {
474
+ const plans = [
475
+ ...listSchedulerPlanFiles(root).map((fileName) => {
476
+ try {
477
+ const plan = readJsonArtifact(path.join(schedulerPlansDirectory(root), fileName), 'Scheduler plan');
478
+ const verification = validateSchedulerPlanArtifact(plan);
479
+ return { file: fileName, kind: 'scheduler-plan', plan_id: plan.scheduler?.plan_id || '', selected_candidate: plan.scheduler?.selected?.candidate_file || '', verification_ok: verification.ok, verification_failures: verification.failures };
480
+ } catch (error) {
481
+ return { file: fileName, kind: 'scheduler-plan', plan_id: '', selected_candidate: '', verification_ok: false, verification_failures: [error.message] };
482
+ }
483
+ }),
484
+ ...listSchedulerHookPlanFiles(root).map((fileName) => {
485
+ try {
486
+ const plan = readJsonArtifact(path.join(schedulerHookPlansDirectory(root), fileName), 'Scheduler hook plan');
487
+ const verification = validateSchedulerHookPlanArtifact(root, plan);
488
+ return { file: fileName, kind: 'scheduler-hook-plan', plan_id: plan.scheduler_hook_plan?.scheduler_plan_id || '', selected_candidate: plan.scheduler_hook_plan?.selected?.candidate_file || '', verification_ok: verification.ok, verification_failures: verification.failures };
489
+ } catch (error) {
490
+ return { file: fileName, kind: 'scheduler-hook-plan', plan_id: '', selected_candidate: '', verification_ok: false, verification_failures: [error.message] };
491
+ }
492
+ }),
493
+ ].sort((left, right) => left.file.localeCompare(right.file));
494
+ return { mode: 'scheduler-plan-list', ok: true, plans, summary: { count: plans.length, failed_count: plans.filter((plan) => !plan.verification_ok).length }, quality: [], action: 'read-only scheduler plan audit listed plan artifacts. No scheduler execution occurred.' };
495
+ }
496
+ const file = schedulerPlanFilePath(root, planFile);
497
+ const plan = readJsonArtifact(file, 'Scheduler plan');
498
+ const verification = validateSchedulerPlanArtifact(plan);
499
+ if (mode === 'verify' && !verification.ok) throw new Error(`scheduler plan verification failed: ${verification.failures.join('; ')}`);
500
+ return { mode: mode === 'verify' ? 'scheduler-plan-verify' : 'scheduler-plan-show', ok: verification.ok, summary: { file: path.basename(file), plan_id: plan.scheduler?.plan_id || '', selected_candidate: plan.scheduler?.selected?.candidate_file || '', eligible_count: plan.scheduler?.eligible?.length || 0, blocked_count: plan.scheduler?.blocked?.length || 0 }, verification, plan, quality: verification.failures, action: 'read-only scheduler plan audit inspected a plan artifact. No scheduler execution occurred.' };
501
+ }
502
+
503
+ function printSchedulerPlan(envelope, file = '') {
504
+ console.log('Vibecoding Runtime Scheduler Plan');
505
+ console.log('Mode: plan');
506
+ console.log(`Plan id: ${envelope.scheduler.plan_id}`);
507
+ console.log(`Ready: ${envelope.queue.ready}; Blocked: ${envelope.queue.blocked}`);
508
+ console.log(`Selected: ${envelope.scheduler.selected?.candidate_file || 'none'}`);
509
+ if (file) console.log(`Scheduler plan: ${path.relative(process.cwd(), file)}`);
510
+ if (envelope.quality.length > 0) printList('Blocked reasons', envelope.quality);
511
+ console.log(`Action: ${envelope.action}`);
512
+ }
513
+
514
+ function printSchedulerPlanAudit(envelope) {
515
+ console.log('Vibecoding Runtime Scheduler Plan Audit');
516
+ console.log(`Mode: ${envelope.mode.replace('scheduler-plan-', '')}`);
517
+ if (envelope.mode === 'scheduler-plan-list') {
518
+ console.log(`Plans: ${envelope.summary.count}; Failed: ${envelope.summary.failed_count}`);
519
+ for (const plan of envelope.plans) console.log(`- ${plan.file}: ${plan.plan_id || 'unknown'} [selected=${plan.selected_candidate || 'none'}; verification=${plan.verification_ok ? 'passed' : 'failed'}]`);
520
+ } else {
521
+ console.log(`File: ${envelope.summary.file}`);
522
+ console.log(`Plan id: ${envelope.summary.plan_id}`);
523
+ console.log(`Selected: ${envelope.summary.selected_candidate || 'none'}`);
524
+ console.log(`Verification: ${envelope.verification.ok ? 'passed' : 'failed'}`);
525
+ if (envelope.verification.failures.length > 0) printList('Verification failures', envelope.verification.failures);
526
+ }
527
+ console.log(`Action: ${envelope.action}`);
528
+ }
529
+
530
+ function schedulerPolicyAuditEnvelope(mode, profileName = '') {
531
+ if (mode === 'list') {
532
+ const policies = Object.keys(schedulerPolicyProfiles).sort().map((profile) => schedulerPolicySnapshot(profile));
533
+ const envelope = { mode: 'scheduler-policy-list', ok: true, policies: policies.map((policy) => ({ profile: policy.profile, mode: policy.mode, default_enabled: policy.default_enabled, scheduler_policy_digest: policy.scheduler_policy_digest })), runtime_budget: runtimeBudgetSnapshot(), quality: [], action: 'read-only scheduler policy audit listed builtin scheduler policy profiles. No scheduler execution occurred.' };
534
+ return withControlledLongRunningAutomation(envelope, 'scheduler-policy-list');
535
+ }
536
+ const policy = schedulerPolicySnapshot(profileName);
537
+ const budget = runtimeBudgetSnapshot();
538
+ const failures = [...validateSchedulerPolicySnapshot(policy), ...validateRuntimeBudgetSnapshot(budget)];
539
+ const envelope = { mode: 'scheduler-policy-show', ok: failures.length === 0, policy, runtime_budget: budget, verification: { ok: failures.length === 0, failures }, quality: failures, action: 'read-only scheduler policy audit inspected builtin scheduler policy and runtime budget. No scheduler execution occurred.' };
540
+ return withControlledLongRunningAutomation(envelope, 'scheduler-policy-show');
541
+ }
542
+
543
+ function printSchedulerPolicyAudit(envelope) {
544
+ console.log('Vibecoding Runtime Scheduler Policy Audit');
545
+ console.log(`Mode: ${envelope.mode === 'scheduler-policy-list' ? 'list' : 'show'}`);
546
+ if (envelope.mode === 'scheduler-policy-list') {
547
+ console.log(`Policies: ${envelope.policies.length}`);
548
+ for (const policy of envelope.policies) console.log(`- ${policy.profile}: ${policy.mode} [default_enabled=${policy.default_enabled ? 'true' : 'false'}; digest=${policy.scheduler_policy_digest}]`);
549
+ } else {
550
+ console.log(`Profile: ${envelope.policy.profile}`);
551
+ console.log(`Default enabled: ${envelope.policy.default_enabled ? 'true' : 'false'}`);
552
+ console.log(`Max runs per invocation: ${envelope.runtime_budget.max_runs_per_invocation}`);
553
+ console.log(`Verification: ${envelope.verification.ok ? 'passed' : 'failed'}`);
554
+ }
555
+ console.log(`Action: ${envelope.action}`);
556
+ }
557
+
558
+ function schedulerScanEnvelope(root) {
559
+ const dispatchFiles = listDispatchEvents(root);
560
+ const claims = listDispatchClaims(root).map((claim) => claimSummary(claim, root));
561
+ const executionFiles = listExecutionFiles(root);
562
+ const executions = executionFiles.map((fileName) => {
563
+ try {
564
+ const execution = readExecutionFile(path.join(executionsDirectory(root), fileName));
565
+ return executionSummary(fileName, execution, validateExecutionEnvelope(execution));
566
+ } catch (error) {
567
+ return { file: fileName, status: 'invalid', verification_ok: false, verification_failures: [error.message] };
568
+ }
569
+ });
570
+ const claimByEvent = new Map(claims.map((claim) => [claim.event_file, claim]));
571
+ const candidates = dispatchFiles.map((fileName) => {
572
+ const claim = claimByEvent.get(fileName);
573
+ let event = null;
574
+ let verification = { ok: false, failures: ['dispatch event not readable'] };
575
+ try {
576
+ event = readDispatchEventFile(path.join(dispatchesDirectory(root), fileName));
577
+ verification = verifyDispatchEvent(event);
578
+ } catch (error) {
579
+ verification = { ok: false, failures: [error.message] };
580
+ }
581
+ const targetSkill = event?.dispatch?.target_skill || '';
582
+ const ready = Boolean(verification.ok && claim?.status === 'picked' && stage11AllowedExecutionSkills.has(targetSkill));
583
+ const reasons = [];
584
+ if (!verification.ok) reasons.push('dispatch-invalid');
585
+ if (!claim) reasons.push('claim-missing');
586
+ else if (claim.status !== 'picked') reasons.push(`claim-${claim.status || 'unknown'}`);
587
+ if (!stage11AllowedExecutionSkills.has(targetSkill)) reasons.push('target-not-allowlisted');
588
+ return {
589
+ event_file: fileName,
590
+ target_skill: targetSkill,
591
+ claim_status: claim?.status || 'not_claimed',
592
+ ready_for_execution: ready,
593
+ blocked_reasons: reasons,
594
+ retry: {
595
+ retry_allowed: false,
596
+ reason: 'automatic retry is disabled in this stage',
597
+ },
598
+ };
599
+ });
600
+ const staleClaims = claims.filter((claim) => claim.audit?.stale || (claim.audit && !claim.audit.event_digest_matches));
601
+ const staleRunningExecutions = executions.filter((execution) => execution.status === 'running');
602
+ const retryPreview = executions
603
+ .filter((execution) => ['failed', 'timed_out'].includes(execution.status))
604
+ .map((execution) => ({ file: execution.file, status: execution.status, retry_allowed: false, reason: 'automatic retry is disabled in this stage' }));
605
+ const envelope = {
606
+ mode: 'daemon-scan-dry-run',
607
+ ok: true,
608
+ state_present: fs.existsSync(workflowPath(root)),
609
+ scheduler: {
610
+ queue: 'manual-only',
611
+ scan: true,
612
+ candidates,
613
+ blocked: candidates.filter((candidate) => !candidate.ready_for_execution),
614
+ stale_claims: staleClaims,
615
+ stale_running_executions: staleRunningExecutions,
616
+ retry_preview: retryPreview,
617
+ lock: {
618
+ lock_required: true,
619
+ lock_acquired: false,
620
+ lease_required: true,
621
+ heartbeat_required: true,
622
+ },
623
+ watcher: {
624
+ enabled: false,
625
+ long_running: false,
626
+ },
627
+ worker: false,
628
+ },
629
+ safety: daemonSafety({ dryRun: true, writes: false }),
630
+ quality: [],
631
+ action: 'scheduler scan dry-run audited dispatch, claim, and execution state. No daemon run envelope, background worker, pickup, execute, retry, skill execution, platform API, subagent, MCP, git, worktree, or business source write occurred.',
632
+ };
633
+ return withControlledLongRunningAutomation(envelope, 'daemon-scan-dry-run');
634
+ }
635
+
636
+ function printSchedulerScan(envelope) {
637
+ console.log('Vibecoding Runtime Scheduler Audit');
638
+ console.log('Mode: scan-dry-run');
639
+ console.log(`Queue: ${envelope.scheduler.queue}`);
640
+ console.log(`Candidates: ${envelope.scheduler.candidates.length}`);
641
+ console.log(`Blocked: ${envelope.scheduler.blocked.length}`);
642
+ console.log(`Stale claims: ${envelope.scheduler.stale_claims.length}`);
643
+ console.log(`Stale running executions: ${envelope.scheduler.stale_running_executions.length}`);
644
+ console.log(`Retry preview: ${envelope.scheduler.retry_preview.length}; retry_allowed=false`);
645
+ console.log(`Lock: required=${envelope.scheduler.lock.lock_required ? 'true' : 'false'}; acquired=${envelope.scheduler.lock.lock_acquired ? 'true' : 'false'}; lease_required=${envelope.scheduler.lock.lease_required ? 'true' : 'false'}; heartbeat_required=${envelope.scheduler.lock.heartbeat_required ? 'true' : 'false'}`);
646
+ console.log(`Watcher: enabled=${envelope.scheduler.watcher.enabled ? 'true' : 'false'}; long_running=${envelope.scheduler.watcher.long_running ? 'true' : 'false'}`);
647
+ console.log('Safety: scan=true; dry_run=true; writes=false; auto_execution=false; platform_api=false; skill_execution=false; worker=false; watcher=false; git=false; worktree=false.');
648
+ console.log(`Action: ${envelope.action}`);
649
+ }
650
+
651
+ function schedulerOncePreviewEnvelope(root) {
652
+ const plan = schedulerPlanEnvelope(root, { persist: false, profile: 'single-local-auto-run' });
653
+ const planPayload = { schema_version: jsonSchemaVersion, command: 'scheduler', ...plan, safety: { ...plan.safety, scheduler_plan_artifact: true } };
654
+ const planVerification = validateSchedulerPlanArtifact(planPayload);
655
+ if (!planVerification.ok) throw new Error(`scheduler plan verification failed: ${planVerification.failures.join('; ')}`);
656
+ const selected = plan.scheduler.selected;
657
+ const schedulerRun = { writes: false, plan_id: plan.scheduler.plan_id, selected_candidate: selected?.candidate_file || '', selected_approval: selected?.approval_file || '', selected_event: selected?.event_file || '', idempotency_key: selected?.idempotency_key || '', planned_execution: Boolean(selected), scheduler_policy_digest: plan.policy.scheduler_policy_digest, runtime_budget_digest: plan.runtime_budget.runtime_budget_digest, execution_policy_digest: plan.execution_policy.policy_digest, action_catalog_digest: runtimeActionCatalogDigest(), scheduler_lease_file: '', scheduler_lease_digest: '', execution_file: '', execution_status: '', retry_allowed: false, recovery_apply_allowed: false, loop: false, daemon: false };
658
+ const envelope = { mode: 'scheduler-once-preview', ok: true, state_present: fs.existsSync(workflowPath(root)), scheduler_run: schedulerRun, plan, safety: schedulerSafety({ writes: false, once: true }), quality: selected ? [] : ['scheduler once found no ready queue item'], action: 'scheduler once was previewed read-only. No scheduler run, lease, execution, recovery, retry, platform API, subagent, MCP, git, worktree, or business source write occurred.' };
659
+ return withControlledLongRunningAutomation(envelope, 'scheduler-once-preview');
660
+ }
661
+
662
+ function schedulerOnceEnvelope(root) {
663
+ const plan = schedulerPlanEnvelope(root, { persist: false, profile: 'single-local-auto-run' });
664
+ const planPayload = { schema_version: jsonSchemaVersion, command: 'scheduler', ...plan, safety: { ...plan.safety, scheduler_plan_artifact: true } };
665
+ const planVerification = validateSchedulerPlanArtifact(planPayload);
666
+ if (!planVerification.ok) throw new Error(`scheduler plan verification failed: ${planVerification.failures.join('; ')}`);
667
+ const selected = plan.scheduler.selected;
668
+ if (!selected) throw new Error('scheduler once found no ready queue item');
669
+ if (!plan.policy.allowed_scheduler_actions.includes('once') || !plan.policy.auto_run_allowed) throw new Error('scheduler policy does not allow once auto-run');
670
+ if (plan.runtime_budget.kill_switch) throw new Error('scheduler runtime budget kill switch is enabled');
671
+ if (plan.runtime_budget.max_runs_per_invocation !== 1) throw new Error('scheduler runtime budget must allow exactly one run per invocation');
672
+ if (activeSchedulerLease(root)) throw new Error('active scheduler lease already exists');
673
+ const leaseFile = writeSchedulerLease(root, plan);
674
+ let executionFile = '', executionEnvelopeResult = null;
675
+ try {
676
+ const result = writeRunningThenCompleteExecution(root, selected.event_file, controlledAutoRunEnvelope(root, selected.event_file, selected.actor, selected.approval_file));
677
+ executionFile = result.file; executionEnvelopeResult = result.envelope;
678
+ completeSchedulerLease(leaseFile, executionEnvelopeResult.execution?.status === 'succeeded' ? 'completed' : 'failed');
679
+ } catch (error) { completeSchedulerLease(leaseFile, 'failed'); throw error; }
680
+ const leaseDigest = fileDigest(leaseFile);
681
+ const schedulerRun = { plan_id: plan.scheduler.plan_id, selected_candidate: selected.candidate_file, selected_approval: selected.approval_file, selected_event: selected.event_file, idempotency_key: selected.idempotency_key, execution_file: path.basename(executionFile), execution_status: executionEnvelopeResult.execution?.status || '', scheduler_policy_digest: plan.policy.scheduler_policy_digest, runtime_budget_digest: plan.runtime_budget.runtime_budget_digest, execution_policy_digest: plan.execution_policy.policy_digest, action_catalog_digest: runtimeActionCatalogDigest(), scheduler_lease_file: path.basename(leaseFile), scheduler_lease_digest: leaseDigest, retry_allowed: false, recovery_apply_allowed: false, loop: false, daemon: false };
682
+ return { mode: 'scheduler-once-run', ok: true, state_present: fs.existsSync(workflowPath(root)), scheduler_run: schedulerRun, plan, execution: { file: path.basename(executionFile), digest: fileDigest(executionFile), status: executionEnvelopeResult.execution?.status || '' }, safety: schedulerSafety({ writes: true, once: true }), quality: [], action: 'single-shot scheduler executed one ready item through controlled auto-run. No loop, daemon, recovery, retry, auto reply, platform API, subagent, MCP, git, worktree, or business source write occurred.' };
683
+ }
684
+
685
+ function schedulerOnceRecoveryPreviewEnvelope(root) {
686
+ const plan = schedulerPlanEnvelope(root, { persist: false, profile: 'scheduler-recovery-once' });
687
+ const policy = schedulerPolicySnapshot('scheduler-recovery-once');
688
+ if (!policy.allowed_scheduler_actions.includes('recover-once')) throw new Error('scheduler policy does not allow recover-once');
689
+ if (plan.runtime_budget.kill_switch) throw new Error('scheduler runtime budget kill switch is enabled');
690
+ if (plan.runtime_budget.max_runs_per_invocation !== 1) throw new Error('scheduler runtime budget must allow exactly one run per invocation');
691
+ if (activeSchedulerLease(root)) throw new Error('active scheduler lease already exists');
692
+ const classificationEnvelope = recoveryClassificationEnvelope(root, { persist: false });
693
+ const selected = selectRecoveryFinding({ recovery_classification: classificationEnvelope.recovery_classification });
694
+ const schedulerRun = { writes: false, plan_id: plan.scheduler.plan_id, recovery_mode: true, selected_candidate: '', selected_recovery_finding: selected?.source_file || '', selected_recovery_category: selected?.category || '', recovery_action: selected?.recovery_action || '', idempotency_key: '', scheduler_policy_digest: policy.scheduler_policy_digest, runtime_budget_digest: plan.runtime_budget.runtime_budget_digest, recovery_policy_digest: recoveryPolicySnapshot().recovery_policy_digest, recovery_action_catalog_digest: recoveryActionCatalogSnapshot().recovery_action_catalog_digest, recovery_classification_file: '', recovery_classification_digest: classificationEnvelope.recovery_classification.classification_digest, recovery_run_file: '', retry_package_file: '', scheduler_lease_file: '', scheduler_lease_digest: '', retry_allowed: false, recovery_apply_allowed: Boolean(selected), loop: false, daemon: false };
695
+ const envelope = { mode: 'scheduler-recovery-once-preview', ok: true, state_present: fs.existsSync(workflowPath(root)), scheduler_run: schedulerRun, plan, recovery_classification: classificationEnvelope.recovery_classification, safety: { ...schedulerSafety({ writes: false, once: true }), stage: 'Stage 26', recovery_apply: false, auto_recovery: false, auto_retry: false }, quality: selected ? [] : ['scheduler recovery once found no eligible recovery finding'], action: 'scheduler recovery once was previewed read-only. No scheduler run, lease, classification artifact, recovery run, retry package, normal queue execution, automatic retry, platform API, subagent, MCP, git, worktree, or business source write occurred.' };
696
+ return withControlledLongRunningAutomation(envelope, 'scheduler-recovery-once-preview');
697
+ }
698
+
699
+ function schedulerOnceRecoveryEnvelope(root) {
700
+ const plan = schedulerPlanEnvelope(root, { persist: false, profile: 'scheduler-recovery-once' });
701
+ const policy = schedulerPolicySnapshot('scheduler-recovery-once');
702
+ if (!policy.allowed_scheduler_actions.includes('recover-once')) throw new Error('scheduler policy does not allow recover-once');
703
+ if (plan.runtime_budget.kill_switch) throw new Error('scheduler runtime budget kill switch is enabled');
704
+ if (plan.runtime_budget.max_runs_per_invocation !== 1) throw new Error('scheduler runtime budget must allow exactly one run per invocation');
705
+ if (activeSchedulerLease(root)) throw new Error('active scheduler lease already exists');
706
+ const classificationEnvelope = recoveryClassificationEnvelope(root, { persist: true });
707
+ const classificationPayload = { schema_version: jsonSchemaVersion, command: 'recovery', ...classificationEnvelope, safety: { ...classificationEnvelope.safety, recovery_classification_artifact: true } };
708
+ const classificationVerification = validateRecoveryClassificationArtifact(classificationPayload, root);
709
+ if (!classificationVerification.ok) throw new Error(`recovery classification verification failed: ${classificationVerification.failures.join('; ')}`);
710
+ const recoveryEnvelopeResult = recoveryApplyEnvelopeFromClassification(root, classificationPayload, '', { persist: true, allowActiveSchedulerLease: true });
711
+ const classificationFile = writeRecoveryClassification(root, classificationEnvelope);
712
+ recoveryEnvelopeResult.recovery_run.classification_file = path.basename(classificationFile);
713
+ const leaseFile = writeSchedulerLease(root, plan);
714
+ let recoveryResult = null;
715
+ try { const writeResult = writeRecoveryApply(root, recoveryEnvelopeResult); recoveryResult = { envelope: recoveryEnvelopeResult, ...writeResult }; completeSchedulerLease(leaseFile, 'completed'); }
716
+ catch (error) { completeSchedulerLease(leaseFile, 'failed'); throw error; }
717
+ const leaseDigest = fileDigest(leaseFile), run = recoveryResult.envelope.recovery_run;
718
+ const schedulerRun = { plan_id: plan.scheduler.plan_id, recovery_mode: true, selected_candidate: '', selected_recovery_finding: run.selected_finding.source_file, selected_recovery_category: run.selected_finding.category, recovery_run_file: path.basename(recoveryResult.file), retry_package_file: recoveryResult.retryFile ? path.basename(recoveryResult.retryFile) : '', recovery_action: run.recovery_action, idempotency_key: run.idempotency_key, scheduler_policy_digest: policy.scheduler_policy_digest, runtime_budget_digest: plan.runtime_budget.runtime_budget_digest, recovery_policy_digest: run.recovery_policy_digest, recovery_action_catalog_digest: run.recovery_action_catalog_digest, recovery_classification_file: path.basename(classificationFile), recovery_classification_digest: fileDigest(classificationFile), scheduler_lease_file: path.basename(leaseFile), scheduler_lease_digest: leaseDigest, retry_allowed: false, recovery_apply_allowed: true, loop: false, daemon: false };
719
+ return { mode: 'scheduler-recovery-once-run', ok: true, state_present: fs.existsSync(workflowPath(root)), scheduler_run: schedulerRun, plan, recovery: { file: path.basename(recoveryResult.file), digest: fileDigest(recoveryResult.file), retry_package_file: recoveryResult.retryFile ? path.basename(recoveryResult.retryFile) : '' }, safety: { ...schedulerSafety({ writes: true, once: true }), stage: 'Stage 26', recovery_apply: true, auto_recovery: false, auto_retry: false }, quality: [], action: 'single-shot scheduler applied one recovery finding through confirmed recovery path. No loop, daemon, normal queue execution, automatic retry, auto reply, platform API, subagent, MCP, git, worktree, or business source write occurred.' };
720
+ }
721
+
722
+ function printSchedulerRecoveryOnce(envelope, file = '') {
723
+ for (const line of ['Vibecoding Runtime Scheduler Recovery Once', `Mode: ${envelope.mode === 'scheduler-recovery-once-preview' ? 'recover-once-preview' : 'recover-once-confirm'}`, `Plan id: ${envelope.scheduler_run.plan_id}`, `Selected recovery: ${envelope.scheduler_run.selected_recovery_finding || 'none'} [${envelope.scheduler_run.selected_recovery_category || 'none'}]`, `Recovery run: ${envelope.scheduler_run.recovery_run_file || 'none'}`, ...(file ? [`Scheduler run: ${path.relative(process.cwd(), file)}`] : []), `Action: ${envelope.action}`]) console.log(line);
724
+ }
725
+
726
+ function printSchedulerOnce(envelope, file = '') {
727
+ for (const line of ['Vibecoding Runtime Scheduler Once', `Mode: ${envelope.mode === 'scheduler-once-preview' ? 'once-preview' : 'once-confirm'}`, `Plan id: ${envelope.scheduler_run.plan_id}`, `Selected candidate: ${envelope.scheduler_run.selected_candidate || 'none'}`, `Execution: ${envelope.scheduler_run.execution_file || 'none'} [${envelope.scheduler_run.execution_status || 'not-started'}]`, ...(file ? [`Scheduler run: ${path.relative(process.cwd(), file)}`] : []), `Action: ${envelope.action}`]) console.log(line);
728
+ }
729
+
730
+ function runSchedulerPolicies(options) {
731
+ if (options.write || options.dryRun || options.confirm || options.scan || options.once || options.fromDispatch || options.actor || options.approval || options.run || options.autoRun) throw new Error('scheduler-policies supports read-only audit only');
732
+ const modes = [options.schedulerPolicyList, options.schedulerPolicyShow].filter(Boolean);
733
+ if (modes.length !== 1) throw new Error('scheduler-policies requires exactly one of --list or --show <profile>');
734
+ ensureRoot(options.root);
735
+ const envelope = options.schedulerPolicyList ? schedulerPolicyAuditEnvelope('list') : schedulerPolicyAuditEnvelope('show', options.profile);
736
+ if (options.json) writeJsonEnvelope('scheduler-policies', envelope); else printSchedulerPolicyAudit(envelope);
737
+ }
738
+
739
+ function runScheduler(options) {
740
+ if (options.write || options.dryRun || options.scan || options.fromDispatch || options.actor || options.approval || options.run || options.autoRun) throw new Error('scheduler supports plan, hook-derived plan, plan audit, single-shot once, and confirmed recovery once only');
741
+ const wantsHookPlan = Boolean(options.schedulerFromHook && options.schedulerPlan);
742
+ const modes = [wantsHookPlan, options.schedulerPlan && !options.schedulerFromHook, options.once, options.schedulerListPlans, options.schedulerShowPlan, options.schedulerVerifyPlan].filter(Boolean);
743
+ if (modes.length !== 1) throw new Error('scheduler requires exactly one of --plan, --from-hook <hook-intent> --plan, --once, --list, --show, or --verify');
744
+ ensureRoot(options.root);
745
+ if (options.schedulerRecover && !options.once) throw new Error('scheduler --recover is only supported with --once');
746
+ const emit = (envelope, print, file = '', key = '') => options.json ? writeJsonEnvelope('scheduler', key ? { ...envelope, [key]: path.basename(file) } : envelope) : print(envelope, file);
747
+ if (options.schedulerFromHook) {
748
+ if (!options.schedulerPlan) throw new Error('scheduler --from-hook requires --plan');
749
+ if (options.schedulerRecover || options.once) throw new Error('scheduler --from-hook cannot be combined with --once or --recover');
750
+ const envelope = schedulerHookPlanEnvelope(options.root, options.schedulerHookFile, { persist: options.confirm });
751
+ return emit(envelope, printSchedulerHookPlan, options.confirm ? writeSchedulerHookPlan(options.root, envelope) : '', options.confirm ? 'scheduler_hook_plan_file' : '');
752
+ }
753
+ if (options.schedulerPlan) {
754
+ const envelope = schedulerPlanEnvelope(options.root, { persist: options.confirm });
755
+ return emit(envelope, printSchedulerPlan, options.confirm ? writeSchedulerPlan(options.root, envelope) : '', options.confirm ? 'scheduler_plan_file' : '');
756
+ }
757
+ if (options.once) {
758
+ const envelope = !options.confirm ? (options.schedulerRecover ? schedulerOnceRecoveryPreviewEnvelope(options.root) : schedulerOncePreviewEnvelope(options.root)) : (options.schedulerRecover ? schedulerOnceRecoveryEnvelope(options.root) : schedulerOnceEnvelope(options.root));
759
+ return emit(envelope, options.schedulerRecover ? printSchedulerRecoveryOnce : printSchedulerOnce, options.confirm ? writeSchedulerRun(options.root, envelope) : '', options.confirm ? 'scheduler_run_file' : '');
760
+ }
761
+ if (options.schedulerRecover) throw new Error('scheduler --recover is only supported with --once');
762
+ if (options.confirm) throw new Error('scheduler --confirm is only supported with --plan or --once');
763
+ const mode = options.schedulerListPlans ? 'list' : options.schedulerVerifyPlan ? 'verify' : 'show';
764
+ if (options.schedulerPlanFile && String(options.schedulerPlanFile).endsWith('.scheduler-hook-plan.json')) return emit(schedulerHookPlanAuditEnvelope(options.root, mode, options.schedulerPlanFile), printSchedulerHookPlanAudit);
765
+ return emit(schedulerPlanAuditEnvelope(options.root, mode, options.schedulerPlanFile), printSchedulerPlanAudit);
766
+ }
767
+
768
+ return {
769
+ schedulerPolicySnapshot, runtimeBudgetSnapshot, validateSchedulerPolicySnapshot, validateRuntimeBudgetSnapshot, schedulerSafety,
770
+ schedulerPlanSnapshotPath, schedulerHookPlanSnapshotPath, schedulerRunPath, schedulerPlanEnvelope, validateSchedulerPlanArtifact, writeSchedulerPlan,
771
+ schedulerHookPlanEnvelope, validateSchedulerHookPlanArtifact, writeSchedulerHookPlan, schedulerHookPlanAuditEnvelope, printSchedulerHookPlan, printSchedulerHookPlanAudit,
772
+ schedulerPlanAuditEnvelope, printSchedulerPlan, printSchedulerPlanAudit, schedulerPolicyAuditEnvelope, printSchedulerPolicyAudit, schedulerScanEnvelope, printSchedulerScan,
773
+ writeSchedulerRun, schedulerOncePreviewEnvelope, schedulerOnceEnvelope, schedulerOnceRecoveryPreviewEnvelope, schedulerOnceRecoveryEnvelope, printSchedulerRecoveryOnce, printSchedulerOnce, runSchedulerPolicies, runScheduler,
774
+ };
775
+ }