@joshuafolkken/kit 1.1229.0 → 1.1370.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 (939) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +50 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +24 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +27 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +18 -29
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.github/workflows/publish.yml +2 -0
  42. package/.vscode/tasks.json +14 -0
  43. package/CLAUDE.md +10 -61
  44. package/README.md +38 -57
  45. package/SECURITY.md +1 -1
  46. package/dist/CLAUDE.md +10 -61
  47. package/dist/commands/document-section-cli.js +42 -10
  48. package/dist/config-merge/index.js +11 -2
  49. package/dist/hooks/audit-provision.js +2 -2
  50. package/dist/hooks/batch-guard.js +7 -7
  51. package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
  52. package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
  53. package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
  54. package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
  55. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  56. package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
  57. package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
  58. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  59. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  60. package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
  61. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  62. package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
  63. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  64. package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
  65. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  66. package/dist/hooks/codex-hook-adapter.js +26 -21
  67. package/dist/hooks/duplicate-read-guard.js +8 -8
  68. package/dist/hooks/format-edited.js +4 -4
  69. package/dist/hooks/inputs.json +213 -197
  70. package/dist/hooks/investigation-guard.js +8 -8
  71. package/dist/hooks/pretool-guard.js +15 -15
  72. package/dist/hooks/session-lang.js +406 -8
  73. package/dist/hooks/stop-guard.js +122 -201
  74. package/dist/josh.js +540 -137
  75. package/dist/version/index.js +15 -13
  76. package/eslint/base.js +43 -5
  77. package/eslint/rules/english-only-prose.js +3 -3
  78. package/eslint/rules/import.js +12 -0
  79. package/eslint/rules/namespace-object-export.js +2 -2
  80. package/package.json +16 -10
  81. package/pnpm-workspace.yaml +2 -4
  82. package/prompts/coding-standards.md +14 -48
  83. package/prompts/collaboration-workflow/file-edits.md +1 -1
  84. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  85. package/prompts/collaboration-workflow/issue-template.md +4 -10
  86. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  87. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  88. package/prompts/collaboration-workflow/overview.md +1 -1
  89. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  90. package/prompts/collaboration-workflow/principles.md +21 -3
  91. package/prompts/collaboration-workflow/report-format.md +16 -29
  92. package/prompts/collaboration-workflow/residency.md +1 -1
  93. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  94. package/prompts/collaboration-workflow/shell-body.md +3 -23
  95. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  96. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  97. package/prompts/refactoring.md +1 -1
  98. package/prompts/review-rubric.md +3 -22
  99. package/prompts/review.md +15 -38
  100. package/prompts/testing-guide.md +2 -4
  101. package/scripts/adopt/adopt-logic.ts +5 -5
  102. package/scripts/adopt/adopt-toolkits.ts +4 -5
  103. package/scripts/adopt/adopt.ts +2 -3
  104. package/scripts/agent/agent-argv.ts +7 -7
  105. package/scripts/agent/agent-diagnostics.ts +2 -2
  106. package/scripts/agent/agent-exit-record.ts +1 -1
  107. package/scripts/agent/agent-headless.ts +1 -1
  108. package/scripts/agent/agent-launch-environment.ts +6 -1
  109. package/scripts/agent/agent-role-profile.ts +49 -22
  110. package/scripts/agent/agent-session-role.ts +32 -0
  111. package/scripts/agent/api-outage.ts +1 -1
  112. package/scripts/agent/claude-agent-argv.ts +4 -4
  113. package/scripts/agent/claude-result-event.ts +4 -4
  114. package/scripts/agent/codex-hooks.ts +2 -2
  115. package/scripts/agent/interactive-ask.ts +3 -6
  116. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  117. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  118. package/scripts/backlog/backlog-arrival.ts +54 -17
  119. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  120. package/scripts/backlog/backlog-budget.ts +17 -24
  121. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  122. package/scripts/backlog/backlog-drive-args.ts +5 -4
  123. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  124. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  125. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  126. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  127. package/scripts/backlog/backlog-drive-named.ts +39 -9
  128. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  129. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  130. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  131. package/scripts/backlog/backlog-drive.ts +43 -28
  132. package/scripts/backlog/backlog-idle.ts +88 -0
  133. package/scripts/backlog/backlog-named.ts +11 -15
  134. package/scripts/backlog/backlog-next.ts +26 -30
  135. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  136. package/scripts/backlog/backlog-offer.ts +7 -7
  137. package/scripts/backlog/backlog-overlap.ts +178 -0
  138. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  139. package/scripts/backlog/backlog-plan-read.ts +111 -0
  140. package/scripts/backlog/backlog-plan.ts +11 -10
  141. package/scripts/backlog/backlog-pool.ts +13 -14
  142. package/scripts/backlog/backlog-rank.ts +11 -11
  143. package/scripts/backlog/backlog-ready.ts +15 -10
  144. package/scripts/backlog/backlog-scope.ts +14 -15
  145. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  146. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  147. package/scripts/backlog/backlog-stalled.ts +5 -6
  148. package/scripts/backlog/backlog-waves.ts +4 -4
  149. package/scripts/backlog/backlogrun-args.ts +74 -0
  150. package/scripts/backlog/backlogrun-cli.ts +113 -0
  151. package/scripts/backlog/backlogrun-launch.ts +178 -0
  152. package/scripts/behavior/behavior-assertion.ts +6 -8
  153. package/scripts/behavior/behavior-cli.ts +1 -1
  154. package/scripts/behavior/behavior-rules.ts +3 -3
  155. package/scripts/build/build-claude-md.ts +4 -4
  156. package/scripts/build/build-codex-hooks.ts +2 -2
  157. package/scripts/build/build-commands.ts +1 -1
  158. package/scripts/build/build-hooks.ts +5 -5
  159. package/scripts/build/build.ts +1 -1
  160. package/scripts/build/hook-bundle-stamp.ts +109 -7
  161. package/scripts/build/local-bin.ts +2 -2
  162. package/scripts/cases/cases-cli.ts +1 -1
  163. package/scripts/cases/cases-logic.ts +2 -2
  164. package/scripts/ci/composite-actions.ts +1 -2
  165. package/scripts/ci/pr-classification.ts +2 -2
  166. package/scripts/claude/workflow-destination.ts +1 -1
  167. package/scripts/clone/clone-aggregate.ts +1 -1
  168. package/scripts/clone/clone-fingerprint.ts +1 -1
  169. package/scripts/clone/clone-scan-cli.ts +1 -1
  170. package/scripts/clone/clone-scan.ts +1 -1
  171. package/scripts/config-merge/index.ts +1 -1
  172. package/scripts/config-merge/json-format.ts +1 -3
  173. package/scripts/config-merge/patch-json-array.ts +90 -0
  174. package/scripts/config-merge/patch-json-key.ts +6 -3
  175. package/scripts/config-merge/patch-json-list.ts +1 -1
  176. package/scripts/cost-runtime/codex-usage.ts +1 -1
  177. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  178. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  179. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  180. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  181. package/scripts/cost-runtime/cost-cli.ts +14 -11
  182. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  183. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  184. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  185. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  186. package/scripts/cost-runtime/cost-usage.ts +6 -7
  187. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  188. package/scripts/cost-runtime/own-session.ts +1 -1
  189. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  190. package/scripts/delegation/delegation-cli.ts +4 -4
  191. package/scripts/delegation/delegation-policy.ts +13 -15
  192. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  193. package/scripts/delegation/fanout-cli.ts +1 -1
  194. package/scripts/delegation/fanout.ts +1 -1
  195. package/scripts/delegation/investigation-guard.ts +18 -22
  196. package/scripts/delegation/investigation-reads.ts +48 -238
  197. package/scripts/discovery/repo-discovery.ts +1 -1
  198. package/scripts/discovery/repo-map-logic.ts +1 -2
  199. package/scripts/discovery/repo-origin.ts +3 -3
  200. package/scripts/discovery/repo-party-cli.ts +2 -2
  201. package/scripts/discovery/repo-party.ts +2 -2
  202. package/scripts/doctor/doctor-consumer.ts +1 -1
  203. package/scripts/doctor/doctor-io.ts +6 -7
  204. package/scripts/doctor/doctor-logic.ts +1 -1
  205. package/scripts/doctor/doctor-ports.ts +1 -1
  206. package/scripts/doctor/doctor.ts +8 -9
  207. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  208. package/scripts/document/bash-output-cap.ts +5 -7
  209. package/scripts/document/capped-print-part.ts +1 -1
  210. package/scripts/document/capped-print.ts +1 -1
  211. package/scripts/document/document-byte-budget.ts +33 -64
  212. package/scripts/document/document-byte-check.ts +4 -4
  213. package/scripts/document/document-reachability.ts +7 -8
  214. package/scripts/document/document-read-cli.ts +2 -2
  215. package/scripts/document/document-scan.ts +26 -2
  216. package/scripts/document/document-section-cli.ts +6 -8
  217. package/scripts/document/document-section.ts +8 -12
  218. package/scripts/document/edit-files-cli.ts +3 -4
  219. package/scripts/document/entry-read-budget.ts +8 -70
  220. package/scripts/document/entry-read-set.ts +51 -34
  221. package/scripts/document/lane-child-read-set.ts +9 -9
  222. package/scripts/document/read-files-cli.ts +1 -2
  223. package/scripts/document/read-set-cli.ts +16 -19
  224. package/scripts/document/read-set-cost.ts +4 -4
  225. package/scripts/document/read-set-point-of-use.ts +28 -38
  226. package/scripts/document/read-set-pricing.ts +1 -1
  227. package/scripts/document/read-set-trim.ts +3 -3
  228. package/scripts/document/resident-budget.ts +8 -10
  229. package/scripts/epic/epic-add-body.ts +15 -18
  230. package/scripts/epic/epic-add-plan.ts +26 -28
  231. package/scripts/epic/epic-add.ts +32 -25
  232. package/scripts/epic/epic-audit-checks.ts +27 -37
  233. package/scripts/epic/epic-audit-cli.ts +21 -22
  234. package/scripts/epic/epic-audit-orphans.ts +16 -17
  235. package/scripts/epic/epic-audit-rationale.ts +10 -15
  236. package/scripts/epic/epic-audit-report.ts +2 -5
  237. package/scripts/epic/epic-audit.ts +18 -14
  238. package/scripts/epic/epic-body.ts +10 -10
  239. package/scripts/epic/epic-bundle-cli.ts +36 -34
  240. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  241. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  242. package/scripts/epic/epic-bundle-poll.ts +1 -1
  243. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  244. package/scripts/epic/epic-bundle.ts +19 -20
  245. package/scripts/epic/epic-busy.ts +44 -21
  246. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  247. package/scripts/epic/epic-chains.ts +18 -23
  248. package/scripts/epic/epic-classify.ts +11 -12
  249. package/scripts/epic/epic-cli-argv.ts +5 -6
  250. package/scripts/epic/epic-cli-remove.ts +9 -4
  251. package/scripts/epic/epic-cli.ts +38 -26
  252. package/scripts/epic/epic-close-comment.ts +14 -15
  253. package/scripts/epic/epic-close.ts +25 -29
  254. package/scripts/epic/epic-cross-repo.ts +18 -21
  255. package/scripts/epic/epic-decision.ts +14 -18
  256. package/scripts/epic/epic-fetch.ts +25 -31
  257. package/scripts/epic/epic-graph.ts +15 -17
  258. package/scripts/epic/epic-index.ts +14 -16
  259. package/scripts/epic/epic-issue.ts +9 -11
  260. package/scripts/epic/epic-label-age.ts +74 -0
  261. package/scripts/epic/epic-lane-offer.ts +35 -24
  262. package/scripts/epic/epic-nested.ts +1 -1
  263. package/scripts/epic/epic-next-read.ts +8 -8
  264. package/scripts/epic/epic-next-views.ts +12 -12
  265. package/scripts/epic/epic-next.ts +29 -33
  266. package/scripts/epic/epic-outside-blocker.ts +11 -10
  267. package/scripts/epic/epic-parse.ts +22 -24
  268. package/scripts/epic/epic-promote.ts +3 -2
  269. package/scripts/epic/epic-rank.ts +1 -1
  270. package/scripts/epic/epic-read.ts +10 -8
  271. package/scripts/epic/epic-reconcile.ts +8 -6
  272. package/scripts/epic/epic-reference.ts +5 -4
  273. package/scripts/epic/epic-relation-recheck.ts +10 -11
  274. package/scripts/epic/epic-relations.ts +9 -8
  275. package/scripts/epic/epic-remove-plan.ts +4 -5
  276. package/scripts/epic/epic-remove.ts +7 -5
  277. package/scripts/epic/epic-report.ts +18 -20
  278. package/scripts/epic/epic-run.ts +6 -5
  279. package/scripts/epic/epic-sections.ts +2 -2
  280. package/scripts/epic/epic-shape.ts +3 -3
  281. package/scripts/epic/epic-solo-stale.ts +3 -2
  282. package/scripts/epic/epic-solo.ts +8 -8
  283. package/scripts/epic/epic-triage.ts +5 -4
  284. package/scripts/epic/epic-validate.ts +8 -7
  285. package/scripts/epic/epic.ts +5 -5
  286. package/scripts/exports/unused-members-cli.ts +1 -1
  287. package/scripts/followup/followup-issue-number.ts +1 -2
  288. package/scripts/followup/git-followup-cleanup.ts +6 -7
  289. package/scripts/followup/git-followup-finish.ts +11 -13
  290. package/scripts/followup/git-followup-flush.ts +11 -7
  291. package/scripts/followup/git-followup-issue-close.ts +16 -13
  292. package/scripts/followup/git-followup-label.ts +9 -6
  293. package/scripts/followup/git-followup-merged.ts +1 -1
  294. package/scripts/followup/git-followup-pending.ts +7 -9
  295. package/scripts/followup/git-followup-stages.ts +28 -17
  296. package/scripts/followup/git-followup-workflow.ts +19 -21
  297. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  298. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  299. package/scripts/followup/git-pr-followup.ts +18 -17
  300. package/scripts/gate/core-admission.ts +162 -0
  301. package/scripts/gate/core-budget.ts +134 -91
  302. package/scripts/gate/gate-ledger.ts +114 -0
  303. package/scripts/gate/gate-log.ts +7 -9
  304. package/scripts/gate/gate-plan.ts +103 -35
  305. package/scripts/gate/gate-report.ts +39 -21
  306. package/scripts/gate/gate-skip.ts +11 -13
  307. package/scripts/gate/gate-steps.ts +5 -1
  308. package/scripts/gate/gate-tree.ts +3 -4
  309. package/scripts/gate/hook-gate-reuse.ts +9 -9
  310. package/scripts/gate/machine-capacity.ts +313 -0
  311. package/scripts/gate/pre-commit-type-check.ts +4 -4
  312. package/scripts/gate/project-checks.ts +12 -4
  313. package/scripts/gate/scoped-green.ts +11 -18
  314. package/scripts/gate/type-check-command.ts +2 -2
  315. package/scripts/gate/type-check-step.ts +4 -4
  316. package/scripts/gate/verification-gate.ts +60 -53
  317. package/scripts/gh/gh-spawn.ts +2 -2
  318. package/scripts/gh/git-ai-review-scan.ts +3 -2
  319. package/scripts/gh/git-gh-api-path.ts +10 -11
  320. package/scripts/gh/git-gh-exec.ts +43 -48
  321. package/scripts/gh/git-gh-failure.ts +6 -9
  322. package/scripts/gh/git-gh-helpers.ts +1 -1
  323. package/scripts/gh/git-gh-issue-list.ts +15 -19
  324. package/scripts/gh/git-gh-issue-read.ts +43 -60
  325. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  326. package/scripts/gh/git-gh-issue-write.ts +52 -40
  327. package/scripts/gh/git-gh-issue.ts +23 -24
  328. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  329. package/scripts/gh/git-gh-pr-read.ts +46 -50
  330. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  331. package/scripts/gh/git-gh-pr-review.ts +2 -2
  332. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  333. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  334. package/scripts/gh/git-gh-pr.ts +16 -16
  335. package/scripts/gh/git-gh-reachability.ts +11 -12
  336. package/scripts/gh/git-gh-repo.ts +2 -3
  337. package/scripts/gh/git-gh-rest-state.ts +1 -1
  338. package/scripts/gh/git-pr-ai-review.ts +6 -5
  339. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  340. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  341. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  342. package/scripts/gh/git-pr-checks.ts +20 -23
  343. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  344. package/scripts/gh/git-pr-confirmation.ts +5 -5
  345. package/scripts/gh/git-pr-managed-config.ts +7 -9
  346. package/scripts/gh/git-pr-messages.ts +1 -1
  347. package/scripts/gh/git-pr.ts +15 -16
  348. package/scripts/gh/github-issue-url.ts +8 -9
  349. package/scripts/git/base-tree.ts +66 -0
  350. package/scripts/git/change-base.ts +42 -2
  351. package/scripts/git/changed-file-scope.ts +5 -5
  352. package/scripts/git/changed-paths.ts +1 -2
  353. package/scripts/git/constants.ts +2 -2
  354. package/scripts/git/git-branch.ts +1 -1
  355. package/scripts/git/git-closes-keyword.ts +3 -3
  356. package/scripts/git/git-command.ts +53 -41
  357. package/scripts/git/git-common-directory.ts +3 -3
  358. package/scripts/git/git-diff-reads.ts +14 -15
  359. package/scripts/git/git-error.ts +1 -1
  360. package/scripts/git/git-execa-error.ts +1 -2
  361. package/scripts/git/git-issue.ts +10 -8
  362. package/scripts/git/git-location-environment.ts +3 -4
  363. package/scripts/git/git-ls-remote.ts +6 -8
  364. package/scripts/git/git-pre-push-hook.ts +11 -10
  365. package/scripts/git/git-preflight.ts +5 -5
  366. package/scripts/git/git-push-transport.ts +2 -2
  367. package/scripts/git/git-remote-branch.ts +1 -2
  368. package/scripts/git/git-schemas.ts +16 -23
  369. package/scripts/git/git-spawn-sync.ts +1 -1
  370. package/scripts/git/git-spawn.ts +37 -14
  371. package/scripts/git/git-ssh-keepalive.ts +12 -5
  372. package/scripts/git/git-staging.ts +7 -8
  373. package/scripts/git/git-workflow.ts +1 -1
  374. package/scripts/git/git-worktree.ts +35 -27
  375. package/scripts/git/gone-branch.ts +2 -2
  376. package/scripts/git/listing-cutoff.ts +1 -2
  377. package/scripts/git/lockfile-sync.ts +65 -0
  378. package/scripts/git/main-merge-guard.ts +1 -2
  379. package/scripts/git/main-merge.ts +7 -7
  380. package/scripts/git/main-sync.ts +23 -8
  381. package/scripts/git/parse-json-array.ts +18 -23
  382. package/scripts/git/repository-lock.ts +34 -2
  383. package/scripts/git/stash/git-stash.ts +4 -5
  384. package/scripts/git/stash/stash-orphans.ts +5 -3
  385. package/scripts/git/stash/stash-pop-args.ts +1 -1
  386. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  387. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  388. package/scripts/hooks/batch-guard.ts +11 -13
  389. package/scripts/hooks/check-commit-message.ts +12 -9
  390. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  391. package/scripts/hooks/edited-cspell.ts +3 -4
  392. package/scripts/hooks/format-edited-cli.ts +1 -1
  393. package/scripts/hooks/format-edited-file.ts +11 -17
  394. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  395. package/scripts/hooks/pre-push-unit.ts +10 -14
  396. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  397. package/scripts/hooks/pretool-guard.ts +93 -18
  398. package/scripts/hooks/reserved-run.ts +2 -2
  399. package/scripts/hooks/step-zero-notice.ts +1 -1
  400. package/scripts/hooks/stop-guard.ts +21 -10
  401. package/scripts/init/basic-path-migration.ts +2 -2
  402. package/scripts/init/claude-kit-only-settings.ts +2 -2
  403. package/scripts/init/claude-plugin-config.ts +2 -2
  404. package/scripts/init/distributed-paths.ts +4 -4
  405. package/scripts/init/hook-command-rewrite.ts +3 -3
  406. package/scripts/init/hook-launch.ts +5 -5
  407. package/scripts/init/init-actions.ts +13 -0
  408. package/scripts/init/init-ai-copy.ts +11 -11
  409. package/scripts/init/init-bootstrap.ts +3 -3
  410. package/scripts/init/init-copy-content.ts +4 -4
  411. package/scripts/init/init-logic-json-merge.ts +7 -9
  412. package/scripts/init/init-logic-migrate.ts +1 -1
  413. package/scripts/init/init-logic-templates.ts +1 -1
  414. package/scripts/init/init-logic-workspace.ts +4 -4
  415. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  416. package/scripts/init/init-logic.ts +19 -22
  417. package/scripts/init/init.ts +12 -8
  418. package/scripts/init/kit-base-preset.ts +1 -1
  419. package/scripts/init/kit-setup-state.ts +1 -1
  420. package/scripts/init/kit-written-paths.ts +1 -2
  421. package/scripts/init/package-manager-pin.ts +35 -0
  422. package/scripts/init/project-profile-cli.ts +1 -1
  423. package/scripts/init/project-profile.ts +3 -3
  424. package/scripts/init/session-language-environment.ts +1 -1
  425. package/scripts/init/start-exec.ts +3 -4
  426. package/scripts/init/start-plan.ts +2 -2
  427. package/scripts/init/start-setup-pr.ts +3 -2
  428. package/scripts/init/start-steps.ts +2 -2
  429. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  430. package/scripts/init/vscode-tasks.ts +62 -0
  431. package/scripts/issue/baseline-measure.ts +2 -2
  432. package/scripts/issue/behavior-change-lint.ts +2 -2
  433. package/scripts/issue/defect-rate-cli.ts +6 -7
  434. package/scripts/issue/defect-rate.ts +37 -27
  435. package/scripts/issue/git-next-issues.ts +9 -8
  436. package/scripts/issue/issue-auto-ok.ts +49 -11
  437. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  438. package/scripts/issue/issue-backlinks.ts +6 -6
  439. package/scripts/issue/issue-cite-cli.ts +20 -18
  440. package/scripts/issue/issue-cite.ts +18 -8
  441. package/scripts/issue/issue-closing-pr.ts +4 -4
  442. package/scripts/issue/issue-comment-cli.ts +6 -4
  443. package/scripts/issue/issue-file-cli.ts +75 -15
  444. package/scripts/issue/issue-file-fold.ts +155 -0
  445. package/scripts/issue/issue-file.ts +14 -6
  446. package/scripts/issue/issue-fold-cli.ts +14 -9
  447. package/scripts/issue/issue-fold.ts +23 -8
  448. package/scripts/issue/issue-labels.ts +46 -37
  449. package/scripts/issue/issue-lint-cli.ts +2 -2
  450. package/scripts/issue/issue-lint.ts +1 -1
  451. package/scripts/issue/issue-merged.ts +10 -4
  452. package/scripts/issue/issue-number-shape.ts +27 -0
  453. package/scripts/issue/issue-rank.ts +1 -1
  454. package/scripts/issue/issue-read-cli.ts +4 -5
  455. package/scripts/issue/issue-read.ts +4 -5
  456. package/scripts/issue/issue-reference.ts +5 -5
  457. package/scripts/issue/issue-release-cli.ts +165 -0
  458. package/scripts/issue/issue-release.ts +58 -0
  459. package/scripts/issue/issue-report-failures.ts +7 -4
  460. package/scripts/issue/issue-scout-cli.ts +11 -11
  461. package/scripts/issue/issue-scout-closed.ts +4 -4
  462. package/scripts/issue/issue-scout.ts +4 -5
  463. package/scripts/issue/issue-state-cli.ts +17 -10
  464. package/scripts/issue/issue-state.ts +12 -13
  465. package/scripts/issue/issue-wip.ts +7 -7
  466. package/scripts/issue/markdown-section.ts +3 -3
  467. package/scripts/issue/measure-rerun-cli.ts +10 -9
  468. package/scripts/issue/reproduction-measure.ts +3 -3
  469. package/scripts/issue/session-cite.ts +56 -0
  470. package/scripts/josh/agent-session-environment.ts +10 -8
  471. package/scripts/josh/cli-body.ts +2 -2
  472. package/scripts/josh/command-suggest.ts +1 -1
  473. package/scripts/josh/file-map-stamp.ts +20 -23
  474. package/scripts/josh/hook-decision.ts +24 -28
  475. package/scripts/josh/josh-command-map.ts +4 -1
  476. package/scripts/josh/josh-command-types.ts +32 -34
  477. package/scripts/josh/josh-commands-ai.ts +6 -6
  478. package/scripts/josh/josh-commands-backlog.ts +15 -3
  479. package/scripts/josh/josh-commands-clone.ts +1 -1
  480. package/scripts/josh/josh-commands-development.ts +33 -4
  481. package/scripts/josh/josh-commands-document.ts +3 -3
  482. package/scripts/josh/josh-commands-guard.ts +3 -3
  483. package/scripts/josh/josh-commands-issue.ts +11 -5
  484. package/scripts/josh/josh-commands-lane.ts +16 -5
  485. package/scripts/josh/josh-commands-lint.ts +1 -1
  486. package/scripts/josh/josh-commands-maintenance.ts +2 -2
  487. package/scripts/josh/josh-commands-run.ts +20 -6
  488. package/scripts/josh/josh-commands-split.ts +1 -2
  489. package/scripts/josh/josh-commands-versioning.ts +5 -5
  490. package/scripts/josh/josh-commands-workflow.ts +30 -22
  491. package/scripts/josh/josh-environment-file.ts +1 -1
  492. package/scripts/josh/josh-in-process.ts +3 -3
  493. package/scripts/josh/josh-logic.ts +10 -10
  494. package/scripts/josh/josh-run.ts +3 -3
  495. package/scripts/josh/josh-verdict.ts +9 -12
  496. package/scripts/josh/josh.ts +3 -3
  497. package/scripts/josh/kit-only.ts +2 -2
  498. package/scripts/josh/path-decision.ts +3 -3
  499. package/scripts/josh/platform-temporary.ts +7 -5
  500. package/scripts/josh/process-identity.ts +24 -6
  501. package/scripts/josh/process-owner.ts +4 -4
  502. package/scripts/josh/session-language-cli.ts +53 -11
  503. package/scripts/josh/session-language.ts +1 -1
  504. package/scripts/josh/stamp-file.ts +48 -29
  505. package/scripts/josh/stamp-record.ts +57 -0
  506. package/scripts/lane/lane-await.ts +35 -11
  507. package/scripts/lane/lane-cache.ts +6 -6
  508. package/scripts/lane/lane-capacity.ts +32 -17
  509. package/scripts/lane/lane-child-invocation.ts +17 -15
  510. package/scripts/lane/lane-child-marker.ts +12 -12
  511. package/scripts/lane/lane-cli.ts +20 -13
  512. package/scripts/lane/lane-close.ts +6 -6
  513. package/scripts/lane/lane-dispatch.ts +61 -72
  514. package/scripts/lane/lane-environment.ts +5 -5
  515. package/scripts/lane/lane-guard-policy.ts +7 -21
  516. package/scripts/lane/lane-handoff.ts +2 -2
  517. package/scripts/lane/lane-install.ts +9 -10
  518. package/scripts/lane/lane-launch-cli.ts +13 -8
  519. package/scripts/lane/lane-ledger.ts +73 -11
  520. package/scripts/lane/lane-leftover.ts +44 -30
  521. package/scripts/lane/lane-limit-cli.ts +160 -0
  522. package/scripts/lane/lane-limit-override.ts +74 -0
  523. package/scripts/lane/lane-load.ts +19 -68
  524. package/scripts/lane/lane-measure-cli.ts +15 -25
  525. package/scripts/lane/lane-occupancy.ts +6 -4
  526. package/scripts/lane/lane-open.ts +25 -24
  527. package/scripts/lane/lane-output.ts +4 -3
  528. package/scripts/lane/lane-paths.ts +22 -8
  529. package/scripts/lane/lane-phase.ts +33 -0
  530. package/scripts/lane/lane-reap.ts +2 -2
  531. package/scripts/lane/lane-registry.ts +27 -15
  532. package/scripts/lane/lane-relaunch.ts +9 -9
  533. package/scripts/lane/lane-report.ts +5 -4
  534. package/scripts/lane/lane-resume.ts +2 -2
  535. package/scripts/lane/lane-sampler.ts +55 -0
  536. package/scripts/lane/lane-seed.ts +7 -7
  537. package/scripts/lane/lane-stage-stats.ts +135 -0
  538. package/scripts/lane/lane-start-point.ts +8 -11
  539. package/scripts/lane/lane-stats.ts +60 -15
  540. package/scripts/lane/lane-stray.ts +140 -0
  541. package/scripts/lane/lane-vacant.ts +1 -1
  542. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  543. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  544. package/scripts/lane/openai-review-broker.ts +2 -4
  545. package/scripts/lib/ancestor-directories.ts +1 -1
  546. package/scripts/lib/bounded-pool.ts +2 -2
  547. package/scripts/lib/buffered-process.ts +4 -6
  548. package/scripts/lib/caddy-logs.sh +0 -0
  549. package/scripts/lib/cli-flags.ts +39 -6
  550. package/scripts/lib/error-message.ts +1 -1
  551. package/scripts/lib/json-value.ts +17 -3
  552. package/scripts/lib/poll.ts +1 -1
  553. package/scripts/lib/status-icons.ts +3 -3
  554. package/scripts/lib/timed-fetch.ts +1 -1
  555. package/scripts/lib/timeouts.ts +1 -1
  556. package/scripts/lines/bytes-command.ts +3 -4
  557. package/scripts/lines/effective-limit.ts +25 -12
  558. package/scripts/lines/line-budget.ts +47 -55
  559. package/scripts/lines/line-targets.ts +6 -2
  560. package/scripts/lines/lines-command.ts +3 -3
  561. package/scripts/lint/cspell-cached.ts +1 -1
  562. package/scripts/lint/cycle-recheck.ts +122 -0
  563. package/scripts/lint/format.ts +1 -2
  564. package/scripts/lint/lint-parallel.ts +34 -19
  565. package/scripts/lint/lint-related-scope.ts +25 -15
  566. package/scripts/lint/lint-related.ts +6 -7
  567. package/scripts/managed-marker/index.ts +1 -1
  568. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  569. package/scripts/notify/git-notify.ts +9 -7
  570. package/scripts/notify/telegram-notify.ts +53 -37
  571. package/scripts/notify/telegram-test-logic.ts +3 -3
  572. package/scripts/notify/telegram-test.ts +45 -30
  573. package/scripts/observations/observation-ledger-home.ts +14 -8
  574. package/scripts/observations/observation-ledger-line.ts +3 -2
  575. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  576. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  577. package/scripts/observations/observation-ledger.ts +14 -15
  578. package/scripts/observations/observation-record-cli.ts +83 -0
  579. package/scripts/observations/observation-record.ts +91 -0
  580. package/scripts/observations/observations-flush-cli.ts +1 -1
  581. package/scripts/observations/observations-flush-landing.ts +7 -6
  582. package/scripts/observations/observations-flush.ts +26 -27
  583. package/scripts/overrides/overrides-check.ts +18 -8
  584. package/scripts/package/package-scout-cli.ts +1 -1
  585. package/scripts/package/package-scout-format.ts +2 -2
  586. package/scripts/package/package-scout.ts +1 -1
  587. package/scripts/propagate/propagate-git-failure.ts +1 -1
  588. package/scripts/propagate/propagate-git.ts +7 -7
  589. package/scripts/propagate/propagate-plan.ts +2 -2
  590. package/scripts/propagate/propagate-publish.ts +2 -3
  591. package/scripts/propagate/propagate-run.ts +5 -7
  592. package/scripts/propagate/propagate-select.ts +1 -1
  593. package/scripts/propagate/propagate-steps.ts +19 -20
  594. package/scripts/propagate/propagate-targets.ts +6 -10
  595. package/scripts/propagate/propagate.ts +5 -5
  596. package/scripts/refactor/import-graph.ts +1 -1
  597. package/scripts/refactor/refactor-lint.ts +4 -10
  598. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  599. package/scripts/refactor/refactor-scan.ts +2 -2
  600. package/scripts/refactor/refactor-targets.ts +1 -1
  601. package/scripts/release/github-release-cli.ts +25 -3
  602. package/scripts/release/github-release-environment.ts +1 -0
  603. package/scripts/release/github-release-runs.ts +115 -0
  604. package/scripts/release/github-release.ts +13 -67
  605. package/scripts/release/release-cli.ts +21 -4
  606. package/scripts/release/release-history.ts +6 -10
  607. package/scripts/release/release-plan.ts +3 -3
  608. package/scripts/release/release-progress.ts +3 -4
  609. package/scripts/release/release-publish.ts +8 -9
  610. package/scripts/release/release-scope-cli.ts +8 -10
  611. package/scripts/release/release-tag.ts +6 -8
  612. package/scripts/release/release-worktree.ts +5 -5
  613. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  614. package/scripts/repo/auto-merge-setting.ts +1 -1
  615. package/scripts/repo/repo-setting.ts +4 -4
  616. package/scripts/repo/repository-labels.ts +1 -1
  617. package/scripts/repo/required-checks-logic.ts +3 -3
  618. package/scripts/repo/required-checks-report.ts +1 -1
  619. package/scripts/repo/ruleset-check-cli.ts +1 -1
  620. package/scripts/repo/ruleset-check.ts +1 -1
  621. package/scripts/report/report-format-reference.ts +26 -0
  622. package/scripts/report/report-lint-cli.ts +2 -2
  623. package/scripts/report/report-lint.ts +16 -2
  624. package/scripts/review/disposition-cli.ts +2 -2
  625. package/scripts/review/disposition-logic.ts +1 -1
  626. package/scripts/review/live-evidence.ts +9 -6
  627. package/scripts/review/review-attest-cli.ts +1 -2
  628. package/scripts/review/review-attest.ts +3 -3
  629. package/scripts/review/review-brief-cli.ts +19 -20
  630. package/scripts/review/review-brief.ts +29 -32
  631. package/scripts/review/review-checkout.ts +2 -2
  632. package/scripts/review/review-diff-parts.ts +3 -5
  633. package/scripts/review/review-diff-write.ts +1 -1
  634. package/scripts/review/review-finding-ledger.ts +7 -4
  635. package/scripts/review/review-findings-cli.ts +2 -2
  636. package/scripts/review/review-level.ts +4 -7
  637. package/scripts/review/review-record-cli.ts +73 -16
  638. package/scripts/review/review-record.ts +5 -4
  639. package/scripts/review/review-round2-cli.ts +2 -3
  640. package/scripts/review/review-round2.ts +13 -21
  641. package/scripts/review/review-stamps.ts +9 -71
  642. package/scripts/review/review-tree.ts +4 -5
  643. package/scripts/rules/bash-triggers.ts +4 -4
  644. package/scripts/rules/decision-oracle-batch.ts +5 -6
  645. package/scripts/rules/decision-oracle-stage.ts +1 -1
  646. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  647. package/scripts/rules/decision-oracle.ts +2 -2
  648. package/scripts/rules/delivered-rules.ts +61 -406
  649. package/scripts/rules/destructive-command.ts +2 -2
  650. package/scripts/rules/direct-filing.ts +4 -4
  651. package/scripts/rules/direct-pr-create.ts +2 -2
  652. package/scripts/rules/early-heartbeat.ts +15 -19
  653. package/scripts/rules/file-body.ts +5 -6
  654. package/scripts/rules/filing-cap.ts +6 -7
  655. package/scripts/rules/filing-offer.ts +1 -1
  656. package/scripts/rules/firing-point.ts +6 -6
  657. package/scripts/rules/gh-api.ts +2 -2
  658. package/scripts/rules/git-argv.ts +3 -3
  659. package/scripts/rules/git-force.ts +2 -2
  660. package/scripts/rules/hook-context-line.ts +31 -0
  661. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  662. package/scripts/rules/implementation-cut.ts +35 -32
  663. package/scripts/rules/index-guard.ts +2 -2
  664. package/scripts/rules/issue-citation.ts +7 -7
  665. package/scripts/rules/issue-comments.ts +21 -13
  666. package/scripts/rules/josh-git-bare.ts +2 -2
  667. package/scripts/rules/lane-background.ts +14 -16
  668. package/scripts/rules/lane-carry-conflict.ts +41 -5
  669. package/scripts/rules/lane-interactive-ask.ts +6 -9
  670. package/scripts/rules/lane-park.ts +12 -16
  671. package/scripts/rules/lane-split-park.ts +1 -2
  672. package/scripts/rules/lane-switch-main.ts +10 -13
  673. package/scripts/rules/last-prompt.ts +1 -1
  674. package/scripts/rules/oracle-consulted.ts +5 -5
  675. package/scripts/rules/oracle-firing.ts +6 -9
  676. package/scripts/rules/oracle-list-cli.ts +2 -2
  677. package/scripts/rules/permission-guards.ts +2 -2
  678. package/scripts/rules/piped-verification.ts +79 -9
  679. package/scripts/rules/poll-loop.ts +9 -11
  680. package/scripts/rules/pre-gate-cut.ts +33 -30
  681. package/scripts/rules/prior-comment-read.ts +3 -3
  682. package/scripts/rules/protected-files.ts +25 -13
  683. package/scripts/rules/raw-field-body.ts +3 -4
  684. package/scripts/rules/reply-language.ts +1 -1
  685. package/scripts/rules/rule-body-guard.ts +10 -12
  686. package/scripts/rules/rule-guard.ts +1 -1
  687. package/scripts/rules/rule-list.ts +51 -0
  688. package/scripts/rules/rule-registry-rows.ts +282 -0
  689. package/scripts/rules/rule-registry.ts +109 -0
  690. package/scripts/rules/rule-value-cache.ts +2 -2
  691. package/scripts/rules/rule-value-cli.ts +6 -4
  692. package/scripts/rules/rule-value.ts +61 -22
  693. package/scripts/rules/run-tail-rule.ts +11 -15
  694. package/scripts/rules/shell-body-trigger.ts +7 -7
  695. package/scripts/rules/shell-segments.ts +2 -4
  696. package/scripts/rules/stop-rules.ts +54 -41
  697. package/scripts/rules/tail-commands.ts +1 -1
  698. package/scripts/rules/test-declared-commit.ts +2 -2
  699. package/scripts/rules/third-party-write.ts +3 -3
  700. package/scripts/rules/worktree-guard.ts +12 -5
  701. package/scripts/run/add/run-add-cli.ts +165 -0
  702. package/scripts/run/add/run-add.ts +124 -0
  703. package/scripts/run/board/run-board-cli.ts +207 -0
  704. package/scripts/run/board/run-board-closed.ts +95 -0
  705. package/scripts/run/board/run-board-every.ts +60 -0
  706. package/scripts/run/board/run-board-fetch.ts +38 -0
  707. package/scripts/run/board/run-board-fit.ts +219 -0
  708. package/scripts/run/board/run-board-github.ts +162 -0
  709. package/scripts/run/board/run-board-header.ts +275 -0
  710. package/scripts/run/board/run-board-kind.ts +35 -0
  711. package/scripts/run/board/run-board-labels.ts +299 -0
  712. package/scripts/run/board/run-board-layout.ts +222 -0
  713. package/scripts/run/board/run-board-link.ts +31 -0
  714. package/scripts/run/board/run-board-machine.ts +198 -0
  715. package/scripts/run/board/run-board-notes.ts +103 -0
  716. package/scripts/run/board/run-board-phase.ts +136 -0
  717. package/scripts/run/board/run-board-plan.ts +129 -0
  718. package/scripts/run/board/run-board-read.ts +62 -0
  719. package/scripts/run/board/run-board-render-legend.ts +82 -0
  720. package/scripts/run/board/run-board-render-notes.ts +77 -0
  721. package/scripts/run/board/run-board-render-slot.ts +50 -0
  722. package/scripts/run/board/run-board-render.ts +407 -0
  723. package/scripts/run/board/run-board-scope.ts +17 -0
  724. package/scripts/run/board/run-board-screen.ts +43 -0
  725. package/scripts/run/board/run-board-span.ts +66 -0
  726. package/scripts/run/board/run-board-spin.ts +115 -0
  727. package/scripts/run/board/run-board-state.ts +113 -0
  728. package/scripts/run/board/run-board-status.ts +279 -0
  729. package/scripts/run/board/run-board-tick.ts +210 -0
  730. package/scripts/run/board/run-board-track.ts +22 -0
  731. package/scripts/run/board/run-board-usage-read.ts +255 -0
  732. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  733. package/scripts/run/board/run-board-usage-text.ts +80 -0
  734. package/scripts/run/board/run-board-usage.ts +165 -0
  735. package/scripts/run/carry/run-carry-added.ts +62 -0
  736. package/scripts/run/carry/run-carry-args.ts +25 -22
  737. package/scripts/run/carry/run-carry-change.ts +1 -1
  738. package/scripts/run/carry/run-carry-cli.ts +71 -48
  739. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  740. package/scripts/run/carry/run-carry-ended.ts +85 -0
  741. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  742. package/scripts/run/carry/run-carry-stash.ts +3 -2
  743. package/scripts/run/carry/run-carry-streak.ts +8 -10
  744. package/scripts/run/carry/run-carry.ts +85 -89
  745. package/scripts/run/cut/run-cut-args.ts +7 -7
  746. package/scripts/run/cut/run-cut-cli.ts +68 -37
  747. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  748. package/scripts/run/cut/run-cut-report.ts +37 -16
  749. package/scripts/run/cut/run-cut.ts +63 -77
  750. package/scripts/run/detached-launch.ts +35 -50
  751. package/scripts/run/entry/run-entry-cli.ts +48 -27
  752. package/scripts/run/entry/run-entry-stop.ts +7 -9
  753. package/scripts/run/entry/run-entry.ts +5 -6
  754. package/scripts/run/event/run-event-cli.ts +5 -6
  755. package/scripts/run/event/run-event-filed.ts +69 -0
  756. package/scripts/run/event/run-event-follow.ts +3 -3
  757. package/scripts/run/event/run-event-plan.ts +38 -0
  758. package/scripts/run/event/run-event-render.ts +10 -4
  759. package/scripts/run/event/run-event-scope.ts +47 -18
  760. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  761. package/scripts/run/event/run-event-stream.ts +172 -43
  762. package/scripts/run/event/run-event-watch.ts +4 -6
  763. package/scripts/run/hold/run-hold-cli.ts +65 -62
  764. package/scripts/run/hold/run-hold.ts +88 -46
  765. package/scripts/run/merge/run-merge-cli.ts +116 -77
  766. package/scripts/run/merge/run-merge-collect.ts +107 -0
  767. package/scripts/run/merge/run-merge-steps.ts +112 -65
  768. package/scripts/run/merge/run-merge-token.ts +30 -0
  769. package/scripts/run/merge/run-merge.ts +31 -22
  770. package/scripts/run/progress/run-progress-args.ts +4 -4
  771. package/scripts/run/progress/run-progress-cli.ts +39 -50
  772. package/scripts/run/progress/run-progress-clock.ts +25 -32
  773. package/scripts/run/progress/run-progress-config.ts +6 -9
  774. package/scripts/run/progress/run-progress-read.ts +9 -10
  775. package/scripts/run/progress/run-progress.ts +48 -53
  776. package/scripts/run/review/run-review-cli.ts +6 -6
  777. package/scripts/run/review/run-review-steps.ts +6 -6
  778. package/scripts/run/review/run-review.ts +9 -11
  779. package/scripts/run/run-cli-fault.ts +29 -0
  780. package/scripts/run/run-ending-cli.ts +3 -3
  781. package/scripts/run/run-ending.ts +10 -14
  782. package/scripts/run/run-halfrun-resume.ts +6 -8
  783. package/scripts/run/run-headless.ts +25 -12
  784. package/scripts/run/run-invocation.ts +17 -22
  785. package/scripts/run/run-label.ts +7 -5
  786. package/scripts/run/run-liveness-cli.ts +19 -6
  787. package/scripts/run/run-liveness.ts +27 -38
  788. package/scripts/run/run-next-cli.ts +5 -9
  789. package/scripts/run/run-next.ts +4 -5
  790. package/scripts/run/run-parent-cut-hook.ts +10 -12
  791. package/scripts/run/run-preflight.ts +25 -29
  792. package/scripts/run/run-prep-cli.ts +17 -13
  793. package/scripts/run/run-prep-locate.ts +4 -5
  794. package/scripts/run/run-prep.ts +7 -10
  795. package/scripts/run/run-prrun-resume.ts +2 -2
  796. package/scripts/run/run-report-cli.ts +4 -4
  797. package/scripts/run/run-report.ts +9 -14
  798. package/scripts/run/run-retrospective.ts +3 -3
  799. package/scripts/run/run-section.ts +42 -0
  800. package/scripts/run/run-stage-read.ts +2 -2
  801. package/scripts/run/run-stage.ts +6 -4
  802. package/scripts/run/run-status-cli.ts +7 -5
  803. package/scripts/run/run-status.ts +6 -7
  804. package/scripts/run/run-step-cli.ts +13 -15
  805. package/scripts/run/run-step.ts +62 -48
  806. package/scripts/run/run-stop-notify.ts +7 -8
  807. package/scripts/run/run-stranded-cli.ts +1 -1
  808. package/scripts/run/run-stranded-detect.ts +4 -4
  809. package/scripts/run/run-stranded.ts +11 -13
  810. package/scripts/run/run-tail-cli.ts +15 -16
  811. package/scripts/run/run-tail.ts +14 -33
  812. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  813. package/scripts/run/run-watcher-guard.ts +11 -12
  814. package/scripts/run/run-watcher-hook.ts +6 -12
  815. package/scripts/run/ship/run-ship-cli.ts +67 -33
  816. package/scripts/run/ship/run-ship-detach.ts +15 -13
  817. package/scripts/run/ship/run-ship-lock.ts +1 -1
  818. package/scripts/run/ship/run-ship-next.ts +7 -8
  819. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  820. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  821. package/scripts/run/ship/run-ship-probe.ts +4 -4
  822. package/scripts/run/ship/run-ship-return.ts +1 -1
  823. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  824. package/scripts/run/ship/run-ship-review.ts +12 -14
  825. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  826. package/scripts/run/ship/run-ship-stage.ts +80 -26
  827. package/scripts/run/ship/run-ship-steps.ts +26 -16
  828. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  829. package/scripts/run/ship/run-ship-sync.ts +9 -8
  830. package/scripts/run/ship/run-ship.ts +17 -32
  831. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  832. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  833. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  834. package/scripts/run/tidy/run-tidy.ts +4 -3
  835. package/scripts/run/wake/run-wake-cli.ts +27 -33
  836. package/scripts/run/wake/run-wake-describe.ts +76 -29
  837. package/scripts/run/wake/run-wake-driver.ts +14 -14
  838. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  839. package/scripts/run/wake/run-wake-loop.ts +13 -21
  840. package/scripts/run/wake/run-wake-restart.ts +4 -5
  841. package/scripts/run/wake/run-wake-session.ts +23 -27
  842. package/scripts/run/wake/run-wake.ts +57 -328
  843. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  844. package/scripts/safe-chain/pack-hook.ts +2 -2
  845. package/scripts/safe-chain/preinstall-command.ts +2 -2
  846. package/scripts/security/security-audit-logic.ts +1 -1
  847. package/scripts/security/security-audit-provision-logic.ts +1 -1
  848. package/scripts/security/security-audit-provision.ts +2 -2
  849. package/scripts/security/security-audit.ts +5 -5
  850. package/scripts/security/security-updates-logic.ts +2 -3
  851. package/scripts/security/security-updates.ts +2 -4
  852. package/scripts/self-sync-guard/index.ts +1 -1
  853. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  854. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  855. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  856. package/scripts/sonar/sonar-hotspots.ts +1 -1
  857. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  858. package/scripts/sonar/sonar-new-code.ts +1 -1
  859. package/scripts/sonar/sonar-project.ts +1 -1
  860. package/scripts/split/split-assess-cli.ts +1 -1
  861. package/scripts/split/split-assess.ts +3 -3
  862. package/scripts/sync/directory-copy-guard.ts +2 -3
  863. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  864. package/scripts/sync/managed-config-scope.ts +4 -4
  865. package/scripts/sync/plugin-skill-directories.ts +2 -2
  866. package/scripts/sync/reconcile-templates.ts +17 -8
  867. package/scripts/sync/removed-skill-manifest.ts +2 -3
  868. package/scripts/sync/sync-ai-files.ts +7 -7
  869. package/scripts/sync/sync-configs.ts +30 -3
  870. package/scripts/sync/sync-hook-safety.ts +2 -2
  871. package/scripts/sync/sync.ts +23 -10
  872. package/scripts/sync/synced-paths.ts +2 -1
  873. package/scripts/sync/workflow-pin-logic.ts +1 -1
  874. package/scripts/test/test-declared-changed.ts +4 -4
  875. package/scripts/test/test-declared-logic.ts +2 -3
  876. package/scripts/test/test-declared-match.ts +25 -4
  877. package/scripts/test/test-declared.ts +26 -9
  878. package/scripts/test/test-red-commit.ts +3 -2
  879. package/scripts/test/test-red-logic.ts +7 -14
  880. package/scripts/test/test-red.ts +12 -47
  881. package/scripts/test/test-related-scope.ts +2 -3
  882. package/scripts/test/test-related.ts +3 -3
  883. package/scripts/test/test-type-logic.ts +1 -2
  884. package/scripts/test/test-unit-guard.ts +13 -17
  885. package/scripts/test/unit-worker-share.ts +7 -8
  886. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  887. package/scripts/time-runtime/time-background.ts +17 -21
  888. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  889. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  890. package/scripts/time-runtime/time-bundles.ts +11 -12
  891. package/scripts/time-runtime/time-call-identity.ts +1 -1
  892. package/scripts/time-runtime/time-command-key.ts +2 -2
  893. package/scripts/time-runtime/time-density-hook.ts +8 -11
  894. package/scripts/time-runtime/time-density.ts +5 -5
  895. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  896. package/scripts/time-runtime/time-format.ts +5 -5
  897. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  898. package/scripts/time-runtime/time-instant.ts +1 -1
  899. package/scripts/time-runtime/time-markers.ts +15 -19
  900. package/scripts/time-runtime/time-phase-names.ts +3 -3
  901. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  902. package/scripts/time-runtime/time-round-trips.ts +20 -23
  903. package/scripts/time-runtime/time-shell.ts +8 -8
  904. package/scripts/time-runtime/time-single-check.ts +1 -2
  905. package/scripts/time-runtime/time-spans.ts +35 -40
  906. package/scripts/time-runtime/time-tool-call.ts +15 -16
  907. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  908. package/scripts/time-runtime/time-writes.ts +5 -5
  909. package/scripts/ui/ui-routes-cli.ts +1 -2
  910. package/scripts/ui/ui-routes.ts +1 -2
  911. package/scripts/version/bump-version.ts +1 -1
  912. package/scripts/version/fresh-metadata-cache.ts +2 -2
  913. package/scripts/version/latest-corepack.ts +129 -98
  914. package/scripts/version/latest-lane-guard.ts +1 -1
  915. package/scripts/version/latest-scope-cli.ts +2 -2
  916. package/scripts/version/latest-stamp.ts +1 -2
  917. package/scripts/version/latest-update.ts +2 -2
  918. package/scripts/version/npm-registry.ts +2 -2
  919. package/scripts/version/package-manager-version.ts +18 -0
  920. package/scripts/version/publishable-range-check.ts +2 -1
  921. package/scripts/version/publishable-range.ts +1 -1
  922. package/scripts/version/release-age.ts +11 -11
  923. package/scripts/version/release-hold.ts +2 -2
  924. package/scripts/version/safe-chain-version-update.ts +3 -3
  925. package/scripts/version/version-check-logic.ts +2 -3
  926. package/scripts/version/version-check.ts +1 -2
  927. package/scripts/version/version-command-config.ts +2 -2
  928. package/scripts/version/version-commands.ts +3 -3
  929. package/scripts/version/version-remote.ts +4 -4
  930. package/scripts/version/version-targets.ts +2 -2
  931. package/templates/gitignore +7 -0
  932. package/templates/workflows/github-release.yml +4 -0
  933. package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
  934. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  935. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  936. package/scripts/backlog/backlog-restructure.ts +0 -152
  937. package/scripts/rules/issue-fold-rule.ts +0 -72
  938. package/scripts/rules/wip-cap.ts +0 -63
  939. package/scripts/run/run-issue-number.ts +0 -19
@@ -3,7 +3,7 @@ import { run_carry } from '#scripts/run/carry/run-carry'
3
3
  import { run_event_scope } from './run-event-scope'
4
4
  import { run_event_stream, type RunEvent } from './run-event-stream'
5
5
 
6
- // The write side of the run's event stream (joshuafolkken/kit#2205). It resolves the run's identity and
6
+ // The write side of the run's event stream. It resolves the run's identity and
7
7
  // appends, and it is where the "reporting must not break the work it reports on" contract is kept: every
8
8
  // failure — a git call that hangs, a temp directory that cannot be written — is swallowed, so a lane
9
9
  // child's own work never fails because an append did.
@@ -29,8 +29,7 @@ async function stream_target(): Promise<string | undefined> {
29
29
 
30
30
  /**
31
31
  * Append one session-facing event, best-effort. A kind outside the enumeration is refused by `append`;
32
- * every error is swallowed, because the reporting path must never fail the work it reports on
33
- * (joshuafolkken/kit#2205).
32
+ * every error is swallowed, because the reporting path must never fail the work it reports on.
34
33
  */
35
34
  async function emit(kind: string, text: string): Promise<void> {
36
35
  try {
@@ -46,13 +45,13 @@ async function emit(kind: string, text: string): Promise<void> {
46
45
 
47
46
  /**
48
47
  * Append one event unless the newest event on the stream already carries this kind — so a marker a loop
49
- * re-checks every poll is written once per episode rather than once per poll (joshuafolkken/kit#2335).
48
+ * re-checks every poll is written once per episode rather than once per poll.
50
49
  * The drain marker is the caller: `backlog:offer` runs every iteration of a watching loop, and one drain
51
50
  * event per drain is what `run:step` reads to fire the retrospective a single time. Best-effort like
52
51
  * `emit`: a failed resolve or read is swallowed rather than raised into the loop's work.
53
52
  *
54
53
  * **Returns whether it appended**, so a caller that pairs the marker with its own once-per-episode side
55
- * effect — the stall detector sends one notification per stall (joshuafolkken/kit#2359) — fires that
54
+ * effect — the stall detector sends one notification per stall — fires that
56
55
  * effect exactly when the marker was fresh. A skipped duplicate and a swallowed failure both read
57
56
  * `false`: neither is a fresh episode.
58
57
  */
@@ -71,6 +70,30 @@ async function emit_once(kind: string, text: string): Promise<boolean> {
71
70
  }
72
71
  }
73
72
 
73
+ /**
74
+ * Append one event unless the newest event of this kind already carries this text — for a marker whose
75
+ * value, not its presence, is the news. The idle window is re-derived on every
76
+ * offer of a watching loop; only a window that moved is worth a line. Returns whether it appended.
77
+ */
78
+ async function emit_changed(kind: string, text: string): Promise<boolean> {
79
+ try {
80
+ const target = await stream_target()
81
+
82
+ if (target === undefined) return false
83
+
84
+ const newest = run_event_stream.read_events(target).findLast((event) => event.kind === kind)
85
+
86
+ if (newest?.text === text) return false
87
+
88
+ return run_event_stream.append(target, kind, text, now_iso()).appended
89
+ } catch (error) {
90
+ // Best-effort: a failed append is dropped rather than raised into the loop's work.
91
+ error_text.trace_swallowed('run_event_stream_emit.emit_changed', error)
92
+
93
+ return false
94
+ }
95
+ }
96
+
74
97
  // The events of the invocation now running: the stream outlives every invocation, so a marker a previous
75
98
  // run left — a stall that ended with no dispatch after it — must not hold back this run's first one. An
76
99
  // undetermined scope (no carry record) keeps the whole stream, the side that under-notifies rather than
@@ -84,9 +107,9 @@ function invocation_events(repository: string, target: string): ReadonlyArray<Ru
84
107
 
85
108
  /**
86
109
  * Append one event unless this kind is already on the stream since the newest `reset_kind` — the
87
- * episode marker for a condition that holds across other events (joshuafolkken/kit#2464). `emit_once`'s
88
- * newest-event test re-fired the stall notification each time a parallel lane appended a merge or a
89
- * park; this ends the episode only at `reset_kind`. Returns whether it appended, as `emit_once` does.
110
+ * episode marker for a condition that holds across other events. `emit_once`'s newest-event test would
111
+ * re-fire each time a parallel lane appended a merge or a park; this ends the episode only at
112
+ * `reset_kind`. Returns whether it appended, as `emit_once` does.
90
113
  */
91
114
  async function emit_once_since(kind: string, text: string, reset_kind: string): Promise<boolean> {
92
115
  try {
@@ -109,14 +132,14 @@ async function emit_once_since(kind: string, text: string, reset_kind: string):
109
132
  }
110
133
  }
111
134
 
112
- // One progress heartbeat line onto the stream, so a relay reaches it across a cut (joshuafolkken/kit#2437).
135
+ // One progress heartbeat line onto the stream, so a relay reaches it across a cut.
113
136
  async function emit_heartbeat(line: string): Promise<void> {
114
137
  await emit(run_event_stream.EVENT_KIND.HEARTBEAT, line)
115
138
  }
116
139
 
117
140
  // The events of the invocation now running, for a reader restoring the run from its stream
118
- // (`backlog:drive`, joshuafolkken/kit#2508). Fail-quiet like the writers: no repository or an unreadable
119
- // stream is an empty invocation.
141
+ // (`backlog:drive`). Fail-quiet like the writers: no repository or an unreadable stream is an empty
142
+ // invocation.
120
143
  async function current_events(): Promise<ReadonlyArray<RunEvent>> {
121
144
  try {
122
145
  const repository = await run_carry.repository_directory()
@@ -133,12 +156,42 @@ async function current_events(): Promise<ReadonlyArray<RunEvent>> {
133
156
  }
134
157
  }
135
158
 
159
+ // The invocation's events for a writer deciding whether a marker is already there: unlike
160
+ // `current_events`, an undetermined scope keeps the whole stream, so a run with no carry record skips a
161
+ // marker it already wrote rather than writing it twice.
162
+ async function invocation_or_all_events(): Promise<ReadonlyArray<RunEvent>> {
163
+ try {
164
+ const repository = await run_carry.repository_directory()
165
+
166
+ return repository === undefined
167
+ ? []
168
+ : invocation_events(repository, run_event_stream.target_of(repository))
169
+ } catch {
170
+ return []
171
+ }
172
+ }
173
+
174
+ // Every event on the stream, across invocations, for a reader that scopes by the event's own text
175
+ // rather than by the carry record (`issue:file`'s fold). Fail-quiet like `current_events`.
176
+ async function all_events(): Promise<ReadonlyArray<RunEvent>> {
177
+ try {
178
+ const target = await stream_target()
179
+
180
+ return target === undefined ? [] : run_event_stream.read_events(target)
181
+ } catch {
182
+ return []
183
+ }
184
+ }
185
+
136
186
  const run_event_stream_emit = {
187
+ all_events,
137
188
  current_events,
138
189
  emit,
190
+ emit_changed,
139
191
  emit_heartbeat,
140
192
  emit_once,
141
193
  emit_once_since,
194
+ invocation_or_all_events,
142
195
  stream_target,
143
196
  }
144
197
 
@@ -1,9 +1,11 @@
1
+ import { repository_lock } from '#scripts/git/repository-lock'
1
2
  import { stamp_file } from '#scripts/josh/stamp-file'
2
3
  import { json_value } from '#scripts/lib/json-value'
4
+ import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
3
5
  import { z } from 'zod'
4
6
 
5
7
  // The run's append-only, ordered event stream — the surface a reader who was away rebuilds the run's
6
- // recent shape from (joshuafolkken/kit#2205). The report clock (`run-progress-clock.ts`) keeps only the
8
+ // recent shape from. The report clock (`run-progress-clock.ts`) keeps only the
7
9
  // *last* heartbeat, and its `.log` sibling keeps only heartbeat *lines* with no position; neither lets
8
10
  // a woken reader ask "everything since the position I last read". This does.
9
11
  //
@@ -19,7 +21,7 @@ import { z } from 'zod'
19
21
  // dropped older events. Renumbering on compaction would silently shift a reader past unseen events.
20
22
  //
21
23
  // **The write is best-effort by contract, and the safety lives on the emit side.** The reporting path
22
- // must never fail the work it reports on (joshuafolkken/kit#2205), so `run-event-stream-emit.ts` wraps
24
+ // must never fail the work it reports on, so `run-event-stream-emit.ts` wraps
23
25
  // every append in a swallow; this module is free to throw on a genuinely broken write.
24
26
 
25
27
  const EVENT_PREFIX = 'josh-run-events-'
@@ -29,14 +31,20 @@ const EVENT_PREFIX = 'josh-run-events-'
29
31
  const EVENT_SUFFIX = '.jsonl'
30
32
  // A run's session-facing events over the 8-hour whole-run bound: a plan, a launch/PR/review-round/merge
31
33
  // per child across a few dozen children, plus parks, cuts and stops. Five hundred keeps the whole of a
32
- // large `backlogrun` and still bounds an unattended run — past it the oldest events roll off, which is
33
- // what the acceptance criteria pin.
34
+ // large `backlogrun` and still bounds an unattended run — past it the oldest events roll off.
34
35
  const EVENT_CAP = 500
35
36
  const FIRST_POSITION = 0
36
37
  const POSITION_INCREMENT = 1
37
38
  const LINE_SEPARATOR = '\n'
38
-
39
- // **The one enumeration of what a session-facing event is** (joshuafolkken/kit#2205). Every writer names
39
+ const WORD_SEPARATOR = ' '
40
+ // `#<N> <stage> <phase>` carries the phase third.
41
+ const STAGE_PHASE_INDEX = 2
42
+ // The lock sits beside the stream it guards, so every writer of one stream contends for one record.
43
+ const LOCK_SUFFIX = '.lock'
44
+ // An append holds the lock for one read and one rename; a wait this long means a holder is stuck.
45
+ const LOCK_WAIT_MS = 5000
46
+
47
+ // **The one enumeration of what a session-facing event is.** Every writer names
40
48
  // its event by one of these members rather than passing a free string, so the set of things the stream
41
49
  // carries is defined here and nowhere else; `append` refuses a kind outside it, which is what keeps a
42
50
  // caller from quietly widening the stream.
@@ -48,53 +56,79 @@ const EVENT_KIND = {
48
56
  SPLIT: 'split',
49
57
  OUTAGE: 'outage',
50
58
  CUT: 'cut',
51
- // The backlog emptied while nothing of the run's own was in flight — the drain
52
- // (joshuafolkken/kit#2335). It marks the position at which the end-of-run retrospective is owed,
53
- // *before* the idle watch opens, so `run:step` fires the retrospective at the drain rather than after
54
- // the watch runs its course. It is not itself a stop: the run watches on once the retrospective has
55
- // run, and the real `STOP` follows when the watch expires.
59
+ // A fresh session adopted an implementation cut — `run:cut --resume` answered `resume-impl`. The
60
+ // resume clears the cut record, so without this the `cut` would stay the newest position and
61
+ // `run:step` would keep answering the resume command it had just run.
62
+ RESUME: 'resume',
63
+ // The backlog emptied while nothing of the run's own was in flight — the drain. It marks the position
64
+ // at which the end-of-run retrospective is owed, *before* the idle watch opens, so `run:step` fires
65
+ // the retrospective at the drain rather than after the watch runs its course. It is not itself a
66
+ // stop: the run watches on once the retrospective has run, and the real `STOP` follows when the watch
67
+ // expires.
56
68
  DRAIN: 'drain',
57
69
  STOP: 'stop',
58
70
  PR_OPENED: 'pr-opened',
59
71
  REVIEW_ROUND: 'review-round',
60
- // The end-of-run retrospective's result, recorded when the run marks the retrospective done
61
- // (joshuafolkken/kit#2342). A retrospective that files zero improvements and one that never ran look
72
+ // The end-of-run retrospective's result, recorded when the run marks the retrospective done. A
73
+ // retrospective that files zero improvements and one that never ran look
62
74
  // the same from outside — no new Issue either way — so the result is put on the stream the report is
63
75
  // generated from: the issues filed (or that none were), and the candidates dropped with why. It is
64
76
  // emitted from the `run:carry --retrospective` close, so marking the retrospective done and recording
65
77
  // what it found are one action rather than two the run could do only one of.
66
78
  RETROSPECTIVE: 'retrospective',
67
79
  // Ready backlog work is sitting undispatched while a lane is free and nothing has dispatched for a
68
- // while (joshuafolkken/kit#2359). Emitted once per stall episode by the stop-time detector, it is
69
- // both the dedup marker — `emit_once_since` refuses a second until a `CHILD_LAUNCH` intervenes
70
- // (joshuafolkken/kit#2464) — and the line a
71
- // terminal reader following the stream sees. `run:step` reads it as `backlog:next`, so a run that
80
+ // while. Emitted once per stall episode by the stop-time detector, it is both the dedup marker —
81
+ // `emit_once_since` refuses a second until a `CHILD_LAUNCH` intervenes — and the line a terminal
82
+ // reader following the stream sees. `run:step` reads it as `backlog:next`, so a run that
72
83
  // stalled is pointed straight at dispatching the work rather than left waiting.
73
84
  STALL: 'stall',
74
85
  // The run's own driver is gone: the cut handed the budget off, the owner has died, and no supervisor
75
- // is watching (joshuafolkken/kit#2375). Emitted once per strand episode by the stop-time detector,
86
+ // is watching. Emitted once per strand episode by the stop-time detector,
76
87
  // exactly as `STALL` is — the newest-event dedup keeps a run polled every stop from notifying more
77
88
  // than once, and a terminal reader following the stream sees the line. The strand is the step before
78
89
  // the stall: a stalled run still has a driver that could dispatch, a stranded one has none.
79
90
  STRANDED: 'stranded',
80
- // One `josh ship` stage starting, succeeding or failing (joshuafolkken/kit#2426). It is a trace of the
91
+ // One `josh ship` stage starting, succeeding or failing. It is a trace of the
81
92
  // composite's progress rather than a position the run is at — the positions a ship leaves behind are
82
93
  // the closed issue its `followup` merges, or a detached supervisor's `SHIP_LAUNCH` / `SHIP_STOP` below
83
94
  // — so it is one of the `TRACE_KINDS` the last-event read skips.
84
95
  SHIP_STAGE: 'ship-stage',
85
- // One progress watcher line — the `at … / next …` heartbeat `run:progress` prints
86
- // (joshuafolkken/kit#2437). Printed only to the watcher's own output, a headless successor's heartbeat
87
- // was buried in its log after a cut; on the stream it reaches the attached session's relay. It says
96
+ // One progress watcher line — the `at … / next …` heartbeat `run:progress` prints. Printed only to
97
+ // the watcher's own output, a headless successor's heartbeat would be buried in its log after a cut;
98
+ // on the stream it reaches the attached session's relay. It says
88
99
  // the run is alive rather than where it is, so it is a trace kind like `SHIP_STAGE`.
89
100
  HEARTBEAT: 'heartbeat',
90
- // The post-implementation region handed to a detached `josh ship --detach` supervisor
91
- // (joshuafolkken/kit#2428). Unlike a stage trace it is a position: the agent has ended and the
101
+ // The post-implementation region handed to a detached `josh ship --detach` supervisor. Unlike a stage
102
+ // trace it is a position: the agent has ended and the
92
103
  // supervisor carries the run, so `run:step` answers `wait` until it stops or the issue closes.
93
104
  SHIP_LAUNCH: 'ship-launch',
94
105
  // The supervisor stopped at a failed stage — a red gate, a High/Medium review, a failed push, red CI
95
- // (joshuafolkken/kit#2428). The position that hands control back: `run:step` prints the command that
106
+ // The position that hands control back: `run:step` prints the command that
96
107
  // shows the stopped report, so the agent fixes it and relaunches rather than rebuilding the context.
97
108
  SHIP_STOP: 'ship-stop',
109
+ // The idle watch's window — when the run began waiting on an empty backlog and when that wait ends
110
+ // `backlog:offer` writes it whenever the window changes, so `run:board` reads
111
+ // the deadline rather than guessing it. It is a trace: `emit_once`'s drain dedup and `run:step`'s
112
+ // position both read past it, so a watching loop never re-marks the drain it is waiting after.
113
+ IDLE: 'idle',
114
+ // An Issue the run filed on its way, written by `issue:file`, so a run started from the command line
115
+ // still surfaces what it found — `run:board`'s findings section reads it.
116
+ FILED: 'filed',
117
+ // A one-line observation short of an Issue, written with `run:event --append note` and shown in the
118
+ // same section.
119
+ NOTE: 'note',
120
+ // A lane child reached a phase no other event marks — its first implementation edit, written by the
121
+ // PreToolUse hook — so `run:board` draws how far the child has got. A trace,
122
+ // like `SHIP_STAGE`: it says where the child's work is, not where the run is.
123
+ LANE_PHASE: 'lane-phase',
124
+ // An issue `run:add` put into the live run. The parent's `--wait` watcher
125
+ // ends on it, so the issue takes the next free lane without waiting out the arrival probe's minute. A
126
+ // trace: it says what the run was handed, not where the run is.
127
+ ADD: 'add',
128
+ // `josh lane:limit` raised a live run's lane limit. The `--wait` watcher's
129
+ // arrival probe reads it as a wake: the lanes a raise frees are new room for a pool its baseline
130
+ // already holds. A trace: it says the run gained room, not where the run is.
131
+ LANE_LIMIT: 'lane-limit',
98
132
  } as const
99
133
 
100
134
  type EventKind = (typeof EVENT_KIND)[keyof typeof EVENT_KIND]
@@ -104,7 +138,26 @@ const EVENT_KINDS: ReadonlyArray<string> = Object.values(EVENT_KIND)
104
138
  // The kinds that trace progress inside a step rather than mark where the run is. Every last-event reader
105
139
  // — `run:step`'s position, `emit_once`'s dedup — asks "where is the run", and a
106
140
  // ship's four stage lines after its `merge` would otherwise read as an unknown position.
107
- const TRACE_KINDS: ReadonlySet<string> = new Set([EVENT_KIND.SHIP_STAGE, EVENT_KIND.HEARTBEAT])
141
+ const TRACE_KINDS: ReadonlySet<string> = new Set([
142
+ EVENT_KIND.SHIP_STAGE,
143
+ EVENT_KIND.HEARTBEAT,
144
+ EVENT_KIND.IDLE,
145
+ EVENT_KIND.FILED,
146
+ EVENT_KIND.NOTE,
147
+ EVENT_KIND.LANE_PHASE,
148
+ EVENT_KIND.ADD,
149
+ EVENT_KIND.LANE_LIMIT,
150
+ ])
151
+
152
+ // The trace kinds that say only that the run was alive, so the bound rolls them off first. A `filed` or
153
+ // `note` line is a trace to the position readers but is the board's record of what the run found, so
154
+ // it rolls off only with the positions. A ship-stage `start` and an `idle` line are disposable but go
155
+ // last of them: `run:board` draws from those lines.
156
+ const DISPOSABLE_KINDS: ReadonlySet<string> = new Set([
157
+ EVENT_KIND.SHIP_STAGE,
158
+ EVENT_KIND.HEARTBEAT,
159
+ EVENT_KIND.IDLE,
160
+ ])
108
161
 
109
162
  const event_schema = z.object({
110
163
  pos: z.number(),
@@ -126,7 +179,7 @@ interface StreamRead {
126
179
  }
127
180
 
128
181
  // A kind the enumeration names, and nothing else. The predicate is what `append` asks before it writes,
129
- // so an event outside the enumeration is never appended (joshuafolkken/kit#2205).
182
+ // so an event outside the enumeration is never appended.
130
183
  function is_event_kind(value: string): value is EventKind {
131
184
  return EVENT_KINDS.includes(value)
132
185
  }
@@ -166,18 +219,71 @@ function last_position(events: ReadonlyArray<RunEvent>): number {
166
219
  return events[events.length - POSITION_INCREMENT]?.pos ?? FIRST_POSITION
167
220
  }
168
221
 
222
+ // The issue a ship-stage names — `#<N> <stage> <phase>` carries it first.
223
+ function issue_of(event: RunEvent): string {
224
+ return event.text.split(WORD_SEPARATOR)[FIRST_POSITION] ?? ''
225
+ }
226
+
227
+ // Each issue's newest ship-stage, the one the board reads its furthest phase from.
228
+ function newest_stages(events: ReadonlyArray<RunEvent>): ReadonlySet<RunEvent> {
229
+ const newest = new Map<string, RunEvent>()
230
+
231
+ for (const event of events) {
232
+ if (event.kind === EVENT_KIND.SHIP_STAGE) newest.set(issue_of(event), event)
233
+ }
234
+
235
+ return new Set(newest.values())
236
+ }
237
+
238
+ // A ship-stage that starts its stage — the line `run:board` draws a phase from. A `done`, a `failed` and
239
+ // a passed-over stage draw none.
240
+ function is_stage_start(event: RunEvent): boolean {
241
+ if (event.kind !== EVENT_KIND.SHIP_STAGE) return false
242
+
243
+ return event.text.split(WORD_SEPARATOR)[STAGE_PHASE_INDEX] === run_ship_stage.PHASE.START
244
+ }
245
+
246
+ // A disposable line `run:board` draws from: a ship-stage `start` is a phase on a lane's track, and an
247
+ // `idle` line is the deadline of the run's wait.
248
+ function is_drawn(event: RunEvent): boolean {
249
+ return event.kind === EVENT_KIND.IDLE || is_stage_start(event)
250
+ }
251
+
252
+ // The lines the bound may drop, in the order it drops them: the ones that draw nothing first, then the
253
+ // ones `run:board` draws from, each group oldest first.
254
+ function droppable(events: ReadonlyArray<RunEvent>): ReadonlyArray<RunEvent> {
255
+ const kept = newest_stages(events)
256
+ const disposable = events.filter((event) => DISPOSABLE_KINDS.has(event.kind) && !kept.has(event))
257
+
258
+ return [
259
+ ...disposable.filter((event) => !is_drawn(event)),
260
+ ...disposable.filter((event) => is_drawn(event)),
261
+ ]
262
+ }
263
+
169
264
  // The bounded stream serialized back to JSONL. The newest `EVENT_CAP` are kept and the oldest roll off;
170
265
  // each survivor keeps its original `pos`, so the bound never renumbers a position a reader is holding.
171
- // The stream held to `EVENT_CAP`, dropping the oldest trace events before any position
172
- // (joshuafolkken/kit#3245). A long run's ship-stage and heartbeat lines once filled 396 of the 500 slots
173
- // and pushed its cuts off, so the retrospective counted `cut 0` for a run with thirteen; a trace says only
174
- // that the run was alive, so it is the first to go. Only a stream of positions alone rolls them off.
266
+ // The stream held to `EVENT_CAP`, dropping the oldest trace events before any position: a trace says
267
+ // only that the run was alive, so it is the first to go, and a long run's trace lines never push its
268
+ // cuts off. Only a stream of positions alone rolls them off.
269
+ //
270
+ // **Each issue's newest ship-stage is not disposable**: it is the only record `run:board` draws a lane's
271
+ // review-and-later phase from, and on a stream full of positions it would otherwise roll off in its own
272
+ // append.
273
+ //
274
+ // **A ship-stage `start` outlasts the other disposable lines**: each one is a phase on the lane's track,
275
+ // so it is kept past the `done` lines and the heartbeats. An `idle` line goes with them, oldest first,
276
+ // so a run's newest wait is not the first line a stream of starts and positions gives up.
277
+ //
278
+ // **The kept line carries the history**: on a stream the positions fill, every append still rolls off
279
+ // the issue's previous stage line, so the newest one lists every stage its
280
+ // attempt has started (`run-ship-stage.ts` → `event_text`) and the track is redrawn from it alone.
175
281
  function bounded(events: ReadonlyArray<RunEvent>): ReadonlyArray<RunEvent> {
176
282
  const excess = events.length - EVENT_CAP
177
283
 
178
284
  if (excess <= 0) return events
179
285
 
180
- const dropped = new Set(events.filter((event) => TRACE_KINDS.has(event.kind)).slice(0, excess))
286
+ const dropped = new Set(droppable(events).slice(0, excess))
181
287
 
182
288
  return events.filter((event) => !dropped.has(event)).slice(-EVENT_CAP)
183
289
  }
@@ -186,21 +292,43 @@ function serialize(events: ReadonlyArray<RunEvent>): string {
186
292
  return `${events.map((event) => JSON.stringify(event)).join(LINE_SEPARATOR)}${LINE_SEPARATOR}`
187
293
  }
188
294
 
295
+ // The read-modify-write, run only while the stream's lock is held. `replace_text_stamp` publishes the
296
+ // rewrite with a rename, so a reader never sees the stream absent or half-written.
297
+ function append_held(target: string, event: Omit<RunEvent, 'pos'>): number {
298
+ const existing = read_events(target)
299
+ const position = last_position(existing) + POSITION_INCREMENT
300
+ const events = bounded([...existing, { pos: position, ...event }])
301
+
302
+ stamp_file.replace_text_stamp(target, serialize(events))
303
+
304
+ return position
305
+ }
306
+
189
307
  /**
190
308
  * Append one event, or refuse a kind the enumeration does not name.
191
309
  *
192
310
  * The position is the previous maximum plus one — monotonic across session cuts because the stream is
193
- * keyed to the run's identity rather than a session. `write_text_stamp` unlinks then creates
194
- * exclusively, so the rewrite is symlink-safe.
311
+ * keyed to the run's identity rather than a session. **The read and the rewrite are one step under a
312
+ * per-stream lock**: the parent, a cut successor and every lane child append to one stream, and an
313
+ * unlocked read-then-rewrite would lose one writer's event to another's. A lock still
314
+ * held after the wait is reported on stderr and thrown, which the best-effort emit side swallows.
195
315
  */
196
316
  function append(target: string, kind: string, text: string, at: string): AppendResult {
197
317
  if (!is_event_kind(kind)) return { appended: false, position: FIRST_POSITION }
198
318
 
199
- const existing = read_events(target)
200
- const position = last_position(existing) + POSITION_INCREMENT
201
- const events = bounded([...existing, { pos: position, at, kind, text }])
319
+ const lock = `${target}${LOCK_SUFFIX}`
320
+ const position = repository_lock.with_lock_sync(
321
+ () => append_held(target, { at, kind, text }),
322
+ lock,
323
+ LOCK_WAIT_MS,
324
+ )
325
+
326
+ if (position === undefined) {
327
+ const message = `run event stream: gave up waiting for the lock at ${lock}`
202
328
 
203
- stamp_file.write_text_stamp(target, serialize(events))
329
+ process.stderr.write(`${message}\n`)
330
+ throw new Error(message)
331
+ }
204
332
 
205
333
  return { appended: true, position }
206
334
  }
@@ -221,16 +349,16 @@ function read_from(target: string, position: number): StreamRead {
221
349
  }
222
350
  }
223
351
 
224
- // The degenerate single-event read the "last line" consumers keep working as (joshuafolkken/kit#2205):
225
- // the newest positional event, or `undefined` for a stream with none. Trace events are skipped
226
- // (joshuafolkken/kit#2426), so the answer stays the run's position however many stage lines follow it.
352
+ // The degenerate single-event read the "last line" consumers use: the newest positional event, or
353
+ // `undefined` for a stream with none. Trace events are skipped, so the answer stays the run's position
354
+ // however many stage lines follow it.
227
355
  function read_last(target: string): RunEvent | undefined {
228
356
  return read_events(target).findLast((event) => !TRACE_KINDS.has(event.kind))
229
357
  }
230
358
 
231
359
  // Whether `kind` is already on the stream after the newest `reset_kind` — or anywhere, before the first
232
360
  // one. The episode test for a marker whose episode ends only when something specific happens rather than
233
- // when any other event lands (joshuafolkken/kit#2464): a stall ends at a dispatch, and the merges, parks
361
+ // when any other event lands: a stall ends at a dispatch, and the merges, parks
234
362
  // and heartbeats every parallel lane appends in between must not read as a fresh stall.
235
363
  function has_since(events: ReadonlyArray<RunEvent>, kind: string, reset_kind: string): boolean {
236
364
  const reset_at = events.findLastIndex((event) => event.kind === reset_kind)
@@ -238,7 +366,7 @@ function has_since(events: ReadonlyArray<RunEvent>, kind: string, reset_kind: st
238
366
  return events.slice(reset_at + POSITION_INCREMENT).some((event) => event.kind === kind)
239
367
  }
240
368
 
241
- // One event as the line a reader relays (joshuafolkken/kit#2207). The follow reader and the degenerate
369
+ // One event as the line a reader relays. The follow reader and the degenerate
242
370
  // `run:wake --list` both present events to a person, so the "what an event reads as" lives here, beside
243
371
  // the enumeration it names, rather than being spelled twice at the two call sites. `at`, `kind` and
244
372
  // `text` are joined with a separator no field carries, so the three stay legible in one line.
@@ -256,6 +384,7 @@ const run_event_stream = {
256
384
  append,
257
385
  format_event,
258
386
  has_since,
387
+ is_stage_start,
259
388
  read_events,
260
389
  read_from,
261
390
  read_last,
@@ -1,11 +1,9 @@
1
1
  import type { StreamRead } from './run-event-stream'
2
2
 
3
- // The loop behind `josh run:event --watch` (joshuafolkken/kit#2492) — the ambient surface a person keeps
4
- // open in a pane of their own. `--follow` is one bounded pass a session restarted after every exit,
5
- // relaying each line into its conversation; each relay re-read that conversation's whole history, so the
6
- // attached session outspent every lane of the run on relaying alone. The watch runs the same pass in a
7
- // loop inside one process and writes each event as the rendered line, so a person sees an event land at
8
- // once and the conversation is never woken for it.
3
+ // The loop behind `josh run:event --watch` — the ambient surface a person keeps open in a pane of their
4
+ // own. A session relaying `--follow` would re-read its whole history on every line, so the watch runs
5
+ // the same pass in a loop inside one process and writes each event as the rendered line, so a person
6
+ // sees an event land at once and the conversation is never woken for it.
9
7
  //
10
8
  // **The pass is `run_event_follow.follow`, reused through a port rather than re-spelled**, and the loop
11
9
  // carries the position the pass hands back. `should_continue` is the one stop condition: the CLI's is