最近触っていなかった別プロジェクトを開いて、積み残しが何だったか思い出せなくなっていた。一通り棚卸しさせたら、明確な積み残しは2件。だがそれより危ない3件目が混ざっていた。公開しているスライドデータに、ある投資家の名言とその出典が書名・出版社・ページ番号ごと丸ごと書かれていた。これはコンプラ事故になる、と判断して最優先で潰すことにした。
まず棚卸しから始めた
しばらく離れていたプロジェクトは、自分の記憶のほうがあてにならない。まず現状を把握させた。
- ワーキングツリーはほぼクリーン。未追跡ファイルが少し残っているだけ
.claude/issues/は全件解決済み- 明確な積み残しは2件。英語音声対応のTODOと、ある著名投資家にちなんだ「統合」機能の計画書の未作成分
ここまでは想定どおりだった。問題は、棚卸しの最後に1件だけ別種のリスクが見つかったことだ。本番データに書籍の出典表記が残っていて、コンテンツの出典ルール違反の疑いがある、という指摘だった。
棚卸しの結果を見て、優先順位を自分で組み替えた。英語音声は後でいい。出典表記が一番リスクが高いから最初にやる。そして投資家統合のほうは、計画書にあって未作成のものを全部入れる。この2本立てにした。
一番こわいのは「公開物に出典が残っていること」
積み残しのタスクは、やらなくても誰にも迷惑はかからない。だが公開データに他人の著作物の引用が出典付きで載っているのは話が違う。読者の画面に書名と出版社とページ番号が見えている状態は、放置するほど事故に近づく。だからここを最初に拾った。
最初に網羅チェックをかけたら、出典表記の候補がいくつも引っかかった。ただ、その多くは「データの出典を明示する」といった一般論の文章や、本文中の誤検出だった。本当に消すべき明確な違反は3箇所に絞れた。1つは例示データ内に残っていた書籍シリーズへの参照、残り2つは名言スライドのデータだった。
落とし穴は「読み上げ台本が本番に表示されていた」こと
ここで一度手が止まった。名言スライドのデータには script というフィールドがあって、そこに名言と出典が丸ごと書かれている。最初は「これは読み上げ用の原稿だろう」と思った。読み上げ用なら、画面には出ていない可能性がある。
だが、それで安心するのは早い。2つ確認させた。
- 名言の本体はSVG画像に焼き込まれていないか。 台本のテキストだけ消しても、画像のほうに書名が描き込まれていたら意味がない。確認させたところ、そのSVG画像はpublicディレクトリには存在せず、別配信(R2のアセット用ドメイン)からしか読まれていなかった。手元では中身を直接見られない。
scriptは画面に出るのか、出ないのか。 本番ページのテンプレートを読ませたら、scriptは「読み上げ原稿」という見出しで本番画面にそのまま表示されていた。つまり台本=非表示という最初の思い込みは外れていて、書籍引用は読者に見えている状態だった。
この2点目が一番の気づきだった。「読み上げ台本だから裏に隠れている」と決めつけていたら、表に出ている引用を見逃すところだった。台本が本番表示されるという仕様を確認して初めて、ここが明確な違反だと言い切れた。
修正のスコープを切り分けた
3箇所のうち、例示データ内の書籍参照は文意を保ったまま中立的な表現に書き換えられる。これは判断に迷う余地がないので、その場で消した。
名言スライド2枚は扱いが分岐する。台本のテキストは消せても、SVG画像のほうに名言と書名が焼き込まれている可能性が高く、画像はR2にあって手元で中身を確認できない。台本だけ消して画像に残っていたら片手落ちになる。だからこの2枚は一旦保留にして、画像側の対応とセットで後日やると決めた。中途半端に台本だけ消して「対応済み」と思い込むほうが危ない。
出典対応として確定で潰せたのは、例示データの参照を中立化する1件。残りは画像確認待ちとして明示的に棚に残した。
統合機能の未作成分を全部実装した
出典の確定分を片付けてから、本題の投資家統合に移った。この機能は着手済みで、投資家コラムのコンポーネント・堀(moat)の概念図3つ・いくつかの章への適用・クイズまでは入っていた。ただ計画書の一部が未達のままだった。「未作成分を全部入れてほしい」という依頼だったので、計画書とフェーズ1の実装パターンを照合しながら順に埋めていった。
既存の設置パターンはどの章も「投資家コラム → 図(データ元と年度をキャプションに明記)→ インラインクイズ」の順だった。これに倣って、揃えながら足していった。
- 概念図を2つ新規作成。 10年の利益率の一貫性を折れ線で示す図と、売る理由を「可逆/不可逆」の軸で並べたマトリクス図。どちらも実在企業を使わない模式データなので裏取りは不要
- 章への適用を進めた。 「何で稼ぐ会社か一文で」がテーマの章には一貫性のコラムと図とクイズを橋渡しで入れ、トレンドの崩れを扱う章には「トレンドが崩れる=堀が傷むサイン」という総括コラムを上乗せした
- 売る理由を扱う章には、3つの理由のうち堀の喪失が最も不可逆=最重、という補論をコラムと図とクイズで足した。 バリュエーションの章には「レンジ超過は過熱か構造変化かを問い直す」軽量コラムを、断定的なしきい値を出さない形で入れた
- 減価償却や利益率の章にも、原則論のコラムを重複を避けながら追加した
- 各章末のまとめに追加論点を1行ずつ足し、第2部の入口に「全体は教育目的であって投資助言ではない」旨の免責コラムを入れた
コラムを書くときは、どの文面にも「これは投資助言ではない」というトーンを通した。出典のリスクを潰した直後だけに、こちらでも変な断定を残さないよう気をつけた。
検証
実装後、編集した章に人名・書名が混入していないかを確認させた。図のコメントに出てくる「economic moat」は中立的な専門用語の説明だけで、固有名は入っていない。
pnpm lint は4件のエラーが出たが、すべて今回の変更外の既存ファイルが原因で、追加したコードにはエラーはなかった。pnpm build も通り、ビルドは完了した。最後にdevサーバーを立てて、新しく作った2つの図をブラウザで目視確認した。コラム→図→クイズの並びは意図どおりで、折れ線もマトリクスも座標が崩れずに描画されていた。
学び
形容詞では「出典が残っているのは危ない」で止まってしまう。だが実際に何が起きていたかを動詞で書くと、読者の画面に書名と出版社とページ番号がそのまま表示されていた、になる。この差が判断の速度を決めた。
積み残しのタスクと、公開物のコンプラ事故は別の重さで扱う。前者は後回しでも誰も困らないが、後者は時間が経つほど被害が広がる。棚卸しで両方が並んで出てきたとき、重いほうを先に拾えるかどうかは、AIの判定ではなく自分が下す判断だと改めて思った。
そして「読み上げ台本だから裏に隠れている」のような思い込みは、実際にテンプレートを読むまで信じないこと。台本が本番表示される仕様を確認して初めて、違反だと言い切れた。手元で確認できないSVG画像を「たぶん大丈夫」で済ませず、画像側の対応とセットで後日やると棚に残したのも、同じ理由だ。中途半端に消して「対応済み」と記憶するほうが、後で事故る。