不動産登記簿の解説サイト 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 だと漏れる