D-20260731-03|部署 profile 選擇與測試鏈隔離¶
背景與驅動力¶
單一 deployment-values.json 需要人工改寫 stage 與端點;舊 check:deployment --stage
只覆寫檢查時看到的 stage,未保證檢查對象就是 bundle 實際嵌入的設定。拆分 profile 後,
private-playtest 雖有真 ledger、signer 與 bootstrap 的硬閘,仍需防止測試鏈誤用 public
bootstrap、signaling 或 pinning 基礎設施。
考慮過的選項¶
- 維持單檔並由 CLI 暫時覆寫 stage:無法證明被驗證值與 bundle 相同,否決。
- private-playtest 強制端點非空:GossipSub 或其他受控拓撲可不依賴所有選配服務,過度收緊, 否決。
- 三份唯讀 profile,加上 private 非空端點格式驗證與跨 profile 隔離(採納)。
- 放寬 private 的 ledger、signer 或 bootstrap:與 D-20260713-01 的真實多人測試定位衝突, 否決。
決定¶
development、private-playtest、public各自持有一份 checked-in deployment values; build 透過明示 configuration 選入唯讀 profile。check:deployment --profile <name>必須直接載入該 profile,且檔案內stage必須等於 選取名稱;不得再用命令列覆寫 stage。private-playtest保留正式 ledger、至少一位 signer 與至少一個 bootstrap 的既有硬閘。- private 的
signalingUrls與pinningUrls可為空;一旦有值,分別必須是無 credential、 path、query、fragment 與 placeholder host 的wss:/https:base origin。 - private 與 public 的
bootstrapNodes、signalingUrls、pinningUrls經 multiaddr/URL canonical normalization 後不得有交集。private gate 必須載入 checked-in public profile 比對,public profile 無法載入時 fail closed。 legalAgentContact仍只屬 public release policy。
後果與影響¶
開發者不再為切換環境改寫同一份設定;release gate 與 bundle 使用同一 profile。測試鏈仍 可不配置選配 endpoint,但不能靜默連到正式服務,避免測試房間進入正式 signaling 或測試 CID 被送進正式 pinning。新增 public 基礎設施時,也必須同步通過 private/public 隔離 gate。