@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
@@ -6,13 +6,12 @@ import { lane_guard_policy, type LaneGuardMode } from '#scripts/lane/lane-guard-
6
6
  import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
7
7
  import { investigation_reads } from './investigation-reads'
8
8
 
9
- // The disk half of the investigation-delegation threshold (joshuafolkken/kit#1460): find the
9
+ // The disk half of the investigation-delegation threshold: find the
10
10
  // transcript, read enough of its end, count the files read and not edited since the last delegated
11
11
  // unit, and refuse the read that takes that count up to the threshold.
12
12
  //
13
- // **It is a `PreToolUse` hook because the rule it enforces has already failed as prose.**
14
- // joshuafolkken/kit#1426 wrote the count into two documents and into the enumeration; run #1441 then
15
- // asked the question once and read 8 more unedited files without asking again. The counting is
13
+ // **It is a `PreToolUse` hook because the rule it enforces fails as prose**: a run that asks the
14
+ // question once reads on without asking again. The counting is
16
15
  // `investigation-reads.ts`, and the shell — the six steps every refusing hook takes, every one of
17
16
  // which allows the call when it fails — is `hook-decision.ts`, shared with `batch-guard.ts`.
18
17
 
@@ -23,16 +22,14 @@ import { investigation_reads } from './investigation-reads'
23
22
  const SWITCH_ENV_KEY = 'JOSH_INVESTIGATION_GUARD'
24
23
 
25
24
  // This guard's refusal record, and the notice's own record — distinct so a lane-child notice never
26
- // spends the refusal's stamp (joshuafolkken/kit#2382), the same split the batching guard keeps.
25
+ // spends the refusal's stamp, the same split the batching guard keeps.
27
26
  const STAMP_PREFIX = 'josh-investigation-guard-'
28
27
  const NOTICE_STAMP_PREFIX = 'josh-investigation-guard-notice-'
29
28
 
30
- // **How the guard behaves for the session in hand, decided from the one-place enumeration**
31
- // (joshuafolkken/kit#2138, joshuafolkken/kit#2382). Outside a lane child the mode is `refuse` and the
32
- // guard is exactly what it always was; in a dispatched lane child it is `notice` since kit#2382 — it was
33
- // `off` from #2138, on the reason that a child cannot dispatch a sub-unit to read its own edit targets,
34
- // but #2382 measured six lane children reading 4–17 unedited files each and dispatching sub-agents, so
35
- // the reading was there to send out. The enumeration reads `JOSH_LANE_CHILD` against this checkout's own
29
+ // **How the guard behaves for the session in hand, decided from the one-place enumeration**.
30
+ // Outside a lane child the mode is `refuse` and the
31
+ // guard refuses; in a dispatched lane child it is `notice`, because a lane child does read unedited
32
+ // files and can dispatch sub-agents, so the reading is there to send out. The enumeration reads `JOSH_LANE_CHILD` against this checkout's own
36
33
  // issue only for a guard whose mode it would change, so a person working in a lane sees the guard
37
34
  // unchanged. It wraps `investigation_reads.should_block` here rather than inside it so the pure counting
38
35
  // rule stays free of process state and its own suite keeps testing it directly.
@@ -40,9 +37,9 @@ function investigation_mode(): LaneGuardMode {
40
37
  return lane_guard_policy.mode_here('investigation')
41
38
  }
42
39
 
43
- // A refusable call is refused only where the mode is `refuse` — the main line. A lane child is `notice`
44
- // (kit#2382), so it reaches the notice branch and is withheld the refusal that would end its headless
45
- // turn (kit#2138); an `off` some future enumeration sets stays silent here too.
40
+ // A refusable call is refused only where the mode is `refuse` — the main line. A lane child is
41
+ // `notice`, so it reaches the notice branch and is withheld the refusal that would end its headless
42
+ // turn; an `off` some future enumeration sets stays silent here too.
46
43
  function should_block(
47
44
  tail: string,
48
45
  call: GuardedCall,
@@ -54,7 +51,7 @@ function should_block(
54
51
  return investigation_reads.should_block(tail, call, refused_at_ms, run)
55
52
  }
56
53
 
57
- // The lane-child notice: the same threshold, delivered without a `permissionDecision` (kit#2382). It
54
+ // The lane-child notice: the same threshold, delivered without a `permissionDecision`. It
58
55
  // reads the notify stamp's own record, so a notice never spends the refusal's stamp and re-arms on the
59
56
  // next accumulation exactly as the refusal does.
60
57
  function should_notify(
@@ -68,15 +65,14 @@ function should_notify(
68
65
  return investigation_reads.should_block(tail, call, notified_at_ms, run)
69
66
  }
70
67
 
71
- // **The lane-child counterpart of REASON, delivered as a notice rather than a refusal**
72
- // (joshuafolkken/kit#2138, joshuafolkken/kit#2382). A dispatched lane child ends its turn on a denial, so
68
+ // **The lane-child counterpart of REASON, delivered as a notice rather than a refusal**.
69
+ // A dispatched lane child ends its turn on a denial, so
73
70
  // the same guidance is carried without a `permissionDecision`: the read proceeds and the child is nudged
74
71
  // to delegate rather than killed. It carries no ⛔, so a person watching reads it as advice.
75
72
  const NOTICE = `💡 investigation: files read and not edited, or search turns, since the last delegated unit reached the threshold, so the reading from here should go to a unit of its own. This is a notice, not a refusal — the read proceeds, because a dispatched lane child ends its turn on a denial. Ask \`pnpm josh delegate investigation\`, then dispatch the \`${investigation_reads.INVESTIGATOR_AGENT}\` agent (\`kit:${investigation_reads.INVESTIGATOR_AGENT}\` in a consumer) with a brief of what the main line has already concluded and what is left to find out; it returns the conclusion plus its \`file:line\` citations, never the file text. Keep a read in the main line only where this run will edit that file. This recurs on the next accumulation.`
76
73
 
77
- // The notice as it reaches the model: the base guidance with the concrete unedited reads named (kit#2276,
78
- // kit#2382), so a lane child is shown *which* reads to send to a unit rather than only told to delegate —
79
- // the #2276 precedent against the generic notice #2164 → #2178 measured not to move the number. An empty
74
+ // The notice as it reaches the model: the base guidance with the concrete unedited reads named, so a
75
+ // lane child is shown *which* reads to send to a unit rather than only told to delegate. An empty
80
76
  // set names nothing and the notice falls back to its guidance alone. The call is part of the notify
81
77
  // contract but this guard's wording depends on the tail alone.
82
78
  function notice_text(_call: GuardedCall, tail: string): string {
@@ -95,7 +91,7 @@ const GUARD = hook_decision.create_transcript_guard({
95
91
  is_candidate: investigation_reads.is_refusable_call,
96
92
  should_block,
97
93
  reason: investigation_reads.REASON,
98
- // The lane-child notice fires where the refusal is withheld (kit#2382), on a record of its own so it
94
+ // The lane-child notice fires where the refusal is withheld, on a record of its own so it
99
95
  // never spends the refusal's stamp.
100
96
  notify: {
101
97
  prefix: NOTICE_STAMP_PREFIX,
@@ -108,7 +104,7 @@ const investigation_refusal = GUARD.refusal
108
104
  const investigation_outcome = GUARD.outcome
109
105
  const { is_enabled, refusal_path } = GUARD
110
106
  // The notice's stamp path, exposed the way `refusal_path` is so a test can clean it apart from the
111
- // refusal's record (joshuafolkken/kit#2382).
107
+ // refusal's record.
112
108
  const investigation_notice_path = hook_decision.create_refusal_stamp(NOTICE_STAMP_PREFIX).path
113
109
  const { deny_envelope, load_environment_file, DISABLED_VALUES } = hook_decision
114
110
 
@@ -9,37 +9,15 @@ import { time_shell } from '#scripts/time-runtime/time-shell'
9
9
  import { time_spans, type Span } from '#scripts/time-runtime/time-spans'
10
10
  import { delegation_policy } from './delegation-policy'
11
11
 
12
- // How many files a run has read and not edited **since its last delegated unit**
13
- // (joshuafolkken/kit#1460).
14
- //
15
- // **joshuafolkken/kit#1426 made the threshold a count rather than a forecast, and left the counting
16
- // to the agent.** Measured on run #1441, that is a one-shot judgement: `josh delegate investigation`
17
- // was called once at t+4.0 min, the unit returned at t+7.2, and the main line then read **8 more
18
- // files it did not edit** — more than twice the threshold — without the question being asked a second
19
- // time. The count is a memory, and after a delegation the run remembers the *step* as done rather
20
- // than the *counter* as reset.
21
- //
22
- // **So the counting happens here, off the transcript, and not in the agent's head.** A delegation
23
- // clears the set; a read adds to it; an edit takes its file back out of it. Nothing has to be
24
- // remembered, which is why the threshold necessarily fires again — a second accumulation is
25
- // indistinguishable from the first.
26
- //
27
- // **Why a mechanism and not wording.** joshuafolkken/kit#1344 measured three consecutive runs after
28
- // the batching norm was distributed as prose and as a live notice: 1.10–1.12 calls per round trip
29
- // against a 1.50 floor, unchanged. joshuafolkken/kit#1390 read that as the answer — intervene in the
30
- // decision instead of describing it — and this is the same conclusion applied to the same class of
31
- // rule. The wording is corrected too, but it is not what is expected to move the number.
12
+ // How many files a run has read and not edited since its last delegated unit, counted off the
13
+ // transcript rather than left to the agent's memory, so the threshold fires again on a second
14
+ // accumulation. A delegation clears the set; a read adds to it; an edit exempts its file.
32
15
 
33
16
  const READ_TOOLS: ReadonlySet<string> = new Set(['Read'])
34
- // The label a subagent call carries is the verbatim tool name (`time-spans.ts` → `to_tool_call`), and
35
- // both spellings are in use: `Task` in the published tool set, `Agent` in this harness's transcripts.
36
- // Neither has a constant anywhere, so the pair is named here rather than matched loosely.
17
+ // Both spellings of the subagent tool are in use: `Task` (published) and `Agent` (this harness).
37
18
  const DELEGATION_TOOLS: ReadonlySet<string> = new Set(['Agent', 'Task'])
38
19
 
39
- // **Narrower than `time-bundle-call.ts`'s `READ_COMMANDS`, deliberately.** That list answers which
40
- // calls are bundleable, and it holds `grep`, `ls` and `wc` — commands that report *about* a file
41
- // without carrying its text. What this rule counts is text arriving in the prompt, so only the
42
- // commands that print a file belong here.
20
+ // Narrower than `time-bundle-call.ts`'s `READ_COMMANDS`: only commands that print file text count.
43
21
  const CONTENT_READ_COMMANDS: ReadonlyArray<string> = [
44
22
  'bat',
45
23
  'cat',
@@ -50,83 +28,50 @@ const CONTENT_READ_COMMANDS: ReadonlyArray<string> = [
50
28
  'sed',
51
29
  'tail',
52
30
  ]
53
- // Built through `bash_label` so the `Bash: ` prefix is spelled in one place — the labels on a span
54
- // come from that same function.
55
31
  const CONTENT_READ_LABELS: ReadonlySet<string> = new Set(
56
32
  CONTENT_READ_COMMANDS.map((command) => time_shell.bash_label(command)),
57
33
  )
58
34
 
59
- // **The searches carry no file text, so they are counted in turns rather than files**
60
- // (joshuafolkken/kit#3139). The file count above never saw a `grep`, yet searches were the commonest
61
- // exploration turn a lane took — 457 of them in one day, each re-reading the main line's whole context.
62
- // What a search costs is the turn, so a turn is the unit: parallel searches in one turn count once.
35
+ // A search carries no file text but costs a turn, so searches count in turns: parallel ones count once.
63
36
  const SEARCH_COMMANDS: ReadonlyArray<string> = ['fd', 'find', 'grep', 'rg']
64
37
  const SEARCH_LABELS: ReadonlySet<string> = new Set(
65
38
  SEARCH_COMMANDS.map((command) => time_shell.bash_label(command)),
66
39
  )
67
40
 
68
- // The unit the refusal sends the reading to (joshuafolkken/kit#3139): `.claude/agents/investigator.md`,
69
- // the parent's model at a lowered effort. A consumer receives it through the plugin as `kit:investigator`.
41
+ // `.claude/agents/investigator.md`; a consumer receives it through the plugin as `kit:investigator`.
70
42
  const INVESTIGATOR_AGENT = 'investigator'
71
43
 
72
- // What the refusal tells the model. It has to name the count, the command and the return shape,
73
- // because the deny reason is the only text that reaches the model — a run that is refused and told
74
- // nothing reads it as a broken tool.
44
+ // The deny reason is the only text that reaches the model, so it names the count, command and return shape.
75
45
  const REASON = `⛔ investigation: ${String(delegation_policy.INVESTIGATION_FILE_THRESHOLD)} files read and not edited, or ${String(delegation_policy.INVESTIGATION_SEARCH_TURN_THRESHOLD)} search turns, since the last delegated unit, so the reading from here goes to a unit of its own (a successful write also starts the search count over). Ask \`pnpm josh delegate investigation\`, then dispatch the \`${INVESTIGATOR_AGENT}\` agent (\`kit:${INVESTIGATOR_AGENT}\` in a consumer) with a brief of what the main line has already concluded and what is left to find out; it returns the conclusion plus its \`file:line\` citations, never the file text. Keep a read in the main line only where this run will edit that file — an \`Edit\` cannot be issued against text you do not hold. This run's own instructions and the harness's own session files — a backgrounded call's output, a persisted tool result, this session's scratchpad — never count toward the files, so they are not what took the file count here; every read-only search turn counts, whatever it names. The rule is \`.claude/skills/workflow-commands/delegation.md\` → "The pre-implementation reading".`
76
46
 
77
47
  interface ReadTally {
78
- // The files read and not since edited, resolved so the two ways a target reaches here compare.
48
+ // The files read and not since edited, resolved.
79
49
  pending: ReadonlyArray<string>
80
- // How many of those entered the set **after** the instant the caller asked about — the refusal's,
81
- // in the one call that matters (joshuafolkken/kit#1764). It is the second way a refusal re-arms:
82
- // a run that ignores the one refusal it gets goes on accumulating, and a threshold's worth of new
83
- // unedited files is a second accumulation whatever the run did about the first.
50
+ // How many entered after the refusal's instant — a second accumulation re-arms the refusal.
84
51
  pending_since: number
85
- // When the last delegated unit closed, or `NEVER_MS` where the window holds none. This is what
86
- // re-arms a refusal: a delegation after the recorded one is a new accumulation.
52
+ // When the last delegated unit closed, or `NEVER_MS` where the window holds none.
87
53
  reset_ms: number
88
- // The first instant the window covers. A refusal recorded before it cannot be checked against a
89
- // delegation any more, because the delegation that would re-arm it has scrolled out.
54
+ // A refusal older than this can no longer be checked against a delegation.
90
55
  window_start_ms: number
91
- // The search turns since the last delegation or successful write, and how many of them came after
92
- // the instant asked about — the search-side `pending` / `pending_since` (joshuafolkken/kit#3139).
56
+ // The search-side `pending` / `pending_since`, reset by a delegation or a successful write.
93
57
  searches: number
94
58
  searches_since: number
95
- // The files this run has successfully edited within the window, resolved (joshuafolkken/kit#1840).
96
- // A re-read of one of them is a read of a file the run edited, which `delegation.md` keeps in the main line — so
97
- // it is excluded from the count and from a call's projected growth rather than counted as fresh
98
- // investigation.
59
+ // Files successfully edited in the window; a read of one stays in the main line, so it never counts.
99
60
  edited: ReadonlySet<string>
100
61
  }
101
62
 
102
- // **The run's own instructions are not the Issue's subject, so reading them is not what `delegation.md` delegates.**
103
- // #1426's rule is about reading to find out how the subject works; `CLAUDE.md`, a `prompts/` topic and
104
- // a skill file are read to find out what to *do*, they are read by nearly every run, and a unit cannot
105
- // be sent to read them on the main line's behalf. #1441's own measurement excluded 5 of them by hand
106
- // for exactly this reason, and a count that includes them trips on a run that has investigated nothing.
107
- //
108
- // **Matched against the path relative to the repository root, so `prompts` means *this* repository's**:
109
- // `includes('prompts/')` also exempted `scripts/eval/prompts/x.ts`, which is subject code, and
110
- // `endsWith('CLAUDE.md')` also exempted `MY_CLAUDE.md`. A file outside the checkout is subject
111
- // material like any other — only these paths inside it are the run's own instructions.
63
+ // The run's own instructions are not the Issue's subject and cannot be delegated, so they never count.
64
+ // Matched relative to the repository root, so `scripts/eval/prompts/x.ts` stays subject code.
112
65
  const INSTRUCTION_PATHS: ReadonlyArray<string> = ['prompts', '.claude/skills']
113
66
  const INSTRUCTION_FILES: ReadonlySet<string> = new Set(['CLAUDE.md', 'AGENTS.md', 'GEMINI.md'])
114
67
  const REPOSITORY_ROOT = process.cwd()
115
68
 
116
- // **The two ways a target reaches this file spell the same path differently.** A tool call carries
117
- // `file_path`, which Claude Code requires to be absolute; a shell line carries the word as it was
118
- // typed, normalized only for a leading `./`. Left as they are, `cat scripts/x.ts` followed by an
119
- // `Edit` of `/…/scripts/x.ts` never cancels — the file stays pending for the rest of the run — and
120
- // reading the same file once each way counts twice.
69
+ // A tool call carries an absolute `file_path`, a shell line a relative word; resolve so both compare.
121
70
  function resolved(target: string): string {
122
71
  return path.resolve(REPOSITORY_ROOT, target)
123
72
  }
124
73
 
125
- // **Anchored at the repository root, not matched anywhere in the absolute path.** Testing the
126
- // absolute string made every file in the repository an instruction document for anyone whose checkout
127
- // sits under a directory called `prompts` — which disarmed the guard entirely, in silence.
128
- // Both path predicates below ask the same question of the repository root, so the expression is named
129
- // once rather than written twice — they differ only in what they do with the answer.
74
+ // Anchored at the repository root: a checkout under a `prompts` directory must not exempt everything.
130
75
  function repository_relative(absolute: string): string {
131
76
  return path.relative(REPOSITORY_ROOT, absolute)
132
77
  }
@@ -141,52 +86,21 @@ function is_instruction_document(target: string): boolean {
141
86
  )
142
87
  }
143
88
 
144
- // **The harness's own session files are not the subject either, and it is the same test that excludes
145
- // them** (joshuafolkken/kit#1771): no unit can be sent to read one on the main line's behalf. A
146
- // backgrounded call's result reaches its run *only* as `tasks/<id>.output` under this session's temp
147
- // tree, and a tool result too large for the transcript reaches it *only* as a file the harness wrote
148
- // under `.claude/projects/`. Refusing either refuses a run the answer to an instruction it issued
149
- // itself — and the remedy the refusal names does not exist for a file that belongs to this session
150
- // alone, so the round trip buys nothing and the read is simply reissued.
151
- //
152
- // **Anchored on a directory the harness *writes*, never on the session tree as a whole.** Exempting
153
- // the whole tree would have disarmed the guard in silence for anything a run unpacks or clones into
154
- // its scratchpad to investigate — real subject material, read to find out how something works, that
155
- // would never have reached the count. That is the failure the instruction-document half's own anchor
156
- // note describes, and it is why the scratchpad is deliberately **not** exempt: what stays exempt is
157
- // what the harness itself wrote.
89
+ // The harness's own session files (backgrounded output, persisted results) cannot be delegated either.
90
+ // Only what the harness writes is exempt — the scratchpad holds real subject material and still counts.
158
91
  const SESSION_TEMP_SEGMENT = /^claude-\d+$/u
159
- // **Single-sourced from `cost-transcript.ts`**, which already owns where the harness keeps a session's
160
- // state and builds the transcript directory out of it — spelling `.claude/projects` a second time here
161
- // is the clone `CLAUDE.md` prohibits. That module joins the value onto a home directory and this one
162
- // matches it as a run of segments, so what the two share is the fact rather than the use.
163
- //
164
- // **The `tasks/<id>.output` spelling is deliberately *not* borrowed from `time-background.ts`.** This
165
- // rule matches the session *tree*, which covers that file, the scratchpad and the transcript in one
166
- // test; matching the file name would need a second rule for each of the others.
167
92
  const SESSION_STATE_SEGMENTS = cost_transcript.TRANSCRIPT_ROOT.split(path.sep)
168
- // What the harness writes into a session's temp tree has a fixed shape — `tasks/<id>.output`, a
169
- // backgrounded call's result — and **both halves are required**. The directory name alone is not
170
- // enough: `tasks/` is one of the commonest directory names a repository has, and a run may unpack or
171
- // clone one into its scratchpad, where matching the name would re-open the silent false negative one
172
- // level down. Persisted tool results and the transcript need no entry here at all — they live under
173
- // the state root above, which is exempt whole.
93
+ // Both halves of `tasks/<id>.output` are required: `tasks/` alone is a common repository directory.
174
94
  const HARNESS_OUTPUT_DIRECTORY = 'tasks'
175
95
  const HARNESS_OUTPUT_EXTENSION = '.output'
176
- // `at()` counts from the end, so the file itself is -1 and the directory holding it is -2.
177
96
  const FILE_SEGMENT_INDEX = -1
178
97
  const PARENT_SEGMENT_INDEX = -2
179
98
 
180
- // The state root holds transcripts and persisted results and no subject code, so it is exempt whole.
181
- // It is not anchored to the home directory: `cost-transcript.ts` is this package's only file allowed
182
- // to look that up at all (`scripts/hooks/no-global-shim-write.test.ts`), and two adjacent segments outside
183
- // the checkout are specific enough without it.
99
+ // The state root holds no subject code, so it is exempt whole.
184
100
  function has_state_root(segments: ReadonlyArray<string>, index: number): boolean {
185
101
  return SESSION_STATE_SEGMENTS.every((segment, offset) => segments[index + offset] === segment)
186
102
  }
187
103
 
188
- // The file's **own parent** is tested rather than any directory above it, and the name has to match
189
- // as well — see the shape note above for why one without the other is not enough.
190
104
  function is_harness_output(segments: ReadonlyArray<string>): boolean {
191
105
  return (
192
106
  segments.some((segment) => SESSION_TEMP_SEGMENT.test(segment)) &&
@@ -195,12 +109,7 @@ function is_harness_output(segments: ReadonlyArray<string>): boolean {
195
109
  )
196
110
  }
197
111
 
198
- // **A path inside the checkout is never one of these, whatever its directories are called.** The
199
- // instruction-document test above is anchored at the repository root because matching the absolute
200
- // string made every file an instruction document for a checkout sitting under a directory called
201
- // `prompts`; this test cannot borrow that anchor, since the files it names live outside the checkout by
202
- // construction. So the anchor is inverted — leaving the repository is a precondition — and a
203
- // repository file can therefore never be exempted here, whatever it is named.
112
+ // Leaving the checkout is a precondition, so no repository file is ever exempted as a session artifact.
204
113
  function is_outside_repository(absolute: string): boolean {
205
114
  return repository_relative(absolute).startsWith('..')
206
115
  }
@@ -218,14 +127,11 @@ function is_session_artifact(target: string): boolean {
218
127
  )
219
128
  }
220
129
 
221
- // The two exclusions answer one question — could a unit be sent to read this instead? — so a target
222
- // failing either is not the Issue's subject and never reaches the count.
223
130
  function is_subject_file(target: string): boolean {
224
131
  return !is_instruction_document(target) && !is_session_artifact(target)
225
132
  }
226
133
 
227
- // A shell glob resolves to a literal path with a `*` in it, which no edit can ever name — so left in,
228
- // it stays pending until the next delegation and keeps contributing to a count it does not belong in.
134
+ // A glob is a path no edit can name, so it would stay pending forever.
229
135
  function is_nameable_file(target: string): boolean {
230
136
  return !target.includes('*') && !target.includes('?')
231
137
  }
@@ -244,32 +150,18 @@ function call_targets(call: GuardedCall): ReadonlyArray<string> {
244
150
  return subject_targets(time_bundle_call.call_facts(call.name, call.input).targets)
245
151
  }
246
152
 
247
- // **The instant a delegation closed, not the one it opened.** The refusal this re-arms was recorded
248
- // before the unit was ever briefed, so either end of that span is after it — and the closing instant
249
- // needs no duration arithmetic to derive, which keeps the one number this rule compares free of
250
- // `to_spans`' own bookkeeping.
153
+ // The closing instant: the refusal it re-arms predates the briefing, and it needs no duration arithmetic.
251
154
  function delegation_instant(span: Span | undefined): number {
252
155
  return span === undefined ? hook_decision.NEVER_MS : span.ended_ms
253
156
  }
254
157
 
255
- // **A span whose outcome was failure changed nothing, so it is not what this rule acts on**
256
- // (joshuafolkken/kit#1764, joshuafolkken/kit#1840). A failed **read** carried no text into the
257
- // prompt — the case that matters is the guard's own refusal: Claude Code writes a denied call to the
258
- // transcript as a `tool_use` block with an errored `tool_result`, and the stamp is written *before*
259
- // the reason is returned, so counting the denied read's targets would pre-load `pending_since` with
260
- // the very read the refusal stopped. A failed **edit** wrote nothing, so it does not exempt a later
261
- // read of its target either — `edited_files` below asks the same question for that reason. An
262
- // **unknown** outcome still counts, because a result nobody recorded is not a failure.
158
+ // A failed span changed nothing — notably the guard's own denied read, which the transcript records as
159
+ // an errored call. An unknown outcome still counts.
263
160
  function is_failed_outcome(span: Span): boolean {
264
161
  return span.outcome === time_spans.FAILED_OUTCOME
265
162
  }
266
163
 
267
- // **Every file the run successfully wrote within the window, resolved** (joshuafolkken/kit#1840). It
268
- // is the one source of "this run edited that file", shared by the live tally and the replay: a read of
269
- // a file the run edits is reading `delegation.md` keeps in the main line, so it is never counted — whether the read
270
- // came before the edit or after it. A failed edit wrote nothing and so exempts nothing, and a file
271
- // edited outside the window is unknown rather than assumed: the set is only ever as wide as the tail
272
- // the hook read, which is the bound joshuafolkken/kit#1764 already holds the accumulation to.
164
+ // The one source of "this run edited that file", bounded by the window the hook read.
273
165
  function edited_files(spans: ReadonlyArray<Span>): Set<string> {
274
166
  const written = spans
275
167
  .filter((span) => !is_failed_outcome(span))
@@ -278,11 +170,8 @@ function edited_files(spans: ReadonlyArray<Span>): Set<string> {
278
170
  return new Set(written)
279
171
  }
280
172
 
281
- // **The set records *when* each file entered it, which is the whole of the second re-arm**
282
- // (joshuafolkken/kit#1764). A plain set could say how many files were pending and never how many of
283
- // them arrived after the refusal, so a run that ignored its one refusal was indistinguishable from
284
- // one that had read nothing since. The first entry stands: a re-read of a file already pending is
285
- // not a new accumulation, exactly as it is not a new count.
173
+ // Records when each file entered, so a second accumulation after a refusal is countable; the first
174
+ // entry stands.
286
175
  function add_all(
287
176
  pending: Map<string, number>,
288
177
  targets: ReadonlyArray<string>,
@@ -291,13 +180,7 @@ function add_all(
291
180
  for (const target of targets) if (!pending.has(target)) pending.set(target, at_ms)
292
181
  }
293
182
 
294
- // **A file the run edited is never added to the set in the first place** (joshuafolkken/kit#1840).
295
- // `edited_files` has already gathered every successful write in the window, so a read of one of them —
296
- // before the edit or after it — is filtered here rather than added and then subtracted. This closes
297
- // the re-read-after-edit gap the old subtract-on-the-edit-span could not: a subtraction runs only on
298
- // the edit's own span, so a read issued *after* the edit was added and stayed. `sed -i`, `MultiEdit`
299
- // and `NotebookEdit` need no special case any more — each is a write, so its target is in `edited` and
300
- // never enters the read count.
183
+ // An edited file is filtered before it is added, so a re-read after the edit never counts either.
301
184
  interface Accumulation {
302
185
  // Read files, keyed by resolved path, valued by the instant each entered.
303
186
  pending: Map<string, number>
@@ -309,25 +192,15 @@ function is_read_only_search(span: Span): boolean {
309
192
  return SEARCH_LABELS.has(span.label) && span.is_bundleable && !span.may_write
310
193
  }
311
194
 
312
- // **A span with no message id belongs to no known turn, so it is a turn of its own** — the reading every
313
- // other turn counter gives `NO_MESSAGE_ID` (`time-round-trips.ts`, `time-bundles.ts`). Keyed by the
314
- // id, every untagged search would collapse into one entry and the count would never reach its threshold.
195
+ // A span with no message id is a turn of its own, as in every other turn counter.
315
196
  function search_turn_key(searches: ReadonlyMap<string, number>, span: Span): string {
316
197
  if (span.message_id !== time_spans.NO_MESSAGE_ID) return span.message_id
317
198
 
318
199
  return `${time_spans.NO_MESSAGE_ID}#${String(searches.size)}`
319
200
  }
320
201
 
321
- // **A successful write ends the streak.** The measurement behind the threshold counted searches since
322
- // the last edit or delegation: a run that has started writing is implementing, and the searches that
323
- // follow locate the next edit rather than continue an investigation.
324
- //
325
- // **Every read-only search counts, whatever it names** (joshuafolkken/kit#3139). The file count can
326
- // exempt the run's own instructions because a read names each file it reads; a search does not — the
327
- // targets drop a bare directory, so `grep -rn foo CLAUDE.md scripts` looked like a search of
328
- // `CLAUDE.md` alone and an exemption let the whole sweep through. `is_bundleable` without `may_write`
329
- // is the read-only test `is_search_call` asks at the call, so the transcript never counts a search the
330
- // guard could not have refused.
202
+ // A successful write ends the streak: searches after it locate the next edit. Every read-only search
203
+ // counts whatever it names — its targets drop bare directories, so an exemption would leak sweeps.
331
204
  function apply_search(searches: Map<string, number>, span: Span): void {
332
205
  if (span.is_writing) {
333
206
  searches.clear()
@@ -363,9 +236,7 @@ function last_delegation_ms(spans: ReadonlyArray<Span>): number {
363
236
  return delegation_instant(spans.findLast((span) => DELEGATION_TOOLS.has(span.label)))
364
237
  }
365
238
 
366
- // **The window is the tail the hook read, not the whole run.** That is the same bound the batching
367
- // guard works under, and it costs nothing here: the set is cleared at every delegation anyway, so a
368
- // tail that reaches back past the last one already holds the whole accumulation.
239
+ // The window is the tail the hook read; the set clears at every delegation, so the tail suffices.
369
240
  function pending_after(pending: ReadonlyMap<string, number>, since_ms: number): number {
370
241
  return [...pending.values()].filter((at_ms) => at_ms > since_ms).length
371
242
  }
@@ -388,13 +259,7 @@ function tally_of(text: string, since_ms: number = hook_decision.NEVER_MS): Read
388
259
  }
389
260
  }
390
261
 
391
- // **The call has to actually add a file the count does not already hold.** Its targets are filtered
392
- // against `edited` first, so a re-read of a file the run edited is not the `+ 1` that trips the
393
- // threshold — the same exclusion `apply_span` makes for the pending set this is compared against
394
- // (joshuafolkken/kit#1840). The `Set` union still absorbs a re-read of something already pending — a
395
- // second `sed -n` window of the same file, or a `Read` with a new `offset` — which would not have
396
- // grown the count either. The default empty set is for the exported callers that ask about
397
- // accumulation alone — a test, or any reader with no edited set in hand.
262
+ // The call grows the count only by a file neither pending nor edited (the same exclusion `apply_span` makes).
398
263
  function projected_count(
399
264
  pending: ReadonlyArray<string>,
400
265
  call: GuardedCall,
@@ -403,14 +268,8 @@ function projected_count(
403
268
  return new Set([...pending, ...call_targets(call).filter((target) => !edited.has(target))]).size
404
269
  }
405
270
 
406
- // **The read that takes the count *up to* the threshold is the boundary.** The ones below it stay in
407
- // the main line, which is what keeps a small investigation from paying the two turns a brief and a
408
- // result cost.
409
- //
410
- // **It is the *accumulated* count that has to reach the boundary, never the projected one.** Counting
411
- // the call's own targets toward it let one bundled multi-file read — `cat a.ts b.ts c.ts`, exactly the
412
- // batching `CLAUDE.md` mandates — be refused as the first call of a run, with a reason claiming three
413
- // files had already been read. The boundary is crossed by a call, not jumped over by one.
271
+ // The accumulated count, never the projected one, must reach the boundary — otherwise one bundled
272
+ // multi-file read would be refused as a run's first call.
414
273
  function is_at_threshold(pending_count: number): boolean {
415
274
  return pending_count + 1 >= delegation_policy.INVESTIGATION_FILE_THRESHOLD
416
275
  }
@@ -420,36 +279,9 @@ function is_at_search_threshold(search_count: number): boolean {
420
279
  return search_count + 1 >= delegation_policy.INVESTIGATION_SEARCH_TURN_THRESHOLD
421
280
  }
422
281
 
423
- // **One refusal per accumulation, re-armed by a delegation and by nothing else.** A run that reads on
424
- // regardless is not refused again, so a false positive — three files the run was about to edit — costs
425
- // one round trip rather than wedging the run. And a run that *does* delegate is refused again as soon
426
- // as three more unedited files pile up, which is the whole of joshuafolkken/kit#1460.
427
- //
428
- // **A refusal older than the window re-arms too**, and without that arm the guard fell permanently
429
- // silent on exactly the run lengths the Issue was filed about: once the last delegation scrolls out of
430
- // the 256 KB tail there is no `reset_ms` left to beat, and one stale stamp disarmed the rest of the
431
- // session. This is the bound `batch-guard.ts` already documents for its own window — one extra
432
- // refusal per window rather than silence — and it errs toward delegating, which is the goal.
433
- //
434
- // **And a further accumulation re-arms it, which is what "one refusal per accumulation" had always
435
- // meant and never done** (joshuafolkken/kit#1764). A delegation was the only thing that could clear
436
- // the disarm, so a run that *ignored* the refusal — read on without delegating — was never spoken to
437
- // again however many unedited files it went on to open: the one case the threshold exists for was the
438
- // one case it stopped covering. `docs/josh-commands.md` had already published the corrected
439
- // behavior — "one per accumulation and re-arms after the next three unedited reads" — against code
440
- // that did nothing of the kind, which is the shipped-mechanism-not-working defect
441
- // joshuafolkken/kit#1262 declared highest priority.
442
- //
443
- // **It is not a refusal on the next call.** The count has to climb a whole threshold again, so a
444
- // false positive still costs one round trip; what it cannot do any more is buy silence for the rest
445
- // of the run.
446
- //
447
- // **A delegated unit is not re-armed here because it is not refused at all** (joshuafolkken/kit#1840).
448
- // The hook counts a unit's reading against the unit (joshuafolkken/kit#1424), and the refusal asks for
449
- // a dispatch — but a unit is already where `delegation.md` sends the reading, and a read-only one (`Explore`,
450
- // `Plan`) has no `Agent` tool to dispatch with. It was formerly degraded to a single first refusal,
451
- // which still asked for an action the unit could not take; now the unit short circuit in `should_block`
452
- // turns it off entirely, so this function is the parent's alone and needs no delegation condition.
282
+ // One refusal per accumulation, so a false positive costs one round trip. It re-arms on a later
283
+ // delegation, on a refusal older than the window (else a long run falls silent), and on a further
284
+ // threshold's worth of reads after it.
453
285
  function has_cleared_the_disarm(tally: ReadTally, refused_at_ms: number): boolean {
454
286
  return tally.reset_ms > refused_at_ms || refused_at_ms < tally.window_start_ms
455
287
  }
@@ -462,16 +294,12 @@ function is_rearmed(tally: ReadTally, refused_at_ms: number): boolean {
462
294
  return is_at_threshold(tally.pending_since) || is_at_search_threshold(tally.searches_since)
463
295
  }
464
296
 
465
- // A transcript under a session's `subagents/` directory is a delegated unit's. The segment is
466
- // `cost-transcript.ts`'s, which owns the layout — spelling it a second time here is the clone
467
- // `CLAUDE.md` prohibits, and the hook is handed the derived fork path rather than the parent's
468
- // (`hook-decision.ts` → `guard_reason_for_payload`).
297
+ // A transcript under a session's `subagents/` directory is a delegated unit's.
469
298
  function is_unit_transcript(transcript: string): boolean {
470
299
  return transcript.split(path.sep).includes(cost_transcript.UNIT_DIRECTORY)
471
300
  }
472
301
 
473
- // The run-level question `should_block` asks of the payload: is this a delegated unit's transcript?
474
- // `run` is absent in the pure-tally tests, which are the parent's context by construction.
302
+ // `run` is absent in the pure-tally tests, which are the parent's context.
475
303
  function is_unit_run(run: GuardRun | undefined): boolean {
476
304
  return run !== undefined && is_unit_transcript(run.transcript)
477
305
  }
@@ -484,30 +312,13 @@ function is_read_only_command(call: GuardedCall, labels: ReadonlySet<string>): b
484
312
  return labels.has(label) && time_batch_guard.is_read_only_call(call)
485
313
  }
486
314
 
487
- // **A search is refusable without a subject target**, unlike a read: `grep -rn foo scripts` names a
488
- // bare directory, which `call_facts` deliberately does not take as a target, and such a sweep is exactly
489
- // the search this count exists for.
315
+ // A search is refusable without a subject target: a bare-directory sweep is what this count is for.
490
316
  function is_search_call(call: GuardedCall): boolean {
491
317
  return is_read_only_command(call, SEARCH_LABELS)
492
318
  }
493
319
 
494
- // **A `Read` is always safe to refuse; a `Bash` line is refused only where it writes nothing.** This
495
- // guard counts *reading*, so a line that also writes is one it has no business stopping — a `sed -i`
496
- // is work rather than investigation, and refusing one would leave the siblings of its turn applied and
497
- // itself not for no gain in what this guard measures.
498
- //
499
- // **It asks `is_read_only_call`, which is what `is_guarded_call` used to mean**
500
- // (joshuafolkken/kit#1762). The batching guard can now refuse a write, and the two guards ask
501
- // different questions of the same call: that one asks whether the call could have gone out beside
502
- // another, this one whether the call is reading. A single shared predicate would have moved this one
503
- // silently when that one widened, so the read-only test kept its semantics under a name that states
504
- // them. A `sed -n` read is therefore still **counted and never refused**; the refusal lands on the
505
- // next call that is unambiguously a read.
506
- //
507
- // **A call naming no subject file is never refused either**, which covers two cases in one rule: a
508
- // call that names only instruction documents — refusing `CLAUDE.md` would stop a run reading the very
509
- // rule being enforced — and a call whose targets could not be read at all, which cannot move the count
510
- // and so has nothing to be refused for.
320
+ // This guard counts reading, so a `Bash` line that also writes is never refused, and neither is a call
321
+ // naming no subject file (e.g. only `CLAUDE.md`).
511
322
  function is_refusable_call(call: GuardedCall): boolean {
512
323
  if (is_search_call(call)) return true
513
324
  if (call_targets(call).length === 0) return false
@@ -531,9 +342,7 @@ function should_block(
531
342
  refused_at_ms: number,
532
343
  run?: GuardRun,
533
344
  ): boolean {
534
- // A delegated unit is never refused (joshuafolkken/kit#1840): the remedy the refusal names — send
535
- // the reading to a unit — does not exist inside one. Asked before the tail is parsed, since the
536
- // answer needs none of it.
345
+ // A delegated unit is never refused: the remedy — send the reading to a unit — does not exist inside one.
537
346
  if (!is_refusable_call(call) || is_unit_run(run)) return false
538
347
 
539
348
  const tally = tally_of(text, refused_at_ms)
@@ -542,6 +351,7 @@ function should_block(
542
351
  }
543
352
 
544
353
  const investigation_reads = {
354
+ DELEGATION_TOOLS,
545
355
  INVESTIGATOR_AGENT,
546
356
  READ_TOOLS,
547
357
  REASON,
@@ -8,7 +8,7 @@ import { repo_origin } from './repo-origin'
8
8
  // Discovery is automatic by default rather than registered in a config file: on the machine this was
9
9
  // written for, every first-party repository is a sibling of every other, so scanning the current
10
10
  // repository's parent one level deep produces the same map from whichever of them the command runs
11
- // in. `JOSH_REPO_PATHS` exists only for the exceptions (joshuafolkken/kit#869).
11
+ // in. `JOSH_REPO_PATHS` exists only for the exceptions.
12
12
 
13
13
  const GIT_DIRECTORY = '.git'
14
14
  const GIT_CONFIG = 'config'
@@ -5,8 +5,7 @@ import { repo_origin, type RepoIdentity } from './repo-origin'
5
5
  // The owner restriction lives here, on the single path every entry travels, rather than in the
6
6
  // scanner: an override that could re-enter the map behind the filter would be the hole the
7
7
  // restriction exists to close. Discovered entries and overrides are both funnelled through
8
- // `add_entry`, so there is exactly one place that decides what is allowed in
9
- // (joshuafolkken/kit#869).
8
+ // `add_entry`, so there is exactly one place that decides what is allowed in.
10
9
 
11
10
  // One candidate the scan produced: a directory holding a git work tree, and the `origin` remote it
12
11
  // declares. `origin_url` is undefined for a work tree with no `origin` at all.