@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
@@ -1,3 +1,4 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
1
2
  import {
2
3
  epic_audit_logic,
3
4
  type AuditFinding,
@@ -8,19 +9,18 @@ import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
8
9
  import { epic_nested } from './epic-nested'
9
10
 
10
11
  // The five cross-child checks. Each takes the children and returns findings — four of them reading
11
- // the bodies, and the fifth (joshuafolkken/kit#1476) reading a child's labels instead.
12
+ // the bodies, and the fifth reading a child's labels instead.
12
13
  //
13
14
  // Warnings and errors are kept apart deliberately. An error is a contradiction that will stall the
14
15
  // implementation whatever anyone decides — an acceptance criterion that needs something built later.
15
16
  // A warning is a thing a reader has to look at: a child mentioning another child may be a real
16
17
  // missing dependency or a perfectly good design note about what comes next, and the machine cannot
17
18
  // tell. Making that an error would make legitimate notes unwritable, so the machine's job is to
18
- // stop the omission going unnoticed, not to decide (joshuafolkken/kit#870).
19
+ // stop the omission going unnoticed, not to decide.
19
20
  //
20
21
  // Every reference these checks read carries the repository it lives in, and every match is on
21
22
  // repository and number both. A number alone names a different issue in every repository, so a
22
- // cross-repository child citing `#40` was checked against *this* repository's issue 40
23
- // (joshuafolkken/kit#1014).
23
+ // cross-repository child citing `#40` would be checked against *this* repository's issue 40.
24
24
 
25
25
  const IMPLICIT_DEPENDENCY = 'implicit dependency'
26
26
  const ORDER_CONTRADICTION = 'order contradiction'
@@ -61,14 +61,9 @@ function find_sibling(
61
61
 
62
62
  // Whether anything orders these two, in either direction.
63
63
  //
64
- // A pair in two different repositories used to be treated as ordered, unconditionally. That was not a
65
- // statement about the pair but about what could be recorded: `blocked_by` was read as bare numbers,
66
- // so a cross-repository order could not be written onto the graph at all, and reporting one as a
67
- // contradiction would have failed the audit with no edit to either issue that could ever clear it.
68
- // joshuafolkken/kit#1126 made such an order recordable and readable, so the premise stopped holding
69
- // and joshuafolkken/kit#1128 removed the exemption: every pair is asked the same question now, and
70
- // `depends_on` walks a cross-repository chain by identity exactly as it walks a local one. What keeps
71
- // that from failing epics written before the capability existed is the finding's *level* rather than
64
+ // Every pair is asked the same question, a cross-repository pair included: `depends_on` walks a
65
+ // cross-repository chain by identity exactly as it walks a local one. What keeps that from failing
66
+ // epics written before a cross-repository order was recordable is the finding's *level* rather than
72
67
  // a blind spot — see `order_level`.
73
68
  function is_ordered(
74
69
  index: ReadonlyMap<string, EpicChild>,
@@ -131,9 +126,8 @@ function reported_pairs(
131
126
  // Check 1 — a child talks about another child, and neither declares a dependency on the other.
132
127
  //
133
128
  // A declared dependency in *either* direction is enough: `#864 depends on #863` makes `#863`'s note
134
- // about `#864` an ordinary forward reference. What this catches is the shape found in
135
- // joshuafolkken/kit#858 — two children each citing the other's deliverable, with `blocked_by` empty
136
- // on both and the epic declaring them independent.
129
+ // about `#864` an ordinary forward reference. What this catches is two children each citing the
130
+ // other's deliverable, with `blocked_by` empty on both and the epic declaring them independent.
137
131
  function find_implicit_dependencies(
138
132
  children: ReadonlyArray<AuditChild>,
139
133
  current_repo: string,
@@ -157,28 +151,24 @@ function find_implicit_dependencies(
157
151
 
158
152
  // Check 2 — a child's acceptance criteria name another child, with no dependency in either
159
153
  // direction. The criteria are where a child states what it must deliver, so a name there with
160
- // nothing ordering the two is the contradiction found by hand in joshuafolkken/kit#858: the criteria
161
- // required deliverables of children the graph let it run before.
154
+ // nothing ordering the two is a contradiction: the criteria require deliverables of children the
155
+ // graph lets it run before.
162
156
  //
163
157
  // A declared dependency the *other* way is suppressed, and that suppression is what keeps the check
164
158
  // honest. `#860`'s criteria say `#864` will extend a hook it provides, and `#864` is declared to
165
- // depend on `#860` — a forward reference, and satisfiable exactly as written. Verified against the
166
- // real epic: without this, four of the run's five errors were forward references of that shape.
159
+ // depend on `#860` — a forward reference, and satisfiable exactly as written.
167
160
  //
168
161
  // The level depends on whether the pair can still run out of order. What makes an undeclared order a
169
162
  // contradiction is that the criteria's child *can run first*, and **either end closing is enough to
170
163
  // make that sentence false**: a closed naming child has already run, and a closed named child has
171
164
  // already delivered what the criteria ask for, so nothing is left to run before it. An epic that ever
172
165
  // forgot to declare an order would otherwise fail its audit forever — which stops every future
173
- // `epicrun` on it at the first step, for something that can no longer stall anything. Confirmed on the
174
- // real epic: `epic:next` handed back a runnable child while the audit was red.
166
+ // `epicrun` on it at the first step, for something that can no longer stall anything.
175
167
  //
176
- // **The condition used to be both ends closed**, and that was stricter than the sentence it encodes
177
- // (joshuafolkken/kit#1597). It bit on the ordinary way an epic's children cite each other — a closed
178
- // child's criteria naming an open sibling **as evidence** — and there is no way out of it once the
179
- // naming child has closed: the alternatives are editing a closed body to remove the numbers or
180
- // declaring an order nobody decided, and both destroy the record. joshuafolkken/kit#1262 sat red on
181
- // exactly that shape while nothing in it could run out of order.
168
+ // **One closed end is enough, not both.** Requiring both would bite on the ordinary way an epic's
169
+ // children cite each other — a closed child's criteria naming an open sibling **as evidence** — and
170
+ // there is no way out of it once the naming child has closed: the alternatives are editing a closed
171
+ // body to remove the numbers or declaring an order nobody decided, and both destroy the record.
182
172
  //
183
173
  // **Demoted rather than dropped**, and the choice is not cosmetic. Dropping the finding does not
184
174
  // shorten the report: the acceptance criteria are part of the body, so the same pair falls straight
@@ -232,16 +222,16 @@ function order_message(
232
222
  // **Either child closed**: the pair can no longer run out of order, so the finding cannot describe
233
223
  // anything that will happen.
234
224
  //
235
- // **A pair in two repositories** (joshuafolkken/kit#1128): that order only became recordable with
236
- // joshuafolkken/kit#1126, so an error would fail the audit `epicrun` runs before its first child and
237
- // stop every epic written before it — joshuafolkken/kit#1010 is what that looks like.
225
+ // **A pair in two repositories**: epics written before a cross-repository order was recordable
226
+ // carry such pairs, so an error would fail the audit `epicrun` runs before its first child and stop
227
+ // every one of them.
238
228
  //
239
229
  // **Be clear about what the warning does and does not buy.** It does *not* make the run safe: the
240
230
  // finding fires precisely when nothing orders the pair, so there is no relation for `epic:next` to
241
- // read and the child is offered as runnable — it can start before the work it cites. What changed is
242
- // that this was previously *silent*, and is now said out loud. Making it safe means stopping, and
243
- // stopping is what the recorded decision declined for epics that predate the capability. Clearing one
244
- // means recording the relation; `josh epic --add` cannot write it yet (joshuafolkken/kit#1138), so
231
+ // read and the child is offered as runnable — it can start before the work it cites. It makes the gap
232
+ // said out loud rather than silent. Making it safe means stopping, and stopping is what the recorded
233
+ // decision declined for epics that predate the capability. Clearing one
234
+ // means recording the relation; `josh epic --add` cannot write it yet, so
245
235
  // until then it is the `dependencies/blocked_by` endpoint by hand.
246
236
  function order_level(child: AuditChild, other: AuditChild, is_settled: boolean): FindingLevel {
247
237
  if (is_settled) return 'warning'
@@ -349,11 +339,11 @@ function find_orphans(
349
339
  .map((issue_number) => ({
350
340
  level: 'warning' as const,
351
341
  check: ORPHAN_CHILD,
352
- message: `#${String(issue_number)} names this epic as its parent but is not in its task list.`,
342
+ message: `${issue_cite.plain(issue_number)} names this epic as its parent but is not in its task list.`,
353
343
  }))
354
344
  }
355
345
 
356
- // Check 5 — a task-list row pointing at another epic (joshuafolkken/kit#1476). What the question is,
346
+ // Check 5 — a task-list row pointing at another epic. What the question is,
357
347
  // and what it deliberately is not, is `epic-nested.ts`; this half is what the audit does with the
358
348
  // answer.
359
349
  //
@@ -392,7 +382,7 @@ function find_nested_epics(
392
382
 
393
383
  // Check 6 — the epic itself is closed while children it tracks are still open. Unlike the five
394
384
  // checks above, this one reads the *root's* state against its children rather than the children
395
- // against each other (joshuafolkken/kit#2337).
385
+ // against each other.
396
386
  //
397
387
  // **An error, not a warning.** A closed epic never surfaces its children in the backlog — the epic
398
388
  // opt-in only fires while the epic is open — so an open child of a closed epic is stranded: it is
@@ -2,6 +2,8 @@
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { git_gh_command } from '#scripts/gh/git-gh-command'
4
4
  import { issue_read } from '#scripts/issue/issue-read'
5
+ import { session_cite } from '#scripts/issue/session-cite'
6
+ import { issue_citation } from '#scripts/rules/issue-citation'
5
7
  import { epic_audit_logic, type AuditFinding, type ReferenceState } from './epic-audit'
6
8
  import { epic_audit_checks, type AuditChild } from './epic-audit-checks'
7
9
  import { epic_audit_orphans, type ClaimingSearch } from './epic-audit-orphans'
@@ -16,15 +18,14 @@ import { epic_next } from './epic-next'
16
18
  import { epic_parse, type DependencyLink } from './epic-parse'
17
19
 
18
20
  // `josh epic:audit <E>` — read an epic's children against each other and report what contradicts
19
- // what (joshuafolkken/kit#870).
21
+ // what.
20
22
 
21
23
  const FAILURE_EXIT_CODE = 1
22
24
  const ARGV_OFFSET = 2
23
25
  const USAGE = 'Usage: josh epic:audit <epic-number>'
24
26
  // Check 3 filters the issues the children cite down to this owner's repositories, so a repository
25
27
  // name it could not read silently dropped every qualified reference and reported nothing. A check
26
- // that disables itself without saying so is worse than one that fails: the report reads clean
27
- // (joshuafolkken/kit#1016).
28
+ // that disables itself without saying so is worse than one that fails: the report reads clean.
28
29
  const UNREADABLE_REPO =
29
30
  'Could not read this repository as `owner/name`, so a reference could not be resolved against it — check `gh auth status` and that this checkout has a GitHub remote.'
30
31
 
@@ -35,7 +36,7 @@ const UNREADABLE_REPO =
35
36
  // The scope comes from `epic_fetch.scope_for`, the same convention the state and relation reads
36
37
  // follow, rather than a second spelling here. Without it a cross-repository child's body was read
37
38
  // from *this* repository's issue of that number, and all four body-reading checks then ran against
38
- // the wrong text (joshuafolkken/kit#1012).
39
+ // the wrong text.
39
40
  async function attach_bodies(
40
41
  children: ReadonlyArray<AuditChild>,
41
42
  repo: string,
@@ -59,7 +60,7 @@ async function attach_bodies(
59
60
  // Each one is asked of the repository whose body named it, through the same `epic_fetch.scope_for`
60
61
  // every other read goes through, and the answers are keyed by that repository and number both. Asked
61
62
  // unqualified, a cross-repository child's `#40` was answered by *this* repository's issue 40 — a
62
- // different issue, whose state then decided the warning (joshuafolkken/kit#1014).
63
+ // different issue, whose state then decided the warning.
63
64
  async function resolve_reference_states(
64
65
  referenced: ReadonlyArray<IssueReference>,
65
66
  current_repo: string,
@@ -85,8 +86,8 @@ async function resolve_reference_states(
85
86
 
86
87
  // The issues the children cite that are not children themselves — the ones check 3 resolves.
87
88
  //
88
- // A reference in a repository this owner does not own is left out rather than probed, inheriting
89
- // joshuafolkken/kit#869's restriction exactly as `fetch_external_children` does: a body mentioning a
89
+ // A reference in a repository this owner does not own is left out rather than probed, exactly as
90
+ // `fetch_external_children` does: a body mentioning a
90
91
  // third party's issue must not send this command to their tracker.
91
92
  function outside_references(
92
93
  children: ReadonlyArray<AuditChild>,
@@ -110,14 +111,14 @@ interface AuditInput {
110
111
  epic_number: number
111
112
  // The `owner/repo` the command runs in. A reference is written bare when it names an issue here
112
113
  // and `owner/repo#N` when it does not, so the reader is never handed a number that resolves
113
- // somewhere else (joshuafolkken/kit#1014).
114
+ // somewhere else.
114
115
  repo: string
115
116
  children: ReadonlyArray<AuditChild>
116
117
  tracked: ReadonlyArray<number>
117
118
  reference_states: ReadonlyMap<string, ReferenceState>
118
119
  // The orphan search's whole outcome, not just what it found: a listing that failed and a listing
119
120
  // the page ceiling cut short are both reported, because `[]` here is indistinguishable from
120
- // "nothing claims this epic" (joshuafolkken/kit#1033).
121
+ // "nothing claims this epic".
121
122
  claiming: ClaimingSearch
122
123
  anomalies: ReadonlyArray<AuditFinding>
123
124
  // Computed before the implicit-dependency check so that check can skip the pairs already reported
@@ -125,15 +126,14 @@ interface AuditInput {
125
126
  // arrive twice.
126
127
  contradictions: ReadonlyArray<AuditFinding>
127
128
  // The declared orders check 6 may speak about, already resolved to children and narrowed to the
128
- // open, local pairs (joshuafolkken/kit#1712).
129
+ // open, local pairs.
129
130
  order_pairs: ReadonlyArray<OrderPair>
130
131
  // The epic's `## Decisions` section, and the comments on those pairs' ends — the two places a
131
132
  // placement decision is recorded, and therefore the whole of what check 6 reads.
132
133
  decisions: string
133
134
  order_comments: ReadonlyMap<string, ReadonlyArray<string>>
134
135
  // Whether the epic's own state is confirmed closed. An unreadable state is `false`, so the
135
- // closed-epic-with-open-children check never fires on a lookup that did not answer
136
- // (joshuafolkken/kit#2337).
136
+ // closed-epic-with-open-children check never fires on a lookup that did not answer.
137
137
  is_epic_closed: boolean
138
138
  }
139
139
 
@@ -186,7 +186,7 @@ function audit(input: AuditInput): AuditResult {
186
186
  ])
187
187
  }
188
188
 
189
- // The graph anomalies, taken from joshuafolkken/kit#860's detection rather than re-derived here —
189
+ // The graph anomalies, taken from the graph's own detection rather than re-derived here —
190
190
  // including its rule for whether the body declares an order at all, which is imported rather than
191
191
  // restated for exactly the drift this comment warns about.
192
192
  function graph_anomalies(
@@ -242,18 +242,18 @@ async function read_order_comments(
242
242
  )
243
243
  }
244
244
 
245
- // Why a snapshot yields nothing to audit, with the two reasons told apart (joshuafolkken/kit#1690).
245
+ // Why a snapshot yields nothing to audit, with the two reasons told apart.
246
246
  // A body nobody could read parses to zero children exactly as an unpopulated task list does, so
247
247
  // without this the audit reported an epic it never read as one tracking no children — and sent the
248
248
  // reader to fill in a task list that is already there.
249
249
  function no_children_reason(snapshot: EpicSnapshot, epic_number: number): string | undefined {
250
+ const epic = session_cite.issue(epic_number, undefined, snapshot.repo)
251
+
250
252
  if (snapshot.body_failure !== undefined) {
251
- return `Could not read the body of #${String(epic_number)}. Its task list is what names the children — check \`gh auth status\` and the connection.`
253
+ return `Could not read the body of ${epic}. Its task list is what names the children — check \`gh auth status\` and the connection.`
252
254
  }
253
255
 
254
- if (snapshot.child_numbers.length === 0) {
255
- return `#${String(epic_number)} tracks no children in a task list.`
256
- }
256
+ if (snapshot.child_numbers.length === 0) return `${epic} tracks no children in a task list.`
257
257
 
258
258
  return undefined
259
259
  }
@@ -261,8 +261,7 @@ function no_children_reason(snapshot: EpicSnapshot, epic_number: number): string
261
261
  // Whether the epic's own state is confirmed closed. Read through the same `scope_for` every other
262
262
  // read goes through, so a cross-repository epic is asked of its own repository rather than this one.
263
263
  // A read that came back shaped wrong, or a state that is not `CLOSED`, both answer `false`: the
264
- // finding it feeds is an error, and one must never be manufactured from a lookup that did not answer
265
- // (joshuafolkken/kit#2337).
264
+ // finding it feeds is an error, and one must never be manufactured from a lookup that did not answer.
266
265
  async function read_epic_closed(epic_number: number, scope?: string): Promise<boolean> {
267
266
  const raw = await git_gh_command.issue_get_state_and_relations(String(epic_number), scope)
268
267
  const parsed = epic_issue.parse_epic_issue(raw)
@@ -322,7 +321,7 @@ async function report_audit(epic_number: number, repo: string): Promise<number>
322
321
  if (input === undefined) return FAILURE_EXIT_CODE
323
322
  const result = audit(input)
324
323
 
325
- console.info(epic_audit_report.format_report(result))
324
+ console.info(issue_citation.linkify(epic_audit_report.format_report(result), repo))
326
325
 
327
326
  return result.exit_code
328
327
  }
@@ -350,7 +349,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
350
349
  // `process.exitCode` rather than `process.exit()`: the answer goes to standard output and a write to
351
350
  // a pipe is asynchronous on macOS, so exiting can tear the process down before it drains. This
352
351
  // command's answer is what a workflow reads and acts on, which is exactly that pipe. The same shape
353
- // is in `scripts/cost-runtime/cost-cli.ts`, which met the truncation first (joshuafolkken/kit#1005).
352
+ // is in `scripts/cost-runtime/cost-cli.ts`, which met the truncation first.
354
353
  async function main(argv: ReadonlyArray<string>): Promise<void> {
355
354
  process.exitCode = await run(argv)
356
355
  }
@@ -1,6 +1,7 @@
1
1
  import { git_gh_command } from '#scripts/gh/git-gh-command'
2
2
  import { cutoff_of, PAGE_CEILING_CAUSE, type ScanCutoff } from '#scripts/git/listing-cutoff'
3
3
  import { parse_json_array_safe } from '#scripts/git/parse-json-array'
4
+ import { issue_cite } from '#scripts/issue/issue-cite'
4
5
  import { z } from 'zod'
5
6
  import { epic_audit_logic, type AuditFinding, type FindingLevel } from './epic-audit'
6
7
  import type { EpicSnapshot } from './epic-fetch'
@@ -10,8 +11,7 @@ import { epic_parse } from './epic-parse'
10
11
  // task list does not track. It would never be run, and the epic would close without it.
11
12
  //
12
13
  // Split from the command because it shares nothing with the rest of it — the other three checks read
13
- // the children the epic already names, while this one searches for issues the epic does *not* name
14
- // (joshuafolkken/kit#1016).
14
+ // the children the epic already names, while this one searches for issues the epic does *not* name.
15
15
 
16
16
  const SEARCH_LIMIT = 50
17
17
  const PARENT_MARKERS: ReadonlyArray<string> = ['親:', 'Parent:', '親:']
@@ -36,10 +36,10 @@ function has_parent_marker(line: string): boolean {
36
36
  // every such issue as an orphan.
37
37
  //
38
38
  // The number is read through the same reference parse the checks use, so a parent line (a PARENT_MARKERS
39
- // prefix) such as `owner/other#858` names that repository's epic and not this one's (joshuafolkken/kit#1014).
39
+ // prefix) such as `owner/other#858` names that repository's epic and not this one's.
40
40
  // The known set is this repository alone — a parent line names this epic or it names nothing here —
41
41
  // and it is passed rather than omitted so a repository whose own name contains a dot still recognizes
42
- // `joshuafolkken/site.com#858` (joshuafolkken/kit#1016).
42
+ // `joshuafolkken/site.com#858`.
43
43
  function names_this_epic(line: string, epic_number: number, repo: string): boolean {
44
44
  return epic_audit_logic
45
45
  .parse_issue_references(line, repo, epic_audit_logic.known_repos([], repo))
@@ -54,12 +54,12 @@ function claims_parent(body: string | null, epic_number: number, repo: string):
54
54
 
55
55
  // Why the scan stopped before the end of the open backlog, or that it did not. Both cutoffs hide the
56
56
  // same thing — an older issue naming this epic — and they are told apart only so the report can say
57
- // which one to raise (joshuafolkken/kit#1033).
57
+ // which one to raise.
58
58
  //
59
- // The vocabulary is `listing-cutoff.ts`'s since joshuafolkken/kit#1067, because every caller of the
60
- // listing now asks this question and a second definition of "I saw everything" is the clone
61
- // `CLAUDE.md` prohibits. `page_ceiling` is the paging's; `row_limit` here means `SEARCH_LIMIT` body
62
- // mentions of `#<epic>` came back and the scan stopped there.
59
+ // The vocabulary is `listing-cutoff.ts`'s, because every caller of the listing asks this question
60
+ // and a second definition of "I saw everything" is the clone `CLAUDE.md` prohibits. `page_ceiling`
61
+ // is the paging's; `row_limit` here means `SEARCH_LIMIT` body mentions of `#<epic>` came back and
62
+ // the scan stopped there.
63
63
 
64
64
  // What the search found, and what it could not cover. The `read` / `unreadable` vocabulary is
65
65
  // `git-gh-issue-read.ts`'s, and the union rather than a flag beside the numbers is deliberate: a
@@ -70,14 +70,13 @@ type ClaimingSearch =
70
70
  // Open issues naming this epic as their parent. Searched rather than derived, because an orphan is
71
71
  // by definition absent from the one list that would otherwise name it.
72
72
  //
73
- // A failed search used to yield `[]` on the reasoning that an unavailable search is no evidence of
74
- // an orphan. That is true of the *finding* and false of the *report*: `[]` is what "no issue claims
75
- // this epic" looks like, so a rate limit arrived as a clean audit — the same "could not read" read
76
- // as "there is nothing" that joshuafolkken/kit#925, #950, #973 and #1048 closed elsewhere. The
77
- // answer is now carried out and reported instead (joshuafolkken/kit#1033).
73
+ // A failed search is not answered with `[]`, even though an unavailable search is no evidence of an
74
+ // orphan. That is true of the *finding* and false of the *report*: `[]` is what "no issue claims
75
+ // this epic" looks like, so a rate limit would arrive as a clean audit — a "could not read" read as
76
+ // "there is nothing". The answer is carried out and reported instead.
78
77
  async function find_claiming_issues(epic_number: number, repo: string): Promise<ClaimingSearch> {
79
78
  const { json, is_capped } = await git_gh_command.issue_search_body(
80
- `#${String(epic_number)}`,
79
+ issue_cite.plain(epic_number),
81
80
  SEARCH_LIMIT,
82
81
  )
83
82
  if (json === undefined) return { kind: 'unreadable' }
@@ -103,7 +102,7 @@ function search_finding(level: FindingLevel, message: string): Array<AuditFindin
103
102
  //
104
103
  // Either cutoff is a **warning**: the scan *did* run, over the newest issues, and an orphan is
105
104
  // normally an issue filed minutes ago. That is something to read rather than a check that did not
106
- // happen — the level `epic:bundle` reports its own `⚠ … cap` at (joshuafolkken/kit#950).
105
+ // happen — the level `epic:bundle` reports its own `⚠ … cap` at.
107
106
  function search_findings(search: ClaimingSearch): Array<AuditFinding> {
108
107
  if (search.kind === 'unreadable') return search_finding('error', UNREADABLE_SEARCH)
109
108
  if (search.cutoff === 'page_ceiling') return search_finding('warning', CAPPED_BY_ISSUES)
@@ -122,7 +121,7 @@ function claimed_numbers(search: ClaimingSearch): Array<number> {
122
121
  // The task-list numbers that name issues in *this* repository. `snapshot.child_numbers` appends the
123
122
  // cross-repository children's numbers, and an orphan is recognized by number alone — so a local
124
123
  // issue whose number collided with a child in another repository was accepted as tracked and never
125
- // reported (joshuafolkken/kit#1014). Read with the same parser `epic_fetch` reads the local rows
124
+ // reported. Read with the same parser `epic_fetch` reads the local rows
126
125
  // with, which never matches a `- [ ] owner/repo#N` row.
127
126
  function locally_tracked(snapshot: EpicSnapshot): Array<number> {
128
127
  return epic_parse.parse_task_list_issue_numbers(snapshot.body)
@@ -3,16 +3,13 @@ import type { AuditChild } from './epic-audit-checks'
3
3
  import { epic_graph, type IssueReference } from './epic-graph'
4
4
  import type { DependencyLink } from './epic-parse'
5
5
 
6
- // Check 6 — a declared order between two open children that nobody wrote a reason for
7
- // (joshuafolkken/kit#1712).
6
+ // Check 6 — a declared order between two open children that nobody wrote a reason for.
8
7
  //
9
8
  // **Every other check looks the other way.** They report a dependency the epic *omitted* — prose or
10
9
  // acceptance criteria naming a sibling with nothing ordering the two. Not one of them reads the
11
- // declaration itself, so a chain somebody typed by hand passed the audit exactly as a justified one
12
- // did: on 2026-09-10 the chain `#1690 -> #1694 -> #1703 -> #1679 -> #1675 -> #1676` serialized five
13
- // otherwise independent children through `epicrun`, and the audit reported **0 errors** both while
14
- // it stood and after it was deleted. It was found because a person asked why the backlog had gone
15
- // single-file, which is not a mechanism.
10
+ // declaration itself, so without this check a chain somebody typed by hand passes the audit exactly
11
+ // as a justified one does — serializing otherwise independent children through `backlogrun #E`
12
+ // with **0 errors** reported.
16
13
  //
17
14
  // **Where a reason lives is already settled**, so this check does not invent a place to look:
18
15
  // `josh epic --add --decision-file` writes the record to the epic's `## Decisions` **and** as a
@@ -51,7 +48,7 @@ function find_child(
51
48
  // finding would be wrong about rather than merely noisy:
52
49
  //
53
50
  // **Both ends open.** A settled order can no longer stall anything, which is the same reason
54
- // `order_level` demotes a settled contradiction — and joshuafolkken/kit#1712 asks for it by name.
51
+ // `order_level` demotes a settled contradiction.
55
52
  // **Both ends in the repository the audit runs in.** The comment listing reads that repository and
56
53
  // takes no `--repo` (`git-gh-issue-read.ts`), so a cross-repository end's record cannot be read at
57
54
  // all and every such order would be reported as unjustified whatever its author wrote.
@@ -136,20 +133,18 @@ function is_justified(input: RationaleInput, pair: OrderPair): boolean {
136
133
  )
137
134
  }
138
135
 
139
- // **An error rather than a warning**, and the choice is the one joshuafolkken/kit#1712 asks to be
140
- // recorded.
136
+ // **An error rather than a warning.**
141
137
  //
142
- // A warning would not be read: one real epic carries 447 of them, and the whole reason this check
138
+ // A warning would not be read: a real epic can carry hundreds of them, and the whole reason this check
143
139
  // exists is that a false order was invisible. The counter-argument is `order_level`'s doctrine —
144
140
  // where the machine cannot tell whether something is wrong, it warns — and it does not reach this
145
141
  // check, because what is asserted here is not "this order is wrong". It is "this order's reason is
146
142
  // not recorded", which is a fact about the repository's own rule that a placement decision is
147
143
  // written down, not a judgement about the order.
148
144
  //
149
- // What makes the level affordable is that both remedies are now one command: `josh epic --remove`
150
- // deletes the order, and `--decision-file` on either command records the reason. Before
151
- // joshuafolkken/kit#1712 the first of those did not exist, and an error would have sent the reader
152
- // to the hand edit `CLAUDE.md` forbids.
145
+ // What makes the level affordable is that both remedies are one command: `josh epic --remove`
146
+ // deletes the order, and `--decision-file` on either command records the reason, so an error never
147
+ // sends the reader to the hand edit `CLAUDE.md` forbids.
153
148
  function unjustified_message(pair: OrderPair, current_repo: string): string {
154
149
  const blocker = epic_graph.format_reference(pair.blocker, current_repo)
155
150
  const blocked = epic_graph.format_reference(pair.blocked, current_repo)
@@ -5,8 +5,7 @@ import { epic_graph, type GraphAnomaly, type IssueReference } from './epic-graph
5
5
  //
6
6
  // Only errors decide the exit code. A warning is something a reader has to look at, not something a
7
7
  // gate may fail on: check 1 fires on a legitimate forward reference as readily as on a real missing
8
- // dependency, and a gate that failed on both would make design notes unwritable
9
- // (joshuafolkken/kit#870).
8
+ // dependency, and a gate that failed on both would make design notes unwritable.
10
9
 
11
10
  const SUCCESS_EXIT_CODE = 0
12
11
  const FAILURE_EXIT_CODE = 1
@@ -34,9 +33,7 @@ function anomaly_findings(anomalies: ReadonlyArray<GraphAnomaly>): Array<AuditFi
34
33
  // command that acts on it.
35
34
  //
36
35
  // Each one is written with the repository it lives in. `- [ ] sveltejs/kit#7`, refused by the owner
37
- // restriction, was reported as `Could not read #7` and sent the reader to this repository's issue 7
38
- // — the one message joshuafolkken/kit#1014 left resolving against the wrong repository
39
- // (joshuafolkken/kit#1016).
36
+ // restriction, reported as `Could not read #7` would send the reader to this repository's issue 7.
40
37
  function unreadable_findings(
41
38
  missing: ReadonlyArray<IssueReference>,
42
39
  current_repo: string,
@@ -1,11 +1,11 @@
1
1
  import { markdown_section } from '#scripts/issue/markdown-section'
2
+ import { issue_citation } from '#scripts/rules/issue-citation'
2
3
  import { epic_graph, type EpicChild, type IssueReference } from './epic-graph'
3
4
 
4
5
  // Reading an epic's children against each other.
5
6
  //
6
- // `epic:check` verifies one epic's *format*; nothing verified that the children agree. A hand audit
7
- // of joshuafolkken/kit#858 found two contradictions that would have stalled the implementation, and
8
- // `epic:check` reported all four of its requirements as passing throughout (joshuafolkken/kit#870).
7
+ // `epic:check` verifies one epic's *format*, not that the children agree: an epic can pass every
8
+ // format requirement while carrying contradictions that would stall the implementation.
9
9
  //
10
10
  // The graph's own properties — a cycle, and a body that declares one order while the relations
11
11
  // record another — are already detected by `epic:next` for its own purposes. This module is a
@@ -21,11 +21,11 @@ const REFERENCE_PATTERN = /#(\d+)\b/gu
21
21
  // What may appear in the `owner/repo` written in front of a `#`: exactly the set the previous
22
22
  // lookbehind refused a bare reference after, plus the `.` a repository name may legitimately contain.
23
23
  //
24
- // The dot is where this parse and the task-list parse used to disagree. `epic_parse`'s
24
+ // The dot is where this parse and the task-list parse could disagree. `epic_parse`'s
25
25
  // `EXTERNAL_REFERENCE_SOURCE` allows one, so `- [ ] owner/site.com#40` is tracked as a genuine
26
- // cross-repository child; this one excluded it, so a sibling quoting `owner/site.com#40` was read
27
- // back as `com` — no repository — and every check skipped it in silence. A child that can be tracked
28
- // but never cited is the gap joshuafolkken/kit#1016 closes.
26
+ // cross-repository child; excluded here, a sibling quoting `owner/site.com#40` would read back as
27
+ // `com` — no repository — and every check would skip it in silence: a child that can be tracked but
28
+ // never cited.
29
29
  //
30
30
  // Nothing in the syntax separates `owner/site.com` from a path written in prose: `prompts/review.md`
31
31
  // has the same shape, and reading it as a repository is the misread the exclusion was there to
@@ -81,8 +81,7 @@ function is_repo_shape(parts: ReadonlyArray<string>): boolean {
81
81
  // repositories this epic actually spans. `owner/site.com#40` is read when the epic tracks a child
82
82
  // there, and `prompts/review.md#5` is not read at all, because no epic tracks a repository by that
83
83
  // name. That makes the set of children that can be *tracked* and the set that can be *cited* the same
84
- // set, which is what joshuafolkken/kit#1016 asked for, without admitting the path misread that
85
- // widening the pattern outright would have brought back.
84
+ // set, without admitting the path misread that widening the pattern outright would bring back.
86
85
  function reference_repo(
87
86
  prefix: string,
88
87
  repo: string,
@@ -127,8 +126,7 @@ function unique_references(references: ReadonlyArray<IssueReference>): Array<Iss
127
126
  // `owner/name` whose body this is: an unqualified `#N` there names that repository's issue N.
128
127
  //
129
128
  // `known` names the repositories the epic in hand spans, and only a dotted name consults it —
130
- // see `reference_repo`. A caller with no epic in view passes nothing and gets the dotless reading,
131
- // which is what every caller got before joshuafolkken/kit#1016.
129
+ // see `reference_repo`. A caller with no epic in view passes nothing and gets the dotless reading.
132
130
  function parse_issue_references(
133
131
  text: string,
134
132
  repo: string,
@@ -148,7 +146,7 @@ function parse_issue_references(
148
146
  // The repositories an epic actually spans, which is what settles a dotted name written in prose:
149
147
  // `owner/site.com#40` is a reference when a child lives there and a path otherwise. Built from the
150
148
  // children rather than supplied, so a caller cannot hand the parse a set that disagrees with the
151
- // epic being read (joshuafolkken/kit#1016).
149
+ // epic being read.
152
150
  function known_repos(
153
151
  children: ReadonlyArray<IssueReference>,
154
152
  current_repo: string,
@@ -159,8 +157,14 @@ function known_repos(
159
157
  // The issue numbers a piece of prose refers to *in its own repository*. Kept as the narrower reading
160
158
  // of the same parse rather than a second one: `epic:bundle` compares two issues' references by
161
159
  // number and has no cross-repository notion to compare with.
160
+ //
161
+ // **Only the body's own prose is read**: a number inside a fenced block or on
162
+ // a quote line is pasted material — command output in a reproduction, a quoted comment — not the
163
+ // author naming that issue. Counting it bundled a draft into an unrelated epic because a `lane:list`
164
+ // output in its fence happened to list one of that epic's children. The exclusion is the stop guard's
165
+ // citation reading (`issue_citation.prose_lines`), shared rather than restated.
162
166
  function parse_references(text: string, repo = ''): Array<number> {
163
- return parse_issue_references(text, repo)
167
+ return parse_issue_references(issue_citation.prose_lines(text).join('\n'), repo)
164
168
  .filter((reference) => reference.repo === repo)
165
169
  .map((reference) => reference.number)
166
170
  }
@@ -201,7 +205,7 @@ function collect_blockers(
201
205
  }
202
206
 
203
207
  // Both ends are named by identity — repository plus number — because an epic can track two children
204
- // whose numbers collide across repositories (joshuafolkken/kit#864).
208
+ // whose numbers collide across repositories.
205
209
  function depends_on(
206
210
  index: ReadonlyMap<string, EpicChild>,
207
211
  node: EpicChild,
@@ -1,3 +1,4 @@
1
+ import { issue_cite } from '#scripts/issue/issue-cite'
1
2
  import { UNORDERED_DEPENDENCIES } from './epic-parse'
2
3
  import { DEPENDENCY_ARROW, to_issue_reference } from './epic-reference'
3
4
 
@@ -10,7 +11,7 @@ const RATIONALE_PLACEHOLDER = '<why the work was split this way>'
10
11
  // Where a creation records its reasoning, including the reasoning for the order `--ordered` declares.
11
12
  // Exported because `epic:audit`'s unjustified-order check reads it as one of the places a declared
12
13
  // order's reason may live, and a second spelling of the heading is one that comes to disagree with
13
- // the writer (joshuafolkken/kit#1712).
14
+ // the writer.
14
15
  const SPLIT_RATIONALE_HEADING = '## Split rationale'
15
16
  // One child declares no order, so there is nothing for the record below to name.
16
17
  const CHAIN_MINIMUM_LENGTH = 2
@@ -38,7 +39,7 @@ function format_dependencies(children: ReadonlyArray<number>, is_ordered: boolea
38
39
  }
39
40
 
40
41
  // The command that runs the batch. `backlogrun #E --only` takes the epic itself rather than a list of
41
- // children (joshuafolkken/kit#861, joshuafolkken/kit#1985): it re-reads the state from GitHub each
42
+ // children: it re-reads the state from GitHub each
42
43
  // round, so an interrupted run resumes without anyone retyping the remaining numbers, and a child that
43
44
  // needs a decision is parked rather than ending the run. `--only` runs exactly the epic's children and
44
45
  // stops, which is the scope the removed `epicrun #E` keyword had.
@@ -46,13 +47,13 @@ function format_dependencies(children: ReadonlyArray<number>, is_ordered: boolea
46
47
  // The epic number is not known while its own body is being built, so the placeholder is filled in by
47
48
  // `format_run_command` once the issue exists. Bodies written before this change still say
48
49
  // `epicrun …` or `queue …`; nothing reads the `Execution` section — the auto-close reads the task
49
- // list and `epic:check` never looks at it — so those epics are unaffected (joshuafolkken/kit#865).
50
+ // list and `epic:check` never looks at it — so those epics are unaffected.
50
51
  const EPIC_PLACEHOLDER = '<this epic>'
51
52
 
52
53
  function format_run_command(epic_number: number | undefined): string {
53
54
  const epic = epic_number === undefined ? EPIC_PLACEHOLDER : String(epic_number)
54
55
 
55
- return `backlogrun #${epic} --only`
56
+ return `backlogrun ${issue_cite.plain(epic)} --only`
56
57
  }
57
58
 
58
59
  // A backlink to the Issue this split came from, when the split originated in another repository.
@@ -70,14 +71,13 @@ function to_rationale(rationale: string): string {
70
71
  return trimmed.length > 0 ? trimmed : RATIONALE_PLACEHOLDER
71
72
  }
72
73
 
73
- // The record that `--ordered` itself is the decision behind the chain it writes
74
- // (joshuafolkken/kit#1712).
74
+ // The record that `--ordered` itself is the decision behind the chain it writes.
75
75
  //
76
76
  // **Without it every `--ordered` epic is born failing its own audit.** `epic:audit`'s
77
- // unjustified-order check asks where a declared order's reason was recorded, and a creation used to
78
- // record none — the split rationale explains the split in prose that need not name a single issue
79
- // number, so the check found nothing for any of the links and `epicrun` stopped at step one on a
80
- // brand-new epic created exactly as documented.
77
+ // unjustified-order check asks where a declared order's reason was recorded, and the split rationale
78
+ // explains the split in prose that need not name a single issue number — so without this record the
79
+ // check finds nothing for any of the links and `backlogrun #E` stops at its audit on a brand-new
80
+ // epic created exactly as documented.
81
81
  //
82
82
  // **It is a real record, not a formality.** `--ordered` is a person stating the order deliberately,
83
83
  // and this says so, when, and where the reasoning is — which is exactly what the check exists to