@joshuafolkken/kit 1.1229.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 (939) 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 +24 -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 +27 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +18 -29
  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/.github/workflows/publish.yml +2 -0
  42. package/.vscode/tasks.json +14 -0
  43. package/CLAUDE.md +10 -61
  44. package/README.md +38 -57
  45. package/SECURITY.md +1 -1
  46. package/dist/CLAUDE.md +10 -61
  47. package/dist/commands/document-section-cli.js +42 -10
  48. package/dist/config-merge/index.js +11 -2
  49. package/dist/hooks/audit-provision.js +2 -2
  50. package/dist/hooks/batch-guard.js +7 -7
  51. package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
  52. package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
  53. package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
  54. package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
  55. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  56. package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
  57. package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
  58. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  59. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  60. package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
  61. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  62. package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
  63. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  64. package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
  65. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  66. package/dist/hooks/codex-hook-adapter.js +26 -21
  67. package/dist/hooks/duplicate-read-guard.js +8 -8
  68. package/dist/hooks/format-edited.js +4 -4
  69. package/dist/hooks/inputs.json +213 -197
  70. package/dist/hooks/investigation-guard.js +8 -8
  71. package/dist/hooks/pretool-guard.js +15 -15
  72. package/dist/hooks/session-lang.js +406 -8
  73. package/dist/hooks/stop-guard.js +122 -201
  74. package/dist/josh.js +540 -137
  75. package/dist/version/index.js +15 -13
  76. package/eslint/base.js +43 -5
  77. package/eslint/rules/english-only-prose.js +3 -3
  78. package/eslint/rules/import.js +12 -0
  79. package/eslint/rules/namespace-object-export.js +2 -2
  80. package/package.json +16 -10
  81. package/pnpm-workspace.yaml +2 -4
  82. package/prompts/coding-standards.md +14 -48
  83. package/prompts/collaboration-workflow/file-edits.md +1 -1
  84. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  85. package/prompts/collaboration-workflow/issue-template.md +4 -10
  86. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  87. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  88. package/prompts/collaboration-workflow/overview.md +1 -1
  89. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  90. package/prompts/collaboration-workflow/principles.md +21 -3
  91. package/prompts/collaboration-workflow/report-format.md +16 -29
  92. package/prompts/collaboration-workflow/residency.md +1 -1
  93. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  94. package/prompts/collaboration-workflow/shell-body.md +3 -23
  95. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  96. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  97. package/prompts/refactoring.md +1 -1
  98. package/prompts/review-rubric.md +3 -22
  99. package/prompts/review.md +15 -38
  100. package/prompts/testing-guide.md +2 -4
  101. package/scripts/adopt/adopt-logic.ts +5 -5
  102. package/scripts/adopt/adopt-toolkits.ts +4 -5
  103. package/scripts/adopt/adopt.ts +2 -3
  104. package/scripts/agent/agent-argv.ts +7 -7
  105. package/scripts/agent/agent-diagnostics.ts +2 -2
  106. package/scripts/agent/agent-exit-record.ts +1 -1
  107. package/scripts/agent/agent-headless.ts +1 -1
  108. package/scripts/agent/agent-launch-environment.ts +6 -1
  109. package/scripts/agent/agent-role-profile.ts +49 -22
  110. package/scripts/agent/agent-session-role.ts +32 -0
  111. package/scripts/agent/api-outage.ts +1 -1
  112. package/scripts/agent/claude-agent-argv.ts +4 -4
  113. package/scripts/agent/claude-result-event.ts +4 -4
  114. package/scripts/agent/codex-hooks.ts +2 -2
  115. package/scripts/agent/interactive-ask.ts +3 -6
  116. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  117. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  118. package/scripts/backlog/backlog-arrival.ts +54 -17
  119. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  120. package/scripts/backlog/backlog-budget.ts +17 -24
  121. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  122. package/scripts/backlog/backlog-drive-args.ts +5 -4
  123. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  124. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  125. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  126. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  127. package/scripts/backlog/backlog-drive-named.ts +39 -9
  128. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  129. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  130. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  131. package/scripts/backlog/backlog-drive.ts +43 -28
  132. package/scripts/backlog/backlog-idle.ts +88 -0
  133. package/scripts/backlog/backlog-named.ts +11 -15
  134. package/scripts/backlog/backlog-next.ts +26 -30
  135. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  136. package/scripts/backlog/backlog-offer.ts +7 -7
  137. package/scripts/backlog/backlog-overlap.ts +178 -0
  138. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  139. package/scripts/backlog/backlog-plan-read.ts +111 -0
  140. package/scripts/backlog/backlog-plan.ts +11 -10
  141. package/scripts/backlog/backlog-pool.ts +13 -14
  142. package/scripts/backlog/backlog-rank.ts +11 -11
  143. package/scripts/backlog/backlog-ready.ts +15 -10
  144. package/scripts/backlog/backlog-scope.ts +14 -15
  145. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  146. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  147. package/scripts/backlog/backlog-stalled.ts +5 -6
  148. package/scripts/backlog/backlog-waves.ts +4 -4
  149. package/scripts/backlog/backlogrun-args.ts +74 -0
  150. package/scripts/backlog/backlogrun-cli.ts +113 -0
  151. package/scripts/backlog/backlogrun-launch.ts +178 -0
  152. package/scripts/behavior/behavior-assertion.ts +6 -8
  153. package/scripts/behavior/behavior-cli.ts +1 -1
  154. package/scripts/behavior/behavior-rules.ts +3 -3
  155. package/scripts/build/build-claude-md.ts +4 -4
  156. package/scripts/build/build-codex-hooks.ts +2 -2
  157. package/scripts/build/build-commands.ts +1 -1
  158. package/scripts/build/build-hooks.ts +5 -5
  159. package/scripts/build/build.ts +1 -1
  160. package/scripts/build/hook-bundle-stamp.ts +109 -7
  161. package/scripts/build/local-bin.ts +2 -2
  162. package/scripts/cases/cases-cli.ts +1 -1
  163. package/scripts/cases/cases-logic.ts +2 -2
  164. package/scripts/ci/composite-actions.ts +1 -2
  165. package/scripts/ci/pr-classification.ts +2 -2
  166. package/scripts/claude/workflow-destination.ts +1 -1
  167. package/scripts/clone/clone-aggregate.ts +1 -1
  168. package/scripts/clone/clone-fingerprint.ts +1 -1
  169. package/scripts/clone/clone-scan-cli.ts +1 -1
  170. package/scripts/clone/clone-scan.ts +1 -1
  171. package/scripts/config-merge/index.ts +1 -1
  172. package/scripts/config-merge/json-format.ts +1 -3
  173. package/scripts/config-merge/patch-json-array.ts +90 -0
  174. package/scripts/config-merge/patch-json-key.ts +6 -3
  175. package/scripts/config-merge/patch-json-list.ts +1 -1
  176. package/scripts/cost-runtime/codex-usage.ts +1 -1
  177. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  178. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  179. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  180. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  181. package/scripts/cost-runtime/cost-cli.ts +14 -11
  182. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  183. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  184. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  185. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  186. package/scripts/cost-runtime/cost-usage.ts +6 -7
  187. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  188. package/scripts/cost-runtime/own-session.ts +1 -1
  189. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  190. package/scripts/delegation/delegation-cli.ts +4 -4
  191. package/scripts/delegation/delegation-policy.ts +13 -15
  192. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  193. package/scripts/delegation/fanout-cli.ts +1 -1
  194. package/scripts/delegation/fanout.ts +1 -1
  195. package/scripts/delegation/investigation-guard.ts +18 -22
  196. package/scripts/delegation/investigation-reads.ts +48 -238
  197. package/scripts/discovery/repo-discovery.ts +1 -1
  198. package/scripts/discovery/repo-map-logic.ts +1 -2
  199. package/scripts/discovery/repo-origin.ts +3 -3
  200. package/scripts/discovery/repo-party-cli.ts +2 -2
  201. package/scripts/discovery/repo-party.ts +2 -2
  202. package/scripts/doctor/doctor-consumer.ts +1 -1
  203. package/scripts/doctor/doctor-io.ts +6 -7
  204. package/scripts/doctor/doctor-logic.ts +1 -1
  205. package/scripts/doctor/doctor-ports.ts +1 -1
  206. package/scripts/doctor/doctor.ts +8 -9
  207. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  208. package/scripts/document/bash-output-cap.ts +5 -7
  209. package/scripts/document/capped-print-part.ts +1 -1
  210. package/scripts/document/capped-print.ts +1 -1
  211. package/scripts/document/document-byte-budget.ts +33 -64
  212. package/scripts/document/document-byte-check.ts +4 -4
  213. package/scripts/document/document-reachability.ts +7 -8
  214. package/scripts/document/document-read-cli.ts +2 -2
  215. package/scripts/document/document-scan.ts +26 -2
  216. package/scripts/document/document-section-cli.ts +6 -8
  217. package/scripts/document/document-section.ts +8 -12
  218. package/scripts/document/edit-files-cli.ts +3 -4
  219. package/scripts/document/entry-read-budget.ts +8 -70
  220. package/scripts/document/entry-read-set.ts +51 -34
  221. package/scripts/document/lane-child-read-set.ts +9 -9
  222. package/scripts/document/read-files-cli.ts +1 -2
  223. package/scripts/document/read-set-cli.ts +16 -19
  224. package/scripts/document/read-set-cost.ts +4 -4
  225. package/scripts/document/read-set-point-of-use.ts +28 -38
  226. package/scripts/document/read-set-pricing.ts +1 -1
  227. package/scripts/document/read-set-trim.ts +3 -3
  228. package/scripts/document/resident-budget.ts +8 -10
  229. package/scripts/epic/epic-add-body.ts +15 -18
  230. package/scripts/epic/epic-add-plan.ts +26 -28
  231. package/scripts/epic/epic-add.ts +32 -25
  232. package/scripts/epic/epic-audit-checks.ts +27 -37
  233. package/scripts/epic/epic-audit-cli.ts +21 -22
  234. package/scripts/epic/epic-audit-orphans.ts +16 -17
  235. package/scripts/epic/epic-audit-rationale.ts +10 -15
  236. package/scripts/epic/epic-audit-report.ts +2 -5
  237. package/scripts/epic/epic-audit.ts +18 -14
  238. package/scripts/epic/epic-body.ts +10 -10
  239. package/scripts/epic/epic-bundle-cli.ts +36 -34
  240. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  241. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  242. package/scripts/epic/epic-bundle-poll.ts +1 -1
  243. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  244. package/scripts/epic/epic-bundle.ts +19 -20
  245. package/scripts/epic/epic-busy.ts +44 -21
  246. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  247. package/scripts/epic/epic-chains.ts +18 -23
  248. package/scripts/epic/epic-classify.ts +11 -12
  249. package/scripts/epic/epic-cli-argv.ts +5 -6
  250. package/scripts/epic/epic-cli-remove.ts +9 -4
  251. package/scripts/epic/epic-cli.ts +38 -26
  252. package/scripts/epic/epic-close-comment.ts +14 -15
  253. package/scripts/epic/epic-close.ts +25 -29
  254. package/scripts/epic/epic-cross-repo.ts +18 -21
  255. package/scripts/epic/epic-decision.ts +14 -18
  256. package/scripts/epic/epic-fetch.ts +25 -31
  257. package/scripts/epic/epic-graph.ts +15 -17
  258. package/scripts/epic/epic-index.ts +14 -16
  259. package/scripts/epic/epic-issue.ts +9 -11
  260. package/scripts/epic/epic-label-age.ts +74 -0
  261. package/scripts/epic/epic-lane-offer.ts +35 -24
  262. package/scripts/epic/epic-nested.ts +1 -1
  263. package/scripts/epic/epic-next-read.ts +8 -8
  264. package/scripts/epic/epic-next-views.ts +12 -12
  265. package/scripts/epic/epic-next.ts +29 -33
  266. package/scripts/epic/epic-outside-blocker.ts +11 -10
  267. package/scripts/epic/epic-parse.ts +22 -24
  268. package/scripts/epic/epic-promote.ts +3 -2
  269. package/scripts/epic/epic-rank.ts +1 -1
  270. package/scripts/epic/epic-read.ts +10 -8
  271. package/scripts/epic/epic-reconcile.ts +8 -6
  272. package/scripts/epic/epic-reference.ts +5 -4
  273. package/scripts/epic/epic-relation-recheck.ts +10 -11
  274. package/scripts/epic/epic-relations.ts +9 -8
  275. package/scripts/epic/epic-remove-plan.ts +4 -5
  276. package/scripts/epic/epic-remove.ts +7 -5
  277. package/scripts/epic/epic-report.ts +18 -20
  278. package/scripts/epic/epic-run.ts +6 -5
  279. package/scripts/epic/epic-sections.ts +2 -2
  280. package/scripts/epic/epic-shape.ts +3 -3
  281. package/scripts/epic/epic-solo-stale.ts +3 -2
  282. package/scripts/epic/epic-solo.ts +8 -8
  283. package/scripts/epic/epic-triage.ts +5 -4
  284. package/scripts/epic/epic-validate.ts +8 -7
  285. package/scripts/epic/epic.ts +5 -5
  286. package/scripts/exports/unused-members-cli.ts +1 -1
  287. package/scripts/followup/followup-issue-number.ts +1 -2
  288. package/scripts/followup/git-followup-cleanup.ts +6 -7
  289. package/scripts/followup/git-followup-finish.ts +11 -13
  290. package/scripts/followup/git-followup-flush.ts +11 -7
  291. package/scripts/followup/git-followup-issue-close.ts +16 -13
  292. package/scripts/followup/git-followup-label.ts +9 -6
  293. package/scripts/followup/git-followup-merged.ts +1 -1
  294. package/scripts/followup/git-followup-pending.ts +7 -9
  295. package/scripts/followup/git-followup-stages.ts +28 -17
  296. package/scripts/followup/git-followup-workflow.ts +19 -21
  297. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  298. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  299. package/scripts/followup/git-pr-followup.ts +18 -17
  300. package/scripts/gate/core-admission.ts +162 -0
  301. package/scripts/gate/core-budget.ts +134 -91
  302. package/scripts/gate/gate-ledger.ts +114 -0
  303. package/scripts/gate/gate-log.ts +7 -9
  304. package/scripts/gate/gate-plan.ts +103 -35
  305. package/scripts/gate/gate-report.ts +39 -21
  306. package/scripts/gate/gate-skip.ts +11 -13
  307. package/scripts/gate/gate-steps.ts +5 -1
  308. package/scripts/gate/gate-tree.ts +3 -4
  309. package/scripts/gate/hook-gate-reuse.ts +9 -9
  310. package/scripts/gate/machine-capacity.ts +313 -0
  311. package/scripts/gate/pre-commit-type-check.ts +4 -4
  312. package/scripts/gate/project-checks.ts +12 -4
  313. package/scripts/gate/scoped-green.ts +11 -18
  314. package/scripts/gate/type-check-command.ts +2 -2
  315. package/scripts/gate/type-check-step.ts +4 -4
  316. package/scripts/gate/verification-gate.ts +60 -53
  317. package/scripts/gh/gh-spawn.ts +2 -2
  318. package/scripts/gh/git-ai-review-scan.ts +3 -2
  319. package/scripts/gh/git-gh-api-path.ts +10 -11
  320. package/scripts/gh/git-gh-exec.ts +43 -48
  321. package/scripts/gh/git-gh-failure.ts +6 -9
  322. package/scripts/gh/git-gh-helpers.ts +1 -1
  323. package/scripts/gh/git-gh-issue-list.ts +15 -19
  324. package/scripts/gh/git-gh-issue-read.ts +43 -60
  325. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  326. package/scripts/gh/git-gh-issue-write.ts +52 -40
  327. package/scripts/gh/git-gh-issue.ts +23 -24
  328. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  329. package/scripts/gh/git-gh-pr-read.ts +46 -50
  330. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  331. package/scripts/gh/git-gh-pr-review.ts +2 -2
  332. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  333. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  334. package/scripts/gh/git-gh-pr.ts +16 -16
  335. package/scripts/gh/git-gh-reachability.ts +11 -12
  336. package/scripts/gh/git-gh-repo.ts +2 -3
  337. package/scripts/gh/git-gh-rest-state.ts +1 -1
  338. package/scripts/gh/git-pr-ai-review.ts +6 -5
  339. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  340. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  341. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  342. package/scripts/gh/git-pr-checks.ts +20 -23
  343. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  344. package/scripts/gh/git-pr-confirmation.ts +5 -5
  345. package/scripts/gh/git-pr-managed-config.ts +7 -9
  346. package/scripts/gh/git-pr-messages.ts +1 -1
  347. package/scripts/gh/git-pr.ts +15 -16
  348. package/scripts/gh/github-issue-url.ts +8 -9
  349. package/scripts/git/base-tree.ts +66 -0
  350. package/scripts/git/change-base.ts +42 -2
  351. package/scripts/git/changed-file-scope.ts +5 -5
  352. package/scripts/git/changed-paths.ts +1 -2
  353. package/scripts/git/constants.ts +2 -2
  354. package/scripts/git/git-branch.ts +1 -1
  355. package/scripts/git/git-closes-keyword.ts +3 -3
  356. package/scripts/git/git-command.ts +53 -41
  357. package/scripts/git/git-common-directory.ts +3 -3
  358. package/scripts/git/git-diff-reads.ts +14 -15
  359. package/scripts/git/git-error.ts +1 -1
  360. package/scripts/git/git-execa-error.ts +1 -2
  361. package/scripts/git/git-issue.ts +10 -8
  362. package/scripts/git/git-location-environment.ts +3 -4
  363. package/scripts/git/git-ls-remote.ts +6 -8
  364. package/scripts/git/git-pre-push-hook.ts +11 -10
  365. package/scripts/git/git-preflight.ts +5 -5
  366. package/scripts/git/git-push-transport.ts +2 -2
  367. package/scripts/git/git-remote-branch.ts +1 -2
  368. package/scripts/git/git-schemas.ts +16 -23
  369. package/scripts/git/git-spawn-sync.ts +1 -1
  370. package/scripts/git/git-spawn.ts +37 -14
  371. package/scripts/git/git-ssh-keepalive.ts +12 -5
  372. package/scripts/git/git-staging.ts +7 -8
  373. package/scripts/git/git-workflow.ts +1 -1
  374. package/scripts/git/git-worktree.ts +35 -27
  375. package/scripts/git/gone-branch.ts +2 -2
  376. package/scripts/git/listing-cutoff.ts +1 -2
  377. package/scripts/git/lockfile-sync.ts +65 -0
  378. package/scripts/git/main-merge-guard.ts +1 -2
  379. package/scripts/git/main-merge.ts +7 -7
  380. package/scripts/git/main-sync.ts +23 -8
  381. package/scripts/git/parse-json-array.ts +18 -23
  382. package/scripts/git/repository-lock.ts +34 -2
  383. package/scripts/git/stash/git-stash.ts +4 -5
  384. package/scripts/git/stash/stash-orphans.ts +5 -3
  385. package/scripts/git/stash/stash-pop-args.ts +1 -1
  386. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  387. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  388. package/scripts/hooks/batch-guard.ts +11 -13
  389. package/scripts/hooks/check-commit-message.ts +12 -9
  390. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  391. package/scripts/hooks/edited-cspell.ts +3 -4
  392. package/scripts/hooks/format-edited-cli.ts +1 -1
  393. package/scripts/hooks/format-edited-file.ts +11 -17
  394. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  395. package/scripts/hooks/pre-push-unit.ts +10 -14
  396. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  397. package/scripts/hooks/pretool-guard.ts +93 -18
  398. package/scripts/hooks/reserved-run.ts +2 -2
  399. package/scripts/hooks/step-zero-notice.ts +1 -1
  400. package/scripts/hooks/stop-guard.ts +21 -10
  401. package/scripts/init/basic-path-migration.ts +2 -2
  402. package/scripts/init/claude-kit-only-settings.ts +2 -2
  403. package/scripts/init/claude-plugin-config.ts +2 -2
  404. package/scripts/init/distributed-paths.ts +4 -4
  405. package/scripts/init/hook-command-rewrite.ts +3 -3
  406. package/scripts/init/hook-launch.ts +5 -5
  407. package/scripts/init/init-actions.ts +13 -0
  408. package/scripts/init/init-ai-copy.ts +11 -11
  409. package/scripts/init/init-bootstrap.ts +3 -3
  410. package/scripts/init/init-copy-content.ts +4 -4
  411. package/scripts/init/init-logic-json-merge.ts +7 -9
  412. package/scripts/init/init-logic-migrate.ts +1 -1
  413. package/scripts/init/init-logic-templates.ts +1 -1
  414. package/scripts/init/init-logic-workspace.ts +4 -4
  415. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  416. package/scripts/init/init-logic.ts +19 -22
  417. package/scripts/init/init.ts +12 -8
  418. package/scripts/init/kit-base-preset.ts +1 -1
  419. package/scripts/init/kit-setup-state.ts +1 -1
  420. package/scripts/init/kit-written-paths.ts +1 -2
  421. package/scripts/init/package-manager-pin.ts +35 -0
  422. package/scripts/init/project-profile-cli.ts +1 -1
  423. package/scripts/init/project-profile.ts +3 -3
  424. package/scripts/init/session-language-environment.ts +1 -1
  425. package/scripts/init/start-exec.ts +3 -4
  426. package/scripts/init/start-plan.ts +2 -2
  427. package/scripts/init/start-setup-pr.ts +3 -2
  428. package/scripts/init/start-steps.ts +2 -2
  429. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  430. package/scripts/init/vscode-tasks.ts +62 -0
  431. package/scripts/issue/baseline-measure.ts +2 -2
  432. package/scripts/issue/behavior-change-lint.ts +2 -2
  433. package/scripts/issue/defect-rate-cli.ts +6 -7
  434. package/scripts/issue/defect-rate.ts +37 -27
  435. package/scripts/issue/git-next-issues.ts +9 -8
  436. package/scripts/issue/issue-auto-ok.ts +49 -11
  437. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  438. package/scripts/issue/issue-backlinks.ts +6 -6
  439. package/scripts/issue/issue-cite-cli.ts +20 -18
  440. package/scripts/issue/issue-cite.ts +18 -8
  441. package/scripts/issue/issue-closing-pr.ts +4 -4
  442. package/scripts/issue/issue-comment-cli.ts +6 -4
  443. package/scripts/issue/issue-file-cli.ts +75 -15
  444. package/scripts/issue/issue-file-fold.ts +155 -0
  445. package/scripts/issue/issue-file.ts +14 -6
  446. package/scripts/issue/issue-fold-cli.ts +14 -9
  447. package/scripts/issue/issue-fold.ts +23 -8
  448. package/scripts/issue/issue-labels.ts +46 -37
  449. package/scripts/issue/issue-lint-cli.ts +2 -2
  450. package/scripts/issue/issue-lint.ts +1 -1
  451. package/scripts/issue/issue-merged.ts +10 -4
  452. package/scripts/issue/issue-number-shape.ts +27 -0
  453. package/scripts/issue/issue-rank.ts +1 -1
  454. package/scripts/issue/issue-read-cli.ts +4 -5
  455. package/scripts/issue/issue-read.ts +4 -5
  456. package/scripts/issue/issue-reference.ts +5 -5
  457. package/scripts/issue/issue-release-cli.ts +165 -0
  458. package/scripts/issue/issue-release.ts +58 -0
  459. package/scripts/issue/issue-report-failures.ts +7 -4
  460. package/scripts/issue/issue-scout-cli.ts +11 -11
  461. package/scripts/issue/issue-scout-closed.ts +4 -4
  462. package/scripts/issue/issue-scout.ts +4 -5
  463. package/scripts/issue/issue-state-cli.ts +17 -10
  464. package/scripts/issue/issue-state.ts +12 -13
  465. package/scripts/issue/issue-wip.ts +7 -7
  466. package/scripts/issue/markdown-section.ts +3 -3
  467. package/scripts/issue/measure-rerun-cli.ts +10 -9
  468. package/scripts/issue/reproduction-measure.ts +3 -3
  469. package/scripts/issue/session-cite.ts +56 -0
  470. package/scripts/josh/agent-session-environment.ts +10 -8
  471. package/scripts/josh/cli-body.ts +2 -2
  472. package/scripts/josh/command-suggest.ts +1 -1
  473. package/scripts/josh/file-map-stamp.ts +20 -23
  474. package/scripts/josh/hook-decision.ts +24 -28
  475. package/scripts/josh/josh-command-map.ts +4 -1
  476. package/scripts/josh/josh-command-types.ts +32 -34
  477. package/scripts/josh/josh-commands-ai.ts +6 -6
  478. package/scripts/josh/josh-commands-backlog.ts +15 -3
  479. package/scripts/josh/josh-commands-clone.ts +1 -1
  480. package/scripts/josh/josh-commands-development.ts +33 -4
  481. package/scripts/josh/josh-commands-document.ts +3 -3
  482. package/scripts/josh/josh-commands-guard.ts +3 -3
  483. package/scripts/josh/josh-commands-issue.ts +11 -5
  484. package/scripts/josh/josh-commands-lane.ts +16 -5
  485. package/scripts/josh/josh-commands-lint.ts +1 -1
  486. package/scripts/josh/josh-commands-maintenance.ts +2 -2
  487. package/scripts/josh/josh-commands-run.ts +20 -6
  488. package/scripts/josh/josh-commands-split.ts +1 -2
  489. package/scripts/josh/josh-commands-versioning.ts +5 -5
  490. package/scripts/josh/josh-commands-workflow.ts +30 -22
  491. package/scripts/josh/josh-environment-file.ts +1 -1
  492. package/scripts/josh/josh-in-process.ts +3 -3
  493. package/scripts/josh/josh-logic.ts +10 -10
  494. package/scripts/josh/josh-run.ts +3 -3
  495. package/scripts/josh/josh-verdict.ts +9 -12
  496. package/scripts/josh/josh.ts +3 -3
  497. package/scripts/josh/kit-only.ts +2 -2
  498. package/scripts/josh/path-decision.ts +3 -3
  499. package/scripts/josh/platform-temporary.ts +7 -5
  500. package/scripts/josh/process-identity.ts +24 -6
  501. package/scripts/josh/process-owner.ts +4 -4
  502. package/scripts/josh/session-language-cli.ts +53 -11
  503. package/scripts/josh/session-language.ts +1 -1
  504. package/scripts/josh/stamp-file.ts +48 -29
  505. package/scripts/josh/stamp-record.ts +57 -0
  506. package/scripts/lane/lane-await.ts +35 -11
  507. package/scripts/lane/lane-cache.ts +6 -6
  508. package/scripts/lane/lane-capacity.ts +32 -17
  509. package/scripts/lane/lane-child-invocation.ts +17 -15
  510. package/scripts/lane/lane-child-marker.ts +12 -12
  511. package/scripts/lane/lane-cli.ts +20 -13
  512. package/scripts/lane/lane-close.ts +6 -6
  513. package/scripts/lane/lane-dispatch.ts +61 -72
  514. package/scripts/lane/lane-environment.ts +5 -5
  515. package/scripts/lane/lane-guard-policy.ts +7 -21
  516. package/scripts/lane/lane-handoff.ts +2 -2
  517. package/scripts/lane/lane-install.ts +9 -10
  518. package/scripts/lane/lane-launch-cli.ts +13 -8
  519. package/scripts/lane/lane-ledger.ts +73 -11
  520. package/scripts/lane/lane-leftover.ts +44 -30
  521. package/scripts/lane/lane-limit-cli.ts +160 -0
  522. package/scripts/lane/lane-limit-override.ts +74 -0
  523. package/scripts/lane/lane-load.ts +19 -68
  524. package/scripts/lane/lane-measure-cli.ts +15 -25
  525. package/scripts/lane/lane-occupancy.ts +6 -4
  526. package/scripts/lane/lane-open.ts +25 -24
  527. package/scripts/lane/lane-output.ts +4 -3
  528. package/scripts/lane/lane-paths.ts +22 -8
  529. package/scripts/lane/lane-phase.ts +33 -0
  530. package/scripts/lane/lane-reap.ts +2 -2
  531. package/scripts/lane/lane-registry.ts +27 -15
  532. package/scripts/lane/lane-relaunch.ts +9 -9
  533. package/scripts/lane/lane-report.ts +5 -4
  534. package/scripts/lane/lane-resume.ts +2 -2
  535. package/scripts/lane/lane-sampler.ts +55 -0
  536. package/scripts/lane/lane-seed.ts +7 -7
  537. package/scripts/lane/lane-stage-stats.ts +135 -0
  538. package/scripts/lane/lane-start-point.ts +8 -11
  539. package/scripts/lane/lane-stats.ts +60 -15
  540. package/scripts/lane/lane-stray.ts +140 -0
  541. package/scripts/lane/lane-vacant.ts +1 -1
  542. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  543. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  544. package/scripts/lane/openai-review-broker.ts +2 -4
  545. package/scripts/lib/ancestor-directories.ts +1 -1
  546. package/scripts/lib/bounded-pool.ts +2 -2
  547. package/scripts/lib/buffered-process.ts +4 -6
  548. package/scripts/lib/caddy-logs.sh +0 -0
  549. package/scripts/lib/cli-flags.ts +39 -6
  550. package/scripts/lib/error-message.ts +1 -1
  551. package/scripts/lib/json-value.ts +17 -3
  552. package/scripts/lib/poll.ts +1 -1
  553. package/scripts/lib/status-icons.ts +3 -3
  554. package/scripts/lib/timed-fetch.ts +1 -1
  555. package/scripts/lib/timeouts.ts +1 -1
  556. package/scripts/lines/bytes-command.ts +3 -4
  557. package/scripts/lines/effective-limit.ts +25 -12
  558. package/scripts/lines/line-budget.ts +47 -55
  559. package/scripts/lines/line-targets.ts +6 -2
  560. package/scripts/lines/lines-command.ts +3 -3
  561. package/scripts/lint/cspell-cached.ts +1 -1
  562. package/scripts/lint/cycle-recheck.ts +122 -0
  563. package/scripts/lint/format.ts +1 -2
  564. package/scripts/lint/lint-parallel.ts +34 -19
  565. package/scripts/lint/lint-related-scope.ts +25 -15
  566. package/scripts/lint/lint-related.ts +6 -7
  567. package/scripts/managed-marker/index.ts +1 -1
  568. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  569. package/scripts/notify/git-notify.ts +9 -7
  570. package/scripts/notify/telegram-notify.ts +53 -37
  571. package/scripts/notify/telegram-test-logic.ts +3 -3
  572. package/scripts/notify/telegram-test.ts +45 -30
  573. package/scripts/observations/observation-ledger-home.ts +14 -8
  574. package/scripts/observations/observation-ledger-line.ts +3 -2
  575. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  576. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  577. package/scripts/observations/observation-ledger.ts +14 -15
  578. package/scripts/observations/observation-record-cli.ts +83 -0
  579. package/scripts/observations/observation-record.ts +91 -0
  580. package/scripts/observations/observations-flush-cli.ts +1 -1
  581. package/scripts/observations/observations-flush-landing.ts +7 -6
  582. package/scripts/observations/observations-flush.ts +26 -27
  583. package/scripts/overrides/overrides-check.ts +18 -8
  584. package/scripts/package/package-scout-cli.ts +1 -1
  585. package/scripts/package/package-scout-format.ts +2 -2
  586. package/scripts/package/package-scout.ts +1 -1
  587. package/scripts/propagate/propagate-git-failure.ts +1 -1
  588. package/scripts/propagate/propagate-git.ts +7 -7
  589. package/scripts/propagate/propagate-plan.ts +2 -2
  590. package/scripts/propagate/propagate-publish.ts +2 -3
  591. package/scripts/propagate/propagate-run.ts +5 -7
  592. package/scripts/propagate/propagate-select.ts +1 -1
  593. package/scripts/propagate/propagate-steps.ts +19 -20
  594. package/scripts/propagate/propagate-targets.ts +6 -10
  595. package/scripts/propagate/propagate.ts +5 -5
  596. package/scripts/refactor/import-graph.ts +1 -1
  597. package/scripts/refactor/refactor-lint.ts +4 -10
  598. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  599. package/scripts/refactor/refactor-scan.ts +2 -2
  600. package/scripts/refactor/refactor-targets.ts +1 -1
  601. package/scripts/release/github-release-cli.ts +25 -3
  602. package/scripts/release/github-release-environment.ts +1 -0
  603. package/scripts/release/github-release-runs.ts +115 -0
  604. package/scripts/release/github-release.ts +13 -67
  605. package/scripts/release/release-cli.ts +21 -4
  606. package/scripts/release/release-history.ts +6 -10
  607. package/scripts/release/release-plan.ts +3 -3
  608. package/scripts/release/release-progress.ts +3 -4
  609. package/scripts/release/release-publish.ts +8 -9
  610. package/scripts/release/release-scope-cli.ts +8 -10
  611. package/scripts/release/release-tag.ts +6 -8
  612. package/scripts/release/release-worktree.ts +5 -5
  613. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  614. package/scripts/repo/auto-merge-setting.ts +1 -1
  615. package/scripts/repo/repo-setting.ts +4 -4
  616. package/scripts/repo/repository-labels.ts +1 -1
  617. package/scripts/repo/required-checks-logic.ts +3 -3
  618. package/scripts/repo/required-checks-report.ts +1 -1
  619. package/scripts/repo/ruleset-check-cli.ts +1 -1
  620. package/scripts/repo/ruleset-check.ts +1 -1
  621. package/scripts/report/report-format-reference.ts +26 -0
  622. package/scripts/report/report-lint-cli.ts +2 -2
  623. package/scripts/report/report-lint.ts +16 -2
  624. package/scripts/review/disposition-cli.ts +2 -2
  625. package/scripts/review/disposition-logic.ts +1 -1
  626. package/scripts/review/live-evidence.ts +9 -6
  627. package/scripts/review/review-attest-cli.ts +1 -2
  628. package/scripts/review/review-attest.ts +3 -3
  629. package/scripts/review/review-brief-cli.ts +19 -20
  630. package/scripts/review/review-brief.ts +29 -32
  631. package/scripts/review/review-checkout.ts +2 -2
  632. package/scripts/review/review-diff-parts.ts +3 -5
  633. package/scripts/review/review-diff-write.ts +1 -1
  634. package/scripts/review/review-finding-ledger.ts +7 -4
  635. package/scripts/review/review-findings-cli.ts +2 -2
  636. package/scripts/review/review-level.ts +4 -7
  637. package/scripts/review/review-record-cli.ts +73 -16
  638. package/scripts/review/review-record.ts +5 -4
  639. package/scripts/review/review-round2-cli.ts +2 -3
  640. package/scripts/review/review-round2.ts +13 -21
  641. package/scripts/review/review-stamps.ts +9 -71
  642. package/scripts/review/review-tree.ts +4 -5
  643. package/scripts/rules/bash-triggers.ts +4 -4
  644. package/scripts/rules/decision-oracle-batch.ts +5 -6
  645. package/scripts/rules/decision-oracle-stage.ts +1 -1
  646. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  647. package/scripts/rules/decision-oracle.ts +2 -2
  648. package/scripts/rules/delivered-rules.ts +61 -406
  649. package/scripts/rules/destructive-command.ts +2 -2
  650. package/scripts/rules/direct-filing.ts +4 -4
  651. package/scripts/rules/direct-pr-create.ts +2 -2
  652. package/scripts/rules/early-heartbeat.ts +15 -19
  653. package/scripts/rules/file-body.ts +5 -6
  654. package/scripts/rules/filing-cap.ts +6 -7
  655. package/scripts/rules/filing-offer.ts +1 -1
  656. package/scripts/rules/firing-point.ts +6 -6
  657. package/scripts/rules/gh-api.ts +2 -2
  658. package/scripts/rules/git-argv.ts +3 -3
  659. package/scripts/rules/git-force.ts +2 -2
  660. package/scripts/rules/hook-context-line.ts +31 -0
  661. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  662. package/scripts/rules/implementation-cut.ts +35 -32
  663. package/scripts/rules/index-guard.ts +2 -2
  664. package/scripts/rules/issue-citation.ts +7 -7
  665. package/scripts/rules/issue-comments.ts +21 -13
  666. package/scripts/rules/josh-git-bare.ts +2 -2
  667. package/scripts/rules/lane-background.ts +14 -16
  668. package/scripts/rules/lane-carry-conflict.ts +41 -5
  669. package/scripts/rules/lane-interactive-ask.ts +6 -9
  670. package/scripts/rules/lane-park.ts +12 -16
  671. package/scripts/rules/lane-split-park.ts +1 -2
  672. package/scripts/rules/lane-switch-main.ts +10 -13
  673. package/scripts/rules/last-prompt.ts +1 -1
  674. package/scripts/rules/oracle-consulted.ts +5 -5
  675. package/scripts/rules/oracle-firing.ts +6 -9
  676. package/scripts/rules/oracle-list-cli.ts +2 -2
  677. package/scripts/rules/permission-guards.ts +2 -2
  678. package/scripts/rules/piped-verification.ts +79 -9
  679. package/scripts/rules/poll-loop.ts +9 -11
  680. package/scripts/rules/pre-gate-cut.ts +33 -30
  681. package/scripts/rules/prior-comment-read.ts +3 -3
  682. package/scripts/rules/protected-files.ts +25 -13
  683. package/scripts/rules/raw-field-body.ts +3 -4
  684. package/scripts/rules/reply-language.ts +1 -1
  685. package/scripts/rules/rule-body-guard.ts +10 -12
  686. package/scripts/rules/rule-guard.ts +1 -1
  687. package/scripts/rules/rule-list.ts +51 -0
  688. package/scripts/rules/rule-registry-rows.ts +282 -0
  689. package/scripts/rules/rule-registry.ts +109 -0
  690. package/scripts/rules/rule-value-cache.ts +2 -2
  691. package/scripts/rules/rule-value-cli.ts +6 -4
  692. package/scripts/rules/rule-value.ts +61 -22
  693. package/scripts/rules/run-tail-rule.ts +11 -15
  694. package/scripts/rules/shell-body-trigger.ts +7 -7
  695. package/scripts/rules/shell-segments.ts +2 -4
  696. package/scripts/rules/stop-rules.ts +54 -41
  697. package/scripts/rules/tail-commands.ts +1 -1
  698. package/scripts/rules/test-declared-commit.ts +2 -2
  699. package/scripts/rules/third-party-write.ts +3 -3
  700. package/scripts/rules/worktree-guard.ts +12 -5
  701. package/scripts/run/add/run-add-cli.ts +165 -0
  702. package/scripts/run/add/run-add.ts +124 -0
  703. package/scripts/run/board/run-board-cli.ts +207 -0
  704. package/scripts/run/board/run-board-closed.ts +95 -0
  705. package/scripts/run/board/run-board-every.ts +60 -0
  706. package/scripts/run/board/run-board-fetch.ts +38 -0
  707. package/scripts/run/board/run-board-fit.ts +219 -0
  708. package/scripts/run/board/run-board-github.ts +162 -0
  709. package/scripts/run/board/run-board-header.ts +275 -0
  710. package/scripts/run/board/run-board-kind.ts +35 -0
  711. package/scripts/run/board/run-board-labels.ts +299 -0
  712. package/scripts/run/board/run-board-layout.ts +222 -0
  713. package/scripts/run/board/run-board-link.ts +31 -0
  714. package/scripts/run/board/run-board-machine.ts +198 -0
  715. package/scripts/run/board/run-board-notes.ts +103 -0
  716. package/scripts/run/board/run-board-phase.ts +136 -0
  717. package/scripts/run/board/run-board-plan.ts +129 -0
  718. package/scripts/run/board/run-board-read.ts +62 -0
  719. package/scripts/run/board/run-board-render-legend.ts +82 -0
  720. package/scripts/run/board/run-board-render-notes.ts +77 -0
  721. package/scripts/run/board/run-board-render-slot.ts +50 -0
  722. package/scripts/run/board/run-board-render.ts +407 -0
  723. package/scripts/run/board/run-board-scope.ts +17 -0
  724. package/scripts/run/board/run-board-screen.ts +43 -0
  725. package/scripts/run/board/run-board-span.ts +66 -0
  726. package/scripts/run/board/run-board-spin.ts +115 -0
  727. package/scripts/run/board/run-board-state.ts +113 -0
  728. package/scripts/run/board/run-board-status.ts +279 -0
  729. package/scripts/run/board/run-board-tick.ts +210 -0
  730. package/scripts/run/board/run-board-track.ts +22 -0
  731. package/scripts/run/board/run-board-usage-read.ts +255 -0
  732. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  733. package/scripts/run/board/run-board-usage-text.ts +80 -0
  734. package/scripts/run/board/run-board-usage.ts +165 -0
  735. package/scripts/run/carry/run-carry-added.ts +62 -0
  736. package/scripts/run/carry/run-carry-args.ts +25 -22
  737. package/scripts/run/carry/run-carry-change.ts +1 -1
  738. package/scripts/run/carry/run-carry-cli.ts +71 -48
  739. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  740. package/scripts/run/carry/run-carry-ended.ts +85 -0
  741. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  742. package/scripts/run/carry/run-carry-stash.ts +3 -2
  743. package/scripts/run/carry/run-carry-streak.ts +8 -10
  744. package/scripts/run/carry/run-carry.ts +85 -89
  745. package/scripts/run/cut/run-cut-args.ts +7 -7
  746. package/scripts/run/cut/run-cut-cli.ts +68 -37
  747. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  748. package/scripts/run/cut/run-cut-report.ts +37 -16
  749. package/scripts/run/cut/run-cut.ts +63 -77
  750. package/scripts/run/detached-launch.ts +35 -50
  751. package/scripts/run/entry/run-entry-cli.ts +48 -27
  752. package/scripts/run/entry/run-entry-stop.ts +7 -9
  753. package/scripts/run/entry/run-entry.ts +5 -6
  754. package/scripts/run/event/run-event-cli.ts +5 -6
  755. package/scripts/run/event/run-event-filed.ts +69 -0
  756. package/scripts/run/event/run-event-follow.ts +3 -3
  757. package/scripts/run/event/run-event-plan.ts +38 -0
  758. package/scripts/run/event/run-event-render.ts +10 -4
  759. package/scripts/run/event/run-event-scope.ts +47 -18
  760. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  761. package/scripts/run/event/run-event-stream.ts +172 -43
  762. package/scripts/run/event/run-event-watch.ts +4 -6
  763. package/scripts/run/hold/run-hold-cli.ts +65 -62
  764. package/scripts/run/hold/run-hold.ts +88 -46
  765. package/scripts/run/merge/run-merge-cli.ts +116 -77
  766. package/scripts/run/merge/run-merge-collect.ts +107 -0
  767. package/scripts/run/merge/run-merge-steps.ts +112 -65
  768. package/scripts/run/merge/run-merge-token.ts +30 -0
  769. package/scripts/run/merge/run-merge.ts +31 -22
  770. package/scripts/run/progress/run-progress-args.ts +4 -4
  771. package/scripts/run/progress/run-progress-cli.ts +39 -50
  772. package/scripts/run/progress/run-progress-clock.ts +25 -32
  773. package/scripts/run/progress/run-progress-config.ts +6 -9
  774. package/scripts/run/progress/run-progress-read.ts +9 -10
  775. package/scripts/run/progress/run-progress.ts +48 -53
  776. package/scripts/run/review/run-review-cli.ts +6 -6
  777. package/scripts/run/review/run-review-steps.ts +6 -6
  778. package/scripts/run/review/run-review.ts +9 -11
  779. package/scripts/run/run-cli-fault.ts +29 -0
  780. package/scripts/run/run-ending-cli.ts +3 -3
  781. package/scripts/run/run-ending.ts +10 -14
  782. package/scripts/run/run-halfrun-resume.ts +6 -8
  783. package/scripts/run/run-headless.ts +25 -12
  784. package/scripts/run/run-invocation.ts +17 -22
  785. package/scripts/run/run-label.ts +7 -5
  786. package/scripts/run/run-liveness-cli.ts +19 -6
  787. package/scripts/run/run-liveness.ts +27 -38
  788. package/scripts/run/run-next-cli.ts +5 -9
  789. package/scripts/run/run-next.ts +4 -5
  790. package/scripts/run/run-parent-cut-hook.ts +10 -12
  791. package/scripts/run/run-preflight.ts +25 -29
  792. package/scripts/run/run-prep-cli.ts +17 -13
  793. package/scripts/run/run-prep-locate.ts +4 -5
  794. package/scripts/run/run-prep.ts +7 -10
  795. package/scripts/run/run-prrun-resume.ts +2 -2
  796. package/scripts/run/run-report-cli.ts +4 -4
  797. package/scripts/run/run-report.ts +9 -14
  798. package/scripts/run/run-retrospective.ts +3 -3
  799. package/scripts/run/run-section.ts +42 -0
  800. package/scripts/run/run-stage-read.ts +2 -2
  801. package/scripts/run/run-stage.ts +6 -4
  802. package/scripts/run/run-status-cli.ts +7 -5
  803. package/scripts/run/run-status.ts +6 -7
  804. package/scripts/run/run-step-cli.ts +13 -15
  805. package/scripts/run/run-step.ts +62 -48
  806. package/scripts/run/run-stop-notify.ts +7 -8
  807. package/scripts/run/run-stranded-cli.ts +1 -1
  808. package/scripts/run/run-stranded-detect.ts +4 -4
  809. package/scripts/run/run-stranded.ts +11 -13
  810. package/scripts/run/run-tail-cli.ts +15 -16
  811. package/scripts/run/run-tail.ts +14 -33
  812. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  813. package/scripts/run/run-watcher-guard.ts +11 -12
  814. package/scripts/run/run-watcher-hook.ts +6 -12
  815. package/scripts/run/ship/run-ship-cli.ts +67 -33
  816. package/scripts/run/ship/run-ship-detach.ts +15 -13
  817. package/scripts/run/ship/run-ship-lock.ts +1 -1
  818. package/scripts/run/ship/run-ship-next.ts +7 -8
  819. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  820. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  821. package/scripts/run/ship/run-ship-probe.ts +4 -4
  822. package/scripts/run/ship/run-ship-return.ts +1 -1
  823. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  824. package/scripts/run/ship/run-ship-review.ts +12 -14
  825. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  826. package/scripts/run/ship/run-ship-stage.ts +80 -26
  827. package/scripts/run/ship/run-ship-steps.ts +26 -16
  828. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  829. package/scripts/run/ship/run-ship-sync.ts +9 -8
  830. package/scripts/run/ship/run-ship.ts +17 -32
  831. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  832. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  833. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  834. package/scripts/run/tidy/run-tidy.ts +4 -3
  835. package/scripts/run/wake/run-wake-cli.ts +27 -33
  836. package/scripts/run/wake/run-wake-describe.ts +76 -29
  837. package/scripts/run/wake/run-wake-driver.ts +14 -14
  838. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  839. package/scripts/run/wake/run-wake-loop.ts +13 -21
  840. package/scripts/run/wake/run-wake-restart.ts +4 -5
  841. package/scripts/run/wake/run-wake-session.ts +23 -27
  842. package/scripts/run/wake/run-wake.ts +57 -328
  843. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  844. package/scripts/safe-chain/pack-hook.ts +2 -2
  845. package/scripts/safe-chain/preinstall-command.ts +2 -2
  846. package/scripts/security/security-audit-logic.ts +1 -1
  847. package/scripts/security/security-audit-provision-logic.ts +1 -1
  848. package/scripts/security/security-audit-provision.ts +2 -2
  849. package/scripts/security/security-audit.ts +5 -5
  850. package/scripts/security/security-updates-logic.ts +2 -3
  851. package/scripts/security/security-updates.ts +2 -4
  852. package/scripts/self-sync-guard/index.ts +1 -1
  853. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  854. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  855. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  856. package/scripts/sonar/sonar-hotspots.ts +1 -1
  857. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  858. package/scripts/sonar/sonar-new-code.ts +1 -1
  859. package/scripts/sonar/sonar-project.ts +1 -1
  860. package/scripts/split/split-assess-cli.ts +1 -1
  861. package/scripts/split/split-assess.ts +3 -3
  862. package/scripts/sync/directory-copy-guard.ts +2 -3
  863. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  864. package/scripts/sync/managed-config-scope.ts +4 -4
  865. package/scripts/sync/plugin-skill-directories.ts +2 -2
  866. package/scripts/sync/reconcile-templates.ts +17 -8
  867. package/scripts/sync/removed-skill-manifest.ts +2 -3
  868. package/scripts/sync/sync-ai-files.ts +7 -7
  869. package/scripts/sync/sync-configs.ts +30 -3
  870. package/scripts/sync/sync-hook-safety.ts +2 -2
  871. package/scripts/sync/sync.ts +23 -10
  872. package/scripts/sync/synced-paths.ts +2 -1
  873. package/scripts/sync/workflow-pin-logic.ts +1 -1
  874. package/scripts/test/test-declared-changed.ts +4 -4
  875. package/scripts/test/test-declared-logic.ts +2 -3
  876. package/scripts/test/test-declared-match.ts +25 -4
  877. package/scripts/test/test-declared.ts +26 -9
  878. package/scripts/test/test-red-commit.ts +3 -2
  879. package/scripts/test/test-red-logic.ts +7 -14
  880. package/scripts/test/test-red.ts +12 -47
  881. package/scripts/test/test-related-scope.ts +2 -3
  882. package/scripts/test/test-related.ts +3 -3
  883. package/scripts/test/test-type-logic.ts +1 -2
  884. package/scripts/test/test-unit-guard.ts +13 -17
  885. package/scripts/test/unit-worker-share.ts +7 -8
  886. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  887. package/scripts/time-runtime/time-background.ts +17 -21
  888. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  889. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  890. package/scripts/time-runtime/time-bundles.ts +11 -12
  891. package/scripts/time-runtime/time-call-identity.ts +1 -1
  892. package/scripts/time-runtime/time-command-key.ts +2 -2
  893. package/scripts/time-runtime/time-density-hook.ts +8 -11
  894. package/scripts/time-runtime/time-density.ts +5 -5
  895. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  896. package/scripts/time-runtime/time-format.ts +5 -5
  897. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  898. package/scripts/time-runtime/time-instant.ts +1 -1
  899. package/scripts/time-runtime/time-markers.ts +15 -19
  900. package/scripts/time-runtime/time-phase-names.ts +3 -3
  901. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  902. package/scripts/time-runtime/time-round-trips.ts +20 -23
  903. package/scripts/time-runtime/time-shell.ts +8 -8
  904. package/scripts/time-runtime/time-single-check.ts +1 -2
  905. package/scripts/time-runtime/time-spans.ts +35 -40
  906. package/scripts/time-runtime/time-tool-call.ts +15 -16
  907. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  908. package/scripts/time-runtime/time-writes.ts +5 -5
  909. package/scripts/ui/ui-routes-cli.ts +1 -2
  910. package/scripts/ui/ui-routes.ts +1 -2
  911. package/scripts/version/bump-version.ts +1 -1
  912. package/scripts/version/fresh-metadata-cache.ts +2 -2
  913. package/scripts/version/latest-corepack.ts +129 -98
  914. package/scripts/version/latest-lane-guard.ts +1 -1
  915. package/scripts/version/latest-scope-cli.ts +2 -2
  916. package/scripts/version/latest-stamp.ts +1 -2
  917. package/scripts/version/latest-update.ts +2 -2
  918. package/scripts/version/npm-registry.ts +2 -2
  919. package/scripts/version/package-manager-version.ts +18 -0
  920. package/scripts/version/publishable-range-check.ts +2 -1
  921. package/scripts/version/publishable-range.ts +1 -1
  922. package/scripts/version/release-age.ts +11 -11
  923. package/scripts/version/release-hold.ts +2 -2
  924. package/scripts/version/safe-chain-version-update.ts +3 -3
  925. package/scripts/version/version-check-logic.ts +2 -3
  926. package/scripts/version/version-check.ts +1 -2
  927. package/scripts/version/version-command-config.ts +2 -2
  928. package/scripts/version/version-commands.ts +3 -3
  929. package/scripts/version/version-remote.ts +4 -4
  930. package/scripts/version/version-targets.ts +2 -2
  931. package/templates/gitignore +7 -0
  932. package/templates/workflows/github-release.yml +4 -0
  933. package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
  934. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  935. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  936. package/scripts/backlog/backlog-restructure.ts +0 -152
  937. package/scripts/rules/issue-fold-rule.ts +0 -72
  938. package/scripts/rules/wip-cap.ts +0 -63
  939. package/scripts/run/run-issue-number.ts +0 -19
@@ -0,0 +1,88 @@
1
+ import { backlog_budget, type BudgetInput } from './backlog-budget'
2
+
3
+ // The idle watch as a window a person can read: when the run began waiting on
4
+ // an empty backlog, when the wait ends, and which bound ends it. Without it the moment the wait began
5
+ // would live only in `backlog:drive`'s memory as `--active`, so a reader of the event stream could
6
+ // tell the run was waiting but not until when. The budget names the
7
+ // window, `backlog:offer` records it as an `idle` event, and `run:board` reads it back — all through the
8
+ // text written and parsed here, so the three never spell it differently.
9
+
10
+ type IdleBound = 'idle' | 'whole-run'
11
+
12
+ interface IdleWindow {
13
+ since_ms: number
14
+ until_ms: number
15
+ // Which bound ends the wait: the idle budget running out, or the whole-run bound arriving first.
16
+ bound: IdleBound
17
+ // When the watching loop last asked the backlog — the poll the next one is counted from.
18
+ asked_ms: number
19
+ }
20
+
21
+ const TEXT_PATTERN =
22
+ /^idle since (?<since>\S+) until (?<until>\S+) \((?<bound>idle|whole-run)\) asked (?<asked>\S+)$/u
23
+ const IDLE_BOUND: IdleBound = 'idle'
24
+ const WHOLE_RUN_BOUND: IdleBound = 'whole-run'
25
+
26
+ // The window an idle watch opened at `active_at_ms` runs for, as asked at `now_ms`, or `undefined` when
27
+ // the watch is off. The wait ends at the earlier of the idle budget and the whole-run bound — the order
28
+ // `decide` applies.
29
+ function window_of(input: BudgetInput): IdleWindow | undefined {
30
+ if (input.idle_budget_ms === undefined) return undefined
31
+
32
+ const idle_until = input.active_at_ms + input.idle_budget_ms
33
+ const run_until = input.started_at_ms + backlog_budget.WHOLE_RUN_BUDGET_MS
34
+ const bound = run_until < idle_until ? WHOLE_RUN_BOUND : IDLE_BOUND
35
+
36
+ return {
37
+ since_ms: input.active_at_ms,
38
+ until_ms: Math.min(idle_until, run_until),
39
+ bound,
40
+ asked_ms: input.now_ms,
41
+ }
42
+ }
43
+
44
+ function iso_of(ms: number): string {
45
+ return new Date(ms).toISOString()
46
+ }
47
+
48
+ function text_of(window: IdleWindow): string {
49
+ const { since_ms, until_ms, bound, asked_ms } = window
50
+
51
+ return `idle since ${iso_of(since_ms)} until ${iso_of(until_ms)} (${bound}) asked ${iso_of(asked_ms)}`
52
+ }
53
+
54
+ function is_bound(value: string | undefined): value is IdleBound {
55
+ return value === IDLE_BOUND || value === WHOLE_RUN_BOUND
56
+ }
57
+
58
+ // A malformed stamp reads as no window rather than as `NaN`, so a mangled line is never drawn.
59
+ function window_from(groups: Record<string, string>, bound: IdleBound): IdleWindow | undefined {
60
+ const since_ms = Date.parse(String(groups['since']))
61
+ const until_ms = Date.parse(String(groups['until']))
62
+ const asked_ms = Date.parse(String(groups['asked']))
63
+
64
+ return Number.isNaN(since_ms + until_ms + asked_ms)
65
+ ? undefined
66
+ : { since_ms, until_ms, bound, asked_ms }
67
+ }
68
+
69
+ function parse(text: string): IdleWindow | undefined {
70
+ const groups = TEXT_PATTERN.exec(text)?.groups
71
+
72
+ if (groups === undefined || !is_bound(groups['bound'])) return undefined
73
+
74
+ return window_from(groups, groups['bound'])
75
+ }
76
+
77
+ // The next time the watching loop asks the backlog again: one `IDLE_POLL_MINUTES` after the ask the
78
+ // stream recorded, never past the end of the wait — the interval `idle_watch_reason` tells the loop.
79
+ function next_check_ms(window: IdleWindow): number {
80
+ const poll_ms = backlog_budget.IDLE_POLL_MINUTES * backlog_budget.MS_PER_MINUTE
81
+
82
+ return Math.min(window.asked_ms + poll_ms, window.until_ms)
83
+ }
84
+
85
+ const backlog_idle = { next_check_ms, parse, text_of, window_of }
86
+
87
+ export { backlog_idle }
88
+ export type { IdleBound, IdleWindow }
@@ -1,18 +1,16 @@
1
- // The named-issue prefix of a `backlogrun` invocation (joshuafolkken/kit#1984). `backlogrun #N1 #N2 …`
1
+ // The named-issue prefix of a `backlogrun` invocation. `backlogrun #N1 #N2 …`
2
2
  // runs the issues typed after the keyword in the order they were typed, one at a time, and only once
3
3
  // they are all done does the opted-in backlog drain. This module is the single source of that order
4
4
  // and of what a failure partway through it does, so the plan a person reads (`backlog:plan`) and the
5
5
  // loop that runs it (`backlogrun.md`) cannot disagree.
6
6
  //
7
- // **It replaces the old `queue` keyword.** `queue #N1 #N2 …` was a separate entry point for exactly
8
- // this sequential run; folding it in means one command carries both the named prefix and the backlog
9
- // that follows it, under one authorization and one carried budget.
7
+ // **One command carries both the named prefix and the backlog that follows it**, under one
8
+ // authorization and one carried budget, rather than a separate entry point for the sequential run.
10
9
  //
11
- // **A named item is a single issue or an epic** (joshuafolkken/kit#1985, folding in the old `epicrun`
12
- // keyword). A single-issue item is one `fullrun`; an epic item runs every child in dependency order,
13
- // across the free lanes, and is done only once every child has been processed — merged or parked. The
14
- // run does not advance to the next named item until the epic item is complete, which is `epicrun`'s
15
- // whole-epic execution at the granularity of one named item.
10
+ // **A named item is a single issue or an epic.** A single-issue item is one `fullrun`; an epic item
11
+ // runs every child in dependency order, across the free lanes, and is done only once every child has
12
+ // been processed — merged or parked. The run does not advance to the next named item until the epic
13
+ // item is complete, so a whole epic executes at the granularity of one named item.
16
14
 
17
15
  const NAMED_KIND = 'named'
18
16
  const BACKLOG_KIND = 'backlog'
@@ -51,12 +49,11 @@ type PlanStep = NamedStep | BacklogStep
51
49
  // A named issue that could not finish parks like any other child; what is specific to a sequential run
52
50
  // is that the issues declared *after* it are not started — the order was the point of naming them. What
53
51
  // follows is the pool by default, or nothing under `--only`, so the run then drains the opted-in
54
- // backlog or ends (joshuafolkken/kit#1984).
52
+ // backlog or ends.
55
53
  //
56
54
  // **This skip only applies to a single-issue item.** An epic item does not park as a unit — its
57
55
  // children park individually and the epic item completes anyway (`epic_item_outcome`), so a parked
58
- // epic child, which is never in the named list, skips nothing and the run advances to the next item
59
- // (joshuafolkken/kit#1985).
56
+ // epic child, which is never in the named list, skips nothing and the run advances to the next item.
60
57
  interface FailureOutcome {
61
58
  parked: number
62
59
  skipped: ReadonlyArray<number>
@@ -65,8 +62,7 @@ interface FailureOutcome {
65
62
 
66
63
  // The completion of one epic named item. It runs every child and finishes once each has been
67
64
  // processed; the children that parked are carried here so the completion report can list them, and the
68
- // item is complete regardless — a parked child never holds up the next named item
69
- // (joshuafolkken/kit#1985).
65
+ // item is complete regardless — a parked child never holds up the next named item.
70
66
  interface EpicItemOutcome {
71
67
  epic: number
72
68
  parked: ReadonlyArray<number>
@@ -130,7 +126,7 @@ function after_failure(
130
126
  // An epic named item is complete once every child has been processed — merged or parked. The parked
131
127
  // children are carried out so the completion report can list them, and the item is complete either
132
128
  // way: a parked epic child does not hold up the next named item, which is `epicrun`'s park-and-continue
133
- // at the granularity of one named epic item (joshuafolkken/kit#1985).
129
+ // at the granularity of one named epic item.
134
130
  function epic_item_outcome(
135
131
  epic: number,
136
132
  children: ReadonlyArray<EpicChildOutcome>,
@@ -15,18 +15,17 @@ import { git_gh_command } from '#scripts/gh/git-gh-command'
15
15
  import { PROJECT_ROOT } from '#scripts/init/init-paths'
16
16
  import { issue_citation } from '#scripts/rules/issue-citation'
17
17
  import { backlog_defect_priority } from './backlog-defect-priority'
18
+ import { backlog_overlap } from './backlog-overlap'
18
19
  import { backlog_pool } from './backlog-pool'
19
20
  import { backlog_rank, type GateScope } from './backlog-rank'
20
- import { backlog_restructure } from './backlog-restructure'
21
21
 
22
- // `josh backlog:next` — what the whole opted-in backlog may run next (joshuafolkken/kit#1630).
22
+ // `josh backlog:next` — what the whole opted-in backlog may run next.
23
23
  //
24
- // The answer used to be split in two, and neither half could give it. `epic:next` has the dependency
25
- // graph and the execution wave, but its input is **one epic's task list**. `auto-ok:next` sees the
26
- // whole backlog, but it orders by the display's newest-first ranking and reads no dependency at all.
27
- // So there was no route that asked the backlog itself what may start.
24
+ // Neither half alone can give the answer. `epic:next` has the dependency graph and the execution
25
+ // wave, but its input is **one epic's task list**. `auto-ok:next` sees the whole backlog, but it
26
+ // orders by the display's newest-first ranking and reads no dependency at all.
28
27
  //
29
- // This command is that route, and it is glue rather than a third implementation: the epic half runs
28
+ // This command is the route that asks the backlog itself what may start, and it is glue rather than a third implementation: the epic half runs
30
29
  // through `epic:next`'s own read → classify → report pipeline unchanged, the standalone half through
31
30
  // `auto-ok:next`'s own listing and runnability rules, and the verdict comes from
32
31
  // `epic_report.decide_verdict` so it cannot drift from what `epic:next` means by the same word.
@@ -48,7 +47,7 @@ const READ_FAILURES: Readonly<Record<Exclude<OptedInRead['kind'], 'read'>, strin
48
47
  unreadable: auto_ok_cli.UNREADABLE_MESSAGE,
49
48
  }
50
49
 
51
- // What `retry` says that `error` cannot (joshuafolkken/kit#1663).
50
+ // What `retry` says that `error` cannot.
52
51
  //
53
52
  // The anomaly `epic:next` raises for a child it could not read tells the reader to check
54
53
  // `gh auth status` and that the issue exists — correct for the failure it was written for, and
@@ -68,7 +67,7 @@ const RETRY_MESSAGE =
68
67
  // member none of them can produce — and `VERDICT_LINES` a line nothing ever prints. The token is a
69
68
  // backlog-level answer about the transport, not a reading of one epic's graph.
70
69
  //
71
- // `triage` is `epic:next`'s word as well as this command's (joshuafolkken/kit#2779), but it is decided
70
+ // `triage` is `epic:next`'s word as well as this command's, but it is decided
72
71
  // after the graph is read rather than from it, so it stays `epic_triage`'s type too.
73
72
  type BacklogVerdict = EpicVerdict | 'retry' | TriageVerdict
74
73
 
@@ -100,7 +99,7 @@ interface PoolContext {
100
99
  //
101
100
  // **The tokens are scoped to this repository, which is `epic:next --repo`'s shape exactly.** An epic
102
101
  // may track a child elsewhere, and a bare number would send the loop reading this to *this*
103
- // repository's issue of that number — a different issue (joshuafolkken/kit#1016). Qualifying it
102
+ // repository's issue of that number — a different issue. Qualifying it
104
103
  // instead was tried and is worse: `--exclude` parses bare integers, so a loop feeding a qualified
105
104
  // token back would be answered with a usage error rather than an exclusion. So a child elsewhere
106
105
  // stays out of the tokens, and `run` becomes `wait` when this repository has none — the same mapping
@@ -134,7 +133,7 @@ function warn_gaps(context: PoolContext, has_answer: boolean): void {
134
133
  function report(result: EpicNextResult, context: PoolContext): number {
135
134
  warn_gaps(context, result.verdict === 'run')
136
135
  // The explanation names epics and children as `#N` (`tracked by epic #N`); linkified so the text a
137
- // run reads carries clickable references rather than bare ones (joshuafolkken/kit#2329). The stdout
136
+ // run reads carries clickable references rather than bare ones. The stdout
138
137
  // tokens below are bare numbers by contract — a loop feeds them back to `--exclude` — so they are
139
138
  // left untouched.
140
139
  const explanation = epic_report.format_result(result, context.repo)
@@ -178,8 +177,7 @@ function combine(views: ReadonlyArray<EpicView>, context: PoolContext): EpicNext
178
177
  })
179
178
 
180
179
  // The same checkout map `epic:next` hands `build_result`. Without it every bundle heading reads
181
- // `(no local checkout)`, including this repository's own — the misreport joshuafolkken/kit#864
182
- // fixed on that path.
180
+ // `(no local checkout)`, including this repository's own.
183
181
  return epic_report.build_result(
184
182
  backlog_pool.merge_classifications(from_epics, from_standalone),
185
183
  [
@@ -192,8 +190,7 @@ function combine(views: ReadonlyArray<EpicView>, context: PoolContext): EpicNext
192
190
 
193
191
  // The epic half and the standalone half settled against each other: an epic child a person has to
194
192
  // resolve can make a standalone row wait on that person, and that row can in turn hold an epic child.
195
- // Each pass only shrinks the set, so the walk ends at the first pass that removes nothing
196
- // (joshuafolkken/kit#1943).
193
+ // Each pass only shrinks the set, so the walk ends at the first pass that removes nothing.
197
194
  function settled_views(
198
195
  reads: ReadonlyArray<EpicRead>,
199
196
  running: ReadonlySet<string>,
@@ -215,7 +212,7 @@ function settled_views(
215
212
  // walk rather than the only one.
216
213
  //
217
214
  // The running set covers the standalone rows as well as every read graph, so an epic child waiting on
218
- // an opted-in standalone issue waits rather than stops (joshuafolkken/kit#1943).
215
+ // an opted-in standalone issue waits rather than stops.
219
216
  function views_from(reads: ReadonlyArray<EpicRead>, context: PoolContext): ReadonlyArray<EpicView> {
220
217
  if (reads.length === 0) return []
221
218
 
@@ -230,8 +227,8 @@ function views_from(reads: ReadonlyArray<EpicRead>, context: PoolContext): Reado
230
227
 
231
228
  // The reads and the classification, with none of the printing `backlog:next` then does with them.
232
229
  //
233
- // `backlog:plan` renders this same pool as a plan a person reads before the run starts
234
- // (joshuafolkken/kit#1652), so the seam is cut here rather than a second read-and-classify path
230
+ // `backlog:plan` renders this same pool as a plan a person reads before the run starts,
231
+ // so the seam is cut here rather than a second read-and-classify path
235
232
  // being written beside it: the plan and the run cannot disagree about what may start, because there
236
233
  // is one answer and two renderings of it. `undefined` is the refusal — already reported.
237
234
  async function resolve(context: PoolContext): Promise<EpicNextResult | undefined> {
@@ -249,7 +246,7 @@ async function resolve(context: PoolContext): Promise<EpicNextResult | undefined
249
246
  }
250
247
 
251
248
  // The defect priority and the ranking keys are applied here rather than when printing, so
252
- // `backlog:plan` shows the order the run takes (joshuafolkken/kit#2455, joshuafolkken/kit#2928). The
249
+ // `backlog:plan` shows the order the run takes. The
253
250
  // ranking goes last: its sort is stable, so the defect order survives as its final key.
254
251
  const ordered = await backlog_defect_priority.prioritize(
255
252
  combine(views_from(reads, context), context),
@@ -261,11 +258,10 @@ async function resolve(context: PoolContext): Promise<EpicNextResult | undefined
261
258
 
262
259
  // Whether the `error` verdict is really a transport failure wearing the graph's clothes.
263
260
  //
264
- // **The answer comes from the reads that failed, not from a request made afterwards**
265
- // (joshuafolkken/kit#1690). joshuafolkken/kit#1663 asked a reachability probe here, once the answer
266
- // was otherwise final — and a connection that dropped for a few hundred milliseconds failed the read
267
- // at t=0 and answered that probe `reachable`, leaving the verdict `error` for a fault that had
268
- // already healed. Judging one request from a different one cannot be made reliable, so the failed
261
+ // **The answer comes from the reads that failed, not from a request made afterwards**. A later
262
+ // reachability probe can answer `reachable` after a connection that dropped for a few hundred
263
+ // milliseconds already failed the read, leaving the verdict `error` for a fault that had already
264
+ // healed. Judging one request from a different one cannot be made reliable, so the failed
269
265
  // request carries its own nature instead: `epic:next` marks the anomaly from the status GitHub wrote
270
266
  // on the failed response, and this reads the mark.
271
267
  function is_transport_failure(result: EpicNextResult): boolean {
@@ -300,19 +296,19 @@ function standalone_keys(context: PoolContext): ReadonlySet<string> {
300
296
  }
301
297
 
302
298
  // The running lanes still carry the pickup label, so the opted-in listing holds their bodies too —
303
- // which is what lets a candidate be held back from a restructure a running lane already makes
304
- // (joshuafolkken/kit#3221). `backlog:plan --waves` reads the same scope, so its first wave is this offer.
299
+ // which is what lets a candidate be held back from a path a running lane already declares.
300
+ // `backlog:plan --waves` reads the same scope, so its first wave is this offer.
305
301
  function gate_scope(context: PoolContext): GateScope {
306
302
  return {
307
303
  standalone: standalone_keys(context),
308
- declared: backlog_restructure.declared_of(context.opted_in.issues),
304
+ declared: backlog_overlap.declared_of(context.opted_in.issues),
309
305
  }
310
306
  }
311
307
 
312
308
  // The `run:solo` gate is applied here rather than in `resolve`, because `backlog:plan` shares
313
- // `resolve` and a plan made before the run lists everything (joshuafolkken/kit#2776). The holders are
309
+ // `resolve` and a plan made before the run lists everything. The holders are
314
310
  // read only on a `run` answer — the one answer the gate can change. The cap follows the gate
315
- // (`backlog-rank.ts`, joshuafolkken/kit#2928).
311
+ // (`backlog-rank.ts`).
316
312
  async function gate_solo(result: EpicNextResult, context: PoolContext): Promise<EpicNextResult> {
317
313
  if (result.verdict !== 'run') return result
318
314
 
@@ -331,7 +327,7 @@ async function gate_solo(result: EpicNextResult, context: PoolContext): Promise<
331
327
  return gated.result
332
328
  }
333
329
 
334
- // An untriaged candidate withholds every candidate (joshuafolkken/kit#2779). Checked before the
330
+ // An untriaged candidate withholds every candidate. Checked before the
335
331
  // `run:solo` gate, which cannot be applied to an issue whose label is not recorded yet; the numbers go
336
332
  // to standard error, the one token to standard output.
337
333
  function report_triage(context: PoolContext, untriaged: ReadonlyArray<EpicChild>): number {
@@ -2,17 +2,18 @@
2
2
  import { fileURLToPath } from 'node:url'
3
3
  import { josh_command } from '#scripts/josh/josh-run'
4
4
  import { cli_flags } from '#scripts/lib/cli-flags'
5
+ import { json_value } from '#scripts/lib/json-value'
5
6
  import { rule_value_cache } from '#scripts/rules/rule-value-cache'
6
7
  import { run_event_stream } from '#scripts/run/event/run-event-stream'
7
8
  import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
8
9
  import { z } from 'zod'
9
10
  import { backlog_offer, type OfferAnswer } from './backlog-offer'
10
11
 
11
- // `josh backlog:offer` — one composite command for a `backlogrun` loop-head event
12
- // (joshuafolkken/kit#2162). The loop used to spend a turn on `backlog:next` and a second turn feeding
12
+ // `josh backlog:offer` — one composite command for a `backlogrun` loop-head event.
13
+ // Without it the loop spends a turn on `backlog:next` and a second turn feeding
13
14
  // its answer, translated to a word by hand, into `backlog:budget`; the parent's context is largest
14
15
  // here, so collapsing the two saves the turn where a turn costs the most — the same reasoning
15
- // `run:merge` collapsed a merge event on.
16
+ // `run:merge` collapses a merge event on.
16
17
  //
17
18
  // **The contract matches the path-decided commands': stdout carries the budget verdict on its first
18
19
  // line**, then — only on `run` — the issue numbers to start, one per line, so a loop reads the branch
@@ -28,7 +29,7 @@ const DEFAULT_COUNT = 0
28
29
  const RUN_VERDICT = 'run'
29
30
  const BUDGET_JSON_KEY = 'budget'
30
31
  // The one budget verdict and mapped answer that name a drain, plus the running count that means the run
31
- // has nothing of its own in flight (joshuafolkken/kit#2335). Read together in `mark_drain`.
32
+ // has nothing of its own in flight. Read together in `mark_drain`.
32
33
  const WATCH_VERDICT = 'watch'
33
34
  const STOP_VERDICT = 'stop'
34
35
  const EXHAUSTED_ANSWER = 'exhausted'
@@ -124,27 +125,26 @@ const budget_read_schema = z.object({
124
125
  [BUDGET_JSON_KEY]: z.string(),
125
126
  reason: z.string(),
126
127
  is_finish: z.boolean(),
128
+ idle: z.string().optional(),
127
129
  })
128
130
 
129
131
  interface BudgetRead {
130
132
  verdict: string
131
133
  reason: string
132
134
  is_finish: boolean
135
+ // The idle watch's window, as `backlog_idle.text_of` wrote it, when the budget opened one.
136
+ idle?: string | undefined
133
137
  }
134
138
 
135
139
  function budget_of(out: string): BudgetRead | undefined {
136
- try {
137
- const parsed = budget_read_schema.safeParse(JSON.parse(out))
138
-
139
- return parsed.success
140
- ? {
141
- verdict: parsed.data[BUDGET_JSON_KEY],
142
- reason: parsed.data.reason,
143
- is_finish: parsed.data.is_finish,
144
- }
145
- : undefined
146
- } catch {
147
- return undefined
140
+ const read = json_value.parse_with(out, budget_read_schema)
141
+ if (read === undefined) return undefined
142
+
143
+ return {
144
+ verdict: read[BUDGET_JSON_KEY],
145
+ reason: read.reason,
146
+ is_finish: read.is_finish,
147
+ idle: read.idle,
148
148
  }
149
149
  }
150
150
 
@@ -192,13 +192,12 @@ function refuse(): number {
192
192
 
193
193
  // The drain: the backlog is empty (`exhausted`) and nothing of the run's own is in flight, so the run is
194
194
  // about to open its idle watch or stop with `--idle 0`. Marking once per drain with `emit_once`
195
- // is what lets `run:step` fire the end-of-run retrospective *before* the watch rather than after it
196
- // (joshuafolkken/kit#2335), so the improvement issues the retrospective files are what the watch then
195
+ // is what lets `run:step` fire the end-of-run retrospective *before* the watch rather than after it,
196
+ // so the improvement issues the retrospective files are what the watch then
197
197
  // picks up. A watch that opened while children were still merging (`running > 0`) is not this drain: the
198
198
  // retrospective waits for the true idle, and the marker is emitted from the loop head for the same
199
199
  // reason `run:merge` emits its own events — the command that detects the event owns writing it.
200
- // Returns whether this call wrote the marker, so `backlog:drive` stops once per drain
201
- // (joshuafolkken/kit#2508).
200
+ // Returns whether this call wrote the marker, so `backlog:drive` stops once per drain.
202
201
  async function mark_drain(verdict: string, answer: string, running: number): Promise<boolean> {
203
202
  if (answer !== EXHAUSTED_ANSWER || running !== NO_RUNNING) return false
204
203
  if (verdict !== WATCH_VERDICT && verdict !== STOP_VERDICT) return false
@@ -226,6 +225,12 @@ async function decide(values: ParsedValues, counts: OfferCounts): Promise<number
226
225
 
227
226
  await mark_drain(decision.verdict, offer.answer, counts.running)
228
227
 
228
+ // The idle window with the ask that read it, once per watching poll, so `run:board` counts the next
229
+ // check from the poll that ran rather than guessing one.
230
+ if (decision.idle !== undefined) {
231
+ await run_event_stream_emit.emit_changed(run_event_stream.EVENT_KIND.IDLE, decision.idle)
232
+ }
233
+
229
234
  return emit(decision, offer, values.json === true)
230
235
  }
231
236
 
@@ -236,9 +241,9 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
236
241
 
237
242
  // The loop head is the one place `rule:value` is read from: once per iteration, the parent's
238
243
  // context still small, so a rule that never fires shows up as a printed row rather than as
239
- // something a person has to remember to measure (joshuafolkken/kit#2271). It prints the cached
240
- // reading and refreshes it in a detached process, so the offer never waits on the measurement
241
- // (joshuafolkken/kit#2881), and it never fails, so a broken reading never stops the backlog.
244
+ // something a person has to remember to measure. It prints the cached
245
+ // reading and refreshes it in a detached process, so the offer never waits on the measurement,
246
+ // and it never fails, so a broken reading never stops the backlog.
242
247
  rule_value_cache.emit()
243
248
 
244
249
  const counts = counts_of(values)
@@ -1,23 +1,23 @@
1
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
1
2
  import type { BacklogAnswer } from './backlog-budget'
2
3
  import { backlog_next } from './backlog-next'
3
4
 
4
- // The mechanical half of `josh backlog:offer` (joshuafolkken/kit#2162): turn what `backlog:next`
5
+ // The mechanical half of `josh backlog:offer`: turn what `backlog:next`
5
6
  // answered — its stdout tokens and its exit code — into the one word `backlog:budget` is then asked
6
7
  // with, plus the issue numbers to start and the consecutive-retry count carried to the next ask.
7
8
  //
8
9
  // **The mapping is `docs/josh-commands-backlog.md` → "`josh backlog:offer`", held here so it cannot
9
10
  // drift.** It fixes which `backlog:next` answer becomes which `backlog:budget` word, and it carries two
10
- // context branches an agent once applied by hand every iteration: `wait` is `blocked` while this run
11
- // has children in flight and `exhausted` when it has none, and `retry` is `blocked` until the third
12
- // consecutive one, which is `unreadable`. Both are decided from a count here rather than from a
13
- // judgement (joshuafolkken/kit#3175 dropped the prose copy from `backlogrun-steps.md`).
11
+ // context branches an agent would otherwise apply by hand every iteration: `wait` is `blocked` while
12
+ // this run has children in flight and `exhausted` when it has none, and `retry` is `blocked` until the
13
+ // third consecutive one, which is `unreadable`. Both are decided from a count here rather than from a
14
+ // judgement.
14
15
 
15
16
  // Three consecutive `retry` answers end the run: below that a transport hiccup is re-asked, at it the
16
17
  // outage is not a hiccup. "`josh backlog:offer`" is the single source of the count.
17
18
  const RETRY_LIMIT = 3
18
19
  const FAILURE_EXIT_CODE = 1
19
20
  const NO_RETRIES = 0
20
- const NUMBER_PATTERN = /^[1-9]\d*$/u
21
21
 
22
22
  const TOKENS = backlog_next.VERDICT_TOKENS
23
23
 
@@ -70,7 +70,7 @@ function from_verdict(token: string, running: number, retries: number): OfferAns
70
70
  }
71
71
 
72
72
  function is_numbers(tokens: ReadonlyArray<string>): boolean {
73
- return tokens.length > 0 && tokens.every((token) => NUMBER_PATTERN.test(token))
73
+ return tokens.length > 0 && tokens.every((token) => issue_number_shape.is_issue_number(token))
74
74
  }
75
75
 
76
76
  // **Read the exit code before the tokens.** Exit 1 is "the listing could not be read", which is never
@@ -0,0 +1,178 @@
1
+ import type { BusyRead } from '#scripts/epic/epic-busy'
2
+ import type { EpicChild } from '#scripts/epic/epic-graph'
3
+ import type { SoloSelection } from '#scripts/epic/epic-solo'
4
+ import { session_cite } from '#scripts/issue/session-cite'
5
+
6
+ // Which candidates may not run side by side because their bodies declare overlapping paths.
7
+ // joshuafolkken/kit#3221 held back only a path both bodies named beside a move, split, rename or
8
+ // delete verb, on the reading that a plain overlap always merged mechanically. It did not:
9
+ // joshuafolkken/kit#3582 named `scripts/lines/effective-limit.ts`, joshuafolkken/kit#3586 named
10
+ // `scripts/lines/**`, and the two lanes met a content conflict that stopped the second ship
11
+ // (joshuafolkken/kit#3617). So any overlap now holds the later one back — the same file named by
12
+ // both, or a path inside the other's directory glob. A directory one segment deep (`scripts/`) is
13
+ // too broad to count, and an issue reference (`owner/repo#N`) is not a path. A dotted token with no
14
+ // `/` is a file only when its extension is one this repository keeps at the root — otherwise
15
+ // `session_cite.issue` or `process.env` would claim a path and serialize unrelated lanes.
16
+ const CODE_SPAN = /`([^`\s]+)`/gu
17
+ const LINE_SUFFIX = /:\d+(?:[-:]\d+)?$/u
18
+ const FILE_EXTENSION = /\.[a-z]\w*$/iu
19
+ const ROOT_FILE_EXTENSION = /\.(?:[cm]?[jt]sx?|svelte|jsonc?|md|ya?ml|css|html|sh|toml|txt)$/u
20
+ const GLOB = '*'
21
+ const ISSUE_MARK = '#'
22
+ const SEPARATOR = '/'
23
+ const MIN_DIRECTORY_DEPTH = 2
24
+
25
+ // The paths each issue declares, by issue number. A directory ends in `/`; anything else is a file.
26
+ type Declared = ReadonlyMap<number, ReadonlySet<string>>
27
+
28
+ interface DeclaringIssue {
29
+ number: number
30
+ body?: string | undefined
31
+ }
32
+
33
+ // `scripts/lines/**` and `scripts/lines/*.ts` declare `scripts/lines/`; a path with no glob is itself.
34
+ function without_glob(path: string): string {
35
+ const glob = path.indexOf(GLOB)
36
+
37
+ return glob === -1 ? path : path.slice(0, path.lastIndexOf(SEPARATOR, glob) + 1)
38
+ }
39
+
40
+ function is_narrow(directory: string): boolean {
41
+ return directory.split(SEPARATOR).filter(Boolean).length >= MIN_DIRECTORY_DEPTH
42
+ }
43
+
44
+ function is_file(path: string): boolean {
45
+ return (path.includes(SEPARATOR) ? FILE_EXTENSION : ROOT_FILE_EXTENSION).test(path)
46
+ }
47
+
48
+ function claim_of(path: string): string | undefined {
49
+ if (path.endsWith(SEPARATOR)) return is_narrow(path) ? path : undefined
50
+
51
+ return is_file(path) ? path : undefined
52
+ }
53
+
54
+ // The backticked files and directories `body` declares.
55
+ function declared_paths(body: string): ReadonlySet<string> {
56
+ const tokens = [...body.matchAll(CODE_SPAN)].map((match) => match[1] ?? '')
57
+ const paths = tokens
58
+ .filter((token) => !token.includes(ISSUE_MARK))
59
+ .map((token) => claim_of(without_glob(token.replace(LINE_SUFFIX, ''))))
60
+
61
+ return new Set(paths.filter((path) => path !== undefined))
62
+ }
63
+
64
+ function declared_of(issues: ReadonlyArray<DeclaringIssue>): Declared {
65
+ return new Map(issues.map((issue) => [issue.number, declared_paths(issue.body ?? '')]))
66
+ }
67
+
68
+ function contains(outer: string, inner: string): boolean {
69
+ return outer.endsWith(SEPARATOR) ? inner.startsWith(outer) : outer === inner
70
+ }
71
+
72
+ function overlaps(left: string, right: string): boolean {
73
+ return contains(left, right) || contains(right, left)
74
+ }
75
+
76
+ interface SeparateContext {
77
+ read: BusyRead
78
+ repo: string
79
+ }
80
+
81
+ // The path each running lane declares, mapped to the issue that holds it.
82
+ function running_claims(declared: Declared, read: BusyRead): Map<string, number> {
83
+ const holders = read.kind === 'busy' ? read.issues.map((issue) => issue.number) : []
84
+ const pairs = holders.flatMap((number) =>
85
+ [...(declared.get(number) ?? [])].map((path): [string, number] => [path, number]),
86
+ )
87
+
88
+ return new Map(pairs)
89
+ }
90
+
91
+ function paths_of(child: EpicChild, declared: Declared, repo: string): ReadonlySet<string> {
92
+ if (child.repo !== repo) return new Set()
93
+
94
+ return declared.get(child.number) ?? new Set()
95
+ }
96
+
97
+ interface Clash {
98
+ path: string
99
+ claimed: string
100
+ holder: number
101
+ }
102
+
103
+ function clash_of(
104
+ claims: ReadonlyMap<string, number>,
105
+ paths: ReadonlySet<string>,
106
+ ): Clash | undefined {
107
+ const clashes = [...paths].flatMap((path) =>
108
+ [...claims]
109
+ .filter(([claimed]) => overlaps(claimed, path))
110
+ .map(([claimed, holder]): Clash => ({ path, claimed, holder })),
111
+ )
112
+
113
+ return clashes[0]
114
+ }
115
+
116
+ function clash_note(child: EpicChild, clash: Clash): string {
117
+ const waiting = session_cite.issue(child.number, undefined, child.repo)
118
+ const holder = session_cite.issue(clash.holder, undefined, child.repo)
119
+
120
+ return `${waiting} waits: its \`${clash.path}\` overlaps \`${clash.claimed}\`, which ${holder} declares.`
121
+ }
122
+
123
+ interface Walk {
124
+ claims: Map<string, number>
125
+ offered: Array<EpicChild>
126
+ withheld: Array<EpicChild>
127
+ notes: Array<string>
128
+ }
129
+
130
+ function visit(walk: Walk, child: EpicChild, paths: ReadonlySet<string>): void {
131
+ const clash = clash_of(walk.claims, paths)
132
+
133
+ if (clash === undefined) {
134
+ walk.offered.push(child)
135
+ for (const path of paths) walk.claims.set(path, child.number)
136
+
137
+ return
138
+ }
139
+
140
+ walk.withheld.push(child)
141
+ walk.notes.push(clash_note(child, clash))
142
+ }
143
+
144
+ function merged_notice(
145
+ notice: string | undefined,
146
+ notes: ReadonlyArray<string>,
147
+ ): string | undefined {
148
+ const parts = notice === undefined ? notes : [notice, ...notes]
149
+
150
+ return parts.length === 0 ? undefined : parts.join('\n')
151
+ }
152
+
153
+ // `selection` with every offered candidate that declares a path overlapping one a running lane or
154
+ // an earlier candidate already declares moved to `withheld`, in offer order.
155
+ function separate(
156
+ selection: SoloSelection,
157
+ declared: Declared,
158
+ context: SeparateContext,
159
+ ): SoloSelection {
160
+ const walk: Walk = {
161
+ claims: running_claims(declared, context.read),
162
+ offered: [],
163
+ withheld: [],
164
+ notes: [],
165
+ }
166
+
167
+ for (const child of selection.offered) visit(walk, child, paths_of(child, declared, context.repo))
168
+
169
+ const notice = merged_notice(selection.notice, walk.notes)
170
+ const withheld = [...walk.withheld, ...selection.withheld]
171
+
172
+ return { offered: walk.offered, withheld, ...(notice !== undefined && { notice }) }
173
+ }
174
+
175
+ const backlog_overlap = { declared_of, declared_paths, separate }
176
+
177
+ export { backlog_overlap }
178
+ export type { Declared }