ADR-0013: Env モジュールによる環境設定値の外部化と直接参照禁止
- Status: Accepted (旧形式「## ステータス: 採用済み」より転記)
- Mode: Critical (内容から推定・旧 README 一覧より移設)
- Kruchten Type: Existence/Property
- Scope: product
- Implementation Status: Done (PR #512、Env モジュール全面置換)
Kruchten Type は ADR-0031 (2026-05-13) で遡及追加。分類根拠は ADR-0031 §決定セクションおよび docs/adr/README.md の Kruchten 3 分類ガイドを参照。 Status / Mode / Scope は 2026-06-11 に遡及追加 (ADR-0031 corrigendum パターン)。出典: Status = 旧形式「## ステータス」節の機械転記 / Mode = 旧 README §既存 ADR 一覧の推定値 (git 履歴) / Scope = ADR-0049 4 層分類の遡及付与 (PR レビューで確定)。
ステータス: 採用済み
コンテキスト
スプレッドシート ID、API キー、フォルダ ID などの環境依存値を GAS スクリプトに直書きすると、開発用・本番用の混在リスクがある。また将来のマルチテナント化(ADR-0009 Phase 3)では、同じコードで異なるテナントのリソースに接続する必要がある。
選択肢:
- 案A: 定数ファイルに dev/prod の値をハードコード
- 案B: GAS スクリプトプロパティ (
PropertiesService) を各ファイルから直接呼び出す - 案C:
Envモジュール (000_infra/001_env.js) に一元化し、他のファイルからはEnv.xxx()経由でのみ取得する
決定
案C を採用する。 PropertiesService.getScriptProperties() の直接呼び出しを全ファイルで禁止し、必ず Env モジュール経由で取得する。
Env.name() // 環境名 ("dev" | "prod")
Env.isDev() // 開発環境判定
Env.spreadsheetId() // 対象スプレッドシート ID
Env.geminiApiKey() // Gemini API キー
Env.receiptFolderId() // 領収書フォルダ ID
理由
devとprodでスプレッドシート ID が異なるため、直書きすると本番データを誤操作するリスクがあるclasp-switch.shで.clasp.jsonを切り替えるだけで環境が変わる設計と整合する- 将来のマルチテナント化(ADR-0009 Phase 3)でテナント固有の値に差し替える際、
Envモジュールのみ変更すれば済む - 「環境依存値がどこにあるか」を 1 ファイルに集約することで、セキュリティ監査が容易
結果・影響
- ポジティブ:
npm run push:dev/push:prodの切り替えだけで環境が完全に分離される - ポジティブ: テナント抽象化リファクタリング(MAS-219)の際、変更箇所が
001_env.jsに限定される - ネガティブ: 新しい環境依存値を追加するたびに
Envモジュールへのメソッド追加が必要 - 関連: ADR-0009(活動領域の段階的分離戦略)の「テナント抽象化の設計規律 Phase 1」の具体的な実装
Confirmation (準拠確認 / Fitness Function)
本セクションは ADR-0036 (Accepted 2026-05-14) で遡及追加された。ADR-0031 パターン (業界標準準拠メタデータ後付け = 誤字修正範疇) に準拠する遡及で本文の意思決定内容は不変。
- 検証手段: N/A — 要マッピング更新 (ADR-0036 遡及時点で未定義、月次レビューで確定)
- 実行頻度: —
- 違反時の対応: —