From d7b71ddc1e320a8ec7b0914b0071057b94405213 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 14 Jun 2026 19:56:22 +0800 Subject: [PATCH] =?UTF-8?q?docs(security):=20=E6=96=B0=E5=A2=9E=20Backup?= =?UTF-8?q?=20Restore=20owner=20request=20draft=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/LOGBOOK.md | 28 + .../BACKUP-RESTORE-ESCROW-INVENTORY.md | 5 + .../BACKUP-RESTORE-OWNER-REQUEST-DRAFT.md | 111 + .../HIGH-VALUE-CONFIG-CONTROL-COVERAGE.md | 4 +- .../IWOOOS-CONFIG-CONTROL-INVENTORY.md | 7 +- .../SECURITY-SUPPLY-CHAIN-PROGRESS.md | 1 + ...-restore-owner-request-draft.snapshot.json | 4989 +++++++++++++++++ ...-04-15-MASTER-ai-autonomous-flywheel-v2.md | 2 + ...026-06-04-iwooos-security-governance-p0.md | 3 + .../backup-restore-owner-request-draft.py | 305 + .../security-mirror-progress-guard.py | 135 + 11 files changed, 5587 insertions(+), 3 deletions(-) create mode 100644 docs/security/BACKUP-RESTORE-OWNER-REQUEST-DRAFT.md create mode 100644 docs/security/backup-restore-owner-request-draft.snapshot.json create mode 100644 scripts/security/backup-restore-owner-request-draft.py diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index 9f70b14f3..1054adeb6 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,31 @@ +## 2026-06-14|Backup / Restore / Escrow owner request draft 本地完成 + +**背景**:配置亂動後能否安全恢復,取決於備份、還原、offsite、credential escrow、retention 與 DR runbook 是否被同一套資安流程控管。既有 repo-only 清冊已納入 38 個 surface;本段先建立 owner request draft,要求 owner 提供非敏感 evidence id、最新備份狀態、restore drill plan、maintenance window、rollback owner 與 validation plan,不執行任何 backup / restore。 + +**完成項目**: +- 新增 `scripts/security/backup-restore-owner-request-draft.py`,從 `backup-restore-escrow-inventory.snapshot.json` 產生 metadata-only owner request draft。 +- 新增 `docs/security/backup-restore-owner-request-draft.snapshot.json`,固定 `request_draft_count=38`、`write_capable_request_draft_count=27`、`live_evidence_required_request_count=38`、`request_field_count=24`、`required_owner_field_count=14`、`blocked_action_count=18`。 +- 新增 `docs/security/BACKUP-RESTORE-OWNER-REQUEST-DRAFT.md`,說明 request draft 類型、owner 必填欄位、blocked actions、完成度與 0 / false 邊界。 +- `security-mirror-progress-guard.py` 已鎖住新 snapshot 的 schema、summary、execution false flags、request ids、blocked actions 與每份草稿 false flags。 +- `BACKUP-RESTORE-ESCROW-INVENTORY.md`、`HIGH-VALUE-CONFIG-CONTROL-COVERAGE.md`、`IWOOOS-CONFIG-CONTROL-INVENTORY.md`、`SECURITY-SUPPLY-CHAIN-PROGRESS.md`、P0 主控板與 MASTER 已同步。 + +**本地驗證**: +- `python3 -m json.tool docs/security/backup-restore-owner-request-draft.snapshot.json` 通過。 +- `python3 -m py_compile scripts/security/backup-restore-owner-request-draft.py scripts/security/security-mirror-progress-guard.py` 通過。 +- 產生器 smoke:`BACKUP_RESTORE_OWNER_REQUEST_DRAFT_OK drafts=38 write_capable=27 fields=14 sent=0 runtime_gate=0`。 +- `python3 scripts/security/security-mirror-progress-guard.py --root .` → `SECURITY_MIRROR_PROGRESS_GUARD_OK`。 +- `python3 scripts/security/source-control-owner-response-guard.py --root .` → `SOURCE_CONTROL_OWNER_RESPONSE_GUARD_OK`。 +- `python3 scripts/ops/doc-secrets-sanity-check.py docs .gitea` → `DOC_SECRET_SANITY_OK scanned_files=830`。 +- `git diff --check` 通過。 +- diff-only 新增行工作溝通片語掃描通過;未加入工作溝通原文、委派 XML、內嵌瀏覽器上下文或內部抱怨內容。 +- Snapshot assertion 通過:`BACKUP_RESTORE_OWNER_REQUEST_DRAFT_ASSERTIONS_OK drafts=38 write_capable=27 fields=14 sent=0 runtime_gate=0`。 + +**完成度與邊界**: +- Backup / Restore / Escrow owner request draft artifact:`100%`。 +- Backup / restore / credential 類別成熟度:維持 `58%`,因為尚未收到 owner response 或 live backup evidence。 +- Production browser verification:不適用;本輪只改 repo 內文件、snapshot、guard 與產生器,不變更前端 bundle 或 runtime。 +- request sent、recipient confirmed、owner response received / accepted、live backup evidence、backup run、restore run、restore drill、offsite sync、remote delete、credential escrow marker write、retention change、restic prune、rclone config、Velero restore / backup、kubectl action、SSH、secret collection、host write、active scan、runtime gate、action buttons、production write 全部維持 `0 / false`。 + ## 2026-06-14|SSH / Firewall / Network Access owner request draft 本地完成 **背景**:110 端口關閉曾造成多個服務異常,代表 SSH、known_hosts、firewall、NodePort、NetworkPolicy、WireGuard 與 deploy SSH 不能只靠口頭管理。既有 SSH / network repo-only 清冊已納入 16 個 surface;本段先建立 owner request draft,要求 owner 提供脫敏 live access state、allowed source CIDR、維護窗口、rollback owner 與 validation plan,不直接改端口。 diff --git a/docs/security/BACKUP-RESTORE-ESCROW-INVENTORY.md b/docs/security/BACKUP-RESTORE-ESCROW-INVENTORY.md index 3c9c0dfd5..bb5ba36be 100644 --- a/docs/security/BACKUP-RESTORE-ESCROW-INVENTORY.md +++ b/docs/security/BACKUP-RESTORE-ESCROW-INVENTORY.md @@ -16,6 +16,10 @@ Backup / restore / escrow / retention 已從抽象待辦推進成可重跑的 re 此清冊仍不是 live backup truth。它只證明 repo 裡有哪些備份、還原、離機同步、credential escrow、Velero、alert 與 DR 文件需要被控管;不代表備份已成功、restore drill 已執行、offsite sync 已授權、escrow marker 可寫入或 retention policy 可變更。 +2026-06-14 已新增 `docs/security/BACKUP-RESTORE-OWNER-REQUEST-DRAFT.md` 與 `docs/security/backup-restore-owner-request-draft.snapshot.json`,將 38 個 backup / restore / escrow surface 轉成 owner request draft。固定 `request_draft_count=38`、`write_capable_request_draft_count=27`、`live_evidence_required_request_count=38`、`required_owner_field_count=14`、`blocked_action_count=18`、`request_sent_count=0`、`owner_response_received_count=0`、`runtime_gate_count=0`。 + +此 artifact 只表示 owner request 的 required shape,不代表 request sent、recipient confirmed、owner response received / accepted、live backup evidence、backup run、restore run、offsite sync、remote delete、credential escrow marker write、retention change、restic prune、rclone config、Velero restore / backup、kubectl action、SSH、secret collection、host write、production write 或 runtime gate。 + ## 2. 覆蓋摘要 | 指標 | 目前值 | 邊界 | @@ -126,6 +130,7 @@ python3 scripts/security/backup-restore-escrow-inventory.py \ | owner response 收件 / 接受 | `0%` | 尚未送件、收件或接受 | | live evidence collection | `0%` | 未 SSH、未 rclone、未 kubectl、未 restore | | restore / offsite / escrow / retention gate | `0%` | 全部仍為 `0 / false` | +| owner request draft | `100%` | 已新增 38 份 request draft、snapshot、文件與 guard;request sent / received / accepted 仍為 0 | ## 9. 邊界 diff --git a/docs/security/BACKUP-RESTORE-OWNER-REQUEST-DRAFT.md b/docs/security/BACKUP-RESTORE-OWNER-REQUEST-DRAFT.md new file mode 100644 index 000000000..f0b2b3056 --- /dev/null +++ b/docs/security/BACKUP-RESTORE-OWNER-REQUEST-DRAFT.md @@ -0,0 +1,111 @@ +# IwoooS Backup / Restore / Escrow Owner Request Draft + +| 項目 | 內容 | +|------|------| +| 日期 | 2026-06-14 | +| 狀態 | `owner_request_draft_ready_not_dispatched` | +| 工具 | `scripts/security/backup-restore-owner-request-draft.py` | +| Snapshot | `docs/security/backup-restore-owner-request-draft.snapshot.json` | +| Source inventory | `docs/security/backup-restore-escrow-inventory.snapshot.json` | +| runtime gate | `0` | + +## 1. 目的 + +本文件承接 Backup / Restore / Escrow / Retention repo-only 清冊,把 38 個 surface 轉成人工送件前 request draft。它讓備份總控、服務備份、Restic retention、offsite sync、credential escrow、Velero、restore drill、alert / health 與 DR 文件有一致的 owner 回覆欄位。 + +這不是 live backup truth、不是備份成功證明、不是 restore drill 授權、不是 offsite sync 授權、不是 credential escrow marker 可寫入,也不是 retention policy 可變更。 + +## 2. 摘要 + +| 指標 | 目前值 | 說明 | +|------|--------|------| +| request draft | `38` | 每個 backup / restore / escrow surface 一份草稿 | +| write-capable request draft | `27` | backup、restore、offsite、escrow、retention、Velero、health exporter 等可寫 / 可執行 surface | +| live evidence required request | `38` | 全部都需 owner 提供非敏感 live evidence | +| request field | `24` | 草稿欄位總數 | +| required owner field | `14` | owner 必填欄位 | +| blocked action | `18` | backup、restore、offsite sync、remote delete、marker write、retention、prune、rclone、Velero、kubectl、SSH、secret collection、runtime gate 等 | +| request sent / recipient confirmed | `0 / 0` | 尚未送件 | +| owner response received / accepted | `0 / 0` | 尚未收到或驗收 | +| live evidence received | `0` | 不 SSH、不讀 offsite、不讀 live backup | +| restore / offsite / escrow / retention accepted | `0 / 0 / 0 / 0` | 不得執行或標記完成 | +| runtime gate / action button | `0 / 0` | 不提供操作入口 | + +## 3. Request Draft 類型 + +| 類型 | 代表 request | 風險焦點 | +|------|--------------|----------| +| 備份總控 | `backup_restore_owner_request:backup_all_orchestrator` | 全服務備份、cron、失敗通知、restore drill owner | +| 服務備份 | `backup_restore_owner_request:backup_awoooi_service_script`、`backup_restore_owner_request:backup_harbor_service_script` | DB / registry / route / trace data 的 freshness、restore target isolation、secret redaction | +| Restic / retention | `backup_restore_owner_request:backup_common_restic_retention` | B2 / rclone owner、retention owner、prune window、no-secret-value evidence | +| Offsite / escrow | `backup_restore_owner_request:offsite_sync_controller`、`backup_restore_owner_request:credential_escrow_marker` | remote delete、full sync window、escrow evidence id、marker write gate | +| Velero | `backup_restore_owner_request:velero_restore_cronjob`、`backup_restore_owner_request:velero_credentials_manifest` | RBAC、MinIO endpoint、restore isolation、secret manager source | +| Alert / health | `backup_restore_owner_request:backup_health_exporter`、`backup_restore_owner_request:backup_restore_alert_rules` | false-green metric、alert reload owner、freshness SLO | +| DR / cold-start | `backup_restore_owner_request:cold_start_sop` | runbook freshness、restore observer、stop condition、rollback owner | + +## 4. Owner 必填欄位 + +1. `owner_role_or_team` +2. `decision` +3. `decision_reason` +4. `affected_scope` +5. `redacted_evidence_refs` +6. `latest_backup_status_ref` +7. `restore_drill_plan` +8. `offsite_sync_evidence_ref` +9. `credential_escrow_evidence_ref` +10. `maintenance_window` +11. `rollback_owner` +12. `validation_plan` +13. `retention_owner` +14. `followup_owner` + +## 5. 禁止動作 + +1. `backup_run` +2. `restore_run` +3. `restore_drill` +4. `offsite_sync` +5. `offsite_remote_delete` +6. `credential_escrow_marker_write` +7. `retention_change` +8. `restic_prune` +9. `rclone_config` +10. `velero_restore` +11. `velero_backup` +12. `kubectl_action` +13. `ssh_read` +14. `ssh_write` +15. `secret_value_collection` +16. `host_write` +17. `active_scan` +18. `runtime_gate_open` + +## 6. 指令 + +產生 committed snapshot: + +```bash +python3 scripts/security/backup-restore-owner-request-draft.py \ + --root . \ + --inventory-report docs/security/backup-restore-escrow-inventory.snapshot.json \ + --output docs/security/backup-restore-owner-request-draft.snapshot.json \ + --generated-at 2026-06-14T23:05:00+08:00 +``` + +驗證 guard: + +```bash +python3 scripts/security/security-mirror-progress-guard.py --root . +``` + +## 7. 完成度 + +| 工作 | 完成度 | 說明 | +|------|--------|------| +| owner request draft artifact | `100%` | 38 份 request draft、snapshot、文件與 guard 已固定 | +| request dispatch | `0%` | 尚未送件 | +| owner response received / accepted | `0%` | 尚未收到,尚未驗收 | +| live evidence collection | `0%` | 未 SSH、未讀 offsite、未讀 live backup | +| backup / restore / offsite / escrow / retention gate | `0%` | 未授權且未執行 | +| runtime gate / production write | `0%` | 未授權且未執行 | diff --git a/docs/security/HIGH-VALUE-CONFIG-CONTROL-COVERAGE.md b/docs/security/HIGH-VALUE-CONFIG-CONTROL-COVERAGE.md index fdff55b38..8695ee5de 100644 --- a/docs/security/HIGH-VALUE-CONFIG-CONTROL-COVERAGE.md +++ b/docs/security/HIGH-VALUE-CONFIG-CONTROL-COVERAGE.md @@ -55,7 +55,7 @@ |------|------|------------|--------| | P1-1 | Docker Compose / systemd / host service config | `50%` | repo-only 清冊已納入 9 個 surface,owner request draft 已轉成 9 份草稿;仍缺 owner response、110 / 188 live hash、restart window、rollback owner 與 post-check 指標 | | P1-2 | SSH / sudoers / known_hosts / firewall / WireGuard / NodePort | `54%` | repo-only 清冊已納入 16 個 SSH / network access surface,owner request draft 已轉成 16 份草稿;仍缺 owner response、live access state、allowed source CIDR、maintenance window、rollback owner 與 validation plan | -| P1-3 | Backup / restore / escrow / retention | `58%` | repo-only 清冊已納入 38 個 surface;仍缺 restore drill approval package、offsite / escrow owner、retention owner、rollback owner 與 no-secret-value evidence | +| P1-3 | Backup / restore / escrow / retention | `58%` | repo-only 清冊已納入 38 個 surface,owner request draft 已轉成 38 份草稿;仍缺 owner response、restore drill approval package、offsite / escrow owner、retention owner、rollback owner 與 no-secret-value evidence | | P1-4 | Prometheus / Alertmanager / Grafana / SigNoz / Sentry / Langfuse | `62%` | repo-only 清冊已納入 60 個 monitoring / alerting / observability surface;仍缺 live drift evidence、reload owner、receiver owner、route smoke 與 receipt proof | ## 4. 固定 0 / false 邊界 @@ -167,6 +167,8 @@ python3 scripts/security/high-value-config-control-coverage.py \ `backup_restore_escrow_inventory_v1` 已把 backup orchestration、service backup scripts、restic retention、offsite sync、credential escrow、Velero restore drill、backup health alert 與 cold-start / DR runbook 納入 repo-only 清冊,共 `38` 個 surface、`15` 個 backup script surface、`8` 個 offsite / escrow surface、`5` 個 Velero surface 與 `27` 個 write-capable surface。此更新只讓 `backup_restore_credential` 從 `52%` 推進到 `58%`;owner response、live evidence、restore drill acceptance、offsite sync acceptance、credential escrow acceptance、retention change acceptance、runtime gate 與 action button 仍全部為 `0`。 +2026-06-14 再新增 `backup_restore_owner_request_draft_v1`,把 38 個 surface 轉成 `request_draft_count=38`、`write_capable_request_draft_count=27`、`live_evidence_required_request_count=38`、`required_owner_field_count=14`、`blocked_action_count=18` 的人工送件前草稿。此更新仍不調高類別成熟度,因為 request sent、owner response received / accepted、live backup evidence、backup run、restore run、offsite sync、escrow marker write、retention change、runtime gate 與 action button 仍全部為 `0`。 + ## 11. P1-4 Monitoring / alerting / observability 清冊更新 `monitoring_alerting_observability_inventory_v1` 已把 Prometheus、Alertmanager、Grafana、SigNoz、Sentry、Langfuse、OTEL、Telegram / notification policy、deploy / reload scripts 與 alert chain smoke scripts 納入 repo-only 清冊,共 `60` 個 surface、`13` 個 alert rule surface、`6` 個 deploy / reload surface、`11` 個 write-capable surface 與 `1` 個 drift guard surface。此更新只讓 `monitoring_alerting_observability` 從 `56%` 推進到 `62%`;owner response、live evidence、reload owner、receiver owner、route smoke、runtime gate 與 action button 仍全部為 `0`。 diff --git a/docs/security/IWOOOS-CONFIG-CONTROL-INVENTORY.md b/docs/security/IWOOOS-CONFIG-CONTROL-INVENTORY.md index c43a6585a..28d809e24 100644 --- a/docs/security/IWOOOS-CONFIG-CONTROL-INVENTORY.md +++ b/docs/security/IWOOOS-CONFIG-CONTROL-INVENTORY.md @@ -53,6 +53,8 @@ 2026-06-14 已新增 `docs/security/SSH-NETWORK-OWNER-REQUEST-DRAFT.md` 與 `docs/security/ssh-network-owner-request-draft.snapshot.json`,將 16 個 SSH / network access surface 轉成人工送件前 owner request draft。固定 `drafts=16`、`write_capable=6`、`live_evidence_required=16`、`owner_fields=13`、`blocked_actions=16`,但 request sent、owner response received / accepted、live access state、firewall / port change、NetworkPolicy apply、NodePort change、WireGuard change、host write、runtime gate 仍全部為 `0 / false`。 +`backup_restore_owner_request_draft_v1` 已把 backup、restore、offsite、credential escrow、retention、Velero、alert / health 與 DR runbook 的 38 個 surface 轉成人工送件前 owner request draft。固定 `drafts=38`、`write_capable=27`、`live_evidence_required=38`、`owner_fields=14`、`blocked_actions=18`,但 request sent、owner response received / accepted、live backup evidence、backup run、restore run、offsite sync、remote delete、escrow marker write、retention change、host write、runtime gate 仍全部為 `0 / false`。 + 此更新仍不是 live network truth:live firewall、sudoers、known_hosts、NetworkPolicy、NodePort、WireGuard evidence、network owner、maintenance window、rollback owner 與 owner response received / accepted 全部仍為 `0`,也不得執行 SSH、keyscan、sudo、firewall change、NetworkPolicy apply、NodePort change 或 WireGuard cutover。 ### 0.4 2026-06-11 Backup / restore / escrow / retention repo-only 清冊 @@ -133,7 +135,7 @@ Nginx 是目前必須最先資安控管的配置,原因是它同時控制公 | P0 | Gitea workflows | `.gitea/workflows/*.yaml` | Gitea Actions | self-hosted runner, secret reference guard, deployment verification, no write action without owner | | P0 | Runner / deploy key / webhook / branch protection | `ops/runner/*`、source-control snapshots | Gitea / GitHub owner metadata | labels、key names、webhook names、ruleset metadata only;no token / key value | | P0 | Public admin / API route config | Nginx templates、`apps/web/src/lib/config.ts`、`apps/api/src/core/config.py` | Product owner + runtime owner | auth boundary、CORS、public URL、admin path smoke、frontend internal IP ban | -| P0 | Backup / restore credential | `scripts/backup/*`、`k8s/velero/*`、DR runbooks、`docs/security/BACKUP-RESTORE-ESCROW-INVENTORY.md` | MinIO / restic / offsite escrow | credential value absent、restore drill gate、offsite owner、escrow owner、retention policy、rollback owner | +| P0 | Backup / restore credential | `scripts/backup/*`、`k8s/velero/*`、DR runbooks、`docs/security/BACKUP-RESTORE-ESCROW-INVENTORY.md`、`docs/security/BACKUP-RESTORE-OWNER-REQUEST-DRAFT.md` | MinIO / restic / offsite escrow | owner request draft 已固定;credential value absent、restore drill gate、offsite owner、escrow owner、retention policy、rollback owner | | P0 | agent-bounty-protocol treasury / MCP / A2A | `docs/security/AGENT-BOUNTY-IWOOOS-ONBOARDING-HANDOFF.md` | agent-bounty owner response | no payout / claim / submit / daemon / webhook until explicit runtime approval | | P1 | Prometheus / Alertmanager | `k8s/monitoring/*`、`ops/alertmanager/alertmanager.yml`、`ops/monitoring/*`、`docs/security/MONITORING-ALERTING-OBSERVABILITY-INVENTORY.md` | 110 monitoring stack | repo-only 清冊、rule diff、receiver diff、reload gate、failure-only notification policy | | P1 | Grafana / SigNoz / Sentry / Langfuse | `ops/grafana/*`、`ops/signoz/*`、`ops/sentry-self-hosted/*`、`infra/langfuse/*`、`docs/security/MONITORING-ALERTING-OBSERVABILITY-INVENTORY.md` | 110 compose / public gateway | admin secret externalized、public route, backup, smoke, upgrade window | @@ -195,6 +197,7 @@ Nginx 是目前必須最先資安控管的配置,原因是它同時控制公 | owner response request / received / accepted | `0%` | Packet 只是草案;尚未送件、尚未收件、尚未 reviewer accepted | | Docker / systemd owner request draft | `100%` | 已將 9 個 host service surface 轉成 owner request draft;request sent / received / accepted 仍為 0 | | SSH / firewall / network owner request draft | `100%` | 已將 16 個 SSH / network access surface 轉成 owner request draft;request sent / received / accepted、port change、firewall change、NetworkPolicy apply、NodePort change、WireGuard change 仍為 0 | +| Backup / restore / escrow owner request draft | `100%` | 已將 38 個 backup / restore / escrow surface 轉成 owner request draft;request sent / received / accepted、backup run、restore run、offsite sync、remote delete、escrow marker write、retention change 仍為 0 | | CI blocking / workflow gate | `0%` | 本階段刻意不修改 `.gitea/workflows`,避免初期資安流程摩擦過大 | | owner-provided live Nginx file compare | `70%` | 工具可吃 owner 匯出的 live conf 檔比較;本階段不主動 SSH 取得 | | live Nginx evidence collection | `0%` | 尚未 SSH / Ansible check-mode / live hash;需 owner 與維護窗口規則 | @@ -211,7 +214,7 @@ Nginx 是目前必須最先資安控管的配置,原因是它同時控制公 5. P0:把 agent-bounty-protocol compose / MCP / A2A / treasury 高價值配置欄位接入同一個 owner packet queue;不啟用 runtime。 6. P1:向 owner 收 110 / 188 Docker Compose 與 systemd 脫敏 live hash、restart window、rollback owner 與 post-check 指標;不主動 SSH、不重啟、不跑 repair-bot。 7. P1:向 owner 收 SSH / firewall / WireGuard / NodePort 脫敏 live access state、allowed source CIDR、maintenance window、rollback owner 與 validation plan;不主動 keyscan、不改 firewall、不開關端口。 -8. P1:把 backup / restore / offsite / escrow owner response packet 接入 AwoooP 只讀狀態;驗收前 backup run、restore drill、offsite sync、remote delete、escrow marker write、retention change 全部維持 `0 / false`。 +8. P1:向 owner 收 backup / restore / offsite / escrow 非敏感 evidence id、最新備份狀態、restore drill plan、maintenance window、rollback owner 與 validation plan;驗收前 backup run、restore drill、offsite sync、remote delete、escrow marker write、retention change 全部維持 `0 / false`。 8. P1:把 Prometheus / Alertmanager / Grafana / SigNoz / Sentry / Langfuse owner response packet 接入 AwoooP 只讀狀態;驗收前 reload、receiver route change、silence change、Telegram send 與 alert chain smoke 全部維持 `0 / false`。 9. P1:補 Kali 112、111、168 維護窗口 owner 欄位,仍不做 upgrade / restart / scan。 10. P2:持續精簡 `/zh-TW/iwooos` 配置控管摘要,但不得顯示內部工作對話、token、secret 或可執行按鈕。 diff --git a/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md b/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md index f7850ca67..c58795701 100644 --- a/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md +++ b/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md @@ -397,6 +397,7 @@ headline 要再往上,需要 S4.9 / S4.10 / S4.11 / S4.12 任一 owner respons | K8s / ArgoCD Owner Request Draft | 已推送 / 已同步 | `e8de19d7` 已進 `gitea/main`;`k8s-argocd-owner-request-draft.snapshot.json` 已固定 `request_draft_count=4`、`c0_request_draft_count=3`、`request_field_count=20`、`required_owner_field_count=11`、`evidence_gap_count=8`、`blocked_action_count=13`、`request_sent_count=0`、`owner_response_received_count=0`、`runtime_gate_count=0`,並由 `security-mirror-progress-guard.py` 鎖住 request ids、blocked actions 與 false flags;AwoooP 平行 Session 已同步 | 這是人工送件前 request draft,不是 request sent、recipient confirmed、owner response received / accepted、rendered manifest diff、ArgoCD API read、ArgoCD sync、kubectl action、live cluster read、secret collection、production write 或 runtime gate;不需要 production browser smoke | | Docker / systemd / Host Service Owner Request Draft | 本地完成 | `host-service-owner-request-draft.snapshot.json` 已固定 `request_draft_count=9`、`write_capable_request_draft_count=3`、`live_evidence_required_request_count=8`、`request_field_count=22`、`required_owner_field_count=12`、`blocked_action_count=14`、`request_sent_count=0`、`owner_response_received_count=0`、`runtime_gate_count=0`,並由 `security-mirror-progress-guard.py` 鎖住 request ids、blocked actions 與 false flags | 這是 Docker Compose、systemd / repair-bot、Ansible role 與 host config backup 的人工送件前 request draft,不是 request sent、owner response received / accepted、live host read、Docker Compose action、systemctl action、repair-bot execution、Ansible apply、secret collection、host write、production write 或 runtime gate;不需要 production browser smoke | | SSH / Firewall / Network Access Owner Request Draft | 本地完成 | `ssh-network-owner-request-draft.snapshot.json` 已固定 `request_draft_count=16`、`write_capable_request_draft_count=6`、`live_evidence_required_request_count=16`、`request_field_count=23`、`required_owner_field_count=13`、`blocked_action_count=16`、`request_sent_count=0`、`owner_response_received_count=0`、`runtime_gate_count=0`,並由 `security-mirror-progress-guard.py` 鎖住 request ids、blocked actions 與 false flags | 這是 SSH target、known_hosts、CI deploy SSH、monitoring SSH、backup SSH、sudoers、NetworkPolicy、NodePort、WireGuard 與 alert SSH action 的人工送件前 request draft,不是 request sent、owner response received / accepted、live host read、host keyscan、known_hosts patch、firewall / port change、NetworkPolicy apply、NodePort change、WireGuard change、secret collection、host write、production write 或 runtime gate;不需要 production browser smoke | +| Backup / Restore / Escrow Owner Request Draft | 本地完成 | `backup-restore-owner-request-draft.snapshot.json` 已固定 `request_draft_count=38`、`write_capable_request_draft_count=27`、`live_evidence_required_request_count=38`、`request_field_count=24`、`required_owner_field_count=14`、`blocked_action_count=18`、`request_sent_count=0`、`owner_response_received_count=0`、`runtime_gate_count=0`,並由 `security-mirror-progress-guard.py` 鎖住 request ids、blocked actions 與 false flags | 這是 backup、restore、offsite、credential escrow、retention、Velero、alert / health 與 DR runbook 的人工送件前 request draft,不是 request sent、owner response received / accepted、live backup evidence、backup run、restore run、offsite sync、remote delete、escrow marker write、retention change、restic prune、rclone config、Velero restore / backup、secret collection、host write、production write 或 runtime gate;不需要 production browser smoke | | S3 approval gate | 進行中 | `security_approval_gate_v1` 已建立 8 個人工 gate items:7 pending、1 block candidate、0 approved | 不得繞過人工批准;批准後仍需 follow-up runtime gate | | S3.0 人工批准 Gate 契約 | 完成草案 | 定義批准範圍、決策選項、required reviewers、still forbidden 與 follow-up runtime gate | AwoooP 可記錄決策,不可執行 gate item | | S3.1 人工決策紀錄契約 | 完成草案 | `security_approval_decision_record_v1` 已建立;目前 0 筆 decision records、0 個 runtime action 授權 | AwoooP 可稽核決策,不可把決策當執行 | diff --git a/docs/security/backup-restore-owner-request-draft.snapshot.json b/docs/security/backup-restore-owner-request-draft.snapshot.json new file mode 100644 index 000000000..df51c90a4 --- /dev/null +++ b/docs/security/backup-restore-owner-request-draft.snapshot.json @@ -0,0 +1,4989 @@ +{ + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "execution_boundaries": { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "backup_run_authorized": false, + "credential_escrow_marker_write_authorized": false, + "host_write_authorized": false, + "kubectl_action_authorized": false, + "live_evidence_received": false, + "not_authorization": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_authorized": false, + "owner_response_accepted": false, + "owner_response_received": false, + "rclone_config_authorized": false, + "recipient_confirmed": false, + "request_sent": false, + "restic_prune_authorized": false, + "restore_drill_authorized": false, + "restore_run_authorized": false, + "retention_change_authorized": false, + "runtime_execution_authorized": false, + "secret_value_collection_allowed": false, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false + }, + "generated_at": "2026-06-14T23:05:00+08:00", + "git_commit": "688ba121", + "next_steps": [ + "人工送件前確認 backup / restore / offsite / credential escrow owner role 與回覆窗口。", + "owner 只能提供非敏感 evidence id、最新備份狀態、restore drill plan、maintenance window、rollback owner 與 validation plan。", + "收到回覆後先做欄位完整性、敏感 payload 隔離、restore / offsite / retention gate 檢查,不得直接執行 backup、restore、sync、prune 或 marker write。" + ], + "request_drafts": [ + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "gitea", + "momo", + "harbor", + "awoooi", + "langfuse", + "monitoring", + "signoz", + "open-webui", + "clawbot" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "backup_orchestrator", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "110_backup_host_all_services", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "全服務備份總控", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "33f6070bd3733fc59e7b661de44587b7d6a336500765667405e11fbffe2f4489", + "repo_source_path": "scripts/backup/backup-all.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_all_orchestrator", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 126, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_all_orchestrator", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "RESTIC_PASSWORD_FILE", + "B2 metadata", + "KEEP_DAILY=30", + "KEEP_WEEKLY=12", + "KEEP_MONTHLY=24" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "backup_common_policy", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "restic_password_b2_retention_common", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Restic 共用設定與 GFS retention", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "00139e1eac8998b1e0cb09d7692882267d8cc72a6c57c04a732e155932ad22d1", + "repo_source_path": "scripts/backup/common.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_common_restic_retention", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 147, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_common_restic_retention", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": false + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "Gitea DB", + "repositories", + "app.ini redaction boundary" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "service_backup_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "gitea_database_and_repositories", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Gitea 備份腳本", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "8ec9f0e5aee51381a799da83798fea4ca92d0c1686e40aef9f6ba8485003a990", + "repo_source_path": "scripts/backup/backup-gitea.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_gitea_service_script", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 68, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_gitea_service_script", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "MOMO PostgreSQL", + "188 database path" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "service_backup_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "momo_postgresql", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "MOMO PostgreSQL 備份腳本", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "7cffdc570cd4b33a42b3604382eccc14a5388ed0a2fb67c9927312982c29a6cd", + "repo_source_path": "scripts/backup/backup-momo.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_momo_service_script", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 84, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_momo_service_script", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "Harbor registry", + "Harbor DB", + "image registry recovery" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "service_backup_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "harbor_registry_and_database", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Harbor 備份腳本", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "f42af4c7b66ceb19b504873bdf1ca76d306d6c775bbd8d5d6648249db6756595", + "repo_source_path": "scripts/backup/backup-harbor.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_harbor_service_script", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 77, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_harbor_service_script", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "awoooi_prod", + "awoooi_dev", + "k3s datastore" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "service_backup_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "awoooi_postgresql_and_k3s_datastore", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "AWOOOI PostgreSQL 完整備份腳本", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "90eaed60f8ef4994bb082bd7f2e7c5b5ec8872270f8a014b72298de0ec34f658", + "repo_source_path": "scripts/backup/backup-awoooi.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_awoooi_service_script", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 123, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_awoooi_service_script", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "awoooi_prod", + "6h RPO", + "latest-only interaction" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "service_backup_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "awoooi_postgresql_high_frequency", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "AWOOOI PostgreSQL 高頻備份腳本", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "171de6e757dbb7e4ee0d88b8d1cbc9471e288e58b189098b77cac14392461a39", + "repo_source_path": "scripts/backup/backup-awoooi-frequent.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_awoooi_frequent_script", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 76, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_awoooi_frequent_script", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "Langfuse DB", + "AI trace evidence" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "service_backup_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "langfuse_ai_trace_database", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Langfuse 備份腳本", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "a60cea2e366be228e35492a87edc084261d1888591ca583083f4b909ba995cd9", + "repo_source_path": "scripts/backup/backup-langfuse.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_langfuse_service_script", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 69, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_langfuse_service_script", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "Prometheus", + "Grafana", + "Alertmanager" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "service_backup_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "prometheus_grafana_alertmanager", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Monitoring 備份腳本", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "e848315116b87ce250db6e1483d8e517e2c4c07ca1fc6e119ae8f80ad58d6183", + "repo_source_path": "scripts/backup/backup-monitoring.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_monitoring_service_script", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 109, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_monitoring_service_script", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "SigNoz ClickHouse", + "SigNoz SQLite" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "service_backup_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "signoz_clickhouse_and_sqlite", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "SigNoz 備份腳本", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "f3d9011b57815087ce0084525902693078c2785c25632d49c7a7a92e6a49bcf7", + "repo_source_path": "scripts/backup/backup-signoz.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_signoz_service_script", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 103, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_signoz_service_script", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "Open-WebUI volume", + "LLM conversation data" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "service_backup_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "open_webui_volume", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Open-WebUI 備份腳本", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "ab9fb4664799ef424cc9c3565592d9b6704df90bafda1f163e5cbfe01ff6056d", + "repo_source_path": "scripts/backup/backup-open-webui.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_open_webui_service_script", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 70, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_open_webui_service_script", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "ClawBot Redis", + "agent state cache" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "service_backup_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "clawbot_redis_state", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "ClawBot Redis 備份腳本", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "9ad2367d42ca2ce679ce7c24ca2dabcdc9feccde668f4008a5a797165a2f4888", + "repo_source_path": "scripts/backup/backup-clawbot.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_clawbot_service_script", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 75, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_clawbot_service_script", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "Sentry", + "ClickHouse / Postgres / Redis dependency boundary" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "service_backup_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "sentry_self_hosted", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Sentry 備份腳本", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "bbd09420a7814d6dfa2b8caade264e00c982b0b10fb9b57866893d02ef5eed44", + "repo_source_path": "scripts/backup/backup-sentry.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_sentry_service_script", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 277, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_sentry_service_script", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "AI artifacts", + "model / evaluation outputs" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "service_backup_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "ai_artifacts", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "AI artifacts 備份腳本", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "9dfbd45fcca516c75c06b062c79245397e2c0cf6db547472f1a5e48ee55f772b", + "repo_source_path": "scripts/backup/backup-ai-artifacts.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_ai_artifacts_script", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 129, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_ai_artifacts_script", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "public routes", + "Nginx route reconstruction", + "frontend/API smoke evidence" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "service_backup_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "public_route_reconstruction", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Public routes 備份腳本", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "828c87b8c9eed4dcb9a4dd55d36905636f74c890e1625792a2f14bfd53c7973c", + "repo_source_path": "scripts/backup/backup-public-routes.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_public_routes_script", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 182, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_public_routes_script", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "systemd", + "docker", + "nginx", + "cron", + "k8s", + "host configs" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "config_backup_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "110_188_120_121_cluster_configs", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Host / service / K8s 設定備份", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "d24301cff44e464bd19ce0792362be16916ccde8c92f92351a19ef4ee988f15e", + "repo_source_path": "scripts/backup/backup-configs.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:config_backup_capture", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 359, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "config_backup_capture", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "freshness", + "failure", + "integrity", + "restore drill", + "offsite", + "escrow" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "backup_status_reporter", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "110_188_backup_status_summary", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "備份狀態彙整腳本", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "ae7d18d120f4441747d8ecce763e55bca235f923c01e0dac9b566b2d00f9bf0c", + "repo_source_path": "scripts/backup/backup-status.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_status_reporter", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 342, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_status_reporter", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": false + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "restic check", + "read-data subset", + "integrity evidence" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "integrity_check_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "restic_integrity_check", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Restic integrity check", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "c2906ac4a7251419decf852eaeb7c1ead5eecd4f705804dfc556f23029e45ebc", + "repo_source_path": "scripts/backup/check-backup-integrity.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_integrity_check", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 238, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_integrity_check", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": false + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "keep latest", + "local delete", + "retention marker" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "retention_enforcer", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "latest_only_retention", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Latest-only retention enforcer", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "b8ca6363c8d08866fd9cbcb6b47dfa310ffada588323ab48c48babf9b301b129", + "repo_source_path": "scripts/backup/enforce-latest-only-retention.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:latest_only_retention_enforcer", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 42, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "latest_only_retention_enforcer", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "13 repos", + "rclone sync", + "remote delete", + "success markers" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "offsite_sync_controller", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "google_drive_rclone_offsite_mirror", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Offsite rclone sync controller", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "6b669b1fbf74d7b0f2b38f530d6c345e69c8eca5257ad2782751a1230091c839", + "repo_source_path": "scripts/backup/sync-offsite-backups.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:offsite_sync_controller", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 414, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "offsite_sync_controller", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "remote repo count", + "latest-only evidence", + "textfile metrics" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "offsite_verifier", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "offsite_full_sync_verification", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Offsite full sync verifier", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "1614f6d73d65f9f68f8991ee5d198de66933fc35be8ab1ae1ad5aba3c4fdad31", + "repo_source_path": "scripts/backup/verify-offsite-full-sync.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:offsite_full_sync_verifier", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 296, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "offsite_full_sync_verifier", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "status", + "dry-run-small", + "pre-full-sync", + "escrow markers" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "offsite_readiness_gate", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "offsite_preflight_and_escrow_gate", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Offsite readiness gate", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "6e0cdb57dc8ea80097d1dd4bb6c87c39c13f2a2892b767c0c251eca524e33e19", + "repo_source_path": "scripts/backup/backup-offsite-readiness-gate.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:offsite_readiness_gate", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 436, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "offsite_readiness_gate", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": false + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "script presence", + "offsite marker", + "escrow marker", + "redacted output" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "offsite_escrow_report", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "offsite_escrow_redacted_report", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Offsite / escrow evidence report", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "09e07c94fd192dc9015a468eb376a4eeba09e3392586a9a2a178b1f7b58c9c50", + "repo_source_path": "scripts/backup/offsite-escrow-evidence-report.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:offsite_escrow_evidence_report", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 262, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "offsite_escrow_evidence_report", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": false + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "restic password", + "offsite provider", + "break-glass admin", + "DNS recovery", + "OAuth / AI provider recovery" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "credential_escrow_marker", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "credential_escrow_markers", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Credential escrow marker writer", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "ebb0ffd77dced76ff58855a637e7e35e0ffa0fa9f5f33490c00015d91f0ce947", + "repo_source_path": "scripts/backup/mark-credential-escrow-verified.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:credential_escrow_marker", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 228, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "credential_escrow_marker", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "rclone remote", + "Google Drive", + "offsite.env metadata" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "offsite_rclone_config", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "rclone_config_metadata", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "rclone offsite config helper", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "b8881508ad82201ed4b706c5ea05250d46e907d23f097f9019fcab387c4623da", + "repo_source_path": "scripts/backup/configure-offsite-rclone.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:offsite_rclone_config", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 251, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "offsite_rclone_config", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "Backblaze B2 metadata", + "offsite env", + "fallback provider" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "offsite_b2_config", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "b2_config_metadata", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "B2 offsite config helper", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "b3f847158bc48791e75ccb4a8430f3c88797f83f384c0f03d80c28f3037a170e", + "repo_source_path": "scripts/backup/configure-offsite-b2.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:offsite_b2_config", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 154, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "offsite_b2_config", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "freshness metrics", + "restore drill metrics", + "offsite metrics", + "escrow metrics" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "backup_health_exporter", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "backup_health_prometheus_textfile", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Backup health textfile exporter", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "cc4a0b89321679e4c39c8d3ba85b7308eb0d1f800c82895dcb71741a9dceaddc", + "repo_source_path": "scripts/ops/backup-health-textfile-exporter.py", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_health_textfile_exporter", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 926, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_health_textfile_exporter", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "Velero restore dry-run", + "weekly schedule", + "textfile metrics" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "velero_restore_cronjob", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "velero_weekly_restore_dry_run", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Velero restore dry-run CronJob", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "356ab2223d0fc2e1b4d7e4e1163ef23bed62e1c22588c46ffd010d090359557b", + "repo_source_path": "k8s/awoooi-prod/16-cronjob-backup-restore-test.yaml", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:velero_restore_test_cronjob", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 76, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "velero_restore_test_cronjob", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "restore dry-run script", + "13-digit textfile timestamp risk", + "Prometheus textfile" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "velero_restore_script_configmap", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "velero_restore_script_configmap", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Velero restore script ConfigMap", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "c3e4605372a9f5c5f94713e1f8b5d8d0dccd6886c76c43522053e1468521bc1d", + "repo_source_path": "k8s/awoooi-prod/17-configmap-backup-restore-scripts.yaml", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:velero_restore_test_script_configmap", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 49, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "velero_restore_test_script_configmap", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "restore dry-run", + "Prometheus textfile seconds timestamp", + "failure metric" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "velero_restore_standalone_script", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "velero_standalone_restore_script", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Velero restore dry-run standalone script", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "960cd740d6107c7f70b09dd8ff4c934af76d82921b066ba92c6fac2af7d55622", + "repo_source_path": "scripts/cron_backup_restore_test.sh", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:velero_standalone_restore_test_script", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 62, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "velero_standalone_restore_test_script", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "MinIO credential names", + "placeholder values", + "External Secrets / Sealed Secrets recommendation" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "velero_credentials_manifest", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "velero_minio_credentials_metadata", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Velero MinIO credential manifest", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "54d829a3204c2fa2d1bb3c8be1bf250914dd7a517d13900bee0fa9878760c930", + "repo_source_path": "k8s/velero/01-credentials.yaml", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:velero_credentials_manifest", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 14, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "velero_credentials_manifest", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "Velero Deployment", + "cluster-admin binding", + "MinIO s3Url", + "backup storage location" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "velero_install_manifest", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "velero_install_and_minio_storage", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Velero install manifest", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "60d7ea59ef8b2ad38dc8bf6bca80be35609e8d317210c44204bdd5ad9901b47a", + "repo_source_path": "k8s/velero/02-velero-install.yaml", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:velero_install_manifest", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 117, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "velero_install_manifest", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": true + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "BackupRestoreTestFailed", + "Velero freshness", + "offsite freshness", + "restore stale" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "backup_restore_alert_rules", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "backup_restore_prometheus_alerts", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Backup / restore alert rules", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "94d439a2ea599995601a5022dc0a001cc09f405964cd1308b103f86e2af14e90", + "repo_source_path": "ops/monitoring/alerts.yml", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_restore_alert_rules", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 1355, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_restore_alert_rules", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": false + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "readiness matrix", + "blocked targets", + "restore drill status" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "dr_readiness_contract", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "backup_dr_readiness_contract", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Backup / DR readiness matrix", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "6d116173b5842bd8813e4a9815cb7a70be1677b44abd01b0dfa26bbd9bf2d7fd", + "repo_source_path": "docs/evaluations/backup_dr_readiness_matrix_2026-06-04.json", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_dr_readiness_contract", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 321, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_dr_readiness_contract", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": false + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "database restore", + "configuration restore", + "credential escrow", + "K8s restore", + "observability restore" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "restore_drill_approval_template", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "restore_drill_approval_template", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Restore drill approval package template", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "321a6007ba205d6342e4bf2171aff997ea305c7b0a72acc6b32e1258d62656fc", + "repo_source_path": "docs/evaluations/backup_restore_drill_approval_package_template_2026-06-05.json", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_restore_drill_approval_template", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 510, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_restore_drill_approval_template", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": false + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "offsite_rclone_full_sync", + "credential_escrow_markers", + "velero_k8s_resources" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "offsite_escrow_readiness_contract", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "offsite_escrow_readiness_contract", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Offsite / escrow readiness status", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "7f7ac8e378d9d3d07d41b7a5ac45991ed67e9115d4a24cbc1da2aa9d392aea94", + "repo_source_path": "docs/evaluations/offsite_escrow_readiness_status_2026-06-05.json", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:offsite_escrow_readiness_contract", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 163, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "offsite_escrow_readiness_contract", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": false + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "110 backup center", + "latest-only", + "Google Drive / rclone", + "credential escrow", + "120 blocker" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "backup_status_runbook", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "backup_status_runbook", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Backup status runbook", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "282fc9cac91236225005399cf668609eb142c52ab48a9b1aebe3d7e0a4572462", + "repo_source_path": "docs/runbooks/BACKUP-STATUS.md", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:backup_status_runbook", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 160, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "backup_status_runbook", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": false + }, + { + "action_buttons_allowed": false, + "active_scan_authorized": false, + "affected_scope": "pending_affected_scope", + "backup_run_authorized": false, + "backup_scope": [ + "cold start", + "backup-all", + "sync-offsite", + "restore guard", + "schedules" + ], + "blocked_actions": [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open" + ], + "config_kind": "cold_start_sop", + "control_tier": "C0", + "credential_escrow_accepted": false, + "credential_escrow_evidence_ref": null, + "credential_escrow_marker_write_authorized": false, + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "expected_scope": "cold_start_backup_restore_recovery", + "followup_owner": "pending_followup_owner", + "host_write_authorized": false, + "kubectl_action_authorized": false, + "label": "Full-stack cold-start SOP", + "latest_backup_status_ref": null, + "live_evidence_received": false, + "maintenance_window": "pending_maintenance_window", + "maintenance_window_accepted": false, + "not_approval": true, + "offsite_remote_delete_authorized": false, + "offsite_sync_accepted": false, + "offsite_sync_authorized": false, + "offsite_sync_evidence_ref": null, + "owner_response_accepted": false, + "owner_response_received": false, + "owner_role_or_team": "pending_owner_role_or_team", + "rclone_config_authorized": false, + "recipient_confirmed": false, + "redacted_evidence_refs": [], + "repo_sha256": "82d52e414876c46fe37dbe0e4447ebf1b26011d6bde2bfadb07978f09715ea94", + "repo_source_path": "docs/runbooks/FULL-STACK-COLD-START-SOP.md", + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "request_id": "backup_restore_owner_request:cold_start_sop", + "request_sent": false, + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "requires_live_evidence": true, + "restic_prune_authorized": false, + "restore_drill_accepted": false, + "restore_drill_plan": "pending_restore_drill_plan", + "restore_run_authorized": false, + "retention_change_accepted": false, + "retention_change_authorized": false, + "retention_owner": "pending_retention_owner", + "rollback_owner": "pending_rollback_owner", + "rollback_owner_accepted": false, + "runtime_gate": false, + "secret_value_collection_allowed": false, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "source_line_count": 704, + "ssh_read_authorized": false, + "ssh_write_authorized": false, + "status": "draft_not_dispatched", + "surface_id": "cold_start_sop", + "validation_plan": "pending_validation_plan", + "validation_plan_accepted": false, + "velero_backup_authorized": false, + "velero_restore_authorized": false, + "write_capable_surface": false + } + ], + "request_fields": [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval" + ], + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner" + ], + "schema_version": "backup_restore_owner_request_draft_v1", + "source_inventory_schema_version": "backup_restore_escrow_inventory_v1", + "source_inventory_status": "repo_only_inventory_ready", + "status": "owner_request_draft_ready_not_dispatched", + "summary": { + "action_button_count": 0, + "active_scan_authorized_count": 0, + "backup_run_authorized_count": 0, + "blocked_action_count": 18, + "credential_escrow_accepted_count": 0, + "credential_escrow_marker_write_authorized_count": 0, + "host_write_authorized_count": 0, + "kubectl_action_authorized_count": 0, + "live_evidence_received_count": 0, + "live_evidence_required_request_count": 38, + "maintenance_window_accepted_count": 0, + "offsite_remote_delete_authorized_count": 0, + "offsite_sync_accepted_count": 0, + "offsite_sync_authorized_count": 0, + "owner_response_accepted_count": 0, + "owner_response_received_count": 0, + "rclone_config_authorized_count": 0, + "recipient_confirmed_count": 0, + "request_draft_count": 38, + "request_field_count": 24, + "request_sent_count": 0, + "required_owner_field_count": 14, + "restic_prune_authorized_count": 0, + "restore_drill_accepted_count": 0, + "restore_run_authorized_count": 0, + "retention_change_accepted_count": 0, + "retention_change_authorized_count": 0, + "rollback_owner_accepted_count": 0, + "runtime_gate_count": 0, + "secret_value_collection_allowed_count": 0, + "ssh_read_authorized_count": 0, + "ssh_write_authorized_count": 0, + "validation_plan_accepted_count": 0, + "velero_backup_authorized_count": 0, + "velero_restore_authorized_count": 0, + "write_capable_request_draft_count": 27 + } +} diff --git a/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md b/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md index 283b4be29..c63df3625 100644 --- a/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md +++ b/docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md @@ -697,6 +697,7 @@ Alert / Sentry / SigNoz / Gitea / Market Watch / Operator | `docs/security/k8s-argocd-owner-request-draft.snapshot.json` + `scripts/security/k8s-argocd-owner-request-draft.py` | K8s / ArgoCD Owner Request Draft 已本地完成;承接 manifest repo-only 清冊,固定 4 份 request draft、3 份 C0、1 份 C1、20 欄 request fields、11 欄 required owner fields、8 個 evidence gaps 與 13 類 blocked action;request sent、recipient confirmed、owner response received / accepted、rendered manifest diff、ArgoCD health readback、ArgoCD sync、kubectl action、live cluster read、runtime gate、action buttons 仍全部為 `0` | 這是人工送件前 request draft,不是 request sent、owner response received / accepted、ArgoCD API read、ArgoCD sync、kubectl action、live cluster read、secret collection、production write 或 runtime gate | | `docs/security/host-service-owner-request-draft.snapshot.json` + `scripts/security/host-service-owner-request-draft.py` | Docker / systemd / Host Service Owner Request Draft 已本地完成;承接 host-service repo-only 清冊,固定 9 份 request draft、3 份 write-capable request draft、8 份需 live evidence request、22 欄 request fields、12 欄 required owner fields 與 14 類 blocked action;request sent、recipient confirmed、owner response received / accepted、live evidence、restart window、rollback owner、host write、runtime gate、action buttons 仍全部為 `0` | 這是人工送件前 request draft,不是 request sent、owner response received / accepted、live host read、Docker Compose action、systemctl action、repair-bot execution、Ansible apply、secret collection、host write、production write 或 runtime gate | | `docs/security/ssh-network-owner-request-draft.snapshot.json` + `scripts/security/ssh-network-owner-request-draft.py` | SSH / Firewall / Network Access Owner Request Draft 已本地完成;承接 SSH / network repo-only 清冊,固定 16 份 request draft、6 份 write-capable request draft、16 份需 live evidence request、23 欄 request fields、13 欄 required owner fields 與 16 類 blocked action;request sent、recipient confirmed、owner response received / accepted、live access state、firewall / port change、NetworkPolicy apply、NodePort change、WireGuard change、host write、runtime gate、action buttons 仍全部為 `0` | 這是人工送件前 request draft,不是 request sent、owner response received / accepted、live host read、host keyscan、known_hosts patch、firewall / port change、NetworkPolicy apply、NodePort change、WireGuard change、secret collection、host write、production write 或 runtime gate | +| `docs/security/backup-restore-owner-request-draft.snapshot.json` + `scripts/security/backup-restore-owner-request-draft.py` | Backup / Restore / Escrow Owner Request Draft 已本地完成;承接 backup / restore repo-only 清冊,固定 38 份 request draft、27 份 write-capable request draft、38 份需 live evidence request、24 欄 request fields、14 欄 required owner fields 與 18 類 blocked action;request sent、recipient confirmed、owner response received / accepted、live backup evidence、backup run、restore run、offsite sync、escrow marker write、retention change、runtime gate、action buttons 仍全部為 `0` | 這是人工送件前 request draft,不是 request sent、owner response received / accepted、backup run、restore run、offsite sync、remote delete、credential escrow marker write、retention change、restic prune、rclone config、Velero restore / backup、secret collection、host write、production write 或 runtime gate | | `docs/evaluations/ai_agent_live_read_model_gate_2026-06-11.json` + `GET /api/v1/agents/agent-live-read-model-gate` | P2-403B AgentSession / Redis Streams live read model gate;定義 safe fields、Redis envelope、worker gate、rollback plan 與 no-write smoke,不連 DB、不讀寫 Redis、不啟動 worker | #### 3.2.1c 2026-06-11 AI Agent 主動營運委派與版本生命週期契約 @@ -845,6 +846,7 @@ Repo / registry / release notes / K8s / host / observability / backup evidence 78. 建立 K8s / ArgoCD Owner Request Draft。✅ 本地完成;新增 `k8s-argocd-owner-request-draft.py`、snapshot 與說明文件,將四個 scan group 轉成 `request_draft_count=4`、`c0_request_draft_count=3`、`c1_request_draft_count=1`、`request_field_count=20`、`required_owner_field_count=11`、`evidence_gap_count=8`、`blocked_action_count=13` 的人工送件前草稿;request sent、recipient confirmed、owner response received / accepted、rendered manifest diff、ArgoCD health readback、ArgoCD sync、kubectl action、live cluster read、secret collection、runtime gate、action buttons 仍全部為 `0`。這不是 request sent、owner response received / accepted、ArgoCD API read、ArgoCD sync、kubectl action、live cluster read、secret collection、production write 或 runtime gate。 79. 建立 Docker / systemd / Host Service Owner Request Draft。✅ 本地完成;新增 `host-service-owner-request-draft.py`、snapshot 與說明文件,將 9 個 host service surface 轉成 `request_draft_count=9`、`write_capable_request_draft_count=3`、`live_evidence_required_request_count=8`、`request_field_count=22`、`required_owner_field_count=12`、`blocked_action_count=14` 的人工送件前草稿;request sent、recipient confirmed、owner response received / accepted、live evidence、restart window、rollback owner、post-check、host write、Docker Compose action、systemctl action、repair-bot execution、Ansible apply、secret collection、runtime gate、action buttons 仍全部為 `0`。這不是 request sent、owner response received / accepted、live host read、Docker Compose action、systemctl action、repair-bot execution、Ansible apply、secret collection、host write、production write 或 runtime gate。 80. 建立 SSH / Firewall / Network Access Owner Request Draft。✅ 本地完成;新增 `ssh-network-owner-request-draft.py`、snapshot 與說明文件,將 16 個 SSH / network access surface 轉成 `request_draft_count=16`、`write_capable_request_draft_count=6`、`live_evidence_required_request_count=16`、`request_field_count=23`、`required_owner_field_count=13`、`blocked_action_count=16` 的人工送件前草稿;request sent、recipient confirmed、owner response received / accepted、live access state、host keyscan、known_hosts patch、firewall / port change、NetworkPolicy apply、NodePort change、WireGuard change、secret collection、host write、runtime gate、action buttons 仍全部為 `0`。這不是 request sent、owner response received / accepted、live host read、host keyscan、known_hosts patch、firewall / port change、NetworkPolicy apply、NodePort change、WireGuard change、secret collection、host write、production write 或 runtime gate。 +81. 建立 Backup / Restore / Escrow Owner Request Draft。✅ 本地完成;新增 `backup-restore-owner-request-draft.py`、snapshot 與說明文件,將 38 個 backup / restore / escrow surface 轉成 `request_draft_count=38`、`write_capable_request_draft_count=27`、`live_evidence_required_request_count=38`、`request_field_count=24`、`required_owner_field_count=14`、`blocked_action_count=18` 的人工送件前草稿;request sent、recipient confirmed、owner response received / accepted、live backup evidence、backup run、restore run、offsite sync、remote delete、credential escrow marker write、retention change、secret collection、host write、runtime gate、action buttons 仍全部為 `0`。這不是 request sent、owner response received / accepted、backup run、restore run、offsite sync、remote delete、credential escrow marker write、retention change、restic prune、rclone config、Velero restore / backup、secret collection、host write、production write 或 runtime gate。 #### 3.2.1d 2026-06-11 Agent 互動、學習與成長證據面 diff --git a/docs/workplans/2026-06-04-iwooos-security-governance-p0.md b/docs/workplans/2026-06-04-iwooos-security-governance-p0.md index adbed17ec..4e736cb3c 100644 --- a/docs/workplans/2026-06-04-iwooos-security-governance-p0.md +++ b/docs/workplans/2026-06-04-iwooos-security-governance-p0.md @@ -24,6 +24,7 @@ | 最新 P0 Public Gateway / DNS TLS / K8s 配置控管基準 | P0-15 `5068654d` live conf 匯出請求包、P0-16 `f856df1c` redacted export 收件預檢、P0-17 `762f73a6` rendered diff / nginx gate 草稿、P0-19 `551d8144` DNS / TLS / certbot owner confirmation request 草稿、P0-20 `e8876c45` K8s / ArgoCD manifest repo-only 清冊、P0-21 `e8de19d7` K8s / ArgoCD owner request draft;Public Gateway 三段固定 requests / candidates `3`、C0 `2`,DNS / TLS 固定 owner confirmation requests `4`、C0 `4`,K8s manifest 固定 files `49`、C0 `36`、YAML `45`、kinds `20`,K8s owner request 固定 drafts `4`、C0 `3`;request sent、owner response received / accepted、redacted export received / accepted、raw conf stored、rendered diff ready、`nginx -t`、reload、DNS query、TLS probe、certbot renew、ArgoCD sync、kubectl action、route smoke、runtime gate、action button 全部 `0` | | 最新 P1 Docker / systemd / Host Service 配置控管基準 | repo-only inventory 已固定 `surface=9`、`write_capable=3`、`live_evidence_required=8`、成熟度 `42% -> 50%`;本輪新增 owner request draft,固定 `drafts=9`、`owner_fields=12`、`blocked_actions=14`、request sent / received / accepted / live evidence / restart window / rollback owner / host write / runtime gate 全部 `0` | | 最新 P1 SSH / Firewall / Network Access 配置控管基準 | repo-only inventory 已固定 `surface=16`、`write_capable=6`、`live_evidence_required=16`、成熟度 `48% -> 54%`;本輪新增 owner request draft,固定 `drafts=16`、`owner_fields=13`、`blocked_actions=16`、request sent / received / accepted / live access state / firewall / port change / NetworkPolicy / NodePort / WireGuard / host write / runtime gate 全部 `0` | +| 最新 P1 Backup / Restore / Escrow 配置控管基準 | repo-only inventory 已固定 `surface=38`、`write_capable=27`、`live_evidence_required=38`、成熟度 `52% -> 58%`;本輪新增 owner request draft,固定 `drafts=38`、`owner_fields=14`、`blocked_actions=18`、request sent / received / accepted / backup run / restore run / offsite sync / remote delete / escrow marker / retention change / runtime gate 全部 `0` | | 最新 AI Agent automation P1-305 / P1-306 基準 | code `4f0787f8`、deploy marker `af3a9d48`、CD `2592`、code-review `2593`;任務批准邊界與進度彙總已正式驗證;backlog `70%`、done `16/23`、下一步 `P1-001` | | 最新 AI Agent automation P1-001 基準 | code `de3007b7`、stability fix `fd33591c`、deploy marker `8caba233`、LOGBOOK / marker 對齊 `37c0e171`;runtime surface `22`、Secret surface `4`、live gaps `6`、backlog `74%`、done `17/23`、下一步 `P1-002` | | 最新 AI Agent automation P1-002 基準 | code `943faaee`、stability fix `ff266926`、deploy marker `01b8712d`、LOGBOOK / marker 對齊 `70c01003`;Gitea workflows `9`、runner contracts `4`、需 runner attestation workflows `8`、backlog `78%`、done `18/23`、下一步 `P1-003` | @@ -228,6 +229,7 @@ S4.9 是目前 IwoooS 64% 能往前的第一優先 gate。驗收前所有 count | P1 | GitHub primary readiness 只讀重盤 | repo visibility、refs、tags、workflow、secret name、runner、rollback ADR | 只讀 inventory;不建立 repo、不同步 refs | | P1 | Docker / systemd / Host Service owner request draft | 9 個 repo-only surface 已轉成人工送件前草稿,涵蓋 110 / 188 Docker Compose、repair-bot、Ansible role 與 host config backup capture | request sent、owner response、live hash、restart、repair-bot、Ansible apply、host write、runtime gate 全部維持 0 / false | | P1 | SSH / Firewall / Network Access owner request draft | 16 個 repo-only surface 已轉成人工送件前草稿,涵蓋 SSH target、known_hosts、CI deploy SSH、sudoers、NetworkPolicy、NodePort、WireGuard 與 alert SSH action | request sent、owner response、live access state、keyscan、known_hosts patch、firewall / port change、NetworkPolicy apply、NodePort change、WireGuard change 全部維持 0 / false | +| P1 | Backup / Restore / Escrow owner request draft | 38 個 repo-only surface 已轉成人工送件前草稿,涵蓋 backup、restore、offsite、credential escrow、retention、Velero、alert / health 與 DR runbook | request sent、owner response、backup run、restore run、offsite sync、remote delete、escrow marker write、retention change 全部維持 0 / false | | P1 | Kali 112 維護窗口草案 | 1994 pending updates、`networking.service` failed、服務硬化 0/4、rollback、post-check | P1-7 草案已完成;不 `apt upgrade`、不 restart | | P1 | 111 / 168 主機 scope 補強 | P1-8 已補 `DEV-HOSTS-111-168-SCOPE-HANDOFF.md`、snapshot 與 schema;scope、maintenance window、credential handling、rollback owner、validation 指標已可交接 | observe-only;不 credentialed scan、不改 route / CORS / firewall / service | | P1 | VibeWork 納入 IwoooS | P1-9 已補 `VIBEWORK-IWOOOS-ONBOARDING-HANDOFF.md`、snapshot 與 schema;repo、product、surface、owner、evidence refs、資料分級、部署邊界與獨立產品邊界已可交接 | 繁中 docs/specs;不合併產品責任、不部署、不改 refs | @@ -300,6 +302,7 @@ P1 只讀重盤階段整體完成度:`70%`。它代表 freshness / inventory / | P1-9 | VibeWork 納入 IwoooS | 已補 `VIBEWORK-IWOOOS-ONBOARDING-HANDOFF.md`、`vibework-iwooos-onboarding-handoff.snapshot.json`、`vibework_iwooos_onboarding_handoff_v1.schema.json`;repo / product / surface / owner / evidence refs / 資料分級 / 部署邊界 / 獨立產品邊界已拆成 handoff | onboarding handoff `100%`;runtime / deploy / repo mutation `0 / false`;docs/specs 繁中,產品責任不合併 | | P1-10 | Docker / systemd / Host Service owner request draft | 已新增 `HOST-SERVICE-OWNER-REQUEST-DRAFT.md`、`host-service-owner-request-draft.snapshot.json` 與產生器;9 個 surface、3 個 write-capable、8 個需 live evidence、12 個 owner 必填欄位、14 類 blocked action | 草稿 artifact `100%`;request sent / received / accepted、live evidence、restart window、rollback owner、host write、runtime gate 仍全部 `0 / false` | | P1-11 | SSH / Firewall / Network Access owner request draft | 已新增 `SSH-NETWORK-OWNER-REQUEST-DRAFT.md`、`ssh-network-owner-request-draft.snapshot.json` 與產生器;16 個 surface、6 個 write-capable、16 個需 live evidence、13 個 owner 必填欄位、16 類 blocked action | 草稿 artifact `100%`;request sent / received / accepted、live access state、keyscan、known_hosts patch、firewall / port change、NetworkPolicy / NodePort / WireGuard 變更、host write、runtime gate 仍全部 `0 / false` | +| P1-12 | Backup / Restore / Escrow owner request draft | 已新增 `BACKUP-RESTORE-OWNER-REQUEST-DRAFT.md`、`backup-restore-owner-request-draft.snapshot.json` 與產生器;38 個 surface、27 個 write-capable、38 個需 live evidence、14 個 owner 必填欄位、18 類 blocked action | 草稿 artifact `100%`;request sent / received / accepted、backup run、restore run、offsite sync、remote delete、escrow marker write、retention change、runtime gate 仍全部 `0 / false` | ## 7. 2026-06-04 本輪驗證紀錄 diff --git a/scripts/security/backup-restore-owner-request-draft.py b/scripts/security/backup-restore-owner-request-draft.py new file mode 100644 index 000000000..e18b1bc92 --- /dev/null +++ b/scripts/security/backup-restore-owner-request-draft.py @@ -0,0 +1,305 @@ +#!/usr/bin/env python3 +""" +IwoooS Backup / Restore / Escrow owner request draft 產生器。 + +本工具讀取 backup-restore-escrow repo-only 清冊,將 38 個 surface 轉成人工 +送件前 request draft。它不執行 backup、不 restore、不 rclone sync、不 +寫 escrow marker、不 restic prune、不 kubectl、不 SSH、不收 secret value。 +""" + +from __future__ import annotations + +import argparse +import json +import subprocess +import sys +from datetime import datetime, timedelta, timezone +from pathlib import Path +from typing import Any + + +TAIPEI = timezone(timedelta(hours=8)) + +REQUEST_FIELDS = [ + "request_id", + "surface_id", + "label", + "expected_scope", + "config_kind", + "backup_scope", + "control_tier", + "repo_source_path", + "repo_sha256", + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", + "not_approval", +] + +REQUIRED_OWNER_FIELDS = [ + "owner_role_or_team", + "decision", + "decision_reason", + "affected_scope", + "redacted_evidence_refs", + "latest_backup_status_ref", + "restore_drill_plan", + "offsite_sync_evidence_ref", + "credential_escrow_evidence_ref", + "maintenance_window", + "rollback_owner", + "validation_plan", + "retention_owner", + "followup_owner", +] + +BLOCKED_ACTIONS = [ + "backup_run", + "restore_run", + "restore_drill", + "offsite_sync", + "offsite_remote_delete", + "credential_escrow_marker_write", + "retention_change", + "restic_prune", + "rclone_config", + "velero_restore", + "velero_backup", + "kubectl_action", + "ssh_read", + "ssh_write", + "secret_value_collection", + "host_write", + "active_scan", + "runtime_gate_open", +] + + +def git_short_sha(root: Path) -> str: + try: + result = subprocess.run( + ["git", "rev-parse", "--short", "HEAD"], + cwd=root, + check=True, + capture_output=True, + text=True, + ) + return result.stdout.strip() + except Exception: + return "unknown" + + +def load_json(path: Path) -> dict[str, Any]: + return json.loads(path.read_text(encoding="utf-8")) + + +def request_for(surface: dict[str, Any], write_capable_ids: set[str]) -> dict[str, Any]: + surface_id = surface["surface_id"] + write_capable = surface_id in write_capable_ids + return { + "request_id": f"backup_restore_owner_request:{surface_id}", + "status": "draft_not_dispatched", + "surface_id": surface_id, + "label": surface["label"], + "expected_scope": surface["expected_scope"], + "config_kind": surface["config_kind"], + "backup_scope": surface["backup_scope"], + "control_tier": surface["control_tier"], + "repo_source_path": surface["source_path"], + "repo_sha256": surface["sha256"], + "source_line_count": surface["line_count"], + "requires_live_evidence": surface["requires_live_evidence"], + "write_capable_surface": write_capable, + "source_inventory_ref": "docs/security/backup-restore-escrow-inventory.snapshot.json", + "request_fields": REQUEST_FIELDS, + "required_owner_fields": REQUIRED_OWNER_FIELDS, + "blocked_actions": BLOCKED_ACTIONS, + "owner_role_or_team": "pending_owner_role_or_team", + "decision": "pending_owner_decision", + "decision_reason": "pending_decision_reason", + "affected_scope": "pending_affected_scope", + "redacted_evidence_refs": [], + "latest_backup_status_ref": None, + "restore_drill_plan": "pending_restore_drill_plan", + "offsite_sync_evidence_ref": None, + "credential_escrow_evidence_ref": None, + "maintenance_window": "pending_maintenance_window", + "rollback_owner": "pending_rollback_owner", + "validation_plan": "pending_validation_plan", + "retention_owner": "pending_retention_owner", + "followup_owner": "pending_followup_owner", + "not_approval": True, + "request_sent": False, + "recipient_confirmed": False, + "owner_response_received": False, + "owner_response_accepted": False, + "live_evidence_received": False, + "restore_drill_accepted": False, + "offsite_sync_accepted": False, + "credential_escrow_accepted": False, + "retention_change_accepted": False, + "maintenance_window_accepted": False, + "rollback_owner_accepted": False, + "validation_plan_accepted": False, + "backup_run_authorized": False, + "restore_run_authorized": False, + "offsite_sync_authorized": False, + "offsite_remote_delete_authorized": False, + "credential_escrow_marker_write_authorized": False, + "retention_change_authorized": False, + "restic_prune_authorized": False, + "rclone_config_authorized": False, + "velero_restore_authorized": False, + "velero_backup_authorized": False, + "kubectl_action_authorized": False, + "ssh_read_authorized": False, + "ssh_write_authorized": False, + "secret_value_collection_allowed": False, + "host_write_authorized": False, + "active_scan_authorized": False, + "runtime_gate": False, + "action_buttons_allowed": False, + } + + +def build_report(root: Path, inventory: dict[str, Any], generated_at: str | None) -> dict[str, Any]: + report_time = generated_at or datetime.now(TAIPEI).isoformat(timespec="seconds") + write_capable_ids = {surface["surface_id"] for surface in inventory["write_capable_surfaces"]} + requests = [request_for(surface, write_capable_ids) for surface in inventory["backup_surfaces"]] + write_capable_requests = [item for item in requests if item["write_capable_surface"]] + live_evidence_requests = [item for item in requests if item["requires_live_evidence"]] + + return { + "schema_version": "backup_restore_owner_request_draft_v1", + "generated_at": report_time, + "git_commit": git_short_sha(root), + "source_inventory_schema_version": inventory.get("schema_version"), + "source_inventory_status": inventory.get("status"), + "status": "owner_request_draft_ready_not_dispatched", + "summary": { + "request_draft_count": len(requests), + "write_capable_request_draft_count": len(write_capable_requests), + "live_evidence_required_request_count": len(live_evidence_requests), + "request_field_count": len(REQUEST_FIELDS), + "required_owner_field_count": len(REQUIRED_OWNER_FIELDS), + "blocked_action_count": len(BLOCKED_ACTIONS), + "request_sent_count": 0, + "recipient_confirmed_count": 0, + "owner_response_received_count": 0, + "owner_response_accepted_count": 0, + "live_evidence_received_count": 0, + "restore_drill_accepted_count": 0, + "offsite_sync_accepted_count": 0, + "credential_escrow_accepted_count": 0, + "retention_change_accepted_count": 0, + "maintenance_window_accepted_count": 0, + "rollback_owner_accepted_count": 0, + "validation_plan_accepted_count": 0, + "backup_run_authorized_count": 0, + "restore_run_authorized_count": 0, + "offsite_sync_authorized_count": 0, + "offsite_remote_delete_authorized_count": 0, + "credential_escrow_marker_write_authorized_count": 0, + "retention_change_authorized_count": 0, + "restic_prune_authorized_count": 0, + "rclone_config_authorized_count": 0, + "velero_restore_authorized_count": 0, + "velero_backup_authorized_count": 0, + "kubectl_action_authorized_count": 0, + "ssh_read_authorized_count": 0, + "ssh_write_authorized_count": 0, + "secret_value_collection_allowed_count": 0, + "host_write_authorized_count": 0, + "active_scan_authorized_count": 0, + "runtime_gate_count": 0, + "action_button_count": 0, + }, + "execution_boundaries": { + "request_sent": False, + "recipient_confirmed": False, + "owner_response_received": False, + "owner_response_accepted": False, + "live_evidence_received": False, + "backup_run_authorized": False, + "restore_run_authorized": False, + "restore_drill_authorized": False, + "offsite_sync_authorized": False, + "offsite_remote_delete_authorized": False, + "credential_escrow_marker_write_authorized": False, + "retention_change_authorized": False, + "restic_prune_authorized": False, + "rclone_config_authorized": False, + "velero_restore_authorized": False, + "velero_backup_authorized": False, + "kubectl_action_authorized": False, + "ssh_read_authorized": False, + "ssh_write_authorized": False, + "secret_value_collection_allowed": False, + "host_write_authorized": False, + "active_scan_authorized": False, + "runtime_execution_authorized": False, + "action_buttons_allowed": False, + "not_authorization": True, + }, + "request_fields": REQUEST_FIELDS, + "required_owner_fields": REQUIRED_OWNER_FIELDS, + "blocked_actions": BLOCKED_ACTIONS, + "request_drafts": requests, + "next_steps": [ + "人工送件前確認 backup / restore / offsite / credential escrow owner role 與回覆窗口。", + "owner 只能提供非敏感 evidence id、最新備份狀態、restore drill plan、maintenance window、rollback owner 與 validation plan。", + "收到回覆後先做欄位完整性、敏感 payload 隔離、restore / offsite / retention gate 檢查,不得直接執行 backup、restore、sync、prune 或 marker write。", + ], + } + + +def main() -> int: + parser = argparse.ArgumentParser(description="IwoooS backup / restore owner request draft 產生器") + parser.add_argument("--root", default=".", help="repo root") + parser.add_argument( + "--inventory-report", + default="docs/security/backup-restore-escrow-inventory.snapshot.json", + help="backup-restore-escrow-inventory.py 輸出的 JSON", + ) + parser.add_argument("--output", help="寫出 JSON 報告") + parser.add_argument("--generated-at", help="固定報告時間,供 committed snapshot 使用") + args = parser.parse_args() + + root = Path(args.root).resolve() + inventory = load_json(root / args.inventory_report) + report = build_report(root, inventory, args.generated_at) + payload = json.dumps(report, ensure_ascii=False, indent=2, sort_keys=True) + + if args.output: + output = Path(args.output) + output.parent.mkdir(parents=True, exist_ok=True) + output.write_text(payload + "\n", encoding="utf-8") + else: + print(payload) + + summary = report["summary"] + print( + "BACKUP_RESTORE_OWNER_REQUEST_DRAFT_OK " + f"drafts={summary['request_draft_count']} " + f"write_capable={summary['write_capable_request_draft_count']} " + f"fields={summary['required_owner_field_count']} " + f"sent={summary['request_sent_count']} " + f"runtime_gate={summary['runtime_gate_count']}", + file=sys.stderr, + ) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/security/security-mirror-progress-guard.py b/scripts/security/security-mirror-progress-guard.py index e1729b451..b47f972ad 100755 --- a/scripts/security/security-mirror-progress-guard.py +++ b/scripts/security/security-mirror-progress-guard.py @@ -103,6 +103,9 @@ def validate(root: Path) -> None: security_dir / "ssh-network-owner-request-draft.snapshot.json" ) backup_restore_escrow_inventory = load_json(security_dir / "backup-restore-escrow-inventory.snapshot.json") + backup_restore_owner_request_draft = load_json( + security_dir / "backup-restore-owner-request-draft.snapshot.json" + ) monitoring_alerting_observability_inventory = load_json( security_dir / "monitoring-alerting-observability-inventory.snapshot.json" ) @@ -3194,6 +3197,138 @@ def validate(root: Path) -> None: [item["surface_id"] for item in backup_restore_escrow_inventory["write_capable_surfaces"]], surface_id, ) + assert_equal( + "backup_restore_owner_request_draft.schema", + backup_restore_owner_request_draft["schema_version"], + "backup_restore_owner_request_draft_v1", + ) + assert_equal( + "backup_restore_owner_request_draft.status", + backup_restore_owner_request_draft["status"], + "owner_request_draft_ready_not_dispatched", + ) + assert_equal( + "backup_restore_owner_request_draft.source_inventory_schema_version", + backup_restore_owner_request_draft["source_inventory_schema_version"], + "backup_restore_escrow_inventory_v1", + ) + expected_backup_restore_owner_request_summary = { + "request_draft_count": 38, + "write_capable_request_draft_count": 27, + "live_evidence_required_request_count": 38, + "request_field_count": 24, + "required_owner_field_count": 14, + "blocked_action_count": 18, + "request_sent_count": 0, + "recipient_confirmed_count": 0, + "owner_response_received_count": 0, + "owner_response_accepted_count": 0, + "live_evidence_received_count": 0, + "restore_drill_accepted_count": 0, + "offsite_sync_accepted_count": 0, + "credential_escrow_accepted_count": 0, + "retention_change_accepted_count": 0, + "maintenance_window_accepted_count": 0, + "rollback_owner_accepted_count": 0, + "validation_plan_accepted_count": 0, + "backup_run_authorized_count": 0, + "restore_run_authorized_count": 0, + "offsite_sync_authorized_count": 0, + "offsite_remote_delete_authorized_count": 0, + "credential_escrow_marker_write_authorized_count": 0, + "retention_change_authorized_count": 0, + "restic_prune_authorized_count": 0, + "rclone_config_authorized_count": 0, + "velero_restore_authorized_count": 0, + "velero_backup_authorized_count": 0, + "kubectl_action_authorized_count": 0, + "ssh_read_authorized_count": 0, + "ssh_write_authorized_count": 0, + "secret_value_collection_allowed_count": 0, + "host_write_authorized_count": 0, + "active_scan_authorized_count": 0, + "runtime_gate_count": 0, + "action_button_count": 0, + } + for key, expected in expected_backup_restore_owner_request_summary.items(): + assert_equal( + f"backup_restore_owner_request_draft.summary.{key}", + backup_restore_owner_request_draft["summary"][key], + expected, + ) + for key, value in backup_restore_owner_request_draft["execution_boundaries"].items(): + if key == "not_authorization": + assert_true(f"backup_restore_owner_request_draft.execution_boundaries.{key}", value) + else: + assert_false(f"backup_restore_owner_request_draft.execution_boundaries.{key}", value) + assert_equal( + "backup_restore_owner_request_draft.request_drafts.count", + len(backup_restore_owner_request_draft["request_drafts"]), + 38, + ) + backup_restore_owner_request_ids = [ + item["request_id"] for item in backup_restore_owner_request_draft["request_drafts"] + ] + for request_id in [ + "backup_restore_owner_request:backup_all_orchestrator", + "backup_restore_owner_request:backup_awoooi_service_script", + "backup_restore_owner_request:offsite_sync_controller", + "backup_restore_owner_request:credential_escrow_marker", + "backup_restore_owner_request:velero_restore_test_cronjob", + "backup_restore_owner_request:cold_start_sop", + ]: + assert_contains( + "backup_restore_owner_request_draft.request_drafts", + backup_restore_owner_request_ids, + request_id, + ) + for draft in backup_restore_owner_request_draft["request_drafts"]: + assert_equal( + f"backup_restore_owner_request_draft.{draft['request_id']}.required_owner_fields", + len(draft["required_owner_fields"]), + 14, + ) + assert_equal( + f"backup_restore_owner_request_draft.{draft['request_id']}.blocked_actions", + len(draft["blocked_actions"]), + 18, + ) + for false_key in [ + "request_sent", + "recipient_confirmed", + "owner_response_received", + "owner_response_accepted", + "live_evidence_received", + "restore_drill_accepted", + "offsite_sync_accepted", + "credential_escrow_accepted", + "retention_change_accepted", + "maintenance_window_accepted", + "rollback_owner_accepted", + "validation_plan_accepted", + "backup_run_authorized", + "restore_run_authorized", + "offsite_sync_authorized", + "offsite_remote_delete_authorized", + "credential_escrow_marker_write_authorized", + "retention_change_authorized", + "restic_prune_authorized", + "rclone_config_authorized", + "velero_restore_authorized", + "velero_backup_authorized", + "kubectl_action_authorized", + "ssh_read_authorized", + "ssh_write_authorized", + "secret_value_collection_allowed", + "host_write_authorized", + "active_scan_authorized", + "runtime_gate", + "action_buttons_allowed", + ]: + assert_false( + f"backup_restore_owner_request_draft.{draft['request_id']}.{false_key}", + draft[false_key], + ) assert_equal( "monitoring_alerting_observability_inventory.schema", monitoring_alerting_observability_inventory["schema_version"],