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