# Credential Escrow Evidence Owner Request

> 狀態時間：2026-06-13 13:10 Asia/Taipei
> 範圍：DR credential escrow evidence marker 補齊
> 原則：只收非敏感 evidence-id；禁止收集、張貼、提交或保存任何密碼、token、金鑰、recovery code、secret value、hash、prefix/suffix 或 partial token。

---

## 1. 目前判定

| 項目 | 狀態 | 完成度 | 說明 |
|------|------|-------:|------|
| 備份核心 | GREEN | 100% | 2026-06-26 07:18 readback：110 `13/13 fresh failed=0`、188 `2/2 fresh failed=0`、offsite / rclone fresh、latest-only verifier 與 full cold-start 目前皆為綠燈。 |
| Escrow script / offsite readiness | READY | 100% | `SCRIPT_MISSING_COUNT=0`、`OFFSITE_CONFIGURED=1`、`RCLONE_CONFIGURED=1`、`READINESS_REQUIRE_CONFIGURED_BLOCKED=0`。 |
| Credential escrow owner request package | READY_TO_DISPATCH | 80% | 本文件定義 owner 需要提供的非敏感 evidence-id、禁止內容、dry-run 與驗收流程。 |
| Credential escrow marker | BLOCKED_WAITING_OWNER_EVIDENCE | 0% | 五個 marker 仍未寫入；不得用 placeholder 或 secret 補齊。 |
| DR scorecard closeout | BLOCKED | 90% | 服務可用性已綠；DR 完成仍等 `ESCROW_MISSING_COUNT=0`。 |

這不是服務 outage。這是 DR 復原治理 gate：必須證明關鍵復原憑證可由指定 owner 在災難時取回，但證明本身不能洩漏憑證。

---

## 2. Live Evidence

2026-06-26 07:18 在 110 只讀檢查：

```text
每日備份心跳核心正常但 DR 未完成
110備份=13/13 fresh failed=0
188備份=2/2 fresh failed=0
integrity_stale=0
offsite_configured=1
offsite_fresh=1
rclone_gdrive_configured=1
rclone_gdrive_fresh=1
escrow_missing=5
last_backup_all=2026-06-26 02:31:02
core_blockers=0
dr_warnings=5
```

2026-06-13 13:10 在 110 只讀檢查仍保留為原始缺口基準：

```text
missing: restic_repository_password
missing: offsite_provider_credentials
missing: break_glass_admin_credentials
missing: dns_registrar_recovery
missing: oauth_ai_provider_recovery

SCRIPT_MISSING_COUNT=0
OFFSITE_CONFIGURED=1
RCLONE_CONFIGURED=1
B2_CONFIGURED=0
READINESS_REQUIRE_CONFIGURED_BLOCKED=0
ESCROW_MISSING_COUNT=5
PARTIAL_MARKER_PRESENT=1
FULL_MARKER_PRESENT=1
SUMMARY PASS=8 WARN=5 BLOCKED=0
```

`B2_CONFIGURED=0` 是 legacy B2 未配置；目前 Google Drive / rclone provider 已配置，所以不是本輪 blocker。

---

## 3. Owner Request Matrix

| Item | Owner 要確認的復原能力 | 可接受的非敏感 evidence-id | 禁止內容 |
|------|--------------------------|-----------------------------|----------|
| `restic_repository_password` | 能在災難時取回 restic repository password。 | Password manager item ID、sealed envelope ID、recovery checklist ID。 | Restic password、recovery code、secret URL、截圖中的密碼。 |
| `offsite_provider_credentials` | 能在災難時取回 Google Drive / rclone 或 offsite provider 憑證。 | Vault item ID、provider credential record ID、offsite access checklist ID。 | OAuth token、refresh token、application key、client secret、cookie。 |
| `break_glass_admin_credentials` | 能在災難時取得 break-glass admin 登入或替代復原路徑。 | Break-glass credential record ID、sealed envelope ID、emergency access checklist ID。 | Admin password、SSH private key、OTP seed、recovery code。 |
| `dns_registrar_recovery` | 能在災難時恢復 DNS registrar / domain control。 | Registrar recovery checklist ID、vault item ID、domain recovery record ID。 | Registrar password、recovery code、unredacted registrar session。 |
| `oauth_ai_provider_recovery` | 能在災難時恢復 AI provider / OAuth provider 管理權。 | Provider recovery checklist ID、vault item ID、provider account recovery record ID。 | API key、token、client secret、OAuth refresh token。 |

Evidence-id 必須是「外部系統中可查核的記錄代號」，例如 password manager item ID、sealed envelope 編號、內部 recovery checklist 編號。它不能是憑證本身，也不能足以推導出憑證。

---

## 4. 禁止提交的資料

以下內容不得出現在 repo、聊天、issue、PR、LOGBOOK、snapshot、terminal output 貼文或 marker note：

- 密碼、token、API key、private key、SSH key、cookie、session。
- OAuth client secret、refresh token、authorization header。
- OTP seed、recovery code、backup code。
- PostgreSQL / Redis / Sentry / provider connection URL 中含帳密的字串。
- secret hash、prefix、suffix、partial token、可逆遮罩值。
- 未遮罩截圖、未遮罩 password manager 畫面。
- placeholder，例如 `EVIDENCE_ID_FOR_*`、`VAULT-ITEM-ID`、`TODO`、`TBD`。

---

## 5. Safe Execution Flow

以下命令只能在 owner 已於 repo / chat 外部確認復原資料存在後執行。`<NON_SECRET_EVIDENCE_ID>` 必須換成真實但非敏感的外部記錄代號。

```bash
# 1. 讀取目前 marker 狀態；此步不暴露 secret。
/backup/scripts/mark-credential-escrow-verified.sh --status

# 2. 先 dry-run 驗證 evidence-id 格式與 item 合法性；此步不寫入 marker。
/backup/scripts/mark-credential-escrow-verified.sh \
  --item <item> \
  --evidence-id <NON_SECRET_EVIDENCE_ID> \
  --dry-run

# 3. dry-run OK 且 owner 明確批准後，才寫入 marker。
/backup/scripts/mark-credential-escrow-verified.sh \
  --item <item> \
  --evidence-id <NON_SECRET_EVIDENCE_ID> \
  --note <SHORT_NON_SECRET_NOTE>

# 4. 寫入後重新產生 escrow / backup / cold-start 證據。
/backup/scripts/offsite-escrow-evidence-report.sh --no-color
/backup/scripts/backup-status.sh --no-notify --no-refresh
/home/wooo/scripts/full-stack-cold-start-check.sh --monitor-read-only --no-color --watch --interval 1 --max-attempts 1
```

若 dry-run 拒絕 placeholder、過短值、疑似 secret 或不合法 item，必須停止，回到 owner 重新提供非敏感 evidence-id。

---

## 6. 驗收條件

| Gate | 必須看到 |
|------|----------|
| Escrow marker | 五個 item 都不再顯示 missing。 |
| Escrow report | `ESCROW_MISSING_COUNT=0`。 |
| Prometheus textfile | `awoooi_backup_dr_credential_escrow_missing_count 0`。 |
| Backup status | `escrow_missing=0`，且 `core_blockers=0` 維持不變。 |
| Alertmanager | `BackupCredentialEscrowEvidenceMissing` 不再 firing。 |
| Cold-start | `WARN=0 BLOCKED=0` 維持 green。 |

只有以上全部成立，才可以把 DR scorecard 從 `BLOCKED` 改為 `COMPLETE`。

---

## 7. 工作推進百分比

| Lane | 目前完成度 | 下一步 |
|------|-----------:|--------|
| Owner request package | 80% | 指定 owner role / team，交付本文件與五個 item 清單。 |
| Owner external verification | 0% | Owner 在 password manager、sealed envelope、registrar/provider account 外部完成查核。 |
| Dry-run validation | 0% | 五個 item 都以非敏感 evidence-id 通過 `--dry-run`。 |
| Marker write | 0% | 五個 marker 寫入成功。 |
| DR closeout verification | 0% | escrow report、backup status、Alertmanager、cold-start 全部重跑且綠燈。 |

---

## 8. 目前不可宣稱

- 不可宣稱 DR scorecard complete。
- 不可宣稱 credential escrow 已補齊。
- 不可把備份 / offsite / cold-start green 等同 credential escrow green。
- 不可用 placeholder、測試 ID 或秘密值補 marker。
- 不可消音 `BackupCredentialEscrowEvidenceMissing`，它目前是正確紅燈。
