legacy-code-navigation
Skill0 starsChanged 4 months agoMITView on GitHub
Strategy for safely understanding and modifying unfamiliar or legacy codebases: trace down from entry points, learn up from primitives, characterize before changing. Use when working in a codebase for the first time, before modifying code whose behavior is unclear, or when the user says レガシー, 初めて触るコード, 引き継いだコード, このコードどうなってる. Not for diagnosing a specific bug (use systematic-debugging).
In this repository14 other files it gives its agents.
- ai-code-verificationSkill
- ci-cd-hardeningSkill
- error-handling-robustnessSkill
- logging-observabilitySkill
- naming-readabilitySkill
- performance-optimizationSkill
- plan-then-codeSkill
- project-conventionsSkill
- refactoring-disciplineSkill
- safe-release-practicesSkill
- scalability-designSkill
- secure-input-handlingSkill
- test-suite-designSkill
- web-api-designSkill
The file
Files
Legacy Code Navigation
未知の大規模コードベースを最初から体系的に理解しようとすると挫折する。1つの具体的なユースケースを外側から内側へ辿り、必要な範囲だけを効率的に把握する(trace down, learn up)。
鉄則
- 全体理解を最初から目指さない。 1つの具体的なユースケース・エントリーポイントから入り、実際のタスクに必要な範囲だけを辿る。
- 未知の振る舞いは、変更する前に必ず「今何が起きているか」を確認する。 目視の推測だけでコードの動作を決めつけない。
- 大きなタスクは「デモ可能な単位」に分解し、各チャンクの完了ごとに動作確認する。
作業手順
ステップ1: trace down — エントリーポイントから実装へ辿る
- タスクに関連する1つの具体的なユースケース(例: 特定のAPIエンドポイント、特定のCLIコマンド、特定のUI操作)を選ぶ。
- そのユースケースのエントリーポイント(ルーティング定義、main関数、イベントハンドラ等)を特定する。
- エントリーポイントから呼び出しを実際に辿り、関与するファイル・関数を実行順にメモしていく。
- 辿る過程で「今は理解できないが後で必要になりそうな箇所」に遭遇したら、深追いせずメモに残して先へ進む。
ステップ2: learn up — 基礎的な構成要素から理解を積み上げる
- trace downで頻出したプリミティブ(共通ユーティリティ、基底クラス、共有の型定義)を特定する。
- それらの役割を、使用箇所から逆算して理解する(定義だけを読むより、実際の呼び出しパターンから学ぶ方が早い)。
- 理解した基礎知識を使って、ステップ1でメモした「後回しにした箇所」に戻り、必要な分だけ埋める。
ステップ3: 変更前に現状の振る舞いを特定する(characterize)
- 変更対象の関数・モジュールについて、現在の入出力・副作用を実際に確認する(ログ・print・デバッガでの実行、または既存テストの読解)。目で読んだだけの推測で「こう動くはず」と決めつけない。
- 既存テストがなければ、現状の振る舞いを固定する特性化テスト(characterization test)を書いてから変更に着手する。
- 状態を変化させている箇所(グローバル変数、副作用のある関数、隠れた引数、暗黙の実行順序依存)を特に重点的に洗い出す。
ステップ4: 小さく変更し、都度検証する
- タスクを「デモ可能な単位」(動作確認できる最小の区切り)に分解する。
- 各チャンクの実装後、実際にその部分の動作を確認してから次へ進む。
- 修正が完了したら、動作を裏付ける根拠(ログ出力・テスト結果)を示してから「直った」「動く」と報告する。
チェックリスト
着手前:
- タスクに関連する1つの具体的なユースケースを選んだか(コードベース全体を理解しようとしていないか)
- エントリーポイントを特定し、そこから実際の呼び出しを辿ったか
- 「後で必要になりそうだが今は不明な箇所」をメモに残したか
変更前:
- 変更対象の現在の振る舞いを実行・ログ・テストで確認したか(目視の推測のみで済ませていないか)
- 保護テスト(特性化テスト含む)は存在するか
- 状態を変化させる副作用箇所(グローバル変数・隠れた引数・実行順序依存)を洗い出したか
変更後:
- 変更をデモ可能な単位に分解し、各単位ごとに動作確認したか
- 「直った」と報告する前に、ログ・テスト等の根拠を提示したか
アンチパターン集
| やりがちな進め方 | 現実・対処 |
| いきなりディレクトリ全体を読んで「全体像を理解してから」着手しようとする | 大規模コードベースでは挫折するか時間切れになる。1ユースケースに絞って辿る |
| コードを目で読んだだけで「多分こう動く」と判断する | 人間もAIも読解による脳内シミュレーションは高確率で誤る。実行・ログ・テストで確認する |
| 保護テストがないまま既存コードを変更する | 既存の振る舞いを壊しても気づけない。先に特性化テストを書く |
| 状態変化(グローバル変数・副作用)を見落として変更する | レガシーコードのバグの多くは隠れた状態依存に起因する。重点的に洗い出す |
| 巨大なタスクを一度に実装し、最後にまとめて動作確認する | 途中で間違った方向に進んでも気づくのが遅れる。デモ可能な単位で都度確認する |
| 「動いたはず」で報告を終える | 検証の根拠(ログ・テスト結果)を示さない報告は信頼できない。必ず根拠を添える |
| 後回しにした不明箇所をそのまま放置して次のタスクへ進む | メモを残さないと同じ調査を繰り返す羽目になる。メモに残し、必要になった時点で回収する |
出典
- Mitchell Hashimoto — Contributing to Complex Projects("trace down, learn up"アプローチ)
- Mitchell Hashimoto — My Approach to Building Large Technical Projects(デモ可能な単位への分解)
- John Carmack — デバッガでの実行トレース・推測に頼らない検証の考え方(Errata Security: Use the freakin' debugger)
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

