@joshuafolkken/kit 1.1240.0 → 1.1370.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (934) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +50 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +19 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +26 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +17 -28
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.vscode/tasks.json +14 -0
  42. package/CLAUDE.md +10 -61
  43. package/README.md +29 -47
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +42 -10
  47. package/dist/config-merge/index.js +11 -2
  48. package/dist/hooks/audit-provision.js +2 -2
  49. package/dist/hooks/batch-guard.js +7 -7
  50. package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
  51. package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
  52. package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
  53. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
  54. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  55. package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
  56. package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
  57. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
  60. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  61. package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
  62. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  63. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
  64. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  65. package/dist/hooks/codex-hook-adapter.js +26 -21
  66. package/dist/hooks/duplicate-read-guard.js +8 -8
  67. package/dist/hooks/format-edited.js +4 -4
  68. package/dist/hooks/inputs.json +216 -202
  69. package/dist/hooks/investigation-guard.js +8 -8
  70. package/dist/hooks/pretool-guard.js +15 -15
  71. package/dist/hooks/session-lang.js +406 -8
  72. package/dist/hooks/stop-guard.js +122 -187
  73. package/dist/josh.js +281 -94
  74. package/dist/version/index.js +15 -13
  75. package/eslint/base.js +43 -5
  76. package/eslint/rules/english-only-prose.js +3 -3
  77. package/eslint/rules/import.js +12 -0
  78. package/eslint/rules/namespace-object-export.js +2 -2
  79. package/package.json +16 -10
  80. package/pnpm-workspace.yaml +2 -4
  81. package/prompts/coding-standards.md +14 -48
  82. package/prompts/collaboration-workflow/file-edits.md +1 -1
  83. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  84. package/prompts/collaboration-workflow/issue-template.md +3 -10
  85. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  86. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  87. package/prompts/collaboration-workflow/overview.md +1 -1
  88. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  89. package/prompts/collaboration-workflow/principles.md +21 -3
  90. package/prompts/collaboration-workflow/report-format.md +16 -29
  91. package/prompts/collaboration-workflow/residency.md +1 -1
  92. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  93. package/prompts/collaboration-workflow/shell-body.md +3 -23
  94. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  95. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +3 -22
  98. package/prompts/review.md +15 -38
  99. package/prompts/testing-guide.md +2 -4
  100. package/scripts/adopt/adopt-logic.ts +5 -5
  101. package/scripts/adopt/adopt-toolkits.ts +4 -5
  102. package/scripts/adopt/adopt.ts +2 -3
  103. package/scripts/agent/agent-argv.ts +7 -7
  104. package/scripts/agent/agent-diagnostics.ts +2 -2
  105. package/scripts/agent/agent-exit-record.ts +1 -1
  106. package/scripts/agent/agent-headless.ts +1 -1
  107. package/scripts/agent/agent-launch-environment.ts +6 -1
  108. package/scripts/agent/agent-role-profile.ts +49 -22
  109. package/scripts/agent/agent-session-role.ts +32 -0
  110. package/scripts/agent/api-outage.ts +1 -1
  111. package/scripts/agent/claude-agent-argv.ts +4 -4
  112. package/scripts/agent/claude-result-event.ts +4 -4
  113. package/scripts/agent/codex-hooks.ts +2 -2
  114. package/scripts/agent/interactive-ask.ts +3 -6
  115. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  116. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  117. package/scripts/backlog/backlog-arrival.ts +54 -17
  118. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  119. package/scripts/backlog/backlog-budget.ts +17 -24
  120. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  121. package/scripts/backlog/backlog-drive-args.ts +5 -4
  122. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  123. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  124. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  125. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  126. package/scripts/backlog/backlog-drive-named.ts +39 -9
  127. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  128. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  129. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  130. package/scripts/backlog/backlog-drive.ts +43 -28
  131. package/scripts/backlog/backlog-idle.ts +88 -0
  132. package/scripts/backlog/backlog-named.ts +11 -15
  133. package/scripts/backlog/backlog-next.ts +26 -30
  134. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  135. package/scripts/backlog/backlog-offer.ts +7 -7
  136. package/scripts/backlog/backlog-overlap.ts +178 -0
  137. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  138. package/scripts/backlog/backlog-plan-read.ts +111 -0
  139. package/scripts/backlog/backlog-plan.ts +11 -10
  140. package/scripts/backlog/backlog-pool.ts +13 -14
  141. package/scripts/backlog/backlog-rank.ts +11 -11
  142. package/scripts/backlog/backlog-ready.ts +15 -10
  143. package/scripts/backlog/backlog-scope.ts +14 -15
  144. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  145. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  146. package/scripts/backlog/backlog-stalled.ts +5 -6
  147. package/scripts/backlog/backlog-waves.ts +4 -4
  148. package/scripts/backlog/backlogrun-args.ts +74 -0
  149. package/scripts/backlog/backlogrun-cli.ts +113 -0
  150. package/scripts/backlog/backlogrun-launch.ts +178 -0
  151. package/scripts/behavior/behavior-assertion.ts +6 -8
  152. package/scripts/behavior/behavior-cli.ts +1 -1
  153. package/scripts/behavior/behavior-rules.ts +3 -3
  154. package/scripts/build/build-claude-md.ts +4 -4
  155. package/scripts/build/build-codex-hooks.ts +2 -2
  156. package/scripts/build/build-commands.ts +1 -1
  157. package/scripts/build/build-hooks.ts +5 -5
  158. package/scripts/build/build.ts +1 -1
  159. package/scripts/build/hook-bundle-stamp.ts +109 -7
  160. package/scripts/build/local-bin.ts +2 -2
  161. package/scripts/cases/cases-cli.ts +1 -1
  162. package/scripts/cases/cases-logic.ts +2 -2
  163. package/scripts/ci/composite-actions.ts +1 -2
  164. package/scripts/ci/pr-classification.ts +2 -2
  165. package/scripts/claude/workflow-destination.ts +1 -1
  166. package/scripts/clone/clone-aggregate.ts +1 -1
  167. package/scripts/clone/clone-fingerprint.ts +1 -1
  168. package/scripts/clone/clone-scan-cli.ts +1 -1
  169. package/scripts/clone/clone-scan.ts +1 -1
  170. package/scripts/config-merge/index.ts +1 -1
  171. package/scripts/config-merge/json-format.ts +1 -3
  172. package/scripts/config-merge/patch-json-array.ts +90 -0
  173. package/scripts/config-merge/patch-json-key.ts +6 -3
  174. package/scripts/config-merge/patch-json-list.ts +1 -1
  175. package/scripts/cost-runtime/codex-usage.ts +1 -1
  176. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  177. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  178. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  179. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  180. package/scripts/cost-runtime/cost-cli.ts +14 -11
  181. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  182. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  183. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  184. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  185. package/scripts/cost-runtime/cost-usage.ts +6 -7
  186. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  187. package/scripts/cost-runtime/own-session.ts +1 -1
  188. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  189. package/scripts/delegation/delegation-cli.ts +4 -4
  190. package/scripts/delegation/delegation-policy.ts +13 -15
  191. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  192. package/scripts/delegation/fanout-cli.ts +1 -1
  193. package/scripts/delegation/fanout.ts +1 -1
  194. package/scripts/delegation/investigation-guard.ts +18 -22
  195. package/scripts/delegation/investigation-reads.ts +48 -238
  196. package/scripts/discovery/repo-discovery.ts +1 -1
  197. package/scripts/discovery/repo-map-logic.ts +1 -2
  198. package/scripts/discovery/repo-origin.ts +3 -3
  199. package/scripts/discovery/repo-party-cli.ts +2 -2
  200. package/scripts/discovery/repo-party.ts +2 -2
  201. package/scripts/doctor/doctor-consumer.ts +1 -1
  202. package/scripts/doctor/doctor-io.ts +6 -7
  203. package/scripts/doctor/doctor-logic.ts +1 -1
  204. package/scripts/doctor/doctor-ports.ts +1 -1
  205. package/scripts/doctor/doctor.ts +8 -9
  206. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  207. package/scripts/document/bash-output-cap.ts +5 -7
  208. package/scripts/document/capped-print-part.ts +1 -1
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/document-byte-budget.ts +33 -64
  211. package/scripts/document/document-byte-check.ts +4 -4
  212. package/scripts/document/document-reachability.ts +7 -8
  213. package/scripts/document/document-read-cli.ts +2 -2
  214. package/scripts/document/document-scan.ts +26 -2
  215. package/scripts/document/document-section-cli.ts +6 -8
  216. package/scripts/document/document-section.ts +8 -12
  217. package/scripts/document/edit-files-cli.ts +3 -4
  218. package/scripts/document/entry-read-budget.ts +8 -70
  219. package/scripts/document/entry-read-set.ts +51 -34
  220. package/scripts/document/lane-child-read-set.ts +9 -9
  221. package/scripts/document/read-files-cli.ts +1 -2
  222. package/scripts/document/read-set-cli.ts +16 -19
  223. package/scripts/document/read-set-cost.ts +4 -4
  224. package/scripts/document/read-set-point-of-use.ts +28 -38
  225. package/scripts/document/read-set-pricing.ts +1 -1
  226. package/scripts/document/read-set-trim.ts +3 -3
  227. package/scripts/document/resident-budget.ts +8 -10
  228. package/scripts/epic/epic-add-body.ts +15 -18
  229. package/scripts/epic/epic-add-plan.ts +26 -28
  230. package/scripts/epic/epic-add.ts +32 -25
  231. package/scripts/epic/epic-audit-checks.ts +27 -37
  232. package/scripts/epic/epic-audit-cli.ts +21 -22
  233. package/scripts/epic/epic-audit-orphans.ts +16 -17
  234. package/scripts/epic/epic-audit-rationale.ts +10 -15
  235. package/scripts/epic/epic-audit-report.ts +2 -5
  236. package/scripts/epic/epic-audit.ts +18 -14
  237. package/scripts/epic/epic-body.ts +10 -10
  238. package/scripts/epic/epic-bundle-cli.ts +36 -34
  239. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  240. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  241. package/scripts/epic/epic-bundle-poll.ts +1 -1
  242. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  243. package/scripts/epic/epic-bundle.ts +19 -20
  244. package/scripts/epic/epic-busy.ts +44 -21
  245. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  246. package/scripts/epic/epic-chains.ts +18 -23
  247. package/scripts/epic/epic-classify.ts +11 -12
  248. package/scripts/epic/epic-cli-argv.ts +5 -6
  249. package/scripts/epic/epic-cli-remove.ts +9 -4
  250. package/scripts/epic/epic-cli.ts +38 -26
  251. package/scripts/epic/epic-close-comment.ts +14 -15
  252. package/scripts/epic/epic-close.ts +25 -29
  253. package/scripts/epic/epic-cross-repo.ts +18 -21
  254. package/scripts/epic/epic-decision.ts +14 -18
  255. package/scripts/epic/epic-fetch.ts +25 -31
  256. package/scripts/epic/epic-graph.ts +15 -17
  257. package/scripts/epic/epic-index.ts +14 -16
  258. package/scripts/epic/epic-issue.ts +9 -11
  259. package/scripts/epic/epic-label-age.ts +74 -0
  260. package/scripts/epic/epic-lane-offer.ts +35 -24
  261. package/scripts/epic/epic-nested.ts +1 -1
  262. package/scripts/epic/epic-next-read.ts +8 -8
  263. package/scripts/epic/epic-next-views.ts +12 -12
  264. package/scripts/epic/epic-next.ts +29 -33
  265. package/scripts/epic/epic-outside-blocker.ts +11 -10
  266. package/scripts/epic/epic-parse.ts +22 -24
  267. package/scripts/epic/epic-promote.ts +3 -2
  268. package/scripts/epic/epic-rank.ts +1 -1
  269. package/scripts/epic/epic-read.ts +10 -8
  270. package/scripts/epic/epic-reconcile.ts +8 -6
  271. package/scripts/epic/epic-reference.ts +5 -4
  272. package/scripts/epic/epic-relation-recheck.ts +10 -11
  273. package/scripts/epic/epic-relations.ts +9 -8
  274. package/scripts/epic/epic-remove-plan.ts +4 -5
  275. package/scripts/epic/epic-remove.ts +7 -5
  276. package/scripts/epic/epic-report.ts +18 -20
  277. package/scripts/epic/epic-run.ts +6 -5
  278. package/scripts/epic/epic-sections.ts +2 -2
  279. package/scripts/epic/epic-shape.ts +3 -3
  280. package/scripts/epic/epic-solo-stale.ts +3 -2
  281. package/scripts/epic/epic-solo.ts +8 -8
  282. package/scripts/epic/epic-triage.ts +5 -4
  283. package/scripts/epic/epic-validate.ts +8 -7
  284. package/scripts/epic/epic.ts +5 -5
  285. package/scripts/exports/unused-members-cli.ts +1 -1
  286. package/scripts/followup/followup-issue-number.ts +1 -2
  287. package/scripts/followup/git-followup-cleanup.ts +6 -7
  288. package/scripts/followup/git-followup-finish.ts +11 -13
  289. package/scripts/followup/git-followup-flush.ts +11 -7
  290. package/scripts/followup/git-followup-issue-close.ts +16 -13
  291. package/scripts/followup/git-followup-label.ts +9 -6
  292. package/scripts/followup/git-followup-merged.ts +1 -1
  293. package/scripts/followup/git-followup-pending.ts +7 -9
  294. package/scripts/followup/git-followup-stages.ts +28 -17
  295. package/scripts/followup/git-followup-workflow.ts +19 -21
  296. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  297. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  298. package/scripts/followup/git-pr-followup.ts +18 -17
  299. package/scripts/gate/core-admission.ts +2 -2
  300. package/scripts/gate/core-budget.ts +15 -26
  301. package/scripts/gate/gate-ledger.ts +114 -0
  302. package/scripts/gate/gate-log.ts +7 -9
  303. package/scripts/gate/gate-plan.ts +70 -35
  304. package/scripts/gate/gate-report.ts +14 -15
  305. package/scripts/gate/gate-skip.ts +11 -13
  306. package/scripts/gate/gate-steps.ts +5 -1
  307. package/scripts/gate/gate-tree.ts +3 -4
  308. package/scripts/gate/hook-gate-reuse.ts +9 -9
  309. package/scripts/gate/machine-capacity.ts +168 -30
  310. package/scripts/gate/pre-commit-type-check.ts +4 -4
  311. package/scripts/gate/project-checks.ts +12 -4
  312. package/scripts/gate/scoped-green.ts +11 -18
  313. package/scripts/gate/type-check-command.ts +2 -2
  314. package/scripts/gate/type-check-step.ts +4 -4
  315. package/scripts/gate/verification-gate.ts +53 -51
  316. package/scripts/gh/gh-spawn.ts +2 -2
  317. package/scripts/gh/git-ai-review-scan.ts +3 -2
  318. package/scripts/gh/git-gh-api-path.ts +10 -11
  319. package/scripts/gh/git-gh-exec.ts +43 -48
  320. package/scripts/gh/git-gh-failure.ts +6 -9
  321. package/scripts/gh/git-gh-helpers.ts +1 -1
  322. package/scripts/gh/git-gh-issue-list.ts +15 -19
  323. package/scripts/gh/git-gh-issue-read.ts +43 -60
  324. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  325. package/scripts/gh/git-gh-issue-write.ts +52 -40
  326. package/scripts/gh/git-gh-issue.ts +23 -24
  327. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  328. package/scripts/gh/git-gh-pr-read.ts +46 -50
  329. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  330. package/scripts/gh/git-gh-pr-review.ts +2 -2
  331. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  332. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  333. package/scripts/gh/git-gh-pr.ts +16 -16
  334. package/scripts/gh/git-gh-reachability.ts +11 -12
  335. package/scripts/gh/git-gh-repo.ts +2 -3
  336. package/scripts/gh/git-gh-rest-state.ts +1 -1
  337. package/scripts/gh/git-pr-ai-review.ts +6 -5
  338. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  339. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  340. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  341. package/scripts/gh/git-pr-checks.ts +20 -23
  342. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  343. package/scripts/gh/git-pr-confirmation.ts +5 -5
  344. package/scripts/gh/git-pr-managed-config.ts +7 -9
  345. package/scripts/gh/git-pr-messages.ts +1 -1
  346. package/scripts/gh/git-pr.ts +15 -16
  347. package/scripts/gh/github-issue-url.ts +8 -9
  348. package/scripts/git/base-tree.ts +66 -0
  349. package/scripts/git/change-base.ts +42 -2
  350. package/scripts/git/changed-file-scope.ts +5 -5
  351. package/scripts/git/changed-paths.ts +1 -2
  352. package/scripts/git/constants.ts +2 -2
  353. package/scripts/git/git-branch.ts +1 -1
  354. package/scripts/git/git-closes-keyword.ts +3 -3
  355. package/scripts/git/git-command.ts +53 -41
  356. package/scripts/git/git-common-directory.ts +3 -3
  357. package/scripts/git/git-diff-reads.ts +14 -15
  358. package/scripts/git/git-error.ts +1 -1
  359. package/scripts/git/git-execa-error.ts +1 -2
  360. package/scripts/git/git-issue.ts +10 -8
  361. package/scripts/git/git-location-environment.ts +3 -4
  362. package/scripts/git/git-ls-remote.ts +6 -8
  363. package/scripts/git/git-pre-push-hook.ts +11 -10
  364. package/scripts/git/git-preflight.ts +5 -5
  365. package/scripts/git/git-push-transport.ts +2 -2
  366. package/scripts/git/git-remote-branch.ts +1 -2
  367. package/scripts/git/git-schemas.ts +16 -23
  368. package/scripts/git/git-spawn-sync.ts +1 -1
  369. package/scripts/git/git-spawn.ts +37 -14
  370. package/scripts/git/git-ssh-keepalive.ts +12 -5
  371. package/scripts/git/git-staging.ts +7 -8
  372. package/scripts/git/git-workflow.ts +1 -1
  373. package/scripts/git/git-worktree.ts +35 -27
  374. package/scripts/git/gone-branch.ts +2 -2
  375. package/scripts/git/listing-cutoff.ts +1 -2
  376. package/scripts/git/lockfile-sync.ts +65 -0
  377. package/scripts/git/main-merge-guard.ts +1 -2
  378. package/scripts/git/main-merge.ts +7 -7
  379. package/scripts/git/main-sync.ts +23 -8
  380. package/scripts/git/parse-json-array.ts +18 -23
  381. package/scripts/git/repository-lock.ts +34 -2
  382. package/scripts/git/stash/git-stash.ts +4 -5
  383. package/scripts/git/stash/stash-orphans.ts +5 -3
  384. package/scripts/git/stash/stash-pop-args.ts +1 -1
  385. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  386. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  387. package/scripts/hooks/batch-guard.ts +11 -13
  388. package/scripts/hooks/check-commit-message.ts +12 -9
  389. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  390. package/scripts/hooks/edited-cspell.ts +3 -4
  391. package/scripts/hooks/format-edited-cli.ts +1 -1
  392. package/scripts/hooks/format-edited-file.ts +11 -17
  393. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  394. package/scripts/hooks/pre-push-unit.ts +10 -14
  395. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  396. package/scripts/hooks/pretool-guard.ts +93 -18
  397. package/scripts/hooks/reserved-run.ts +2 -2
  398. package/scripts/hooks/step-zero-notice.ts +1 -1
  399. package/scripts/hooks/stop-guard.ts +21 -10
  400. package/scripts/init/basic-path-migration.ts +2 -2
  401. package/scripts/init/claude-kit-only-settings.ts +2 -2
  402. package/scripts/init/claude-plugin-config.ts +2 -2
  403. package/scripts/init/distributed-paths.ts +4 -4
  404. package/scripts/init/hook-command-rewrite.ts +3 -3
  405. package/scripts/init/hook-launch.ts +5 -5
  406. package/scripts/init/init-actions.ts +13 -0
  407. package/scripts/init/init-ai-copy.ts +11 -11
  408. package/scripts/init/init-bootstrap.ts +3 -3
  409. package/scripts/init/init-copy-content.ts +4 -4
  410. package/scripts/init/init-logic-json-merge.ts +7 -9
  411. package/scripts/init/init-logic-migrate.ts +1 -1
  412. package/scripts/init/init-logic-templates.ts +1 -1
  413. package/scripts/init/init-logic-workspace.ts +4 -4
  414. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  415. package/scripts/init/init-logic.ts +19 -22
  416. package/scripts/init/init.ts +7 -7
  417. package/scripts/init/kit-base-preset.ts +1 -1
  418. package/scripts/init/kit-setup-state.ts +1 -1
  419. package/scripts/init/kit-written-paths.ts +1 -2
  420. package/scripts/init/package-manager-pin.ts +1 -1
  421. package/scripts/init/project-profile-cli.ts +1 -1
  422. package/scripts/init/project-profile.ts +3 -3
  423. package/scripts/init/session-language-environment.ts +1 -1
  424. package/scripts/init/start-exec.ts +3 -4
  425. package/scripts/init/start-plan.ts +2 -2
  426. package/scripts/init/start-setup-pr.ts +3 -2
  427. package/scripts/init/start-steps.ts +2 -2
  428. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  429. package/scripts/init/vscode-tasks.ts +62 -0
  430. package/scripts/issue/baseline-measure.ts +2 -2
  431. package/scripts/issue/behavior-change-lint.ts +2 -2
  432. package/scripts/issue/defect-rate-cli.ts +6 -7
  433. package/scripts/issue/defect-rate.ts +37 -27
  434. package/scripts/issue/git-next-issues.ts +9 -8
  435. package/scripts/issue/issue-auto-ok.ts +24 -11
  436. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  437. package/scripts/issue/issue-backlinks.ts +6 -6
  438. package/scripts/issue/issue-cite-cli.ts +20 -18
  439. package/scripts/issue/issue-cite.ts +18 -8
  440. package/scripts/issue/issue-closing-pr.ts +4 -4
  441. package/scripts/issue/issue-comment-cli.ts +6 -4
  442. package/scripts/issue/issue-file-cli.ts +52 -15
  443. package/scripts/issue/issue-file-fold.ts +155 -0
  444. package/scripts/issue/issue-file.ts +9 -6
  445. package/scripts/issue/issue-fold-cli.ts +14 -9
  446. package/scripts/issue/issue-fold.ts +23 -8
  447. package/scripts/issue/issue-labels.ts +34 -38
  448. package/scripts/issue/issue-lint-cli.ts +2 -2
  449. package/scripts/issue/issue-lint.ts +1 -1
  450. package/scripts/issue/issue-merged.ts +10 -4
  451. package/scripts/issue/issue-number-shape.ts +27 -0
  452. package/scripts/issue/issue-rank.ts +1 -1
  453. package/scripts/issue/issue-read-cli.ts +4 -5
  454. package/scripts/issue/issue-read.ts +4 -5
  455. package/scripts/issue/issue-reference.ts +5 -5
  456. package/scripts/issue/issue-release-cli.ts +17 -7
  457. package/scripts/issue/issue-release.ts +3 -3
  458. package/scripts/issue/issue-report-failures.ts +7 -4
  459. package/scripts/issue/issue-scout-cli.ts +11 -11
  460. package/scripts/issue/issue-scout-closed.ts +4 -4
  461. package/scripts/issue/issue-scout.ts +4 -5
  462. package/scripts/issue/issue-state-cli.ts +17 -10
  463. package/scripts/issue/issue-state.ts +12 -13
  464. package/scripts/issue/issue-wip.ts +7 -7
  465. package/scripts/issue/markdown-section.ts +3 -3
  466. package/scripts/issue/measure-rerun-cli.ts +10 -9
  467. package/scripts/issue/reproduction-measure.ts +3 -3
  468. package/scripts/issue/session-cite.ts +56 -0
  469. package/scripts/josh/agent-session-environment.ts +10 -8
  470. package/scripts/josh/cli-body.ts +2 -2
  471. package/scripts/josh/command-suggest.ts +1 -1
  472. package/scripts/josh/file-map-stamp.ts +20 -23
  473. package/scripts/josh/hook-decision.ts +24 -28
  474. package/scripts/josh/josh-command-map.ts +4 -1
  475. package/scripts/josh/josh-command-types.ts +30 -35
  476. package/scripts/josh/josh-commands-ai.ts +6 -6
  477. package/scripts/josh/josh-commands-backlog.ts +15 -3
  478. package/scripts/josh/josh-commands-clone.ts +1 -1
  479. package/scripts/josh/josh-commands-development.ts +25 -4
  480. package/scripts/josh/josh-commands-document.ts +3 -3
  481. package/scripts/josh/josh-commands-guard.ts +3 -3
  482. package/scripts/josh/josh-commands-issue.ts +4 -5
  483. package/scripts/josh/josh-commands-lane.ts +14 -4
  484. package/scripts/josh/josh-commands-lint.ts +1 -1
  485. package/scripts/josh/josh-commands-run.ts +20 -6
  486. package/scripts/josh/josh-commands-split.ts +1 -2
  487. package/scripts/josh/josh-commands-versioning.ts +5 -5
  488. package/scripts/josh/josh-commands-workflow.ts +30 -22
  489. package/scripts/josh/josh-environment-file.ts +1 -1
  490. package/scripts/josh/josh-in-process.ts +3 -3
  491. package/scripts/josh/josh-logic.ts +6 -7
  492. package/scripts/josh/josh-run.ts +3 -3
  493. package/scripts/josh/josh-verdict.ts +9 -12
  494. package/scripts/josh/josh.ts +3 -3
  495. package/scripts/josh/kit-only.ts +2 -2
  496. package/scripts/josh/path-decision.ts +3 -3
  497. package/scripts/josh/platform-temporary.ts +7 -5
  498. package/scripts/josh/process-identity.ts +24 -6
  499. package/scripts/josh/process-owner.ts +4 -4
  500. package/scripts/josh/session-language-cli.ts +53 -11
  501. package/scripts/josh/session-language.ts +1 -1
  502. package/scripts/josh/stamp-file.ts +48 -29
  503. package/scripts/josh/stamp-record.ts +57 -0
  504. package/scripts/lane/lane-await.ts +35 -11
  505. package/scripts/lane/lane-cache.ts +6 -6
  506. package/scripts/lane/lane-capacity.ts +32 -17
  507. package/scripts/lane/lane-child-invocation.ts +17 -15
  508. package/scripts/lane/lane-child-marker.ts +12 -12
  509. package/scripts/lane/lane-cli.ts +12 -13
  510. package/scripts/lane/lane-close.ts +6 -6
  511. package/scripts/lane/lane-dispatch.ts +61 -72
  512. package/scripts/lane/lane-environment.ts +5 -5
  513. package/scripts/lane/lane-guard-policy.ts +7 -21
  514. package/scripts/lane/lane-handoff.ts +2 -2
  515. package/scripts/lane/lane-install.ts +9 -10
  516. package/scripts/lane/lane-launch-cli.ts +13 -8
  517. package/scripts/lane/lane-ledger.ts +73 -11
  518. package/scripts/lane/lane-leftover.ts +2 -2
  519. package/scripts/lane/lane-limit-cli.ts +160 -0
  520. package/scripts/lane/lane-limit-override.ts +74 -0
  521. package/scripts/lane/lane-load.ts +19 -68
  522. package/scripts/lane/lane-measure-cli.ts +15 -25
  523. package/scripts/lane/lane-occupancy.ts +6 -4
  524. package/scripts/lane/lane-open.ts +20 -19
  525. package/scripts/lane/lane-output.ts +4 -3
  526. package/scripts/lane/lane-paths.ts +12 -11
  527. package/scripts/lane/lane-phase.ts +33 -0
  528. package/scripts/lane/lane-reap.ts +2 -2
  529. package/scripts/lane/lane-registry.ts +16 -15
  530. package/scripts/lane/lane-relaunch.ts +9 -9
  531. package/scripts/lane/lane-report.ts +5 -4
  532. package/scripts/lane/lane-resume.ts +2 -2
  533. package/scripts/lane/lane-sampler.ts +55 -0
  534. package/scripts/lane/lane-seed.ts +7 -7
  535. package/scripts/lane/lane-stage-stats.ts +135 -0
  536. package/scripts/lane/lane-start-point.ts +8 -11
  537. package/scripts/lane/lane-stats.ts +60 -15
  538. package/scripts/lane/lane-stray.ts +1 -1
  539. package/scripts/lane/lane-vacant.ts +1 -1
  540. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  541. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  542. package/scripts/lane/openai-review-broker.ts +2 -4
  543. package/scripts/lib/ancestor-directories.ts +1 -1
  544. package/scripts/lib/bounded-pool.ts +2 -2
  545. package/scripts/lib/buffered-process.ts +4 -6
  546. package/scripts/lib/caddy-logs.sh +0 -0
  547. package/scripts/lib/cli-flags.ts +39 -6
  548. package/scripts/lib/error-message.ts +1 -1
  549. package/scripts/lib/json-value.ts +17 -3
  550. package/scripts/lib/poll.ts +1 -1
  551. package/scripts/lib/status-icons.ts +3 -3
  552. package/scripts/lib/timed-fetch.ts +1 -1
  553. package/scripts/lib/timeouts.ts +1 -1
  554. package/scripts/lines/bytes-command.ts +3 -4
  555. package/scripts/lines/effective-limit.ts +25 -12
  556. package/scripts/lines/line-budget.ts +47 -55
  557. package/scripts/lines/line-targets.ts +6 -2
  558. package/scripts/lines/lines-command.ts +3 -3
  559. package/scripts/lint/cspell-cached.ts +1 -1
  560. package/scripts/lint/cycle-recheck.ts +122 -0
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +34 -19
  563. package/scripts/lint/lint-related-scope.ts +25 -15
  564. package/scripts/lint/lint-related.ts +6 -7
  565. package/scripts/managed-marker/index.ts +1 -1
  566. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  567. package/scripts/notify/git-notify.ts +9 -7
  568. package/scripts/notify/telegram-notify.ts +53 -37
  569. package/scripts/notify/telegram-test-logic.ts +3 -3
  570. package/scripts/notify/telegram-test.ts +45 -30
  571. package/scripts/observations/observation-ledger-home.ts +14 -8
  572. package/scripts/observations/observation-ledger-line.ts +3 -2
  573. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  574. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  575. package/scripts/observations/observation-ledger.ts +14 -15
  576. package/scripts/observations/observation-record-cli.ts +83 -0
  577. package/scripts/observations/observation-record.ts +91 -0
  578. package/scripts/observations/observations-flush-cli.ts +1 -1
  579. package/scripts/observations/observations-flush-landing.ts +7 -6
  580. package/scripts/observations/observations-flush.ts +26 -27
  581. package/scripts/overrides/overrides-check.ts +18 -8
  582. package/scripts/package/package-scout-cli.ts +1 -1
  583. package/scripts/package/package-scout-format.ts +2 -2
  584. package/scripts/package/package-scout.ts +1 -1
  585. package/scripts/propagate/propagate-git-failure.ts +1 -1
  586. package/scripts/propagate/propagate-git.ts +7 -7
  587. package/scripts/propagate/propagate-plan.ts +2 -2
  588. package/scripts/propagate/propagate-publish.ts +2 -3
  589. package/scripts/propagate/propagate-run.ts +5 -7
  590. package/scripts/propagate/propagate-select.ts +1 -1
  591. package/scripts/propagate/propagate-steps.ts +19 -20
  592. package/scripts/propagate/propagate-targets.ts +6 -10
  593. package/scripts/propagate/propagate.ts +5 -5
  594. package/scripts/refactor/import-graph.ts +1 -1
  595. package/scripts/refactor/refactor-lint.ts +4 -10
  596. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  597. package/scripts/refactor/refactor-scan.ts +2 -2
  598. package/scripts/refactor/refactor-targets.ts +1 -1
  599. package/scripts/release/github-release-cli.ts +25 -3
  600. package/scripts/release/github-release-runs.ts +1 -1
  601. package/scripts/release/release-cli.ts +21 -4
  602. package/scripts/release/release-history.ts +6 -10
  603. package/scripts/release/release-plan.ts +3 -3
  604. package/scripts/release/release-progress.ts +3 -4
  605. package/scripts/release/release-publish.ts +8 -9
  606. package/scripts/release/release-scope-cli.ts +8 -10
  607. package/scripts/release/release-tag.ts +6 -8
  608. package/scripts/release/release-worktree.ts +5 -5
  609. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  610. package/scripts/repo/auto-merge-setting.ts +1 -1
  611. package/scripts/repo/repo-setting.ts +4 -4
  612. package/scripts/repo/repository-labels.ts +1 -1
  613. package/scripts/repo/required-checks-logic.ts +3 -3
  614. package/scripts/repo/required-checks-report.ts +1 -1
  615. package/scripts/repo/ruleset-check-cli.ts +1 -1
  616. package/scripts/repo/ruleset-check.ts +1 -1
  617. package/scripts/report/report-format-reference.ts +26 -0
  618. package/scripts/report/report-lint-cli.ts +2 -2
  619. package/scripts/report/report-lint.ts +16 -2
  620. package/scripts/review/disposition-cli.ts +2 -2
  621. package/scripts/review/disposition-logic.ts +1 -1
  622. package/scripts/review/live-evidence.ts +9 -6
  623. package/scripts/review/review-attest-cli.ts +1 -2
  624. package/scripts/review/review-attest.ts +3 -3
  625. package/scripts/review/review-brief-cli.ts +19 -20
  626. package/scripts/review/review-brief.ts +29 -32
  627. package/scripts/review/review-checkout.ts +2 -2
  628. package/scripts/review/review-diff-parts.ts +3 -5
  629. package/scripts/review/review-diff-write.ts +1 -1
  630. package/scripts/review/review-finding-ledger.ts +7 -4
  631. package/scripts/review/review-findings-cli.ts +2 -2
  632. package/scripts/review/review-level.ts +4 -7
  633. package/scripts/review/review-record-cli.ts +73 -16
  634. package/scripts/review/review-record.ts +5 -4
  635. package/scripts/review/review-round2-cli.ts +2 -3
  636. package/scripts/review/review-round2.ts +13 -21
  637. package/scripts/review/review-stamps.ts +9 -71
  638. package/scripts/review/review-tree.ts +4 -5
  639. package/scripts/rules/bash-triggers.ts +4 -4
  640. package/scripts/rules/decision-oracle-batch.ts +5 -6
  641. package/scripts/rules/decision-oracle-stage.ts +1 -1
  642. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  643. package/scripts/rules/decision-oracle.ts +2 -2
  644. package/scripts/rules/delivered-rules.ts +61 -406
  645. package/scripts/rules/destructive-command.ts +2 -2
  646. package/scripts/rules/direct-filing.ts +4 -4
  647. package/scripts/rules/direct-pr-create.ts +2 -2
  648. package/scripts/rules/early-heartbeat.ts +15 -19
  649. package/scripts/rules/file-body.ts +5 -6
  650. package/scripts/rules/filing-cap.ts +6 -7
  651. package/scripts/rules/filing-offer.ts +1 -1
  652. package/scripts/rules/firing-point.ts +6 -6
  653. package/scripts/rules/gh-api.ts +2 -2
  654. package/scripts/rules/git-argv.ts +3 -3
  655. package/scripts/rules/git-force.ts +2 -2
  656. package/scripts/rules/hook-context-line.ts +31 -0
  657. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  658. package/scripts/rules/implementation-cut.ts +35 -32
  659. package/scripts/rules/index-guard.ts +2 -2
  660. package/scripts/rules/issue-citation.ts +7 -7
  661. package/scripts/rules/issue-comments.ts +21 -13
  662. package/scripts/rules/josh-git-bare.ts +2 -2
  663. package/scripts/rules/lane-background.ts +14 -16
  664. package/scripts/rules/lane-carry-conflict.ts +41 -5
  665. package/scripts/rules/lane-interactive-ask.ts +6 -9
  666. package/scripts/rules/lane-park.ts +12 -16
  667. package/scripts/rules/lane-split-park.ts +1 -2
  668. package/scripts/rules/lane-switch-main.ts +10 -13
  669. package/scripts/rules/last-prompt.ts +1 -1
  670. package/scripts/rules/oracle-consulted.ts +5 -5
  671. package/scripts/rules/oracle-firing.ts +6 -9
  672. package/scripts/rules/oracle-list-cli.ts +2 -2
  673. package/scripts/rules/permission-guards.ts +2 -2
  674. package/scripts/rules/piped-verification.ts +79 -9
  675. package/scripts/rules/poll-loop.ts +9 -11
  676. package/scripts/rules/pre-gate-cut.ts +33 -30
  677. package/scripts/rules/prior-comment-read.ts +3 -3
  678. package/scripts/rules/protected-files.ts +25 -13
  679. package/scripts/rules/raw-field-body.ts +3 -4
  680. package/scripts/rules/reply-language.ts +1 -1
  681. package/scripts/rules/rule-body-guard.ts +10 -12
  682. package/scripts/rules/rule-guard.ts +1 -1
  683. package/scripts/rules/rule-list.ts +51 -0
  684. package/scripts/rules/rule-registry-rows.ts +282 -0
  685. package/scripts/rules/rule-registry.ts +109 -0
  686. package/scripts/rules/rule-value-cache.ts +2 -2
  687. package/scripts/rules/rule-value-cli.ts +6 -4
  688. package/scripts/rules/rule-value.ts +61 -22
  689. package/scripts/rules/run-tail-rule.ts +11 -15
  690. package/scripts/rules/shell-body-trigger.ts +7 -7
  691. package/scripts/rules/shell-segments.ts +2 -4
  692. package/scripts/rules/stop-rules.ts +54 -41
  693. package/scripts/rules/tail-commands.ts +1 -1
  694. package/scripts/rules/test-declared-commit.ts +2 -2
  695. package/scripts/rules/third-party-write.ts +3 -3
  696. package/scripts/rules/worktree-guard.ts +12 -5
  697. package/scripts/run/add/run-add-cli.ts +165 -0
  698. package/scripts/run/add/run-add.ts +124 -0
  699. package/scripts/run/board/run-board-cli.ts +207 -0
  700. package/scripts/run/board/run-board-closed.ts +95 -0
  701. package/scripts/run/board/run-board-every.ts +60 -0
  702. package/scripts/run/board/run-board-fetch.ts +38 -0
  703. package/scripts/run/board/run-board-fit.ts +219 -0
  704. package/scripts/run/board/run-board-github.ts +162 -0
  705. package/scripts/run/board/run-board-header.ts +275 -0
  706. package/scripts/run/board/run-board-kind.ts +35 -0
  707. package/scripts/run/board/run-board-labels.ts +299 -0
  708. package/scripts/run/board/run-board-layout.ts +222 -0
  709. package/scripts/run/board/run-board-link.ts +31 -0
  710. package/scripts/run/board/run-board-machine.ts +198 -0
  711. package/scripts/run/board/run-board-notes.ts +103 -0
  712. package/scripts/run/board/run-board-phase.ts +136 -0
  713. package/scripts/run/board/run-board-plan.ts +129 -0
  714. package/scripts/run/board/run-board-read.ts +62 -0
  715. package/scripts/run/board/run-board-render-legend.ts +82 -0
  716. package/scripts/run/board/run-board-render-notes.ts +77 -0
  717. package/scripts/run/board/run-board-render-slot.ts +50 -0
  718. package/scripts/run/board/run-board-render.ts +407 -0
  719. package/scripts/run/board/run-board-scope.ts +17 -0
  720. package/scripts/run/board/run-board-screen.ts +43 -0
  721. package/scripts/run/board/run-board-span.ts +66 -0
  722. package/scripts/run/board/run-board-spin.ts +115 -0
  723. package/scripts/run/board/run-board-state.ts +113 -0
  724. package/scripts/run/board/run-board-status.ts +279 -0
  725. package/scripts/run/board/run-board-tick.ts +210 -0
  726. package/scripts/run/board/run-board-track.ts +22 -0
  727. package/scripts/run/board/run-board-usage-read.ts +255 -0
  728. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  729. package/scripts/run/board/run-board-usage-text.ts +80 -0
  730. package/scripts/run/board/run-board-usage.ts +165 -0
  731. package/scripts/run/carry/run-carry-added.ts +62 -0
  732. package/scripts/run/carry/run-carry-args.ts +25 -22
  733. package/scripts/run/carry/run-carry-change.ts +1 -1
  734. package/scripts/run/carry/run-carry-cli.ts +71 -48
  735. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  736. package/scripts/run/carry/run-carry-ended.ts +85 -0
  737. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  738. package/scripts/run/carry/run-carry-stash.ts +3 -2
  739. package/scripts/run/carry/run-carry-streak.ts +8 -10
  740. package/scripts/run/carry/run-carry.ts +85 -89
  741. package/scripts/run/cut/run-cut-args.ts +7 -7
  742. package/scripts/run/cut/run-cut-cli.ts +54 -36
  743. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  744. package/scripts/run/cut/run-cut-report.ts +37 -16
  745. package/scripts/run/cut/run-cut.ts +63 -77
  746. package/scripts/run/detached-launch.ts +35 -50
  747. package/scripts/run/entry/run-entry-cli.ts +48 -27
  748. package/scripts/run/entry/run-entry-stop.ts +7 -9
  749. package/scripts/run/entry/run-entry.ts +5 -6
  750. package/scripts/run/event/run-event-cli.ts +5 -6
  751. package/scripts/run/event/run-event-filed.ts +69 -0
  752. package/scripts/run/event/run-event-follow.ts +3 -3
  753. package/scripts/run/event/run-event-plan.ts +38 -0
  754. package/scripts/run/event/run-event-render.ts +9 -4
  755. package/scripts/run/event/run-event-scope.ts +47 -18
  756. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  757. package/scripts/run/event/run-event-stream.ts +171 -46
  758. package/scripts/run/event/run-event-watch.ts +4 -6
  759. package/scripts/run/hold/run-hold-cli.ts +65 -62
  760. package/scripts/run/hold/run-hold.ts +88 -46
  761. package/scripts/run/merge/run-merge-cli.ts +116 -77
  762. package/scripts/run/merge/run-merge-collect.ts +107 -0
  763. package/scripts/run/merge/run-merge-steps.ts +112 -65
  764. package/scripts/run/merge/run-merge-token.ts +30 -0
  765. package/scripts/run/merge/run-merge.ts +31 -22
  766. package/scripts/run/progress/run-progress-args.ts +4 -4
  767. package/scripts/run/progress/run-progress-cli.ts +39 -50
  768. package/scripts/run/progress/run-progress-clock.ts +25 -32
  769. package/scripts/run/progress/run-progress-config.ts +6 -9
  770. package/scripts/run/progress/run-progress-read.ts +9 -10
  771. package/scripts/run/progress/run-progress.ts +48 -53
  772. package/scripts/run/review/run-review-cli.ts +6 -6
  773. package/scripts/run/review/run-review-steps.ts +6 -6
  774. package/scripts/run/review/run-review.ts +9 -11
  775. package/scripts/run/run-cli-fault.ts +29 -0
  776. package/scripts/run/run-ending-cli.ts +3 -3
  777. package/scripts/run/run-ending.ts +10 -14
  778. package/scripts/run/run-halfrun-resume.ts +6 -8
  779. package/scripts/run/run-headless.ts +25 -12
  780. package/scripts/run/run-invocation.ts +17 -22
  781. package/scripts/run/run-label.ts +7 -5
  782. package/scripts/run/run-liveness-cli.ts +19 -6
  783. package/scripts/run/run-liveness.ts +27 -38
  784. package/scripts/run/run-next-cli.ts +5 -9
  785. package/scripts/run/run-next.ts +4 -5
  786. package/scripts/run/run-parent-cut-hook.ts +10 -12
  787. package/scripts/run/run-preflight.ts +25 -29
  788. package/scripts/run/run-prep-cli.ts +17 -13
  789. package/scripts/run/run-prep-locate.ts +4 -5
  790. package/scripts/run/run-prep.ts +7 -10
  791. package/scripts/run/run-prrun-resume.ts +2 -2
  792. package/scripts/run/run-report-cli.ts +4 -4
  793. package/scripts/run/run-report.ts +9 -14
  794. package/scripts/run/run-retrospective.ts +3 -3
  795. package/scripts/run/run-section.ts +42 -0
  796. package/scripts/run/run-stage-read.ts +2 -2
  797. package/scripts/run/run-stage.ts +6 -4
  798. package/scripts/run/run-status-cli.ts +7 -5
  799. package/scripts/run/run-status.ts +6 -7
  800. package/scripts/run/run-step-cli.ts +13 -15
  801. package/scripts/run/run-step.ts +58 -47
  802. package/scripts/run/run-stop-notify.ts +7 -8
  803. package/scripts/run/run-stranded-cli.ts +1 -1
  804. package/scripts/run/run-stranded-detect.ts +4 -4
  805. package/scripts/run/run-stranded.ts +11 -13
  806. package/scripts/run/run-tail-cli.ts +15 -16
  807. package/scripts/run/run-tail.ts +14 -33
  808. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  809. package/scripts/run/run-watcher-guard.ts +11 -12
  810. package/scripts/run/run-watcher-hook.ts +6 -12
  811. package/scripts/run/ship/run-ship-cli.ts +67 -33
  812. package/scripts/run/ship/run-ship-detach.ts +15 -13
  813. package/scripts/run/ship/run-ship-lock.ts +1 -1
  814. package/scripts/run/ship/run-ship-next.ts +7 -8
  815. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  816. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  817. package/scripts/run/ship/run-ship-probe.ts +4 -4
  818. package/scripts/run/ship/run-ship-return.ts +1 -1
  819. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  820. package/scripts/run/ship/run-ship-review.ts +12 -14
  821. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  822. package/scripts/run/ship/run-ship-stage.ts +80 -26
  823. package/scripts/run/ship/run-ship-steps.ts +26 -16
  824. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  825. package/scripts/run/ship/run-ship-sync.ts +9 -8
  826. package/scripts/run/ship/run-ship.ts +17 -32
  827. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  828. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  829. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  830. package/scripts/run/tidy/run-tidy.ts +4 -3
  831. package/scripts/run/wake/run-wake-cli.ts +27 -32
  832. package/scripts/run/wake/run-wake-describe.ts +24 -28
  833. package/scripts/run/wake/run-wake-driver.ts +14 -14
  834. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  835. package/scripts/run/wake/run-wake-loop.ts +9 -9
  836. package/scripts/run/wake/run-wake-restart.ts +4 -5
  837. package/scripts/run/wake/run-wake-session.ts +23 -27
  838. package/scripts/run/wake/run-wake.ts +57 -279
  839. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  840. package/scripts/safe-chain/pack-hook.ts +2 -2
  841. package/scripts/safe-chain/preinstall-command.ts +2 -2
  842. package/scripts/security/security-audit-logic.ts +1 -1
  843. package/scripts/security/security-audit-provision-logic.ts +1 -1
  844. package/scripts/security/security-audit-provision.ts +2 -2
  845. package/scripts/security/security-audit.ts +5 -5
  846. package/scripts/security/security-updates-logic.ts +2 -3
  847. package/scripts/security/security-updates.ts +2 -4
  848. package/scripts/self-sync-guard/index.ts +1 -1
  849. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  850. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  851. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  852. package/scripts/sonar/sonar-hotspots.ts +1 -1
  853. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  854. package/scripts/sonar/sonar-new-code.ts +1 -1
  855. package/scripts/sonar/sonar-project.ts +1 -1
  856. package/scripts/split/split-assess-cli.ts +1 -1
  857. package/scripts/split/split-assess.ts +3 -3
  858. package/scripts/sync/directory-copy-guard.ts +2 -3
  859. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  860. package/scripts/sync/managed-config-scope.ts +4 -4
  861. package/scripts/sync/plugin-skill-directories.ts +2 -2
  862. package/scripts/sync/reconcile-templates.ts +17 -8
  863. package/scripts/sync/removed-skill-manifest.ts +2 -3
  864. package/scripts/sync/sync-ai-files.ts +7 -7
  865. package/scripts/sync/sync-configs.ts +30 -3
  866. package/scripts/sync/sync-hook-safety.ts +2 -2
  867. package/scripts/sync/sync.ts +23 -10
  868. package/scripts/sync/synced-paths.ts +2 -1
  869. package/scripts/sync/workflow-pin-logic.ts +1 -1
  870. package/scripts/test/test-declared-changed.ts +4 -4
  871. package/scripts/test/test-declared-logic.ts +2 -3
  872. package/scripts/test/test-declared-match.ts +25 -4
  873. package/scripts/test/test-declared.ts +26 -9
  874. package/scripts/test/test-red-commit.ts +3 -2
  875. package/scripts/test/test-red-logic.ts +7 -14
  876. package/scripts/test/test-red.ts +12 -47
  877. package/scripts/test/test-related-scope.ts +2 -3
  878. package/scripts/test/test-related.ts +3 -3
  879. package/scripts/test/test-type-logic.ts +1 -2
  880. package/scripts/test/test-unit-guard.ts +13 -17
  881. package/scripts/test/unit-worker-share.ts +7 -8
  882. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  883. package/scripts/time-runtime/time-background.ts +17 -21
  884. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  885. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  886. package/scripts/time-runtime/time-bundles.ts +11 -12
  887. package/scripts/time-runtime/time-call-identity.ts +1 -1
  888. package/scripts/time-runtime/time-command-key.ts +2 -2
  889. package/scripts/time-runtime/time-density-hook.ts +8 -11
  890. package/scripts/time-runtime/time-density.ts +5 -5
  891. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  892. package/scripts/time-runtime/time-format.ts +5 -5
  893. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  894. package/scripts/time-runtime/time-instant.ts +1 -1
  895. package/scripts/time-runtime/time-markers.ts +15 -19
  896. package/scripts/time-runtime/time-phase-names.ts +3 -3
  897. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  898. package/scripts/time-runtime/time-round-trips.ts +20 -23
  899. package/scripts/time-runtime/time-shell.ts +8 -8
  900. package/scripts/time-runtime/time-single-check.ts +1 -2
  901. package/scripts/time-runtime/time-spans.ts +35 -40
  902. package/scripts/time-runtime/time-tool-call.ts +15 -16
  903. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  904. package/scripts/time-runtime/time-writes.ts +5 -5
  905. package/scripts/ui/ui-routes-cli.ts +1 -2
  906. package/scripts/ui/ui-routes.ts +1 -2
  907. package/scripts/version/bump-version.ts +1 -1
  908. package/scripts/version/fresh-metadata-cache.ts +2 -2
  909. package/scripts/version/latest-corepack.ts +26 -26
  910. package/scripts/version/latest-lane-guard.ts +1 -1
  911. package/scripts/version/latest-scope-cli.ts +2 -2
  912. package/scripts/version/latest-stamp.ts +1 -2
  913. package/scripts/version/latest-update.ts +2 -2
  914. package/scripts/version/npm-registry.ts +2 -2
  915. package/scripts/version/package-manager-version.ts +18 -0
  916. package/scripts/version/publishable-range-check.ts +2 -1
  917. package/scripts/version/publishable-range.ts +1 -1
  918. package/scripts/version/release-age.ts +11 -11
  919. package/scripts/version/release-hold.ts +2 -2
  920. package/scripts/version/safe-chain-version-update.ts +3 -3
  921. package/scripts/version/version-check-logic.ts +2 -3
  922. package/scripts/version/version-check.ts +1 -2
  923. package/scripts/version/version-command-config.ts +2 -2
  924. package/scripts/version/version-commands.ts +3 -3
  925. package/scripts/version/version-remote.ts +4 -4
  926. package/scripts/version/version-targets.ts +2 -2
  927. package/templates/gitignore +7 -0
  928. package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
  929. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  930. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  931. package/scripts/backlog/backlog-restructure.ts +0 -152
  932. package/scripts/rules/issue-fold-rule.ts +0 -72
  933. package/scripts/rules/wip-cap.ts +0 -63
  934. package/scripts/run/run-issue-number.ts +0 -19
@@ -9,10 +9,11 @@ import { review_record } from '#scripts/review/review-record'
9
9
  import { detached_launch } from '#scripts/run/detached-launch'
10
10
  import { run_ship_review, type RoundOutcome, type ScoredVerdict } from './run-ship-review'
11
11
  import { run_ship_scoped, type Phase } from './run-ship-scoped'
12
+ import type { StepResult } from './run-ship-sync'
12
13
 
13
- // The side effects of `josh ship --review` (joshuafolkken/kit#2427): the round-1 review the chain used
14
- // to open, launch, join, attest and record across five agent turns, run by the supervisor beside the
15
- // gate. Each step is the existing command or mechanism, composed rather than cloned:
14
+ // The side effects of `josh ship --review`: the round-1 review — open, launch, join, attest and
15
+ // record — run by the supervisor beside the gate rather than across agent turns. Each step is the
16
+ // existing command or mechanism, composed rather than cloned:
16
17
  //
17
18
  // 1. `run:review` starts the gate detached and mints the brief — the nonce `review:attest` checks.
18
19
  // 2. the reviewer is launched the way `run:wake` launches a session — `agent_argv` under the reviewer
@@ -20,14 +21,14 @@ import { run_ship_scoped, type Phase } from './run-ship-scoped'
20
21
  // 3. `run:review --join` blocks a verdict over a red gate; `review:attest --check` refuses a review
21
22
  // that read another checkout; `review:record` writes the round the merge gate reads.
22
23
  //
23
- // **Round 1's local fixes and round 2 stay inside the supervisor** (joshuafolkken/kit#2489). A round-1
24
+ // **Round 1's local fixes and round 2 stay inside the supervisor**. A round-1
24
25
  // reviewer that fixed its local Mediums in place changed the tree the background gate read, so that
25
26
  // join drains the gate rather than judging it — the ship's gate stage re-runs on the fixed tree. After
26
27
  // the commit, `round_two_stage` asks `review:round2 --round-1-closed` whether the fix delta owes a
27
28
  // second round, and on `required` runs it through the same commands the chain does: the scoped pair
28
29
  // `review:brief` requires, `review:brief --round 2`, a fresh reviewer session, attest and record.
29
30
  //
30
- // **A precondition the supervisor can meet itself is met, not stopped on** (joshuafolkken/kit#2500).
31
+ // **A precondition the supervisor can meet itself is met, not stopped on**.
31
32
  // The scoped pair `run:review` and the local gate refuse without is run in place when this tree has no
32
33
  // green record, and a round-1 fix is counted only once that pair is green on the fixed tree.
33
34
  //
@@ -43,14 +44,19 @@ const ATTEST_CHECK = ['review:attest', '--check']
43
44
  const ROUND_TWO_DECISION = ['review:round2', '--round-1-closed']
44
45
  const ROUND_TWO_BRIEF = ['review:brief', '--round', '2']
45
46
  const ROUND_TWO_REQUIRED = 'required'
47
+ const ROUND_ONE = '1'
48
+ const ROUND_TWO = '2'
49
+ const COMMENT_FLAG = '--comment'
50
+
51
+ type Round = typeof ROUND_ONE | typeof ROUND_TWO
46
52
  const FIXED_JOIN_NOTE =
47
53
  'the round-1 gate read the tree before the review fixes — drained, not judged; the gate re-runs once the tree is fixed.'
48
54
  const ROUND_TWO_SKIPPED_NOTE = 'round 2 not due — nothing left to verify; shipping on.'
49
55
  const ROUND_ONE_RECORDED_NOTE =
50
56
  'round 1 already recorded for this issue — not reviewed again; the gate reads the fixed tree and round 2 decides after the commit.'
51
57
 
52
- // The scoped pair's precondition, met by the supervisor itself rather than stopped on
53
- // (joshuafolkken/kit#2500), single-sourced with the preflight and gate stages (joshuafolkken/kit#2946).
58
+ // The scoped pair's precondition, met by the supervisor itself rather than stopped on,
59
+ // single-sourced with the preflight and gate stages.
54
60
  const { run_phases, scoped_pair } = run_ship_scoped
55
61
 
56
62
  type PromptOf = (brief_path: string, findings_path: string) => string
@@ -92,7 +98,7 @@ async function run_session(
92
98
  prompt: string,
93
99
  log_path: string,
94
100
  issue: string,
95
- round: '1' | '2',
101
+ round: Round,
96
102
  ): Promise<JoshResult> {
97
103
  const built = agent_argv.resolve_in(prompt, agent_role_profile.REVIEWER, PROJECT_ROOT)
98
104
  if (built.kind === 'rejected') return failure(`reviewer profile rejected: ${built.note}`)
@@ -112,7 +118,7 @@ async function launch_reviewer(
112
118
  brief: string,
113
119
  prompt_of: PromptOf,
114
120
  issue: string,
115
- round: '1' | '2',
121
+ round: Round,
116
122
  ): Promise<JoshResult> {
117
123
  const target = paths()
118
124
 
@@ -130,7 +136,7 @@ function current_verdict(): ReturnType<typeof run_ship_review.read_verdict> {
130
136
  // tree before the fixes, so its verdict describes a tree that no longer exists. The join still ran to
131
137
  // its end, so the gate stage that follows never races it. Any fix drains it, not only a round whose
132
138
  // every finding was fixed — a partial fix moved the tree just the same, and the round then stops on its
133
- // unfixed finding at the record rather than on a `Gate RED` the gate never earned (joshuafolkken/kit#2961).
139
+ // unfixed finding at the record rather than on a `Gate RED` the gate never earned.
134
140
  async function join_gate(): Promise<JoshResult> {
135
141
  const joined = await josh([RUN_REVIEW, '--join'])
136
142
 
@@ -142,19 +148,29 @@ async function join_gate(): Promise<JoshResult> {
142
148
  return { code: SUCCESS_EXIT_CODE, out: joined.out }
143
149
  }
144
150
 
151
+ // **A passing round 2 is recorded on the issue, not in the tree**: it ran after the commit and reads
152
+ // only, so no commit of the run's follows it, and a line appended now would be pushed onto the open
153
+ // pull request by `pnpm josh followup` — restarting the CI the round ran beside. A blocking round 2
154
+ // keeps the tree: the fix it stops for is pushed anyway, and carries the lines.
155
+ function record_flags(round: Round, outcome: RoundOutcome): ReadonlyArray<string> {
156
+ return round === ROUND_TWO && outcome.is_passing ? [COMMENT_FLAG] : []
157
+ }
158
+
145
159
  async function record_and_route(
146
160
  issue: string,
161
+ round: Round,
147
162
  outcome_of: (verdict: ScoredVerdict) => RoundOutcome,
148
163
  ): Promise<JoshResult> {
149
164
  const verdict = current_verdict()
150
165
 
151
166
  if (verdict.kind === run_ship_review.VERDICT.INVALID) return failure(verdict.note)
152
167
 
153
- const recorded = await josh(['review:record', '--issue', issue, ...verdict.specs])
168
+ const outcome = outcome_of(verdict)
169
+ const flags = record_flags(round, outcome)
170
+ const recorded = await josh(['review:record', '--issue', issue, ...flags, ...verdict.specs])
154
171
 
155
172
  if (recorded.code !== SUCCESS_EXIT_CODE) return recorded
156
173
 
157
- const outcome = outcome_of(verdict)
158
174
  const out = [...verdict.report, outcome.note].join('\n')
159
175
 
160
176
  return outcome.is_passing ? { code: SUCCESS_EXIT_CODE, out } : failure(out)
@@ -165,7 +181,7 @@ function reviewed(
165
181
  open: ReadonlyArray<string>,
166
182
  prompt_of: PromptOf,
167
183
  issue: string,
168
- round: '1' | '2',
184
+ round: Round,
169
185
  ): ReadonlyArray<Phase> {
170
186
  const opened = { brief: '' }
171
187
 
@@ -189,26 +205,31 @@ async function round_one_record(issue: string): Promise<JoshResult> {
189
205
  const checked = is_fixed ? await scoped_pair() : undefined
190
206
  const is_verified = checked === undefined || checked.code === SUCCESS_EXIT_CODE
191
207
 
192
- return await record_and_route(issue, (verdict) =>
208
+ return await record_and_route(issue, ROUND_ONE, (verdict) =>
193
209
  is_verified ? run_ship_review.round_one_outcome(verdict) : run_ship_review.UNVERIFIED_OUTCOME,
194
210
  )
195
211
  }
196
212
 
213
+ // A round that had nothing to review: it passes, and the ship does not time it as a review that ran.
214
+ function skipped(out: string): StepResult {
215
+ return { code: SUCCESS_EXIT_CODE, out, is_skipped: true }
216
+ }
217
+
197
218
  // The round-1 review, beside the gate: scoped pair → open → review → join → attest → record, stopping
198
219
  // at the first that did not pass.
199
220
  //
200
- // **A recorded round 1 is not run again** (joshuafolkken/kit#2964). A ship relaunched with `--review`
221
+ // **A recorded round 1 is not run again**. A ship relaunched with `--review`
201
222
  // after a round-1 stop would otherwise review the whole change a second time as round 1 — a new Medium
202
223
  // there stops it again, and round 2 after the commit makes a third. The fix delta is round 2's to
203
224
  // verify, and `round_two_stage` asks whether it is due after the commit.
204
- async function review_stage(issue: string): Promise<JoshResult> {
225
+ async function review_stage(issue: string): Promise<StepResult> {
205
226
  const recorded = await review_record.check(Number(issue))
206
227
 
207
- if (recorded.status === 'ok') return { code: SUCCESS_EXIT_CODE, out: ROUND_ONE_RECORDED_NOTE }
228
+ if (recorded.status === 'ok') return skipped(ROUND_ONE_RECORDED_NOTE)
208
229
 
209
230
  return await run_phases([
210
231
  scoped_pair,
211
- ...reviewed([RUN_REVIEW], run_ship_review.reviewer_prompt, issue, '1'),
232
+ ...reviewed([RUN_REVIEW], run_ship_review.reviewer_prompt, issue, ROUND_ONE),
212
233
  join_gate,
213
234
  async () => await josh(ATTEST_CHECK),
214
235
  async () => await round_one_record(issue),
@@ -217,21 +238,19 @@ async function review_stage(issue: string): Promise<JoshResult> {
217
238
 
218
239
  // The round-2 verification pass, after the commit so it runs beside CI: due only when the round-1 fix
219
240
  // delta says so, then scoped pair → brief → fresh reviewer → attest → record.
220
- async function round_two_stage(issue: string): Promise<JoshResult> {
241
+ async function round_two_stage(issue: string): Promise<StepResult> {
221
242
  const decision = await josh(ROUND_TWO_DECISION)
222
243
  const answer = decision.out.trim()
223
244
 
224
245
  if (decision.code !== SUCCESS_EXIT_CODE) return decision
225
246
 
226
- if (answer !== ROUND_TWO_REQUIRED) {
227
- return { code: SUCCESS_EXIT_CODE, out: `${answer}\n${ROUND_TWO_SKIPPED_NOTE}` }
228
- }
247
+ if (answer !== ROUND_TWO_REQUIRED) return skipped(`${answer}\n${ROUND_TWO_SKIPPED_NOTE}`)
229
248
 
230
249
  return await run_phases([
231
250
  scoped_pair,
232
- ...reviewed(ROUND_TWO_BRIEF, run_ship_review.verification_prompt, issue, '2'),
251
+ ...reviewed(ROUND_TWO_BRIEF, run_ship_review.verification_prompt, issue, ROUND_TWO),
233
252
  async () => await josh(ATTEST_CHECK),
234
- async () => await record_and_route(issue, run_ship_review.round_two_outcome),
253
+ async () => await record_and_route(issue, ROUND_TWO, run_ship_review.round_two_outcome),
235
254
  ])
236
255
  }
237
256
 
@@ -1,18 +1,17 @@
1
1
  import { review_finding_ledger } from '#scripts/review/review-finding-ledger'
2
2
  import { review_record_cli } from '#scripts/review/review-record-cli'
3
3
 
4
- // The pure half of `josh ship --review` (joshuafolkken/kit#2427): the one-line prompts the supervised
5
- // reviewers are launched with, the verdict read back off the findings file each writes, and where that
6
- // verdict routes the ship. Kept apart from the launch and the joins (`run-ship-review-steps.ts`) the way
7
- // `run-review.ts` is kept apart from `run-review-steps.ts`, so every branch is pinned without a session
8
- // ever starting.
4
+ // The pure half of `josh ship --review`: the one-line prompts the supervised reviewers are launched
5
+ // with, the verdict read back off the findings file each writes, and where that verdict routes the
6
+ // ship. Kept apart from the launch and the joins (`run-ship-review-steps.ts`) the way `run-review.ts`
7
+ // is kept apart from `run-review-steps.ts`, so every branch is pinned without a session ever starting.
9
8
  //
10
9
  // **The reviewer is the one the chain already runs.** Its prompt hands it the brief `run:review`
11
10
  // printed — the same level, rubric, checkout and `review:attest` nonce a `/code-review` subagent was
12
11
  // given — and asks only that the findings also be written in the `review:record` grammar, so the
13
12
  // supervisor records and routes them without an agent reading the prose.
14
13
  //
15
- // **Round 1 fixes what is local; round 2 only reads** (joshuafolkken/kit#2489). The round-1 reviewer
14
+ // **Round 1 fixes what is local; round 2 only reads**. The round-1 reviewer
16
15
  // applies a Medium whose fix is small and local — the "small, local asks" `chain-rule.md` names — and
17
16
  // marks that finding `fixed`, so the supervisor carries the ship through the gate, the commit and a
18
17
  // round-2 verification pass instead of handing a lane child back for a fix it could not make. A High is
@@ -24,7 +23,7 @@ const HIGH = 'high'
24
23
  const MEDIUM = 'medium'
25
24
  const FIXED_PREFIX = 'fixed '
26
25
  // What a finding line carries after its spec: one sentence saying what is wrong, so a stopped ship's
27
- // log tells the resumed lane child the defect rather than only its location (joshuafolkken/kit#3159).
26
+ // log tells the resumed lane child the defect rather than only its location.
28
27
  const DESCRIPTION_SEPARATOR = ' — '
29
28
  // Where the spec ends on read: a reviewer that types the dash as `-`, `--` or `–` still ends it there,
30
29
  // so its sentence never lands in the ledger's file field.
@@ -175,18 +174,17 @@ function round_one_outcome(verdict: ScoredVerdict): RoundOutcome {
175
174
  return { is_passing: true, note: verdict.kind === VERDICT.FIXED ? FIXED_NOTE : CLEAN_NOTE }
176
175
  }
177
176
 
178
- // Whether a findings file records a clean round 1 (joshuafolkken/kit#2945). A resumed round 1 narrows to
179
- // the delta only past a review that found nothing to fix. A blocking one has a finding in a file the
180
- // delta may not touch. A fixed one approved its own edits, not the briefed tree the delta is measured
181
- // from, so a file reverted to that tree would drop out of the delta with its finding back in it.
177
+ // Whether a findings file records a clean round 1. A resumed round 1 narrows to the delta only past a
178
+ // review that found nothing to fix. A blocking one has a finding in a file the delta may not touch. A
179
+ // fixed one approved its own edits, not the briefed tree the delta is measured from, so a file
180
+ // reverted to that tree would drop out of the delta with its finding back in it.
182
181
  function is_clean_round_one(text: string | undefined): boolean {
183
182
  return read_verdict(text).kind === VERDICT.CLEAN
184
183
  }
185
184
 
186
185
  // Whether the reviewer edited the tree — any finding marked fixed, whether or not another one still
187
- // blocks (joshuafolkken/kit#2961). A partial fix moves the tree the background gate read as surely as a
188
- // full one, so the join reads it red either way; keyed off the verdict kind instead, a round that fixed
189
- // one Medium and left another stopped at a misleading `Gate RED` before its own blocking note.
186
+ // blocks. A partial fix moves the tree the background gate read as surely as a full one, so the join
187
+ // reads it red either way.
190
188
  function has_fixes(text: string | undefined): boolean {
191
189
  if (text === undefined) return false
192
190
 
@@ -1,11 +1,12 @@
1
+ import { gate_skip } from '#scripts/gate/gate-skip'
1
2
  import { gate_tree } from '#scripts/gate/gate-tree'
2
3
  import { scoped_green } from '#scripts/gate/scoped-green'
3
4
  import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
4
5
 
5
- // The scoped pair `josh ship` meets itself rather than stops on (joshuafolkken/kit#2500), shared by
6
- // every stage that needs a green record for this tree (joshuafolkken/kit#2946): the preflight stage at
7
- // the start, the review rounds, and the gate stage — a reviewer may have edited the tree after round
8
- // 1's pair ran, and `josh gate` refuses a tree with no green record.
6
+ // The scoped pair `josh ship` meets itself rather than stops on, shared by every stage that needs a
7
+ // green record for this tree: the preflight stage at the start, the review rounds, and the gate
8
+ // stage — a reviewer may have edited the tree after round 1's pair ran, and `josh gate` refuses a
9
+ // tree with no green record.
9
10
 
10
11
  const SUCCESS_EXIT_CODE = 0
11
12
  const should_forward_stderr = true
@@ -40,7 +41,7 @@ async function scoped_pair(): Promise<JoshResult> {
40
41
  }
41
42
 
42
43
  // The scoped pair and then `josh gate` — the gate stage, and the followup's gate over a merged tree
43
- // before its push (joshuafolkken/kit#3307), so both leave the record the pre-push hook reuses.
44
+ // before its push, so both leave the record the pre-push hook reuses.
44
45
  async function scoped_gate(): Promise<JoshResult> {
45
46
  return await run_phases([
46
47
  scoped_pair,
@@ -48,7 +49,15 @@ async function scoped_gate(): Promise<JoshResult> {
48
49
  ])
49
50
  }
50
51
 
51
- const run_ship_scoped = { run_phases, scoped_gate, scoped_pair }
52
+ // Whether `josh gate` would only reuse this tree's green record: the gate's own reuse test rather than
53
+ // a second copy of it, so the ship calls a gate stage a reuse on exactly the trees the gate skips.
54
+ async function is_gate_green(): Promise<boolean> {
55
+ const tree = await gate_tree.read_gate_tree()
56
+
57
+ return gate_skip.reusable_green_gate(tree.files, tree.base) !== undefined
58
+ }
59
+
60
+ const run_ship_scoped = { is_gate_green, run_phases, scoped_gate, scoped_pair }
52
61
 
53
62
  export type { Phase }
54
63
  export { run_ship_scoped }
@@ -1,10 +1,11 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
1
2
  import { stamp_file } from '#scripts/josh/stamp-file'
3
+ import { json_value } from '#scripts/lib/json-value'
2
4
  import { z } from 'zod'
3
5
 
4
- // `josh ship`'s durable stage record, and the decision of which stage a resumed ship may pass over
5
- // (joshuafolkken/kit#2426). The composite used to be a straight line with no memory: a ship that died
6
- // after its push re-ran the gate, and nothing checked whether the commit, the push or the merge had
7
- // already happened.
6
+ // `josh ship`'s durable stage record, and the decision of which stage a resumed ship may pass over,
7
+ // so a ship that died mid-way neither re-runs what already happened nor commits, pushes or merges
8
+ // twice.
8
9
  //
9
10
  // **The record is a hint; the repository's actual state is the authority.** A record can be lost — a
10
11
  // temp directory wiped — or outlived by the tree it describes, when new work was committed after it
@@ -49,8 +50,21 @@ const RECORD_PREFIX = 'josh-ship-stages-'
49
50
  const RECORD_SEPARATOR = '-'
50
51
  const SKIP_COMMIT_FLAG = '--skip-commit'
51
52
  const SKIP_PUSH_FLAG = '--skip-push'
53
+ const WORD_SEPARATOR = ' '
54
+ const STARTED_SEPARATOR = ','
55
+ const STARTED_INDEX = 3
56
+ const WORD_COUNT = STARTED_INDEX + 1
52
57
 
53
- const record_schema = z.object({ done: z.array(z.string()) })
58
+ // `started` lists the stages the current attempt started, kept across a supervisor that ended without a
59
+ // stop so its successor's lines still carry them.
60
+ const record_schema = z.object({
61
+ done: z.array(z.string()),
62
+ started: z.array(z.string()).default([]),
63
+ })
64
+
65
+ type ShipRecord = z.infer<typeof record_schema>
66
+
67
+ const EMPTY_RECORD: ShipRecord = { done: [], started: [] }
54
68
 
55
69
  // Keyed on the repository and the issue: every lane of one repository shares the common git directory,
56
70
  // and two issues shipping from two lanes keep two records.
@@ -58,26 +72,44 @@ function record_path(repository: string, issue: string): string {
58
72
  return stamp_file.stamp_path(`${RECORD_PREFIX}${issue}${RECORD_SEPARATOR}`, repository)
59
73
  }
60
74
 
61
- function parse_done(raw: string): ReadonlySet<string> {
62
- try {
63
- return new Set(record_schema.parse(JSON.parse(raw)).done)
64
- } catch {
65
- return new Set()
66
- }
75
+ function parse_record(raw: string): ShipRecord {
76
+ return json_value.parse_with(raw, record_schema) ?? EMPTY_RECORD
67
77
  }
68
78
 
69
- // The stages the record says completed. An absent, planted or malformed record reads as none — the
70
- // state decides from there, so "no record" is always the safe answer.
71
- function read_done(target: string): ReadonlySet<string> {
79
+ // An absent, planted or malformed record reads as empty — the state decides from there, so "no
80
+ // record" is always the safe answer.
81
+ function read_record(target: string): ShipRecord {
72
82
  const raw = stamp_file.read_stamp_text(target)
73
83
 
74
- return raw === undefined ? new Set() : parse_done(raw)
84
+ return raw === undefined ? EMPTY_RECORD : parse_record(raw)
85
+ }
86
+
87
+ // The stages the record says completed.
88
+ function read_done(target: string): ReadonlySet<string> {
89
+ return new Set(read_record(target).done)
75
90
  }
76
91
 
77
92
  function mark_done(target: string, stage: Stage): void {
78
- const done = new Set([...read_done(target), stage])
93
+ const record = read_record(target)
94
+
95
+ stamp_file.replace_stamp(target, { ...record, done: [...new Set([...record.done, stage])] })
96
+ }
97
+
98
+ // The stages the current attempt has started, in the order it started them.
99
+ function read_started(target: string): ReadonlyArray<string> {
100
+ return read_record(target).started
101
+ }
102
+
103
+ function mark_started(target: string, stage: Stage): void {
104
+ const record = read_record(target)
79
105
 
80
- stamp_file.replace_stamp(target, { done: [...done] })
106
+ stamp_file.replace_stamp(target, { ...record, started: [...new Set([...record.started, stage])] })
107
+ }
108
+
109
+ // A `ship-stop` ends the attempt on the board (`run-board-phase.ts`), so the next attempt lists afresh
110
+ // while the completed stages stay recorded.
111
+ function end_attempt(target: string): void {
112
+ stamp_file.replace_stamp(target, { ...read_record(target), started: [] })
81
113
  }
82
114
 
83
115
  // Removed once the report stage completes, so a later ship of the same issue starts from the preflight.
@@ -92,19 +124,19 @@ function is_shipped(state: ShipState): boolean {
92
124
  }
93
125
 
94
126
  const DONE_BY: Record<Stage, (done: ReadonlySet<string>, state: ShipState) => boolean> = {
95
- // The preflight (joshuafolkken/kit#2946) asks what the commit stage would refuse on, so a commit is
127
+ // The preflight asks what the commit stage would refuse on, so a commit is
96
128
  // its output as it is the gate's; a resumed commit stage still asks `git -y`'s own preflight.
97
129
  [STAGE.PREFLIGHT]: (_done, state) => state.is_merged || state.is_committed,
98
- // The `--review` round (joshuafolkken/kit#2427) precedes the commit, so a commit is its output as it
130
+ // The `--review` round precedes the commit, so a commit is its output as it
99
131
  // is the gate's. A record alone is not honored: before a commit the tree may have been edited since
100
132
  // the recorded round, and only a commit pins the tree that round read.
101
133
  [STAGE.REVIEW]: (_done, state) => state.is_merged || state.is_committed,
102
134
  [STAGE.GATE]: (_done, state) => state.is_merged || state.is_committed,
103
- // The merge of the default branch before the commit (joshuafolkken/kit#3221): once committed, a
135
+ // The merge of the default branch before the commit: once committed, a
104
136
  // conflicting pull request is the followup's to merge again.
105
137
  [STAGE.SYNC]: (_done, state) => state.is_merged || state.is_committed,
106
138
  [STAGE.COMMIT]: (done, state) => state.is_merged || (done.has(STAGE.COMMIT) && is_shipped(state)),
107
- // The round-2 pass (joshuafolkken/kit#2489) reads the pushed fix delta, so its record is honored only
139
+ // The round-2 pass reads the pushed fix delta, so its record is honored only
108
140
  // while that push still stands — new work pushed on top reruns it.
109
141
  [STAGE.ROUND_TWO]: (done, state) =>
110
142
  state.is_merged || (done.has(STAGE.ROUND_TWO) && is_shipped(state)),
@@ -115,7 +147,7 @@ const DONE_BY: Record<Stage, (done: ReadonlySet<string>, state: ShipState) => bo
115
147
  [STAGE.REPORT]: (done) => done.has(STAGE.REPORT),
116
148
  }
117
149
 
118
- // A supplied PR body is work only the commit stage delivers (joshuafolkken/kit#2446): a rerun carrying
150
+ // A supplied PR body is work only the commit stage delivers: a rerun carrying
119
151
  // the live-execution evidence a refused `followup` asked for reruns `git -y`, whose skip flags leave the
120
152
  // commit and push alone while the body reaches the already-open pull request.
121
153
  function is_done(
@@ -138,12 +170,30 @@ function commit_flags(state: ShipState): ReadonlyArray<string> {
138
170
  return state.is_pushed ? [SKIP_COMMIT_FLAG, SKIP_PUSH_FLAG] : [SKIP_COMMIT_FLAG]
139
171
  }
140
172
 
141
- function event_text(issue: string, stage: Stage, phase: Phase): string {
142
- return `#${issue} ${stage} ${phase}`
173
+ // **The newest line carries the attempt's history**: a fourth word lists every
174
+ // stage the attempt has started, so the one line per issue a stream full of positions keeps still
175
+ // draws the whole track. A line with no started stage keeps the three-word form.
176
+ function event_text(
177
+ issue: string,
178
+ stage: Stage,
179
+ phase: Phase,
180
+ started: ReadonlyArray<string> = [],
181
+ ): string {
182
+ const words = [issue_cite.plain(issue), stage, phase]
183
+ const listed = [...new Set(started)].join(STARTED_SEPARATOR)
184
+
185
+ const full = started.length > 0 ? [...words, listed] : words
186
+
187
+ return full.join(WORD_SEPARATOR)
188
+ }
189
+
190
+ // The stages a line says its attempt has started, `undefined` for a three-word line.
191
+ function started_of(text: string): ReadonlyArray<string> | undefined {
192
+ return text.split(WORD_SEPARATOR, WORD_COUNT)[STARTED_INDEX]?.split(STARTED_SEPARATOR)
143
193
  }
144
194
 
145
- // A stop on a merge git could not finish is named `conflict` rather than by the stage it happened in
146
- // (joshuafolkken/kit#3221), so the event stream reads the cause without anyone opening the report.
195
+ // A stop on a merge git could not finish is named `conflict` rather than by the stage it happened in,
196
+ // so the event stream reads the cause without anyone opening the report.
147
197
  const CONFLICT = 'conflict'
148
198
 
149
199
  function stop_reason(stage: Stage, conflicts: ReadonlyArray<string> = []): string {
@@ -155,11 +205,15 @@ const run_ship_stage = {
155
205
  STAGE,
156
206
  clear,
157
207
  commit_flags,
208
+ end_attempt,
158
209
  event_text,
159
210
  is_done,
160
211
  mark_done,
212
+ mark_started,
161
213
  read_done,
214
+ read_started,
162
215
  record_path,
216
+ started_of,
163
217
  stop_reason,
164
218
  }
165
219
 
@@ -6,8 +6,8 @@ import { run_ship_scoped } from './run-ship-scoped'
6
6
  import { run_ship_stage, type ShipState, type Stage } from './run-ship-stage'
7
7
  import { run_ship_sync, type StepResult } from './run-ship-sync'
8
8
 
9
- // The stages `josh ship` runs, in the order a change ships (joshuafolkken/kit#2398), kept apart from the
10
- // chaining CLI so the order is read in one place.
9
+ // The stages `josh ship` runs, in the order a change ships, kept apart from the chaining
10
+ // CLI so the order is read in one place.
11
11
 
12
12
  const should_forward_stderr = true
13
13
 
@@ -34,8 +34,8 @@ async function josh(argv: ReadonlyArray<string>): Promise<JoshResult> {
34
34
  return await josh_command.josh_run(argv, should_forward_stderr)
35
35
  }
36
36
 
37
- // joshuafolkken/kit#2946: the pull request's preconditions and the scoped pair are asked first, so a
38
- // stop they would cause lands before the review and the gate rather than after them.
37
+ // The pull request's preconditions and the scoped pair are asked first, so a stop they would cause
38
+ // lands before the review and the gate rather than after them.
39
39
  const PREFLIGHT_STEP: Step = {
40
40
  stage: STAGE.PREFLIGHT,
41
41
  header: run_ship.PREFLIGHT_HEADER,
@@ -43,15 +43,25 @@ const PREFLIGHT_STEP: Step = {
43
43
  await run_ship_preflight.stage({ title: args.title, body_path: args.body_path }),
44
44
  }
45
45
 
46
+ // The gate stage. **A gate that only reused the tree's green record is not timed**: after `--review`
47
+ // launched the gate itself, this stage ends in seconds without running a check, and those seconds
48
+ // would pull the `gate` row `lane:stats` reads for `JOSH_LANE_LIMIT` toward zero. The record is asked
49
+ // for before the stage runs — afterwards every green gate has one.
50
+ async function gate_stage(): Promise<StepResult> {
51
+ const is_skipped = await run_ship_scoped.is_gate_green()
52
+ const result = await run_ship_scoped.scoped_gate()
53
+
54
+ return { ...result, is_skipped }
55
+ }
56
+
46
57
  // The gate before the commit, the commit/push/PR before the merge. The gate meets the scoped pair
47
58
  // first: a round-1 reviewer may have edited the tree since the preflight, and `josh gate` refuses a tree
48
- // with no green record (joshuafolkken/kit#2946). The commit step carries the `--skip-*` flags a resumed
49
- // ship needs, so an existing commit or push is never made twice.
59
+ // with no green record. The commit step carries the `--skip-*` flags a resumed ship needs, so an
60
+ // existing commit or push is never made twice.
50
61
  const COMMIT_STEPS: ReadonlyArray<Step> = [
51
- // joshuafolkken/kit#3221: the default branch merged again before the commit, so the pull request
52
- // opens on a branch that is current; a clean merge goes on without waking anyone. It runs before the
53
- // gate (joshuafolkken/kit#3307): a merge after it moved the merge base the gate's record pins, so the
54
- // pre-push hook could never reuse that record and re-ran the whole unit suite on every merged ship.
62
+ // The default branch is merged again before the commit, so the pull request opens on a branch that
63
+ // is current; a clean merge goes on without waking anyone. It runs before the gate: a merge after it
64
+ // would move the merge base the gate's record pins, so the pre-push hook could not reuse that record.
55
65
  {
56
66
  stage: STAGE.SYNC,
57
67
  header: run_ship.SYNC_HEADER,
@@ -60,7 +70,7 @@ const COMMIT_STEPS: ReadonlyArray<Step> = [
60
70
  {
61
71
  stage: STAGE.GATE,
62
72
  header: run_ship.GATE_HEADER,
63
- run: async () => await run_ship_scoped.scoped_gate(),
73
+ run: async () => await gate_stage(),
64
74
  },
65
75
  {
66
76
  stage: STAGE.COMMIT,
@@ -84,11 +94,11 @@ const MERGE_STEPS: ReadonlyArray<Step> = [
84
94
  },
85
95
  ]
86
96
 
87
- // `--review` (joshuafolkken/kit#2427) puts the supervised round-1 review in front of the gate: it
88
- // launches the gate itself, so the gate stage that follows reuses that tree's green record unless the
89
- // sync stage between them merged the default branch and changed the tree. It also
90
- // puts the round-2 pass between the commit and the followup (joshuafolkken/kit#2489), so the PR opens
91
- // between the rounds and round 2 runs beside CI — a no-op when round 1 left no fix delta.
97
+ // `--review` puts the supervised round-1 review in front of the gate: it launches the gate itself, so
98
+ // the gate stage that follows reuses that tree's green record unless the sync stage between them
99
+ // merged the default branch and changed the tree. It also puts the round-2 pass between the commit
100
+ // and the followup, so the PR opens between the rounds and round 2 runs beside CI — a no-op when
101
+ // round 1 left no fix delta.
92
102
  const REVIEW_STEP: Step = {
93
103
  stage: STAGE.REVIEW,
94
104
  header: run_ship.REVIEW_HEADER,
@@ -1,9 +1,11 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
2
+
1
3
  // The text a `josh ship` supervisor records when a stage stops, written and read in one place so the
2
- // retrospective's per-stage count never drifts from the writer (joshuafolkken/kit#3245).
4
+ // retrospective's per-stage count never drifts from the writer.
3
5
  const STOP_PATTERN = /^#\d+ (\S+) failed — /u
4
6
 
5
7
  function format(issue: string, reason: string): string {
6
- return `#${issue} ${reason} failed — pnpm josh ship --log ${issue}`
8
+ return `${issue_cite.plain(issue)} ${reason} failed — pnpm josh ship --log ${issue}`
7
9
  }
8
10
 
9
11
  function reason_of(text: string): string | undefined {
@@ -6,13 +6,11 @@ import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
6
6
  import { error_text } from '#scripts/lib/error-message'
7
7
  import { run_ship_scoped } from './run-ship-scoped'
8
8
 
9
- // `josh ship` keeps the branch current with the default branch itself (joshuafolkken/kit#3221). The
10
- // lane merged it once, before the hand-off, and nothing merged it again while the pull request opened
11
- // and CI ran — so a default branch that moved meanwhile stopped the followup as `interrupted`, and a
12
- // relaunched session spent its first turns finding out that the cause was a conflict. Most of those
13
- // conflicts were not conflicts at all to git: merging the default branch again resolved them.
9
+ // `josh ship` keeps the branch current with the default branch itself: a default branch that moves
10
+ // while the pull request opens and CI runs would otherwise stop the followup as `interrupted`, though
11
+ // merging the default branch again usually resolves it.
14
12
  //
15
- // So the merge happens twice more, mechanically: once before the commit (`sync_stage`), and once when
13
+ // So the merge happens mechanically: once before the commit (`sync_stage`), and once when
16
14
  // the followup fails on a pull request GitHub reports `DIRTY` (`followup_stage`). Only a merge git
17
15
  // itself cannot finish stops the ship, and it stops as `conflict`, naming the unmerged paths so the
18
16
  // resumed session goes straight to them.
@@ -29,7 +27,10 @@ const CURRENT_SUFFIX = ' brings nothing in'
29
27
  const MERGED_PREFIX = 'merged '
30
28
 
31
29
  // A stage's result, plus the paths a stopped merge left unmerged — carried to the stop prompt.
30
+ // `is_skipped` marks a stage that found nothing to do — a review round with nothing to review, a gate
31
+ // that reused a green record — so its few seconds are not timed as a run of it.
32
32
  interface StepResult extends JoshResult {
33
+ is_skipped?: boolean
33
34
  conflicts?: ReadonlyArray<string>
34
35
  }
35
36
 
@@ -63,7 +64,7 @@ function sync_note(outcome: Exclude<MergeOutcome, { kind: 'conflict' }>): string
63
64
 
64
65
  // A refusal does not stop the commit: the guard refuses only uncommitted work the default branch also
65
66
  // touches, and once that work is committed the followup merges again on a clean tree. A merge that changed
66
- // the tree is checked by the gate stage that follows (joshuafolkken/kit#3307), so the commit never carries
67
+ // the tree is checked by the gate stage that follows, so the commit never carries
67
68
  // an unchecked merge and the gate's record names the merge base the push carries.
68
69
  async function sync_stage(): Promise<StepResult> {
69
70
  const outcome = await merge_outcome()
@@ -84,7 +85,7 @@ async function is_conflicting(): Promise<boolean> {
84
85
  }
85
86
  }
86
87
 
87
- // The merged tree is gated before it is pushed (joshuafolkken/kit#3307): the push then carries the tree
88
+ // The merged tree is gated before it is pushed: the push then carries the tree
88
89
  // the gate's record describes, so the pre-push hook reuses it rather than re-running the unit suite.
89
90
  async function push_merged(title: string): Promise<StepResult | undefined> {
90
91
  const gate = await run_ship_scoped.scoped_gate()