@joshuafolkken/kit 1.1229.0 → 1.1370.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (939) hide show
  1. package/.claude/agents/investigator.md +1 -0
  2. package/.claude/settings.json +4 -0
  3. package/.claude/skills/dependency-update/SKILL.md +5 -3
  4. package/.claude/skills/epic-commands/SKILL.md +82 -113
  5. package/.claude/skills/epic-commands/epic-bundle.md +38 -63
  6. package/.claude/skills/epic-commands/execution-waves.md +30 -51
  7. package/.claude/skills/verify-ui/SKILL.md +13 -20
  8. package/.claude/skills/workflow-commands/SKILL.md +10 -10
  9. package/.claude/skills/workflow-commands/background-commands.md +4 -4
  10. package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
  11. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
  12. package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
  13. package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
  14. package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
  15. package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
  16. package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
  17. package/.claude/skills/workflow-commands/backlogrun.md +50 -61
  18. package/.claude/skills/workflow-commands/chain-rule.md +36 -40
  19. package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
  20. package/.claude/skills/workflow-commands/followup.md +24 -20
  21. package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
  22. package/.claude/skills/workflow-commands/fullrun.md +10 -10
  23. package/.claude/skills/workflow-commands/halfrun.md +9 -8
  24. package/.claude/skills/workflow-commands/into-target.md +12 -18
  25. package/.claude/skills/workflow-commands/issue-comments.md +11 -26
  26. package/.claude/skills/workflow-commands/kickoff.md +27 -16
  27. package/.claude/skills/workflow-commands/latest-gate.md +18 -29
  28. package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
  29. package/.claude/skills/workflow-commands/observation-filing.md +37 -28
  30. package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
  31. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
  32. package/.claude/skills/workflow-commands/prerequisite.md +23 -15
  33. package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
  34. package/.claude/skills/workflow-commands/prrun.md +3 -3
  35. package/.claude/skills/workflow-commands/retrospective.md +13 -18
  36. package/.claude/skills/workflow-commands/split-assessment.md +6 -4
  37. package/.claude/skills/workflow-commands/target-repository.md +25 -28
  38. package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
  39. package/.gitattributes +2 -1
  40. package/.github/workflows/ci.yml +14 -0
  41. package/.github/workflows/publish.yml +2 -0
  42. package/.vscode/tasks.json +14 -0
  43. package/CLAUDE.md +10 -61
  44. package/README.md +38 -57
  45. package/SECURITY.md +1 -1
  46. package/dist/CLAUDE.md +10 -61
  47. package/dist/commands/document-section-cli.js +42 -10
  48. package/dist/config-merge/index.js +11 -2
  49. package/dist/hooks/audit-provision.js +2 -2
  50. package/dist/hooks/batch-guard.js +7 -7
  51. package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
  52. package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
  53. package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
  54. package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
  55. package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
  56. package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
  57. package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
  58. package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
  59. package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
  60. package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
  61. package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
  62. package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
  63. package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
  64. package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
  65. package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
  66. package/dist/hooks/codex-hook-adapter.js +26 -21
  67. package/dist/hooks/duplicate-read-guard.js +8 -8
  68. package/dist/hooks/format-edited.js +4 -4
  69. package/dist/hooks/inputs.json +213 -197
  70. package/dist/hooks/investigation-guard.js +8 -8
  71. package/dist/hooks/pretool-guard.js +15 -15
  72. package/dist/hooks/session-lang.js +406 -8
  73. package/dist/hooks/stop-guard.js +122 -201
  74. package/dist/josh.js +540 -137
  75. package/dist/version/index.js +15 -13
  76. package/eslint/base.js +43 -5
  77. package/eslint/rules/english-only-prose.js +3 -3
  78. package/eslint/rules/import.js +12 -0
  79. package/eslint/rules/namespace-object-export.js +2 -2
  80. package/package.json +16 -10
  81. package/pnpm-workspace.yaml +2 -4
  82. package/prompts/coding-standards.md +14 -48
  83. package/prompts/collaboration-workflow/file-edits.md +1 -1
  84. package/prompts/collaboration-workflow/issue-citation.md +1 -1
  85. package/prompts/collaboration-workflow/issue-template.md +4 -10
  86. package/prompts/collaboration-workflow/operating-rules.md +7 -8
  87. package/prompts/collaboration-workflow/output-bounds.md +1 -1
  88. package/prompts/collaboration-workflow/overview.md +1 -1
  89. package/prompts/collaboration-workflow/plan-comment.md +2 -1
  90. package/prompts/collaboration-workflow/principles.md +21 -3
  91. package/prompts/collaboration-workflow/report-format.md +16 -29
  92. package/prompts/collaboration-workflow/residency.md +1 -1
  93. package/prompts/collaboration-workflow/rule-delivery.md +7 -95
  94. package/prompts/collaboration-workflow/shell-body.md +3 -23
  95. package/prompts/collaboration-workflow/turn-batching.md +4 -13
  96. package/prompts/collaboration-workflow/wip-cap.md +5 -11
  97. package/prompts/refactoring.md +1 -1
  98. package/prompts/review-rubric.md +3 -22
  99. package/prompts/review.md +15 -38
  100. package/prompts/testing-guide.md +2 -4
  101. package/scripts/adopt/adopt-logic.ts +5 -5
  102. package/scripts/adopt/adopt-toolkits.ts +4 -5
  103. package/scripts/adopt/adopt.ts +2 -3
  104. package/scripts/agent/agent-argv.ts +7 -7
  105. package/scripts/agent/agent-diagnostics.ts +2 -2
  106. package/scripts/agent/agent-exit-record.ts +1 -1
  107. package/scripts/agent/agent-headless.ts +1 -1
  108. package/scripts/agent/agent-launch-environment.ts +6 -1
  109. package/scripts/agent/agent-role-profile.ts +49 -22
  110. package/scripts/agent/agent-session-role.ts +32 -0
  111. package/scripts/agent/api-outage.ts +1 -1
  112. package/scripts/agent/claude-agent-argv.ts +4 -4
  113. package/scripts/agent/claude-result-event.ts +4 -4
  114. package/scripts/agent/codex-hooks.ts +2 -2
  115. package/scripts/agent/interactive-ask.ts +3 -6
  116. package/scripts/auto-ok/auto-ok-cli.ts +46 -60
  117. package/scripts/backlog/backlog-arrival-added.ts +34 -0
  118. package/scripts/backlog/backlog-arrival.ts +54 -17
  119. package/scripts/backlog/backlog-budget-cli.ts +34 -6
  120. package/scripts/backlog/backlog-budget.ts +17 -24
  121. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  122. package/scripts/backlog/backlog-drive-args.ts +5 -4
  123. package/scripts/backlog/backlog-drive-cli.ts +14 -10
  124. package/scripts/backlog/backlog-drive-epic.ts +85 -0
  125. package/scripts/backlog/backlog-drive-launch.ts +1 -1
  126. package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
  127. package/scripts/backlog/backlog-drive-named.ts +39 -9
  128. package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
  129. package/scripts/backlog/backlog-drive-restore.ts +1 -1
  130. package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
  131. package/scripts/backlog/backlog-drive.ts +43 -28
  132. package/scripts/backlog/backlog-idle.ts +88 -0
  133. package/scripts/backlog/backlog-named.ts +11 -15
  134. package/scripts/backlog/backlog-next.ts +26 -30
  135. package/scripts/backlog/backlog-offer-cli.ts +28 -23
  136. package/scripts/backlog/backlog-offer.ts +7 -7
  137. package/scripts/backlog/backlog-overlap.ts +178 -0
  138. package/scripts/backlog/backlog-plan-cli.ts +14 -90
  139. package/scripts/backlog/backlog-plan-read.ts +111 -0
  140. package/scripts/backlog/backlog-plan.ts +11 -10
  141. package/scripts/backlog/backlog-pool.ts +13 -14
  142. package/scripts/backlog/backlog-rank.ts +11 -11
  143. package/scripts/backlog/backlog-ready.ts +15 -10
  144. package/scripts/backlog/backlog-scope.ts +14 -15
  145. package/scripts/backlog/backlog-stalled-cli.ts +2 -2
  146. package/scripts/backlog/backlog-stalled-detect.ts +4 -4
  147. package/scripts/backlog/backlog-stalled.ts +5 -6
  148. package/scripts/backlog/backlog-waves.ts +4 -4
  149. package/scripts/backlog/backlogrun-args.ts +74 -0
  150. package/scripts/backlog/backlogrun-cli.ts +113 -0
  151. package/scripts/backlog/backlogrun-launch.ts +178 -0
  152. package/scripts/behavior/behavior-assertion.ts +6 -8
  153. package/scripts/behavior/behavior-cli.ts +1 -1
  154. package/scripts/behavior/behavior-rules.ts +3 -3
  155. package/scripts/build/build-claude-md.ts +4 -4
  156. package/scripts/build/build-codex-hooks.ts +2 -2
  157. package/scripts/build/build-commands.ts +1 -1
  158. package/scripts/build/build-hooks.ts +5 -5
  159. package/scripts/build/build.ts +1 -1
  160. package/scripts/build/hook-bundle-stamp.ts +109 -7
  161. package/scripts/build/local-bin.ts +2 -2
  162. package/scripts/cases/cases-cli.ts +1 -1
  163. package/scripts/cases/cases-logic.ts +2 -2
  164. package/scripts/ci/composite-actions.ts +1 -2
  165. package/scripts/ci/pr-classification.ts +2 -2
  166. package/scripts/claude/workflow-destination.ts +1 -1
  167. package/scripts/clone/clone-aggregate.ts +1 -1
  168. package/scripts/clone/clone-fingerprint.ts +1 -1
  169. package/scripts/clone/clone-scan-cli.ts +1 -1
  170. package/scripts/clone/clone-scan.ts +1 -1
  171. package/scripts/config-merge/index.ts +1 -1
  172. package/scripts/config-merge/json-format.ts +1 -3
  173. package/scripts/config-merge/patch-json-array.ts +90 -0
  174. package/scripts/config-merge/patch-json-key.ts +6 -3
  175. package/scripts/config-merge/patch-json-list.ts +1 -1
  176. package/scripts/cost-runtime/codex-usage.ts +1 -1
  177. package/scripts/cost-runtime/context-cut-payback.ts +4 -5
  178. package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
  179. package/scripts/cost-runtime/cost-attribute.ts +3 -3
  180. package/scripts/cost-runtime/cost-blocks.ts +3 -4
  181. package/scripts/cost-runtime/cost-cli.ts +14 -11
  182. package/scripts/cost-runtime/cost-corpus.ts +11 -11
  183. package/scripts/cost-runtime/cost-pricing.ts +4 -4
  184. package/scripts/cost-runtime/cost-tokens.ts +1 -2
  185. package/scripts/cost-runtime/cost-transcript.ts +29 -29
  186. package/scripts/cost-runtime/cost-usage.ts +6 -7
  187. package/scripts/cost-runtime/cost-verdict.ts +10 -11
  188. package/scripts/cost-runtime/own-session.ts +1 -1
  189. package/scripts/cost-runtime/transcript-cwd.ts +2 -2
  190. package/scripts/delegation/delegation-cli.ts +4 -4
  191. package/scripts/delegation/delegation-policy.ts +13 -15
  192. package/scripts/delegation/duplicate-read-guard.ts +9 -10
  193. package/scripts/delegation/fanout-cli.ts +1 -1
  194. package/scripts/delegation/fanout.ts +1 -1
  195. package/scripts/delegation/investigation-guard.ts +18 -22
  196. package/scripts/delegation/investigation-reads.ts +48 -238
  197. package/scripts/discovery/repo-discovery.ts +1 -1
  198. package/scripts/discovery/repo-map-logic.ts +1 -2
  199. package/scripts/discovery/repo-origin.ts +3 -3
  200. package/scripts/discovery/repo-party-cli.ts +2 -2
  201. package/scripts/discovery/repo-party.ts +2 -2
  202. package/scripts/doctor/doctor-consumer.ts +1 -1
  203. package/scripts/doctor/doctor-io.ts +6 -7
  204. package/scripts/doctor/doctor-logic.ts +1 -1
  205. package/scripts/doctor/doctor-ports.ts +1 -1
  206. package/scripts/doctor/doctor.ts +8 -9
  207. package/scripts/document/backlogrun-parent-read-set.ts +5 -6
  208. package/scripts/document/bash-output-cap.ts +5 -7
  209. package/scripts/document/capped-print-part.ts +1 -1
  210. package/scripts/document/capped-print.ts +1 -1
  211. package/scripts/document/document-byte-budget.ts +33 -64
  212. package/scripts/document/document-byte-check.ts +4 -4
  213. package/scripts/document/document-reachability.ts +7 -8
  214. package/scripts/document/document-read-cli.ts +2 -2
  215. package/scripts/document/document-scan.ts +26 -2
  216. package/scripts/document/document-section-cli.ts +6 -8
  217. package/scripts/document/document-section.ts +8 -12
  218. package/scripts/document/edit-files-cli.ts +3 -4
  219. package/scripts/document/entry-read-budget.ts +8 -70
  220. package/scripts/document/entry-read-set.ts +51 -34
  221. package/scripts/document/lane-child-read-set.ts +9 -9
  222. package/scripts/document/read-files-cli.ts +1 -2
  223. package/scripts/document/read-set-cli.ts +16 -19
  224. package/scripts/document/read-set-cost.ts +4 -4
  225. package/scripts/document/read-set-point-of-use.ts +28 -38
  226. package/scripts/document/read-set-pricing.ts +1 -1
  227. package/scripts/document/read-set-trim.ts +3 -3
  228. package/scripts/document/resident-budget.ts +8 -10
  229. package/scripts/epic/epic-add-body.ts +15 -18
  230. package/scripts/epic/epic-add-plan.ts +26 -28
  231. package/scripts/epic/epic-add.ts +32 -25
  232. package/scripts/epic/epic-audit-checks.ts +27 -37
  233. package/scripts/epic/epic-audit-cli.ts +21 -22
  234. package/scripts/epic/epic-audit-orphans.ts +16 -17
  235. package/scripts/epic/epic-audit-rationale.ts +10 -15
  236. package/scripts/epic/epic-audit-report.ts +2 -5
  237. package/scripts/epic/epic-audit.ts +18 -14
  238. package/scripts/epic/epic-body.ts +10 -10
  239. package/scripts/epic/epic-bundle-cli.ts +36 -34
  240. package/scripts/epic/epic-bundle-evidence.ts +5 -5
  241. package/scripts/epic/epic-bundle-gaps.ts +6 -9
  242. package/scripts/epic/epic-bundle-poll.ts +1 -1
  243. package/scripts/epic/epic-bundle-referenced.ts +11 -14
  244. package/scripts/epic/epic-bundle.ts +19 -20
  245. package/scripts/epic/epic-busy.ts +44 -21
  246. package/scripts/epic/epic-candidate-confirm.ts +15 -18
  247. package/scripts/epic/epic-chains.ts +18 -23
  248. package/scripts/epic/epic-classify.ts +11 -12
  249. package/scripts/epic/epic-cli-argv.ts +5 -6
  250. package/scripts/epic/epic-cli-remove.ts +9 -4
  251. package/scripts/epic/epic-cli.ts +38 -26
  252. package/scripts/epic/epic-close-comment.ts +14 -15
  253. package/scripts/epic/epic-close.ts +25 -29
  254. package/scripts/epic/epic-cross-repo.ts +18 -21
  255. package/scripts/epic/epic-decision.ts +14 -18
  256. package/scripts/epic/epic-fetch.ts +25 -31
  257. package/scripts/epic/epic-graph.ts +15 -17
  258. package/scripts/epic/epic-index.ts +14 -16
  259. package/scripts/epic/epic-issue.ts +9 -11
  260. package/scripts/epic/epic-label-age.ts +74 -0
  261. package/scripts/epic/epic-lane-offer.ts +35 -24
  262. package/scripts/epic/epic-nested.ts +1 -1
  263. package/scripts/epic/epic-next-read.ts +8 -8
  264. package/scripts/epic/epic-next-views.ts +12 -12
  265. package/scripts/epic/epic-next.ts +29 -33
  266. package/scripts/epic/epic-outside-blocker.ts +11 -10
  267. package/scripts/epic/epic-parse.ts +22 -24
  268. package/scripts/epic/epic-promote.ts +3 -2
  269. package/scripts/epic/epic-rank.ts +1 -1
  270. package/scripts/epic/epic-read.ts +10 -8
  271. package/scripts/epic/epic-reconcile.ts +8 -6
  272. package/scripts/epic/epic-reference.ts +5 -4
  273. package/scripts/epic/epic-relation-recheck.ts +10 -11
  274. package/scripts/epic/epic-relations.ts +9 -8
  275. package/scripts/epic/epic-remove-plan.ts +4 -5
  276. package/scripts/epic/epic-remove.ts +7 -5
  277. package/scripts/epic/epic-report.ts +18 -20
  278. package/scripts/epic/epic-run.ts +6 -5
  279. package/scripts/epic/epic-sections.ts +2 -2
  280. package/scripts/epic/epic-shape.ts +3 -3
  281. package/scripts/epic/epic-solo-stale.ts +3 -2
  282. package/scripts/epic/epic-solo.ts +8 -8
  283. package/scripts/epic/epic-triage.ts +5 -4
  284. package/scripts/epic/epic-validate.ts +8 -7
  285. package/scripts/epic/epic.ts +5 -5
  286. package/scripts/exports/unused-members-cli.ts +1 -1
  287. package/scripts/followup/followup-issue-number.ts +1 -2
  288. package/scripts/followup/git-followup-cleanup.ts +6 -7
  289. package/scripts/followup/git-followup-finish.ts +11 -13
  290. package/scripts/followup/git-followup-flush.ts +11 -7
  291. package/scripts/followup/git-followup-issue-close.ts +16 -13
  292. package/scripts/followup/git-followup-label.ts +9 -6
  293. package/scripts/followup/git-followup-merged.ts +1 -1
  294. package/scripts/followup/git-followup-pending.ts +7 -9
  295. package/scripts/followup/git-followup-stages.ts +28 -17
  296. package/scripts/followup/git-followup-workflow.ts +19 -21
  297. package/scripts/followup/git-pr-followup-checks.ts +13 -20
  298. package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
  299. package/scripts/followup/git-pr-followup.ts +18 -17
  300. package/scripts/gate/core-admission.ts +162 -0
  301. package/scripts/gate/core-budget.ts +134 -91
  302. package/scripts/gate/gate-ledger.ts +114 -0
  303. package/scripts/gate/gate-log.ts +7 -9
  304. package/scripts/gate/gate-plan.ts +103 -35
  305. package/scripts/gate/gate-report.ts +39 -21
  306. package/scripts/gate/gate-skip.ts +11 -13
  307. package/scripts/gate/gate-steps.ts +5 -1
  308. package/scripts/gate/gate-tree.ts +3 -4
  309. package/scripts/gate/hook-gate-reuse.ts +9 -9
  310. package/scripts/gate/machine-capacity.ts +313 -0
  311. package/scripts/gate/pre-commit-type-check.ts +4 -4
  312. package/scripts/gate/project-checks.ts +12 -4
  313. package/scripts/gate/scoped-green.ts +11 -18
  314. package/scripts/gate/type-check-command.ts +2 -2
  315. package/scripts/gate/type-check-step.ts +4 -4
  316. package/scripts/gate/verification-gate.ts +60 -53
  317. package/scripts/gh/gh-spawn.ts +2 -2
  318. package/scripts/gh/git-ai-review-scan.ts +3 -2
  319. package/scripts/gh/git-gh-api-path.ts +10 -11
  320. package/scripts/gh/git-gh-exec.ts +43 -48
  321. package/scripts/gh/git-gh-failure.ts +6 -9
  322. package/scripts/gh/git-gh-helpers.ts +1 -1
  323. package/scripts/gh/git-gh-issue-list.ts +15 -19
  324. package/scripts/gh/git-gh-issue-read.ts +43 -60
  325. package/scripts/gh/git-gh-issue-rest.ts +14 -15
  326. package/scripts/gh/git-gh-issue-write.ts +52 -40
  327. package/scripts/gh/git-gh-issue.ts +23 -24
  328. package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
  329. package/scripts/gh/git-gh-pr-read.ts +46 -50
  330. package/scripts/gh/git-gh-pr-rest.ts +23 -26
  331. package/scripts/gh/git-gh-pr-review.ts +2 -2
  332. package/scripts/gh/git-gh-pr-rollup.ts +4 -4
  333. package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
  334. package/scripts/gh/git-gh-pr.ts +16 -16
  335. package/scripts/gh/git-gh-reachability.ts +11 -12
  336. package/scripts/gh/git-gh-repo.ts +2 -3
  337. package/scripts/gh/git-gh-rest-state.ts +1 -1
  338. package/scripts/gh/git-pr-ai-review.ts +6 -5
  339. package/scripts/gh/git-pr-checks-eval.ts +28 -30
  340. package/scripts/gh/git-pr-checks-parse.ts +14 -16
  341. package/scripts/gh/git-pr-checks-watch.ts +17 -17
  342. package/scripts/gh/git-pr-checks.ts +20 -23
  343. package/scripts/gh/git-pr-coderabbit.ts +8 -6
  344. package/scripts/gh/git-pr-confirmation.ts +5 -5
  345. package/scripts/gh/git-pr-managed-config.ts +7 -9
  346. package/scripts/gh/git-pr-messages.ts +1 -1
  347. package/scripts/gh/git-pr.ts +15 -16
  348. package/scripts/gh/github-issue-url.ts +8 -9
  349. package/scripts/git/base-tree.ts +66 -0
  350. package/scripts/git/change-base.ts +42 -2
  351. package/scripts/git/changed-file-scope.ts +5 -5
  352. package/scripts/git/changed-paths.ts +1 -2
  353. package/scripts/git/constants.ts +2 -2
  354. package/scripts/git/git-branch.ts +1 -1
  355. package/scripts/git/git-closes-keyword.ts +3 -3
  356. package/scripts/git/git-command.ts +53 -41
  357. package/scripts/git/git-common-directory.ts +3 -3
  358. package/scripts/git/git-diff-reads.ts +14 -15
  359. package/scripts/git/git-error.ts +1 -1
  360. package/scripts/git/git-execa-error.ts +1 -2
  361. package/scripts/git/git-issue.ts +10 -8
  362. package/scripts/git/git-location-environment.ts +3 -4
  363. package/scripts/git/git-ls-remote.ts +6 -8
  364. package/scripts/git/git-pre-push-hook.ts +11 -10
  365. package/scripts/git/git-preflight.ts +5 -5
  366. package/scripts/git/git-push-transport.ts +2 -2
  367. package/scripts/git/git-remote-branch.ts +1 -2
  368. package/scripts/git/git-schemas.ts +16 -23
  369. package/scripts/git/git-spawn-sync.ts +1 -1
  370. package/scripts/git/git-spawn.ts +37 -14
  371. package/scripts/git/git-ssh-keepalive.ts +12 -5
  372. package/scripts/git/git-staging.ts +7 -8
  373. package/scripts/git/git-workflow.ts +1 -1
  374. package/scripts/git/git-worktree.ts +35 -27
  375. package/scripts/git/gone-branch.ts +2 -2
  376. package/scripts/git/listing-cutoff.ts +1 -2
  377. package/scripts/git/lockfile-sync.ts +65 -0
  378. package/scripts/git/main-merge-guard.ts +1 -2
  379. package/scripts/git/main-merge.ts +7 -7
  380. package/scripts/git/main-sync.ts +23 -8
  381. package/scripts/git/parse-json-array.ts +18 -23
  382. package/scripts/git/repository-lock.ts +34 -2
  383. package/scripts/git/stash/git-stash.ts +4 -5
  384. package/scripts/git/stash/stash-orphans.ts +5 -3
  385. package/scripts/git/stash/stash-pop-args.ts +1 -1
  386. package/scripts/git/stash/stash-pop-cli.ts +3 -3
  387. package/scripts/git/stash/stash-sweep-lock.ts +2 -2
  388. package/scripts/hooks/batch-guard.ts +11 -13
  389. package/scripts/hooks/check-commit-message.ts +12 -9
  390. package/scripts/hooks/codex-hook-adapter.ts +16 -10
  391. package/scripts/hooks/edited-cspell.ts +3 -4
  392. package/scripts/hooks/format-edited-cli.ts +1 -1
  393. package/scripts/hooks/format-edited-file.ts +11 -17
  394. package/scripts/hooks/format-rewrite-notice.ts +19 -17
  395. package/scripts/hooks/pre-push-unit.ts +10 -14
  396. package/scripts/hooks/pretool-guard-cli.ts +4 -4
  397. package/scripts/hooks/pretool-guard.ts +93 -18
  398. package/scripts/hooks/reserved-run.ts +2 -2
  399. package/scripts/hooks/step-zero-notice.ts +1 -1
  400. package/scripts/hooks/stop-guard.ts +21 -10
  401. package/scripts/init/basic-path-migration.ts +2 -2
  402. package/scripts/init/claude-kit-only-settings.ts +2 -2
  403. package/scripts/init/claude-plugin-config.ts +2 -2
  404. package/scripts/init/distributed-paths.ts +4 -4
  405. package/scripts/init/hook-command-rewrite.ts +3 -3
  406. package/scripts/init/hook-launch.ts +5 -5
  407. package/scripts/init/init-actions.ts +13 -0
  408. package/scripts/init/init-ai-copy.ts +11 -11
  409. package/scripts/init/init-bootstrap.ts +3 -3
  410. package/scripts/init/init-copy-content.ts +4 -4
  411. package/scripts/init/init-logic-json-merge.ts +7 -9
  412. package/scripts/init/init-logic-migrate.ts +1 -1
  413. package/scripts/init/init-logic-templates.ts +1 -1
  414. package/scripts/init/init-logic-workspace.ts +4 -4
  415. package/scripts/init/init-logic-yaml-merge.ts +2 -2
  416. package/scripts/init/init-logic.ts +19 -22
  417. package/scripts/init/init.ts +12 -8
  418. package/scripts/init/kit-base-preset.ts +1 -1
  419. package/scripts/init/kit-setup-state.ts +1 -1
  420. package/scripts/init/kit-written-paths.ts +1 -2
  421. package/scripts/init/package-manager-pin.ts +35 -0
  422. package/scripts/init/project-profile-cli.ts +1 -1
  423. package/scripts/init/project-profile.ts +3 -3
  424. package/scripts/init/session-language-environment.ts +1 -1
  425. package/scripts/init/start-exec.ts +3 -4
  426. package/scripts/init/start-plan.ts +2 -2
  427. package/scripts/init/start-setup-pr.ts +3 -2
  428. package/scripts/init/start-steps.ts +2 -2
  429. package/scripts/init/tsconfig-preset-migration.ts +1 -1
  430. package/scripts/init/vscode-tasks.ts +62 -0
  431. package/scripts/issue/baseline-measure.ts +2 -2
  432. package/scripts/issue/behavior-change-lint.ts +2 -2
  433. package/scripts/issue/defect-rate-cli.ts +6 -7
  434. package/scripts/issue/defect-rate.ts +37 -27
  435. package/scripts/issue/git-next-issues.ts +9 -8
  436. package/scripts/issue/issue-auto-ok.ts +49 -11
  437. package/scripts/issue/issue-backlinks-cli.ts +5 -5
  438. package/scripts/issue/issue-backlinks.ts +6 -6
  439. package/scripts/issue/issue-cite-cli.ts +20 -18
  440. package/scripts/issue/issue-cite.ts +18 -8
  441. package/scripts/issue/issue-closing-pr.ts +4 -4
  442. package/scripts/issue/issue-comment-cli.ts +6 -4
  443. package/scripts/issue/issue-file-cli.ts +75 -15
  444. package/scripts/issue/issue-file-fold.ts +155 -0
  445. package/scripts/issue/issue-file.ts +14 -6
  446. package/scripts/issue/issue-fold-cli.ts +14 -9
  447. package/scripts/issue/issue-fold.ts +23 -8
  448. package/scripts/issue/issue-labels.ts +46 -37
  449. package/scripts/issue/issue-lint-cli.ts +2 -2
  450. package/scripts/issue/issue-lint.ts +1 -1
  451. package/scripts/issue/issue-merged.ts +10 -4
  452. package/scripts/issue/issue-number-shape.ts +27 -0
  453. package/scripts/issue/issue-rank.ts +1 -1
  454. package/scripts/issue/issue-read-cli.ts +4 -5
  455. package/scripts/issue/issue-read.ts +4 -5
  456. package/scripts/issue/issue-reference.ts +5 -5
  457. package/scripts/issue/issue-release-cli.ts +165 -0
  458. package/scripts/issue/issue-release.ts +58 -0
  459. package/scripts/issue/issue-report-failures.ts +7 -4
  460. package/scripts/issue/issue-scout-cli.ts +11 -11
  461. package/scripts/issue/issue-scout-closed.ts +4 -4
  462. package/scripts/issue/issue-scout.ts +4 -5
  463. package/scripts/issue/issue-state-cli.ts +17 -10
  464. package/scripts/issue/issue-state.ts +12 -13
  465. package/scripts/issue/issue-wip.ts +7 -7
  466. package/scripts/issue/markdown-section.ts +3 -3
  467. package/scripts/issue/measure-rerun-cli.ts +10 -9
  468. package/scripts/issue/reproduction-measure.ts +3 -3
  469. package/scripts/issue/session-cite.ts +56 -0
  470. package/scripts/josh/agent-session-environment.ts +10 -8
  471. package/scripts/josh/cli-body.ts +2 -2
  472. package/scripts/josh/command-suggest.ts +1 -1
  473. package/scripts/josh/file-map-stamp.ts +20 -23
  474. package/scripts/josh/hook-decision.ts +24 -28
  475. package/scripts/josh/josh-command-map.ts +4 -1
  476. package/scripts/josh/josh-command-types.ts +32 -34
  477. package/scripts/josh/josh-commands-ai.ts +6 -6
  478. package/scripts/josh/josh-commands-backlog.ts +15 -3
  479. package/scripts/josh/josh-commands-clone.ts +1 -1
  480. package/scripts/josh/josh-commands-development.ts +33 -4
  481. package/scripts/josh/josh-commands-document.ts +3 -3
  482. package/scripts/josh/josh-commands-guard.ts +3 -3
  483. package/scripts/josh/josh-commands-issue.ts +11 -5
  484. package/scripts/josh/josh-commands-lane.ts +16 -5
  485. package/scripts/josh/josh-commands-lint.ts +1 -1
  486. package/scripts/josh/josh-commands-maintenance.ts +2 -2
  487. package/scripts/josh/josh-commands-run.ts +20 -6
  488. package/scripts/josh/josh-commands-split.ts +1 -2
  489. package/scripts/josh/josh-commands-versioning.ts +5 -5
  490. package/scripts/josh/josh-commands-workflow.ts +30 -22
  491. package/scripts/josh/josh-environment-file.ts +1 -1
  492. package/scripts/josh/josh-in-process.ts +3 -3
  493. package/scripts/josh/josh-logic.ts +10 -10
  494. package/scripts/josh/josh-run.ts +3 -3
  495. package/scripts/josh/josh-verdict.ts +9 -12
  496. package/scripts/josh/josh.ts +3 -3
  497. package/scripts/josh/kit-only.ts +2 -2
  498. package/scripts/josh/path-decision.ts +3 -3
  499. package/scripts/josh/platform-temporary.ts +7 -5
  500. package/scripts/josh/process-identity.ts +24 -6
  501. package/scripts/josh/process-owner.ts +4 -4
  502. package/scripts/josh/session-language-cli.ts +53 -11
  503. package/scripts/josh/session-language.ts +1 -1
  504. package/scripts/josh/stamp-file.ts +48 -29
  505. package/scripts/josh/stamp-record.ts +57 -0
  506. package/scripts/lane/lane-await.ts +35 -11
  507. package/scripts/lane/lane-cache.ts +6 -6
  508. package/scripts/lane/lane-capacity.ts +32 -17
  509. package/scripts/lane/lane-child-invocation.ts +17 -15
  510. package/scripts/lane/lane-child-marker.ts +12 -12
  511. package/scripts/lane/lane-cli.ts +20 -13
  512. package/scripts/lane/lane-close.ts +6 -6
  513. package/scripts/lane/lane-dispatch.ts +61 -72
  514. package/scripts/lane/lane-environment.ts +5 -5
  515. package/scripts/lane/lane-guard-policy.ts +7 -21
  516. package/scripts/lane/lane-handoff.ts +2 -2
  517. package/scripts/lane/lane-install.ts +9 -10
  518. package/scripts/lane/lane-launch-cli.ts +13 -8
  519. package/scripts/lane/lane-ledger.ts +73 -11
  520. package/scripts/lane/lane-leftover.ts +44 -30
  521. package/scripts/lane/lane-limit-cli.ts +160 -0
  522. package/scripts/lane/lane-limit-override.ts +74 -0
  523. package/scripts/lane/lane-load.ts +19 -68
  524. package/scripts/lane/lane-measure-cli.ts +15 -25
  525. package/scripts/lane/lane-occupancy.ts +6 -4
  526. package/scripts/lane/lane-open.ts +25 -24
  527. package/scripts/lane/lane-output.ts +4 -3
  528. package/scripts/lane/lane-paths.ts +22 -8
  529. package/scripts/lane/lane-phase.ts +33 -0
  530. package/scripts/lane/lane-reap.ts +2 -2
  531. package/scripts/lane/lane-registry.ts +27 -15
  532. package/scripts/lane/lane-relaunch.ts +9 -9
  533. package/scripts/lane/lane-report.ts +5 -4
  534. package/scripts/lane/lane-resume.ts +2 -2
  535. package/scripts/lane/lane-sampler.ts +55 -0
  536. package/scripts/lane/lane-seed.ts +7 -7
  537. package/scripts/lane/lane-stage-stats.ts +135 -0
  538. package/scripts/lane/lane-start-point.ts +8 -11
  539. package/scripts/lane/lane-stats.ts +60 -15
  540. package/scripts/lane/lane-stray.ts +140 -0
  541. package/scripts/lane/lane-vacant.ts +1 -1
  542. package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
  543. package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
  544. package/scripts/lane/openai-review-broker.ts +2 -4
  545. package/scripts/lib/ancestor-directories.ts +1 -1
  546. package/scripts/lib/bounded-pool.ts +2 -2
  547. package/scripts/lib/buffered-process.ts +4 -6
  548. package/scripts/lib/caddy-logs.sh +0 -0
  549. package/scripts/lib/cli-flags.ts +39 -6
  550. package/scripts/lib/error-message.ts +1 -1
  551. package/scripts/lib/json-value.ts +17 -3
  552. package/scripts/lib/poll.ts +1 -1
  553. package/scripts/lib/status-icons.ts +3 -3
  554. package/scripts/lib/timed-fetch.ts +1 -1
  555. package/scripts/lib/timeouts.ts +1 -1
  556. package/scripts/lines/bytes-command.ts +3 -4
  557. package/scripts/lines/effective-limit.ts +25 -12
  558. package/scripts/lines/line-budget.ts +47 -55
  559. package/scripts/lines/line-targets.ts +6 -2
  560. package/scripts/lines/lines-command.ts +3 -3
  561. package/scripts/lint/cspell-cached.ts +1 -1
  562. package/scripts/lint/cycle-recheck.ts +122 -0
  563. package/scripts/lint/format.ts +1 -2
  564. package/scripts/lint/lint-parallel.ts +34 -19
  565. package/scripts/lint/lint-related-scope.ts +25 -15
  566. package/scripts/lint/lint-related.ts +6 -7
  567. package/scripts/managed-marker/index.ts +1 -1
  568. package/scripts/managed-marker/managed-marker-logic.ts +1 -2
  569. package/scripts/notify/git-notify.ts +9 -7
  570. package/scripts/notify/telegram-notify.ts +53 -37
  571. package/scripts/notify/telegram-test-logic.ts +3 -3
  572. package/scripts/notify/telegram-test.ts +45 -30
  573. package/scripts/observations/observation-ledger-home.ts +14 -8
  574. package/scripts/observations/observation-ledger-line.ts +3 -2
  575. package/scripts/observations/observation-ledger-migrate.ts +3 -4
  576. package/scripts/observations/observation-ledger-prepare.ts +4 -4
  577. package/scripts/observations/observation-ledger.ts +14 -15
  578. package/scripts/observations/observation-record-cli.ts +83 -0
  579. package/scripts/observations/observation-record.ts +91 -0
  580. package/scripts/observations/observations-flush-cli.ts +1 -1
  581. package/scripts/observations/observations-flush-landing.ts +7 -6
  582. package/scripts/observations/observations-flush.ts +26 -27
  583. package/scripts/overrides/overrides-check.ts +18 -8
  584. package/scripts/package/package-scout-cli.ts +1 -1
  585. package/scripts/package/package-scout-format.ts +2 -2
  586. package/scripts/package/package-scout.ts +1 -1
  587. package/scripts/propagate/propagate-git-failure.ts +1 -1
  588. package/scripts/propagate/propagate-git.ts +7 -7
  589. package/scripts/propagate/propagate-plan.ts +2 -2
  590. package/scripts/propagate/propagate-publish.ts +2 -3
  591. package/scripts/propagate/propagate-run.ts +5 -7
  592. package/scripts/propagate/propagate-select.ts +1 -1
  593. package/scripts/propagate/propagate-steps.ts +19 -20
  594. package/scripts/propagate/propagate-targets.ts +6 -10
  595. package/scripts/propagate/propagate.ts +5 -5
  596. package/scripts/refactor/import-graph.ts +1 -1
  597. package/scripts/refactor/refactor-lint.ts +4 -10
  598. package/scripts/refactor/refactor-scan-cli.ts +1 -1
  599. package/scripts/refactor/refactor-scan.ts +2 -2
  600. package/scripts/refactor/refactor-targets.ts +1 -1
  601. package/scripts/release/github-release-cli.ts +25 -3
  602. package/scripts/release/github-release-environment.ts +1 -0
  603. package/scripts/release/github-release-runs.ts +115 -0
  604. package/scripts/release/github-release.ts +13 -67
  605. package/scripts/release/release-cli.ts +21 -4
  606. package/scripts/release/release-history.ts +6 -10
  607. package/scripts/release/release-plan.ts +3 -3
  608. package/scripts/release/release-progress.ts +3 -4
  609. package/scripts/release/release-publish.ts +8 -9
  610. package/scripts/release/release-scope-cli.ts +8 -10
  611. package/scripts/release/release-tag.ts +6 -8
  612. package/scripts/release/release-worktree.ts +5 -5
  613. package/scripts/repo/auto-merge-setting-logic.ts +7 -9
  614. package/scripts/repo/auto-merge-setting.ts +1 -1
  615. package/scripts/repo/repo-setting.ts +4 -4
  616. package/scripts/repo/repository-labels.ts +1 -1
  617. package/scripts/repo/required-checks-logic.ts +3 -3
  618. package/scripts/repo/required-checks-report.ts +1 -1
  619. package/scripts/repo/ruleset-check-cli.ts +1 -1
  620. package/scripts/repo/ruleset-check.ts +1 -1
  621. package/scripts/report/report-format-reference.ts +26 -0
  622. package/scripts/report/report-lint-cli.ts +2 -2
  623. package/scripts/report/report-lint.ts +16 -2
  624. package/scripts/review/disposition-cli.ts +2 -2
  625. package/scripts/review/disposition-logic.ts +1 -1
  626. package/scripts/review/live-evidence.ts +9 -6
  627. package/scripts/review/review-attest-cli.ts +1 -2
  628. package/scripts/review/review-attest.ts +3 -3
  629. package/scripts/review/review-brief-cli.ts +19 -20
  630. package/scripts/review/review-brief.ts +29 -32
  631. package/scripts/review/review-checkout.ts +2 -2
  632. package/scripts/review/review-diff-parts.ts +3 -5
  633. package/scripts/review/review-diff-write.ts +1 -1
  634. package/scripts/review/review-finding-ledger.ts +7 -4
  635. package/scripts/review/review-findings-cli.ts +2 -2
  636. package/scripts/review/review-level.ts +4 -7
  637. package/scripts/review/review-record-cli.ts +73 -16
  638. package/scripts/review/review-record.ts +5 -4
  639. package/scripts/review/review-round2-cli.ts +2 -3
  640. package/scripts/review/review-round2.ts +13 -21
  641. package/scripts/review/review-stamps.ts +9 -71
  642. package/scripts/review/review-tree.ts +4 -5
  643. package/scripts/rules/bash-triggers.ts +4 -4
  644. package/scripts/rules/decision-oracle-batch.ts +5 -6
  645. package/scripts/rules/decision-oracle-stage.ts +1 -1
  646. package/scripts/rules/decision-oracle-tokens.ts +1 -2
  647. package/scripts/rules/decision-oracle.ts +2 -2
  648. package/scripts/rules/delivered-rules.ts +61 -406
  649. package/scripts/rules/destructive-command.ts +2 -2
  650. package/scripts/rules/direct-filing.ts +4 -4
  651. package/scripts/rules/direct-pr-create.ts +2 -2
  652. package/scripts/rules/early-heartbeat.ts +15 -19
  653. package/scripts/rules/file-body.ts +5 -6
  654. package/scripts/rules/filing-cap.ts +6 -7
  655. package/scripts/rules/filing-offer.ts +1 -1
  656. package/scripts/rules/firing-point.ts +6 -6
  657. package/scripts/rules/gh-api.ts +2 -2
  658. package/scripts/rules/git-argv.ts +3 -3
  659. package/scripts/rules/git-force.ts +2 -2
  660. package/scripts/rules/hook-context-line.ts +31 -0
  661. package/scripts/rules/implementation-cut-verdict.ts +5 -8
  662. package/scripts/rules/implementation-cut.ts +35 -32
  663. package/scripts/rules/index-guard.ts +2 -2
  664. package/scripts/rules/issue-citation.ts +7 -7
  665. package/scripts/rules/issue-comments.ts +21 -13
  666. package/scripts/rules/josh-git-bare.ts +2 -2
  667. package/scripts/rules/lane-background.ts +14 -16
  668. package/scripts/rules/lane-carry-conflict.ts +41 -5
  669. package/scripts/rules/lane-interactive-ask.ts +6 -9
  670. package/scripts/rules/lane-park.ts +12 -16
  671. package/scripts/rules/lane-split-park.ts +1 -2
  672. package/scripts/rules/lane-switch-main.ts +10 -13
  673. package/scripts/rules/last-prompt.ts +1 -1
  674. package/scripts/rules/oracle-consulted.ts +5 -5
  675. package/scripts/rules/oracle-firing.ts +6 -9
  676. package/scripts/rules/oracle-list-cli.ts +2 -2
  677. package/scripts/rules/permission-guards.ts +2 -2
  678. package/scripts/rules/piped-verification.ts +79 -9
  679. package/scripts/rules/poll-loop.ts +9 -11
  680. package/scripts/rules/pre-gate-cut.ts +33 -30
  681. package/scripts/rules/prior-comment-read.ts +3 -3
  682. package/scripts/rules/protected-files.ts +25 -13
  683. package/scripts/rules/raw-field-body.ts +3 -4
  684. package/scripts/rules/reply-language.ts +1 -1
  685. package/scripts/rules/rule-body-guard.ts +10 -12
  686. package/scripts/rules/rule-guard.ts +1 -1
  687. package/scripts/rules/rule-list.ts +51 -0
  688. package/scripts/rules/rule-registry-rows.ts +282 -0
  689. package/scripts/rules/rule-registry.ts +109 -0
  690. package/scripts/rules/rule-value-cache.ts +2 -2
  691. package/scripts/rules/rule-value-cli.ts +6 -4
  692. package/scripts/rules/rule-value.ts +61 -22
  693. package/scripts/rules/run-tail-rule.ts +11 -15
  694. package/scripts/rules/shell-body-trigger.ts +7 -7
  695. package/scripts/rules/shell-segments.ts +2 -4
  696. package/scripts/rules/stop-rules.ts +54 -41
  697. package/scripts/rules/tail-commands.ts +1 -1
  698. package/scripts/rules/test-declared-commit.ts +2 -2
  699. package/scripts/rules/third-party-write.ts +3 -3
  700. package/scripts/rules/worktree-guard.ts +12 -5
  701. package/scripts/run/add/run-add-cli.ts +165 -0
  702. package/scripts/run/add/run-add.ts +124 -0
  703. package/scripts/run/board/run-board-cli.ts +207 -0
  704. package/scripts/run/board/run-board-closed.ts +95 -0
  705. package/scripts/run/board/run-board-every.ts +60 -0
  706. package/scripts/run/board/run-board-fetch.ts +38 -0
  707. package/scripts/run/board/run-board-fit.ts +219 -0
  708. package/scripts/run/board/run-board-github.ts +162 -0
  709. package/scripts/run/board/run-board-header.ts +275 -0
  710. package/scripts/run/board/run-board-kind.ts +35 -0
  711. package/scripts/run/board/run-board-labels.ts +299 -0
  712. package/scripts/run/board/run-board-layout.ts +222 -0
  713. package/scripts/run/board/run-board-link.ts +31 -0
  714. package/scripts/run/board/run-board-machine.ts +198 -0
  715. package/scripts/run/board/run-board-notes.ts +103 -0
  716. package/scripts/run/board/run-board-phase.ts +136 -0
  717. package/scripts/run/board/run-board-plan.ts +129 -0
  718. package/scripts/run/board/run-board-read.ts +62 -0
  719. package/scripts/run/board/run-board-render-legend.ts +82 -0
  720. package/scripts/run/board/run-board-render-notes.ts +77 -0
  721. package/scripts/run/board/run-board-render-slot.ts +50 -0
  722. package/scripts/run/board/run-board-render.ts +407 -0
  723. package/scripts/run/board/run-board-scope.ts +17 -0
  724. package/scripts/run/board/run-board-screen.ts +43 -0
  725. package/scripts/run/board/run-board-span.ts +66 -0
  726. package/scripts/run/board/run-board-spin.ts +115 -0
  727. package/scripts/run/board/run-board-state.ts +113 -0
  728. package/scripts/run/board/run-board-status.ts +279 -0
  729. package/scripts/run/board/run-board-tick.ts +210 -0
  730. package/scripts/run/board/run-board-track.ts +22 -0
  731. package/scripts/run/board/run-board-usage-read.ts +255 -0
  732. package/scripts/run/board/run-board-usage-rusage.ts +124 -0
  733. package/scripts/run/board/run-board-usage-text.ts +80 -0
  734. package/scripts/run/board/run-board-usage.ts +165 -0
  735. package/scripts/run/carry/run-carry-added.ts +62 -0
  736. package/scripts/run/carry/run-carry-args.ts +25 -22
  737. package/scripts/run/carry/run-carry-change.ts +1 -1
  738. package/scripts/run/carry/run-carry-cli.ts +71 -48
  739. package/scripts/run/carry/run-carry-conversation.ts +6 -7
  740. package/scripts/run/carry/run-carry-ended.ts +85 -0
  741. package/scripts/run/carry/run-carry-reclaim.ts +1 -1
  742. package/scripts/run/carry/run-carry-stash.ts +3 -2
  743. package/scripts/run/carry/run-carry-streak.ts +8 -10
  744. package/scripts/run/carry/run-carry.ts +85 -89
  745. package/scripts/run/cut/run-cut-args.ts +7 -7
  746. package/scripts/run/cut/run-cut-cli.ts +68 -37
  747. package/scripts/run/cut/run-cut-handoff.ts +15 -15
  748. package/scripts/run/cut/run-cut-report.ts +37 -16
  749. package/scripts/run/cut/run-cut.ts +63 -77
  750. package/scripts/run/detached-launch.ts +35 -50
  751. package/scripts/run/entry/run-entry-cli.ts +48 -27
  752. package/scripts/run/entry/run-entry-stop.ts +7 -9
  753. package/scripts/run/entry/run-entry.ts +5 -6
  754. package/scripts/run/event/run-event-cli.ts +5 -6
  755. package/scripts/run/event/run-event-filed.ts +69 -0
  756. package/scripts/run/event/run-event-follow.ts +3 -3
  757. package/scripts/run/event/run-event-plan.ts +38 -0
  758. package/scripts/run/event/run-event-render.ts +10 -4
  759. package/scripts/run/event/run-event-scope.ts +47 -18
  760. package/scripts/run/event/run-event-stream-emit.ts +64 -11
  761. package/scripts/run/event/run-event-stream.ts +172 -43
  762. package/scripts/run/event/run-event-watch.ts +4 -6
  763. package/scripts/run/hold/run-hold-cli.ts +65 -62
  764. package/scripts/run/hold/run-hold.ts +88 -46
  765. package/scripts/run/merge/run-merge-cli.ts +116 -77
  766. package/scripts/run/merge/run-merge-collect.ts +107 -0
  767. package/scripts/run/merge/run-merge-steps.ts +112 -65
  768. package/scripts/run/merge/run-merge-token.ts +30 -0
  769. package/scripts/run/merge/run-merge.ts +31 -22
  770. package/scripts/run/progress/run-progress-args.ts +4 -4
  771. package/scripts/run/progress/run-progress-cli.ts +39 -50
  772. package/scripts/run/progress/run-progress-clock.ts +25 -32
  773. package/scripts/run/progress/run-progress-config.ts +6 -9
  774. package/scripts/run/progress/run-progress-read.ts +9 -10
  775. package/scripts/run/progress/run-progress.ts +48 -53
  776. package/scripts/run/review/run-review-cli.ts +6 -6
  777. package/scripts/run/review/run-review-steps.ts +6 -6
  778. package/scripts/run/review/run-review.ts +9 -11
  779. package/scripts/run/run-cli-fault.ts +29 -0
  780. package/scripts/run/run-ending-cli.ts +3 -3
  781. package/scripts/run/run-ending.ts +10 -14
  782. package/scripts/run/run-halfrun-resume.ts +6 -8
  783. package/scripts/run/run-headless.ts +25 -12
  784. package/scripts/run/run-invocation.ts +17 -22
  785. package/scripts/run/run-label.ts +7 -5
  786. package/scripts/run/run-liveness-cli.ts +19 -6
  787. package/scripts/run/run-liveness.ts +27 -38
  788. package/scripts/run/run-next-cli.ts +5 -9
  789. package/scripts/run/run-next.ts +4 -5
  790. package/scripts/run/run-parent-cut-hook.ts +10 -12
  791. package/scripts/run/run-preflight.ts +25 -29
  792. package/scripts/run/run-prep-cli.ts +17 -13
  793. package/scripts/run/run-prep-locate.ts +4 -5
  794. package/scripts/run/run-prep.ts +7 -10
  795. package/scripts/run/run-prrun-resume.ts +2 -2
  796. package/scripts/run/run-report-cli.ts +4 -4
  797. package/scripts/run/run-report.ts +9 -14
  798. package/scripts/run/run-retrospective.ts +3 -3
  799. package/scripts/run/run-section.ts +42 -0
  800. package/scripts/run/run-stage-read.ts +2 -2
  801. package/scripts/run/run-stage.ts +6 -4
  802. package/scripts/run/run-status-cli.ts +7 -5
  803. package/scripts/run/run-status.ts +6 -7
  804. package/scripts/run/run-step-cli.ts +13 -15
  805. package/scripts/run/run-step.ts +62 -48
  806. package/scripts/run/run-stop-notify.ts +7 -8
  807. package/scripts/run/run-stranded-cli.ts +1 -1
  808. package/scripts/run/run-stranded-detect.ts +4 -4
  809. package/scripts/run/run-stranded.ts +11 -13
  810. package/scripts/run/run-tail-cli.ts +15 -16
  811. package/scripts/run/run-tail.ts +14 -33
  812. package/scripts/run/run-watcher-guard-cli.ts +3 -4
  813. package/scripts/run/run-watcher-guard.ts +11 -12
  814. package/scripts/run/run-watcher-hook.ts +6 -12
  815. package/scripts/run/ship/run-ship-cli.ts +67 -33
  816. package/scripts/run/ship/run-ship-detach.ts +15 -13
  817. package/scripts/run/ship/run-ship-lock.ts +1 -1
  818. package/scripts/run/ship/run-ship-next.ts +7 -8
  819. package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
  820. package/scripts/run/ship/run-ship-preflight.ts +10 -11
  821. package/scripts/run/ship/run-ship-probe.ts +4 -4
  822. package/scripts/run/ship/run-ship-return.ts +1 -1
  823. package/scripts/run/ship/run-ship-review-steps.ts +43 -24
  824. package/scripts/run/ship/run-ship-review.ts +12 -14
  825. package/scripts/run/ship/run-ship-scoped.ts +15 -6
  826. package/scripts/run/ship/run-ship-stage.ts +80 -26
  827. package/scripts/run/ship/run-ship-steps.ts +26 -16
  828. package/scripts/run/ship/run-ship-stop-text.ts +4 -2
  829. package/scripts/run/ship/run-ship-sync.ts +9 -8
  830. package/scripts/run/ship/run-ship.ts +17 -32
  831. package/scripts/run/tidy/run-tidy-cli.ts +9 -5
  832. package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
  833. package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
  834. package/scripts/run/tidy/run-tidy.ts +4 -3
  835. package/scripts/run/wake/run-wake-cli.ts +27 -33
  836. package/scripts/run/wake/run-wake-describe.ts +76 -29
  837. package/scripts/run/wake/run-wake-driver.ts +14 -14
  838. package/scripts/run/wake/run-wake-handoff.ts +6 -6
  839. package/scripts/run/wake/run-wake-loop.ts +13 -21
  840. package/scripts/run/wake/run-wake-restart.ts +4 -5
  841. package/scripts/run/wake/run-wake-session.ts +23 -27
  842. package/scripts/run/wake/run-wake.ts +57 -328
  843. package/scripts/safe-chain/ci-installer-pin.ts +3 -3
  844. package/scripts/safe-chain/pack-hook.ts +2 -2
  845. package/scripts/safe-chain/preinstall-command.ts +2 -2
  846. package/scripts/security/security-audit-logic.ts +1 -1
  847. package/scripts/security/security-audit-provision-logic.ts +1 -1
  848. package/scripts/security/security-audit-provision.ts +2 -2
  849. package/scripts/security/security-audit.ts +5 -5
  850. package/scripts/security/security-updates-logic.ts +2 -3
  851. package/scripts/security/security-updates.ts +2 -4
  852. package/scripts/self-sync-guard/index.ts +1 -1
  853. package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
  854. package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
  855. package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
  856. package/scripts/sonar/sonar-hotspots.ts +1 -1
  857. package/scripts/sonar/sonar-new-code-cli.ts +1 -1
  858. package/scripts/sonar/sonar-new-code.ts +1 -1
  859. package/scripts/sonar/sonar-project.ts +1 -1
  860. package/scripts/split/split-assess-cli.ts +1 -1
  861. package/scripts/split/split-assess.ts +3 -3
  862. package/scripts/sync/directory-copy-guard.ts +2 -3
  863. package/scripts/sync/managed-config-scope-cli.ts +1 -2
  864. package/scripts/sync/managed-config-scope.ts +4 -4
  865. package/scripts/sync/plugin-skill-directories.ts +2 -2
  866. package/scripts/sync/reconcile-templates.ts +17 -8
  867. package/scripts/sync/removed-skill-manifest.ts +2 -3
  868. package/scripts/sync/sync-ai-files.ts +7 -7
  869. package/scripts/sync/sync-configs.ts +30 -3
  870. package/scripts/sync/sync-hook-safety.ts +2 -2
  871. package/scripts/sync/sync.ts +23 -10
  872. package/scripts/sync/synced-paths.ts +2 -1
  873. package/scripts/sync/workflow-pin-logic.ts +1 -1
  874. package/scripts/test/test-declared-changed.ts +4 -4
  875. package/scripts/test/test-declared-logic.ts +2 -3
  876. package/scripts/test/test-declared-match.ts +25 -4
  877. package/scripts/test/test-declared.ts +26 -9
  878. package/scripts/test/test-red-commit.ts +3 -2
  879. package/scripts/test/test-red-logic.ts +7 -14
  880. package/scripts/test/test-red.ts +12 -47
  881. package/scripts/test/test-related-scope.ts +2 -3
  882. package/scripts/test/test-related.ts +3 -3
  883. package/scripts/test/test-type-logic.ts +1 -2
  884. package/scripts/test/test-unit-guard.ts +13 -17
  885. package/scripts/test/unit-worker-share.ts +7 -8
  886. package/scripts/time-runtime/time-agent-bundles.ts +2 -4
  887. package/scripts/time-runtime/time-background.ts +17 -21
  888. package/scripts/time-runtime/time-batch-guard.ts +67 -342
  889. package/scripts/time-runtime/time-bundle-call.ts +26 -28
  890. package/scripts/time-runtime/time-bundles.ts +11 -12
  891. package/scripts/time-runtime/time-call-identity.ts +1 -1
  892. package/scripts/time-runtime/time-command-key.ts +2 -2
  893. package/scripts/time-runtime/time-density-hook.ts +8 -11
  894. package/scripts/time-runtime/time-density.ts +5 -5
  895. package/scripts/time-runtime/time-followup-stage.ts +7 -7
  896. package/scripts/time-runtime/time-format.ts +5 -5
  897. package/scripts/time-runtime/time-hook-transcript.ts +3 -3
  898. package/scripts/time-runtime/time-instant.ts +1 -1
  899. package/scripts/time-runtime/time-markers.ts +15 -19
  900. package/scripts/time-runtime/time-phase-names.ts +3 -3
  901. package/scripts/time-runtime/time-reported-failure.ts +15 -19
  902. package/scripts/time-runtime/time-round-trips.ts +20 -23
  903. package/scripts/time-runtime/time-shell.ts +8 -8
  904. package/scripts/time-runtime/time-single-check.ts +1 -2
  905. package/scripts/time-runtime/time-spans.ts +35 -40
  906. package/scripts/time-runtime/time-tool-call.ts +15 -16
  907. package/scripts/time-runtime/time-transcript-line.ts +53 -34
  908. package/scripts/time-runtime/time-writes.ts +5 -5
  909. package/scripts/ui/ui-routes-cli.ts +1 -2
  910. package/scripts/ui/ui-routes.ts +1 -2
  911. package/scripts/version/bump-version.ts +1 -1
  912. package/scripts/version/fresh-metadata-cache.ts +2 -2
  913. package/scripts/version/latest-corepack.ts +129 -98
  914. package/scripts/version/latest-lane-guard.ts +1 -1
  915. package/scripts/version/latest-scope-cli.ts +2 -2
  916. package/scripts/version/latest-stamp.ts +1 -2
  917. package/scripts/version/latest-update.ts +2 -2
  918. package/scripts/version/npm-registry.ts +2 -2
  919. package/scripts/version/package-manager-version.ts +18 -0
  920. package/scripts/version/publishable-range-check.ts +2 -1
  921. package/scripts/version/publishable-range.ts +1 -1
  922. package/scripts/version/release-age.ts +11 -11
  923. package/scripts/version/release-hold.ts +2 -2
  924. package/scripts/version/safe-chain-version-update.ts +3 -3
  925. package/scripts/version/version-check-logic.ts +2 -3
  926. package/scripts/version/version-check.ts +1 -2
  927. package/scripts/version/version-command-config.ts +2 -2
  928. package/scripts/version/version-commands.ts +3 -3
  929. package/scripts/version/version-remote.ts +4 -4
  930. package/scripts/version/version-targets.ts +2 -2
  931. package/templates/gitignore +7 -0
  932. package/templates/workflows/github-release.yml +4 -0
  933. package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
  934. package/dist/hooks/chunk-RKUAD3I6.js +0 -90
  935. package/dist/hooks/chunk-WPALEIRX.js +0 -18
  936. package/scripts/backlog/backlog-restructure.ts +0 -152
  937. package/scripts/rules/issue-fold-rule.ts +0 -72
  938. package/scripts/rules/wip-cap.ts +0 -63
  939. package/scripts/run/run-issue-number.ts +0 -19
@@ -0,0 +1,282 @@
1
+ // The `pnpm josh rule:guard` rows of the rule registry (`rule-registry.ts`), split out by size: the
2
+ // human-readable side of each `delivered-rules.ts` row, keyed by the row's `id`.
3
+
4
+ interface RegisteredRule {
5
+ id: string
6
+ title: string
7
+ // The single source of the rule's procedure.
8
+ topic: string
9
+ // The hook command that delivers it.
10
+ entry: string
11
+ fires: string
12
+ // The silent turn — it matches the state in which the rule is already kept.
13
+ quiet: string
14
+ }
15
+
16
+ const RULE_GUARD = 'pnpm josh rule:guard'
17
+ const OPERATING_RULES = '`operating-rules.md`'
18
+ const PRE_GATE_CUT = '`.claude/skills/workflow-commands/pre-gate-cut.md`'
19
+ const SHELL_BODY = '`shell-body.md`'
20
+ const BACKGROUND_COMMANDS = '`.claude/skills/workflow-commands/background-commands.md`'
21
+ const BACKLOGRUN_LANES = '`.claude/skills/workflow-commands/backlogrun-lanes.md`'
22
+ const GIT_RULES = '`CLAUDE.md` → Git Rules'
23
+
24
+ const GUARD_ROWS: ReadonlyArray<RegisteredRule> = [
25
+ {
26
+ id: 'third-party-write',
27
+ title: 'Third-party write',
28
+ topic: '`upstream-interrupt.md`',
29
+ entry: RULE_GUARD,
30
+ fires:
31
+ 'a `gh api` write (field flag or a write method) to a repository whose owner is not this session. Every occurrence',
32
+ quiet: 'a read, or a first-party owner (`pnpm josh repo:party`)',
33
+ },
34
+ {
35
+ id: 'direct-filing',
36
+ title: 'Direct filing',
37
+ topic: '`docs/josh-commands-backlog.md` → `josh issue:file`',
38
+ entry: RULE_GUARD,
39
+ fires:
40
+ 'a `Bash` that creates an Issue outside `josh issue:file` (`gh issue create`, or a POST with `title` to `…/issues`); the refusal hands over the `pnpm josh issue:file` form. Every occurrence',
41
+ quiet:
42
+ 'filing through `pnpm josh issue:file` — the duplicate scan, the body check and `epic:bundle` all run',
43
+ },
44
+ {
45
+ id: 'filing-cap',
46
+ title: 'The 10-Issue filing cap per run',
47
+ topic: '`.claude/skills/workflow-commands/prerequisite.md`, `observation-filing.md`',
48
+ entry: RULE_GUARD,
49
+ fires:
50
+ 'the 11th `pnpm josh issue:file` in a run that already has 10 filings not refused; failed calls do not count. Every occurrence',
51
+ quiet: 'fewer than 10 filings not refused',
52
+ },
53
+ {
54
+ id: 'issue-comments',
55
+ title: 'Reading Issue comments',
56
+ topic: '`issue-comments.md`',
57
+ entry: RULE_GUARD,
58
+ fires:
59
+ 'a `Bash` that reads only the Issue body (`gh issue view <N>`, or a GET ending in `…/issues/<N>`). Refused until it is re-read with the comments',
60
+ quiet:
61
+ 'no Issue read, or a read with `--comments` / `--json comments` / `…/comments` from the start',
62
+ },
63
+ {
64
+ id: 'shell-body',
65
+ title: 'No body on the shell',
66
+ topic: SHELL_BODY,
67
+ entry: RULE_GUARD,
68
+ fires:
69
+ 'a double-quoted body value (`-f body="…"` / `-f "body=…"` / `--body "…"` / `--notify-message "…"`) carrying a backtick or `$`',
70
+ quiet: 'the shell does not evaluate the body',
71
+ },
72
+ {
73
+ id: 'raw-field-body',
74
+ title: 'Posting `@path` literally',
75
+ topic: SHELL_BODY,
76
+ entry: RULE_GUARD,
77
+ fires: 'a raw field (`-f` / `--raw-field`) passing `body=@<path>`. Every occurrence',
78
+ quiet: '`-F` / `--field body=@`, a body without `@`, or `pnpm josh issue:comment`',
79
+ },
80
+ {
81
+ id: 'piped-verification',
82
+ title: 'Piped verification',
83
+ topic: '`output-bounds.md`',
84
+ entry: RULE_GUARD,
85
+ fires:
86
+ 'a pass/fail josh check (`gate` / `check` / `lint*` / `cspell*` / `test*` / `eval` / `overrides` / `ranges`) in front of a pipe — rewritten under `set -o pipefail` when every filter is `tail` or a full-reading `grep`, refused otherwise',
87
+ quiet: 'the exit code reaches the caller — a failure reads as a failure',
88
+ },
89
+ {
90
+ id: 'early-heartbeat',
91
+ title: 'Early progress report',
92
+ topic:
93
+ '`.claude/skills/workflow-commands/progress-watcher.md` → "Progress while the run is quiet"',
94
+ entry: RULE_GUARD,
95
+ fires:
96
+ 'a `Bash` whose only purpose is waiting (`sleep` alone, or `echo` / `:` / `date`) while a timer is live or before the interval. Every occurrence',
97
+ quiet: 'no hand-made wait timer — `run:progress` holds the one clock',
98
+ },
99
+ {
100
+ id: 'test-declared',
101
+ title: 'Test declaration',
102
+ topic: '`CLAUDE.md` → Code Change Rules',
103
+ entry: RULE_GUARD,
104
+ fires: '`pnpm josh git -y` (`josh g`) while `pnpm josh test:declared` answers `required`',
105
+ quiet: '`exempt` (non-runtime only) or `satisfied` (tests included)',
106
+ },
107
+ {
108
+ id: 'lane-background',
109
+ title: 'Lane child background push',
110
+ topic: BACKGROUND_COMMANDS,
111
+ entry: RULE_GUARD,
112
+ fires:
113
+ 'a dispatched lane child backgrounding `josh gate` / `git` / `followup` / `ship`; it hands over `pnpm josh ship --detach`. Every occurrence',
114
+ quiet: 'not a lane child, or the foreground `ship --detach`',
115
+ },
116
+ {
117
+ id: 'run-tail',
118
+ title: 'Idle run tail',
119
+ topic: BACKGROUND_COMMANDS,
120
+ entry: RULE_GUARD,
121
+ fires:
122
+ '`pnpm josh git -y` (`josh g`, `--yes` alike) issued in the **foreground**. Every occurrence',
123
+ quiet: 'issued in the background — its completion resumes the run',
124
+ },
125
+ {
126
+ id: 'pre-gate-cut',
127
+ title: 'The cut before the gate',
128
+ topic: PRE_GATE_CUT,
129
+ entry: RULE_GUARD,
130
+ fires:
131
+ '`pnpm josh gate` (`josh ga`) in a lane work tree whose `JOSH_LANE_CHILD` names the Issue and has no cut record',
132
+ quiet: 'outside a lane, no marker (a person in the lane), or already cut',
133
+ },
134
+ {
135
+ id: 'lane-split-park',
136
+ title: 'A split is not a park',
137
+ topic: '`.claude/skills/workflow-commands/backlogrun-park.md` → "Splitting a child mid-run"',
138
+ entry: RULE_GUARD,
139
+ fires:
140
+ 'a lane child that promoted its Issue to an epic this run parking it (`needs-decision`, `confirmation` notify). Every occurrence',
141
+ quiet: 'no promotion this run',
142
+ },
143
+ {
144
+ id: 'lane-park',
145
+ title: 'Lane child park',
146
+ topic: PRE_GATE_CUT,
147
+ entry: RULE_GUARD,
148
+ fires: 'a dispatched lane child issuing `pnpm josh notify --task-type confirmation`',
149
+ quiet: 'not a lane child, or not a stop notification',
150
+ },
151
+ {
152
+ id: 'lane-interactive-ask',
153
+ title: 'Lane child interactive ask',
154
+ topic: `${PRE_GATE_CUT} → "The interactive ask is refused one call earlier"`,
155
+ entry: RULE_GUARD,
156
+ fires:
157
+ "a dispatched lane child's `AskUserQuestion`; it hands over the park procedure. Every occurrence",
158
+ quiet: 'not a lane child, or not an interactive tool',
159
+ },
160
+ {
161
+ id: 'lane-carry-conflict',
162
+ title: 'Lane child carry commands',
163
+ topic: BACKLOGRUN_LANES,
164
+ entry: RULE_GUARD,
165
+ fires: 'a dispatched lane child running `pnpm josh run:merge` / `run:carry`. Every occurrence',
166
+ quiet: 'not a lane child — the parent owns the run budget',
167
+ },
168
+ {
169
+ id: 'lane-switch-main',
170
+ title: 'Lane child on `git switch main`',
171
+ topic: BACKLOGRUN_LANES,
172
+ entry: RULE_GUARD,
173
+ fires:
174
+ 'a dispatched lane child switching to the default branch or running `josh main:sync`. Every occurrence',
175
+ quiet: 'not a lane child — `pnpm josh main:merge` brings the default in at the gate',
176
+ },
177
+ {
178
+ id: 'josh-git-bare',
179
+ title: 'Bare `pnpm josh git`',
180
+ topic: GIT_RULES,
181
+ entry: RULE_GUARD,
182
+ fires:
183
+ '`pnpm josh git` without `-y`, whose staging prompt cancels with no TTY. Every occurrence',
184
+ quiet: '`pnpm josh git -y`',
185
+ },
186
+ {
187
+ id: 'git-force',
188
+ title: 'Force push / branch delete',
189
+ topic: OPERATING_RULES,
190
+ entry: RULE_GUARD,
191
+ fires:
192
+ 'a `git push` / `git branch` read as force (`--force` / `-f` / `-uf` …) or delete (`--delete` / `-d` / `-D` / `:branch`) in any spelling. Every occurrence',
193
+ quiet: 'a plain `git push` / `git branch`',
194
+ },
195
+ {
196
+ id: 'worktree-mutation',
197
+ title: 'Unauthorized work-tree mutation',
198
+ topic: OPERATING_RULES,
199
+ entry: RULE_GUARD,
200
+ fires:
201
+ '`git checkout -- <path>` / `git restore <path>` / forced `git clean -f` / an unauthorized `git stash` (bare, push without a message, positional pop). Every occurrence',
202
+ quiet: '`git stash push -m`, `git stash list`, `pnpm josh git`, `pnpm josh stash:pop`',
203
+ },
204
+ {
205
+ id: 'file-body',
206
+ title: 'No file body on the shell',
207
+ topic: '`file-edits.md`',
208
+ entry: RULE_GUARD,
209
+ fires:
210
+ 'a heredoc write to an existing file, a writing `node -e` / interpreter heredoc, or `perl -0pi -e`. Every occurrence',
211
+ quiet: 'a new file, a read-only heredoc, or a short `sed -i`',
212
+ },
213
+ {
214
+ id: 'index-mutation',
215
+ title: 'Index mutation',
216
+ topic: OPERATING_RULES,
217
+ entry: RULE_GUARD,
218
+ fires:
219
+ '`git add` / `commit` / `reset` / `rm` / `mv` / `restore --staged` in any spelling. Every occurrence',
220
+ quiet: '`pnpm josh git` — the approved commit flow',
221
+ },
222
+ {
223
+ id: 'destructive-command',
224
+ title: 'Destructive command',
225
+ topic: OPERATING_RULES,
226
+ entry: RULE_GUARD,
227
+ fires:
228
+ '`rm -rf` (any spelling), `gh repo delete` / `archive`, `gh pr close`, `gh api -X DELETE`. Every occurrence',
229
+ quiet: "`gh issue close` or removing an Issue label — the workflow's own steps",
230
+ },
231
+ {
232
+ id: 'protected-file',
233
+ title: 'Protected file',
234
+ topic: OPERATING_RULES,
235
+ entry: RULE_GUARD,
236
+ fires:
237
+ 'a `Read` of `.env`, or an `Edit` / `Write` of `.claude/settings.json` outside kit. Every occurrence',
238
+ quiet: "kit itself, or the user's `~/.claude/settings.json`",
239
+ },
240
+ {
241
+ id: 'direct-pr-create',
242
+ title: 'Direct PR creation',
243
+ topic: GIT_RULES,
244
+ entry: RULE_GUARD,
245
+ fires:
246
+ '`gh pr create`, or a `gh api` write to `repos/<o>/<r>/pulls`; it points at `pnpm josh pr`. Every occurrence',
247
+ quiet: '`pnpm josh pr`, or reading a PR — the path that writes `closes #N`',
248
+ },
249
+ {
250
+ id: 'poll-loop',
251
+ title: 'Output poll loop',
252
+ topic: BACKGROUND_COMMANDS,
253
+ entry: RULE_GUARD,
254
+ fires:
255
+ "a hand-written `while` / `until` wait loop over a command's output, a marker file or a process. Every occurrence",
256
+ quiet: 'the command started with `run_in_background` — its exit ends the wait',
257
+ },
258
+ {
259
+ id: 'implementation-cut',
260
+ title: 'The implementation-phase cut',
261
+ topic: `${PRE_GATE_CUT} → "It is a guard, fired at the edit that crosses the threshold"`,
262
+ entry: RULE_GUARD,
263
+ fires:
264
+ 'an `Edit` / `Write` by an uncut lane child whose recent context is over the `pnpm josh cost --cut` threshold; it hands over `pnpm josh run:cut --impl <N> --handoff <path>`. At each threshold crossing',
265
+ quiet: 'not a lane child, a non-editing tool, already cut, or under the threshold',
266
+ },
267
+ {
268
+ id: 'rule-body',
269
+ title: 'Question 0 and the ordering question before writing a rule into prose',
270
+ topic: '`residency.md`',
271
+ entry: RULE_GUARD,
272
+ fires:
273
+ 'an `Edit` / `Write` to `CLAUDE.md` / `prompts/**/*.md` / `.claude/skills/**/*.md` appending at least the threshold. Refused until both `pnpm josh oracle:list` and `pnpm josh run:step` ran',
274
+ quiet:
275
+ 'not a rule document, an append under the threshold (typo, link swap, deletion), or both commands ran',
276
+ },
277
+ ]
278
+
279
+ const rule_registry_rows = { GUARD_ROWS, RULE_GUARD }
280
+
281
+ export type { RegisteredRule }
282
+ export { rule_registry_rows }
@@ -0,0 +1,109 @@
1
+ import { rule_registry_rows, type RegisteredRule } from './rule-registry-rows'
2
+
3
+ // The human-readable side of every trigger-delivered rule, keyed by the `id` its guard row carries.
4
+ // `prompts/collaboration-workflow/rule-delivery.md` used to hold this list
5
+ // as a hand copy of `delivered-rules.ts`; `pnpm josh rule:list` now renders it from here, and
6
+ // `rule-list.test.ts` pins that every row of `MEASURED_RULES` has an entry and no entry is orphaned.
7
+ //
8
+ // A hookless agent reads the rendered list as a self-applied checklist (`principles.md`). An entry
9
+ // with no frequency in `fires` is delivered once per run; "every occurrence" fires each time, "until"
10
+ // refuses until a prerequisite is on the transcript, and "again" re-fires after an interval.
11
+
12
+ const { GUARD_ROWS, RULE_GUARD } = rule_registry_rows
13
+ const STOP_GUARD = 'pnpm josh stop:guard'
14
+
15
+ // The oracle rows share one entry: each `oracle-consulted:<name>` id is generated per oracle.
16
+ const ORACLE_PREFIX = 'oracle-consulted'
17
+
18
+ const MEASURED_ROWS: ReadonlyArray<RegisteredRule> = [
19
+ {
20
+ id: ORACLE_PREFIX,
21
+ title: 'An act its oracle was not asked about',
22
+ topic: '`decision-oracle.ts`',
23
+ entry: RULE_GUARD,
24
+ fires:
25
+ 'a `Bash` governed by an oracle that declared a firing point (`pkg:scout` governs `pnpm add`), issued without that `pnpm josh <command>`. Refused until it ran',
26
+ quiet: 'no governed act, or the oracle already ran',
27
+ },
28
+ {
29
+ id: 'batching',
30
+ title: 'Turn batching',
31
+ topic: '`turn-batching.md`',
32
+ entry: 'pnpm josh batch:guard',
33
+ fires:
34
+ 'the `Bash` / `Edit` / `Read` after three single-call turns in a row; fires **again** every three more such turns',
35
+ quiet: 'calls per round trip above the floor',
36
+ },
37
+ {
38
+ id: 'investigation',
39
+ title: 'Investigation delegation threshold',
40
+ topic: '`delegation.md`',
41
+ entry: 'pnpm josh investigation:guard',
42
+ fires:
43
+ 'the `Read` / `Bash` that makes the third read of a file the run will not edit; fires **again** once reads pile up to the threshold again',
44
+ quiet: 'reads under the threshold — nothing to delegate yet',
45
+ },
46
+ ]
47
+
48
+ // The `Stop` hook's rows; `stop:guard` judges every stop, so each blocks the stop while it holds.
49
+ const STOP_ROWS: ReadonlyArray<RegisteredRule> = [
50
+ {
51
+ id: 'stop-notify',
52
+ title: 'Stop notification',
53
+ topic: '`CLAUDE.md` → "Mid-workflow stop notification"',
54
+ entry: STOP_GUARD,
55
+ fires: 'a stop with the work tree held and no `confirmation` notify that turn. Blocks the stop',
56
+ quiet: 'no hold, a `confirmation` notify on the tail, or a pre-gate cut taken',
57
+ },
58
+ {
59
+ id: 'hold-release',
60
+ title: 'Hold release',
61
+ topic: '`.claude/skills/workflow-commands/working-tree-hold.md`',
62
+ entry: STOP_GUARD,
63
+ fires: 'a stop on a clean tree with the `run:hold` record still in place. Blocks the stop',
64
+ quiet:
65
+ 'a dirty tree (a `halfrun` stop before the commit, a `needs-human-review` stop) or already released',
66
+ },
67
+ {
68
+ id: 'issue-citation',
69
+ title: 'Issue citation format',
70
+ topic: '`prompts/collaboration-workflow/issue-citation.md`',
71
+ entry: STOP_GUARD,
72
+ fires:
73
+ 'a bare `#N` in the prose of the last reply. Blocks the stop until the reply is reissued with the citation fixed',
74
+ quiet: 'link form, inside code or a quote, `#N` right after `PR`, or a GitHub-facing artifact',
75
+ },
76
+ {
77
+ id: 'filing-offer',
78
+ title: 'Offer to file',
79
+ topic: '`.claude/skills/workflow-commands/observation-filing.md`',
80
+ entry: STOP_GUARD,
81
+ fires:
82
+ 'an unattended run (a kit-launched headless session, a lane child, a `backlogrun` parent) whose last reply offers to file without filing. Blocks the stop',
83
+ quiet:
84
+ 'an interactive session, already filed, inside a fence or quote, a named third-party `owner/repo`, or an unknown owner',
85
+ },
86
+ ]
87
+
88
+ const REGISTERED_RULES: ReadonlyArray<RegisteredRule> = [
89
+ ...GUARD_ROWS,
90
+ ...MEASURED_ROWS,
91
+ ...STOP_ROWS,
92
+ ]
93
+
94
+ // A guard row's id, with a generated oracle id read as the one oracle entry.
95
+ function registry_id(row_id: string): string {
96
+ return row_id.startsWith(`${ORACLE_PREFIX}:`) ? ORACLE_PREFIX : row_id
97
+ }
98
+
99
+ function entry_for(row_id: string): RegisteredRule | undefined {
100
+ const id = registry_id(row_id)
101
+
102
+ return REGISTERED_RULES.find((rule) => rule.id === id)
103
+ }
104
+
105
+ const rule_registry = { REGISTERED_RULES, STOP_ROWS, entry_for, registry_id }
106
+
107
+ export { rule_registry }
108
+
109
+ export { type RegisteredRule } from './rule-registry-rows'
@@ -3,8 +3,8 @@ import { mkdirSync, renameSync, statSync, writeFileSync } from 'node:fs'
3
3
  import path from 'node:path'
4
4
  import { file_reader } from '#scripts/lib/read-file'
5
5
 
6
- // The `rule:value` reading at the `backlogrun` loop head, without the loop waiting on it
7
- // (joshuafolkken/kit#2881). Measuring re-reads every transcript and takes minutes, and `backlog:offer`
6
+ // The `rule:value` reading at the `backlogrun` loop head, without the loop waiting on it.
7
+ // Measuring re-reads every transcript and takes minutes, and `backlog:offer`
8
8
  // ran it synchronously on every iteration, so each dispatch waited on it. The loop head now prints the
9
9
  // last reading from a cache and, when the last refresh is old enough, starts one in a detached process
10
10
  // — `josh rule:value --refresh` — so the next iteration prints the newer reading.
@@ -5,8 +5,8 @@ import { delivered_rules } from './delivered-rules'
5
5
  import { rule_value, type RuleReading } from './rule-value'
6
6
  import { rule_value_cache } from './rule-value-cache'
7
7
 
8
- // `josh rule:value` — what each delivered rule earns on the channel that carries it, one row per rule
9
- // (joshuafolkken/kit#2271). `rule_value.measure` was public but had no caller outside its own test, so
8
+ // `josh rule:value` — what each delivered rule earns on the channel that carries it, one row per rule.
9
+ // `rule_value.measure` was public but had no caller outside its own test, so
10
10
  // a rule that never fired stayed invisible until a person thought to measure it. This is that caller:
11
11
  // it groups every transcript by the run it belongs to — a lane's transcript counted with the parent
12
12
  // that dispatched it — measures them, and prints the reading.
@@ -86,8 +86,10 @@ function row(reading: RuleReading): string {
86
86
  const id = reading.id.padEnd(ID_WIDTH)
87
87
  const reached = `reached ${reading.sessions.toString()}`
88
88
  const refused = `refused ${reading.refusals.toString()}`
89
+ // Only where a rewrite happened, so the rows of rules that can only refuse keep their shape.
90
+ const rewritten = reading.rewrites > 0 ? [`rewritten ${reading.rewrites.toString()}`] : []
89
91
 
90
- return [id, reached, rate_text(reading), refused].join(COLUMN_GAP)
92
+ return [id, reached, rate_text(reading), refused, ...rewritten].join(COLUMN_GAP)
91
93
  }
92
94
 
93
95
  // The reading as text, or `NO_TARGETS` when nothing measurable was found — never an empty output that
@@ -102,7 +104,7 @@ function render(runs: ReadonlyArray<ReadonlyArray<string>>): string {
102
104
  }
103
105
 
104
106
  // `--refresh` is the detached measurement the `backlogrun` loop head starts: the reading goes to the
105
- // cache `backlog:offer` prints from, never to stdout (`rule-value-cache.ts`, joshuafolkken/kit#2881).
107
+ // cache `backlog:offer` prints from, never to stdout (`rule-value-cache.ts`).
106
108
  function run_rule_value(argv: ReadonlyArray<string> = [], cwd: string = process.cwd()): number {
107
109
  const reading = render(gather_runs(cwd))
108
110
 
@@ -4,13 +4,13 @@ import {
4
4
  type TranscriptLine,
5
5
  } from '#scripts/time-runtime/time-transcript-line'
6
6
  import { delivered_rules, type MeasuredRule } from './delivered-rules'
7
+ import { hook_context_line } from './hook-context-line'
7
8
 
8
- // What a rule is worth on the channel that carries it when its delivery has not fired
9
- // (joshuafolkken/kit#1525).
9
+ // What a rule is worth on the channel that carries it when its delivery has not fired.
10
10
  //
11
11
  // **It exists because the eviction order was decided by protection rather than by value.**
12
12
  // `prompts/collaboration-workflow/residency.md` records that when a rule is trimmed to keep a
13
- // byte count, the sentence that goes is the one no marker pinned (joshuafolkken/kit#951) — so the
13
+ // byte count, the sentence that goes is the one no marker pinned — so the
14
14
  // least-defended text leaves, never the least-useful. Nothing in the repository could tell the two
15
15
  // apart: `scripts/josh/hook-decision.ts` keeps a once-per-run stamp that answers "has this fired
16
16
  // yet", never "how often", and no other counter exists.
@@ -42,7 +42,7 @@ const PERCENT = 100
42
42
  // `scripts/time/time-batch-guard.ts` — so a session that
43
43
  // merely opened that file carries the text too — and did so in a result whose `is_error` is false.
44
44
  //
45
- // **That fact is read off the parsed block, never off the raw line** (joshuafolkken/kit#1642). The
45
+ // **That fact is read off the parsed block, never off the raw line**. The
46
46
  // test it replaced was `line.includes('"is_error":true')`, which is two mistakes at once: it is
47
47
  // whitespace- and key-order-sensitive, so a serializer emitting `"is_error": true` would take every
48
48
  // rule's `refused` column to zero — indistinguishable from a hook that never fired — and it is
@@ -56,8 +56,7 @@ interface RuleReading {
56
56
  // for a rule whose trigger is a neutral act** — filing an Issue, reading one — which a run keeping
57
57
  // the rule still performs. Where the trigger is the violation itself, a run that kept the rule
58
58
  // never trips it, so the row declares `reaches` and a run counts once it has reached *either* —
59
- // the union, which equals `reaches` for every row whose trigger it covers
60
- // (joshuafolkken/kit#1643).
59
+ // the union, which equals `reaches` for every row whose trigger it covers.
61
60
  sessions: number
62
61
  // Of those, the runs that kept the rule unaided — before the trigger fired, or without it firing
63
62
  // at all, which is the ordinary case for a row that declares `reaches`. The compliance the carried
@@ -65,6 +64,9 @@ interface RuleReading {
65
64
  unaided_kept: number
66
65
  // Of those, the runs in which a refusal was actually delivered.
67
66
  refusals: number
67
+ // Of those, the runs in which the hook rewrote the call instead of refusing it
68
+ // — a delivery that cost no round trip.
69
+ rewrites: number
68
70
  // Whether the rule declares what keeping it looks like. False makes `unaided_kept` meaningless.
69
71
  is_measurable: boolean
70
72
  }
@@ -75,7 +77,7 @@ interface IssuedCall {
75
77
  }
76
78
 
77
79
  // **What a predicate is asked against beside the call: the turn it went out in, and the run it belongs
78
- // to** (joshuafolkken/kit#1867). The two travel as one parameter because every observer below takes
80
+ // to**. The two travel as one parameter because every observer below takes
79
81
  // both, and passing them separately would put each one over the four-parameter limit. `run` is every
80
82
  // call the run issued, in timeline order, so a predicate reading it sees the whole run whatever point
81
83
  // of it the walk has reached — which is right for `reaches`, a question about *whether* the situation
@@ -96,12 +98,19 @@ interface RuleState {
96
98
  is_reached: boolean
97
99
  is_triggered: boolean
98
100
  is_refused: boolean
101
+ is_rewritten: boolean
99
102
  }
100
103
 
101
104
  function blank_states(): Map<string, RuleState> {
102
105
  const entries = delivered_rules.MEASURED_RULES.map((rule): [string, RuleState] => [
103
106
  rule.id,
104
- { is_kept: false, is_reached: false, is_triggered: false, is_refused: false },
107
+ {
108
+ is_kept: false,
109
+ is_reached: false,
110
+ is_triggered: false,
111
+ is_refused: false,
112
+ is_rewritten: false,
113
+ },
105
114
  ])
106
115
 
107
116
  return new Map(entries)
@@ -110,7 +119,7 @@ function blank_states(): Map<string, RuleState> {
110
119
  // **Keeping only counts before the trigger.** After the refusal the run complies because it was made
111
120
  // to, which is the delivery's contribution and not the carried text's.
112
121
  //
113
- // **A row may declare no call-shaped trigger at all** (joshuafolkken/kit#1792). The batching guard
122
+ // **A row may declare no call-shaped trigger at all**. The batching guard
114
123
  // decides on the turns *behind* a call, so no predicate given one call could say whether it was
115
124
  // about to be refused; what the transcript records instead is the refusal, and `observe_error` below
116
125
  // is what closes the window for such a row.
@@ -148,13 +157,14 @@ function observe_call(
148
157
  observe_before_trigger(rule, state, call, context)
149
158
  }
150
159
 
151
- // One transcript line, parsed once, as the two things a reading is taken from: the calls it issued
152
- // and the bodies of the results the harness wrote back as failures.
160
+ // One transcript line, parsed once, as the things a reading is taken from: the calls it issued, the
161
+ // bodies of the results the harness wrote back as failures, and the context a hook attached.
153
162
  interface DatedLine {
154
163
  at_ms: number
155
164
  message_id: string
156
165
  calls: Array<IssuedCall>
157
166
  errors: Array<string>
167
+ contexts: Array<string>
158
168
  }
159
169
 
160
170
  function calls_of(parsed: TranscriptLine): Array<IssuedCall> {
@@ -182,10 +192,11 @@ function dated_line(line: string): DatedLine | undefined {
182
192
  message_id: parsed.message_id,
183
193
  calls: calls_of(parsed),
184
194
  errors: errors_of(parsed),
195
+ contexts: hook_context_line.hook_contexts_of(line),
185
196
  }
186
197
  }
187
198
 
188
- // **A turn is a message id, not a line** (joshuafolkken/kit#1792). Claude Code writes one line per
199
+ // **A turn is a message id, not a line**. Claude Code writes one line per
189
200
  // content block and repeats the message id on each, so a turn that thought and then issued two calls
190
201
  // is three lines carrying one id — the same reading `time-round-trips.ts` takes, for the same reason.
191
202
  // Read per line, a batched turn is indistinguishable from two turns of one call, which is the whole
@@ -206,7 +217,7 @@ function turn_key(entry: DatedLine, index: number): string {
206
217
  return entry.message_id
207
218
  }
208
219
 
209
- // **The turn a call belongs to, gathered by id but never moved** (joshuafolkken/kit#1804). A folded
220
+ // **The turn a call belongs to, gathered by id but never moved**. A folded
210
221
  // turn used to be *placed* where it opened, which both grouped a message's calls and reordered them:
211
222
  // a background unit's call landing between two blocks of a parent message was read after the whole
212
223
  // parent turn instead of at its own instant. This gathers each message's calls without touching the
@@ -232,15 +243,18 @@ function turns_by_key(entries: ReadonlyArray<DatedLine>): Map<string, Array<Issu
232
243
  // result, which is why the speaker is identified by what the body *opens* with rather than by what
233
244
  // it carries somewhere inside.
234
245
  //
235
- // **That is what stops a dump of the enumeration being read as a refusal by every rule at once**
236
- // (joshuafolkken/kit#1642). One `cat scripts/rules/delivered-rules.ts && false` writes a single
246
+ // **That is what stops a dump of the enumeration being read as a refusal by every rule at once**.
247
+ // One `cat scripts/rules/delivered-rules.ts && false` writes a single
237
248
  // errored result carrying all six reasons verbatim, and a containment test credited a refusal to
238
249
  // each of them; the file opens with its imports, so under this test nothing claims it. Position is
239
250
  // what separates the two, so no count of how many signatures appear is needed — and a body naming
240
251
  // several can no longer be attributed to any of them.
241
252
  function refused_id(text: string): string | undefined {
253
+ const body = text.trimStart()
242
254
  const found = delivered_rules.MEASURED_RULES.find((rule) =>
243
- text.trimStart().startsWith(rule.reason.slice(0, REASON_SIGNATURE_LENGTH)),
255
+ [rule.reason, ...(rule.former_reasons ?? [])].some((reason) =>
256
+ body.startsWith(reason.slice(0, REASON_SIGNATURE_LENGTH)),
257
+ ),
244
258
  )
245
259
 
246
260
  return found?.id
@@ -253,13 +267,36 @@ function observe_error(states: Map<string, RuleState>, text: string): void {
253
267
  if (state === undefined) return
254
268
 
255
269
  state.is_refused = true
256
- // **A delivered refusal is the trigger, whatever a predicate said** (joshuafolkken/kit#1792). The
270
+ // **A delivered refusal is the trigger, whatever a predicate said**. The
257
271
  // hook refuses only where the rule bound, so the window in which compliance is the carried text's
258
272
  // closes here — for the six rows this is already true by the time the result comes back, and for
259
273
  // a row declaring no call-shaped trigger it is the only thing that can close it.
260
274
  state.is_triggered = true
261
275
  }
262
276
 
277
+ // **A rewrite is a delivery too, read off the note the hook attached**. The
278
+ // call is recorded as typed and nothing errors, so the note is the one trace — matched at its opening,
279
+ // exactly as a refusal's reason is.
280
+ function rewritten_id(text: string): string | undefined {
281
+ const found = delivered_rules.MEASURED_RULES.find((rule) => {
282
+ const note = rule.rewrite_note
283
+
284
+ return note !== undefined && text.trimStart().startsWith(note.slice(0, REASON_SIGNATURE_LENGTH))
285
+ })
286
+
287
+ return found?.id
288
+ }
289
+
290
+ function observe_rewrite(states: Map<string, RuleState>, text: string): void {
291
+ const id = rewritten_id(text)
292
+ const state = id === undefined ? undefined : states.get(id)
293
+
294
+ if (state === undefined) return
295
+
296
+ state.is_rewritten = true
297
+ state.is_triggered = true
298
+ }
299
+
263
300
  function observe_for_rule(
264
301
  rule: MeasuredRule,
265
302
  state: RuleState,
@@ -268,8 +305,7 @@ function observe_for_rule(
268
305
  ): void {
269
306
  // This line's own calls, read in order; `context.turn` is every call the message issued, so a
270
307
  // call's siblings are the rest of the turn it went out in even where the transcript split them
271
- // across lines. The two coincide except when a message spans several lines
272
- // (joshuafolkken/kit#1804).
308
+ // across lines. The two coincide except when a message spans several lines.
273
309
  for (const call of calls) observe_call(rule, state, call, context)
274
310
  }
275
311
 
@@ -293,6 +329,7 @@ function observe_line(
293
329
  observe_calls(states, entry.calls, context)
294
330
 
295
331
  for (const text of entry.errors) observe_error(states, text)
332
+ for (const text of entry.contexts) observe_rewrite(states, text)
296
333
  }
297
334
 
298
335
  // **One timeline, ordered by timestamp — not the files read back to back.** "Kept before the
@@ -315,9 +352,9 @@ function timeline_of(texts: ReadonlyArray<string>): Array<DatedLine> {
315
352
 
316
353
  // Every text belonging to one run — the session transcript and the transcripts of the units it
317
354
  // delegated — read as one timeline. The lines are walked in timestamp order; `turns_by_key` supplies
318
- // each call the rest of its message as context, so grouping no longer reorders the reading
319
- // (joshuafolkken/kit#1804), and the run's own calls ride beside it for the one predicate that has to
320
- // ask about the run rather than the turn (joshuafolkken/kit#1867).
355
+ // each call the rest of its message as context, so grouping no longer reorders the reading,
356
+ // and the run's own calls ride beside it for the one predicate that has to
357
+ // ask about the run rather than the turn.
321
358
  function read_run(texts: ReadonlyArray<string>): Map<string, RuleState> {
322
359
  const states = blank_states()
323
360
  const entries = timeline_of(texts)
@@ -337,6 +374,7 @@ function credit(reading: RuleReading, state: RuleState): void {
337
374
  reading.sessions += 1
338
375
  reading.unaided_kept += state.is_kept ? 1 : 0
339
376
  reading.refusals += state.is_refused ? 1 : 0
377
+ reading.rewrites += state.is_rewritten ? 1 : 0
340
378
  }
341
379
 
342
380
  function reading_to_credit(
@@ -363,6 +401,7 @@ function blank_readings(): Map<string, RuleReading> {
363
401
  sessions: 0,
364
402
  unaided_kept: 0,
365
403
  refusals: 0,
404
+ rewrites: 0,
366
405
  is_measurable: rule.keeps !== undefined,
367
406
  },
368
407
  ])