@joshuafolkken/kit 1.1784.0 → 1.2116.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 (690) hide show
  1. package/.claude/agents/reviewer-verification.md +19 -0
  2. package/.claude/agents/reviewer.md +19 -0
  3. package/.claude/settings.json +5 -6
  4. package/.claude/skills/dependency-update/SKILL.md +9 -10
  5. package/.claude/skills/workflow-commands/SKILL.md +6 -6
  6. package/.claude/skills/workflow-commands/background-commands.md +8 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
  8. package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
  9. package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
  10. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
  11. package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
  12. package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
  13. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  14. package/.claude/skills/workflow-commands/chain-rule.md +41 -32
  15. package/.claude/skills/workflow-commands/delegation.md +6 -6
  16. package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
  17. package/.claude/skills/workflow-commands/followup.md +7 -5
  18. package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
  19. package/.claude/skills/workflow-commands/fullrun.md +1 -1
  20. package/.claude/skills/workflow-commands/issue-comments.md +9 -4
  21. package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
  22. package/.claude/skills/workflow-commands/kickoff.md +2 -2
  23. package/.claude/skills/workflow-commands/observation-filing.md +1 -1
  24. package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
  25. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
  26. package/.claude/skills/workflow-commands/prerequisite.md +3 -2
  27. package/.claude/skills/workflow-commands/retrospective.md +2 -2
  28. package/.claude/skills/workflow-commands/split-assessment.md +7 -5
  29. package/.codex/hooks.json +5 -5
  30. package/.github/actions/setup-pnpm/action.yml +9 -16
  31. package/.github/dependabot.yml +16 -0
  32. package/.github/workflows/auto-tag.yml +45 -0
  33. package/.github/workflows/ci.yml +155 -15
  34. package/.github/workflows/dependabot-auto-merge.yml +63 -4
  35. package/.github/workflows/production.yml +8 -0
  36. package/.github/workflows/publish.yml +60 -45
  37. package/.vscode/settings.json +19 -0
  38. package/CLAUDE.md +5 -12
  39. package/SECURITY.md +2 -2
  40. package/dist/CLAUDE.md +5 -12
  41. package/dist/commands/document-read-cli.js +2 -1
  42. package/dist/commands/document-section-main.js +2 -1
  43. package/dist/commands/read-set-cli.js +194 -134
  44. package/dist/commands/run-prep-main.js +9694 -10173
  45. package/dist/commands/run-step-cli.js +22138 -18285
  46. package/dist/hooks/audit-provision.js +23 -5
  47. package/dist/hooks/chunk-3GKE653K.js +6204 -0
  48. package/dist/hooks/chunk-45CJJOO7.js +1243 -0
  49. package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
  50. package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
  51. package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
  52. package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
  53. package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
  54. package/dist/hooks/chunk-VVNYJWEI.js +30 -0
  55. package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
  56. package/dist/hooks/codex-hook-adapter.js +8 -8
  57. package/dist/hooks/format-edited.js +4 -5
  58. package/dist/hooks/inputs.json +386 -360
  59. package/dist/hooks/pretool-guard.js +7 -6
  60. package/dist/hooks/session-lang.js +101 -258
  61. package/dist/hooks/stop-guard.js +1744 -2576
  62. package/dist/josh.js +7133 -6368
  63. package/dist/version/index.js +161 -1
  64. package/eslint/rules/comment-why-only.js +108 -0
  65. package/package.json +16 -9
  66. package/prompts/coding-standards.md +1 -1
  67. package/prompts/collaboration-workflow/file-edits.md +14 -11
  68. package/prompts/collaboration-workflow/issue-citation.md +0 -4
  69. package/prompts/collaboration-workflow/issue-template.md +40 -21
  70. package/prompts/collaboration-workflow/lane-instructions.md +3 -1
  71. package/prompts/collaboration-workflow/measurement.md +8 -1
  72. package/prompts/collaboration-workflow/operating-rules.md +11 -2
  73. package/prompts/collaboration-workflow/output-bounds.md +6 -2
  74. package/prompts/collaboration-workflow/plan-comment.md +1 -1
  75. package/prompts/collaboration-workflow/principles.md +9 -0
  76. package/prompts/collaboration-workflow/residency.md +3 -2
  77. package/prompts/collaboration-workflow/rule-delivery.md +13 -1
  78. package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
  79. package/prompts/collaboration-workflow/wip-cap.md +3 -1
  80. package/prompts/review-rubric.md +8 -0
  81. package/prompts/review.md +31 -22
  82. package/prompts/testing-guide.md +1 -0
  83. package/scripts/agent/agent-argv.ts +14 -16
  84. package/scripts/agent/agent-provider.ts +138 -0
  85. package/scripts/agent/agent-role-profile.ts +108 -156
  86. package/scripts/agent/agent-safe-text.ts +20 -5
  87. package/scripts/agent/api-usage-limit.ts +65 -0
  88. package/scripts/agent/claude-agent-argv.ts +19 -9
  89. package/scripts/agent/codex-agent-argv.ts +118 -22
  90. package/scripts/agent/usage-limit-reset.ts +179 -0
  91. package/scripts/auth/claude-token-output.ts +2 -2
  92. package/scripts/auto-ok/auto-ok-author.ts +53 -0
  93. package/scripts/auto-ok/auto-ok-cli.ts +20 -9
  94. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  95. package/scripts/backlog/backlog-drive-cli.ts +6 -1
  96. package/scripts/backlog/backlog-drive-hold.ts +3 -3
  97. package/scripts/backlog/backlog-drive-idle.ts +10 -0
  98. package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
  99. package/scripts/backlog/backlog-drive-launch.ts +8 -2
  100. package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
  101. package/scripts/backlog/backlog-drive-named.ts +28 -7
  102. package/scripts/backlog/backlog-drive-paused.ts +5 -4
  103. package/scripts/backlog/backlog-drive-restore.ts +11 -3
  104. package/scripts/backlog/backlog-drive.ts +21 -60
  105. package/scripts/backlog/backlog-gate-scope.ts +61 -0
  106. package/scripts/backlog/backlog-measure-close.ts +112 -0
  107. package/scripts/backlog/backlog-next.ts +39 -49
  108. package/scripts/backlog/backlog-occupied.ts +2 -2
  109. package/scripts/backlog/backlog-overlap.ts +42 -8
  110. package/scripts/backlog/backlog-plan-cli.ts +4 -1
  111. package/scripts/backlog/backlog-plan-comment.ts +81 -0
  112. package/scripts/backlog/backlog-plan-read.ts +19 -6
  113. package/scripts/backlog/backlog-pool.ts +50 -12
  114. package/scripts/backlog/backlog-rank.ts +60 -13
  115. package/scripts/backlog/backlog-stalled-detect.ts +2 -1
  116. package/scripts/backlog/backlog-waves.ts +17 -2
  117. package/scripts/backlog/backlogrun-launch.ts +7 -4
  118. package/scripts/cost-runtime/context-cut-payback.ts +27 -25
  119. package/scripts/cost-runtime/cost-cli.ts +37 -16
  120. package/scripts/cost-runtime/cost-pricing.ts +9 -0
  121. package/scripts/cost-runtime/cost-verdict.ts +4 -1
  122. package/scripts/delegation/delegation-policy.ts +2 -2
  123. package/scripts/delegation/duplicate-read-guard.ts +1 -0
  124. package/scripts/delegation/investigation-guard.ts +14 -2
  125. package/scripts/delegation/investigation-reads.ts +45 -23
  126. package/scripts/dependabot/dependabot-cooldown.ts +3 -2
  127. package/scripts/discovery/repo-party.ts +80 -20
  128. package/scripts/discovery/session-owner-pin.ts +51 -0
  129. package/scripts/document/capped-print.ts +1 -1
  130. package/scripts/document/command-reference-line-budget.ts +42 -0
  131. package/scripts/document/document-byte-budget.ts +17 -7
  132. package/scripts/document/document-checks.ts +20 -0
  133. package/scripts/document/document-ratchet-check.ts +101 -0
  134. package/scripts/document/document-section.ts +1 -0
  135. package/scripts/document/entry-read-budget.ts +7 -3
  136. package/scripts/document/issue-citation-budget.ts +94 -0
  137. package/scripts/epic/epic-cli-argv.ts +2 -2
  138. package/scripts/epic/epic-fetch.ts +4 -2
  139. package/scripts/epic/epic-graph.ts +7 -2
  140. package/scripts/epic/epic-issue.ts +3 -1
  141. package/scripts/epic/epic-rank.ts +5 -0
  142. package/scripts/exports/unused-members-check.ts +62 -0
  143. package/scripts/exports/unused-members-cli.ts +6 -51
  144. package/scripts/followup/followup-ci-path.ts +67 -0
  145. package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
  146. package/scripts/followup/followup-coderabbit-wait.ts +13 -10
  147. package/scripts/followup/followup-failed-tests.ts +160 -0
  148. package/scripts/followup/followup-job-needs.ts +100 -0
  149. package/scripts/followup/followup-job-rerun.ts +303 -0
  150. package/scripts/followup/followup-main-move.ts +113 -0
  151. package/scripts/followup/git-followup-finish.ts +43 -11
  152. package/scripts/followup/git-followup-pending.ts +3 -3
  153. package/scripts/followup/git-followup-stages.ts +41 -11
  154. package/scripts/followup/git-pr-followup-checks.ts +55 -16
  155. package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
  156. package/scripts/followup/git-pr-followup.ts +62 -27
  157. package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
  158. package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
  159. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
  160. package/scripts/gate/busy-average.ts +34 -2
  161. package/scripts/gate/check-related-pinned.ts +43 -0
  162. package/scripts/gate/check-related-reuse.ts +64 -0
  163. package/scripts/gate/check-related-section.ts +57 -0
  164. package/scripts/gate/check-related-unplanned.ts +34 -0
  165. package/scripts/gate/check-related.ts +265 -0
  166. package/scripts/gate/command-memory.ts +1 -1
  167. package/scripts/gate/core-admission.ts +24 -6
  168. package/scripts/gate/core-budget-timing.ts +20 -6
  169. package/scripts/gate/core-budget.ts +40 -11
  170. package/scripts/gate/core-wait-record.ts +3 -2
  171. package/scripts/gate/core-wait.ts +25 -2
  172. package/scripts/gate/core-weights.ts +15 -7
  173. package/scripts/gate/gate-labels.ts +46 -0
  174. package/scripts/gate/gate-ledger.ts +14 -6
  175. package/scripts/gate/gate-plan.ts +103 -58
  176. package/scripts/gate/gate-report.ts +9 -7
  177. package/scripts/gate/gate-run-steps.ts +26 -3
  178. package/scripts/gate/gate-skip.ts +45 -6
  179. package/scripts/gate/gate-static-group.ts +60 -0
  180. package/scripts/gate/gate-steps.ts +2 -1
  181. package/scripts/gate/gate-tree.ts +4 -2
  182. package/scripts/gate/hook-gate-reuse.ts +19 -2
  183. package/scripts/gate/metrics-totals.ts +59 -0
  184. package/scripts/gate/scoped-green.ts +68 -15
  185. package/scripts/gate/since-green.ts +14 -6
  186. package/scripts/gate/structural-checks.ts +96 -0
  187. package/scripts/gate/verification-gate.ts +51 -16
  188. package/scripts/gate/verification-inputs.ts +21 -6
  189. package/scripts/gate/verification-tail.ts +52 -0
  190. package/scripts/gh/gh-author-association.ts +23 -2
  191. package/scripts/gh/git-ai-review-scan.ts +1 -1
  192. package/scripts/gh/git-gh-api-path.ts +12 -3
  193. package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
  194. package/scripts/gh/git-gh-exec.ts +32 -2
  195. package/scripts/gh/git-gh-issue-read.ts +4 -2
  196. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  197. package/scripts/gh/git-gh-issue-write.ts +8 -2
  198. package/scripts/gh/git-gh-issue.ts +12 -5
  199. package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
  200. package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
  201. package/scripts/gh/git-gh-pr-read.ts +74 -13
  202. package/scripts/gh/git-gh-pr-rest.ts +3 -1
  203. package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
  204. package/scripts/gh/git-gh-pr-too-large.ts +20 -0
  205. package/scripts/gh/git-gh-pr.ts +21 -7
  206. package/scripts/gh/git-gh-retry.ts +141 -0
  207. package/scripts/gh/git-pr-ai-review.ts +15 -6
  208. package/scripts/gh/git-pr-checks-eval.ts +3 -0
  209. package/scripts/gh/git-pr-checks.ts +5 -5
  210. package/scripts/git/base-tree.ts +30 -0
  211. package/scripts/git/change-base.ts +4 -10
  212. package/scripts/git/changed-paths-sync.ts +63 -0
  213. package/scripts/git/changed-paths.ts +16 -1
  214. package/scripts/git/git-common-directory.ts +11 -1
  215. package/scripts/git/git-diff-reads.ts +66 -20
  216. package/scripts/git/git-error.ts +9 -2
  217. package/scripts/git/git-schemas.ts +13 -0
  218. package/scripts/git/git-worktree.ts +13 -0
  219. package/scripts/git/gone-branch.ts +4 -1
  220. package/scripts/git/main-merge-budget-conflict.ts +89 -0
  221. package/scripts/git/main-merge-guard.ts +55 -18
  222. package/scripts/git/main-merge-regenerate.ts +59 -25
  223. package/scripts/git/main-merge.ts +53 -5
  224. package/scripts/git/no-base-checkout.ts +127 -0
  225. package/scripts/git/stash/git-stash.ts +11 -2
  226. package/scripts/git/stash/stash-push-cli.ts +10 -0
  227. package/scripts/hooks/batch-guard.ts +40 -21
  228. package/scripts/hooks/edited-cspell.ts +37 -11
  229. package/scripts/hooks/format-edited-file.ts +22 -2
  230. package/scripts/hooks/lane-plan-guard.ts +50 -0
  231. package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
  232. package/scripts/hooks/pre-commit-lint.ts +14 -1
  233. package/scripts/hooks/pre-push-related-switch.ts +10 -0
  234. package/scripts/hooks/pre-push-unit.ts +76 -10
  235. package/scripts/hooks/pretool-guard.ts +2 -0
  236. package/scripts/hooks/reserved-run.ts +14 -1
  237. package/scripts/hooks/run-hook.sh +23 -8
  238. package/scripts/hooks/step-zero-notice.ts +6 -1
  239. package/scripts/hooks/stop-actions.ts +3 -15
  240. package/scripts/hooks/stop-guard.ts +7 -6
  241. package/scripts/init/distributed-paths.ts +1 -0
  242. package/scripts/init/hook-command-rewrite.ts +5 -1
  243. package/scripts/init/hook-launch.ts +4 -2
  244. package/scripts/issue/aggregation-split.ts +52 -0
  245. package/scripts/issue/defect-origin-line.ts +19 -1
  246. package/scripts/issue/defect-rate-cli.ts +5 -102
  247. package/scripts/issue/defect-report.ts +4 -4
  248. package/scripts/issue/effect-audit-cli.ts +178 -0
  249. package/scripts/issue/effect-audit.ts +185 -0
  250. package/scripts/issue/expected-effect-lint.ts +64 -9
  251. package/scripts/issue/git-next-issues.ts +5 -0
  252. package/scripts/issue/issue-body-or-comment.ts +38 -4
  253. package/scripts/issue/issue-cite-cli.ts +1 -3
  254. package/scripts/issue/issue-classification.ts +1 -0
  255. package/scripts/issue/issue-closing-pr.ts +8 -1
  256. package/scripts/issue/issue-evidence-exit.ts +4 -2
  257. package/scripts/issue/issue-file-cap.ts +58 -0
  258. package/scripts/issue/issue-file-cli.ts +111 -38
  259. package/scripts/issue/issue-file-deferral.ts +52 -0
  260. package/scripts/issue/issue-file-fold.ts +29 -10
  261. package/scripts/issue/issue-file-interrupt.ts +85 -0
  262. package/scripts/issue/issue-file-lane-hint.ts +30 -0
  263. package/scripts/issue/issue-file.ts +43 -6
  264. package/scripts/issue/issue-labels.ts +19 -2
  265. package/scripts/issue/issue-lint-cli.ts +27 -2
  266. package/scripts/issue/issue-measured-cli.ts +13 -35
  267. package/scripts/issue/issue-measured-close.ts +58 -0
  268. package/scripts/issue/issue-not-before-label.ts +2 -2
  269. package/scripts/issue/issue-not-before.ts +4 -1
  270. package/scripts/issue/issue-priority-cli.ts +60 -0
  271. package/scripts/issue/issue-priority-raise.ts +55 -0
  272. package/scripts/issue/issue-priority.ts +174 -43
  273. package/scripts/issue/issue-rank.ts +21 -4
  274. package/scripts/issue/issue-read-cli.ts +32 -6
  275. package/scripts/issue/issue-read.ts +37 -12
  276. package/scripts/issue/issue-sample-gate.ts +95 -74
  277. package/scripts/issue/issue-sample-prime.ts +127 -0
  278. package/scripts/issue/issue-sample-required.ts +57 -0
  279. package/scripts/issue/issue-sample-source.ts +12 -11
  280. package/scripts/issue/issue-search.ts +124 -0
  281. package/scripts/issue/issue-state.ts +13 -1
  282. package/scripts/issue/issue-template-section.ts +43 -0
  283. package/scripts/issue/issue-watch-diff.ts +31 -1
  284. package/scripts/issue/issue-watch-hook.ts +11 -2
  285. package/scripts/issue/issue-watch.ts +55 -12
  286. package/scripts/issue/markdown-section.ts +1 -0
  287. package/scripts/issue/measure-declaration.ts +121 -0
  288. package/scripts/issue/measure-rerun-cli.ts +7 -70
  289. package/scripts/issue/plan-consumers-section.ts +22 -1
  290. package/scripts/issue/reproduction-measure.ts +3 -1
  291. package/scripts/issue/size-estimate.ts +90 -0
  292. package/scripts/issue/trusted-measure.ts +84 -0
  293. package/scripts/josh/command-usage.ts +3 -2
  294. package/scripts/josh/durable-state-migrate.ts +105 -0
  295. package/scripts/josh/durable-state.ts +112 -0
  296. package/scripts/josh/josh-aliases.ts +95 -0
  297. package/scripts/josh/josh-command-map.ts +1 -82
  298. package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
  299. package/scripts/josh/josh-commands-ai.ts +5 -5
  300. package/scripts/josh/josh-commands-development.ts +59 -58
  301. package/scripts/josh/josh-commands-issue-write.ts +23 -4
  302. package/scripts/josh/josh-commands-issue.ts +32 -0
  303. package/scripts/josh/josh-commands-lane.ts +87 -4
  304. package/scripts/josh/josh-commands-lint.ts +16 -3
  305. package/scripts/josh/josh-commands-maintenance.ts +15 -0
  306. package/scripts/josh/josh-commands-review.ts +41 -6
  307. package/scripts/josh/josh-commands-ship.ts +56 -8
  308. package/scripts/josh/josh-commands-test-check.ts +80 -0
  309. package/scripts/josh/josh-commands-workflow.ts +1 -1
  310. package/scripts/josh/josh-environment-file.ts +43 -3
  311. package/scripts/josh/josh-in-process.ts +2 -2
  312. package/scripts/josh/josh-logic.ts +5 -3
  313. package/scripts/josh/josh-run.ts +19 -1
  314. package/scripts/josh/run-record-path.ts +15 -0
  315. package/scripts/josh/stamp-file.ts +11 -2
  316. package/scripts/lane/lane-adopt-cli.ts +98 -0
  317. package/scripts/lane/lane-adopt.ts +208 -0
  318. package/scripts/lane/lane-await.ts +5 -8
  319. package/scripts/lane/lane-baseline.ts +123 -0
  320. package/scripts/lane/lane-breakdown-cli.ts +64 -0
  321. package/scripts/lane/lane-breakdown-implement.ts +170 -0
  322. package/scripts/lane/lane-breakdown-laps.ts +107 -0
  323. package/scripts/lane/lane-breakdown-pinned.ts +76 -0
  324. package/scripts/lane/lane-breakdown-text.ts +145 -0
  325. package/scripts/lane/lane-breakdown.ts +239 -0
  326. package/scripts/lane/lane-check-stats.ts +29 -8
  327. package/scripts/lane/lane-child-invocation.ts +9 -2
  328. package/scripts/lane/lane-child-mark-keys.ts +12 -0
  329. package/scripts/lane/lane-child-marker.ts +20 -1
  330. package/scripts/lane/lane-ci-path-stats.ts +73 -0
  331. package/scripts/lane/lane-claim-stats.ts +84 -0
  332. package/scripts/lane/lane-close.ts +8 -3
  333. package/scripts/lane/lane-dispatch-log.ts +3 -3
  334. package/scripts/lane/lane-dispatch.ts +2 -2
  335. package/scripts/lane/lane-gap-stats.ts +7 -6
  336. package/scripts/lane/lane-guard-policy.ts +7 -1
  337. package/scripts/lane/lane-implement-stats.ts +207 -0
  338. package/scripts/lane/lane-implement-subagents.ts +90 -0
  339. package/scripts/lane/lane-investigation-switch.ts +16 -0
  340. package/scripts/lane/lane-ledger-kind.ts +31 -0
  341. package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
  342. package/scripts/lane/lane-ledger-schema.ts +119 -36
  343. package/scripts/lane/lane-ledger-write.ts +257 -0
  344. package/scripts/lane/lane-ledger.ts +31 -177
  345. package/scripts/lane/lane-load.ts +1 -1
  346. package/scripts/lane/lane-measure-cli.ts +176 -59
  347. package/scripts/lane/lane-net-read.ts +44 -0
  348. package/scripts/lane/lane-net-time.ts +212 -0
  349. package/scripts/lane/lane-open.ts +16 -7
  350. package/scripts/lane/lane-output.ts +2 -4
  351. package/scripts/lane/lane-overrun-prompt.ts +147 -0
  352. package/scripts/lane/lane-overrun.ts +274 -0
  353. package/scripts/lane/lane-paths.ts +24 -1
  354. package/scripts/lane/lane-pause-cli.ts +4 -1
  355. package/scripts/lane/lane-paused-spans.ts +97 -0
  356. package/scripts/lane/lane-plan-check.ts +207 -0
  357. package/scripts/lane/lane-plan-cli.ts +41 -0
  358. package/scripts/lane/lane-plan.ts +144 -0
  359. package/scripts/lane/lane-registry.ts +14 -1
  360. package/scripts/lane/lane-relaunch.ts +1 -1
  361. package/scripts/lane/lane-round-one-stats.ts +51 -0
  362. package/scripts/lane/lane-sampler.ts +23 -4
  363. package/scripts/lane/lane-session-action.ts +93 -18
  364. package/scripts/lane/lane-session-broker.ts +49 -21
  365. package/scripts/lane/lane-session-reread-main.ts +14 -0
  366. package/scripts/lane/lane-session-reread.ts +51 -0
  367. package/scripts/lane/lane-ship-lap-stats.ts +74 -0
  368. package/scripts/lane/lane-sleep.ts +58 -0
  369. package/scripts/lane/lane-spent.ts +1 -1
  370. package/scripts/lane/lane-split-stats.ts +28 -0
  371. package/scripts/lane/lane-stage-stats.ts +13 -1
  372. package/scripts/lane/lane-state.ts +41 -9
  373. package/scripts/lane/lane-stats-tables.ts +58 -0
  374. package/scripts/lane/lane-stats.ts +21 -5
  375. package/scripts/lane/lane-stop-stats.ts +51 -19
  376. package/scripts/lane/lane-tail-stats.ts +32 -0
  377. package/scripts/lane/lane-transcript-calls.ts +67 -10
  378. package/scripts/lane/lane-transcript-stats.ts +44 -12
  379. package/scripts/lane/lane-value-cell.ts +72 -0
  380. package/scripts/lane/lane-value.ts +118 -0
  381. package/scripts/lane/lane-withdraw-closed.ts +124 -0
  382. package/scripts/lane/lane-withdraw.ts +108 -31
  383. package/scripts/lane/lane-yield.ts +85 -0
  384. package/scripts/lane/openai-lane-ship.ts +12 -11
  385. package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
  386. package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
  387. package/scripts/lane/openai-lane-supervisor.ts +5 -4
  388. package/scripts/lib/poll.ts +38 -9
  389. package/scripts/lib/settled-together.ts +10 -0
  390. package/scripts/lib/shell-quote.ts +21 -0
  391. package/scripts/lib/token-shape.ts +111 -0
  392. package/scripts/lint/eslint-daemon-sources.ts +79 -0
  393. package/scripts/lint/eslint-daemon.ts +45 -6
  394. package/scripts/lint/eslint-warm-cli.ts +7 -0
  395. package/scripts/lint/eslint-warm.ts +66 -0
  396. package/scripts/lint/import-graph.ts +141 -11
  397. package/scripts/lint/lint-gate-scope.ts +2 -2
  398. package/scripts/lint/lint-parallel.ts +54 -6
  399. package/scripts/lint/lint-related.ts +154 -33
  400. package/scripts/lint/rename-cli.ts +179 -0
  401. package/scripts/lint/rename-identifier.ts +192 -0
  402. package/scripts/lint/type-only-imports.ts +58 -0
  403. package/scripts/notify/telegram-notify.ts +12 -3
  404. package/scripts/observations/observation-record.ts +42 -16
  405. package/scripts/observations/observations-flush.ts +32 -9
  406. package/scripts/overrides/overrides-check.ts +9 -1
  407. package/scripts/release/release-approval-prune.ts +7 -1
  408. package/scripts/repo/required-checks-logic.ts +4 -1
  409. package/scripts/repo/ruleset-check.ts +4 -3
  410. package/scripts/report/markdown-shape.ts +28 -0
  411. package/scripts/report/report-format-reference.ts +15 -1
  412. package/scripts/report/report-labels.ts +12 -1
  413. package/scripts/report/report-lint-child-summary.ts +94 -0
  414. package/scripts/report/report-lint-cli.ts +26 -7
  415. package/scripts/report/report-lint.ts +2 -20
  416. package/scripts/review/prose-stale-cli.ts +88 -0
  417. package/scripts/review/prose-stale-scan.ts +152 -0
  418. package/scripts/review/review-attest.ts +73 -23
  419. package/scripts/review/review-brief-cli.ts +68 -19
  420. package/scripts/review/review-brief-paths.ts +22 -0
  421. package/scripts/review/review-brief.ts +14 -7
  422. package/scripts/review/review-comment-carry.ts +47 -0
  423. package/scripts/review/review-comment-round.ts +85 -22
  424. package/scripts/review/review-finding-ledger.ts +109 -7
  425. package/scripts/review/review-finding-text.ts +43 -0
  426. package/scripts/review/review-interaction.ts +11 -0
  427. package/scripts/review/review-lane-handover.ts +68 -0
  428. package/scripts/review/review-lint-cli.ts +57 -0
  429. package/scripts/review/review-lint-findings.ts +92 -0
  430. package/scripts/review/review-lint-sections.ts +80 -0
  431. package/scripts/review/review-lint.ts +221 -0
  432. package/scripts/review/review-prior-findings.ts +102 -0
  433. package/scripts/review/review-readers-scan.ts +4 -2
  434. package/scripts/review/review-record-cli.ts +177 -54
  435. package/scripts/review/review-record-code-round.ts +55 -0
  436. package/scripts/review/review-record-comment.ts +60 -0
  437. package/scripts/review/review-record-interaction.ts +35 -0
  438. package/scripts/review/review-record-pinned.ts +108 -0
  439. package/scripts/review/review-record.ts +25 -1
  440. package/scripts/review/review-reviewed-tree.ts +307 -0
  441. package/scripts/review/review-round-one-closure.ts +62 -0
  442. package/scripts/review/review-round-reuse.ts +106 -0
  443. package/scripts/review/review-round2-cli.ts +91 -29
  444. package/scripts/review/review-round2-skip-comment.ts +55 -0
  445. package/scripts/review/review-round2.ts +24 -8
  446. package/scripts/review/review-stamps.ts +7 -3
  447. package/scripts/review/review-stop-log.ts +20 -6
  448. package/scripts/review/review-stops-cli.ts +2 -1
  449. package/scripts/review/review-submit-cli.ts +101 -0
  450. package/scripts/rules/agent-model.ts +1 -1
  451. package/scripts/rules/bash-triggers.ts +3 -3
  452. package/scripts/rules/concise-reply.ts +88 -0
  453. package/scripts/rules/credential-body.ts +77 -0
  454. package/scripts/rules/decision-oracle.ts +1 -1
  455. package/scripts/rules/delivered-rules.ts +36 -17
  456. package/scripts/rules/destructive-command.ts +3 -11
  457. package/scripts/rules/direct-issue-comment.ts +34 -12
  458. package/scripts/rules/direct-issue-read.ts +191 -0
  459. package/scripts/rules/direct-pr-create.ts +4 -24
  460. package/scripts/rules/early-heartbeat.ts +2 -0
  461. package/scripts/rules/edit-tool.ts +27 -0
  462. package/scripts/rules/file-edit-rows.ts +17 -0
  463. package/scripts/rules/file-rewrite.ts +146 -0
  464. package/scripts/rules/firing-point.ts +3 -2
  465. package/scripts/rules/gh-api.ts +128 -7
  466. package/scripts/rules/gh-repo-selector.ts +84 -0
  467. package/scripts/rules/git-force.ts +2 -2
  468. package/scripts/rules/guard-remedy.ts +14 -5
  469. package/scripts/rules/implementation-cut.ts +61 -28
  470. package/scripts/rules/investigator-foreground.ts +231 -0
  471. package/scripts/rules/issue-citation.ts +15 -60
  472. package/scripts/rules/issue-comments.ts +9 -4
  473. package/scripts/rules/josh-git-bare.ts +1 -1
  474. package/scripts/rules/lane-background.ts +41 -13
  475. package/scripts/rules/lane-direct-tool.ts +107 -9
  476. package/scripts/rules/lane-interactive-ask.ts +4 -1
  477. package/scripts/rules/lane-park.ts +4 -2
  478. package/scripts/rules/lane-spilled-read.ts +90 -0
  479. package/scripts/rules/lane-split-park.ts +1 -1
  480. package/scripts/rules/lane-switch-main.ts +4 -4
  481. package/scripts/rules/last-prompt.ts +20 -47
  482. package/scripts/rules/oracle-consulted.ts +1 -1
  483. package/scripts/rules/permission-guards.ts +5 -1
  484. package/scripts/rules/piped-verification-shapes.ts +110 -0
  485. package/scripts/rules/piped-verification.ts +67 -17
  486. package/scripts/rules/poll-loop.ts +72 -9
  487. package/scripts/rules/pr-merge.ts +5 -5
  488. package/scripts/rules/pre-gate-cut.ts +3 -3
  489. package/scripts/rules/protected-files.ts +88 -24
  490. package/scripts/rules/reply-language.ts +3 -17
  491. package/scripts/rules/reply-prose.ts +34 -0
  492. package/scripts/rules/repo-admin.ts +132 -0
  493. package/scripts/rules/reviewer-foreground.ts +88 -0
  494. package/scripts/rules/round-one-check-related.ts +120 -0
  495. package/scripts/rules/rule-body-guard.ts +5 -15
  496. package/scripts/rules/rule-value-cache.ts +53 -5
  497. package/scripts/rules/rule-value-candidates.ts +84 -0
  498. package/scripts/rules/rule-value-cli.ts +59 -11
  499. package/scripts/rules/rule-value.ts +17 -4
  500. package/scripts/rules/run-tail-rule.ts +1 -1
  501. package/scripts/rules/sed-in-place.ts +196 -0
  502. package/scripts/rules/shell-segments.ts +10 -2
  503. package/scripts/rules/stop-rule-rows.ts +1 -13
  504. package/scripts/rules/stop-rules.ts +33 -58
  505. package/scripts/rules/test-declared-commit.ts +1 -1
  506. package/scripts/rules/third-party-write.ts +110 -23
  507. package/scripts/rules/timed-rerun.ts +1 -1
  508. package/scripts/rules/turn-filings.ts +90 -0
  509. package/scripts/rules/worktree-guard.ts +22 -7
  510. package/scripts/run/board/run-board-ending-reason.ts +6 -2
  511. package/scripts/run/board/run-board-fit.ts +24 -1
  512. package/scripts/run/board/run-board-found.ts +134 -0
  513. package/scripts/run/board/run-board-header.ts +8 -0
  514. package/scripts/run/board/run-board-labels.ts +11 -1
  515. package/scripts/run/board/run-board-lane-time.ts +1 -0
  516. package/scripts/run/board/run-board-link.ts +15 -2
  517. package/scripts/run/board/run-board-notes.ts +7 -1
  518. package/scripts/run/board/run-board-operation.ts +4 -2
  519. package/scripts/run/board/run-board-phase.ts +2 -5
  520. package/scripts/run/board/run-board-plan.ts +1 -1
  521. package/scripts/run/board/run-board-read.ts +46 -1
  522. package/scripts/run/board/run-board-reason.ts +20 -8
  523. package/scripts/run/board/run-board-render-checks.ts +3 -2
  524. package/scripts/run/board/run-board-render-drawn.ts +11 -0
  525. package/scripts/run/board/run-board-render-found.ts +157 -0
  526. package/scripts/run/board/run-board-render-lead.ts +9 -0
  527. package/scripts/run/board/run-board-render-legend.ts +19 -0
  528. package/scripts/run/board/run-board-render-tail.ts +1 -1
  529. package/scripts/run/board/run-board-render.ts +82 -18
  530. package/scripts/run/board/run-board-spin.ts +1 -3
  531. package/scripts/run/board/run-board-status.ts +2 -0
  532. package/scripts/run/board/run-board-tick.ts +39 -10
  533. package/scripts/run/carry/run-carry-ended.ts +3 -2
  534. package/scripts/run/carry/run-carry.ts +3 -2
  535. package/scripts/run/cut/run-cut-cli.ts +33 -133
  536. package/scripts/run/cut/run-cut-digest.ts +152 -0
  537. package/scripts/run/cut/run-cut-handoff.ts +52 -8
  538. package/scripts/run/cut/run-cut-report.ts +24 -3
  539. package/scripts/run/cut/run-cut-resume.ts +129 -0
  540. package/scripts/run/cut/run-cut-review.ts +105 -0
  541. package/scripts/run/cut/run-cut.ts +18 -7
  542. package/scripts/run/detached-launch.ts +1 -1
  543. package/scripts/run/entry/run-entry-cli.ts +88 -19
  544. package/scripts/run/entry/run-entry-spill.ts +83 -0
  545. package/scripts/run/entry/run-entry-stop.ts +5 -1
  546. package/scripts/run/entry/run-entry-trust.ts +91 -0
  547. package/scripts/run/event/run-event-baseline.ts +56 -0
  548. package/scripts/run/event/run-event-filed.ts +9 -3
  549. package/scripts/run/event/run-event-overrun.ts +197 -0
  550. package/scripts/run/event/run-event-render.ts +4 -0
  551. package/scripts/run/event/run-event-stream.ts +25 -3
  552. package/scripts/run/hold/run-stop-notify.ts +3 -8
  553. package/scripts/run/merge/run-merge-cap.ts +57 -0
  554. package/scripts/run/merge/run-merge-cli.ts +66 -23
  555. package/scripts/run/merge/run-merge-outcome.ts +2 -0
  556. package/scripts/run/merge/run-merge-ship.ts +13 -3
  557. package/scripts/run/merge/run-merge-signals.ts +40 -23
  558. package/scripts/run/merge/run-merge-steps.ts +56 -36
  559. package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
  560. package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
  561. package/scripts/run/merge/run-merge.ts +41 -14
  562. package/scripts/run/review/run-review-cli.ts +306 -20
  563. package/scripts/run/review/run-review-early-push.ts +121 -0
  564. package/scripts/run/review/run-review-join-read.ts +94 -0
  565. package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
  566. package/scripts/run/review/run-review-pinned-join.ts +216 -0
  567. package/scripts/run/review/run-review-pinned-steps.ts +383 -0
  568. package/scripts/run/review/run-review-pinned-tree.ts +37 -0
  569. package/scripts/run/review/run-review-pinned.ts +53 -0
  570. package/scripts/run/review/run-review-steps.ts +70 -34
  571. package/scripts/run/review/run-review.ts +26 -6
  572. package/scripts/run/run-parent-cut-hook.ts +3 -4
  573. package/scripts/run/run-prep.ts +1 -0
  574. package/scripts/run/run-stage-read.ts +2 -6
  575. package/scripts/run/run-step-cli.ts +17 -5
  576. package/scripts/run/run-step-lane-plan.ts +27 -0
  577. package/scripts/run/run-step-section.ts +26 -7
  578. package/scripts/run/run-step.ts +5 -2
  579. package/scripts/run/ship/run-ship-args.ts +19 -0
  580. package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
  581. package/scripts/run/ship/run-ship-cli.ts +131 -39
  582. package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
  583. package/scripts/run/ship/run-ship-detach.ts +10 -4
  584. package/scripts/run/ship/run-ship-handover.ts +106 -0
  585. package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
  586. package/scripts/run/ship/run-ship-lap.ts +63 -0
  587. package/scripts/run/ship/run-ship-next.ts +27 -26
  588. package/scripts/run/ship/run-ship-overlap.ts +8 -3
  589. package/scripts/run/ship/run-ship-place.ts +9 -2
  590. package/scripts/run/ship/run-ship-planned.ts +92 -0
  591. package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
  592. package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
  593. package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
  594. package/scripts/run/ship/run-ship-preflight.ts +16 -4
  595. package/scripts/run/ship/run-ship-probe.ts +23 -9
  596. package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
  597. package/scripts/run/ship/run-ship-relaunch.ts +51 -0
  598. package/scripts/run/ship/run-ship-return.ts +103 -29
  599. package/scripts/run/ship/run-ship-review-reason.ts +24 -0
  600. package/scripts/run/ship/run-ship-review-steps.ts +230 -59
  601. package/scripts/run/ship/run-ship-review.ts +171 -51
  602. package/scripts/run/ship/run-ship-reviewer.ts +138 -42
  603. package/scripts/run/ship/run-ship-scoped.ts +39 -10
  604. package/scripts/run/ship/run-ship-stage.ts +49 -13
  605. package/scripts/run/ship/run-ship-steps.ts +24 -4
  606. package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
  607. package/scripts/run/ship/run-ship-stop-context.ts +50 -13
  608. package/scripts/run/ship/run-ship-sync.ts +171 -30
  609. package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
  610. package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
  611. package/scripts/run/ship/run-ship-waiter.ts +114 -0
  612. package/scripts/run/ship/run-ship.ts +16 -2
  613. package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
  614. package/scripts/run/wake/run-wake-cli.ts +6 -113
  615. package/scripts/run/wake/run-wake-code.ts +53 -11
  616. package/scripts/run/wake/run-wake-driver.ts +5 -3
  617. package/scripts/run/wake/run-wake-finish.ts +137 -0
  618. package/scripts/run/wake/run-wake-loop.ts +5 -3
  619. package/scripts/run/wake/run-wake-ports.ts +11 -3
  620. package/scripts/run/wake/run-wake-session.ts +2 -0
  621. package/scripts/run/wake/run-wake.ts +3 -2
  622. package/scripts/safe-chain/ci-installer-pin.ts +49 -8
  623. package/scripts/safe-chain/project-config.ts +3 -2
  624. package/scripts/security/secretlint-scan.ts +42 -9
  625. package/scripts/security/security-audit-provision-main.ts +9 -1
  626. package/scripts/security/security-audit-provision.ts +1 -1
  627. package/scripts/security/security-audit.ts +21 -1
  628. package/scripts/security/sonar-file.ts +10 -5
  629. package/scripts/split/split-assess.ts +12 -3
  630. package/scripts/split/split-early-notice.ts +116 -0
  631. package/scripts/split/split-measure.ts +20 -2
  632. package/scripts/split/split-resolution.ts +107 -0
  633. package/scripts/test/direct-importers.ts +185 -0
  634. package/scripts/test/pure-files-entries.ts +83 -0
  635. package/scripts/test/related-heavy-tests.ts +81 -0
  636. package/scripts/test/test-no-base.ts +88 -0
  637. package/scripts/test/test-pinned-cache-logic.ts +363 -0
  638. package/scripts/test/test-pinned-cache.ts +337 -0
  639. package/scripts/test/test-pinned-emit.ts +49 -0
  640. package/scripts/test/test-pinned-functions.ts +116 -0
  641. package/scripts/test/test-pinned-ledger.ts +80 -0
  642. package/scripts/test/test-pinned-logic.ts +208 -20
  643. package/scripts/test/test-pinned-main.ts +84 -18
  644. package/scripts/test/test-pinned-pool.ts +73 -0
  645. package/scripts/test/test-pinned-probe.ts +254 -0
  646. package/scripts/test/test-pinned-prune-logic.ts +118 -0
  647. package/scripts/test/test-pinned-reach.ts +194 -0
  648. package/scripts/test/test-pinned-record.ts +196 -0
  649. package/scripts/test/test-pinned-rewire.ts +148 -0
  650. package/scripts/test/test-pinned-spawn.ts +81 -0
  651. package/scripts/test/test-pinned-stage.ts +70 -0
  652. package/scripts/test/test-pinned.ts +258 -47
  653. package/scripts/test/test-reach-cli.ts +61 -0
  654. package/scripts/test/test-read-map.ts +35 -11
  655. package/scripts/test/test-read-recording.ts +17 -5
  656. package/scripts/test/test-read-trace.ts +26 -8
  657. package/scripts/test/test-red-logic.ts +46 -7
  658. package/scripts/test/test-red.ts +34 -14
  659. package/scripts/test/test-related-claim.ts +37 -0
  660. package/scripts/test/test-related-main.ts +4 -1
  661. package/scripts/test/test-related-moved.ts +91 -0
  662. package/scripts/test/test-related-record.ts +43 -23
  663. package/scripts/test/test-related-scope.ts +99 -34
  664. package/scripts/test/test-related-synced.ts +135 -0
  665. package/scripts/test/test-related-touched.ts +84 -0
  666. package/scripts/test/test-related.ts +167 -83
  667. package/scripts/test/test-unit-guard.ts +28 -5
  668. package/scripts/test/unit-durations.ts +41 -0
  669. package/scripts/test/unit-worker-share.ts +5 -4
  670. package/scripts/test/vitest-cache-directory.ts +19 -0
  671. package/scripts/test/vitest-cli-excludes.ts +14 -0
  672. package/scripts/test/vitest-failure-summary.ts +111 -0
  673. package/scripts/test/whole-suite-files.ts +12 -1
  674. package/scripts/time-runtime/time-batch-guard.ts +42 -4
  675. package/scripts/time-runtime/time-bundle-call.ts +1 -1
  676. package/scripts/time-runtime/time-bundles.ts +36 -5
  677. package/scripts/time-runtime/time-markers.ts +2 -2
  678. package/scripts/time-runtime/time-search-call.ts +38 -0
  679. package/scripts/time-runtime/time-shell.ts +1 -1
  680. package/scripts/time-runtime/time-transcript-line.ts +17 -5
  681. package/scripts/version/development-engines-verdict.ts +124 -0
  682. package/scripts/version/latest-corepack.ts +2 -0
  683. package/templates/gitignore +2 -0
  684. package/templates/workflows/ci.yml +41 -0
  685. package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
  686. package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
  687. package/dist/hooks/chunk-TUIFS5E7.js +0 -72
  688. package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
  689. package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
  690. package/scripts/rules/filing-cap.ts +0 -139
@@ -5,13 +5,14 @@ import { issue_watch } from '#scripts/issue/issue-watch'
5
5
  import { session_cite } from '#scripts/issue/session-cite'
6
6
  import { josh_command } from '#scripts/josh/josh-run'
7
7
  import { lane_child_marker } from '#scripts/lane/lane-child-marker'
8
+ import { lane_plan_check } from '#scripts/lane/lane-plan-check'
8
9
  import { run_cut_report } from '#scripts/run/cut/run-cut-report'
9
10
  import { run_event_plan } from '#scripts/run/event/run-event-plan'
10
11
  import { run_hold_cli } from '#scripts/run/hold/run-hold-cli'
11
12
  import { run_halfrun_resume } from '#scripts/run/run-halfrun-resume'
12
13
  import { run_label } from '#scripts/run/run-label'
13
14
  import { run_next } from '#scripts/run/run-next'
14
- import { run_prep } from '#scripts/run/run-prep'
15
+ import type { PrepParts } from '#scripts/run/run-prep'
15
16
  import { run_prep_cli } from '#scripts/run/run-prep-cli'
16
17
  import { run_prrun_resume } from '#scripts/run/run-prrun-resume'
17
18
  import {
@@ -24,7 +25,9 @@ import { run_stage_read, type StageRead } from '#scripts/run/run-stage-read'
24
25
  import { run_step } from '#scripts/run/run-step'
25
26
  import { run_step_section } from '#scripts/run/run-step-section'
26
27
  import { run_entry, type EntryParts } from './run-entry'
28
+ import { run_entry_spill } from './run-entry-spill'
27
29
  import { run_entry_stop } from './run-entry-stop'
30
+ import { run_entry_trust, type TrustStop } from './run-entry-trust'
28
31
 
29
32
  // `josh run:entry <N>` — one call for the fixed entry sequence a lane opens on. Rather than a round
30
33
  // trip each on `run:hold`, `cost --cut`, `run:prep` and `run:step`, re-billing a lane's full context
@@ -50,6 +53,8 @@ const NEWLINE = '\n'
50
53
  const HOLD_STOP_NOTE =
51
54
  '(tree not held — see the reason above; clean up and retry, or release with `pnpm josh run:release`)'
52
55
  const COST_STOP_NOTE = '(session budget spent — see the figure above; resume in a fresh session)'
56
+ const YIELD_NOTE =
57
+ '(lane given back at the entry — see the overlap above; end the session now, with no edit)'
53
58
  const { BUDGET_REASON, HOLD_REASON } = run_entry_stop
54
59
  const HALFRUN_RESUME_TOKEN = 'halfrun'
55
60
 
@@ -123,8 +128,9 @@ async function check_cost(): Promise<string> {
123
128
  }
124
129
 
125
130
  interface Reads {
126
- report: string
131
+ prep: PrepParts
127
132
  verdict: string
133
+ trust_stop: TrustStop | undefined
128
134
  }
129
135
 
130
136
  // The issue reads and the pre-implementation verdict, from the one gather `run:prep` and `run:next`
@@ -132,20 +138,33 @@ interface Reads {
132
138
  // formatter, the verdict is `run:step`'s `pre_verdict` over the same parts.
133
139
  async function gather_reads(issue_number: string): Promise<Reads> {
134
140
  const reads = await run_prep_cli.gather(issue_number)
135
- const parts = run_prep_cli.to_parts(issue_number, reads)
136
- const verdict = run_step.pre_verdict(run_next.to_input(parts))
141
+ const prep = run_prep_cli.to_parts(issue_number, reads)
142
+ const verdict = run_step.pre_verdict(run_next.to_input(prep))
143
+ const trust_stop = run_entry_trust.stop_of(reads.content, reads.state, issue_number)
137
144
 
138
- return { report: run_prep.format_report(parts), verdict }
145
+ return { prep, verdict, trust_stop }
146
+ }
147
+
148
+ function entry_text(parts: EntryParts): string {
149
+ return session_cite.text(run_entry.format_report(parts))
139
150
  }
140
151
 
141
152
  function emit(parts: EntryParts): number {
142
- console.info(session_cite.text(run_entry.format_report(parts)))
153
+ console.info(entry_text(parts))
143
154
 
144
155
  return run_entry.exit_code(parts)
145
156
  }
146
157
 
147
- // The summary of a run that stopped before it read the issue: the token that stopped it, no verdict,
148
- // and the note that stands in for the report body.
158
+ // The bundle emitted as it fits the Bash result, measured on the composite `emit` prints.
159
+ function emit_fitted(entry: Omit<EntryParts, 'report'>, prep: PrepParts): number {
160
+ const report = run_entry_spill.fit(prep, (text) => entry_text({ ...entry, report: text }))
161
+
162
+ return emit({ ...entry, report })
163
+ }
164
+
165
+ // The summary of a run that stopped without a report — before it read the issue, or after reading an
166
+ // issue it will not run: the token that stopped it, no verdict, and the note that stands in for the
167
+ // report body.
149
168
  function stop_report(issue_number: string, hold: string, cost: string, report: string): number {
150
169
  return emit({ issue_number, hold, cost, verdict: run_entry.NO_VERDICT, report })
151
170
  }
@@ -157,16 +176,37 @@ interface StopCall {
157
176
  command: StageCommand
158
177
  reason: string
159
178
  should_release: boolean
179
+ recommended?: string
160
180
  }
161
181
 
162
- async function stop_run({ parts, command, reason, should_release }: StopCall): Promise<number> {
182
+ async function stop_run({ parts, command, ...notice }: StopCall): Promise<number> {
163
183
  const code = stop_report(parts.issue_number, parts.hold, parts.cost, parts.report)
164
184
 
165
- await run_entry_stop.stop({ issue_number: parts.issue_number, command, reason, should_release })
185
+ await run_entry_stop.stop({ issue_number: parts.issue_number, command, ...notice })
166
186
 
167
187
  return code
168
188
  }
169
189
 
190
+ // **An untrusted author's issue stops after the reads, not before the claim** — the trust is decided
191
+ // by the read `run:prep` already makes, so the gate adds no call; the hold this call claimed is
192
+ // released. It exits non-zero though the hold and the budget both allowed the run. A trust read that
193
+ // failed stops here too, under its own reason (`run-entry-trust.ts`).
194
+ async function stop_untrusted(
195
+ { issue_number, command }: EntryRequest,
196
+ { hold, cost }: Pick<EntryParts, 'hold' | 'cost'>,
197
+ { reason, report, recommended }: TrustStop,
198
+ ): Promise<number> {
199
+ await stop_run({
200
+ parts: { issue_number, hold, cost, report },
201
+ command,
202
+ reason,
203
+ should_release: true,
204
+ recommended,
205
+ })
206
+
207
+ return FAILURE_EXIT_CODE
208
+ }
209
+
170
210
  interface Resume {
171
211
  token: string
172
212
  code: number
@@ -250,17 +290,50 @@ async function mark_planned(issue_number: string, state: StageState): Promise<vo
250
290
  if (state === run_stage.PLANNED) await run_event_plan.emit_plan(issue_number)
251
291
  }
252
292
 
293
+ // **A lane child probes its declared paths before the investigation** (joshuafolkken/kit#5211): a running
294
+ // lane that planned one of them since dispatch takes the lane back here, at the cost of the entry
295
+ // alone, rather than after the investigation `lane:plan` would otherwise yield on. `lane:plan` has
296
+ // already released the hold and noted the yield, so this only reports it — no stop notice, as for
297
+ // any yield.
298
+ async function yields_at_entry(issue_number: string): Promise<boolean> {
299
+ if (!lane_child_marker.is_child_of(process.cwd())) return false
300
+
301
+ return await lane_plan_check.yield_at_entry(Number(issue_number))
302
+ }
303
+
304
+ // The report of a lane given back at the entry, exiting as `lane:plan` does on a yield.
305
+ function yield_report(
306
+ issue_number: string,
307
+ { hold, cost }: Pick<EntryParts, 'hold' | 'cost'>,
308
+ ): number {
309
+ stop_report(issue_number, hold, cost, YIELD_NOTE)
310
+
311
+ return lane_plan_check.YIELD_EXIT_CODE
312
+ }
313
+
253
314
  // The tree is held and the budget allows the run, so the issue is marked as running before its reads
254
315
  // — the label then shows in the `labels:` line the report below carries.
255
- async function proceed(issue_number: string, hold: string, cost: string): Promise<number> {
316
+ // The plan event is written only once the run passed the trust gate.
317
+ async function proceed(
318
+ request: EntryRequest,
319
+ { hold, cost }: Pick<EntryParts, 'hold' | 'cost'>,
320
+ state: StageState,
321
+ ): Promise<number> {
322
+ const { issue_number } = request
323
+
256
324
  await run_label.mark(issue_number)
257
325
  const reads = await gather_reads(issue_number)
258
326
 
327
+ if (reads.trust_stop) return await stop_untrusted(request, { hold, cost }, reads.trust_stop)
328
+ if (await yields_at_entry(issue_number)) return yield_report(issue_number, { hold, cost })
329
+
330
+ await mark_planned(issue_number, state)
331
+
259
332
  // The issue the report prints is the one the run has read, so it is the baseline a person's later
260
333
  // update is measured against (`issue-watch.ts`).
261
334
  await issue_watch.record_baseline_here(issue_number)
262
335
 
263
- const code = emit({ issue_number, hold, cost, verdict: reads.verdict, report: reads.report })
336
+ const code = emit_fitted({ issue_number, hold, cost, verdict: reads.verdict }, reads.prep)
264
337
 
265
338
  // The entry's own read — the split assessment every run answers before its work — printed here so
266
339
  // the reader does not spend a turn fetching it.
@@ -269,10 +342,8 @@ async function proceed(issue_number: string, hold: string, cost: string): Promis
269
342
  return run_step_section.print_section(run_step_section.ENTRY)
270
343
  }
271
344
 
272
- async function claim_run(
273
- { issue_number, command }: EntryRequest,
274
- state: StageState,
275
- ): Promise<number> {
345
+ async function claim_run(request: EntryRequest, state: StageState): Promise<number> {
346
+ const { issue_number, command } = request
276
347
  const hold = await claim_hold(issue_number, command)
277
348
 
278
349
  if (hold !== run_hold_cli.HOLD_VERDICT) {
@@ -289,9 +360,7 @@ async function claim_run(
289
360
  return await stop_run({ parts, command, reason: BUDGET_REASON, should_release: true })
290
361
  }
291
362
 
292
- await mark_planned(issue_number, state)
293
-
294
- return await proceed(issue_number, hold, cost)
363
+ return await proceed(request, { hold, cost }, state)
295
364
  }
296
365
 
297
366
  // A carried cut is asked first, before anything is read (`run:cut --resume`); `kickoff` claims and cuts
@@ -0,0 +1,83 @@
1
+ import { mkdtempSync, writeFileSync } from 'node:fs'
2
+ import path from 'node:path'
3
+ import { capped_output } from '#scripts/document/capped-print'
4
+ import { capped_print_part } from '#scripts/document/capped-print-part'
5
+ import { document_section } from '#scripts/document/document-section'
6
+ import { document_section_cli } from '#scripts/document/document-section-cli'
7
+ import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
8
+ import { run_prep, type PrepParts } from '#scripts/run/run-prep'
9
+ import { run_step_section } from '#scripts/run/run-step-section'
10
+
11
+ // The `run:prep` bundle `run:entry` prints, kept under the Bash result cap (joshuafolkken/kit#5213).
12
+ // Past the cap the harness hands back a preview, and a lane child re-ran `run:entry` into a file to see
13
+ // the rest — two calls and two copies of the bundle in the context the implementation cut is measured on.
14
+ //
15
+ // **Over the budget, the whole bundle goes to one file and the issue section becomes its path.** The
16
+ // stage, the `entry` line, the `prep` summary and the short sections stay inline, so the run still
17
+ // branches on what it printed; the issue body and comments — the one unbounded section — are read from
18
+ // the file. A bundle still over the budget without them keeps only the summary and the path.
19
+ //
20
+ // **The file has `capped_print`'s shape** — a fresh directory per call holding one part — so the
21
+ // investigation guard already reads it as a session artifact, not as the Issue's subject.
22
+ //
23
+ // **The budget is `capped_output`'s, less what shares the same Bash result**: the split assessment's
24
+ // section `run:entry` prints after the bundle, and a second headroom for the stage line and the
25
+ // stderr the hold forwards before it.
26
+
27
+ const FILE_MODE = 0o600
28
+ const SECTION_SEPARATOR = '\n\n'
29
+
30
+ function byte_length(text: string): number {
31
+ return Buffer.byteLength(text, 'utf8')
32
+ }
33
+
34
+ function entry_section_length(root: string): number {
35
+ const found = run_step_section.GOVERNING_SECTIONS.get(run_step_section.ENTRY)
36
+
37
+ if (found === undefined) return 0
38
+
39
+ const file = document_section_cli.resolve_document(found.document, root)
40
+ const markdown = document_section.read_optional(file) ?? ''
41
+
42
+ return byte_length(document_section.section(markdown, found.heading)?.text ?? '')
43
+ }
44
+
45
+ function report_budget(root: string): number {
46
+ const shared = entry_section_length(root) + capped_output.HEADROOM_CHARS
47
+
48
+ return capped_output.output_budget(root) - shared
49
+ }
50
+
51
+ function spill(whole: string): string {
52
+ const directory = mkdtempSync(path.join(PLATFORM_TEMP_ROOT, capped_print_part.DIRECTORY_PREFIX))
53
+ const file = path.join(directory, capped_print_part.part_name(0))
54
+ const size = byte_length(whole).toLocaleString('en-US')
55
+
56
+ writeFileSync(file, whole, { flag: 'wx', mode: FILE_MODE })
57
+
58
+ return `Over the Bash cap — the whole bundle (${size} B, the issue body and comments included) is written to ${file}; read it with the Read tool, once, not cat.`
59
+ }
60
+
61
+ // `compose` turns a report into the text `run:entry` prints for it, so the measure is of what reaches
62
+ // the Bash result — the `entry` line and the cited links included — not of the report alone.
63
+ function fit(
64
+ parts: PrepParts,
65
+ compose: (report: string) => string,
66
+ root: string = process.cwd(),
67
+ ): string {
68
+ const budget = report_budget(root)
69
+ const whole = run_prep.format_report(parts)
70
+
71
+ if (byte_length(compose(whole)) <= budget) return whole
72
+
73
+ const line = spill(whole)
74
+ const trimmed = run_prep.format_report({ ...parts, content_body: line })
75
+
76
+ if (byte_length(compose(trimmed)) <= budget) return trimmed
77
+
78
+ return [run_prep.summary(parts), line].join(SECTION_SEPARATOR)
79
+ }
80
+
81
+ const run_entry_spill = { fit, report_budget }
82
+
83
+ export { run_entry_spill }
@@ -23,6 +23,8 @@ interface StopNotice {
23
23
  command: string
24
24
  reason: string
25
25
  should_release: boolean
26
+ // The choice the Telegram recommends where a rerun alone would stop the same way again.
27
+ recommended?: string
26
28
  }
27
29
 
28
30
  interface StopPorts {
@@ -79,7 +81,9 @@ async function notify_stop(notice: StopNotice, ports: StopPorts): Promise<void>
79
81
  issue_title: `${notice.command} ${issue_cite.plain(notice.issue_number)} stopped`,
80
82
  body: body_of(notice),
81
83
  recovery: RECOVERY,
82
- recommended: `Run \`${notice.command} ${issue_cite.plain(notice.issue_number)}\` again in a fresh session`,
84
+ recommended:
85
+ notice.recommended ??
86
+ `Run \`${notice.command} ${issue_cite.plain(notice.issue_number)}\` again in a fresh session`,
83
87
  alternatives: [LATER_ALTERNATIVE],
84
88
  })
85
89
 
@@ -0,0 +1,91 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
2
+ import type { BlockRead, BlockTrust } from '#scripts/issue/issue-read-cli'
3
+ import { issue_state } from '#scripts/issue/issue-state'
4
+ import type { StateRead } from '#scripts/issue/issue-state-cli'
5
+
6
+ // **An issue filed by an author without write access is not run on its own body**
7
+ // (joshuafolkken/kit#4663). `backlogrun` never offers one, but a person can still name it as
8
+ // `fullrun #N`, and its body would then reach the run as the specification. The run goes ahead only
9
+ // once a trusted person has planned it with `kickoff #N` — the `run:planned` label and a comment from
10
+ // an author with write access, the plan the run then follows instead of the body. Both, because the
11
+ // label alone is within triage access and a trusted comment alone may be an automated one.
12
+ //
13
+ // Decided from the reads `run:prep` already made, so the gate costs no further call. A read that
14
+ // failed is not judged here: `run:entry` already exits non-zero on it.
15
+ //
16
+ // **A trust read that failed stops as the failed read it is** (#4703) — a write-access lookup, the
17
+ // comment listing or the label read that answered nothing still stops the run, but naming an
18
+ // untrusted author there sends a person to plan an issue whose author may well be trusted.
19
+
20
+ const STOP_REASON =
21
+ 'the issue author does not have write access, and no trusted `kickoff` plan is on the issue'
22
+ const UNREAD_REASON =
23
+ 'the write-access lookup, the comment listing or the label read failed, so whether the issue may run on its body could not be read'
24
+ const UNREAD_REMEDY = 'Check `gh auth status` and the network, then run it again'
25
+
26
+ // What a stopped run prints, notifies and recommends.
27
+ interface TrustStop {
28
+ reason: string
29
+ report: string
30
+ recommended: string
31
+ }
32
+
33
+ // The remedy, named with the issue: a trusted person's `kickoff` writes the plan the run will follow.
34
+ function recommended(issue_number: string): string {
35
+ return `Have a person with write access run \`kickoff ${issue_cite.plain(issue_number)}\`, then run it again`
36
+ }
37
+
38
+ function untrusted_stop(issue_number: string): TrustStop {
39
+ const remedy = recommended(issue_number)
40
+
41
+ return {
42
+ reason: STOP_REASON,
43
+ report: `(issue author not trusted — ${remedy})`,
44
+ recommended: remedy,
45
+ }
46
+ }
47
+
48
+ const UNREAD_STOP: TrustStop = {
49
+ reason: UNREAD_REASON,
50
+ report: `(issue trust read failed — ${UNREAD_REMEDY})`,
51
+ recommended: UNREAD_REMEDY,
52
+ }
53
+
54
+ // Not cleared, and the read that would have cleared it answered nothing — a label read that failed
55
+ // leaves the plan unknown unless the comment listing already ruled it out.
56
+ function is_unread(trust: BlockTrust, state: StateRead): boolean {
57
+ const { is_body_trusted, has_trusted_comment } = trust
58
+
59
+ if (is_body_trusted === undefined) return true
60
+
61
+ const can_be_planned = state.kind !== 'state' || issue_state.is_planned(state)
62
+
63
+ return can_be_planned && has_trusted_comment !== false
64
+ }
65
+
66
+ // The plan is asked only of a body not already trusted — the state read is not needed otherwise.
67
+ function untrusted_body_stop(
68
+ trust: BlockTrust,
69
+ state: StateRead,
70
+ issue_number: string,
71
+ ): TrustStop | undefined {
72
+ if (issue_state.is_planned(state) && trust.has_trusted_comment === true) return undefined
73
+
74
+ return is_unread(trust, state) ? UNREAD_STOP : untrusted_stop(issue_number)
75
+ }
76
+
77
+ // The stop an issue's trust calls for, or `undefined` when the run may go ahead.
78
+ function stop_of(
79
+ content: BlockRead,
80
+ state: StateRead,
81
+ issue_number: string,
82
+ ): TrustStop | undefined {
83
+ if (content.kind !== 'ok' || content.trust.is_body_trusted === true) return undefined
84
+
85
+ return untrusted_body_stop(content.trust, state, issue_number)
86
+ }
87
+
88
+ const run_entry_trust = { STOP_REASON, UNREAD_REASON, stop_of }
89
+
90
+ export type { TrustStop }
91
+ export { run_entry_trust }
@@ -0,0 +1,56 @@
1
+ // The wording of the baseline investigation's notes on the run's event stream (joshuafolkken/kit#4887):
2
+ // `lane-baseline.ts` writes the launch and a failure, the session it launches writes its result, and
3
+ // `lane-baseline.ts` reads them back so a merge count is investigated once. `run:board` shows each as a
4
+ // note, since none reads as an overrun note.
5
+
6
+ const MERGES_PATTERN = /^baseline @(?<merges>\d+) merges: (?<rest>.*)$/u
7
+ const STARTED_PREFIX = 'started — '
8
+ const FAILED_PREFIX = 'baseline investigation failed: '
9
+
10
+ type BaselineNote =
11
+ | { kind: 'started'; merges: number; outcome: string }
12
+ | { kind: 'ended'; merges: number; result: string }
13
+ | { kind: 'failed'; note: string }
14
+
15
+ function merges_text(merges: number, rest: string): string {
16
+ return `baseline @${String(merges)} merges: ${rest}`
17
+ }
18
+
19
+ // The launch at the `merges`-th merge, and what became of it.
20
+ function started_text(merges: number, outcome: string): string {
21
+ return merges_text(merges, `${STARTED_PREFIX}${outcome}`)
22
+ }
23
+
24
+ // The session's result — the overrun investigation's vocabulary (`lane-overrun-prompt.ts`).
25
+ function ended_text(merges: number, result: string): string {
26
+ return merges_text(merges, result)
27
+ }
28
+
29
+ // A failure — reading the ledger, or the launch itself — names no merge count, so a later merge asks
30
+ // again.
31
+ function failed_text(note: string): string {
32
+ return `${FAILED_PREFIX}${note}`
33
+ }
34
+
35
+ function merges_note(merges: number, rest: string): BaselineNote {
36
+ if (rest.startsWith(STARTED_PREFIX)) {
37
+ return { kind: 'started', merges, outcome: rest.slice(STARTED_PREFIX.length) }
38
+ }
39
+
40
+ return { kind: 'ended', merges, result: rest }
41
+ }
42
+
43
+ function parse(text: string): BaselineNote | undefined {
44
+ const note = text.slice(FAILED_PREFIX.length)
45
+
46
+ if (text.startsWith(FAILED_PREFIX)) return { kind: 'failed', note }
47
+
48
+ const groups = MERGES_PATTERN.exec(text)?.groups
49
+
50
+ return groups ? merges_note(Number(groups['merges']), groups['rest'] ?? '') : undefined
51
+ }
52
+
53
+ const run_event_baseline = { ended_text, failed_text, parse, started_text }
54
+
55
+ export type { BaselineNote }
56
+ export { run_event_baseline }
@@ -29,14 +29,18 @@ interface Filed {
29
29
  // outside the run sharing the repository's stream (joshuafolkken/kit#4099). An event written before
30
30
  // the mark was recorded reads as filed outside.
31
31
  is_run?: boolean | undefined
32
+ // A lane's overrun investigation filed it, not the child (joshuafolkken/kit#4880). An event written
33
+ // before the mark was recorded reads as the child's.
34
+ is_overrun?: boolean | undefined
32
35
  }
33
36
 
34
37
  // The kind slot is always written, `[<label>]` or `[]`, against the reference with no space: an event
35
38
  // written before the kind always has the space there, so no title, whatever it opens with, reads as a
36
- // kind. The run's mark follows the kind slot, again with no space.
39
+ // kind. The run's mark follows the kind slot, then the overrun's, again with no space.
37
40
  const RUN_MARK = '[run]'
41
+ const OVERRUN_MARK = '[overrun]'
38
42
  const TEXT_PATTERN = new RegExp(
39
- String.raw`^(?<reference>\S*#\d+)(?:\[(?<kind>${KINDS.join('|')}|)\](?<run>\[run\])?)? (?<title>.*?)(?: \(found during #(?<during>\d+)\))?$`,
43
+ String.raw`^(?<reference>\S*#\d+)(?:\[(?<kind>${KINDS.join('|')}|)\](?<run>\[run\])?(?<overrun>\[overrun\])?)? (?<title>.*?)(?: \(found during #(?<during>\d+)\))?$`,
40
44
  'u',
41
45
  )
42
46
 
@@ -46,7 +50,8 @@ function kind_of(labels: ReadonlyArray<string>): FiledKind | undefined {
46
50
  }
47
51
 
48
52
  function text_of(filed: Filed): string {
49
- const kind = `[${filed.kind ?? ''}]${filed.is_run === true ? RUN_MARK : ''}`
53
+ const marks = `${filed.is_run === true ? RUN_MARK : ''}${filed.is_overrun === true ? OVERRUN_MARK : ''}`
54
+ const kind = `[${filed.kind ?? ''}]${marks}`
50
55
  const suffix =
51
56
  filed.found_during === undefined
52
57
  ? ''
@@ -66,6 +71,7 @@ function parse(text: string): Filed | undefined {
66
71
  title: String(groups['title']),
67
72
  found_during: groups['during'],
68
73
  is_run: groups['run'] !== undefined,
74
+ is_overrun: groups['overrun'] !== undefined,
69
75
  }
70
76
  }
71
77