• 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

理由

  1. devprod でスプレッドシート ID が異なるため、直書きすると本番データを誤操作するリスクがある
  2. clasp-switch.sh.clasp.json を切り替えるだけで環境が変わる設計と整合する
  3. 将来のマルチテナント化(ADR-0009 Phase 3)でテナント固有の値に差し替える際、Env モジュールのみ変更すれば済む
  4. 「環境依存値がどこにあるか」を 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 遡及時点で未定義、月次レビューで確定)
  • 実行頻度: —
  • 違反時の対応: —