@joshuafolkken/kit 1.1240.0 → 1.1370.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (934) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +50 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +19 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +26 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +17 -28
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.vscode/tasks.json +14 -0
  42. package/CLAUDE.md +10 -61
  43. package/README.md +29 -47
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +42 -10
  47. package/dist/config-merge/index.js +11 -2
  48. package/dist/hooks/audit-provision.js +2 -2
  49. package/dist/hooks/batch-guard.js +7 -7
  50. package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
  51. package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
  52. package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
  53. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
  54. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  55. package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
  56. package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
  57. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
  60. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  61. package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
  62. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  63. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
  64. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  65. package/dist/hooks/codex-hook-adapter.js +26 -21
  66. package/dist/hooks/duplicate-read-guard.js +8 -8
  67. package/dist/hooks/format-edited.js +4 -4
  68. package/dist/hooks/inputs.json +216 -202
  69. package/dist/hooks/investigation-guard.js +8 -8
  70. package/dist/hooks/pretool-guard.js +15 -15
  71. package/dist/hooks/session-lang.js +406 -8
  72. package/dist/hooks/stop-guard.js +122 -187
  73. package/dist/josh.js +281 -94
  74. package/dist/version/index.js +15 -13
  75. package/eslint/base.js +43 -5
  76. package/eslint/rules/english-only-prose.js +3 -3
  77. package/eslint/rules/import.js +12 -0
  78. package/eslint/rules/namespace-object-export.js +2 -2
  79. package/package.json +16 -10
  80. package/pnpm-workspace.yaml +2 -4
  81. package/prompts/coding-standards.md +14 -48
  82. package/prompts/collaboration-workflow/file-edits.md +1 -1
  83. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  84. package/prompts/collaboration-workflow/issue-template.md +3 -10
  85. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  86. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  87. package/prompts/collaboration-workflow/overview.md +1 -1
  88. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  89. package/prompts/collaboration-workflow/principles.md +21 -3
  90. package/prompts/collaboration-workflow/report-format.md +16 -29
  91. package/prompts/collaboration-workflow/residency.md +1 -1
  92. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  93. package/prompts/collaboration-workflow/shell-body.md +3 -23
  94. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  95. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +3 -22
  98. package/prompts/review.md +15 -38
  99. package/prompts/testing-guide.md +2 -4
  100. package/scripts/adopt/adopt-logic.ts +5 -5
  101. package/scripts/adopt/adopt-toolkits.ts +4 -5
  102. package/scripts/adopt/adopt.ts +2 -3
  103. package/scripts/agent/agent-argv.ts +7 -7
  104. package/scripts/agent/agent-diagnostics.ts +2 -2
  105. package/scripts/agent/agent-exit-record.ts +1 -1
  106. package/scripts/agent/agent-headless.ts +1 -1
  107. package/scripts/agent/agent-launch-environment.ts +6 -1
  108. package/scripts/agent/agent-role-profile.ts +49 -22
  109. package/scripts/agent/agent-session-role.ts +32 -0
  110. package/scripts/agent/api-outage.ts +1 -1
  111. package/scripts/agent/claude-agent-argv.ts +4 -4
  112. package/scripts/agent/claude-result-event.ts +4 -4
  113. package/scripts/agent/codex-hooks.ts +2 -2
  114. package/scripts/agent/interactive-ask.ts +3 -6
  115. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  116. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  117. package/scripts/backlog/backlog-arrival.ts +54 -17
  118. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  119. package/scripts/backlog/backlog-budget.ts +17 -24
  120. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  121. package/scripts/backlog/backlog-drive-args.ts +5 -4
  122. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  123. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  124. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  125. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  126. package/scripts/backlog/backlog-drive-named.ts +39 -9
  127. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  128. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  129. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  130. package/scripts/backlog/backlog-drive.ts +43 -28
  131. package/scripts/backlog/backlog-idle.ts +88 -0
  132. package/scripts/backlog/backlog-named.ts +11 -15
  133. package/scripts/backlog/backlog-next.ts +26 -30
  134. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  135. package/scripts/backlog/backlog-offer.ts +7 -7
  136. package/scripts/backlog/backlog-overlap.ts +178 -0
  137. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  138. package/scripts/backlog/backlog-plan-read.ts +111 -0
  139. package/scripts/backlog/backlog-plan.ts +11 -10
  140. package/scripts/backlog/backlog-pool.ts +13 -14
  141. package/scripts/backlog/backlog-rank.ts +11 -11
  142. package/scripts/backlog/backlog-ready.ts +15 -10
  143. package/scripts/backlog/backlog-scope.ts +14 -15
  144. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  145. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  146. package/scripts/backlog/backlog-stalled.ts +5 -6
  147. package/scripts/backlog/backlog-waves.ts +4 -4
  148. package/scripts/backlog/backlogrun-args.ts +74 -0
  149. package/scripts/backlog/backlogrun-cli.ts +113 -0
  150. package/scripts/backlog/backlogrun-launch.ts +178 -0
  151. package/scripts/behavior/behavior-assertion.ts +6 -8
  152. package/scripts/behavior/behavior-cli.ts +1 -1
  153. package/scripts/behavior/behavior-rules.ts +3 -3
  154. package/scripts/build/build-claude-md.ts +4 -4
  155. package/scripts/build/build-codex-hooks.ts +2 -2
  156. package/scripts/build/build-commands.ts +1 -1
  157. package/scripts/build/build-hooks.ts +5 -5
  158. package/scripts/build/build.ts +1 -1
  159. package/scripts/build/hook-bundle-stamp.ts +109 -7
  160. package/scripts/build/local-bin.ts +2 -2
  161. package/scripts/cases/cases-cli.ts +1 -1
  162. package/scripts/cases/cases-logic.ts +2 -2
  163. package/scripts/ci/composite-actions.ts +1 -2
  164. package/scripts/ci/pr-classification.ts +2 -2
  165. package/scripts/claude/workflow-destination.ts +1 -1
  166. package/scripts/clone/clone-aggregate.ts +1 -1
  167. package/scripts/clone/clone-fingerprint.ts +1 -1
  168. package/scripts/clone/clone-scan-cli.ts +1 -1
  169. package/scripts/clone/clone-scan.ts +1 -1
  170. package/scripts/config-merge/index.ts +1 -1
  171. package/scripts/config-merge/json-format.ts +1 -3
  172. package/scripts/config-merge/patch-json-array.ts +90 -0
  173. package/scripts/config-merge/patch-json-key.ts +6 -3
  174. package/scripts/config-merge/patch-json-list.ts +1 -1
  175. package/scripts/cost-runtime/codex-usage.ts +1 -1
  176. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  177. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  178. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  179. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  180. package/scripts/cost-runtime/cost-cli.ts +14 -11
  181. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  182. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  183. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  184. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  185. package/scripts/cost-runtime/cost-usage.ts +6 -7
  186. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  187. package/scripts/cost-runtime/own-session.ts +1 -1
  188. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  189. package/scripts/delegation/delegation-cli.ts +4 -4
  190. package/scripts/delegation/delegation-policy.ts +13 -15
  191. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  192. package/scripts/delegation/fanout-cli.ts +1 -1
  193. package/scripts/delegation/fanout.ts +1 -1
  194. package/scripts/delegation/investigation-guard.ts +18 -22
  195. package/scripts/delegation/investigation-reads.ts +48 -238
  196. package/scripts/discovery/repo-discovery.ts +1 -1
  197. package/scripts/discovery/repo-map-logic.ts +1 -2
  198. package/scripts/discovery/repo-origin.ts +3 -3
  199. package/scripts/discovery/repo-party-cli.ts +2 -2
  200. package/scripts/discovery/repo-party.ts +2 -2
  201. package/scripts/doctor/doctor-consumer.ts +1 -1
  202. package/scripts/doctor/doctor-io.ts +6 -7
  203. package/scripts/doctor/doctor-logic.ts +1 -1
  204. package/scripts/doctor/doctor-ports.ts +1 -1
  205. package/scripts/doctor/doctor.ts +8 -9
  206. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  207. package/scripts/document/bash-output-cap.ts +5 -7
  208. package/scripts/document/capped-print-part.ts +1 -1
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/document-byte-budget.ts +33 -64
  211. package/scripts/document/document-byte-check.ts +4 -4
  212. package/scripts/document/document-reachability.ts +7 -8
  213. package/scripts/document/document-read-cli.ts +2 -2
  214. package/scripts/document/document-scan.ts +26 -2
  215. package/scripts/document/document-section-cli.ts +6 -8
  216. package/scripts/document/document-section.ts +8 -12
  217. package/scripts/document/edit-files-cli.ts +3 -4
  218. package/scripts/document/entry-read-budget.ts +8 -70
  219. package/scripts/document/entry-read-set.ts +51 -34
  220. package/scripts/document/lane-child-read-set.ts +9 -9
  221. package/scripts/document/read-files-cli.ts +1 -2
  222. package/scripts/document/read-set-cli.ts +16 -19
  223. package/scripts/document/read-set-cost.ts +4 -4
  224. package/scripts/document/read-set-point-of-use.ts +28 -38
  225. package/scripts/document/read-set-pricing.ts +1 -1
  226. package/scripts/document/read-set-trim.ts +3 -3
  227. package/scripts/document/resident-budget.ts +8 -10
  228. package/scripts/epic/epic-add-body.ts +15 -18
  229. package/scripts/epic/epic-add-plan.ts +26 -28
  230. package/scripts/epic/epic-add.ts +32 -25
  231. package/scripts/epic/epic-audit-checks.ts +27 -37
  232. package/scripts/epic/epic-audit-cli.ts +21 -22
  233. package/scripts/epic/epic-audit-orphans.ts +16 -17
  234. package/scripts/epic/epic-audit-rationale.ts +10 -15
  235. package/scripts/epic/epic-audit-report.ts +2 -5
  236. package/scripts/epic/epic-audit.ts +18 -14
  237. package/scripts/epic/epic-body.ts +10 -10
  238. package/scripts/epic/epic-bundle-cli.ts +36 -34
  239. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  240. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  241. package/scripts/epic/epic-bundle-poll.ts +1 -1
  242. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  243. package/scripts/epic/epic-bundle.ts +19 -20
  244. package/scripts/epic/epic-busy.ts +44 -21
  245. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  246. package/scripts/epic/epic-chains.ts +18 -23
  247. package/scripts/epic/epic-classify.ts +11 -12
  248. package/scripts/epic/epic-cli-argv.ts +5 -6
  249. package/scripts/epic/epic-cli-remove.ts +9 -4
  250. package/scripts/epic/epic-cli.ts +38 -26
  251. package/scripts/epic/epic-close-comment.ts +14 -15
  252. package/scripts/epic/epic-close.ts +25 -29
  253. package/scripts/epic/epic-cross-repo.ts +18 -21
  254. package/scripts/epic/epic-decision.ts +14 -18
  255. package/scripts/epic/epic-fetch.ts +25 -31
  256. package/scripts/epic/epic-graph.ts +15 -17
  257. package/scripts/epic/epic-index.ts +14 -16
  258. package/scripts/epic/epic-issue.ts +9 -11
  259. package/scripts/epic/epic-label-age.ts +74 -0
  260. package/scripts/epic/epic-lane-offer.ts +35 -24
  261. package/scripts/epic/epic-nested.ts +1 -1
  262. package/scripts/epic/epic-next-read.ts +8 -8
  263. package/scripts/epic/epic-next-views.ts +12 -12
  264. package/scripts/epic/epic-next.ts +29 -33
  265. package/scripts/epic/epic-outside-blocker.ts +11 -10
  266. package/scripts/epic/epic-parse.ts +22 -24
  267. package/scripts/epic/epic-promote.ts +3 -2
  268. package/scripts/epic/epic-rank.ts +1 -1
  269. package/scripts/epic/epic-read.ts +10 -8
  270. package/scripts/epic/epic-reconcile.ts +8 -6
  271. package/scripts/epic/epic-reference.ts +5 -4
  272. package/scripts/epic/epic-relation-recheck.ts +10 -11
  273. package/scripts/epic/epic-relations.ts +9 -8
  274. package/scripts/epic/epic-remove-plan.ts +4 -5
  275. package/scripts/epic/epic-remove.ts +7 -5
  276. package/scripts/epic/epic-report.ts +18 -20
  277. package/scripts/epic/epic-run.ts +6 -5
  278. package/scripts/epic/epic-sections.ts +2 -2
  279. package/scripts/epic/epic-shape.ts +3 -3
  280. package/scripts/epic/epic-solo-stale.ts +3 -2
  281. package/scripts/epic/epic-solo.ts +8 -8
  282. package/scripts/epic/epic-triage.ts +5 -4
  283. package/scripts/epic/epic-validate.ts +8 -7
  284. package/scripts/epic/epic.ts +5 -5
  285. package/scripts/exports/unused-members-cli.ts +1 -1
  286. package/scripts/followup/followup-issue-number.ts +1 -2
  287. package/scripts/followup/git-followup-cleanup.ts +6 -7
  288. package/scripts/followup/git-followup-finish.ts +11 -13
  289. package/scripts/followup/git-followup-flush.ts +11 -7
  290. package/scripts/followup/git-followup-issue-close.ts +16 -13
  291. package/scripts/followup/git-followup-label.ts +9 -6
  292. package/scripts/followup/git-followup-merged.ts +1 -1
  293. package/scripts/followup/git-followup-pending.ts +7 -9
  294. package/scripts/followup/git-followup-stages.ts +28 -17
  295. package/scripts/followup/git-followup-workflow.ts +19 -21
  296. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  297. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  298. package/scripts/followup/git-pr-followup.ts +18 -17
  299. package/scripts/gate/core-admission.ts +2 -2
  300. package/scripts/gate/core-budget.ts +15 -26
  301. package/scripts/gate/gate-ledger.ts +114 -0
  302. package/scripts/gate/gate-log.ts +7 -9
  303. package/scripts/gate/gate-plan.ts +70 -35
  304. package/scripts/gate/gate-report.ts +14 -15
  305. package/scripts/gate/gate-skip.ts +11 -13
  306. package/scripts/gate/gate-steps.ts +5 -1
  307. package/scripts/gate/gate-tree.ts +3 -4
  308. package/scripts/gate/hook-gate-reuse.ts +9 -9
  309. package/scripts/gate/machine-capacity.ts +168 -30
  310. package/scripts/gate/pre-commit-type-check.ts +4 -4
  311. package/scripts/gate/project-checks.ts +12 -4
  312. package/scripts/gate/scoped-green.ts +11 -18
  313. package/scripts/gate/type-check-command.ts +2 -2
  314. package/scripts/gate/type-check-step.ts +4 -4
  315. package/scripts/gate/verification-gate.ts +53 -51
  316. package/scripts/gh/gh-spawn.ts +2 -2
  317. package/scripts/gh/git-ai-review-scan.ts +3 -2
  318. package/scripts/gh/git-gh-api-path.ts +10 -11
  319. package/scripts/gh/git-gh-exec.ts +43 -48
  320. package/scripts/gh/git-gh-failure.ts +6 -9
  321. package/scripts/gh/git-gh-helpers.ts +1 -1
  322. package/scripts/gh/git-gh-issue-list.ts +15 -19
  323. package/scripts/gh/git-gh-issue-read.ts +43 -60
  324. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  325. package/scripts/gh/git-gh-issue-write.ts +52 -40
  326. package/scripts/gh/git-gh-issue.ts +23 -24
  327. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  328. package/scripts/gh/git-gh-pr-read.ts +46 -50
  329. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  330. package/scripts/gh/git-gh-pr-review.ts +2 -2
  331. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  332. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  333. package/scripts/gh/git-gh-pr.ts +16 -16
  334. package/scripts/gh/git-gh-reachability.ts +11 -12
  335. package/scripts/gh/git-gh-repo.ts +2 -3
  336. package/scripts/gh/git-gh-rest-state.ts +1 -1
  337. package/scripts/gh/git-pr-ai-review.ts +6 -5
  338. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  339. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  340. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  341. package/scripts/gh/git-pr-checks.ts +20 -23
  342. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  343. package/scripts/gh/git-pr-confirmation.ts +5 -5
  344. package/scripts/gh/git-pr-managed-config.ts +7 -9
  345. package/scripts/gh/git-pr-messages.ts +1 -1
  346. package/scripts/gh/git-pr.ts +15 -16
  347. package/scripts/gh/github-issue-url.ts +8 -9
  348. package/scripts/git/base-tree.ts +66 -0
  349. package/scripts/git/change-base.ts +42 -2
  350. package/scripts/git/changed-file-scope.ts +5 -5
  351. package/scripts/git/changed-paths.ts +1 -2
  352. package/scripts/git/constants.ts +2 -2
  353. package/scripts/git/git-branch.ts +1 -1
  354. package/scripts/git/git-closes-keyword.ts +3 -3
  355. package/scripts/git/git-command.ts +53 -41
  356. package/scripts/git/git-common-directory.ts +3 -3
  357. package/scripts/git/git-diff-reads.ts +14 -15
  358. package/scripts/git/git-error.ts +1 -1
  359. package/scripts/git/git-execa-error.ts +1 -2
  360. package/scripts/git/git-issue.ts +10 -8
  361. package/scripts/git/git-location-environment.ts +3 -4
  362. package/scripts/git/git-ls-remote.ts +6 -8
  363. package/scripts/git/git-pre-push-hook.ts +11 -10
  364. package/scripts/git/git-preflight.ts +5 -5
  365. package/scripts/git/git-push-transport.ts +2 -2
  366. package/scripts/git/git-remote-branch.ts +1 -2
  367. package/scripts/git/git-schemas.ts +16 -23
  368. package/scripts/git/git-spawn-sync.ts +1 -1
  369. package/scripts/git/git-spawn.ts +37 -14
  370. package/scripts/git/git-ssh-keepalive.ts +12 -5
  371. package/scripts/git/git-staging.ts +7 -8
  372. package/scripts/git/git-workflow.ts +1 -1
  373. package/scripts/git/git-worktree.ts +35 -27
  374. package/scripts/git/gone-branch.ts +2 -2
  375. package/scripts/git/listing-cutoff.ts +1 -2
  376. package/scripts/git/lockfile-sync.ts +65 -0
  377. package/scripts/git/main-merge-guard.ts +1 -2
  378. package/scripts/git/main-merge.ts +7 -7
  379. package/scripts/git/main-sync.ts +23 -8
  380. package/scripts/git/parse-json-array.ts +18 -23
  381. package/scripts/git/repository-lock.ts +34 -2
  382. package/scripts/git/stash/git-stash.ts +4 -5
  383. package/scripts/git/stash/stash-orphans.ts +5 -3
  384. package/scripts/git/stash/stash-pop-args.ts +1 -1
  385. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  386. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  387. package/scripts/hooks/batch-guard.ts +11 -13
  388. package/scripts/hooks/check-commit-message.ts +12 -9
  389. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  390. package/scripts/hooks/edited-cspell.ts +3 -4
  391. package/scripts/hooks/format-edited-cli.ts +1 -1
  392. package/scripts/hooks/format-edited-file.ts +11 -17
  393. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  394. package/scripts/hooks/pre-push-unit.ts +10 -14
  395. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  396. package/scripts/hooks/pretool-guard.ts +93 -18
  397. package/scripts/hooks/reserved-run.ts +2 -2
  398. package/scripts/hooks/step-zero-notice.ts +1 -1
  399. package/scripts/hooks/stop-guard.ts +21 -10
  400. package/scripts/init/basic-path-migration.ts +2 -2
  401. package/scripts/init/claude-kit-only-settings.ts +2 -2
  402. package/scripts/init/claude-plugin-config.ts +2 -2
  403. package/scripts/init/distributed-paths.ts +4 -4
  404. package/scripts/init/hook-command-rewrite.ts +3 -3
  405. package/scripts/init/hook-launch.ts +5 -5
  406. package/scripts/init/init-actions.ts +13 -0
  407. package/scripts/init/init-ai-copy.ts +11 -11
  408. package/scripts/init/init-bootstrap.ts +3 -3
  409. package/scripts/init/init-copy-content.ts +4 -4
  410. package/scripts/init/init-logic-json-merge.ts +7 -9
  411. package/scripts/init/init-logic-migrate.ts +1 -1
  412. package/scripts/init/init-logic-templates.ts +1 -1
  413. package/scripts/init/init-logic-workspace.ts +4 -4
  414. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  415. package/scripts/init/init-logic.ts +19 -22
  416. package/scripts/init/init.ts +7 -7
  417. package/scripts/init/kit-base-preset.ts +1 -1
  418. package/scripts/init/kit-setup-state.ts +1 -1
  419. package/scripts/init/kit-written-paths.ts +1 -2
  420. package/scripts/init/package-manager-pin.ts +1 -1
  421. package/scripts/init/project-profile-cli.ts +1 -1
  422. package/scripts/init/project-profile.ts +3 -3
  423. package/scripts/init/session-language-environment.ts +1 -1
  424. package/scripts/init/start-exec.ts +3 -4
  425. package/scripts/init/start-plan.ts +2 -2
  426. package/scripts/init/start-setup-pr.ts +3 -2
  427. package/scripts/init/start-steps.ts +2 -2
  428. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  429. package/scripts/init/vscode-tasks.ts +62 -0
  430. package/scripts/issue/baseline-measure.ts +2 -2
  431. package/scripts/issue/behavior-change-lint.ts +2 -2
  432. package/scripts/issue/defect-rate-cli.ts +6 -7
  433. package/scripts/issue/defect-rate.ts +37 -27
  434. package/scripts/issue/git-next-issues.ts +9 -8
  435. package/scripts/issue/issue-auto-ok.ts +24 -11
  436. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  437. package/scripts/issue/issue-backlinks.ts +6 -6
  438. package/scripts/issue/issue-cite-cli.ts +20 -18
  439. package/scripts/issue/issue-cite.ts +18 -8
  440. package/scripts/issue/issue-closing-pr.ts +4 -4
  441. package/scripts/issue/issue-comment-cli.ts +6 -4
  442. package/scripts/issue/issue-file-cli.ts +52 -15
  443. package/scripts/issue/issue-file-fold.ts +155 -0
  444. package/scripts/issue/issue-file.ts +9 -6
  445. package/scripts/issue/issue-fold-cli.ts +14 -9
  446. package/scripts/issue/issue-fold.ts +23 -8
  447. package/scripts/issue/issue-labels.ts +34 -38
  448. package/scripts/issue/issue-lint-cli.ts +2 -2
  449. package/scripts/issue/issue-lint.ts +1 -1
  450. package/scripts/issue/issue-merged.ts +10 -4
  451. package/scripts/issue/issue-number-shape.ts +27 -0
  452. package/scripts/issue/issue-rank.ts +1 -1
  453. package/scripts/issue/issue-read-cli.ts +4 -5
  454. package/scripts/issue/issue-read.ts +4 -5
  455. package/scripts/issue/issue-reference.ts +5 -5
  456. package/scripts/issue/issue-release-cli.ts +17 -7
  457. package/scripts/issue/issue-release.ts +3 -3
  458. package/scripts/issue/issue-report-failures.ts +7 -4
  459. package/scripts/issue/issue-scout-cli.ts +11 -11
  460. package/scripts/issue/issue-scout-closed.ts +4 -4
  461. package/scripts/issue/issue-scout.ts +4 -5
  462. package/scripts/issue/issue-state-cli.ts +17 -10
  463. package/scripts/issue/issue-state.ts +12 -13
  464. package/scripts/issue/issue-wip.ts +7 -7
  465. package/scripts/issue/markdown-section.ts +3 -3
  466. package/scripts/issue/measure-rerun-cli.ts +10 -9
  467. package/scripts/issue/reproduction-measure.ts +3 -3
  468. package/scripts/issue/session-cite.ts +56 -0
  469. package/scripts/josh/agent-session-environment.ts +10 -8
  470. package/scripts/josh/cli-body.ts +2 -2
  471. package/scripts/josh/command-suggest.ts +1 -1
  472. package/scripts/josh/file-map-stamp.ts +20 -23
  473. package/scripts/josh/hook-decision.ts +24 -28
  474. package/scripts/josh/josh-command-map.ts +4 -1
  475. package/scripts/josh/josh-command-types.ts +30 -35
  476. package/scripts/josh/josh-commands-ai.ts +6 -6
  477. package/scripts/josh/josh-commands-backlog.ts +15 -3
  478. package/scripts/josh/josh-commands-clone.ts +1 -1
  479. package/scripts/josh/josh-commands-development.ts +25 -4
  480. package/scripts/josh/josh-commands-document.ts +3 -3
  481. package/scripts/josh/josh-commands-guard.ts +3 -3
  482. package/scripts/josh/josh-commands-issue.ts +4 -5
  483. package/scripts/josh/josh-commands-lane.ts +14 -4
  484. package/scripts/josh/josh-commands-lint.ts +1 -1
  485. package/scripts/josh/josh-commands-run.ts +20 -6
  486. package/scripts/josh/josh-commands-split.ts +1 -2
  487. package/scripts/josh/josh-commands-versioning.ts +5 -5
  488. package/scripts/josh/josh-commands-workflow.ts +30 -22
  489. package/scripts/josh/josh-environment-file.ts +1 -1
  490. package/scripts/josh/josh-in-process.ts +3 -3
  491. package/scripts/josh/josh-logic.ts +6 -7
  492. package/scripts/josh/josh-run.ts +3 -3
  493. package/scripts/josh/josh-verdict.ts +9 -12
  494. package/scripts/josh/josh.ts +3 -3
  495. package/scripts/josh/kit-only.ts +2 -2
  496. package/scripts/josh/path-decision.ts +3 -3
  497. package/scripts/josh/platform-temporary.ts +7 -5
  498. package/scripts/josh/process-identity.ts +24 -6
  499. package/scripts/josh/process-owner.ts +4 -4
  500. package/scripts/josh/session-language-cli.ts +53 -11
  501. package/scripts/josh/session-language.ts +1 -1
  502. package/scripts/josh/stamp-file.ts +48 -29
  503. package/scripts/josh/stamp-record.ts +57 -0
  504. package/scripts/lane/lane-await.ts +35 -11
  505. package/scripts/lane/lane-cache.ts +6 -6
  506. package/scripts/lane/lane-capacity.ts +32 -17
  507. package/scripts/lane/lane-child-invocation.ts +17 -15
  508. package/scripts/lane/lane-child-marker.ts +12 -12
  509. package/scripts/lane/lane-cli.ts +12 -13
  510. package/scripts/lane/lane-close.ts +6 -6
  511. package/scripts/lane/lane-dispatch.ts +61 -72
  512. package/scripts/lane/lane-environment.ts +5 -5
  513. package/scripts/lane/lane-guard-policy.ts +7 -21
  514. package/scripts/lane/lane-handoff.ts +2 -2
  515. package/scripts/lane/lane-install.ts +9 -10
  516. package/scripts/lane/lane-launch-cli.ts +13 -8
  517. package/scripts/lane/lane-ledger.ts +73 -11
  518. package/scripts/lane/lane-leftover.ts +2 -2
  519. package/scripts/lane/lane-limit-cli.ts +160 -0
  520. package/scripts/lane/lane-limit-override.ts +74 -0
  521. package/scripts/lane/lane-load.ts +19 -68
  522. package/scripts/lane/lane-measure-cli.ts +15 -25
  523. package/scripts/lane/lane-occupancy.ts +6 -4
  524. package/scripts/lane/lane-open.ts +20 -19
  525. package/scripts/lane/lane-output.ts +4 -3
  526. package/scripts/lane/lane-paths.ts +12 -11
  527. package/scripts/lane/lane-phase.ts +33 -0
  528. package/scripts/lane/lane-reap.ts +2 -2
  529. package/scripts/lane/lane-registry.ts +16 -15
  530. package/scripts/lane/lane-relaunch.ts +9 -9
  531. package/scripts/lane/lane-report.ts +5 -4
  532. package/scripts/lane/lane-resume.ts +2 -2
  533. package/scripts/lane/lane-sampler.ts +55 -0
  534. package/scripts/lane/lane-seed.ts +7 -7
  535. package/scripts/lane/lane-stage-stats.ts +135 -0
  536. package/scripts/lane/lane-start-point.ts +8 -11
  537. package/scripts/lane/lane-stats.ts +60 -15
  538. package/scripts/lane/lane-stray.ts +1 -1
  539. package/scripts/lane/lane-vacant.ts +1 -1
  540. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  541. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  542. package/scripts/lane/openai-review-broker.ts +2 -4
  543. package/scripts/lib/ancestor-directories.ts +1 -1
  544. package/scripts/lib/bounded-pool.ts +2 -2
  545. package/scripts/lib/buffered-process.ts +4 -6
  546. package/scripts/lib/caddy-logs.sh +0 -0
  547. package/scripts/lib/cli-flags.ts +39 -6
  548. package/scripts/lib/error-message.ts +1 -1
  549. package/scripts/lib/json-value.ts +17 -3
  550. package/scripts/lib/poll.ts +1 -1
  551. package/scripts/lib/status-icons.ts +3 -3
  552. package/scripts/lib/timed-fetch.ts +1 -1
  553. package/scripts/lib/timeouts.ts +1 -1
  554. package/scripts/lines/bytes-command.ts +3 -4
  555. package/scripts/lines/effective-limit.ts +25 -12
  556. package/scripts/lines/line-budget.ts +47 -55
  557. package/scripts/lines/line-targets.ts +6 -2
  558. package/scripts/lines/lines-command.ts +3 -3
  559. package/scripts/lint/cspell-cached.ts +1 -1
  560. package/scripts/lint/cycle-recheck.ts +122 -0
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +34 -19
  563. package/scripts/lint/lint-related-scope.ts +25 -15
  564. package/scripts/lint/lint-related.ts +6 -7
  565. package/scripts/managed-marker/index.ts +1 -1
  566. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  567. package/scripts/notify/git-notify.ts +9 -7
  568. package/scripts/notify/telegram-notify.ts +53 -37
  569. package/scripts/notify/telegram-test-logic.ts +3 -3
  570. package/scripts/notify/telegram-test.ts +45 -30
  571. package/scripts/observations/observation-ledger-home.ts +14 -8
  572. package/scripts/observations/observation-ledger-line.ts +3 -2
  573. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  574. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  575. package/scripts/observations/observation-ledger.ts +14 -15
  576. package/scripts/observations/observation-record-cli.ts +83 -0
  577. package/scripts/observations/observation-record.ts +91 -0
  578. package/scripts/observations/observations-flush-cli.ts +1 -1
  579. package/scripts/observations/observations-flush-landing.ts +7 -6
  580. package/scripts/observations/observations-flush.ts +26 -27
  581. package/scripts/overrides/overrides-check.ts +18 -8
  582. package/scripts/package/package-scout-cli.ts +1 -1
  583. package/scripts/package/package-scout-format.ts +2 -2
  584. package/scripts/package/package-scout.ts +1 -1
  585. package/scripts/propagate/propagate-git-failure.ts +1 -1
  586. package/scripts/propagate/propagate-git.ts +7 -7
  587. package/scripts/propagate/propagate-plan.ts +2 -2
  588. package/scripts/propagate/propagate-publish.ts +2 -3
  589. package/scripts/propagate/propagate-run.ts +5 -7
  590. package/scripts/propagate/propagate-select.ts +1 -1
  591. package/scripts/propagate/propagate-steps.ts +19 -20
  592. package/scripts/propagate/propagate-targets.ts +6 -10
  593. package/scripts/propagate/propagate.ts +5 -5
  594. package/scripts/refactor/import-graph.ts +1 -1
  595. package/scripts/refactor/refactor-lint.ts +4 -10
  596. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  597. package/scripts/refactor/refactor-scan.ts +2 -2
  598. package/scripts/refactor/refactor-targets.ts +1 -1
  599. package/scripts/release/github-release-cli.ts +25 -3
  600. package/scripts/release/github-release-runs.ts +1 -1
  601. package/scripts/release/release-cli.ts +21 -4
  602. package/scripts/release/release-history.ts +6 -10
  603. package/scripts/release/release-plan.ts +3 -3
  604. package/scripts/release/release-progress.ts +3 -4
  605. package/scripts/release/release-publish.ts +8 -9
  606. package/scripts/release/release-scope-cli.ts +8 -10
  607. package/scripts/release/release-tag.ts +6 -8
  608. package/scripts/release/release-worktree.ts +5 -5
  609. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  610. package/scripts/repo/auto-merge-setting.ts +1 -1
  611. package/scripts/repo/repo-setting.ts +4 -4
  612. package/scripts/repo/repository-labels.ts +1 -1
  613. package/scripts/repo/required-checks-logic.ts +3 -3
  614. package/scripts/repo/required-checks-report.ts +1 -1
  615. package/scripts/repo/ruleset-check-cli.ts +1 -1
  616. package/scripts/repo/ruleset-check.ts +1 -1
  617. package/scripts/report/report-format-reference.ts +26 -0
  618. package/scripts/report/report-lint-cli.ts +2 -2
  619. package/scripts/report/report-lint.ts +16 -2
  620. package/scripts/review/disposition-cli.ts +2 -2
  621. package/scripts/review/disposition-logic.ts +1 -1
  622. package/scripts/review/live-evidence.ts +9 -6
  623. package/scripts/review/review-attest-cli.ts +1 -2
  624. package/scripts/review/review-attest.ts +3 -3
  625. package/scripts/review/review-brief-cli.ts +19 -20
  626. package/scripts/review/review-brief.ts +29 -32
  627. package/scripts/review/review-checkout.ts +2 -2
  628. package/scripts/review/review-diff-parts.ts +3 -5
  629. package/scripts/review/review-diff-write.ts +1 -1
  630. package/scripts/review/review-finding-ledger.ts +7 -4
  631. package/scripts/review/review-findings-cli.ts +2 -2
  632. package/scripts/review/review-level.ts +4 -7
  633. package/scripts/review/review-record-cli.ts +73 -16
  634. package/scripts/review/review-record.ts +5 -4
  635. package/scripts/review/review-round2-cli.ts +2 -3
  636. package/scripts/review/review-round2.ts +13 -21
  637. package/scripts/review/review-stamps.ts +9 -71
  638. package/scripts/review/review-tree.ts +4 -5
  639. package/scripts/rules/bash-triggers.ts +4 -4
  640. package/scripts/rules/decision-oracle-batch.ts +5 -6
  641. package/scripts/rules/decision-oracle-stage.ts +1 -1
  642. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  643. package/scripts/rules/decision-oracle.ts +2 -2
  644. package/scripts/rules/delivered-rules.ts +61 -406
  645. package/scripts/rules/destructive-command.ts +2 -2
  646. package/scripts/rules/direct-filing.ts +4 -4
  647. package/scripts/rules/direct-pr-create.ts +2 -2
  648. package/scripts/rules/early-heartbeat.ts +15 -19
  649. package/scripts/rules/file-body.ts +5 -6
  650. package/scripts/rules/filing-cap.ts +6 -7
  651. package/scripts/rules/filing-offer.ts +1 -1
  652. package/scripts/rules/firing-point.ts +6 -6
  653. package/scripts/rules/gh-api.ts +2 -2
  654. package/scripts/rules/git-argv.ts +3 -3
  655. package/scripts/rules/git-force.ts +2 -2
  656. package/scripts/rules/hook-context-line.ts +31 -0
  657. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  658. package/scripts/rules/implementation-cut.ts +35 -32
  659. package/scripts/rules/index-guard.ts +2 -2
  660. package/scripts/rules/issue-citation.ts +7 -7
  661. package/scripts/rules/issue-comments.ts +21 -13
  662. package/scripts/rules/josh-git-bare.ts +2 -2
  663. package/scripts/rules/lane-background.ts +14 -16
  664. package/scripts/rules/lane-carry-conflict.ts +41 -5
  665. package/scripts/rules/lane-interactive-ask.ts +6 -9
  666. package/scripts/rules/lane-park.ts +12 -16
  667. package/scripts/rules/lane-split-park.ts +1 -2
  668. package/scripts/rules/lane-switch-main.ts +10 -13
  669. package/scripts/rules/last-prompt.ts +1 -1
  670. package/scripts/rules/oracle-consulted.ts +5 -5
  671. package/scripts/rules/oracle-firing.ts +6 -9
  672. package/scripts/rules/oracle-list-cli.ts +2 -2
  673. package/scripts/rules/permission-guards.ts +2 -2
  674. package/scripts/rules/piped-verification.ts +79 -9
  675. package/scripts/rules/poll-loop.ts +9 -11
  676. package/scripts/rules/pre-gate-cut.ts +33 -30
  677. package/scripts/rules/prior-comment-read.ts +3 -3
  678. package/scripts/rules/protected-files.ts +25 -13
  679. package/scripts/rules/raw-field-body.ts +3 -4
  680. package/scripts/rules/reply-language.ts +1 -1
  681. package/scripts/rules/rule-body-guard.ts +10 -12
  682. package/scripts/rules/rule-guard.ts +1 -1
  683. package/scripts/rules/rule-list.ts +51 -0
  684. package/scripts/rules/rule-registry-rows.ts +282 -0
  685. package/scripts/rules/rule-registry.ts +109 -0
  686. package/scripts/rules/rule-value-cache.ts +2 -2
  687. package/scripts/rules/rule-value-cli.ts +6 -4
  688. package/scripts/rules/rule-value.ts +61 -22
  689. package/scripts/rules/run-tail-rule.ts +11 -15
  690. package/scripts/rules/shell-body-trigger.ts +7 -7
  691. package/scripts/rules/shell-segments.ts +2 -4
  692. package/scripts/rules/stop-rules.ts +54 -41
  693. package/scripts/rules/tail-commands.ts +1 -1
  694. package/scripts/rules/test-declared-commit.ts +2 -2
  695. package/scripts/rules/third-party-write.ts +3 -3
  696. package/scripts/rules/worktree-guard.ts +12 -5
  697. package/scripts/run/add/run-add-cli.ts +165 -0
  698. package/scripts/run/add/run-add.ts +124 -0
  699. package/scripts/run/board/run-board-cli.ts +207 -0
  700. package/scripts/run/board/run-board-closed.ts +95 -0
  701. package/scripts/run/board/run-board-every.ts +60 -0
  702. package/scripts/run/board/run-board-fetch.ts +38 -0
  703. package/scripts/run/board/run-board-fit.ts +219 -0
  704. package/scripts/run/board/run-board-github.ts +162 -0
  705. package/scripts/run/board/run-board-header.ts +275 -0
  706. package/scripts/run/board/run-board-kind.ts +35 -0
  707. package/scripts/run/board/run-board-labels.ts +299 -0
  708. package/scripts/run/board/run-board-layout.ts +222 -0
  709. package/scripts/run/board/run-board-link.ts +31 -0
  710. package/scripts/run/board/run-board-machine.ts +198 -0
  711. package/scripts/run/board/run-board-notes.ts +103 -0
  712. package/scripts/run/board/run-board-phase.ts +136 -0
  713. package/scripts/run/board/run-board-plan.ts +129 -0
  714. package/scripts/run/board/run-board-read.ts +62 -0
  715. package/scripts/run/board/run-board-render-legend.ts +82 -0
  716. package/scripts/run/board/run-board-render-notes.ts +77 -0
  717. package/scripts/run/board/run-board-render-slot.ts +50 -0
  718. package/scripts/run/board/run-board-render.ts +407 -0
  719. package/scripts/run/board/run-board-scope.ts +17 -0
  720. package/scripts/run/board/run-board-screen.ts +43 -0
  721. package/scripts/run/board/run-board-span.ts +66 -0
  722. package/scripts/run/board/run-board-spin.ts +115 -0
  723. package/scripts/run/board/run-board-state.ts +113 -0
  724. package/scripts/run/board/run-board-status.ts +279 -0
  725. package/scripts/run/board/run-board-tick.ts +210 -0
  726. package/scripts/run/board/run-board-track.ts +22 -0
  727. package/scripts/run/board/run-board-usage-read.ts +255 -0
  728. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  729. package/scripts/run/board/run-board-usage-text.ts +80 -0
  730. package/scripts/run/board/run-board-usage.ts +165 -0
  731. package/scripts/run/carry/run-carry-added.ts +62 -0
  732. package/scripts/run/carry/run-carry-args.ts +25 -22
  733. package/scripts/run/carry/run-carry-change.ts +1 -1
  734. package/scripts/run/carry/run-carry-cli.ts +71 -48
  735. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  736. package/scripts/run/carry/run-carry-ended.ts +85 -0
  737. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  738. package/scripts/run/carry/run-carry-stash.ts +3 -2
  739. package/scripts/run/carry/run-carry-streak.ts +8 -10
  740. package/scripts/run/carry/run-carry.ts +85 -89
  741. package/scripts/run/cut/run-cut-args.ts +7 -7
  742. package/scripts/run/cut/run-cut-cli.ts +54 -36
  743. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  744. package/scripts/run/cut/run-cut-report.ts +37 -16
  745. package/scripts/run/cut/run-cut.ts +63 -77
  746. package/scripts/run/detached-launch.ts +35 -50
  747. package/scripts/run/entry/run-entry-cli.ts +48 -27
  748. package/scripts/run/entry/run-entry-stop.ts +7 -9
  749. package/scripts/run/entry/run-entry.ts +5 -6
  750. package/scripts/run/event/run-event-cli.ts +5 -6
  751. package/scripts/run/event/run-event-filed.ts +69 -0
  752. package/scripts/run/event/run-event-follow.ts +3 -3
  753. package/scripts/run/event/run-event-plan.ts +38 -0
  754. package/scripts/run/event/run-event-render.ts +9 -4
  755. package/scripts/run/event/run-event-scope.ts +47 -18
  756. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  757. package/scripts/run/event/run-event-stream.ts +171 -46
  758. package/scripts/run/event/run-event-watch.ts +4 -6
  759. package/scripts/run/hold/run-hold-cli.ts +65 -62
  760. package/scripts/run/hold/run-hold.ts +88 -46
  761. package/scripts/run/merge/run-merge-cli.ts +116 -77
  762. package/scripts/run/merge/run-merge-collect.ts +107 -0
  763. package/scripts/run/merge/run-merge-steps.ts +112 -65
  764. package/scripts/run/merge/run-merge-token.ts +30 -0
  765. package/scripts/run/merge/run-merge.ts +31 -22
  766. package/scripts/run/progress/run-progress-args.ts +4 -4
  767. package/scripts/run/progress/run-progress-cli.ts +39 -50
  768. package/scripts/run/progress/run-progress-clock.ts +25 -32
  769. package/scripts/run/progress/run-progress-config.ts +6 -9
  770. package/scripts/run/progress/run-progress-read.ts +9 -10
  771. package/scripts/run/progress/run-progress.ts +48 -53
  772. package/scripts/run/review/run-review-cli.ts +6 -6
  773. package/scripts/run/review/run-review-steps.ts +6 -6
  774. package/scripts/run/review/run-review.ts +9 -11
  775. package/scripts/run/run-cli-fault.ts +29 -0
  776. package/scripts/run/run-ending-cli.ts +3 -3
  777. package/scripts/run/run-ending.ts +10 -14
  778. package/scripts/run/run-halfrun-resume.ts +6 -8
  779. package/scripts/run/run-headless.ts +25 -12
  780. package/scripts/run/run-invocation.ts +17 -22
  781. package/scripts/run/run-label.ts +7 -5
  782. package/scripts/run/run-liveness-cli.ts +19 -6
  783. package/scripts/run/run-liveness.ts +27 -38
  784. package/scripts/run/run-next-cli.ts +5 -9
  785. package/scripts/run/run-next.ts +4 -5
  786. package/scripts/run/run-parent-cut-hook.ts +10 -12
  787. package/scripts/run/run-preflight.ts +25 -29
  788. package/scripts/run/run-prep-cli.ts +17 -13
  789. package/scripts/run/run-prep-locate.ts +4 -5
  790. package/scripts/run/run-prep.ts +7 -10
  791. package/scripts/run/run-prrun-resume.ts +2 -2
  792. package/scripts/run/run-report-cli.ts +4 -4
  793. package/scripts/run/run-report.ts +9 -14
  794. package/scripts/run/run-retrospective.ts +3 -3
  795. package/scripts/run/run-section.ts +42 -0
  796. package/scripts/run/run-stage-read.ts +2 -2
  797. package/scripts/run/run-stage.ts +6 -4
  798. package/scripts/run/run-status-cli.ts +7 -5
  799. package/scripts/run/run-status.ts +6 -7
  800. package/scripts/run/run-step-cli.ts +13 -15
  801. package/scripts/run/run-step.ts +58 -47
  802. package/scripts/run/run-stop-notify.ts +7 -8
  803. package/scripts/run/run-stranded-cli.ts +1 -1
  804. package/scripts/run/run-stranded-detect.ts +4 -4
  805. package/scripts/run/run-stranded.ts +11 -13
  806. package/scripts/run/run-tail-cli.ts +15 -16
  807. package/scripts/run/run-tail.ts +14 -33
  808. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  809. package/scripts/run/run-watcher-guard.ts +11 -12
  810. package/scripts/run/run-watcher-hook.ts +6 -12
  811. package/scripts/run/ship/run-ship-cli.ts +67 -33
  812. package/scripts/run/ship/run-ship-detach.ts +15 -13
  813. package/scripts/run/ship/run-ship-lock.ts +1 -1
  814. package/scripts/run/ship/run-ship-next.ts +7 -8
  815. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  816. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  817. package/scripts/run/ship/run-ship-probe.ts +4 -4
  818. package/scripts/run/ship/run-ship-return.ts +1 -1
  819. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  820. package/scripts/run/ship/run-ship-review.ts +12 -14
  821. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  822. package/scripts/run/ship/run-ship-stage.ts +80 -26
  823. package/scripts/run/ship/run-ship-steps.ts +26 -16
  824. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  825. package/scripts/run/ship/run-ship-sync.ts +9 -8
  826. package/scripts/run/ship/run-ship.ts +17 -32
  827. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  828. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  829. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  830. package/scripts/run/tidy/run-tidy.ts +4 -3
  831. package/scripts/run/wake/run-wake-cli.ts +27 -32
  832. package/scripts/run/wake/run-wake-describe.ts +24 -28
  833. package/scripts/run/wake/run-wake-driver.ts +14 -14
  834. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  835. package/scripts/run/wake/run-wake-loop.ts +9 -9
  836. package/scripts/run/wake/run-wake-restart.ts +4 -5
  837. package/scripts/run/wake/run-wake-session.ts +23 -27
  838. package/scripts/run/wake/run-wake.ts +57 -279
  839. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  840. package/scripts/safe-chain/pack-hook.ts +2 -2
  841. package/scripts/safe-chain/preinstall-command.ts +2 -2
  842. package/scripts/security/security-audit-logic.ts +1 -1
  843. package/scripts/security/security-audit-provision-logic.ts +1 -1
  844. package/scripts/security/security-audit-provision.ts +2 -2
  845. package/scripts/security/security-audit.ts +5 -5
  846. package/scripts/security/security-updates-logic.ts +2 -3
  847. package/scripts/security/security-updates.ts +2 -4
  848. package/scripts/self-sync-guard/index.ts +1 -1
  849. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  850. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  851. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  852. package/scripts/sonar/sonar-hotspots.ts +1 -1
  853. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  854. package/scripts/sonar/sonar-new-code.ts +1 -1
  855. package/scripts/sonar/sonar-project.ts +1 -1
  856. package/scripts/split/split-assess-cli.ts +1 -1
  857. package/scripts/split/split-assess.ts +3 -3
  858. package/scripts/sync/directory-copy-guard.ts +2 -3
  859. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  860. package/scripts/sync/managed-config-scope.ts +4 -4
  861. package/scripts/sync/plugin-skill-directories.ts +2 -2
  862. package/scripts/sync/reconcile-templates.ts +17 -8
  863. package/scripts/sync/removed-skill-manifest.ts +2 -3
  864. package/scripts/sync/sync-ai-files.ts +7 -7
  865. package/scripts/sync/sync-configs.ts +30 -3
  866. package/scripts/sync/sync-hook-safety.ts +2 -2
  867. package/scripts/sync/sync.ts +23 -10
  868. package/scripts/sync/synced-paths.ts +2 -1
  869. package/scripts/sync/workflow-pin-logic.ts +1 -1
  870. package/scripts/test/test-declared-changed.ts +4 -4
  871. package/scripts/test/test-declared-logic.ts +2 -3
  872. package/scripts/test/test-declared-match.ts +25 -4
  873. package/scripts/test/test-declared.ts +26 -9
  874. package/scripts/test/test-red-commit.ts +3 -2
  875. package/scripts/test/test-red-logic.ts +7 -14
  876. package/scripts/test/test-red.ts +12 -47
  877. package/scripts/test/test-related-scope.ts +2 -3
  878. package/scripts/test/test-related.ts +3 -3
  879. package/scripts/test/test-type-logic.ts +1 -2
  880. package/scripts/test/test-unit-guard.ts +13 -17
  881. package/scripts/test/unit-worker-share.ts +7 -8
  882. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  883. package/scripts/time-runtime/time-background.ts +17 -21
  884. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  885. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  886. package/scripts/time-runtime/time-bundles.ts +11 -12
  887. package/scripts/time-runtime/time-call-identity.ts +1 -1
  888. package/scripts/time-runtime/time-command-key.ts +2 -2
  889. package/scripts/time-runtime/time-density-hook.ts +8 -11
  890. package/scripts/time-runtime/time-density.ts +5 -5
  891. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  892. package/scripts/time-runtime/time-format.ts +5 -5
  893. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  894. package/scripts/time-runtime/time-instant.ts +1 -1
  895. package/scripts/time-runtime/time-markers.ts +15 -19
  896. package/scripts/time-runtime/time-phase-names.ts +3 -3
  897. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  898. package/scripts/time-runtime/time-round-trips.ts +20 -23
  899. package/scripts/time-runtime/time-shell.ts +8 -8
  900. package/scripts/time-runtime/time-single-check.ts +1 -2
  901. package/scripts/time-runtime/time-spans.ts +35 -40
  902. package/scripts/time-runtime/time-tool-call.ts +15 -16
  903. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  904. package/scripts/time-runtime/time-writes.ts +5 -5
  905. package/scripts/ui/ui-routes-cli.ts +1 -2
  906. package/scripts/ui/ui-routes.ts +1 -2
  907. package/scripts/version/bump-version.ts +1 -1
  908. package/scripts/version/fresh-metadata-cache.ts +2 -2
  909. package/scripts/version/latest-corepack.ts +26 -26
  910. package/scripts/version/latest-lane-guard.ts +1 -1
  911. package/scripts/version/latest-scope-cli.ts +2 -2
  912. package/scripts/version/latest-stamp.ts +1 -2
  913. package/scripts/version/latest-update.ts +2 -2
  914. package/scripts/version/npm-registry.ts +2 -2
  915. package/scripts/version/package-manager-version.ts +18 -0
  916. package/scripts/version/publishable-range-check.ts +2 -1
  917. package/scripts/version/publishable-range.ts +1 -1
  918. package/scripts/version/release-age.ts +11 -11
  919. package/scripts/version/release-hold.ts +2 -2
  920. package/scripts/version/safe-chain-version-update.ts +3 -3
  921. package/scripts/version/version-check-logic.ts +2 -3
  922. package/scripts/version/version-check.ts +1 -2
  923. package/scripts/version/version-command-config.ts +2 -2
  924. package/scripts/version/version-commands.ts +3 -3
  925. package/scripts/version/version-remote.ts +4 -4
  926. package/scripts/version/version-targets.ts +2 -2
  927. package/templates/gitignore +7 -0
  928. package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
  929. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  930. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  931. package/scripts/backlog/backlog-restructure.ts +0 -152
  932. package/scripts/rules/issue-fold-rule.ts +0 -72
  933. package/scripts/rules/wip-cap.ts +0 -63
  934. package/scripts/run/run-issue-number.ts +0 -19
@@ -1,21 +1,15 @@
1
1
  #!/usr/bin/env tsx
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { auto_ok_cli } from '#scripts/auto-ok/auto-ok-cli'
4
- import { epic_index } from '#scripts/epic/epic-index'
5
- import type { EpicNextResult } from '#scripts/epic/epic-report'
6
- import { git_gh_command } from '#scripts/gh/git-gh-command'
7
- import { open_issue_schema, type OpenIssueData } from '#scripts/git/git-schemas'
8
- import { read_json_listing } from '#scripts/git/parse-json-array'
9
4
  import { run_invocation } from '#scripts/run/run-invocation'
10
5
  import { backlog_named } from './backlog-named'
11
- import { backlog_next, type OptedIn } from './backlog-next'
12
- import { backlog_plan, type NamedPlan, type PlanContext } from './backlog-plan'
13
- import type { GateScope } from './backlog-rank'
6
+ import { backlog_next } from './backlog-next'
7
+ import { backlog_plan, type NamedPlan } from './backlog-plan'
8
+ import { backlog_plan_read, type OpenListing, type Plan } from './backlog-plan-read'
14
9
  import { backlog_scope } from './backlog-scope'
15
10
  import { backlog_waves } from './backlog-waves'
16
11
 
17
- // `josh backlog:plan` — the whole backlog as a plan a person reads before a run starts
18
- // (joshuafolkken/kit#1652).
12
+ // `josh backlog:plan` — the whole backlog as a plan a person reads before a run starts.
19
13
  //
20
14
  // `backlog:next` already answers what may start, and a `backlogrun` acted on that answer one ask at a
21
15
  // time, so nothing ever showed the shape of the run: the order, which issue waits on which, what is
@@ -33,13 +27,12 @@ const SUCCESS_EXIT_CODE = 0
33
27
  const FAILURE_EXIT_CODE = 1
34
28
 
35
29
  // The keyword `run_invocation` parses a named-issue prefix behind, reused rather than parsing `#N`
36
- // again here so the `0` / leading-zero / safe-integer rules stay single-sourced (joshuafolkken/kit#1984).
30
+ // again here so the `0` / leading-zero / safe-integer rules stay single-sourced.
37
31
  const NAMED_COMMAND = 'backlogrun'
38
32
  // The flag that runs the named list and stops, mirrored here so the plan the person reads before the
39
- // run shows the same scope the run will take (joshuafolkken/kit#1984).
33
+ // run shows the same scope the run will take.
40
34
  const ONLY_FLAG = '--only'
41
- // The flag that renders the run's order wave by wave instead of the pool's sections
42
- // (joshuafolkken/kit#2778).
35
+ // The flag that renders the run's order wave by wave instead of the pool's sections.
43
36
  const WAVES_FLAG = '--waves'
44
37
 
45
38
  const USAGE =
@@ -76,7 +69,7 @@ function without_flags(argv: ReadonlyArray<string>): ReadonlyArray<string> {
76
69
  // The one start-time refusal: `--only` with no named issues has nothing to run. `backlog_named` is the
77
70
  // single source of that decision, so the plan and the run refuse it alike. The refusal turns only on
78
71
  // whether anything was named, so the items are built with `is_epic: false` — which item is an epic is
79
- // decided by the run at dispatch time, not here (joshuafolkken/kit#1985).
72
+ // decided by the run at dispatch time, not here.
80
73
  function only_refusal(named: ReadonlyArray<number>, is_only: boolean): string | undefined {
81
74
  const items = named.map((issue) => ({ issue, is_epic: false }))
82
75
  const startup = backlog_named.startup(items, is_only)
@@ -84,9 +77,8 @@ function only_refusal(named: ReadonlyArray<number>, is_only: boolean): string |
84
77
  return startup.kind === 'refused' ? startup.reason : undefined
85
78
  }
86
79
 
87
- // A failed open listing is not "nothing is out of scope". Reported rather than rendered around, for
88
- // the reason joshuafolkken/kit#950 records: a confident absence built on a read that failed is worse
89
- // than no answer.
80
+ // A failed open listing is not "nothing is out of scope". Reported rather than rendered around,
81
+ // because a confident absence built on a read that failed is worse than no answer.
90
82
  const OPEN_UNREADABLE_MESSAGE =
91
83
  "Could not read this repository's open issues, so the out-of-scope half of the plan cannot be told from an empty one. Check `gh auth status` and ask again."
92
84
 
@@ -95,82 +87,14 @@ const OPEN_UNREADABLE_MESSAGE =
95
87
  // every other one. Reported as a gap, the way `backlog:next` reports its own truncated listings.
96
88
  const OPEN_TRUNCATED_MESSAGE = `⚠ The open-issue listing stopped at ${String(auto_ok_cli.LISTING_LIMIT)} rows, so the out-of-scope section is partial, some titles are missing, and a blocker that has since closed can still be named. The plan below is incomplete.`
97
89
 
98
- interface Plan {
99
- result: EpicNextResult
100
- repo: string
101
- exclude: ReadonlyArray<number>
102
- // Which **opted-in** epic is withholding which issue, narrowed by the same function the pool
103
- // decided membership with (joshuafolkken/kit#1668). Without it the scope layer had no branch for
104
- // "an epic is offering this one instead", so every opted-in row it could not place was reported as
105
- // past the listing cap. Carrying the *whole* index here instead would move that misreport rather
106
- // than remove it: the sentence would name an epic that is withholding nothing.
107
- tracked: ReadonlyMap<number, number>
108
- // The rows the offer's cap bounds and the paths each issue restructures, so `--waves` cuts each
109
- // wave where `backlog:next` does (joshuafolkken/kit#2928, joshuafolkken/kit#3221).
110
- scope: GateScope
111
- }
112
-
113
- // The listing plus whether it was cut. Carried together because the rows alone cannot say whether
114
- // what is missing from them is absent or merely past the cap.
115
- interface OpenListing {
116
- rows: ReadonlyArray<OpenIssueData>
117
- is_capped: boolean
118
- }
119
-
120
90
  // Which rendering was asked for: the named prefix the sections lead with, or the waves.
121
91
  interface PlanView {
122
92
  named: NamedPlan
123
93
  is_waves: boolean
124
94
  }
125
95
 
126
- // The same reads and the same classification `backlog:next` makes, through the same two functions.
127
- // `undefined` is a failure it has already reported.
128
- async function classify(
129
- opted_in: OptedIn,
130
- exclude: ReadonlyArray<number>,
131
- ): Promise<Plan | undefined> {
132
- const context = await backlog_next.context_of(opted_in, exclude)
133
-
134
- if (context === undefined) return undefined
135
-
136
- const result = await backlog_next.resolve(context)
137
-
138
- if (result === undefined) return undefined
139
-
140
- return {
141
- result,
142
- repo: context.repo,
143
- exclude,
144
- tracked: epic_index.withheld_children(context.tracking.index, context.opted_in.issues),
145
- scope: backlog_next.gate_scope(context),
146
- }
147
- }
148
-
149
- // Every open issue, read once. It carries both halves the plan needs and the pool does not hold: the
150
- // titles, and the set the out-of-scope rows are subtracted from. One read serves both, so the plan
151
- // costs exactly one `gh` call more than the answer it is rendering.
152
- async function fetch_open(): Promise<OpenListing | undefined> {
153
- const { json, is_capped } = await git_gh_command.issue_list_recent(auto_ok_cli.LISTING_LIMIT)
154
-
155
- if (json === undefined) return undefined
156
-
157
- const read = read_json_listing(json, open_issue_schema)
158
-
159
- return read.kind === 'read' ? { rows: read.rows, is_capped } : undefined
160
- }
161
-
162
- // A cut listing cannot say an issue is closed, only that it was not read — so the blocker filter is
163
- // switched off rather than fed a set that would silently report standing blockers as gone.
164
- function context_of(plan: Plan, listing: OpenListing): PlanContext {
165
- return {
166
- repo: plan.repo,
167
- titles: backlog_scope.titles_of(listing.rows),
168
- open_numbers: listing.is_capped ? undefined : backlog_scope.open_numbers_of(listing.rows),
169
- }
170
- }
171
-
172
96
  function print_plan(plan: Plan, listing: OpenListing, view: PlanView): void {
173
- const context = context_of(plan, listing)
97
+ const context = backlog_plan_read.context_of(plan, listing)
174
98
 
175
99
  if (view.is_waves) {
176
100
  console.info(backlog_waves.format_waves(plan.result, context, plan.scope))
@@ -185,7 +109,7 @@ function print_plan(plan: Plan, listing: OpenListing, view: PlanView): void {
185
109
  }
186
110
 
187
111
  async function report(plan: Plan, view: PlanView): Promise<number> {
188
- const listing = await fetch_open()
112
+ const listing = await backlog_plan_read.fetch_open()
189
113
 
190
114
  if (listing === undefined) {
191
115
  console.error(OPEN_UNREADABLE_MESSAGE)
@@ -216,7 +140,7 @@ async function run_plan(rest: ReadonlyArray<string>, view: PlanView): Promise<nu
216
140
  return FAILURE_EXIT_CODE
217
141
  }
218
142
 
219
- const plan = await classify(opted_in, options.exclude ?? [])
143
+ const plan = await backlog_plan_read.classify(opted_in, options.exclude ?? [])
220
144
 
221
145
  return plan === undefined ? FAILURE_EXIT_CODE : await report(plan, view)
222
146
  }
@@ -242,7 +166,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
242
166
  const rest = without_flags(argv)
243
167
  // Read the named block from the *original* argv, so `--only` placed before the `#N` block breaks the
244
168
  // leading block exactly as the run grammar does — the plan then refuses an ordering the run refuses,
245
- // rather than promising a scope the resumed invocation would stop on (joshuafolkken/kit#1984).
169
+ // rather than promising a scope the resumed invocation would stop on.
246
170
  const named = named_of(argv)
247
171
  const refusal = refusal_of(named, rest, is_only, is_waves)
248
172
 
@@ -0,0 +1,111 @@
1
+ import { auto_ok_cli } from '#scripts/auto-ok/auto-ok-cli'
2
+ import { epic_index } from '#scripts/epic/epic-index'
3
+ import type { EpicNextResult } from '#scripts/epic/epic-report'
4
+ import { git_gh_command } from '#scripts/gh/git-gh-command'
5
+ import { open_issue_schema, type OpenIssueData } from '#scripts/git/git-schemas'
6
+ import { read_json_listing } from '#scripts/git/parse-json-array'
7
+ import { backlog_next, type OptedIn } from './backlog-next'
8
+ import type { PlanContext } from './backlog-plan'
9
+ import type { GateScope } from './backlog-rank'
10
+ import { backlog_scope } from './backlog-scope'
11
+
12
+ // The reads a backlog plan is drawn from — `backlog:plan`'s and `run:board`'s.
13
+ // Moved out of `backlog-plan-cli.ts` so the board places each issue through the very classification the
14
+ // plan prints, rather than a second copy of it that could promise a different order.
15
+
16
+ interface Plan {
17
+ result: EpicNextResult
18
+ repo: string
19
+ exclude: ReadonlyArray<number>
20
+ // Which **opted-in** epic is withholding which issue, narrowed by the same function the pool
21
+ // decided membership with. Without it the scope layer had no branch for
22
+ // "an epic is offering this one instead", so every opted-in row it could not place was reported as
23
+ // past the listing cap. Carrying the *whole* index here instead would move that misreport rather
24
+ // than remove it: the sentence would name an epic that is withholding nothing.
25
+ tracked: ReadonlyMap<number, number>
26
+ // The rows the offer's cap bounds and the paths each issue declares, so `--waves` cuts each
27
+ // wave where `backlog:next` does.
28
+ scope: GateScope
29
+ }
30
+
31
+ // The listing plus whether it was cut. Carried together because the rows alone cannot say whether
32
+ // what is missing from them is absent or merely past the cap.
33
+ interface OpenListing {
34
+ rows: ReadonlyArray<OpenIssueData>
35
+ is_capped: boolean
36
+ }
37
+
38
+ // A plan with the open listing it is rendered against.
39
+ interface PlanRead {
40
+ plan: Plan
41
+ listing: OpenListing
42
+ }
43
+
44
+ // The same reads and the same classification `backlog:next` makes, through the same two functions.
45
+ // `undefined` is a failure it has already reported.
46
+ async function classify(
47
+ opted_in: OptedIn,
48
+ exclude: ReadonlyArray<number>,
49
+ ): Promise<Plan | undefined> {
50
+ const context = await backlog_next.context_of(opted_in, exclude)
51
+
52
+ if (context === undefined) return undefined
53
+
54
+ const result = await backlog_next.resolve(context)
55
+
56
+ if (result === undefined) return undefined
57
+
58
+ return {
59
+ result,
60
+ repo: context.repo,
61
+ exclude,
62
+ tracked: epic_index.withheld_children(context.tracking.index, context.opted_in.issues),
63
+ scope: backlog_next.gate_scope(context),
64
+ }
65
+ }
66
+
67
+ // Every open issue, read once. It carries both halves the plan needs and the pool does not hold: the
68
+ // titles, and the set the out-of-scope rows are subtracted from. One read serves both, so the plan
69
+ // costs exactly one `gh` call more than the answer it is rendering.
70
+ async function fetch_open(): Promise<OpenListing | undefined> {
71
+ const { json, is_capped } = await git_gh_command.issue_list_recent(auto_ok_cli.LISTING_LIMIT)
72
+
73
+ if (json === undefined) return undefined
74
+
75
+ const read = read_json_listing(json, open_issue_schema)
76
+
77
+ return read.kind === 'read' ? { rows: read.rows, is_capped } : undefined
78
+ }
79
+
80
+ // A cut listing cannot say an issue is closed, only that it was not read — so the blocker filter is
81
+ // switched off rather than fed a set that would silently report standing blockers as gone.
82
+ function context_of(plan: Plan, listing: OpenListing): PlanContext {
83
+ return {
84
+ repo: plan.repo,
85
+ titles: backlog_scope.titles_of(listing.rows),
86
+ open_numbers: listing.is_capped ? undefined : backlog_scope.open_numbers_of(listing.rows),
87
+ }
88
+ }
89
+
90
+ // The whole read, end to end, for a caller that only needs to know whether it succeeded — `run:board`
91
+ // keeps its previous plan on `undefined` rather than drawing an empty one.
92
+ async function with_listing(plan: Plan | undefined): Promise<PlanRead | undefined> {
93
+ if (plan === undefined) return undefined
94
+
95
+ const listing = await fetch_open()
96
+
97
+ return listing === undefined ? undefined : { plan, listing }
98
+ }
99
+
100
+ async function read_plan(exclude: ReadonlyArray<number> = []): Promise<PlanRead | undefined> {
101
+ const opted_in = await auto_ok_cli.fetch_opted_in()
102
+
103
+ if (opted_in.kind !== 'read') return undefined
104
+
105
+ return await with_listing(await classify(opted_in, exclude))
106
+ }
107
+
108
+ const backlog_plan_read = { classify, context_of, fetch_open, read_plan }
109
+
110
+ export { backlog_plan_read }
111
+ export type { OpenListing, Plan, PlanRead }
@@ -7,7 +7,7 @@ import { issue_cite } from '#scripts/issue/issue-cite'
7
7
  import { has_label_name, IN_PROGRESS_LABEL, RUN_SOLO_LABEL } from '#scripts/issue/issue-labels'
8
8
  import type { OutOfScopeRow } from './backlog-scope'
9
9
 
10
- // The plan a person reads before a `backlogrun` starts (joshuafolkken/kit#1652).
10
+ // The plan a person reads before a `backlogrun` starts.
11
11
  //
12
12
  // `backlog:next` answers the **next** question — which numbers may start now — and its report is
13
13
  // shaped for the loop that consumes it. This renders the **whole** picture from the same classified
@@ -20,11 +20,11 @@ const ROW_INDENT_WIDTH = 4
20
20
  const ROW_INDENT = ' '.repeat(ROW_INDENT_WIDTH)
21
21
  const NOTHING = `${ROW_INDENT}(none)`
22
22
 
23
- // The named-issue prefix of a `backlogrun #N1 #N2 …` (joshuafolkken/kit#1984): these run one at a
23
+ // The named-issue prefix of a `backlogrun #N1 #N2 …`: these run one at a
24
24
  // time, in the order they were typed, before anything in the pool below is picked up.
25
25
  const NAMED_HEADING = 'Named issues — run in order first, one at a time, then the backlog:'
26
- // `--only` runs the named list and stops, so its heading says the pool is not drained
27
- // (joshuafolkken/kit#1984). The plan then shows the named section alone.
26
+ // `--only` runs the named list and stops, so its heading says the pool is not drained.
27
+ // The plan then shows the named section alone.
28
28
  const ONLY_NAMED_HEADING =
29
29
  'Named issues — run in order, one at a time, then stop (`--only`; the opted-in backlog is not run):'
30
30
  const READY_HEADING =
@@ -57,16 +57,16 @@ interface PlanContext {
57
57
  }
58
58
 
59
59
  // A child elsewhere is qualified, because a bare number would name *this* repository's issue of that
60
- // number — a different issue (joshuafolkken/kit#1016). Takes the reference rather than the child, so
61
- // a `blocked_by` edge is named by the same rule the child itself is. This repository's issue is cited
62
- // (joshuafolkken/kit#3099): the plan is copied into a report verbatim, so the line it prints is the
60
+ // number — a different issue. Takes the reference rather than the child, so
61
+ // a `blocked_by` edge is named by the same rule the child itself is. This repository's issue is cited:
62
+ // the plan is copied into a report verbatim, so the line it prints is the
63
63
  // citation the report carries.
64
64
  function cite_of(reference: IssueReference, repo: string, title: string | undefined): string {
65
65
  const number = String(reference.number)
66
66
 
67
67
  return reference.repo === repo
68
68
  ? issue_cite.reference(repo, number, title)
69
- : `${reference.repo}#${number}`
69
+ : issue_cite.plain(number, reference.repo)
70
70
  }
71
71
 
72
72
  function reference_of(reference: IssueReference, repo: string): string {
@@ -84,10 +84,10 @@ function join_row(reference: string, note: string): string {
84
84
  }
85
85
 
86
86
  // A `run:solo` child is marked beside its number, so a person reading the plan sees which issues
87
- // `backlog:next` will start alone before the run starts (joshuafolkken/kit#2776).
87
+ // `backlog:next` will start alone before the run starts.
88
88
  const SOLO_MARK = `[${RUN_SOLO_LABEL}]`
89
89
  // A child with neither `run:solo` nor `run:lane` is one `backlog:next` withholds everything for until
90
- // it is judged (joshuafolkken/kit#2779), so the plan says which ones before the run asks.
90
+ // it is judged, so the plan says which ones before the run asks.
91
91
  const UNTRIAGED_MARK = '[untriaged]'
92
92
 
93
93
  function mark_of(child: EpicChild): string | undefined {
@@ -260,6 +260,7 @@ const backlog_plan = {
260
260
  WAITING_HEADING,
261
261
  format_plan,
262
262
  format_unusable,
263
+ is_standing,
263
264
  marked_reference,
264
265
  row_of,
265
266
  section,
@@ -14,7 +14,7 @@ import {
14
14
  NEEDS_DECISION_LABEL,
15
15
  } from '#scripts/issue/issue-labels'
16
16
 
17
- // The candidate pool `josh backlog:next` answers from (joshuafolkken/kit#1630).
17
+ // The candidate pool `josh backlog:next` answers from.
18
18
  //
19
19
  // Two sources feed one pool: the opted-in issues no epic tracks, and the children of the epics whose
20
20
  // **root** carries `auto-ok`. Splitting them apart lives here so the command itself stays a list of
@@ -26,8 +26,8 @@ import {
26
26
  const EPIC_LABELS: ReadonlySet<string> = new Set([EPIC_LABEL])
27
27
  // The labels that put a withheld row in the "needs a person" bucket rather than the "waiting on
28
28
  // time" one. `already-done` belongs with `needs-decision` because no amount of waiting moves it: the
29
- // work is merged and the close is Tier C, so a person is the only thing that resolves it
30
- // (joshuafolkken/kit#1679). Read as `time`, it would be reported as something that resolves itself
29
+ // work is merged and the close is Tier C, so a person is the only thing that resolves it.
30
+ // Read as `time`, it would be reported as something that resolves itself
31
31
  // and nobody would ever be told to close it.
32
32
  const DECISION_LABELS: ReadonlySet<string> = new Set([NEEDS_DECISION_LABEL, ALREADY_DONE_LABEL])
33
33
 
@@ -35,7 +35,7 @@ const DECISION_LABELS: ReadonlySet<string> = new Set([NEEDS_DECISION_LABEL, ALRE
35
35
  // instead, the ones the caller has named as done, and the repository the rows belong to.
36
36
  //
37
37
  // `tracked` is the narrowed set `epic_index.withheld_children` builds, not every child an epic
38
- // tracks (joshuafolkken/kit#1668) — the narrowing itself is defined there, once, for this half and
38
+ // tracks — the narrowing itself is defined there, once, for this half and
39
39
  // `auto-ok:next` alike.
40
40
  // Child number to every open epic whose task list names it — `epic_index.build_tracking_index`.
41
41
  type TrackingIndex = ReadonlyMap<number, ReadonlyArray<number>>
@@ -47,7 +47,7 @@ interface StandaloneContext {
47
47
  tracked: ReadonlyMap<number, number>
48
48
  exclude: ReadonlyArray<number>
49
49
  repo: string
50
- // Every issue this backlog may run (joshuafolkken/kit#1943). A row whose open blocker is outside it
50
+ // Every issue this backlog may run. A row whose open blocker is outside it
51
51
  // waits on a person rather than on time, exactly as an epic child's does.
52
52
  running: ReadonlySet<string>
53
53
  }
@@ -77,7 +77,7 @@ function epic_keys_of(tracking: TrackingIndex, repo: string): ReadonlySet<string
77
77
  return new Set([...tracking.values()].flat().map((number) => epic_graph.key_of({ repo, number })))
78
78
  }
79
79
 
80
- // The set with every epic that tracks a member added, nested epics included (joshuafolkken/kit#3289).
80
+ // The set with every epic that tracks a member added, nested epics included.
81
81
  // An epic is a container rather than work, so it is never run itself — but it closes once its children
82
82
  // do, so a row blocked by it waits on time exactly when one of those children is in this run.
83
83
  function with_tracking_epics(
@@ -136,8 +136,8 @@ function settle_standalone(
136
136
  // classification covers all of them and the verdict is decided once rather than per source.
137
137
  //
138
138
  // `repo` stamps the row itself, never its blockers: issue numbers are unique per repository, so a
139
- // blocker read bare resolves against the *reading* repository and names a different issue there
140
- // (joshuafolkken/kit#1654). `epic_issue.blocker_references_of` is the epic side's own resolution —
139
+ // blocker read bare resolves against the *reading* repository and names a different issue there.
140
+ // `epic_issue.blocker_references_of` is the epic side's own resolution —
141
141
  // `repository_url` when the node names one, this repository only as the fallback an unqualified
142
142
  // relation has always meant — and it is reused rather than repeated.
143
143
  function to_child(issue: OpenIssueData, repo: string): EpicChild {
@@ -155,7 +155,7 @@ function to_children(issues: ReadonlyArray<OpenIssueData>, repo: string): Array<
155
155
  }
156
156
 
157
157
  // The epics whose `auto-ok` stands for their children — the opted-in roots and, transitively, every
158
- // nested epic reached through their task lists (joshuafolkken/kit#2244, extending joshuafolkken/kit#1668).
158
+ // nested epic reached through their task lists.
159
159
  //
160
160
  // The roots come out of the opted-in listing itself: an epic that carries `auto-ok` is a row in that
161
161
  // listing which also carries `epic`, so no second listing reads an epic's labels. From each root the
@@ -177,8 +177,7 @@ function standalone_rows(issues: ReadonlyArray<OpenIssueData>): ReadonlyArray<Op
177
177
  }
178
178
 
179
179
  // A row an **opted-in** epic tracks belongs to that epic's order and never to the standalone half —
180
- // the rule joshuafolkken/kit#1633 established, narrowed by joshuafolkken/kit#1668 to the epics that
181
- // are actually going to offer their children and applied here for the same reason. Which rows those
180
+ // limited to the epics that are actually going to offer their children. Which rows those
182
181
  // are is `epic_index.withheld_children`'s answer, not a second test made here. A row the caller
183
182
  // excluded is out of the pool entirely rather than merely unoffered: it has just merged.
184
183
  function is_considered(issue: OpenIssueData, context: ConsideredContext): boolean {
@@ -193,7 +192,7 @@ function is_considered(issue: OpenIssueData, context: ConsideredContext): boolea
193
192
  // and everything else — a standing blocker, a run already in progress — resolves on its own and is
194
193
  // waiting on time.
195
194
  //
196
- // **The display's cap is not applied here** (joshuafolkken/kit#2928). Cut at this point, a sixth
195
+ // **The display's cap is not applied here**. Cut at this point, a sixth
197
196
  // runnable `run:solo` issue never reached the gate that holds back what is ranked below it, so the
198
197
  // cap is applied after that gate instead (`backlog-rank.ts`). A row past it is still reported as
199
198
  // waiting and offered by a later ask, so the backlog drains without it ever being lost.
@@ -221,8 +220,8 @@ function classify_standalone(
221
220
  }
222
221
  }
223
222
 
224
- // Every issue the backlog may run: each opted-in epic's children and the standalone rows
225
- // (joshuafolkken/kit#1943). A child is opted in through its epic's `auto-ok` even where it carries none
223
+ // Every issue the backlog may run: each opted-in epic's children and the standalone rows.
224
+ // A child is opted in through its epic's `auto-ok` even where it carries none
226
225
  // of its own, which is why the set is built from the graphs that were read rather than from labels. A
227
226
  // standalone row a person has to resolve is left out, so a row waiting on it waits for that person too;
228
227
  // an epic child in the same state is taken out by `epic_next_views.settle_views`. An open epic with a
@@ -4,18 +4,18 @@ import { epic_rank } from '#scripts/epic/epic-rank'
4
4
  import type { EpicNextResult } from '#scripts/epic/epic-report'
5
5
  import { epic_solo, type SoloGate, type SoloSelection } from '#scripts/epic/epic-solo'
6
6
  import { git_next_issues } from '#scripts/issue/git-next-issues'
7
- import { backlog_restructure, type Declared } from './backlog-restructure'
7
+ import { backlog_overlap, type Declared } from './backlog-overlap'
8
8
 
9
- // What the backlog offers, in the order it is decided (joshuafolkken/kit#2928): rank, then the
9
+ // What the backlog offers, in the order it is decided: rank, then the
10
10
  // `run:solo` gate, then the cap. `backlog:next` and `backlog:plan --waves` both call `select`, so the
11
11
  // plan's first wave is what the run starts into an idle repository rather than an order the run never
12
12
  // takes.
13
13
  //
14
- // **The cap comes last.** It used to be applied while the standalone half was classified, before the
15
- // gate, so a `run:solo` issue ranked sixth or lower was cut before the gate could see it — and the
16
- // issues below it were offered past it. Cut after the gate, the cap only ever removes what the gate
17
- // would have offered, so it cannot hide a waiting `run:solo` issue from it. It still bounds only the
18
- // standalone rows, as it always has; an epic's children were never capped.
14
+ // **The cap comes last.** Applied while the standalone half is classified, before the gate, it would
15
+ // cut a `run:solo` issue ranked sixth or lower before the gate could see it — and offer the issues
16
+ // below it past it. Cut after the gate, the cap only ever removes what the gate would have offered,
17
+ // so it cannot hide a waiting `run:solo` issue from it. It bounds only the standalone rows; an epic's
18
+ // children are never capped.
19
19
 
20
20
  // Every child the classification placed, in the order it placed them: the ranked candidates first,
21
21
  // then the waiting ones, then the ones waiting on a person.
@@ -79,18 +79,18 @@ interface OfferInput {
79
79
  repo: string
80
80
  // The keys of the standalone rows — the ones the cap bounds.
81
81
  standalone: ReadonlySet<string>
82
- // The paths each issue restructures; two candidates claiming one are not offered together
83
- // (joshuafolkken/kit#3221). Absent, nothing is separated.
82
+ // The paths each issue declares; two candidates whose paths overlap are not offered together.
83
+ // Absent, nothing is separated.
84
84
  declared?: Declared
85
85
  }
86
86
 
87
- // The restructure separation runs before the cap, for the reason the gate does: the cap only ever
87
+ // The overlap separation runs before the cap, for the reason the gate does: the cap only ever
88
88
  // removes what would otherwise be offered.
89
89
  function select(input: OfferInput): SoloSelection {
90
90
  const ranked = rank(input.candidates, input.pool)
91
91
  const { read, repo } = input
92
92
  const gated = epic_solo.select(ranked, read, repo)
93
- const separated = backlog_restructure.separate(gated, input.declared ?? new Map(), { read, repo })
93
+ const separated = backlog_overlap.separate(gated, input.declared ?? new Map(), { read, repo })
94
94
 
95
95
  return cap(separated, input.standalone)
96
96
  }
@@ -23,11 +23,15 @@ interface ReadyPorts {
23
23
  ready_issues: () => Promise<ReadonlyArray<string>>
24
24
  }
25
25
 
26
- async function free_under(limit: number): Promise<number> {
26
+ // The lanes in use: the open worktrees an interruption has not stranded. `josh lane:limit` prints it.
27
+ async function live_lane_count(): Promise<number> {
27
28
  const lanes = await lane_registry.list_lanes()
28
- const live = lanes.filter((lane) => !lane.is_stranded).length
29
29
 
30
- return lane_capacity.free_lanes(limit, live)
30
+ return lanes.filter((lane) => !lane.is_stranded).length
31
+ }
32
+
33
+ async function free_under(limit: number): Promise<number> {
34
+ return lane_capacity.free_lanes(limit, await live_lane_count())
31
35
  }
32
36
 
33
37
  // Free lanes right now: the limit less the live lanes. An unreadable limit reads as no free lane — the
@@ -40,25 +44,25 @@ async function free_under(limit: number): Promise<number> {
40
44
  // (`backlog:next`) is gated behind a free lane, so a network read here would defeat that design. The
41
45
  // two can diverge, but only toward over-counting live lanes → fewer free lanes, the safe direction.
42
46
  async function free_lane_count(): Promise<number> {
43
- const limit = lane_capacity.lane_limit()
47
+ const limit = await lane_capacity.lane_limit()
44
48
 
45
49
  if (limit.kind !== 'limit') return NO_FREE
46
50
 
47
51
  return await free_under(limit.limit)
48
52
  }
49
53
 
50
- // **The drive's count throws on an unreadable limit** (joshuafolkken/kit#3027). The drive launches no
54
+ // **The drive's count throws on an unreadable limit**. The drive launches no
51
55
  // more than this count, so the safe-direction zero above would leave it launching nothing and reporting
52
56
  // nothing for good; a bad setting is the hard error `lane_capacity` says it is, ending the drive loudly.
53
57
  async function drive_free_lane_count(): Promise<number> {
54
- const limit = lane_capacity.lane_limit()
58
+ const limit = await lane_capacity.lane_limit()
55
59
 
56
60
  if (limit.kind !== 'limit') throw new Error(limit.problem)
57
61
 
58
62
  return await free_under(limit.limit)
59
63
  }
60
64
 
61
- // **A `--only` run has no pool to drain** (joshuafolkken/kit#2472). `backlog:next` lists the opted-in
65
+ // **A `--only` run has no pool to drain**. `backlog:next` lists the opted-in
62
66
  // pool, and a `--only` run's work is its named list — issues and epics that run in order through their
63
67
  // own step, never through the pick-up ask — so a ready pool issue is neither a stall nor an ask it owes.
64
68
  // Without a `--only` record the pool is the run's, whole.
@@ -67,7 +71,7 @@ function drains_pool(carry: RunCarry | undefined): boolean {
67
71
  }
68
72
 
69
73
  // The `backlog:next` read, or `undefined` for a `--only` run, which answers none before paying for the
70
- // network read. A bounded read (joshuafolkken/kit#2503) keeps stderr piped: the arrival probe reads once
74
+ // network read. A bounded read keeps stderr piped: the arrival probe reads once
71
75
  // a minute, and a forwarded refusal would fill the watcher's output.
72
76
  async function read_backlog_next(timeout_ms?: number): Promise<JoshResult | undefined> {
73
77
  if (!drains_pool(await run_headless.current_carry())) return undefined
@@ -95,7 +99,7 @@ async function read_ready(ports: ReadyPorts = DEFAULT_PORTS): Promise<ReadyReadi
95
99
  }
96
100
 
97
101
  // `undefined` unless there is both runnable work and a lane for it — the only state worth a line. Each
98
- // issue is a number-link against `slug` (joshuafolkken/kit#3099): the parent copies this line into its
102
+ // issue is a number-link against `slug`: the parent copies this line into its
99
103
  // report, so a bare `#N` here is the citation the Stop guard sends back.
100
104
  function ready_line(reading: ReadyReading, slug: string | undefined): string | undefined {
101
105
  if (reading.issues.length === NONE || reading.free_lanes <= NO_FREE) return undefined
@@ -141,7 +145,7 @@ async function print_ready_line(
141
145
 
142
146
  // The line `epic --add` prints once a child entered an epic while a `backlogrun` parent drives this
143
147
  // checkout: a filing made mid-run joins the pool the moment it is placed, so the parent asks now rather
144
- // than on the next wake (joshuafolkken/kit#2452). The recommendation commands (`issue:scout`,
148
+ // than on the next wake. The recommendation commands (`issue:scout`,
145
149
  // `epic:bundle`) carry none — before the insertion the child is in no pool the ask could find.
146
150
  const OFFER_HINT =
147
151
  '↻ backlogrun parent: a child just entered an epic — run `pnpm josh backlog:offer` next, so a ' +
@@ -163,6 +167,7 @@ const backlog_ready = {
163
167
  read_backlog_next,
164
168
  print_offer_hint,
165
169
  free_lane_count,
170
+ live_lane_count,
166
171
  drive_free_lane_count,
167
172
  drains_pool,
168
173
  print_ready_line,
@@ -1,29 +1,28 @@
1
1
  import type { EpicNextResult } from '#scripts/epic/epic-report'
2
2
  import type { OpenIssueData } from '#scripts/git/git-schemas'
3
3
  import { AUTO_OK_LABEL, EPIC_LABEL, has_any_label } from '#scripts/issue/issue-labels'
4
+ import { session_cite } from '#scripts/issue/session-cite'
4
5
 
5
- // Which open issues the backlog will not run, and why (joshuafolkken/kit#1652).
6
+ // Which open issues the backlog will not run, and why.
6
7
  //
7
8
  // **The set is a subtraction, never a second membership rule.** Everything open that the pool did not
8
9
  // classify is out of scope, so this cannot drift from what `backlog:next` offers the way a
9
10
  // re-implemented "is it opted in" test would. What is decided per row is only the sentence saying
10
11
  // why, and each of those is read off a label rather than judged.
11
12
  //
12
- // It exists because the exclusion used to be silent: an issue without `auto-ok`, or a child of an
13
- // epic whose root lacks it, never enters the pool at all, so a person watching a `backlogrun` could
14
- // not tell "not opted in" from "the backlog has not reached it yet".
13
+ // It exists because an issue without `auto-ok` never enters the pool at all, so without this a person
14
+ // watching a `backlogrun` could not tell "not opted in" from "the backlog has not reached it yet".
15
15
  //
16
- // A child of an epic whose root lacks `auto-ok` is no longer one of those — since
17
- // joshuafolkken/kit#1668 its own label carries it into the standalone half, so it is offered rather
18
- // than explained. What is still explained here is the child of an epic that **is** opted in and that
19
- // the epic did not place, and telling that apart from a row past the listing cap is the whole of
20
- // `opted_in_reason` below.
16
+ // A child of an epic whose root lacks `auto-ok` is not one of those — its own label carries it into
17
+ // the standalone half, so it is offered rather than explained. What is explained here is the child of
18
+ // an epic that **is** opted in and that the epic did not place, and telling that apart from a row past
19
+ // the listing cap is the whole of `opted_in_reason` below.
21
20
 
22
21
  const EPIC_LABELS: ReadonlySet<string> = new Set([EPIC_LABEL])
23
22
  const AUTO_OK_LABELS: ReadonlySet<string> = new Set([AUTO_OK_LABEL])
24
23
 
25
24
  const NO_OPT_IN_REASON = 'not opted in — no `auto-ok` label'
26
- // Since joshuafolkken/kit#1668 this no longer speaks for the children: an epic that did not opt in
25
+ // This does not speak for the children: an epic that did not opt in
27
26
  // offers none of them, but each child carrying `auto-ok` of its own is offered by the standalone
28
27
  // half. Saying "its children are not offered" here would contradict the plan's own ready section.
29
28
  const EPIC_NOT_OPTED_IN_REASON =
@@ -31,13 +30,13 @@ const EPIC_NOT_OPTED_IN_REASON =
31
30
  const EPIC_ROOT_REASON = 'epic root — a container, so its children are planned instead of it'
32
31
  const OPTED_IN_UNPLACED_REASON = 'opted in, but past the listing cap this ask could read'
33
32
 
34
- // The cap is what the row above says, and it used to be said of every opted-in row the plan could
35
- // not place — including the ones the cap had nothing to do with (joshuafolkken/kit#1668). An issue an
33
+ // The cap is what the row above says, and it is not said of every opted-in row the plan could not
34
+ // place — only of the ones the cap has to do with. An issue an
36
35
  // opted-in epic tracks is offered through that epic and not standalone, so when the epic did not
37
36
  // place it either, the epic is the fact worth naming and the cap is a misreport a reader acts on:
38
37
  // "past the cap" reads as "the next ask will offer it", and the next ask never does.
39
38
  function epic_tracked_reason(epic: number): string {
40
- return `tracked by epic #${String(epic)}, which offers it instead of the standalone half`
39
+ return `tracked by epic ${session_cite.issue(epic)}, which offers it instead of the standalone half`
41
40
  }
42
41
 
43
42
  // `--exclude` drops an issue from every bucket, so an excluded one lands here. Named for what it is,
@@ -55,8 +54,8 @@ interface ScopeContext {
55
54
  repo: string
56
55
  exclude: ReadonlyArray<number>
57
56
  // Which **opted-in** epic is withholding which issue — `epic_index.withheld_children`'s own answer,
58
- // the one the pool decided membership from, so the sentence and the decision cannot disagree
59
- // (joshuafolkken/kit#1668). A row in here is one an epic is genuinely offering instead.
57
+ // the one the pool decided membership from, so the sentence and the decision cannot disagree.
58
+ // A row in here is one an epic is genuinely offering instead.
60
59
  tracked: ReadonlyMap<number, number>
61
60
  }
62
61