@joshuafolkken/kit 1.1136.0 → 1.1178.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.
- package/.claude/settings.json +4 -4
- package/.claude/skills/epic-commands/SKILL.md +27 -239
- package/.claude/skills/epic-commands/epic-bundle.md +115 -0
- package/.claude/skills/epic-commands/execution-waves.md +126 -0
- package/.claude/skills/workflow-commands/SKILL.md +48 -194
- package/.claude/skills/workflow-commands/background-commands.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -123
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +14 -63
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -15
- package/.claude/skills/workflow-commands/backlogrun-progress.md +17 -173
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +155 -0
- package/.claude/skills/workflow-commands/backlogrun-steps.md +65 -144
- package/.claude/skills/workflow-commands/backlogrun.md +5 -4
- package/.claude/skills/workflow-commands/chain-rule.md +3 -2
- package/.claude/skills/workflow-commands/delegation.md +2 -2
- package/.claude/skills/workflow-commands/entry-sequence.md +62 -0
- package/.claude/skills/workflow-commands/followup.md +104 -181
- package/.claude/skills/workflow-commands/fullrun-steps.md +8 -9
- package/.claude/skills/workflow-commands/fullrun.md +16 -73
- package/.claude/skills/workflow-commands/halfrun.md +10 -36
- package/.claude/skills/workflow-commands/into-target.md +4 -4
- package/.claude/skills/workflow-commands/issue-comments.md +7 -8
- package/.claude/skills/workflow-commands/issue-scout.md +6 -6
- package/.claude/skills/workflow-commands/kickoff.md +6 -6
- package/.claude/skills/workflow-commands/needs-human-review.md +6 -6
- package/.claude/skills/workflow-commands/observation-filing.md +21 -172
- package/.claude/skills/workflow-commands/observation-ledger.md +150 -0
- package/.claude/skills/workflow-commands/pre-gate-cut.md +35 -95
- package/.claude/skills/workflow-commands/prerequisite.md +6 -6
- package/.claude/skills/workflow-commands/progress-watcher.md +90 -0
- package/.claude/skills/workflow-commands/prrun.md +5 -5
- package/.claude/skills/workflow-commands/retrospective.md +9 -9
- package/.claude/skills/workflow-commands/split-assessment.md +2 -2
- package/.claude/skills/workflow-commands/target-repository.md +2 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +7 -5
- package/.codex/hooks.json +4 -4
- package/.github/workflows/ci.yml +15 -2
- package/AGENTS.md +1 -6
- package/CLAUDE.md +58 -120
- package/GEMINI.md +1 -6
- package/dist/CLAUDE.md +58 -120
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-NFZGFGOR.js → chunk-32GQTL4F.js} +14 -1
- package/dist/hooks/{chunk-HBKZLITF.js → chunk-DO6NWWHU.js} +4 -4
- package/dist/hooks/{chunk-KBXZLMRH.js → chunk-G6KRCKEC.js} +216 -76
- package/dist/hooks/{chunk-JKKTVDAG.js → chunk-GDS5N2KB.js} +186 -309
- package/dist/hooks/chunk-I4XSL4TT.js +56 -0
- package/dist/hooks/{chunk-GDU26K3J.js → chunk-S6X6WYKR.js} +886 -174
- package/dist/hooks/{chunk-FO2I7UT7.js → chunk-UAGLLIGZ.js} +1 -1
- package/dist/hooks/{chunk-RFWWUI5F.js → chunk-VESKRQOF.js} +3 -3
- package/dist/hooks/{chunk-KOKOAV6D.js → chunk-VQLLNFNT.js} +6 -4
- package/dist/hooks/{chunk-LJBLGHEH.js → chunk-ZAL3NRGL.js} +4 -6
- package/dist/hooks/codex-hook-adapter.js +10 -10
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +2 -2
- package/dist/hooks/inputs.json +178 -177
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +11 -10
- package/dist/hooks/stop-guard.js +20 -6
- package/dist/josh.js +29 -3
- package/dist/version/index.js +5 -1
- package/package.json +2 -1
- package/prompts/collaboration-workflow/file-edits.md +11 -10
- package/prompts/collaboration-workflow/gh-rest.md +2 -4
- package/prompts/collaboration-workflow/glossary.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +5 -9
- package/prompts/collaboration-workflow/issue-template.md +40 -115
- package/prompts/collaboration-workflow/operating-rules.md +4 -5
- package/prompts/collaboration-workflow/output-bounds.md +12 -78
- package/prompts/collaboration-workflow/overview.md +7 -13
- package/prompts/collaboration-workflow/plan-comment.md +11 -39
- package/prompts/collaboration-workflow/principles.md +3 -4
- package/prompts/collaboration-workflow/report-format.md +28 -74
- package/prompts/collaboration-workflow/residency.md +12 -109
- package/prompts/collaboration-workflow/rule-delivery.md +98 -97
- package/prompts/collaboration-workflow/shell-body.md +3 -13
- package/prompts/collaboration-workflow/turn-batching.md +14 -88
- package/prompts/collaboration-workflow/upstream-interrupt.md +12 -14
- package/prompts/collaboration-workflow/wip-cap.md +6 -45
- package/prompts/collaboration-workflow.md +1 -13
- package/prompts/review-rubric.md +8 -71
- package/prompts/review.md +25 -55
- package/prompts/testing-guide.md +18 -67
- package/scripts/agent/agent-role-profile.ts +1 -1
- package/scripts/agent/codex-hooks.ts +3 -12
- package/scripts/backlog/backlog-budget.ts +1 -1
- package/scripts/backlog/backlog-drive-cli.ts +4 -3
- package/scripts/backlog/backlog-drive-offer-argv.ts +10 -1
- package/scripts/backlog/backlog-next.ts +15 -4
- package/scripts/backlog/backlog-offer.ts +6 -6
- package/scripts/backlog/backlog-plan-cli.ts +6 -5
- package/scripts/backlog/backlog-rank.ts +18 -9
- package/scripts/backlog/backlog-restructure.ts +152 -0
- package/scripts/backlog/backlog-waves.ts +15 -17
- package/scripts/behavior/behavior-rules.ts +11 -4
- package/scripts/cost-runtime/context-cut-threshold.ts +1 -9
- package/scripts/cost-runtime/cost-verdict.ts +15 -28
- package/scripts/delegation/investigation-reads.ts +5 -5
- package/scripts/discovery/repo-discovery.ts +21 -7
- package/scripts/discovery/repo-origin.ts +26 -0
- package/scripts/discovery/repo-party.ts +42 -1
- package/scripts/document/backlogrun-parent-read-set.ts +14 -15
- package/scripts/document/document-byte-budget.ts +34 -20
- package/scripts/document/entry-read-budget.ts +21 -9
- package/scripts/document/lane-child-read-set.ts +12 -14
- package/scripts/document/read-set-cli.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +10 -2
- package/scripts/document/resident-budget.ts +47 -0
- package/scripts/epic/epic-shape.ts +10 -13
- package/scripts/epic/epic-solo.ts +1 -1
- package/scripts/exports/unused-members-cli.ts +7 -3
- package/scripts/followup/git-followup-stages.ts +9 -0
- package/scripts/followup/git-pr-followup.ts +1 -1
- package/scripts/gh/git-gh-api-path.ts +7 -0
- package/scripts/gh/git-gh-issue.ts +5 -3
- package/scripts/gh/git-gh-pr-read.ts +4 -0
- package/scripts/gh/git-pr-checks-eval.ts +8 -0
- package/scripts/gh/git-pr-checks.ts +11 -1
- package/scripts/git/constants.ts +10 -0
- package/scripts/git/main-merge.ts +57 -21
- package/scripts/git/schemas.ts +2 -0
- package/scripts/hooks/pretool-guard-cli.ts +2 -2
- package/scripts/hooks/pretool-guard.ts +45 -2
- package/scripts/hooks/run-hook.sh +41 -0
- package/scripts/init/hook-command-rewrite.ts +18 -35
- package/scripts/init/hook-launch.ts +21 -32
- package/scripts/issue/issue-auto-ok.ts +95 -0
- package/scripts/issue/issue-file-cli.ts +53 -7
- package/scripts/issue/issue-file.ts +28 -5
- package/scripts/issue/issue-labels.ts +12 -12
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +3 -3
- package/scripts/issue/issue-read.ts +2 -2
- package/scripts/issue/issue-scout-cli.ts +2 -2
- package/scripts/issue/issue-state-cli.ts +1 -1
- package/scripts/issue/issue-state.ts +2 -2
- package/scripts/issue/issue-wip.ts +70 -0
- package/scripts/josh/hook-decision.ts +17 -0
- package/scripts/josh/josh-commands-development.ts +11 -1
- package/scripts/josh/josh-commands-issue.ts +2 -2
- package/scripts/lane/lane-launch-cli.ts +21 -3
- package/scripts/lines/bytes-command.ts +29 -6
- package/scripts/notify/telegram-notify.ts +26 -1
- package/scripts/observations/observation-ledger-line.ts +1 -1
- package/scripts/release/release-progress.ts +167 -0
- package/scripts/release/release-publish.ts +19 -8
- package/scripts/release/release-tag.ts +22 -8
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle.ts +6 -6
- package/scripts/rules/delivered-rules.ts +11 -11
- package/scripts/rules/direct-pr-create.ts +110 -0
- package/scripts/rules/file-body.ts +98 -42
- package/scripts/rules/filing-cap.ts +2 -2
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/gh-api.ts +18 -1
- package/scripts/rules/implementation-cut.ts +3 -1
- package/scripts/rules/lane-background.ts +67 -10
- package/scripts/rules/permission-guards.ts +10 -2
- package/scripts/rules/pre-gate-cut.ts +2 -2
- package/scripts/rules/stop-rules.ts +4 -4
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +56 -12
- package/scripts/run/run-carry.ts +11 -5
- package/scripts/run/run-cut-cli.ts +1 -1
- package/scripts/run/run-cut-handoff.ts +21 -1
- package/scripts/run/run-cut-report.ts +2 -2
- package/scripts/run/run-entry-cli.ts +11 -3
- package/scripts/run/run-hold-cli.ts +16 -2
- package/scripts/run/run-label.ts +50 -0
- package/scripts/run/run-merge-steps.ts +8 -3
- package/scripts/run/run-merge.ts +1 -1
- package/scripts/run/run-prep-cli.ts +6 -2
- package/scripts/run/run-prep.ts +17 -0
- package/scripts/run/run-ship-cli.ts +27 -6
- package/scripts/run/run-ship-next.ts +13 -0
- package/scripts/run/run-ship-pre-detach.ts +66 -0
- package/scripts/run/run-ship-preflight.ts +34 -3
- package/scripts/run/run-ship-return.ts +7 -4
- package/scripts/run/run-ship-review-steps.ts +1 -1
- package/scripts/run/run-ship-review.ts +26 -5
- package/scripts/run/run-ship-stage.ts +13 -0
- package/scripts/run/run-ship-steps.ts +10 -2
- package/scripts/run/run-ship-sync.ts +114 -0
- package/scripts/run/run-ship.ts +6 -0
- package/scripts/run/run-step-cli.ts +20 -7
- package/scripts/run/run-wake-cli.ts +8 -1
- package/scripts/run/run-wake-driver.ts +62 -8
- package/scripts/run/run-wake-session.ts +2 -1
- package/scripts/test/test-declared-logic.ts +1 -1
- package/scripts/test/test-red-logic.ts +17 -2
- package/scripts/test/test-red.ts +8 -7
- package/scripts/time-runtime/time-batch-guard.ts +52 -16
- package/scripts/time-runtime/time-density-hook.ts +20 -2
- package/scripts/time-runtime/time-density.ts +4 -3
- package/scripts/time-runtime/time-markers.ts +15 -4
- package/scripts/time-runtime/time-transcript-line.ts +27 -1
- package/scripts/version/npm-registry.ts +11 -1
- package/templates/workflows/ci.yml +9 -1
- package/.claude/skills/workflow-commands/followup-reference.md +0 -118
- package/dist/hooks/chunk-HANSKHES.js +0 -464
|
@@ -30,8 +30,7 @@ PR マージ・ブランチ削除・force push・共有ブランチへの push
|
|
|
30
30
|
- `fullrun` と `backlogrun` の auto-merge は、それぞれの指示自体に含まれるため許可される(本文は [`followup.md`](../../.claude/skills/workflow-commands/followup.md)、`backlogrun` の子への継承は [`backlogrun-child.md`](../../.claude/skills/workflow-commands/backlogrun-child.md))。`prrun` はマージを認可しない。それ以外の状況で勝手にマージしてはならない
|
|
31
31
|
- `kickoff` / `pnpm josh followup` 単独実行は文書化されたスコープで終了する。PR が OPEN のまま完了したら状態を報告して停止する
|
|
32
32
|
- 「チェックが全部 green だから次のステップに進む」は承認ではない
|
|
33
|
-
-
|
|
34
|
-
- **同じ規則が禁じる force push とブランチ削除も deny に載っている**(joshuafolkken/kit#1062)。**deny は規則より狭いが、その差は配送ガードが埋めている** — `git -C` を前置した綴り、短縮フラグをまとめた綴り(`git push -uf`)、`:` をリテラルにできず glob が照合できない `git push origin :branch` は、いずれも `pnpm josh rule:guard` の `git-force` 行が argv を解析して拒否する(joshuafolkken/kit#2120)。**「マージ経路は deny が保証している」とは読まないこと**
|
|
33
|
+
- **deny と配送ガードは実装であって規則ではない。** `gh pr merge`・force push・ブランチ削除の直接実行は `.claude/settings.json` の `permissions.deny` と `pnpm josh rule:guard` が拒否する(一覧は各ファイルと [`rule-delivery.md`](./rule-delivery.md) →「配送されている規則」)が、それらが取りこぼす綴りを禁じているのは本節の規則のほうである。`fullrun` の auto-merge は `pnpm josh followup` の内部から gh を起動するため影響を受けない
|
|
35
34
|
- **共有状態に影響する操作(このセクションの対象=Tier C)は迷ったら確認する。** 確認のコストは低いが、意図しない操作の巻き戻しは高コスト
|
|
36
35
|
- ただしこの「迷ったら確認」は Tier C に限る。**可逆な実装・設計判断(Tier A)は別ルール**(下記「意思決定の自律ポリシー」)に従う
|
|
37
36
|
|
|
@@ -50,9 +49,9 @@ PR マージ・ブランチ削除・force push・共有ブランチへの push
|
|
|
50
49
|
- 上記以外で staging が必要だと考えたときは、**実行せずに先に確認する**
|
|
51
50
|
- **レーンの中で競合を解決したあとの「解決済み」の記録は、ケース 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)
|
|
52
51
|
- 同じ理由で、`git reset` / `git checkout -- <path>` / `git restore <path>` など index や作業ツリーを破壊的に書き換える操作も、自分の判断で実行しない
|
|
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(`
|
|
54
|
-
-
|
|
55
|
-
-
|
|
52
|
+
- **`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(`prerequisite.md`)と同じく、**その記録だけが後で pop させられる唯一の手がかり**であり、記録し忘れた stash は誰にも拾われない。これら以外の場面で退避したくなったときは、実行せずに先に確認する
|
|
53
|
+
- **staging・index の書き換え・`git commit` の直接実行は deny されており、deny には「そのターンでユーザーが明示指示した」という例外がない。** だから上記ケース 1 は AI 側では実行できず、ユーザー自身の端末で実行してもらう。ユーザーが明示的にコミットを指示した場合も、承認済みのコミットは `pnpm josh git` を通す(理由は `docs/maintainers/operating-rules-rationale.md` → "Why the index is the user's")
|
|
54
|
+
- **ツールが通したことを許可と読み替えてはならない。** deny と `pnpm josh rule:guard`(`worktree-mutation`・`index-mutation`・`destructive-command`・`protected-file` 行)は事故防止の実装で、規則より狭い。何をしてよいかを決めるのはこのルールである
|
|
56
55
|
|
|
57
56
|
### 意思決定の自律ポリシー(確認停止を減らす)
|
|
58
57
|
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
# コマンド出力が文脈へ持ち込む量の上限(joshuafolkken/kit#1173)
|
|
2
2
|
|
|
3
|
-
**上限は機構で決まり、実行側の判断には委ねられない。**
|
|
4
|
-
|
|
5
|
-
## 何をしているか
|
|
6
|
-
|
|
7
|
-
配布される `.claude/settings.json` の `env` ブロックが `BASH_MAX_OUTPUT_LENGTH` を宣言する。Claude Code は Bash ツールの出力がこの文字数を超えると真ん中を省略して渡すので、**1 回のコマンドが文脈へ持ち込む量に harness 側で上限が掛かる**。エージェントは何も判断しない。
|
|
3
|
+
**上限は機構で決まり、実行側の判断には委ねられない。** 配布される `.claude/settings.json` の `env` ブロックが `BASH_MAX_OUTPUT_LENGTH` を宣言し、Claude Code は Bash ツールの出力がこの文字数を超えると真ん中を省略して渡す。
|
|
8
4
|
|
|
9
5
|
```json
|
|
10
6
|
"env": {
|
|
@@ -12,96 +8,34 @@
|
|
|
12
8
|
}
|
|
13
9
|
```
|
|
14
10
|
|
|
15
|
-
**8,000
|
|
16
|
-
|
|
17
|
-
## なぜ既定の 30,000 では足りないか
|
|
18
|
-
|
|
19
|
-
直近 25 セッション・tool_result 2,333 件を実測した。**Bash の出力は tool_result トークンの 87.5%(1,848 件・1,241,642 トークン)**を占める。その 1,848 件のうち **30,000 文字を超えたものは 0 件**だった — 既定の上限はこのプロジェクトで一度も作動していない。存在するが届かない上限は、上限が無いのと同じである。
|
|
20
|
-
|
|
21
|
-
Bash 出力の長さの分布(文字数): p50 = 570 / p75 = 1,920 / p90 = 4,421 / p95 = 8,342 / p99 = 15,989 / 最大 = 28,908。
|
|
22
|
-
|
|
23
|
-
上限ごとに、真ん中を省略したときに削れる量:
|
|
24
|
-
|
|
25
|
-
| 上限(文字) | 該当する呼び出し | 削れる量(tool_result 全体に対して) |
|
|
26
|
-
| -------------- | ----------------- | ------------------------------------ |
|
|
27
|
-
| 4,000 | 218 件(11.8%) | 26.6% |
|
|
28
|
-
| 6,000 | 124 件(6.7%) | 18.2% |
|
|
29
|
-
| **8,000** | **95 件(5.1%)** | **12.7%** |
|
|
30
|
-
| 10,000 | 69 件(3.7%) | 8.7% |
|
|
31
|
-
| 15,000 | 22 件(1.2%) | 2.5% |
|
|
32
|
-
| 30,000(既定) | 0 件 | 0% |
|
|
33
|
-
|
|
34
|
-
**8,000 を採ったのは p95 だからである。** 20 回に 19 回はこれまでと何も変わらず、残る 1 回だけが範囲を指定して読み直す形になる。4,000 は削れる量こそ倍だが 8 回に 1 回が切り詰められ、読み直しの往復が上限で浮かせた分を食い返す。
|
|
35
|
-
|
|
36
|
-
## 却下した案と、その理由
|
|
37
|
-
|
|
38
|
-
- **非有界コマンドを PreToolUse guard が拒否する。** 実測が否定した。tool_result の上位には `cd`(5.4%)と `for`(4.4%)が入り、先頭語を見ても正体が分からない — 命令は `cd <dir> && …` や `for n in …; do …; done` の内側にある。さらに 2 位の `sed`(16.6%)は本 Issue が推奨する範囲指定の形そのもので、構文上は有界なのに 1 ブロック 8,000 トークンを運んでいる(`sed -n '30,400p'`)。**形で見分ける案は、実データ上で外れる。** 大きさで切る案にはこの弱点がない。
|
|
39
|
-
- **共通ラッパで切り詰める(`josh` のサブコマンド等)。** ラッパを通すかどうかが実行側の判断になり、本 Issue が問題視した構造がそのまま残る。上限を機構にするという要件を満たさない。
|
|
11
|
+
**8,000 文字**(harness の既定は 30,000、受け付ける最大は 150,000)。値の根拠となった分布と却下した案は `docs/maintainers/output-bounds-rationale.md` → "Why 8,000"。上限は **Bash ツールにだけ効き**、`Read` と `Agent` の結果には効かない。
|
|
40
12
|
|
|
41
13
|
## 切り詰められたときにどうするか
|
|
42
14
|
|
|
43
15
|
**情報を落とすのではなく、必要な範囲に合わせて読み直す。** 同じコマンドを再実行しても上限は同じなので、絞り込んで読む:
|
|
44
16
|
|
|
45
17
|
- ファイルなら範囲を指定する(`sed -n '120,180p' <file>`)か、`Read` ツールの `offset` / `limit` を使う
|
|
46
|
-
- 一覧なら件数を絞る(`--limit`、`| head -30`)
|
|
47
|
-
- JSON なら必要な項目だけ取り出す(`gh api … --jq '…'`)
|
|
18
|
+
- 一覧なら件数を絞る(`--limit`、`| head -30`)、JSON なら必要な項目だけ取り出す(`gh api … --jq '…'`)
|
|
48
19
|
- どうしても全量が要るときは、いったんファイルへ落として(`> <file>`)から範囲を読む
|
|
49
20
|
|
|
50
21
|
## 切り詰められた出力を、完全な出力として読まない
|
|
51
22
|
|
|
52
|
-
**検証ゲートと差分は、切り詰められた結果で判断しない。**
|
|
23
|
+
**検証ゲートと差分は、切り詰められた結果で判断しない。** 省略された箇所には harness がマーカーを残す — それは「短い出力」ではなく「一部しか読んでいない出力」である。
|
|
53
24
|
|
|
54
|
-
- **`pnpm josh gate
|
|
55
|
-
- **差分には判定行が無い。**
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
git diff main...HEAD > /tmp/diff.patch && wc -l /tmp/diff.patch
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
**切り詰めは黙って起きない** — 省略された箇所には harness がマーカーを残す。マーカーを見たら、それは「短い出力」ではなく「一部しか読んでいない出力」である。
|
|
25
|
+
- **`pnpm josh gate`** は合否の 1 行を末尾に出すので判定は失われない。失敗の内訳が切れたら、合否行の直前に出る **`full output: <path>` のファイルを読む**(joshuafolkken/kit#1227)
|
|
26
|
+
- **差分には判定行が無い。** 欠けた差分で「指摘なし」とするのはゲートを弱めたのと同じなので、**差分はファイルへ落としてから範囲で読む**(`git diff main...HEAD > /tmp/diff.patch && wc -l /tmp/diff.patch`)
|
|
62
27
|
|
|
63
28
|
## 検証コマンドをパイプに繋がない(joshuafolkken/kit#1556)
|
|
64
29
|
|
|
65
|
-
**パイプラインの終了コードは最後のコマンドのものである。** `pnpm josh gate 2>&1 | tail -40` は `tail` の終了コードで終わるので、**赤いゲートがシェルの上では成功として返る。**
|
|
66
|
-
|
|
67
|
-
joshuafolkken/kit#1546 の実行中に実際に起きた。2 回目のゲートが `✗ verification gate failed` を印字しながら、パイプラインは 0 を返していた。失敗は本物(Prettier の整形と、マーカーテスト 1 件)で、**実行した子が出力を読んでいたから気づいた**。終了コードだけを見ていれば、赤いツリーがそのままコミットされていた。
|
|
30
|
+
**パイプラインの終了コードは最後のコマンドのものである。** `pnpm josh gate 2>&1 | tail -40` は `tail` の終了コードで終わるので、**赤いゲートがシェルの上では成功として返る。** **これは `josh gate` の欠陥ではない。** POSIX どおりの挙動であり、直すべきは呼び出し方である。
|
|
68
31
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
- **既定はパイプなしで実行する。** josh の各チェックは合否の 1 行を末尾に出すので、この文書の上限で真ん中が省略されても判定は残る(前節)。切り詰める理由がそもそも無い
|
|
74
|
-
- **出力をどうしても絞るなら、ファイルへ落として範囲で読む**(`pnpm josh gate > /tmp/gate.log 2>&1; tail -40 /tmp/gate.log`)。リダイレクトは終了コードを奪わない
|
|
75
|
-
- **パイプが避けられないなら `set -o pipefail` を前置する。** パイプラインが検証側の終了コードを運ぶ
|
|
32
|
+
- **既定はパイプなしで実行する。** 判定行は末尾に出るので、上限で真ん中が省略されても残る
|
|
33
|
+
- 絞るなら、ファイルへ落として範囲で読む(`pnpm josh gate > /tmp/gate.log 2>&1; tail -40 /tmp/gate.log`)。リダイレクトは終了コードを奪わない
|
|
34
|
+
- パイプが避けられないなら `set -o pipefail` を前置する
|
|
76
35
|
- **どの形でも、印字された判定行を読む。終了コードだけを答えにしない**
|
|
77
36
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
`gate` / `check` / `lint*` / `cspell*` / `test*` / `eval` — 合否を返すものに限る。
|
|
81
|
-
|
|
82
|
-
**`git log | head` や `gh issue list | head` は対象外であり、意図的にそうしている。** 一覧を `| head` で絞るのは読み方として正しく、そこで拒否するフックは transcript の最頻形で発火することになる。**規則を広げると無視される方向に働き、無視される規則は無い規則より悪い**(`rule-delivery.md` →「誤ったターンで発火するフックは、フックが無いより悪い」)。
|
|
83
|
-
|
|
84
|
-
**フックは 2 つの形にも黙る。** `set -o pipefail` を前置したパイプラインは検証側の終了コードを運ぶので握りつぶしていない。引用符の中のコマンド列(`--body "cd x && pnpm josh gate | tail"` のような Issue 本文)はテキストであって呼び出しではない。**どちらも「規則に従った呼び出しを拒否しない」ためである** — 配送はラン 1 回きりなので、従った呼び出しで 1 回を使い切ると、後から本当に握りつぶしている呼び出しが素通りする。
|
|
85
|
-
|
|
86
|
-
`latest:scope` / `review:brief --level-only` / `review:brief` も対象外である。これらは**判定ではなく答えを印字する**コマンドで、`$(...)` で受けるのが正しい使い方である。コマンド置換そのものの無音の失敗は別の規則が扱う(`docs/josh-commands.md` →「`VAR=$(...) && cmd`」)。
|
|
87
|
-
|
|
88
|
-
### 引き金つき配送で強制する —— 却下した 2 案
|
|
89
|
-
|
|
90
|
-
- **手順書の実行例を書き換える。** 却下。**書き換える例が存在しない。** 文書・プロンプト・skill の全体を調べて、パイプ付きの検証例は `docs/josh-commands.md` の 1 件だけで、しかもそれはこの不具合の説明そのものだった。パイプは手本から写されているのではなく、**毎ターン新しく発明されている**
|
|
91
|
-
- **呼び出し規約として書く**(「ゲートをパイプに繋ぐな」「`set -o pipefail` を前置しろ」)。却下。**同じ案が既に却下されている** — `scripts/time-runtime/time-reported-failure.ts` が「規約は守られるか守られないかのどちらかであり、図が捉えるべきは『そうすべきだったこと』ではなく『実際にしたこと』である」としてこれを退け、代わりに検出器を置いた。散文が数値を動かさなかった計測は joshuafolkken/kit#1344 と joshuafolkken/kit#1460 にもある
|
|
92
|
-
|
|
93
|
-
採ったのは**引き金つき配送**である(`rule-delivery.md`)。`pnpm josh rule:guard` が、合否を意味する josh のチェックがパイプの手前に立った `Bash` 呼び出しを**その場で拒否する**。**拒否は読み飛ばせない。**
|
|
94
|
-
|
|
95
|
-
**検出器は残る。** `scripts/time-runtime/time-reported-failure.ts` はゲート自身の `✗ verification gate failed:` 行を `is_error` の上に読む。フックが届くのは Claude Code だけで、停止スイッチを立てたセッションにも他の harness にも届かない — 検出器はその外側を覆い、かつ**規則が守られたかどうかを事後に測れる唯一の経路**である。配送と検出は代替ではなく、前者が防ぎ後者が数える。
|
|
96
|
-
|
|
97
|
-
### 検査
|
|
98
|
-
|
|
99
|
-
`scripts/rules/piped-verification-rule.test.ts` が、配送文が仕組み・逃げ道・境界の 3 つを運ぶこと、この節が規則と却下した 2 案を単一ソースとして持つこと、そして `rule-delivery.md` の列挙表に行があることを固定する。発火・非発火そのものは `scripts/rules/delivered-rules.test.ts` が両方向から固定する。
|
|
100
|
-
|
|
101
|
-
## この上限が届かないもの
|
|
102
|
-
|
|
103
|
-
`BASH_MAX_OUTPUT_LENGTH` は **Bash ツールにだけ効く**。実測では `Read` ツールが tool_result の 10.6%(単一最大 18,991 トークン)、`Agent` が 2.3% を占めており、どちらもこの上限の対象外である。別の量として別途扱う。
|
|
37
|
+
**対象は結果が合否を意味するコマンドだけ** — `gate` / `check` / `lint*` / `cspell*` / `test*` / `eval`。**`git log | head` や `gh issue list | head` は対象外であり、意図的にそうしている。** `latest:scope` / `review:brief` も、判定ではなく答えを印字するので `$(...)` で受けてよい。`pnpm josh rule:guard` がパイプの手前に検証コマンドを置いた `Bash` をその場で拒否する(`rule-delivery.md`)。経緯・却下した案・検査は `docs/maintainers/output-bounds-rationale.md` → "Why the pipe rule is delivered by a trigger"。
|
|
104
38
|
|
|
105
39
|
## 検査
|
|
106
40
|
|
|
107
|
-
`scripts/lib/bash-output-cap.test.ts`
|
|
41
|
+
`scripts/lib/bash-output-cap.test.ts` が、配布設定の上限がこの文書の値と一致し、harness の既定より小さく最大を超えないことを固定する(`docs/maintainers/output-bounds-rationale.md` → "What the tests pin")。
|
|
@@ -15,28 +15,22 @@
|
|
|
15
15
|
|
|
16
16
|
一括実行する場合は `fullrun new` で Step 1〜5 を通しで実行する。
|
|
17
17
|
|
|
18
|
-
### 手順の置き場所(常時ロードとオンデマンドの分離)
|
|
19
|
-
|
|
20
|
-
`kickoff` / `fullrun` / `halfrun` / `backlogrun` の**操作手順**は、常時ロードされる `CLAUDE.md` からは外され、`.claude/skills/workflow-commands/` に置かれている(joshuafolkken/kit#854)。`CLAUDE.md` に残るのはキーワードとスキルへの導線、およびスキルが読み込まれていない状態でも効く必要のある規則だけである。依存更新後の overrides / `devEngines` 検証手順も同様に `.claude/skills/dependency-update/` へ移した。**どの規則が「残す」側かは →「常駐ドキュメントと skill の分担(何を常駐に残すか)」が判定基準と全 4 件を定義する。**
|
|
21
|
-
|
|
22
|
-
規則の本文は話題ファイルか skill のどちらか 1 か所にだけ置き(どちらに置くかは →「常駐ドキュメントと skill の分担」)、規則が使う数字はコードの定数と、それを述べる 1 文書にだけ置く。**他の文書はその置き場所を指すだけで言い直さない** — 同じ内容を 2 か所に書くと、片方を変えた瞬間にもう片方が古くなる(joshuafolkken/kit#2996)。
|
|
23
|
-
|
|
24
18
|
### 出力の言語(`JOSH_SESSION_LANG`)
|
|
25
19
|
|
|
26
20
|
ワークフローの出力言語は、環境変数 `JOSH_SESSION_LANG`(例: `ja` / `en`)で決まる。対象は「開発者との対話」と「成果物の散文」の**両方**であり、**変数が未設定・空・`.env` なしのときはどちらも `ja` を既定とする**。英語で書くなら `JOSH_SESSION_LANG=en` を設定する。
|
|
27
21
|
|
|
28
|
-
- **対話は `JOSH_SESSION_LANG` に従う**: セッション中の説明・質問、および `halfrun` などで提示する **`AskUserQuestion`
|
|
29
|
-
- **成果物の散文も `JOSH_SESSION_LANG` に従う**: Issue 本文、Issue/PR コメント(Step 3 の計画コメント、`pnpm josh followup` が自動投稿する完了コメントを含む)、Telegram 通知の本文(`--body` / `--notify-message
|
|
22
|
+
- **対話は `JOSH_SESSION_LANG` に従う**: セッション中の説明・質問、および `halfrun` などで提示する **`AskUserQuestion` の選択肢ラベル・説明**。
|
|
23
|
+
- **成果物の散文も `JOSH_SESSION_LANG` に従う**: Issue 本文、Issue/PR コメント(Step 3 の計画コメント、`pnpm josh followup` が自動投稿する完了コメントを含む)、Telegram 通知の本文(`--body` / `--notify-message`)。
|
|
30
24
|
- **設定に関わらず英語で固定するもの**(3 つ):
|
|
31
|
-
1. **Issue/PR タイトル**: Step 1 のタイトル正規化ルールは変更しない。
|
|
32
|
-
2. **コード内コメント、テストタイトル(`describe` / `it` / `expect
|
|
33
|
-
3. **スクリプトが出力する固定文字列**: Telegram のヘッダーラベル(`Planning` / `Completion` など)、`Issue:` / `PR:` の URL ラベル、`--notify-message` 省略時の既定メッセージ。
|
|
25
|
+
1. **Issue/PR タイトル**: Step 1 のタイトル正規化ルールは変更しない。
|
|
26
|
+
2. **コード内コメント、テストタイトル(`describe` / `it` / `expect`)、コミットメッセージ**。
|
|
27
|
+
3. **スクリプトが出力する固定文字列**: Telegram のヘッダーラベル(`Planning` / `Completion` など)、`Issue:` / `PR:` の URL ラベル、`--notify-message` 省略時の既定メッセージ。
|
|
34
28
|
|
|
35
|
-
`JOSH_SESSION_LANG` は **開発者個人の設定**であり、`.env`(gitignore
|
|
29
|
+
`JOSH_SESSION_LANG` は **開発者個人の設定**であり、`.env`(gitignore 済み・非コミット)に置く。**解決値は毎ターン、`UserPromptSubmit` フック(`pnpm josh session:lang`)がコンテキストへ差し込む。** フック出力を表示しないハーネス(Codex / Gemini / Cursor)は `.env` を読んで解決する。各既定の理由は `docs/maintainers/overview-rationale.md` → "Why the session language defaults the way it does" にある。
|
|
36
30
|
|
|
37
31
|
### 配布ドキュメントの層ごとの言語(joshuafolkken/kit#2997)
|
|
38
32
|
|
|
39
|
-
|
|
33
|
+
ドキュメントは**層ごとに 1 つの言語**で書き、1 つの層の中で言語を混ぜない。`JOSH_SESSION_LANG` はこれを変えない。
|
|
40
34
|
|
|
41
35
|
| 層 | 言語 |
|
|
42
36
|
| --------------------------------------------------------------------------------------- | ------ |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
## Step 3: 計画コメントを記録して通知する
|
|
2
2
|
|
|
3
3
|
1. 提案を人間が判断する
|
|
4
|
-
2. 採用した計画を Issue に記録する(Issue body
|
|
4
|
+
2. 採用した計画を Issue に記録する(Issue body が空の場合は計画をファイルに書き、`gh api -X PATCH repos/{owner}/{repo}/issues/<N> --field body=@<path>` で body に書き込む — 本文はパスで渡し、シェルの二重引用符には載せない(`shell-body.md`)。body が既にある場合は `pnpm josh issue:comment <N> --body-file <path>` でコメント追加する)
|
|
5
5
|
3. Telegram で計画開始を通知する:
|
|
6
6
|
|
|
7
7
|
```bash
|
|
@@ -9,48 +9,34 @@
|
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
- `--task-type` はヘッダーのアイコンを決める(`planning` 📋 / `completion` ✅ / `failure` ❌ / `warning` ⚠️ / `kickoff_retry` 🔄 / `confirmation` ⏸️)
|
|
12
|
-
- `warning` は **`pnpm josh followup` が自分で送る種別**
|
|
12
|
+
- `warning` は **`pnpm josh followup` が自分で送る種別** であり、手で打つものではない(joshuafolkken/kit#1628)
|
|
13
13
|
- `--repo-name` と `--issue-title` は未指定なら `gh` から自動取得される
|
|
14
|
-
- Issue URL
|
|
15
|
-
- 箇条書きの間に改行を入れて読みやすくする
|
|
14
|
+
- Issue URL を必ず含め、箇条書きの間に改行を入れる
|
|
16
15
|
- `kickoff` コマンドの場合はここで **停止** する(実装に進まない)
|
|
17
16
|
|
|
18
|
-
4.
|
|
17
|
+
4. ワークフロー開始時点で作業ツリーにステージング済みまたは変更済みのファイルが既にある場合、先に変更を退避する:
|
|
19
18
|
```bash
|
|
20
|
-
git stash push -m "plan: pre-existing changes"
|
|
19
|
+
git stash push -u -m "plan: pre-existing changes"
|
|
21
20
|
```
|
|
22
21
|
5. メインブランチへ切り替えて最新を取得する:
|
|
23
22
|
```bash
|
|
24
23
|
git switch main && git pull
|
|
25
24
|
```
|
|
26
|
-
6.
|
|
27
|
-
|
|
28
|
-
pnpm latest
|
|
29
|
-
# 脆弱性が見つかった場合: package.json の overrides に対象バージョンを追加して pnpm install 後に再確認
|
|
30
|
-
```
|
|
31
|
-
ステップ 4 で stash した場合は、ここでメッセージ指定で復元する(位置指定や引数なしの `git stash pop` は使わない — stash は全 work tree が共有する 1 本のスタックで、別のレーンの stash を取り込む恐れがある。joshuafolkken/kit#2050):
|
|
25
|
+
6. 依存関係の更新はコマンドに問う — `pnpm josh latest:scope` が `required` と答えたときだけ `pnpm josh latest` を実行し、`dependency-update` スキルに従う(単一ソースは `.claude/skills/workflow-commands/latest-gate.md`)。脆弱性への override は `pnpm-workspace.yaml` の `overrides` に書く(pnpm 11/12 は `package.json` の `pnpm.overrides` を無視する)。
|
|
26
|
+
ステップ 4 で stash した場合は、ここでメッセージ指定で復元する(stash は全 work tree が共有するため、位置指定や引数なしの `git stash pop` は使わない — joshuafolkken/kit#2050):
|
|
32
27
|
```bash
|
|
33
28
|
pnpm josh stash:pop "plan: pre-existing changes"
|
|
34
29
|
```
|
|
35
|
-
7. **作業サマリを提示してから**実装を開始する(`CLAUDE.md` の Code Change Rules Step 0
|
|
36
|
-
|
|
37
|
-
`fullrun` / `halfrun` / `backlogrun` では Issue ごとに 1 回、実装に着手する直前に提示する。**Issue body が既に埋まっていて計画コメントを投稿しなかった場合も必ず提示する**(この場合ユーザーには他に作業内容が見えないため)。`kickoff` は既に計画を Issue に投稿するので対象外。
|
|
38
|
-
|
|
39
|
-
提示は説明のためであり、**確認待ちで停止する意味ではない**。同一ターンでそのまま実装へ進むこと(停止条件にはならず、`/code-review` → `followup` のチェーン規則にも影響しない)。セッション向け出力のみに留め、Issue コメントとしては投稿しない。
|
|
40
|
-
|
|
30
|
+
7. **作業サマリを提示してから**実装を開始する(`CLAUDE.md` の Code Change Rules Step 0)。書式は `report-format.md` に従う。`fullrun` / `halfrun` / `backlogrun` では Issue ごとに 1 回、Issue body が既に埋まっていても必ず提示する(`kickoff` は計画を Issue に投稿するので対象外)。提示は説明のためであり、**確認待ちで停止しない** — 同一ターンでそのまま実装へ進み、Issue コメントとしては投稿しない。
|
|
41
31
|
8. 実装完了後、**lint/test より前に** `prompts/refactoring.md` に従ってリファクタリングを適用する(高・中優先度項目が残らなくなるまで収束させる)
|
|
42
32
|
9. 検証ゲート(`CLAUDE.md` の Completion gate)を実行する
|
|
43
33
|
|
|
44
|
-
`pnpm josh git` の基本実行(`-y`
|
|
34
|
+
`pnpm josh git` の基本実行(`-y` で確認プロンプトをスキップ)。**子はバージョンを上げない** — 版を決めるのは `pnpm josh release` ただ 1 箇所である(joshuafolkken/kit#1486)。Issue タイトルは実行前に整える(規則は `issue-template.md` の Step 1 冒頭)。
|
|
45
35
|
|
|
46
36
|
```bash
|
|
47
37
|
pnpm josh git -y "<issue-title> #<issue-number>"
|
|
48
38
|
```
|
|
49
39
|
|
|
50
|
-
> **Note**: Issue タイトルは `pnpm josh git` を実行する前に、簡潔で明瞭な英語に整えること。
|
|
51
|
-
> 日本語で書かれている場合は英語に変換する。すでに英語で書かれている場合でも、文法・明確さ・簡潔さの観点で改善できるなら書き換えて良い(AI ツールは実装前にタイトル品質を判断する)。
|
|
52
|
-
> いずれの場合も `gh api -X PATCH repos/{owner}/{repo}/issues/<number> -f title="<english-title>"` で GitHub Issue タイトルを合わせて更新する。
|
|
53
|
-
|
|
54
40
|
### Recovery after failed push (pre-push hook blocked)
|
|
55
41
|
|
|
56
42
|
If `pnpm josh git -y` fails at the push step (e.g. blocked by the pre-push hook), fix the blocking issue and then recover with:
|
|
@@ -66,20 +52,6 @@ pnpm josh pr
|
|
|
66
52
|
|
|
67
53
|
**Do not** run `gh pr create` directly — it bypasses `build_body` which generates `closes #N`, causing the Issue to remain open after merge.
|
|
68
54
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
**`/code-review` の出力で停止してはならない**という連鎖規則の本文は、`.claude/skills/workflow-commands/chain-rule.md` にある — 停止してよい 2 状況、決定表、アンチパターン集、ターン終端セルフチェックはすべてそこが単一ソースである(joshuafolkken/kit#1186)。
|
|
72
|
-
|
|
73
|
-
### レビュー工程は実装セッションがコミット前に実行する
|
|
74
|
-
|
|
75
|
-
ワークフロー内のレビュー工程(各フローの `pnpm josh review:brief` と `/code-review <what it printed>`)は、**実装したセッション自身が、コミットの前に**インラインで実行する。対象は `git diff main`、実行時期は検証ゲートの後半(refactor → **`pnpm josh gate` をレビューと同時に開始し、コミット前に join する** → `/code-review` with the brief `pnpm josh review:brief` prints)であり、`fullrun` / `halfrun` / `backlogrun` のいずれも同じ時期・同じ対象でレビューする。1 周目の High/Medium はその場で修正し、**指摘を潰し切ってから最初のコミットを作る**。ただし**2 周目は 1 周目の反復ではなく、修正の検証パスである** — 対象は差分全体ではなく 1 周目の修正が触った範囲(fix delta)で、問いは「各指摘は実際に閉じたか/修正自体が欠陥を入れていないか」に変わる。基準は変わらず、閉じていない指摘は元の severity のまま残る(`prompts/review-rubric.md` → "The second round is a verification pass, not a second full review")。**再実行は 2 周まで**であり、2 周を終えた時点で残る High 以外の指摘は、**内容から機械的に決まる 3 分岐**に振り分ける(`prompts/review.md` → "Review round cap")。分岐は、既に触れているファイル内で数行・設計判断なしに閉じるなら**その場で直す(新しいレビュー巡は起こさない)**、実行経路に届くか判断が要るなら**起票する**、利用者に届かない Low なら**PR に 1 行残して落とす**、の 3 つ。同じ根本判断に帰着する複数の指摘は**1 件の Issue にまとめる**。起票する場合、**切り出しは起票では終わらない** — 起票に続けて `pnpm josh epic:bundle <新規>` を実行し、`add_to_epic` / `create_epic` は確認せずに実行する。**ただし PR を開くフロー(`fullrun` / `backlogrun`)では、起票と束ね直しの実行位置はコミットの前ではなく `pnpm josh git -y` の後・`pnpm josh followup` の前**である。`halfrun` は PR を開かず、隠れる先の CI が無いので、振り分けが決まった時点で実行する(→「後追い Issue は起票した直後に EPIC へ束ね直す」)。したがって PR に貼るレビューコメントは発生しない。
|
|
76
|
-
|
|
77
|
-
**PR を開く位置は 2 周の間である**(joshuafolkken/kit#1261)。1 周目の修正が入ったら `pnpm josh gate` → join → `pnpm josh git -y` の順で進め、**2 周目は そのコミットが起動した CI と並走させる**。join とコミットの間でツリーを書き換えるものは何も無い(joshuafolkken/kit#1486 で子のバージョン上げが消えた)ので、コミットが乗るゲートはそのツリーちょうどを覆い、2 周目のブリーフは `Already verified` のままである。2 周目がその場修正を出した場合だけ、同一ブランチへの追加コミットが 1 つ増え、そのコミットに対して CI が回り直す — マージが待つのはその結果である。1 周目が clean なら 2 周目自体が無いので、順序は従来どおり。単一ソースは `.claude/skills/workflow-commands/chain-rule.md` → "The pull request opens between the rounds, so CI runs beside round 2"。
|
|
78
|
-
|
|
79
|
-
**その追加コミットは、ゲートより先に push する**(joshuafolkken/kit#1326)。修正が届く単一チェック(`pnpm josh lint:related` / `pnpm josh cspell:dot` / `pnpm josh test:related` / そのプロジェクト自身の型チェック)を回してから `pnpm josh git -y "<title> #<N>"` を打ち、`pnpm josh gate` はその push が起動した CI と並走させて **`pnpm josh followup` の前に join する**。先に push しても未検証のコードを送ることにはならない — commit / push フックがステージ済みファイルの lint・スペルチェックと型検査、そしてユニット全件を走らせ、CI 側の `Checks` ジョブは `pnpm josh gate --verbose` を実行するからである。それでも join を省いてよいわけではない: `followup` は PR のチェックだけを読み、ゲートの記録は読まない。ゲートが赤なら直して同じ単一チェックを回し直し、もう一度 `pnpm josh git -y` を打つ。追い越された CI は `ci.yml` の `concurrency: cancel-in-progress: true` によって打ち切られ、マージが待つのは常に HEAD コミットのチェックである。マージ条件(必須チェック全緑・ゲート緑・変更要求なし)は一切緩めない。単一ソースは `.claude/skills/workflow-commands/chain-rule.md` → "The round-2 fix commit is pushed before its gate"。
|
|
80
|
-
|
|
81
|
-
**2 周目が clean なら、その結果を読んだターンでマージを打つ**(joshuafolkken/kit#1333)。joshuafolkken/kit#1326 の run(PR #1327)では、CI がレビュー 2 周目の内側に完全に隠れてもなお、全チェック緑(06:34:37)からマージ(06:36:51)まで 134 秒が残り、うち **19 秒はレビュー結果を読んだターンと `followup` を打つターンが別だっただけの空白**だった(同 run はモデル 1 往復あたり平均 10.1 秒・67 往復)。clean かどうかは判断ではなく機械的に決まり、条件は 2 つある — **確定した High が残っていないこと**と、3 分岐の 1(その場で直す)に振り分けた指摘が 1 件も無いこと。High はそもそも 3 分岐のいずれにも入らないので、branch 1 の条件だけでは High について何も言っていない — 2 周を終えてなお残る High は `confirmation` 通知を送って run を止める側であり、マージは打たない。**Low だけが出た周は clean である**(Low は分岐 2 か 3 に入り、どちらもコードを 1 行も変えない)。起票(分岐 2)と PR への 1 行注記(分岐 3)はコードを 1 行も変えないので、`pnpm josh epic:bundle` まで含めて**同じターンのマージ発行より前**に置き、最後の 1 つが返った時点でマージを打つ。**検証は何ひとつ省かない** — ゲートの join と緑、必須 CI チェックはいずれも従来どおり読み、`followup` が待つものも変わらない。縮むのは「読んでから打つまで」の空白だけである。2 周目がその場修正を出した場合はこの規則の対象外で、直前の段落が定める順序(単一チェック → push → ゲートを CI と並走 → join → マージ)に入る。単一ソースは `.claude/skills/workflow-commands/chain-rule.md` → "A clean second round issues the merge in the same turn"。
|
|
82
|
-
|
|
83
|
-
**そのゲートは 1 ラン 1 回であって、1 編集 1 回ではない**(joshuafolkken/kit#1246)。kit#1242 が決めたのは 1 回のゲートを**いつ**開始するかであって、**何回**回るかには触れていない。実測(kit#1241)では 49.1 分のランでゲートが 10 回・合計 8.2 分を占め、うち 6 回はレビュー開始前の「いま入れた編集が通ったか」の確認で、答えを出したのは毎回 lint か cspell の 1 チェックだけだった。**実装中は、単一チェックを名前で回す**(`pnpm josh lint:related` / `pnpm josh cspell:dot` / `pnpm josh test:related` / そのプロジェクト自身の型チェック)。**そこでのユニットチェックは絞り込んだ側**である(joshuafolkken/kit#1257)— `pnpm josh test:related` は変更ファイルが到達するテストだけを走らせ、絞り込めないときは全件に戻ってその旨を印字する。全件を走らせる `pnpm josh test:unit` は、コミット前のゲートが回すものとして変わらない。一度ゲートを回した後は、各ブロックのヘッダが実際に走ったコマンドを印字しているので、そこからコピーすればよい。全ゲートか単一チェックかは**「レビューが始まったか」**だけで決まり、編集の大きさでは決まらない。レビューと同時にゲートを開始した後は、赤の修正も指摘の修正もツリーを変えて前の結果を陳腐化させるので、単一チェックに戻るのではなく全ゲートを回し直す。分岐表は `.claude/skills/workflow-commands/chain-rule.md` → "The gate runs beside this review, not in front of it" にある。
|
|
55
|
+
### レビューからマージまで
|
|
84
56
|
|
|
85
|
-
|
|
57
|
+
レビューは実装したセッションが**コミットの前に** `pnpm josh review:brief` で始め、`/code-review` は `Agent` ツールのサブエージェントが実行する。ゲートとの重ね方、2 周の上限と 2 周目の検証パス、2 周の間で PR を開く位置、残った指摘の振り分けと `pnpm josh epic:bundle`、マージを打つターンは、すべて `.claude/skills/workflow-commands/chain-rule.md` が単一ソースである — "Run the review-to-merge chain"、"The review runs in a subagent, never a main-line skill load"、方針は `prompts/review.md` → "Review round cap"。**`/code-review` の出力で停止しない。**
|
|
@@ -70,14 +70,13 @@
|
|
|
70
70
|
|
|
71
71
|
- **規則の追加・仕様変更・文言修正・節の追加は `CLAUDE.md` に 1 回だけ書く。** 他の 2 本には触れない
|
|
72
72
|
- **導線文書に規則を書き戻さない。** そこに書かれた規則は、次の改訂で更新し忘れる 4 つ目の置き場になる
|
|
73
|
-
- `
|
|
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"
|
|
73
|
+
- 経緯と機械的な検査は `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"
|
|
75
74
|
|
|
76
75
|
### Claude Code 以外のエージェントでの読み替え
|
|
77
76
|
|
|
78
|
-
`CLAUDE.md` は Claude Code 向けに書かれており、その機能を名指しする。Codex・Gemini CLI
|
|
77
|
+
`CLAUDE.md` は Claude Code 向けに書かれており、その機能を名指しする。Codex・Gemini CLI など別のエージェントは次のように読み替える(joshuafolkken/kit#3079)。
|
|
79
78
|
|
|
80
|
-
- **フック**: フックが走らない、または出力が見えないツールでは、フックが届ける規則を自分で適用する。その一覧は手書きせず、[`rule-delivery.md`](./rule-delivery.md)
|
|
79
|
+
- **フック**: フックが走らない、または出力が見えないツールでは、フックが届ける規則を自分で適用する。その一覧は手書きせず、[`rule-delivery.md`](./rule-delivery.md) →「配送されている規則」の一覧を正とする — 一覧の各項目が、そのツールでは自分で守る規則である。一覧の外でフックが担う 3 つも同じく自分で行う — 最初の実行時コード編集の前に Step 0 の作業サマリを提示する、編集ごとの整形フックに頼らず編集後に `pnpm josh lint:related` と `pnpm josh cspell:dot` を走らせる、`JOSH_SESSION_LANG` は注入を待たずに `.env` から解決する。フックの全体は `.claude/settings.json` の `hooks` が正である
|
|
81
80
|
- **Skill・`/verify-ui`・`/code-review`**: `CLAUDE.md` が skill のロードやサブエージェントでの実行を指示する箇所では、その skill の `SKILL.md` を読み、自分のセッションで従う
|
|
82
81
|
- **`.claude/settings.json` の deny list** は効かない。それが裏付ける規則 — 指示なしのコミット・マージ・ステージングその他の共有状態変更をしない — はそのまま拘束する
|
|
83
82
|
- **`AskUserQuestion`** は、ユーザーに平文で尋ねることを指す
|
|
@@ -2,27 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
作業前サマリ(Step 7)と完了報告(Step 5)は、**平易な概要を先頭に置き、技術詳細をその下に降格する 2 層構造**で書く。ここが横断ドキュメント(`CLAUDE.md`)のカノニカル参照。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
### 機械的な半分は `josh report:lint` が検査する
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
**このフォーマットには機械が判定できる半分がある** — ラベルの有無、概要行の字数上限、コードフェンス囲みでないこと、概要へのファイルパス・CLI フラグの混入。これらは目視ではなく `pnpm josh report:lint` に標準入力でサマリを渡して検査する(`ok` か違反行を印字する)。以下の各節はその**理由**を述べる散文であり、判定の一次ソースはコマンド側の定数である(joshuafolkken/kit#2123)。
|
|
10
|
-
|
|
11
|
-
**判断が要る半分はコマンドの対象外で、散文として残す** — 「主語が具体的か」(下記「具体的な主語を必ず書く」)は機械には答えられない。この節が縮むのは機械的な半分の記述だけで、判断の半分はここに残る。
|
|
7
|
+
ラベルの有無、概要行の字数上限、コードフェンス囲みでないこと、概要へのファイルパス・CLI フラグの混入、ケース段と「壊れるとしたら」段の形は、サマリを標準入力で `pnpm josh report:lint` に渡して検査する(`ok` か違反行を印字する。判定の一次ソースはコマンド側の定数 — joshuafolkken/kit#2123)。この文書に残るのは、テンプレートと、機械には答えられない判断(下記「具体的な主語を必ず書く」)である。
|
|
12
8
|
|
|
13
9
|
### 出力はコードフェンスで囲まない(必須)
|
|
14
10
|
|
|
15
|
-
以下のテンプレートは
|
|
16
|
-
|
|
17
|
-
理由: セッション出力はターミナルでマークダウンとして描画される。フェンスで囲むとブロック全体に背景色と等幅フォントが当たり、平易な概要を読みやすくするという書式の目的と正面から衝突する。特に日本語の文章は等幅で詰まって読みづらくなる。
|
|
18
|
-
|
|
19
|
-
そのため、テンプレートは**素のマークダウンとして成立する形**で定義してある。空白を並べた桁揃えは使わない(マークダウンは連続空白を 1 つに潰すため崩れる)。ラベルは太字、行は箇条書きで表す。`---` を単独行に置くのも避ける(水平線として描画される)。
|
|
11
|
+
以下のテンプレートは **フェンスの中身だけ**をセッションに書く。フェンスで囲むと等幅・背景色で描画され、平易な概要が読みにくくなる。空白での桁揃えと単独行の `---` も使わない(前者は潰れ、後者は水平線になる)。
|
|
20
12
|
|
|
21
13
|
### ラベルはセッション言語に訳し、注釈は付けない(必須)
|
|
22
14
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
**(1) ラベルはセッション言語に訳す。** テンプレートは英語ドキュメント側の定義であり、セッションにはその訳を出す。日本語セッションでの対応:
|
|
15
|
+
**(1) ラベルはセッション言語に訳す。** 英語のまま残すのは誤り。日本語セッションでの対応:
|
|
26
16
|
|
|
27
17
|
| 英語ドキュメントのラベル | 日本語セッションでの表記 |
|
|
28
18
|
| -------------------------------------------------------- | --------------------------------------------------------------------- |
|
|
@@ -34,11 +24,9 @@
|
|
|
34
24
|
| `■ Hand-off`(区切り) | `■ 区切り` |
|
|
35
25
|
| `Done` / `Remaining` / `Why it stopped` / `Next command` | `終わったこと` / `残っていること` / `止めた理由` / `次に打つコマンド` |
|
|
36
26
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
**(2) ラベルに注釈を付けない。** 書式の説明(「平易な説明」「先頭に置く」など)を括弧書きでラベルに足さない。`■ 概要(平易な説明)` は誤りである。
|
|
27
|
+
成果物の散文(Issue 本文、Issue/PR コメント、Telegram 本文)の中のラベルもこの表に従って訳す。英語のまま残るのは「出力の言語(`JOSH_SESSION_LANG`)」が挙げた 3 つだけである。
|
|
40
28
|
|
|
41
|
-
|
|
29
|
+
**(2) ラベルに注釈を付けない。** `■ 概要(平易な説明)` は誤り。注意書きはラベルではなく、ラベルの下の説明文に置く。
|
|
42
30
|
|
|
43
31
|
### 作業前サマリ(セッション向け・`JOSH_SESSION_LANG` の言語)
|
|
44
32
|
|
|
@@ -67,42 +55,20 @@
|
|
|
67
55
|
2. ...
|
|
68
56
|
```
|
|
69
57
|
|
|
70
|
-
**テスト宣言はケース単位の 2 段で書く(joshuafolkken/kit#2246
|
|
58
|
+
**テスト宣言はケース単位の 2 段で書く(joshuafolkken/kit#2246)。**
|
|
71
59
|
|
|
72
|
-
**第 1
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
**1 ケース=1 テスト関数ではない。** 宣言の単位とテストの単位は別で、複数ケースは `it.each` 1 本に畳んでよい。テスト本数は増えない。
|
|
77
|
-
|
|
78
|
-
**境界の必須異常系はコマンドが突きつける。** 差分が HTTP・プロセス起動・ファイル IO・時間の境界を跨ぐとき、その境界の異常系(非 200・タイムアウト・空レスポンス・不正 JSON・レート制限、時間なら期限超過・重複発火など)は第 2 段に載せる。跨いだ境界と必須異常系語彙は `pnpm josh cases <path...>` が変更パスから読んで印字するので、判断ではなくコマンドの答えになる。ユニットスイートは構造的にネットワークを遮断している(`scripts/test/test-network-guard.ts`)ため、境界の異常系はスイートで実行されず、**宣言の側で突きつける**しかない。
|
|
60
|
+
- **第 1 段(ケース)** は固定語彙を並べ、**該当しないものは `該当なし` に続けて理由を書いて消す**。効くのは消した行で、漏れが「考えなかった」から「考えて外した」に変わる
|
|
61
|
+
- **第 2 段(壊れるとしたら)** は、この変更に固有の壊れうる条件を**最低 3 件**書く。書けないときは `どう呼ばれても壊れない` と明示する
|
|
62
|
+
- 1 ケース=1 テスト関数ではない。複数ケースは `it.each` 1 本に畳んでよい
|
|
63
|
+
- **境界の必須異常系はコマンドが答える。** 差分が HTTP・プロセス起動・ファイル IO・時間の境界を跨ぐとき、`pnpm josh cases <path...>` が印字する異常系を第 2 段に載せる(ユニットスイートはネットワークを遮断しているため、宣言の側で突きつけるしかない)
|
|
79
64
|
|
|
80
65
|
### 行数予算は編集前に読む
|
|
81
66
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
```bash
|
|
85
|
-
pnpm josh lines <path> [<path>...] # コード行数 / 上限 / 残り、および上限に近いかどうか
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
- **手順は 2 つだけ。** Step 0 の「対象」に書くファイルを `pnpm josh lines` に渡し、**上限に近いと言われたファイルには、その場で分割方針を「対象」に書く**。書き足す量が残りを超えると分かった時点で、どこを切り出すかは設計判断であり、gate の指摘を待つ理由はない。
|
|
89
|
-
- **近いかどうかは判断ではなくコマンドの答え。** 上限(ファイル 300 コード行)の 85% から「近い」で、境界はレポート自身が毎回 `near from` として印字する。85% という比率は joshuafolkken/kit#951 の常駐予算と同じ形 — 「上限に当たった」を、まだ直しを書く余裕があるうちに警告に変えるための余白 — から来ており、joshuafolkken/kit#1249(配布ドキュメントの resident budget)はまだ未実装で揃えるべき数値を持たない。常駐予算の比率(60,000 バイト中 2,000、3.3%)をそのまま当てると余白は 10 行、関数 1 個ぶんにも足りず、行き先のない警告になる。
|
|
90
|
-
- **数え方は lint のものであり、`wc -l` ではない。** `max-lines` は `skipBlankLines` / `skipComments` 付きで走るのでコメントと空行は数えず、厚くコメントされたファイルは物理 453 行で 300 を通る(joshuafolkken/kit#1070)。このコマンドは行を自分で数えず、**`pnpm josh lint` と同じ eslint 実行に `max-lines` の上限だけを 0 にして尋ね**、ルール自身が報告した数値をそのまま出す。in-process の eslint API は `#!` で始まるファイルで **CLI より 1 行少なく答える**(eslint 10.10.0 で実測、CLI 301 に対し API 300)ため、gate と一致する CLI を必ず経由する。
|
|
91
|
-
- **上限そのものは変わらず、これは第 2 の enforcement point でもない。** レポートは大きいファイルで失敗しない — 上限を課すのは lint であり、同じ条件で非ゼロ終了するコマンドをもう 1 つ置けば、「別の数え方で上限を満たす」という `CLAUDE.md` が禁じる workaround への入口になる。変わるのは**いつ知るか**だけである。
|
|
92
|
-
- **対象外**: 関数単位の上限(25 コード行)はこのコマンドの対象ではない。`pnpm josh lint` が報告する。
|
|
93
|
-
|
|
94
|
-
### 変更対象はまとめて読んでから編集する(実装前・joshuafolkken/kit#2202)
|
|
95
|
-
|
|
96
|
-
**Step 0 の「変更とテスト」が変更対象ファイルを列挙した直後、それらを 1 回の `pnpm josh read:files` で読む。** 行数予算の一手順(上の `pnpm josh lines`)と同じ位置 — 列挙された「対象」に対して実装前に打つ定型コマンド — であり、助言ではなく手順である。
|
|
67
|
+
**「対象」に書くファイルは、書き始める前に `pnpm josh lines <path> [<path>...]` に渡し、上限に近いと言われたファイルには、その場で分割方針を「対象」に書く**(事後の `max-lines` 対応は run 時間の約 2 割を食っていた — joshuafolkken/kit#1425)。近いかどうかと行数はコマンドの答えであり、`wc -l` では数えない。関数単位の上限は `pnpm josh lint` が報告する。
|
|
97
68
|
|
|
98
|
-
|
|
99
|
-
pnpm josh read:files <path> [<path> ...] # 変更対象を 1 ターンでまとめ読み
|
|
100
|
-
```
|
|
69
|
+
### 変更対象はまとめて読んでから編集する(joshuafolkken/kit#2202)
|
|
101
70
|
|
|
102
|
-
|
|
103
|
-
- **助言でないのは、密度を動かした実績があるのが合成コマンドだけだからである**(#2165 / #2162)。助言(#1304)・実行中の提示(#1329 / #1337)・レーン子の通知(#2164)はいずれも動かさず、バッチガードは子で `off`(#2178)なので、実装中の独立編集に効く梃子はこの入口が唯一。
|
|
104
|
-
- 上限超過時は本文を出さず「Read ツールで 1 ターンにまとめて読め」と返す。根拠と前後は [`turn-batching.md`](turn-batching.md) →「実装中の独立編集に効く合成コマンド」。
|
|
105
|
-
- **読んだ後の独立した編集は、1 回の `pnpm josh edit:files -` で送る(joshuafolkken/kit#2493)。** 計画ファイルを作らず、クォート付きヒアドキュメント(`<<'EDITS'`)で old/new の組を標準入力に渡す。形式と拒否条件は `docs/josh-commands-automation.md` →「`josh edit:files`」。**個別の `Edit` に戻すのは**、前の編集結果に依存する編集(`dependent` で拒否される)、編集が 1 件だけのとき、ファイル全体を書くとき(`Write`)の 3 つ。
|
|
71
|
+
**「変更とテスト」が変更対象ファイルを列挙した直後、それらを 1 回の `pnpm josh read:files <path> [<path> ...]` で読み、続く独立した編集は 1 回の `pnpm josh edit:files -` で送る**(形式は `docs/josh-commands-automation.md` →「`josh edit:files`」)。**個別の `Edit` に戻すのは**、前の編集結果に依存する編集(`dependent` で拒否される)、編集が 1 件だけのとき、ファイル全体を書くとき(`Write`)の 3 つ。根拠は [`turn-batching.md`](turn-batching.md) →「実装中の独立編集に効く合成コマンド」。
|
|
106
72
|
|
|
107
73
|
### 完了報告(セッション向け)
|
|
108
74
|
|
|
@@ -122,15 +88,11 @@ pnpm josh read:files <path> [<path> ...] # 変更対象を 1 ターンでま
|
|
|
122
88
|
- 残課題: <なければ「なし」>
|
|
123
89
|
```
|
|
124
90
|
|
|
125
|
-
**実行証跡は「動くこと」の証拠であり、gate
|
|
91
|
+
**実行証跡は「動くこと」の証拠であり、gate の緑ではない(joshuafolkken/kit#2246)。** 同じ証跡を PR 本文の `## 実機証跡` 節(コマンド+実出力のフェンス)にも置く。無い実行時の変更は `pnpm josh followup` がマージを拒否する(#2446)。
|
|
126
92
|
|
|
127
93
|
### 区切りの報告(完了報告と区別する・必須)
|
|
128
94
|
|
|
129
|
-
`backlogrun` の**区切り**(hand-off —
|
|
130
|
-
|
|
131
|
-
**`原因` / `対応` / `結果` を使わない。** この 3 行は `CLAUDE.md` が「finished なランを報告するとき」と定義している形であり、**epic はまだ終わっていない**。実際に joshuafolkken/kit#970 を区切ったランは、中身に「残り 1 件」と正しく書きながら完了報告の 3 行で報告し、読み手には終わったように見えた。
|
|
132
|
-
|
|
133
|
-
必要なのは 4 つ — **何が終わり、何が残り、なぜ止め、次に何を打つか**。
|
|
95
|
+
`backlogrun` の**区切り**(hand-off — 残りを新しいセッションへ渡して止まる)は、完了でも park でも失敗でもない第 4 の停止である(joshuafolkken/kit#984)。**`原因` / `対応` / `結果` を使わない** — 終わっていない epic が終わったように見える。
|
|
134
96
|
|
|
135
97
|
```md
|
|
136
98
|
**■ 区切り**
|
|
@@ -146,43 +108,35 @@ pnpm josh read:files <path> [<path> ...] # 変更対象を 1 ターンでま
|
|
|
146
108
|
- 引き継ぎ: <状態は GitHub にあり、会話には何も無いこと>
|
|
147
109
|
```
|
|
148
110
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
**この書式は「止まったとき」だけのものである。閾値を超えたこと自体は区切りではなく、停止したことが区切りである。** 4 行が答えているのは「誰が何を引き継ぐか」であり、同じセッションが走り続けているあいだ引き継ぐ人はいないからである。**まだ止まっていないランは区切りの報告を書かない** — そのときの記録は epic の進捗コメントであって、この書式ではない。
|
|
154
|
-
|
|
155
|
-
**どこが「止まった」かは入口ごとに違い、条件は入口の側にある。** joshuafolkken/kit#1713 以降、`pnpm josh cost --cut` が `over` と答えたら、`backlogrun` は走っている lane を**待たずに引き継いで、そのターンで止まる** — 各 lane が unit の出力パスを自分の `.env` に記録しており、新しいセッションが `pnpm josh lane:list` からそれを読んで poll を継ぐ — ので、止まったその場で書く。例外は poll できない lane(`unreadable`、または記録の無い `open`)があるときだけで、そのときは停止せずループへ戻るので、まだ書かない。`backlogrun` の指定 Issue は 1 件ずつ走るため、その区間では待つものが無く、`over` を読んだ区切りで止まって書く(`auto-ok` バックログの区間は epic の子の区間と同じく lane を引き継ぐ)。`fullrun` / `halfrun` は joshuafolkken/kit#1605 以降**入口でも同じ判定を問う**ので、`over` ならまだ何も作っていない入口でそのまま止まって書く — 「残っていること」は着手していない Issue そのものである。**この書式を lane の状態で条件づけない**: lane を開かない入口が永久に条件を満たせなくなり、書けない側は禁じたはずの完了報告の書式へ落ちる。単一ソースは [`.claude/skills/workflow-commands/backlogrun-progress.md`](../../.claude/skills/workflow-commands/backlogrun-progress.md) →「The hand-off」。
|
|
111
|
+
- 4 行それぞれ 1 文、内部識別子は書かず、対象は番号で名指しする。**「残っていること」を省略しない**(そこが完了報告との唯一の見分け)
|
|
112
|
+
- Telegram も同じ書式で、**`--task-type confirmation` で送る**(`completion` は未完了の epic を完了と通知する)
|
|
113
|
+
- **書くのは止まったときだけ。** 閾値を超えても走り続けているあいだは書かず、epic の進捗コメントが記録になる。どこで止まるかは入口ごとに違い、単一ソースは [`.claude/skills/workflow-commands/backlogrun-progress.md`](../../.claude/skills/workflow-commands/backlogrun-progress.md) →「The hand-off」
|
|
156
114
|
|
|
157
115
|
### 概要 3 行の書き方(ここが本体)
|
|
158
116
|
|
|
159
117
|
長さ制限だけでは平易にならない。**語彙と抽象度を制約する**:
|
|
160
118
|
|
|
161
119
|
- 各行は 1 文・短く(日本語で 80〜100 字、英語で 20〜25 語)
|
|
162
|
-
- 概要にファイルパス・関数名・型名・CLI
|
|
120
|
+
- 概要にファイルパス・関数名・型名・CLI のオプションフラグ(=内部識別子)を書かない(すべて技術詳細側)。ただし利用者が画面で目にする名前は書いてよく、むしろ必要 — 下記「具体的な主語を必ず書く」と必ずセットで読む
|
|
163
121
|
- 専門用語は使わないか、`〜(=…のこと)` の形でその場で言い換える
|
|
164
122
|
- 変更点の羅列ではなく **原因 → 対応 → 効果の因果**で書く
|
|
165
123
|
- 主語は利用者・システムの振る舞い。「利用者から見て何が違うか」が書けないなら、その行はまだ技術詳細のまま
|
|
166
124
|
|
|
167
|
-
|
|
125
|
+
**送信前セルフチェック**: 報告を送る直前に確認する。
|
|
168
126
|
|
|
169
|
-
1. 概要 3
|
|
170
|
-
2.
|
|
171
|
-
3. コードを見ていない読み手が、概要 3
|
|
127
|
+
1. 概要 3 行にファイル名・記号・英略語が混じっていないか、プログラマでない人が読んで意味が通るか。混じっていたら技術詳細へ移す
|
|
128
|
+
2. サマリ全体をコードフェンスで囲んでいないか
|
|
129
|
+
3. コードを見ていない読み手が、概要 3 行だけで**どれの話か特定できるか**。できないなら具体的な名詞を 1 つ足す
|
|
172
130
|
|
|
173
131
|
### 具体的な主語を必ず書く(禁止と対になる要求)
|
|
174
132
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
そこで、禁止と対になる**要求**を置く:
|
|
133
|
+
「書かない」規則だけを守ると、**何の話か特定できない**概要になる。そこで禁止と対になる要求を置く:
|
|
178
134
|
|
|
179
135
|
- **何かが「古い」「壊れている」「変わらない」と書くときは、その対象を名指しする。** 対象パッケージ名・画面名・出力の種類のいずれかを必ず含める
|
|
180
|
-
- **主語のない「状況」「案内」「問題」「その処理」だけで済ませない。**
|
|
136
|
+
- **主語のない「状況」「案内」「問題」「その処理」だけで済ませない。**
|
|
181
137
|
- **書いてよい具体名**: 利用者が画面で目にするもの — パッケージ名、表示されるコマンドの目的、画面名、メッセージの種類
|
|
182
138
|
- **書いてはいけない具体名**: 内部識別子のみ — ファイルパス、関数名・型名、CLI のオプションフラグ
|
|
183
139
|
|
|
184
|
-
字数を 80〜100 字としたのはこの要求と両立させるため。60 字では対象を名指しする余地が残らず、抽象化するしかなくなっていた。
|
|
185
|
-
|
|
186
140
|
**悪い例**(何の話か特定できない):
|
|
187
141
|
|
|
188
142
|
```md
|
|
@@ -199,8 +153,8 @@ Telegram 本文も同じ書式で書き、**`--task-type confirmation` で送る
|
|
|
199
153
|
- **確かめ方**: 自動テストで、効かないコマンドが説明に置き換わり、重複が 1 行になり、通常の表示は変わらないことを確かめる。
|
|
200
154
|
```
|
|
201
155
|
|
|
202
|
-
|
|
156
|
+
違いは長さではなく、**名指ししているかどうか**にある。良い例には内部識別子は 1 つも出てこない。
|
|
203
157
|
|
|
204
158
|
### 成果物(Issue / PR / Telegram)側
|
|
205
159
|
|
|
206
|
-
言語は「出力の言語(`JOSH_SESSION_LANG
|
|
160
|
+
言語は「出力の言語(`JOSH_SESSION_LANG`)」に従い、**構造も**セッション向けと同じ 2 層にする。`--notify-message` は `Added ... / Changed ...` の羅列ではなく、`Cause / Fix / Result` の 3 行を先頭に置き、変更点の箇条書きを `Details:` 以下にまとめる(実例は [`followup.md`](../../.claude/skills/workflow-commands/followup.md))。
|