# CD / Runner / Secret injection 事故後回讀只讀計畫

| 項目 | 內容 |
|------|------|
| 日期 | 2026-06-16 |
| 狀態 | `post_incident_readback_plan_ready_no_runtime_action` |
| 工具 | `scripts/security/cd-runner-secret-injection-post-incident-readback-plan.py` |
| Snapshot | `docs/security/cd-runner-secret-injection-post-incident-readback-plan.snapshot.json` |
| Source evidence | `docs/security/cd-runner-secret-injection-change-evidence-acceptance.snapshot.json` |
| runtime gate | `0` |

## 1. 目的

此計畫補在 CD / runner / secret injection change evidence acceptance 之後，專門處理事故後回讀：workflow / runner / secret injection 相關異常或變更後，owner 必須回讀 actor、時間窗、workflow diff state、runner attestation、secret name parity、secret injection route、step-env secret guard、log redaction、deploy marker、Gitea run、webhook / notification receipt、before / after deploy state、rollback、post-check 與防再發。

它只處理 metadata-only evidence ref，不呼叫 Gitea / GitHub API、不讀 secret store、不讀 secret value、不修改 workflow、不啟用 runner、不 rotate secret、不 dispatch workflow、不觸發部署，也不把 CD success、deploy marker、workflow success、route `200`、runner online、AwoooP approval 或 UI 可見狀態當成 runtime 授權。

## 2. 固定範圍

| 指標 | 數值 | 解讀 |
|------|------|------|
| `readback_candidate_count` | `5` | CD pipeline、Code Review、Deploy alerts、Runner attestation、Secret parity / injection owner 五類候選 |
| `c0_readback_candidate_count` | `4` | CD、Code Review、Runner、Secret parity 為 C0 |
| `c1_readback_candidate_count` | `1` | Deploy alerts / monitoring route 為 C1 |
| `write_capable_readback_candidate_count` | `5` | 五類都可能影響 workflow、runner、secret injection、通知或部署路徑 |
| `secret_sensitive_readback_candidate_count` | `5` | 五類都必須檢查 secret value / hash / partial token / runner token 不可出現 |
| `runner_or_workflow_readback_candidate_count` | `5` | 五類都必須回讀 workflow / runner 邊界 |
| `deploy_or_run_readback_required_candidate_count` | `5` | 五類都需要 deploy marker 或 Gitea run readback / 不適用理由 |
| `required_readback_field_count` | `33` | 事故後回讀必填欄位 |
| `reviewer_check_count` | `30` | reviewer 必檢規則 |
| `outcome_lane_count` | `11` | 收件結果分流 |
| `blocked_action_count` | `52` | 明確禁止動作 |

## 3. 必填事故後回讀欄位

每筆事故後回讀至少需要：

1. `incident_or_change_ref`
2. `actor_attribution_ref`
3. `change_time_window_ref`
4. `change_intent_or_break_glass_ref`
5. `workflow_diff_state_ref`
6. `runner_attestation_state_ref`
7. `runner_executor_host_readback_ref`
8. `runner_workspace_cleanup_readback_ref`
9. `runner_permission_scope_ref`
10. `secret_name_parity_state_ref`
11. `secret_injection_route_state_ref`
12. `step_env_secret_guard_result_ref`
13. `log_redaction_readback_ref`
14. `deploy_marker_readback_ref`
15. `gitea_action_run_readback_ref`
16. `webhook_delivery_state_ref`
17. `deploy_key_branch_protection_codeowners_ref`
18. `notification_delivery_receipt_ref`
19. `before_after_deploy_state_ref`
20. `affected_route_or_service_state_ref`
21. `cross_project_sync_ref`
22. `rollback_validation_ref`
23. `postcheck_evidence_ref`
24. `post_change_monitoring_ref`
25. `recurrence_guard_ref`
26. `maintenance_window`
27. `rollback_owner`
28. `followup_owner`
29. `redacted_evidence_refs`
30. `no_secret_value_attestation`
31. `no_raw_workflow_payload_attestation`
32. `no_unredacted_log_attestation`
33. `no_false_green_attestation`

以上欄位都只能保存脫敏 ref、commit、artifact pointer、run id、job id、ticket 或 hash。不得貼 secret value、secret hash、masked token、partial token、runner token、webhook secret、private key、deploy key private material、cookie、authorization header、完整 credential URL、未脫敏 action log 或未脫敏截圖。

## 4. Reviewer checks

Reviewer 必須確認：

- 來源 change evidence acceptance snapshot 是目前版本。
- incident / change ref、actor、時間窗、intent / break-glass reason 都存在。
- workflow diff state 只以 ref 呈現，不保存 raw workflow payload。
- runner label、executor、host alias、workspace cleanup、permission scope 與 hosted runner 風險可追溯。
- secret name parity、secret injection route、step-env secret guard 與 log redaction readback 完整。
- deploy marker 與 Gitea run readback 只能作證據，不代表 runtime approval。
- webhook delivery、deploy key、branch protection、CODEOWNERS、notification receipt 與跨專案同步影響已標示。
- rollback validation、post-check、post-change monitoring 與 recurrence guard 已明確列出。
- 不把 CD success、deploy marker、workflow success、route `200`、runner online、UI 可見或 AwoooP approval 當驗收。

## 5. Outcome lanes

| Lane | 說明 |
|------|------|
| `waiting_post_incident_readback` | 尚未收到事故後回讀包 |
| `request_actor_or_time_supplement` | 缺 actor、時間窗、intent 或 break-glass reason |
| `request_workflow_runner_supplement` | 缺 workflow diff、runner attestation、executor / host、workspace cleanup 或 permission scope |
| `request_secret_injection_supplement` | 缺 secret name parity、injection route、step-env guard 或 log redaction readback |
| `request_deploy_run_supplement` | 缺 deploy marker、Gitea run readback、before / after deploy state 或 post-check |
| `request_webhook_notification_supplement` | 缺 webhook delivery、notification receipt、SRE route owner 或 cross-project sync |
| `quarantine_sensitive_payload` | 收到敏感值、runner token、webhook secret、private key、未脫敏 log 或截圖時隔離 |
| `reject_false_green_claim` | 把 CD success、deploy marker、workflow success、route `200`、runner online、UI 可見或 AwoooP approval 當驗收時拒收 |
| `ready_for_cd_runner_secret_post_incident_review` | metadata 合格後進 reviewer review |
| `recurrence_guard_backfill_required` | 需補防再發 guard、owner review、change freeze、automation block 或 runner isolation plan |
| `waiting_runtime_gate` | 即使 readback accepted，runtime gate 仍需獨立人工批准 |

## 6. 禁止動作

此計畫明確禁止修改 workflow、未批准 dispatch workflow、啟用 / 安裝 / 重啟 runner、修改 runner label、使用 runner admin token、啟用 GitHub hosted runner、收集 secret value / hash / partial token / runner token / webhook secret / deploy key private material、保存 raw workflow payload / 未脫敏 action log、建立 / 更新 / rotate / 刪除 repo secret、讀 secret store、修改 secret injection path、修改 webhook、修改 deploy key、修改 branch protection、修改 CODEOWNERS、sync refs、force push、切 GitHub primary、停用 Gitea、把 CD pipeline 當 action 執行、注入 K8s secret、ArgoCD sync、production deploy、新增 action button 或開 runtime gate。

## 7. 完成度與邊界

| 工作 | 完成度 | 邊界 |
|------|--------|------|
| CD / Runner / Secret injection post-incident readback plan | `100%` | 只讀計畫與 snapshot 已建立 |
| Secret metadata 只讀治理成熟度 | `68% -> 70%` | 只代表事故後回讀欄位補齊，不代表可讀或可改 secret |
| Gitea workflow / runner source-control 只讀治理成熟度 | `72% -> 74%` | 只代表 workflow / runner 事故後回讀欄位補齊，不代表 workflow / runner 可修改 |
| post-incident readback received / accepted | `0%` | 尚未收到或接受任何事故後回讀 |
| runtime gate | `0` | 不開 workflow、runner、secret、deploy、ArgoCD 或 production action |

## 8. 下一步

1. 要求 owner 只提供事故後 readback ref：workflow diff state、runner attestation、secret name parity、secret injection route、Gitea run readback、guard result、deploy marker、notification receipt、rollback owner 與 post-check evidence。
2. reviewer 只檢查 metadata 完整性、no-secret-value、log redaction 與 no-false-green，不保存 raw workflow payload、raw action log 或 credential material。
3. 若未來要進 runtime approval package，必須另開維護窗口、rollback owner、跨專案同步與 production post-check gate。
