@joshuafolkken/kit 1.1035.0 → 1.1094.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 (605) hide show
  1. package/.claude/settings.json +9 -8
  2. package/.claude/skills/epic-commands/SKILL.md +5 -7
  3. package/.claude/skills/verify-ui/SKILL.md +1 -1
  4. package/.claude/skills/workflow-commands/SKILL.md +21 -13
  5. package/.claude/skills/workflow-commands/background-commands.md +5 -4
  6. package/.claude/skills/workflow-commands/backlogrun-child.md +3 -3
  7. package/.claude/skills/workflow-commands/backlogrun-lanes.md +9 -7
  8. package/.claude/skills/workflow-commands/backlogrun-park.md +6 -0
  9. package/.claude/skills/workflow-commands/backlogrun-progress.md +31 -37
  10. package/.claude/skills/workflow-commands/backlogrun-steps.md +25 -25
  11. package/.claude/skills/workflow-commands/backlogrun.md +2 -2
  12. package/.claude/skills/workflow-commands/chain-rule.md +6 -4
  13. package/.claude/skills/workflow-commands/delegation.md +3 -3
  14. package/.claude/skills/workflow-commands/followup-reference.md +3 -3
  15. package/.claude/skills/workflow-commands/followup.md +7 -3
  16. package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
  17. package/.claude/skills/workflow-commands/fullrun.md +3 -2
  18. package/.claude/skills/workflow-commands/halfrun.md +16 -19
  19. package/.claude/skills/workflow-commands/issue-comments.md +2 -2
  20. package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
  21. package/.claude/skills/workflow-commands/issue-scout.md +1 -1
  22. package/.claude/skills/workflow-commands/kickoff.md +9 -4
  23. package/.claude/skills/workflow-commands/latest-gate.md +1 -1
  24. package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
  25. package/.claude/skills/workflow-commands/observation-filing.md +44 -89
  26. package/.claude/skills/workflow-commands/pre-gate-cut.md +33 -36
  27. package/.claude/skills/workflow-commands/prerequisite.md +1 -1
  28. package/.claude/skills/workflow-commands/prrun.md +36 -0
  29. package/.claude/skills/workflow-commands/retrospective.md +1 -1
  30. package/.claude/skills/workflow-commands/working-tree-hold.md +24 -4
  31. package/.codex/hooks.json +16 -20
  32. package/.github/actions/setup-pnpm/action.yml +93 -0
  33. package/.github/dependabot.yml +5 -1
  34. package/.github/workflows/auto-tag.yml +21 -0
  35. package/.github/workflows/ci.yml +26 -128
  36. package/.github/workflows/pr-classification.yml +5 -41
  37. package/.github/workflows/publish.yml +42 -48
  38. package/.github/workflows/sonar-qube.yml +37 -4
  39. package/AGENTS.md +12 -2
  40. package/CLAUDE.md +15 -16
  41. package/GEMINI.md +14 -2
  42. package/README.md +59 -18
  43. package/SECURITY.md +36 -6
  44. package/cspell/index.yaml +2 -1
  45. package/dist/CLAUDE.md +15 -16
  46. package/dist/config-merge/index.js +15 -3
  47. package/dist/hooks/batch-guard.js +4 -4
  48. package/dist/hooks/{chunk-Y27M6A7X.js → chunk-3C4YCCEF.js} +5 -13
  49. package/dist/hooks/{chunk-D67KVGGY.js → chunk-7ZPFAVR7.js} +17 -88
  50. package/dist/hooks/{chunk-HOYJU5RM.js → chunk-E54KGFEQ.js} +11 -4
  51. package/dist/hooks/{chunk-KG6PZD72.js → chunk-IL27YTPH.js} +2 -2
  52. package/dist/hooks/{chunk-GJT4BNVE.js → chunk-KHWHKJOM.js} +3 -3
  53. package/dist/hooks/{chunk-HU66PWWL.js → chunk-M2XDCUKD.js} +1076 -509
  54. package/dist/hooks/{chunk-GLBDBJOK.js → chunk-NKOG3XAV.js} +199 -304
  55. package/dist/hooks/{chunk-ZXNE6NY3.js → chunk-O4LL4HTI.js} +2 -7
  56. package/dist/hooks/{chunk-XPLP27WA.js → chunk-OIZUHPJI.js} +5 -27
  57. package/dist/hooks/{chunk-EIFCAJRB.js → chunk-UD24EAIL.js} +2546 -1636
  58. package/dist/hooks/codex-hook-adapter.js +10 -11
  59. package/dist/hooks/duplicate-read-guard.js +5 -5
  60. package/dist/hooks/format-edited.js +15 -34
  61. package/dist/hooks/inputs.json +279 -0
  62. package/dist/hooks/investigation-guard.js +5 -5
  63. package/dist/hooks/pretool-guard.js +23 -16
  64. package/dist/hooks/session-lang.js +0 -1
  65. package/dist/hooks/stop-guard.js +188 -509
  66. package/dist/josh.js +166 -225
  67. package/dist/managed-marker/index.js +2 -1
  68. package/dist/version/index.js +412 -64
  69. package/eslint/rules/promise.js +5 -0
  70. package/package.json +13 -8
  71. package/prompts/collaboration-workflow/file-edits.md +6 -53
  72. package/prompts/collaboration-workflow/issue-citation.md +5 -5
  73. package/prompts/collaboration-workflow/operating-rules.md +4 -4
  74. package/prompts/collaboration-workflow/overview.md +13 -1
  75. package/prompts/collaboration-workflow/report-format.md +1 -1
  76. package/prompts/collaboration-workflow/residency.md +4 -4
  77. package/prompts/collaboration-workflow/rule-delivery.md +5 -36
  78. package/prompts/collaboration-workflow/shell-body.md +7 -9
  79. package/prompts/collaboration-workflow/turn-batching.md +21 -37
  80. package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
  81. package/prompts/collaboration-workflow/wip-cap.md +36 -36
  82. package/prompts/collaboration-workflow.md +5 -8
  83. package/prompts/review-rubric.md +1 -1
  84. package/prompts/review.md +3 -3
  85. package/prompts/sonar-hotspot-handling.md +12 -4
  86. package/prompts/testing-guide.md +3 -3
  87. package/scripts/adopt/adopt-toolkits.ts +2 -2
  88. package/scripts/adopt/adopt.ts +0 -2
  89. package/scripts/agent/agent-argv.ts +0 -2
  90. package/scripts/agent/agent-diagnostics.ts +1 -1
  91. package/scripts/agent/agent-role-profile.ts +0 -7
  92. package/scripts/agent/claude-agent-argv.ts +0 -2
  93. package/scripts/agent/codex-agent-argv.ts +1 -1
  94. package/scripts/agent/codex-hooks.ts +92 -0
  95. package/scripts/agent/interactive-ask.ts +1 -1
  96. package/scripts/auto-ok/auto-ok-cli.ts +15 -25
  97. package/scripts/backlog/backlog-budget.ts +0 -2
  98. package/scripts/backlog/backlog-defect-priority.ts +2 -2
  99. package/scripts/backlog/backlog-drive-cli.ts +10 -8
  100. package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
  101. package/scripts/backlog/backlog-drive-named.ts +2 -1
  102. package/scripts/backlog/backlog-drive.ts +76 -16
  103. package/scripts/backlog/backlog-named.ts +0 -3
  104. package/scripts/backlog/backlog-next.ts +32 -22
  105. package/scripts/backlog/backlog-offer-cli.ts +0 -5
  106. package/scripts/backlog/backlog-plan-cli.ts +6 -8
  107. package/scripts/backlog/backlog-plan.ts +1 -1
  108. package/scripts/backlog/backlog-pool.ts +34 -17
  109. package/scripts/backlog/backlog-rank.ts +106 -0
  110. package/scripts/backlog/backlog-ready.ts +19 -3
  111. package/scripts/backlog/backlog-scope.ts +1 -3
  112. package/scripts/backlog/backlog-stalled-detect.ts +2 -2
  113. package/scripts/backlog/backlog-stalled.ts +0 -1
  114. package/scripts/backlog/backlog-waves.ts +47 -31
  115. package/scripts/behavior/behavior-cli.ts +1 -1
  116. package/scripts/build/build-codex-hooks.ts +26 -0
  117. package/scripts/build/build-hooks.ts +92 -11
  118. package/scripts/build/hook-bundle-stamp.ts +111 -0
  119. package/scripts/cases/cases-cli.ts +1 -1
  120. package/scripts/cases/cases-logic.ts +1 -1
  121. package/scripts/ci/composite-actions.ts +30 -0
  122. package/scripts/ci/pr-classification.ts +3 -3
  123. package/scripts/claude/workflow-destination.ts +10 -1
  124. package/scripts/clone/clone-fingerprint.ts +0 -1
  125. package/scripts/clone/clone-scan-cli.ts +1 -1
  126. package/scripts/clone/clone-scan.ts +1 -1
  127. package/scripts/config-merge/json-format.ts +0 -1
  128. package/scripts/config-merge/patch-yaml-list.ts +1 -1
  129. package/scripts/cost-runtime/codex-usage.ts +2 -9
  130. package/scripts/cost-runtime/cost-attribute.ts +0 -1
  131. package/scripts/cost-runtime/cost-cli.ts +0 -3
  132. package/scripts/cost-runtime/cost-corpus.ts +0 -2
  133. package/scripts/cost-runtime/cost-format.ts +0 -3
  134. package/scripts/cost-runtime/cost-pricing.ts +0 -1
  135. package/scripts/cost-runtime/cost-tokens.ts +0 -1
  136. package/scripts/delegation/delegation-cli.ts +1 -1
  137. package/scripts/delegation/delegation-policy.ts +11 -1
  138. package/scripts/delegation/duplicate-read-guard.ts +0 -8
  139. package/scripts/delegation/fanout-cli.ts +1 -1
  140. package/scripts/delegation/fanout.ts +0 -2
  141. package/scripts/delegation/investigation-reads.ts +1 -164
  142. package/scripts/discovery/repo-map-logic.ts +0 -1
  143. package/scripts/discovery/repo-party-cli.ts +1 -1
  144. package/scripts/doctor/doctor-consumer.ts +4 -6
  145. package/scripts/doctor/doctor-logic.ts +0 -4
  146. package/scripts/doctor/doctor.ts +14 -9
  147. package/scripts/document/document-byte-budget.ts +8 -9
  148. package/scripts/document/document-byte-check.ts +0 -1
  149. package/scripts/document/document-read-cli.ts +0 -2
  150. package/scripts/document/document-section-cli.ts +1 -1
  151. package/scripts/document/document-section.ts +0 -3
  152. package/scripts/document/edit-files-cli.ts +0 -1
  153. package/scripts/document/entry-read-budget.ts +13 -4
  154. package/scripts/document/lane-child-read-set.ts +1 -6
  155. package/scripts/document/read-files-cli.ts +0 -4
  156. package/scripts/document/read-set-cli.ts +0 -2
  157. package/scripts/document/read-set-point-of-use.ts +1 -0
  158. package/scripts/document/read-set-pricing.ts +0 -1
  159. package/scripts/document/read-set-trim.ts +1 -1
  160. package/scripts/epic/epic-add.ts +1 -1
  161. package/scripts/epic/epic-audit-cli.ts +1 -4
  162. package/scripts/epic/epic-audit-orphans.ts +1 -3
  163. package/scripts/epic/epic-audit-rationale.ts +0 -1
  164. package/scripts/epic/epic-audit-report.ts +0 -2
  165. package/scripts/epic/epic-audit.ts +5 -4
  166. package/scripts/epic/epic-bundle-cli.ts +1 -1
  167. package/scripts/epic/epic-bundle-evidence.ts +0 -1
  168. package/scripts/epic/epic-bundle-referenced.ts +1 -5
  169. package/scripts/epic/epic-bundle.ts +0 -4
  170. package/scripts/epic/epic-busy.ts +4 -5
  171. package/scripts/epic/epic-candidate-confirm.ts +0 -5
  172. package/scripts/epic/epic-classify.ts +2 -2
  173. package/scripts/epic/epic-cli-argv.ts +0 -1
  174. package/scripts/epic/epic-close-comment.ts +1 -1
  175. package/scripts/epic/epic-close.ts +5 -2
  176. package/scripts/epic/epic-cross-repo.ts +2 -4
  177. package/scripts/epic/epic-decision.ts +0 -1
  178. package/scripts/epic/epic-fetch.ts +2 -2
  179. package/scripts/epic/epic-index.ts +2 -3
  180. package/scripts/epic/epic-issue.ts +1 -15
  181. package/scripts/epic/epic-lane-offer.ts +20 -30
  182. package/scripts/epic/epic-nested.ts +1 -1
  183. package/scripts/epic/epic-next-read.ts +1 -3
  184. package/scripts/epic/epic-next-views.ts +0 -1
  185. package/scripts/epic/epic-next.ts +1 -10
  186. package/scripts/epic/epic-parse.ts +0 -1
  187. package/scripts/epic/epic-promote.ts +0 -9
  188. package/scripts/epic/epic-rank.ts +37 -0
  189. package/scripts/epic/epic-read.ts +1 -2
  190. package/scripts/epic/epic-reconcile.ts +1 -1
  191. package/scripts/epic/epic-reference.ts +1 -13
  192. package/scripts/epic/epic-relation-recheck.ts +1 -1
  193. package/scripts/epic/epic-relations.ts +1 -1
  194. package/scripts/epic/epic-remove.ts +1 -1
  195. package/scripts/epic/epic-report.ts +0 -1
  196. package/scripts/epic/epic-run.ts +2 -3
  197. package/scripts/epic/epic-shape.ts +1 -1
  198. package/scripts/epic/epic-solo-stale.ts +107 -0
  199. package/scripts/epic/epic-solo.ts +32 -30
  200. package/scripts/epic/epic-triage.ts +1 -1
  201. package/scripts/epic/epic-validate.ts +1 -1
  202. package/scripts/epic/epic.ts +1 -1
  203. package/scripts/exports/unused-members-cli.ts +53 -0
  204. package/scripts/{git → followup}/followup-issue-number.ts +1 -6
  205. package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
  206. package/scripts/{git → followup}/git-followup-finish.ts +1 -3
  207. package/scripts/{git → followup}/git-followup-flush.ts +2 -2
  208. package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
  209. package/scripts/{git → followup}/git-followup-label.ts +4 -4
  210. package/scripts/followup/git-followup-merged.ts +112 -0
  211. package/scripts/{git → followup}/git-followup-pending.ts +1 -1
  212. package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
  213. package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
  214. package/scripts/{git → followup}/git-pr-followup.ts +53 -16
  215. package/scripts/gate/core-budget.ts +3 -9
  216. package/scripts/gate/gate-plan.ts +7 -4
  217. package/scripts/gate/gate-report.ts +0 -6
  218. package/scripts/gate/gate-tree.ts +1 -1
  219. package/scripts/gate/pre-commit-type-check.ts +0 -6
  220. package/scripts/gate/project-checks.ts +7 -8
  221. package/scripts/gate/scoped-green.ts +0 -1
  222. package/scripts/gate/type-check-step.ts +1 -1
  223. package/scripts/gate/verification-gate.ts +0 -2
  224. package/scripts/gh/fix-gh-packages.ts +15 -12
  225. package/scripts/gh/gh-spawn.ts +2 -2
  226. package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
  227. package/scripts/{git → gh}/git-gh-check.ts +2 -1
  228. package/scripts/{git → gh}/git-gh-exec.ts +1 -1
  229. package/scripts/{git → gh}/git-gh-failure.ts +1 -1
  230. package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
  231. package/scripts/{git → gh}/git-gh-issue-list.ts +2 -0
  232. package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
  233. package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
  234. package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
  235. package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
  236. package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
  237. package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
  238. package/scripts/{git → gh}/git-gh-pr.ts +3 -1
  239. package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
  240. package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
  241. package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
  242. package/scripts/{git → gh}/git-pr-checks.ts +2 -1
  243. package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
  244. package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
  245. package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
  246. package/scripts/{git → gh}/git-pr.ts +3 -3
  247. package/scripts/git/changed-file-scope.ts +0 -1
  248. package/scripts/git/git-branch.ts +3 -6
  249. package/scripts/git/git-command.ts +1 -1
  250. package/scripts/git/git-commit.ts +1 -1
  251. package/scripts/git/git-common-directory.ts +80 -24
  252. package/scripts/git/git-error.ts +66 -9
  253. package/scripts/git/git-execa-error.ts +6 -1
  254. package/scripts/git/git-issue.ts +1 -1
  255. package/scripts/git/git-preflight.ts +24 -6
  256. package/scripts/git/git-prompt.ts +6 -31
  257. package/scripts/git/git-push-transport.ts +12 -69
  258. package/scripts/git/git-push.ts +1 -1
  259. package/scripts/git/git-spawn.ts +79 -3
  260. package/scripts/git/git-ssh-keepalive.ts +74 -0
  261. package/scripts/git/git-staging.ts +1 -0
  262. package/scripts/git/git-status.ts +1 -1
  263. package/scripts/git/git-workflow.ts +1 -1
  264. package/scripts/git/gone-branch.ts +4 -2
  265. package/scripts/git/listing-cutoff.ts +1 -1
  266. package/scripts/git/main-merge.ts +1 -1
  267. package/scripts/git/main-sync.ts +19 -1
  268. package/scripts/git/parse-json-array.ts +0 -3
  269. package/scripts/git/repository-lock.ts +16 -16
  270. package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
  271. package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +1 -1
  272. package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
  273. package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
  274. package/scripts/hooks/codex-hook-adapter.ts +0 -1
  275. package/scripts/hooks/edited-cspell.ts +1 -1
  276. package/scripts/hooks/format-edited-cli.ts +15 -0
  277. package/scripts/hooks/format-edited-file.ts +4 -9
  278. package/scripts/hooks/pre-push-unit.ts +0 -4
  279. package/scripts/hooks/pretool-guard-cli.ts +21 -0
  280. package/scripts/hooks/pretool-guard.ts +36 -19
  281. package/scripts/hooks/reserved-run.ts +1 -1
  282. package/scripts/hooks/step-zero-notice.ts +76 -0
  283. package/scripts/hooks/stop-guard.ts +47 -21
  284. package/scripts/init/claude-plugin-config.ts +4 -5
  285. package/scripts/init/hook-command-rewrite.ts +16 -8
  286. package/scripts/init/hook-launch.ts +41 -15
  287. package/scripts/init/init-basic.ts +2 -5
  288. package/scripts/init/init-logic.ts +7 -0
  289. package/scripts/init/init.ts +0 -3
  290. package/scripts/init/project-profile.ts +6 -11
  291. package/scripts/init/start-exec.ts +8 -2
  292. package/scripts/init/start-plan.ts +18 -5
  293. package/scripts/init/start-setup-pr.ts +52 -25
  294. package/scripts/init/start-steps.ts +42 -9
  295. package/scripts/init/start.ts +40 -10
  296. package/scripts/issue/behavior-change-lint.ts +0 -1
  297. package/scripts/issue/defect-rate-cli.ts +3 -3
  298. package/scripts/issue/defect-rate.ts +1 -2
  299. package/scripts/{git → issue}/git-next-issues.ts +37 -8
  300. package/scripts/issue/issue-backlinks-cli.ts +1 -5
  301. package/scripts/issue/issue-cite-cli.ts +2 -6
  302. package/scripts/issue/issue-cite.ts +19 -3
  303. package/scripts/issue/issue-classification.ts +1 -9
  304. package/scripts/issue/issue-closing-pr.ts +4 -4
  305. package/scripts/issue/issue-comment-cli.ts +2 -2
  306. package/scripts/issue/issue-file-cli.ts +5 -5
  307. package/scripts/issue/issue-file.ts +2 -2
  308. package/scripts/issue/issue-fold-cli.ts +1 -1
  309. package/scripts/issue/issue-fold-existing-cli.ts +1 -1
  310. package/scripts/{git → issue}/issue-labels.ts +20 -0
  311. package/scripts/issue/issue-lint-cli.ts +1 -1
  312. package/scripts/issue/issue-merged.ts +2 -2
  313. package/scripts/issue/issue-rank.ts +89 -0
  314. package/scripts/issue/issue-read-cli.ts +8 -47
  315. package/scripts/issue/issue-read.ts +0 -2
  316. package/scripts/issue/issue-report-failures.ts +80 -0
  317. package/scripts/issue/issue-scout-cli.ts +1 -7
  318. package/scripts/issue/issue-scout-closed.ts +2 -2
  319. package/scripts/issue/issue-scout.ts +0 -2
  320. package/scripts/issue/issue-state-cli.ts +5 -46
  321. package/scripts/issue/issue-state.ts +1 -5
  322. package/scripts/issue/markdown-section.ts +1 -1
  323. package/scripts/issue/measure-rerun-cli.ts +1 -1
  324. package/scripts/issue/reproduction-measure.ts +1 -1
  325. package/scripts/josh/cli-body.ts +1 -1
  326. package/scripts/josh/file-map-stamp.ts +0 -3
  327. package/scripts/josh/josh-command-map.ts +2 -102
  328. package/scripts/josh/josh-commands-ai.ts +9 -102
  329. package/scripts/josh/josh-commands-backlog.ts +5 -1
  330. package/scripts/josh/josh-commands-development.ts +10 -3
  331. package/scripts/josh/josh-commands-issue.ts +2 -2
  332. package/scripts/josh/josh-commands-maintenance.ts +7 -0
  333. package/scripts/josh/josh-commands-project.ts +7 -1
  334. package/scripts/josh/josh-commands-run.ts +114 -0
  335. package/scripts/josh/josh-commands-versioning.ts +8 -0
  336. package/scripts/josh/josh-commands-workflow.ts +2 -2
  337. package/scripts/josh/path-decision.ts +0 -3
  338. package/scripts/josh/process-owner.ts +16 -0
  339. package/scripts/josh/session-language-cli.ts +0 -1
  340. package/scripts/lane/lane-await.ts +3 -6
  341. package/scripts/lane/lane-capacity.ts +6 -3
  342. package/scripts/lane/lane-child-invocation.ts +20 -7
  343. package/scripts/lane/lane-child-marker.ts +16 -2
  344. package/scripts/lane/lane-cli.ts +33 -18
  345. package/scripts/lane/lane-close.ts +1 -3
  346. package/scripts/lane/lane-dispatch.ts +3 -4
  347. package/scripts/lane/lane-environment.ts +0 -9
  348. package/scripts/lane/lane-handoff.ts +38 -0
  349. package/scripts/lane/lane-launch-cli.ts +21 -11
  350. package/scripts/lane/lane-open.ts +0 -3
  351. package/scripts/lane/lane-output.ts +0 -1
  352. package/scripts/lane/lane-registry.ts +9 -0
  353. package/scripts/lane/lane-report.ts +10 -4
  354. package/scripts/lane/openai-lane-ship.ts +2 -0
  355. package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
  356. package/scripts/lane/openai-lane-supervisor.ts +6 -4
  357. package/scripts/lane/openai-review-broker.ts +3 -0
  358. package/scripts/lib/bounded-pool.ts +1 -0
  359. package/scripts/lib/json-value.ts +5 -4
  360. package/scripts/lib/poll.ts +3 -1
  361. package/scripts/lib/timed-fetch.ts +15 -0
  362. package/scripts/lib/timeouts.ts +13 -0
  363. package/scripts/{yaml → lib}/yaml-document.ts +3 -1
  364. package/scripts/{bytes → lines}/bytes-command.ts +0 -2
  365. package/scripts/lines/lines-command.ts +0 -1
  366. package/scripts/lint/lint-related-scope.ts +0 -1
  367. package/scripts/lint/lint-related.ts +1 -1
  368. package/scripts/{git → notify}/telegram-notify.ts +2 -2
  369. package/scripts/{git → notify}/telegram-test.ts +4 -4
  370. package/scripts/observations/observation-ledger-home.ts +0 -1
  371. package/scripts/observations/observation-ledger-line.ts +0 -1
  372. package/scripts/observations/observation-ledger-migrate.ts +1 -1
  373. package/scripts/observations/observations-flush-landing.ts +3 -3
  374. package/scripts/observations/observations-flush.ts +2 -2
  375. package/scripts/overrides/lockfile-overrides.ts +1 -1
  376. package/scripts/overrides/overrides-logic.ts +1 -1
  377. package/scripts/package/package-scout-cli.ts +2 -7
  378. package/scripts/package/package-scout.ts +0 -2
  379. package/scripts/propagate/propagate-git-failure.ts +0 -1
  380. package/scripts/propagate/propagate-git.ts +0 -2
  381. package/scripts/propagate/propagate-plan.ts +185 -0
  382. package/scripts/propagate/propagate-publish.ts +2 -3
  383. package/scripts/propagate/propagate-run.ts +5 -3
  384. package/scripts/propagate/propagate-steps.ts +19 -6
  385. package/scripts/propagate/propagate-targets.ts +13 -6
  386. package/scripts/propagate/propagate.ts +60 -46
  387. package/scripts/refactor/import-graph.ts +0 -1
  388. package/scripts/refactor/refactor-lint.ts +0 -2
  389. package/scripts/refactor/refactor-scan.ts +0 -1
  390. package/scripts/refactor/refactor-targets.ts +0 -1
  391. package/scripts/registry-migration/migrate-logic.ts +1 -2
  392. package/scripts/registry-migration/migrate.ts +19 -9
  393. package/scripts/release/github-release-cli.ts +8 -6
  394. package/scripts/release/github-release-environment.ts +46 -0
  395. package/scripts/release/github-release.ts +151 -94
  396. package/scripts/release/release-history.ts +0 -1
  397. package/scripts/release/release-plan.ts +0 -1
  398. package/scripts/release/release-publish.ts +2 -3
  399. package/scripts/release/release-scope-cli.ts +1 -2
  400. package/scripts/release/release-tag.ts +2 -4
  401. package/scripts/repo/auto-merge-setting-logic.ts +1 -4
  402. package/scripts/repo/repo-setting.ts +1 -1
  403. package/scripts/repo/repository-labels.ts +3 -3
  404. package/scripts/repo/required-checks-logic.ts +206 -0
  405. package/scripts/repo/required-checks-report.ts +71 -0
  406. package/scripts/repo/ruleset-check-cli.ts +53 -0
  407. package/scripts/repo/ruleset-check.ts +147 -0
  408. package/scripts/report/report-lint-cli.ts +0 -4
  409. package/scripts/review/disposition-cli.ts +1 -1
  410. package/scripts/review/live-evidence.ts +1 -1
  411. package/scripts/review/review-attest-cli.ts +0 -6
  412. package/scripts/review/review-attest.ts +48 -16
  413. package/scripts/review/review-brief-cli.ts +72 -8
  414. package/scripts/review/review-brief.ts +67 -9
  415. package/scripts/review/review-diff-parts.ts +89 -0
  416. package/scripts/review/review-diff-write.ts +97 -0
  417. package/scripts/review/review-finding-ledger.ts +0 -1
  418. package/scripts/review/review-record-cli.ts +1 -1
  419. package/scripts/review/review-record.ts +0 -1
  420. package/scripts/review/review-round2-cli.ts +1 -1
  421. package/scripts/review/review-stamps.ts +6 -2
  422. package/scripts/review/review-tree.ts +14 -2
  423. package/scripts/rules/decision-oracle-stage.ts +18 -0
  424. package/scripts/rules/decision-oracle.ts +10 -7
  425. package/scripts/rules/delivered-rules.ts +9 -1
  426. package/scripts/rules/destructive-command.ts +119 -0
  427. package/scripts/rules/direct-filing.ts +1 -1
  428. package/scripts/rules/file-body.ts +0 -3
  429. package/scripts/rules/filing-cap.ts +0 -2
  430. package/scripts/rules/gh-api.ts +7 -2
  431. package/scripts/rules/git-argv.ts +18 -7
  432. package/scripts/rules/git-force.ts +0 -2
  433. package/scripts/rules/implementation-cut.ts +1 -2
  434. package/scripts/rules/index-guard.ts +71 -0
  435. package/scripts/rules/issue-citation.ts +50 -25
  436. package/scripts/rules/issue-fold.ts +1 -2
  437. package/scripts/rules/lane-background.ts +15 -7
  438. package/scripts/rules/lane-carry-conflict.ts +1 -2
  439. package/scripts/rules/lane-park.ts +14 -8
  440. package/scripts/rules/last-prompt.ts +1 -0
  441. package/scripts/rules/oracle-consulted.ts +1 -1
  442. package/scripts/rules/oracle-firing.ts +1 -0
  443. package/scripts/rules/oracle-list-cli.ts +0 -3
  444. package/scripts/rules/permission-guards.ts +14 -0
  445. package/scripts/rules/pre-gate-cut.ts +2 -2
  446. package/scripts/rules/protected-files.ts +74 -0
  447. package/scripts/rules/reply-language.ts +1 -1
  448. package/scripts/rules/rule-body-guard.ts +0 -3
  449. package/scripts/rules/rule-value-cli.ts +0 -1
  450. package/scripts/rules/shell-body-trigger.ts +0 -1
  451. package/scripts/rules/shell-segments.ts +0 -1
  452. package/scripts/rules/stop-rules.ts +13 -5
  453. package/scripts/rules/tail-commands.ts +1 -1
  454. package/scripts/rules/test-declared-commit.ts +1 -1
  455. package/scripts/rules/third-party-write.ts +0 -1
  456. package/scripts/rules/worktree-guard.ts +26 -9
  457. package/scripts/run/run-carry-cli.ts +0 -2
  458. package/scripts/run/run-carry-stash.ts +2 -2
  459. package/scripts/run/run-carry-streak.ts +1 -1
  460. package/scripts/run/run-cut-cli.ts +0 -7
  461. package/scripts/run/run-cut.ts +8 -54
  462. package/scripts/run/run-ending-cli.ts +1 -1
  463. package/scripts/run/run-ending.ts +1 -4
  464. package/scripts/run/run-entry-cli.ts +101 -24
  465. package/scripts/run/run-entry.ts +0 -1
  466. package/scripts/run/run-event-cli.ts +0 -2
  467. package/scripts/run/run-event-follow.ts +1 -0
  468. package/scripts/run/run-event-render.ts +1 -1
  469. package/scripts/run/run-event-scope.ts +53 -4
  470. package/scripts/run/run-event-stream.ts +0 -3
  471. package/scripts/run/run-event-watch.ts +1 -0
  472. package/scripts/run/run-halfrun-resume.ts +20 -7
  473. package/scripts/run/run-headless.ts +24 -8
  474. package/scripts/run/run-hold-cli.ts +33 -10
  475. package/scripts/run/run-hold.ts +25 -5
  476. package/scripts/run/run-issue-number.ts +1 -1
  477. package/scripts/run/run-liveness-cli.ts +1 -1
  478. package/scripts/run/run-liveness.ts +2 -3
  479. package/scripts/run/run-merge-cli.ts +5 -13
  480. package/scripts/run/run-merge-steps.ts +5 -5
  481. package/scripts/run/run-merge.ts +1 -1
  482. package/scripts/run/run-next-cli.ts +1 -1
  483. package/scripts/run/run-parent-cut-hook.ts +143 -0
  484. package/scripts/run/run-preflight.ts +2 -9
  485. package/scripts/run/run-prep-cli.ts +2 -2
  486. package/scripts/run/run-prep-locate.ts +1 -1
  487. package/scripts/run/run-progress-cli.ts +4 -7
  488. package/scripts/run/run-progress-clock.ts +6 -34
  489. package/scripts/run/run-progress-config.ts +0 -4
  490. package/scripts/run/run-progress-read.ts +3 -3
  491. package/scripts/run/run-progress.ts +22 -10
  492. package/scripts/run/run-prrun-resume.ts +117 -0
  493. package/scripts/run/run-report-cli.ts +1 -2
  494. package/scripts/run/run-report.ts +0 -1
  495. package/scripts/run/run-retrospective.ts +1 -1
  496. package/scripts/run/run-review-cli.ts +0 -3
  497. package/scripts/run/run-review-steps.ts +2 -0
  498. package/scripts/run/run-review.ts +0 -2
  499. package/scripts/run/run-ship-cli.ts +27 -77
  500. package/scripts/run/run-ship-detach.ts +1 -0
  501. package/scripts/run/run-ship-next.ts +106 -0
  502. package/scripts/run/run-ship-preflight.ts +87 -0
  503. package/scripts/run/run-ship-return.ts +8 -3
  504. package/scripts/run/run-ship-review-steps.ts +23 -30
  505. package/scripts/run/run-ship-review.ts +20 -0
  506. package/scripts/run/run-ship-scoped.ts +45 -0
  507. package/scripts/run/run-ship-stage.ts +5 -1
  508. package/scripts/run/run-ship-steps.ts +105 -0
  509. package/scripts/run/run-ship.ts +2 -1
  510. package/scripts/run/run-stage-read.ts +62 -0
  511. package/scripts/run/run-stage.ts +160 -0
  512. package/scripts/run/run-status-cli.ts +1 -1
  513. package/scripts/run/run-step-cli.ts +21 -14
  514. package/scripts/run/run-step.ts +1 -1
  515. package/scripts/run/run-stop-notify.ts +1 -3
  516. package/scripts/run/run-stranded-cli.ts +0 -4
  517. package/scripts/run/run-stranded-detect.ts +2 -2
  518. package/scripts/run/run-tail-cli.ts +17 -11
  519. package/scripts/run/run-tail.ts +2 -0
  520. package/scripts/run/run-tidy-lanes.ts +2 -1
  521. package/scripts/run/run-tidy-stashes.ts +12 -12
  522. package/scripts/run/run-wake-cli.ts +4 -5
  523. package/scripts/run/run-wake-describe.ts +19 -1
  524. package/scripts/run/run-wake-loop.ts +2 -2
  525. package/scripts/run/run-wake.ts +2 -4
  526. package/scripts/run/run-watcher-guard-cli.ts +0 -4
  527. package/scripts/run/run-watcher-guard.ts +9 -7
  528. package/scripts/run/run-watcher-hook.ts +1 -1
  529. package/scripts/safe-chain/ci-installer-pin.ts +11 -5
  530. package/scripts/safe-chain/project-config.ts +1 -1
  531. package/scripts/security/security-audit-provision-logic.ts +0 -1
  532. package/scripts/security/security-audit-provision.ts +3 -2
  533. package/scripts/security/security-audit.ts +0 -1
  534. package/scripts/security/security-updates-logic.ts +0 -1
  535. package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
  536. package/scripts/sonar/sonar-hotspots.ts +0 -1
  537. package/scripts/sonar/sonar-new-code-cli.ts +150 -0
  538. package/scripts/sonar/sonar-new-code.ts +79 -0
  539. package/scripts/sonar/sonar-project.ts +97 -0
  540. package/scripts/split/split-assess-cli.ts +1 -1
  541. package/scripts/split/split-assess.ts +2 -5
  542. package/scripts/sync/managed-config-scope-cli.ts +1 -1
  543. package/scripts/sync/skill-migration.ts +0 -1
  544. package/scripts/sync/sync-hook-safety.ts +2 -3
  545. package/scripts/sync/sync.ts +1 -8
  546. package/scripts/sync/template-source-logic.ts +0 -1
  547. package/scripts/sync/workflow-pin-logic.ts +16 -28
  548. package/scripts/test/test-declared-logic.ts +0 -1
  549. package/scripts/test/test-declared.ts +0 -2
  550. package/scripts/test/test-red-commit.ts +2 -2
  551. package/scripts/test/test-red.ts +14 -7
  552. package/scripts/test/test-type-logic.ts +1 -1
  553. package/scripts/test/unit-worker-share.ts +7 -16
  554. package/scripts/time-runtime/time-batch-guard.ts +1 -2
  555. package/scripts/time-runtime/time-bundle-call.ts +2 -3
  556. package/scripts/time-runtime/time-bundles.ts +0 -4
  557. package/scripts/time-runtime/time-density-hook.ts +0 -2
  558. package/scripts/time-runtime/time-followup-stage.ts +1 -1
  559. package/scripts/time-runtime/time-format.ts +0 -73
  560. package/scripts/time-runtime/time-round-trips.ts +0 -4
  561. package/scripts/time-runtime/time-single-check.ts +1 -1
  562. package/scripts/time-runtime/time-spans.ts +1 -1
  563. package/scripts/time-runtime/time-transcript-line.ts +1 -2
  564. package/scripts/ui/ui-routes-cli.ts +0 -5
  565. package/scripts/ui/ui-routes.ts +0 -5
  566. package/scripts/version/effective-upstream.ts +2 -2
  567. package/scripts/version/latest-corepack.ts +7 -9
  568. package/scripts/version/latest-scope-cli.ts +0 -2
  569. package/scripts/version/latest-update.ts +0 -2
  570. package/scripts/version/npm-registry.ts +97 -0
  571. package/scripts/version/publishable-range-check.ts +1 -1
  572. package/scripts/version/release-hold.ts +0 -4
  573. package/scripts/version/running-binary.ts +2 -2
  574. package/scripts/version/version-check-logic.ts +0 -2
  575. package/scripts/version/version-commands.ts +5 -4
  576. package/scripts/version/version-remote.ts +28 -14
  577. package/scripts/version/version-targets.ts +4 -4
  578. package/templates/sonar-project.properties +28 -1
  579. package/templates/workflows/dependabot-auto-merge.yml +5 -3
  580. package/templates/workflows/github-release.yml +81 -0
  581. package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
  582. package/prompts/collaboration-workflow/epic-audit.md +0 -5
  583. package/prompts/collaboration-workflow/epic-bundle.md +0 -5
  584. package/scripts/init/plugin-install-hint.ts +0 -47
  585. package/scripts/version/parse-json.ts +0 -13
  586. /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
  587. /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
  588. /package/scripts/{git → gh}/git-gh-command.ts +0 -0
  589. /package/scripts/{git → gh}/git-gh-issue-write.ts +0 -0
  590. /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
  591. /package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +0 -0
  592. /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
  593. /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
  594. /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
  595. /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
  596. /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
  597. /package/scripts/{git → gh}/git-pr-error.ts +0 -0
  598. /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
  599. /package/scripts/{git → gh}/github-issue-url.ts +0 -0
  600. /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
  601. /package/scripts/{git → issue}/issue-reference.ts +0 -0
  602. /package/scripts/{git → lib}/animation-helpers.ts +0 -0
  603. /package/scripts/{git → lib}/git-animation.ts +0 -0
  604. /package/scripts/{git → notify}/git-notify.ts +0 -0
  605. /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
@@ -19,7 +19,7 @@ Tier C (`CLAUDE.md`). Name what was filed in the completion report. An observati
19
19
  on is dropped rather than filed.
20
20
 
21
21
  **The filing ceilings still apply.** Count this filing in the ten-Issue limit for the run. An
22
- observation is discretionary, so above 30 open Issues in the target repository, close one first or do
22
+ observation is discretionary, so above the WIP cap in the target repository, close one first or do
23
23
  not file (`prompts/collaboration-workflow/wip-cap.md`). File it with `pnpm josh issue:file`
24
24
  (`issue-scout.md`), which lints the body against `prompts/collaboration-workflow/issue-template.md`,
25
25
  applies the classification labels it declares, runs the duplicate scan, and runs `epic:bundle` on the
@@ -32,13 +32,7 @@ The detail below is read at the filing decision, and the marker suite pins the r
32
32
 
33
33
  ### The depth test — a discretionary filing cites the product work it blocked
34
34
 
35
- **A run that has just spent an hour inside the workflow tooling files findings about the workflow
36
- tooling** (joshuafolkken/kit#1698). Measured on the `backlogrun` of 2026-09-09: 5 Issues shipped and
37
- 15 filed, of which 13 were discretionary — and all 20 were about this package's own run
38
- orchestration or the tools that measure it, with not one change a consumer of the package would see.
39
- **A listing that measures itself has no natural stopping condition**, because every measurement
40
- creates something new to measure. So the condition comes from outside, and **depth is what supplies
41
- it — read off the subject rather than judged**:
35
+ **Depth is read off the subject rather than judged** (joshuafolkken/kit#1698):
42
36
 
43
37
  | Depth | The subject | Where it lives |
44
38
  | --- | --- | --- |
@@ -48,7 +42,7 @@ it — read off the subject rather than judged**:
48
42
 
49
43
  **The depth is recorded on the Issue as a label, and the label is applied when the Issue is filed**
50
44
  (joshuafolkken/kit#1729). `depth:0`, `depth:1` and `depth:2` are the three, defined once in
51
- `scripts/git/issue-labels.ts` and carrying no definition of their own — **the table above is the
45
+ `scripts/issue/issue-labels.ts` and carrying no definition of their own — **the table above is the
52
46
  single source**, and a label description that paraphrased it would be a second copy of the rule.
53
47
  **Every filing route applies one**, this route and the other three of §2d's table alike: a `new`
54
48
  entry point, a `route:tier-a` prerequisite, a `route:interrupt`, a split child and a review round
@@ -62,7 +56,7 @@ gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=depth:1' # an Issue
62
56
 
63
57
  **Create the three once per repository**, before the first filing that applies one — REST auto-creates
64
58
  a missing label with a generated color and no description, and the three lines below are what give
65
- each a stable color a reader can scan a listing by. `DEPTH_LABELS` in `scripts/git/issue-labels.ts`
59
+ each a stable color a reader can scan a listing by. `DEPTH_LABELS` in `scripts/issue/issue-labels.ts`
66
60
  is the single source of the colors and descriptions, and `scripts/rules/issue-depth-label.test.ts` keys
67
61
  these lines to it so the two cannot drift.
68
62
 
@@ -75,16 +69,14 @@ gh api repos/{owner}/{repo}/labels -f name=depth:2 -f color=c5def5 -f descriptio
75
69
  - **It is read off the subject, exactly as the table is** — so applying it is not a judgement and not
76
70
  a person's to make, which is what separates it from `auto-ok` and `needs-human-review`. Those two
77
71
  decide what a run may do; this one records what an Issue is about and withholds nothing.
78
- - **Applied at filing, not at completion.** A depth assigned when the work finishes is assigned by
79
- whoever happens to close it, and the share below is a question about the *open* backlog — an Issue
80
- that never carried the label was never in the numerator's reach.
72
+ - **Applied at filing, not at completion.**
81
73
  - **An Issue carrying more than one counts as the lowest depth present**, the one closest to the
82
- consumer. It is a fixed tie-break rather than a preference: without one the same backlog measured
83
- twice can answer twice, which is the whole defect joshuafolkken/kit#1729 was filed for.
74
+ consumer.
84
75
  - **An `epic` takes no depth label**, because it has no subject of its own to read one off — its
85
76
  children carry the subjects, and the share below excludes it from the denominator for that same
86
- reason. A depth label present on an Issue the count skips is exactly the ambiguity this section
87
- exists to remove.
77
+ reason.
78
+
79
+ Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why the depth label is applied at filing".
88
80
 
89
81
  - **A discretionary observation at depth 1 or deeper is filed only where it can cite the depth-0 work
90
82
  it stopped or delayed** — named as an Issue number or a run, never as "this would slow runs down".
@@ -96,12 +88,8 @@ gh api repos/{owner}/{repo}/labels -f name=depth:2 -f color=c5def5 -f descriptio
96
88
  - **`route:tier-a` and `route:interrupt` do not take it either**, at any depth: a filing the run
97
89
  cannot proceed without is already citing its own blockage.
98
90
  - **A depth-2 filing — one whose subject is what measures a run — carries a further requirement, on
99
- top of the depth-0 citation above rather than in place of it** (joshuafolkken/kit#1975). The
100
- citation the depth-0 gate asks for is one a slow run can always produce, so it barely bites on a
101
- measurement Issue: "runs are slow" and "the diff is large" both name depth-0 work, while the number
102
- the Issue proposes to produce changes nothing — and a listing that measures itself has no natural
103
- stopping condition precisely there. So a discretionary depth-2 filing states two things the depth-0
104
- citation does not force:
91
+ top of the depth-0 citation above rather than in place of it** (joshuafolkken/kit#1975). A
92
+ discretionary depth-2 filing states two things the depth-0 citation does not force:
105
93
  - **The decision the number would change, named** — the Issue number holding the choice it is
106
94
  waiting on, or a decision a person is about to make. "Slow", "large" and "worth knowing" are not a
107
95
  decision.
@@ -115,15 +103,15 @@ gh api repos/{owner}/{repo}/labels -f name=depth:2 -f color=c5def5 -f descriptio
115
103
  depth-0 observation does not take it because it is the product, and a review round cap's branch-2
116
104
  filing (below) clears its own bar and never reaches this one.
117
105
 
106
+ Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why depth gates a discretionary filing".
107
+
118
108
  **It governs this route only — the fourth row of §2d's table.** A review finding routed to branch 2
119
109
  of `prompts/review.md` → "Review round cap" is filed under that section's own bar — a confirmed
120
110
  defect reaching a runtime path, with a written failure scenario — and **does not take the depth
121
111
  test**: it has already cleared a bar this route has not, so gating it on a citation as well would
122
112
  drop the one kind of finding both documents agree is never dropped. **That bar is the reason, and the
123
- subject's depth is not** — the sentence here used to say that a defect in a `josh` command's behavior
124
- is depth 0 by construction, and joshuafolkken/kit#1694 and joshuafolkken/kit#1703 are both branch-2
125
- filings whose subject is the epic tooling, which the table above puts at depth 1
126
- (joshuafolkken/kit#1675).
113
+ subject's depth is not.** Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why a
114
+ review branch-2 filing skips the depth test".
127
115
 
128
116
  **This is not the count cap that was rejected.** A cap is rationing — past the number the finding is
129
117
  lost, and nothing about it says which findings were worth having. This changes what counts as a
@@ -133,34 +121,26 @@ finding at all, so what it excludes is excluded for a reason a reader can check.
133
121
  a depth-2 Issue that *proposes* a measurement; a pull request that *adds* one — a new report column,
134
122
  section, scope or subcommand, a diagnostic step — states in its body the reader that consumes it: the
135
123
  Issue number that read the value to decide something, or the path of the rule that reads it. **A
136
- measurement with no reader is not added** — this is joshuafolkken/kit#2012's test, the one that
137
- retired every column no decision reads, moved to the moment a column is proposed so the retirement
138
- never has to be filed again. `route:tier-a` and `route:interrupt` carry over unchanged.
124
+ measurement with no reader is not added** (joshuafolkken/kit#2012). `route:tier-a` and
125
+ `route:interrupt` carry over unchanged.
139
126
 
140
127
  ### The depth-0 share — what is counted
141
128
 
142
- **joshuafolkken/kit#1698 set a measurable target: the share of open Issues at depth 0** — 3/23
143
- ≈ 13% on 2026-09-09 (joshuafolkken/kit#1729). Counted by eye it is not reproducible: done again on
144
- 2026-09-10 it produced 3/14 ≈ 21%, and the two figures **are not comparable**: they took different
145
- denominators, and neither said which. So the denominator is fixed here as a rule rather than left to
146
- the counter.
129
+ **The depth-0 share is the share of open Issues at depth 0** (joshuafolkken/kit#1698,
130
+ joshuafolkken/kit#1729).
147
131
 
148
132
  **The denominator is a rule, not a choice, and this is it:**
149
133
 
150
- - **Counted: every open Issue that does not carry `epic`.** An epic is a container for other Issues
151
- rather than a deliverable of its own — counting one counts its children twice, and an epic has no
152
- subject of its own to read a depth off.
134
+ - **Counted: every open Issue that does not carry `epic`.**
153
135
  - **`route:tier-a` and `route:interrupt` are counted like anything else.** The depth test above
154
- exempts them from its *citation* requirement; it never said they are not work. Excluded, a run
155
- could improve the share by choosing a filing route.
156
- - **An Issue with no depth label is in the denominator**, counted separately as `unlabelled`. Left
157
- out, the share would improve every time a filing skipped the label — the one direction a
158
- measurement must never be able to move on its own.
136
+ exempts them from its *citation* requirement; it never said they are not work.
137
+ - **An Issue with no depth label is in the denominator**, counted separately as `unlabelled`.
159
138
  - **The numerator is what is left**: open, non-epic Issues carrying `depth:0`.
160
139
 
161
- **Two readings of the same backlog give the same number**, which is what the hand counts could not
162
- do: the denominator is a rule rather than a choice, so nothing in the count is left to the counter's
163
- judgement.
140
+ **Two readings of the same backlog give the same number**: nothing in the count is left to the
141
+ counter's judgement.
142
+
143
+ Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why the depth-0 denominator is fixed".
164
144
 
165
145
  **What the number is for is not decided here.** Changing what `backlog:next` offers on the strength
166
146
  of it, and setting a target value, are both deliberately out of scope until the current value has
@@ -168,12 +148,9 @@ been measured the same way more than once (joshuafolkken/kit#1729 → 範囲外)
168
148
 
169
149
  ### The ledger — where an observation that cannot cite a blockage goes
170
150
 
171
- **"Not filed" used to mean "gone", and that is what walked the depth test past itself.** The
172
- completion report was the only place such an observation could land, and a completion report is
173
- read once and then scrolls away — so the next run met the same thing as a first sighting, forever.
174
- joshuafolkken/kit#1726 is the worked case: its own body says the depth test would not have filed it,
175
- and it was filed anyway, because **discarding it was the only alternative on offer**
176
- (joshuafolkken/kit#1728).
151
+ **An observation the depth test turns away is recorded in the ledger, not discarded**
152
+ (joshuafolkken/kit#1728). Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why the
153
+ ledger exists".
177
154
 
178
155
  - **The destination is the `docs/maintainers/observations/` directory in the repository the
179
156
  observation is about** — the same repository the Issue would have been filed into — **one file per
@@ -221,9 +198,8 @@ A sample, in the shape a real entry takes:
221
198
 
222
199
  **`k:example` is reserved for this sample and is never used by a real observation**, so the count
223
200
  below can be run over the whole ledger without the sample answering for one. **The grammar is defined
224
- here rather than in the ledger** because this skill is distributed to every repository that consumes
225
- the package and `docs/` is not — a rule that named a definition the reader never received would
226
- leave every consumer's ledger shaped by hand.
201
+ here rather than in the ledger** (`docs/maintainers/observation-filing-rationale.md` → "Why the
202
+ ledger exists").
227
203
 
228
204
  **The identity key is the whole of the repeat test — never a similarity judgement about the prose.**
229
205
  Choose the key from the phenomenon rather than from the run, then count what the ledger already holds
@@ -244,27 +220,17 @@ rather than by editing the one already written.
244
220
 
245
221
  **The depth gate is not withdrawn, and this is not a way around it.** An observation that *can* cite
246
222
  the depth-0 work it stopped is filed exactly as it was before — this route is only for the ones that
247
- could not, and whose sole previous destination was nothing (joshuafolkken/kit#1698's gate stands
248
- unchanged).
223
+ could not.
249
224
 
250
225
  ### The commit path — how an appended line reaches the default branch
251
226
 
252
- **An append nobody commits is an append nobody can count** (joshuafolkken/kit#1756). The ledger was
253
- given a destination and no route out of the working tree the line was written in, and **structurally
254
- nobody was going to commit one**: the parent session that appends never runs `pnpm josh git`, a child
255
- runs it inside a lane work tree that cannot see the parent's checkout, and in the primary checkout
256
- `git add -u` swept the line into whatever unrelated pull request that run was opening. Measured on
257
- the day the ledger shipped, `docs/observations.md` had exactly one commit — the one that created
258
- it — and seven lines had never left a working tree. **So the repeat count below was reading a file
259
- that is empty on every other machine**, and every sighting was a first one, which is the state
260
- joshuafolkken/kit#1728 created the ledger to end.
227
+ **An append nobody commits is an append nobody can count** (joshuafolkken/kit#1756). Rationale:
228
+ `docs/maintainers/observation-filing-rationale.md` → "Why the ledger has a commit path".
261
229
 
262
230
  - **A run's appended lines ride its own commit** (joshuafolkken/kit#2763). `pnpm josh git` stages
263
231
  `docs/maintainers/observations/` with the run's other changes, in the one staging step every entry
264
232
  point goes through (`scripts/git/git-staging.ts`), so the lines are reviewed and merged with the
265
- pull request of the run that recorded them, and the run's CI is the only wait they cost. Until
266
- #2763 the ledger was excluded there (joshuafolkken/kit#1756) and every run that appended a line
267
- paid a second branch, CI wait and merge after its own — 144 ledger-only pull requests in one month.
233
+ pull request of the run that recorded them, and the run's CI is the only wait they cost.
268
234
  **Record before the commit, not after the merge:** a finding recorded with `pnpm josh review:record`
269
235
  before `pnpm josh git -y` is carried; the time while CI runs is for the records that need no CI
270
236
  result — filing an observation Issue, drafting the completion report.
@@ -280,10 +246,7 @@ joshuafolkken/kit#1728 created the ledger to end.
280
246
  otherwise be lost with the branch. A run whose lines rode its commit pays nothing.
281
247
  - **A lane carries its own lines, in its own pull request** (joshuafolkken/kit#2919). Its writers
282
248
  append to its own tree's `<N>.md`, so the two steps above take them to the default branch exactly as
283
- they do for a run in the primary checkout. Lanes once wrote to the primary checkout's single file
284
- instead (joshuafolkken/kit#2419) and a `backlogrun` flushed them all at `run:carry --end`
285
- (joshuafolkken/kit#2492); another run's stash of that checkout took the lines before the flush saw
286
- them, so neither route remains. **Nothing is held in the primary checkout for later.**
249
+ they do for a run in the primary checkout. **Nothing is held in the primary checkout for later.**
287
250
  - **`pnpm josh observations:flush` is left for a line written outside any issue's run** — the
288
251
  date-named file a retrospective or a hand append on the default branch writes. It stages the ledger
289
252
  and nothing else, commits it on a branch of its own, opens a docs-only pull request, waits on the
@@ -300,10 +263,9 @@ joshuafolkken/kit#1728 created the ledger to end.
300
263
 
301
264
  ### The second sighting is what files it
302
265
 
303
- **A repeat is the citation.** joshuafolkken/kit#1698 asked a discretionary filing to be pulled by a
304
- blockage rather than pushed by a sighting; an observation recorded twice has been pulled — it came
305
- back on its own, which no single sighting can demonstrate. So the gate has a second way through, and
306
- it is counted rather than judged:
266
+ **A repeat is the citation**, so the gate has a second way through, and it is counted rather than
267
+ judged (rationale: `docs/maintainers/observation-filing-rationale.md` → "Why a second sighting
268
+ files"):
307
269
 
308
270
  - **On the count answering exactly `1`, the observation is filed**, at depth 1 or deeper, with no
309
271
  depth-0 citation — `1` and not "1 or more", because a higher count means the Issue was already
@@ -336,19 +298,12 @@ could bite later" line (`backlogrun-child.md` → "What the summary carries, and
336
298
  parent files what survives — under the depth test above, and inside the run's ceiling.
337
299
 
338
300
  **A delegated child does not append to the ledger either — the parent collapses the duplicates and
339
- appends what is left.** The ledger's whole value is that one key means one phenomenon, and a child
340
- holding one Issue's worth of context cannot tell its observation from the sibling lane's: eight
341
- children appending in parallel would write the same thing under eight keys, and every one of them
342
- would then read as a first sighting. The child's route is unchanged and is the only one it has —
301
+ appends what is left.** The child's route is unchanged and is the only one it has —
343
302
  the summary's "Observations that could bite later" line — and the parent chooses the key, checks the
344
- count and writes the line.
345
-
346
- **Two reasons, and a child can solve neither for itself.** It holds one Issue's worth of context, so
347
- **it cannot tell its observation from the one a sibling filed twenty minutes earlier** — the 15
348
- filings of 2026-09-09 were collapsed to 12 within that same day, which means they were collapsible
349
- at the moment they were made. And **the 10-per-run ceiling for this route is the parent's to
350
- count**: six children counting two or three filings each never reach it, which is why it did not
351
- fire once on the run that filed fifteen.
303
+ count and writes the line. **The 10-per-run ceiling for this route is the parent's to count.**
304
+
305
+ Rationale: `docs/maintainers/observation-filing-rationale.md` → "Why a delegated child neither files
306
+ nor appends".
352
307
 
353
308
  **This file is the single source of every procedure above**, and `SKILL.md` → §2i is the single
354
309
  source of the rule they carry out; nothing under `prompts/collaboration-workflow/` restates either
@@ -7,7 +7,7 @@ from the gate onward. Rationale: `docs/maintainers/pre-gate-cut-rationale.md`
7
7
 
8
8
  This file is the single source of the boundary. `run:cut` takes it, and `run:cut --resume` is the
9
9
  check a fresh process makes at its own entry. **A second boundary is added below** — the
10
- implementation-phase cut (joshuafolkken/kit#1933), at a context threshold _during_ implementation.
10
+ implementation-phase cut, at a context threshold _during_ implementation.
11
11
  Everything through "What is carried" describes the pre-gate cut; the later section states only what
12
12
  differs.
13
13
 
@@ -23,7 +23,7 @@ verification the fresh process runs on the tree.
23
23
 
24
24
  The cut is for a **detached** `fullrun` a lane dispatched; a person's interactive `fullrun` never
25
25
  relaunches itself. A dispatched child is told apart **mechanically, by a mark the dispatch sets** — never
26
- by the model reading the shape of its own prompt (joshuafolkken/kit#1904).
26
+ by the model reading the shape of its own prompt.
27
27
 
28
28
  ### The dispatch mark
29
29
 
@@ -44,16 +44,15 @@ checkout, a cut in a lane.
44
44
 
45
45
  ## Taking the cut
46
46
 
47
- **The order is fixed in the chain** (joshuafolkken/kit#2177): `chain-rule.md` step 1 issues
47
+ **The order is fixed in the chain**: `chain-rule.md` step 1 issues
48
48
  `pnpm josh run:cut <N>` after `pnpm josh main:merge`, before the scoped pair and the gate. **The command
49
- is issued unconditionally**; `run:cut` itself decides whether the cut is warranted
50
- (joshuafolkken/kit#2312), so a short lane with nothing to drop is answered `under-threshold` and walks on
49
+ is issued unconditionally**; `run:cut` itself decides whether the cut is warranted, so a short lane with nothing to drop is answered `under-threshold` and walks on
51
50
  to the gate rather than relaunching.
52
51
 
53
52
  At the pre-gate boundary, issue:
54
53
 
55
54
  ```bash
56
- pnpm josh run:cut <N> # alias: josh rct
55
+ pnpm josh run:cut <N>
57
56
  ```
58
57
 
59
58
  - `cut` (0) — record written and handed to the lane's launch owner (OpenAI supervisor starts the
@@ -72,25 +71,25 @@ the current process to carry the run on itself.
72
71
 
73
72
  ### The gate refuses until the cut has been taken (joshuafolkken/kit#1864)
74
73
 
75
- **This step was carried as prose and fired exactly never.** Across six measured lane children the cut
76
- was taken **0 times**. So `pnpm josh rule:guard` **refuses `pnpm josh gate`** while this checkout is a
77
- lane and no cut record is carried, handing back the command above. With the ordered step above the
78
- refusal is insurance, not the primary trigger. Rationale:
74
+ **This step was carried as prose and fired exactly never.** In measured lane children the cut was taken **0 times**, so
75
+ `pnpm josh rule:guard` **refuses `pnpm josh gate`** while this checkout is a lane and no cut record is
76
+ carried, handing back the command above. Rationale:
79
77
  `docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose".
80
78
 
81
79
  - **It fires for a marked child and nowhere else**: the working directory is a lane —
82
80
  `<lane root>/<issue number>` — **and** `JOSH_LANE_CHILD` names that same issue. An interactive
83
81
  `fullrun` carries no mark and runs its gate untouched. `run:cut` uses an open-lane lookup instead, so
84
82
  the guard and the command need not agree byte for byte.
85
- - **It fires only when the recent-window context warrants a cut** (joshuafolkken/kit#2312). The guard
83
+ - **It fires only when the recent-window context warrants a cut**. The guard
86
84
  reads the same `cost_cli.session_verdict` `run:cut` reads, so an `under`-threshold lane is let through
87
85
  to the gate rather than refused.
88
86
  - **It is silent once the cut is carried**, so the resumed process goes straight to the gate.
89
- - **It fires once per run.** A refusal that repeated would wedge the runs that obeyed.
87
+ - **It fires once per run.**
90
88
  - **`--resume`, `--end` and `--json` do not count as taking the cut.**
91
89
 
92
90
  The row, its trigger and the enumeration it joins are
93
- `prompts/collaboration-workflow/rule-delivery.md`; `scripts/rules/pre-gate-cut.test.ts` pins it.
91
+ `prompts/collaboration-workflow/rule-delivery.md`. The suites that pin this and the three guards below:
92
+ `docs/maintainers/pre-gate-cut-rationale.md` → "Which suites pin each guard".
94
93
 
95
94
  ## Resuming — the fresh process's entry check
96
95
 
@@ -106,8 +105,7 @@ pnpm josh run:cut --resume <N>
106
105
  - `resume` (0) — a declared pre-gate cut whose tree matches was verified and taken over. **Skip the
107
106
  title, the plan, the fresh hold claim and the implementation**; re-read the issue body and comments
108
107
  for the plan and the recorded decisions, then go straight to `pnpm josh gate`.
109
- - `resume-impl` (0) — like `resume`, but the cut was taken **during** implementation
110
- (joshuafolkken/kit#1933). Skip the title, the plan, the fresh hold claim and the split assessment,
108
+ - `resume-impl` (0) — like `resume`, but the cut was taken **during** implementation. Skip the title, the plan, the fresh hold claim and the split assessment,
111
109
  re-read the plan, then **continue implementation** — do **not** go straight to the gate.
112
110
  - `handed-off` (0) — a successor has already adopted this cut, `is_handed_off` is spent
113
111
  (joshuafolkken/kit#1935). This process was woken **after** its own cut. **End the turn quietly and do
@@ -154,7 +152,7 @@ decisions are read back from the issue. Rationale:
154
152
 
155
153
  ## The implementation-phase cut — a lane child cuts before the gate too
156
154
 
157
- The **implementation-phase cut** (joshuafolkken/kit#1933) caps the context accumulated _during_
155
+ The **implementation-phase cut** caps the context accumulated _during_
158
156
  implementation — the child ends mid-implementation and a fresh one resumes the lane **back into
159
157
  implementation**.
160
158
 
@@ -162,15 +160,15 @@ implementation**.
162
160
 
163
161
  The guard below refuses on the same measurement the parent uses between children —
164
162
  `cost_verdict.per_request_cost`, read through `cost_cli.session_verdict` (the read-only form of
165
- `pnpm josh cost --cut`, joshuafolkken/kit#2312), single-sourced at `backlogrun-progress.md` → "The
163
+ `pnpm josh cost --cut`), single-sourced at `backlogrun-progress.md` → "The
166
164
  hand-off". The parent's seam and the child's `run_cut.IMPLEMENTATION_CONTEXT_THRESHOLD` share the
167
165
  **135_000** `CONTEXT_CUT_THRESHOLD` (aliased so the tests cannot drift). No separate measurement is
168
166
  built for the lane child.
169
167
 
170
168
  ### It is a guard, fired at the edit that crosses the threshold (joshuafolkken/kit#2310)
171
169
 
172
- **This step was carried as prose and fired exactly never** — measured across five lanes, the cut fired
173
- **0 times** while 33.9% of their requests ran past 200,000 tokens. Rationale:
170
+ **This step was carried as prose and fired exactly never** — the cut fired **0 times** while 33.9% of
171
+ lane requests ran past 200,000 tokens. Rationale:
174
172
  `docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose".
175
173
 
176
174
  So `pnpm josh rule:guard` **refuses an `Edit` / `Write`** while this checkout is a dispatched lane child
@@ -185,7 +183,7 @@ crossing one successor.
185
183
  - **It fires for a marked child, or a run held outside a lane on a measured `over`**
186
184
  (joshuafolkken/kit#2760); a person's tree holds no run. Outside a lane `cut` relaunches nothing: keep
187
185
  the hold, send a `confirmation` Telegram naming `fullrun #<N>`, end the turn.
188
- - **It fires on every threshold crossing, not once per run** (joshuafolkken/kit#2385) — it re-asks on
186
+ - **It fires on every threshold crossing, not once per run** — it re-asks on
189
187
  each over-threshold edit, including after a `busy` / `failed` / `unready` verdict.
190
188
  - **An edit reissued right after a refusal passes** — so a `busy` / `failed` cut cannot wedge the run:
191
189
  the reissue lands inside a short window and goes through, a genuinely new crossing past it refuses
@@ -196,8 +194,8 @@ crossing one successor.
196
194
  - **The verdict read is reused over a short window** — cached per checkout for a few seconds, so a
197
195
  turn's burst of edits shares one read.
198
196
 
199
- `scripts/rules/implementation-cut.ts` implements the trigger, `scripts/rules/implementation-cut.test.ts`
200
- pins it, and the row joins `prompts/collaboration-workflow/rule-delivery.md`. **A child that ended
197
+ `scripts/rules/implementation-cut.ts` implements the trigger, and the row joins
198
+ `prompts/collaboration-workflow/rule-delivery.md`. **A child that ended
201
199
  without cutting is still detected after the fact by `pnpm josh run:ending <N> --output <path>`**
202
200
  (joshuafolkken/kit#2139). **A single check (`lint:related` / `test:related`) is run after a batch of
203
201
  edits, not after each one.**
@@ -206,12 +204,10 @@ edits, not after each one.**
206
204
 
207
205
  **`CONTEXT_CUT_THRESHOLD` (135_000) is one value, and `cost_verdict.per_request_cost` — the one
208
206
  statistic the parent and the lane child both read — averages the most recent `RECENT_REQUEST_WINDOW`
209
- (10) requests, not the whole session** (joshuafolkken/kit#2295). The value is a derived break-even, not a
210
- chosen number (joshuafolkken/kit#2406): `scripts/cost-runtime/context-cut-payback.ts` computes it from a
211
- cut's one-time preamble rewrite (`POST_CUT_CONTEXT`, ~60_000 tokens — a cut carries a request from ~130k
212
- down to ~60k), the cache multipliers in `cost-pricing.ts`, and a 10-request horizon.
207
+ (10) requests, not the whole session**. The value is computed by
208
+ `scripts/cost-runtime/context-cut-payback.ts`, its single source.
213
209
 
214
- **The cut is conditional** (joshuafolkken/kit#2312): taken only when the recent-window per-request cost
210
+ **The cut is conditional**: taken only when the recent-window per-request cost
215
211
  is over `CONTEXT_CUT_THRESHOLD` — the same statistic and threshold the implementation-phase cut reads, so
216
212
  no second threshold exists. Below it `run:cut` answers `under-threshold` and the gate runs uncut; the
217
213
  guard reads the same verdict and stays silent. An **unmeasurable** session is always cut.
@@ -227,8 +223,8 @@ cut is the same pattern one boundary earlier.
227
223
  ## A lane child records its park before it stops
228
224
 
229
225
  **A dispatched lane child records its park on the Issue before it stops for a decision**
230
- (joshuafolkken/kit#2034). A headless child's only route to ask a person is to park the Issue — measured
231
- on #2012 and #2011, whose questions reached only their final message. Rationale:
226
+ (joshuafolkken/kit#2034). A headless child's only route to ask a person is to park the Issue (#2012,
227
+ #2011). Rationale:
232
228
  `docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose".
233
229
 
234
230
  **The record, before the Telegram, is the park procedure exactly** — `needs-decision` plus a comment
@@ -255,21 +251,22 @@ lane child — the mark `JOSH_LANE_CHILD` names this lane's own issue — handin
255
251
  on the compliant path is safe.
256
252
 
257
253
  This section is the single source of the lane-child park rule; `scripts/rules/lane-park.ts` implements
258
- the trigger, `scripts/rules/lane-park.test.ts` pins it, and the row joins the enumeration in
254
+ the trigger, and the row joins the enumeration in
259
255
  `prompts/collaboration-workflow/rule-delivery.md`.
260
256
 
261
257
  ### The interactive ask is refused one call earlier
262
258
 
263
259
  (joshuafolkken/kit#2201) The harness refuses an interactive ask in a headless session by **ending the
264
- turn**, so the notify guard never fires — #2178's child did exactly that, the failure
265
- joshuafolkken/kit#2034 set out to prevent, one call upstream. So `pnpm josh rule:guard` **refuses
266
- `AskUserQuestion` for a marked lane child**; the deny returns to the model, and the instruction is to
267
- park the question. It fires on **every occurrence** and stays silent for a person working in a lane.
260
+ turn**, so the notify guard never fires (#2178 — the failure joshuafolkken/kit#2034 set out to prevent,
261
+ one call upstream). So `pnpm josh rule:guard` **refuses `AskUserQuestion` for a marked lane child**; the
262
+ deny returns to the model, and the instruction is to park the question. It fires on **every occurrence**
263
+ and stays silent for a person working in a lane. Rationale:
264
+ `docs/maintainers/pre-gate-cut-rationale.md` → "Why the rules are guards, not prose".
268
265
 
269
266
  **A child that slips past it is still recoverable** — `pnpm josh run:ending` lifts the refused ask out
270
267
  of the exit record's `permission_denials` into the `abandoned` verdict's park basis, so the parent puts
271
- it into the park comment. `scripts/rules/lane-interactive-ask.ts` implements the trigger,
272
- `scripts/rules/lane-interactive-ask.test.ts` pins it, and `scripts/agent/interactive-ask.ts` is the
268
+ it into the park comment. `scripts/rules/lane-interactive-ask.ts` implements the trigger, and
269
+ `scripts/agent/interactive-ask.ts` is the
273
270
  shared extractor the guard and `run:ending` both read.
274
271
 
275
272
  This file is the single source of the rule.
@@ -31,7 +31,7 @@ pnpm josh issue:file "<title>" --body-file <body-file> --depth <n> --route tier-
31
31
 
32
32
  The command lints the body against `prompts/collaboration-workflow/issue-template.md`, applies the
33
33
  classification labels it declares, and runs the duplicate scan and `epic:bundle` itself
34
- (`docs/josh-commands.md` → `josh issue:file`).
34
+ (`docs/josh-commands-automation.md` → `josh issue:file`).
35
35
 
36
36
  Every "file the prerequisite" below means that labelled filing, and it always happens **first**: the
37
37
  steps after it name a number that does not exist until it is. **Its duplicate scan is read exactly as
@@ -0,0 +1,36 @@
1
+ # `prrun` — the manifest (plan → implement → PR → green → stop, a person merges)
2
+
3
+ `prrun` sits between `halfrun` (stop before commit) and `fullrun` (auto-merge). It runs `fullrun`
4
+ up to a green, mergeable pull request and **stops before the merge**, so a person merges by hand
5
+ (joshuafolkken/kit#3023). **Read `fullrun.md` for every step** — the entry sequence, the step lists,
6
+ the gate, the review and the stop branches are `fullrun`'s, unchanged. This file names only the
7
+ difference, never a second copy of the procedure.
8
+
9
+ ## The difference — the entry
10
+
11
+ `prrun #<N>` opens with `pnpm josh run:entry <N> --to prrun` where `fullrun` passes no `--to`
12
+ (`SKILL.md` → §2k): a planned Issue starts at the implementation, a `halfrun` stop is adopted and
13
+ resumes at the gate, and an Issue already stopped by a `prrun` is reached — report the stage line and
14
+ stop. A merged Issue is reached too, but the `entry #<N>` line after the stage line answers it (§2k).
15
+
16
+ ## The difference — the end of the run
17
+
18
+ Where `fullrun` runs `pnpm josh followup` and merges, `prrun` does three things and stops:
19
+
20
+ 1. **Watch the pull request to mergeable** — `pnpm josh followup "<title> #<N>" --no-merge`
21
+ (`followup.md` → "Run `pnpm josh followup`", read in the same turn): required CI green and the AI
22
+ review findings resolved. A failure stops the run exactly as it stops a `fullrun`.
23
+ 2. **Mark the stop — `pnpm josh run:hold <N> --prrun-stop`.** It records the commit the pull request is
24
+ on in this run's own hold, the record `fullrun #<N>` adopts (its prrun resume, `working-tree-hold.md`). **The hold and `in-progress` stay**: the run is not finished until the merge's tail runs.
25
+ 3. **Send a `confirmation` Telegram with the resume commands, then stop.** **`fullrun #<N>` first** —
26
+ its `run:entry` reads where the pull request stands and resumes from there; the direct command
27
+ follows for finishing without an agent:
28
+ `pnpm josh notify --task-type confirmation --issue-url "<issue-url>" --body=$'prrun ready to
29
+ merge: <pr-url>\nNext: fullrun #<N>\nAfter a manual merge, without an agent: pnpm josh followup
30
+ "<title> #<N>"'`. The stop report names the same two, in the same order.
31
+
32
+ **Invoking `prrun` is _not_ authorization to merge** — never run `pnpm josh followup` without
33
+ `--no-merge` in a `prrun`. After a person merges by hand, the same `pnpm josh followup "<title> #<N>"`
34
+ runs only the post-merge tail (`followup.md`).
35
+
36
+ `prrun new`: `fullrun new` up to the pull request, then the three steps above with the filed number.
@@ -65,7 +65,7 @@ Issue, as after any filing.
65
65
  input, so the next run picks the improvements up without waiting for a person. **`backlogrun-steps.md` →
66
66
  "What one invocation approves" is that carve-out's single source**; it is written there, beside the
67
67
  brakes that bound it, rather than restated here. Every brake still counts a retrospective's filings: the
68
- ten-per-invocation ceiling, the WIP cap of 30, `--max`, the 150,000-token session budget and the 8-hour
68
+ ten-per-invocation ceiling, the WIP cap, `--max`, the 150,000-token session budget and the 8-hour
69
69
  whole-run bound.
70
70
 
71
71
  **Close with `pnpm josh run:carry --retrospective --summary "<result>" --owner "$PPID"`.** It marks the
@@ -11,9 +11,9 @@ a `new` entry files its Issue**, because a run stopped after the filing has alre
11
11
  artifact it should not have created.
12
12
 
13
13
  ```bash
14
- pnpm josh run:hold <N> # a `#N` entry point ; alias: josh rh
14
+ pnpm josh run:hold <N> # a `#N` entry point
15
15
  pnpm josh run:hold # a `new` entry point, before the issue exists
16
- pnpm josh run:release <N> # that same run releasing its own record ; alias: josh rr
16
+ pnpm josh run:release <N> # that same run releasing its own record
17
17
  pnpm josh run:release # the bare form releases the unnumbered run's own record
18
18
  pnpm josh run:release --force # a record left behind by a run that has ended
19
19
  ```
@@ -63,12 +63,13 @@ or release once the work is done; only an expired record over a clean tree is re
63
63
  **The batch entry points claim per child, not per batch.** `backlogrun` never
64
64
  call it themselves; each child runs the `fullrun` procedure, so it claims on entry and `pnpm josh
65
65
  followup` releases it at that child's merge. The command's behavior and the answer table are
66
- `docs/josh-commands.md` → "`josh run:hold` / `josh run:release`"; this file is the single source of
66
+ `docs/josh-commands-automation.md` → "`josh run:hold` / `josh run:release`"; this file is the single source of
67
67
  the procedure.
68
68
 
69
69
  ## The halfrun resume
70
70
 
71
- **`fullrun #<N>` after a `halfrun` stop resumes it instead of claiming** (joshuafolkken/kit#2796). The
71
+ **`fullrun #<N>` or `prrun #<N>` after a `halfrun` stop resumes it instead of claiming**
72
+ (joshuafolkken/kit#2796, #3042). The
72
73
  stop is **recorded, never inferred**: the `halfrun` ends with `pnpm josh run:hold <N> --halfrun-stop`,
73
74
  which marks its own record (re-keying a `halfrun new`'s unnumbered one to the filed issue) — a
74
75
  `halfrun` still implementing or a `backlogrun` child leaves the same hold over the same dirty tree, and
@@ -79,3 +80,22 @@ halfrun`. **Skip the title, the plan, the split assessment, `git switch main &&
79
80
  issue (`pnpm josh issue:read <N>`), then run the gate **in full** from the refactor (`chain-rule.md` →
80
81
  "Run the review-to-merge chain") — a fix made during the manual check has had no gate — and ship as
81
82
  any `fullrun` does.
83
+
84
+ ## The prrun resume
85
+
86
+ **`fullrun #<N>` after a `prrun` stop resumes it the same way** (joshuafolkken/kit#3023). The `prrun`
87
+ ends with `pnpm josh run:hold <N> --prrun-stop`, which writes the commit its pull request is on into its
88
+ own record; only a record carrying that commit is adopted. `run:entry` asks the session budget, adopts
89
+ the hold with the `fullrun` mark and prints one of three tokens — read, never inferred:
90
+
91
+ - **`resume: prrun-merged`** — a person merged the pull request. Run `pnpm josh followup "<title>
92
+ #<N>"` alone: it detects the merge and runs only the post-merge tail.
93
+ - **`resume: prrun-merge`** — the branch is still on the stop's commit, both here and on the pull
94
+ request, and the tree is clean, so what was verified is what would merge. Skip the gate and the
95
+ review; run `pnpm josh followup` to merge.
96
+ - **`resume: prrun-gate`** — the branch moved (locally, or by a push made on GitHub), its pull request
97
+ could not be read, or the tree is dirty: a person changed something. Run the
98
+ gate **in full** and the review (`chain-rule.md` → "Run the review-to-merge chain"), then ship as any
99
+ `fullrun` does.
100
+
101
+ All three skip the title, the plan, the split assessment and the implementation.