@joshuafolkken/kit 1.1784.0 → 1.2114.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 (690) hide show
  1. package/.claude/agents/reviewer-verification.md +19 -0
  2. package/.claude/agents/reviewer.md +19 -0
  3. package/.claude/settings.json +5 -6
  4. package/.claude/skills/dependency-update/SKILL.md +9 -10
  5. package/.claude/skills/workflow-commands/SKILL.md +6 -6
  6. package/.claude/skills/workflow-commands/background-commands.md +8 -5
  7. package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
  8. package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
  9. package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
  10. package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
  11. package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
  12. package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
  13. package/.claude/skills/workflow-commands/backlogrun.md +1 -1
  14. package/.claude/skills/workflow-commands/chain-rule.md +41 -32
  15. package/.claude/skills/workflow-commands/delegation.md +6 -6
  16. package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
  17. package/.claude/skills/workflow-commands/followup.md +7 -5
  18. package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
  19. package/.claude/skills/workflow-commands/fullrun.md +1 -1
  20. package/.claude/skills/workflow-commands/issue-comments.md +9 -4
  21. package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
  22. package/.claude/skills/workflow-commands/kickoff.md +2 -2
  23. package/.claude/skills/workflow-commands/observation-filing.md +1 -1
  24. package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
  25. package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
  26. package/.claude/skills/workflow-commands/prerequisite.md +3 -2
  27. package/.claude/skills/workflow-commands/retrospective.md +2 -2
  28. package/.claude/skills/workflow-commands/split-assessment.md +7 -5
  29. package/.codex/hooks.json +5 -5
  30. package/.github/actions/setup-pnpm/action.yml +9 -16
  31. package/.github/dependabot.yml +16 -0
  32. package/.github/workflows/auto-tag.yml +45 -0
  33. package/.github/workflows/ci.yml +155 -15
  34. package/.github/workflows/dependabot-auto-merge.yml +63 -4
  35. package/.github/workflows/production.yml +8 -0
  36. package/.github/workflows/publish.yml +59 -45
  37. package/.vscode/settings.json +19 -0
  38. package/CLAUDE.md +5 -12
  39. package/SECURITY.md +2 -2
  40. package/dist/CLAUDE.md +5 -12
  41. package/dist/commands/document-read-cli.js +2 -1
  42. package/dist/commands/document-section-main.js +2 -1
  43. package/dist/commands/read-set-cli.js +194 -134
  44. package/dist/commands/run-prep-main.js +9694 -10173
  45. package/dist/commands/run-step-cli.js +22138 -18285
  46. package/dist/hooks/audit-provision.js +23 -5
  47. package/dist/hooks/chunk-3GKE653K.js +6204 -0
  48. package/dist/hooks/chunk-45CJJOO7.js +1243 -0
  49. package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
  50. package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
  51. package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
  52. package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
  53. package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
  54. package/dist/hooks/chunk-VVNYJWEI.js +30 -0
  55. package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
  56. package/dist/hooks/codex-hook-adapter.js +8 -8
  57. package/dist/hooks/format-edited.js +4 -5
  58. package/dist/hooks/inputs.json +415 -389
  59. package/dist/hooks/pretool-guard.js +7 -6
  60. package/dist/hooks/session-lang.js +101 -258
  61. package/dist/hooks/stop-guard.js +1744 -2576
  62. package/dist/josh.js +7133 -6368
  63. package/dist/version/index.js +161 -1
  64. package/eslint/rules/comment-why-only.js +108 -0
  65. package/package.json +15 -8
  66. package/prompts/coding-standards.md +1 -1
  67. package/prompts/collaboration-workflow/file-edits.md +14 -11
  68. package/prompts/collaboration-workflow/issue-citation.md +0 -4
  69. package/prompts/collaboration-workflow/issue-template.md +40 -21
  70. package/prompts/collaboration-workflow/lane-instructions.md +3 -1
  71. package/prompts/collaboration-workflow/measurement.md +8 -1
  72. package/prompts/collaboration-workflow/operating-rules.md +11 -2
  73. package/prompts/collaboration-workflow/output-bounds.md +6 -2
  74. package/prompts/collaboration-workflow/plan-comment.md +1 -1
  75. package/prompts/collaboration-workflow/principles.md +9 -0
  76. package/prompts/collaboration-workflow/residency.md +3 -2
  77. package/prompts/collaboration-workflow/rule-delivery.md +13 -1
  78. package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
  79. package/prompts/collaboration-workflow/wip-cap.md +3 -1
  80. package/prompts/review-rubric.md +8 -0
  81. package/prompts/review.md +31 -22
  82. package/prompts/testing-guide.md +1 -0
  83. package/scripts/agent/agent-argv.ts +14 -16
  84. package/scripts/agent/agent-provider.ts +138 -0
  85. package/scripts/agent/agent-role-profile.ts +108 -156
  86. package/scripts/agent/agent-safe-text.ts +20 -5
  87. package/scripts/agent/api-usage-limit.ts +65 -0
  88. package/scripts/agent/claude-agent-argv.ts +19 -9
  89. package/scripts/agent/codex-agent-argv.ts +118 -22
  90. package/scripts/agent/usage-limit-reset.ts +179 -0
  91. package/scripts/auth/claude-token-output.ts +2 -2
  92. package/scripts/auto-ok/auto-ok-author.ts +53 -0
  93. package/scripts/auto-ok/auto-ok-cli.ts +20 -9
  94. package/scripts/backlog/backlog-defect-priority.ts +1 -1
  95. package/scripts/backlog/backlog-drive-cli.ts +6 -1
  96. package/scripts/backlog/backlog-drive-hold.ts +3 -3
  97. package/scripts/backlog/backlog-drive-idle.ts +10 -0
  98. package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
  99. package/scripts/backlog/backlog-drive-launch.ts +8 -2
  100. package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
  101. package/scripts/backlog/backlog-drive-named.ts +28 -7
  102. package/scripts/backlog/backlog-drive-paused.ts +5 -4
  103. package/scripts/backlog/backlog-drive-restore.ts +11 -3
  104. package/scripts/backlog/backlog-drive.ts +21 -60
  105. package/scripts/backlog/backlog-gate-scope.ts +61 -0
  106. package/scripts/backlog/backlog-measure-close.ts +112 -0
  107. package/scripts/backlog/backlog-next.ts +39 -49
  108. package/scripts/backlog/backlog-occupied.ts +2 -2
  109. package/scripts/backlog/backlog-overlap.ts +42 -8
  110. package/scripts/backlog/backlog-plan-cli.ts +4 -1
  111. package/scripts/backlog/backlog-plan-comment.ts +81 -0
  112. package/scripts/backlog/backlog-plan-read.ts +19 -6
  113. package/scripts/backlog/backlog-pool.ts +50 -12
  114. package/scripts/backlog/backlog-rank.ts +60 -13
  115. package/scripts/backlog/backlog-stalled-detect.ts +2 -1
  116. package/scripts/backlog/backlog-waves.ts +17 -2
  117. package/scripts/backlog/backlogrun-launch.ts +7 -4
  118. package/scripts/cost-runtime/context-cut-payback.ts +27 -25
  119. package/scripts/cost-runtime/cost-cli.ts +37 -16
  120. package/scripts/cost-runtime/cost-pricing.ts +9 -0
  121. package/scripts/cost-runtime/cost-verdict.ts +4 -1
  122. package/scripts/delegation/delegation-policy.ts +2 -2
  123. package/scripts/delegation/duplicate-read-guard.ts +1 -0
  124. package/scripts/delegation/investigation-guard.ts +14 -2
  125. package/scripts/delegation/investigation-reads.ts +45 -23
  126. package/scripts/dependabot/dependabot-cooldown.ts +3 -2
  127. package/scripts/discovery/repo-party.ts +80 -20
  128. package/scripts/discovery/session-owner-pin.ts +51 -0
  129. package/scripts/document/capped-print.ts +1 -1
  130. package/scripts/document/command-reference-line-budget.ts +42 -0
  131. package/scripts/document/document-byte-budget.ts +17 -7
  132. package/scripts/document/document-checks.ts +20 -0
  133. package/scripts/document/document-ratchet-check.ts +101 -0
  134. package/scripts/document/document-section.ts +1 -0
  135. package/scripts/document/entry-read-budget.ts +7 -3
  136. package/scripts/document/issue-citation-budget.ts +94 -0
  137. package/scripts/epic/epic-cli-argv.ts +2 -2
  138. package/scripts/epic/epic-fetch.ts +4 -2
  139. package/scripts/epic/epic-graph.ts +7 -2
  140. package/scripts/epic/epic-issue.ts +3 -1
  141. package/scripts/epic/epic-rank.ts +5 -0
  142. package/scripts/exports/unused-members-check.ts +62 -0
  143. package/scripts/exports/unused-members-cli.ts +6 -51
  144. package/scripts/followup/followup-ci-path.ts +67 -0
  145. package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
  146. package/scripts/followup/followup-coderabbit-wait.ts +13 -10
  147. package/scripts/followup/followup-failed-tests.ts +160 -0
  148. package/scripts/followup/followup-job-needs.ts +100 -0
  149. package/scripts/followup/followup-job-rerun.ts +303 -0
  150. package/scripts/followup/followup-main-move.ts +113 -0
  151. package/scripts/followup/git-followup-finish.ts +43 -11
  152. package/scripts/followup/git-followup-pending.ts +3 -3
  153. package/scripts/followup/git-followup-stages.ts +41 -11
  154. package/scripts/followup/git-pr-followup-checks.ts +55 -16
  155. package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
  156. package/scripts/followup/git-pr-followup.ts +62 -27
  157. package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
  158. package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
  159. package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
  160. package/scripts/gate/busy-average.ts +34 -2
  161. package/scripts/gate/check-related-pinned.ts +43 -0
  162. package/scripts/gate/check-related-reuse.ts +64 -0
  163. package/scripts/gate/check-related-section.ts +57 -0
  164. package/scripts/gate/check-related-unplanned.ts +34 -0
  165. package/scripts/gate/check-related.ts +265 -0
  166. package/scripts/gate/command-memory.ts +1 -1
  167. package/scripts/gate/core-admission.ts +24 -6
  168. package/scripts/gate/core-budget-timing.ts +20 -6
  169. package/scripts/gate/core-budget.ts +40 -11
  170. package/scripts/gate/core-wait-record.ts +3 -2
  171. package/scripts/gate/core-wait.ts +25 -2
  172. package/scripts/gate/core-weights.ts +15 -7
  173. package/scripts/gate/gate-labels.ts +46 -0
  174. package/scripts/gate/gate-ledger.ts +14 -6
  175. package/scripts/gate/gate-plan.ts +103 -58
  176. package/scripts/gate/gate-report.ts +9 -7
  177. package/scripts/gate/gate-run-steps.ts +26 -3
  178. package/scripts/gate/gate-skip.ts +45 -6
  179. package/scripts/gate/gate-static-group.ts +60 -0
  180. package/scripts/gate/gate-steps.ts +2 -1
  181. package/scripts/gate/gate-tree.ts +4 -2
  182. package/scripts/gate/hook-gate-reuse.ts +19 -2
  183. package/scripts/gate/metrics-totals.ts +59 -0
  184. package/scripts/gate/scoped-green.ts +68 -15
  185. package/scripts/gate/since-green.ts +14 -6
  186. package/scripts/gate/structural-checks.ts +96 -0
  187. package/scripts/gate/verification-gate.ts +51 -16
  188. package/scripts/gate/verification-inputs.ts +21 -6
  189. package/scripts/gate/verification-tail.ts +52 -0
  190. package/scripts/gh/gh-author-association.ts +23 -2
  191. package/scripts/gh/git-ai-review-scan.ts +1 -1
  192. package/scripts/gh/git-gh-api-path.ts +12 -3
  193. package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
  194. package/scripts/gh/git-gh-exec.ts +32 -2
  195. package/scripts/gh/git-gh-issue-read.ts +4 -2
  196. package/scripts/gh/git-gh-issue-rest.ts +1 -0
  197. package/scripts/gh/git-gh-issue-write.ts +8 -2
  198. package/scripts/gh/git-gh-issue.ts +12 -5
  199. package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
  200. package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
  201. package/scripts/gh/git-gh-pr-read.ts +74 -13
  202. package/scripts/gh/git-gh-pr-rest.ts +3 -1
  203. package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
  204. package/scripts/gh/git-gh-pr-too-large.ts +20 -0
  205. package/scripts/gh/git-gh-pr.ts +21 -7
  206. package/scripts/gh/git-gh-retry.ts +141 -0
  207. package/scripts/gh/git-pr-ai-review.ts +15 -6
  208. package/scripts/gh/git-pr-checks-eval.ts +3 -0
  209. package/scripts/gh/git-pr-checks.ts +5 -5
  210. package/scripts/git/base-tree.ts +30 -0
  211. package/scripts/git/change-base.ts +4 -10
  212. package/scripts/git/changed-paths-sync.ts +63 -0
  213. package/scripts/git/changed-paths.ts +16 -1
  214. package/scripts/git/git-common-directory.ts +11 -1
  215. package/scripts/git/git-diff-reads.ts +66 -20
  216. package/scripts/git/git-error.ts +9 -2
  217. package/scripts/git/git-schemas.ts +13 -0
  218. package/scripts/git/git-worktree.ts +13 -0
  219. package/scripts/git/gone-branch.ts +4 -1
  220. package/scripts/git/main-merge-budget-conflict.ts +89 -0
  221. package/scripts/git/main-merge-guard.ts +55 -18
  222. package/scripts/git/main-merge-regenerate.ts +59 -25
  223. package/scripts/git/main-merge.ts +53 -5
  224. package/scripts/git/no-base-checkout.ts +127 -0
  225. package/scripts/git/stash/git-stash.ts +11 -2
  226. package/scripts/git/stash/stash-push-cli.ts +10 -0
  227. package/scripts/hooks/batch-guard.ts +40 -21
  228. package/scripts/hooks/edited-cspell.ts +37 -11
  229. package/scripts/hooks/format-edited-file.ts +22 -2
  230. package/scripts/hooks/lane-plan-guard.ts +50 -0
  231. package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
  232. package/scripts/hooks/pre-commit-lint.ts +14 -1
  233. package/scripts/hooks/pre-push-related-switch.ts +10 -0
  234. package/scripts/hooks/pre-push-unit.ts +76 -10
  235. package/scripts/hooks/pretool-guard.ts +2 -0
  236. package/scripts/hooks/reserved-run.ts +14 -1
  237. package/scripts/hooks/run-hook.sh +23 -8
  238. package/scripts/hooks/step-zero-notice.ts +6 -1
  239. package/scripts/hooks/stop-actions.ts +3 -15
  240. package/scripts/hooks/stop-guard.ts +7 -6
  241. package/scripts/init/distributed-paths.ts +1 -0
  242. package/scripts/init/hook-command-rewrite.ts +5 -1
  243. package/scripts/init/hook-launch.ts +4 -2
  244. package/scripts/issue/aggregation-split.ts +52 -0
  245. package/scripts/issue/defect-origin-line.ts +19 -1
  246. package/scripts/issue/defect-rate-cli.ts +5 -102
  247. package/scripts/issue/defect-report.ts +4 -4
  248. package/scripts/issue/effect-audit-cli.ts +178 -0
  249. package/scripts/issue/effect-audit.ts +185 -0
  250. package/scripts/issue/expected-effect-lint.ts +64 -9
  251. package/scripts/issue/git-next-issues.ts +5 -0
  252. package/scripts/issue/issue-body-or-comment.ts +38 -4
  253. package/scripts/issue/issue-cite-cli.ts +1 -3
  254. package/scripts/issue/issue-classification.ts +1 -0
  255. package/scripts/issue/issue-closing-pr.ts +8 -1
  256. package/scripts/issue/issue-evidence-exit.ts +4 -2
  257. package/scripts/issue/issue-file-cap.ts +58 -0
  258. package/scripts/issue/issue-file-cli.ts +111 -38
  259. package/scripts/issue/issue-file-deferral.ts +52 -0
  260. package/scripts/issue/issue-file-fold.ts +29 -10
  261. package/scripts/issue/issue-file-interrupt.ts +85 -0
  262. package/scripts/issue/issue-file-lane-hint.ts +30 -0
  263. package/scripts/issue/issue-file.ts +43 -6
  264. package/scripts/issue/issue-labels.ts +19 -2
  265. package/scripts/issue/issue-lint-cli.ts +27 -2
  266. package/scripts/issue/issue-measured-cli.ts +13 -35
  267. package/scripts/issue/issue-measured-close.ts +58 -0
  268. package/scripts/issue/issue-not-before-label.ts +2 -2
  269. package/scripts/issue/issue-not-before.ts +4 -1
  270. package/scripts/issue/issue-priority-cli.ts +60 -0
  271. package/scripts/issue/issue-priority-raise.ts +55 -0
  272. package/scripts/issue/issue-priority.ts +174 -43
  273. package/scripts/issue/issue-rank.ts +21 -4
  274. package/scripts/issue/issue-read-cli.ts +32 -6
  275. package/scripts/issue/issue-read.ts +37 -12
  276. package/scripts/issue/issue-sample-gate.ts +95 -74
  277. package/scripts/issue/issue-sample-prime.ts +127 -0
  278. package/scripts/issue/issue-sample-required.ts +57 -0
  279. package/scripts/issue/issue-sample-source.ts +12 -11
  280. package/scripts/issue/issue-search.ts +124 -0
  281. package/scripts/issue/issue-state.ts +13 -1
  282. package/scripts/issue/issue-template-section.ts +43 -0
  283. package/scripts/issue/issue-watch-diff.ts +31 -1
  284. package/scripts/issue/issue-watch-hook.ts +11 -2
  285. package/scripts/issue/issue-watch.ts +55 -12
  286. package/scripts/issue/markdown-section.ts +1 -0
  287. package/scripts/issue/measure-declaration.ts +121 -0
  288. package/scripts/issue/measure-rerun-cli.ts +7 -70
  289. package/scripts/issue/plan-consumers-section.ts +22 -1
  290. package/scripts/issue/reproduction-measure.ts +3 -1
  291. package/scripts/issue/size-estimate.ts +90 -0
  292. package/scripts/issue/trusted-measure.ts +84 -0
  293. package/scripts/josh/command-usage.ts +3 -2
  294. package/scripts/josh/durable-state-migrate.ts +105 -0
  295. package/scripts/josh/durable-state.ts +112 -0
  296. package/scripts/josh/josh-aliases.ts +95 -0
  297. package/scripts/josh/josh-command-map.ts +1 -82
  298. package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
  299. package/scripts/josh/josh-commands-ai.ts +5 -5
  300. package/scripts/josh/josh-commands-development.ts +59 -58
  301. package/scripts/josh/josh-commands-issue-write.ts +23 -4
  302. package/scripts/josh/josh-commands-issue.ts +32 -0
  303. package/scripts/josh/josh-commands-lane.ts +87 -4
  304. package/scripts/josh/josh-commands-lint.ts +16 -3
  305. package/scripts/josh/josh-commands-maintenance.ts +15 -0
  306. package/scripts/josh/josh-commands-review.ts +41 -6
  307. package/scripts/josh/josh-commands-ship.ts +56 -8
  308. package/scripts/josh/josh-commands-test-check.ts +80 -0
  309. package/scripts/josh/josh-commands-workflow.ts +1 -1
  310. package/scripts/josh/josh-environment-file.ts +43 -3
  311. package/scripts/josh/josh-in-process.ts +2 -2
  312. package/scripts/josh/josh-logic.ts +5 -3
  313. package/scripts/josh/josh-run.ts +19 -1
  314. package/scripts/josh/run-record-path.ts +15 -0
  315. package/scripts/josh/stamp-file.ts +11 -2
  316. package/scripts/lane/lane-adopt-cli.ts +98 -0
  317. package/scripts/lane/lane-adopt.ts +208 -0
  318. package/scripts/lane/lane-await.ts +5 -8
  319. package/scripts/lane/lane-baseline.ts +123 -0
  320. package/scripts/lane/lane-breakdown-cli.ts +64 -0
  321. package/scripts/lane/lane-breakdown-implement.ts +170 -0
  322. package/scripts/lane/lane-breakdown-laps.ts +107 -0
  323. package/scripts/lane/lane-breakdown-pinned.ts +76 -0
  324. package/scripts/lane/lane-breakdown-text.ts +145 -0
  325. package/scripts/lane/lane-breakdown.ts +239 -0
  326. package/scripts/lane/lane-check-stats.ts +29 -8
  327. package/scripts/lane/lane-child-invocation.ts +9 -2
  328. package/scripts/lane/lane-child-mark-keys.ts +12 -0
  329. package/scripts/lane/lane-child-marker.ts +20 -1
  330. package/scripts/lane/lane-ci-path-stats.ts +73 -0
  331. package/scripts/lane/lane-claim-stats.ts +84 -0
  332. package/scripts/lane/lane-close.ts +8 -3
  333. package/scripts/lane/lane-dispatch-log.ts +3 -3
  334. package/scripts/lane/lane-dispatch.ts +2 -2
  335. package/scripts/lane/lane-gap-stats.ts +7 -6
  336. package/scripts/lane/lane-guard-policy.ts +7 -1
  337. package/scripts/lane/lane-implement-stats.ts +207 -0
  338. package/scripts/lane/lane-implement-subagents.ts +90 -0
  339. package/scripts/lane/lane-investigation-switch.ts +16 -0
  340. package/scripts/lane/lane-ledger-kind.ts +31 -0
  341. package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
  342. package/scripts/lane/lane-ledger-schema.ts +119 -36
  343. package/scripts/lane/lane-ledger-write.ts +257 -0
  344. package/scripts/lane/lane-ledger.ts +31 -177
  345. package/scripts/lane/lane-load.ts +1 -1
  346. package/scripts/lane/lane-measure-cli.ts +176 -59
  347. package/scripts/lane/lane-net-read.ts +44 -0
  348. package/scripts/lane/lane-net-time.ts +212 -0
  349. package/scripts/lane/lane-open.ts +16 -7
  350. package/scripts/lane/lane-output.ts +2 -4
  351. package/scripts/lane/lane-overrun-prompt.ts +147 -0
  352. package/scripts/lane/lane-overrun.ts +274 -0
  353. package/scripts/lane/lane-paths.ts +24 -1
  354. package/scripts/lane/lane-pause-cli.ts +4 -1
  355. package/scripts/lane/lane-paused-spans.ts +97 -0
  356. package/scripts/lane/lane-plan-check.ts +207 -0
  357. package/scripts/lane/lane-plan-cli.ts +41 -0
  358. package/scripts/lane/lane-plan.ts +144 -0
  359. package/scripts/lane/lane-registry.ts +14 -1
  360. package/scripts/lane/lane-relaunch.ts +1 -1
  361. package/scripts/lane/lane-round-one-stats.ts +51 -0
  362. package/scripts/lane/lane-sampler.ts +23 -4
  363. package/scripts/lane/lane-session-action.ts +93 -18
  364. package/scripts/lane/lane-session-broker.ts +49 -21
  365. package/scripts/lane/lane-session-reread-main.ts +14 -0
  366. package/scripts/lane/lane-session-reread.ts +51 -0
  367. package/scripts/lane/lane-ship-lap-stats.ts +74 -0
  368. package/scripts/lane/lane-sleep.ts +58 -0
  369. package/scripts/lane/lane-spent.ts +1 -1
  370. package/scripts/lane/lane-split-stats.ts +28 -0
  371. package/scripts/lane/lane-stage-stats.ts +13 -1
  372. package/scripts/lane/lane-state.ts +41 -9
  373. package/scripts/lane/lane-stats-tables.ts +58 -0
  374. package/scripts/lane/lane-stats.ts +21 -5
  375. package/scripts/lane/lane-stop-stats.ts +51 -19
  376. package/scripts/lane/lane-tail-stats.ts +32 -0
  377. package/scripts/lane/lane-transcript-calls.ts +67 -10
  378. package/scripts/lane/lane-transcript-stats.ts +44 -12
  379. package/scripts/lane/lane-value-cell.ts +72 -0
  380. package/scripts/lane/lane-value.ts +118 -0
  381. package/scripts/lane/lane-withdraw-closed.ts +124 -0
  382. package/scripts/lane/lane-withdraw.ts +108 -31
  383. package/scripts/lane/lane-yield.ts +85 -0
  384. package/scripts/lane/openai-lane-ship.ts +12 -11
  385. package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
  386. package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
  387. package/scripts/lane/openai-lane-supervisor.ts +5 -4
  388. package/scripts/lib/poll.ts +38 -9
  389. package/scripts/lib/settled-together.ts +10 -0
  390. package/scripts/lib/shell-quote.ts +21 -0
  391. package/scripts/lib/token-shape.ts +111 -0
  392. package/scripts/lint/eslint-daemon-sources.ts +79 -0
  393. package/scripts/lint/eslint-daemon.ts +45 -6
  394. package/scripts/lint/eslint-warm-cli.ts +7 -0
  395. package/scripts/lint/eslint-warm.ts +66 -0
  396. package/scripts/lint/import-graph.ts +141 -11
  397. package/scripts/lint/lint-gate-scope.ts +2 -2
  398. package/scripts/lint/lint-parallel.ts +54 -6
  399. package/scripts/lint/lint-related.ts +154 -33
  400. package/scripts/lint/rename-cli.ts +179 -0
  401. package/scripts/lint/rename-identifier.ts +192 -0
  402. package/scripts/lint/type-only-imports.ts +58 -0
  403. package/scripts/notify/telegram-notify.ts +12 -3
  404. package/scripts/observations/observation-record.ts +42 -16
  405. package/scripts/observations/observations-flush.ts +32 -9
  406. package/scripts/overrides/overrides-check.ts +9 -1
  407. package/scripts/release/release-approval-prune.ts +7 -1
  408. package/scripts/repo/required-checks-logic.ts +4 -1
  409. package/scripts/repo/ruleset-check.ts +4 -3
  410. package/scripts/report/markdown-shape.ts +28 -0
  411. package/scripts/report/report-format-reference.ts +15 -1
  412. package/scripts/report/report-labels.ts +12 -1
  413. package/scripts/report/report-lint-child-summary.ts +94 -0
  414. package/scripts/report/report-lint-cli.ts +26 -7
  415. package/scripts/report/report-lint.ts +2 -20
  416. package/scripts/review/prose-stale-cli.ts +88 -0
  417. package/scripts/review/prose-stale-scan.ts +152 -0
  418. package/scripts/review/review-attest.ts +73 -23
  419. package/scripts/review/review-brief-cli.ts +68 -19
  420. package/scripts/review/review-brief-paths.ts +22 -0
  421. package/scripts/review/review-brief.ts +14 -7
  422. package/scripts/review/review-comment-carry.ts +47 -0
  423. package/scripts/review/review-comment-round.ts +85 -22
  424. package/scripts/review/review-finding-ledger.ts +109 -7
  425. package/scripts/review/review-finding-text.ts +43 -0
  426. package/scripts/review/review-interaction.ts +11 -0
  427. package/scripts/review/review-lane-handover.ts +68 -0
  428. package/scripts/review/review-lint-cli.ts +57 -0
  429. package/scripts/review/review-lint-findings.ts +92 -0
  430. package/scripts/review/review-lint-sections.ts +80 -0
  431. package/scripts/review/review-lint.ts +221 -0
  432. package/scripts/review/review-prior-findings.ts +102 -0
  433. package/scripts/review/review-readers-scan.ts +4 -2
  434. package/scripts/review/review-record-cli.ts +177 -54
  435. package/scripts/review/review-record-code-round.ts +55 -0
  436. package/scripts/review/review-record-comment.ts +60 -0
  437. package/scripts/review/review-record-interaction.ts +35 -0
  438. package/scripts/review/review-record-pinned.ts +108 -0
  439. package/scripts/review/review-record.ts +25 -1
  440. package/scripts/review/review-reviewed-tree.ts +307 -0
  441. package/scripts/review/review-round-one-closure.ts +62 -0
  442. package/scripts/review/review-round-reuse.ts +106 -0
  443. package/scripts/review/review-round2-cli.ts +91 -29
  444. package/scripts/review/review-round2-skip-comment.ts +55 -0
  445. package/scripts/review/review-round2.ts +24 -8
  446. package/scripts/review/review-stamps.ts +7 -3
  447. package/scripts/review/review-stop-log.ts +20 -6
  448. package/scripts/review/review-stops-cli.ts +2 -1
  449. package/scripts/review/review-submit-cli.ts +101 -0
  450. package/scripts/rules/agent-model.ts +1 -1
  451. package/scripts/rules/bash-triggers.ts +3 -3
  452. package/scripts/rules/concise-reply.ts +88 -0
  453. package/scripts/rules/credential-body.ts +77 -0
  454. package/scripts/rules/decision-oracle.ts +1 -1
  455. package/scripts/rules/delivered-rules.ts +36 -17
  456. package/scripts/rules/destructive-command.ts +3 -11
  457. package/scripts/rules/direct-issue-comment.ts +34 -12
  458. package/scripts/rules/direct-issue-read.ts +191 -0
  459. package/scripts/rules/direct-pr-create.ts +4 -24
  460. package/scripts/rules/early-heartbeat.ts +2 -0
  461. package/scripts/rules/edit-tool.ts +27 -0
  462. package/scripts/rules/file-edit-rows.ts +17 -0
  463. package/scripts/rules/file-rewrite.ts +146 -0
  464. package/scripts/rules/firing-point.ts +3 -2
  465. package/scripts/rules/gh-api.ts +128 -7
  466. package/scripts/rules/gh-repo-selector.ts +84 -0
  467. package/scripts/rules/git-force.ts +2 -2
  468. package/scripts/rules/guard-remedy.ts +14 -5
  469. package/scripts/rules/implementation-cut.ts +61 -28
  470. package/scripts/rules/investigator-foreground.ts +231 -0
  471. package/scripts/rules/issue-citation.ts +15 -60
  472. package/scripts/rules/issue-comments.ts +9 -4
  473. package/scripts/rules/josh-git-bare.ts +1 -1
  474. package/scripts/rules/lane-background.ts +41 -13
  475. package/scripts/rules/lane-direct-tool.ts +107 -9
  476. package/scripts/rules/lane-interactive-ask.ts +4 -1
  477. package/scripts/rules/lane-park.ts +4 -2
  478. package/scripts/rules/lane-spilled-read.ts +90 -0
  479. package/scripts/rules/lane-split-park.ts +1 -1
  480. package/scripts/rules/lane-switch-main.ts +4 -4
  481. package/scripts/rules/last-prompt.ts +20 -47
  482. package/scripts/rules/oracle-consulted.ts +1 -1
  483. package/scripts/rules/permission-guards.ts +5 -1
  484. package/scripts/rules/piped-verification-shapes.ts +110 -0
  485. package/scripts/rules/piped-verification.ts +67 -17
  486. package/scripts/rules/poll-loop.ts +72 -9
  487. package/scripts/rules/pr-merge.ts +5 -5
  488. package/scripts/rules/pre-gate-cut.ts +3 -3
  489. package/scripts/rules/protected-files.ts +88 -24
  490. package/scripts/rules/reply-language.ts +3 -17
  491. package/scripts/rules/reply-prose.ts +34 -0
  492. package/scripts/rules/repo-admin.ts +132 -0
  493. package/scripts/rules/reviewer-foreground.ts +88 -0
  494. package/scripts/rules/round-one-check-related.ts +120 -0
  495. package/scripts/rules/rule-body-guard.ts +5 -15
  496. package/scripts/rules/rule-value-cache.ts +53 -5
  497. package/scripts/rules/rule-value-candidates.ts +84 -0
  498. package/scripts/rules/rule-value-cli.ts +59 -11
  499. package/scripts/rules/rule-value.ts +17 -4
  500. package/scripts/rules/run-tail-rule.ts +1 -1
  501. package/scripts/rules/sed-in-place.ts +196 -0
  502. package/scripts/rules/shell-segments.ts +10 -2
  503. package/scripts/rules/stop-rule-rows.ts +1 -13
  504. package/scripts/rules/stop-rules.ts +33 -58
  505. package/scripts/rules/test-declared-commit.ts +1 -1
  506. package/scripts/rules/third-party-write.ts +110 -23
  507. package/scripts/rules/timed-rerun.ts +1 -1
  508. package/scripts/rules/turn-filings.ts +90 -0
  509. package/scripts/rules/worktree-guard.ts +22 -7
  510. package/scripts/run/board/run-board-ending-reason.ts +6 -2
  511. package/scripts/run/board/run-board-fit.ts +24 -1
  512. package/scripts/run/board/run-board-found.ts +134 -0
  513. package/scripts/run/board/run-board-header.ts +8 -0
  514. package/scripts/run/board/run-board-labels.ts +11 -1
  515. package/scripts/run/board/run-board-lane-time.ts +1 -0
  516. package/scripts/run/board/run-board-link.ts +15 -2
  517. package/scripts/run/board/run-board-notes.ts +7 -1
  518. package/scripts/run/board/run-board-operation.ts +4 -2
  519. package/scripts/run/board/run-board-phase.ts +2 -5
  520. package/scripts/run/board/run-board-plan.ts +1 -1
  521. package/scripts/run/board/run-board-read.ts +46 -1
  522. package/scripts/run/board/run-board-reason.ts +20 -8
  523. package/scripts/run/board/run-board-render-checks.ts +3 -2
  524. package/scripts/run/board/run-board-render-drawn.ts +11 -0
  525. package/scripts/run/board/run-board-render-found.ts +157 -0
  526. package/scripts/run/board/run-board-render-lead.ts +9 -0
  527. package/scripts/run/board/run-board-render-legend.ts +19 -0
  528. package/scripts/run/board/run-board-render-tail.ts +1 -1
  529. package/scripts/run/board/run-board-render.ts +82 -18
  530. package/scripts/run/board/run-board-spin.ts +1 -3
  531. package/scripts/run/board/run-board-status.ts +2 -0
  532. package/scripts/run/board/run-board-tick.ts +39 -10
  533. package/scripts/run/carry/run-carry-ended.ts +3 -2
  534. package/scripts/run/carry/run-carry.ts +3 -2
  535. package/scripts/run/cut/run-cut-cli.ts +33 -133
  536. package/scripts/run/cut/run-cut-digest.ts +152 -0
  537. package/scripts/run/cut/run-cut-handoff.ts +52 -8
  538. package/scripts/run/cut/run-cut-report.ts +24 -3
  539. package/scripts/run/cut/run-cut-resume.ts +129 -0
  540. package/scripts/run/cut/run-cut-review.ts +105 -0
  541. package/scripts/run/cut/run-cut.ts +18 -7
  542. package/scripts/run/detached-launch.ts +1 -1
  543. package/scripts/run/entry/run-entry-cli.ts +88 -19
  544. package/scripts/run/entry/run-entry-spill.ts +83 -0
  545. package/scripts/run/entry/run-entry-stop.ts +5 -1
  546. package/scripts/run/entry/run-entry-trust.ts +91 -0
  547. package/scripts/run/event/run-event-baseline.ts +56 -0
  548. package/scripts/run/event/run-event-filed.ts +9 -3
  549. package/scripts/run/event/run-event-overrun.ts +197 -0
  550. package/scripts/run/event/run-event-render.ts +4 -0
  551. package/scripts/run/event/run-event-stream.ts +25 -3
  552. package/scripts/run/hold/run-stop-notify.ts +3 -8
  553. package/scripts/run/merge/run-merge-cap.ts +57 -0
  554. package/scripts/run/merge/run-merge-cli.ts +66 -23
  555. package/scripts/run/merge/run-merge-outcome.ts +2 -0
  556. package/scripts/run/merge/run-merge-ship.ts +13 -3
  557. package/scripts/run/merge/run-merge-signals.ts +40 -23
  558. package/scripts/run/merge/run-merge-steps.ts +56 -36
  559. package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
  560. package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
  561. package/scripts/run/merge/run-merge.ts +41 -14
  562. package/scripts/run/review/run-review-cli.ts +306 -20
  563. package/scripts/run/review/run-review-early-push.ts +121 -0
  564. package/scripts/run/review/run-review-join-read.ts +94 -0
  565. package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
  566. package/scripts/run/review/run-review-pinned-join.ts +216 -0
  567. package/scripts/run/review/run-review-pinned-steps.ts +383 -0
  568. package/scripts/run/review/run-review-pinned-tree.ts +37 -0
  569. package/scripts/run/review/run-review-pinned.ts +53 -0
  570. package/scripts/run/review/run-review-steps.ts +70 -34
  571. package/scripts/run/review/run-review.ts +26 -6
  572. package/scripts/run/run-parent-cut-hook.ts +3 -4
  573. package/scripts/run/run-prep.ts +1 -0
  574. package/scripts/run/run-stage-read.ts +2 -6
  575. package/scripts/run/run-step-cli.ts +17 -5
  576. package/scripts/run/run-step-lane-plan.ts +27 -0
  577. package/scripts/run/run-step-section.ts +26 -7
  578. package/scripts/run/run-step.ts +5 -2
  579. package/scripts/run/ship/run-ship-args.ts +19 -0
  580. package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
  581. package/scripts/run/ship/run-ship-cli.ts +131 -39
  582. package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
  583. package/scripts/run/ship/run-ship-detach.ts +10 -4
  584. package/scripts/run/ship/run-ship-handover.ts +106 -0
  585. package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
  586. package/scripts/run/ship/run-ship-lap.ts +63 -0
  587. package/scripts/run/ship/run-ship-next.ts +27 -26
  588. package/scripts/run/ship/run-ship-overlap.ts +8 -3
  589. package/scripts/run/ship/run-ship-place.ts +9 -2
  590. package/scripts/run/ship/run-ship-planned.ts +92 -0
  591. package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
  592. package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
  593. package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
  594. package/scripts/run/ship/run-ship-preflight.ts +16 -4
  595. package/scripts/run/ship/run-ship-probe.ts +23 -9
  596. package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
  597. package/scripts/run/ship/run-ship-relaunch.ts +51 -0
  598. package/scripts/run/ship/run-ship-return.ts +103 -29
  599. package/scripts/run/ship/run-ship-review-reason.ts +24 -0
  600. package/scripts/run/ship/run-ship-review-steps.ts +230 -59
  601. package/scripts/run/ship/run-ship-review.ts +171 -51
  602. package/scripts/run/ship/run-ship-reviewer.ts +138 -42
  603. package/scripts/run/ship/run-ship-scoped.ts +39 -10
  604. package/scripts/run/ship/run-ship-stage.ts +49 -13
  605. package/scripts/run/ship/run-ship-steps.ts +24 -4
  606. package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
  607. package/scripts/run/ship/run-ship-stop-context.ts +50 -13
  608. package/scripts/run/ship/run-ship-sync.ts +171 -30
  609. package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
  610. package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
  611. package/scripts/run/ship/run-ship-waiter.ts +114 -0
  612. package/scripts/run/ship/run-ship.ts +16 -2
  613. package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
  614. package/scripts/run/wake/run-wake-cli.ts +6 -113
  615. package/scripts/run/wake/run-wake-code.ts +53 -11
  616. package/scripts/run/wake/run-wake-driver.ts +5 -3
  617. package/scripts/run/wake/run-wake-finish.ts +137 -0
  618. package/scripts/run/wake/run-wake-loop.ts +5 -3
  619. package/scripts/run/wake/run-wake-ports.ts +11 -3
  620. package/scripts/run/wake/run-wake-session.ts +2 -0
  621. package/scripts/run/wake/run-wake.ts +3 -2
  622. package/scripts/safe-chain/ci-installer-pin.ts +49 -8
  623. package/scripts/safe-chain/project-config.ts +3 -2
  624. package/scripts/security/secretlint-scan.ts +42 -9
  625. package/scripts/security/security-audit-provision-main.ts +9 -1
  626. package/scripts/security/security-audit-provision.ts +1 -1
  627. package/scripts/security/security-audit.ts +21 -1
  628. package/scripts/security/sonar-file.ts +10 -5
  629. package/scripts/split/split-assess.ts +12 -3
  630. package/scripts/split/split-early-notice.ts +116 -0
  631. package/scripts/split/split-measure.ts +20 -2
  632. package/scripts/split/split-resolution.ts +107 -0
  633. package/scripts/test/direct-importers.ts +185 -0
  634. package/scripts/test/pure-files-entries.ts +83 -0
  635. package/scripts/test/related-heavy-tests.ts +81 -0
  636. package/scripts/test/test-no-base.ts +88 -0
  637. package/scripts/test/test-pinned-cache-logic.ts +363 -0
  638. package/scripts/test/test-pinned-cache.ts +337 -0
  639. package/scripts/test/test-pinned-emit.ts +49 -0
  640. package/scripts/test/test-pinned-functions.ts +116 -0
  641. package/scripts/test/test-pinned-ledger.ts +80 -0
  642. package/scripts/test/test-pinned-logic.ts +208 -20
  643. package/scripts/test/test-pinned-main.ts +84 -18
  644. package/scripts/test/test-pinned-pool.ts +73 -0
  645. package/scripts/test/test-pinned-probe.ts +254 -0
  646. package/scripts/test/test-pinned-prune-logic.ts +118 -0
  647. package/scripts/test/test-pinned-reach.ts +194 -0
  648. package/scripts/test/test-pinned-record.ts +196 -0
  649. package/scripts/test/test-pinned-rewire.ts +148 -0
  650. package/scripts/test/test-pinned-spawn.ts +81 -0
  651. package/scripts/test/test-pinned-stage.ts +70 -0
  652. package/scripts/test/test-pinned.ts +258 -47
  653. package/scripts/test/test-reach-cli.ts +61 -0
  654. package/scripts/test/test-read-map.ts +35 -11
  655. package/scripts/test/test-read-recording.ts +17 -5
  656. package/scripts/test/test-read-trace.ts +26 -8
  657. package/scripts/test/test-red-logic.ts +46 -7
  658. package/scripts/test/test-red.ts +34 -14
  659. package/scripts/test/test-related-claim.ts +37 -0
  660. package/scripts/test/test-related-main.ts +4 -1
  661. package/scripts/test/test-related-moved.ts +91 -0
  662. package/scripts/test/test-related-record.ts +43 -23
  663. package/scripts/test/test-related-scope.ts +99 -34
  664. package/scripts/test/test-related-synced.ts +135 -0
  665. package/scripts/test/test-related-touched.ts +84 -0
  666. package/scripts/test/test-related.ts +167 -83
  667. package/scripts/test/test-unit-guard.ts +28 -5
  668. package/scripts/test/unit-durations.ts +41 -0
  669. package/scripts/test/unit-worker-share.ts +5 -4
  670. package/scripts/test/vitest-cache-directory.ts +19 -0
  671. package/scripts/test/vitest-cli-excludes.ts +14 -0
  672. package/scripts/test/vitest-failure-summary.ts +111 -0
  673. package/scripts/test/whole-suite-files.ts +12 -1
  674. package/scripts/time-runtime/time-batch-guard.ts +42 -4
  675. package/scripts/time-runtime/time-bundle-call.ts +1 -1
  676. package/scripts/time-runtime/time-bundles.ts +36 -5
  677. package/scripts/time-runtime/time-markers.ts +2 -2
  678. package/scripts/time-runtime/time-search-call.ts +38 -0
  679. package/scripts/time-runtime/time-shell.ts +1 -1
  680. package/scripts/time-runtime/time-transcript-line.ts +17 -5
  681. package/scripts/version/development-engines-verdict.ts +124 -0
  682. package/scripts/version/latest-corepack.ts +2 -0
  683. package/templates/gitignore +2 -0
  684. package/templates/workflows/ci.yml +41 -0
  685. package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
  686. package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
  687. package/dist/hooks/chunk-TUIFS5E7.js +0 -72
  688. package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
  689. package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
  690. package/scripts/rules/filing-cap.ts +0 -139
@@ -11,9 +11,18 @@
11
11
  - 修正できたら修正内容を、できなかったら失敗チェック名・原因・未解決である旨を `--notify-message` に書く。**完了コメントに失敗を隠してはならない**
12
12
  - ユーザーへの報告でも失敗を「成功」として扱わない
13
13
 
14
+ ### git-rules — コミット・共有状態・index・PR
15
+
16
+ `CLAUDE.md` → "Git Rules" の本文。フックが拒否・書き換えする(`pnpm josh rule:list` の `josh-git-bare`・`direct-pr-create`・`pr-merge` 行と `.claude/settings.json` の deny)。
17
+
18
+ - **コミットは指示されたときだけ。** マージ・ブランチ削除・force push などの共有状態の変更は、そのターンで指示されたときだけ。例外は `fullrun` / `backlogrun` の起動で、`pnpm josh followup` 経由のマージを認める(`prrun` は認めない)。deny は規則より狭い — ツールが通したことを許可と読まない
19
+ - **git index は自分の判断で変えない** — 明示の指示か `pnpm josh git` 経由だけ(下記 "no-self-staging")
20
+ - **コミットは `pnpm josh git`、PR は `pnpm josh pr`** — `gh pr create` の直接実行は `direct-pr-create` 行が拒否する。GitHub 操作は `gh api`(REST) — [`gh-rest.md`](./gh-rest.md)
21
+ - **作業ツリーの前提で動く前に `git status`(と `git stash list`)をその場で実行する**
22
+
14
23
  ### 指示されていない行動は取らない
15
24
 
16
- `CLAUDE.md` → "Git Rules" の細則。対象には共有ブランチへの push・外部通知の追加送信・リポジトリ設定の変更も含む。
25
+ 上記 "git-rules" の細則。対象には共有ブランチへの push・外部通知の追加送信・リポジトリ設定の変更も含む。
17
26
 
18
27
  - auto-merge の本文は [`followup.md`](../../.claude/skills/workflow-commands/followup.md)、`backlogrun` の子への継承は [`backlogrun-child.md`](../../.claude/skills/workflow-commands/backlogrun-child.md)
19
28
  - `kickoff` / `pnpm josh followup` 単独実行は文書化されたスコープで終了する。PR が OPEN のまま完了したら状態を報告して停止する
@@ -23,7 +32,7 @@
23
32
 
24
33
  ### no-self-staging — git index を勝手に変更しない(自律 staging の禁止)
25
34
 
26
- `CLAUDE.md` → "Git Rules" の細則。index には履歴がなく、上書きされたステージ状態は復元できない。
35
+ 上記 "git-rules" の細則。index には履歴がなく、上書きされたステージ状態は復元できない。
27
36
 
28
37
  - **調査目的の staging はしない。** 読み取り専用コマンドを使う: `git status --short`、`git diff` / `git diff --stat` / `git diff HEAD`、`git diff --staged`、未追跡ファイルは `git diff --no-index /dev/null <new-file>` か直接読む
29
38
  - staging してよいのは次の 2 ケースだけ。それ以外は実行せずに確認する:
@@ -17,19 +17,23 @@
17
17
  - ファイルは範囲を指定する(`sed -n '120,180p' <file>`、または `Read` の `offset` / `limit`)
18
18
  - 一覧は件数を絞る(`--limit`、`| head -30`)、JSON は必要な項目だけ取り出す(`gh api … --jq '…'`)
19
19
  - 全量が要るときは、ファイルへ落として(`> <file>`)から範囲を読む
20
+ - 退避された `tool-results/<id>.txt` → `grep -n` / `sed -n` で読む(`lane-spilled-read` 行、`pnpm josh rule:list`)
20
21
 
21
22
  ## 切り詰められた出力を、完全な出力として読まない
22
23
 
23
24
  **検証ゲートと差分は、切り詰められた結果で判断しない。**
24
25
 
25
- - `pnpm josh gate` は合否の 1 行を末尾に出す。失敗の内訳が切れたら、合否行の直前の `full output: <path>` のファイルを読む(joshuafolkken/kit#1227)
26
+ - 検証コマンド(`gate` / `check:related` / `lint:related` / `test:related`)の末尾を読む → 失敗と次のコマンド、`full output: <path>`(`lint:related` には無い)、最終行の合否の順(`scripts/gate/verification-tail.ts`)。内訳が切れたら `full output:` のファイルを読む(joshuafolkken/kit#1227)
27
+ - `pnpm josh test:related` / `test:unit` が失敗した → 最後の `failed tests:` 一覧と `full output: <path>` を読む。読むための再実行はしない。直したら、まず要約の `rerun failed:` 行で失敗したファイルだけを回し、関連集合の全体は最後の `check:related` で 1 回だけ回す(`scripts/test/vitest-failure-summary.ts`)
26
28
  - 差分には判定行が無い。差分はファイルへ落としてから範囲で読む(`git diff main...HEAD > /tmp/diff.patch && wc -l /tmp/diff.patch`)
27
29
 
28
30
  ## 検証コマンドをパイプに繋がない(joshuafolkken/kit#1556)
29
31
 
30
32
  **パイプラインの終了コードは最後のコマンドのものである。** `pnpm josh gate 2>&1 | tail -40` は赤いゲートを成功として返す。**これは `josh gate` の欠陥ではない。** **既定はパイプなしで実行する。** 避けられないなら `set -o pipefail` を前置する。どの形でも、印字された判定行を読む。`piped-verification` 行(`rule-delivery.md`)が強制する。
31
33
 
32
- 対象は結果が合否を意味するコマンドだけ — `gate` / `check` / `lint*` / `cspell*` / `test*` / `eval`。**`git log | head` や `gh issue list | head` は対象外であり、意図的にそうしている。** `latest:scope` / `review:brief` も、判定ではなく答えを印字するので `$(...)` で受けてよい。
34
+ 境界は判定が残るかどうか: 入力を最後まで読むフィルタ(`tail` / `grep` / `cut` / `sort` / `uniq` / `wc` / `tee`、`exit` も外部コマンドも `<`・`>`・`&`(比較を含む)も使わない `awk`、`p`・`d`・`s///` だけの `sed`)だけのパイプは `;` 鎖の中でも `pipefail` 付きに書き換えて通り、`head`・先頭一致で止まる `grep`・`2>/dev/null` などのリダイレクトを伴う形は拒否される(`scripts/rules/piped-verification.ts`)。
35
+
36
+ 対象は結果が合否を意味するコマンドだけ — `gate` / `check*` / `lint*` / `cspell*` / `test*` / `eval`。**`git log | head` や `gh issue list | head` は対象外であり、意図的にそうしている。** `latest:scope` / `review:brief` も、判定ではなく答えを印字するので `$(...)` で受けてよい。
33
37
 
34
38
  ## 検査
35
39
 
@@ -1,7 +1,7 @@
1
1
  ## Step 3: 計画コメントを記録して通知する
2
2
 
3
3
  1. 提案を人間が判断する
4
- 2. 採用した計画をファイルに書き、`pnpm josh issue:plan <N> --body-file <path>` で Issue に記録する。body が空なら本文に、空でなければコメントになる(本文はパスで渡す — `shell-body.md`)
4
+ 2. 採用した計画をファイルに書き、`pnpm josh issue:plan <N> --body-file <path>` で Issue に記録する。書き込み権限のある作成者の body が空なら本文に、それ以外はコメントになる(本文はパスで渡す — `shell-body.md`)
5
5
  - 計画が stash の復元を含むときの書き方: `operating-rules.md` → "no-self-staging"
6
6
  - 計画には `### 影響を受ける既存の利用者` が必須(`pnpm josh plan:consumers <識別子...>` が下書きを出す。書き方: `kickoff.md` の手順 4)
7
7
  3. Telegram で計画開始を通知する:
@@ -61,6 +61,15 @@ docs・prompts・skills・拒否文・Issue・PR の文章に適用する。
61
61
  - 同じ内容を言い換えて繰り返さない
62
62
  - ファイルや節が自分自身を説明する文(「このファイルは〜である」)を書かない
63
63
 
64
+ ## concise-reply — 対話の回答は結論・要点・次の一手
65
+
66
+ ユーザーへの回答に適用する。
67
+
68
+ - 順序: 結論(1〜2 文)→ 表か箇条書き 1 つ → 次の一手
69
+ - 散文(コードブロック・表・箇条書きの外)の上限は `scripts/rules/concise-reply.ts` の `PROSE_LIMIT`。超えた回答は Stop フックの `pnpm josh stop:guard` が書き直させる
70
+ - 仕組みの説明や同じ内容の言い換えを並べない。詳細はファイルや Issue に書く
71
+ - 対象外: 直前の発話に「詳しく」「具体的に」「詳細」がある回答、`pnpm josh run:board --chat` のような固定出力をコードブロックで返す回答、ファイルや Issue に書く成果物
72
+
64
73
  ## consult-vs-execute — 相談と実行を区別する
65
74
 
66
75
  ユーザーが進め方・理由を尋ねたり目標を述べたりした(「どうすべき?」「how should we…」「なぜ」「〜したい」「〜の方が良い?」)ときは、**分析と推奨のみ**を返し、ファイル編集・Issue 作成などのアクションは取らない。目標の表明は計画の依頼であって、実行の承認ではない。
@@ -35,7 +35,8 @@
35
35
  ### 残すときの書き方と予算
36
36
 
37
37
  - **常駐規則は、トリガと導線の 2 つで書く。** **判定は、導線を一度も開かないターンでも常駐の記述だけで正しく振る舞えるかである。**
38
- - **削ることは移すことであり、削除は理由を示して初めて許される例外である。** 先に導線の先へ移し、マーカーテストも付け替える。移さず引退させてよいのは 3 条件がすべて揃うときだけ — 同じ文書に単一ソースが宣言された文の写しである・単一ソースと突き合わせてほかにない文を含まない・マーカーテストが固定していない。揃わなければ候補と証拠を記録して規則は残す
39
- - 経緯(Issue 番号・なぜ・計測・却下案)は `docs/maintainers/<topic>-rationale.md` に置き、その冒頭で説明する手順文書を名指しする。**参照の向きは根拠 → 手順だけ** — AI が読む文書から根拠文書は指さない(`scripts/document/rationale-documents.test.ts` が検出する)。Issue 番号引用の件数は `tools/document/issue-citation-budget.ts` のラチェットに従う — 減らしたら記録も下げる
38
+ - **削ることは移すことであり、削除は理由を示して初めて許される例外である。** 先に導線の先へ移し、マーカーテストも付け替える。写しを移さず引退させてよいのは 3 条件がすべて揃うときだけ — 同じ文書に単一ソースが宣言された文の写しである・単一ソースと突き合わせてほかにない文を含まない・マーカーテストが固定していない。揃わなければ候補と証拠を記録して規則は残す
39
+ - 写しのほかに、`pnpm josh rule:value --fresh` の `candidates:` 節も引退(`retire`)・導線 1 行への縮約(`condense`)の根拠になる。判定は `scripts/rules/rule-value-candidates.ts`。候補ごとに Issue を分け、残すなら理由を記録する
40
+ - 経緯(Issue 番号・なぜ・計測・却下案)は `docs/maintainers/<topic>-rationale.md` に置き、その冒頭で説明する手順文書を名指しする。**参照の向きは根拠 → 手順だけ** — AI が読む文書から根拠文書は指さない(`scripts/document/rationale-documents.test.ts` が検出する)。Issue 番号引用の件数は `scripts/document/issue-citation-budget.ts` のラチェットに従う — 減らしたら記録も下げる
40
41
  - 引用は本文があるファイルを直接指す
41
42
  - 予算が詰まったら回収で解く。**引き上げは Tier C として扱う** — `RESIDENT_CEILING_BYTES`・`RESIDENT_HEADROOM_BYTES`・`RE_INLINE_GUARD_HEADROOM_BYTES` の緩和は、3 条件(回収の余地が尽きたことを計測で示す・需要が 1 規則ではなく常駐すべき規則数の増加から来る・増やす量は需要と回収可能量の差だけで丸めない)を示し、ユーザーの明示指示を得てから行う。条件が揃うこと自体は指示ではない
@@ -14,10 +14,22 @@
14
14
 
15
15
  一覧は `pnpm josh rule:list` が `scripts/rules/delivered-rules.ts` から生成する(joshuafolkken/kit#3399)。各項目は規則の単一ソース・発火点・発火しないときを持ち、フックが走らないエージェントはその出力を自己適用のチェックリストにする(`principles.md`)。
16
16
 
17
- **引き金はシェルのコマンド文字列しか見えない**(node 内の REST や `gh api --input <file>` は掛からない)ので、常駐側にトリガ 1 行を残す。
17
+ **引き金はシェルのコマンド文字列しか見えない**(node 内の REST は掛からず、`gh api --input <file>` のファイルの中身を読むのは `credential-body` だけ)ので、常駐側にトリガ 1 行を残す。
18
18
 
19
19
  引き金が発火しないターンでは何も起きないのが仕様で、各項目の発火しない状態は「規則が守られている状態」と一致させる。一致が取れない規則は常駐に残す。
20
20
 
21
+ ## stop-notify — 途中停止の通知(`confirmation`)
22
+
23
+ `CLAUDE.md` → "Mid-workflow stop notification" の本文(`pnpm josh rule:list` の `stop-notify` 行)。保持中のランが判断待ちで止まるとき、Stop フックの `pnpm josh stop:guard` が `confirmation` を送る — 理由を先頭に、末尾は `Recommended: <choice>`。フックが停止を拒否したときだけ自分で送る:
24
+
25
+ ```bash
26
+ pnpm josh notify --task-type confirmation --issue-url "<url>" --body=$'<reason>' --recommended "<choice>" --alternative "<other>"
27
+ ```
28
+
29
+ ## concise-reply — 回答の長さ
30
+
31
+ `principles.md` → "concise-reply"(`pnpm josh rule:list` の `concise-reply` 行)。散文が上限を超えた回答の Stop で、`pnpm josh stop:guard` が節の本文付きで 1 度だけ書き直させる。
32
+
21
33
  ## 配送は 1 ラン 1 回
22
34
 
23
35
  配送文はラン 1 回につき 1 度しか出ないので、**「同じ呼び出しをもう一度出せ」と明記する**。例外: 繰り返す行為を止める項目は毎回発火し(joshuafolkken/kit#1570)、前提の行為を求める項目は前提が末尾に現れるまで毎回拒否する(joshuafolkken/kit#2807)— その配送文にはそれぞれ「これは毎回発火する」「前提が末尾に現れるまで拒否する」と明記する。バッチングと調査の 2 ガードは違反が間隔分続けば再び発火する(joshuafolkken/kit#2164)。前提の証拠を読めないときは拒否する。
@@ -14,7 +14,7 @@
14
14
 
15
15
  **実行中のリポジトリ自身はこの手順の対象外である。** kit の中で kit のラン機構(`backlog:drive`、`run:wake`、`run:carry`、レーン、分類、カウンタ、ガードなど)の不具合を見つけたら、上流 Issue で停止する代わりに、このリポジトリの割り込みとして次を行う。
16
16
 
17
- 1. **起票する** — `pnpm josh issue:file "<title>" --body-file <path> --route interrupt --label priority:high`。上限は効かない(`wip-cap.md` →「割り込み起票 — 上限が効かない側」の条件 2)
17
+ 1. **起票する** — `pnpm josh issue:file "<title>" --body-file <path> --route interrupt --label priority:high --blocks-finder`。上限は効かない(`wip-cap.md` →「割り込み起票 — 上限が効かない側」の条件 2)
18
18
  2. **止まらずに直す** — 壊れた機構を迂回せず、検証ゲートも緩めない。`backlogrun` の中では割り込みを次の子にし、着地後に塞がれていた子へ戻る(プールでは `priority:high` が先頭、epic の下では `wip-cap.md` の手順 3 で挿入、名前指定のランでは `pnpm josh lane:launch <N>` で自分で dispatch)。バッチの外では `wip-cap.md` の手順 4 どおり、打つべき `fullrun #<N>` を報告して止まる
19
19
  3. **再開できるなら自分で再開し、動くことを確かめる** — 修正のマージ後、手渡し済み・所有者が死んだ記録・監督プロセスの停止(`warning` Telegram)には `pnpm josh run:wake --start`、`run:carry` の `standing` には `pnpm josh run:carry --resume "<invocation>" --owner "$PPID"` を打つ。`pnpm josh run:wake --list` が監督プロセスを示し、ログに次の子の dispatch が現れることを確かめて報告する
20
20
  4. **人に打ち直しを求めるのは再開の手段が無いときだけ** — `mismatch`(別の起動の記録)、別の生きた所有者の `busy`。新しい承認を宣言するのは人だけ
@@ -25,7 +25,7 @@
25
25
  1. **現在の作業を退避する**: `pnpm josh stash:push "upstream-interrupt: paused #<N>"`(WIP コミットでも可)
26
26
  2. **進行中の Issue に状況を書く**: `pnpm josh issue:comment <N> --body-file <path>` で、stash したこと、中断理由(どの別パッケージのどんな問題か)、新 Issue へのリンク(`## Upstream issues` 見出しの下に `owner/repo#N` 形式、→「起票元へのバックリンク」)
27
27
  3. **対象パッケージのリポジトリに Issue を作成する(確認なし)**: `pnpm josh issue:file "<root-cause title>" --body-file <body-file> --route tier-a --repo <owner>/<repo>`(joshuafolkken/kit#1083)。検査・分類ラベル・重複探し・`epic:bundle` はコマンドが行う(`docs/josh-commands-backlog.md` → `josh issue:file`)。根本原因・再現・期待結果を `prompts/collaboration-workflow/issue-template.md` の Step 1 のテンプレで書き、`## Origin` 節に起票元 Issue を `owner/repo#N` 形式で書く
28
- 4. **`confirmation` Telegram を送って停止する**: 上流 Issue の URL と何が止まっているかを書く(→ `CLAUDE.md` → "Mid-workflow stop notification (`confirmation`)")
28
+ 4. **`confirmation` Telegram を送って停止する**: 上流 Issue の URL と何が止まっているかを書く(→ `rule-delivery.md` → "stop-notify")
29
29
  5. **元の作業を再開する**: 上流の修正がマージされた、またはユーザーが先送りを明示判断した後に `pnpm josh stash:pop "upstream-interrupt: paused #<N>"` で復元する(`operating-rules.md` → "no-self-staging")。上流 Issue を割り込みで実装するかもユーザーが決める
30
30
 
31
31
  ### first-party の Issue・PR への書き込みは確認不要
@@ -58,8 +58,10 @@
58
58
  pnpm josh issue:file "<title>" --body-file <body-file> --route interrupt
59
59
  ```
60
60
 
61
+ `--blocks-finder` は付けない。発見したランを塞がない割り込みに起票元の `blocked-by` を書くと、偽の依存関係になる。
62
+
61
63
  2. 超過している事実と当たった条件の番号を、両方とも本文に 1 行書く(例:「オープン 37 件で起票。3 条件のうち 2(文書化された手順が完了できない)に該当」)。
62
- 3. 次に実行されるものとして挿入する。epic の下なら `pnpm josh epic --add <E> <N>` で**位置を指定せずに**追加する(`<E>` が epic、`<N>` が割り込み)。**`--before` / `--after` を使ってはならない。** それらは `blocked-by` を書き込み、**偽の依存関係**になる。**順序は実行側が持つ** — 先に提示させたいときは行だけを動かす `--order-before <M>` を使う。**epic の下に無いなら挿入先そのものが無い**ので、4 だけを行う。
64
+ 3. 次に実行されるものとして挿入する。epic の下なら `pnpm josh epic --add <E> <N>` で**位置を指定せずに**追加する(`<E>` が epic、`<N>` が割り込み)。**`--before` / `--after` を使ってはならない。** それらは `blocked-by` を書き込み、**偽の依存関係**になる。**順序は実行側が持つ** — 先に提示させたいときは行だけを動かす `--order-before <M>` を使う。**epic の下に無いなら挿入先そのものが無い**ので、4 だけを行う。`--blocks-finder` の割り込みを追加したら → `pnpm josh epic --reconcile <E>`(`docs/josh-commands-backlog.md` → `josh issue:file` の `--blocks-finder`)。
63
65
  4. 着手は既にある承認の内側でのみ、指示を待たずに行う。`backlogrun` の中なら次の子として着手してよい。バッチの外では `CLAUDE.md` →「Explicit invocation required」が効き、起票と挿入まで済ませて打つべきコマンド(`fullrun #<N>`)を報告して止まる。**割り込みは上限の例外であって、明示起動規則の例外ではない。**
64
66
 
65
67
  起票と、実行されるようにするところまでが 1 つのまとまりである — epic の下で追加しなければ `epic:next` は候補に出さない。**epic の外にある割り込みでは、まとまりの後半は 4 の報告そのもの**である。
@@ -88,6 +88,8 @@ For each finding:
88
88
  - Cite `file_path:line_number`
89
89
  - State severity (`high` / `medium` / `low`) by the two tests in "Severity"
90
90
  - Explain the concrete problem and the minimal fix
91
+ - On a `high` or `medium`, cite every other site of the same pattern in the change's files and their
92
+ callers as `file_path:line_number`, so one fix pass closes them all
91
93
  - On a test-1 finding rated `low`, write `no failure scenario — <what you tried>`
92
94
 
93
95
  A category with no findings needs a proof statement, e.g. `No issues — checked null returns on X,
@@ -139,6 +141,9 @@ Actively try to break the changed code.
139
141
  - Impact outside the diff: open the callers of every changed export or signature and verify they still
140
142
  hold; flag duplication the change introduces
141
143
  - Regressions in existing behavior covered elsewhere
144
+ - Commands the changed prose tells a reader to run, run from a cwd other than the root with absolute,
145
+ relative and empty inputs, in a scratch copy when they write: `prompts/review.md` → "Before round 1
146
+ — the implementer's self-check", question 10
142
147
 
143
148
  **`No issues` requires at least one explicit trace statement.**
144
149
 
@@ -204,6 +209,9 @@ concerns"; if nothing is uncertain, trace the logic path that gives that confide
204
209
  not describe.
205
210
  - High findings → must fix before committing
206
211
  - Medium findings → must fix before opening the PR
212
+ - A finding wholly covered by an open follow-up this Issue filed (a `先送り: #M <title>` comment on
213
+ it, which `issue:file --found-during <N>` posts) → record it as `low` citing `#M`, never `medium`
214
+ or `high`, so it does not stop the ship
207
215
  - Low findings → document in the PR body if skipped
208
216
 
209
217
  If the diff is empty or trivial (e.g. whitespace only), state that and skip the review.
package/prompts/review.md CHANGED
@@ -12,9 +12,9 @@ Review policy: the level, the round count, and what happens to a finding after t
12
12
  ## When to run
13
13
 
14
14
  When: `CLAUDE.md` → "Pre-commit Self-Review"; inside a workflow, round 1 runs before the commit and
15
- round 2 beside CI (`.claude/skills/workflow-commands/chain-rule.md`). Pass the review subagent the
16
- `reviewer` profile's model and effort that `pnpm josh review:brief` prints; never substitute the review
17
- level for effort.
15
+ round 2 beside CI (`.claude/skills/workflow-commands/chain-rule.md`). Launch the `reviewer` agent
16
+ type (round 2: `reviewer-verification`), never nested, with the model `pnpm josh review:brief` prints.
17
+ Before the reviewer returns its findings → `pnpm josh review:lint` (`.claude/agents/reviewer.md`).
18
18
 
19
19
  Re-run after fixes until **no high or medium findings remain or the round cap below is reached** (the
20
20
  first review counts), whichever comes first. Round 2 is a verification pass over the fixes
@@ -24,17 +24,19 @@ first review counts), whichever comes first. Round 2 is a verification pass over
24
24
 
25
25
  ## Before round 1 — the implementer's self-check
26
26
 
27
- Answer these nine over your own diff before the scoped pair that precedes round 1, and fix what an
27
+ Answer these ten over your own diff before the scoped pair that precedes round 1 — question 1 once
28
+ `pnpm josh run:review --join` prints its lines after the review, or, under `--join --fixing` or a
29
+ check `--join` restarted on a moved tree, the ship's pre-detach — and fix what an
28
30
  answer turns up (about four in five of 100 sampled High/Medium findings that stopped lane reviews
29
31
  fell under one; `pnpm josh lane:stats` counts the kinds that still stop). The review, its severity
30
32
  tests and the round cap are unchanged.
31
33
 
32
- 1. **Tests pin the change** — for each condition, branch or call added or changed, name the test that
33
- turns red when it is deleted or inverted, and check its fixture reaches that branch (no assert on a
34
- string the code never draws, no comparison against a literal copy).
34
+ 1. **Tests pin the change** — read the `unpinned` and `unchecked` lines `pnpm josh run:review --join`
35
+ prints from `pnpm josh test:pinned` (each unchecked place is listed in its `full output:` log) (`docs/josh-commands.md` → "`josh test:pinned`"), and check a pinning test's fixture reaches its branch (no assert on a string the code
36
+ never draws, no comparison against a literal copy).
35
37
  2. **Prose matches the code** — grep docs, prompts and comments for the old wording of every behavior,
36
- constant, command and heading you changed, moved or removed, `"the table above"` and rewritten
37
- sentences included.
38
+ constant, command and heading you changed, moved or removed (`pnpm josh prose:stale` finds the
39
+ removed ones), `"the table above"` and rewritten sentences included.
38
40
  3. **Failure is not a negative answer** — every timeout, non-zero exit or `gh` failure on a touched
39
41
  path returns something a caller can tell apart from `false`, `undefined` or "nothing found".
40
42
  4. **Every caller moved with it** — grep every reference to a changed function, list or command, and
@@ -54,6 +56,10 @@ tests and the round cap are unchanged.
54
56
  comment makes about another component's behavior (what a stage does, who enforces a limit, which
55
57
  repository it runs in), open that component's code and confirm it; then name each context the
56
58
  change runs in — kit and a consumer, and a predecessor that died midway leaving its record behind.
59
+ 10. **Commands your prose tells a reader to run are run** — for every command a refusal, hint or
60
+ document you added or changed tells a reader to run, run it as written from a cwd other than the
61
+ root, with an absolute path, a relative path and an empty input, and check each result — in a
62
+ scratch copy (`mktemp -d`) when it writes, deletes, files or pushes, never on the lane's files.
57
63
 
58
64
  The brief lists `Removed tests` → each needs a `## 消えたテストの処置` row in the PR body, or the
59
65
  merge is refused: `prompts/collaboration-workflow/report-format.md` → "PR 本文の消えたテストの処置".
@@ -78,12 +84,12 @@ pnpm josh review:brief --level-only --staged # the staged diff
78
84
 
79
85
  ## Interaction review
80
86
 
81
- After round 1 and its record, `pnpm josh review:brief --interaction` answers whether the change takes
82
- the interaction review and prints its brief; hand it to a reviewer subagent, dispose of the findings
87
+ `pnpm josh run:review` writes its brief to a file beside round 1's where it is due, printing both paths; one still owed after round 1
88
+ takes `pnpm josh review:brief --interaction`. Hand it to a reviewer subagent, dispose of the findings
83
89
  by the three-way disposition below, and record the pass with
84
90
  `pnpm josh review:record --interaction --issue <N> [<category>:<severity>:<file> ...]`.
85
91
 
86
- `pnpm josh followup` refuses a due change with none recorded; `pnpm josh ship --review` runs it itself.
92
+ `pnpm josh followup` refuses a due change with none recorded; `pnpm josh ship --review` runs it itself, beside round 1, and stops once on the findings of both.
87
93
 
88
94
  ## Review round cap (2 rounds)
89
95
 
@@ -103,27 +109,28 @@ the child rather than buying a further round.
103
109
  ### When round 2 is skipped entirely, and when it is not
104
110
 
105
111
  ```bash
106
- pnpm josh review:round2 --round-1-closed # → required | skip ; the reason on stderr
112
+ pnpm josh review:round2 --record <N> # → required | skip ; the reason on stderr
107
113
  ```
108
114
 
109
- Ask once round 1's fixes are in, before the commit. Pass `--round-1-closed` only when every round-1
110
- High/Medium closed — fixed in this working tree or verified false positive — and none was filed or
111
- deferred. Without the flag, and on any uncertainty (a missing round-1 snapshot included), the answer is
112
- `required`.
115
+ Ask once round 1's fixes are in and the round is recorded with each finding's disposition
116
+ (`pnpm josh review:record`'s usage), before the commit. Round 1 is closed only when the ledger shows
117
+ every round-1 High/Medium as `fixed` or `false-positive`. Anything else, including a missing round-1
118
+ snapshot, answers `required`.
113
119
 
114
120
  `skip` has exactly two arms, and the reason line names which fired:
115
121
 
116
122
  - **A** — the fix delta is empty.
117
123
  - **B** — every path in the fix delta is inert by the review-level classification above:
118
- `docs/**/*.md`, the root `README.md`, under `prompts/`, or a `.ts` / `.js` / `.svelte` file outside
124
+ `docs/**/*.md`, the root `README.md`, under `prompts/`, a metrics approval under
125
+ `.josh/metrics-accepted/`, or a `.ts` / `.js` / `.svelte` file outside
119
126
  `.claude/` changed only in comments (a lint, type-check, coverage or bundler directive comment counts
120
127
  as code).
121
128
 
122
129
  One path outside that set makes it `required` — `.claude/**`, `CLAUDE.md`, a test, configuration, a
123
130
  code line, or a source file whose comment-free text cannot be read.
124
131
 
125
- Record a skipped round on the Issue with a comment under `## Round 2 skipped`, naming which arm fired
126
- and quoting the command's reason line verbatim.
132
+ `--record <N>` records a skipped round on the Issue itself: a comment under `## Round 2 skipped`
133
+ naming which arm fired and quoting the reason line verbatim, written once however often it is asked.
127
134
 
128
135
  ### Three-way disposition after the cap
129
136
 
@@ -161,9 +168,11 @@ Branch 2 only:
161
168
  a `fold`; the first filing asks nothing.
162
169
 
163
170
  1. Before the current Issue closes, file it tagged `route:review-cap`:
164
- `pnpm josh issue:file "<title>" --body-file <body-file> --route review-cap`. It lints
171
+ `pnpm josh issue:file "<title>" --body-file <body-file> --route review-cap --found-during <N>`
172
+ (`--found-during` leaves the deferral note on the current Issue the ship reviewer reads). It lints
165
173
  the body, applies the declared labels, runs the duplicate scan and `epic:bundle`
166
- (`docs/josh-commands-backlog.md` → `josh issue:file`). `epic:bundle` reads open issues only, so
174
+ (`docs/josh-commands-backlog.md` → `josh issue:file`). A security finding declares its
175
+ `- セキュリティ:` line (`issue-template.md` → H). `epic:bundle` reads open issues only, so
167
176
  after the parent closes it answers `none` permanently.
168
177
  2. Act on the printed `epic:bundle` answer with `pnpm josh epic:bundle <new> --apply` — never a
169
178
  hand edit of the epic body, which leaves the task list and `blocked-by` relations disagreeing
@@ -10,6 +10,7 @@ Every requirement gets a test (`CLAUDE.md` → "Code Change Rules" Step 0); the
10
10
  - Logic/utility change (pure functions, filters, transforms) → a unit test. Bug fix → a regression test; refactor → tests pinning the existing behavior BEFORE the change (`prompts/refactoring.md`).
11
11
  - **Non-runtime updates (pre-approved manual-only exception):** a change touching no executable runtime code path — docs, non-executable config, editor/IDE files, cosmetic asset swaps with no selector/path change — may be verified by hand; declare it in Step 0 with the reason. The mechanically exempt (`*.md`, `.editorconfig`, `.idea/**`, `.vscode/**`, `prompts/**`) need no declaration. A runtime change whose test is infeasible needs the reason and user approval.
12
12
  - **basic で kit がテストできない言語だけの変更:** `package.json` に `josh.profile: basic`(改名前の `static` も同じ)があり、変更が HTML/CSS や Lua などのソースだけなら自動テストは不要。HTML/CSS はブラウザーで対象ページを開き、想定する画面幅でレイアウト・リンク・HTML 内の操作を確認する。そのほかのソースは変更した処理を実際に動かす。どちらも結果を記録する。JavaScript または TypeScript のファイルを含む変更は自動テストを行う。
13
+ - **A runtime change with no test is refused at the commit** — `pnpm josh git -y` refuses it while `pnpm josh test:declared` answers `required` (the `test-declared` row of `pnpm josh rule:list`).
13
14
  - Test infeasible (e.g., a native OS date-picker Playwright cannot drive) → comment why in the test file and test the closest observable behavior (e.g., the editor stays open after `change`).
14
15
 
15
16
  ### Verification checklist (add to the completion gate)
@@ -95,30 +95,28 @@ function resolve(
95
95
  return resolved.kind === 'rejected' ? resolved : with_profile(invocation, resolved.profile)
96
96
  }
97
97
 
98
+ function profiled_in(invocation: string, resolved: ProfileResult, cwd: string): AgentArgvResult {
99
+ return resolved.kind === 'rejected'
100
+ ? resolved
101
+ : with_profile_in(invocation, resolved.profile, cwd)
102
+ }
103
+
98
104
  // **A cut relaunch's profile, resolved for the phase the resumed child is entering**.
99
- // A stored lane profile keeps its model and takes only the phase's effort; a
100
- // lane without one resolves the worker for the phase. An env override wins over the phase in either path.
105
+ // A stored lane profile keeps its model unless the phase's own model key is set, and takes the phase's
106
+ // effort; a lane without one resolves the worker for the phase. An env override wins over the phase in
107
+ // either path.
101
108
  function resume_argv(
102
109
  invocation: string,
103
110
  profile: AgentProfile | undefined,
104
111
  phase: string,
105
112
  cwd: string,
106
113
  ): AgentArgvResult {
107
- if (profile !== undefined) {
108
- return with_profile_in(invocation, agent_role_profile.with_phase_effort(profile, phase), cwd)
109
- }
110
-
111
- const resolved = agent_role_profile.resolve(agent_role_profile.WORKER, process.env, phase)
112
-
113
- return resolved.kind === 'rejected'
114
- ? resolved
115
- : with_profile_in(invocation, resolved.profile, cwd)
116
- }
114
+ const resolved =
115
+ profile === undefined
116
+ ? agent_role_profile.resolve(agent_role_profile.WORKER, process.env, phase)
117
+ : agent_role_profile.with_phase(profile, phase)
117
118
 
118
- function profiled_in(invocation: string, resolved: ProfileResult, cwd: string): AgentArgvResult {
119
- return resolved.kind === 'rejected'
120
- ? resolved
121
- : with_profile_in(invocation, resolved.profile, cwd)
119
+ return profiled_in(invocation, resolved, cwd)
122
120
  }
123
121
 
124
122
  function resolve_in(
@@ -0,0 +1,138 @@
1
+ import { agent_session_environment } from '#scripts/josh/agent-session-environment'
2
+ import { z } from 'zod'
3
+
4
+ // Which provider an agent session runs on, read from the session's own keys or the mark a detached
5
+ // launch hands its child. `agent-role-profile.ts` resolves a role's profile on top of it.
6
+
7
+ const EMPTY_LENGTH = 0
8
+
9
+ const PROVIDER_SCHEMA = z.enum(['anthropic', 'openai'])
10
+
11
+ type AgentProvider = z.infer<typeof PROVIDER_SCHEMA>
12
+ type AgentEnvironment = Readonly<Record<string, string | undefined>>
13
+
14
+ interface Rejected {
15
+ kind: 'rejected'
16
+ note: string
17
+ }
18
+
19
+ type ProviderResult = Rejected | { kind: 'provider'; provider: AgentProvider; is_default?: true }
20
+
21
+ const ANTHROPIC_PROVIDER: AgentProvider = 'anthropic'
22
+ const OPENAI_PROVIDER: AgentProvider = 'openai'
23
+ const CODEX_SESSION_KEY = 'CODEX_THREAD_ID'
24
+
25
+ function trimmed(value: string | undefined): string | undefined {
26
+ const result = value?.trim()
27
+
28
+ return result === undefined || result.length === EMPTY_LENGTH ? undefined : result
29
+ }
30
+
31
+ function rejection(key: string, value: string, expected: string): Rejected {
32
+ return { kind: 'rejected', note: `${key}=${value} ${expected}, so the agent was not started` }
33
+ }
34
+
35
+ function has_session(environment: AgentEnvironment, keys: ReadonlyArray<string>): boolean {
36
+ return keys.some((key) => trimmed(environment[key]) !== undefined)
37
+ }
38
+
39
+ const CONFLICTING_SESSIONS: Rejected = {
40
+ kind: 'rejected',
41
+ note: 'both Codex and Claude Code sessions were detected',
42
+ }
43
+
44
+ // The provider a detached launcher hands a process that is not itself an agent session.
45
+ // `detached_launch` strips the parent-session keys — the very keys the
46
+ // detection below reads — so a `josh ship --detach --review` supervisor could never resolve its reviewer.
47
+ // **It is a fallback, read only when no session is detected**: the mark is inherited by everything the
48
+ // supervisor starts, and a real session's own keys must keep deciding for that session.
49
+ const HANDED_PROVIDER_KEY = 'JOSH_AGENT_PROVIDER'
50
+
51
+ // **Nothing named a provider, so Claude Code is the default** — a person typing `josh lane:launch` in a
52
+ // plain terminal has no session and no mark. Only silence defaults: two detected sessions and a mark
53
+ // naming no allowed provider still refuse. `is_default` lets a launch say so, and lets `josh cost` keep
54
+ // reading "no session of its own" rather than pricing another session's transcript.
55
+ const DEFAULT_PROVIDER: ProviderResult = {
56
+ kind: 'provider',
57
+ provider: ANTHROPIC_PROVIDER,
58
+ is_default: true,
59
+ }
60
+ const DEFAULT_NOTICE = ` No agent session or ${HANDED_PROVIDER_KEY} was found, so the provider defaulted to ${ANTHROPIC_PROVIDER} (Claude Code).`
61
+
62
+ function handed_provider(environment: AgentEnvironment): ProviderResult {
63
+ const value = trimmed(environment[HANDED_PROVIDER_KEY])
64
+ if (value === undefined) return DEFAULT_PROVIDER
65
+ const parsed = PROVIDER_SCHEMA.safeParse(value)
66
+
67
+ return parsed.success
68
+ ? { kind: 'provider', provider: parsed.data }
69
+ : rejection(HANDED_PROVIDER_KEY, value, 'is not an allowed provider')
70
+ }
71
+
72
+ // The session this process runs in, read from its own keys: `undefined` when none is detected.
73
+ function detected_provider(environment: AgentEnvironment): ProviderResult | undefined {
74
+ const has_codex = has_session(environment, [CODEX_SESSION_KEY])
75
+ const has_claude = has_session(environment, agent_session_environment.PARENT_SESSION_KEYS)
76
+
77
+ if (has_codex === has_claude) return has_codex ? CONFLICTING_SESSIONS : undefined
78
+
79
+ return { kind: 'provider', provider: has_codex ? OPENAI_PROVIDER : ANTHROPIC_PROVIDER }
80
+ }
81
+
82
+ function resolve_provider(environment: AgentEnvironment = process.env): ProviderResult {
83
+ return detected_provider(environment) ?? handed_provider(environment)
84
+ }
85
+
86
+ // The sentence a launch appends when it ran on the default, so falling back is never silent; empty when
87
+ // a session or a mark decided.
88
+ function default_notice(environment: AgentEnvironment = process.env): string {
89
+ const selected = resolve_provider(environment)
90
+
91
+ return selected.kind === 'provider' && selected.is_default === true ? DEFAULT_NOTICE : ''
92
+ }
93
+
94
+ // The same sentence on stderr, for a launcher whose own line is a verdict or a brief another process
95
+ // reads: `run:wake --start`, `review:brief` and `ship --detach` default exactly as a dispatch does.
96
+ function warn_of_default(environment: AgentEnvironment = process.env): void {
97
+ const notice = default_notice(environment).trim()
98
+
99
+ if (notice !== '') console.error(notice)
100
+ }
101
+
102
+ // Whether this session is woken when a background command it started completes.
103
+ // Claude Code re-invokes the session at the completion; a Codex session is not
104
+ // re-invoked, so a parent there can only wait by polling, each poll a model call over its whole context.
105
+ // Only a resolved Codex session answers no — a defaulted or conflicting one keeps the callback.
106
+ function has_completion_callback(environment: AgentEnvironment = process.env): boolean {
107
+ const selected = resolve_provider(environment)
108
+
109
+ return selected.kind !== 'provider' || selected.provider !== OPENAI_PROVIDER
110
+ }
111
+
112
+ // The mark a detached launch sets on its child: the provider this session resolved, the default
113
+ // included, or nothing when it was refused — the child then fails the same way this session would have.
114
+ function handoff_environment(
115
+ environment: AgentEnvironment = process.env,
116
+ ): Readonly<Record<string, string>> {
117
+ const selected = resolve_provider(environment)
118
+
119
+ return selected.kind === 'provider' ? { [HANDED_PROVIDER_KEY]: selected.provider } : {}
120
+ }
121
+
122
+ const agent_provider = {
123
+ ANTHROPIC_PROVIDER,
124
+ CODEX_SESSION_KEY,
125
+ HANDED_PROVIDER_KEY,
126
+ OPENAI_PROVIDER,
127
+ PROVIDER_SCHEMA,
128
+ default_notice,
129
+ handoff_environment,
130
+ has_completion_callback,
131
+ rejection,
132
+ resolve_provider,
133
+ trimmed,
134
+ warn_of_default,
135
+ }
136
+
137
+ export type { AgentEnvironment, AgentProvider, ProviderResult, Rejected }
138
+ export { agent_provider }