一键导入
issue-implement
設計書(draft/design/)に基づき、TDD(テスト駆動開発)アプローチを用いて機能を実装する。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
設計書(draft/design/)に基づき、TDD(テスト駆動開発)アプローチを用いて機能を実装する。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
dev workflow 向けの最終チェック。PR 前に品質ゲート、docs 整合、設計書昇格、Issue 更新をまとめて確認する。
docs-only workflow 向けの最終チェック。docs 整合と Issue 状態を確認し、PR に進めるか判定する。
docs review の指摘に対応し、ドキュメントのみを修正する。コードやテストは変更しない。
docs-only の変更をレビューし、事実整合性・実装整合性・運用整合性の観点から判定する。
docs-only の更新を行う。コードやテストは変更せず、現行実装・CLI・運用方針との整合を確認しながら docs を修正する。
docs review の指摘が適切に修正されたかを確認する。新規指摘は行わない。
| description | 設計書(draft/design/)に基づき、TDD(テスト駆動開発)アプローチを用いて機能を実装する。 |
| name | issue-implement |
承認された設計書を元に、テストコードの作成から実装を開始します。 Test-Driven Development (TDD) の原則に従い、「テスト作成 (Red) → 実装 (Green) → リファクタリング」のサイクルを回します。
| タイミング | このスキルを使用 |
|---|---|
| 設計レビュー完了・承認後 | ✅ 必須 |
| 設計レビュー未完了 | ❌ 待機 |
ワークフロー内の位置: design → review-design → implement → review-code → i-dev-final-check → i-pr → close
常に注入される変数:
| 変数 | 型 | 説明 |
|---|---|---|
issue_id | str | 正規化済み Issue ID(GitHub 数値または local ID) |
issue_ref | str | 人間可読の Issue 参照(GitHub では #<issue_id>、local では bare ID) |
step_id | str | 現在のステップ ID |
$ARGUMENTS = <issue_id>
コンテキスト変数 issue_id が存在すればそちらを使用。
なければ $ARGUMENTS の第1引数を issue_id として使用。
issue_ref はハーネス経由ではプロンプトに自動注入される(kaji 側で provider 別に整形)。手動実行時は issue_id から導出する: GitHub 数値 ID なら #<issue_id>、local-* 形式なら bare ID(# を付けない)。
以下のドキュメントを Read ツールで読み込んでから作業を開始すること。
docs/dev/change-types-and-gates.mddocs/dev/kaji-workflow.mddocs/dev/documentation_update_criteria.mddocs/dev/testing-convention.mddocs/reference/python-standards.md/issue-start が実行済みであること/issue-design で設計書が作成済みであること_shared/worktree-resolve.md の手順に従い、 Worktree の絶対パスを取得すること。以降のステップではこのパスを使用する。
cat [worktree_dir]/draft/design/issue-[issue_id]-*.md
特に注目するセクション:
実装開始前にテスト環境の状態を確認し、変更前から存在する失敗(baseline failure)を記録する。
pytest を実行する:
cd [worktree_dir] && source .venv/bin/activate && pytest
全パスの場合: baseline は clean。コメント不要。Step 2.6 へ進む。
FAILED / ERROR がある場合:
a. 各失敗テストの (nodeid, kind, error_type) を記録する
b. Issue コメントに以下のフォーマットで投稿する(commit hash を含める):
uv run kaji issue comment [issue_id] --commit --body "$(cat <<'BASELINE_EOF'
## Baseline Check 結果
### 実行環境
- **Commit**: [commit-hash]
- **コマンド**: `pytest`
### Baseline Failure 一覧
| nodeid | kind | error_type | 概要 |
|--------|------|------------|------|
| tests/test_foo.py::test_bar | FAILED | AssertionError | expected 1, got 2 |
| tests/test_baz.py::test_qux | ERROR | ImportError | No module named 'xxx' |
### Regression 判定キー
上記テーブルの `(nodeid, kind, error_type)` の3タプルを比較キーとする。
以降の pytest 実行で:
- 比較キーが一致する失敗 → baseline failure(既知)として除外
- 比較キーが一致しない新規 FAILED/ERROR → regression
### 判定
- **継続**: 上記は変更前から存在する失敗であり、本 Issue の対象外
- **停止**: (該当する場合のみ記載)
BASELINE_EOF
)"
c. 停止基準に該当するか判断する:
Baseline コメントの選択規則: Issue に
## Baseline Check 結果コメントが複数存在する場合(再実行時など)、最新のコメントを正とする。各コメントに commit hash を含めることで、どの時点のスナップショットかを識別できる。
Issue ラベルから type を取得する(複数 type ラベルを許容しないため、配列として取得して cardinality をチェックする):
uv run kaji issue view [issue_id] --json labels --jq '[.labels[].name] | map(select(startswith("type:")))'
判定の優先順:
/issue-review-ready への差し戻しを案内する(ABORT)。type ラベルは Issue ごとに 1 つに限定する責務。/issue-review-ready への差し戻しを案内する(ABORT)。前段レディネスで type ラベル付与を確保する責務。type:docs → 本スキル対象外。/i-doc-update を使用すること。処理を停止し、ユーザーに誘導する(ABORT)type:feature / type:bug / type:refactor) → 対応するファイルを Readtype:test / type:chore / type:perf / type:security など) → feat.md を Read(フォールバック規則)| type | 読み込むファイル | 手順の特徴 |
|---|---|---|
type:feature | .claude/skills/_shared/implement-by-type/feat.md | 標準 TDD(Red → Green → Refactor)。IF 定義とユースケースを契約として実装 |
type:bug | .claude/skills/_shared/implement-by-type/bug.md | 再現テスト先行。Red = 再現テストが OB を再現 / Green = EB に合致 |
type:refactor | .claude/skills/_shared/implement-by-type/refactor.md | ベースライン計測 → safety net → 改修 → 再計測。振る舞い非変更が絶対要件 |
| canonical 外 | .claude/skills/_shared/implement-by-type/feat.md(フォールバック) | 標準 TDD を適用 |
type 別手順と Step 3〜5 の関係:
CRITICAL — 変更タイプに応じて妥当な検証を選ぶこと
実行時コード変更では、都合よく S/M/L を減らさないこと。 一方で docs-only / metadata-only / packaging-only 変更に対し、 価値の低い恒久テストを機械的に追加してはならない。
禁止事項:
- ❌ 設計書で「作成する」と定義されたテストを省略する
- ❌ 設計書で「不要」と判断されたテストを独自判断で追加する
- ❌ 実行時コード変更なのに「実行時間が長い」を理由に M/L を省略する
- ❌ 実行時コード変更なのに「Small で十分」と決め打ちする
- ❌ docs-only / metadata-only / packaging-only 変更に無理やり S/M/L テストを新設する
- ❌
uv pip install -e .など副作用のある検証を shared 環境へ常設する- ❌ 「API キーがない」「DB が起動していない」などの環境不備を理由にテストをスキップする(環境不備はスキップ理由ではなく修正対象)
設計書の「テスト戦略」セクションに基づき、変更タイプに応じた検証を実施する。テストサイズ判定は
docs/dev/testing-convention.md のリソース制約(外部 API / DB / ファイル I/O の有無)に従う。
テストファイルの特定/作成:
tests/ 配下の適切な場所にテストファイルを作成または特定@pytest.mark.small / @pytest.mark.medium / @pytest.mark.large のマーカーを付与テストコード記述:
失敗 / 回帰の確認:
cd [worktree_dir] && source .venv/bin/activate && pytest
実装ファイルの編集:
src/ 配下のコードを実装テスト通過確認:
cd [worktree_dir] && source .venv/bin/activate && pytest
pytest の合否判定基準:
(nodeid, kind, error_type) が baseline と一致 → 既知(除外)設計書の「影響ドキュメント」セクションで「あり」のドキュメントを更新する。
以下の 2 段階で実行すること。すべての基準をクリアするまでコミットしてはならない。
make checkを一括で叩く方法もあるが、baseline failure 判定のためpytestを&&チェーンから切り離す必要がある。下記 7a / 7b の分離はそのための運用。
cd [worktree_dir] && source .venv/bin/activate && make lint && make format && make typecheck
ruff / mypy は全パス必須。baseline failure の概念を適用しない。
cd [worktree_dir] && source .venv/bin/activate && pytest
pytest は && チェーンに含めず、必ず個別に実行する。 baseline failure が残っていると exit 非 0 になるが、以下の基準で合否を判定する:
(nodeid, kind, error_type) が全一致 → OK(コミット可)失敗した場合は原因を修正して再実行すること。
Issue 本文に ## 完了条件 セクションがある場合、実装段階で確認可能な条件を確認する。
確認対象の例:
確認結果は Step 9 の Issue コメントに含めて後段への証跡とする。
cd [worktree_dir] && git add . && git commit -m "feat: implement [feature] for [issue_ref]"
実装の commit prefix は Issue type に対応させる(
type:bugならfix:、type:featureならfeat:等)。
handoff 直前(/issue-review-code への進行前)に「設計書整合・テスト証跡・Scope 混在・auto-close 規約」を第三者視点で検査する。Step 8(コミット)の後に配置されるため、入力に必要な git diff main...HEAD と対象 commit hash がいずれも取得可能である。main session 自身が critic の立場に切り替えて実施する self-check の単一経路であり、rubric は下記 Step 8.5.2 にインラインで定義する。
main session が以下を手元に揃える:
[worktree_dir]/draft/design/issue-[issue_id]-*.mdgit diff main...HEAD の全文pytest の出力(Step 7b で取得済み)## Baseline Check 結果 コメント(あれば)main session 自身が critic の立場で以下の 4 観点を検査する。この段階では修正・コミット・push は行わず、検査と verdict 生成のみを行う。verdict (Yes / No / With fixes) は pre-handoff 自己評価 であり、workflow の正式 verdict (PASS / RETRY / BACK / ABORT) ではない。正式 verdict は /issue-review-code が後段の別セッションで発行する。
tests/ 配下に存在し PASSED か(nodeid, kind, error_type) で全一致するか(regression 0 件か)type:feature: fix / refactor を混ぜていないかtype:bug: feature 追加 / 大規模 refactor を混ぜていないかtype:refactor: 振る舞い変更 / 新機能を混ぜていないかdocs/dev/shared_skill_rules.md § auto close keyword 回避規約):
Clos(e[sd]?|ing) / Fix(e[sd]|ing)? / Resolv(e[sd]?|ing) / Implement(s|ing|ed)? の直後に \s*:?\s*#[0-9] が連続する形Must Fix [N] 等)も禁止Must Fix item N / 指摘 N / point N 形式で出力する。Must Fix #N / Fix [N] 等は禁止検査結果は Step 8.5.4 の出力フォーマットに沿った Markdown として生成する。
self-check が返す verdict は pre-handoff の自己評価 であり、workflow の正式 verdict ではない。
| verdict | 取り扱い |
|---|---|
Yes | handoff 可。Step 9(実装完了報告)へ進む(実装コミットは Step 8 で確定済み) |
With fixes | main session が指摘事項を反映 → Step 7a / 7b を再実行 → git add で修正をステージ → git commit --amend --no-edit で実装コミットを更新 → 本 Step 8.5 を再実行(ループ) |
No | 大幅な修正が必要。main session が修正 → Step 7a / 7b を再実行 → git add で修正をステージ → git commit --amend --no-edit で実装コミットを更新 → 本 Step 8.5 を再実行 |
--amendを採る理由: 実装を単一の実装コミット(Issue type に対応する prefix)に保ち、ループのたびにgit diff main...HEADと対象 commit hash が「修正反映後の現在状態」を表すようにする。worktree は未 push の feature branch なので amend は安全。--amend前のgit add必須: amend はデフォルトで index の内容を使うため、修正をgit addでステージしないと amend 後のコミットに反映されず、git diff main...HEADと対象 commit hash が修正前を指したまま同じ指摘が再発する。
ループ制限: With fixes / No を 3 回連続で返した場合は abort せず、main session が修正方針を Issue コメントに整理して /issue-review-code 側で BACK 相当の判定に委ねる(pre-handoff の自己評価ループでは正式 verdict を出さない)。
ループ回数の機械的カウント(必須): main session が自セッション内のカウンタで自己申告するのではなく、Issue コメントの ## Pre-Handoff Review セクション数を実際に数える。Step 8.5.5 が本 Step 8.5 の実行(=各ループ試行)ごとに専用の ## Pre-Handoff Review コメントを投稿するため、Issue コメントが永続的なカウンタとなる。
PHR_COUNT=$(uv run kaji issue view [issue_id] --comments 2>/dev/null | grep -c '^## Pre-Handoff Review$')
Step 8.5.5 で証跡コメントを投稿した直後に PHR_COUNT を再取得する。投稿済み実数 PHR_COUNT が 3 以上 かつ 今回の自己評価 verdict が Yes 以外 → ループ制限到達。本 Step 8.5 をさらに繰り返さず、以下の申し送りコメントを uv run kaji issue comment で投稿してから Step 9 へ進む:
Pre-Handoff Review ループ制限到達:
With fixes/Noが 3 回連続で返されました(Issue コメント上の## Pre-Handoff Review件数 = N)。main session 側の自己評価ループでは収束しないため、/issue-review-code側で BACK 相当の判定を求めます。未解消の指摘事項は最新の## Pre-Handoff Reviewコメント § 指摘事項 を参照してください。
PHR_COUNT が 3 未満かつ verdict が Yes 以外 → 通常通り Step 7a / 7b に戻ってループを継続
趣旨: ループに陥った当のセッション自身がカウンタを持つと「楽観バイアス」と同型の脆弱性を残す。Issue コメント側を権威ある回数情報源とすることで、main session の自己申告を経由しないカウントに置き換える。
| 階層 | verdict | 発行者 |
|---|---|---|
| 自己評価(本 Step) | Yes / No / With fixes | main-session self-check |
| 正式 verdict | PASS / RETRY / BACK / ABORT | /issue-review-code(次セッション推奨) |
self-check の出力は以下の形式に従う。経路情報を必ず先頭に明記:
## Pre-Handoff Review
- **経路**: self-check (main-session)
- **対象 commit**: <git-sha>
### 1. 設計書整合
- 判定: ✅ / ⚠️ / ❌
- 根拠: ...
### 2. テスト証跡
- 判定: ✅ / ⚠️ / ❌
- 根拠: ...
### 3. Scope 混在
- 判定: ✅ / ⚠️ / ❌
- 根拠: ...
### 4. auto-close 規約
- 判定: ✅ / ⚠️ / ❌
- 根拠: ...
### 指摘事項
- 指摘 1: ...
- 指摘 2: ...
### Pre-Handoff Review Verdict
- **Yes** / **No** / **With fixes**
verdict の判定基準:
規約遵守: 本コメント本文に auto-close hazard pattern(
Clos(e[sd]?|ing)/Fix(e[sd]|ing)?/Resolv(e[sd]?|ing)/Implement(s|ing|ed)?の直後#[0-9])を書かない。指摘参照は指摘 N/Must Fix item N/point N形式に統一する(参照:docs/dev/shared_skill_rules.md§ auto close keyword 回避規約)。
本 Step 8.5 を実行するたび(=各 verdict ループ試行ごと)に、その試行で生成した ## Pre-Handoff Review ブロックを 専用の Issue コメントとして即座に投稿する。これが PHR 出力の一次投稿経路であり、Step 9(実装完了報告)はこれを再投稿しない。
uv run kaji issue comment [issue_id] --commit --body "$(cat <<'PHR_EOF'
(Step 8.5.4 のフォーマットで生成した「## Pre-Handoff Review」ブロックを全文貼り付け)
PHR_EOF
)"
投稿後、Step 8.5.3 の PHR_COUNT 再取得とループ制限判定を行う。1 試行 1 コメントで永続記録されるため、PHR_COUNT は within-run のループ試行回数の正しいカウンタとなる。/issue-review-code Step 1.4 の hard gate は ## Pre-Handoff Review セクションの存在を確認するが、本ステップが投稿する専用コメントがこれを満たす。
実装完了をIssueにコメントします。pytest および品質チェックの出力をそのまま含めること。
uv run kaji issue comment [issue_id] --commit --body "$(cat <<'COMMENT_EOF'
## 実装完了報告 (TDD)
設計に基づき、TDDにて実装を行いました。
### 実施内容
- **テスト / 検証**: `tests/test_xxx.py` に XX 件のケースを追加、または変更固有検証を実施
- **実装**: `src/starter_app/xxx.py` に機能を実装
### テスト結果
```
(pytest の標準出力をそのまま貼り付け)
```
| 項目 | 結果 |
|------|------|
| テスト総数 | XX |
| passed | XX |
| failed | XX (うち baseline: YY, regression: 0) |
| errors | XX (うち baseline: YY, regression: 0) |
| skipped | XX |
| Small テスト | XX passed |
| Medium テスト | XX passed |
| Large テスト | XX passed |
### 品質チェック結果
```
(make lint / make format / make typecheck の出力をそのまま貼り付け)
```
### 変更ファイル
- `src/starter_app/xxx.py`: (変更内容)
- `tests/test_xxx.py`: (変更内容)
### Pre-Handoff Review 結果
Pre-Handoff Review の出力は Step 8.5.5 が専用の `## Pre-Handoff Review` コメントとして投稿済み。本セクションでは最新コメントを参照し、投稿数と最終 verdict を要約する:
- Pre-Handoff Review コメント数 (`PHR_COUNT`): XX
- 最終 verdict: Yes / With fixes / No
- 最新の `## Pre-Handoff Review` コメント: (リンクまたは投稿日時)
### 完了条件の段階確認
この段階で確認可能な完了条件:
- [ ] (確認した条件1): ✅ 実装で対応済み
- [ ] (確認した条件2): ✅ テスト通過で確認
- (未確認の条件があれば): final-check で確認予定
### 次のステップ
`/issue-review-code [issue_id]` によるコードレビューをお願いします。
COMMENT_EOF
)"
## 実装完了
| 項目 | 値 |
|------|-----|
| Issue | [issue_ref] |
| テスト | XX 件追加 |
| 品質チェック | すべてパス |
### 次のステップ
`/issue-review-code [issue_id]` でコードレビューを実施してください。
実行完了後、以下の形式で verdict を出力すること:
---VERDICT--- status: PASS reason: | 実装・テスト・品質チェック全パス evidence: | pytest 全テストパス、ruff/mypy エラーなし suggestion: | ---END_VERDICT---
重要: verdict は stdout にそのまま出力 すること。Issue コメントや Issue 本文更新とは別に、最終的な verdict ブロックは stdout に残す。
| status | 条件 |
|---|---|
| PASS | 実装・テスト・品質チェック全パス |
| RETRY | テスト失敗等 |
| BACK | 設計に問題 |
| ABORT | 重大な問題(type ラベル未付与・複数付与・type:docs 等) |