アンカーと指紋
解説が「コードのどこ」を指しているかを、progLens はアンカーで持ちます。行番号だけで指すと、上に 1 行足しただけでずれてしまうので、いくつもの手がかりを重ねて持ち、上から順に解きます。
アンカーの 4 つの層
Section titled “アンカーの 4 つの層”anchor: file: src/app/todos/actions.ts # 必須。リポジトリの根からの相対 symbol: "createTodo()." # シンボルのパス(関数・クラスなど) quote: # シンボルの中の一部を指すときだけ exact: "await supabase.from('todos').insert" prefix: "const { error } = " fingerprint: sha256:… # その範囲の指紋 seen: { lines: [12, 40] } # 最後に確かめた位置(ヒントにだけ使う)| 層 | 役目 |
|---|---|
file | どのファイルか |
symbol | どの関数・クラス・定数か。行が動いても名前で見つかります |
quote | シンボルの中の一部の文字列と、その前後。シンボルの名前が変わっても文字で探せます |
fingerprint | 指した範囲の中身の指紋。中身が変わったかを見分けます |
シンボルのパスの書き方
Section titled “シンボルのパスの書き方”| 書き方 | 指すもの |
|---|---|
名前(). | 関数・メソッド(Button#onClick(). はクラスのメソッド) |
名前# | クラス・型・構造体・トレイト |
名前. | 定数・変数・フィールド |
名前/ | 名前空間・モジュール |
名前! | マクロ |
入れ子は親のパスに足していきます(outer().inner().)。どの言語でも、土台の汎用版と強化の層で同じ文字列になるようにしてあるので、あとからパックを足してもアンカーは切れません。
コード以外も指せます: JSON・YAML のキー(pointer: /scripts/dev)・Markdown の見出し(heading: "セットアップ")・画面の部品(その要素を書いた JSX の位置と route)。
解決の順序と状態
Section titled “解決の順序と状態”| 順 | 条件 | 状態 | 画面 |
|---|---|---|---|
| 1 | シンボルが見つかり、指紋も同じ | 最新 | 印なし |
| 2 | シンボルは見つかったが、指紋が違う | 変わった | 「解説が古い可能性」。見直しの対象 |
| 3 | シンボルが無いが、quote のあいまいな照合か git の名前の変更で候補がある | 移動の可能性 | 候補を出す。付け替えは人か AI が決める(勝手に付け替えない) |
| 4 | どれも見つからない | 孤立 | ファイル単位の解説に格下げして残す |
状態はアプリが計算するもので、ファイルには書きません。
指紋は、コードを字句(トークン)の並びにしてから取ったハッシュ(sha256:)です。空白・改行・インデントの違いは入らないので、整形の道具をかけ直しただけでは解説は古くなりません。中身(識別子や値)が変わると指紋が変わります。
ノートの fingerprint は AI が解説を書いたときのファイル全体の指紋、review の指紋は人が確認したときの指紋です。2 つを今のコードの指紋と見比べて、「AI の解説が古い」「人の確認が古い」を別々に出します(網羅率と古さ)。指紋は書き込み層が計算して入れるので、AI が自分で計算して写すことはありません。