AIコーディング 2026.04.25
Claude Codeが失敗する5つのパターン|生成AIコーディングの落とし穴とPython品質ゲート
実際に起きた障害事例
事例1(dev.to報告): 10機能を連続して実装させた開発者
→ 一部の機能が互いに干渉し合い、3つの既存機能が壊れた
→ 原因: Claudeはコンテキスト外の依存関係を把握できない
事例2: 状態を2パスに書き込むバグ
→ DB書き込みとキャッシュ書き込みを別々に実装 → 同期が取れなくなった
→ 原因: Claudeが「なぜ一箇所で管理すべきか」を理解していなかった
事例3: セキュリティレビューなしのマージ
→ Claudeが生成したSQLにSQLインジェクション脆弱性が含まれていた
→ 原因: テストが「動くか」を確認するが「安全か」は確認しない
パターン1:コードレビューを飛ばす
# ❌ 危険なワークフロー
def deploy_feature(feature_spec: str) -> None:
result = os.popen(f'claude --print "{feature_spec}"').read()
os.system("git add -A && git commit -m 'AI generated' && git push")
# ← コードを一度も見ていない!
# ✅ 安全なワークフロー: git diffをClaudeに再レビューさせる
import anthropic
import subprocess
import os
client = anthropic.Anthropic()
def auto_review_diff() -> str:
"""生成されたコードをClaudeが自己レビュー"""
diff = subprocess.run(
["git", "diff", "--staged"],
capture_output=True, text=True
).stdout
if not diff:
return "差分なし"
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": f"""
以下のgit diffを確認してください。問題があれば指摘してください。
確認項目:
1. セキュリティリスク(SQLインジェクション・XSS・ハードコードされた秘密情報)
2. 既存コードへの破壊的変更
3. エラーハンドリングの欠如
4. テストが不足している箇所
問題なければ「LGTM」と返してください。
```diff
{diff[:3000]}
"""}] ) return response.content[0].text
## パターン2:回帰テストなしの大量実装
```python
# quality_gate.py
# 変更をコミットする前に品質チェックを強制する
import subprocess
import sys
def run_quality_gate() -> bool:
"""コミット前の品質チェックゲート"""
checks = [
("型チェック", ["python3", "-m", "mypy", "src", "--ignore-missing-imports"]),
("テスト実行", ["python3", "-m", "pytest", "tests", "-v", "--tb=short"]),
("セキュリティスキャン", ["bandit", "-r", "src", "-ll"]),
("インポートソート", ["isort", "--check-only", "src"]),
]
all_passed = True
for name, cmd in checks:
print(f"→ {name}... ", end="", flush=True)
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0:
print("✅")
else:
print(f"❌\n{result.stdout}{result.stderr}")
all_passed = False
return all_passed
if __name__ == "__main__":
if not run_quality_gate():
print("\n❌ 品質チェック失敗。コードを修正してから再実行してください。")
sys.exit(1)
print("\n✅ 全チェックパス。コミット可能です。")
# .git/hooks/pre-commit として設定
#!/bin/bash
python3 quality_gate.py || exit 1
パターン3:トークン消費の爆発
# token_monitor.py
# Claude Codeのトークン消費を追跡して警告する
import anthropic
import os
client = anthropic.Anthropic()
class TokenBudget:
def __init__(self, daily_limit_usd: float = 5.0):
self.daily_limit_usd = daily_limit_usd
self.total_input_tokens = 0
self.total_output_tokens = 0
@property
def estimated_cost(self) -> float:
return (
self.total_input_tokens * 3.00 / 1_000_000 +
self.total_output_tokens * 15.00 / 1_000_000
)
def record(self, usage: anthropic.types.Usage) -> bool:
self.total_input_tokens += usage.input_tokens
self.total_output_tokens += usage.output_tokens
remaining = self.daily_limit_usd - self.estimated_cost
if remaining < 0:
print(f"❌ 予算超過: ${self.estimated_cost:.2f} / ${self.daily_limit_usd:.2f}")
return False
elif remaining < self.daily_limit_usd * 0.2:
print(f"⚠️ 予算残り20%: ${remaining:.2f}")
return True
budget = TokenBudget(daily_limit_usd=5.0)
def safe_request(messages: list, model: str = "claude-sonnet-4-5") -> str | None:
response = client.messages.create(
model=model,
max_tokens=1024,
messages=messages
)
if not budget.record(response.usage):
return None # 予算超過で停止
return response.content[0].text
安全なClaude Code活用のフロー
✅ 推奨ワークフロー:
1. 1機能ずつ実装指示 → git diffで確認 → auto_review_diff() → テスト実行
2. テストグリーン → git commit
3. 次の機能へ
❌ 失敗パターン:
「10機能を全部実装して、git pushまでやって」
→ レビューなし・テストなし・本番への影響確認なし
あわせて読みたい
- Claude Code AIコード生成の安全な使い方|セキュリティチェックリスト
- Claude Codeのリモート実行時にローカルから権限承認する方法
- Claude CodeとContext Skillsで開発効率を上げる7つのテクニック