@joshuafolkken/kit 1.1010.0 → 1.1035.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 (272) hide show
  1. package/.claude/settings.json +1 -5
  2. package/.claude/skills/dependency-update/SKILL.md +6 -3
  3. package/.claude/skills/epic-commands/SKILL.md +46 -17
  4. package/.claude/skills/workflow-commands/SKILL.md +8 -23
  5. package/.claude/skills/workflow-commands/backlogrun-child.md +4 -2
  6. package/.claude/skills/workflow-commands/backlogrun.md +3 -12
  7. package/.claude/skills/workflow-commands/fullrun-steps.md +4 -3
  8. package/.claude/skills/workflow-commands/fullrun.md +1 -1
  9. package/.claude/skills/workflow-commands/halfrun.md +2 -1
  10. package/.claude/skills/workflow-commands/into-target.md +1 -1
  11. package/.claude/skills/workflow-commands/observation-filing.md +42 -43
  12. package/.claude/skills/workflow-commands/prerequisite.md +1 -1
  13. package/.codex/hooks.json +1 -5
  14. package/.github/workflows/sonar-qube.yml +1 -1
  15. package/AGENTS.md +4 -25
  16. package/CLAUDE.md +24 -38
  17. package/GEMINI.md +4 -24
  18. package/README.md +22 -56
  19. package/dist/CLAUDE.md +24 -38
  20. package/dist/hooks/batch-guard.js +4 -4
  21. package/dist/hooks/{chunk-WMIR5SNX.js → chunk-D67KVGGY.js} +3 -3
  22. package/dist/hooks/{chunk-EZLHXKJ6.js → chunk-EIFCAJRB.js} +70 -27
  23. package/dist/hooks/{chunk-KPZN42RT.js → chunk-GJT4BNVE.js} +3 -3
  24. package/dist/hooks/{chunk-PAXMLGSS.js → chunk-GLBDBJOK.js} +44 -24
  25. package/dist/hooks/{chunk-GBJUERYK.js → chunk-HOYJU5RM.js} +1 -1
  26. package/dist/hooks/{chunk-6PSTVOLH.js → chunk-HU66PWWL.js} +33 -57
  27. package/dist/hooks/{chunk-A2H5I2VD.js → chunk-KG6PZD72.js} +2 -2
  28. package/dist/hooks/{chunk-AWTFKKFW.js → chunk-XPLP27WA.js} +3 -8
  29. package/dist/hooks/{chunk-4GDR2YTV.js → chunk-Y27M6A7X.js} +4 -4
  30. package/dist/hooks/{chunk-56LGMJJV.js → chunk-ZXNE6NY3.js} +2 -2
  31. package/dist/hooks/codex-hook-adapter.js +10 -10
  32. package/dist/hooks/duplicate-read-guard.js +5 -5
  33. package/dist/hooks/format-edited.js +2 -2
  34. package/dist/hooks/investigation-guard.js +5 -5
  35. package/dist/hooks/pretool-guard.js +9 -9
  36. package/dist/hooks/stop-guard.js +11 -15
  37. package/dist/josh.js +38 -19
  38. package/dist/version/index.js +93 -41
  39. package/eslint/base.js +2 -11
  40. package/package.json +31 -5
  41. package/prompts/coding-standards.md +15 -290
  42. package/prompts/collaboration-workflow/cross-repo-epic.md +2 -51
  43. package/prompts/collaboration-workflow/epic-audit.md +2 -53
  44. package/prompts/collaboration-workflow/epic-bundle.md +2 -106
  45. package/prompts/collaboration-workflow/issue-template.md +4 -4
  46. package/prompts/collaboration-workflow/operating-rules.md +18 -75
  47. package/prompts/collaboration-workflow/principles.md +74 -0
  48. package/prompts/collaboration-workflow/residency.md +54 -14
  49. package/prompts/collaboration-workflow/rule-delivery.md +1 -11
  50. package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
  51. package/prompts/collaboration-workflow.md +22 -28
  52. package/scripts/adopt/adopt-logic.ts +2 -2
  53. package/scripts/adopt/adopt-toolkits.ts +1 -1
  54. package/scripts/adopt/adopt.ts +2 -2
  55. package/scripts/agent/agent-event.ts +2 -9
  56. package/scripts/agent/agent-exit-record.ts +2 -9
  57. package/scripts/backlog/backlog-budget-cli.ts +2 -6
  58. package/scripts/backlog/backlog-drive-cli.ts +20 -10
  59. package/scripts/backlog/backlog-drive.ts +50 -16
  60. package/scripts/backlog/backlog-offer-cli.ts +6 -5
  61. package/scripts/backlog/backlog-plan.ts +1 -1
  62. package/scripts/build/build-bin.ts +2 -1
  63. package/scripts/build/build-config-merge.ts +2 -1
  64. package/scripts/build/build-hooks.ts +24 -4
  65. package/scripts/build/build-managed-marker.ts +2 -1
  66. package/scripts/build/build-self-sync-guard.ts +2 -1
  67. package/scripts/build/build-version.ts +2 -1
  68. package/scripts/cases/cases-logic.ts +2 -6
  69. package/scripts/ci/pr-classification.ts +13 -11
  70. package/scripts/cost-runtime/cost-transcript.ts +4 -11
  71. package/scripts/doctor/doctor-consumer.ts +5 -12
  72. package/scripts/doctor/doctor-ports.ts +2 -2
  73. package/scripts/document/document-byte-budget.ts +8 -16
  74. package/scripts/document/document-section.ts +2 -6
  75. package/scripts/document/entry-read-budget.ts +1 -1
  76. package/scripts/{git/git-epic-add-body.ts → epic/epic-add-body.ts} +23 -23
  77. package/scripts/{git/git-epic-add-plan.ts → epic/epic-add-plan.ts} +23 -26
  78. package/scripts/{git/git-epic-add.ts → epic/epic-add.ts} +17 -17
  79. package/scripts/epic/epic-audit-cli.ts +4 -4
  80. package/scripts/epic/epic-audit-orphans.ts +2 -2
  81. package/scripts/epic/epic-audit-rationale.ts +1 -1
  82. package/scripts/epic/epic-audit.ts +1 -1
  83. package/scripts/{git/git-epic-body.ts → epic/epic-body.ts} +6 -6
  84. package/scripts/epic/epic-bundle-cli.ts +1 -1
  85. package/scripts/epic/epic-bundle.ts +2 -2
  86. package/scripts/epic/epic-candidate-confirm.ts +2 -1
  87. package/scripts/{git/git-epic-chains.ts → epic/epic-chains.ts} +4 -4
  88. package/{scripts-ai → scripts/epic}/epic-check.ts +5 -4
  89. package/{scripts-ai → scripts/epic}/epic-cli.ts +4 -4
  90. package/scripts/{git/git-epic-close-comment.ts → epic/epic-close-comment.ts} +9 -9
  91. package/scripts/{git/git-epic-close.ts → epic/epic-close.ts} +23 -19
  92. package/scripts/epic/epic-cross-repo.ts +21 -38
  93. package/scripts/{git/git-epic-decision.ts → epic/epic-decision.ts} +12 -14
  94. package/scripts/epic/epic-fetch.ts +3 -3
  95. package/scripts/epic/epic-graph.ts +3 -3
  96. package/scripts/epic/epic-index.ts +2 -2
  97. package/scripts/epic/epic-issue.ts +1 -1
  98. package/scripts/epic/epic-next.ts +3 -3
  99. package/scripts/{git/git-epic-parse.ts → epic/epic-parse.ts} +3 -3
  100. package/scripts/{git/git-epic-promote.ts → epic/epic-promote.ts} +10 -10
  101. package/scripts/{git/git-epic-read.ts → epic/epic-read.ts} +9 -9
  102. package/scripts/{git/git-epic-reconcile.ts → epic/epic-reconcile.ts} +18 -20
  103. package/scripts/{git/git-epic-reference.ts → epic/epic-reference.ts} +4 -23
  104. package/scripts/epic/epic-relation-recheck.ts +4 -3
  105. package/scripts/{git/git-epic-relations.ts → epic/epic-relations.ts} +5 -5
  106. package/scripts/{git/git-epic-remove-plan.ts → epic/epic-remove-plan.ts} +17 -19
  107. package/scripts/{git/git-epic-remove.ts → epic/epic-remove.ts} +13 -13
  108. package/scripts/{git/git-epic-run.ts → epic/epic-run.ts} +27 -27
  109. package/scripts/{git/git-epic-sections.ts → epic/epic-sections.ts} +6 -6
  110. package/scripts/{git/git-epic-shape.ts → epic/epic-shape.ts} +7 -7
  111. package/scripts/{git/git-epic-validate.ts → epic/epic-validate.ts} +13 -13
  112. package/{scripts-ai → scripts/epic}/epic.ts +17 -16
  113. package/scripts/gh/fix-gh-packages.ts +2 -1
  114. package/scripts/gh/gh-spawn.ts +12 -10
  115. package/scripts/git/constants.ts +1 -1
  116. package/scripts/git/git-branch.ts +10 -1
  117. package/scripts/git/git-command.ts +1 -1
  118. package/scripts/git/git-error.ts +2 -5
  119. package/{scripts-ai → scripts/git}/git-followup-finish.ts +7 -7
  120. package/scripts/git/git-followup-flush.ts +74 -48
  121. package/scripts/git/git-followup-issue-close.ts +2 -2
  122. package/scripts/git/git-followup-label.ts +1 -1
  123. package/scripts/git/git-followup-pending.ts +1 -1
  124. package/{scripts-ai → scripts/git}/git-followup-workflow.ts +23 -11
  125. package/scripts/git/git-gh-exec.ts +85 -26
  126. package/scripts/git/git-gh-issue-read.ts +2 -2
  127. package/scripts/git/git-gh-issue-rest.ts +2 -2
  128. package/scripts/git/git-gh-issue-write.ts +6 -6
  129. package/scripts/git/git-gh-pr-read.ts +0 -21
  130. package/scripts/git/git-gh-pr.ts +2 -23
  131. package/scripts/git/git-pr-followup-wrapup.ts +2 -6
  132. package/scripts/git/git-preflight.ts +3 -6
  133. package/scripts/git/git-staging.ts +21 -9
  134. package/{scripts-ai → scripts/git}/git-workflow.ts +11 -11
  135. package/scripts/git/github-issue-url.ts +1 -1
  136. package/scripts/git/issue-labels.ts +1 -1
  137. package/scripts/git/issue-reference.ts +19 -0
  138. package/scripts/git/main-merge.ts +2 -1
  139. package/scripts/git/main-sync.ts +3 -2
  140. package/scripts/git/schemas.ts +1 -1
  141. package/scripts/git/stash-pop-args.ts +7 -13
  142. package/scripts/git/stash-pop-cli.ts +2 -1
  143. package/{scripts-ai → scripts/git}/telegram-test-logic.ts +2 -2
  144. package/{scripts-ai → scripts/git}/telegram-test.ts +7 -7
  145. package/scripts/hooks/format-rewrite-notice.ts +2 -8
  146. package/scripts/init/init-ai-copy.ts +2 -5
  147. package/scripts/init/init.ts +8 -4
  148. package/scripts/init/start-steps.ts +2 -1
  149. package/scripts/init/start.ts +2 -1
  150. package/scripts/issue/issue-comment-cli.ts +2 -1
  151. package/scripts/issue/issue-file-cli.ts +2 -1
  152. package/scripts/issue/issue-fold-cli.ts +9 -16
  153. package/scripts/issue/issue-scout-cli.ts +8 -13
  154. package/scripts/issue/measure-rerun-cli.ts +7 -6
  155. package/scripts/josh/josh-commands-ai.ts +2 -2
  156. package/scripts/josh/josh-commands-backlog.ts +1 -1
  157. package/scripts/josh/josh-commands-development.ts +1 -1
  158. package/scripts/josh/josh-commands-workflow.ts +4 -4
  159. package/scripts/lane/lane-cli.ts +2 -1
  160. package/scripts/lane/lane-open.ts +3 -2
  161. package/scripts/lane/lane-registry.ts +3 -6
  162. package/scripts/lib/cli-flags.ts +20 -2
  163. package/scripts/lib/error-message.ts +9 -0
  164. package/scripts/lib/read-file.ts +26 -2
  165. package/scripts/observations/observation-ledger-home.ts +98 -26
  166. package/scripts/observations/observation-ledger-migrate.ts +26 -21
  167. package/scripts/observations/observation-ledger-prepare.ts +10 -20
  168. package/scripts/observations/observation-ledger.ts +58 -25
  169. package/scripts/observations/observations-flush-cli.ts +6 -23
  170. package/scripts/observations/observations-flush-landing.ts +2 -1
  171. package/scripts/observations/observations-flush.ts +29 -20
  172. package/scripts/package/package-scout-cli.ts +8 -16
  173. package/scripts/ports/port-command.ts +2 -1
  174. package/scripts/propagate/propagate-publish.ts +6 -7
  175. package/scripts/propagate/propagate-steps.ts +2 -1
  176. package/scripts/propagate/propagate.ts +3 -2
  177. package/scripts/refactor/import-graph.ts +2 -6
  178. package/scripts/registry-migration/migrate.ts +3 -2
  179. package/scripts/registry-migration/user-npmrc.ts +2 -2
  180. package/scripts/release/release-cli.ts +2 -1
  181. package/scripts/repo/repo-setting.ts +10 -8
  182. package/scripts/review/review-finding-ledger.ts +3 -3
  183. package/scripts/review/review-findings-cli.ts +4 -11
  184. package/scripts/review/review-record-cli.ts +14 -11
  185. package/scripts/review/review-record.ts +6 -16
  186. package/scripts/rules/decision-oracle.ts +2 -2
  187. package/scripts/rules/rule-body-guard.ts +2 -2
  188. package/scripts/rules/rule-value-cache.ts +99 -0
  189. package/scripts/rules/rule-value-cli.ts +10 -9
  190. package/scripts/rules/rule-value.ts +1 -1
  191. package/scripts/run/run-carry-args.ts +2 -6
  192. package/scripts/run/run-carry-cli.ts +5 -7
  193. package/scripts/run/run-cut-args.ts +7 -13
  194. package/scripts/run/run-ending-cli.ts +4 -7
  195. package/scripts/run/run-event-stream.ts +2 -5
  196. package/scripts/run/run-liveness-cli.ts +4 -7
  197. package/scripts/run/run-progress-args.ts +2 -6
  198. package/scripts/run/run-progress-cli.ts +2 -1
  199. package/scripts/run/run-tail-cli.ts +3 -3
  200. package/scripts/run/run-tidy-stashes.ts +7 -14
  201. package/scripts/run/run-wake-cli.ts +2 -6
  202. package/scripts/run/run-wake-driver.ts +15 -2
  203. package/scripts/run/run-wake-session.ts +14 -4
  204. package/scripts/safe-chain/project-config.ts +3 -6
  205. package/scripts/security/security-audit-provision.ts +6 -7
  206. package/scripts/sonar/sonar-hotspots-cli.ts +2 -1
  207. package/scripts/sync/directory-copy-guard.ts +2 -1
  208. package/scripts/sync/sync-ai-files.ts +3 -3
  209. package/scripts/sync/template-source-logic.ts +3 -4
  210. package/scripts/test/e2e-retry-check.ts +3 -6
  211. package/scripts/ui/ui-routes-cli.ts +3 -6
  212. package/scripts/version/bump-version.ts +2 -1
  213. package/scripts/version/version-remote.ts +18 -27
  214. package/scripts/version/version-targets.ts +3 -3
  215. package/.claude/skills/workflow-commands/rule-residency.md +0 -267
  216. package/evals/scenarios/consult-not-execute.json +0 -20
  217. package/evals/scenarios/no-implicit-workflow.json +0 -26
  218. package/evals/scenarios/overrides-both-locations.json +0 -29
  219. package/evals/scenarios/upstream-interrupt.json +0 -23
  220. package/evals/scenarios/workflow-skill-loaded.json +0 -16
  221. package/prompts/agent-lint-protocol.json +0 -79
  222. package/prompts/agent-rules.md +0 -63
  223. package/prompts/collaboration-workflow/consultation-vs-execution.md +0 -8
  224. package/prompts/collaboration-workflow/distributed-docs.md +0 -7
  225. package/prompts/collaboration-workflow/durable-rules.md +0 -24
  226. package/prompts/collaboration-workflow/latest-first.md +0 -14
  227. package/prompts/collaboration-workflow/no-clones.md +0 -11
  228. package/prompts/collaboration-workflow/simplicity-first.md +0 -9
  229. package/prompts/collaboration-workflow/single-source-rules.md +0 -13
  230. package/scripts/build/shim-shell.ts +0 -25
  231. package/scripts/claude/skill-meta.ts +0 -37
  232. package/scripts/document/document-scan.ts +0 -108
  233. package/scripts/document/generate-catalog.ts +0 -69
  234. package/scripts/document/retired-phrases.ts +0 -143
  235. package/scripts/document/review-agent-type.ts +0 -46
  236. package/scripts/document/single-source.ts +0 -73
  237. package/scripts/git/git-fixture-workspace.ts +0 -88
  238. package/scripts/hooks/format-edited-file-fixtures.ts +0 -109
  239. package/scripts/hooks/prompt-hooks.ts +0 -38
  240. package/scripts/init/hook-command-bootstrap.ts +0 -83
  241. package/scripts/issue/issue-logic.ts +0 -50
  242. package/scripts/josh/__snapshots__/josh-command-map.test.ts.snap +0 -1227
  243. package/scripts/josh/josh-script-reader.ts +0 -11
  244. package/scripts/package/production-dependency-graph.ts +0 -68
  245. package/scripts/retrospective/retrospective-cli.ts +0 -97
  246. package/scripts/retrospective/retrospective.ts +0 -127
  247. package/scripts/rules/delivered-rules-harness.ts +0 -72
  248. package/scripts/rules/top-level-scripts-guard.ts +0 -47
  249. package/scripts/run/run-carry-flush.ts +0 -58
  250. package/scripts/run/run-transcript.golden.txt +0 -57
  251. package/scripts/run/run-wake-work.ts +0 -108
  252. package/scripts/sync/dependabot-pin-logic.ts +0 -135
  253. package/scripts/test/classify-isolation.ts +0 -149
  254. package/scripts/test/http-fault-injection.ts +0 -79
  255. package/scripts/test/josh-harness-environment.ts +0 -260
  256. package/scripts/test/josh-harness.ts +0 -96
  257. package/scripts/test/pilot-files.ts +0 -452
  258. package/scripts/test/pilot-measure.ts +0 -78
  259. package/scripts/test/test-network-guard.ts +0 -453
  260. package/scripts/test/test-repository-guard.ts +0 -317
  261. package/scripts/test/test-state-guard.ts +0 -85
  262. package/scripts/test/test-stdout-guard.ts +0 -54
  263. package/scripts/test/test-telegram-guard.ts +0 -90
  264. package/scripts/test/unit-guard-environment.ts +0 -12
  265. package/scripts/test/unit-projects.ts +0 -139
  266. package/scripts/test/vitest-include-globs.ts +0 -12
  267. package/scripts/time-runtime/time-batch-guard-fixtures.ts +0 -66
  268. package/scripts-ai/completion-gate.ts +0 -13
  269. package/scripts-ai/environment-loader.ts +0 -9
  270. /package/{scripts-ai → scripts/epic}/epic-cli-argv.ts +0 -0
  271. /package/{scripts-ai → scripts/epic}/epic-cli-remove.ts +0 -0
  272. /package/{scripts-ai → scripts/git}/followup-issue-number.ts +0 -0
@@ -76,7 +76,7 @@ Issue には次の要素を必ず含める。
76
76
  - **互換性を壊す変更は影響を本文で宣言する。** 既存の利用者、API、設定の契約を変える場合は、`## 背景` の直下に `- 互換性: 破壊的変更` を書き、廃止対象と影響を説明する。移行措置や事前案内があっても破壊的変更なら宣言する。この宣言があれば `pnpm josh issue:file` が `breaking-change` ラベルを同じ作成リクエストに付ける。互換性を保つ変更には付けない。影響が曖昧なら起票文案で対象の利用者と契約を明確にしてから分類する
77
77
  - **本文が宣言する分類ラベルは `pnpm josh issue:file` がすべて起票時に付ける。** `bug`、`enhancement`、`breaking-change` は組み合わせて付くことがある。`depth`・`route` などのラベルと併せて 1 回の作成リクエストで付け、宣言が無いとき(`issue:lint` の `labels: none`)は分類ラベルを付けない。Issue が `enhancement` と `breaking-change` の両方を持つとき、PR のリリース分類は `breaking-change` 一つにする。Issue の目的の分類と PR のリリース分類を区別する
78
78
  - **`## 発火点`** には、その規則が破れる瞬間に最初に呼ばれるツールコール名を 1 つ書く。名前は `prompts/collaboration-workflow/rule-delivery.md` の配送表に載る、フックで配送可能なツール(`Bash` / `Edit` / `Read` / `Write` / `AskUserQuestion`)と突き合わせる。**表に無い名前**(そもそもツールコール名でない)と**不一致**(既知のツールだが配送できない)は区別して印字され、joshuafolkken/kit#2201 の「規則は正しいが名指ししたコールが実際に破れるコールの 1 つ後ろ」を起票時に検出する
79
- - **`## ベースライン`** は **「コマンド + 値」** で書く。``- `<測定コマンド>` → <現在の値>`` の形に限り、自然文だけの測定説明は受け付けない(再実行できないため)。マージ後に `pnpm josh measure:rerun` が同じコマンドをやり直し、**before / after の対**を印字する。値が動かなかったとき、反証された前提として `docs/maintainers/observations.md` に 1 行追記される(既存の append-only 台帳を使い、別の台帳は作らない)
79
+ - **`## ベースライン`** は **「コマンド + 値」** で書く。``- `<測定コマンド>` → <現在の値>`` の形に限り、自然文だけの測定説明は受け付けない(再実行できないため)。マージ後に `pnpm josh measure:rerun` が同じコマンドをやり直し、**before / after の対**を印字する。値が動かなかったとき、反証された前提として `docs/maintainers/observations/` の、その時点のブランチが指す Issue のファイルに 1 行追記される(既存の append-only 台帳を使い、別の台帳は作らない)
80
80
  - **`## 再現`** は **「コマンド + 実際の出力」** で書く。コマンドを backtick、出力をフェンス(``` または ~~~)で囲む。自然文の「確認した」は再実行できないため受け付けない(`## ベースライン` と同じ理由)。読みだけの起票を起票時に弾くためである
81
81
  - **検査は `pnpm josh issue:lint <path>` が行う。** 対象判定・3 見出しの有無・発火点の配送可否・ベースラインが「コマンド + 値」か・再現が「コマンド + 実際の出力」かと、起票時に必要な分類ラベルを、起票前の本文ファイルからまとめて答える(`pnpm josh issue:file` は起票前に同じ検査を行い、問題があれば起票しない)
82
82
 
@@ -94,7 +94,7 @@ Issue には次の要素を必ず含める。
94
94
 
95
95
  - **見出しは固定する**。「書いた人が置いた場所」ではなく grep で機械的に見つかるようにするため。起票元 Issue 側は、その場で本文を書いている最中なら本文に、既に本文が確定しているなら同じ見出しでコメントに書く
96
96
  - **リンクは必ずリポジトリ修飾する**(`owner/repo#N` または完全 URL)。**裸の `#N` を使ってはならない** — 上流リポジトリ内では同番号の別 Issue に解決され、黙って誤ったものを指す
97
- - **チェックボックス行(`- [ ] owner/repo#N`)で書いてはならない。散文か素の箇条書き(`- owner/repo#N`)にする。** `scripts/git/git-epic-parse.ts` の `has_external_task_list_entry` は「チェックボックス付きで他リポジトリを参照する行」を検出すると epic の自動クローズを無効化する。これは**本物の他リポジトリ子 Issue に対しては正しい挙動**(その状態は別リポジトリを指定しないと読めないため)だが、単なる後方参照をその記法で書くと epic が永久に open のまま残る。判定はチェックボックスの有無だけを見るので、素の箇条書きは安全である
97
+ - **チェックボックス行(`- [ ] owner/repo#N`)で書いてはならない。散文か素の箇条書き(`- owner/repo#N`)にする。** `scripts/epic/epic-parse.ts` の `has_external_task_list_entry` は「チェックボックス付きで他リポジトリを参照する行」を検出すると epic の自動クローズを無効化する。これは**本物の他リポジトリ子 Issue に対しては正しい挙動**(その状態は別リポジトリを指定しないと読めないため)だが、単なる後方参照をその記法で書くと epic が永久に open のまま残る。判定はチェックボックスの有無だけを見るので、素の箇条書きは安全である
98
98
  - **未起票の候補には `## Upstream candidate` を使い、`## Upstream issues` を使わない**。後者は「既に起票した」ことを主張する見出しであり、third-party リポジトリへの報告はユーザーの明示指示があるまで起票しないため、両者は必ず別の見出しに置く(→「第三者リポジトリへの書き込みは Tier C(明示指示が必要)」)
99
99
  - 割り込みで起票する場合の手順は「別パッケージ起因の問題は割り込み Issue で対応する」、分割で起票する場合は下記 epic 節を参照
100
100
 
@@ -104,7 +104,7 @@ Issue には次の要素を必ず含める。
104
104
 
105
105
  なぜ必要か: 分割の根拠を「最初の Issue のコメント」に置くと、その Issue はバッチが最初にマージしてクローズする対象でもあるため、残りの作業の設計図がクローズ済み Issue の中に埋もれる。epic の役割は、その情報の**閉じない置き場**を用意することにある。実行順序は epic が載せられる情報の一つであって、epic が存在する理由ではない。埋没は順序の有無と無関係に、複数分割のたびに起きる。
106
106
 
107
- - **条件分岐を置かない。** 「件数が少ないうちは epic の管理コストが情報整理の利益を上回る」という以前の但し書きは、`scripts/git/git-epic-close.ts`(`pnpm josh followup` から駆動)が子 Issue の全クローズを検知して epic を自動クローズするようになった時点で根拠を失った。放置される epic という管理コストがもう存在しない以上、避けるべきは分岐の誤判定だけである。2 件・順序不問の分割に epic が付く冗長さは軽微で、分岐の見落としによる情報消失より常に安い
107
+ - **条件分岐を置かない。** 「件数が少ないうちは epic の管理コストが情報整理の利益を上回る」という以前の但し書きは、`scripts/epic/epic-close.ts`(`pnpm josh followup` から駆動)が子 Issue の全クローズを検知して epic を自動クローズするようになった時点で根拠を失った。放置される epic という管理コストがもう存在しない以上、避けるべきは分岐の誤判定だけである。2 件・順序不問の分割に epic が付く冗長さは軽微で、分岐の見落としによる情報消失より常に安い
108
108
  - epic には `epic` ラベルを付ける(未作成なら `gh api repos/{owner}/{repo}/labels -f name=epic -f color=5319e7 -f description="Tracks a batch of child issues from one split" --silent 2>/dev/null || true`)。放置された open epic を `gh api "repos/{owner}/{repo}/issues?labels=epic&state=open"` で棚卸しできるようにするため
109
109
  - **epic 自体を実装ランに渡してはならない。** epic には成果物がなく、`backlogrun #<E> --only` がその子 Issue を回す
110
110
  - epic は最後の子 Issue がクローズされた時点で `pnpm josh followup` が自動クローズする。マージ後に `epic` ラベルの open な Issue を探し、タスクリストの子が全てクローズ済みなら子を列挙したコメント付きで閉じる。1 件でも open なら放置し、この処理の失敗は警告のみでランを止めない。最終 PR に `closes #<epic>` を書く方法は、バッチが途中で失敗したときにも発火して未完了を完了扱いにするため採用しない
@@ -131,7 +131,7 @@ pnpm josh epic "<epic-title>" <N1> <N2> --origin <owner/repo#N>
131
131
 
132
132
  このコマンドは上記 4 要件を**構成上**満たす。ラベルを用意してから付与し、子をタスクリスト記法で描画し、`Dependencies` を `--ordered` の有無で矢印連鎖/`None — ...` 固定文に振り分け、`Execution` の実行コマンド(`backlogrun #<E> --only`)を組み立てる。`--ordered` のときは同じ入力から native な依存関係も付与するので、**本文の宣言と native な依存関係が食い違うことがない**(手順 4 の付け忘れが構造的に起きなくなる)。付与は REST の依存関係エンドポイント(`gh api`)を通るため、**`gh` CLI のバージョンには依存しない**(joshuafolkken/kit#1026)。このエンドポイントはブロッカーを Issue 番号ではなく **database id** で受け取り、しかもその id が自リポジトリの Issue かを検証しないため、コマンドは書き込み前に番号から id を解決する。付与は Issue の作成後に独立して行うので、失敗しても件数を報告して続行する(失われるのは関係だけで、Issue とタスクリストは既に正しい)。
133
133
 
134
- 作成済みの epic は `pnpm josh epic:check <E>` で 4 要件を点検できる。手書きした epic、コマンド導入以前の epic、本文を手で編集した後の確認に使う。全要件を満たせば exit 0、満たさなければ exit 1 なのでゲートとしても使える。判定は自動クローズが読むのと**同じパーサ**(`scripts/git/git-epic-parse.ts`)を使うため、「自動クローズが読める形式」と「点検が通る形式」は定義上一致する。
134
+ 作成済みの epic は `pnpm josh epic:check <E>` で 4 要件を点検できる。手書きした epic、コマンド導入以前の epic、本文を手で編集した後の確認に使う。全要件を満たせば exit 0、満たさなければ exit 1 なのでゲートとしても使える。判定は自動クローズが読むのと**同じパーサ**(`scripts/epic/epic-parse.ts`)を使うため、「自動クローズが読める形式」と「点検が通る形式」は定義上一致する。
135
135
 
136
136
  作成手順(フォールバック): **`josh` が使えない環境でのみ**、以下を手で行う。
137
137
 
@@ -13,18 +13,15 @@
13
13
  - 修正できなかった場合: `--notify-message` に失敗チェック名・原因・未解決である旨を記載する。**完了コメントに失敗を隠してはならない**
14
14
  - ユーザーへの報告も失敗の事実を正直に伝える(「成功」として扱わない)
15
15
 
16
- ### auto-merge と `completion` 通知(本文は手順書にある)
16
+ ### ほかの単一ソースにある規則
17
17
 
18
- **auto-merge(`fullrun` の既定)と `completion` 通知の本文は、[`.claude/skills/workflow-commands/followup.md`](../../.claude/skills/workflow-commands/followup.md) にある。** かつてはこのファイルにも「Auto-merge(default for `fullrun`)」「`completion` 通知は `pnpm josh followup` 経由のみ」の 2 節として全文が重複していたが、joshuafolkken/kit#1187 で手順書へ単一ソース化した。`fullrun` と打つこと自体がマージの承認であること、CI がオールグリーンでも未対応の AI レビュー指摘があればマージしないこと、マージ後の `pnpm josh ms`、`completion` Telegram を手で打たないこと、`pnpm josh followup` を前景で実行することは、いずれもそこが単一ソースである。
18
+ このファイルにかつて書き直されていた規則は、次の単一ソースにある。ここには繰り返さない。単一ソース化の経緯は `docs/maintainers/operating-rules-rationale.md` → "Rules that moved to their single source" にある。
19
19
 
20
- ### 明示的な起動が必須(MANDATORY)
21
-
22
- `kickoff` / `halfrun` / `fullrun` / `backlogrun` ワークフロー(`#N` および `new` バリアントを含む)は、ユーザーが**現在のターンのプロンプト**にキーワードを入力していない限り、絶対に開始してはならない。
23
-
24
- - 「実装して」「修正して」「PR を出して」などの会話的な依頼は暗黙の起動ではない。タスクがこれらのワークフローに該当すると判断した場合でも、依頼の形状から起動を推測してはならない
25
- - 「`halfrun new` を実行してもよいですか?」「`fullrun` を回しますか?」のような確認質問もしてはならない。確認プロンプトは明示的な起動の代替にはならない
26
- - 代わりに、**ユーザー自身にコマンドを入力してもらうよう促す**。次の形式を使う: 「このタスクは \`<command>\` で起動してください」。例: 「このタスクは \`halfrun new\` で起動してください」「Issue を実行するには \`fullrun #412\` を実行してください」。ユーザーが次のターンで自分でコマンドを入力する
27
- - 過去のターンで関連ワークフローを承認していた場合でも、このルールは適用される。各起動は現在のターンでユーザーが再入力する必要がある
20
+ - **auto-merge と `completion` 通知** — `.claude/skills/workflow-commands/followup.md` → "`auto-merge` — Default `fullrun` behavior" と `.claude/skills/workflow-commands/followup.md` → "Completion notifications: always via `pnpm josh followup`"
21
+ - **明示的な起動が必須** — `CLAUDE.md` → "Explicit invocation required (MANDATORY)"(常駐)と `.claude/skills/workflow-commands/SKILL.md` → "0. The rule that fires before any of them — explicit invocation"(スキル側の単一ソース)
22
+ - **確認待ちで停止するときの Telegram 通知** — `CLAUDE.md` → "Mid-workflow stop notification (`confirmation`)"
23
+ - **作業ツリーは 1 本のランが保持する(`josh run:hold`)** — `.claude/skills/workflow-commands/working-tree-hold.md` → "The working-tree hold — one run per tree"
24
+ - **overrides の保護** — `.claude/skills/dependency-update/SKILL.md` → "1. Effective overrides live in the workspace — inspect both files"
28
25
 
29
26
  ### 指示されていない行動は取らない
30
27
 
@@ -36,14 +33,13 @@ PR マージ・ブランチ削除・force push・共有ブランチへの push
36
33
  - **`gh pr merge` の直接実行は kit 配布の `.claude/settings.json` の `deny`(`Bash(gh pr merge*)`)で機械的に遮断されている。** `fullrun` の auto-merge は `pnpm josh followup` が node スクリプト内部から gh を起動するため影響を受けない — Bash マッチャに見えるのは `pnpm josh …` だけである。**ただし deny は実装であって規則ではない** — パターンが取りこぼす綴りを禁じているのは本節の規則のほうである
37
34
  - **同じ規則が禁じる force push とブランチ削除も deny に載っている**(joshuafolkken/kit#1062)。`Bash(git push *--force*)` / `Bash(git push * -f)` はフラグを引数の後ろに書いた綴りを、`Bash(git push *--delete*)` / `Bash(git branch -d*)` / `Bash(git branch -D*)` / `Bash(gh api *DELETE*git/refs/heads/*)` はブランチ削除を止める。**deny は規則より狭いが、その差は配送ガードが埋めている** — `git -C` を前置した綴り、短縮フラグをまとめた綴り(`git push -uf`)、`:` をリテラルにできず glob が照合できない `git push origin :branch` は、いずれも `pnpm josh rule:guard` の `git-force` 行が argv を解析して拒否する(joshuafolkken/kit#2120)。**「マージ経路は deny が保証している」とは読まないこと**
38
35
  - **共有状態に影響する操作(このセクションの対象=Tier C)は迷ったら確認する。** 確認のコストは低いが、意図しない操作の巻き戻しは高コスト
39
- - ただしこの「迷ったら確認」は Tier C に限る。**可逆な実装・設計判断(Tier A)は別ルール**(CLAUDE.md「Decision autonomy」の3層ポリシー)に従い、明確に優位な選択肢は確認せず自動で選んで記録する — 本当に甲乙つけがたい(Tier B)ときだけ確認する。下記「意思決定の自律ポリシー」を参照
36
+ - ただしこの「迷ったら確認」は Tier C に限る。**可逆な実装・設計判断(Tier A)は別ルール**(下記「意思決定の自律ポリシー」)に従う
40
37
 
41
38
  ### git index を勝手に変更しない(自律 staging の禁止)
42
39
 
43
- **git の index(ステージング領域)はユーザーのものである。** ユーザーは「後の変更を差分で見るための基準スナップショット」として意図的にステージしていることがあり、`git add` / `git add -A` / `git rm --cached` / `git restore --staged` はそれを上書きする。index には履歴がないため、**上書きされた直前のステージ状態は復元できない**。
40
+ 規則そのもの — index はユーザーのスナップショットであり、自分の判断でステージ・コミットしない — は `CLAUDE.md` → "Git Rules" に常駐している。ここに書くのは、その規則を実行するときの細則である。index には履歴がなく、上書きされた直前のステージ状態は復元できない(経緯は `docs/maintainers/operating-rules-rationale.md` → "Why the index is the user's")。
44
41
 
45
- - **調査目的の staging は絶対に行わない。** 「diff stat を出したい」「未追跡ファイルの中身を差分で見たい」といった理由で `git add` してはならない。これが実際に事故(ユーザーが意図的に作ったスナップショットの破壊)を起こしたケースがある
46
- - **調査は読み取り専用コマンドで行う**:
42
+ - **調査目的の staging は絶対に行わない。** 調査は読み取り専用コマンドで行う:
47
43
  - 変更ファイル一覧: `git status --short`
48
44
  - 作業ツリーの差分: `git diff` / `git diff --stat` / `git diff HEAD`
49
45
  - ステージ済みの差分: `git diff --staged`(読み取りのみ、index は変えない)
@@ -55,69 +51,16 @@ PR マージ・ブランチ削除・force push・共有ブランチへの push
55
51
  - **レーンの中で競合を解決したあとの「解決済み」の記録は、ケース 2 に含まれる(Tier A)。** レーンは run 専用の作業ツリーで、守るべき利用者の staging はない。利用者に `git add` の許可を求めず、`pnpm josh git -y` で記録する。手順は `.claude/skills/workflow-commands/chain-rule.md` →「origin/main is merged in before the gate」の 1 か所にだけ書く(joshuafolkken/kit#2445)
56
52
  - 同じ理由で、`git reset` / `git checkout -- <path>` / `git restore <path>` など index や作業ツリーを破壊的に書き換える操作も、自分の判断で実行しない
57
53
  - **`git stash` は例外的に、明文化されたフローの中でのみ自動実行してよい**: `fullrun new` / `halfrun new` の手順 5(作業ツリーに変更がある状態で `josh latest` を回す前の退避)、`backlogrun` のラン開始時の `josh latest`、「別パッケージ起因の問題は割り込み Issue で対応する」、および `backlogrun` が epic の子を始める前の preflight(`pnpm josh run:hold <N>` が `reclaim` と答えたときの回収 — joshuafolkken/kit#926, joshuafolkken/kit#1965)。**この 5 番目だけが復元を伴わない。前の 4 つはいずれも直後に `pnpm josh stash:pop "<メッセージ>"` で復元することが手順に含まれている**(stash はリポジトリ単位の 1 本のスタックを全 work tree が共有するため、位置指定や引数なしの `git stash pop` は別のレーンが最後に積んだ stash を取り込む — メッセージで対象を特定する。joshuafolkken/kit#2050)。 回収するのは異常終了したランの置き土産であって、いま実行中のランの作業ではないから、pop して戻す先がない。**代わりに stash を子の Issue にコメントで記録する** — 前提 Issue で中断するときの stash(`SKILL.md` §2d)と同じく、**その記録だけが後で pop させられる唯一の手がかり**であり、記録し忘れた stash は誰にも拾われない。これら以外の場面で退避したくなったときは、実行せずに先に確認する
58
- - **この禁止は kit 配布の `.claude/settings.json` の `deny`(`Bash(git add*)` / `Bash(git stage*)` / `Bash(git rm*)` / `Bash(git mv*)` / `Bash(git reset*)` / `Bash(git restore --staged*)` / `Bash(git restore -S*)` / `Bash(git commit*)`)で機械的にも遮断されている。** `pnpm josh git` は node スクリプト内部から git を起動するため影響を受けず、承認済みのコミットフロー(上記ケース 2)は従来どおり動く。**deny には「そのターンでユーザーが明示指示した」という例外がないため、上記ケース 1 も AI 側では実行できない** — その場合はユーザー自身の端末で実行してもらう(ユーザーの手元では従来どおり動く)。恒久的な機械的保証のほうが、コマンド 1 本で回避できる例外より価値が高いという判断(joshuafolkken/kit#850)
59
- - **`Bash(git commit*)` だけはステージング操作ではないが、同じ deny に入っている。** `git add` を拒否されたエージェントが次に手を伸ばすのが `git commit -a`(追跡済みファイルをまとめてステージしてコミットする)であり、それも拒否されると素の `git commit -m` である。フラグ単位で塞いでいる限りこの退避路は最後の 1 本が残るため、joshuafolkken/kit#1075 でサブコマンド全体へ広げた。**ユーザーが明示的にコミットを指示した場合も AI 側では実行できない点は上と同じ** — 承認済みのコミットは `pnpm josh git` を通す
54
+ - **この禁止は kit 配布の `.claude/settings.json` の `deny`(`Bash(git add*)` / `Bash(git stage*)` / `Bash(git rm*)` / `Bash(git mv*)` / `Bash(git reset*)` / `Bash(git restore --staged*)` / `Bash(git restore -S*)` / `Bash(git commit*)`)で機械的にも遮断されている。** `pnpm josh git` は node スクリプト内部から git を起動するため影響を受けず、承認済みのコミットフロー(上記ケース 2)は従来どおり動く。**deny には「そのターンでユーザーが明示指示した」という例外がないため、上記ケース 1 も AI 側では実行できない** — その場合はユーザー自身の端末で実行してもらう。**ユーザーが明示的にコミットを指示した場合も同じで**、承認済みのコミットは `pnpm josh git` を通す(`git commit` まで deny に入れた理由は `docs/maintainers/operating-rules-rationale.md` → "Why the index is the user's")
60
55
  - **「拒否される操作」と「禁止された操作」は同じ集合ではない。** deny に載っているのは上記の直接実行だけだが、このセクションが同じく禁じている `git checkout -- <path>` / `git restore <path>` / 認可外の `git stash`(bare・メッセージ無し push・位置指定 pop など。メッセージ付き `git stash push -m` と `pnpm josh stash:pop` は認可済みなので通る)は、`pnpm josh rule:guard` の `worktree-mutation` 行が拒否する(joshuafolkken/kit#2120)。**ツールが通したことを許可と読み替えてはならない** — 何をしてよいかを決めるのは deny でも配送ガードでもなくこのルールである(フックは Claude Code にしか届かない)
61
- - このルールは横断ドキュメント(CLAUDE.md「Git Rules」→「Never stage or mutate the git index on your own」)のカノニカル参照
62
56
 
63
57
  ### 意思決定の自律ポリシー(確認停止を減らす)
64
58
 
65
- AI ツール(Opus / Gemini / Cursor)が判断の分岐で止まりすぎるのを防ぐため、各判断を3層に分類して扱う。停止して確認するのは**本当にユーザーの判断が必要な分岐だけ**にする。このセクションが横断ドキュメント(CLAUDE.md「Decision autonomy」)のカノニカル参照。
66
-
67
- - **Tier A — 可逆な実装・設計判断**(明確に優位な選択肢があるライブラリ選定、命名、ファイル構成、テスト手法、リファクタの形)。メリット比較で1案が明確に優位なら**確認せず自動で選んで進める**。本来ユーザー確認すべき分岐だった場合は、後から監査・差し戻せるよう判断を記録する(下記「自動判断の記録」)
68
- - **Tier B — 本当に甲乙つけがたい判断**。上位2案がどちらも妥当で差が僅差。**ここだけが停止する層** — ユーザーに確認する(`AskUserQuestion` が使えるなら使う)。拮抗する候補とトレードオフを提示する
69
- - **起票した Issue の所属先は、候補が複数の epic に散っていても Tier B ではない**(joshuafolkken/kit#1339)。`epic --add` 1 回で移せるので推奨する 1 つを選び、採用・却下・理由・決定日を Issue と epic の両方に記録して進む。止まるのは 2 つの epic が本当に甲乙つけがたいときだけである
70
- - **Tier C — 不可逆・共有状態・スコープ外の操作**(マージ、ブランチ削除、force push、破壊的操作、リポジトリ設定変更、タスク範囲外の変更、`devEngines` / overrides の編集(`pnpm-workspace.yaml` `overrides:` と `package.json` `pnpm.overrides` のいずれも))。**このポリシーの対象外。** 1案が明確に優位に見えても、常にユーザーの明示指示を要する。既存の安全ルール(上記「指示されていない行動は取らない」、`devEngines` / overrides 保護)が優先される
71
-
72
- **A と B の判定基準**: 確認するのは「差が僅差 **かつ** 後戻りしにくい/アーキテクチャに長く影響する」ときだけ。「迷っている」だけでは停止理由にならない — 明確に優位な選択肢は多少の不確実性が残っても自動で選び、僅差でも安価に巻き戻せる選択は自動で決めて記録して進む。
73
-
74
- **Tier A に含まれる「自己修正」**: 次の 2 つは設計判断ではなく後始末であり、**確認せずに実行してよい**。
75
-
76
- - **自分が公開した成果物の事実誤りの訂正**: Issue / PR コメントや Issue 本文の誤記・誤った帰属(例: 欠陥を実際とは別のパッケージに帰属させた記述)を、自分で訂正する
77
- - **同じセッションで自分が特定した、自分の作業の抜けの穴埋め**: 例として、欠けていると自分で指摘した相互リンクを後から追加する
78
-
79
- どちらも可逆で、望ましい結果が 1 つしかなく、放置をユーザーが選ぶことはない。**この半分に回避策のリスクはない** — 問題を迂回するのではなく、既に行った作業を修復するだけだからである。
80
-
81
- - **「相談と実行を区別する」との境界**: ここでの Tier A は **すでに承認され実行された作業を完了・修復する**ことに限られる。目標の表明(「〜したい」)や進め方への問い(「どうすべき?」)に対して勝手に動いてよい、という意味ではない(→「相談と実行を区別する(議論中にファイルを編集しない)」)
82
- - **Tier C との境界(再掲)**: 自分のコメントの訂正は Tier A。マージ・ブランチ削除・force push・スコープ外の変更は、**その問題を招いたのが自分自身であっても** Tier C のまま
83
- - 記録は下記「自動判断の記録」に従う。確認を外しても監査証跡は外さない
84
-
85
- **自動判断の記録**: 本来確認すべき Tier A の分岐を自動判断したときは、候補と理由を記録する:
86
-
87
- - Issue 駆動ワークフロー内(`kickoff` / `halfrun` / `fullrun` / `backlogrun`): `pnpm josh issue:comment <N> --body-file <path>` で、採用案・不採用の代替案・なぜ採用案が明確に優位かを記載する
88
- - Issue が存在しない会話タスク: 同じ内容を「Auto-decided: `<choice>` over `<alt>` because `<reason>`」の1行として応答に明示する
89
-
90
- ### 確認待ちで停止するときの Telegram 通知(`confirmation`)
91
-
92
- `kickoff` / `fullrun` 実行中に AI ツールがユーザーの確認・承認・指示待ちで停止するときは、停止の **直前に** Telegram 通知を 1 回送る。これにより、画面を見ていなくてもユーザーが応答すべきタイミングに気付ける。
93
-
94
- ```bash
95
- pnpm josh notify --task-type confirmation --issue-url "<issue-url>" --body=$'<停止理由>\n<ユーザーに求める判断>'
96
- ```
97
-
98
- - 本文が `-` で始まる場合は `--body=...` の形式(1 トークン)で渡す。スペース区切りでは `parseArgs` がエラーになる
99
- - 同一の停止に対して通知は 1 回のみ。再評価のたびに送らない
100
- - ユーザー自身がそのターンで停止を指示した場合は通知しない(既に把握しているため)
101
-
102
- ### 作業ツリーは 1 本のランが保持する(`josh run:hold`)
103
-
104
- 手順の単一ソースは `.claude/skills/workflow-commands/SKILL.md` → 「2f. The working-tree hold — one run per tree」にある。ここに書くのは、キーワードが打たれていないターンでも読まれる位置に、引き金だけを置くためである。
105
-
106
- `fullrun` / `halfrun` は、**他の何よりも先に `pnpm josh run:hold` を実行し、その答えに従う**。`busy` または `unknown` なら、`confirmation` Telegram を送って停止する — **起票もブランチ作成もファイル編集もしない**。`new` 系の入口では起票より前に問う。起票してから気付けば、掃除すべき副作用が残るためである。
107
-
108
- **`kickoff` は対象外である**(joshuafolkken/kit#1799)。このガードが守るのは 1 本のブランチ・1 つの index・1 つの未コミット差分であり、`kickoff` はそのいずれにも触れない — Issue を読み、タイトルを正規化し、計画を投稿し、通知して止まる、そのすべてが GitHub 側の操作である。取得させると、そのランが決して乱さない資源のために、無関係なランの実行中ずっと計画作業が止まっていた。取得しない以上、解除もしない。
109
-
110
- **解除は、どのランのものかを名乗る**(joshuafolkken/kit#1799)。`pnpm josh run:release <N>` は記録が `<N>` を名乗るときだけ削除し、引数なしの形は未採番ランの記録だけを削除する。それ以外のランの記録なら `held` を返して何も消さない。以前はそこにある記録を無条件に消していたため、`busy` の停止メッセージが案内する復旧手順そのものが、稼働中のランの作業ツリーを解放する経路になっていた。本当に放棄された記録を消すのは `pnpm josh run:release --force` だけである。
111
-
112
- **判定の単位は作業ツリーであり、リポジトリではない。** `backlogrun` が使う `epic-busy.ts` はリポジトリに問う読み取りで、「1 リポジトリにつき同時 1 子」を実装している。これらの入口が奪い合う資源は 1 本のブランチ・1 つの index・1 つの未コミット差分であり、別 worktree ならそれらは別々に存在するので競合しない。ここでリポジトリ単位の判定を使うと、正当な 2 本目まで止まる。**`backlogrun` 側の既存ガードは変更しない** — 両者は別の資源を守っており、片方が片方を置き換えることはできない(joshuafolkken/kit#1091)。
113
-
114
- ### overrides の保護(`pnpm-workspace.yaml` / `package.json` の両方を見る)
115
-
116
- overrides に設定された制約は、**セキュリティ・互換性・動作保証のために意図的に追加されたもの**である。
117
-
118
- **実効のある overrides は `pnpm-workspace.yaml` に置く。** pnpm 11 と 12 は `package.json` の旧 `pnpm.overrides` を無視する(pnpm 12.6.0 で実測)。両ファイルの既存宣言を点検して意図しない変更を防ぐが、旧欄を有効な override と数えてはならない。**`pnpm.overrides` が空、あるいは `pnpm` フィールドが無いことは、そのプロジェクトに overrides が無いことの証拠にはならない。** app-kit でも実効のある設定は workspace 側にある(kit #740)。
59
+ 3 層の定義(Tier A / B / C)、起票した Issue の epic 所属と自己修正が Tier A であること、自動判断の記録先は `CLAUDE.md` → "Decision autonomy (minimize confirmation stops)" に常駐している。ここに書くのは、その境界の細則である。
119
60
 
120
- - **確認は「実行するコマンド」であって「到達する結論」ではない。** `josh latest` / `pnpm update --latest` などの依存更新コマンドの実行後は、`git diff -- pnpm-workspace.yaml package.json` を実行し、`overrides:` ブロックと `pnpm.overrides` の双方が無傷であることを確認する
121
- - `josh latest` は overrides の判定を自分で出力する(最後の overrides 行が `✔ overrides unchanged (<n> from <file>)`、変化していれば `⚠ overrides changed` 警告)。`pnpm josh overrides` は実効のある workspace 設定をスナップショットと比較し、無視される package 側の宣言も報告する。**実際に出力された行を引用して報告する**こと — 推測した判定を書いてはならない
122
- - overrides が自動的に変更・削除された場合は、**理由を調査してから**ユーザーに報告し、明示的な承認なしに変更してはならない
123
- - 例: `"esbuild@<=0.24.2": ">=0.25.0"` などのバージョン制約は、Workers ビルド互換性やパッケージの動作保証のために入れてある場合がある
61
+ - **A と B の判定基準**: 確認するのは「差が僅差 **かつ** 後戻りしにくい/アーキテクチャに長く影響する」ときだけ。「迷っている」だけでは停止理由にならない — 明確に優位な選択肢は多少の不確実性が残っても自動で選び、僅差でも安価に巻き戻せる選択は自動で決めて記録して進む
62
+ - **起票した Issue の所属先は、候補が複数の epic に散っていても Tier B ではない**(joshuafolkken/kit#1339)。`epic --add` 1 回で移せるので推奨する 1 つを選び、採用・却下・理由・決定日を Issue と epic の両方に記録して進む。止まるのは 2 つの epic が本当に甲乙つけがたいときだけである
63
+ - **自己修正**は設計判断ではなく後始末である — 自分が公開した成果物の事実誤り(誤った帰属を含む)の訂正と、同じセッションで自分が特定した自分の作業の抜けの穴埋め(例: 欠けていると自分で指摘した相互リンクの追加)。どちらも可逆で、望ましい結果が 1 つしかなく、問題を迂回せず既に行った作業を修復するだけなので、回避策のリスクはない
64
+ - **「相談と実行を区別する」との境界**: ここでの Tier A は **すでに承認され実行された作業を完了・修復する**ことに限られる。目標の表明(「〜したい」)や進め方への問い(「どうすべき?」)に対して勝手に動いてよい、という意味ではない(→ `principles.md` → "相談と実行を区別する")
65
+ - **Tier C との境界**: 自分のコメントの訂正は Tier A。マージ・ブランチ削除・force push・スコープ外の変更は、**その問題を招いたのが自分自身であっても** Tier C のまま。確認を外しても監査証跡は外さない
66
+ - **自動判断の記録の書き方**: Issue 駆動ワークフロー内では `pnpm josh issue:comment <N> --body-file <path>` で、採用案・不採用の代替案・なぜ採用案が明確に優位かを記載する
@@ -0,0 +1,74 @@
1
+ # 原則
2
+
3
+ **このファイルは、`CLAUDE.md` の Communication 節が指す 7 つの原則の単一ソースである。** 各節は `CLAUDE.md` から `prompts/collaboration-workflow/principles.md` → "見出し" の形で引かれ、`pnpm josh doc:section` で解決する。経緯と適用例は各節が指す [`docs/maintainers/principles-rationale.md`](../../docs/maintainers/principles-rationale.md) の節にあり、実行中には読まない。
4
+
5
+ ## クローン禁止・単一ソース化(パッケージ境界を越えても)
6
+
7
+ 既存の非自明なロジックを「ソースを変えずに済ませる」ために**コピー・移植・再実装することは既定で禁止**する。すでにどこか(別ファイル・別モジュール・別**パッケージ=上流依存を含む**)に存在するロジックを複製しようとした瞬間が、**単一ソース化**(全消費者が import する共有モジュール/export/パッケージ)のシグナルである。コピーではなく単一ソース化する。
8
+
9
+ - **既存の重複は再重複の免罪符にならない**: すでに一度クローンされている(例: jgame が kit をコピー)なら、共有抽象化はとっくに必要だったということ。3 つ目のコピーを足さず、重複の存在を surface する
10
+ - **「上流を参照する」は「再利用する」の意**であって、「そのコードを貼り付ける」ではない
11
+ - **「X を触るな」という制約はクローンを黙って正当化しない**: クリーンな修正には上流(kit)の変更が要る/代替はクローン、というトレードオフを先にユーザーへ提示する(「クリーンな修正は kit の変更が必要、代替はクローン、どちらにする?」)
12
+ - 複製は、単一ソース化の代替案とそのコストを提示し、**ユーザーの明示承認を得た後にのみ**行う
13
+
14
+ **計測は `pnpm josh clone:scan`。** 同一リポジトリ内および `JOSH_REPO_PATHS` の他リポジトリを跨いだ複製を検出し、**件数**と各複製の `file:line`(`[same-file|cross-file|cross-repo]` 分類つき、複製なしは `clean`)を印字する。`pnpm josh oracle:list` に載る決定オラクルでもある(導入の経緯は `docs/maintainers/principles-rationale.md` → "Why clone:scan exists")。
15
+
16
+ ## 設計はエレガント・シンプルを第一目標にする
17
+
18
+ 新しい仕組み(フック・ガード・ルール・抽象化)を足す前に、**原因側を直せばその仕組みが要らなくならないか**を先に問う。要らなくなるなら、足さない。症状を叱る仕組みを重ねるのではなく、症状を生んでいる材料を断つ。
19
+
20
+ - **問いは 1 つ**: 「この仕組みは、どこかの原因を直せば不要にならないか」。答えが「不要になる」なら、仕組みではなく原因を直す。
21
+ - **足す前に断つ**: 検出・通知・叱責を強化する前に、その入力を生んでいる側を探す。入力が消えれば、それを捌く仕組みそのものが消える。適用例は `docs/maintainers/principles-rationale.md` → "An application of simplicity-first"。
22
+
23
+ **書かれたコードの可読性**(意図が伝わる命名、過度な抽象化を避ける、など)は `prompts/coding-standards.md` の担当で、こちらは**設計時にどの仕組みを足すか・どこへ置くかを決める**規則。両者は別レイヤーなので、片方の本文をもう片方へ写さず、互いを指すだけにする。
24
+
25
+ ## 相談と実行を区別する(議論中にファイルを編集しない)
26
+
27
+ ユーザーが「どう進めるべきか」「何をすべきか」「なぜそうなったか」を尋ねたり、目標・願望を述べたりした(「どうすべき?」「how should we…」「なぜ」「理由を知りたい」「〜したい」「〜の方が良い?」)ときは、**分析と推奨のみ**で応答する。ファイル編集・Issue 作成・その他の具体的アクションは取らない。
28
+
29
+ - 具体的アクションを取ってよいのは、明示的な命令(「do it」「書き換えて」「作成して」「implement」)またはワークフローキーワード(`kickoff` / `halfrun` / `fullrun` / `backlogrun`)があるときだけ
30
+ - 曖昧なときは propose-and-wait を既定とする(「これを実行してよいか?」と尋ねる)
31
+ - **目標の表明は「計画の依頼」であって「実行の承認」ではない**
32
+
33
+ ## 最新優先・fix-forward(pin-back は最終手段)
34
+
35
+ 依存パッケージ・ツールチェーンは**既定で最新版を採用する**。バンプが lint クラッシュ・新規有効化ルール・型エラーなどの破壊を引き起こしても、古いバージョンへ留まる/戻すことを既定の「安全策」にしてはならない。破壊は**前向きに(fix-forward)速やかに**解消する。
36
+
37
+ 1. **最新優先(latest-first)**: 依存・ツールチェーンは新しいバージョンを既定で採用する。適応の手間を避けるためだけに古いバージョンに留まったり戻したりしない
38
+ 2. **破壊は fix-forward**: バンプで lint クラッシュ・新規ルール・型エラー等が出たら、前向きに解消する:
39
+ - 新ルール/エラーが正当なら **消費者コードを直す**
40
+ - ルール上書きが要るなら **正しいレイヤー**(kit / app-kit の共有設定)でスコープする。消費者リポジトリでの場当たり的な一回限りの disable にしない
41
+ - 破壊が first-party パッケージ(kit / app-kit)起因なら、**そこに Issue を立てて適切な altitude で直す**。消費者側の回避だけで済ませない(→ `upstream-interrupt.md`)
42
+ 3. **pin-back は最終手段**: fix-forward が本当に不可能/ブロックされている(例: 未リリースの上流修正待ち)ときだけ、古いバージョンへ固定する。固定するときは **理由を記録し、最新へ戻すためのトラッキング Issue を立てる**。pin-back を既定の推奨として提示してはならない
43
+ 4. **既存の保護を尊重する**: fix-forward は保護された pin を黙って書き換える許可ではない。overrides と `devEngines` の承認ゲートの単一ソースは `CLAUDE.md` → "Dependency overrides" と `dependency-update` skill である
44
+ 5. **タイムリーに**: バンプ起因の破壊は、可能な限り同じ作業セッション内で速やかに対処し、pin の裏に先送りしない
45
+
46
+ ## 恒久ルールは MEMORY ではなくプロンプト/ドキュメントに書く
47
+
48
+ 今後のセッションでも守るべき恒久的な振る舞いのルールに気付いたときは、**kit が配布するプロンプト/ドキュメント**(`CLAUDE.md` / `prompts/*`)への変更として記述する。プロジェクト単位の自動 MEMORY(例: `~/.claude/projects/<repo-slug>/memory/`)への保存で済ませてはならない。
49
+
50
+ - **プロンプト/ドキュメントが正である理由**: バージョン管理下でレビューでき、`josh sync` で全消費者リポジトリ・別の PC・別の AI ツールに届き、`git log` で経緯を追える
51
+ - **MEMORY は 1 台のマシン × 1 つのリポジトリ**にスコープされたローカルストアで、コミットされない。保存は最小限に留め、用途は本質的にローカルな文脈(マシン固有のパス、個人の環境の癖など)だけ。どこでも適用されるべきルールの唯一の置き場所にしてはならない
52
+
53
+ 運用:
54
+
55
+ 1. 恒久ルールに気付いたら、まず「これは kit のドキュメント/プロンプトに書くべきか?」を判定する。共有価値があるなら答えは常に yes
56
+ 2. 現在のターンがドキュメント変更を承認していない(相談中など)場合は、**MEMORY に黙って保存せず、プロンプト/ドキュメント変更を提案する**(→「相談と実行を区別する」「配布ドキュメント・設定の変更は kit に上流化する」)
57
+ 3. 消費者リポジトリで気付いた場合は、ローカル編集ではなく kit 側へ Issue/PR として上流化する
58
+ 4. 既に MEMORY にあるルールが実は共有すべきものだと分かったときは、プロンプト/ドキュメントへ移し、MEMORY 側の重複エントリは削除する
59
+
60
+ ## 配布ドキュメント・設定の変更は kit に上流化する
61
+
62
+ `CLAUDE.md` および kit が配布する他のドキュメント/設定は、kit から単一ソースで配布される。
63
+
64
+ - **消費者リポジトリ(app-kit / game-kit)ではこれらをローカル編集しない**: `josh sync` が編集を上書きするうえ、変更は本来上流(kit)に属する。ドキュメント/設定を編集する前に、それが配布物かどうかを確認し、配布物なら kit 側に変更を提案(Issue/PR)する
65
+ - **kit リポジトリ自身ではあなたが配布元**なので、ここでは編集してよい。編集先は `CLAUDE.md` 1 本である(次節)
66
+
67
+ ## エージェント規則の単一ソースは `CLAUDE.md`(`AGENTS.md` / `GEMINI.md` は導線)
68
+
69
+ **規則の本体は `CLAUDE.md` にしか無い。** `AGENTS.md` と `GEMINI.md` は「規則は `CLAUDE.md` にある。作業前に全文を読むこと」と「規則を書き戻さない」だけを書いた短い導線文書であり、規則を 1 行も持たない。
70
+
71
+ - **規則の追加・仕様変更・文言修正・節の追加は `CLAUDE.md` に 1 回だけ書く。** 他の 2 本には触れない
72
+ - **導線文書に規則を書き戻さない。** そこに書かれた規則は、次の改訂で更新し忘れる 4 つ目の置き場になる
73
+ - `scripts/document/ai-document-pointers.test.ts` が機械的に守る。導線文書に規則本体が再出現した場合、導線の一文が消えた場合、`CLAUDE.md` が単一ソースであることの記述が消えた場合に落ちる
74
+ - 経緯は `docs/maintainers/principles-rationale.md` → "Why AGENTS and GEMINI are pointers"、`@CLAUDE.md` 行と他ツールでの未検証は `docs/maintainers/principles-rationale.md` → "The include line, and what has not been verified"
@@ -1,6 +1,8 @@
1
1
  ## 常駐ドキュメントと skill の分担(何を常駐に残すか)
2
2
 
3
- `CLAUDE.md` は毎ターン全文が読み込まれる。したがって常駐に書ける量は有限で、`scripts/claude/workflow-skills.test.ts` の `RESIDENT_CEILING_BYTES` がその上限を固定している。**どの規則を常駐に残すかは、書き手の重要度判断ではなく 3 問の順序判定で決める。**
3
+ **規則をどこに書くか、常駐にどこまで残すかの判定は、このファイルが単一ソースである**(joshuafolkken/kit#2891)。`CLAUDE.md` →「Collaboration Workflow」、`.claude/skills/workflow-commands/SKILL.md` → §3、[`rule-delivery.md`](./rule-delivery.md) はここを指すだけで、問いを写さない。**読むのは規則を置く・移す・引退させるターンだけ**であり、Issue を実行するターンでは一度も読まれないので、ワークフローの入口の読み取りには入れていない(joshuafolkken/kit#1797、joshuafolkken/kit#2161)。
4
+
5
+ `CLAUDE.md` は毎ターン全文が読み込まれる。したがって常駐に書ける量は有限で、`scripts/claude/workflow-skills.test.ts` の `RESIDENT_CEILING_BYTES` がその上限を固定している。**どの規則をどこに置くかは、書き手の重要度判断ではなく、下の 4 つの問いを順に当てて決める。**
4
6
 
5
7
  ### 第 0 問(先に問う)
6
8
 
@@ -18,15 +20,48 @@
18
20
 
19
21
  **順序でないなら、以下の 2 問に進む。**
20
22
 
23
+ ### 第 1 問 — 引き金を名指しできるか
24
+
21
25
  > **その規則が効き始める瞬間を、1 件のツール呼び出しとして名指しできるか。**
22
26
 
23
- **名指しできる規則は、規則本文を常駐から出す**(joshuafolkken/kit#1524)。`prompts/collaboration-workflow/rule-delivery.md` の列挙表に 1 行加え、フックがその呼び出しを拒否して規則本文を突きつける — 常駐の散文より安く、かつ**拒否は読み飛ばせない**。ただし**フックが届くのは Claude Code だけ**なので、常駐側にはトリガと判断基準の 1 行が残る([`rule-delivery.md`](./rule-delivery.md) →「常駐側に残すのはトリガと判断基準の 1 行」)。名指しできない規則は、次の問いに進む。
27
+ **名指しできる規則は、規則本文を常駐から出す**(joshuafolkken/kit#1524)。[`rule-delivery.md`](./rule-delivery.md) の列挙表に 1 行加え、フックがその呼び出しを拒否して規則本文を突きつける — 常駐の散文より安く(それ以外のターンでは何も払わない)、かつ**拒否は読み飛ばせない**。**移設は削除ではない** — 規則本文は消えず、より強い経路に移る。
28
+
29
+ **常駐側にはトリガと判断基準の 1 行を残す。配送経路は 1 つの harness にしか届かないからである。** フックが届くのは Claude Code だけである。`CLAUDE.md` は特定のエージェントに依存しない前提で書かれており(`AGENTS.md` / `GEMINI.md` / `.cursorrules` はいずれもそこへの導線である)、Codex や Gemini CLI、Cursor のセッションは `.claude/settings.json` のフックを 1 つも走らせない。停止スイッチを立てた Claude Code も同じである。**規則の行を丸ごと消すと、それらのセッションではその規則がどこにも存在しなくなる。** したがって移設で常駐から出るのは**規則本文**であって行そのものではなく、実測値・却下した機構案・手順は配送側と話題ファイルへ移り、1 行だけが残る。**得るのは本文であって行ではない。** 常駐から完全に外してよいのは、その規則に従う主体が常にこの harness だと言える場合に限られる。
30
+
31
+ **第 1 問が先に来るのは、届ける手段が増えたからである。** 旧来この一覧は第 2 問だけで決まっていたが、それは「規則を届ける手段が常駐しかない」時代の基準だった。`PreToolUse` / `PostToolUse` / `UserPromptSubmit` が稼働している以上その前提は成立せず、joshuafolkken/kit#1344 と joshuafolkken/kit#1460 は**常駐していながら一度も発火していなかった規則が実在した**ことを計測で示している。
32
+
33
+ 名指しできない規則は、次の問いに進む。
34
+
35
+ ### 第 2 問 — skill なしのターンでも効く必要があるか
24
36
 
25
37
  > **その規則は、skill がロードされていないターンでも効く必要があるか。**
26
38
 
27
- 答えが yes の規則だけが常駐に残り、それ以外は skill へ置いて常駐からは導線だけを張る。判定の入力は「その規則が最初に効き始めるのはコマンド開始の前か後か」の 1 点だけであり、規則の重要さは入力に含まれない。
39
+ **`CLAUDE.md` に残るのは、skill がロードされていないターンでも効く必要がある規則だけである。** 判定の入力は「その規則が最初に効き始めるのはコマンド開始の前か後か」の 1 点だけであり、規則の重要さは入力に含まれない。ランが skill を読んだ**後に**だけ到達する規則は、`CLAUDE.md` から導線を張り、そこで再掲しない。この判定が対象とするのは `CLAUDE.md` だけである — `AGENTS.md` と `GEMINI.md` は規則を持たず、`CLAUDE.md` への導線である。
40
+
41
+ ### 常駐規則をどこまで常駐させるか — トリガと導線
42
+
43
+ 上の問いは規則を常駐に**残すかどうか**を決めるが、**どこまで残すか**は決めない。長いあいだ何もそれを決めておらず、通った規則は手順を丸ごと連れて入ってきた。その結果、手順を既に移し終えた後でも `CLAUDE.md` は上限まで 585 バイトのところまで膨らみ直した(joshuafolkken/kit#964)。
44
+
45
+ **常駐規則は、トリガと導線の 2 つで書く。** 3 つ目は置かない。
28
46
 
29
- **第 1 問が先に来るのは、届ける手段が増えたからである。** 旧来この一覧は第 2 問だけで決まっていたが、それは「規則を届ける手段が常駐しかない」時代の基準だった。`PreToolUse` / `PostToolUse` / `UserPromptSubmit` が稼働している以上その前提は成立せず、joshuafolkken/kit#1344 と joshuafolkken/kit#1460 は**常駐していながら一度も発火していなかった規則が実在した**ことを計測で示している。**移設は削除ではない** — 規則本文は消えず、より強い経路に移る。
47
+ 1. **トリガ** — 規則が効く状況と、ほかを何も読む前に従うべき 1 つの指示。そこから先を何も読まないエージェントでも、止まる・起票する・拒否する・尋ねるといった安全な振る舞いができるように書く。
48
+ 2. **導線** — 手順を持つ `prompts/collaboration-workflow/` の話題ファイルか skill のファイル。探さずに開けるだけ正確に名指す。
49
+
50
+ それ以外 — 手順、作例、根拠、規則が書かれるきっかけになった失敗 — は導線の先に置く。**判定は、導線を一度も開かないターンでも常駐の記述だけで正しく振る舞えるかである。** ある文を落とすとエージェントが誤って進みうるなら、その文はトリガの一部である。落としても情報が減るだけなら、導線の先に置く。
51
+
52
+ **削ることは移すことであり、削除は理由を示して初めて許される例外である。** 文が `CLAUDE.md` から出る前に、その文は導線の先に存在していなければならず、それを固定していたマーカーテストは捨てずに導線の先へ付け替える。正典の節が常駐の写しより薄いのは普通のことであって削除の理由にはならない — そのときは常駐側が詳しい版なので、先に正典へ移してから常駐から切る。
53
+
54
+ **移すことしかできない仕組みはいずれ詰まるので、出口を 1 つだけ設ける。ただし狭い**(joshuafolkken/kit#1525)。規則を移すのではなく**引退**させてよいのは、消してもどのエージェントの振る舞いも変わりえないときだけであり、それは主張ではなく次の 3 条件で示す。
55
+
56
+ 1. **単一ソースが宣言された文の写しである。** 単一ソースが同じ文書の中で名指されている。2 つが食い違えば誤っているのは写しの側なので、写しに正しく依存できるものは無い。
57
+ 2. **ほかのどこにも無い文を 1 つも運んでいない。** 記憶ではなく、写し元の単一ソースと突き合わせて確かめる。
58
+ 3. **マーカーテストが固定していない。** 引退と一緒に落ちるアサーションが無い。
59
+
60
+ **「重複に見える」は 3 条件のどれも満たさない。発火テスト・マーカー・測定された効果を持つ規則は、そもそも候補ではない。** これらの文書の規則はどれも、特定の失敗の後に書かれている。今日何も変えていない規則は、**そこにあるから**失敗が再発していないだけかもしれない。3 条件がそろわなければ、その発見は証拠つきの候補として記録し、規則は残す — 載せた候補は何も払わず後で拾えるが、誤って消した規則は何か月も後に、誰も見ていないランで黙って失敗する。**引退できるものが無かった回は、候補と証拠を記録してそこで止める** — 削除が出てくるまで基準を下げることはしない。
61
+
62
+ **`rule:value` は測定であって、削減の門番ではない**(joshuafolkken/kit#1931 → `## Decisions`)。低い単独遵守率は常駐の写しが働いている証拠になるが、何も引退させなかった読み取りが文書を凍結することはない。単一ソースの導線先に本文が重複している常駐の写しは、読み取りの許可を待たずに上の「削ることは移すこと」に従ってトリガまで削る。比較の値が `-` の規則は遵守テストを宣言していないのであって、0 ではなく**未測定**であり、それだけで候補にはならない。門番として使っていた時期の経緯と各回の読み取りは `docs/maintainers/residency-rationale.md` → "The reduction freeze and its retraction"、`docs/maintainers/residency-rationale.md` → "Measurement decides what leaves"、`docs/maintainers/residency-rationale.md` → "The `rule:value` readings" にある。
63
+
64
+ ### 常駐規則の一覧
30
65
 
31
66
  **この一覧の対象範囲は、オンデマンド側に対応する手順を持つ常駐規則である** — skill であれ、オンデマンドで読むプロンプトであれ、常駐の記述が導線を張っている先を持つもの。判定基準が問うているのはまさにその規則群であり、いずれも「移せたはずだが、名前を挙げるに足る理由で残った」ものである。この範囲の中では網羅的であり、対応する手順を持つ規則がここに載らずに常駐へ入っていれば、判定基準に照らされていない。
32
67
 
@@ -34,21 +69,22 @@
34
69
 
35
70
  **範囲の外にある常駐規則はこの一覧に載らないのが正常である。** 命名規約、品質上限、Code Change Rules、Package-First などには移す先が存在せず、判定基準が問う「skill がロードされていないターンでも効くか」という問い自体が成り立たない。一覧に無いことは欠落ではない(joshuafolkken/kit#955)。
36
71
 
37
- 範囲の中で常駐に残る規則は次で全部であり、いずれも `CLAUDE.md` に残っていることをマーカーテストが表明している(大半は `scripts/claude/workflow-skills.test.ts`、UI 検証ゲートは `scripts/claude/verify-ui-skill.test.ts`、後追い起票は `scripts/document/document-markers.test.ts`、ファイル編集の禁止は `scripts/document/document-markers.test.ts`)。**引き金つき配送へ移した規則は、常駐にあることではなく発火することで固定される** — ターン内バッチングは `scripts/rules/turn-batching-rule.test.ts`、WIP 上限は `scripts/backlog/backlog-manufacturing-rule.test.ts`、機構そのものは `scripts/rules/delivered-rules.test.ts` である。
72
+ 範囲の中で常駐に残る規則は次で全部であり、いずれも `CLAUDE.md` に残っていることをマーカーテストが表明している(大半は `scripts/claude/workflow-skills.test.ts`、UI 検証ゲートは `scripts/claude/verify-ui-skill.test.ts`、後追い起票とファイル編集の禁止は `scripts/document/document-markers.test.ts`)。**引き金つき配送へ移した規則は、常駐にあることではなく発火することで固定される** — ターン内バッチングは `scripts/rules/turn-batching-rule.test.ts`、WIP 上限は `scripts/backlog/backlog-manufacturing-rule.test.ts`、機構そのものは `scripts/rules/delivered-rules.test.ts` であり、常駐していると表明されるのはトリガの 1 行だけである。
38
73
 
39
74
  - **明示起動の必須**(「指示されていない行動は取らない」)— そもそもワークフローを開始してよいかを決める規則なので、ユーザーがキーワードを打った瞬間、つまり skill を読むより前に効く必要がある
40
75
  - **停止時の `confirmation` 通知** — これを要する停止の大半(別パッケージ起因の割り込み、Tier C の確認)は、ワークフローのキーワードが一度も打たれていないターンで起きる
41
76
  - **`overrides` の保護**と **`devEngines` の保護** — 依存更新コマンドはどのターンでも走りうる。`dependency-update` skill をロードしないターンでも走り、skill を読む頃には pin は既に書き換わっている
42
77
  - **UI 検証ゲート** — 画面に出る変更は、実際にレンダリング結果を見るまで完了ではない。撮影の手順は `verify-ui` にある。このゲートが効くのは UI 変更の完了を報告する瞬間であり、ワークフローのキーワードが打たれておらず skill が何もロードされていないターンであることが多い
43
- - **レビュー上限後の後追い起票の手順** — 起票して `epic:bundle` で EPIC へ繋ぎ直すところまで。コミット前セルフレビューはワークフローの外でも回るので、そこで起票された Issue も同じように孤児になる。完全な手順は `prompts/review.md` →「Review round cap」にある
44
- - **`josh epic:*` のうちコマンドの外側で効く 3 件** — 決定の記録による `needs-decision` の解除、`epic:audit` の指摘を直すのが Tier A であること、別リポジトリの EPIC を `owner/repo#N` で参照すること。いずれも `epic:*` コマンドを走らせていないターン(Issue を起票した直後、決定を書いた瞬間)に効く
78
+ - **レビュー上限後の後追い起票の手順** — 起票して `epic:bundle` で EPIC へ繋ぎ直すところまで。コミット前セルフレビューはワークフローの外でも回るので、そこで起票された Issue も同じように孤児になる。完全な手順は `prompts/review.md` →「Review round cap」にある(joshuafolkken/kit#946)
79
+ - **`josh epic:*` のうちコマンドの外側で効く 3 件** — 決定の記録による `needs-decision` の解除、`epic:audit` の指摘を直すのが Tier A であること、別リポジトリの EPIC を `owner/repo#N` で参照すること。いずれも `epic:*` コマンドを走らせていないターン(Issue を起票した直後、決定を書いた瞬間)に効く。コマンド自身の手順は `.claude/skills/epic-commands/` にある
45
80
  - **編集後の本文をコマンドに載せない禁止** — ファイル編集はどのターンでも起き、**編集の直前にロードされる skill は存在しない**。オンデマンド側に置くとこの規則は一度も発火せず、書いたのに削除したのと同じ振る舞いになる。実測値・可否表・根拠は [`file-edits.md`](./file-edits.md) にあり、常駐に残すのは指示と判断基準(「本文を丸ごと運ぶか」であってツール名ではない)だけである(joshuafolkken/kit#1150)。**Edit 自体を全文へ広げる形も同じ規則の一部である** — 数行の指摘に対する全文書き直しは、ツールを替えただけで同じコストを払っている。常駐にはその禁止の一句だけを置き、全文を書いてよい 3 条件は同じ指し先にある(joshuafolkken/kit#1260)
46
81
 
47
- **第 1 問で「名指しできる」となり、引き金つき配送へ移したもの**(joshuafolkken/kit#1524)。いずれも本文は消えておらず、規則が効く瞬間にフックが突きつける。列挙表と、引き金が発火しないターンの意味は [`rule-delivery.md`](./rule-delivery.md) にある。
82
+ **第 1 問で「名指しできる」となり、引き金つき配送へ移したもの**(joshuafolkken/kit#1524)。いずれも本文は消えておらず、規則が効く瞬間にフックが突きつける。下は常駐に 1 行を残した、またはその判断に理由が要った行だけであり、配送されている規則の全体ではない。**列挙表と、引き金が発火しないターンの意味の単一ソースは [`rule-delivery.md`](./rule-delivery.md) であり、ここには行数を写さない** — 2 か所に置いた数は必ずずれる(joshuafolkken/kit#1525)。
48
83
 
49
- - **独立した呼び出しを同じターンに載せる規則** — 引き金は `pnpm josh batch:guard`(単発呼び出しのターンが 3 つ続いた次の `Bash`)。常駐していた間の実測が示したのは、**常駐は効いていなかった**という事実である(数値は指し先)。実測値・却下した機構案・ゲートを弱めない条件は [`turn-batching.md`](./turn-batching.md) にある(joshuafolkken/kit#1304、#1390、#1524)
50
- - **バックログの WIP 上限(オープン 30 件)** — 引き金は `pnpm josh rule:guard`(Issue を作成する `Bash`)。配送文が件数の数え方・起票しない判断・2 つの免除・**割り込みの 3 条件**をそのまま運ぶ。3 条件を落とすと「重大かどうか」が判断に戻るため、配送文からも削っていない(joshuafolkken/kit#1518)。手順と数字を動かす条件は [`wip-cap.md`](./wip-cap.md) にある(joshuafolkken/kit#1469、#1524)
51
- - **本文をシェルの二重引用符に載せない** — 引き金は `pnpm josh rule:guard`(本文値にバッククォートか `$` を含む `Bash`)。**常駐側に 1 行が残っているのは、ここが「削除してよい」側ではないからである** — 配送は Claude Code にしか届かず、正規表現が知っている綴り(`-f body=` / `--body` / `--notify-message`)だけが規則の適用範囲になってはならない。実測・安全な綴り・引き金の死角は [`shell-body.md`](./shell-body.md) にある(joshuafolkken/kit#1198)
84
+ - **独立した呼び出しを同じターンに載せる規則** — 引き金は `pnpm josh batch:guard`(単発呼び出しのターンが 3 つ続いた次の `Bash` / `Edit` / `Read`)。常駐していた間の実測が示したのは、**常駐は効いていなかった**という事実である(数値は指し先)。実測値・却下した機構案・ゲートを弱めない条件は [`turn-batching.md`](./turn-batching.md) にある(joshuafolkken/kit#1304、#1390、#1524、`Edit` は #1762、`Read` は #1798 で加わった)
85
+ - **バックログの WIP 上限(オープン 30 件)** — 引き金は `pnpm josh rule:guard`(Issue を作成する `Bash`)。配送文が件数の数え方・起票しない判断・2 つの免除・**割り込みの 3 条件**をそのまま運ぶ。3 条件を落とすと「重大かどうか」が判断に戻るため、配送文からも削っていない(joshuafolkken/kit#1518)。コメントの投稿は起票ではないので対象外である。手順と数字を動かす条件は [`wip-cap.md`](./wip-cap.md) にある(joshuafolkken/kit#1469、#1524)
86
+ - **Issue コメントの読み取り** — 引き金は `pnpm josh rule:guard`(Issue 本文だけを読む `Bash`)。拒否文はコメント込みの読み直しと、本文と食い違うコメントの扱いを渡す。前提を満たすまで毎回拒否するので、`batch:guard` と引き金が重なるターンでも拒否する。手順は `SKILL.md` → §2g に残る — フックを走らせないセッションにも読み取りの義務は残るからである
87
+ - **本文をシェルの二重引用符に載せない** — 引き金は `pnpm josh rule:guard`(本文値にバッククォートか `$` を含む `Bash`)。**引き金はフラグではなく本文を読む** — 作例はどれも無害なプレースホルダを渡しているので、フラグで引くと規則を既に守っているターンで拒否することになる。**常駐側に 1 行が残っているのは、ここが「削除してよい」側ではないからである** — 配送は Claude Code にしか届かず、正規表現が知っている綴り(`-f body=` / `--body` / `--notify-message`)だけが規則の適用範囲になってはならない。実測・安全な綴り・引き金の死角は [`shell-body.md`](./shell-body.md) にある(joshuafolkken/kit#1198)
52
88
 
53
89
  no になり skill 側に本体を置くものの例:
54
90
 
@@ -56,6 +92,7 @@ no になり skill 側に本体を置くものの例:
56
92
  - 実行中に前提 Issue が判明した場合の入口別手順(`fullrun.md` / `halfrun.md` / `.claude/skills/workflow-commands/backlogrun.md`)
57
93
  - `backlogrun` の単独 Issue 受理と park-and-continue(`.claude/skills/workflow-commands/backlogrun.md`)
58
94
  - 検証ゲートとマージ連鎖(`.claude/skills/workflow-commands/chain-rule.md` / `followup.md`)
95
+ - 依存更新後の検証手順(`.claude/skills/dependency-update/`)— 上の 2 つの保護が導線を張る先
59
96
  - `auto-ok` の拾い上げと「ラベルを付けるのは人だけ」(`.claude/skills/workflow-commands/backlogrun.md`)。書き込みの禁止は普通なら常駐側に来るが、`auto-ok` はそれを禁じているドキュメント以外のどこにも存在しないため、それらを開かないターンではそもそも到達しない
60
97
 
61
98
  ### 指し先になった話題ファイルは引用しない
@@ -74,7 +111,9 @@ no になり skill 側に本体を置くものの例:
74
111
 
75
112
  `scripts/rules/pointer-citation-document-rule.test.ts` がこれを固定する。**縮小した話題ファイルは冒頭に「この規則の単一ソースは …」の宣言文を置くこと** — 検査はこの宣言文で指し先を機械的に検出し、そこに書かれた skill が実在すること、および他の文書がその話題ファイルを引用していないことを確かめる。宣言文が入口なので、横展開で新しく縮小された話題も、この規則の対象へ自動で入る。
76
113
 
77
- **この基準は努力目標ではない。** 常駐に手順を書き戻すと、その分の予算を次に本当に常駐が要る規則が既存の文章から取り返すことになる。上限に張り付いた状態で 1 文を足すために別の文を削ると、**削る対象はマーカーで固定されていなかった箇所から選ばれる** — 規則の重要度ではなく、テストに拾われていなかったかどうかで残る文が決まる(joshuafolkken/kit#951)。上限そのものを引き上げる対処は、上限が防いでいる状態の追認にあたるので採らない。
114
+ ### 常駐予算
115
+
116
+ **この基準は努力目標ではない。** `scripts/claude/workflow-skills.test.ts` は常駐文書ごとに `RESIDENT_CEILING_BYTES` の上限とその下の余白を要求する。常駐に手順を書き戻すと、その分の予算を次に本当に常駐が要る規則が既存の文章から取り返すことになる。上限に張り付いた状態で 1 文を足すために別の文を削ると、**削る対象はマーカーで固定されていなかった箇所から選ばれる** — 規則の重要度ではなく、テストに拾われていなかったかどうかで残る文が決まる(joshuafolkken/kit#951)。予算が詰まったときに何を出すかは、マーカーの有無ではなく測定で決める(`rule:value`、上の「トリガと導線」の節)。上限そのものを引き上げる対処は、上限が防いでいる状態の追認にあたるので採らない。
78
117
 
79
118
  ### 上限を引き上げてよい条件(反証条件)
80
119
 
@@ -90,5 +129,6 @@ no になり skill 側に本体を置くものの例:
90
129
 
91
130
  **引き上げは Tier C として扱う。** `scripts/claude/workflow-skills.test.ts` で常駐予算を決めている定数——`RESIDENT_CEILING_BYTES`、`RESIDENT_HEADROOM_BYTES`、および書き戻しを検知する下限 `RE_INLINE_GUARD_HEADROOM_BYTES`——の**緩和**は、上の 3 条件を示した上でユーザーの明示指示を得てから行う。条件が揃っていること自体は、変更してよいという指示ではない。**どれか 1 つだけを名指しすると、そのとき実際に効いている限界が対象外になる** — 上限に余裕があっても下限に張り付いていれば、緩めたくなるのは下限のほうであり、そこが素通しなら禁止は形だけになる。締める向きの変更(上限を下げる、下限を上げる)はこの禁止の対象外である。
92
131
 
93
- - このルールは横断ドキュメント(CLAUDE.md「Shorthand Commands」)および `.claude/skills/workflow-commands/SKILL.md`「What stays resident, and what is read from here」のカノニカル参照
94
- - **常駐ルールを「どこまで常駐させるか」の本体は `.claude/skills/workflow-commands/rule-residency.md` にある**(joshuafolkken/kit#1797)。常駐可否を決める 2 つの問いは `SKILL.md` §3 に残り、トリガ+ポインタの形・常駐ルールの列挙・引退経路とその 3 条件・`rule:value` の測定結果はそちらへ移した。**発火するのはこれらの文書を編集するターンだけで、Issue を実行するターンでは一度も読まれない**ので、ワークフローの起動読み取りから外してある
132
+ ### 経緯
133
+
134
+ この基準の適用の記録は保守者向けの文書に移してあり、規則は持たない。配送済み規則の一覧から件数を外した経緯は `docs/maintainers/residency-rationale.md` → "Why the delivered list carries no count"、二重の一覧を 1 つにした経緯は `docs/maintainers/residency-rationale.md` → "One list, not two" にある。
@@ -19,17 +19,7 @@
19
19
 
20
20
  ## 判定基準 — 引き金を特定できるか
21
21
 
22
- > **その規則が効き始める瞬間を、1 件のツール呼び出しとして名指しできるか。**
23
-
24
- 名指しできる規則は、**規則本文を常駐から出す**。列挙表に 1 行加え、フックが効く瞬間に配送する。名指しできない規則 — 振る舞いの原則、報告の書き方、判断の階層 — は、これまでどおり第 2 問(「skill がロードされていないターンでも効く必要があるか」)で決める。旧基準だけで決めていたのは、**届ける手段が常駐しかなかった時代のもの**であり、`PreToolUse` / `PostToolUse` / `UserPromptSubmit` の 3 点が稼働している以上その前提は成立していない。
25
-
26
- ### 常駐側に残すのはトリガと判断基準の 1 行 — 配送経路は 1 つの harness にしか届かない
27
-
28
- **フックが届くのは Claude Code だけである。** `CLAUDE.md` は特定のエージェントに依存しない前提で書かれており(`AGENTS.md` / `GEMINI.md` / `.cursorrules` はいずれもそこへの導線である)、Codex や Gemini CLI、Cursor のセッションは `.claude/settings.json` のフックを 1 つも走らせない。停止スイッチを立てた Claude Code も同じである。**規則の行を丸ごと消すと、それらのセッションではその規則がどこにも存在しなくなる** — 本 Issue 自身が禁じている「削除」そのものになる。
29
-
30
- したがって移設で常駐から出るのは**規則本文**であって、行そのものではない。常駐に残るのは residency 基準が言うところの「トリガ+導線」— 実測値・却下した機構案・手順は配送側と話題ファイルへ移り、**1 行だけが残る**。常駐から完全に外してよいのは、その規則に従う主体が常にこの harness だと言える場合に限られる。
31
-
32
- **移設は削除ではない。** 規則本文は消えず、より強い経路に移る。したがって joshuafolkken/kit#1477(読み込む命令文のコスト測定)の答えを待つ必要はない — あちらが門番なのは**削除**の判断である。
22
+ どの規則を配送へ移すか — 引き金を 1 件のツール呼び出しとして名指しできるか、常駐側にトリガの 1 行を残す理由、移設が削除ではないこと — の単一ソースは [`residency.md`](./residency.md) →「第 1 問」であり、ここには写さない。この文書が持つのは、移した規則を届ける機構と列挙表である。移設は削除ではないので、joshuafolkken/kit#1477(読み込む命令文のコスト測定)の答えを待つ必要はない — あちらが門番なのは**削除**の判断である。
33
23
 
34
24
  ## 機構 — 1 本だけ、新規に作らない
35
25
 
@@ -17,7 +17,7 @@
17
17
  1. **現在の作業を退避する**: `git stash push -u -m "upstream-interrupt: paused #<N>"`(WIP コミットでも可)。退避したことを忘れないよう、この時点で stash を作る。メッセージ付きで積むのは、復元をメッセージで特定するため(下記ステップ 5)
18
18
  2. **進行中の Issue に状況を明記する**: `pnpm josh issue:comment <N> --body-file <path>` で、(a) 作業を stash したこと、(b) 中断理由(どの別パッケージの・どんな問題で中断したか)、(c) 対象パッケージに作成した新 Issue へのリンクを `## Upstream issues` 見出しの下に `owner/repo#N` 形式で、を記載する。これにより「なぜこの Issue が一時停止しているか」と「何を待っているのか」が後から監査できる(→「起票元へのバックリンク」)
19
19
  3. **対象パッケージのリポジトリに新しい Issue を作成する(確認なし)**: `pnpm josh issue:file "<root-cause title>" --body-file <body-file> --depth <n> --route tier-a --repo <owner>/<repo>`(`route:tier-a` は実装中の Tier A 起票を経路として集計するためのラベル — joshuafolkken/kit#1083。付与するのは first-party の場合だけで、third-party はコマンド自身が拒否し起票しない)。本文の検査、本文が宣言する分類ラベルの付与、`## Origin` 節の確認、起票先での重複探し、`epic:bundle` はこのコマンドが実行する(`docs/josh-commands.md` → `josh issue:file`)。分類の単一ソースは `prompts/collaboration-workflow/issue-template.md`。根本原因・再現・期待結果を Step 1 のテンプレに沿って記載し、**本文に `## Origin` 節を置いて起票元 Issue を `owner/repo#N` 形式で書く**(→「起票元へのバックリンク」)。上流 Issue は欠陥を、起票元 Issue は証拠を持つため、リンクがないと上流 Issue は後から解釈できなくなる。ここで「起票してよいか」を尋ねて停止してはならない。**ただし確認なしで起票してよいのは対象が first-party のときだけ**で、third-party(owner が自リポジトリと一致しないリポジトリ)なら起票せずに停止する(→「第三者リポジトリへの書き込みは Tier C(明示指示が必要)」)
20
- 4. **`confirmation` Telegram を送って停止する**: 上流 Issue の URL と、何が止まっているかを本文に書く(→「確認待ちで停止するときの Telegram 通知(`confirmation`)」)。無人実行でも画面外でユーザーが気付ける。停止は Issue が既に存在する状態で行うので、ユーザーは「待つ / 先送りする」を Issue を見ながら 1 語で答えられる
20
+ 4. **`confirmation` Telegram を送って停止する**: 上流 Issue の URL と、何が止まっているかを本文に書く(→ `CLAUDE.md` → "Mid-workflow stop notification (`confirmation`)")。無人実行でも画面外でユーザーが気付ける。停止は Issue が既に存在する状態で行うので、ユーザーは「待つ / 先送りする」を Issue を見ながら 1 語で答えられる
21
21
  5. **元の作業を再開する**: 上流の修正がマージされた、または**ユーザーが先送りを明示判断した**後に `pnpm josh stash:pop "upstream-interrupt: paused #<N>"`(位置指定や引数なしの `git stash pop` は使わない — stash は全 work tree が共有する 1 本のスタックで、別のレーンの stash を取り込む恐れがある)して、退避していた元タスクを続行する。上流 Issue を割り込みで実装するかどうかもユーザーの判断(上流パッケージの実装・PR・マージはそれぞれのワークフロー規則に従う)
22
22
 
23
23
  ### 第三者リポジトリへの書き込みは Tier C(明示指示が必要)
@@ -10,34 +10,28 @@
10
10
 
11
11
  **話題ごとにファイルが分かれている。** 以前はこの内容が 1 本の 169KB のファイルにあり、1 つの節を確かめるだけでも全体を読む必要があった。読んだものはそのセッションの残り全ターンで積み上がった前置きとして課金され続けるため、確認 1 回の費用が会話の長さに比例して効いていた(joshuafolkken/kit#965)。**必要な 1 本だけを開くこと。この索引を入口に、下の表から選ぶ。**
12
12
 
13
- | 話題 | ファイル |
14
- | ------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------- |
15
- | Overview | [`overview.md`](./collaboration-workflow/overview.md) |
16
- | Step 1: Issue 作成テンプレ | [`issue-template.md`](./collaboration-workflow/issue-template.md) |
17
- | Step 2: 提案依頼(AI 共通) | [`proposal-request.md`](./collaboration-workflow/proposal-request.md) |
18
- | Step 3: 計画コメントを記録して通知する | [`plan-comment.md`](./collaboration-workflow/plan-comment.md) |
19
- | 報告フォーマット(平易な概要 + 技術詳細) | [`report-format.md`](./collaboration-workflow/report-format.md) |
20
- | セッション向け出力で Issue はリンク+短い日本語要約で参照する | [`issue-citation.md`](./collaboration-workflow/issue-citation.md) |
21
- | 後から関連が判明した Issue を epic に束ねる | [`epic-bundle.md`](./collaboration-workflow/epic-bundle.md) |
22
- | オープン Issue の WIP 上限(30 件) | [`wip-cap.md`](./collaboration-workflow/wip-cap.md) |
23
- | リポジトリをまたぐ EPIC | [`cross-repo-epic.md`](./collaboration-workflow/cross-repo-epic.md) |
24
- | `josh epic:audit` — 子 Issue 群を横断して矛盾を検出する | [`epic-audit.md`](./collaboration-workflow/epic-audit.md) |
25
- | 別パッケージ起因の問題は割り込み Issue で対応する | [`upstream-interrupt.md`](./collaboration-workflow/upstream-interrupt.md) |
26
- | クローン禁止・単一ソース化(パッケージ境界を越えても) | [`no-clones.md`](./collaboration-workflow/no-clones.md) |
27
- | 設計はエレガント・シンプルを第一目標にする(仕組みを足す前に原因を問う) | [`simplicity-first.md`](./collaboration-workflow/simplicity-first.md) |
28
- | 相談と実行を区別する(議論中にファイルを編集しない) | [`consultation-vs-execution.md`](./collaboration-workflow/consultation-vs-execution.md) |
29
- | 配布ドキュメント・設定の変更は kit に上流化する | [`distributed-docs.md`](./collaboration-workflow/distributed-docs.md) |
30
- | エージェント規則の単一ソースは `CLAUDE.md`(`AGENTS.md` / `GEMINI.md` は導線) | [`single-source-rules.md`](./collaboration-workflow/single-source-rules.md) |
31
- | 最新優先・fix-forward(pin-back は最終手段) | [`latest-first.md`](./collaboration-workflow/latest-first.md) |
32
- | 恒久ルールは MEMORY ではなくプロンプト/ドキュメントに書く | [`durable-rules.md`](./collaboration-workflow/durable-rules.md) |
33
- | ファイル編集はコマンド本文に本文を載せない | [`file-edits.md`](./collaboration-workflow/file-edits.md) |
34
- | 本文をシェルの二重引用符に載せない | [`shell-body.md`](./collaboration-workflow/shell-body.md) |
35
- | 独立した呼び出しは同じターンに載せる | [`turn-batching.md`](./collaboration-workflow/turn-batching.md) |
36
- | `gh` は REST(`gh api`)で書く — 散文の指示も含む | [`gh-rest.md`](./collaboration-workflow/gh-rest.md) |
37
- | 常駐ドキュメントと skill の分担(何を常駐に残すか) | [`residency.md`](./collaboration-workflow/residency.md) |
38
- | 引き金つき配送 — 規則を効く瞬間に届ける | [`rule-delivery.md`](./collaboration-workflow/rule-delivery.md) |
39
- | コマンド出力が文脈へ持ち込む量の上限 | [`output-bounds.md`](./collaboration-workflow/output-bounds.md) |
40
- | 運用ルール | [`operating-rules.md`](./collaboration-workflow/operating-rules.md) |
13
+ | 話題 | ファイル |
14
+ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
15
+ | Overview | [`overview.md`](./collaboration-workflow/overview.md) |
16
+ | Step 1: Issue 作成テンプレ | [`issue-template.md`](./collaboration-workflow/issue-template.md) |
17
+ | Step 2: 提案依頼(AI 共通) | [`proposal-request.md`](./collaboration-workflow/proposal-request.md) |
18
+ | Step 3: 計画コメントを記録して通知する | [`plan-comment.md`](./collaboration-workflow/plan-comment.md) |
19
+ | 報告フォーマット(平易な概要 + 技術詳細) | [`report-format.md`](./collaboration-workflow/report-format.md) |
20
+ | セッション向け出力で Issue はリンク+短い日本語要約で参照する | [`issue-citation.md`](./collaboration-workflow/issue-citation.md) |
21
+ | 後から関連が判明した Issue を epic に束ねる(本文は `epic-commands` skill) | [`epic-bundle.md`](./collaboration-workflow/epic-bundle.md) |
22
+ | オープン Issue の WIP 上限(30 件) | [`wip-cap.md`](./collaboration-workflow/wip-cap.md) |
23
+ | リポジトリをまたぐ EPIC(本文は `epic-commands` skill) | [`cross-repo-epic.md`](./collaboration-workflow/cross-repo-epic.md) |
24
+ | `josh epic:audit` — 子 Issue 群を横断して矛盾を検出する(本文は `epic-commands` skill) | [`epic-audit.md`](./collaboration-workflow/epic-audit.md) |
25
+ | 別パッケージ起因の問題は割り込み Issue で対応する | [`upstream-interrupt.md`](./collaboration-workflow/upstream-interrupt.md) |
26
+ | 原則 — クローン禁止・シンプル第一・相談と実行の区別・最新優先・恒久ルールと配布物と規則の置き場所 | [`principles.md`](./collaboration-workflow/principles.md) |
27
+ | ファイル編集はコマンド本文に本文を載せない | [`file-edits.md`](./collaboration-workflow/file-edits.md) |
28
+ | 本文をシェルの二重引用符に載せない | [`shell-body.md`](./collaboration-workflow/shell-body.md) |
29
+ | 独立した呼び出しは同じターンに載せる | [`turn-batching.md`](./collaboration-workflow/turn-batching.md) |
30
+ | `gh` は REST(`gh api`)で書く — 散文の指示も含む | [`gh-rest.md`](./collaboration-workflow/gh-rest.md) |
31
+ | 常駐ドキュメントと skill の分担(何を常駐に残すか) | [`residency.md`](./collaboration-workflow/residency.md) |
32
+ | 引き金つき配送 — 規則を効く瞬間に届ける | [`rule-delivery.md`](./collaboration-workflow/rule-delivery.md) |
33
+ | コマンド出力が文脈へ持ち込む量の上限 | [`output-bounds.md`](./collaboration-workflow/output-bounds.md) |
34
+ | 運用ルール | [`operating-rules.md`](./collaboration-workflow/operating-rules.md) |
41
35
 
42
36
  **どの 1 本を開けばよいかを決めるのに必要なのは、この索引だけである。** バイト数はここに書かない — 手で保守した数字は本文より先に古くなり、古い数字は無いより悪い。実サイズは `ls -l prompts/collaboration-workflow/` が答える。
43
37
 
@@ -12,7 +12,7 @@ const ADOPT_ORIGIN = 'Opened by `josh adopt` in this repository.'
12
12
  const INCOMPLETE_HEADLINE =
13
13
  'Refusing to adopt: these declared toolkits would fall out of the plan, and the run would sync the rest without them.'
14
14
  const INCOMPLETE_EFFECT =
15
- "The toolkits overlay files derived from kit's own (see docs/sync.md), so syncing kit without one rewrites that overlay back to kit's original — a wrong diff wearing kit's face."
15
+ "The toolkits overlay files derived from kit's own (see docs/maintainers/sync-rationale.md), so syncing kit without one rewrites that overlay back to kit's original — a wrong diff wearing kit's face."
16
16
  const MISPLACED_CAUSE =
17
17
  'declared under `dependencies`; the upgrade installs with `pnpm add -D` and would relocate it. Move it to `devDependencies`.'
18
18
  const ABSENT_CAUSE =
@@ -60,7 +60,7 @@ function name_causes(package_names: ReadonlyArray<string>, cause: string): Array
60
60
 
61
61
  // A declared toolkit that falls out of the plan is a refusal rather than a warning
62
62
  // (joshuafolkken/kit#1540). kit distributes the base files and every other toolkit overlays files
63
- // *derived* from them (`docs/sync.md` → two distribution tiers), so a run that syncs kit without the
63
+ // *derived* from them (`docs/maintainers/sync-rationale.md` → "The managed-workflow stamp"), so a run that syncs kit without the
64
64
  // overlay does not merely do less — it writes the overlay's paths back to kit's originals. That diff
65
65
  // then wears kit's own face in the pull request, which is exactly what a reviewer cannot spot.
66
66
  //