@joshuafolkken/kit 1.1471.0 → 1.1784.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 (895) hide show
  1. package/.claude/agents/investigator.md +1 -1
  2. package/.claude/settings.json +6 -6
  3. package/.claude/skills/epic-commands/SKILL.md +26 -77
  4. package/.claude/skills/epic-commands/epic-bundle.md +12 -6
  5. package/.claude/skills/epic-commands/execution-waves.md +1 -2
  6. package/.claude/skills/verify-ui/SKILL.md +1 -2
  7. package/.claude/skills/workflow-commands/SKILL.md +12 -14
  8. package/.claude/skills/workflow-commands/background-commands.md +8 -12
  9. package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
  10. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
  11. package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
  12. package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
  13. package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
  14. package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
  15. package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
  16. package/.claude/skills/workflow-commands/backlogrun.md +32 -51
  17. package/.claude/skills/workflow-commands/chain-rule.md +18 -11
  18. package/.claude/skills/workflow-commands/delegation.md +13 -8
  19. package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
  20. package/.claude/skills/workflow-commands/followup.md +10 -35
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
  22. package/.claude/skills/workflow-commands/fullrun.md +6 -8
  23. package/.claude/skills/workflow-commands/halfrun.md +20 -32
  24. package/.claude/skills/workflow-commands/into-target.md +1 -2
  25. package/.claude/skills/workflow-commands/issue-comments.md +19 -15
  26. package/.claude/skills/workflow-commands/issue-scout.md +5 -4
  27. package/.claude/skills/workflow-commands/kickoff.md +24 -23
  28. package/.claude/skills/workflow-commands/latest-gate.md +9 -18
  29. package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
  30. package/.claude/skills/workflow-commands/observation-filing.md +4 -50
  31. package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
  32. package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
  33. package/.claude/skills/workflow-commands/prerequisite.md +11 -18
  34. package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
  35. package/.claude/skills/workflow-commands/prrun.md +6 -12
  36. package/.claude/skills/workflow-commands/retrospective.md +5 -5
  37. package/.claude/skills/workflow-commands/split-assessment.md +14 -4
  38. package/.claude/skills/workflow-commands/target-repository.md +1 -2
  39. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
  40. package/.codex/hooks.json +6 -6
  41. package/.github/actions/setup-node/action.yml +10 -1
  42. package/.github/actions/setup-pnpm/action.yml +1 -1
  43. package/.github/dependabot.yml +16 -0
  44. package/.github/release.yml +0 -2
  45. package/.github/workflows/ci.yml +121 -11
  46. package/.github/workflows/publish.yml +10 -3
  47. package/.github/workflows/sonar-qube.yml +1 -0
  48. package/.prettierignore +2 -0
  49. package/.vscode/tasks.json +1 -2
  50. package/CLAUDE.md +4 -8
  51. package/README.md +4 -2
  52. package/SECURITY.md +1 -1
  53. package/cspell/index.yaml +7 -0
  54. package/dist/CLAUDE.md +4 -8
  55. package/dist/commands/document-read-cli.js +882 -0
  56. package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
  57. package/dist/commands/read-set-cli.js +1867 -0
  58. package/dist/commands/run-prep-main.js +21653 -0
  59. package/dist/commands/run-step-cli.js +23880 -0
  60. package/dist/config-merge/index.js +5 -1
  61. package/dist/hooks/audit-provision.js +20 -35
  62. package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
  63. package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
  64. package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
  65. package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
  66. package/dist/hooks/chunk-TUIFS5E7.js +72 -0
  67. package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
  68. package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
  69. package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
  70. package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
  71. package/dist/hooks/codex-hook-adapter.js +10 -19
  72. package/dist/hooks/format-edited.js +5 -5
  73. package/dist/hooks/inputs.json +436 -257
  74. package/dist/hooks/pretool-guard.js +7 -22
  75. package/dist/hooks/session-lang.js +380 -42
  76. package/dist/hooks/stop-guard.js +8711 -782
  77. package/dist/josh.js +5263 -997
  78. package/dist/self-sync-guard/index.js +74 -10
  79. package/dist/version/index.js +115 -406
  80. package/eslint/base.js +1 -1
  81. package/lefthook/base.yml +8 -4
  82. package/package.json +17 -53
  83. package/pnpm-workspace.yaml +4 -2
  84. package/prompts/coding-standards.md +1 -1
  85. package/prompts/collaboration-workflow/file-edits.md +1 -9
  86. package/prompts/collaboration-workflow/gh-rest.md +1 -2
  87. package/prompts/collaboration-workflow/issue-citation.md +2 -4
  88. package/prompts/collaboration-workflow/issue-template.md +42 -17
  89. package/prompts/collaboration-workflow/lane-instructions.md +34 -0
  90. package/prompts/collaboration-workflow/measurement.md +37 -0
  91. package/prompts/collaboration-workflow/operating-rules.md +6 -12
  92. package/prompts/collaboration-workflow/output-bounds.md +4 -9
  93. package/prompts/collaboration-workflow/overview.md +1 -1
  94. package/prompts/collaboration-workflow/plan-comment.md +3 -42
  95. package/prompts/collaboration-workflow/principles.md +19 -8
  96. package/prompts/collaboration-workflow/report-format.md +37 -57
  97. package/prompts/collaboration-workflow/residency.md +12 -8
  98. package/prompts/collaboration-workflow/rule-delivery.md +3 -11
  99. package/prompts/collaboration-workflow/shell-body.md +8 -18
  100. package/prompts/collaboration-workflow/turn-batching.md +4 -6
  101. package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
  102. package/prompts/collaboration-workflow/wip-cap.md +7 -7
  103. package/prompts/collaboration-workflow.md +4 -7
  104. package/prompts/refactoring.md +1 -1
  105. package/prompts/review-rubric.md +1 -2
  106. package/prompts/review.md +45 -26
  107. package/prompts/testing-guide.md +10 -45
  108. package/scripts/agent/agent-argv.ts +20 -4
  109. package/scripts/agent/agent-event.ts +15 -15
  110. package/scripts/agent/agent-exit-record.ts +13 -1
  111. package/scripts/agent/agent-role-profile.ts +101 -45
  112. package/scripts/agent/agent-safe-text.ts +60 -0
  113. package/scripts/agent/api-auth.ts +41 -0
  114. package/scripts/agent/api-outage.ts +1 -1
  115. package/scripts/agent/claude-agent-argv.ts +14 -0
  116. package/scripts/agent/codex-agent-argv.ts +2 -0
  117. package/scripts/agent/lane-instructions.ts +144 -0
  118. package/scripts/auto-ok/auto-ok-cli.ts +14 -16
  119. package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
  120. package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
  121. package/scripts/auto-ok/auto-ok-judge.ts +13 -2
  122. package/scripts/auto-ok/auto-ok-main.ts +17 -0
  123. package/scripts/backlog/backlog-arrival.ts +14 -3
  124. package/scripts/backlog/backlog-budget-cli.ts +7 -33
  125. package/scripts/backlog/backlog-budget-main.ts +16 -0
  126. package/scripts/backlog/backlog-budget.ts +6 -7
  127. package/scripts/backlog/backlog-defect-priority.ts +4 -3
  128. package/scripts/backlog/backlog-drive-adopt.ts +67 -0
  129. package/scripts/backlog/backlog-drive-args.ts +4 -5
  130. package/scripts/backlog/backlog-drive-cli.ts +113 -28
  131. package/scripts/backlog/backlog-drive-hold.ts +162 -0
  132. package/scripts/backlog/backlog-drive-idle.ts +151 -0
  133. package/scripts/backlog/backlog-drive-judge.ts +25 -0
  134. package/scripts/backlog/backlog-drive-memory.ts +126 -0
  135. package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
  136. package/scripts/backlog/backlog-drive-named.ts +54 -7
  137. package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
  138. package/scripts/backlog/backlog-drive-paused.ts +169 -0
  139. package/scripts/backlog/backlog-drive-restore.ts +39 -8
  140. package/scripts/backlog/backlog-drive-seats.ts +18 -8
  141. package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
  142. package/scripts/backlog/backlog-drive.ts +79 -75
  143. package/scripts/backlog/backlog-next-main.ts +16 -0
  144. package/scripts/backlog/backlog-next-shared.ts +73 -0
  145. package/scripts/backlog/backlog-next.ts +48 -16
  146. package/scripts/backlog/backlog-occupied.ts +69 -0
  147. package/scripts/backlog/backlog-offer-cli.ts +6 -21
  148. package/scripts/backlog/backlog-offer-exclude.ts +15 -0
  149. package/scripts/backlog/backlog-offer-main.ts +12 -0
  150. package/scripts/backlog/backlog-offer.ts +36 -3
  151. package/scripts/backlog/backlog-overlap.ts +22 -4
  152. package/scripts/backlog/backlog-plan-read.ts +6 -2
  153. package/scripts/backlog/backlog-plan.ts +18 -4
  154. package/scripts/backlog/backlog-pool.ts +10 -10
  155. package/scripts/backlog/backlog-rank.ts +10 -2
  156. package/scripts/backlog/backlog-ready.ts +137 -18
  157. package/scripts/backlog/backlog-stalled-detect.ts +109 -36
  158. package/scripts/backlog/backlog-stalled.ts +52 -16
  159. package/scripts/backlog/backlog-wait-cause.ts +86 -0
  160. package/scripts/backlog/backlog-waves.ts +39 -13
  161. package/scripts/backlog/backlogrun-args.ts +19 -7
  162. package/scripts/backlog/backlogrun-cli.ts +19 -5
  163. package/scripts/backlog/backlogrun-launch.ts +6 -0
  164. package/scripts/backlog/backlogrun-restart.ts +97 -0
  165. package/scripts/backlog/backlogrun-stop.ts +79 -7
  166. package/scripts/behavior/behavior-cli.ts +2 -2
  167. package/scripts/behavior/behavior-rules.ts +47 -24
  168. package/scripts/build/build-bin.ts +2 -16
  169. package/scripts/build/build-claude-md.ts +0 -7
  170. package/scripts/build/build-commands.ts +0 -13
  171. package/scripts/build/build-hooks.ts +49 -48
  172. package/scripts/build/hook-bundle-stamp.ts +29 -11
  173. package/scripts/build/local-bin.ts +1 -1
  174. package/scripts/cases/cases-cli.ts +25 -13
  175. package/scripts/cases/cases-interaction-scan.ts +134 -0
  176. package/scripts/cases/cases-interaction.ts +183 -0
  177. package/scripts/cases/cases-logic.ts +39 -6
  178. package/scripts/ci/pr-classification-main.ts +18 -0
  179. package/scripts/ci/pr-classification.ts +10 -17
  180. package/scripts/clone/clone-scan.ts +1 -1
  181. package/scripts/cost-runtime/cost-blocks.ts +22 -37
  182. package/scripts/cost-runtime/cost-cli.ts +31 -14
  183. package/scripts/cost-runtime/cost-main.ts +12 -0
  184. package/scripts/cost-runtime/cost-transcript.ts +1 -0
  185. package/scripts/delegation/delegation-policy.ts +17 -4
  186. package/scripts/delegation/duplicate-read-guard.ts +2 -10
  187. package/scripts/delegation/investigation-guard.ts +15 -73
  188. package/scripts/delegation/investigation-reads.ts +3 -5
  189. package/scripts/dependabot/dependabot-cooldown.ts +194 -0
  190. package/scripts/discovery/repo-discovery.ts +24 -6
  191. package/scripts/doctor/doctor-consumer.ts +2 -5
  192. package/scripts/document/document-byte-budget.ts +9 -6
  193. package/scripts/document/document-scan.ts +1 -1
  194. package/scripts/document/document-section-cli.ts +17 -13
  195. package/scripts/document/document-section-main.ts +12 -0
  196. package/scripts/document/entry-read-budget.ts +2 -2
  197. package/scripts/document/read-set-cli.ts +4 -1
  198. package/scripts/epic/epic-audit-cli.ts +12 -6
  199. package/scripts/epic/epic-audit-orphans.ts +5 -8
  200. package/scripts/epic/epic-audit.ts +52 -1
  201. package/scripts/epic/epic-bundle-apply.ts +137 -0
  202. package/scripts/epic/epic-bundle-cli.ts +32 -121
  203. package/scripts/epic/epic-bundle-evidence.ts +49 -26
  204. package/scripts/epic/epic-bundle-format.ts +116 -0
  205. package/scripts/epic/epic-bundle-main.ts +17 -0
  206. package/scripts/epic/epic-bundle-referenced.ts +14 -3
  207. package/scripts/epic/epic-bundle.ts +17 -9
  208. package/scripts/epic/epic-busy.ts +5 -12
  209. package/scripts/epic/epic-classify.ts +24 -15
  210. package/scripts/epic/epic-cli-argv.ts +31 -0
  211. package/scripts/epic/epic-cli-decide.ts +42 -0
  212. package/scripts/epic/epic-cli.ts +6 -38
  213. package/scripts/epic/epic-close.ts +112 -55
  214. package/scripts/epic/epic-cross-repo.ts +4 -7
  215. package/scripts/epic/epic-decide.ts +119 -0
  216. package/scripts/epic/epic-decision.ts +9 -0
  217. package/scripts/epic/epic-fetch.ts +4 -0
  218. package/scripts/epic/epic-graph.ts +2 -0
  219. package/scripts/epic/epic-issue.ts +5 -1
  220. package/scripts/epic/epic-label-age.ts +1 -1
  221. package/scripts/epic/epic-lane-offer.ts +39 -4
  222. package/scripts/epic/epic-next-main.ts +24 -0
  223. package/scripts/epic/epic-next.ts +6 -24
  224. package/scripts/epic/epic-outside-blocker.ts +6 -2
  225. package/scripts/epic/epic-parse.ts +9 -3
  226. package/scripts/epic/epic-read.ts +1 -0
  227. package/scripts/epic/epic-reconcile.ts +39 -0
  228. package/scripts/epic/epic-run.ts +10 -1
  229. package/scripts/epic/epic-solo.ts +50 -14
  230. package/scripts/epic/epic.ts +41 -7
  231. package/scripts/exports/unused-members-cli.ts +2 -2
  232. package/scripts/followup/followup-checks-event.ts +8 -3
  233. package/scripts/followup/followup-coderabbit-wait.ts +82 -0
  234. package/scripts/followup/followup-review-gates.ts +81 -0
  235. package/scripts/followup/git-followup-stages.ts +13 -3
  236. package/scripts/followup/git-followup-workflow.ts +31 -60
  237. package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
  238. package/scripts/followup/git-pr-followup.ts +36 -8
  239. package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
  240. package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
  241. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
  242. package/scripts/gate/busy-average.ts +58 -0
  243. package/scripts/gate/check-cpu.ts +60 -0
  244. package/scripts/gate/check-inputs.ts +73 -0
  245. package/scripts/gate/check-reuse.ts +141 -0
  246. package/scripts/gate/command-memory.ts +192 -0
  247. package/scripts/gate/core-admission.ts +218 -28
  248. package/scripts/gate/core-budget-timing.ts +37 -0
  249. package/scripts/gate/core-budget.ts +150 -119
  250. package/scripts/gate/core-wait-record.ts +48 -0
  251. package/scripts/gate/core-wait.ts +162 -0
  252. package/scripts/gate/core-weights.ts +86 -0
  253. package/scripts/gate/free-cores.ts +72 -0
  254. package/scripts/gate/gate-ledger.ts +49 -7
  255. package/scripts/gate/gate-plan.ts +44 -15
  256. package/scripts/gate/gate-report.ts +29 -4
  257. package/scripts/gate/gate-run-steps.ts +195 -0
  258. package/scripts/gate/gate-skip.ts +12 -2
  259. package/scripts/gate/gate-steps.ts +12 -1
  260. package/scripts/gate/held-mark.ts +55 -0
  261. package/scripts/gate/input-fingerprint.ts +42 -0
  262. package/scripts/gate/machine-capacity.ts +124 -31
  263. package/scripts/gate/moved-paths.ts +67 -0
  264. package/scripts/gate/pre-commit-type-check.ts +14 -1
  265. package/scripts/gate/project-checks.ts +5 -12
  266. package/scripts/gate/scoped-green.ts +12 -8
  267. package/scripts/gate/since-green.ts +62 -0
  268. package/scripts/gate/toolchain-inputs.ts +115 -0
  269. package/scripts/gate/verification-gate.ts +65 -129
  270. package/scripts/gate/verification-inputs.ts +250 -0
  271. package/scripts/gh/gh-author-association.ts +96 -9
  272. package/scripts/gh/git-ai-review-scan.ts +4 -2
  273. package/scripts/gh/git-gh-api-path.ts +15 -0
  274. package/scripts/gh/git-gh-branch-rules.ts +73 -0
  275. package/scripts/gh/git-gh-conditional.ts +5 -2
  276. package/scripts/gh/git-gh-issue-read.ts +5 -1
  277. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  278. package/scripts/gh/git-gh-issue-write.ts +77 -17
  279. package/scripts/gh/git-gh-issue.ts +7 -3
  280. package/scripts/gh/git-gh-poll-read.ts +89 -0
  281. package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
  282. package/scripts/gh/git-gh-pr-rest.ts +1 -1
  283. package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
  284. package/scripts/gh/git-gh-pr.ts +27 -15
  285. package/scripts/gh/git-pr-checks-eval.ts +39 -7
  286. package/scripts/gh/git-pr-checks-parse.ts +39 -9
  287. package/scripts/gh/git-pr-merge-checked.ts +80 -0
  288. package/scripts/gh/git-pr.ts +13 -1
  289. package/scripts/git/base-tree.ts +19 -2
  290. package/scripts/git/changed-file-scope.ts +6 -4
  291. package/scripts/git/changed-paths.ts +18 -1
  292. package/scripts/git/git-diff-reads.ts +27 -2
  293. package/scripts/git/git-grep-hits.ts +85 -0
  294. package/scripts/git/git-location-environment.ts +1 -1
  295. package/scripts/git/git-merge-conflicts.ts +83 -0
  296. package/scripts/git/git-preflight.ts +37 -12
  297. package/scripts/git/git-push-transport.ts +1 -2
  298. package/scripts/git/git-schemas.ts +17 -7
  299. package/scripts/git/git-spawn.ts +1 -2
  300. package/scripts/git/git-status.ts +4 -4
  301. package/scripts/git/main-merge-main.ts +12 -0
  302. package/scripts/git/main-merge-regenerate.ts +78 -0
  303. package/scripts/git/main-merge.ts +39 -14
  304. package/scripts/git/main-sync-main.ts +12 -0
  305. package/scripts/git/main-sync.ts +0 -9
  306. package/scripts/git/stash/git-stash.ts +27 -4
  307. package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
  308. package/scripts/git/stash/stash-pop-cli.ts +6 -12
  309. package/scripts/git/stash/stash-pop-main.ts +12 -0
  310. package/scripts/git/stash/stash-push-cli.ts +76 -0
  311. package/scripts/git/stash/stash-push-main.ts +12 -0
  312. package/scripts/hooks/batch-guard.ts +5 -16
  313. package/scripts/hooks/check-commit-message-main.ts +8 -0
  314. package/scripts/hooks/check-commit-message.ts +4 -7
  315. package/scripts/hooks/format-edited-file.ts +8 -24
  316. package/scripts/hooks/pre-commit-lint.ts +118 -0
  317. package/scripts/hooks/pre-push-unit.ts +4 -2
  318. package/scripts/hooks/pretool-guard-cli.ts +1 -8
  319. package/scripts/hooks/pretool-guard.ts +57 -69
  320. package/scripts/hooks/reserved-run.ts +67 -8
  321. package/scripts/hooks/run-hook.sh +18 -11
  322. package/scripts/hooks/shell-rules-notice.ts +37 -0
  323. package/scripts/hooks/stop-actions.ts +185 -0
  324. package/scripts/hooks/stop-guard.ts +72 -27
  325. package/scripts/init/hook-command-rewrite.ts +19 -5
  326. package/scripts/init/hook-launch.ts +15 -12
  327. package/scripts/init/init-actions.ts +0 -6
  328. package/scripts/init/init-ai-copy.ts +10 -36
  329. package/scripts/init/init-bootstrap.ts +9 -8
  330. package/scripts/init/init-dry-run-report.ts +1 -1
  331. package/scripts/init/init-dry-run.ts +1 -1
  332. package/scripts/init/init-file-action.ts +7 -9
  333. package/scripts/init/init-logic-json-merge.ts +2 -2
  334. package/scripts/init/init-logic-migrate.ts +9 -82
  335. package/scripts/init/init-logic.ts +3 -2
  336. package/scripts/init/init-main.ts +12 -0
  337. package/scripts/init/init.ts +5 -12
  338. package/scripts/init/kit-development-versions.ts +3 -7
  339. package/scripts/init/kit-written-paths.ts +2 -2
  340. package/scripts/init/project-profile.ts +5 -4
  341. package/scripts/init/tsconfig-preset-migration.ts +2 -1
  342. package/scripts/init/vscode-tasks.ts +1 -1
  343. package/scripts/issue/defect-origin-cli.ts +106 -0
  344. package/scripts/issue/defect-origin-line.ts +60 -0
  345. package/scripts/issue/defect-origin-main.ts +11 -0
  346. package/scripts/issue/defect-origin.ts +114 -0
  347. package/scripts/issue/defect-rate-cli.ts +34 -78
  348. package/scripts/issue/defect-rate.ts +0 -16
  349. package/scripts/issue/defect-report-cli.ts +128 -0
  350. package/scripts/issue/defect-report-format.ts +56 -0
  351. package/scripts/issue/defect-report-main.ts +11 -0
  352. package/scripts/issue/defect-report.ts +160 -0
  353. package/scripts/issue/expected-effect-lint.ts +60 -0
  354. package/scripts/issue/issue-already-done-cli.ts +62 -0
  355. package/scripts/issue/issue-body-or-comment.ts +40 -0
  356. package/scripts/issue/issue-cite-cli.ts +33 -22
  357. package/scripts/issue/issue-cite-main.ts +12 -0
  358. package/scripts/issue/issue-classification.ts +13 -8
  359. package/scripts/issue/issue-comment-cli.ts +10 -24
  360. package/scripts/issue/issue-comment-main.ts +12 -0
  361. package/scripts/issue/issue-evidence-exit.ts +100 -0
  362. package/scripts/issue/issue-file-cli.ts +29 -7
  363. package/scripts/issue/issue-file.ts +19 -19
  364. package/scripts/issue/issue-fold-cli.ts +2 -11
  365. package/scripts/issue/issue-fold-main.ts +12 -0
  366. package/scripts/issue/issue-labels.ts +81 -90
  367. package/scripts/issue/issue-lint-cli.ts +7 -13
  368. package/scripts/issue/issue-lint-main.ts +12 -0
  369. package/scripts/issue/issue-measured-cli.ts +56 -0
  370. package/scripts/issue/issue-merged.ts +19 -2
  371. package/scripts/issue/issue-not-before-label.ts +135 -0
  372. package/scripts/issue/issue-not-before.ts +111 -0
  373. package/scripts/issue/issue-number-shape.ts +15 -1
  374. package/scripts/issue/issue-park.ts +28 -0
  375. package/scripts/issue/issue-plan-cli.ts +151 -0
  376. package/scripts/issue/issue-priority.ts +151 -0
  377. package/scripts/issue/issue-rank.ts +7 -1
  378. package/scripts/issue/issue-read-cli.ts +3 -10
  379. package/scripts/issue/issue-read-main.ts +12 -0
  380. package/scripts/issue/issue-read.ts +29 -5
  381. package/scripts/issue/issue-release-cli.ts +0 -10
  382. package/scripts/issue/issue-release-main.ts +13 -0
  383. package/scripts/issue/issue-release.ts +7 -12
  384. package/scripts/issue/issue-sample-gate.ts +192 -0
  385. package/scripts/issue/issue-sample-source.ts +76 -0
  386. package/scripts/issue/issue-scout-cli.ts +19 -25
  387. package/scripts/issue/issue-scout-main.ts +14 -0
  388. package/scripts/issue/issue-state-cli.ts +0 -10
  389. package/scripts/issue/issue-state-main.ts +12 -0
  390. package/scripts/issue/issue-watch-diff.ts +56 -15
  391. package/scripts/issue/issue-watch.ts +2 -1
  392. package/scripts/issue/issue-wip.ts +2 -7
  393. package/scripts/issue/markdown-section.ts +19 -5
  394. package/scripts/issue/measure-rerun-cli.ts +13 -8
  395. package/scripts/issue/plan-consumers-cli.ts +39 -0
  396. package/scripts/issue/plan-consumers-main.ts +11 -0
  397. package/scripts/issue/plan-consumers-section.ts +55 -0
  398. package/scripts/issue/plan-consumers.ts +127 -0
  399. package/scripts/josh/agent-session-environment.ts +1 -1
  400. package/scripts/josh/command-usage.ts +82 -0
  401. package/scripts/josh/file-map-stamp.ts +49 -16
  402. package/scripts/josh/hook-decision.ts +32 -20
  403. package/scripts/josh/josh-command-map.ts +6 -1
  404. package/scripts/josh/josh-command-types.ts +65 -13
  405. package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
  406. package/scripts/josh/josh-commands-ai.ts +169 -157
  407. package/scripts/josh/josh-commands-backlog.ts +82 -16
  408. package/scripts/josh/josh-commands-clone.ts +1 -0
  409. package/scripts/josh/josh-commands-development.ts +111 -71
  410. package/scripts/josh/josh-commands-document.ts +43 -1
  411. package/scripts/josh/josh-commands-epic.ts +171 -0
  412. package/scripts/josh/josh-commands-hooks.ts +31 -2
  413. package/scripts/josh/josh-commands-issue-write.ts +181 -0
  414. package/scripts/josh/josh-commands-issue.ts +124 -24
  415. package/scripts/josh/josh-commands-lane.ts +112 -2
  416. package/scripts/josh/josh-commands-lint.ts +19 -8
  417. package/scripts/josh/josh-commands-maintenance.ts +112 -4
  418. package/scripts/josh/josh-commands-pause.ts +29 -0
  419. package/scripts/josh/josh-commands-progress.ts +87 -0
  420. package/scripts/josh/josh-commands-project.ts +138 -9
  421. package/scripts/josh/josh-commands-review.ts +124 -0
  422. package/scripts/josh/josh-commands-run.ts +211 -23
  423. package/scripts/josh/josh-commands-ship.ts +169 -0
  424. package/scripts/josh/josh-commands-split.ts +9 -0
  425. package/scripts/josh/josh-commands-versioning.ts +49 -2
  426. package/scripts/josh/josh-commands-workflow.ts +149 -6
  427. package/scripts/josh/josh-logic.ts +11 -27
  428. package/scripts/josh/josh.ts +14 -5
  429. package/scripts/josh/package-directory.ts +18 -0
  430. package/scripts/josh/process-identity.ts +13 -4
  431. package/scripts/josh/session-language-cli.ts +4 -8
  432. package/scripts/josh/session-language-main.ts +13 -0
  433. package/scripts/josh/session-language.ts +6 -1
  434. package/scripts/josh/shared-cache.ts +90 -0
  435. package/scripts/josh/stamp-file.ts +9 -15
  436. package/scripts/lane/lane-await.ts +51 -12
  437. package/scripts/lane/lane-cache.ts +5 -30
  438. package/scripts/lane/lane-capacity.ts +19 -22
  439. package/scripts/lane/lane-check-stats.ts +97 -0
  440. package/scripts/lane/lane-child-invocation.ts +43 -4
  441. package/scripts/lane/lane-cli.ts +15 -5
  442. package/scripts/lane/lane-close.ts +86 -18
  443. package/scripts/lane/lane-core-wait-stats.ts +66 -0
  444. package/scripts/lane/lane-dispatch.ts +27 -6
  445. package/scripts/lane/lane-gap-stats.ts +156 -0
  446. package/scripts/lane/lane-guard-policy.ts +2 -2
  447. package/scripts/lane/lane-handoff.ts +76 -1
  448. package/scripts/lane/lane-held-stats.ts +129 -0
  449. package/scripts/lane/lane-install.ts +16 -15
  450. package/scripts/lane/lane-launch-cli.ts +0 -9
  451. package/scripts/lane/lane-launch-main.ts +12 -0
  452. package/scripts/lane/lane-ledger-schema.ts +266 -0
  453. package/scripts/lane/lane-ledger.ts +108 -97
  454. package/scripts/lane/lane-limit-cli.ts +19 -9
  455. package/scripts/lane/lane-measure-cli.ts +58 -10
  456. package/scripts/lane/lane-open.ts +9 -1
  457. package/scripts/lane/lane-parked.ts +3 -3
  458. package/scripts/lane/lane-pause-cli.ts +130 -0
  459. package/scripts/lane/lane-pause.ts +158 -0
  460. package/scripts/lane/lane-preserve.ts +29 -1
  461. package/scripts/lane/lane-process-table.ts +166 -0
  462. package/scripts/lane/lane-reap-settle.ts +124 -0
  463. package/scripts/lane/lane-reap.ts +50 -15
  464. package/scripts/lane/lane-registry.ts +33 -10
  465. package/scripts/lane/lane-residents.ts +162 -0
  466. package/scripts/lane/lane-restart.ts +26 -27
  467. package/scripts/lane/lane-round-two-stats.ts +49 -0
  468. package/scripts/lane/lane-sampler.ts +4 -0
  469. package/scripts/lane/lane-session-action.ts +160 -0
  470. package/scripts/lane/lane-session-broker.ts +134 -134
  471. package/scripts/lane/lane-snapshot-trace.ts +84 -0
  472. package/scripts/lane/lane-spans.ts +51 -0
  473. package/scripts/lane/lane-spent.ts +6 -3
  474. package/scripts/lane/lane-stage-stats.ts +7 -2
  475. package/scripts/lane/lane-state.ts +302 -0
  476. package/scripts/lane/lane-stats.ts +58 -4
  477. package/scripts/lane/lane-stop-stats.ts +113 -37
  478. package/scripts/lane/lane-test-related-stats.ts +127 -0
  479. package/scripts/lane/lane-transcript-calls.ts +145 -0
  480. package/scripts/lane/lane-transcript-stats.ts +168 -0
  481. package/scripts/lane/lane-vacant.ts +13 -3
  482. package/scripts/lane/lane-withdraw-cli.ts +72 -0
  483. package/scripts/lane/lane-withdraw.ts +183 -0
  484. package/scripts/lane/process-directories.ts +70 -0
  485. package/scripts/lane/process-lane-marks.ts +94 -0
  486. package/scripts/lib/atomic-write.ts +62 -0
  487. package/scripts/lib/buffered-process.ts +12 -5
  488. package/scripts/lib/cli-flags.ts +53 -0
  489. package/scripts/lib/figure-format.ts +63 -0
  490. package/scripts/lib/json-value.ts +9 -1
  491. package/scripts/lib/package-manifest.ts +35 -0
  492. package/scripts/lib/read-file.ts +3 -1
  493. package/scripts/lib/stamped-memo.ts +63 -0
  494. package/scripts/lib/stdout-on-stderr.ts +24 -0
  495. package/scripts/lib/timeouts.ts +9 -0
  496. package/scripts/lib/transcript-record.ts +91 -0
  497. package/scripts/lines/effective-limit.ts +1 -1
  498. package/scripts/lint/eslint-cache-dependencies.ts +145 -0
  499. package/scripts/lint/eslint-daemon.ts +265 -0
  500. package/scripts/lint/format.ts +14 -5
  501. package/scripts/lint/import-graph.ts +279 -0
  502. package/scripts/lint/lint-gate-scope.ts +102 -0
  503. package/scripts/lint/lint-parallel-main.ts +19 -0
  504. package/scripts/lint/lint-parallel.ts +72 -33
  505. package/scripts/lint/lint-related-scope.ts +33 -24
  506. package/scripts/lint/lint-related.ts +38 -6
  507. package/scripts/notify/confirmation-options.ts +1 -2
  508. package/scripts/notify/telegram-notify.ts +20 -20
  509. package/scripts/notify/telegram-test-logic.ts +0 -1
  510. package/scripts/notify/telegram-test-main.ts +8 -0
  511. package/scripts/notify/telegram-test.ts +12 -11
  512. package/scripts/observations/observation-ledger.ts +13 -0
  513. package/scripts/observations/observations-flush-landing.ts +5 -3
  514. package/scripts/observations/observations-flush.ts +6 -1
  515. package/scripts/overrides/overrides-check.ts +2 -5
  516. package/scripts/overrides/overrides-files.ts +2 -1
  517. package/scripts/overrides/overrides-logic.ts +3 -6
  518. package/scripts/package/verify-optional-eslint-install.ts +8 -6
  519. package/scripts/propagate/propagate-publish.ts +2 -7
  520. package/scripts/propagate/propagate-targets.ts +4 -12
  521. package/scripts/refactor/import-graph.ts +9 -7
  522. package/scripts/release/github-release-runs.ts +17 -6
  523. package/scripts/release/release-approval-prune.ts +18 -0
  524. package/scripts/release/release-history.ts +1 -3
  525. package/scripts/release/release-progress.ts +42 -22
  526. package/scripts/release/release-publish-run.ts +39 -0
  527. package/scripts/release/release-publish.ts +6 -6
  528. package/scripts/release/release-scope-cli.ts +0 -10
  529. package/scripts/release/release-scope-main.ts +12 -0
  530. package/scripts/repo/repo-setting.ts +3 -6
  531. package/scripts/repo/required-checks-logic.ts +6 -15
  532. package/scripts/report/report-format-reference.ts +4 -0
  533. package/scripts/report/report-labels.ts +155 -0
  534. package/scripts/report/report-lint-cli.ts +3 -0
  535. package/scripts/report/report-lint.ts +85 -110
  536. package/scripts/report/report-template-cli.ts +59 -0
  537. package/scripts/report/report-template.ts +112 -0
  538. package/scripts/review/acceptance-map-check.ts +61 -0
  539. package/scripts/review/acceptance-map.ts +206 -0
  540. package/scripts/review/removed-tests-check.ts +86 -0
  541. package/scripts/review/removed-tests.ts +149 -0
  542. package/scripts/review/review-brief-cli.ts +82 -16
  543. package/scripts/review/review-brief-main.ts +12 -0
  544. package/scripts/review/review-brief.ts +31 -3
  545. package/scripts/review/review-code-tree.ts +10 -6
  546. package/scripts/review/review-comment-round.ts +26 -8
  547. package/scripts/review/review-finding-ledger.ts +30 -15
  548. package/scripts/review/review-interaction.ts +94 -0
  549. package/scripts/review/review-readers-scan.ts +163 -0
  550. package/scripts/review/review-record-cli.ts +69 -30
  551. package/scripts/review/review-record-main.ts +12 -0
  552. package/scripts/review/review-round-one-blobs.ts +221 -0
  553. package/scripts/review/review-round2-cli.ts +49 -12
  554. package/scripts/review/review-round2.ts +80 -12
  555. package/scripts/review/review-stamps.ts +19 -1
  556. package/scripts/review/review-stop-log.ts +96 -0
  557. package/scripts/review/review-stops-cli.ts +85 -0
  558. package/scripts/review/review-tree.ts +6 -17
  559. package/scripts/review/review-untouched-readers.ts +146 -0
  560. package/scripts/review/test-titles.ts +118 -0
  561. package/scripts/rules/agent-model.ts +67 -0
  562. package/scripts/rules/bash-triggers.ts +46 -3
  563. package/scripts/rules/decision-oracle-batch.ts +9 -1
  564. package/scripts/rules/decision-oracle.ts +2 -2
  565. package/scripts/rules/delivered-rules.ts +90 -3
  566. package/scripts/rules/destructive-command.ts +8 -1
  567. package/scripts/rules/direct-filing.ts +10 -2
  568. package/scripts/rules/direct-issue-comment.ts +117 -0
  569. package/scripts/rules/direct-pr-create.ts +69 -3
  570. package/scripts/rules/early-heartbeat.ts +2 -1
  571. package/scripts/rules/file-body.ts +7 -0
  572. package/scripts/rules/filing-cap.ts +8 -0
  573. package/scripts/rules/firing-point.ts +6 -5
  574. package/scripts/rules/git-argv.ts +72 -14
  575. package/scripts/rules/git-force.ts +12 -2
  576. package/scripts/rules/guard-remedy.ts +121 -0
  577. package/scripts/rules/implementation-cut-verdict.ts +1 -1
  578. package/scripts/rules/implementation-cut.ts +11 -3
  579. package/scripts/rules/index-guard.ts +8 -1
  580. package/scripts/rules/issue-comments.ts +76 -7
  581. package/scripts/rules/josh-git-bare.ts +7 -0
  582. package/scripts/rules/lane-background.ts +67 -25
  583. package/scripts/rules/lane-carry-conflict.ts +6 -0
  584. package/scripts/rules/lane-direct-tool.ts +74 -0
  585. package/scripts/rules/lane-interactive-ask.ts +9 -2
  586. package/scripts/rules/lane-park.ts +45 -23
  587. package/scripts/rules/lane-split-park.ts +10 -2
  588. package/scripts/rules/lane-switch-main.ts +7 -0
  589. package/scripts/rules/last-prompt.ts +50 -5
  590. package/scripts/rules/oracle-consulted.ts +10 -0
  591. package/scripts/rules/oracle-firing.ts +1 -0
  592. package/scripts/rules/oracle-list-cli.ts +7 -0
  593. package/scripts/rules/permission-guards.ts +3 -0
  594. package/scripts/rules/piped-verification.ts +4 -2
  595. package/scripts/rules/poll-loop.ts +7 -0
  596. package/scripts/rules/pr-merge.ts +123 -0
  597. package/scripts/rules/protected-files.ts +32 -5
  598. package/scripts/rules/raw-field-body.ts +6 -0
  599. package/scripts/rules/rule-body-guard.ts +8 -0
  600. package/scripts/rules/rule-list.ts +12 -28
  601. package/scripts/rules/rule-rewrite.ts +114 -0
  602. package/scripts/rules/rule-value-cache.ts +4 -9
  603. package/scripts/rules/rule-value-cli.ts +51 -32
  604. package/scripts/rules/rule-value.ts +8 -2
  605. package/scripts/rules/shell-segments.ts +50 -0
  606. package/scripts/rules/stop-decision.ts +77 -0
  607. package/scripts/rules/stop-rule-rows.ts +64 -0
  608. package/scripts/rules/stop-rules.ts +150 -51
  609. package/scripts/rules/tail-commands.ts +15 -1
  610. package/scripts/rules/test-declared-commit.ts +11 -1
  611. package/scripts/rules/third-party-write.ts +7 -0
  612. package/scripts/rules/timed-rerun.ts +69 -0
  613. package/scripts/rules/worktree-guard.ts +13 -3
  614. package/scripts/run/board/run-board-app-name.ts +23 -0
  615. package/scripts/run/board/run-board-cli.ts +65 -30
  616. package/scripts/run/board/run-board-closed.ts +8 -2
  617. package/scripts/run/board/run-board-earlier.ts +94 -0
  618. package/scripts/run/board/run-board-ending-reason.ts +67 -0
  619. package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
  620. package/scripts/run/board/run-board-estimate.ts +98 -0
  621. package/scripts/run/board/run-board-fit.ts +153 -36
  622. package/scripts/run/board/run-board-fold.ts +123 -0
  623. package/scripts/run/board/run-board-fresh.ts +2 -2
  624. package/scripts/run/board/run-board-gather-live.ts +29 -0
  625. package/scripts/run/board/run-board-gather-thread.ts +189 -0
  626. package/scripts/run/board/run-board-gather-worker.ts +29 -0
  627. package/scripts/run/board/run-board-gather.ts +187 -0
  628. package/scripts/run/board/run-board-github.ts +119 -31
  629. package/scripts/run/board/run-board-header.ts +86 -21
  630. package/scripts/run/board/run-board-keys.ts +58 -0
  631. package/scripts/run/board/run-board-kind.ts +20 -6
  632. package/scripts/run/board/run-board-labels.ts +118 -71
  633. package/scripts/run/board/run-board-lane-state.ts +109 -0
  634. package/scripts/run/board/run-board-lane-time.ts +122 -0
  635. package/scripts/run/board/run-board-layout.ts +240 -61
  636. package/scripts/run/board/run-board-length.ts +52 -0
  637. package/scripts/run/board/run-board-machine.ts +8 -4
  638. package/scripts/run/board/run-board-main.ts +12 -0
  639. package/scripts/run/board/run-board-notes.ts +52 -31
  640. package/scripts/run/board/run-board-now.ts +1 -1
  641. package/scripts/run/board/run-board-operation.ts +15 -33
  642. package/scripts/run/board/run-board-phase.ts +1 -1
  643. package/scripts/run/board/run-board-plan-shared.ts +115 -0
  644. package/scripts/run/board/run-board-plan.ts +55 -3
  645. package/scripts/run/board/run-board-planning.ts +45 -0
  646. package/scripts/run/board/run-board-priority.ts +44 -0
  647. package/scripts/run/board/run-board-process-groups.ts +195 -0
  648. package/scripts/run/board/run-board-read.ts +153 -13
  649. package/scripts/run/board/run-board-reason.ts +238 -45
  650. package/scripts/run/board/run-board-released.ts +35 -0
  651. package/scripts/run/board/run-board-render-checks.ts +39 -5
  652. package/scripts/run/board/run-board-render-condition.ts +96 -0
  653. package/scripts/run/board/run-board-render-drawn.ts +67 -0
  654. package/scripts/run/board/run-board-render-foot.ts +59 -0
  655. package/scripts/run/board/run-board-render-icon.ts +35 -0
  656. package/scripts/run/board/run-board-render-lanes.ts +145 -0
  657. package/scripts/run/board/run-board-render-lead.ts +80 -0
  658. package/scripts/run/board/run-board-render-legend.ts +117 -47
  659. package/scripts/run/board/run-board-render-notes.ts +156 -29
  660. package/scripts/run/board/run-board-render-processes.ts +196 -0
  661. package/scripts/run/board/run-board-render-section.ts +119 -0
  662. package/scripts/run/board/run-board-render-slot.ts +3 -36
  663. package/scripts/run/board/run-board-render-tail.ts +115 -48
  664. package/scripts/run/board/run-board-render-time.ts +56 -0
  665. package/scripts/run/board/run-board-render-title.ts +117 -24
  666. package/scripts/run/board/run-board-render-waits.ts +125 -0
  667. package/scripts/run/board/run-board-render.ts +206 -259
  668. package/scripts/run/board/run-board-roots.ts +54 -0
  669. package/scripts/run/board/run-board-row-yield.ts +10 -4
  670. package/scripts/run/board/run-board-setup.ts +1 -12
  671. package/scripts/run/board/run-board-snapshot.ts +111 -0
  672. package/scripts/run/board/run-board-spin.ts +2 -2
  673. package/scripts/run/board/run-board-state.ts +23 -29
  674. package/scripts/run/board/run-board-status.ts +206 -79
  675. package/scripts/run/board/run-board-thanks-read.ts +2 -2
  676. package/scripts/run/board/run-board-tick.ts +123 -104
  677. package/scripts/run/board/run-board-usage-board.ts +78 -0
  678. package/scripts/run/board/run-board-usage-lanes.ts +113 -0
  679. package/scripts/run/board/run-board-usage-listing.ts +93 -0
  680. package/scripts/run/board/run-board-usage-read.ts +120 -150
  681. package/scripts/run/board/run-board-usage-rusage.ts +19 -7
  682. package/scripts/run/board/run-board-usage-text.ts +139 -51
  683. package/scripts/run/board/run-board-usage-top.ts +102 -0
  684. package/scripts/run/board/run-board-usage.ts +89 -72
  685. package/scripts/run/board/run-board-usual.ts +20 -9
  686. package/scripts/run/carry/run-carry-args.ts +4 -7
  687. package/scripts/run/carry/run-carry-conversation.ts +1 -1
  688. package/scripts/run/carry/run-carry.ts +9 -4
  689. package/scripts/run/cut/run-cut-cli.ts +3 -2
  690. package/scripts/run/cut/run-cut-handoff.ts +2 -2
  691. package/scripts/run/cut/run-cut-report.ts +16 -0
  692. package/scripts/run/detached-launch.ts +23 -4
  693. package/scripts/run/entry/run-entry-cli.ts +8 -1
  694. package/scripts/run/event/run-event-cli.ts +1 -5
  695. package/scripts/run/event/run-event-filed.ts +12 -6
  696. package/scripts/run/event/run-event-follow.ts +2 -3
  697. package/scripts/run/event/run-event-render.ts +7 -10
  698. package/scripts/run/event/run-event-scope.ts +20 -2
  699. package/scripts/run/event/run-event-stream-emit.ts +78 -11
  700. package/scripts/run/event/run-event-stream.ts +37 -7
  701. package/scripts/run/hold/run-hold-adopt.ts +65 -0
  702. package/scripts/run/hold/run-hold-cli.ts +93 -22
  703. package/scripts/run/hold/run-hold-main.ts +12 -0
  704. package/scripts/run/hold/run-hold-member.ts +37 -0
  705. package/scripts/run/hold/run-hold-session.ts +46 -0
  706. package/scripts/run/hold/run-hold.ts +7 -1
  707. package/scripts/run/hold/run-stop-notify.ts +183 -0
  708. package/scripts/run/launch-priority.ts +32 -0
  709. package/scripts/run/merge/run-merge-auth.ts +31 -0
  710. package/scripts/run/merge/run-merge-cli.ts +72 -107
  711. package/scripts/run/merge/run-merge-close.ts +74 -0
  712. package/scripts/run/merge/run-merge-collect.ts +6 -13
  713. package/scripts/run/merge/run-merge-driver.ts +71 -0
  714. package/scripts/run/merge/run-merge-main.ts +12 -0
  715. package/scripts/run/merge/run-merge-outcome.ts +23 -0
  716. package/scripts/run/merge/run-merge-restart.ts +39 -0
  717. package/scripts/run/merge/run-merge-ship.ts +20 -4
  718. package/scripts/run/merge/run-merge-signals.ts +123 -0
  719. package/scripts/run/merge/run-merge-steps.ts +128 -83
  720. package/scripts/run/merge/run-merge.ts +53 -40
  721. package/scripts/run/park/run-park-cli.ts +91 -0
  722. package/scripts/run/park/run-park.ts +88 -0
  723. package/scripts/run/park/run-stalled.ts +68 -0
  724. package/scripts/run/pause/run-pause-cli.ts +73 -0
  725. package/scripts/run/pause/run-pause.ts +251 -0
  726. package/scripts/run/progress/run-progress-cli.ts +4 -12
  727. package/scripts/run/progress/run-progress-clock.ts +1 -1
  728. package/scripts/run/progress/run-progress-config.ts +6 -14
  729. package/scripts/run/progress/run-progress-main.ts +12 -0
  730. package/scripts/run/progress/run-progress.ts +1 -4
  731. package/scripts/run/review/run-review.ts +2 -1
  732. package/scripts/run/run-ending.ts +1 -0
  733. package/scripts/run/run-invocation.ts +5 -6
  734. package/scripts/run/run-liveness-cli.ts +6 -8
  735. package/scripts/run/run-liveness.ts +61 -30
  736. package/scripts/run/run-next.ts +1 -1
  737. package/scripts/run/run-parent-cut-hook.ts +2 -2
  738. package/scripts/run/run-poll-hook.ts +157 -0
  739. package/scripts/run/run-preflight.ts +18 -3
  740. package/scripts/run/run-prep-cli.ts +1 -10
  741. package/scripts/run/run-prep-locate.ts +7 -50
  742. package/scripts/run/run-prep-main.ts +12 -0
  743. package/scripts/run/run-prep.ts +6 -0
  744. package/scripts/run/run-report-cli.ts +101 -13
  745. package/scripts/run/run-report-handoff.ts +114 -0
  746. package/scripts/run/run-step-cli.ts +22 -15
  747. package/scripts/run/run-step-section.ts +85 -0
  748. package/scripts/run/run-step.ts +1 -1
  749. package/scripts/run/run-stranded-detect.ts +13 -0
  750. package/scripts/run/run-watcher-guard-cli.ts +1 -1
  751. package/scripts/run/run-watcher-guard.ts +1 -1
  752. package/scripts/run/ship/run-ship-args.ts +121 -0
  753. package/scripts/run/ship/run-ship-body-draft.ts +110 -0
  754. package/scripts/run/ship/run-ship-cli.ts +67 -151
  755. package/scripts/run/ship/run-ship-detach.ts +27 -7
  756. package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
  757. package/scripts/run/ship/run-ship-next.ts +27 -3
  758. package/scripts/run/ship/run-ship-overlap.ts +232 -0
  759. package/scripts/run/ship/run-ship-place.ts +96 -0
  760. package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
  761. package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
  762. package/scripts/run/ship/run-ship-preflight.ts +161 -30
  763. package/scripts/run/ship/run-ship-probe.ts +11 -3
  764. package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
  765. package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
  766. package/scripts/run/ship/run-ship-return.ts +123 -15
  767. package/scripts/run/ship/run-ship-review-steps.ts +105 -149
  768. package/scripts/run/ship/run-ship-review.ts +73 -6
  769. package/scripts/run/ship/run-ship-reviewer.ts +207 -0
  770. package/scripts/run/ship/run-ship-stage.ts +55 -6
  771. package/scripts/run/ship/run-ship-steps.ts +46 -15
  772. package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
  773. package/scripts/run/ship/run-ship-stop-context.ts +206 -0
  774. package/scripts/run/ship/run-ship-stop-text.ts +11 -6
  775. package/scripts/run/ship/run-ship-sync.ts +57 -12
  776. package/scripts/run/ship/run-ship.ts +30 -2
  777. package/scripts/run/tidy/run-tidy-cli.ts +0 -4
  778. package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
  779. package/scripts/run/tidy/run-tidy-main.ts +8 -0
  780. package/scripts/run/wake/run-wake-cli.ts +119 -100
  781. package/scripts/run/wake/run-wake-code.ts +83 -0
  782. package/scripts/run/wake/run-wake-driver.ts +19 -8
  783. package/scripts/run/wake/run-wake-loop.ts +34 -3
  784. package/scripts/run/wake/run-wake-main.ts +13 -0
  785. package/scripts/run/wake/run-wake-ports.ts +90 -0
  786. package/scripts/run/wake/run-wake-takeover.ts +66 -0
  787. package/scripts/run/wake/run-wake.ts +2 -1
  788. package/scripts/safe-chain/pack-hook.ts +2 -2
  789. package/scripts/safe-chain/preinstall-command.ts +2 -1
  790. package/scripts/safe-chain/project-config.ts +3 -9
  791. package/scripts/security/security-audit-main.ts +8 -0
  792. package/scripts/security/security-audit-provision-logic.ts +0 -11
  793. package/scripts/security/security-audit-provision-main.ts +12 -0
  794. package/scripts/security/security-audit-provision.ts +11 -26
  795. package/scripts/security/security-audit.ts +6 -7
  796. package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
  797. package/scripts/split/split-assess-cli.ts +2 -2
  798. package/scripts/split/split-assess.ts +15 -0
  799. package/scripts/split/split-measure.ts +65 -0
  800. package/scripts/sync/claude-settings-merge.ts +8 -15
  801. package/scripts/sync/directory-copy-guard.ts +4 -9
  802. package/scripts/sync/file-content.ts +78 -8
  803. package/scripts/sync/sync-ai-files.ts +3 -5
  804. package/scripts/sync/sync-configs.ts +11 -23
  805. package/scripts/sync/sync-hook-safety.ts +4 -10
  806. package/scripts/sync/sync-main.ts +11 -0
  807. package/scripts/sync/sync.ts +25 -37
  808. package/scripts/test/test-declared-changed.ts +2 -2
  809. package/scripts/test/test-declared.ts +1 -1
  810. package/scripts/test/test-e2e-guard.ts +55 -6
  811. package/scripts/test/test-e2e-stamp.ts +38 -0
  812. package/scripts/test/test-pinned-logic.ts +145 -0
  813. package/scripts/test/test-pinned-main.ts +78 -0
  814. package/scripts/test/test-pinned.ts +100 -0
  815. package/scripts/test/test-read-map.ts +264 -0
  816. package/scripts/test/test-read-recording.ts +91 -0
  817. package/scripts/test/test-read-trace.ts +148 -0
  818. package/scripts/test/test-red-main.ts +12 -0
  819. package/scripts/test/test-red.ts +12 -30
  820. package/scripts/test/test-related-main.ts +18 -0
  821. package/scripts/test/test-related-record.ts +119 -0
  822. package/scripts/test/test-related-scope.ts +229 -43
  823. package/scripts/test/test-related.ts +300 -22
  824. package/scripts/test/test-unit-guard-main.ts +15 -0
  825. package/scripts/test/test-unit-guard.ts +54 -21
  826. package/scripts/test/unit-count-file.ts +37 -0
  827. package/scripts/test/unit-run-marker.ts +162 -0
  828. package/scripts/test/unit-setup-files.ts +51 -0
  829. package/scripts/test/unit-worker-share.ts +71 -137
  830. package/scripts/test/whole-suite-files.ts +63 -0
  831. package/scripts/time-runtime/time-background.ts +20 -2
  832. package/scripts/time-runtime/time-bundles.ts +4 -3
  833. package/scripts/time-runtime/time-density-hook.ts +8 -6
  834. package/scripts/time-runtime/time-followup-stage.ts +1 -3
  835. package/scripts/time-runtime/time-format.ts +5 -28
  836. package/scripts/time-runtime/time-markers.ts +10 -1
  837. package/scripts/time-runtime/time-shell.ts +126 -14
  838. package/scripts/time-runtime/time-spans.ts +1 -0
  839. package/scripts/time-runtime/time-tool-call.ts +7 -0
  840. package/scripts/time-runtime/time-transcript-line.ts +49 -62
  841. package/scripts/uninstall/uninstall.ts +1 -1
  842. package/scripts/version/bump-version-main.ts +12 -0
  843. package/scripts/version/bump-version.ts +25 -25
  844. package/scripts/version/effective-upstream.ts +6 -12
  845. package/scripts/version/latest-corepack.ts +17 -32
  846. package/scripts/version/latest-if-required-cli.ts +93 -0
  847. package/scripts/version/latest-lane-guard-main.ts +8 -0
  848. package/scripts/version/latest-lane-guard.ts +0 -4
  849. package/scripts/version/latest-scope-cli.ts +0 -9
  850. package/scripts/version/latest-scope-main.ts +12 -0
  851. package/scripts/version/latest-update.ts +5 -5
  852. package/scripts/version/npm-registry.ts +44 -6
  853. package/scripts/version/publishable-range-check.ts +5 -16
  854. package/scripts/version/release-age.ts +1 -1
  855. package/scripts/version/release-hold.ts +1 -1
  856. package/scripts/version/release-window.ts +38 -0
  857. package/scripts/version/running-binary.ts +1 -1
  858. package/scripts/version/safe-chain-version-update.ts +3 -8
  859. package/scripts/version/version-targets.ts +6 -28
  860. package/templates/dependabot.yml +29 -0
  861. package/templates/gitignore +10 -3
  862. package/templates/pnpm-workspace.basic.yaml +1 -1
  863. package/templates/sonar-project.properties +3 -2
  864. package/templates/workflows/ci.yml +12 -4
  865. package/templates/workflows/github-release.yml +4 -0
  866. package/tsconfig.sonar.json +1 -1
  867. package/.ncurc.json +0 -3
  868. package/dist/hooks/batch-guard.js +0 -29
  869. package/dist/hooks/chunk-43ZHT22P.js +0 -3495
  870. package/dist/hooks/chunk-CDY4NFQG.js +0 -15
  871. package/dist/hooks/chunk-EUMACUK2.js +0 -2038
  872. package/dist/hooks/chunk-H5HVWYXK.js +0 -359
  873. package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
  874. package/dist/hooks/chunk-IX6TTTI6.js +0 -95
  875. package/dist/hooks/chunk-J47HU5H5.js +0 -237
  876. package/dist/hooks/chunk-K4EOONYM.js +0 -45
  877. package/dist/hooks/chunk-K4LMBQC2.js +0 -68
  878. package/dist/hooks/chunk-SHGPANFB.js +0 -56
  879. package/dist/hooks/chunk-YHBZAJSV.js +0 -79
  880. package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
  881. package/dist/hooks/duplicate-read-guard.js +0 -30
  882. package/dist/hooks/investigation-guard.js +0 -32
  883. package/scripts/backlog/backlog-stalled-cli.ts +0 -30
  884. package/scripts/cost-runtime/cost-format.ts +0 -29
  885. package/scripts/init/basic-path-migration.ts +0 -24
  886. package/scripts/issue/issue-backlinks-cli.ts +0 -93
  887. package/scripts/josh/josh-commands-guard.ts +0 -38
  888. package/scripts/lint/cross-file-recheck.ts +0 -155
  889. package/scripts/registry-migration/migrate-logic.ts +0 -237
  890. package/scripts/registry-migration/migrate.ts +0 -292
  891. package/scripts/registry-migration/user-npmrc.ts +0 -15
  892. package/scripts/rules/rule-guard.ts +0 -23
  893. package/scripts/rules/rule-registry-rows.ts +0 -282
  894. package/scripts/rules/rule-registry.ts +0 -109
  895. package/scripts/run/run-stranded-cli.ts +0 -27
@@ -25,7 +25,7 @@ import type { CarryOwner, RunCarry } from './run-carry'
25
25
  // How long after its last write a conversation whose process has gone still counts as continuing. It
26
26
  // bridges a restart and a resume — measured at eighteen seconds — with room for a person reopening a
27
27
  // window, and it is the order of the wake grace window, so a genuine crash is recovered no later than
28
- // a lost wake would be retried.
28
+ // a lost wake would be retried. A headless owner is not given it (`run-carry.ts` → `is_owner_live`).
29
29
  const CONVERSATION_QUIET_MS = 600_000
30
30
 
31
31
  type Environment = Readonly<Record<string, string | undefined>>
@@ -323,11 +323,16 @@ function adopt_carry(
323
323
  // A live pid with no readable start token is conservatively held rather than replaced. The command
324
324
  // cannot prove its generation inside that sandbox, but a false `busy` stops for a person while a
325
325
  // false `standing` can put two parents on one budget. A record with no pid still resolves false.
326
- // A gone process whose conversation is still being continued is live (`run-carry-conversation.ts`).
327
- function is_owner_live(carry: RunCarry, now: Date = new Date()): boolean {
328
- if (process_identity.is_same_process(carry.owner_pid, carry.owner_start) !== false) return true
326
+ // A gone process whose conversation is still being continued is live (`run-carry-conversation.ts`);
327
+ // a headless owner is never resumed into a new process, so its gone process is a gone owner.
328
+ function is_owner_live(
329
+ carry: RunCarry,
330
+ now: Date = new Date(),
331
+ same_process: typeof process_identity.is_same_process = process_identity.is_same_process,
332
+ ): boolean {
333
+ if (same_process(carry.owner_pid, carry.owner_start) !== false) return true
329
334
 
330
- return run_carry_conversation.is_conversation_live(carry, now)
335
+ return carry.is_owner_headless !== true && run_carry_conversation.is_conversation_live(carry, now)
331
336
  }
332
337
 
333
338
  function is_owned_by(carry: RunCarry, owner: CarryOwner): boolean {
@@ -61,6 +61,7 @@ const {
61
61
  report_held_cut,
62
62
  report_incomplete,
63
63
  report_over,
64
+ report_relaunched_cut,
64
65
  report_reviewer,
65
66
  report_stale,
66
67
  report_under_threshold,
@@ -124,7 +125,7 @@ function relaunch(target: string, lane: LaneInfo, phase: string): number {
124
125
 
125
126
  if (notes.length > 0) console.error(notes.join('\n'))
126
127
 
127
- return report(CUT_VERDICT, SUCCESS_EXIT_CODE)
128
+ return report_relaunched_cut()
128
129
  }
129
130
 
130
131
  const { is_lane_branch } = run_cut_ready
@@ -199,7 +200,7 @@ async function finish_cut(target: string, lane: LaneInfo, request: CutRequest):
199
200
  if (refused !== undefined) return refused
200
201
 
201
202
  return lane_relaunch.is_openai_lane(lane)
202
- ? report(CUT_VERDICT, SUCCESS_EXIT_CODE)
203
+ ? report_relaunched_cut()
203
204
  : relaunch(target, lane, request.phase)
204
205
  }
205
206
 
@@ -126,10 +126,10 @@ function describe_handoff(handoff: Handoff): string {
126
126
  ].join('\n\n')
127
127
  }
128
128
 
129
- // Where a handoff file is written: `.claude/tmp/` is ignored, so `josh git`, which stages every
129
+ // Where a handoff file is written: `.josh/tmp/` is ignored, so `josh git`, which stages every
130
130
  // untracked non-ignored file, cannot commit the note with the code. A refusal that asked for "a file"
131
131
  // and named no place got one written beside the code and committed (joshuafolkken/kit#3603).
132
- const HANDOFF_PATH = '.claude/tmp/handoff-<N>.json'
132
+ const HANDOFF_PATH = '.josh/tmp/handoff-<N>.json'
133
133
 
134
134
  const run_cut_handoff = {
135
135
  HANDOFF_FORMAT,
@@ -148,6 +148,20 @@ function report_held_cut(issue: string): number {
148
148
  return report(CUT_VERDICT, SUCCESS_EXIT_CODE)
149
149
  }
150
150
 
151
+ // **A cut that relaunched its successor says so on this session's own transcript** (joshuafolkken/kit#3936).
152
+ // The successor's `run:cut --resume` can clear the record before this session's turn ends, so the
153
+ // `Stop` hook cannot tell a cut stop by the record alone; it reads this line off the turn instead, a
154
+ // fact no other process can remove. The held cut never prints it — a person resumes that one. **A bare
155
+ // token line**, so it is read off the `run:cut` call's own result (`cost-run-cut.ts`), and a turn that
156
+ // merely quotes it is not read as a relaunch.
157
+ const RELAUNCHED_CUT_MARKER = 'cut-relaunched'
158
+
159
+ function report_relaunched_cut(): number {
160
+ console.error(RELAUNCHED_CUT_MARKER)
161
+
162
+ return report(CUT_VERDICT, SUCCESS_EXIT_CODE)
163
+ }
164
+
151
165
  // **An implementation cut is never resumed by a session over the threshold**.
152
166
  // The cut outside a lane leaves the session that took it open, so a person retyping `fullrun #N` there
153
167
  // would be answered `resume-impl`, keep implementing over the threshold, and be cut again on the next
@@ -174,6 +188,7 @@ const run_cut_report = {
174
188
  INCOMPLETE_VERDICT,
175
189
  NOT_A_LANE_VERDICT,
176
190
  OVER_VERDICT,
191
+ RELAUNCHED_CUT_MARKER,
177
192
  RESUME_IMPL_VERDICT,
178
193
  RESUME_VERDICT,
179
194
  STALE_VERDICT,
@@ -191,6 +206,7 @@ const run_cut_report = {
191
206
  report_held_cut,
192
207
  report_incomplete,
193
208
  report_over,
209
+ report_relaunched_cut,
194
210
  report_reviewer,
195
211
  report_stale,
196
212
  report_under_threshold,
@@ -4,6 +4,7 @@ import { agent_launch_environment } from '#scripts/agent/agent-launch-environmen
4
4
  import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
5
5
  import { agent_session_environment } from '#scripts/josh/agent-session-environment'
6
6
  import { stamp_file } from '#scripts/josh/stamp-file'
7
+ import { launch_priority } from '#scripts/run/launch-priority'
7
8
 
8
9
  // Starting a process that outlives this one, and keeping what it writes.
9
10
  //
@@ -34,13 +35,18 @@ const UNSAFE_NOTE =
34
35
  //
35
36
  // A NUL byte is what `execve` treats as the end of a string, so a value carrying one executes as a
36
37
  // prefix of itself; the other control characters have no business in a command line and their presence
37
- // means the value did not come from where it was supposed to.
38
+ // means the value did not come from where it was supposed to. **An agent's prompt is the one element a
39
+ // line break belongs in** — a ship-stop prompt carries the failed output's lines — so a vector marked
40
+ // `ends_with_prompt` lets it into its last element alone (joshuafolkken/kit#3964).
38
41
  //
39
42
  // The shared value validation lives with the role policy so environment overrides and argv elements
40
43
  // cannot disagree about which control characters or lengths are safe.
41
44
  interface LaunchArgv {
42
45
  command: string
43
46
  args: ReadonlyArray<string>
47
+ // Set by an agent argv builder, whose prompt is the last element: that one element may carry line
48
+ // breaks (`is_safe_prompt`), and every other element is checked as before.
49
+ ends_with_prompt?: boolean
44
50
  }
45
51
 
46
52
  type LaunchResult = { kind: 'launched'; pid: number } | { kind: 'failed'; note: string }
@@ -65,12 +71,23 @@ interface LaunchRequest {
65
71
  profile?: AgentProfile | undefined
66
72
  }
67
73
 
68
- const { is_safe_value } = agent_role_profile
74
+ const { is_safe_prompt, is_safe_value } = agent_role_profile
75
+ const LAST = -1
76
+
77
+ // An agent vector's prompt, the last element, may break lines; every other element is a value.
78
+ function is_safe_element(argv: LaunchArgv, value: string, index: number): boolean {
79
+ const is_prompt = argv.ends_with_prompt === true && index === argv.args.length + LAST
80
+
81
+ return is_prompt ? is_safe_prompt(value) : is_safe_value(value)
82
+ }
69
83
 
70
84
  // The single gate every argument vector passes before it reaches the operating system, whoever
71
85
  // composed it.
72
86
  function is_safe_argv(argv: LaunchArgv): boolean {
73
- return is_safe_value(argv.command) && argv.args.every((value) => is_safe_value(value))
87
+ return (
88
+ is_safe_value(argv.command) &&
89
+ argv.args.every((value, index) => is_safe_element(argv, value, index))
90
+ )
74
91
  }
75
92
 
76
93
  function note_of(error: unknown): string {
@@ -251,6 +268,7 @@ async function attached_spawn(
251
268
  child.once('exit', (exit_code) => {
252
269
  resolve({ kind: 'completed', pid: child.pid ?? 0, exit_code })
253
270
  })
271
+ launch_priority.lower(child.pid)
254
272
  notify_spawn(child.pid, on_spawn, on_error)
255
273
  })
256
274
  }
@@ -287,6 +305,7 @@ function spawned(
287
305
  on_error(note_of(error))
288
306
  })
289
307
  child.unref()
308
+ launch_priority.lower(child.pid)
290
309
 
291
310
  return child.pid === undefined ? { kind: 'failed', note: NO_PID_NOTE } : launched(child.pid)
292
311
  }
@@ -341,5 +360,5 @@ const detached_launch = {
341
360
  note_of,
342
361
  }
343
362
 
344
- export type { LaunchArgv, LaunchRequest, LaunchResult }
363
+ export type { AttachedLaunchResult, LaunchArgv, LaunchRequest, LaunchResult }
345
364
  export { detached_launch }
@@ -22,6 +22,7 @@ import {
22
22
  } from '#scripts/run/run-stage'
23
23
  import { run_stage_read, type StageRead } from '#scripts/run/run-stage-read'
24
24
  import { run_step } from '#scripts/run/run-step'
25
+ import { run_step_section } from '#scripts/run/run-step-section'
25
26
  import { run_entry, type EntryParts } from './run-entry'
26
27
  import { run_entry_stop } from './run-entry-stop'
27
28
 
@@ -259,7 +260,13 @@ async function proceed(issue_number: string, hold: string, cost: string): Promis
259
260
  // update is measured against (`issue-watch.ts`).
260
261
  await issue_watch.record_baseline_here(issue_number)
261
262
 
262
- return emit({ issue_number, hold, cost, verdict: reads.verdict, report: reads.report })
263
+ const code = emit({ issue_number, hold, cost, verdict: reads.verdict, report: reads.report })
264
+
265
+ // The entry's own read — the split assessment every run answers before its work — printed here so
266
+ // the reader does not spend a turn fetching it.
267
+ if (code !== SUCCESS_EXIT_CODE) return code
268
+
269
+ return run_step_section.print_section(run_step_section.ENTRY)
263
270
  }
264
271
 
265
272
  async function claim_run(
@@ -39,10 +39,6 @@ const TEXT_INDEX = 2
39
39
  const USAGE =
40
40
  'Usage: josh run:event --append <kind> <text> | --from <position> | --follow <position> | --watch [<position>] | --last'
41
41
 
42
- function now_iso(): string {
43
- return new Date().toISOString()
44
- }
45
-
46
42
  function report_usage(): number {
47
43
  process.stderr.write(`${USAGE}\n`)
48
44
 
@@ -54,7 +50,7 @@ async function run_append(kind: string, text: string): Promise<number> {
54
50
 
55
51
  if (target === undefined) return report_usage()
56
52
 
57
- const result = run_event_stream.append(target, kind, text, now_iso())
53
+ const result = await run_event_stream_emit.append_at(target, kind, text, new Date())
58
54
 
59
55
  if (!result.appended) {
60
56
  process.stderr.write(`not a session-facing event kind: ${kind}\n`)
@@ -6,9 +6,9 @@ import {
6
6
  has_label_name,
7
7
  } from '#scripts/issue/issue-labels'
8
8
 
9
- // The text of a `filed` event: the Issue a run filed, its kind, its title, and the child whose work
10
- // turned it up. `issue:file` writes it and `run:board` reads it back, both through this module, so the
11
- // two never spell it differently.
9
+ // The text of a `filed` event: the Issue a run filed, its kind, its title, whether a run's own session
10
+ // filed it, and the child whose work turned it up. `issue:file` writes it and `run:board` reads it
11
+ // back, both through this module, so the two never spell it differently.
12
12
 
13
13
  // The classification labels a filing's kind is read from, in precedence order: a breaking change is
14
14
  // named as one whatever else it is.
@@ -25,13 +25,18 @@ interface Filed {
25
25
  title: string
26
26
  // The lane child that was working when the Issue was filed, when the filing came from one.
27
27
  found_during: string | undefined
28
+ // A run's own session filed it — the parent holding the run's hold or a lane child — rather than one
29
+ // outside the run sharing the repository's stream (joshuafolkken/kit#4099). An event written before
30
+ // the mark was recorded reads as filed outside.
31
+ is_run?: boolean | undefined
28
32
  }
29
33
 
30
34
  // The kind slot is always written, `[<label>]` or `[]`, against the reference with no space: an event
31
35
  // written before the kind always has the space there, so no title, whatever it opens with, reads as a
32
- // kind.
36
+ // kind. The run's mark follows the kind slot, again with no space.
37
+ const RUN_MARK = '[run]'
33
38
  const TEXT_PATTERN = new RegExp(
34
- String.raw`^(?<reference>\S*#\d+)(?:\[(?<kind>${KINDS.join('|')}|)\])? (?<title>.*?)(?: \(found during #(?<during>\d+)\))?$`,
39
+ String.raw`^(?<reference>\S*#\d+)(?:\[(?<kind>${KINDS.join('|')}|)\](?<run>\[run\])?)? (?<title>.*?)(?: \(found during #(?<during>\d+)\))?$`,
35
40
  'u',
36
41
  )
37
42
 
@@ -41,7 +46,7 @@ function kind_of(labels: ReadonlyArray<string>): FiledKind | undefined {
41
46
  }
42
47
 
43
48
  function text_of(filed: Filed): string {
44
- const kind = `[${filed.kind ?? ''}]`
49
+ const kind = `[${filed.kind ?? ''}]${filed.is_run === true ? RUN_MARK : ''}`
45
50
  const suffix =
46
51
  filed.found_during === undefined
47
52
  ? ''
@@ -60,6 +65,7 @@ function parse(text: string): Filed | undefined {
60
65
  kind: KINDS.find((kind) => kind === groups['kind']),
61
66
  title: String(groups['title']),
62
67
  found_during: groups['during'],
68
+ is_run: groups['run'] !== undefined,
63
69
  }
64
70
  }
65
71
 
@@ -1,3 +1,4 @@
1
+ import { MS_PER_MINUTE, MS_PER_SECOND } from '#scripts/lib/timeouts'
1
2
  import type { StreamRead } from './run-event-stream'
2
3
 
3
4
  // The follow read behind `josh run:event --follow` and `--watch`. A reader
@@ -24,10 +25,8 @@ import type { StreamRead } from './run-event-stream'
24
25
  // The follow's quiet-tick cadence and how promptly it notices an arrival. The interval only bounds a
25
26
  // wait that found nothing — an arrival returns within a tick of landing — so it can be as long as the
26
27
  // heartbeat without making an arrival late, and the tick is a cheap `stat` of one file.
27
- const MS_PER_SECOND = 1000
28
- const SECONDS_PER_MINUTE = 60
29
28
  const FOLLOW_INTERVAL_MINUTES = 20
30
- const FOLLOW_INTERVAL_MS = FOLLOW_INTERVAL_MINUTES * SECONDS_PER_MINUTE * MS_PER_SECOND
29
+ const FOLLOW_INTERVAL_MS = FOLLOW_INTERVAL_MINUTES * MS_PER_MINUTE
31
30
  const FOLLOW_TICK_MS = MS_PER_SECOND
32
31
 
33
32
  interface FollowPorts {
@@ -1,3 +1,4 @@
1
+ import { figure_format } from '#scripts/lib/figure-format'
1
2
  import type { EventKind, RunEvent } from './run-event-stream'
2
3
 
3
4
  // One run event as the line a person reads in the watch pane. The pane is a script, not a session, so
@@ -10,8 +11,6 @@ import type { EventKind, RunEvent } from './run-event-stream'
10
11
 
11
12
  const JA = 'ja'
12
13
  const FIELD_SEPARATOR = ' · '
13
- const CLOCK_WIDTH = 2
14
- const CLOCK_PAD = '0'
15
14
 
16
15
  interface KindLabel {
17
16
  ja: string
@@ -29,6 +28,7 @@ const KIND_LABELS: Readonly<Record<EventKind, KindLabel>> = {
29
28
  cut: { ja: 'セッション交代', en: 'session cut' },
30
29
  resume: { ja: '実装を再開', en: 'implementation resumed' },
31
30
  restart: { ja: '止めて出し直し', en: 'restarted' },
31
+ withdraw: { ja: '取り下げ', en: 'withdrawn' },
32
32
  drain: { ja: 'バックログが空', en: 'backlog drained' },
33
33
  stop: { ja: '停止', en: 'stopped' },
34
34
  'pr-opened': { ja: 'PR 作成', en: 'PR opened' },
@@ -47,6 +47,9 @@ const KIND_LABELS: Readonly<Record<EventKind, KindLabel>> = {
47
47
  'lane-limit': { ja: 'レーン上限', en: 'lane limit' },
48
48
  setup: { ja: '準備', en: 'setup' },
49
49
  'pr-checks': { ja: 'PR のチェック', en: 'PR checks' },
50
+ 'idle-notice': { ja: '待機の通知', en: 'idle notice' },
51
+ 'lane-state': { ja: 'レーンの状態', en: 'lane state' },
52
+ 'paused-notice': { ja: '一時停止の通知', en: 'paused notice' },
50
53
  }
51
54
 
52
55
  const LABELS_BY_KIND: ReadonlyMap<string, KindLabel> = new Map(Object.entries(KIND_LABELS))
@@ -59,18 +62,12 @@ function label_of(kind: string, lang: string): string {
59
62
  return lang === JA ? label.ja : label.en
60
63
  }
61
64
 
62
- function two_digits(value: number): string {
63
- return String(value).padStart(CLOCK_WIDTH, CLOCK_PAD)
64
- }
65
-
66
65
  // The local wall-clock `HH:MM` of the event, the reading a person watching a pane compares with the clock
67
66
  // on their screen; an unparseable stamp is shown as written rather than as `NaN:NaN`.
68
67
  function clock_of(at: string): string {
69
- const date = new Date(at)
70
-
71
- if (Number.isNaN(date.getTime())) return at
68
+ const ms = new Date(at).getTime()
72
69
 
73
- return `${two_digits(date.getHours())}:${two_digits(date.getMinutes())}`
70
+ return Number.isNaN(ms) ? at : figure_format.minute_of(ms)
74
71
  }
75
72
 
76
73
  function render(event: RunEvent, lang: string): string {
@@ -94,6 +94,7 @@ const KIND = run_event_stream.EVENT_KIND
94
94
  const BATCH_RECORD_KINDS: ReadonlySet<string> = new Set([
95
95
  KIND.CHILD_LAUNCH,
96
96
  KIND.RESTART,
97
+ KIND.WITHDRAW,
97
98
  KIND.PARK,
98
99
  KIND.SPLIT,
99
100
  KIND.RETROSPECTIVE,
@@ -113,7 +114,7 @@ function is_own_ship_event(event: RunEvent, issue: string): boolean {
113
114
  }
114
115
 
115
116
  // The issue an event's text names, the way every reader here — and `run:board` — keys an event to a child.
116
- function issue_named(event: RunEvent): string | undefined {
117
+ function issue_named(event: Pick<RunEvent, 'text'>): string | undefined {
117
118
  return ISSUE_REFERENCE.exec(event.text)?.[1]
118
119
  }
119
120
 
@@ -167,12 +168,14 @@ function last_issue_event(
167
168
  }
168
169
 
169
170
  // A child's launch and the endings `run:merge` settles it with — the ones `run:board` stops drawing it
170
- // running on. A park or a split already ran `run:merge`, so a child closed after one owes nothing.
171
+ // running on. A park or a split already ran `run:merge`, so a child closed after one owes nothing; a
172
+ // withdrawal settles the child itself, its issue left open for the next run.
171
173
  const LAUNCH_OR_SETTLE_KINDS: ReadonlySet<string> = new Set([
172
174
  KIND.CHILD_LAUNCH,
173
175
  KIND.MERGE,
174
176
  KIND.PARK,
175
177
  KIND.SPLIT,
178
+ KIND.WITHDRAW,
176
179
  ])
177
180
 
178
181
  // Whether this invocation's newest launch of the issue has not yet been settled.
@@ -186,9 +189,24 @@ function is_merge_owed(events: ReadonlyArray<RunEvent>, scope: EventScope, issue
186
189
  return newest?.kind === KIND.CHILD_LAUNCH
187
190
  }
188
191
 
192
+ function is_launch_or_withdrawal(event: RunEvent, issue: string): boolean {
193
+ const is_kind = event.kind === KIND.CHILD_LAUNCH || event.kind === KIND.WITHDRAW
194
+
195
+ return is_kind && names_issue(event, issue)
196
+ }
197
+
198
+ // Whether a person withdrew the issue's newest launch (`lane:withdraw`): its newest launch or withdrawal
199
+ // is a withdrawal. A launch after it is a fresh attempt, which the old withdrawal does not settle.
200
+ function is_withdrawn(events: ReadonlyArray<RunEvent>, issue: string): boolean {
201
+ const newest = events.findLast((event) => is_launch_or_withdrawal(event, issue))
202
+
203
+ return newest?.kind === KIND.WITHDRAW
204
+ }
205
+
189
206
  const run_event_scope = {
190
207
  UNKNOWN_EVENT_SCOPE,
191
208
  is_merge_owed,
209
+ is_withdrawn,
192
210
  issue_named,
193
211
  last_issue_event,
194
212
  last_scoped_event,
@@ -1,7 +1,9 @@
1
+ import { lane_state, type LaneStateRecord } from '#scripts/lane/lane-state'
1
2
  import { error_text } from '#scripts/lib/error-message'
3
+ import { run_board_lane_time } from '#scripts/run/board/run-board-lane-time'
2
4
  import { run_carry } from '#scripts/run/carry/run-carry'
3
5
  import { run_event_scope } from './run-event-scope'
4
- import { run_event_stream, type RunEvent } from './run-event-stream'
6
+ import { run_event_stream, type AppendResult, type RunEvent } from './run-event-stream'
5
7
 
6
8
  // The write side of the run's event stream. It resolves the run's identity and
7
9
  // appends, and it is where the "reporting must not break the work it reports on" contract is kept: every
@@ -27,17 +29,66 @@ async function stream_target(): Promise<string | undefined> {
27
29
  return repository === undefined ? undefined : run_event_stream.target_of(repository)
28
30
  }
29
31
 
32
+ // The child's lane record; an unreadable one reads as none, so the ending is still written.
33
+ async function lane_record(issue: string): Promise<LaneStateRecord | undefined> {
34
+ try {
35
+ return await lane_state.read_state(issue)
36
+ } catch (error) {
37
+ error_text.trace_swallowed('run_event_stream_emit.lane_record', error)
38
+
39
+ return undefined
40
+ }
41
+ }
42
+
43
+ async function ending_fields(
44
+ target: string,
45
+ event: Omit<RunEvent, 'pos'>,
46
+ ): Promise<Pick<RunEvent, 'elapsed_ms'>> {
47
+ const issue = run_event_scope.issue_named(event)
48
+
49
+ if (issue === undefined || !run_board_lane_time.OFF_LANE_KINDS.has(event.kind)) return {}
50
+
51
+ const elapsed_ms = run_board_lane_time.ending_elapsed({
52
+ events: run_event_stream.read_events(target),
53
+ issue: Number(issue),
54
+ record: await lane_record(issue),
55
+ ended_ms: Date.parse(event.at),
56
+ })
57
+
58
+ return elapsed_ms === undefined ? {} : { elapsed_ms }
59
+ }
60
+
61
+ /**
62
+ * Append one event at `at`, an ending with its child's lane time (joshuafolkken/kit#4481). Every writer
63
+ * of an ending — `emit` and `run:event --append` — appends through here, so the time is computed once,
64
+ * as the ending is written, with the board's own count.
65
+ */
66
+ async function append_at(
67
+ target: string,
68
+ kind: string,
69
+ text: string,
70
+ at: Date,
71
+ ): Promise<AppendResult> {
72
+ const event = { kind, text, at: at.toISOString() }
73
+
74
+ return run_event_stream.append_event(target, {
75
+ ...event,
76
+ ...(await ending_fields(target, event)),
77
+ })
78
+ }
79
+
30
80
  /**
31
81
  * Append one session-facing event, best-effort. A kind outside the enumeration is refused by `append`;
32
82
  * every error is swallowed, because the reporting path must never fail the work it reports on.
83
+ * `at` is the caller's instant where another record must carry the same one.
33
84
  */
34
- async function emit(kind: string, text: string): Promise<void> {
85
+ async function emit(kind: string, text: string, at: Date = new Date()): Promise<void> {
35
86
  try {
36
87
  const target = await stream_target()
37
88
 
38
89
  if (target === undefined) return
39
90
 
40
- run_event_stream.append(target, kind, text, now_iso())
91
+ await append_at(target, kind, text, at)
41
92
  } catch {
42
93
  // Reporting is best-effort: a failed append is dropped rather than raised into the caller's work.
43
94
  }
@@ -85,37 +136,51 @@ function invocation_events(repository: string, target: string): ReadonlyArray<Ru
85
136
  * Append one event unless this kind is already on the stream since the newest `reset_kind` — the
86
137
  * episode marker for a condition that holds across other events. `emit_once`'s newest-event test would
87
138
  * re-fire each time a parallel lane appended a merge or a park; this ends the episode only at
88
- * `reset_kind`. Returns whether it appended, as `emit_once` does.
139
+ * `reset_kind`. The text is composed only once the episode is new, so a caller polled every pass whose
140
+ * text costs a network read pays it once. Returns the appended text, or `undefined` when nothing was.
89
141
  */
90
- async function emit_once_since(kind: string, text: string, reset_kind: string): Promise<boolean> {
142
+ async function emit_once_since_with(
143
+ kind: string,
144
+ reset_kind: string,
145
+ compose: () => Promise<string>,
146
+ ): Promise<string | undefined> {
91
147
  try {
92
148
  const repository = await run_carry.repository_directory()
93
149
 
94
- if (repository === undefined) return false
150
+ if (repository === undefined) return undefined
95
151
 
96
152
  const target = run_event_stream.target_of(repository)
97
153
 
98
154
  if (run_event_stream.has_since(invocation_events(repository, target), kind, reset_kind)) {
99
- return false
155
+ return undefined
100
156
  }
101
157
 
102
- return run_event_stream.append(target, kind, text, now_iso()).appended
158
+ const text = await compose()
159
+
160
+ return run_event_stream.append(target, kind, text, now_iso()).appended ? text : undefined
103
161
  } catch (error) {
104
162
  // Best-effort: a failed append is dropped rather than raised into the caller's work.
105
163
  error_text.trace_swallowed('run_event_stream_emit.emit_once_since', error)
106
164
 
107
- return false
165
+ return undefined
108
166
  }
109
167
  }
110
168
 
169
+ // `emit_once_since_with` for a text already in hand. Returns whether it appended, as `emit_once` does.
170
+ async function emit_once_since(kind: string, text: string, reset_kind: string): Promise<boolean> {
171
+ const appended = await emit_once_since_with(kind, reset_kind, async () => text)
172
+
173
+ return appended !== undefined
174
+ }
175
+
111
176
  // One progress heartbeat line onto the stream, so a relay reaches it across a cut.
112
177
  async function emit_heartbeat(line: string): Promise<void> {
113
178
  await emit(run_event_stream.EVENT_KIND.HEARTBEAT, line)
114
179
  }
115
180
 
116
181
  // The events of the invocation now running, for a reader restoring the run from its stream
117
- // (`backlog:drive`). Fail-quiet like the writers: no repository or an unreadable stream is an empty
118
- // invocation.
182
+ // (`backlog:drive`). Fail-quiet like the writers: no repository, an unreadable stream or an
183
+ // undetermined scope is an empty invocation.
119
184
  async function current_events(): Promise<ReadonlyArray<RunEvent>> {
120
185
  try {
121
186
  const repository = await run_carry.repository_directory()
@@ -161,11 +226,13 @@ async function all_events(): Promise<ReadonlyArray<RunEvent>> {
161
226
 
162
227
  const run_event_stream_emit = {
163
228
  all_events,
229
+ append_at,
164
230
  current_events,
165
231
  emit,
166
232
  emit_heartbeat,
167
233
  emit_once,
168
234
  emit_once_since,
235
+ emit_once_since_with,
169
236
  invocation_or_all_events,
170
237
  stream_target,
171
238
  }
@@ -29,10 +29,11 @@ const EVENT_PREFIX = 'josh-run-events-'
29
29
  // every reader — a person, an editor — that it is a line stream rather than a single document, the same
30
30
  // distinction the ambient `.log` draws.
31
31
  const EVENT_SUFFIX = '.jsonl'
32
- // A run's session-facing events over one unattended night: a plan, a launch/PR/review-round/merge
33
- // per child across a few dozen children, plus parks, cuts and stops. Five hundred keeps the whole of a
34
- // large `backlogrun` and still bounds an unattended run — past it the oldest events roll off.
35
- const EVENT_CAP = 500
32
+ // A week of a busy run's events, so `josh lane:stats --period 7` reads the parks that end a stop's wait
33
+ // and `run:board` keeps every ship stage (joshuafolkken/kit#3997). A four-lane `backlogrun` wrote about
34
+ // 75 events an hour (1,877 in 25 hours), so fifteen thousand holds about eight days at that rate and
35
+ // still bounds the file to a few megabytes — past it the oldest events roll off.
36
+ const EVENT_CAP = 15_000
36
37
  const FIRST_POSITION = 0
37
38
  const POSITION_INCREMENT = 1
38
39
  const LINE_SEPARATOR = '\n'
@@ -64,6 +65,10 @@ const EVENT_KIND = {
64
65
  // (`lane:restart`). It follows the fresh dispatch's `CHILD_LAUNCH`, so it is a launch to the parent and
65
66
  // the board, and — like that launch — a batch record a lane child never reads as its own position.
66
67
  RESTART: 'restart',
68
+ // A person withdrew a lane child — stopped it and left its issue open for the next run (`lane:withdraw`).
69
+ // It is written before the stop, so `run:merge` settles the child as withdrawn whatever GitHub says
70
+ // by the time the parent collects it, and counts it as neither a merge, a failure nor an outage.
71
+ WITHDRAW: 'withdraw',
67
72
  // The backlog emptied while nothing of the run's own was in flight — the drain. It marks the position
68
73
  // at which the end-of-run retrospective is owed, *before* the idle watch opens, so `run:step` fires
69
74
  // the retrospective at the drain rather than after the watch runs its course. It is not itself a
@@ -139,6 +144,19 @@ const EVENT_KIND = {
139
144
  // in followup without asking GitHub (joshuafolkken/kit#3770). A trace: it says how the checks stand,
140
145
  // not where the run is.
141
146
  PR_CHECKS: 'pr-checks',
147
+ // `backlog:drive` reached a watch with no child running and nothing to dispatch — the point a person's
148
+ // hand is wanted. Emitted once per idle episode (`emit_once_since_with`, reset by `CHILD_LAUNCH`), it
149
+ // is the dedup marker for the one idle Telegram. A trace: a drain's retrospective is read off the
150
+ // position beneath it, so the marker must not stand over it.
151
+ IDLE_NOTICE: 'idle-notice',
152
+ // A person paused or resumed a lane child (`lane:pause` / `lane:resume`), so who halted a lane and
153
+ // when is on the stream rather than only in a shell history (joshuafolkken/kit#4268). A trace: it
154
+ // says what a lane's processes were told, not where the run is.
155
+ LANE_STATE: 'lane-state',
156
+ // `backlog:drive` found nothing of the run in flight and only paused lanes left, paused past the
157
+ // silent window (joshuafolkken/kit#4270). Emitted once per pause episode (`emit_once_since_with`,
158
+ // reset by `LANE_STATE`), it is the dedup marker for the one paused-lane Telegram. A trace.
159
+ PAUSED_NOTICE: 'paused-notice',
142
160
  } as const
143
161
 
144
162
  type EventKind = (typeof EVENT_KIND)[keyof typeof EVENT_KIND]
@@ -158,6 +176,9 @@ const TRACE_KINDS: ReadonlySet<string> = new Set([
158
176
  EVENT_KIND.LANE_LIMIT,
159
177
  EVENT_KIND.SETUP,
160
178
  EVENT_KIND.PR_CHECKS,
179
+ EVENT_KIND.IDLE_NOTICE,
180
+ EVENT_KIND.LANE_STATE,
181
+ EVENT_KIND.PAUSED_NOTICE,
161
182
  ])
162
183
 
163
184
  // The trace kinds that say only that the run was alive, so the bound rolls them off first. A `filed` or
@@ -177,6 +198,9 @@ const event_schema = z.object({
177
198
  at: z.string(),
178
199
  kind: z.string(),
179
200
  text: z.string(),
201
+ // The child's time on a lane, recorded once by the writer of an ending (joshuafolkken/kit#4481), so a
202
+ // reader never has to find its launch again. An event written before it has none.
203
+ elapsed_ms: z.number().optional(),
180
204
  })
181
205
 
182
206
  type RunEvent = z.infer<typeof event_schema>
@@ -342,12 +366,12 @@ function append_held(target: string, event: Omit<RunEvent, 'pos'>): number {
342
366
  * unlocked read-then-rewrite would lose one writer's event to another's. A lock still
343
367
  * held after the wait is reported on stderr and thrown, which the best-effort emit side swallows.
344
368
  */
345
- function append(target: string, kind: string, text: string, at: string): AppendResult {
346
- if (!is_event_kind(kind)) return { appended: false, position: FIRST_POSITION }
369
+ function append_event(target: string, event: Omit<RunEvent, 'pos'>): AppendResult {
370
+ if (!is_event_kind(event.kind)) return { appended: false, position: FIRST_POSITION }
347
371
 
348
372
  const lock = `${target}${LOCK_SUFFIX}`
349
373
  const position = repository_lock.with_lock_sync(
350
- () => append_held(target, { at, kind, text }),
374
+ () => append_held(target, event),
351
375
  lock,
352
376
  LOCK_WAIT_MS,
353
377
  )
@@ -362,6 +386,11 @@ function append(target: string, kind: string, text: string, at: string): AppendR
362
386
  return { appended: true, position }
363
387
  }
364
388
 
389
+ // `append_event` for an event that records nothing beyond its kind, text and instant.
390
+ function append(target: string, kind: string, text: string, at: string): AppendResult {
391
+ return append_event(target, { at, kind, text })
392
+ }
393
+
365
394
  /**
366
395
  * Every event after `position`, in order, and the position a reader passes back next time.
367
396
  *
@@ -411,6 +440,7 @@ const run_event_stream = {
411
440
  EVENT_KINDS,
412
441
  TRACE_KINDS,
413
442
  append,
443
+ append_event,
414
444
  format_event,
415
445
  has_since,
416
446
  is_stage_start,