COLOPL Tech Blog

コロプラのエンジニアブログです

Claude Codeを自分色に染める1つの習慣と1つの仕組み

こんにちは、エンジニアの田中です!普段は社内システムの運用や改善、業務効率化に関わる仕組みづくりを担当しています。

そんな日々の中で、Claude Codeを使い始めて1年、利用頻度は増える一方です。使えば使うほど気になってくるのが「自分はClaude Codeをうまく使えているのか?」という点です。

  • 同じような指示を毎回打ち直していないか
  • AIの出力を結局自分で手直ししていないか
  • 意図が伝わらず、期待通りの結果が得られていないか

この記事では、こうした「使い方のムダ」を改善するために実践している、1つの習慣と1つの仕組みを紹介します。

  1. 習慣: タスクの節目に振り返り — 良かったこと・改善したいことをその場でmemoryやCLAUDE.mdに保存する
  2. 仕組み: 毎朝の自動振り返り — Claude Code自身に前日の使用履歴を分析させ、改善提案をSlackに届けさせる

つまり、Claude Codeの使い方をClaude Code自身に改善させています。1の習慣はすぐ始められる話、2の仕組みはスキル・LaunchAgent・PR自動化まで踏み込んだ話です。後半はそのまま自分の環境に移植できるよう、検出ロジックと安全策の実装まで具体的に書きます。

習慣: タスクの節目に、その場で振り返る

振り返りをAIに聞く

コミットしたタイミングやプルリクを出したタイミングなど、作業の節目にこんな質問をするようにしています。

今回の作業のやりとりを振り返って、今後に生かせることや改善すべきことはありますか?

今回の実装で、私からの指示でもっとこうした方が良いものや、CLAUDE.mdに記載した方が良いものはありましたか?

ポイントは「AIの出力」だけでなく「自分の指示の出し方」も振り返りの対象にすることです。たとえば、意図とズレた実装が返ってきたとき、こう聞いたことがあります。

こちらに気づいてもらうために、私としてはどのように指示を出せばよかったでしょうか?

このとき得られた答えのひとつが「指示にWhy(なぜ必要か)を含める」でした。Whyを伝えると、AIは最終的なゴールから逆算してくれるので、こちらが指示し忘れた配慮や、後で必要になる対応まで先回りしてくれます。逆にWhyのない指示は判断をAIに丸投げするのと同じで、目的に合わない実装が返ってきて手戻りが増えがちです。

そして振り返りでもうひとつ意識しているのが、改善点だけでなく「良かった挙動」も伝えることです。たとえば、こちらが頼む前のちょうど良いタイミングで確認を入れてくれたときは、こう返します。

ここで一度確認を入れてくれたのは助かりました。今後も同じタイミングで確認してください。

ダメ出しばかりを保存すると「やってはいけないこと」のリストだけが育ちますが、良かった挙動を伝えておくと「続けてほしい振る舞い」も資産として定着します。改善と維持の両方を回すイメージです。

実は「振り返りをすること」自体、この褒めるフィードバックから定着した習慣です。一度「振り返りをしてくれるのは素晴らしいですね。今後も続けてください」と伝えたところ、「タスクが一区切りついたら振り返りを提示する」という学びとして記憶され、以降は作業の節目で頼まなくても振り返りが提示されることが増えました。もちろん毎回提示してくれるわけではないので、提示されなければ自分から振り返りを聞く、という使い方をしています。

振り返りの結果を保存する

振り返って終わりでは、次のセッションで同じことを繰り返します。そこで、得られた学びはClaude Codeのmemory機能かCLAUDE.mdに保存してもらいます。

保存先は性質で使い分けています。

保存先 向いている内容
memory 振り返りでClaudeが気づいたことを、Claude自身が自動で保存する。プロジェクト単位で蓄積される
プロジェクトのCLAUDE.md そのプロジェクトだけで守りたいルール(DB操作はmapperを使う、ログはloggerを使う 等)
グローバルのCLAUDE.md 全プロジェクトで守りたいルール(UI整列の基本、例外時のログ出力 等)

使い分けはシンプルです。Claudeが気づいたことは自動でmemoryに保存されます。そのうえで「これは残したい」と思ったルールを、そのプロジェクト固有か全体共通かを判断して、それぞれのCLAUDE.mdに書いてもらいます。

実際にmemoryへ保存された一例がこれです。振り返りで「Whyを含めるのは大事」と確認した内容が、そのまま動作指針になっています。

# 指示にWhyがない場合は質問する  (memory/ask-why-before-work.md)

指示にWhyが含まれていない場合は、作業を始める前に
「なぜその変更が必要か」を質問する。

**Why:** WhyがあるとDesignの選択肢を絞りやすく、一貫した実装ができる。
今回の振り返りでユーザー自身が「Whyを含めるというのは確かに大事」と確認した。

**How to apply:** 要件の「what」だけが書かれていて「why」が読み取れない場合、
AskUserQuestionで背景を確認してから実装方針を決める。

振り返りでClaude Codeが気づいたことは、自動でmemoryに保存されます。ただこのWhyのルールのように、特定のプロジェクトだけでなくどの作業でも効かせたい内容の物は、グローバルのCLAUDE.mdにも書いてもらうようにしています。

仕組み: 毎朝、前日の使い方をAIに分析させる

きっかけ

セッション毎の振り返りには限界があります。セッションをまたいだ傾向、たとえば「同種の依頼を週に4回している」「スキル実行後に毎回手直しが発生している」「他のプロジェクトでも同様のプロンプトを実行している」といったパターンは、その場の振り返りでは気づけません。

そこでClaude Codeにこう聞いてみました。

前日のClaude Codeの使用履歴をみて、サブエージェントやスキルの作成提案や改善提案をすることはできますか?たとえば繰り返している作業や、スキルを使って作業したがその後手直しが発生したことなどを改善したい。

答えは「できます」。そのまま、振り返り自体を自動化するスキルを作りました。

全体像

MacのLaunchAgent(cronのようなもの)で毎朝スキルを自動起動し、次の流れで動きます。

手動と自動、2つの振り返りが作る改善ループ

  1. 起動 — LaunchAgentがシェルスクリプトを実行し、Claude Codeにスキルの実行を指示する
  2. データ収集 — Pythonスクリプトがローカルのプロンプト履歴(~/.claude/history.jsonl)とセッションのログ(~/.claude/projects/配下のJSONL)を1つのJSONに整形する。特別なAPIは使っていない
  3. 分析 — Claude CodeがそのJSONを読み、4つの検出軸でパターンを判定する
  4. 改善提案 — 高優先度はPRを作成し、分析結果と合わせてSlackで通知する

起動の中身は実質この1行です。プロンプトを渡して非対話で実行する--dangerously-skip-permissionsを使っています。

claude --dangerously-skip-permissions -p "/claude-code-retrospective"

このフラグは権限確認を全てスキップするため、後述の安全策と合わせて使うことを前提にしています。

データ収集は「機械で集める」、分析は「AIに任せる」

このスキルで一番こだわったのが、集計とパターン判定の役割分担です。履歴のログをそのままClaudeに丸投げすると、入力が膨らんでコストも安定性も悪化します。そこで「決まった形に整形する処理」はPythonスクリプトに任せ、「ゆらぎのあるパターン判定」だけをClaudeにやらせています。

データ収集スクリプトは、履歴を次の3層のJSONに整形します。

  1. primary — 実行日より前で最後に利用があった日(金曜に休んで月曜起動なら金曜)の詳細データ。その日のプロンプト履歴と、各セッションのユーザー発言・スキル呼び出しを含む
  2. weekly_windowprimaryの日を末尾とする7日間のサマリ。こちらは履歴の一覧だけで、重いセッションログは読まない
  3. previous_suggestions — 過去7日間にすでにSlack/PRで出した提案のリスト(重複抑止用)

コストを抑える肝が、詳細を読むのは「最後の1日」だけという点です。週次のほうは軽いサマリに留め、セッションログを読むときも1セッションあたり先頭の一定行数までに制限しています。

# scripts/collect_data.py 抜粋
TRANSCRIPT_LINE_LIMIT = 2000   # 1セッションのログはこの行数まで
WEEKLY_DAYS = 7

# primary: 最終使用日の詳細(セッションログを読む)
# weekly_window: 7日間のサマリ(history.jsonl のエントリのみ。セッションログは読まない)
# previous_suggestions: 直近7日に発行済みの提案(重複抑止)

primary_datenull(直近の利用記録なし)なら、その時点で「利用記録なし」をSlackに送って終了します。土日や連休でログが無い日は、自動で「最後に使った日」まで遡る作りです。

検出パターンと優先度判定

整形済みJSONを受け取ったClaudeは、SKILL.mdに書かれた検出軸でパターンを探します。重要なのは、どの軸をどのデータで見るかを分けていることです。

# 検出パターン(データの使い分け)  (SKILL.md 抜粋)

A. やり直し(同一セッション内で同じ依頼を再投入)— primary.sessions から検出
  - 同じスキルを短時間に複数回呼び出した/「もう一度」「やり直して」等の再実行ワード

B. 手直し(スキル/エージェント実行後の訂正指示)— primary.sessions から検出
  - スキル呼び出し後の具体的な修正指示/コードや出力への直接訂正

C. 繰り返し依頼(自動化候補)— weekly_window.history_summary から検出
  - 過去7日で同種の依頼が3回以上/毎回同じ長い指示文を貼り直している

D. スタイル/設定の再指定 — weekly_window から検出
  - CLAUDE.mdやスキルに設定すれば一度で済む内容を毎日のように伝えている

A・B(やり直しと手直し)は1日の中の細かいやりとりに現れるので、詳細なセッションログを持つprimaryから探します。C・D(繰り返しと再指定)は日をまたいで初めて見えるので、軽い7日サマリから探します。「細かい挙動は1日を深く、傾向は1週間を浅く」という非対称が、コストと検出精度のバランスを取っています。

検出したパターンは、自動でPRを作る「高優先度」と、提案だけ出す「低優先度」に振り分けます。

# 優先度判定  (SKILL.md 抜粋)

高優先度(自動実装 → PR対象):
  - 同じパターンが primary 内で3回以上、または weekly で5回以上
  - スキル実行後の手直しが2回以上
  - 改善方法が明確(スキルのフォーマット修正、CLAUDE.mdへの追記など)
  - 修正対象が ~/.claude/ 配下のスキル・agents・CLAUDE.md である

低優先度(提案のみ):
  - 1〜2回の発生、または改善方法が曖昧
  - プロジェクト固有の問題(~/.claude/ 外のリポジトリが対象)

そして、出した提案はissued-suggestions.jsonlに追記しておき、翌日以降の収集時にprevious_suggestionsとして読み込みます。タイトルや対象ファイルが既存の提案と被っていれば新規提案から除外するので、同じ指摘が毎朝届くことはありません。

無人実行と安全策

--dangerously-skip-permissionsは権限確認を全部すっ飛ばすフラグなので、無人実行に使う以上は別の歯止めが要ります。技術的に強制できない代わりに、スキルの手順とシェル側で多重に縛っています。

  • 書き換え対象の限定 — PRを作ってよいのは~/.claude/配下(スキル・agents・CLAUDE.md)だけ。通常のプロジェクトに関わる改善は提案止まりにする
  • 実行前のgit確認 — PRを作る前に必ずgit remote -vgit statusを確認し、想定リポジトリでない/作業ツリーが汚れている場合はPR作成をスキップしてSlackにその旨を出す
  • 1回あたりの上限 — 1回の実行で作るPRは最大2本まで
  • 重複抑止 — 前述のprevious_suggestions参照

シェルスクリプト側にも、無人実行ならではの泥臭い対策が入っています。Macがスリープしていて発火しない朝があるので、8:30 / 9:00 / 10:30 / 14:00 の4つの時刻で発火させ、その日に一度成功したら残りはスキップします(成功日をマーカーファイルに書く方式)。起動直後はネットワーク未接続のこともあるため、api.anthropic.comへの疎通を最大3分待ってから本体を起動します。

# scripts/claude-code-retrospective.sh の骨子
# 本日すでに成功済みならスキップ
if [ "$(cat "$SUCCESS_MARKER")" = "$TODAY" ]; then exit 0; fi
# ネットワーク疎通待ち(最大3分)→ Claude Code を非対話起動

そして、この仕組みはほとんど自分でコードを書いていません。Claude Codeに「できます」と言われたあとは、データ収集スクリプトもスキルの手順書も、毎朝動かすためのLaunchAgentへの登録まで、すべてClaude Codeにお願いしました。やりたいことを相談しながら進めるだけで、仕組みはあっという間に出来上がりました。

実際の運用実績

提案ログ(issued-suggestions.jsonl)を数えると、約6週間で提案は37件、提案が出た日は22日でした。内訳は、PRまで自動作成した高優先度が8件、提案のみの低優先度が29件です。高優先度の8件はすべてPRが作成され、こちらはdiffを見てマージするかどうかを判断しています。「7〜8割は提案止まり、自動でPRまで行くのは粒の揃った一部だけ」という比率で、ノイズで埋もれない運用にできています。

最近届いた提案の例です。

  • 「UI調整後にページ遷移先での位置ずれ確認を怠って手戻りが発生している」→ グローバルCLAUDE.mdのUI実装ルールに2項目を追記するPRが作成された(高優先度)
  • 「テスト環境ではあったが、Slack送信を伴う動作確認を無断で実行して指摘を受けた」→ 「Slackを使った送信は実行前に確認を取る」ルールを追加するPRが作成された(高優先度)
  • 「PRレビュー対応の依頼が週4回ある。現在のスキルはGitHub前提なのでGitLab MRにも対応させてはどうか」→ スキル改善の提案として通知された(低優先度)

最後のGitLab対応の提案には後日談があります。提案だけでは閾値に届かず低優先度のままでしたが、その後コミット・push・PR/MR作成を一貫して行うcommit-push-prスキルとして実装し、GitHub(gh)とGitLab(glab)を依頼文から自動判定する形に育てました。低優先度の提案が、繰り返し届くうちに「作る価値がある」と判断できるようになった例です。

朝Slackを開くと、前日の自分とAIのやりとり内容の分析結果と、改善のPRが届いている、という運用です。PRの形で届くので、提案を受け入れるかどうかはdiffを見て自分で判断できます。

習慣と仕組みがつながる

この習慣と仕組みは独立したものではなく、ループになっています。

手動と自動、2つの振り返りが作る改善ループ

  1. 手動の振り返り — 学びをmemory・CLAUDE.mdに保存する
  2. 毎朝の自動振り返り — 手動では気づけないセッション横断のパターンを検出する
  3. PRとして反映 — CLAUDE.md・スキルが更新される
  4. セッションが賢くなる — 新しい課題が見えてくる

このループには、想定していなかった嬉しい効果もありました。いつものようにタスクが終わったタイミングで振り返りをして、学びをCLAUDE.mdに記録してもらい、その作業は完了したはずでした。ところが翌朝の自動振り返りが「前日の振り返り内容が保存されていない」ことを検出し、改めて保存するPRを作ってくれていたのです。その日はClaude Codeの調子が不安定だったので、記録の処理が正常に動いていなかったのだと思います。手動の振り返りの取りこぼしを、自動の仕組みが拾ってくれた一例です。

Claude Codeは「指示すれば動くツール」ですが、フィードバックを資産として蓄積する仕組みを作ると「使うほど自分に最適化されるツール」になります。

おわりに

「AIをうまく使えているか」をAI自身に問い続けるのは、最初は奇妙に感じるかもしれません。ただ、疑問はそのままAIに相談でき、改善の仕組みづくりまで任せられます。履歴を集め、パターンを見つけ、提案を文書にする——こうした手間こそAIが得意とするところだからです。人間がすることは、タスクの節目に一言聞くことと、朝のSlackで提案を読んでPRをマージするか判断すること。改善のループを回すハードルが劇的に下がりました。

こうして蓄積されたmemoryやCLAUDE.mdのルールは、すべて自分とのやりとりから生まれたものです。指示の出し方の癖、確認してほしいタイミング、続けてほしい振る舞い。同じClaude Codeを使っていても、フィードバックを資産にした手元のClaude Codeは、もう初期状態と同じ動きをしません。使い込んだ道具が手に馴染んでいくように、振り返りを返した分だけ、Claude Codeは自分色に染まっていきます。

その最初の一歩が、手動の一言です。「今回の作業のやりとりを振り返って、今後に生かせることや改善すべきことはありますか?」から始めてみてください。



ColoplTechについて

コロプラでは、勉強会やブログを通じてエンジニアの方々に役立つ技術や取り組みを幅広く発信していきます。
connpass および X で情報発信していますので、是非メンバー登録とフォローをよろしくお願いいたします。

また、コロプラではインフラエンジニアを積極採用中です!
興味を持っていただいた方はぜひお気軽にご連絡ください。