# instinct: 一度きりの移行スクリプトは死んだDSN・平文PW・廃止認証方式を残しがち。実行されなくても負債なのでpeer接続化+ハードコード排除する

`migrate_from_*.py` のような一度きりの移行スクリプト(cron無し・移行完了済み)は、**接続先DB・認証方式の変化に取り残されて死んだDSNを抱える**。実行されないので気づかれないが、平文PWや廃止された認証方式を残す技術的負債になる。

## 典型パターン(anime migrate_from_vvv.py 実例)
- 存在しないDB参照: `postgresql://...@localhost:5432/shadow`(shadow DBもroleも不在・[[instinct-dead-db-connection-silent-data-drought]])
- 平文ハードコードPW: `shadow:shadow_dev_pass_2026@...`
- 廃止された認証: `127.0.0.1 trust`(後に[[instinct-pg-hba-trust-to-scram-safe]]でscram化され壊れる)
→ 3つ揃って「実行しても即エラーで動かない」状態に

## 直し方(最小修正)
- DSNを **Unixソケットpeer認証**に: `postgresql:///?host=/var/run/postgresql`(パスワード不要)
- 環境変数で上書き可能に: `os.environ.get("XXX_DSN", "")`
- 移行先DBを実在するものに是正(例: anime本番は vvv_prod 共用・.envのDATABASE_URLで確認)
- 「一度きり移行・完了済み・cron無し」の旨をコメント明記
- コメント内にもPW文字列を残さない(「平文ハードコードPW」と伏せる)

## 判断
- cron無し・移行完了済みなら本番稼働に**無影響**(実行されない)→ PR化して負債解消・本番再起動不要
- セキュリティ監査(#248系)の文脈では平文PW排除として価値あり。`grep -rn '@localhost:5432\|@127.0.0.1:5432'` で全スクリプトを洗うと芋づる式に見つかる

## 関連
- [[instinct-tools-hardcoded-db-use-socket-peer]] — tools/*.pyの同種問題(stale_bot_alert/embed_videos)
- [[instinct-dead-db-connection-silent-data-drought]] — 死んだDB接続がデータ欠損を生む
- [[instinct-pg-hba-trust-to-scram-safe]] — trust廃止でこれら残骸が顕在化する

---
(migrated from local memory/instinct_migration_script_dead_dsn_residue.md)