@joshuafolkken/kit 1.1240.0 → 1.1373.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (934) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +52 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +19 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +26 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +17 -28
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.vscode/tasks.json +14 -0
  42. package/CLAUDE.md +10 -61
  43. package/README.md +23 -66
  44. package/SECURITY.md +1 -1
  45. package/dist/CLAUDE.md +10 -61
  46. package/dist/commands/document-section-cli.js +43 -11
  47. package/dist/config-merge/index.js +11 -2
  48. package/dist/hooks/audit-provision.js +2 -2
  49. package/dist/hooks/batch-guard.js +7 -7
  50. package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-7UBFU3CL.js} +18 -20
  51. package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
  52. package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
  53. package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
  54. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  55. package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
  56. package/dist/hooks/{chunk-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
  57. package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
  58. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  59. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  60. package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
  61. package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
  62. package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
  63. package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
  64. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  65. package/dist/hooks/codex-hook-adapter.js +26 -21
  66. package/dist/hooks/duplicate-read-guard.js +8 -8
  67. package/dist/hooks/format-edited.js +4 -4
  68. package/dist/hooks/inputs.json +195 -181
  69. package/dist/hooks/investigation-guard.js +8 -8
  70. package/dist/hooks/pretool-guard.js +15 -15
  71. package/dist/hooks/session-lang.js +406 -8
  72. package/dist/hooks/stop-guard.js +122 -187
  73. package/dist/josh.js +282 -95
  74. package/dist/version/index.js +15 -13
  75. package/eslint/base.js +43 -5
  76. package/eslint/rules/english-only-prose.js +3 -3
  77. package/eslint/rules/import.js +12 -0
  78. package/eslint/rules/namespace-object-export.js +2 -2
  79. package/package.json +17 -11
  80. package/pnpm-workspace.yaml +2 -4
  81. package/prompts/coding-standards.md +14 -48
  82. package/prompts/collaboration-workflow/file-edits.md +1 -1
  83. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  84. package/prompts/collaboration-workflow/issue-template.md +3 -10
  85. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  86. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  87. package/prompts/collaboration-workflow/overview.md +1 -1
  88. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  89. package/prompts/collaboration-workflow/principles.md +21 -3
  90. package/prompts/collaboration-workflow/report-format.md +16 -29
  91. package/prompts/collaboration-workflow/residency.md +1 -1
  92. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  93. package/prompts/collaboration-workflow/shell-body.md +3 -23
  94. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  95. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  96. package/prompts/refactoring.md +1 -1
  97. package/prompts/review-rubric.md +3 -22
  98. package/prompts/review.md +15 -38
  99. package/prompts/testing-guide.md +2 -4
  100. package/scripts/adopt/adopt-logic.ts +5 -5
  101. package/scripts/adopt/adopt-toolkits.ts +4 -5
  102. package/scripts/adopt/adopt.ts +2 -3
  103. package/scripts/agent/agent-argv.ts +7 -7
  104. package/scripts/agent/agent-diagnostics.ts +2 -2
  105. package/scripts/agent/agent-exit-record.ts +1 -1
  106. package/scripts/agent/agent-headless.ts +1 -1
  107. package/scripts/agent/agent-launch-environment.ts +6 -1
  108. package/scripts/agent/agent-role-profile.ts +49 -22
  109. package/scripts/agent/agent-session-role.ts +32 -0
  110. package/scripts/agent/api-outage.ts +1 -1
  111. package/scripts/agent/claude-agent-argv.ts +4 -4
  112. package/scripts/agent/claude-result-event.ts +4 -4
  113. package/scripts/agent/codex-hooks.ts +2 -2
  114. package/scripts/agent/interactive-ask.ts +3 -6
  115. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  116. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  117. package/scripts/backlog/backlog-arrival.ts +54 -17
  118. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  119. package/scripts/backlog/backlog-budget.ts +17 -24
  120. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  121. package/scripts/backlog/backlog-drive-args.ts +5 -4
  122. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  123. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  124. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  125. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  126. package/scripts/backlog/backlog-drive-named.ts +39 -9
  127. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  128. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  129. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  130. package/scripts/backlog/backlog-drive.ts +43 -28
  131. package/scripts/backlog/backlog-idle.ts +88 -0
  132. package/scripts/backlog/backlog-named.ts +11 -15
  133. package/scripts/backlog/backlog-next.ts +26 -30
  134. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  135. package/scripts/backlog/backlog-offer.ts +7 -7
  136. package/scripts/backlog/backlog-overlap.ts +178 -0
  137. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  138. package/scripts/backlog/backlog-plan-read.ts +111 -0
  139. package/scripts/backlog/backlog-plan.ts +11 -10
  140. package/scripts/backlog/backlog-pool.ts +13 -14
  141. package/scripts/backlog/backlog-rank.ts +11 -11
  142. package/scripts/backlog/backlog-ready.ts +15 -10
  143. package/scripts/backlog/backlog-scope.ts +14 -15
  144. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  145. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  146. package/scripts/backlog/backlog-stalled.ts +5 -6
  147. package/scripts/backlog/backlog-waves.ts +4 -4
  148. package/scripts/backlog/backlogrun-args.ts +74 -0
  149. package/scripts/backlog/backlogrun-cli.ts +113 -0
  150. package/scripts/backlog/backlogrun-launch.ts +178 -0
  151. package/scripts/behavior/behavior-assertion.ts +6 -8
  152. package/scripts/behavior/behavior-cli.ts +1 -1
  153. package/scripts/behavior/behavior-rules.ts +3 -3
  154. package/scripts/build/build-claude-md.ts +4 -4
  155. package/scripts/build/build-codex-hooks.ts +2 -2
  156. package/scripts/build/build-commands.ts +1 -1
  157. package/scripts/build/build-hooks.ts +5 -5
  158. package/scripts/build/build.ts +1 -1
  159. package/scripts/build/hook-bundle-stamp.ts +109 -7
  160. package/scripts/build/local-bin.ts +2 -2
  161. package/scripts/cases/cases-cli.ts +1 -1
  162. package/scripts/cases/cases-logic.ts +2 -2
  163. package/scripts/ci/composite-actions.ts +1 -2
  164. package/scripts/ci/pr-classification.ts +2 -2
  165. package/scripts/claude/workflow-destination.ts +1 -1
  166. package/scripts/clone/clone-aggregate.ts +1 -1
  167. package/scripts/clone/clone-fingerprint.ts +1 -1
  168. package/scripts/clone/clone-scan-cli.ts +1 -1
  169. package/scripts/clone/clone-scan.ts +1 -1
  170. package/scripts/config-merge/index.ts +1 -1
  171. package/scripts/config-merge/json-format.ts +1 -3
  172. package/scripts/config-merge/patch-json-array.ts +90 -0
  173. package/scripts/config-merge/patch-json-key.ts +6 -3
  174. package/scripts/config-merge/patch-json-list.ts +1 -1
  175. package/scripts/cost-runtime/codex-usage.ts +1 -1
  176. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  177. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  178. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  179. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  180. package/scripts/cost-runtime/cost-cli.ts +14 -11
  181. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  182. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  183. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  184. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  185. package/scripts/cost-runtime/cost-usage.ts +6 -7
  186. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  187. package/scripts/cost-runtime/own-session.ts +1 -1
  188. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  189. package/scripts/delegation/delegation-cli.ts +4 -4
  190. package/scripts/delegation/delegation-policy.ts +13 -15
  191. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  192. package/scripts/delegation/fanout-cli.ts +1 -1
  193. package/scripts/delegation/fanout.ts +1 -1
  194. package/scripts/delegation/investigation-guard.ts +18 -22
  195. package/scripts/delegation/investigation-reads.ts +48 -238
  196. package/scripts/discovery/repo-discovery.ts +1 -1
  197. package/scripts/discovery/repo-map-logic.ts +1 -2
  198. package/scripts/discovery/repo-origin.ts +3 -3
  199. package/scripts/discovery/repo-party-cli.ts +2 -2
  200. package/scripts/discovery/repo-party.ts +2 -2
  201. package/scripts/doctor/doctor-consumer.ts +1 -1
  202. package/scripts/doctor/doctor-io.ts +6 -7
  203. package/scripts/doctor/doctor-logic.ts +1 -1
  204. package/scripts/doctor/doctor-ports.ts +1 -1
  205. package/scripts/doctor/doctor.ts +8 -9
  206. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  207. package/scripts/document/bash-output-cap.ts +5 -7
  208. package/scripts/document/capped-print-part.ts +1 -1
  209. package/scripts/document/capped-print.ts +1 -1
  210. package/scripts/document/document-byte-budget.ts +33 -64
  211. package/scripts/document/document-byte-check.ts +4 -4
  212. package/scripts/document/document-reachability.ts +7 -8
  213. package/scripts/document/document-read-cli.ts +2 -2
  214. package/scripts/document/document-scan.ts +30 -5
  215. package/scripts/document/document-section-cli.ts +6 -8
  216. package/scripts/document/document-section.ts +8 -12
  217. package/scripts/document/edit-files-cli.ts +3 -4
  218. package/scripts/document/entry-read-budget.ts +8 -70
  219. package/scripts/document/entry-read-set.ts +51 -34
  220. package/scripts/document/lane-child-read-set.ts +9 -9
  221. package/scripts/document/read-files-cli.ts +1 -2
  222. package/scripts/document/read-set-cli.ts +16 -19
  223. package/scripts/document/read-set-cost.ts +4 -4
  224. package/scripts/document/read-set-point-of-use.ts +28 -38
  225. package/scripts/document/read-set-pricing.ts +1 -1
  226. package/scripts/document/read-set-trim.ts +3 -3
  227. package/scripts/document/resident-budget.ts +8 -10
  228. package/scripts/epic/epic-add-body.ts +15 -18
  229. package/scripts/epic/epic-add-plan.ts +26 -28
  230. package/scripts/epic/epic-add.ts +32 -25
  231. package/scripts/epic/epic-audit-checks.ts +27 -37
  232. package/scripts/epic/epic-audit-cli.ts +21 -22
  233. package/scripts/epic/epic-audit-orphans.ts +16 -17
  234. package/scripts/epic/epic-audit-rationale.ts +10 -15
  235. package/scripts/epic/epic-audit-report.ts +2 -5
  236. package/scripts/epic/epic-audit.ts +18 -14
  237. package/scripts/epic/epic-body.ts +10 -10
  238. package/scripts/epic/epic-bundle-cli.ts +36 -34
  239. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  240. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  241. package/scripts/epic/epic-bundle-poll.ts +1 -1
  242. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  243. package/scripts/epic/epic-bundle.ts +19 -20
  244. package/scripts/epic/epic-busy.ts +44 -21
  245. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  246. package/scripts/epic/epic-chains.ts +18 -23
  247. package/scripts/epic/epic-classify.ts +11 -12
  248. package/scripts/epic/epic-cli-argv.ts +5 -6
  249. package/scripts/epic/epic-cli-remove.ts +9 -4
  250. package/scripts/epic/epic-cli.ts +38 -26
  251. package/scripts/epic/epic-close-comment.ts +14 -15
  252. package/scripts/epic/epic-close.ts +25 -29
  253. package/scripts/epic/epic-cross-repo.ts +18 -21
  254. package/scripts/epic/epic-decision.ts +14 -18
  255. package/scripts/epic/epic-fetch.ts +25 -31
  256. package/scripts/epic/epic-graph.ts +15 -17
  257. package/scripts/epic/epic-index.ts +14 -16
  258. package/scripts/epic/epic-issue.ts +9 -11
  259. package/scripts/epic/epic-label-age.ts +74 -0
  260. package/scripts/epic/epic-lane-offer.ts +35 -24
  261. package/scripts/epic/epic-nested.ts +1 -1
  262. package/scripts/epic/epic-next-read.ts +8 -8
  263. package/scripts/epic/epic-next-views.ts +12 -12
  264. package/scripts/epic/epic-next.ts +29 -33
  265. package/scripts/epic/epic-outside-blocker.ts +11 -10
  266. package/scripts/epic/epic-parse.ts +22 -24
  267. package/scripts/epic/epic-promote.ts +3 -2
  268. package/scripts/epic/epic-rank.ts +1 -1
  269. package/scripts/epic/epic-read.ts +10 -8
  270. package/scripts/epic/epic-reconcile.ts +8 -6
  271. package/scripts/epic/epic-reference.ts +5 -4
  272. package/scripts/epic/epic-relation-recheck.ts +10 -11
  273. package/scripts/epic/epic-relations.ts +9 -8
  274. package/scripts/epic/epic-remove-plan.ts +4 -5
  275. package/scripts/epic/epic-remove.ts +7 -5
  276. package/scripts/epic/epic-report.ts +18 -20
  277. package/scripts/epic/epic-run.ts +6 -5
  278. package/scripts/epic/epic-sections.ts +2 -2
  279. package/scripts/epic/epic-shape.ts +3 -3
  280. package/scripts/epic/epic-solo-stale.ts +3 -2
  281. package/scripts/epic/epic-solo.ts +8 -8
  282. package/scripts/epic/epic-triage.ts +5 -4
  283. package/scripts/epic/epic-validate.ts +8 -7
  284. package/scripts/epic/epic.ts +5 -5
  285. package/scripts/exports/unused-members-cli.ts +1 -1
  286. package/scripts/followup/followup-issue-number.ts +1 -2
  287. package/scripts/followup/git-followup-cleanup.ts +6 -7
  288. package/scripts/followup/git-followup-finish.ts +11 -13
  289. package/scripts/followup/git-followup-flush.ts +11 -7
  290. package/scripts/followup/git-followup-issue-close.ts +16 -13
  291. package/scripts/followup/git-followup-label.ts +9 -6
  292. package/scripts/followup/git-followup-merged.ts +1 -1
  293. package/scripts/followup/git-followup-pending.ts +7 -9
  294. package/scripts/followup/git-followup-stages.ts +28 -17
  295. package/scripts/followup/git-followup-workflow.ts +19 -21
  296. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  297. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  298. package/scripts/followup/git-pr-followup.ts +18 -17
  299. package/scripts/gate/core-admission.ts +2 -2
  300. package/scripts/gate/core-budget.ts +15 -26
  301. package/scripts/gate/gate-ledger.ts +114 -0
  302. package/scripts/gate/gate-log.ts +7 -9
  303. package/scripts/gate/gate-plan.ts +70 -35
  304. package/scripts/gate/gate-report.ts +14 -15
  305. package/scripts/gate/gate-skip.ts +11 -13
  306. package/scripts/gate/gate-steps.ts +5 -1
  307. package/scripts/gate/gate-tree.ts +3 -4
  308. package/scripts/gate/hook-gate-reuse.ts +9 -9
  309. package/scripts/gate/machine-capacity.ts +168 -30
  310. package/scripts/gate/pre-commit-type-check.ts +4 -4
  311. package/scripts/gate/project-checks.ts +12 -4
  312. package/scripts/gate/scoped-green.ts +11 -18
  313. package/scripts/gate/type-check-command.ts +2 -2
  314. package/scripts/gate/type-check-step.ts +4 -4
  315. package/scripts/gate/verification-gate.ts +53 -51
  316. package/scripts/gh/gh-spawn.ts +2 -2
  317. package/scripts/gh/git-ai-review-scan.ts +3 -2
  318. package/scripts/gh/git-gh-api-path.ts +10 -11
  319. package/scripts/gh/git-gh-exec.ts +43 -48
  320. package/scripts/gh/git-gh-failure.ts +6 -9
  321. package/scripts/gh/git-gh-helpers.ts +1 -1
  322. package/scripts/gh/git-gh-issue-list.ts +15 -19
  323. package/scripts/gh/git-gh-issue-read.ts +43 -60
  324. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  325. package/scripts/gh/git-gh-issue-write.ts +52 -40
  326. package/scripts/gh/git-gh-issue.ts +23 -24
  327. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  328. package/scripts/gh/git-gh-pr-read.ts +46 -50
  329. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  330. package/scripts/gh/git-gh-pr-review.ts +2 -2
  331. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  332. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  333. package/scripts/gh/git-gh-pr.ts +16 -16
  334. package/scripts/gh/git-gh-reachability.ts +11 -12
  335. package/scripts/gh/git-gh-repo.ts +2 -3
  336. package/scripts/gh/git-gh-rest-state.ts +1 -1
  337. package/scripts/gh/git-pr-ai-review.ts +6 -5
  338. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  339. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  340. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  341. package/scripts/gh/git-pr-checks.ts +20 -23
  342. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  343. package/scripts/gh/git-pr-confirmation.ts +5 -5
  344. package/scripts/gh/git-pr-managed-config.ts +7 -9
  345. package/scripts/gh/git-pr-messages.ts +1 -1
  346. package/scripts/gh/git-pr.ts +15 -16
  347. package/scripts/gh/github-issue-url.ts +8 -9
  348. package/scripts/git/base-tree.ts +66 -0
  349. package/scripts/git/change-base.ts +42 -2
  350. package/scripts/git/changed-file-scope.ts +5 -5
  351. package/scripts/git/changed-paths.ts +1 -2
  352. package/scripts/git/constants.ts +2 -2
  353. package/scripts/git/git-branch.ts +1 -1
  354. package/scripts/git/git-closes-keyword.ts +3 -3
  355. package/scripts/git/git-command.ts +53 -41
  356. package/scripts/git/git-common-directory.ts +3 -3
  357. package/scripts/git/git-diff-reads.ts +14 -15
  358. package/scripts/git/git-error.ts +1 -1
  359. package/scripts/git/git-execa-error.ts +1 -2
  360. package/scripts/git/git-issue.ts +10 -8
  361. package/scripts/git/git-location-environment.ts +3 -4
  362. package/scripts/git/git-ls-remote.ts +6 -8
  363. package/scripts/git/git-pre-push-hook.ts +11 -10
  364. package/scripts/git/git-preflight.ts +5 -5
  365. package/scripts/git/git-push-transport.ts +2 -2
  366. package/scripts/git/git-remote-branch.ts +1 -2
  367. package/scripts/git/git-schemas.ts +16 -23
  368. package/scripts/git/git-spawn-sync.ts +1 -1
  369. package/scripts/git/git-spawn.ts +37 -14
  370. package/scripts/git/git-ssh-keepalive.ts +12 -5
  371. package/scripts/git/git-staging.ts +7 -8
  372. package/scripts/git/git-workflow.ts +1 -1
  373. package/scripts/git/git-worktree.ts +35 -27
  374. package/scripts/git/gone-branch.ts +2 -2
  375. package/scripts/git/listing-cutoff.ts +1 -2
  376. package/scripts/git/lockfile-sync.ts +65 -0
  377. package/scripts/git/main-merge-guard.ts +1 -2
  378. package/scripts/git/main-merge.ts +7 -7
  379. package/scripts/git/main-sync.ts +23 -8
  380. package/scripts/git/parse-json-array.ts +18 -23
  381. package/scripts/git/repository-lock.ts +34 -2
  382. package/scripts/git/stash/git-stash.ts +4 -5
  383. package/scripts/git/stash/stash-orphans.ts +5 -3
  384. package/scripts/git/stash/stash-pop-args.ts +1 -1
  385. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  386. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  387. package/scripts/hooks/batch-guard.ts +11 -13
  388. package/scripts/hooks/check-commit-message.ts +12 -9
  389. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  390. package/scripts/hooks/edited-cspell.ts +3 -4
  391. package/scripts/hooks/format-edited-cli.ts +1 -1
  392. package/scripts/hooks/format-edited-file.ts +11 -17
  393. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  394. package/scripts/hooks/pre-push-unit.ts +10 -14
  395. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  396. package/scripts/hooks/pretool-guard.ts +93 -18
  397. package/scripts/hooks/reserved-run.ts +2 -2
  398. package/scripts/hooks/step-zero-notice.ts +1 -1
  399. package/scripts/hooks/stop-guard.ts +21 -10
  400. package/scripts/init/basic-path-migration.ts +2 -2
  401. package/scripts/init/claude-kit-only-settings.ts +2 -2
  402. package/scripts/init/claude-plugin-config.ts +2 -2
  403. package/scripts/init/distributed-paths.ts +4 -4
  404. package/scripts/init/hook-command-rewrite.ts +3 -3
  405. package/scripts/init/hook-launch.ts +5 -5
  406. package/scripts/init/init-actions.ts +13 -0
  407. package/scripts/init/init-ai-copy.ts +11 -11
  408. package/scripts/init/init-bootstrap.ts +3 -3
  409. package/scripts/init/init-copy-content.ts +4 -4
  410. package/scripts/init/init-logic-json-merge.ts +7 -9
  411. package/scripts/init/init-logic-migrate.ts +1 -1
  412. package/scripts/init/init-logic-templates.ts +1 -1
  413. package/scripts/init/init-logic-workspace.ts +4 -4
  414. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  415. package/scripts/init/init-logic.ts +19 -22
  416. package/scripts/init/init.ts +7 -7
  417. package/scripts/init/kit-base-preset.ts +1 -1
  418. package/scripts/init/kit-setup-state.ts +1 -1
  419. package/scripts/init/kit-written-paths.ts +1 -2
  420. package/scripts/init/package-manager-pin.ts +1 -1
  421. package/scripts/init/project-profile-cli.ts +1 -1
  422. package/scripts/init/project-profile.ts +3 -3
  423. package/scripts/init/session-language-environment.ts +1 -1
  424. package/scripts/init/start-exec.ts +3 -4
  425. package/scripts/init/start-plan.ts +2 -2
  426. package/scripts/init/start-setup-pr.ts +3 -2
  427. package/scripts/init/start-steps.ts +2 -2
  428. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  429. package/scripts/init/vscode-tasks.ts +62 -0
  430. package/scripts/issue/baseline-measure.ts +2 -2
  431. package/scripts/issue/behavior-change-lint.ts +2 -2
  432. package/scripts/issue/defect-rate-cli.ts +6 -7
  433. package/scripts/issue/defect-rate.ts +37 -27
  434. package/scripts/issue/git-next-issues.ts +9 -8
  435. package/scripts/issue/issue-auto-ok.ts +24 -11
  436. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  437. package/scripts/issue/issue-backlinks.ts +6 -6
  438. package/scripts/issue/issue-cite-cli.ts +20 -18
  439. package/scripts/issue/issue-cite.ts +18 -8
  440. package/scripts/issue/issue-closing-pr.ts +4 -4
  441. package/scripts/issue/issue-comment-cli.ts +6 -4
  442. package/scripts/issue/issue-file-cli.ts +52 -15
  443. package/scripts/issue/issue-file-fold.ts +155 -0
  444. package/scripts/issue/issue-file.ts +9 -6
  445. package/scripts/issue/issue-fold-cli.ts +14 -9
  446. package/scripts/issue/issue-fold.ts +23 -8
  447. package/scripts/issue/issue-labels.ts +34 -38
  448. package/scripts/issue/issue-lint-cli.ts +2 -2
  449. package/scripts/issue/issue-lint.ts +1 -1
  450. package/scripts/issue/issue-merged.ts +10 -4
  451. package/scripts/issue/issue-number-shape.ts +27 -0
  452. package/scripts/issue/issue-rank.ts +1 -1
  453. package/scripts/issue/issue-read-cli.ts +4 -5
  454. package/scripts/issue/issue-read.ts +4 -5
  455. package/scripts/issue/issue-reference.ts +5 -5
  456. package/scripts/issue/issue-release-cli.ts +17 -7
  457. package/scripts/issue/issue-release.ts +3 -3
  458. package/scripts/issue/issue-report-failures.ts +7 -4
  459. package/scripts/issue/issue-scout-cli.ts +11 -11
  460. package/scripts/issue/issue-scout-closed.ts +4 -4
  461. package/scripts/issue/issue-scout.ts +4 -5
  462. package/scripts/issue/issue-state-cli.ts +17 -10
  463. package/scripts/issue/issue-state.ts +12 -13
  464. package/scripts/issue/issue-wip.ts +7 -7
  465. package/scripts/issue/markdown-section.ts +3 -3
  466. package/scripts/issue/measure-rerun-cli.ts +10 -9
  467. package/scripts/issue/reproduction-measure.ts +3 -3
  468. package/scripts/issue/session-cite.ts +56 -0
  469. package/scripts/josh/agent-session-environment.ts +10 -8
  470. package/scripts/josh/cli-body.ts +2 -2
  471. package/scripts/josh/command-suggest.ts +1 -1
  472. package/scripts/josh/file-map-stamp.ts +20 -23
  473. package/scripts/josh/hook-decision.ts +24 -28
  474. package/scripts/josh/josh-command-map.ts +4 -1
  475. package/scripts/josh/josh-command-types.ts +30 -35
  476. package/scripts/josh/josh-commands-ai.ts +6 -6
  477. package/scripts/josh/josh-commands-backlog.ts +15 -3
  478. package/scripts/josh/josh-commands-clone.ts +1 -1
  479. package/scripts/josh/josh-commands-development.ts +25 -4
  480. package/scripts/josh/josh-commands-document.ts +3 -3
  481. package/scripts/josh/josh-commands-guard.ts +3 -3
  482. package/scripts/josh/josh-commands-issue.ts +4 -5
  483. package/scripts/josh/josh-commands-lane.ts +14 -4
  484. package/scripts/josh/josh-commands-lint.ts +1 -1
  485. package/scripts/josh/josh-commands-run.ts +21 -7
  486. package/scripts/josh/josh-commands-split.ts +1 -2
  487. package/scripts/josh/josh-commands-versioning.ts +5 -5
  488. package/scripts/josh/josh-commands-workflow.ts +30 -22
  489. package/scripts/josh/josh-environment-file.ts +1 -1
  490. package/scripts/josh/josh-in-process.ts +3 -3
  491. package/scripts/josh/josh-logic.ts +6 -7
  492. package/scripts/josh/josh-run.ts +3 -3
  493. package/scripts/josh/josh-verdict.ts +9 -12
  494. package/scripts/josh/josh.ts +3 -3
  495. package/scripts/josh/kit-only.ts +2 -2
  496. package/scripts/josh/path-decision.ts +3 -3
  497. package/scripts/josh/platform-temporary.ts +7 -5
  498. package/scripts/josh/process-identity.ts +24 -6
  499. package/scripts/josh/process-owner.ts +4 -4
  500. package/scripts/josh/session-language-cli.ts +53 -11
  501. package/scripts/josh/session-language.ts +1 -1
  502. package/scripts/josh/stamp-file.ts +48 -29
  503. package/scripts/josh/stamp-record.ts +57 -0
  504. package/scripts/lane/lane-await.ts +35 -11
  505. package/scripts/lane/lane-cache.ts +6 -6
  506. package/scripts/lane/lane-capacity.ts +32 -17
  507. package/scripts/lane/lane-child-invocation.ts +17 -15
  508. package/scripts/lane/lane-child-marker.ts +12 -12
  509. package/scripts/lane/lane-cli.ts +12 -13
  510. package/scripts/lane/lane-close.ts +6 -6
  511. package/scripts/lane/lane-dispatch.ts +61 -72
  512. package/scripts/lane/lane-environment.ts +5 -5
  513. package/scripts/lane/lane-guard-policy.ts +7 -21
  514. package/scripts/lane/lane-handoff.ts +2 -2
  515. package/scripts/lane/lane-install.ts +9 -10
  516. package/scripts/lane/lane-launch-cli.ts +13 -8
  517. package/scripts/lane/lane-ledger.ts +73 -11
  518. package/scripts/lane/lane-leftover.ts +2 -2
  519. package/scripts/lane/lane-limit-cli.ts +160 -0
  520. package/scripts/lane/lane-limit-override.ts +74 -0
  521. package/scripts/lane/lane-load.ts +19 -68
  522. package/scripts/lane/lane-measure-cli.ts +15 -25
  523. package/scripts/lane/lane-occupancy.ts +6 -4
  524. package/scripts/lane/lane-open.ts +20 -19
  525. package/scripts/lane/lane-output.ts +4 -3
  526. package/scripts/lane/lane-paths.ts +12 -11
  527. package/scripts/lane/lane-phase.ts +33 -0
  528. package/scripts/lane/lane-reap.ts +2 -2
  529. package/scripts/lane/lane-registry.ts +16 -15
  530. package/scripts/lane/lane-relaunch.ts +9 -9
  531. package/scripts/lane/lane-report.ts +5 -4
  532. package/scripts/lane/lane-resume.ts +2 -2
  533. package/scripts/lane/lane-sampler.ts +55 -0
  534. package/scripts/lane/lane-seed.ts +7 -7
  535. package/scripts/lane/lane-stage-stats.ts +135 -0
  536. package/scripts/lane/lane-start-point.ts +8 -11
  537. package/scripts/lane/lane-stats.ts +60 -15
  538. package/scripts/lane/lane-stray.ts +1 -1
  539. package/scripts/lane/lane-vacant.ts +1 -1
  540. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  541. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  542. package/scripts/lane/openai-review-broker.ts +2 -4
  543. package/scripts/lib/ancestor-directories.ts +1 -1
  544. package/scripts/lib/bounded-pool.ts +2 -2
  545. package/scripts/lib/buffered-process.ts +4 -6
  546. package/scripts/lib/caddy-logs.sh +0 -0
  547. package/scripts/lib/cli-flags.ts +39 -6
  548. package/scripts/lib/error-message.ts +1 -1
  549. package/scripts/lib/json-value.ts +17 -3
  550. package/scripts/lib/poll.ts +1 -1
  551. package/scripts/lib/status-icons.ts +3 -3
  552. package/scripts/lib/timed-fetch.ts +1 -1
  553. package/scripts/lib/timeouts.ts +1 -1
  554. package/scripts/lines/bytes-command.ts +3 -4
  555. package/scripts/lines/effective-limit.ts +25 -12
  556. package/scripts/lines/line-budget.ts +47 -55
  557. package/scripts/lines/line-targets.ts +6 -2
  558. package/scripts/lines/lines-command.ts +3 -3
  559. package/scripts/lint/cross-file-recheck.ts +155 -0
  560. package/scripts/lint/cspell-cached.ts +1 -1
  561. package/scripts/lint/format.ts +1 -2
  562. package/scripts/lint/lint-parallel.ts +35 -19
  563. package/scripts/lint/lint-related-scope.ts +25 -15
  564. package/scripts/lint/lint-related.ts +6 -7
  565. package/scripts/managed-marker/index.ts +1 -1
  566. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  567. package/scripts/notify/git-notify.ts +9 -7
  568. package/scripts/notify/telegram-notify.ts +53 -37
  569. package/scripts/notify/telegram-test-logic.ts +3 -3
  570. package/scripts/notify/telegram-test.ts +45 -30
  571. package/scripts/observations/observation-ledger-home.ts +14 -8
  572. package/scripts/observations/observation-ledger-line.ts +3 -2
  573. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  574. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  575. package/scripts/observations/observation-ledger.ts +14 -15
  576. package/scripts/observations/observation-record-cli.ts +83 -0
  577. package/scripts/observations/observation-record.ts +91 -0
  578. package/scripts/observations/observations-flush-cli.ts +1 -1
  579. package/scripts/observations/observations-flush-landing.ts +7 -6
  580. package/scripts/observations/observations-flush.ts +26 -27
  581. package/scripts/overrides/overrides-check.ts +18 -8
  582. package/scripts/package/package-scout-cli.ts +1 -1
  583. package/scripts/package/package-scout-format.ts +2 -2
  584. package/scripts/package/package-scout.ts +1 -1
  585. package/scripts/propagate/propagate-git-failure.ts +1 -1
  586. package/scripts/propagate/propagate-git.ts +7 -7
  587. package/scripts/propagate/propagate-plan.ts +2 -2
  588. package/scripts/propagate/propagate-publish.ts +2 -3
  589. package/scripts/propagate/propagate-run.ts +5 -7
  590. package/scripts/propagate/propagate-select.ts +1 -1
  591. package/scripts/propagate/propagate-steps.ts +19 -20
  592. package/scripts/propagate/propagate-targets.ts +6 -10
  593. package/scripts/propagate/propagate.ts +5 -5
  594. package/scripts/refactor/import-graph.ts +1 -1
  595. package/scripts/refactor/refactor-lint.ts +4 -10
  596. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  597. package/scripts/refactor/refactor-scan.ts +2 -2
  598. package/scripts/refactor/refactor-targets.ts +1 -1
  599. package/scripts/release/github-release-cli.ts +25 -3
  600. package/scripts/release/github-release-runs.ts +1 -1
  601. package/scripts/release/release-cli.ts +21 -4
  602. package/scripts/release/release-history.ts +6 -10
  603. package/scripts/release/release-plan.ts +3 -3
  604. package/scripts/release/release-progress.ts +3 -4
  605. package/scripts/release/release-publish.ts +8 -9
  606. package/scripts/release/release-scope-cli.ts +8 -10
  607. package/scripts/release/release-tag.ts +6 -8
  608. package/scripts/release/release-worktree.ts +5 -5
  609. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  610. package/scripts/repo/auto-merge-setting.ts +1 -1
  611. package/scripts/repo/repo-setting.ts +4 -4
  612. package/scripts/repo/repository-labels.ts +1 -1
  613. package/scripts/repo/required-checks-logic.ts +3 -3
  614. package/scripts/repo/required-checks-report.ts +1 -1
  615. package/scripts/repo/ruleset-check-cli.ts +1 -1
  616. package/scripts/repo/ruleset-check.ts +1 -1
  617. package/scripts/report/report-format-reference.ts +26 -0
  618. package/scripts/report/report-lint-cli.ts +2 -2
  619. package/scripts/report/report-lint.ts +16 -2
  620. package/scripts/review/disposition-cli.ts +2 -2
  621. package/scripts/review/disposition-logic.ts +1 -1
  622. package/scripts/review/live-evidence.ts +9 -6
  623. package/scripts/review/review-attest-cli.ts +1 -2
  624. package/scripts/review/review-attest.ts +3 -3
  625. package/scripts/review/review-brief-cli.ts +19 -20
  626. package/scripts/review/review-brief.ts +29 -32
  627. package/scripts/review/review-checkout.ts +2 -2
  628. package/scripts/review/review-diff-parts.ts +3 -5
  629. package/scripts/review/review-diff-write.ts +1 -1
  630. package/scripts/review/review-finding-ledger.ts +7 -4
  631. package/scripts/review/review-findings-cli.ts +2 -2
  632. package/scripts/review/review-level.ts +4 -7
  633. package/scripts/review/review-record-cli.ts +73 -16
  634. package/scripts/review/review-record.ts +5 -4
  635. package/scripts/review/review-round2-cli.ts +2 -3
  636. package/scripts/review/review-round2.ts +13 -21
  637. package/scripts/review/review-stamps.ts +9 -71
  638. package/scripts/review/review-tree.ts +4 -5
  639. package/scripts/rules/bash-triggers.ts +4 -4
  640. package/scripts/rules/decision-oracle-batch.ts +6 -7
  641. package/scripts/rules/decision-oracle-stage.ts +1 -1
  642. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  643. package/scripts/rules/decision-oracle.ts +2 -2
  644. package/scripts/rules/delivered-rules.ts +61 -406
  645. package/scripts/rules/destructive-command.ts +2 -2
  646. package/scripts/rules/direct-filing.ts +4 -4
  647. package/scripts/rules/direct-pr-create.ts +2 -2
  648. package/scripts/rules/early-heartbeat.ts +15 -19
  649. package/scripts/rules/file-body.ts +5 -6
  650. package/scripts/rules/filing-cap.ts +6 -7
  651. package/scripts/rules/filing-offer.ts +1 -1
  652. package/scripts/rules/firing-point.ts +6 -6
  653. package/scripts/rules/gh-api.ts +2 -2
  654. package/scripts/rules/git-argv.ts +3 -3
  655. package/scripts/rules/git-force.ts +2 -2
  656. package/scripts/rules/hook-context-line.ts +31 -0
  657. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  658. package/scripts/rules/implementation-cut.ts +35 -32
  659. package/scripts/rules/index-guard.ts +2 -2
  660. package/scripts/rules/issue-citation.ts +7 -7
  661. package/scripts/rules/issue-comments.ts +21 -13
  662. package/scripts/rules/josh-git-bare.ts +2 -2
  663. package/scripts/rules/lane-background.ts +14 -16
  664. package/scripts/rules/lane-carry-conflict.ts +41 -5
  665. package/scripts/rules/lane-interactive-ask.ts +6 -9
  666. package/scripts/rules/lane-park.ts +12 -16
  667. package/scripts/rules/lane-split-park.ts +1 -2
  668. package/scripts/rules/lane-switch-main.ts +10 -13
  669. package/scripts/rules/last-prompt.ts +1 -1
  670. package/scripts/rules/oracle-consulted.ts +5 -5
  671. package/scripts/rules/oracle-firing.ts +6 -9
  672. package/scripts/rules/oracle-list-cli.ts +2 -2
  673. package/scripts/rules/permission-guards.ts +2 -2
  674. package/scripts/rules/piped-verification.ts +79 -9
  675. package/scripts/rules/poll-loop.ts +9 -11
  676. package/scripts/rules/pre-gate-cut.ts +33 -30
  677. package/scripts/rules/prior-comment-read.ts +3 -3
  678. package/scripts/rules/protected-files.ts +25 -13
  679. package/scripts/rules/raw-field-body.ts +3 -4
  680. package/scripts/rules/reply-language.ts +1 -1
  681. package/scripts/rules/rule-body-guard.ts +10 -12
  682. package/scripts/rules/rule-guard.ts +1 -1
  683. package/scripts/rules/rule-list.ts +51 -0
  684. package/scripts/rules/rule-registry-rows.ts +282 -0
  685. package/scripts/rules/rule-registry.ts +109 -0
  686. package/scripts/rules/rule-value-cache.ts +2 -2
  687. package/scripts/rules/rule-value-cli.ts +6 -4
  688. package/scripts/rules/rule-value.ts +61 -22
  689. package/scripts/rules/run-tail-rule.ts +11 -15
  690. package/scripts/rules/shell-body-trigger.ts +7 -7
  691. package/scripts/rules/shell-segments.ts +2 -4
  692. package/scripts/rules/stop-rules.ts +54 -41
  693. package/scripts/rules/tail-commands.ts +1 -1
  694. package/scripts/rules/test-declared-commit.ts +2 -2
  695. package/scripts/rules/third-party-write.ts +3 -3
  696. package/scripts/rules/worktree-guard.ts +12 -5
  697. package/scripts/run/add/run-add-cli.ts +165 -0
  698. package/scripts/run/add/run-add.ts +124 -0
  699. package/scripts/run/board/run-board-cli.ts +207 -0
  700. package/scripts/run/board/run-board-closed.ts +95 -0
  701. package/scripts/run/board/run-board-every.ts +60 -0
  702. package/scripts/run/board/run-board-fetch.ts +38 -0
  703. package/scripts/run/board/run-board-fit.ts +219 -0
  704. package/scripts/run/board/run-board-github.ts +162 -0
  705. package/scripts/run/board/run-board-header.ts +275 -0
  706. package/scripts/run/board/run-board-kind.ts +35 -0
  707. package/scripts/run/board/run-board-labels.ts +299 -0
  708. package/scripts/run/board/run-board-layout.ts +222 -0
  709. package/scripts/run/board/run-board-link.ts +31 -0
  710. package/scripts/run/board/run-board-machine.ts +198 -0
  711. package/scripts/run/board/run-board-notes.ts +103 -0
  712. package/scripts/run/board/run-board-phase.ts +136 -0
  713. package/scripts/run/board/run-board-plan.ts +129 -0
  714. package/scripts/run/board/run-board-read.ts +62 -0
  715. package/scripts/run/board/run-board-render-legend.ts +82 -0
  716. package/scripts/run/board/run-board-render-notes.ts +77 -0
  717. package/scripts/run/board/run-board-render-slot.ts +50 -0
  718. package/scripts/run/board/run-board-render.ts +407 -0
  719. package/scripts/run/board/run-board-scope.ts +17 -0
  720. package/scripts/run/board/run-board-screen.ts +43 -0
  721. package/scripts/run/board/run-board-span.ts +66 -0
  722. package/scripts/run/board/run-board-spin.ts +115 -0
  723. package/scripts/run/board/run-board-state.ts +113 -0
  724. package/scripts/run/board/run-board-status.ts +279 -0
  725. package/scripts/run/board/run-board-tick.ts +210 -0
  726. package/scripts/run/board/run-board-track.ts +22 -0
  727. package/scripts/run/board/run-board-usage-read.ts +255 -0
  728. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  729. package/scripts/run/board/run-board-usage-text.ts +80 -0
  730. package/scripts/run/board/run-board-usage.ts +165 -0
  731. package/scripts/run/carry/run-carry-added.ts +62 -0
  732. package/scripts/run/carry/run-carry-args.ts +25 -22
  733. package/scripts/run/carry/run-carry-change.ts +1 -1
  734. package/scripts/run/carry/run-carry-cli.ts +71 -48
  735. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  736. package/scripts/run/carry/run-carry-ended.ts +85 -0
  737. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  738. package/scripts/run/carry/run-carry-stash.ts +3 -2
  739. package/scripts/run/carry/run-carry-streak.ts +8 -10
  740. package/scripts/run/carry/run-carry.ts +85 -89
  741. package/scripts/run/cut/run-cut-args.ts +7 -7
  742. package/scripts/run/cut/run-cut-cli.ts +54 -36
  743. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  744. package/scripts/run/cut/run-cut-report.ts +37 -16
  745. package/scripts/run/cut/run-cut.ts +63 -77
  746. package/scripts/run/detached-launch.ts +35 -50
  747. package/scripts/run/entry/run-entry-cli.ts +48 -27
  748. package/scripts/run/entry/run-entry-stop.ts +7 -9
  749. package/scripts/run/entry/run-entry.ts +5 -6
  750. package/scripts/run/event/run-event-cli.ts +5 -6
  751. package/scripts/run/event/run-event-filed.ts +69 -0
  752. package/scripts/run/event/run-event-follow.ts +3 -3
  753. package/scripts/run/event/run-event-plan.ts +38 -0
  754. package/scripts/run/event/run-event-render.ts +9 -4
  755. package/scripts/run/event/run-event-scope.ts +47 -18
  756. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  757. package/scripts/run/event/run-event-stream.ts +171 -46
  758. package/scripts/run/event/run-event-watch.ts +4 -6
  759. package/scripts/run/hold/run-hold-cli.ts +65 -62
  760. package/scripts/run/hold/run-hold.ts +88 -46
  761. package/scripts/run/merge/run-merge-cli.ts +116 -77
  762. package/scripts/run/merge/run-merge-collect.ts +107 -0
  763. package/scripts/run/merge/run-merge-steps.ts +112 -65
  764. package/scripts/run/merge/run-merge-token.ts +30 -0
  765. package/scripts/run/merge/run-merge.ts +31 -22
  766. package/scripts/run/progress/run-progress-args.ts +4 -4
  767. package/scripts/run/progress/run-progress-cli.ts +39 -50
  768. package/scripts/run/progress/run-progress-clock.ts +25 -32
  769. package/scripts/run/progress/run-progress-config.ts +6 -9
  770. package/scripts/run/progress/run-progress-read.ts +9 -10
  771. package/scripts/run/progress/run-progress.ts +48 -53
  772. package/scripts/run/review/run-review-cli.ts +6 -6
  773. package/scripts/run/review/run-review-steps.ts +6 -6
  774. package/scripts/run/review/run-review.ts +9 -11
  775. package/scripts/run/run-cli-fault.ts +29 -0
  776. package/scripts/run/run-ending-cli.ts +3 -3
  777. package/scripts/run/run-ending.ts +10 -14
  778. package/scripts/run/run-halfrun-resume.ts +6 -8
  779. package/scripts/run/run-headless.ts +26 -12
  780. package/scripts/run/run-invocation.ts +17 -22
  781. package/scripts/run/run-label.ts +7 -5
  782. package/scripts/run/run-liveness-cli.ts +19 -6
  783. package/scripts/run/run-liveness.ts +27 -38
  784. package/scripts/run/run-next-cli.ts +5 -9
  785. package/scripts/run/run-next.ts +4 -5
  786. package/scripts/run/run-parent-cut-hook.ts +10 -12
  787. package/scripts/run/run-preflight.ts +25 -29
  788. package/scripts/run/run-prep-cli.ts +17 -13
  789. package/scripts/run/run-prep-locate.ts +4 -5
  790. package/scripts/run/run-prep.ts +7 -10
  791. package/scripts/run/run-prrun-resume.ts +2 -2
  792. package/scripts/run/run-report-cli.ts +4 -4
  793. package/scripts/run/run-report.ts +9 -14
  794. package/scripts/run/run-retrospective.ts +3 -3
  795. package/scripts/run/run-section.ts +42 -0
  796. package/scripts/run/run-stage-read.ts +2 -2
  797. package/scripts/run/run-stage.ts +6 -4
  798. package/scripts/run/run-status-cli.ts +7 -5
  799. package/scripts/run/run-status.ts +6 -7
  800. package/scripts/run/run-step-cli.ts +64 -18
  801. package/scripts/run/run-step.ts +107 -51
  802. package/scripts/run/run-stop-notify.ts +7 -8
  803. package/scripts/run/run-stranded-cli.ts +1 -1
  804. package/scripts/run/run-stranded-detect.ts +4 -4
  805. package/scripts/run/run-stranded.ts +11 -13
  806. package/scripts/run/run-tail-cli.ts +15 -16
  807. package/scripts/run/run-tail.ts +14 -33
  808. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  809. package/scripts/run/run-watcher-guard.ts +11 -12
  810. package/scripts/run/run-watcher-hook.ts +6 -12
  811. package/scripts/run/ship/run-ship-cli.ts +67 -33
  812. package/scripts/run/ship/run-ship-detach.ts +15 -13
  813. package/scripts/run/ship/run-ship-lock.ts +1 -1
  814. package/scripts/run/ship/run-ship-next.ts +7 -8
  815. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  816. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  817. package/scripts/run/ship/run-ship-probe.ts +4 -4
  818. package/scripts/run/ship/run-ship-return.ts +1 -1
  819. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  820. package/scripts/run/ship/run-ship-review.ts +12 -14
  821. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  822. package/scripts/run/ship/run-ship-stage.ts +80 -26
  823. package/scripts/run/ship/run-ship-steps.ts +26 -16
  824. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  825. package/scripts/run/ship/run-ship-sync.ts +9 -8
  826. package/scripts/run/ship/run-ship.ts +17 -32
  827. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  828. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  829. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  830. package/scripts/run/tidy/run-tidy.ts +4 -3
  831. package/scripts/run/wake/run-wake-cli.ts +27 -32
  832. package/scripts/run/wake/run-wake-describe.ts +24 -28
  833. package/scripts/run/wake/run-wake-driver.ts +14 -14
  834. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  835. package/scripts/run/wake/run-wake-loop.ts +9 -9
  836. package/scripts/run/wake/run-wake-restart.ts +4 -5
  837. package/scripts/run/wake/run-wake-session.ts +23 -27
  838. package/scripts/run/wake/run-wake.ts +57 -279
  839. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  840. package/scripts/safe-chain/pack-hook.ts +2 -2
  841. package/scripts/safe-chain/preinstall-command.ts +2 -2
  842. package/scripts/security/security-audit-logic.ts +1 -1
  843. package/scripts/security/security-audit-provision-logic.ts +1 -1
  844. package/scripts/security/security-audit-provision.ts +2 -2
  845. package/scripts/security/security-audit.ts +5 -5
  846. package/scripts/security/security-updates-logic.ts +2 -3
  847. package/scripts/security/security-updates.ts +2 -4
  848. package/scripts/self-sync-guard/index.ts +1 -1
  849. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  850. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  851. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  852. package/scripts/sonar/sonar-hotspots.ts +1 -1
  853. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  854. package/scripts/sonar/sonar-new-code.ts +1 -1
  855. package/scripts/sonar/sonar-project.ts +1 -1
  856. package/scripts/split/split-assess-cli.ts +1 -1
  857. package/scripts/split/split-assess.ts +3 -3
  858. package/scripts/sync/directory-copy-guard.ts +2 -3
  859. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  860. package/scripts/sync/managed-config-scope.ts +4 -4
  861. package/scripts/sync/plugin-skill-directories.ts +2 -2
  862. package/scripts/sync/reconcile-templates.ts +17 -8
  863. package/scripts/sync/removed-skill-manifest.ts +2 -3
  864. package/scripts/sync/sync-ai-files.ts +7 -7
  865. package/scripts/sync/sync-configs.ts +30 -3
  866. package/scripts/sync/sync-hook-safety.ts +2 -2
  867. package/scripts/sync/sync.ts +23 -10
  868. package/scripts/sync/synced-paths.ts +2 -1
  869. package/scripts/sync/workflow-pin-logic.ts +1 -1
  870. package/scripts/test/test-declared-changed.ts +4 -4
  871. package/scripts/test/test-declared-logic.ts +2 -3
  872. package/scripts/test/test-declared-match.ts +25 -4
  873. package/scripts/test/test-declared.ts +26 -9
  874. package/scripts/test/test-red-commit.ts +3 -2
  875. package/scripts/test/test-red-logic.ts +7 -14
  876. package/scripts/test/test-red.ts +12 -47
  877. package/scripts/test/test-related-scope.ts +2 -3
  878. package/scripts/test/test-related.ts +3 -3
  879. package/scripts/test/test-type-logic.ts +1 -2
  880. package/scripts/test/test-unit-guard.ts +13 -17
  881. package/scripts/test/unit-worker-share.ts +7 -8
  882. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  883. package/scripts/time-runtime/time-background.ts +17 -21
  884. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  885. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  886. package/scripts/time-runtime/time-bundles.ts +11 -12
  887. package/scripts/time-runtime/time-call-identity.ts +1 -1
  888. package/scripts/time-runtime/time-command-key.ts +2 -2
  889. package/scripts/time-runtime/time-density-hook.ts +8 -11
  890. package/scripts/time-runtime/time-density.ts +5 -5
  891. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  892. package/scripts/time-runtime/time-format.ts +5 -5
  893. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  894. package/scripts/time-runtime/time-instant.ts +1 -1
  895. package/scripts/time-runtime/time-markers.ts +15 -19
  896. package/scripts/time-runtime/time-phase-names.ts +3 -3
  897. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  898. package/scripts/time-runtime/time-round-trips.ts +20 -23
  899. package/scripts/time-runtime/time-shell.ts +8 -8
  900. package/scripts/time-runtime/time-single-check.ts +1 -2
  901. package/scripts/time-runtime/time-spans.ts +35 -40
  902. package/scripts/time-runtime/time-tool-call.ts +15 -16
  903. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  904. package/scripts/time-runtime/time-writes.ts +5 -5
  905. package/scripts/ui/ui-routes-cli.ts +1 -2
  906. package/scripts/ui/ui-routes.ts +1 -2
  907. package/scripts/version/bump-version.ts +1 -1
  908. package/scripts/version/fresh-metadata-cache.ts +2 -2
  909. package/scripts/version/latest-corepack.ts +26 -26
  910. package/scripts/version/latest-lane-guard.ts +1 -1
  911. package/scripts/version/latest-scope-cli.ts +2 -2
  912. package/scripts/version/latest-stamp.ts +1 -2
  913. package/scripts/version/latest-update.ts +2 -2
  914. package/scripts/version/npm-registry.ts +2 -2
  915. package/scripts/version/package-manager-version.ts +18 -0
  916. package/scripts/version/publishable-range-check.ts +2 -1
  917. package/scripts/version/publishable-range.ts +1 -1
  918. package/scripts/version/release-age.ts +11 -11
  919. package/scripts/version/release-hold.ts +2 -2
  920. package/scripts/version/safe-chain-version-update.ts +3 -3
  921. package/scripts/version/version-check-logic.ts +2 -3
  922. package/scripts/version/version-check.ts +1 -2
  923. package/scripts/version/version-command-config.ts +2 -2
  924. package/scripts/version/version-commands.ts +3 -3
  925. package/scripts/version/version-remote.ts +4 -4
  926. package/scripts/version/version-targets.ts +2 -2
  927. package/templates/gitignore +7 -0
  928. package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
  929. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  930. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  931. package/scripts/backlog/backlog-restructure.ts +0 -152
  932. package/scripts/rules/issue-fold-rule.ts +0 -72
  933. package/scripts/rules/wip-cap.ts +0 -63
  934. package/scripts/run/run-issue-number.ts +0 -19
@@ -1,7 +1,10 @@
1
+ import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
2
+ import { json_value } from '#scripts/lib/json-value'
3
+ import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
1
4
  import { time_shell } from '#scripts/time-runtime/time-shell'
2
5
  import { shell_segments } from './shell-segments'
3
6
 
4
- // The rule delivered at the call that pipes a verification command (joshuafolkken/kit#1556).
7
+ // The rule delivered at the call that pipes a verification command.
5
8
  //
6
9
  // **A pipeline exits with its last command's status.** `pnpm josh gate 2>&1 | tail -40` therefore
7
10
  // answers success on a gate that printed `✗ verification gate failed`, and the failure that was
@@ -54,9 +57,8 @@ const VERIFICATION_COMMANDS: ReadonlySet<string> = new Set([
54
57
  ])
55
58
 
56
59
  // **The canonical name of each check, and both spellings still match**: `pnpm josh ga | tail` masks a
57
- // gate exactly as the long spelling does, and since joshuafolkken/kit#1789 the alias is expanded where
58
- // the command is read rather than by widening this set with every alias standing for one of its names
59
- // (joshuafolkken/kit#1643 for the reading). The suite names `pnpm josh ga` for that reason: an
60
+ // gate exactly as the long spelling does, and the alias is expanded where the command is read rather
61
+ // than by widening this set with every alias standing for one of its names. The suite names `pnpm josh ga` for that reason: an
60
62
  // expansion that regressed would show up here rather than as a guard that quietly stopped firing.
61
63
  function is_verification_command(segment: string): boolean {
62
64
  return shell_segments.is_josh_command(segment, VERIFICATION_COMMANDS)
@@ -93,15 +95,18 @@ const PIPED_VERIFICATION_REASON =
93
95
  // command chain quoted inside a body is text rather than a call, and this repository's issue bodies
94
96
  // quote them constantly — without the blanking the two halves disagree, and
95
97
  // `gh issue comment 1 --body "… | pnpm josh gate | …"` reads as a check whose verdict survived.
96
- function command_pieces(command: string): Array<string> {
98
+ function pipelines_of(command: string): Array<Array<string>> {
97
99
  return shell_segments
98
100
  .segments_of(time_shell.unquoted(command))
99
- .flatMap((segment) => segment.split('|'))
100
- .map((piece) => piece.trim())
101
+ .map((segment) => segment.split('|').map((piece) => piece.trim()))
102
+ }
103
+
104
+ function command_pieces(command: string): Array<string> {
105
+ return pipelines_of(command).flat()
101
106
  }
102
107
 
103
- // **The occasion this rule governs: a check whose result means pass or fail, run at all**
104
- // (joshuafolkken/kit#1643). The trigger fires only on the masked spelling, so a run that never piped
108
+ // **The occasion this rule governs: a check whose result means pass or fail, run at all**.
109
+ // The trigger fires only on the masked spelling, so a run that never piped
105
110
  // one would drop out of the reading entirely and the rate would be taken over runs that masked at
106
111
  // least once.
107
112
  function runs_verification(command: string): boolean {
@@ -115,11 +120,76 @@ function keeps_verdict_intact(command: string): boolean {
115
120
  return runs_verification(command) && !is_masked_verification(command)
116
121
  }
117
122
 
123
+ // **The commonest masking is rewritten rather than refused**. Almost every
124
+ // refusal was a check narrowed with `| tail` or `| grep`, and the refusal cost a round trip to arrive at
125
+ // the call `set -o pipefail;` in front would have made. Prefixed, the pipeline carries the check's
126
+ // status, which is the rule's whole outcome — so the hook runs that call instead.
127
+ //
128
+ // **Only a filter that reads its input to the end qualifies.** One that exits early — `head`, or a
129
+ // `grep` stopping at its first match — closes the pipe on a check still writing, and under `pipefail` the
130
+ // check's SIGPIPE turns a passing run into exit 141; `head` also cuts the verdict line josh prints last.
131
+ //
132
+ // **Every command on the line is a josh check or a filter after one.** The rewrite answers `allow`, so
133
+ // anything else chained beside the check — `&& rm -r dist`, or a `git log | head` never written for
134
+ // `pipefail` — would skip the permission prompt it would otherwise meet. Those lines are refused as before.
135
+ //
136
+ // **The raw line is read for what the cut cannot see.** `segments_of` does not split on a lone `&`, and
137
+ // `time_shell.unquoted` blanks a double-quoted `$(…)`, so `| tail & curl …`, `| tail > ~/.zshrc` and
138
+ // `| grep "$(cmd)"` all look like a filter after a check. Any `&`, redirection, backtick or `$(` beyond
139
+ // the `&&` chain and the check's own `2>&1` leaves the line to the refusal.
140
+ const PIPEFAIL_PREFIX = 'set -o pipefail; '
141
+ const FULL_READING_FILTER = /^(?:tail|grep)\b/u
142
+ const EARLY_EXIT_GREP =
143
+ /^grep\b.*\s(?:-[a-zA-Z]*[lLmq]|--(?:quiet|silent|max-count|files-with(?:out)?-match))/u
144
+
145
+ const ALLOWED_OPERATORS = /2>&1|&&/gu
146
+ const SIDE_EFFECT_SYNTAX = /[&<>`]|\$\(/u
147
+
148
+ const PIPEFAIL_NOTE =
149
+ '↻ piped verification: the josh check was piped, so `set -o pipefail;` was prefixed and the call ran ' +
150
+ "with the check's status carried to the exit code. Read the printed verdict, never the exit code " +
151
+ 'alone — `prompts/collaboration-workflow/output-bounds.md` (joshuafolkken/kit#3570).'
152
+
153
+ function reads_to_the_end(piece: string): boolean {
154
+ return FULL_READING_FILTER.test(piece) && !EARLY_EXIT_GREP.test(piece)
155
+ }
156
+
157
+ function is_filtered_check(pipeline: Array<string>): boolean {
158
+ const [head = '', ...filters] = pipeline
159
+
160
+ return is_verification_command(head) && filters.every((piece) => reads_to_the_end(piece))
161
+ }
162
+
163
+ function has_side_effect_syntax(command: string): boolean {
164
+ return SIDE_EFFECT_SYNTAX.test(command.replaceAll(ALLOWED_OPERATORS, ' '))
165
+ }
166
+
167
+ function is_pipefail_rewritable(command: string): boolean {
168
+ return (
169
+ is_masked_verification(command) &&
170
+ !has_side_effect_syntax(command) &&
171
+ pipelines_of(command).every((pipeline) => is_filtered_check(pipeline))
172
+ )
173
+ }
174
+
175
+ // The call's input with the prefix in front, or `undefined` where the call is not a rewritable masking.
176
+ function pipefail_input(call: GuardedCall): Record<string, unknown> | undefined {
177
+ if (call.name !== cost_blocks.BASH_TOOL || !json_value.is_record(call.input)) return undefined
178
+
179
+ const command = time_shell.bash_command(call.input)
180
+
181
+ if (!is_pipefail_rewritable(command)) return undefined
182
+
183
+ return { ...call.input, command: `${PIPEFAIL_PREFIX}${command}` }
184
+ }
185
+
118
186
  const piped_verification = {
119
187
  PIPED_VERIFICATION_REASON,
188
+ PIPEFAIL_NOTE,
120
189
  VERIFICATION_COMMANDS,
121
190
  is_masked_verification,
122
191
  keeps_verdict_intact,
192
+ pipefail_input,
123
193
  runs_verification,
124
194
  }
125
195
 
@@ -1,23 +1,22 @@
1
1
  import { time_shell } from '#scripts/time-runtime/time-shell'
2
2
  import { bash_triggers } from './bash-triggers'
3
3
 
4
- // The trigger and the delivered text behind the `poll-loop` row of `delivered-rules.ts`
5
- // (joshuafolkken/kit#2371). The hand-written wait loop a lane child improvises over a backgrounded
4
+ // The trigger and the delivered text behind the `poll-loop` row of `delivered-rules.ts`.
5
+ // The hand-written wait loop a lane child improvises over a backgrounded
6
6
  // command's output file.
7
7
  //
8
- // **The gap `early-heartbeat` left, on purpose.** joshuafolkken/kit#1570's rule refuses a bare
8
+ // **The gap `early-heartbeat` left, on purpose.** That rule refuses a bare
9
9
  // `sleep` — a clock timer arming a progress report — and it stands down the moment it sees a loop
10
10
  // keyword (`early-heartbeat.ts`'s `LOOP_KEYWORD`), because a loop that ends on a condition is waiting
11
11
  // on a thing rather than on a clock. This is that thing: a `while`/`until` loop that sleeps between
12
- // probes of a command's output file. It never appeared in the heartbeat reading, and it is the larger
13
- // half of the waste — six lanes lost about 45 minutes, 13% of their wall clock, to it.
12
+ // probes of a command's output file.
14
13
  //
15
14
  // **The loop does not know when the command finished.** A regex over the output file that never
16
15
  // matches waits to the harness block limit; one that matches a mid-run line exits too early. Either
17
16
  // way the command's *exit* is not what ends the wait, and each pass spends a full-context round trip.
18
17
  // A command backgrounded with `run_in_background` re-invokes the run when it exits — the completion
19
18
  // notification is what ends the wait on the task itself, which is the mechanism this row hands back,
20
- // the same reading joshuafolkken/kit#1510 took for the foreground push (`run-tail-rule.ts`).
19
+ // the same reading `run-tail-rule.ts` takes for the foreground push.
21
20
  //
22
21
  // **It fires on every occurrence**, for the reason `git-force.ts` does: a poll loop wastes the same
23
22
  // round trips each time it is armed, so refused-once-and-free-after would put every loop but the first
@@ -31,10 +30,9 @@ const LOOP_KEYWORD = /\b(?:while|until)\s/u
31
30
  // a stream reader. Read anywhere in the line rather than at a command position, because the loop body
32
31
  // puts it behind a `do` keyword (`; do sleep 30; done`), which no separator precedes. The argument is
33
32
  // matched as any non-space rather than a digit, so a variable duration (`sleep "$INTERVAL"`) is caught
34
- // as a literal one is — a poll with a configurable interval is still a poll (joshuafolkken/kit#2371,
35
- // review round 1).
33
+ // as a literal one is — a poll with a configurable interval is still a poll.
36
34
  const SLEEP_COMMAND = /\bsleep\s+\S/u
37
- // **A loop with no `sleep` is still a poll — a worse one** (joshuafolkken/kit#2421). A lane child ran
35
+ // **A loop with no `sleep` is still a poll — a worse one**. A lane child ran
38
36
  // `until [ -f /tmp/gate-done ]; do if ! kill -0 %1 …; then break; fi; done` for hours: a busy-wait
39
37
  // that spun a core on a marker nobody wrote, and slipped through because the rule required the
40
38
  // `sleep`. Two headers make a loop a poll with or without one. An `until` header waits for a state to
@@ -59,12 +57,12 @@ function is_state_wait(plain: string): boolean {
59
57
  }
60
58
 
61
59
  // **A `while read … done < file` is a stream reader, not a poll**, even when its body sleeps to
62
- // throttle processing (joshuafolkken/kit#2371, review round 1). Its condition consumes input rather
60
+ // throttle processing. Its condition consumes input rather
63
61
  // than probing for a state — a poll never reads its condition, it *tests* it (grep, wc, a file check)
64
62
  // — so the completion notification this rule points to has nothing to do with it. A `while read`
65
63
  // header is therefore always a stream reader; a line that also carried a separate `until` poll would
66
64
  // go un-refused, which fails safe (under-refusal) and is contrived enough not to warrant the added
67
- // regex the attempt to catch it needed (joshuafolkken/kit#2371, review round 2).
65
+ // regex the attempt to catch it needs.
68
66
  const STREAM_READER = /\bwhile\s+read\b/u
69
67
 
70
68
  function is_stream_reader(plain: string): boolean {
@@ -1,3 +1,4 @@
1
+ import { agent_session_role } from '#scripts/agent/agent-session-role'
1
2
  import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
2
3
  import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
3
4
  import { lane_child_marker } from '#scripts/lane/lane-child-marker'
@@ -7,31 +8,22 @@ import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
7
8
  import { bash_triggers } from './bash-triggers'
8
9
  import { shell_segments } from './shell-segments'
9
10
 
10
- // The pre-gate cut, delivered at the call it binds on (joshuafolkken/kit#1864).
11
+ // The pre-gate cut, delivered at the call it binds on.
11
12
  //
12
- // **The mechanism was there and nothing called it.** joshuafolkken/kit#1839 built the cut and
13
- // joshuafolkken/kit#1850 measured the result: across six lane children — #1853, #1849, #1855, #1854,
14
- // #1856 and #1847 — the cut was taken **0 times**. Four of the six issued the *entry* check
15
- // `pnpm josh run:cut --resume <N>` and were answered `fresh`; not one issued `pnpm josh run:cut <N>`,
16
- // the call that actually cuts. The procedure was read three to five times per run and remained one
17
- // step of prose in the middle of it, so joshuafolkken/kit#1839's fourth acceptance condition — the
18
- // drop in context per request — could not be judged at all.
19
- //
20
- // **This is the third time prose lost to a refusal.** joshuafolkken/kit#1344 measured three
21
- // consecutive runs in which resident text about batching moved the number not at all, and
22
- // joshuafolkken/kit#1460 measured the same for the investigation threshold; in both, a `PreToolUse`
23
- // refusal was what finally moved it. A step a run is free to skip is a step that gets skipped under
24
- // time pressure, and `run:hold` — the one boundary step that never gets missed — is the one that
25
- // refuses.
13
+ // **A refusal, not prose.** A lane child issues the *entry* check `pnpm josh run:cut --resume <N>`
14
+ // and goes on to the gate; carried as a step of prose, `pnpm josh run:cut <N>` — the call that
15
+ // actually cuts — is the step that gets skipped. A step a run is free to skip is a step that gets
16
+ // skipped under time pressure, and `run:hold` — the one boundary step that never gets missed — is
17
+ // the one that refuses.
26
18
 
27
19
  const GATE_COMMANDS: ReadonlySet<string> = new Set(['gate'])
28
20
  const CUT_COMMANDS: ReadonlySet<string> = new Set(['run:cut'])
29
21
  // The three spellings that ask about a cut rather than take one: the fresh process's entry check, the
30
- // teardown, and the record read. **Excluding them is the whole point** — four of the six measured
31
- // children issued `--resume` and went straight on to the gate, so a predicate that counted any
32
- // `run:cut` would have been silent on exactly the runs this rule exists for.
22
+ // teardown, and the record read. **Excluding them is the whole point** — a child that issued
23
+ // `--resume` and went straight on to the gate is the run this rule exists for, so a predicate that
24
+ // counted any `run:cut` would be silent on exactly those runs.
33
25
  const CUT_MODE_FLAG = /(?:^|\s)--(?:resume|end|json)(?:[=\s]|$)/u
34
- // **The one entry call the resumed half never makes** (joshuafolkken/kit#1867).
26
+ // **The one entry call the resumed half never makes**.
35
27
  // `.claude/skills/workflow-commands/pre-gate-cut.md` sends a `fresh` verdict on to "claim the hold,
36
28
  // ask the session boundary, read the issue, implement", and tells a `resume` verdict to "skip the
37
29
  // title, the plan, the fresh hold claim and the implementation". So the hold claim is what a run made
@@ -75,7 +67,7 @@ function claims_the_hold(command: string): boolean {
75
67
  return invokes_josh(command, HOLD_COMMANDS, HOLD_MODE_FLAG)
76
68
  }
77
69
 
78
- // **One half of the occasion, never the whole of it** (joshuafolkken/kit#1867). Taken alone this
70
+ // **One half of the occasion, never the whole of it**. Taken alone this
79
71
  // predicate enrols both processes of one obedient lane child: the cut relaunches a second session
80
72
  // which issues this same entry check byte for byte and can never take a cut of its own, so the row
81
73
  // read at half its true rate. `delivered-rules.ts` pairs it with `claims_the_hold`, which only the
@@ -87,7 +79,7 @@ function claims_the_hold(command: string): boolean {
87
79
  // read from the working directory and appears nowhere in a transcript, so it cannot be the
88
80
  // denominator — and taking the gate as the occasion instead would enrol every ordinary non-lane run,
89
81
  // where the rule can never be kept, and `pnpm josh rule:value` would read the row low by
90
- // construction. joshuafolkken/kit#1643 names exactly that failure.
82
+ // construction.
91
83
  function asks_about_the_cut(command: string): boolean {
92
84
  return invokes_josh(command, CUT_COMMANDS)
93
85
  }
@@ -95,12 +87,15 @@ function asks_about_the_cut(command: string): boolean {
95
87
  // What the trigger has to know about the world, passed in so the decision itself is testable without
96
88
  // a lane on disk and without a git call. `marked_issue` is the dispatch mark read from the
97
89
  // environment — the fact that makes the human-or-child question mechanical rather than the model's to
98
- // judge (joshuafolkken/kit#1904).
90
+ // judge.
99
91
  interface LaneCutState {
100
92
  directory: string
101
93
  carried: (now?: Date) => RunCut | undefined
102
94
  marked_issue: string | undefined
103
- // **The context verdict, read lazily** (joshuafolkken/kit#2312). It is a thunk, like
95
+ // Whether this session is a ship reviewer, which carries the implementing child's mark without
96
+ // being the run the cut is for (joshuafolkken/kit#3623).
97
+ is_reviewer: boolean
98
+ // **The context verdict, read lazily**. It is a thunk, like
104
99
  // `carried`, so `current_state` builds the object without pricing a session — the read happens only
105
100
  // after the command and lane checks pass, off the handful of calls that actually run a lane's gate.
106
101
  context_verdict: () => CostVerdict
@@ -111,6 +106,7 @@ function current_state(): LaneCutState {
111
106
  directory: process.cwd(),
112
107
  carried: run_cut.carried_cut_sync,
113
108
  marked_issue: lane_child_marker.marked_issue(),
109
+ is_reviewer: agent_session_role.is_reviewer(),
114
110
  context_verdict: cost_cli.session_verdict,
115
111
  }
116
112
  }
@@ -119,27 +115,35 @@ function current_state(): LaneCutState {
119
115
  // A person working in the lane carries no mark, so the rule stays silent for them — the
120
116
  // human-or-child call is read from the environment, never left to the model. A mark that leaked in
121
117
  // from the parent session names some other issue, so requiring it to equal this lane's issue reads
122
- // that leak as a person too (joshuafolkken/kit#1904).
118
+ // that leak as a person too.
123
119
  //
124
120
  // **The resumed process must also stay silent, and the cut record is what says so.** After a cut,
125
121
  // `adopt_cut` leaves the record in place with `is_handed_off: false`, so a carried record naming this
126
122
  // issue means the process asking is the one the cut already produced. Without this half the rule
127
123
  // would fire on the fresh process too — refusing a gate call on a run that had kept the rule
128
124
  // perfectly, which `prompts/collaboration-workflow/rule-delivery.md` calls worse than no hook at all.
125
+ //
126
+ // **A ship reviewer's inherited mark is not a dispatch**. The supervisor that launched it is waiting on
127
+ // its findings, so there is no fresh process a cut could hand the gate to; `implementation-cut.ts`
128
+ // stands down for the same session on the same fact.
129
+ function dispatched_issue(state: LaneCutState): string | undefined {
130
+ return state.is_reviewer ? undefined : state.marked_issue
131
+ }
132
+
129
133
  function uncut_lane_issue(state: LaneCutState): string | undefined {
130
134
  const issue = lane_paths.lane_issue_of(state.directory)
131
135
 
132
136
  if (issue === undefined) return undefined
133
137
 
134
- if (state.marked_issue !== issue) return undefined
138
+ if (dispatched_issue(state) !== issue) return undefined
135
139
 
136
140
  return state.carried()?.issue === issue ? undefined : issue
137
141
  }
138
142
 
139
- // **The cut is taken only when the current context is worth its resume** (joshuafolkken/kit#2312).
143
+ // **The cut is taken only when the current context is worth its resume**.
140
144
  // Below the shared `CONTEXT_CUT_THRESHOLD` a short lane has no accumulation a cut would drop, so the
141
145
  // gate runs uncut rather than paying for a relaunch; an unmeasurable session keeps the old
142
- // unconditional cut as the safety net joshuafolkken/kit#1933 relies on. The verdict is
146
+ // unconditional cut as the safety net. The verdict is
143
147
  // `cost_cli.session_verdict`'s, the same statistic and threshold `run:cut` and the implementation-phase
144
148
  // cut read, so the guard and the command can never disagree about whether a cut was due.
145
149
  function warrants_the_cut(verdict: CostVerdict): boolean {
@@ -176,12 +180,11 @@ const PRE_GATE_CUT_REASON =
176
180
  '`.claude/skills/workflow-commands/pre-gate-cut.md`. Reissue the gate once the cut has answered — ' +
177
181
  'this fires once per run, so it cannot repeat on the call in hand.'
178
182
 
179
- // **The pre-gate cut is two acts, one call apart** (joshuafolkken/kit#2034), so its `rule:value`
183
+ // **The pre-gate cut is two acts, one call apart**, so its `rule:value`
180
184
  // denominator is only the runs that reached the boundary: a run that issues the cut's entry check and,
181
185
  // somewhere in the same run, claimed the working-tree hold — the near half of the boundary a fresh
182
186
  // process never makes. Read only by the offline measurement, never the live delivery path. Moved here
183
- // from `delivered-rules.ts` so the pre-gate row lives with its rule, as `implementation-cut.ts`'s does
184
- // (joshuafolkken/kit#2346).
187
+ // from `delivered-rules.ts` so the pre-gate row lives with its rule, as `implementation-cut.ts`'s does.
185
188
  function reaches_the_pre_gate_boundary(
186
189
  call: GuardedCall,
187
190
  _turn: ReadonlyArray<GuardedCall>,
@@ -1,10 +1,11 @@
1
1
  import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
2
+ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
2
3
  import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
3
4
  import { time_shell } from '#scripts/time-runtime/time-shell'
4
5
  import { tail_commands } from './tail-commands'
5
6
 
6
7
  // The stand-down that keeps the `issue-comments` rule from refusing a body read the run has already
7
- // earned (joshuafolkken/kit#1905). The rule exists so a run reads an Issue's comments before building
8
+ // earned. The rule exists so a run reads an Issue's comments before building
8
9
  // on its body — but a run that already read them, and later reads the body again (a post-merge state
9
10
  // check, a re-read), was refused a second time for a read it had already made. **The delivery path
10
11
  // sees only the raw transcript tail** — `delivered-rules.ts` names the reason the run's own calls are
@@ -22,7 +23,6 @@ const ISSUE_PATH_NUMBER = /issues\/(\d+)/gu
22
23
  const ISSUE_VIEW_NUMBER = /\bissue\s+view\s+(?:-{1,2}\S+\s+)*(\d+)/u
23
24
  // The run of numbers `pnpm josh issue:read` takes as its positional arguments.
24
25
  const ISSUE_READ_ARGUMENTS = /\bissue:read\b([\s\d]*)/u
25
- const A_NUMBER = /^\d+$/u
26
26
 
27
27
  // A command that prints an Issue's comments: the comments endpoint, `gh issue view … --comments`, or
28
28
  // the josh command that reads body and comments together.
@@ -38,7 +38,7 @@ function add_issue_read_numbers(command: string, numbers: Set<number>): void {
38
38
  const tokens = (match[1] ?? '').split(/\s+/u)
39
39
 
40
40
  for (const token of tokens) {
41
- if (A_NUMBER.test(token)) numbers.add(Number(token))
41
+ if (issue_number_shape.ISSUE_NUMBER_PATTERN.test(token)) numbers.add(Number(token))
42
42
  }
43
43
  }
44
44
 
@@ -5,12 +5,13 @@ import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
5
5
  import { bash_triggers } from './bash-triggers'
6
6
  import { shell_segments } from './shell-segments'
7
7
 
8
- // The trigger and the delivered text behind the `protected-file` row of `delivered-rules.ts`
9
- // (joshuafolkken/kit#2983): the two files a run's own file tools must not touch.
8
+ // The trigger and the delivered text behind the `protected-file` row of `delivered-rules.ts`:
9
+ // the two files a run's own file tools must not touch.
10
10
  //
11
- // - **`.env` is never read** — by the `Read` tool or by a shell reader in a `Bash` call. It carries the
12
- // Telegram bot token, and either read lands it in the transcript. The scripts that need it load it
13
- // in their own process, so refusing the call costs them nothing.
11
+ // - **A secret file is never read** — by the `Read` tool or by a shell reader in a `Bash` call. `.env`
12
+ // carries the Telegram bot token, its `.env.*` variants and wrangler's `.dev.vars` carry the same
13
+ // kind of value, and either read lands it in the transcript. The scripts that need one load it in
14
+ // their own process, so refusing the call costs them nothing.
14
15
  // - **`.claude/settings.json` is never edited in a consumer repository.** It is the deny list and the
15
16
  // hooks that enforce every other rule, so a run that rewrites it can switch the guards off; `josh
16
17
  // sync` owns it there. Only a kit consumer's file is refused — decided per file from the repository
@@ -21,7 +22,11 @@ import { shell_segments } from './shell-segments'
21
22
 
22
23
  const READ_TOOL = 'Read'
23
24
  const EDIT_TOOLS: ReadonlySet<string> = new Set(['Edit', 'Write'])
24
- const ENVIRONMENT_FILE = '.env'
25
+ const SECRET_FILES: ReadonlySet<string> = new Set(['.env', '.dev.vars'])
26
+ const ENVIRONMENT_VARIANT_PREFIX = '.env.'
27
+ // The two variants `.gitignore` un-ignores: they are tracked and hold placeholders, not secrets. The
28
+ // `Read(!…)` carve-outs in `.claude/settings.json` name the same two.
29
+ const TRACKED_VARIANTS: ReadonlySet<string> = new Set(['.env.example', '.env.test'])
25
30
  const SETTINGS_FILE = path.join('.claude', 'settings.json')
26
31
  const WHITESPACE = /\s+/u
27
32
  const TOKEN_QUOTES = /["']/gu
@@ -56,12 +61,17 @@ function file_path_of(call: GuardedCall): string {
56
61
  }
57
62
 
58
63
  function is_environment_path(token: string): boolean {
59
- return path.basename(token.replaceAll(TOKEN_QUOTES, '')) === ENVIRONMENT_FILE
64
+ const name = path.basename(token.replaceAll(TOKEN_QUOTES, ''))
65
+
66
+ if (TRACKED_VARIANTS.has(name)) return false
67
+
68
+ return SECRET_FILES.has(name) || name.startsWith(ENVIRONMENT_VARIANT_PREFIX)
60
69
  }
61
70
 
62
71
  // A shell read reaches the same bytes a `Read` does, so a segment that runs a reader (`cat .env`,
63
- // `source .env`) or redirects the file into a command (`< .env`) is refused too. `.env.example` and
64
- // `.env.local` keep passing: only a token whose basename is exactly `.env` counts.
72
+ // `source .env`) or redirects the file into a command (`< .env`) is refused too. Claude Code applies
73
+ // the `Read` deny rules to the readers it recognizes, but `source .env.local` passes them (measured on
74
+ // 2.1.289, kit #3602), so the variants are matched here as well.
65
75
  function is_environment_read_segment(segment: string): boolean {
66
76
  const words = segment
67
77
  .replaceAll(INPUT_REDIRECT, ' < ')
@@ -109,12 +119,14 @@ function is_protected_file_call(
109
119
  }
110
120
 
111
121
  const PROTECTED_FILE_REASON =
112
- '⛔ protected file: `.env` holds the Telegram bot token, so reading it — with the Read tool or a ' +
113
- 'shell reader such as `cat` / `grep` / `source` — puts a secret in the ' +
114
- 'transcript — the scripts that need it load it in their own process. `.claude/settings.json` in a ' +
122
+ '⛔ protected file: `.env` holds the Telegram bot token, and a `.env.*` variant or `.dev.vars` ' +
123
+ 'holds the same kind of secret, so reading one — with the Read tool or a shell reader such as ' +
124
+ '`cat` / `grep` / `source` — puts a secret in the transcript — the scripts that need it load it ' +
125
+ 'in their own process (the tracked `.env.example` and `.env.test` stay readable). ' +
126
+ '`.claude/settings.json` in a ' +
115
127
  'consumer repository is the deny list and the hooks every other rule rests on, so a run must not ' +
116
128
  'rewrite it; `josh sync` owns it, and a change belongs upstream in kit (`CLAUDE.md` → "Route ' +
117
- 'distributed-doc / config changes upstream to kit"). Leave both files alone, or ask the user. ' +
129
+ 'distributed-doc / config changes upstream to kit"). Leave these files alone, or ask the user. ' +
118
130
  '**This rule fires on every occurrence, not once per run.**'
119
131
 
120
132
  const ROW = {
@@ -1,7 +1,7 @@
1
1
  import { bash_triggers } from './bash-triggers'
2
2
 
3
- // The trigger and the delivered text behind the `raw-field-body` row of `delivered-rules.ts`
4
- // (joshuafolkken/kit#2304). Its sibling `shell-body` refuses a body a run passed *inline* so the shell
3
+ // The trigger and the delivered text behind the `raw-field-body` row of `delivered-rules.ts`.
4
+ // Its sibling `shell-body` refuses a body a run passed *inline* so the shell
5
5
  // evaluates it; this one refuses a body a run passed *by path with the wrong flag*, so the path is
6
6
  // posted as text.
7
7
  //
@@ -9,8 +9,7 @@ import { bash_triggers } from './bash-triggers'
9
9
  // reads the file when the value opens with `@`; `-f` / `--raw-field` sends the value verbatim, so
10
10
  // `-f body=@<path>` posts the literal string `@<path>`. The two differ by a single character, `gh`
11
11
  // exits 0 and returns a comment URL either way, and the break is invisible until a person reads the
12
- // issue — joshuafolkken/kit#2304 recorded two park comments (`@/tmp/2294-park.md` and a decision
13
- // record) lost exactly this way, which was the only place the reason for a stopped child was written.
12
+ // issue — a park comment lost this way is the only place the reason for a stopped child was written.
14
13
  //
15
14
  // **The trigger is the raw-field flag with an `@`-opening body, not `@` alone.** `-F` / `--field
16
15
  // body=@<path>` is the spelling the rule *asks* for and stays silent; a `-f body="plain text"` with no
@@ -1,4 +1,4 @@
1
- // Whether a reply is written in the session language (joshuafolkken/kit#2470). The session-language
1
+ // Whether a reply is written in the session language. The session-language
2
2
  // line reaches a turn only through `UserPromptSubmit`, so a turn opened by a background completion or a
3
3
  // Stop hook refusal answered in whatever language it was just shown, and kept answering in it.
4
4
  //
@@ -5,15 +5,14 @@ import { bash_triggers } from './bash-triggers'
5
5
  import { shell_segments } from './shell-segments'
6
6
  import { tail_commands } from './tail-commands'
7
7
 
8
- // The trigger and the delivered text behind the `rule-body` row of `delivered-rules.ts`
9
- // (joshuafolkken/kit#2272). It delivers the residency questions at the one moment they are skipped —
8
+ // The trigger and the delivered text behind the `rule-body` row of `delivered-rules.ts`.
9
+ // It delivers the residency questions at the one moment they are skipped —
10
10
  // the edit that writes a rule into prose.
11
11
  //
12
- // **The gap it closes.** joshuafolkken/kit#2117 put question 0 (is the answer computable, so it is a
13
- // decision oracle) into the residency criterion and built `pnpm josh oracle:list`, but nothing made
14
- // that question fire: a new computable rule could still be written into prose and no test would fail,
15
- // so friction ran one way only — toward more prose. The criterion lived in `residency.md`, and
16
- // whether a run read it before writing a rule was left to judgement. This row is the firing.
12
+ // **The gap it closes.** Question 0 of the residency criterion (is the answer computable, so it is a
13
+ // decision oracle) and `pnpm josh oracle:list` do not fire on their own: a new computable rule could
14
+ // be written into prose and no test would fail, so friction would run one way only — toward more
15
+ // prose. This row is the firing.
17
16
  //
18
17
  // **The trigger is the append, not the edit.** A rule delivered on *every* edit to these files would
19
18
  // speak on typo fixes, link swaps and deletions — the wrong-turn firing `rule-delivery.md` calls worse
@@ -22,13 +21,12 @@ import { tail_commands } from './tail-commands'
22
21
  // URL is stripped) all fail. What stays is the case the Issue names — writing rule prose into a rule
23
22
  // document.
24
23
  //
25
- // **The stand-down is what turned the reminder into a check** (joshuafolkken/kit#2324). Until now the
26
- // row only *reminded* — it fired once and let the reissue through unconditionally, so "reissue and it
27
- // goes" meant a computable rule could still be written into prose with nothing having answered the two
28
- // questions. Now the pass condition is a *record*: the run has run `pnpm josh oracle:list` (question 0)
24
+ // **The stand-down is what makes the reminder a check**. A row that only *reminded* — fired once and
25
+ // let the reissue through unconditionally — would let a computable rule be written into prose with
26
+ // nothing having answered the two questions. The pass condition is a *record*: the run has run `pnpm josh oracle:list` (question 0)
29
27
  // and `pnpm josh run:step` (the ordering question) earlier in the transcript. Both present, the edit is
30
28
  // stood down; either missing, it is refused — on the reissue too, since a row with a stand-down
31
- // refuses until it is met (joshuafolkken/kit#2807). It passes on answering the questions, not on reading the
29
+ // refuses until it is met. It passes on answering the questions, not on reading the
32
30
  // reminder. Keeping the rule is therefore running those two commands, which `keeps` names.
33
31
 
34
32
  // The two edit tools the `PreToolUse` matcher routes here. A `Write` carries the whole new file; an
@@ -4,7 +4,7 @@ import { fileURLToPath } from 'node:url'
4
4
  import { hook_decision } from '#scripts/josh/hook-decision'
5
5
  import { delivered_rules } from './delivered-rules'
6
6
 
7
- // The hook entry point for trigger-delivered rules (joshuafolkken/kit#1524).
7
+ // The hook entry point for trigger-delivered rules.
8
8
  //
9
9
  // **It is the same shape `batch-guard.ts` and `investigation-guard.ts` already have**, and
10
10
  // deliberately so: read the payload on stdin, ask the rule, write the one envelope Claude Code
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env tsx
2
+ import { fileURLToPath } from 'node:url'
3
+ import { delivered_rules } from './delivered-rules'
4
+ import { rule_registry, type RegisteredRule } from './rule-registry'
5
+
6
+ // `josh rule:list` — the list of trigger-delivered rules, rendered from the guard rows themselves.
7
+ // One item per `MEASURED_RULES` row in delivery order, then the `Stop`
8
+ // hook's rows; each carries its single source, the call it fires on and the turn it stays silent on.
9
+ // The prose is `rule-registry.ts`; the order and the set are `delivered-rules.ts`, so a row added
10
+ // there is listed without a document edit — and a row with no registry entry is listed as missing.
11
+
12
+ const HEADER =
13
+ '# Trigger-delivered rules — rendered by `pnpm josh rule:list` from `scripts/rules/delivered-rules.ts`'
14
+ const MISSING = '(no entry in `scripts/rules/rule-registry.ts`)'
15
+
16
+ function item(id: string, rule: RegisteredRule | undefined): string {
17
+ if (rule === undefined) return `- \`${id}\` ${MISSING}`
18
+
19
+ return [
20
+ `- **${rule.title}** (\`${id}\`, ${rule.topic})`,
21
+ ` - fires: \`${rule.entry}\` — ${rule.fires}`,
22
+ ` - silent: ${rule.quiet}`,
23
+ ].join('\n')
24
+ }
25
+
26
+ function row_ids(): ReadonlyArray<string> {
27
+ return delivered_rules.MEASURED_RULES.map((rule) => rule.id)
28
+ }
29
+
30
+ function render(): string {
31
+ const rows = row_ids().map((id) => item(id, rule_registry.entry_for(id)))
32
+ const stops = rule_registry.STOP_ROWS.map((rule) => item(rule.id, rule))
33
+
34
+ return [HEADER, '', ...rows, ...stops].join('\n')
35
+ }
36
+
37
+ // Registry entries no guard row reaches — a renamed or removed row left its prose behind.
38
+ function orphans(): ReadonlyArray<string> {
39
+ const reached = new Set(row_ids().map((id) => rule_registry.registry_id(id)))
40
+ const stop_ids = new Set(rule_registry.STOP_ROWS.map((rule) => rule.id))
41
+
42
+ return rule_registry.REGISTERED_RULES.map((rule) => rule.id).filter(
43
+ (id) => !reached.has(id) && !stop_ids.has(id),
44
+ )
45
+ }
46
+
47
+ if (process.argv[1] === fileURLToPath(import.meta.url)) process.stdout.write(`${render()}\n`)
48
+
49
+ const rule_list = { MISSING, orphans, render }
50
+
51
+ export { rule_list }