diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index a4937494a..a4f9a902d 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,18 @@ +## 2026-05-18 | 資安供應鏈 S4.9:Owner Response Outcome Lanes + +**背景**:S4.9 preflight 已能判斷 owner response 是否可收、補證、隔離或拒收;本輪補上 outcome lanes,讓 AwoooP 可以把 preflight 結果穩定顯示成可審、補證、隔離、拒收或等待,不需自行推測 UI / audit 分類。 + +**完成**: +- `gitea_inventory_owner_attestation_response_v1` schema 新增 optional `intake_outcome_lanes`,summary 新增 `intake_outcome_lane_count`。 +- `gitea-inventory-owner-attestation-response.snapshot.json` 新增 5 個 outcome lanes:`ready_for_owner_review`、`request_more_evidence`、`quarantine_sensitive_payload`、`reject_execution_request`、`keep_waiting_owner_response`。 +- `source-control-owner-response-guard.py` 反查 outcome lane count、id 順序、display order、`execution_authorized=false` 與 `not_approval=true`。 +- 更新 S4.9 人讀文件、AwoooP checklist、handoff、readiness、manifest、status rollup、dry-run、approval queue / gate / review packet、runbook 與 progress。 + +**仍禁止**: +- 不把 outcome lane 當成 owner response accepted。 +- 不讓 ready / request more evidence / quarantine / reject / waiting 任一 lane 觸發 inventory runtime、repo migration、refs sync、workflow / secret / runner 變更或 GitHub primary。 +- 不收 token value、secret value、private key、cookie、session、DB dump、git object pack 或未脫敏 payload。 + ## 2026-05-18 | 資安供應鏈 S4.9:Owner Response Intake Preflight **背景**:S4.13 已把下一個建議收件固定為 S4.9;本輪補強 S4.9 本身的收件前檢查,讓 AwoooP 在 owner response 到來時先判斷可收、補證、隔離或拒收,而不是直接推進 inventory / migration。 diff --git a/docs/schemas/gitea_inventory_owner_attestation_response_v1.schema.json b/docs/schemas/gitea_inventory_owner_attestation_response_v1.schema.json index dc4ed0bb3..0a7aeb653 100644 --- a/docs/schemas/gitea_inventory_owner_attestation_response_v1.schema.json +++ b/docs/schemas/gitea_inventory_owner_attestation_response_v1.schema.json @@ -62,6 +62,7 @@ "rejected_response_count", "response_template_count", "intake_preflight_check_count", + "intake_outcome_lane_count", "acceptance_check_count", "rejection_rule_count", "token_value_collection_allowed", @@ -82,6 +83,7 @@ "rejected_response_count": {"type": "integer", "minimum": 0}, "response_template_count": {"type": "integer", "minimum": 0}, "intake_preflight_check_count": {"type": "integer", "minimum": 0}, + "intake_outcome_lane_count": {"type": "integer", "minimum": 0}, "acceptance_check_count": {"type": "integer", "minimum": 0}, "rejection_rule_count": {"type": "integer", "minimum": 0}, "token_value_collection_allowed": { @@ -210,6 +212,69 @@ }, "minItems": 1 }, + "intake_outcome_lanes": { + "type": "array", + "description": "AwoooP 顯示 S4.9 preflight 結果的只讀 outcome lanes;只顯示下一步,不授權 inventory、migration、repo、refs 或 primary 動作。", + "items": { + "type": "object", + "required": [ + "lane_id", + "display_order", + "title", + "when", + "awooop_action", + "allowed_outputs", + "still_forbidden", + "execution_authorized", + "not_approval" + ], + "properties": { + "lane_id": { + "type": "string", + "enum": [ + "ready_for_owner_review", + "request_more_evidence", + "quarantine_sensitive_payload", + "reject_execution_request", + "keep_waiting_owner_response" + ] + }, + "display_order": {"type": "integer", "minimum": 1}, + "title": {"type": "string"}, + "when": {"type": "string"}, + "awooop_action": { + "type": "string", + "enum": [ + "display_ready_for_owner_review", + "display_request_more_evidence", + "route_to_mirror_quarantine", + "reject_execution_request", + "keep_waiting_owner_response" + ] + }, + "allowed_outputs": { + "type": "array", + "items": {"type": "string"}, + "minItems": 1 + }, + "still_forbidden": { + "type": "array", + "items": {"type": "string"}, + "minItems": 1 + }, + "execution_authorized": { + "type": "boolean", + "const": false + }, + "not_approval": { + "type": "boolean", + "const": true + } + }, + "additionalProperties": false + }, + "minItems": 1 + }, "acceptance_checks": { "type": "array", "items": { diff --git a/docs/security/AWOOOP-MIRROR-ONLY-CONSUMPTION-CHECKLIST.md b/docs/security/AWOOOP-MIRROR-ONLY-CONSUMPTION-CHECKLIST.md index a6cd2e659..76e6cbfa6 100644 --- a/docs/security/AWOOOP-MIRROR-ONLY-CONSUMPTION-CHECKLIST.md +++ b/docs/security/AWOOOP-MIRROR-ONLY-CONSUMPTION-CHECKLIST.md @@ -45,7 +45,7 @@ AwoooP 初期不得直接啟動掃描、不得呼叫 Codex patch runner、不得 | `source_control_owner_response_validation_rollup_v1` | S4.9 / S4.10 / S4.11 / S4.12 owner response validation rollup | Operator Console、Source-control review、Audit | mirror-only | 只顯示四包 response packets、22 個 templates、missing response lanes、owner response collection order、next collection candidate、10 個 cross-packet checks、quarantine rules 與 latest local validation;不得視為 approval 或 runtime gate | | `coding_task_v1` | Code Review / Codex Security / manual review | Approval candidate、Channel Event、Audit | suggest-only | 不自動開 patch runner、不自動 merge | | `source_control_migration_event_v1` | Gitea/GitHub branch/tag/SHA diff | Supply-chain evidence、Approval candidate | mirror-only | 不觸發 deploy、不切換 primary | -| `gitea_repo_inventory_v1` | Gitea org/user repo list 或管理匯出 | Supply-chain evidence、migration matrix | mirror-only | 顯示 public-only evidence、S4.5 authenticated/admin export request、S4.6 redacted import acceptance、S4.7 owner coverage attestation、S4.9 owner response 收件包與 6 個 intake preflight checks;不保存 token value、不刪除或停用 Gitea repo | +| `gitea_repo_inventory_v1` | Gitea org/user repo list 或管理匯出 | Supply-chain evidence、migration matrix | mirror-only | 顯示 public-only evidence、S4.5 authenticated/admin export request、S4.6 redacted import acceptance、S4.7 owner coverage attestation、S4.9 owner response 收件包、6 個 intake preflight checks 與 5 個 outcome lanes;不保存 token value、不刪除或停用 Gitea repo | | `local_git_remote_inventory_v1` | 本機可見 Git working tree remote | Source-control coverage evidence、migration matrix | mirror-only | 不視為 Gitea server 全量、不修改 remote | | `github_target_probe_v1` | 候選 GitHub repo read-only probe | Migration target evidence | mirror-only | `not_found_or_private` 不等同確認不存在 | | `github_target_decision_v1` | GitHub target 建立與可見性決策草案;S4.10 owner decision response 收件包 | Approval candidate、Migration target evidence | mirror-only | approval 前不得建立 repo、修改 visibility、同步 refs;S4.10 response 目前 0 筆,不代表執行批准 | @@ -118,7 +118,7 @@ AwoooP 初期不得直接啟動掃描、不得呼叫 Codex patch runner、不得 | `source_control_migration_event_v1.status=blocked` | `observe` | 顯示 blocking reason,不允許切 primary | | `source_control_migration_event_v1.status=verified` | `approve_required` | 仍需人工批准主控切換 | | `gitea_repo_inventory_v1.status=blocked` | `observe` | 補只讀 token 或管理匯出,不做同步 | -| `gitea_repo_inventory_v1.status=partial` | `observe` | 視為 public-only evidence,顯示 S4.5 export request、S4.6 import acceptance、S4.7 owner attestation request、S4.9 owner response templates、intake preflight checks 與 coverage gap,不做同步 | +| `gitea_repo_inventory_v1.status=partial` | `observe` | 視為 public-only evidence,顯示 S4.5 export request、S4.6 import acceptance、S4.7 owner attestation request、S4.9 owner response templates、intake preflight checks、outcome lanes 與 coverage gap,不做同步 | | `gitea_repo_inventory_v1.status=ok` | `warn` | 進入 repo mapping / branch tag diff | | `approval_required_event_v1.requested_action=run_gitea_readonly_inventory` | `approve_required` | 只允許 read-only token 或 redacted admin export,不保存 token value | | `local_git_remote_inventory_v1.status=partial` | `observe` | 補 server-side inventory,不做主控切換 | diff --git a/docs/security/AWOOOP-SECURITY-SUPPLYCHAIN-INTEGRATION-HANDOFF.md b/docs/security/AWOOOP-SECURITY-SUPPLYCHAIN-INTEGRATION-HANDOFF.md index e3a70bce9..400d1d093 100644 --- a/docs/security/AWOOOP-SECURITY-SUPPLYCHAIN-INTEGRATION-HANDOFF.md +++ b/docs/security/AWOOOP-SECURITY-SUPPLYCHAIN-INTEGRATION-HANDOFF.md @@ -60,6 +60,8 @@ AwoooP 顯示 S4.13 時,應把 `missing_response_lanes` 當成 Operator Consol S4.9 也提供 6 個 `intake_preflight_checks`:已知 item、必填欄位、允許 decision、脫敏 evidence、不得夾帶執行要求、接受前覆蓋五個 items。AwoooP 只能用它判斷可收、補證、隔離或拒收,不得把 preflight pass 當成 inventory runtime、repo migration 或 primary approval。 +同時顯示 5 個 `intake_outcome_lanes`:`ready_for_owner_review`、`request_more_evidence`、`quarantine_sensitive_payload`、`reject_execution_request`、`keep_waiting_owner_response`。這些 lanes 只決定 Operator Console 顯示與 audit 分類,不會讓 received / accepted count 自動增加,也不會解除 S4.13 的 waiting 狀態。 + ## 1. Session 分工 ### AwoooP 主線 Session @@ -377,7 +379,7 @@ Schema:`docs/schemas/security_mirror_status_rollup_v1.schema.json` Snapshot:`docs/security/security-mirror-status-rollup.snapshot.json` -目前 rollup:`framework_ready_waiting_approval`;35 個 contracts、32 ready、2 partial、1 contract-only、0 blocked;approval queue 仍為 8 items,其中 7 pending approval、1 block candidate;review packets 8 筆;state transition rules 5 筆;follow-up runtime gate templates 8 筆;active runtime gates 0 筆;GitHub primary candidate repos 8 筆;primary ready 0 筆;S4.4 rollback ADR repo plans 7 筆、owner approved 0 筆、dry-run completed 0 筆;S4.10 GitHub target owner decision response templates 7 筆、received response 0 筆、accepted response 0 筆;S4.11 refs truth owner response templates 5 筆、received response 0 筆、accepted response 0 筆;Gitea inventory 目前 `partial_waiting_authenticated_inventory`,public-only repo 2 個、本機可見 Gitea unique repo 4 個、export source options 2 類、S4.6 import acceptance payload 0 筆、S4.7 owner attestation items 5 筆、received attestation 0 筆、S4.9 owner response templates 5 筆、received response 0 筆、quarantine required=true、token value collection allowed=false;workflow / secret 名稱 inventory candidate repos 8 筆、complete 0 筆、S4.12 owner response templates 5 筆、received response 0 筆、accepted response 0 筆;S4.2 local evidence repos 4 筆、workflow files 31 筆、referenced secret names 43 筆;decision records 目前 0 筆。 +目前 rollup:`framework_ready_waiting_approval`;35 個 contracts、32 ready、2 partial、1 contract-only、0 blocked;approval queue 仍為 8 items,其中 7 pending approval、1 block candidate;review packets 8 筆;state transition rules 5 筆;follow-up runtime gate templates 8 筆;active runtime gates 0 筆;GitHub primary candidate repos 8 筆、primary ready 0 筆;S4.4 rollback ADR repo plans 7 筆、owner approved 0 筆、dry-run completed 0 筆;S4.10 GitHub target owner decision response templates 7 筆、received response 0 筆、accepted response 0 筆;S4.11 refs truth owner response templates 5 筆、received response 0 筆、accepted response 0 筆;Gitea inventory 目前 `partial_waiting_authenticated_inventory`,public-only repo 2 個、本機可見 Gitea unique repo 4 個、export source options 2 類、S4.6 import acceptance payload 0 筆、S4.7 owner attestation items 5 筆、received attestation 0 筆、S4.9 owner response templates 5 筆、intake preflight checks 6 筆、outcome lanes 5 筆、received response 0 筆、quarantine required=true、token value collection allowed=false;workflow / secret 名稱 inventory candidate repos 8 筆、complete 0 筆、S4.12 owner response templates 5 筆、received response 0 筆、accepted response 0 筆;S4.2 local evidence repos 4 筆、workflow files 31 筆、referenced secret names 43 筆;decision records 目前 0 筆。 AwoooP 初期處理方式:只顯示階段狀態、下一個 gate 與禁止事項,可寫入 Audit evidence;不得把 rollup 當 runtime authorization。 @@ -531,7 +533,7 @@ S4.6 支援性驗收:已新增 `docs/schemas/gitea_authenticated_inventory_imp S4.7 支援性 owner attestation:已新增 `docs/schemas/gitea_inventory_coverage_attestation_v1.schema.json`、`docs/security/gitea-inventory-coverage-attestation.snapshot.json` 與 `docs/security/GITEA-INVENTORY-COVERAGE-ATTESTATION.md`。此 attestation 仍不新增第 36 個主 contract,只定義 public-only / local remote gap、org/user endpoint、110 internal adjacent source、canonical owner 與 legacy/inaccessible disposition 的 owner decision;目前 `required_attestation_item_count=5`、`received_attestation_count=0`、`accepted_attestation_count=0`、`runtime_execution_authorized=false`,不得把 attestation request 視為 repo migration approval。 -S4.9 支援性 owner response 收件包:已新增 `docs/schemas/gitea_inventory_owner_attestation_response_v1.schema.json`、`docs/security/gitea-inventory-owner-attestation-response.snapshot.json` 與 `docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md`。此 response packet 仍不新增第 36 個主 contract,只定義 owner 回覆 S4.7 五個 items 時的必填欄位、驗收規則、拒收規則與 allowed output;目前 `required_response_item_count=5`、`received_response_count=0`、`accepted_response_count=0`、`runtime_execution_authorized=false`,不得把 response packet 視為 read-only inventory 已執行、repo migration approval 或 GitHub primary approval。 +S4.9 支援性 owner response 收件包:已新增 `docs/schemas/gitea_inventory_owner_attestation_response_v1.schema.json`、`docs/security/gitea-inventory-owner-attestation-response.snapshot.json` 與 `docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md`。此 response packet 仍不新增第 36 個主 contract,只定義 owner 回覆 S4.7 五個 items 時的必填欄位、intake preflight checks、outcome lanes、驗收規則、拒收規則與 allowed output;目前 `required_response_item_count=5`、`intake_preflight_check_count=6`、`intake_outcome_lane_count=5`、`received_response_count=0`、`accepted_response_count=0`、`runtime_execution_authorized=false`,不得把 response packet 視為 read-only inventory 已執行、repo migration approval 或 GitHub primary approval。 ### `local_git_remote_inventory_v1` @@ -906,7 +908,7 @@ Console 初期不提供高風險執行按鈕。 2026-05-17 S4.8 Gitea owner attestation approval lane 對齊追加:已更新既有 `security_approval_queue_v1`、`security_approval_gate_v1`、`security_approval_review_packet_v1` 與 `security_followup_runtime_gate_v1` 的 Gitea lane,要求 AwoooP 先顯示 S4.7 的 5 個 owner attestation items 與 scope decision evidence。queue / review packet / follow-up template 數量維持 8 / 8 / 8,`active_runtime_gates=0`,不得新增 action button、不得執行 read-only inventory、不得把 owner attestation 視為 repo migration approval 或 GitHub primary approval。 -2026-05-17 S4.9 Gitea owner attestation response 收件包追加:已新增 `docs/schemas/gitea_inventory_owner_attestation_response_v1.schema.json`、`docs/security/gitea-inventory-owner-attestation-response.snapshot.json` 與 `docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md`。AwoooP 可顯示 5 個 response templates、8 個 acceptance checks 與 10 個 rejection rules;目前收到 response 0 筆、接受 0 筆,仍不得保存 token value、不得寫 Gitea、不得 sync refs、不得切 GitHub primary。 +2026-05-17 S4.9 Gitea owner attestation response 收件包追加:已新增 `docs/schemas/gitea_inventory_owner_attestation_response_v1.schema.json`、`docs/security/gitea-inventory-owner-attestation-response.snapshot.json` 與 `docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md`。AwoooP 可顯示 5 個 response templates、6 個 intake preflight checks、5 個 outcome lanes、8 個 acceptance checks 與 10 個 rejection rules;目前收到 response 0 筆、接受 0 筆,仍不得保存 token value、不得寫 Gitea、不得 sync refs、不得切 GitHub primary。 2026-05-13 Kali 112 live 整合狀態追加:已在授權下登入 `192.168.0.112` 做 read-only 盤點與低風險更新,並新增 `docs/schemas/kali_integration_status_v1.schema.json`、`docs/security/kali-integration-status.snapshot.json` 與 `docs/security/KALI-INTEGRATION-STATUS.md`。Kali Scanner API `/health` healthy、`kali-scanner.service` active/enabled、node-exporter 與 wg-easy container up;已 targeted update `nmap`、`nikto`、`nuclei`、`curl`、`openssl`、CA 套件,安裝 `jq`,時區改為 `Asia/Taipei`,更新後無 reboot required。AwoooP 可 mirror health / update / gap evidence,但不得直接啟動 scan、credentialed scan 或 `/execute`。 diff --git a/docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md b/docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md index cf7314455..da89fc85a 100644 --- a/docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md +++ b/docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md @@ -30,6 +30,7 @@ S4.7 已定義要問什麼,S4.8 已把它接到 AwoooP approval lane;S4.9 | 已拒收 response | 0 | | response templates | 5 | | intake preflight checks | 6 | +| intake outcome lanes | 5 | | acceptance checks | 8 | | rejection rules | 10 | | 允許收集 token value | `false` | @@ -62,6 +63,18 @@ S4.7 已定義要問什麼,S4.8 已把它接到 AwoooP approval lane;S4.9 這 6 個 preflight 只協助 AwoooP 判斷「可收、補證、隔離或拒收」。它們不授權 read-only inventory runtime、不建立 GitHub repo、不修改 Gitea、不 sync refs,也不切 GitHub primary。 +## 2.2 AwoooP Outcome Lanes + +| Lane | 何時顯示 | AwoooP 動作 | +|------|----------|-------------| +| `ready_for_owner_review` | 欄位完整、decision 合法、evidence 已脫敏且沒有執行要求 | 顯示可進 owner review | +| `request_more_evidence` | 缺欄位、decision 不合法、scope 不明或 evidence 不完整 | 顯示補證需求 | +| `quarantine_sensitive_payload` | 含 token、secret、cookie、session、private key、DB dump、git object pack 或未脫敏截圖 | 只送 mirror quarantine | +| `reject_execution_request` | 夾帶 repo、refs、workflow、secret、runner、scan 或 runtime 執行要求 | 拒收執行要求 | +| `keep_waiting_owner_response` | 五個 templates 未全部收到可驗收 response | 維持等待 owner response | + +這些 lanes 只決定 AwoooP 顯示與稽核分類,不代表 accepted,也不會啟動 inventory、migration、refs、workflow、secret、runner 或 GitHub primary。 + ## 3. 五個 Response Template | Template | 對應 S4.7 item | 驗收重點 | @@ -99,7 +112,7 @@ S4.7 已定義要問什麼,S4.8 已把它接到 AwoooP approval lane;S4.9 ## 6. AwoooP 可做 1. 顯示 5 個 owner response templates。 -2. 顯示 6 個 intake preflight checks、acceptance checks 與 rejection rules。 +2. 顯示 6 個 intake preflight checks、5 個 outcome lanes、acceptance checks 與 rejection rules。 3. 在 owner response 到來後,只更新 read-only snapshot、matrix、decision table、readiness gate 與 status rollup。 4. 將不完整或可疑 response 放進 mirror quarantine。 5. 持續顯示 `received_response_count=0`、`accepted_response_count=0`,直到真的收到脫敏 response。 diff --git a/docs/security/GITEA-READONLY-INVENTORY-APPROVAL-PACKAGE.md b/docs/security/GITEA-READONLY-INVENTORY-APPROVAL-PACKAGE.md index 4e626cbc6..6e79a4acb 100644 --- a/docs/security/GITEA-READONLY-INVENTORY-APPROVAL-PACKAGE.md +++ b/docs/security/GITEA-READONLY-INVENTORY-APPROVAL-PACKAGE.md @@ -35,7 +35,7 @@ S4.6 已補 `gitea_authenticated_inventory_import_acceptance_v1`,把 owner / S4.7 已補 `gitea_inventory_coverage_attestation_v1`,把 public-only / local remote gap、org/user endpoint、110 internal adjacent source、canonical owner 與 legacy/inaccessible repo disposition 的 owner decision 正式文件化。attestation 只做 scope 判定,不等於 repo migration 或 primary cutover approval。 -S4.9 已補 `gitea_inventory_owner_attestation_response_v1`,把 owner 回覆 S4.7 五個 items 時的必填欄位、intake preflight checks、驗收規則與拒收規則正式文件化。response 通過只代表可更新 read-only matrix / decision table,不等於 read-only inventory 已執行。 +S4.9 已補 `gitea_inventory_owner_attestation_response_v1`,把 owner 回覆 S4.7 五個 items 時的必填欄位、intake preflight checks、outcome lanes、驗收規則與拒收規則正式文件化。response 通過只代表可更新 read-only matrix / decision table,不等於 read-only inventory 已執行。 ## 1. 申請批准的動作 diff --git a/docs/security/GITEA-SERVER-SIDE-INVENTORY-RUNBOOK.md b/docs/security/GITEA-SERVER-SIDE-INVENTORY-RUNBOOK.md index 40b0d7a45..1c5e8119b 100644 --- a/docs/security/GITEA-SERVER-SIDE-INVENTORY-RUNBOOK.md +++ b/docs/security/GITEA-SERVER-SIDE-INVENTORY-RUNBOOK.md @@ -37,7 +37,7 @@ S4.6 已補 `gitea_authenticated_inventory_import_acceptance_v1`:收到 owner S4.7 已補 `gitea_inventory_coverage_attestation_v1`:owner 必須先對 public-only / local remote gap、org/user endpoint、110 internal adjacent source、canonical owner 與 legacy/inaccessible repo disposition 作 scope decision。此 attestation 仍不授權 token 收集、repo 寫入、refs sync 或 primary cutover。 -S4.9 已補 `gitea_inventory_owner_attestation_response_v1`:owner response 必須依 5 個 template 填寫,並先通過 6 個 intake preflight checks 與基本驗收,才能把 S4.7 coverage attestation 視為可審 evidence。此 response 收件包仍不授權 read-only inventory runtime、repo migration 或 primary cutover。 +S4.9 已補 `gitea_inventory_owner_attestation_response_v1`:owner response 必須依 5 個 template 填寫,並先通過 6 個 intake preflight checks、5 個 outcome lanes 與基本驗收,才能把 S4.7 coverage attestation 視為可審 evidence。此 response 收件包仍不授權 read-only inventory runtime、repo migration 或 primary cutover。 ## 1. Public-only 快照指令 diff --git a/docs/security/SECURITY-APPROVAL-GATE.md b/docs/security/SECURITY-APPROVAL-GATE.md index 41c754801..48d2d0fce 100644 --- a/docs/security/SECURITY-APPROVAL-GATE.md +++ b/docs/security/SECURITY-APPROVAL-GATE.md @@ -73,4 +73,4 @@ S3.0 只讓人工批准有一致語言與可稽核格式。 2026-05-17 S4.8 追加:Gitea gate 的批准範圍已改為 owner attestation 先行。`approve_scope` 最多允許補 S4.7 owner coverage attestation、更新 matrix / decision table,並在後續 runtime gate 準備妥當後才可做一次 read-only inventory;仍不得保存 token value、寫 Gitea、建立 GitHub repo、sync refs 或切 primary。 -2026-05-17 S4.9 追加:Gitea gate 現在要求 owner response 依 S4.9 收件包通過 intake preflight checks 與基本驗收後,才可把 S4.7 coverage attestation 視為可審 evidence。此驗收仍只更新 read-only matrix / decision table / readiness gate,不授權 inventory runtime、repo migration 或 GitHub primary。 +2026-05-17 S4.9 追加:Gitea gate 現在要求 owner response 依 S4.9 收件包通過 intake preflight checks、outcome lanes 與基本驗收後,才可把 S4.7 coverage attestation 視為可審 evidence。此驗收仍只更新 read-only matrix / decision table / readiness gate,不授權 inventory runtime、repo migration 或 GitHub primary。 diff --git a/docs/security/SECURITY-APPROVAL-QUEUE.md b/docs/security/SECURITY-APPROVAL-QUEUE.md index 3570cd471..3e02e9cc3 100644 --- a/docs/security/SECURITY-APPROVAL-QUEUE.md +++ b/docs/security/SECURITY-APPROVAL-QUEUE.md @@ -71,4 +71,4 @@ S3.0 開始,人工批准範圍由 `security_approval_gate_v1` 承接。S3.1 2026-05-17 S4.8 追加:Gitea queue item 不新增第 9 筆,而是把既有 `gitea-private-internal-server-side-inventory-2026-05-12` 升級為「S4.7 owner coverage attestation 先行」。AwoooP 應先要求 owner 對 5 個 coverage items 作 scope decision;未完成前不得把 inventory 標記 complete,也不得啟動 read-only token / redacted admin export runtime gate。 -2026-05-17 S4.9 追加:Gitea queue item 仍維持同一筆,新增 owner response 收件包作為 S4.7 的填寫與驗收格式。AwoooP 可顯示 5 個 response templates、6 個 intake preflight checks、8 個 acceptance checks 與 10 個 rejection rules;未收到並驗收 response 前,不得把 owner attestation 視為完成。 +2026-05-17 S4.9 追加:Gitea queue item 仍維持同一筆,新增 owner response 收件包作為 S4.7 的填寫與驗收格式。AwoooP 可顯示 5 個 response templates、6 個 intake preflight checks、5 個 outcome lanes、8 個 acceptance checks 與 10 個 rejection rules;未收到並驗收 response 前,不得把 owner attestation 視為完成。 diff --git a/docs/security/SECURITY-APPROVAL-REVIEW-PACKET.md b/docs/security/SECURITY-APPROVAL-REVIEW-PACKET.md index 6a1693008..31465b37d 100644 --- a/docs/security/SECURITY-APPROVAL-REVIEW-PACKET.md +++ b/docs/security/SECURITY-APPROVAL-REVIEW-PACKET.md @@ -71,4 +71,4 @@ S3.2 只補上「讓人好審」的封包,不提高資安阻力。 2026-05-17 S4.8 追加:Gitea review packet 會顯示 S4.7 的 5 個 owner attestation items、`received_attestation_count=0` 與 `accepted_attestation_count=0`。這讓 reviewer 先判斷 coverage gap 與 scope decision,不會把 read-only inventory approval 誤解成 repo migration 或 GitHub primary approval。 -2026-05-17 S4.9 追加:Gitea review packet 會顯示 S4.9 的 5 個 owner response templates、6 個 intake preflight checks、`received_response_count=0`、8 個 acceptance checks 與 10 個 rejection rules。reviewer 應先看 response 是否可收、需補證、需隔離或需拒收,再看 read-only inventory gate;review packet 仍不代表批准,也不授權執行。 +2026-05-17 S4.9 追加:Gitea review packet 會顯示 S4.9 的 5 個 owner response templates、6 個 intake preflight checks、5 個 outcome lanes、`received_response_count=0`、8 個 acceptance checks 與 10 個 rejection rules。reviewer 應先看 response 是否可審、需補證、需隔離、需拒收或仍需等待,再看 read-only inventory gate;review packet 仍不代表批准,也不授權執行。 diff --git a/docs/security/SECURITY-FOLLOWUP-RUNTIME-GATE.md b/docs/security/SECURITY-FOLLOWUP-RUNTIME-GATE.md index f3079a259..b64adba86 100644 --- a/docs/security/SECURITY-FOLLOWUP-RUNTIME-GATE.md +++ b/docs/security/SECURITY-FOLLOWUP-RUNTIME-GATE.md @@ -64,4 +64,4 @@ S3.4 是「批准後仍不能直接做事」的保險絲。 2026-05-17 S4.8 追加:Gitea follow-up runtime gate 已要求 S4.7 owner coverage attestation 先完成。即使未來 read-only inventory 被批准,仍要先看 public-only / local remote gap、org/user endpoint、110 adjacent source、canonical owner 與 legacy/inaccessible disposition 的 owner decision;未完成前不得執行 inventory。 -2026-05-17 S4.9 追加:Gitea follow-up runtime gate 已要求 S4.9 owner response 通過基本驗收後,才可把 S4.7 owner scope decision 當成 read-only inventory 的前置 evidence。未收到或未驗收 owner response 前,不得執行 inventory,也不得標記 inventory complete。 +2026-05-17 S4.9 追加:Gitea follow-up runtime gate 已要求 S4.9 owner response 通過 preflight、outcome lane 判定與基本驗收後,才可把 S4.7 owner scope decision 當成 read-only inventory 的前置 evidence。未收到或未驗收 owner response 前,不得執行 inventory,也不得標記 inventory complete。 diff --git a/docs/security/SECURITY-MIRROR-DRY-RUN.md b/docs/security/SECURITY-MIRROR-DRY-RUN.md index ba6370110..13fd6aefa 100644 --- a/docs/security/SECURITY-MIRROR-DRY-RUN.md +++ b/docs/security/SECURITY-MIRROR-DRY-RUN.md @@ -24,7 +24,7 @@ | `CHECK_ROUTE_COVERAGE` | 確認 route groups 覆蓋所有 contracts | 不建立 fallback execution route | | `CHECK_ACCEPTANCE_AND_QUARANTINE` | 確認驗收與隔離只處理 mirror payload | 不阻擋 runtime | | `CHECK_PROGRESS_GUARD` | 確認 58% 進度估算只作狀態顯示 | 不把進度當 approval 或 runtime authorization | -| `CHECK_OWNER_RESPONSE_GUARD` | 確認四包 owner response 仍未收到 / 接受,且 S4.9 preflight 只分類可收、補證、隔離或拒收 | 不把 guard pass 當成 repo、refs、workflow、secret、runner、primary 或 runtime 授權 | +| `CHECK_OWNER_RESPONSE_GUARD` | 確認四包 owner response 仍未收到 / 接受,且 S4.9 preflight / outcome lanes 只分類可審、補證、隔離、拒收或等待 | 不把 guard pass 當成 repo、refs、workflow、secret、runner、primary 或 runtime 授權 | | `CHECK_LOW_NOISE_CHANNEL` | 確認 Channel Event 低噪音 | 不對 LOW / MEDIUM 洗版 | | `CONFIRM_NO_RUNTIME_ACTION` | 確認 dry-run 沒有任何 runtime action | 不掃描、不 deploy、不 sync refs | diff --git a/docs/security/SECURITY-MIRROR-READINESS.md b/docs/security/SECURITY-MIRROR-READINESS.md index 971cfee57..61edd433d 100644 --- a/docs/security/SECURITY-MIRROR-READINESS.md +++ b/docs/security/SECURITY-MIRROR-READINESS.md @@ -35,7 +35,7 @@ | Contract | 狀態 | 原因 | 下一步 | |----------|------|------|--------| | `security_finding_v1` | `partial_ready` | 目前只有 Kali sample snapshot,runtime ingestion 尚未啟用 | 先 review `kali-finding-runtime-ingestion-approval-20260513` | -| `gitea_repo_inventory_v1` | `partial_ready` | 目前只有 public-only / blocked endpoint evidence;S4.5 已補認證清冊匯出請求,S4.6 已補匯入驗收契約,S4.7 已補 owner coverage attestation,S4.9 已補 owner response 收件包與 6 個 intake preflight checks;未認證公開範圍 2 個、本機可見 Gitea unique 4 個、覆蓋缺口 2 個、attestation items 5 個、owner response 0 筆 | 先依 S4.9 收到並驗收 S4.7 owner response,再依 S4.5 請求取得脫敏清冊並用 S4.6 驗收 / 拒收 / 隔離;不保存 token value | +| `gitea_repo_inventory_v1` | `partial_ready` | 目前只有 public-only / blocked endpoint evidence;S4.5 已補認證清冊匯出請求,S4.6 已補匯入驗收契約,S4.7 已補 owner coverage attestation,S4.9 已補 owner response 收件包、6 個 intake preflight checks 與 5 個 outcome lanes;未認證公開範圍 2 個、本機可見 Gitea unique 4 個、覆蓋缺口 2 個、attestation items 5 個、owner response 0 筆 | 先依 S4.9 收到並驗收 S4.7 owner response,再依 S4.5 請求取得脫敏清冊並用 S4.6 驗收 / 拒收 / 隔離;不保存 token value | | `coding_task_v1` | `contract_only` | 已有 schema 與 handoff prompt,尚無正式 coding task snapshot | 等 code review 產生實際 task 後再 mirror | ## 2. AwoooP 鏡像目的地 @@ -82,7 +82,7 @@ AwoooP 可以將 ready / partial contracts mirror 到: 14. 再 mirror `security_followup_runtime_gate_v1`,只顯示 runtime gate 準備模板、preflight checks 與 rollback / disable requirement。 15. 再 mirror `source_control_primary_readiness_gate_v1`,只顯示 GitHub primary parity、owner、rollback 與人工批准缺口。 16. 再 mirror `source_control_primary_rollback_adr_v1`,只顯示 7 個 in-scope repo 的 rollback ADR 草案、validation window 與 owner review;不執行 rollback、不切 primary。 -17. 再 mirror `gitea_repo_inventory_v1`、S4.5 認證清冊匯出請求、S4.6 匯入驗收契約、S4.7 owner coverage attestation 與 S4.9 owner response 收件包,只顯示未認證公開範圍 / 本機 evidence 覆蓋缺口、只讀 / 管理脫敏匯出選項、payload 驗收 / 拒收 / 隔離規則、5 個 owner scope decision items、response templates 與 intake preflight checks;不保存 token value、不寫 Gitea、不 sync refs。 +17. 再 mirror `gitea_repo_inventory_v1`、S4.5 認證清冊匯出請求、S4.6 匯入驗收契約、S4.7 owner coverage attestation 與 S4.9 owner response 收件包,只顯示未認證公開範圍 / 本機 evidence 覆蓋缺口、只讀 / 管理脫敏匯出選項、payload 驗收 / 拒收 / 隔離規則、5 個 owner scope decision items、response templates、intake preflight checks 與 outcome lanes;不保存 token value、不寫 Gitea、不 sync refs。 18. 再 mirror `source_control_workflow_secret_name_inventory_v1`、S4.2 local evidence 與 S4.3 redacted export request,只顯示 workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / secret 名稱 inventory 缺口;目前 local evidence 有 4 個 repos、31 個 workflow files、43 個 referenced secret names,export request 有 7 個 repos、5 類 lanes,不保存 secret value。 19. 再 mirror `kali_integration_status_v1` 與 `kali_scan_scope_approval_v1`。 20. 最後再 mirror source-control 其他 contracts。 diff --git a/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md b/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md index 26c8d2a48..50626cba8 100644 --- a/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md +++ b/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md @@ -30,7 +30,7 @@ | Follow-up runtime gate templates | S3.4 已建立;8 個 templates、0 個 active runtime gates | | GitHub primary readiness gate | S4.0 已建立;8 個 candidate repos、7 個 in-scope blocked、0 個 primary ready;S4.10 已補 GitHub target owner decision response 收件包,7 個 response templates、owner response 0 筆;S4.11 已補 refs truth owner response 收件包,5 個 response templates、owner response 0 筆;S4.12 已補 workflow / secret 名稱 owner response 收件包,5 個 response templates、owner response 0 筆;S4.13 已補四包 owner response validation rollup,22 個 templates、received / accepted / rejected 皆為 0 | | GitHub primary rollback ADR | S4.4 已建立;7 個 in-scope rollback drafts、0 個 owner approved、0 個 dry-run completed、0 個 active cutover | -| Gitea inventory | S4.5 已補認證清冊匯出請求;S4.6 已補匯入驗收契約;S4.7 已補 owner coverage attestation;S4.8 已把既有 Gitea queue/gate/review packet/follow-up gate 對齊 attestation 先行;S4.9 已補 owner response 收件包與 6 個 intake preflight checks;目前 status=`partial_waiting_authenticated_inventory`、未認證公開範圍 repos 2 個、本機可見 Gitea unique repos 4 個、匯出來源選項 2 類、匯入驗收 payload 0 筆、owner attestation items 5 個、收到 attestation 0 筆、owner response 0 筆、敏感 payload 必須隔離、允許收集 token value=false | +| Gitea inventory | S4.5 已補認證清冊匯出請求;S4.6 已補匯入驗收契約;S4.7 已補 owner coverage attestation;S4.8 已把既有 Gitea queue/gate/review packet/follow-up gate 對齊 attestation 先行;S4.9 已補 owner response 收件包、6 個 intake preflight checks 與 5 個 outcome lanes;目前 status=`partial_waiting_authenticated_inventory`、未認證公開範圍 repos 2 個、本機可見 Gitea unique repos 4 個、匯出來源選項 2 類、匯入驗收 payload 0 筆、owner attestation items 5 個、收到 attestation 0 筆、owner response 0 筆、敏感 payload 必須隔離、允許收集 token value=false | | Workflow / secret name inventory | S4.1 已建立;S4.2 補 4 個 repos、31 個 workflow files、43 個 referenced secret names 的 local evidence;S4.3 補 7 個 repos、5 類 lanes 的 redacted export request;S4.12 補 5 個 owner response templates;0 個 inventory complete、禁止收集 secret value、禁止 write token | | Owner response validation | S4.13 已建立;四包 owner response 目前 received/accepted 皆為 0;4 條 missing response lanes、4 步 collection order 與 next collection candidate 可供 AwoooP 直接顯示;下一個建議收件為 S4.9 Gitea owner attestation;latest local validation 為 `SOURCE_CONTROL_OWNER_RESPONSE_GUARD_OK`,不代表 owner response 已收到或任何執行授權 | | Dry-run | `contract_defined_not_executed`;已納入 `CHECK_PROGRESS_GUARD` 與 `CHECK_OWNER_RESPONSE_GUARD`,latest local validation 為 `repo_snapshot_guard_pass`,仍不代表 production ingestion | diff --git a/docs/security/SECURITY-SUPPLY-CHAIN-CONTRACT-MANIFEST.md b/docs/security/SECURITY-SUPPLY-CHAIN-CONTRACT-MANIFEST.md index 81a3741c5..0b8418d5c 100644 --- a/docs/security/SECURITY-SUPPLY-CHAIN-CONTRACT-MANIFEST.md +++ b/docs/security/SECURITY-SUPPLY-CHAIN-CONTRACT-MANIFEST.md @@ -39,7 +39,7 @@ | `security_mirror_status_rollup_v1` | mirror-only | AwoooP / Security Supply Chain 跨 Session 狀態總覽;S4.13 owner response validation rollup 與 next collection candidate | `security-mirror-status-rollup.snapshot.json` / `source-control-owner-response-validation-rollup.snapshot.json` | | `coding_task_v1` | suggest-only | Code Review 接 Codex patch-only | 無正式 snapshot | | `source_control_migration_event_v1` | mirror-only | Gitea/GitHub refs 差異 | `gitea-github-awoooi`、`clawbot-v5`、`wooo-aiops` | -| `gitea_repo_inventory_v1` | mirror-only | Gitea repo inventory;S4.5 已補認證清冊匯出請求,S4.6 已補匯入驗收契約,S4.7 已補 owner coverage attestation,S4.9 已補 owner response 收件包與 intake preflight checks | public-only / blocked endpoint / S4.5 export request / S4.6 import acceptance / S4.7 coverage attestation / S4.9 response snapshots | +| `gitea_repo_inventory_v1` | mirror-only | Gitea repo inventory;S4.5 已補認證清冊匯出請求,S4.6 已補匯入驗收契約,S4.7 已補 owner coverage attestation,S4.9 已補 owner response 收件包、intake preflight checks 與 outcome lanes | public-only / blocked endpoint / S4.5 export request / S4.6 import acceptance / S4.7 coverage attestation / S4.9 response snapshots | | `local_git_remote_inventory_v1` | mirror-only | 本機 remote coverage | `local-git-remote-inventory.snapshot.json` | | `github_target_probe_v1` | mirror-only | GitHub target visibility | `github-target-probe.snapshot.json` | | `github_target_decision_v1` | mirror-only | GitHub target 決策;S4.10 已補 owner decision response 收件包 | `github-target-decision.snapshot.json` / `github-target-owner-decision-response.snapshot.json` | @@ -62,7 +62,7 @@ 3. 將 snapshot mirror 成 Runtime State / Channel Event / Audit evidence。 4. 讀到 `source-control-ref-truth-owner-response.snapshot.json` 時,只顯示 S4.11 response templates、acceptance checks 與 rejection rules;不得新增 refs action。 5. 讀到 `source-control-owner-response-validation-rollup.snapshot.json` 時,只顯示 S4.9/S4.10/S4.11/S4.12 四個 response packets 的總覽:22 個 templates、received / accepted / rejected 皆為 0、cross-packet checks 10 個;不得把 rollup 當成 approval 或 execution authorization。 -6. 只對 `approval_required_event_v1`、repo approval package、`security_approval_review_packet_v1`、`security_approval_state_transition_v1`、`security_followup_runtime_gate_v1`、`source_control_primary_readiness_gate_v1`、`source_control_primary_rollback_adr_v1` 與 `source_control_workflow_secret_name_inventory_v1` 建 approval candidate / review lane / next-state display / runtime gate preparation / primary readiness display / rollback ADR display / workflow-secret name inventory gate / redacted export request display;`github_target_decision_v1` 只能顯示 S4.10 owner decision response templates、received_response_count=0、acceptance checks 與 rejection rules,不得觸發 repo creation、visibility change、refs sync 或 primary switch;`gitea_repo_inventory_v1` 只能顯示 S4.5 認證匯出請求、S4.6 匯入驗收契約、S4.7 owner coverage attestation request、S4.9 owner response 收件包、intake preflight checks 與覆蓋缺口,不得觸發 token collection 或 Gitea write。 +6. 只對 `approval_required_event_v1`、repo approval package、`security_approval_review_packet_v1`、`security_approval_state_transition_v1`、`security_followup_runtime_gate_v1`、`source_control_primary_readiness_gate_v1`、`source_control_primary_rollback_adr_v1` 與 `source_control_workflow_secret_name_inventory_v1` 建 approval candidate / review lane / next-state display / runtime gate preparation / primary readiness display / rollback ADR display / workflow-secret name inventory gate / redacted export request display;`github_target_decision_v1` 只能顯示 S4.10 owner decision response templates、received_response_count=0、acceptance checks 與 rejection rules,不得觸發 repo creation、visibility change、refs sync 或 primary switch;`gitea_repo_inventory_v1` 只能顯示 S4.5 認證匯出請求、S4.6 匯入驗收契約、S4.7 owner coverage attestation request、S4.9 owner response 收件包、intake preflight checks、outcome lanes 與覆蓋缺口,不得觸發 token collection 或 Gitea write。 7. 不新增執行按鈕,不做 runtime enforcement。 ## 3. 永久禁止 diff --git a/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md b/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md index c752abab7..72359d118 100644 --- a/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md +++ b/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md @@ -65,7 +65,7 @@ python3 scripts/security/security-mirror-progress-guard.py | S4.6 Gitea 認證清冊匯入驗收契約 | 完成草案 | 已建立匯入驗收 schema / snapshot / 人讀版;目前 received payload 0、accepted 0、rejected 0;定義 10 個驗收檢查、10 個拒收規則與 4 個 quarantine lanes | owner 提供脫敏 payload 後先驗收 / 拒收 / 隔離;仍不可把驗收當 primary approval | | S4.7 Gitea 清冊覆蓋 Owner Attestation | 完成草案 | 已建立 coverage attestation schema / snapshot / 人讀版;5 個 owner decision items、received attestation 0、accepted 0、execution authorized=false | owner 判定 public-only / local remote gap、org/user endpoint、110 adjacent source、canonical owner 與 legacy/inaccessible disposition;仍不可把 attestation 當 migration approval | | S4.8 Gitea Owner Attestation Approval Lane 對齊 | 完成草案 | 已將既有 Gitea approval queue / gate / review packet / follow-up runtime gate 對齊 S4.7 先行條件;queue items 維持 8、review packets 維持 8、active runtime gates 維持 0 | AwoooP 先顯示 5 個 attestation items,owner decision 接受前不得執行 read-only inventory 或標記 complete | -| S4.9 Gitea Owner Attestation Response 收件包 | 完成草案 | 已建立 owner response schema / snapshot / 人讀版;5 個 response templates、6 個 intake preflight checks、8 個 acceptance checks、10 個 rejection rules、received response 0、accepted 0、execution authorized=false | owner 依模板回覆 S4.7 五個 items;AwoooP 先用 preflight 判斷可收、補證、隔離或拒收;response 通過只更新 read-only matrix / decision table / readiness gate,不代表 inventory 執行或 primary approval | +| S4.9 Gitea Owner Attestation Response 收件包 | 完成草案 | 已建立 owner response schema / snapshot / 人讀版;5 個 response templates、6 個 intake preflight checks、5 個 outcome lanes、8 個 acceptance checks、10 個 rejection rules、received response 0、accepted 0、execution authorized=false | owner 依模板回覆 S4.7 五個 items;AwoooP 先用 preflight / outcome lanes 判斷可審、補證、隔離、拒收或等待;response 通過只更新 read-only matrix / decision table / readiness gate,不代表 inventory 執行或 primary approval | | S4.10 GitHub Target Owner Decision Response 收件包 | 完成草案 | 已建立 owner decision response schema / snapshot / 人讀版;7 個 response templates、8 個 acceptance checks、10 個 rejection rules、received response 0、accepted 0、execution authorized=false | owner 依模板回覆 7 個 GitHub target 的 owner / visibility / canonical;response 通過只更新 read-only decision table / approval package / approval board / readiness gate,不代表 repo creation、visibility change、refs sync 或 primary approval | | S4.11 Source Control Ref Truth Owner Response 收件包 | 完成草案 | 已建立 owner response schema / snapshot / 人讀版;5 個 response templates、8 個 acceptance checks、10 個 rejection rules、total ref review items 141、received response 0、accepted 0、execution authorized=false | owner 依模板回覆 main/dev truth、deprecated drift、release tag、GitHub-only refs;response 通過只更新 read-only classification / reconcile / readiness wording,不代表 refs sync、delete、force push 或 primary approval | | S4 migration execution | 未開始 | GitHub primary 長期方向已確認,但 refs / tags / workflow / secret 名稱尚未全量驗證,rollback ADR 仍待 owner approval | SHA/tag/workflow parity、rollback ADR owner approval 與 runtime gate | diff --git a/docs/security/SOURCE-CONTROL-OWNER-RESPONSE-VALIDATION-ROLLUP.md b/docs/security/SOURCE-CONTROL-OWNER-RESPONSE-VALIDATION-ROLLUP.md index 775cf589f..2e57b1e08 100644 --- a/docs/security/SOURCE-CONTROL-OWNER-RESPONSE-VALIDATION-ROLLUP.md +++ b/docs/security/SOURCE-CONTROL-OWNER-RESPONSE-VALIDATION-ROLLUP.md @@ -92,7 +92,7 @@ S4.13 不新增第 36 個主 contract,不新增 approval item,不啟用 runt `next_collection_candidate` 只讓 AwoooP Operator Console 顯示「現在先收 S4.9」。它不是批准、不是執行排程,也不是後續 S4.10 / S4.11 / S4.12 已可接受的訊號。 -AwoooP 顯示 S4.9 時,應同步讀取 `gitea-inventory-owner-attestation-response.snapshot.json` 的 6 個 intake preflight checks;preflight 只分類可收、補證、隔離或拒收,不代表 owner response accepted。 +AwoooP 顯示 S4.9 時,應同步讀取 `gitea-inventory-owner-attestation-response.snapshot.json` 的 6 個 intake preflight checks 與 5 個 outcome lanes;preflight / outcome 只分類可審、補證、隔離、拒收或等待,不代表 owner response accepted。 ## 3. Cross-Packet 驗收規則 diff --git a/docs/security/SOURCE-CONTROL-PRIMARY-READINESS-GATE.md b/docs/security/SOURCE-CONTROL-PRIMARY-READINESS-GATE.md index 7e7718581..f603e2f00 100644 --- a/docs/security/SOURCE-CONTROL-PRIMARY-READINESS-GATE.md +++ b/docs/security/SOURCE-CONTROL-PRIMARY-READINESS-GATE.md @@ -71,6 +71,6 @@ S4.0 只是把「切換前一定要看見什麼」先定義清楚。 -S4.4 已補上 rollback ADR 草案,但它只是 owner review 的資料包,不是切換批准。S4.7 已補上 Gitea coverage owner attestation,S4.9 已補上 Gitea owner response 收件包,S4.10 已補上 GitHub target owner decision response 收件包,S4.11 已補上 refs truth owner response 收件包,S4.12 已補上 workflow / secret 名稱 owner response 收件包,S4.13 已補上四包 owner response validation rollup;它們只是 scope decision、response 收件與驗收框架,不是 migration approval、repo creation approval、visibility change approval、refs sync approval、delete approval、force-push approval、secret value collection approval、workflow modification approval 或 primary approval。`owner_approved_count=0`、`dry_run_completed_count=0`、`active_cutover_count=0`。 +S4.4 已補上 rollback ADR 草案,但它只是 owner review 的資料包,不是切換批准。S4.7 已補上 Gitea coverage owner attestation,S4.9 已補上 Gitea owner response 收件包、preflight 與 outcome lanes,S4.10 已補上 GitHub target owner decision response 收件包,S4.11 已補上 refs truth owner response 收件包,S4.12 已補上 workflow / secret 名稱 owner response 收件包,S4.13 已補上四包 owner response validation rollup;它們只是 scope decision、response 收件與驗收框架,不是 migration approval、repo creation approval、visibility change approval、refs sync approval、delete approval、force-push approval、secret value collection approval、workflow modification approval 或 primary approval。`owner_approved_count=0`、`dry_run_completed_count=0`、`active_cutover_count=0`。 這讓長期回到 GitHub 的方向可以繼續往前,但仍維持低摩擦:目前只 mirror、只顯示、只留痕,不執行。 diff --git a/docs/security/gitea-inventory-owner-attestation-response.snapshot.json b/docs/security/gitea-inventory-owner-attestation-response.snapshot.json index 8cb88ca23..e4541f77e 100644 --- a/docs/security/gitea-inventory-owner-attestation-response.snapshot.json +++ b/docs/security/gitea-inventory-owner-attestation-response.snapshot.json @@ -23,6 +23,7 @@ "rejected_response_count": 0, "response_template_count": 5, "intake_preflight_check_count": 6, + "intake_outcome_lane_count": 5, "acceptance_check_count": 8, "rejection_rule_count": 10, "token_value_collection_allowed": false, @@ -301,6 +302,113 @@ "execution_authorized": false } ], + "intake_outcome_lanes": [ + { + "lane_id": "ready_for_owner_review", + "display_order": 1, + "title": "可進 owner review", + "when": "response 對應已知 S4.7 item、必填欄位完整、decision 在允許值內、evidence refs 已脫敏,且沒有執行要求。", + "awooop_action": "display_ready_for_owner_review", + "allowed_outputs": [ + "顯示 ready for owner review", + "把 response 保持在 review packet", + "等待 reviewer 判斷是否進入 acceptance checks" + ], + "still_forbidden": [ + "mark_response_accepted_without_acceptance_checks", + "execute_inventory", + "create_github_repo", + "sync_refs", + "switch_github_primary" + ], + "execution_authorized": false, + "not_approval": true + }, + { + "lane_id": "request_more_evidence", + "display_order": 2, + "title": "要求補證", + "when": "response 缺必填欄位、decision 不在允許值內、scope 不明確,或只提供口頭同意 / 不完整 metadata。", + "awooop_action": "display_request_more_evidence", + "allowed_outputs": [ + "顯示 request more evidence", + "列出缺少欄位或需修正 decision", + "維持 received / accepted response count 不變" + ], + "still_forbidden": [ + "accept_partial_response", + "execute_inventory", + "create_github_repo", + "sync_refs", + "switch_github_primary" + ], + "execution_authorized": false, + "not_approval": true + }, + { + "lane_id": "quarantine_sensitive_payload", + "display_order": 3, + "title": "隔離敏感 payload", + "when": "response 或 evidence refs 含 token、secret、cookie、session、private key、DB dump、git object pack、私有 URL 憑證或未脫敏截圖。", + "awooop_action": "route_to_mirror_quarantine", + "allowed_outputs": [ + "顯示 quarantine required", + "只保存隔離 metadata 與 redacted reason", + "要求 owner 重新提供脫敏 evidence" + ], + "still_forbidden": [ + "store_sensitive_value", + "sanitize_and_accept_in_place", + "execute_inventory", + "sync_refs", + "switch_github_primary" + ], + "execution_authorized": false, + "not_approval": true + }, + { + "lane_id": "reject_execution_request", + "display_order": 4, + "title": "拒收執行要求", + "when": "response 要求 Gitea/GitHub 寫入、repo 建立、visibility 修改、refs sync/delete/force-push、workflow/secret/runner 變更、scan 或 runtime action。", + "awooop_action": "reject_execution_request", + "allowed_outputs": [ + "顯示 rejected execution request", + "保留拒收原因", + "要求 owner 改交只讀 scope / evidence response" + ], + "still_forbidden": [ + "run_requested_action", + "create_github_repo", + "write_gitea_repo", + "sync_refs", + "switch_github_primary" + ], + "execution_authorized": false, + "not_approval": true + }, + { + "lane_id": "keep_waiting_owner_response", + "display_order": 5, + "title": "維持等待 owner response", + "when": "五個 response templates 尚未全部收到可驗收 response,或部分 response 仍在補證 / 隔離 / 拒收狀態。", + "awooop_action": "keep_waiting_owner_response", + "allowed_outputs": [ + "顯示 waiting owner response", + "顯示尚未覆蓋的 S4.7 items", + "維持 S4.13 next_collection_candidate 指向 S4.9" + ], + "still_forbidden": [ + "mark_s4_9_complete", + "advance_s4_10_acceptance", + "execute_inventory", + "sync_refs", + "switch_github_primary" + ], + "execution_authorized": false, + "not_approval": true + } + ], "acceptance_checks": [ { "check_id": "maps_to_known_s4_7_item", diff --git a/docs/security/security-approval-gate.snapshot.json b/docs/security/security-approval-gate.snapshot.json index 7dd22355c..c511aa898 100644 --- a/docs/security/security-approval-gate.snapshot.json +++ b/docs/security/security-approval-gate.snapshot.json @@ -98,7 +98,7 @@ ], "decision_options": ["approve_scope", "reject", "defer", "request_more_evidence"], "allowed_after_approval": [ - "先依 S4.9 收到並完成 preflight / 驗收 S4.7 owner coverage attestation response,保留 scope decision evidence", + "先依 S4.9 收到並完成 preflight / outcome lane 判定 / 驗收 S4.7 owner coverage attestation response,保留 scope decision evidence", "使用 read-only token 或 redacted admin export 補齊 repo list", "只保存 token_present=true/false", "更新 migration matrix 與 repo decision table" diff --git a/docs/security/security-approval-queue.snapshot.json b/docs/security/security-approval-queue.snapshot.json index ca35d7d81..2b6ff6e26 100644 --- a/docs/security/security-approval-queue.snapshot.json +++ b/docs/security/security-approval-queue.snapshot.json @@ -101,7 +101,7 @@ "docs/security/GITEA-AUTHENTICATED-INVENTORY-IMPORT-ACCEPTANCE.md" ], "allowed_after_approval": [ - "先依 S4.9 收到並完成 preflight / 驗收 S4.7 owner coverage attestation response,更新 migration matrix 與 decision table", + "先依 S4.9 收到並完成 preflight / outcome lane 判定 / 驗收 S4.7 owner coverage attestation response,更新 migration matrix 與 decision table", "使用 read-only token 或 redacted admin export 執行一次 inventory", "只保存 token_present=true/false", "更新 migration matrix 與 repo decision table" diff --git a/docs/security/security-approval-review-packet.snapshot.json b/docs/security/security-approval-review-packet.snapshot.json index a4fef15c3..c4a999373 100644 --- a/docs/security/security-approval-review-packet.snapshot.json +++ b/docs/security/security-approval-review-packet.snapshot.json @@ -127,12 +127,12 @@ "allowed_pre_decision_actions": [ "顯示 public-only 與 blocked endpoint evidence", "顯示 S4.7 的 5 個 owner attestation items 與 received_attestation_count=0", - "顯示 S4.9 的 5 個 owner response templates、6 個 intake preflight checks、received_response_count=0 與 rejection rules", + "顯示 S4.9 的 5 個 owner response templates、6 個 intake preflight checks、5 個 outcome lanes、received_response_count=0 與 rejection rules", "要求 owner 確認 read-only token 或 redacted export 來源", "不保存 token value" ], "allowed_after_decision_actions": [ - "若 approve_scope,先依 S4.9 收到並完成 preflight / 驗收 S4.7 owner response,再更新 attestation evidence 與 scope decision", + "若 approve_scope,先依 S4.9 收到並完成 preflight / outcome lane 判定 / 驗收 S4.7 owner response,再更新 attestation evidence 與 scope decision", "若 approve_scope,只能做一次 read-only inventory 或匯入 redacted export", "更新 migration matrix 與 repo decision table" ], diff --git a/docs/security/security-followup-runtime-gate.snapshot.json b/docs/security/security-followup-runtime-gate.snapshot.json index c108a48fd..e6d3a9053 100644 --- a/docs/security/security-followup-runtime-gate.snapshot.json +++ b/docs/security/security-followup-runtime-gate.snapshot.json @@ -112,7 +112,7 @@ "gate_state": "waiting_approved_scope", "applies_after_decision": "approve_scope", "minimum_required_evidence": [ - "S4.9 owner response 已完成 intake preflight 與驗收,且 S4.7 owner coverage attestation 的 5 個 items 都有 scope decision", + "S4.9 owner response 已完成 intake preflight、outcome lane 判定與驗收,且 S4.7 owner coverage attestation 的 5 個 items 都有 scope decision", "read-only token scope 或 redacted admin export 來源", "token_present=true/false,不保存 token value", "allowed export fields checklist", diff --git a/docs/security/security-mirror-dry-run.snapshot.json b/docs/security/security-mirror-dry-run.snapshot.json index 1cac763f7..c5ad10205 100644 --- a/docs/security/security-mirror-dry-run.snapshot.json +++ b/docs/security/security-mirror-dry-run.snapshot.json @@ -107,7 +107,7 @@ }, { "step_id": "CHECK_OWNER_RESPONSE_GUARD", - "expected_observation": "AwoooP dry-run 必須確認 S4.9 / S4.10 / S4.11 / S4.12 四包 owner response 仍為 waiting_owner_response,received / accepted 皆為 0,且 S4.9 intake preflight 只分類可收、補證、隔離或拒收,不能解鎖 repo、refs、workflow、secret、runner、GitHub primary 或 runtime action。", + "expected_observation": "AwoooP dry-run 必須確認 S4.9 / S4.10 / S4.11 / S4.12 四包 owner response 仍為 waiting_owner_response,received / accepted 皆為 0,且 S4.9 intake preflight / outcome lanes 只分類可審、補證、隔離、拒收或等待,不能解鎖 repo、refs、workflow、secret、runner、GitHub primary 或 runtime action。", "evidence_refs": [ "docs/security/source-control-owner-response-validation-rollup.snapshot.json", "docs/security/SOURCE-CONTROL-OWNER-RESPONSE-VALIDATION-ROLLUP.md", diff --git a/docs/security/security-mirror-readiness.snapshot.json b/docs/security/security-mirror-readiness.snapshot.json index b80b69dff..2cef94af0 100644 --- a/docs/security/security-mirror-readiness.snapshot.json +++ b/docs/security/security-mirror-readiness.snapshot.json @@ -251,7 +251,7 @@ "docs/security/GITEA-INVENTORY-COVERAGE-ATTESTATION.md", "docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md" ], - "notes": "目前仍是 public-only / blocked endpoint evidence;S4.5 已補 authenticated/admin export request,S4.6 已補 redacted import acceptance,S4.7 已補 owner coverage attestation request,S4.9 已補 owner response intake packet 與 6 個 intake preflight checks;private/internal 全量需 approval、脫敏 payload 驗收與 owner scope decision。" + "notes": "目前仍是 public-only / blocked endpoint evidence;S4.5 已補 authenticated/admin export request,S4.6 已補 redacted import acceptance,S4.7 已補 owner coverage attestation request,S4.9 已補 owner response intake packet、6 個 intake preflight checks 與 5 個 outcome lanes;private/internal 全量需 approval、脫敏 payload 驗收與 owner scope decision。" }, { "contract": "local_git_remote_inventory_v1", diff --git a/docs/security/security-mirror-status-rollup.snapshot.json b/docs/security/security-mirror-status-rollup.snapshot.json index f8e6e0f5c..1cd92d4ca 100644 --- a/docs/security/security-mirror-status-rollup.snapshot.json +++ b/docs/security/security-mirror-status-rollup.snapshot.json @@ -143,7 +143,7 @@ { "phase_id": "S4_migration_execution", "state": "not_started", - "current_result": "GitHub primary 是長期方向;source_control_primary_readiness_gate_v1 已定義 8 個 candidate repos、7 個 in-scope blocked repos、0 個 primary ready;S4.1 已定義 workflow / secret 名稱 inventory 契約;S4.2 已補 local evidence;S4.3 已補 redacted export request;S4.4 已補 rollback ADR 草案;S4.5 已補 Gitea authenticated inventory export request;S4.6 已補 redacted import acceptance;S4.7 已補 owner coverage attestation request;S4.9 已補 Gitea owner response intake packet 與 6 個 intake preflight checks;S4.10 已補 GitHub target owner decision response intake packet;S4.11 已補 refs truth owner response intake packet;S4.12 已補 workflow / secret 名稱 owner response intake packet;S4.13 已補四包 owner response validation rollup,彙整 22 個 templates、received=0、accepted=0,並標示 next_collection_candidate=S4.9,但 inventory status 仍 partial,GitHub target / refs truth / workflow-secret response 仍 0 筆。", + "current_result": "GitHub primary 是長期方向;source_control_primary_readiness_gate_v1 已定義 8 個 candidate repos、7 個 in-scope blocked repos、0 個 primary ready;S4.1 已定義 workflow / secret 名稱 inventory 契約;S4.2 已補 local evidence;S4.3 已補 redacted export request;S4.4 已補 rollback ADR 草案;S4.5 已補 Gitea authenticated inventory export request;S4.6 已補 redacted import acceptance;S4.7 已補 owner coverage attestation request;S4.9 已補 Gitea owner response intake packet、6 個 intake preflight checks 與 5 個 outcome lanes;S4.10 已補 GitHub target owner decision response intake packet;S4.11 已補 refs truth owner response intake packet;S4.12 已補 workflow / secret 名稱 owner response intake packet;S4.13 已補四包 owner response validation rollup,彙整 22 個 templates、received=0、accepted=0,並標示 next_collection_candidate=S4.9,但 inventory status 仍 partial,GitHub target / refs truth / workflow-secret response 仍 0 筆。", "next_gate": "依 S4.13 先集中檢查四包 owner response validation 狀態,AwoooP 只顯示 next_collection_candidate=S4.9 Gitea owner attestation;再依 S4.9 收到並驗收 S4.7 Gitea owner response、依 S4.10 收到並驗收 7 個 GitHub target owner / visibility / canonical response、依 S4.11 收到並驗收 5 個 refs truth owner response templates、依 S4.12 收到並驗收 5 個 workflow / secret 名稱 owner response templates、authenticated inventory payload 通過 S4.6 驗收、rollback ADR owner approval 與逐 repo 人工批准。" } ], @@ -254,7 +254,7 @@ "allowed_processing": [ "顯示 S4.5 authenticated/admin export request、S4.6 redacted import acceptance、S4.7 owner coverage attestation request 與 coverage gap", "顯示 5 個 owner attestation items、received_attestation_count=0 與 accepted_attestation_count=0", - "顯示 S4.9 owner response templates、intake preflight checks、received_response_count=0 與 rejection rules", + "顯示 S4.9 owner response templates、intake preflight checks、outcome lanes、received_response_count=0 與 rejection rules", "在 security_approval_queue_v1、security_approval_gate_v1、security_approval_review_packet_v1 與 security_followup_runtime_gate_v1 中顯示 S4.7 owner attestation 先行條件", "使用 read-only token 或 redacted admin export 補齊 repo list", "收到 payload 後只做 schema / redaction / coverage gap 驗收與隔離", diff --git a/docs/security/security-supply-chain-contract-manifest.snapshot.json b/docs/security/security-supply-chain-contract-manifest.snapshot.json index 5a989738d..f2bae8398 100644 --- a/docs/security/security-supply-chain-contract-manifest.snapshot.json +++ b/docs/security/security-supply-chain-contract-manifest.snapshot.json @@ -408,7 +408,7 @@ "display_owner_attestation_response_packet" ], "forbidden_actions": ["store_token_value", "write_to_gitea", "delete_or_archive_repo"], - "notes": "目前是 partial/public_only;S4.5 已補 authenticated/admin export request,S4.6 已補 redacted import acceptance,S4.7 已補 owner coverage attestation request,S4.9 已補 owner response intake packet 與 6 個 intake preflight checks;private/internal 全量仍需批准後補齊。" + "notes": "目前是 partial/public_only;S4.5 已補 authenticated/admin export request,S4.6 已補 redacted import acceptance,S4.7 已補 owner coverage attestation request,S4.9 已補 owner response intake packet、6 個 intake preflight checks 與 5 個 outcome lanes;private/internal 全量仍需批准後補齊。" }, { "contract": "local_git_remote_inventory_v1", diff --git a/docs/security/source-control-primary-readiness-gate.snapshot.json b/docs/security/source-control-primary-readiness-gate.snapshot.json index 1f78e4b64..dcb01e0e5 100644 --- a/docs/security/source-control-primary-readiness-gate.snapshot.json +++ b/docs/security/source-control-primary-readiness-gate.snapshot.json @@ -51,7 +51,7 @@ "S4.5 已建立 authenticated/admin export request,但尚未取得 `gitea_repo_inventory_v1.status=ok` evidence", "S4.6 已建立 redacted import acceptance,但目前 received_payload_count=0、accepted_payload_count=0", "S4.7 已建立 owner coverage attestation request,但目前 received_attestation_count=0、accepted_attestation_count=0", - "S4.9 已建立 owner response 收件包與 6 個 intake preflight checks,但目前 received_response_count=0、accepted_response_count=0", + "S4.9 已建立 owner response 收件包、6 個 intake preflight checks 與 5 個 outcome lanes,但目前 received_response_count=0、accepted_response_count=0", "S4.13 validation rollup 已將 S4.9 納入四包 owner response 驗收總覽,但目前 total_received_response_count=0、total_accepted_response_count=0", "public-only API 只看到 2 個 repos,本機 remote inventory 看到 4 個 unique Gitea repos,gap 仍待 owner 解釋", "GITEA_READONLY_TOKEN 未提供", @@ -62,7 +62,7 @@ "mirror S4.5 authenticated inventory export request", "mirror S4.6 redacted inventory import acceptance", "mirror S4.7 owner coverage attestation request", - "mirror S4.9 owner attestation response templates 與 intake preflight checks", + "mirror S4.9 owner attestation response templates、intake preflight checks 與 outcome lanes", "mirror S4.13 owner response validation rollup", "等待 read-only token 或 redacted admin export", "更新 approval board 與 decision table" diff --git a/scripts/security/source-control-owner-response-guard.py b/scripts/security/source-control-owner-response-guard.py index 2a8421573..f7c798346 100755 --- a/scripts/security/source-control-owner-response-guard.py +++ b/scripts/security/source-control-owner-response-guard.py @@ -34,6 +34,13 @@ LANES = [ "preflight-no-execution-request", "preflight-all-five-items-before-accepted", ], + "expected_outcome_lanes": [ + "ready_for_owner_review", + "request_more_evidence", + "quarantine_sensitive_payload", + "reject_execution_request", + "keep_waiting_owner_response", + ], }, { "lane_id": "s4_10_github_target_owner_decision_response", @@ -187,6 +194,30 @@ def validate(root: Path) -> None: f"{lane['lane_id']}.{item['check_id']}.execution_authorized", item["execution_authorized"], ) + expected_outcome_lanes = lane.get("expected_outcome_lanes") + if expected_outcome_lanes is not None: + intake_outcome_lanes = snapshot["intake_outcome_lanes"] + assert_equal( + f"{lane['lane_id']}.intake_outcome_lane_count", + summary["intake_outcome_lane_count"], + len(expected_outcome_lanes), + ) + assert_equal( + f"{lane['lane_id']}.intake_outcome_lane_ids", + [item["lane_id"] for item in intake_outcome_lanes], + expected_outcome_lanes, + ) + assert_equal( + f"{lane['lane_id']}.intake_outcome_display_order", + [item["display_order"] for item in intake_outcome_lanes], + list(range(1, len(expected_outcome_lanes) + 1)), + ) + for item in intake_outcome_lanes: + assert_false( + f"{lane['lane_id']}.{item['lane_id']}.execution_authorized", + item["execution_authorized"], + ) + assert_true(f"{lane['lane_id']}.{item['lane_id']}.not_approval", item["not_approval"]) assert_false(f"{lane['lane_id']}.runtime_execution_authorized", snapshot["runtime_execution_authorized"]) assert_false(f"{lane['lane_id']}.rollup_execution_authorized", rollup_lane["execution_authorized"]) assert_equal(