@joshuafolkken/kit 1.1240.0 → 1.1373.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (934) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +52 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +19 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +26 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +17 -28
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.vscode/tasks.json +14 -0
  42. package/CLAUDE.md +10 -61
  43. package/README.md +23 -66
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +43 -11
  47. package/dist/config-merge/index.js +11 -2
  48. package/dist/hooks/audit-provision.js +2 -2
  49. package/dist/hooks/batch-guard.js +7 -7
  50. package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-7UBFU3CL.js} +18 -20
  51. package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
  52. package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
  53. package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
  54. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  55. package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
  56. package/dist/hooks/{chunk-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
  57. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  60. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
  61. package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
  62. package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
  63. package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
  64. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  65. package/dist/hooks/codex-hook-adapter.js +26 -21
  66. package/dist/hooks/duplicate-read-guard.js +8 -8
  67. package/dist/hooks/format-edited.js +4 -4
  68. package/dist/hooks/inputs.json +195 -181
  69. package/dist/hooks/investigation-guard.js +8 -8
  70. package/dist/hooks/pretool-guard.js +15 -15
  71. package/dist/hooks/session-lang.js +406 -8
  72. package/dist/hooks/stop-guard.js +122 -187
  73. package/dist/josh.js +282 -95
  74. package/dist/version/index.js +15 -13
  75. package/eslint/base.js +43 -5
  76. package/eslint/rules/english-only-prose.js +3 -3
  77. package/eslint/rules/import.js +12 -0
  78. package/eslint/rules/namespace-object-export.js +2 -2
  79. package/package.json +17 -11
  80. package/pnpm-workspace.yaml +2 -4
  81. package/prompts/coding-standards.md +14 -48
  82. package/prompts/collaboration-workflow/file-edits.md +1 -1
  83. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  84. package/prompts/collaboration-workflow/issue-template.md +3 -10
  85. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  86. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  87. package/prompts/collaboration-workflow/overview.md +1 -1
  88. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  89. package/prompts/collaboration-workflow/principles.md +21 -3
  90. package/prompts/collaboration-workflow/report-format.md +16 -29
  91. package/prompts/collaboration-workflow/residency.md +1 -1
  92. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  93. package/prompts/collaboration-workflow/shell-body.md +3 -23
  94. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  95. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +3 -22
  98. package/prompts/review.md +15 -38
  99. package/prompts/testing-guide.md +2 -4
  100. package/scripts/adopt/adopt-logic.ts +5 -5
  101. package/scripts/adopt/adopt-toolkits.ts +4 -5
  102. package/scripts/adopt/adopt.ts +2 -3
  103. package/scripts/agent/agent-argv.ts +7 -7
  104. package/scripts/agent/agent-diagnostics.ts +2 -2
  105. package/scripts/agent/agent-exit-record.ts +1 -1
  106. package/scripts/agent/agent-headless.ts +1 -1
  107. package/scripts/agent/agent-launch-environment.ts +6 -1
  108. package/scripts/agent/agent-role-profile.ts +49 -22
  109. package/scripts/agent/agent-session-role.ts +32 -0
  110. package/scripts/agent/api-outage.ts +1 -1
  111. package/scripts/agent/claude-agent-argv.ts +4 -4
  112. package/scripts/agent/claude-result-event.ts +4 -4
  113. package/scripts/agent/codex-hooks.ts +2 -2
  114. package/scripts/agent/interactive-ask.ts +3 -6
  115. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  116. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  117. package/scripts/backlog/backlog-arrival.ts +54 -17
  118. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  119. package/scripts/backlog/backlog-budget.ts +17 -24
  120. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  121. package/scripts/backlog/backlog-drive-args.ts +5 -4
  122. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  123. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  124. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  125. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  126. package/scripts/backlog/backlog-drive-named.ts +39 -9
  127. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  128. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  129. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  130. package/scripts/backlog/backlog-drive.ts +43 -28
  131. package/scripts/backlog/backlog-idle.ts +88 -0
  132. package/scripts/backlog/backlog-named.ts +11 -15
  133. package/scripts/backlog/backlog-next.ts +26 -30
  134. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  135. package/scripts/backlog/backlog-offer.ts +7 -7
  136. package/scripts/backlog/backlog-overlap.ts +178 -0
  137. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  138. package/scripts/backlog/backlog-plan-read.ts +111 -0
  139. package/scripts/backlog/backlog-plan.ts +11 -10
  140. package/scripts/backlog/backlog-pool.ts +13 -14
  141. package/scripts/backlog/backlog-rank.ts +11 -11
  142. package/scripts/backlog/backlog-ready.ts +15 -10
  143. package/scripts/backlog/backlog-scope.ts +14 -15
  144. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  145. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  146. package/scripts/backlog/backlog-stalled.ts +5 -6
  147. package/scripts/backlog/backlog-waves.ts +4 -4
  148. package/scripts/backlog/backlogrun-args.ts +74 -0
  149. package/scripts/backlog/backlogrun-cli.ts +113 -0
  150. package/scripts/backlog/backlogrun-launch.ts +178 -0
  151. package/scripts/behavior/behavior-assertion.ts +6 -8
  152. package/scripts/behavior/behavior-cli.ts +1 -1
  153. package/scripts/behavior/behavior-rules.ts +3 -3
  154. package/scripts/build/build-claude-md.ts +4 -4
  155. package/scripts/build/build-codex-hooks.ts +2 -2
  156. package/scripts/build/build-commands.ts +1 -1
  157. package/scripts/build/build-hooks.ts +5 -5
  158. package/scripts/build/build.ts +1 -1
  159. package/scripts/build/hook-bundle-stamp.ts +109 -7
  160. package/scripts/build/local-bin.ts +2 -2
  161. package/scripts/cases/cases-cli.ts +1 -1
  162. package/scripts/cases/cases-logic.ts +2 -2
  163. package/scripts/ci/composite-actions.ts +1 -2
  164. package/scripts/ci/pr-classification.ts +2 -2
  165. package/scripts/claude/workflow-destination.ts +1 -1
  166. package/scripts/clone/clone-aggregate.ts +1 -1
  167. package/scripts/clone/clone-fingerprint.ts +1 -1
  168. package/scripts/clone/clone-scan-cli.ts +1 -1
  169. package/scripts/clone/clone-scan.ts +1 -1
  170. package/scripts/config-merge/index.ts +1 -1
  171. package/scripts/config-merge/json-format.ts +1 -3
  172. package/scripts/config-merge/patch-json-array.ts +90 -0
  173. package/scripts/config-merge/patch-json-key.ts +6 -3
  174. package/scripts/config-merge/patch-json-list.ts +1 -1
  175. package/scripts/cost-runtime/codex-usage.ts +1 -1
  176. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  177. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  178. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  179. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  180. package/scripts/cost-runtime/cost-cli.ts +14 -11
  181. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  182. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  183. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  184. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  185. package/scripts/cost-runtime/cost-usage.ts +6 -7
  186. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  187. package/scripts/cost-runtime/own-session.ts +1 -1
  188. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  189. package/scripts/delegation/delegation-cli.ts +4 -4
  190. package/scripts/delegation/delegation-policy.ts +13 -15
  191. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  192. package/scripts/delegation/fanout-cli.ts +1 -1
  193. package/scripts/delegation/fanout.ts +1 -1
  194. package/scripts/delegation/investigation-guard.ts +18 -22
  195. package/scripts/delegation/investigation-reads.ts +48 -238
  196. package/scripts/discovery/repo-discovery.ts +1 -1
  197. package/scripts/discovery/repo-map-logic.ts +1 -2
  198. package/scripts/discovery/repo-origin.ts +3 -3
  199. package/scripts/discovery/repo-party-cli.ts +2 -2
  200. package/scripts/discovery/repo-party.ts +2 -2
  201. package/scripts/doctor/doctor-consumer.ts +1 -1
  202. package/scripts/doctor/doctor-io.ts +6 -7
  203. package/scripts/doctor/doctor-logic.ts +1 -1
  204. package/scripts/doctor/doctor-ports.ts +1 -1
  205. package/scripts/doctor/doctor.ts +8 -9
  206. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  207. package/scripts/document/bash-output-cap.ts +5 -7
  208. package/scripts/document/capped-print-part.ts +1 -1
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/document-byte-budget.ts +33 -64
  211. package/scripts/document/document-byte-check.ts +4 -4
  212. package/scripts/document/document-reachability.ts +7 -8
  213. package/scripts/document/document-read-cli.ts +2 -2
  214. package/scripts/document/document-scan.ts +30 -5
  215. package/scripts/document/document-section-cli.ts +6 -8
  216. package/scripts/document/document-section.ts +8 -12
  217. package/scripts/document/edit-files-cli.ts +3 -4
  218. package/scripts/document/entry-read-budget.ts +8 -70
  219. package/scripts/document/entry-read-set.ts +51 -34
  220. package/scripts/document/lane-child-read-set.ts +9 -9
  221. package/scripts/document/read-files-cli.ts +1 -2
  222. package/scripts/document/read-set-cli.ts +16 -19
  223. package/scripts/document/read-set-cost.ts +4 -4
  224. package/scripts/document/read-set-point-of-use.ts +28 -38
  225. package/scripts/document/read-set-pricing.ts +1 -1
  226. package/scripts/document/read-set-trim.ts +3 -3
  227. package/scripts/document/resident-budget.ts +8 -10
  228. package/scripts/epic/epic-add-body.ts +15 -18
  229. package/scripts/epic/epic-add-plan.ts +26 -28
  230. package/scripts/epic/epic-add.ts +32 -25
  231. package/scripts/epic/epic-audit-checks.ts +27 -37
  232. package/scripts/epic/epic-audit-cli.ts +21 -22
  233. package/scripts/epic/epic-audit-orphans.ts +16 -17
  234. package/scripts/epic/epic-audit-rationale.ts +10 -15
  235. package/scripts/epic/epic-audit-report.ts +2 -5
  236. package/scripts/epic/epic-audit.ts +18 -14
  237. package/scripts/epic/epic-body.ts +10 -10
  238. package/scripts/epic/epic-bundle-cli.ts +36 -34
  239. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  240. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  241. package/scripts/epic/epic-bundle-poll.ts +1 -1
  242. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  243. package/scripts/epic/epic-bundle.ts +19 -20
  244. package/scripts/epic/epic-busy.ts +44 -21
  245. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  246. package/scripts/epic/epic-chains.ts +18 -23
  247. package/scripts/epic/epic-classify.ts +11 -12
  248. package/scripts/epic/epic-cli-argv.ts +5 -6
  249. package/scripts/epic/epic-cli-remove.ts +9 -4
  250. package/scripts/epic/epic-cli.ts +38 -26
  251. package/scripts/epic/epic-close-comment.ts +14 -15
  252. package/scripts/epic/epic-close.ts +25 -29
  253. package/scripts/epic/epic-cross-repo.ts +18 -21
  254. package/scripts/epic/epic-decision.ts +14 -18
  255. package/scripts/epic/epic-fetch.ts +25 -31
  256. package/scripts/epic/epic-graph.ts +15 -17
  257. package/scripts/epic/epic-index.ts +14 -16
  258. package/scripts/epic/epic-issue.ts +9 -11
  259. package/scripts/epic/epic-label-age.ts +74 -0
  260. package/scripts/epic/epic-lane-offer.ts +35 -24
  261. package/scripts/epic/epic-nested.ts +1 -1
  262. package/scripts/epic/epic-next-read.ts +8 -8
  263. package/scripts/epic/epic-next-views.ts +12 -12
  264. package/scripts/epic/epic-next.ts +29 -33
  265. package/scripts/epic/epic-outside-blocker.ts +11 -10
  266. package/scripts/epic/epic-parse.ts +22 -24
  267. package/scripts/epic/epic-promote.ts +3 -2
  268. package/scripts/epic/epic-rank.ts +1 -1
  269. package/scripts/epic/epic-read.ts +10 -8
  270. package/scripts/epic/epic-reconcile.ts +8 -6
  271. package/scripts/epic/epic-reference.ts +5 -4
  272. package/scripts/epic/epic-relation-recheck.ts +10 -11
  273. package/scripts/epic/epic-relations.ts +9 -8
  274. package/scripts/epic/epic-remove-plan.ts +4 -5
  275. package/scripts/epic/epic-remove.ts +7 -5
  276. package/scripts/epic/epic-report.ts +18 -20
  277. package/scripts/epic/epic-run.ts +6 -5
  278. package/scripts/epic/epic-sections.ts +2 -2
  279. package/scripts/epic/epic-shape.ts +3 -3
  280. package/scripts/epic/epic-solo-stale.ts +3 -2
  281. package/scripts/epic/epic-solo.ts +8 -8
  282. package/scripts/epic/epic-triage.ts +5 -4
  283. package/scripts/epic/epic-validate.ts +8 -7
  284. package/scripts/epic/epic.ts +5 -5
  285. package/scripts/exports/unused-members-cli.ts +1 -1
  286. package/scripts/followup/followup-issue-number.ts +1 -2
  287. package/scripts/followup/git-followup-cleanup.ts +6 -7
  288. package/scripts/followup/git-followup-finish.ts +11 -13
  289. package/scripts/followup/git-followup-flush.ts +11 -7
  290. package/scripts/followup/git-followup-issue-close.ts +16 -13
  291. package/scripts/followup/git-followup-label.ts +9 -6
  292. package/scripts/followup/git-followup-merged.ts +1 -1
  293. package/scripts/followup/git-followup-pending.ts +7 -9
  294. package/scripts/followup/git-followup-stages.ts +28 -17
  295. package/scripts/followup/git-followup-workflow.ts +19 -21
  296. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  297. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  298. package/scripts/followup/git-pr-followup.ts +18 -17
  299. package/scripts/gate/core-admission.ts +2 -2
  300. package/scripts/gate/core-budget.ts +15 -26
  301. package/scripts/gate/gate-ledger.ts +114 -0
  302. package/scripts/gate/gate-log.ts +7 -9
  303. package/scripts/gate/gate-plan.ts +70 -35
  304. package/scripts/gate/gate-report.ts +14 -15
  305. package/scripts/gate/gate-skip.ts +11 -13
  306. package/scripts/gate/gate-steps.ts +5 -1
  307. package/scripts/gate/gate-tree.ts +3 -4
  308. package/scripts/gate/hook-gate-reuse.ts +9 -9
  309. package/scripts/gate/machine-capacity.ts +168 -30
  310. package/scripts/gate/pre-commit-type-check.ts +4 -4
  311. package/scripts/gate/project-checks.ts +12 -4
  312. package/scripts/gate/scoped-green.ts +11 -18
  313. package/scripts/gate/type-check-command.ts +2 -2
  314. package/scripts/gate/type-check-step.ts +4 -4
  315. package/scripts/gate/verification-gate.ts +53 -51
  316. package/scripts/gh/gh-spawn.ts +2 -2
  317. package/scripts/gh/git-ai-review-scan.ts +3 -2
  318. package/scripts/gh/git-gh-api-path.ts +10 -11
  319. package/scripts/gh/git-gh-exec.ts +43 -48
  320. package/scripts/gh/git-gh-failure.ts +6 -9
  321. package/scripts/gh/git-gh-helpers.ts +1 -1
  322. package/scripts/gh/git-gh-issue-list.ts +15 -19
  323. package/scripts/gh/git-gh-issue-read.ts +43 -60
  324. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  325. package/scripts/gh/git-gh-issue-write.ts +52 -40
  326. package/scripts/gh/git-gh-issue.ts +23 -24
  327. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  328. package/scripts/gh/git-gh-pr-read.ts +46 -50
  329. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  330. package/scripts/gh/git-gh-pr-review.ts +2 -2
  331. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  332. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  333. package/scripts/gh/git-gh-pr.ts +16 -16
  334. package/scripts/gh/git-gh-reachability.ts +11 -12
  335. package/scripts/gh/git-gh-repo.ts +2 -3
  336. package/scripts/gh/git-gh-rest-state.ts +1 -1
  337. package/scripts/gh/git-pr-ai-review.ts +6 -5
  338. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  339. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  340. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  341. package/scripts/gh/git-pr-checks.ts +20 -23
  342. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  343. package/scripts/gh/git-pr-confirmation.ts +5 -5
  344. package/scripts/gh/git-pr-managed-config.ts +7 -9
  345. package/scripts/gh/git-pr-messages.ts +1 -1
  346. package/scripts/gh/git-pr.ts +15 -16
  347. package/scripts/gh/github-issue-url.ts +8 -9
  348. package/scripts/git/base-tree.ts +66 -0
  349. package/scripts/git/change-base.ts +42 -2
  350. package/scripts/git/changed-file-scope.ts +5 -5
  351. package/scripts/git/changed-paths.ts +1 -2
  352. package/scripts/git/constants.ts +2 -2
  353. package/scripts/git/git-branch.ts +1 -1
  354. package/scripts/git/git-closes-keyword.ts +3 -3
  355. package/scripts/git/git-command.ts +53 -41
  356. package/scripts/git/git-common-directory.ts +3 -3
  357. package/scripts/git/git-diff-reads.ts +14 -15
  358. package/scripts/git/git-error.ts +1 -1
  359. package/scripts/git/git-execa-error.ts +1 -2
  360. package/scripts/git/git-issue.ts +10 -8
  361. package/scripts/git/git-location-environment.ts +3 -4
  362. package/scripts/git/git-ls-remote.ts +6 -8
  363. package/scripts/git/git-pre-push-hook.ts +11 -10
  364. package/scripts/git/git-preflight.ts +5 -5
  365. package/scripts/git/git-push-transport.ts +2 -2
  366. package/scripts/git/git-remote-branch.ts +1 -2
  367. package/scripts/git/git-schemas.ts +16 -23
  368. package/scripts/git/git-spawn-sync.ts +1 -1
  369. package/scripts/git/git-spawn.ts +37 -14
  370. package/scripts/git/git-ssh-keepalive.ts +12 -5
  371. package/scripts/git/git-staging.ts +7 -8
  372. package/scripts/git/git-workflow.ts +1 -1
  373. package/scripts/git/git-worktree.ts +35 -27
  374. package/scripts/git/gone-branch.ts +2 -2
  375. package/scripts/git/listing-cutoff.ts +1 -2
  376. package/scripts/git/lockfile-sync.ts +65 -0
  377. package/scripts/git/main-merge-guard.ts +1 -2
  378. package/scripts/git/main-merge.ts +7 -7
  379. package/scripts/git/main-sync.ts +23 -8
  380. package/scripts/git/parse-json-array.ts +18 -23
  381. package/scripts/git/repository-lock.ts +34 -2
  382. package/scripts/git/stash/git-stash.ts +4 -5
  383. package/scripts/git/stash/stash-orphans.ts +5 -3
  384. package/scripts/git/stash/stash-pop-args.ts +1 -1
  385. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  386. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  387. package/scripts/hooks/batch-guard.ts +11 -13
  388. package/scripts/hooks/check-commit-message.ts +12 -9
  389. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  390. package/scripts/hooks/edited-cspell.ts +3 -4
  391. package/scripts/hooks/format-edited-cli.ts +1 -1
  392. package/scripts/hooks/format-edited-file.ts +11 -17
  393. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  394. package/scripts/hooks/pre-push-unit.ts +10 -14
  395. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  396. package/scripts/hooks/pretool-guard.ts +93 -18
  397. package/scripts/hooks/reserved-run.ts +2 -2
  398. package/scripts/hooks/step-zero-notice.ts +1 -1
  399. package/scripts/hooks/stop-guard.ts +21 -10
  400. package/scripts/init/basic-path-migration.ts +2 -2
  401. package/scripts/init/claude-kit-only-settings.ts +2 -2
  402. package/scripts/init/claude-plugin-config.ts +2 -2
  403. package/scripts/init/distributed-paths.ts +4 -4
  404. package/scripts/init/hook-command-rewrite.ts +3 -3
  405. package/scripts/init/hook-launch.ts +5 -5
  406. package/scripts/init/init-actions.ts +13 -0
  407. package/scripts/init/init-ai-copy.ts +11 -11
  408. package/scripts/init/init-bootstrap.ts +3 -3
  409. package/scripts/init/init-copy-content.ts +4 -4
  410. package/scripts/init/init-logic-json-merge.ts +7 -9
  411. package/scripts/init/init-logic-migrate.ts +1 -1
  412. package/scripts/init/init-logic-templates.ts +1 -1
  413. package/scripts/init/init-logic-workspace.ts +4 -4
  414. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  415. package/scripts/init/init-logic.ts +19 -22
  416. package/scripts/init/init.ts +7 -7
  417. package/scripts/init/kit-base-preset.ts +1 -1
  418. package/scripts/init/kit-setup-state.ts +1 -1
  419. package/scripts/init/kit-written-paths.ts +1 -2
  420. package/scripts/init/package-manager-pin.ts +1 -1
  421. package/scripts/init/project-profile-cli.ts +1 -1
  422. package/scripts/init/project-profile.ts +3 -3
  423. package/scripts/init/session-language-environment.ts +1 -1
  424. package/scripts/init/start-exec.ts +3 -4
  425. package/scripts/init/start-plan.ts +2 -2
  426. package/scripts/init/start-setup-pr.ts +3 -2
  427. package/scripts/init/start-steps.ts +2 -2
  428. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  429. package/scripts/init/vscode-tasks.ts +62 -0
  430. package/scripts/issue/baseline-measure.ts +2 -2
  431. package/scripts/issue/behavior-change-lint.ts +2 -2
  432. package/scripts/issue/defect-rate-cli.ts +6 -7
  433. package/scripts/issue/defect-rate.ts +37 -27
  434. package/scripts/issue/git-next-issues.ts +9 -8
  435. package/scripts/issue/issue-auto-ok.ts +24 -11
  436. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  437. package/scripts/issue/issue-backlinks.ts +6 -6
  438. package/scripts/issue/issue-cite-cli.ts +20 -18
  439. package/scripts/issue/issue-cite.ts +18 -8
  440. package/scripts/issue/issue-closing-pr.ts +4 -4
  441. package/scripts/issue/issue-comment-cli.ts +6 -4
  442. package/scripts/issue/issue-file-cli.ts +52 -15
  443. package/scripts/issue/issue-file-fold.ts +155 -0
  444. package/scripts/issue/issue-file.ts +9 -6
  445. package/scripts/issue/issue-fold-cli.ts +14 -9
  446. package/scripts/issue/issue-fold.ts +23 -8
  447. package/scripts/issue/issue-labels.ts +34 -38
  448. package/scripts/issue/issue-lint-cli.ts +2 -2
  449. package/scripts/issue/issue-lint.ts +1 -1
  450. package/scripts/issue/issue-merged.ts +10 -4
  451. package/scripts/issue/issue-number-shape.ts +27 -0
  452. package/scripts/issue/issue-rank.ts +1 -1
  453. package/scripts/issue/issue-read-cli.ts +4 -5
  454. package/scripts/issue/issue-read.ts +4 -5
  455. package/scripts/issue/issue-reference.ts +5 -5
  456. package/scripts/issue/issue-release-cli.ts +17 -7
  457. package/scripts/issue/issue-release.ts +3 -3
  458. package/scripts/issue/issue-report-failures.ts +7 -4
  459. package/scripts/issue/issue-scout-cli.ts +11 -11
  460. package/scripts/issue/issue-scout-closed.ts +4 -4
  461. package/scripts/issue/issue-scout.ts +4 -5
  462. package/scripts/issue/issue-state-cli.ts +17 -10
  463. package/scripts/issue/issue-state.ts +12 -13
  464. package/scripts/issue/issue-wip.ts +7 -7
  465. package/scripts/issue/markdown-section.ts +3 -3
  466. package/scripts/issue/measure-rerun-cli.ts +10 -9
  467. package/scripts/issue/reproduction-measure.ts +3 -3
  468. package/scripts/issue/session-cite.ts +56 -0
  469. package/scripts/josh/agent-session-environment.ts +10 -8
  470. package/scripts/josh/cli-body.ts +2 -2
  471. package/scripts/josh/command-suggest.ts +1 -1
  472. package/scripts/josh/file-map-stamp.ts +20 -23
  473. package/scripts/josh/hook-decision.ts +24 -28
  474. package/scripts/josh/josh-command-map.ts +4 -1
  475. package/scripts/josh/josh-command-types.ts +30 -35
  476. package/scripts/josh/josh-commands-ai.ts +6 -6
  477. package/scripts/josh/josh-commands-backlog.ts +15 -3
  478. package/scripts/josh/josh-commands-clone.ts +1 -1
  479. package/scripts/josh/josh-commands-development.ts +25 -4
  480. package/scripts/josh/josh-commands-document.ts +3 -3
  481. package/scripts/josh/josh-commands-guard.ts +3 -3
  482. package/scripts/josh/josh-commands-issue.ts +4 -5
  483. package/scripts/josh/josh-commands-lane.ts +14 -4
  484. package/scripts/josh/josh-commands-lint.ts +1 -1
  485. package/scripts/josh/josh-commands-run.ts +21 -7
  486. package/scripts/josh/josh-commands-split.ts +1 -2
  487. package/scripts/josh/josh-commands-versioning.ts +5 -5
  488. package/scripts/josh/josh-commands-workflow.ts +30 -22
  489. package/scripts/josh/josh-environment-file.ts +1 -1
  490. package/scripts/josh/josh-in-process.ts +3 -3
  491. package/scripts/josh/josh-logic.ts +6 -7
  492. package/scripts/josh/josh-run.ts +3 -3
  493. package/scripts/josh/josh-verdict.ts +9 -12
  494. package/scripts/josh/josh.ts +3 -3
  495. package/scripts/josh/kit-only.ts +2 -2
  496. package/scripts/josh/path-decision.ts +3 -3
  497. package/scripts/josh/platform-temporary.ts +7 -5
  498. package/scripts/josh/process-identity.ts +24 -6
  499. package/scripts/josh/process-owner.ts +4 -4
  500. package/scripts/josh/session-language-cli.ts +53 -11
  501. package/scripts/josh/session-language.ts +1 -1
  502. package/scripts/josh/stamp-file.ts +48 -29
  503. package/scripts/josh/stamp-record.ts +57 -0
  504. package/scripts/lane/lane-await.ts +35 -11
  505. package/scripts/lane/lane-cache.ts +6 -6
  506. package/scripts/lane/lane-capacity.ts +32 -17
  507. package/scripts/lane/lane-child-invocation.ts +17 -15
  508. package/scripts/lane/lane-child-marker.ts +12 -12
  509. package/scripts/lane/lane-cli.ts +12 -13
  510. package/scripts/lane/lane-close.ts +6 -6
  511. package/scripts/lane/lane-dispatch.ts +61 -72
  512. package/scripts/lane/lane-environment.ts +5 -5
  513. package/scripts/lane/lane-guard-policy.ts +7 -21
  514. package/scripts/lane/lane-handoff.ts +2 -2
  515. package/scripts/lane/lane-install.ts +9 -10
  516. package/scripts/lane/lane-launch-cli.ts +13 -8
  517. package/scripts/lane/lane-ledger.ts +73 -11
  518. package/scripts/lane/lane-leftover.ts +2 -2
  519. package/scripts/lane/lane-limit-cli.ts +160 -0
  520. package/scripts/lane/lane-limit-override.ts +74 -0
  521. package/scripts/lane/lane-load.ts +19 -68
  522. package/scripts/lane/lane-measure-cli.ts +15 -25
  523. package/scripts/lane/lane-occupancy.ts +6 -4
  524. package/scripts/lane/lane-open.ts +20 -19
  525. package/scripts/lane/lane-output.ts +4 -3
  526. package/scripts/lane/lane-paths.ts +12 -11
  527. package/scripts/lane/lane-phase.ts +33 -0
  528. package/scripts/lane/lane-reap.ts +2 -2
  529. package/scripts/lane/lane-registry.ts +16 -15
  530. package/scripts/lane/lane-relaunch.ts +9 -9
  531. package/scripts/lane/lane-report.ts +5 -4
  532. package/scripts/lane/lane-resume.ts +2 -2
  533. package/scripts/lane/lane-sampler.ts +55 -0
  534. package/scripts/lane/lane-seed.ts +7 -7
  535. package/scripts/lane/lane-stage-stats.ts +135 -0
  536. package/scripts/lane/lane-start-point.ts +8 -11
  537. package/scripts/lane/lane-stats.ts +60 -15
  538. package/scripts/lane/lane-stray.ts +1 -1
  539. package/scripts/lane/lane-vacant.ts +1 -1
  540. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  541. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  542. package/scripts/lane/openai-review-broker.ts +2 -4
  543. package/scripts/lib/ancestor-directories.ts +1 -1
  544. package/scripts/lib/bounded-pool.ts +2 -2
  545. package/scripts/lib/buffered-process.ts +4 -6
  546. package/scripts/lib/caddy-logs.sh +0 -0
  547. package/scripts/lib/cli-flags.ts +39 -6
  548. package/scripts/lib/error-message.ts +1 -1
  549. package/scripts/lib/json-value.ts +17 -3
  550. package/scripts/lib/poll.ts +1 -1
  551. package/scripts/lib/status-icons.ts +3 -3
  552. package/scripts/lib/timed-fetch.ts +1 -1
  553. package/scripts/lib/timeouts.ts +1 -1
  554. package/scripts/lines/bytes-command.ts +3 -4
  555. package/scripts/lines/effective-limit.ts +25 -12
  556. package/scripts/lines/line-budget.ts +47 -55
  557. package/scripts/lines/line-targets.ts +6 -2
  558. package/scripts/lines/lines-command.ts +3 -3
  559. package/scripts/lint/cross-file-recheck.ts +155 -0
  560. package/scripts/lint/cspell-cached.ts +1 -1
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +35 -19
  563. package/scripts/lint/lint-related-scope.ts +25 -15
  564. package/scripts/lint/lint-related.ts +6 -7
  565. package/scripts/managed-marker/index.ts +1 -1
  566. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  567. package/scripts/notify/git-notify.ts +9 -7
  568. package/scripts/notify/telegram-notify.ts +53 -37
  569. package/scripts/notify/telegram-test-logic.ts +3 -3
  570. package/scripts/notify/telegram-test.ts +45 -30
  571. package/scripts/observations/observation-ledger-home.ts +14 -8
  572. package/scripts/observations/observation-ledger-line.ts +3 -2
  573. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  574. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  575. package/scripts/observations/observation-ledger.ts +14 -15
  576. package/scripts/observations/observation-record-cli.ts +83 -0
  577. package/scripts/observations/observation-record.ts +91 -0
  578. package/scripts/observations/observations-flush-cli.ts +1 -1
  579. package/scripts/observations/observations-flush-landing.ts +7 -6
  580. package/scripts/observations/observations-flush.ts +26 -27
  581. package/scripts/overrides/overrides-check.ts +18 -8
  582. package/scripts/package/package-scout-cli.ts +1 -1
  583. package/scripts/package/package-scout-format.ts +2 -2
  584. package/scripts/package/package-scout.ts +1 -1
  585. package/scripts/propagate/propagate-git-failure.ts +1 -1
  586. package/scripts/propagate/propagate-git.ts +7 -7
  587. package/scripts/propagate/propagate-plan.ts +2 -2
  588. package/scripts/propagate/propagate-publish.ts +2 -3
  589. package/scripts/propagate/propagate-run.ts +5 -7
  590. package/scripts/propagate/propagate-select.ts +1 -1
  591. package/scripts/propagate/propagate-steps.ts +19 -20
  592. package/scripts/propagate/propagate-targets.ts +6 -10
  593. package/scripts/propagate/propagate.ts +5 -5
  594. package/scripts/refactor/import-graph.ts +1 -1
  595. package/scripts/refactor/refactor-lint.ts +4 -10
  596. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  597. package/scripts/refactor/refactor-scan.ts +2 -2
  598. package/scripts/refactor/refactor-targets.ts +1 -1
  599. package/scripts/release/github-release-cli.ts +25 -3
  600. package/scripts/release/github-release-runs.ts +1 -1
  601. package/scripts/release/release-cli.ts +21 -4
  602. package/scripts/release/release-history.ts +6 -10
  603. package/scripts/release/release-plan.ts +3 -3
  604. package/scripts/release/release-progress.ts +3 -4
  605. package/scripts/release/release-publish.ts +8 -9
  606. package/scripts/release/release-scope-cli.ts +8 -10
  607. package/scripts/release/release-tag.ts +6 -8
  608. package/scripts/release/release-worktree.ts +5 -5
  609. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  610. package/scripts/repo/auto-merge-setting.ts +1 -1
  611. package/scripts/repo/repo-setting.ts +4 -4
  612. package/scripts/repo/repository-labels.ts +1 -1
  613. package/scripts/repo/required-checks-logic.ts +3 -3
  614. package/scripts/repo/required-checks-report.ts +1 -1
  615. package/scripts/repo/ruleset-check-cli.ts +1 -1
  616. package/scripts/repo/ruleset-check.ts +1 -1
  617. package/scripts/report/report-format-reference.ts +26 -0
  618. package/scripts/report/report-lint-cli.ts +2 -2
  619. package/scripts/report/report-lint.ts +16 -2
  620. package/scripts/review/disposition-cli.ts +2 -2
  621. package/scripts/review/disposition-logic.ts +1 -1
  622. package/scripts/review/live-evidence.ts +9 -6
  623. package/scripts/review/review-attest-cli.ts +1 -2
  624. package/scripts/review/review-attest.ts +3 -3
  625. package/scripts/review/review-brief-cli.ts +19 -20
  626. package/scripts/review/review-brief.ts +29 -32
  627. package/scripts/review/review-checkout.ts +2 -2
  628. package/scripts/review/review-diff-parts.ts +3 -5
  629. package/scripts/review/review-diff-write.ts +1 -1
  630. package/scripts/review/review-finding-ledger.ts +7 -4
  631. package/scripts/review/review-findings-cli.ts +2 -2
  632. package/scripts/review/review-level.ts +4 -7
  633. package/scripts/review/review-record-cli.ts +73 -16
  634. package/scripts/review/review-record.ts +5 -4
  635. package/scripts/review/review-round2-cli.ts +2 -3
  636. package/scripts/review/review-round2.ts +13 -21
  637. package/scripts/review/review-stamps.ts +9 -71
  638. package/scripts/review/review-tree.ts +4 -5
  639. package/scripts/rules/bash-triggers.ts +4 -4
  640. package/scripts/rules/decision-oracle-batch.ts +6 -7
  641. package/scripts/rules/decision-oracle-stage.ts +1 -1
  642. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  643. package/scripts/rules/decision-oracle.ts +2 -2
  644. package/scripts/rules/delivered-rules.ts +61 -406
  645. package/scripts/rules/destructive-command.ts +2 -2
  646. package/scripts/rules/direct-filing.ts +4 -4
  647. package/scripts/rules/direct-pr-create.ts +2 -2
  648. package/scripts/rules/early-heartbeat.ts +15 -19
  649. package/scripts/rules/file-body.ts +5 -6
  650. package/scripts/rules/filing-cap.ts +6 -7
  651. package/scripts/rules/filing-offer.ts +1 -1
  652. package/scripts/rules/firing-point.ts +6 -6
  653. package/scripts/rules/gh-api.ts +2 -2
  654. package/scripts/rules/git-argv.ts +3 -3
  655. package/scripts/rules/git-force.ts +2 -2
  656. package/scripts/rules/hook-context-line.ts +31 -0
  657. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  658. package/scripts/rules/implementation-cut.ts +35 -32
  659. package/scripts/rules/index-guard.ts +2 -2
  660. package/scripts/rules/issue-citation.ts +7 -7
  661. package/scripts/rules/issue-comments.ts +21 -13
  662. package/scripts/rules/josh-git-bare.ts +2 -2
  663. package/scripts/rules/lane-background.ts +14 -16
  664. package/scripts/rules/lane-carry-conflict.ts +41 -5
  665. package/scripts/rules/lane-interactive-ask.ts +6 -9
  666. package/scripts/rules/lane-park.ts +12 -16
  667. package/scripts/rules/lane-split-park.ts +1 -2
  668. package/scripts/rules/lane-switch-main.ts +10 -13
  669. package/scripts/rules/last-prompt.ts +1 -1
  670. package/scripts/rules/oracle-consulted.ts +5 -5
  671. package/scripts/rules/oracle-firing.ts +6 -9
  672. package/scripts/rules/oracle-list-cli.ts +2 -2
  673. package/scripts/rules/permission-guards.ts +2 -2
  674. package/scripts/rules/piped-verification.ts +79 -9
  675. package/scripts/rules/poll-loop.ts +9 -11
  676. package/scripts/rules/pre-gate-cut.ts +33 -30
  677. package/scripts/rules/prior-comment-read.ts +3 -3
  678. package/scripts/rules/protected-files.ts +25 -13
  679. package/scripts/rules/raw-field-body.ts +3 -4
  680. package/scripts/rules/reply-language.ts +1 -1
  681. package/scripts/rules/rule-body-guard.ts +10 -12
  682. package/scripts/rules/rule-guard.ts +1 -1
  683. package/scripts/rules/rule-list.ts +51 -0
  684. package/scripts/rules/rule-registry-rows.ts +282 -0
  685. package/scripts/rules/rule-registry.ts +109 -0
  686. package/scripts/rules/rule-value-cache.ts +2 -2
  687. package/scripts/rules/rule-value-cli.ts +6 -4
  688. package/scripts/rules/rule-value.ts +61 -22
  689. package/scripts/rules/run-tail-rule.ts +11 -15
  690. package/scripts/rules/shell-body-trigger.ts +7 -7
  691. package/scripts/rules/shell-segments.ts +2 -4
  692. package/scripts/rules/stop-rules.ts +54 -41
  693. package/scripts/rules/tail-commands.ts +1 -1
  694. package/scripts/rules/test-declared-commit.ts +2 -2
  695. package/scripts/rules/third-party-write.ts +3 -3
  696. package/scripts/rules/worktree-guard.ts +12 -5
  697. package/scripts/run/add/run-add-cli.ts +165 -0
  698. package/scripts/run/add/run-add.ts +124 -0
  699. package/scripts/run/board/run-board-cli.ts +207 -0
  700. package/scripts/run/board/run-board-closed.ts +95 -0
  701. package/scripts/run/board/run-board-every.ts +60 -0
  702. package/scripts/run/board/run-board-fetch.ts +38 -0
  703. package/scripts/run/board/run-board-fit.ts +219 -0
  704. package/scripts/run/board/run-board-github.ts +162 -0
  705. package/scripts/run/board/run-board-header.ts +275 -0
  706. package/scripts/run/board/run-board-kind.ts +35 -0
  707. package/scripts/run/board/run-board-labels.ts +299 -0
  708. package/scripts/run/board/run-board-layout.ts +222 -0
  709. package/scripts/run/board/run-board-link.ts +31 -0
  710. package/scripts/run/board/run-board-machine.ts +198 -0
  711. package/scripts/run/board/run-board-notes.ts +103 -0
  712. package/scripts/run/board/run-board-phase.ts +136 -0
  713. package/scripts/run/board/run-board-plan.ts +129 -0
  714. package/scripts/run/board/run-board-read.ts +62 -0
  715. package/scripts/run/board/run-board-render-legend.ts +82 -0
  716. package/scripts/run/board/run-board-render-notes.ts +77 -0
  717. package/scripts/run/board/run-board-render-slot.ts +50 -0
  718. package/scripts/run/board/run-board-render.ts +407 -0
  719. package/scripts/run/board/run-board-scope.ts +17 -0
  720. package/scripts/run/board/run-board-screen.ts +43 -0
  721. package/scripts/run/board/run-board-span.ts +66 -0
  722. package/scripts/run/board/run-board-spin.ts +115 -0
  723. package/scripts/run/board/run-board-state.ts +113 -0
  724. package/scripts/run/board/run-board-status.ts +279 -0
  725. package/scripts/run/board/run-board-tick.ts +210 -0
  726. package/scripts/run/board/run-board-track.ts +22 -0
  727. package/scripts/run/board/run-board-usage-read.ts +255 -0
  728. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  729. package/scripts/run/board/run-board-usage-text.ts +80 -0
  730. package/scripts/run/board/run-board-usage.ts +165 -0
  731. package/scripts/run/carry/run-carry-added.ts +62 -0
  732. package/scripts/run/carry/run-carry-args.ts +25 -22
  733. package/scripts/run/carry/run-carry-change.ts +1 -1
  734. package/scripts/run/carry/run-carry-cli.ts +71 -48
  735. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  736. package/scripts/run/carry/run-carry-ended.ts +85 -0
  737. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  738. package/scripts/run/carry/run-carry-stash.ts +3 -2
  739. package/scripts/run/carry/run-carry-streak.ts +8 -10
  740. package/scripts/run/carry/run-carry.ts +85 -89
  741. package/scripts/run/cut/run-cut-args.ts +7 -7
  742. package/scripts/run/cut/run-cut-cli.ts +54 -36
  743. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  744. package/scripts/run/cut/run-cut-report.ts +37 -16
  745. package/scripts/run/cut/run-cut.ts +63 -77
  746. package/scripts/run/detached-launch.ts +35 -50
  747. package/scripts/run/entry/run-entry-cli.ts +48 -27
  748. package/scripts/run/entry/run-entry-stop.ts +7 -9
  749. package/scripts/run/entry/run-entry.ts +5 -6
  750. package/scripts/run/event/run-event-cli.ts +5 -6
  751. package/scripts/run/event/run-event-filed.ts +69 -0
  752. package/scripts/run/event/run-event-follow.ts +3 -3
  753. package/scripts/run/event/run-event-plan.ts +38 -0
  754. package/scripts/run/event/run-event-render.ts +9 -4
  755. package/scripts/run/event/run-event-scope.ts +47 -18
  756. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  757. package/scripts/run/event/run-event-stream.ts +171 -46
  758. package/scripts/run/event/run-event-watch.ts +4 -6
  759. package/scripts/run/hold/run-hold-cli.ts +65 -62
  760. package/scripts/run/hold/run-hold.ts +88 -46
  761. package/scripts/run/merge/run-merge-cli.ts +116 -77
  762. package/scripts/run/merge/run-merge-collect.ts +107 -0
  763. package/scripts/run/merge/run-merge-steps.ts +112 -65
  764. package/scripts/run/merge/run-merge-token.ts +30 -0
  765. package/scripts/run/merge/run-merge.ts +31 -22
  766. package/scripts/run/progress/run-progress-args.ts +4 -4
  767. package/scripts/run/progress/run-progress-cli.ts +39 -50
  768. package/scripts/run/progress/run-progress-clock.ts +25 -32
  769. package/scripts/run/progress/run-progress-config.ts +6 -9
  770. package/scripts/run/progress/run-progress-read.ts +9 -10
  771. package/scripts/run/progress/run-progress.ts +48 -53
  772. package/scripts/run/review/run-review-cli.ts +6 -6
  773. package/scripts/run/review/run-review-steps.ts +6 -6
  774. package/scripts/run/review/run-review.ts +9 -11
  775. package/scripts/run/run-cli-fault.ts +29 -0
  776. package/scripts/run/run-ending-cli.ts +3 -3
  777. package/scripts/run/run-ending.ts +10 -14
  778. package/scripts/run/run-halfrun-resume.ts +6 -8
  779. package/scripts/run/run-headless.ts +26 -12
  780. package/scripts/run/run-invocation.ts +17 -22
  781. package/scripts/run/run-label.ts +7 -5
  782. package/scripts/run/run-liveness-cli.ts +19 -6
  783. package/scripts/run/run-liveness.ts +27 -38
  784. package/scripts/run/run-next-cli.ts +5 -9
  785. package/scripts/run/run-next.ts +4 -5
  786. package/scripts/run/run-parent-cut-hook.ts +10 -12
  787. package/scripts/run/run-preflight.ts +25 -29
  788. package/scripts/run/run-prep-cli.ts +17 -13
  789. package/scripts/run/run-prep-locate.ts +4 -5
  790. package/scripts/run/run-prep.ts +7 -10
  791. package/scripts/run/run-prrun-resume.ts +2 -2
  792. package/scripts/run/run-report-cli.ts +4 -4
  793. package/scripts/run/run-report.ts +9 -14
  794. package/scripts/run/run-retrospective.ts +3 -3
  795. package/scripts/run/run-section.ts +42 -0
  796. package/scripts/run/run-stage-read.ts +2 -2
  797. package/scripts/run/run-stage.ts +6 -4
  798. package/scripts/run/run-status-cli.ts +7 -5
  799. package/scripts/run/run-status.ts +6 -7
  800. package/scripts/run/run-step-cli.ts +64 -18
  801. package/scripts/run/run-step.ts +107 -51
  802. package/scripts/run/run-stop-notify.ts +7 -8
  803. package/scripts/run/run-stranded-cli.ts +1 -1
  804. package/scripts/run/run-stranded-detect.ts +4 -4
  805. package/scripts/run/run-stranded.ts +11 -13
  806. package/scripts/run/run-tail-cli.ts +15 -16
  807. package/scripts/run/run-tail.ts +14 -33
  808. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  809. package/scripts/run/run-watcher-guard.ts +11 -12
  810. package/scripts/run/run-watcher-hook.ts +6 -12
  811. package/scripts/run/ship/run-ship-cli.ts +67 -33
  812. package/scripts/run/ship/run-ship-detach.ts +15 -13
  813. package/scripts/run/ship/run-ship-lock.ts +1 -1
  814. package/scripts/run/ship/run-ship-next.ts +7 -8
  815. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  816. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  817. package/scripts/run/ship/run-ship-probe.ts +4 -4
  818. package/scripts/run/ship/run-ship-return.ts +1 -1
  819. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  820. package/scripts/run/ship/run-ship-review.ts +12 -14
  821. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  822. package/scripts/run/ship/run-ship-stage.ts +80 -26
  823. package/scripts/run/ship/run-ship-steps.ts +26 -16
  824. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  825. package/scripts/run/ship/run-ship-sync.ts +9 -8
  826. package/scripts/run/ship/run-ship.ts +17 -32
  827. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  828. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  829. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  830. package/scripts/run/tidy/run-tidy.ts +4 -3
  831. package/scripts/run/wake/run-wake-cli.ts +27 -32
  832. package/scripts/run/wake/run-wake-describe.ts +24 -28
  833. package/scripts/run/wake/run-wake-driver.ts +14 -14
  834. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  835. package/scripts/run/wake/run-wake-loop.ts +9 -9
  836. package/scripts/run/wake/run-wake-restart.ts +4 -5
  837. package/scripts/run/wake/run-wake-session.ts +23 -27
  838. package/scripts/run/wake/run-wake.ts +57 -279
  839. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  840. package/scripts/safe-chain/pack-hook.ts +2 -2
  841. package/scripts/safe-chain/preinstall-command.ts +2 -2
  842. package/scripts/security/security-audit-logic.ts +1 -1
  843. package/scripts/security/security-audit-provision-logic.ts +1 -1
  844. package/scripts/security/security-audit-provision.ts +2 -2
  845. package/scripts/security/security-audit.ts +5 -5
  846. package/scripts/security/security-updates-logic.ts +2 -3
  847. package/scripts/security/security-updates.ts +2 -4
  848. package/scripts/self-sync-guard/index.ts +1 -1
  849. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  850. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  851. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  852. package/scripts/sonar/sonar-hotspots.ts +1 -1
  853. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  854. package/scripts/sonar/sonar-new-code.ts +1 -1
  855. package/scripts/sonar/sonar-project.ts +1 -1
  856. package/scripts/split/split-assess-cli.ts +1 -1
  857. package/scripts/split/split-assess.ts +3 -3
  858. package/scripts/sync/directory-copy-guard.ts +2 -3
  859. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  860. package/scripts/sync/managed-config-scope.ts +4 -4
  861. package/scripts/sync/plugin-skill-directories.ts +2 -2
  862. package/scripts/sync/reconcile-templates.ts +17 -8
  863. package/scripts/sync/removed-skill-manifest.ts +2 -3
  864. package/scripts/sync/sync-ai-files.ts +7 -7
  865. package/scripts/sync/sync-configs.ts +30 -3
  866. package/scripts/sync/sync-hook-safety.ts +2 -2
  867. package/scripts/sync/sync.ts +23 -10
  868. package/scripts/sync/synced-paths.ts +2 -1
  869. package/scripts/sync/workflow-pin-logic.ts +1 -1
  870. package/scripts/test/test-declared-changed.ts +4 -4
  871. package/scripts/test/test-declared-logic.ts +2 -3
  872. package/scripts/test/test-declared-match.ts +25 -4
  873. package/scripts/test/test-declared.ts +26 -9
  874. package/scripts/test/test-red-commit.ts +3 -2
  875. package/scripts/test/test-red-logic.ts +7 -14
  876. package/scripts/test/test-red.ts +12 -47
  877. package/scripts/test/test-related-scope.ts +2 -3
  878. package/scripts/test/test-related.ts +3 -3
  879. package/scripts/test/test-type-logic.ts +1 -2
  880. package/scripts/test/test-unit-guard.ts +13 -17
  881. package/scripts/test/unit-worker-share.ts +7 -8
  882. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  883. package/scripts/time-runtime/time-background.ts +17 -21
  884. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  885. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  886. package/scripts/time-runtime/time-bundles.ts +11 -12
  887. package/scripts/time-runtime/time-call-identity.ts +1 -1
  888. package/scripts/time-runtime/time-command-key.ts +2 -2
  889. package/scripts/time-runtime/time-density-hook.ts +8 -11
  890. package/scripts/time-runtime/time-density.ts +5 -5
  891. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  892. package/scripts/time-runtime/time-format.ts +5 -5
  893. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  894. package/scripts/time-runtime/time-instant.ts +1 -1
  895. package/scripts/time-runtime/time-markers.ts +15 -19
  896. package/scripts/time-runtime/time-phase-names.ts +3 -3
  897. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  898. package/scripts/time-runtime/time-round-trips.ts +20 -23
  899. package/scripts/time-runtime/time-shell.ts +8 -8
  900. package/scripts/time-runtime/time-single-check.ts +1 -2
  901. package/scripts/time-runtime/time-spans.ts +35 -40
  902. package/scripts/time-runtime/time-tool-call.ts +15 -16
  903. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  904. package/scripts/time-runtime/time-writes.ts +5 -5
  905. package/scripts/ui/ui-routes-cli.ts +1 -2
  906. package/scripts/ui/ui-routes.ts +1 -2
  907. package/scripts/version/bump-version.ts +1 -1
  908. package/scripts/version/fresh-metadata-cache.ts +2 -2
  909. package/scripts/version/latest-corepack.ts +26 -26
  910. package/scripts/version/latest-lane-guard.ts +1 -1
  911. package/scripts/version/latest-scope-cli.ts +2 -2
  912. package/scripts/version/latest-stamp.ts +1 -2
  913. package/scripts/version/latest-update.ts +2 -2
  914. package/scripts/version/npm-registry.ts +2 -2
  915. package/scripts/version/package-manager-version.ts +18 -0
  916. package/scripts/version/publishable-range-check.ts +2 -1
  917. package/scripts/version/publishable-range.ts +1 -1
  918. package/scripts/version/release-age.ts +11 -11
  919. package/scripts/version/release-hold.ts +2 -2
  920. package/scripts/version/safe-chain-version-update.ts +3 -3
  921. package/scripts/version/version-check-logic.ts +2 -3
  922. package/scripts/version/version-check.ts +1 -2
  923. package/scripts/version/version-command-config.ts +2 -2
  924. package/scripts/version/version-commands.ts +3 -3
  925. package/scripts/version/version-remote.ts +4 -4
  926. package/scripts/version/version-targets.ts +2 -2
  927. package/templates/gitignore +7 -0
  928. package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
  929. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  930. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  931. package/scripts/backlog/backlog-restructure.ts +0 -152
  932. package/scripts/rules/issue-fold-rule.ts +0 -72
  933. package/scripts/rules/wip-cap.ts +0 -63
  934. package/scripts/run/run-issue-number.ts +0 -19
@@ -9,11 +9,10 @@ import { epic_shape } from './epic-shape'
9
9
  // Everything `josh epic --remove` decides before it writes anything.
10
10
  //
11
11
  // A declared order lives in two places at once — the epic body's `Dependencies` declaration and the
12
- // native `blocked-by` relations — and until this command there was no way to delete one from both at
13
- // once. The only route was the hand edit `CLAUDE.md` forbids plus a bare `DELETE` on the
14
- // dependencies endpoint, and doing either half alone leaves `epic:next` answering
15
- // `declaration_mismatch`, which stops an unattended run. Epic joshuafolkken/kit#1262 recorded
16
- // twenty-nine such removals before the command existed (joshuafolkken/kit#1712).
12
+ // native `blocked-by` relations — and this command deletes one from both at once. The alternative is
13
+ // the hand edit `CLAUDE.md` forbids plus a bare `DELETE` on the dependencies endpoint, and doing
14
+ // either half alone leaves `epic:next` answering `declaration_mismatch`, which stops an unattended
15
+ // run.
17
16
  //
18
17
  // Kept apart from the GitHub calls for the reason `epic-add-plan.ts` is: the whole decision is
19
18
  // asserted without a network, and a refusal path only reachable through `gh` is one nobody tests.
@@ -1,4 +1,5 @@
1
1
  import { git_gh_command } from '#scripts/gh/git-gh-command'
2
+ import { session_cite } from '#scripts/issue/session-cite'
2
3
  import { epic_decision } from './epic-decision'
3
4
  import { epic_read } from './epic-read'
4
5
  import { format_dependency_links } from './epic-reference'
@@ -6,13 +7,12 @@ import { epic_relations } from './epic-relations'
6
7
  import { epic_remove_plan, type RemovePlan } from './epic-remove-plan'
7
8
 
8
9
  // `josh epic --remove <E> <M> <N> [<N2> ...] [--decision-file <path|->]` — delete a declared order
9
- // from the epic's body and from the native `blocked-by` relations in one input
10
- // (joshuafolkken/kit#1712).
10
+ // from the epic's body and from the native `blocked-by` relations in one input.
11
11
  //
12
12
  // It is `--add`'s missing counterpart. `--add` exists because writing the declaration and the
13
13
  // relations separately is what leaves them disagreeing; deleting them separately leaves them
14
- // disagreeing in exactly the same way, and there was no command for it at all — so the only route
15
- // was the hand edit `CLAUDE.md` forbids, twenty-nine times over on epic joshuafolkken/kit#1262.
14
+ // disagreeing in exactly the same way, and without a command for it the only route is the hand edit
15
+ // `CLAUDE.md` forbids.
16
16
 
17
17
  const FAILURE_EXIT_CODE = 1
18
18
  const SUCCESS_EXIT_CODE = 0
@@ -54,7 +54,9 @@ async function write_plan(
54
54
  ): Promise<void> {
55
55
  await git_gh_command.issue_edit_body(String(epic_number), plan.body)
56
56
  console.info(
57
- `📋 Removed ${format_dependency_links(plan.links)} from epic #${String(epic_number)}.`,
57
+ session_cite.text(
58
+ `📋 Removed ${format_dependency_links(plan.links)} from epic ${session_cite.issue(epic_number)}.`,
59
+ ),
58
60
  )
59
61
  report_relations(plan, await epic_relations.apply_relations(plan.removed, 'drop'))
60
62
 
@@ -3,9 +3,8 @@ import { epic_graph, type EpicChild, type GraphAnomaly } from './epic-graph'
3
3
 
4
4
  // Turning a classification into the answer a caller acts on.
5
5
  //
6
- // The verdict is what `epicrun` (joshuafolkken/kit#861) branches on, so the three "nothing to run"
7
- // cases are kept apart: waiting, stopping, and being finished are different instructions
8
- // (joshuafolkken/kit#860).
6
+ // The verdict is what `epicrun` branches on, so the three "nothing to run"
7
+ // cases are kept apart: waiting, stopping, and being finished are different instructions.
9
8
 
10
9
  // What the caller should do next.
11
10
  type EpicVerdict = 'run' | 'wait' | 'stop' | 'complete' | 'error'
@@ -13,17 +12,16 @@ type EpicVerdict = 'run' | 'wait' | 'stop' | 'complete' | 'error'
13
12
  interface RepoCandidates {
14
13
  repo: string
15
14
  children: ReadonlyArray<EpicChild>
16
- // The local checkout a runner would work in, from joshuafolkken/kit#869's map. Absent when the
15
+ // The local checkout a runner would work in, from the checkout discovery map. Absent when the
17
16
  // repository is not checked out here — reported rather than cloned, since creating a working tree
18
- // nobody asked for is not a step this command takes (joshuafolkken/kit#864).
17
+ // nobody asked for is not a step this command takes.
19
18
  path?: string
20
19
  }
21
20
 
22
21
  interface EpicNextResult {
23
22
  verdict: EpicVerdict
24
23
  // Runnable children bundled per repository. How many of one bundle may start at once is the
25
- // repository's free-lane count, which `epic-lane-offer.ts` decides and this report does not know
26
- // (joshuafolkken/kit#1491).
24
+ // repository's free-lane count, which `epic-lane-offer.ts` decides and this report does not know.
27
25
  candidates: ReadonlyArray<RepoCandidates>
28
26
  waiting: ReadonlyArray<EpicChild>
29
27
  blocked_on_people: ReadonlyArray<EpicChild>
@@ -32,12 +30,12 @@ interface EpicNextResult {
32
30
 
33
31
  // Bundle by repository, repositories in name order, so a run is reproducible rather than dependent
34
32
  // on the order GitHub happened to list the repositories in. **The children are not re-ordered at
35
- // all** since joshuafolkken/kit#1583 — they keep the order the epic's task list gave them, which is
33
+ // all** — they keep the order the epic's task list gave them, which is
36
34
  // how an epic says which of its runnable children goes first; the reasoning is at `bundle_by_repo`
37
35
  // below.
38
36
  // The discovery map is keyed lowercase — GitHub resolves owner and repository names
39
37
  // case-insensitively — so the lookup lowercases too. Without it any capital in a repository name
40
- // printed "no local checkout" for a repository that is checked out (joshuafolkken/kit#864).
38
+ // printed "no local checkout" for a repository that is checked out.
41
39
  //
42
40
  // `exactOptionalPropertyTypes` rejects `{ path: undefined }`, so the key is added only when there
43
41
  // is a path to put in it.
@@ -63,14 +61,14 @@ function bundle_by_repo(
63
61
  for (const [repo] of grouped) repos.push(repo)
64
62
 
65
63
  // **The children keep the order they arrived in, which is the order the epic's task list names
66
- // them** (joshuafolkken/kit#1583). They used to be re-sorted by issue number here, on the premise
67
- // that number order is split order — true only of an epic whose children were all filed in one
68
- // split, and false of every epic that grows as work is found: there the number order is *filing*
69
- // order, and an epic had no way at all to say which of its runnable children should go first.
64
+ // them**. Re-sorting by issue number would assume that number order is split order — true only of
65
+ // an epic whose children were all filed in one split, and false of every epic that grows as work
66
+ // is found: there the number order is *filing* order, and an epic would have no way at all to say
67
+ // which of its runnable children should go first.
70
68
  //
71
- // Nothing else had to change to make the body order authoritative: `epic-fetch.ts` →
72
- // `fetch_children` already reads the task list in body order and `epic-classify.ts` fills
73
- // `runnable` in that order, so this sort was the one step discarding it.
69
+ // The body order is authoritative end to end: `epic-fetch.ts` → `fetch_children` reads the task
70
+ // list in body order and `epic-classify.ts` fills `runnable` in that order, so a sort here would be
71
+ // the one step discarding it.
74
72
  //
75
73
  // **The repositories are still sorted by name**, which is a different question — that is grouping,
76
74
  // not the order work is offered in.
@@ -115,7 +113,7 @@ function build_result(
115
113
  }
116
114
 
117
115
  // Every runnable child of one repository, in the order they would be offered — **the order the
118
- // epic's own task list names them** (joshuafolkken/kit#1583). It was lowest number first until then,
116
+ // epic's own task list names them**. It was lowest number first until then,
119
117
  // on the premise that number order is split order; an epic that gains children as work is found has
120
118
  // no such property, and the epic could not express a priority at all.
121
119
  //
@@ -126,7 +124,7 @@ function build_result(
126
124
  //
127
125
  // The whole bundle rather than only its head, because the confirmation walk needs the rest of it: a
128
126
  // candidate whose relations listing disagrees with its summary is withheld and the next one is
129
- // confirmed in its place (joshuafolkken/kit#1121).
127
+ // confirmed in its place.
130
128
  function candidates_for_repo(result: EpicNextResult, repo: string): ReadonlyArray<EpicChild> {
131
129
  return result.candidates.find((bundle) => bundle.repo === repo)?.children ?? []
132
130
  }
@@ -138,8 +136,8 @@ function format_bundle_heading(bundle: RepoCandidates): string {
138
136
  }
139
137
 
140
138
  // A child in another repository is written `owner/repo#N`, not a bare `#N` — a bare number resolves
141
- // against the reader's own repository and would linkify to the wrong issue there
142
- // (joshuafolkken/kit#2329). This reuses the one spelling `epic_graph.format_reference` already gives
139
+ // against the reader's own repository and would linkify to the wrong issue there.
140
+ // This reuses the one spelling `epic_graph.format_reference` already gives
143
141
  // every other read of a child, rather than a second one here.
144
142
  function format_child(child: EpicChild, current_repo: string): string {
145
143
  return ` ${epic_graph.format_reference(child, current_repo)}`
@@ -1,5 +1,6 @@
1
1
  import { git_gh_command } from '#scripts/gh/git-gh-command'
2
2
  import { EPIC_LABEL } from '#scripts/issue/issue-labels'
3
+ import { session_cite } from '#scripts/issue/session-cite'
3
4
  import { epic_body } from './epic-body'
4
5
  import { epic_promote } from './epic-promote'
5
6
  import { epic_relations } from './epic-relations'
@@ -128,7 +129,7 @@ async function read_promotion_subject(epic_number: number): Promise<EpicSubject
128
129
  )
129
130
 
130
131
  if (subject === undefined) {
131
- console.error(`✖ Could not read issue #${String(epic_number)}.`)
132
+ console.error(`✖ Could not read issue ${session_cite.issue(epic_number)}.`)
132
133
 
133
134
  return undefined
134
135
  }
@@ -136,7 +137,7 @@ async function read_promotion_subject(epic_number: number): Promise<EpicSubject
136
137
  if (epic_promote.has_conflicting_tracking(subject.body)) {
137
138
  const reason = epic_promote.conflict_reason(subject.body)
138
139
 
139
- console.error(`✖ Cannot promote #${String(epic_number)}: ${reason}.`)
140
+ console.error(`✖ Cannot promote ${session_cite.issue(epic_number)}: ${reason}.`)
140
141
 
141
142
  return undefined
142
143
  }
@@ -168,7 +169,7 @@ async function write_promotion(
168
169
  }
169
170
 
170
171
  console.error(
171
- `✖ Wrote the epic sections to #${String(input.epic_number)} but could not apply the \`${EPIC_LABEL}\` label; apply it by hand.`,
172
+ `✖ Wrote the epic sections to ${session_cite.issue(input.epic_number)} but could not apply the \`${EPIC_LABEL}\` label; apply it by hand.`,
172
173
  )
173
174
 
174
175
  return FAILURE_EXIT_CODE
@@ -188,7 +189,7 @@ async function promote_epic(input: PromoteEpicInput): Promise<number> {
188
189
  const written = await write_promotion(input, subject.body)
189
190
  if (written !== SUCCESS_EXIT_CODE) return written
190
191
 
191
- console.info(`📋 Promoted #${String(input.epic_number)} to an epic.`)
192
+ console.info(`📋 Promoted ${session_cite.issue(input.epic_number)} to an epic.`)
192
193
  await apply_dependencies({ children: input.children, is_ordered: input.is_ordered })
193
194
  console.info(`▶ Run the children with: ${epic_body.format_run_command(input.epic_number)}`)
194
195
 
@@ -200,7 +201,7 @@ async function check_epic(epic_number: number): Promise<number> {
200
201
  const subject = epic_validate.parse_epic_subject(raw)
201
202
 
202
203
  if (subject === undefined) {
203
- console.error(`✖ Could not read issue #${String(epic_number)}.`)
204
+ console.error(`✖ Could not read issue ${session_cite.issue(epic_number)}.`)
204
205
 
205
206
  return FAILURE_EXIT_CODE
206
207
  }
@@ -6,7 +6,7 @@ import { epic_parse } from './epic-parse'
6
6
  // declaration is replaced inside it rather than wherever a declaration-shaped line happens to sit.
7
7
  // `## Decisions` needs the identical search, and a second copy of it is the clone `CLAUDE.md`
8
8
  // prohibits — the fence mask especially, since a heading inside a fenced block is an illustration and
9
- // a copy that forgot it would append a decision into a quoted template (joshuafolkken/kit#1350).
9
+ // a copy that forgot it would append a decision into a quoted template.
10
10
  //
11
11
  // Nothing here writes. The two consumers decide what to do with a range; this decides where one is.
12
12
 
@@ -65,7 +65,7 @@ function is_section_end(input: BodyLines, index: number, level: number): boolean
65
65
  // Where the named section runs: the lines after its heading, up to the next heading **of the same or a
66
66
  // higher level**. Not "the next heading of any level" — `## Decisions` is written as one `###` entry per
67
67
  // decision, the template the epic body documents, so ending at any heading would make the section one
68
- // line long and place every appended record after its first entry (joshuafolkken/kit#1350). A `##`
68
+ // line long and place every appended record after its first entry. A `##`
69
69
  // section running to the next `##` is what a reader of the body already takes it to mean.
70
70
  //
71
71
  // `undefined` is "the body has no such section", which is a different answer from an empty one — the
@@ -8,7 +8,7 @@ import { to_issue_reference } from './epic-reference'
8
8
  // label, a task list to place rows in, and a declaration
9
9
  // their edit can be relative to. It lives in one module rather than in each of them, because the two
10
10
  // commands must refuse the same inputs for the same reasons — a second copy is where one comes to
11
- // accept an epic the other refuses (joshuafolkken/kit#1712).
11
+ // accept an epic the other refuses.
12
12
 
13
13
  // The part of an epic these refusals read. Narrower than either command's own input on purpose: a
14
14
  // shape check that could see the children being placed would invite conditions that belong to the
@@ -30,7 +30,7 @@ function missing_declaration_error(epic_number: number): string {
30
30
  // choice between promoting and creating a new epic depends on what the target *is*, which only a
31
31
  // reader of it knows (`.claude/skills/workflow-commands/split-assessment.md` → promote-or-create).
32
32
  // Naming both arms is what keeps the refusal one command away from being actionable rather than a
33
- // dead end, which is the whole point of `into <target>` (joshuafolkken/kit#985).
33
+ // dead end, which is the whole point of `into <target>`.
34
34
  function promote_remedy(epic_number: number): string {
35
35
  const promote = `josh epic --promote ${String(epic_number)} <N...>`
36
36
 
@@ -41,7 +41,7 @@ function promote_remedy(epic_number: number): string {
41
41
  // differently: without rows there is nowhere to put a new one, and without a declaration there is
42
42
  // nothing for an edit to be relative to.
43
43
  //
44
- // **A child in another repository is not a refusal** (joshuafolkken/kit#3161). The declaration names
44
+ // **A child in another repository is not a refusal**. The declaration names
45
45
  // bare numbers only, so neither command can write an order across repositories — such an order lives
46
46
  // in the native relations alone (`epic_graph.child_links`), which these edits never read or drop — and
47
47
  // the rewrite leaves a row it does not recognize exactly where it stood.
@@ -1,12 +1,13 @@
1
1
  import { setTimeout as sleep } from 'node:timers/promises'
2
2
  import type { OpenIssueData } from '#scripts/git/git-schemas'
3
+ import { issue_cite } from '#scripts/issue/issue-cite'
3
4
  import { has_any_label, IN_PROGRESS_LABEL, RUN_SOLO_LABEL } from '#scripts/issue/issue-labels'
4
5
  import { lane_await } from '#scripts/lane/lane-await'
5
6
  import { lane_registry } from '#scripts/lane/lane-registry'
6
7
  import { issue_citation } from '#scripts/rules/issue-citation'
7
8
  import type { BusyRead } from './epic-busy'
8
9
 
9
- // A `run:solo` holder nothing is running for (joshuafolkken/kit#3017).
10
+ // A `run:solo` holder nothing is running for.
10
11
  //
11
12
  // A running `run:solo` issue lets nothing new start (`epic-solo.ts`), and "running" is read off the
12
13
  // `in-progress` label alone. A label nothing removed — a child that parked itself, then had its
@@ -77,7 +78,7 @@ async function find_stale(
77
78
  }
78
79
 
79
80
  function stale_message(stale: ReadonlyArray<OpenIssueData>, repo: string): string {
80
- const named = stale.map((issue) => `#${String(issue.number)}`).join(', ')
81
+ const named = stale.map((issue) => issue_cite.plain(issue.number)).join(', ')
81
82
 
82
83
  return issue_citation.linkify(
83
84
  `${named} carries \`${RUN_SOLO_LABEL}\` and \`${IN_PROGRESS_LABEL}\`, but no process of it is running in ${repo} — the \`${IN_PROGRESS_LABEL}\` label is stale, so it does not hold the backlog. Remove the label once you have confirmed nothing is running it.`,
@@ -1,10 +1,11 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
1
2
  import { has_any_label, has_label_name, RUN_SOLO_LABEL } from '#scripts/issue/issue-labels'
2
3
  import { issue_citation } from '#scripts/rules/issue-citation'
3
4
  import { epic_busy, type BusyRead } from './epic-busy'
4
5
  import type { EpicChild } from './epic-graph'
5
6
  import { epic_report, type EpicNextResult } from './epic-report'
6
7
 
7
- // The `run:solo` gate on what a run is offered (joshuafolkken/kit#2776).
8
+ // The `run:solo` gate on what a run is offered.
8
9
  //
9
10
  // `backlogrun-lanes.md`'s run-alone rule says an issue whose defect reaches the verification path runs
10
11
  // alone, and until this gate that was a judgement made at dispatch — the offer handed such an issue
@@ -16,16 +17,15 @@ import { epic_report, type EpicNextResult } from './epic-report'
16
17
  // disagree about what may start beside what.
17
18
  //
18
19
  // Three rules, all against the repository's `in-progress` holders (`epic_busy.read_repository`, with
19
- // a stale `run:solo` holder taken out by `epic_solo_stale.release` — joshuafolkken/kit#3017):
20
+ // a stale `run:solo` holder taken out by `epic_solo_stale.release`):
20
21
  // a running `run:solo` issue lets nothing new start; a `run:solo` candidate starts only into an idle
21
22
  // repository and then alone; and nothing ranked below a waiting `run:solo` candidate is offered past
22
23
  // it, so it is not starved by the lanes it is waiting on. A listing that could not be read is not an
23
24
  // idle repository — the same fail-safe answer `epic_busy` gives.
24
25
  //
25
- // **The label does not move a candidate up the ranking** (joshuafolkken/kit#2928, reversing
26
- // joshuafolkken/kit#2778). `run:solo` means "runs alone", and tidying that merely touches the
27
- // verification path carries it as well as a defect that breaks it. Which of them goes first is the
28
- // ranking's question — `issue-rank.ts` puts a verification-path defect at the head — so an idle
26
+ // **The label does not move a candidate up the ranking**. `run:solo` means "runs alone", and tidying
27
+ // that merely touches the verification path carries it as well as a defect that breaks it. Which of
28
+ // them goes first is the ranking's question — `issue-rank.ts` puts a verification-path defect at the head — so an idle
29
29
  // repository takes the candidates in rank order like any other.
30
30
 
31
31
  const SOLO_LABELS: ReadonlySet<string> = new Set([RUN_SOLO_LABEL])
@@ -55,14 +55,14 @@ function solo_holder(read: BusyRead): number | undefined {
55
55
 
56
56
  function held_message(holder: number, repo: string): string {
57
57
  return issue_citation.linkify(
58
- `#${String(holder)} carries \`${RUN_SOLO_LABEL}\` and is running in ${repo}; nothing else starts until it merges or is parked.`,
58
+ `${issue_cite.plain(holder)} carries \`${RUN_SOLO_LABEL}\` and is running in ${repo}; nothing else starts until it merges or is parked.`,
59
59
  repo,
60
60
  )
61
61
  }
62
62
 
63
63
  function waiting_message(solo: number, repo: string): string {
64
64
  return issue_citation.linkify(
65
- `#${String(solo)} carries \`${RUN_SOLO_LABEL}\` and waits for ${repo}'s running lanes to finish; nothing ranked below it is offered past it.`,
65
+ `${issue_cite.plain(solo)} carries \`${RUN_SOLO_LABEL}\` and waits for ${repo}'s running lanes to finish; nothing ranked below it is offered past it.`,
66
66
  repo,
67
67
  )
68
68
  }
@@ -1,10 +1,11 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
1
2
  import { has_label_name, RUN_LANE_LABEL, RUN_SOLO_LABEL } from '#scripts/issue/issue-labels'
2
3
  import { issue_citation } from '#scripts/rules/issue-citation'
3
4
  import type { EpicChild } from './epic-graph'
4
5
 
5
- // The triage gate on what a run is offered (joshuafolkken/kit#2779).
6
+ // The triage gate on what a run is offered.
6
7
  //
7
- // `run:solo` (joshuafolkken/kit#2776) records that an issue runs alone, but its absence said nothing:
8
+ // `run:solo` records that an issue runs alone, but its absence said nothing:
8
9
  // "judged safe beside others" and "never judged" looked the same, and an issue opted in mid-run reached
9
10
  // `backlog:drive` without any agent reading it. `run:lane` records the other answer, so an issue with
10
11
  // neither label is one nobody has judged — and such an issue may be one that must run alone.
@@ -21,7 +22,7 @@ type TriageVerdict = 'triage'
21
22
  const TRIAGE_VERDICT: TriageVerdict = 'triage'
22
23
 
23
24
  // Read off a bare label list too, so `josh issue:file` refuses an untriaged `auto-ok` filing by the
24
- // same answer the offer paths withhold it by (joshuafolkken/kit#3313).
25
+ // same answer the offer paths withhold it by.
25
26
  function has_triage_label(labels: ReadonlyArray<string>): boolean {
26
27
  return has_label_name(labels, RUN_SOLO_LABEL) || has_label_name(labels, RUN_LANE_LABEL)
27
28
  }
@@ -37,7 +38,7 @@ function untriaged(children: ReadonlyArray<EpicChild>): ReadonlyArray<EpicChild>
37
38
 
38
39
  // Names every untriaged number, so the parent reading standard error knows which issues to judge.
39
40
  function message(children: ReadonlyArray<EpicChild>, repo: string): string {
40
- const numbers = children.map((child) => `#${String(child.number)}`).join(', ')
41
+ const numbers = children.map((child) => issue_cite.plain(child.number)).join(', ')
41
42
 
42
43
  return issue_citation.linkify(
43
44
  `Untriaged: ${numbers} carry neither \`${RUN_SOLO_LABEL}\` nor \`${RUN_LANE_LABEL}\` in ${repo}, so nothing is offered until each is judged. Read each one, record its blocked-by order and one of the two labels with a comment saying why, then ask again.`,
@@ -1,6 +1,7 @@
1
1
  import { epic_subject_schema } from '#scripts/git/git-schemas'
2
- import { parse_json_object_safe } from '#scripts/git/parse-json-array'
2
+ import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
3
3
  import { EPIC_LABEL, has_label_name } from '#scripts/issue/issue-labels'
4
+ import { session_cite } from '#scripts/issue/session-cite'
4
5
  import { epic_parse, type DeclarationState } from './epic-parse'
5
6
 
6
7
  // The four requirements an epic has to satisfy are otherwise enforced only by an agent reading the
@@ -15,7 +16,7 @@ interface EpicSubject {
15
16
  // The epic's own state, as GitHub returned it (`OPEN` / `CLOSED`, casing unnormalized). Only
16
17
  // `epic-add.ts` reads it — to refuse adding a child to a closed epic — so it is optional: a read
17
18
  // that came back without the field leaves it undefined, which the refusal treats as "not confirmed
18
- // closed" rather than blocking (joshuafolkken/kit#2337).
19
+ // closed" rather than blocking.
19
20
  state?: string | undefined
20
21
  labels: ReadonlyArray<string>
21
22
  body: string | undefined
@@ -29,11 +30,11 @@ interface CheckResult {
29
30
 
30
31
  // The `number,labels,body` read's answer, as the shape every epic writer reads. It lives beside
31
32
  // the checks because `EpicSubject` is defined here, and each command that wanted one had otherwise
32
- // to restate the unwrapping (joshuafolkken/kit#890).
33
+ // to restate the unwrapping.
33
34
  function parse_epic_subject(raw_json: string | undefined): EpicSubject | undefined {
34
35
  if (raw_json === undefined) return undefined
35
36
 
36
- const parsed = parse_json_object_safe(raw_json, epic_subject_schema)
37
+ const parsed = parse_json_object_or_undefined(raw_json, epic_subject_schema)
37
38
  if (parsed === undefined) return undefined
38
39
 
39
40
  return {
@@ -61,7 +62,7 @@ function check_label(subject: EpicSubject): CheckResult {
61
62
  }
62
63
 
63
64
  function format_children(children: ReadonlyArray<number>): string {
64
- return children.map((child) => `#${String(child)}`).join(', ')
65
+ return children.map((child) => session_cite.issue(child)).join(', ')
65
66
  }
66
67
 
67
68
  function check_task_list(subject: EpicSubject): CheckResult {
@@ -138,8 +139,8 @@ function format_check_line(result: CheckResult): string {
138
139
  function format_check_report(epic_number: number, results: ReadonlyArray<CheckResult>): string {
139
140
  const lines = results.map((result) => format_check_line(result))
140
141
  const summary = is_epic_valid(results)
141
- ? `✅ Epic #${String(epic_number)} satisfies every requirement.`
142
- : `❌ Epic #${String(epic_number)} does not satisfy every requirement.`
142
+ ? `✅ Epic ${session_cite.issue(epic_number)} satisfies every requirement.`
143
+ : `❌ Epic ${session_cite.issue(epic_number)} does not satisfy every requirement.`
143
144
 
144
145
  return [...lines, '', summary].join('\n')
145
146
  }
@@ -64,7 +64,7 @@ function to_add_input(parsed: AddArguments): AddChildrenInput {
64
64
 
65
65
  // A qualified target — `owner/repo#N`. Naming this repository it is the same insertion written
66
66
  // longer, so it is performed; naming another it is refused with the command to run there, because
67
- // this command reads and writes only the repository it runs from (joshuafolkken/kit#985).
67
+ // this command reads and writes only the repository it runs from.
68
68
  async function run_qualified_addition(found: CrossRepoAddTarget): Promise<number> {
69
69
  const local = epic_cli.resolve_local_add(found, await git_gh_command.repo_get_name_with_owner())
70
70
 
@@ -78,7 +78,7 @@ async function run_qualified_addition(found: CrossRepoAddTarget): Promise<number
78
78
  // Why an insertion could not be read. A qualified target is answered on its own terms; an unusable
79
79
  // `--decision-file` path is named, because the generic line below would send the person after the epic
80
80
  // number and the positioning flag when what went missing is the record path a shell expanded to
81
- // nothing (joshuafolkken/kit#1350); anything else gets the requirements and the usage line.
81
+ // nothing; anything else gets the requirements and the usage line.
82
82
  async function refuse_addition(argv: ReadonlyArray<string>): Promise<number> {
83
83
  const qualified = epic_cli.find_cross_repo_add_target(argv)
84
84
 
@@ -104,7 +104,7 @@ async function refuse_addition(argv: ReadonlyArray<string>): Promise<number> {
104
104
  //
105
105
  // `--decision-file` is the one text an insertion does carry, and it is a *decision* rather than the
106
106
  // epic's rationale: it says why this child was placed here, and it goes to the epic's `## Decisions`
107
- // and to each child (joshuafolkken/kit#1350).
107
+ // and to each child.
108
108
  async function run_addition(argv: ReadonlyArray<string>): Promise<number> {
109
109
  const parsed = epic_cli.parse_add_arguments(argv)
110
110
 
@@ -115,7 +115,7 @@ async function run_addition(argv: ReadonlyArray<string>): Promise<number> {
115
115
 
116
116
  // Deleting a declared order. No position and no `--ordered`: the path itself says which orders go,
117
117
  // and what is deleted is only ever what it names — the ends are never reconnected, since a removal
118
- // that wrote an order would be declaring one nobody stated (joshuafolkken/kit#1712).
118
+ // that wrote an order would be declaring one nobody stated.
119
119
  async function run_removal(argv: ReadonlyArray<string>): Promise<number> {
120
120
  const parsed = epic_cli.parse_remove_arguments(argv)
121
121
 
@@ -135,7 +135,7 @@ async function run_removal(argv: ReadonlyArray<string>): Promise<number> {
135
135
  }
136
136
 
137
137
  // Reconcile an epic's declaration with its recorded relations. No decision file and no children: the
138
- // repair reads what the epic already records rather than being told an order (joshuafolkken/kit#2235).
138
+ // repair reads what the epic already records rather than being told an order.
139
139
  async function run_reconciliation(argv: ReadonlyArray<string>): Promise<number> {
140
140
  const parsed = epic_cli.parse_reconcile_arguments(argv)
141
141
 
@@ -10,7 +10,7 @@ const FAIL_EXIT_CODE = 1
10
10
  // A consumer's namespaces are read from `.svelte` files and routes a TypeScript program over its
11
11
  // `tsconfig.json` does not see, so every member they use would read as unused. The check is kit's own.
12
12
  //
13
- // **Not a skip notice** (joshuafolkken/kit#3162). `SKIP_MARKER` means "a check passed without running",
13
+ // **Not a skip notice**. `SKIP_MARKER` means "a check passed without running",
14
14
  // and the gate withholds its green record on it — so a consumer, where this notice prints on every
15
15
  // run, never got a green record. Out of scope by design is not unverified, so the marker stays out.
16
16
  const CONSUMER_NOTICE = `josh ${CHECK}: checks only the kit repository itself — nothing to check in a consumer project.`
@@ -5,8 +5,7 @@
5
5
  // and the run's tail cannot disagree about what "the completed issue" is.
6
6
  //
7
7
  // It sits in a module of its own because both consumers need it and neither may import the other:
8
- // the tail reads it to record a run, and the entry point reads it to build one
9
- // (joshuafolkken/kit#1539).
8
+ // the tail reads it to record a run, and the entry point reads it to build one.
10
9
  function parse_issue_number_from_text(input: string | undefined): string | undefined {
11
10
  if (input === undefined) return undefined
12
11
  const trimmed = input.trim()
@@ -1,15 +1,14 @@
1
1
  import { git_gh_helpers } from '#scripts/gh/git-gh-helpers'
2
2
 
3
- // joshuafolkken/kit#1539: everything a run does after its merge is cleanup, and a merge cannot be
4
- // taken back. Those steps used to be plain sequential statements, so whichever of them threw first
5
- // discarded every one after it — and the working-tree hold release is the last of them. Three runs
6
- // (joshuafolkken/kit#1197, #1537, #1319) ended that way: merged, the issue closed, and the hold left
7
- // behind for the next run to trip over.
3
+ // Everything a run does after its merge is cleanup, and a merge cannot be taken back. As plain
4
+ // sequential statements, whichever step threw first would discard every one after it — and the
5
+ // working-tree hold release is the last of them, so the hold would be left behind for the next run
6
+ // to trip over.
8
7
  //
9
8
  // **A step is run on its own, and its failure never reaches the next one.** The whole point is that
10
9
  // the steps are independent: the completion comment has nothing to do with the hold release, and
11
- // letting one decide the other is wrong whatever made it fail — this Issue's own defect, a Telegram
12
- // rate limit, or a Bad Gateway from GitHub.
10
+ // letting one decide the other is wrong whatever made it fail — a Telegram rate limit, or a Bad
11
+ // Gateway from GitHub.
13
12
  //
14
13
  // **Reported, never swallowed.** A cleanup that failed invisibly is a run that lies about what it
15
14
  // did, so the failure is printed where the run is being watched, with the command that finishes the
@@ -7,9 +7,9 @@ import { parse_completed_issue_number } from './followup-issue-number'
7
7
  import { git_followup_cleanup, type CleanupStep } from './git-followup-cleanup'
8
8
  import { git_followup_pending } from './git-followup-pending'
9
9
 
10
- // **The count of unreleased merges, not the project version** (joshuafolkken/kit#1486). This line
11
- // used to read the local `package.json` and was read as "the version this run just shipped"; children
12
- // no longer bump, so that number names the *previous* release and the reading is false. The count is
10
+ // **The count of unreleased merges, not the project version**. The local `package.json` version
11
+ // reads as "the version this run just shipped", but children do not bump, so that number names the
12
+ // *previous* release and the reading is false. The count is
13
13
  // the one `pnpm josh release` acts on, and it is printed here for the same reason it goes into the
14
14
  // Telegram: a number that keeps climbing is a release nobody has run.
15
15
  //
@@ -45,8 +45,8 @@ async function print_completion(
45
45
  await print_pending_release()
46
46
  }
47
47
 
48
- // A **merged** run ends here, and the round-1 review snapshot's lifetime is one run
49
- // (joshuafolkken/kit#1441). `--no-merge` is not the end of one — the pull request is still open and
48
+ // A **merged** run ends here, and the round-1 review snapshot's lifetime is one run.
49
+ // `--no-merge` is not the end of one — the pull request is still open and
50
50
  // the issue is still the current task, the same line `print_next_issues` and the epic auto-close
51
51
  // already draw — and clearing there would be the unsafe direction: the next round-1 brief would find
52
52
  // no record and write a fresh one against the already-fixed tree, which is the arm-A skip over
@@ -74,8 +74,7 @@ async function clear_review_records(should_merge: boolean): Promise<void> {
74
74
  await clear_review_target(should_merge)
75
75
  }
76
76
 
77
- // joshuafolkken/kit#1091: the working-tree hold a typed entry point claims before it starts is
78
- // released here, on the one seam every `fullrun` — and every child of an `epicrun` or a `queue` —
77
+ // The working-tree hold a typed entry point claims before it starts is released here, on the one seam every `fullrun` — and every child of an `epicrun` or a `queue` —
79
78
  // passes through, so a finished run never leaves the next one locked out. **Gated on `should_merge`
80
79
  // like the epic auto-close and the round-1 snapshot clear**: a `--no-merge` run has not finished, and
81
80
  // its tree is still the one nobody else may start in.
@@ -95,7 +94,7 @@ async function release_worktree_hold(should_merge: boolean): Promise<void> {
95
94
  }
96
95
  }
97
96
 
98
- // joshuafolkken/kit#1821: a `run:progress` watcher outlives the turn that started it and, left alone,
97
+ // A `run:progress` watcher outlives the turn that started it and, left alone,
99
98
  // waits out its whole bound — up to an hour — after the run it was watching has already merged.
100
99
  // Removing its liveness record here, on the same merge seam that releases the working-tree hold, lets
101
100
  // the watcher read the record gone on its next tick and stop at once. **Keyed like the hold, on the
@@ -127,10 +126,9 @@ async function end_progress_watcher(should_merge: boolean): Promise<void> {
127
126
  }
128
127
  }
129
128
 
130
- // **The steps are independent, and one of them failing must not discard the rest**
131
- // (joshuafolkken/kit#1539). They used to be bare statements, so whichever threw first ended the
132
- // process — and the hold release is the last of them, which is how three merged runs left their
133
- // working tree locked. The order is still the contract: `print_completion` ends with the
129
+ // **The steps are independent, and one of them failing must not discard the rest**.
130
+ // As bare statements, whichever threw first would end the process — and the hold release is the
131
+ // last of them, so a merged run would leave its working tree locked. The order is still the contract: `print_completion` ends with the
134
132
  // unreleased-merge count, the final console line.
135
133
  function build_report_steps(
136
134
  issue_number: string | undefined,
@@ -160,7 +158,7 @@ function build_record_steps(should_merge: boolean): ReadonlyArray<CleanupStep> {
160
158
  {
161
159
  label: 'The working-tree hold release',
162
160
  // **The forced spelling, because the run that wrote the record is this one and it is
163
- // ending** (joshuafolkken/kit#1799). A release names the run it belongs to, so a person
161
+ // ending**. A release names the run it belongs to, so a person
164
162
  // finishing this step by hand is releasing a record they did not write — the plain form
165
163
  // would answer `held` and remove nothing, which is a printed recovery that cannot recover.
166
164
  recovery: 'pnpm josh run:release --force',
@@ -1,15 +1,19 @@
1
1
  import { git_command } from '#scripts/git/git-command'
2
2
  import { git_spawn } from '#scripts/git/git-spawn'
3
+ import { issue_cite } from '#scripts/issue/issue-cite'
3
4
  import { observation_ledger } from '#scripts/observations/observation-ledger'
4
5
  import { observation_ledger_prepare } from '#scripts/observations/observation-ledger-prepare'
5
6
  import { observations_flush } from '#scripts/observations/observations-flush'
6
7
 
7
- // The residual commit path for the observation ledger (joshuafolkken/kit#1810). A run's appended lines
8
- // ride its own commit (joshuafolkken/kit#2763), so the ledger is usually clean by now and this
9
- // short-circuits; what it still catches is a line appended after that commit — a second review round's
10
- // record — which would otherwise stay in the working tree after the merge.
8
+ // The residual commit path for the observation ledger. A run's appended lines
9
+ // ride its own commit, so the ledger is usually clean by now and this
10
+ // short-circuits; what it still catches is a line appended after that commit — an observation
11
+ // recorded between the commit and the merge — which would otherwise stay in the working tree after
12
+ // the merge. **A passing second review round is not one of them**: it used to
13
+ // be the usual case, and its push restarted the pull request's CI on six lanes of fourteen in a day,
14
+ // so `review:record --comment` now records that round on the issue and leaves the tree clean.
11
15
  //
12
- // **It commits onto the pull request's own branch, before the merge** (joshuafolkken/kit#2919). It used
16
+ // **It commits onto the pull request's own branch, before the merge**. It used
13
17
  // to flush after the merge from the default branch, which a lane cannot reach, so a lane's lines
14
18
  // waited in the primary checkout for a batch-end flush and were lost there to another run's stash.
15
19
  // Committed to the branch instead, the lines merge with the pull request — in a lane as anywhere — and
@@ -20,10 +24,10 @@ const COMMIT_MESSAGE_PREFIX = 'Record observation ledger entries'
20
24
  function commit_message(issue_number: string | undefined): string {
21
25
  return issue_number === undefined
22
26
  ? COMMIT_MESSAGE_PREFIX
23
- : `${COMMIT_MESSAGE_PREFIX} #${issue_number}`
27
+ : `${COMMIT_MESSAGE_PREFIX} ${issue_cite.plain(issue_number)}`
24
28
  }
25
29
 
26
- // **A broken line refuses the merge rather than riding it** (joshuafolkken/kit#2123): the branch's
30
+ // **A broken line refuses the merge rather than riding it**: the branch's
27
31
  // ledger file goes away with the lane, so a line left behind here is a line lost.
28
32
  async function assert_grammar(): Promise<void> {
29
33
  const broken = await observation_ledger_prepare.prepare(await git_command.repository_root())