事故受付や問い合わせ調査で、AIに読ませる前のCSVにメールアドレスや証券番号が残っていると、プロンプトを工夫しても遅いです。最初に止める場所は、AIの返答ではなく入力ファイルです。
ここでは、保険代理店の事故受付を例に、ローカルの架空データだけで「危ない列名や値があれば終了コード1で止める」小さなNode.jsチェックを書きます。Claude Codeの権限やsandboxは公式ドキュメントで確認しつつ、この記事では実装パターンだけに絞ります。
先に分けるフォルダ
原本とAI用コピーを同じフォルダに置かないのが前提です。
-
claim-raw/: 原本メール、証券PDF、診断書、写真、見積 -
claim-ai-work/: 匿名化済みCSV、分類表、メール下書き材料 -
claim-approved/: 人が承認した出力
Claude Codeの公式ドキュメントでは、permissionsとsandboxは別の層として扱われます。permissionsでtoolのアクセスを絞り、sandboxでBashと子プロセスのファイルアクセスを絞る、という考え方です。
確認した公式ページは、Claude Codeのpermissionsとsandboxです。permissionsはRead、Edit、Bashなどのtoolがどこへ触れるかを決めます。sandboxはBashコマンドと子プロセスにファイルシステムやネットワークの境界をかけます。どちらか片方で完了と見なさず、入力ファイルを減らしたうえで二重に止める形にします。
最小チェックコード
以下はコピペで動く検査例です。実データは使わず、通してよい架空CSVと止めたい架空CSVを配列に入れています。
const files = [
{
path: "claim-ai-work/intake-redacted.csv",
text: "claim_id,case_type,redacted_summary\nC-001,auto_property,front bumper damage"
},
{
path: "claim-ai-work/bad.csv",
text: "claim_id,email,policy_number\nC-002,taro@example.com,AB1234567890"
}
];
const blockedFieldNames = [
"name",
"email",
"phone",
"address",
"policy_number",
"vin",
"diagnosis",
"hospital",
"counterparty"
];
const valuePatterns = [
/[A-Z]{2}\d{10}/,
/[\w.+-]+@[\w.-]+\.[A-Za-z]{2,}/,
/\b\d{2,4}-\d{2,4}-\d{3,4}\b/
];
const findings = [];
for (const file of files) {
const lower = file.text.toLowerCase();
for (const field of blockedFieldNames) {
if (lower.includes(field)) {
findings.push({ path: file.path, type: "blocked field", field });
}
}
for (const pattern of valuePatterns) {
if (pattern.test(file.text)) {
findings.push({ path: file.path, type: "blocked value", pattern: String(pattern) });
}
}
}
console.table(findings);
if (findings.length > 0) process.exitCode = 1;
実ファイルを読む版にする場合も、まずは架空データで「止まること」を確認します。止まるテストがない検査は、入力境界として信用しにくいです。
実ファイル版へ変える時
配列の files を実ファイル読み込みに変える時も、いきなり claim-raw/ を対象にしません。読む対象は claim-ai-work/ のみです。Node.jsなら fs.readdir で対象拡張子を .csv、.json、.md、.txt に絞り、PDFや画像が来たら「未対応」として止めます。黙って通すより、対応外を明示して人の確認へ戻すほうが事故を減らせます。
終了コードも運用上の約束にします。process.exitCode = 1 ならClaude Codeへ渡さない、0 でも人が作業コピーを目視する、という2段階です。CIに入れるなら失敗時に検出値そのものを長く出さず、ファイル名、種類、項目名までに抑えます。ログへメールアドレスや証券番号を再掲すると、検査が新しい漏えい経路になります。
よくある失敗
一番多い失敗は、列名だけを見ることです。memo 列の中に住所や病名が残ると、列名検査では通ります。上のコードは値の正規表現も見ますが、PDF、画像、手書き、複数列を組み合わせた再識別までは見ません。
次の失敗は、検査を実データで試すことです。ターミナル履歴、スクリーンショット、CIログに値が残ります。許可サンプルも拒否サンプルも、架空の受付IDと架空のメールだけで作ります。
もう一つの注意点は、正規表現を増やしすぎて運用が止まることです。検出を細かくするほど誤検知も増えます。最初は「列名で止める」「メールや電話らしい値で止める」「未対応ファイルを止める」の3つに絞り、止まった件数と人の確認結果を見ながら足します。
運用に入れる時の境界
検査コードだけで安全とは言いません。実運用では、Claude Codeのpermissionsで claim-raw/ をdenyし、sandbox側でも同じ原本フォルダを読めないようにします。さらに、AIに渡すCSVは許可列方式にして、自由記述は短い伏せ字要約へ変えます。
公式情報は、Claude Codeのpermissionsとsandbox、金融庁の金融分野個人情報保護、個人情報保護委員会のクラウド注意喚起を確認してください。個別の法務判断は、自社の責任者や専門家が行う前提です。
まとめ
AI入力前チェックは、完璧な匿名化ツールではありません。それでも「明らかに渡してはいけない列や値が残っていたら止める」だけで、事故受付の初手はかなり変わります。大事なのは、原本フォルダ、AI用コピー、人の承認、送信先を分けて、止まった件数も記録することです。
詳しい保険代理店向けの業務フローは、こちらにまとめました。