kasiopeiya

past-decision-search

仕組み・ファイルのパス・論点のキーワードを受け取り、それについて過去に決めたこと(決定・理由・却下した案)を、仕組みの本文・ADR・決定記録のコミットから出典付きで引く。計画・検討・Issue 監査の決まった手順から呼ばれる。「past-decision-search」「過去の決定を調べて」「設計意図を調べて」と指示されたとき。

kasiopeiya 0 Updated 2w ago
GitHub

Install

npx skillscat add kasiopeiya/claude-dev-template/past-decision-search

Install via the SkillsCat registry.

SKILL.md

Past Decision Search(過去の決定を引く)

対象について過去に決めたことを、決定・理由・却下した案の形で、出典付きで返す。読むだけで、何も書き換えない。

なぜ要るか

AI は前のセッションを覚えていない。過去の決定を知らないまま案を出すと、却下済みの案をもう一度推したり、理由のある形を「不要」と言って崩したりする。

決めたことの書き先は docs/policy/adr-policy.md が3つに分けている——いまの理由は仕組みの本文、後から問われる決定は ADR、それより軽い決定はコミットの決定記録である。どれか1つだけを見ると残りを取りこぼすので、この Skill は下の手順をすべて実行する。

決定記録のコミットの一覧ファイルは持たない。 一覧ファイルをコミットに含めると、並行する PR どうしが一覧の同じ行で衝突する。一覧の役目は AI が過去の決定を引くことなので、引く手順をこの Skill が持てばファイルは要らない。

入力

調べる対象を1つ以上。次のどれでもよい。

  • 仕組みの名前(例:/issue-check、pre-commit hook)
  • ファイルのパス(例:.claude/skills/issue-check/SKILL.md)
  • 論点のキーワード(例:トレーラー、merge=union)

パスを受け取ったら、名前(Skill なら /<Skill名>、それ以外は拡張子を除いたファイル名。例:.claude/agents/plan-reviewer-agent/plan-reviewer-agent.md なら plan-reviewer-agent)も検索語に加える。本文はパスより名前で言及することが多いからである。

名前を受け取ったら、そのパス(Skill なら .claude/skills/<Skill名>/、エージェントなら .claude/agents/<名前>/)も引く。手順3のパスで引くコマンドは、件名に名前を含まないコミットも拾うからである。論点のキーワードだけでパスが決まらなければ、そのコマンドは実行しない。

手順

どの段も必ず実行する。前の段で見つかっても飛ばさない。

1. 仕組みの本文

git grep -n -F -- "<検索語>"

ヒットした行の前後を読み、対象について「なぜそうしているか」を書いた箇所(「なぜ」の節・「〜ため」「理由」の文・ファイル冒頭の責務コメント)だけを拾う。対象がファイルなら、そのファイル自身も開いて読む。ヒットが多いときも、理由を書いた箇所を拾い終えるまで読む。

2. ADR

git grep -l -i -F -- "<検索語>" -- docs/adr

ヒットした ADR(NNN-*.md)を全文読む。adr-index.md・adr-template.md はヒットしても読まない。

3. 決定記録のコミット

対象のパスを触ったものと、検索語を含むものを引く。

git log --grep "^Decision-Record: yes$" --date=short --format='%h %ad %s' -- <パス>
git log --grep "^Decision-Record: yes$" --grep "<検索語>" --all-match -i --date=short --format='%h %ad %s'

ヒットしたコミットごとに本文を読み、決定・理由・却下した案を取り出す。

git show --no-patch --format=%B <コミット>

コミットは %(trailers:...) のトレーラー解析ではなく、--grep の行一致で引く。Decision-Record: yes の後ろに空行を挟んで Co-Authored-By が続くコミットは、git がトレーラーとして読まないため、トレーラー解析では落ちる。

出力形式

関連する決定ごとに1項目。新しい決定を先に並べる。

## 過去の決定:<対象>

### <決定を一文で>

- **決定**:<何を決めたか>
- **理由**:<なぜか>
- **却下した案**:<案と却下の理由/書かれていなければ「記載なし」>
- **出典**:<`path:行番号`/`<コミット> <件名>`/`docs/adr/NNN-*.md`>

### 引いた範囲

- 検索語:<使った検索語>
- 本文:<ヒットして読んだファイル>/ADR:<読んだ ADR か「なし」>/コミット:<読んだコミットか「なし」>
  • 出典の無い決定を書かない。自分の推測で理由を補わない
    • ❌ 決定記録に理由が無いのに、前後の事情から「理由:並行 PR の衝突を避けるため」と埋める → ✅ 「理由:記載なし」と書く
  • 同じ論点で、本文のいまの記述とコミット・ADR の決定が食い違えば(例:コミットが却下した案を、いまの本文が採っている)、本文をいまの状態とし、古い方に「いまは本文の形に変わっている」と添える
  • どの段でも何も見つからなければ、決定の項目を出さずに「該当なし」と書き、「引いた範囲」だけを出す