# IwoooS Public Gateway Rendered Diff Acceptance 只讀帳本 | 項目 | 內容 | |------|------| | 日期 | 2026-06-14 | | 狀態 | `rendered_diff_acceptance_ledger_ready_no_runtime_action` | | 工具 | `scripts/security/public-gateway-rendered-diff-acceptance.py` | | 輸入 | `docs/security/public-gateway-rendered-diff-gate-draft.snapshot.json`、`docs/security/public-gateway-owner-response-acceptance.snapshot.json` | | Snapshot | `docs/security/public-gateway-rendered-diff-acceptance.snapshot.json` | | runtime gate | `0` | ## 1. 目的 Nginx public gateway 是公開網站、API、Webhook、WebSocket、TLS 與 ACME 的共同入口。前面已建立 live conf 匯出請求、redacted export 收件預檢、rendered diff gate draft 與 owner response acceptance;本文件補上下一層:未來 owner 已接受後,如何驗收 `rendered diff`、owner-provided `nginx -t` readback evidence 與 route smoke evidence。 這個帳本只處理證據格式、脫敏邊界、可追溯性與 reviewer 分流。它不是 owner response accepted、不是 rendered diff accepted、不是 `nginx -t` 授權、不是 Nginx reload、不是 route smoke、不是 DNS / TLS probe、不是 certbot renew、不是 host write,也不是 production write 或 runtime gate。 ## 2. 摘要 | 指標 | 值 | 說明 | |------|----|------| | diff acceptance candidate count | `3` | 對應三份 public gateway config | | C0 diff acceptance candidate count | `2` | 188 all sites、188 internal tools HTTPS | | C1 diff acceptance candidate count | `1` | 110 Ollama proxy | | diff acceptance field count | `25` | 每份 evidence acceptance 欄位 | | required evidence field count | `14` | 未來 owner evidence 必填欄位 | | reviewer check count | `15` | 收件、隔離、拒收、補件與 reviewer acceptance 檢查 | | outcome lane count | `8` | 從等待 owner accepted 到等待獨立 runtime approval | | blocked action count | `22` | 不可直接執行或不可誤讀的動作 | | owner response accepted | `0` | 尚未收到 / 接受 | | rendered diff received / accepted | `0 / 0` | 尚未收到 / 驗收 | | nginx test evidence received / accepted | `0 / 0` | 尚未收到 / 驗收 | | route smoke evidence received / accepted | `0 / 0` | 尚未收到 / 驗收 | | runtime gate / action button | `0 / 0` | 未開啟 | ## 3. Acceptance 欄位 | 欄位 | 內容規則 | |------|----------| | `diff_acceptance_id` | 固定對應 public gateway rendered diff acceptance | | `owner_response_acceptance_id` | 對應上一層 owner response acceptance candidate | | `diff_gate_id` | 對應 rendered diff gate draft | | `config_id` | 對應 public gateway config | | `control_tier` | 保留 C0 / C1 風險分級 | | `host` | 只保留既有 host scope,不代表 SSH 授權 | | `live_path` | 只保留預期 live path,不代表讀取 live conf | | `redacted_live_conf_ref` | 只可填脫敏 ref / hash / artifact pointer | | `rendered_diff_ref` | 只可填 ref,不得貼完整 diff payload | | `rendered_diff_hash_ref` | 指向 hash / checksum evidence | | `diff_scope_summary` | 摘要 affected routes / upstream / TLS / ACME 範圍 | | `affected_routes` | 必須能對回 preflight inventory | | `nginx_test_evidence_ref` | 只可填 owner-provided readback ref | | `nginx_test_operator` | 操作者角色,不得是不可追溯個人暱稱 | | `nginx_test_result` | 結果摘要,不得含 secret | | `route_smoke_matrix_ref` | affected route smoke matrix ref | | `route_smoke_result_ref` | route smoke readback ref | | `tls_acme_impact_ref` | TLS / ACME 影響 ref | | `maintenance_window` | 維護窗口或明確禁止窗口 | | `rollback_owner` | rollback owner / team | | `rollback_ref` | rollback plan / revision / artifact ref | | `postcheck_evidence_ref` | post-check readback ref | | `reviewer_outcome` | reviewer acceptance lane | | `followup_owner` | 補件或下一階段 owner | | `not_approval` | 必須為 `true` | ## 4. Reviewer Checks | Check | 規則 | |-------|------| | `owner_response_accepted_first` | 必須先有 owner response accepted record | | `redacted_live_conf_ref_only` | 不接受 raw live conf | | `rendered_diff_ref_not_payload` | 不接受完整 diff payload | | `diff_scope_matches_config_id` | diff scope 必須對回 config_id | | `nginx_test_evidence_is_readback_only` | 本工具不得執行 `nginx -t` | | `nginx_test_result_has_timestamp` | test result 需有時間、角色與結果摘要 | | `route_smoke_matrix_complete` | smoke matrix 必須列 affected routes 與預期結果 | | `tls_acme_impact_separated` | TLS / ACME 影響不可被 route smoke 取代 | | `secret_value_absent` | 不得包含 secret value 或 derivative | | `maintenance_window_present` | 未來 runtime action 前必須有窗口 | | `rollback_owner_and_ref_present` | rollback owner 與 ref 必須存在 | | `postcheck_plan_present` | post-check evidence ref 必須存在 | | `no_execution_request_embedded` | evidence 不可夾帶執行要求 | | `counts_transition_safe` | accepted / rejected 只能由 reviewer record 更新 | | `action_button_absent` | 前台不得新增執行按鈕 | ## 5. Outcome Lanes | Lane | 意義 | |------|------| | `waiting_owner_response_acceptance` | owner response 尚未 accepted | | `waiting_rendered_diff_evidence` | 等待 rendered diff / nginx test / route smoke evidence ref | | `quarantine_raw_conf_or_payload` | raw conf 或完整 payload 只能隔離 | | `reject_secret_or_execution_request` | secret 或執行要求直接拒收 | | `request_evidence_supplement` | 欄位不足或 route matrix 不完整需補件 | | `ready_for_reviewer_acceptance` | metadata 合格後進 reviewer acceptance | | `accepted_for_runtime_gate_planning` | 只可進下一層 runtime gate planning | | `waiting_separate_runtime_approval` | `nginx -t` / reload / smoke 仍需獨立人工批准 | ## 6. Blocked Actions | Action | 邊界 | |--------|------| | `read_live_conf_over_ssh` | 未授權不得執行 | | `store_raw_live_conf` | 不得寫入 repo、LOGBOOK 或前端 | | `store_full_rendered_diff_payload` | 不得保存完整 diff payload | | `accept_unredacted_live_conf` | 不得接受 | | `collect_secret_value` | 不得收 secret value | | `accept_execution_request_inside_evidence` | evidence 內不得夾帶執行要求 | | `mark_rendered_diff_accepted_without_owner_response` | 不得跳過 owner response accepted | | `mark_rendered_diff_accepted_without_reviewer_record` | 不得跳過 reviewer record | | `run_nginx_test_from_diff_acceptance` | 不得由本帳本執行 | | `run_route_smoke_from_diff_acceptance` | 不得由本帳本執行 | | `nginx_reload_from_diff_acceptance` | 不得由本帳本執行 | | `dns_probe_from_diff_acceptance` | 不得由本帳本執行 | | `tls_probe_from_diff_acceptance` | 不得由本帳本執行 | | `certbot_renew_from_diff_acceptance` | 不得由本帳本執行 | | `modify_nginx_conf` | 不得改 live conf | | `modify_dns_tls_config` | 不得改 DNS / TLS / certbot | | `change_public_route` | 不得改公開路由 | | `change_admin_route` | 不得改 admin route | | `change_websocket_route` | 不得改 WebSocket route | | `write_production_host` | 不得主機寫入 | | `open_runtime_gate` | 不得開 runtime gate | | `add_action_button` | 不得新增操作按鈕 | ## 7. 指令 產生 committed snapshot: ```bash python3 scripts/security/public-gateway-rendered-diff-acceptance.py \ --root . \ --rendered-diff-gate-report docs/security/public-gateway-rendered-diff-gate-draft.snapshot.json \ --owner-response-acceptance-report docs/security/public-gateway-owner-response-acceptance.snapshot.json \ --output docs/security/public-gateway-rendered-diff-acceptance.snapshot.json \ --generated-at 2026-06-14T23:58:00+08:00 ``` 驗證 guard: ```bash python3 scripts/security/security-mirror-progress-guard.py --root . ``` ## 8. 完成度 | 工作 | 完成度 | 說明 | |------|--------|------| | rendered diff acceptance artifact | `100%` | 產生器、snapshot 與文件已固定 | | owner response accepted | `0%` | 尚未收到 / 接受 | | rendered diff evidence accepted | `0%` | 尚未收到 / 驗收 | | nginx test evidence accepted | `0%` | 尚未收到 / 驗收 | | route smoke evidence accepted | `0%` | 尚未收到 / 驗收 | | runtime reload / host write | `0%` | 未授權且未執行 |