不動産登記簿の解説サイト tokibo に「実物の土地謄本を読み解く実例ページ」を足した。dev 環境でだけ見える private ページとして実装し、本番ビルドからは個人データを自動で除外する仕組みまで組んだ。途中で「個人データを含むコミットを GitHub に push 済み」という事故が発覚し、git filter-repo で履歴を完全浄化することになった。後半は同じページに Q&A と縦長の紙芝居 SVG タイムラインを追加した。
朝の発掘 — 何を引き継いだのか
朝イチで「昨日のセッションで、不動産登記簿の解説に実物謄本のデータ化を仕込んでハンドオフしたはず。建物の謄本を途中まで読んでた気がする」とうろ覚えのまま Claude Code に投げた。
memo を漁ってもらったら memo/2026-06-12/tokibo-handover.md が出てきた。読んでみると現実は記憶とズレていた。
- 実物の謄本は「建物」ではなく土地
- 分析は途中ではなく完了済み
- Turso DB に登記簿の見方の専門書データも入っていて、参照可能な状態だった
「見つからない」と昨日言っていた書籍データも、本人の探し方が甘かっただけで普通に登録されていた。記憶はあてにならない。memo を残しておいて助かった、というのが朝イチの感触。
計画 → Codex レビュー → 修正
ハンドオフ書を読み直すと、本来やりたかったのは「謄本を構造化データに落として、解説ページとして読めるようにする」ことだった。地図表示、権利関係の整理、担保情報、家系図、Q&A — このあたりを 1 ページにまとめる。
ただし謄本そのものは個人データなので、本番に出すわけにはいかない。dev でだけ動くページにする必要がある。
設計が複雑になりそうだったので、いつもどおり計画を memo に書き起こして Codex(GPT-5)にレビューさせた。返ってきた指摘のうち重要だったのは 2 点で、postgenerate フックの実体を見ずに計画を書いていた箇所と、リークスキャンの責務分離が曖昧だった箇所。指摘どおりに直して再レビュー、承認を取って実装に入った。
実装 — dev 限定で動かす仕組み
実装は段階を分けた。
Step 1: .gitignore で安全網を最初に貼る。 private データ用のディレクトリを最初から除外しておく。これを最初にやらないと、うっかりコミットしたときに事故る。
Step 2: リークスキャンスクリプト+ postgenerate フック+マーカー。 ビルド成果物に private マーカーが残っていないかをスキャンして、見つかったらビルドを落とす。pnpm generate の後段に組み込んだ。
Step 3: 章レジストリ・Hub・Layout の devOnly 対応。 import.meta.dev でフィルタを噛ませて、本番では実例ページが章一覧に出てこないようにした。
Step 5-7: private 本文コンポーネント、ページシェル、memo の参照更新。
Step 8: テスト。 既存テストの import 作法に合わせて書いた。pnpm test:run で全 278 件 pass。
dev で /tokibo/jitsurei を開いたら、土地の権利の流れ・家系図・担保情報・地図がページ上に並んだ。
事故発覚 — 個人データが GitHub に push 済み
実装の途中、安全確認のために git の状態を見ていたら「個人データを含む memo ファイルが既にコミット・push 済み」と判明した。.gitignore を貼る前のコミットに紛れ込んでいた。
ここで手が止まった。
GitHub からは消えたコミットでも、履歴の中には残っている。git rm してもダメで、過去のコミット自体から消す必要がある。git filter-repo を使う場面だが、作業ツリーに影響するし、並行作業がないかも確認しないといけない。
進め方:
- 並行セッションが回っていないことを確認
- 一時クローンを別ディレクトリに作って、そこで
git filter-repoをかける - 浄化されたリポジトリで GitHub に force-push
- ローカルの本体リポジトリも同期し直す
force-push は危険な操作なので、普段なら絶対に避ける。今回は履歴に個人データが乗っかっている時点で「force-push しない方が危険」という判断になった。Claude Code に実行してもらい、ローカルとリモートの両方からデータが消えたことを確認した。
学びとしては「.gitignore を貼る順番を間違えるとここまで影響が広がる」という一点に尽きる。最初に安全網を貼る Step 1 は、機械的なステップに見えて実は事故防止の本丸だった。
Q&A — 「借金額は土地の値段とイコールか?」
実装が落ち着いたあと、ユーザー本人からの素朴な質問が飛んできた。
「これって、借金とセットで担保が書いてあるじゃないですか。これって要するに、土地の値段とほぼイコールだと考えていいんですかね」
直感的にはそう見えるが、答えは「ほぼイコールとは言えないが、ざっくりした下限の目安にはなる」。理由を 3 つに整理して Q&A セクションに足した。
- 掛け目で割り引く: 貸す側は時価の 60〜80% 程度しか貸さない。担保額より時価のほうが大きい
- 評価方式が違う: 担保評価額・公示地価・実勢価格はそれぞれ別物
- 抵当順位がある: 1 番抵当・2 番抵当の合計が担保力を表すので、1 行だけ見ても意味がない
Q&A の置き場所は地図の前にした。読者が地図を見てピンが立った瞬間に「で、いくらの土地なの?」と思うはずなので、その手前で答えておく流れにする。
縦長の紙芝居 SVG タイムライン
最後に「権利関係の変遷をイベントごとに縦長で図解してほしい。紙芝居・4 コマ漫画的に」という追加注文。
svg-diagram スキルのデザインルールとアンチパターン集を読み込んでから描いた。家系図パートで「人物 3 箱の座標が重なり回避のために妙な translate がかかっている」というミスを見つけて修正もした。SVG を手で書くと、座標計算をサボった箇所が後から効いてくる。
完成したタイムラインは、所有権の移転・抵当の設定・抹消の流れがイベント単位で縦に並ぶ構成にした。スマホで縦スクロールしながら読める粒度。
コミット
最後にコミット 4 件を切ってもらった。
50420738 docs(memo): 実物謄本ビューアーページの実装計画を追加bea5732f feat(tokibo): 実物謄本の実例ページを dev 限定で追加(個人データは git 管理外)87fee541 feat(build): 非公開データのリークスキャンを postgenerate に追加
コミット前の安全確認で、計画書のなかに 2 件、地番らしき文字列が残っていたのが見つかった。伏せて再コミット。ここまで来てもまだ漏れがある、というのが今回の事故の根深さを示している。
朝イチの別件 — tokibo に共通パンくずを足した
同じ日の早朝にもう 1 件、関連修正を入れていた。/tokibo/* 配下の章ページに戻り導線がないという指摘を受け、TokiboChapterLayout を新設してパンくずを生やした。ユニットテスト 25 件 pass。コミット af9dbc56 feat(tokibo): 章ページに共通レイアウト(パンくず)を追加。
この修正があったおかげで、夕方に実例ページを足したときも TokiboChapterLayout 経由で自動的にパンくずが付いた。レイアウトを 1 箇所に集約しておくと、後続の追加が一段楽になる。
今日の学び
.gitignoreは機能追加より先に貼る。後追いでは履歴に残る- 計画は memo に書いて Codex でレビュー。今回も致命的指摘が 2 件出た
- private データを扱うページは「dev 限定」を最初から設計に組み込む。後付けは漏れる
- filter-repo + force-push は最終手段だが、個人データに対しては使う覚悟を持つ
- コミット直前の安全確認をスクリプト化する価値はある。手作業の grep だと漏れる