@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
@@ -0,0 +1,60 @@
1
+ // The text an agent launch may carry: a model id, an effort and a prompt, refused when empty, over
2
+ // length or carrying a control character, so nothing a value holds can inject a further argument.
3
+
4
+ const FIRST_PRINTABLE_CODE = 0x20
5
+ const DELETE_CODE = 0x7f
6
+ const FIRST_CODE_POINT = 0
7
+ const EMPTY_LENGTH = 0
8
+ const MAX_VALUE_LENGTH = 4096
9
+ const LINE_FEED = '\n'
10
+ const SPACE = ' '
11
+
12
+ function is_control_character(character: string): boolean {
13
+ const code = character.codePointAt(FIRST_CODE_POINT) ?? FIRST_PRINTABLE_CODE
14
+
15
+ return code < FIRST_PRINTABLE_CODE || code === DELETE_CODE
16
+ }
17
+
18
+ function is_line_feed(character: string): boolean {
19
+ return character === LINE_FEED
20
+ }
21
+
22
+ function is_never_allowed(): boolean {
23
+ return false
24
+ }
25
+
26
+ function is_refused(character: string, is_allowed: (character: string) => boolean): boolean {
27
+ return is_control_character(character) && !is_allowed(character)
28
+ }
29
+
30
+ function is_safe_text(value: string, is_allowed: (character: string) => boolean): boolean {
31
+ if (value.length === EMPTY_LENGTH || value.length > MAX_VALUE_LENGTH) return false
32
+
33
+ for (const character of value) if (is_refused(character, is_allowed)) return false
34
+
35
+ return true
36
+ }
37
+
38
+ function is_safe_value(value: string): boolean {
39
+ return is_safe_text(value, is_never_allowed)
40
+ }
41
+
42
+ // **An agent's prompt is the one value a line break belongs in.** A ship-stop prompt carries the failed
43
+ // output's lines (joshuafolkken/kit#3964); every other control character is refused as in any value.
44
+ function is_safe_prompt(value: string): boolean {
45
+ return is_safe_text(value, is_line_feed)
46
+ }
47
+
48
+ function printable_character(character: string): string {
49
+ return is_refused(character, is_line_feed) ? SPACE : character
50
+ }
51
+
52
+ // Command output made fit for a prompt: every control character but a line break becomes a space, so
53
+ // the text passes `is_safe_prompt` whatever the command printed.
54
+ function printable(text: string): string {
55
+ return Array.from(text, printable_character).join('')
56
+ }
57
+
58
+ const agent_safe_text = { MAX_VALUE_LENGTH, is_safe_prompt, is_safe_value, printable }
59
+
60
+ export { agent_safe_text }
@@ -0,0 +1,41 @@
1
+ import { agent_exit_record } from './agent-exit-record'
2
+ import type { ClaudeResultEvent } from './claude-result-event'
3
+
4
+ // Whether a Claude session's exit record is an authentication failure — measured on 2026-10-19, when
5
+ // an expired OAuth session ended three lane children with `Failed to authenticate: OAuth session
6
+ // expired and could not be refreshed` and the parent parked each as a child that stopped on its own
7
+ // (joshuafolkken/kit#4216).
8
+ //
9
+ // **Kept apart from `api-outage.ts`**: an outage clears on its own, so its child is re-dispatched; an
10
+ // authentication failure lasts until a person runs `/login`, so every dispatch fails the same way and
11
+ // the run has to stop instead. The read is the same mechanical one — the error flag AND a fixed
12
+ // marker in the harness's own `reason`, never the marker alone.
13
+
14
+ // Matched against `reason`, which carries the record's `result` text — the observed record's
15
+ // `error: 'authentication_failed'` code is not decoded, so it is no marker here.
16
+ const AUTH_MARKERS: ReadonlyArray<string> = ['failed to authenticate']
17
+
18
+ // The fixed sentence a stop caused by an authentication failure carries, so the tooling that reads a
19
+ // stop back (`run-ship-stop-cause.ts`) tells it from a review finding by this text, not by guessing.
20
+ const AUTH_FAILURE_NOTE = 'the session could not authenticate — a person has to run /login'
21
+
22
+ function is_auth_failure(record: ClaudeResultEvent | undefined): boolean {
23
+ if (record === undefined || !record.is_error || record.reason === undefined) return false
24
+
25
+ const lower = record.reason.toLowerCase()
26
+
27
+ return AUTH_MARKERS.some((marker) => lower.includes(marker))
28
+ }
29
+
30
+ // The same read over a whole stream-json transcript, such as a reviewer's log: its last exit record.
31
+ // The log is appended across launches, so it is read only when it ends on an exit record: a later
32
+ // session that died before writing its own leaves an earlier session's record behind it — not read.
33
+ function is_auth_failed_transcript(transcript: string | undefined): boolean {
34
+ if (transcript === undefined || !agent_exit_record.ends_on_exit_record(transcript)) return false
35
+
36
+ return is_auth_failure(agent_exit_record.read_exit_record(transcript))
37
+ }
38
+
39
+ const api_auth = { AUTH_FAILURE_NOTE, is_auth_failed_transcript, is_auth_failure }
40
+
41
+ export { api_auth }
@@ -4,7 +4,7 @@ import type { ClaudeResultEvent } from './claude-result-event'
4
4
  // stopped mid-implementation on its own. Measured twice: on 2026-09-15 four
5
5
  // children ended `The socket connection was closed unexpectedly`, and on 2026-09-21 a child spent all
6
6
  // ten connection retries on `Unable to connect to API (ConnectionRefused)`. The parent read both as
7
- // ordinary failures — `in-progress` stripped, `needs-decision` applied, counted against the
7
+ // ordinary failures — `in-progress` stripped, a park label applied, counted against the
8
8
  // consecutive-failure guard — when the child never reached the API at all.
9
9
  //
10
10
  // **The read is mechanical, never a similarity judgement.** A terminal `result` event that ends in
@@ -6,6 +6,7 @@ import {
6
6
  type AgentProfile,
7
7
  type AgentRole,
8
8
  } from './agent-role-profile'
9
+ import { lane_instructions } from './lane-instructions'
9
10
 
10
11
  const AGENT_COMMAND = 'claude'
11
12
  // **The permission mode is passed, not left to the checkout's `.claude/settings.json`.** Claude Code
@@ -63,6 +64,7 @@ const PROJECT_MCP_FILE = '.mcp.json'
63
64
  interface ClaudeArgv {
64
65
  command: string
65
66
  args: ReadonlyArray<string>
67
+ ends_with_prompt: true
66
68
  }
67
69
 
68
70
  type ClaudeArgvResult =
@@ -87,6 +89,14 @@ function tool_flags(cwd: string = process.cwd()): ReadonlyArray<string> {
87
89
  return [TOOLS_FLAG, LAUNCHED_TOOLS.join(','), ...mcp_flags]
88
90
  }
89
91
 
92
+ // **A lane child and a review session start from the lane instruction set** (`lane-instructions.ts`);
93
+ // the scheduler keeps `CLAUDE.md`, because it is the one that stops and asks a person.
94
+ function instruction_flags(profile: AgentProfile, cwd?: string): ReadonlyArray<string> {
95
+ if (profile.role === agent_role_profile.SCHEDULER) return []
96
+
97
+ return lane_instructions.flags(cwd)
98
+ }
99
+
90
100
  function build(
91
101
  invocation: string,
92
102
  profile: AgentProfile,
@@ -98,6 +108,7 @@ function build(
98
108
  args: [
99
109
  ...AGENT_FLAGS,
100
110
  ...tool_flags(cwd),
111
+ ...instruction_flags(profile, cwd),
101
112
  ...session_id_flags(session_id),
102
113
  MODEL_FLAG,
103
114
  profile.model,
@@ -105,6 +116,7 @@ function build(
105
116
  profile.effort,
106
117
  invocation,
107
118
  ],
119
+ ends_with_prompt: true,
108
120
  }
109
121
  }
110
122
 
@@ -121,6 +133,7 @@ function build_resume(
121
133
  args: [
122
134
  ...AGENT_FLAGS,
123
135
  ...tool_flags(cwd),
136
+ ...instruction_flags(profile, cwd),
124
137
  RESUME_FLAG,
125
138
  session_id,
126
139
  MODEL_FLAG,
@@ -129,6 +142,7 @@ function build_resume(
129
142
  profile.effort,
130
143
  invocation,
131
144
  ],
145
+ ends_with_prompt: true,
132
146
  }
133
147
  }
134
148
 
@@ -19,6 +19,7 @@ const LEDGER_DIRECTORY = path.dirname(OBSERVATION_LEDGER_DIRECTORY)
19
19
  interface CodexArgv {
20
20
  command: string
21
21
  args: ReadonlyArray<string>
22
+ ends_with_prompt: true
22
23
  }
23
24
 
24
25
  function effort_config(profile: AgentProfile): string {
@@ -91,6 +92,7 @@ function build(invocation: string, profile: AgentProfile, cwd?: string): CodexAr
91
92
  JSON_FLAG,
92
93
  invocation,
93
94
  ],
95
+ ends_with_prompt: true,
94
96
  }
95
97
  }
96
98
 
@@ -0,0 +1,144 @@
1
+ import path from 'node:path'
2
+ import { fileURLToPath } from 'node:url'
3
+ import { cost_tokens } from '#scripts/cost-runtime/cost-tokens'
4
+ import { document_section } from '#scripts/document/document-section'
5
+ import { distributed_paths } from '#scripts/init/distributed-paths'
6
+ import { find_package_directory } from '#scripts/josh/package-directory'
7
+ import { stamp_file } from '#scripts/josh/stamp-file'
8
+
9
+ interface LaneSet {
10
+ text: string
11
+ rules_path: string
12
+ }
13
+
14
+ // **A headless lane child or review session starts from the lane instruction set, not `CLAUDE.md`.**
15
+ // `CLAUDE.md` carries rules only an interactive session can act on — consultation versus execution,
16
+ // explicit workflow invocation, stop notifications — and every request re-reads it. The lane document
17
+ // names the rules a lane does need by `CLAUDE.md` heading or bold label, and each `include` line is
18
+ // expanded from the launch checkout's own `CLAUDE.md` here, so the rule text keeps one source (#3929).
19
+ const LANE_DOCUMENT = 'prompts/collaboration-workflow/lane-instructions.md'
20
+ const RULES_FILE = 'CLAUDE.md'
21
+ // `AGENTS.md` only points at `CLAUDE.md`, and Claude Code loads it once `CLAUDE.md` is excluded.
22
+ const POINTER_FILE = 'AGENTS.md'
23
+ const INCLUDE_PATTERN = /^<!-- include: CLAUDE\.md → "(?<wanted>.+)" -->$/u
24
+ const PROMPT_FILE_FLAG = '--append-system-prompt-file'
25
+ const SETTINGS_FLAG = '--settings'
26
+ const PROMPT_FILE_PREFIX = 'josh-lane-instructions-'
27
+ const PROMPT_FILE_SUFFIX = '.md'
28
+ const PACKAGE_DIRECTORY = find_package_directory(path.dirname(fileURLToPath(import.meta.url)))
29
+
30
+ // An include that resolves to nothing is `undefined`, never an empty string, so a renamed heading
31
+ // fails the whole composition rather than silently dropping a rule.
32
+ function expand_line(line: string, rules: string): string | undefined {
33
+ const wanted = INCLUDE_PATTERN.exec(line)?.groups?.['wanted']
34
+
35
+ if (wanted === undefined) return line
36
+
37
+ return document_section.section(rules, wanted)?.text
38
+ }
39
+
40
+ function compose(lane_markdown: string, rules: string): string | undefined {
41
+ const expanded = lane_markdown.split('\n').map((line) => expand_line(line, rules))
42
+
43
+ if (expanded.includes(undefined)) return undefined
44
+
45
+ return expanded.join('\n')
46
+ }
47
+
48
+ // **Where the rules are: the checkout's `CLAUDE.md`, else the package copy it imports.** kit and a
49
+ // consumer holding a full copy keep them in `CLAUDE.md`; a consumer written by `josh init` imports
50
+ // them from the package, and its own `CLAUDE.md` — the bootstrap note and the project's additions —
51
+ // stays loaded, because only the file the set was composed from is excluded.
52
+ function rules_sources(cwd: string): ReadonlyArray<string> {
53
+ const imported = distributed_paths.CLAUDE_MD_IMPORT_LINE.replace(/^@/u, '')
54
+
55
+ return [path.join(cwd, RULES_FILE), path.join(cwd, imported)]
56
+ }
57
+
58
+ function composed_from(lane_markdown: string, rules_path: string): string | undefined {
59
+ const rules = document_section.read_optional(rules_path)
60
+
61
+ return rules === undefined ? undefined : compose(lane_markdown, rules)
62
+ }
63
+
64
+ function composed_set(cwd: string, package_directory: string): LaneSet | undefined {
65
+ const lane_markdown = document_section.read_optional(path.join(package_directory, LANE_DOCUMENT))
66
+
67
+ if (lane_markdown === undefined) return undefined
68
+
69
+ for (const rules_path of rules_sources(cwd)) {
70
+ const text = composed_from(lane_markdown, rules_path)
71
+
72
+ if (text !== undefined) return { text, rules_path }
73
+ }
74
+
75
+ return undefined
76
+ }
77
+
78
+ function composed_in(
79
+ cwd: string,
80
+ package_directory: string = PACKAGE_DIRECTORY,
81
+ ): string | undefined {
82
+ return composed_set(cwd, package_directory)?.text
83
+ }
84
+
85
+ // Named by its content and this account, so concurrent launches of the same text share one file and a
86
+ // changed `CLAUDE.md` never reuses a stale one. The name is predictable in a temp directory other
87
+ // accounts may write to, so an existing file is reused only when it is this account's own regular file
88
+ // holding exactly this text; anything else is replaced through `stamp_file`, which refuses another
89
+ // account's file and renames a new one into place whole. A file rather than the text itself, because
90
+ // the launcher refuses a line break in any argv element but the prompt.
91
+ function written(text: string): string | undefined {
92
+ const file_path = stamp_file.stamp_path(PROMPT_FILE_PREFIX, text, PROMPT_FILE_SUFFIX)
93
+
94
+ if (stamp_file.read_stamp_text(file_path) === text) return file_path
95
+
96
+ try {
97
+ return stamp_file.replace_text_stamp(file_path, text)
98
+ } catch {
99
+ return undefined
100
+ }
101
+ }
102
+
103
+ function excluded_settings(rules_path: string, cwd: string): string {
104
+ return JSON.stringify({ claudeMdExcludes: [rules_path, path.join(cwd, POINTER_FILE)] })
105
+ }
106
+
107
+ // No flags when the set cannot be composed or safely written: the child then loads `CLAUDE.md` as
108
+ // before, which costs tokens but never loses a rule.
109
+ function flags(cwd: string = process.cwd()): ReadonlyArray<string> {
110
+ const set = composed_set(cwd, PACKAGE_DIRECTORY)
111
+ const prompt_file = set === undefined ? undefined : written(set.text)
112
+
113
+ if (set === undefined || prompt_file === undefined) return []
114
+
115
+ return [PROMPT_FILE_FLAG, prompt_file, SETTINGS_FLAG, excluded_settings(set.rules_path, cwd)]
116
+ }
117
+
118
+ function tokens_of(text: string): string {
119
+ return cost_tokens.estimate(text).toLocaleString('en-US')
120
+ }
121
+
122
+ // `read:set lane-child`'s resident line: what each lane request carries in place of the rules file.
123
+ function rules_tokens(rules_path: string): string {
124
+ return tokens_of(document_section.read_optional(rules_path) ?? '')
125
+ }
126
+
127
+ function resident_line(cwd: string = process.cwd()): string {
128
+ const set = composed_set(cwd, PACKAGE_DIRECTORY)
129
+ const rules = rules_tokens(set?.rules_path ?? path.join(cwd, RULES_FILE))
130
+ const lane_tokens = set === undefined ? 'not composed' : `${tokens_of(set.text)} tok`
131
+
132
+ return ` resident: lane instructions ${lane_tokens} in place of ${RULES_FILE} ${rules} tok`
133
+ }
134
+
135
+ const lane_instructions = {
136
+ PROMPT_FILE_FLAG,
137
+ SETTINGS_FLAG,
138
+ compose,
139
+ composed_in,
140
+ flags,
141
+ resident_line,
142
+ }
143
+
144
+ export { lane_instructions }
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env tsx
2
- import { fileURLToPath } from 'node:url'
3
1
  import { epic_bundle_gaps } from '#scripts/epic/epic-bundle-gaps'
4
2
  import { epic_index, type FetchedEpics } from '#scripts/epic/epic-index'
5
3
  import { epic_issue } from '#scripts/epic/epic-issue'
@@ -10,6 +8,8 @@ import { cutoff_cause, cutoff_of, type ScanCutoff } from '#scripts/git/listing-c
10
8
  import { read_json_listing } from '#scripts/git/parse-json-array'
11
9
  import { git_next_issues } from '#scripts/issue/git-next-issues'
12
10
  import { AUTO_OK_LABEL } from '#scripts/issue/issue-labels'
11
+ import { issue_not_before } from '#scripts/issue/issue-not-before'
12
+ import { issue_sample_gate } from '#scripts/issue/issue-sample-gate'
13
13
  import { session_cite } from '#scripts/issue/session-cite'
14
14
 
15
15
  // `josh auto-ok:next` — which issue outside the epic an unattended run picks up next.
@@ -20,7 +20,6 @@ import { session_cite } from '#scripts/issue/session-cite'
20
20
  // nothing checks it. The contract is `epic:next`'s: one token on standard output, every explanation
21
21
  // on standard error, so `answer=$(pnpm josh auto-ok:next)` reads it.
22
22
 
23
- const ARGV_OFFSET = 2
24
23
  const SUCCESS_EXIT_CODE = 0
25
24
  const FAILURE_EXIT_CODE = 1
26
25
  const EXCLUDE_FLAG = '--exclude'
@@ -210,7 +209,11 @@ async function fetch_opted_in(): Promise<OptedInRead> {
210
209
  LISTING_LIMIT,
211
210
  )
212
211
 
213
- return json === undefined ? await classify_failed_read() : parse_listing(json, is_capped)
212
+ const read = json === undefined ? await classify_failed_read() : parse_listing(json, is_capped)
213
+
214
+ if (read.kind === 'read') await issue_sample_gate.prime(read.issues.map((issue) => issue.body))
215
+
216
+ return read
214
217
  }
215
218
 
216
219
  // Whether every issue this one declares as a blocker has closed. `blockedBy` is the same native
@@ -331,10 +334,15 @@ function is_runnable(
331
334
  issue: OpenIssueData,
332
335
  tracked: ReadonlyMap<number, number>,
333
336
  exclude: ReadonlyArray<number>,
337
+ now: number = Date.now(),
334
338
  ): boolean {
335
339
  if (tracked.has(issue.number)) return false
336
340
 
337
- return is_unblocked(issue) && !exclude.includes(issue.number)
341
+ return (
342
+ is_unblocked(issue) &&
343
+ !exclude.includes(issue.number) &&
344
+ issue_not_before.is_due(issue.body, now)
345
+ )
338
346
  }
339
347
 
340
348
  function pick_next(
@@ -351,7 +359,7 @@ function pick_next(
351
359
  function none_reason(count: number): string {
352
360
  if (count === 0) return NONE_OPTED_IN_MESSAGE
353
361
 
354
- return `All ${String(count)} open \`${AUTO_OK_LABEL}\` issue(s) are excluded — tracked by an opted-in epic, an epic itself, already in progress, parked, blocked by an open issue, or the one just merged.`
362
+ return `All ${String(count)} open \`${AUTO_OK_LABEL}\` issue(s) are excluded — tracked by an opted-in epic, an epic itself, already in progress, parked, blocked by an open issue, not due until its start time, or the one just merged.`
355
363
  }
356
364
 
357
365
  // Said only when the cap actually bit, and worded from the answer rather than before it: the one run
@@ -457,14 +465,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
457
465
  return await answer(read, options.exclude)
458
466
  }
459
467
 
460
- // `process.exitCode` rather than `process.exit()`: the answer is written with `console.info`, and on
461
- // macOS a write to a pipe is asynchronous — `process.exit()` can tear the process down before it has
462
- // drained, and this command's whole contract is `answer=$(pnpm josh auto-ok:next)`. The same shape
463
- // is already in `scripts/cost-runtime/cost-cli.ts`, which met the truncation first.
464
- async function main(argv: ReadonlyArray<string>): Promise<void> {
465
- process.exitCode = await run(argv)
466
- }
467
-
468
468
  const auto_ok_cli = {
469
469
  USAGE,
470
470
  NONE_TOKEN,
@@ -486,7 +486,5 @@ const auto_ok_cli = {
486
486
  run,
487
487
  }
488
488
 
489
- if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
490
-
491
489
  export { auto_ok_cli }
492
490
  export type { NextOptions, OptedInRead, PickupContext, TrackingRead }
@@ -1,3 +1,4 @@
1
+ import { gh_author_association } from '#scripts/gh/gh-author-association'
1
2
  import { git_gh_command } from '#scripts/gh/git-gh-command'
2
3
  import { issue_label_schema } from '#scripts/git/git-schemas'
3
4
  import { read_json_listing } from '#scripts/git/parse-json-array'
@@ -25,6 +26,8 @@ const row_schema = z.looseObject({
25
26
  body: z.string().nullish(),
26
27
  labels: z.array(issue_label_schema),
27
28
  updatedAt: z.string(),
29
+ author_association: z.string().nullish(),
30
+ user: z.looseObject({ login: z.string() }).nullish(),
28
31
  })
29
32
 
30
33
  interface JudgeRow extends JudgeIssue {
@@ -35,13 +38,17 @@ interface JudgeRow extends JudgeIssue {
35
38
  // An issue's number to the `updatedAt` it was last seen judged at.
36
39
  type JudgedCache = Map<number, string>
37
40
 
38
- function to_row(raw: z.infer<typeof row_schema>): JudgeRow {
41
+ async function to_row(raw: z.infer<typeof row_schema>): Promise<JudgeRow> {
39
42
  return {
40
43
  number: raw.number,
41
44
  title: raw.title,
42
45
  body: raw.body ?? '',
43
46
  labels: raw.labels.map((label) => label.name),
44
47
  updated_at: raw.updatedAt,
48
+ is_trusted: await gh_author_association.is_trusted({
49
+ login: raw.user?.login,
50
+ association: raw.author_association,
51
+ }),
45
52
  }
46
53
  }
47
54
 
@@ -55,7 +62,9 @@ async function read_candidates(): Promise<ReadonlyArray<JudgeRow> | undefined> {
55
62
 
56
63
  if (listing.kind !== 'read') return undefined
57
64
 
58
- return listing.rows.map((raw) => to_row(raw)).filter((row) => auto_ok_judge.is_candidate(row))
65
+ const rows = await Promise.all(listing.rows.map(async (raw) => await to_row(raw)))
66
+
67
+ return rows.filter((row) => auto_ok_judge.is_candidate(row))
59
68
  }
60
69
 
61
70
  // `true` only for an issue known to owe a judgement: a failed comment read learns nothing, so it is
@@ -63,7 +72,7 @@ async function read_candidates(): Promise<ReadonlyArray<JudgeRow> | undefined> {
63
72
  async function owes_judgement(row: JudgeRow, cache: JudgedCache): Promise<boolean> {
64
73
  if (cache.get(row.number) === row.updated_at) return false
65
74
 
66
- const comments = issue_watch_diff.parse_comments(
75
+ const comments = await issue_watch_diff.parse_comments(
67
76
  await git_gh_command.issue_list_comments(String(row.number)),
68
77
  )
69
78
 
@@ -2,11 +2,8 @@ import { git_gh_command } from '#scripts/gh/git-gh-command'
2
2
  import { issue_label_schema } from '#scripts/git/git-schemas'
3
3
  import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
4
4
  import { issue_auto_ok, type AutoOkDecision } from '#scripts/issue/issue-auto-ok'
5
- import { issue_cite } from '#scripts/issue/issue-cite'
6
- import { AUTO_OK_LABEL } from '#scripts/issue/issue-labels'
5
+ import { AUTO_OK_LABEL, has_label_name } from '#scripts/issue/issue-labels'
7
6
  import { session_cite } from '#scripts/issue/session-cite'
8
- import { run_event_stream } from '#scripts/run/event/run-event-stream'
9
- import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
10
7
  import { z } from 'zod'
11
8
  import { auto_ok_judge } from './auto-ok-judge'
12
9
 
@@ -14,17 +11,30 @@ import { auto_ok_judge } from './auto-ok-judge'
14
11
  //
15
12
  // **An applied judgement still passes the mechanical exclusions** — `issue_auto_ok.exclusion_of` is
16
13
  // re-read against the labels as they stand, so a label added since the listing refuses the write
17
- // rather than racing it. **The run label lands before `auto-ok`**, so the pool never holds an opted-in
18
- // issue that `backlog:next` would withhold as untriaged. Both answers leave the judgement comment the
19
- // next listing reads as the record, and an applied one is a `note` on the board's 📌.
14
+ // rather than racing it. **The judgement comment lands before the labels**: a re-run skips an issue
15
+ // that already carries `auto-ok`, so a comment failing after the labels would never be retried, while
16
+ // a label failing after the comment leaves `auto-ok` off and the issue open to an explicit
17
+ // `--apply <N>` — the refusal names it, since the listing reads the comment as judged. **The
18
+ // run label lands before `auto-ok`**, so the pool never holds an opted-in issue that `backlog:next`
19
+ // would withhold as untriaged. Both answers leave the judgement comment the next listing reads as the
20
+ // record; an applied one writes nothing to the run board, which shows the issue once it is dispatched
21
+ // (joshuafolkken/kit#4133).
20
22
 
21
23
  const SUCCESS_EXIT_CODE = 0
22
24
  const FAILURE_EXIT_CODE = 1
23
25
  const UNREADABLE = 'the issue could not be read'
26
+ const CLOSED_STATE = 'CLOSED'
27
+ // The judgement comment is already posted, so the listing will not offer the issue again.
28
+ const RETRY_HINT = 're-run `pnpm josh auto-ok:judge --apply <N>` to finish it'
24
29
 
25
- const issue_schema = z.object({ labels: z.array(issue_label_schema), body: z.string().nullish() })
30
+ const issue_schema = z.object({
31
+ state: z.string().nullish(),
32
+ labels: z.array(issue_label_schema),
33
+ body: z.string().nullish(),
34
+ })
26
35
 
27
36
  interface IssueRead {
37
+ is_closed: boolean
28
38
  labels: ReadonlyArray<string>
29
39
  body: string
30
40
  }
@@ -35,7 +45,21 @@ async function read_issue(issue: string): Promise<IssueRead | undefined> {
35
45
 
36
46
  if (parsed === undefined) return undefined
37
47
 
38
- return { labels: parsed.labels.map((label) => label.name), body: parsed.body ?? '' }
48
+ return {
49
+ is_closed: parsed.state === CLOSED_STATE,
50
+ labels: parsed.labels.map((label) => label.name),
51
+ body: parsed.body ?? '',
52
+ }
53
+ }
54
+
55
+ // Why an apply has nothing to write: a closed issue is past the pool, and one already opted in was
56
+ // judged once — writing again would repeat the comment (joshuafolkken/kit#4097).
57
+ function settled_of(read: IssueRead): string | undefined {
58
+ if (read.is_closed) return 'the issue is closed'
59
+
60
+ return has_label_name(read.labels, AUTO_OK_LABEL)
61
+ ? `\`${AUTO_OK_LABEL}\` is already applied`
62
+ : undefined
39
63
  }
40
64
 
41
65
  async function apply_labels(issue: string, run_label: string): Promise<string | undefined> {
@@ -74,18 +98,15 @@ async function apply_to(issue: string, run_label: string, read: IssueRead): Prom
74
98
 
75
99
  if (exclusion !== undefined) return refused(issue, issue_auto_ok.line_of(exclusion))
76
100
 
77
- const problem = await apply_labels(issue, run_label)
78
-
79
- if (problem !== undefined) return refused(issue, problem)
80
-
81
101
  const reason = `judged by backlogrun: no exclusion holds and no person's judgement is needed (${run_label})`
82
102
 
83
- await run_event_stream_emit.emit(
84
- run_event_stream.EVENT_KIND.NOTE,
85
- `${issue_cite.plain(issue)} auto-ok applied (${run_label})`,
86
- )
103
+ if ((await record(issue, { is_applied: true, reason }, read.body)) !== SUCCESS_EXIT_CODE) {
104
+ return FAILURE_EXIT_CODE
105
+ }
106
+
107
+ const problem = await apply_labels(issue, run_label)
87
108
 
88
- return await record(issue, { is_applied: true, reason }, read.body)
109
+ return problem === undefined ? SUCCESS_EXIT_CODE : refused(issue, `${problem}; ${RETRY_HINT}`)
89
110
  }
90
111
 
91
112
  async function apply(issue: string, run_label: string): Promise<number> {
@@ -93,7 +114,13 @@ async function apply(issue: string, run_label: string): Promise<number> {
93
114
 
94
115
  if (read === undefined) return refused(issue, UNREADABLE)
95
116
 
96
- return await apply_to(issue, run_label, read)
117
+ const settled = settled_of(read)
118
+
119
+ if (settled === undefined) return await apply_to(issue, run_label, read)
120
+
121
+ console.info(`${session_cite.issue(issue)}: nothing to apply — ${settled}`)
122
+
123
+ return SUCCESS_EXIT_CODE
97
124
  }
98
125
 
99
126
  async function decline(issue: string, reason: string): Promise<number> {
@@ -14,11 +14,16 @@ import type { WatchComment } from '#scripts/issue/issue-watch-diff'
14
14
  // **The record is the judgement comment itself.** It carries a digest of the body it judged, so an
15
15
  // issue is judged again only when its body changed or a person commented after it — the same line
16
16
  // `issue_watch_diff` draws between a person's update and an automated one.
17
+ //
18
+ // **Only an author with write access is read** (`gh_author_association`, joshuafolkken/kit#4021): an
19
+ // issue anyone else filed is never a candidate, and a judgement comment or a later comment from anyone
20
+ // else is not counted, so a third party can neither opt an issue in nor mark one judged.
17
21
 
18
22
  interface JudgeIssue {
19
23
  number: number
20
24
  labels: ReadonlyArray<string>
21
25
  body: string
26
+ is_trusted: boolean
22
27
  }
23
28
 
24
29
  const MARKER_PREFIX = '<!-- josh:auto-ok-judged body='
@@ -29,7 +34,7 @@ const CRLF = '\r\n'
29
34
  const LF = '\n'
30
35
 
31
36
  function is_candidate(issue: JudgeIssue): boolean {
32
- if (has_label_name(issue.labels, AUTO_OK_LABEL)) return false
37
+ if (!issue.is_trusted || has_label_name(issue.labels, AUTO_OK_LABEL)) return false
33
38
 
34
39
  return issue_auto_ok.exclusion_of(issue.labels) === undefined
35
40
  }
@@ -42,9 +47,15 @@ function body_digest(body: string): string {
42
47
  }
43
48
 
44
49
  function digest_of(comment: WatchComment): string | undefined {
50
+ if (!comment.is_trusted) return undefined
51
+
45
52
  return MARKER_PATTERN.exec(comment.body)?.groups?.['digest']
46
53
  }
47
54
 
55
+ function is_person_comment(comment: WatchComment): boolean {
56
+ return comment.is_trusted === true && !comment.is_automated
57
+ }
58
+
48
59
  // Judged when the newest judgement comment covers the body as it stands and no person has commented
49
60
  // since. A failed comment read never reaches here — the caller treats it as nothing learned.
50
61
  function is_judged(body: string, comments: ReadonlyArray<WatchComment>): boolean {
@@ -52,7 +63,7 @@ function is_judged(body: string, comments: ReadonlyArray<WatchComment>): boolean
52
63
 
53
64
  if (judgement === undefined || digest_of(judgement) !== body_digest(body)) return false
54
65
 
55
- return comments.every((comment) => comment.id <= judgement.id || comment.is_automated)
66
+ return comments.every((comment) => comment.id <= judgement.id || !is_person_comment(comment))
56
67
  }
57
68
 
58
69
  function comment_of(decision: AutoOkDecision, body: string): string {
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { auto_ok_cli } from './auto-ok-cli'
4
+
5
+ // The `josh auto-ok:next` entry, kept apart from `auto-ok-cli.ts` because other modules import that
6
+ // one: a bundle is one file, so a main guard there would fire for every command that carries it
7
+ // (joshuafolkken/kit#4186).
8
+ //
9
+ // `process.exitCode` rather than `process.exit()`: the answer is written with `console.info`, and on
10
+ // macOS a write to a pipe is asynchronous — `process.exit()` can tear the process down before it has
11
+ // drained, and this command's whole contract is `answer=$(pnpm josh auto-ok:next)`. The same shape
12
+ // is already in `scripts/cost-runtime/cost-main.ts`, which met the truncation first.
13
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
14
+ const ARGV_OFFSET = 2
15
+
16
+ process.exitCode = await auto_ok_cli.run(process.argv.slice(ARGV_OFFSET))
17
+ }