docs(security): add gitea owner response preflight

This commit is contained in:
Your Name
2026-05-18 09:55:48 +08:00
parent 68e0cd7b2e
commit 835820b58b
27 changed files with 197 additions and 27 deletions

View File

@@ -1,3 +1,18 @@
## 2026-05-18 | 資安供應鏈 S4.9Owner Response Intake Preflight
**背景**S4.13 已把下一個建議收件固定為 S4.9;本輪補強 S4.9 本身的收件前檢查,讓 AwoooP 在 owner response 到來時先判斷可收、補證、隔離或拒收,而不是直接推進 inventory / migration。
**完成**
- `gitea_inventory_owner_attestation_response_v1` schema 新增 optional `intake_preflight_checks`summary 新增 `intake_preflight_check_count`
- `gitea-inventory-owner-attestation-response.snapshot.json` 新增 6 個 preflight checks已知 item、必填欄位、允許 decision、脫敏 evidence、不得夾帶執行要求、接受前覆蓋五個 items。
- `source-control-owner-response-guard.py` 反查 S4.9 preflight count、id 順序、display order 與 `execution_authorized=false`
- 更新 S4.9 人讀文件、AwoooP checklist、readiness、manifest、status rollup、approval queue / gate / review packet、follow-up runtime gate、primary readiness gate、runbook 與 progress。
**仍禁止**
- 不把 preflight pass 當成 owner response accepted。
- 不把 owner response 當成 read-only inventory runtime、repo migration、refs sync、GitHub primary 或 Gitea 停用批准。
- 不收 token value、secret value、private key、cookie、session、DB dump、git object pack 或未脫敏 payload。
## 2026-05-18 | 資安供應鏈 S4.13Next Collection Candidate
**背景**S4.13 已有 4 條 missing response lanes 與 4 步 collection order本輪補上單一 `next_collection_candidate`,讓 AwoooP 只顯示下一包建議收件,而不是把整串順序誤讀成 approval queue 或 execution queue。

View File

@@ -61,6 +61,7 @@
"accepted_response_count",
"rejected_response_count",
"response_template_count",
"intake_preflight_check_count",
"acceptance_check_count",
"rejection_rule_count",
"token_value_collection_allowed",
@@ -80,6 +81,7 @@
"accepted_response_count": {"type": "integer", "minimum": 0},
"rejected_response_count": {"type": "integer", "minimum": 0},
"response_template_count": {"type": "integer", "minimum": 0},
"intake_preflight_check_count": {"type": "integer", "minimum": 0},
"acceptance_check_count": {"type": "integer", "minimum": 0},
"rejection_rule_count": {"type": "integer", "minimum": 0},
"token_value_collection_allowed": {
@@ -168,6 +170,46 @@
},
"minItems": 1
},
"intake_preflight_checks": {
"type": "array",
"description": "AwoooP 收到 S4.9 owner response 前後可執行的只讀 preflight只分類可收、補證或隔離不授權任何執行。",
"items": {
"type": "object",
"required": [
"check_id",
"display_order",
"title",
"required",
"pass_condition",
"failure_lane",
"awooop_display",
"execution_authorized"
],
"properties": {
"check_id": {"type": "string"},
"display_order": {"type": "integer", "minimum": 1},
"title": {"type": "string"},
"required": {"type": "boolean"},
"pass_condition": {"type": "string"},
"failure_lane": {"type": "string"},
"awooop_display": {
"type": "string",
"enum": [
"ready_for_owner_review",
"request_more_evidence",
"quarantine_sensitive_payload",
"reject_execution_request"
]
},
"execution_authorized": {
"type": "boolean",
"const": false
}
},
"additionalProperties": false
},
"minItems": 1
},
"acceptance_checks": {
"type": "array",
"items": {

View File

@@ -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 attestationS4.9 owner response 收件包;不保存 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 attestationS4.9 owner response 收件包與 6 個 intake preflight checks;不保存 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、同步 refsS4.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 與 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 與 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不做主控切換 |

View File

@@ -58,6 +58,8 @@ AwoooP 顯示 S4.13 時,應把 `missing_response_lanes` 當成 Operator Consol
可同步顯示 `next_collection_candidate`,目前只指向 S4.9 Gitea owner attestation response需要 5 個 Gitea coverage attestation items、received / accepted 皆為 0、顯示模式為 `display_next_collection_item_only`。這個欄位只提示下一包 response不是 approval也不代表 S4.10 / S4.11 / S4.12 可被提前接受。
S4.9 也提供 6 個 `intake_preflight_checks`:已知 item、必填欄位、允許 decision、脫敏 evidence、不得夾帶執行要求、接受前覆蓋五個 items。AwoooP 只能用它判斷可收、補證、隔離或拒收,不得把 preflight pass 當成 inventory runtime、repo migration 或 primary approval。
## 1. Session 分工
### AwoooP 主線 Session

View File

@@ -29,6 +29,7 @@ S4.7 已定義要問什麼S4.8 已把它接到 AwoooP approval laneS4.9
| 已接受 response | 0 |
| 已拒收 response | 0 |
| response templates | 5 |
| intake preflight checks | 6 |
| acceptance checks | 8 |
| rejection rules | 10 |
| 允許收集 token value | `false` |
@@ -48,6 +49,19 @@ S4.7 已定義要問什麼S4.8 已把它接到 AwoooP approval laneS4.9
5. `evidence_refs`:只能指向 repo 內文件、snapshot 或 owner 提供的脫敏 metadata。
6. `followup_owner`:若需要補 evidence需指定下一個負責角色或團隊。
## 2.1 AwoooP 收件前 Preflight
| 順序 | 檢查 | 失敗處理 |
|------|------|----------|
| 1 | 回覆必須對應 S4.7 已知 item | 要求 owner 修正 |
| 2 | 必填欄位完整 | 要求補 evidence |
| 3 | `decision` 在模板允許值內 | 要求 owner 修正 |
| 4 | 只接受脫敏 evidence refs | 進 mirror quarantine |
| 5 | 不得夾帶執行要求 | 拒收 execution request |
| 6 | 接受前需覆蓋五個 items | 維持 waiting 或 request more evidence |
這 6 個 preflight 只協助 AwoooP 判斷「可收、補證、隔離或拒收」。它們不授權 read-only inventory runtime、不建立 GitHub repo、不修改 Gitea、不 sync refs也不切 GitHub primary。
## 3. 五個 Response Template
| Template | 對應 S4.7 item | 驗收重點 |
@@ -85,7 +99,7 @@ S4.7 已定義要問什麼S4.8 已把它接到 AwoooP approval laneS4.9
## 6. AwoooP 可做
1. 顯示 5 個 owner response templates。
2. 顯示 acceptance checks 與 rejection rules。
2. 顯示 6 個 intake preflight checks、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。

View File

@@ -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 時的必填欄位、驗收規則與拒收規則正式文件化。response 通過只代表可更新 read-only matrix / decision table不等於 read-only inventory 已執行。
S4.9 已補 `gitea_inventory_owner_attestation_response_v1`,把 owner 回覆 S4.7 五個 items 時的必填欄位、intake preflight checks、驗收規則與拒收規則正式文件化。response 通過只代表可更新 read-only matrix / decision table不等於 read-only inventory 已執行。
## 1. 申請批准的動作

View File

@@ -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 填寫並通過基本驗收,才能把 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 與基本驗收,才能把 S4.7 coverage attestation 視為可審 evidence。此 response 收件包仍不授權 read-only inventory runtime、repo migration 或 primary cutover。
## 1. Public-only 快照指令

View File

@@ -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 收件包通過基本驗收後,才可把 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 與基本驗收後,才可把 S4.7 coverage attestation 視為可審 evidence。此驗收仍只更新 read-only matrix / decision table / readiness gate不授權 inventory runtime、repo migration 或 GitHub primary。

View File

@@ -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、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、8 個 acceptance checks 與 10 個 rejection rules未收到並驗收 response 前,不得把 owner attestation 視為完成。

View File

@@ -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、`received_response_count=0`、8 個 acceptance checks 與 10 個 rejection rules。reviewer 應先看 response 是否可收,再看 read-only inventory gatereview packet 仍不代表批准,也不授權執行。
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 gatereview packet 仍不代表批准,也不授權執行。

View File

@@ -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 仍未收到 / 接受 | 不把 guard pass 當成 repo、refs、workflow、secret、runner、primary 或 runtime 授權 |
| `CHECK_OWNER_RESPONSE_GUARD` | 確認四包 owner response 仍未收到 / 接受,且 S4.9 preflight 只分類可收、補證、隔離或拒收 | 不把 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 |

View File

@@ -35,7 +35,7 @@
| Contract | 狀態 | 原因 | 下一步 |
|----------|------|------|--------|
| `security_finding_v1` | `partial_ready` | 目前只有 Kali sample snapshotruntime ingestion 尚未啟用 | 先 review `kali-finding-runtime-ingestion-approval-20260513` |
| `gitea_repo_inventory_v1` | `partial_ready` | 目前只有 public-only / blocked endpoint evidenceS4.5 已補認證清冊匯出請求S4.6 已補匯入驗收契約S4.7 已補 owner coverage attestationS4.9 已補 owner response 收件包;未認證公開範圍 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 evidenceS4.5 已補認證清冊匯出請求S4.6 已補匯入驗收契約S4.7 已補 owner coverage attestationS4.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 |
| `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 itemsresponse templates不保存 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 itemsresponse templates 與 intake preflight checks;不保存 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 namesexport request 有 7 個 repos、5 類 lanes不保存 secret value。
19. 再 mirror `kali_integration_status_v1``kali_scan_scope_approval_v1`
20. 最後再 mirror source-control 其他 contracts。

View File

@@ -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 readyS4.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 rollup22 個 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 attestationS4.8 已把既有 Gitea queue/gate/review packet/follow-up gate 對齊 attestation 先行S4.9 已補 owner response 收件包;目前 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 attestationS4.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 |
| Workflow / secret name inventory | S4.1 已建立S4.2 補 4 個 repos、31 個 workflow files、43 個 referenced secret names 的 local evidenceS4.3 補 7 個 repos、5 類 lanes 的 redacted export requestS4.12 補 5 個 owner response templates0 個 inventory complete、禁止收集 secret value、禁止 write token |
| Owner response validation | S4.13 已建立;四包 owner response 目前 received/accepted 皆為 04 條 missing response lanes、4 步 collection order 與 next collection candidate 可供 AwoooP 直接顯示;下一個建議收件為 S4.9 Gitea owner attestationlatest 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 |

View File

@@ -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 inventoryS4.5 已補認證清冊匯出請求S4.6 已補匯入驗收契約S4.7 已補 owner coverage attestationS4.9 已補 owner response 收件包 | 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 inventoryS4.5 已補認證清冊匯出請求S4.6 已補匯入驗收契約S4.7 已補 owner coverage attestationS4.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 |
| `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 收件包與覆蓋缺口,不得觸發 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 與覆蓋缺口,不得觸發 token collection 或 Gitea write。
7. 不新增執行按鈕,不做 runtime enforcement。
## 3. 永久禁止

View File

@@ -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 itemsowner decision 接受前不得執行 read-only inventory 或標記 complete |
| S4.9 Gitea Owner Attestation Response 收件包 | 完成草案 | 已建立 owner response schema / snapshot / 人讀版5 個 response templates、8 個 acceptance checks、10 個 rejection rules、received response 0、accepted 0、execution authorized=false | owner 依模板回覆 S4.7 五個 itemsresponse 通過只更新 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、8 個 acceptance checks、10 個 rejection rules、received response 0、accepted 0、execution authorized=false | owner 依模板回覆 S4.7 五個 itemsAwoooP 先用 preflight 判斷可收、補證、隔離或拒收;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 / canonicalresponse 通過只更新 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 refsresponse 通過只更新 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 |

View File

@@ -92,6 +92,8 @@ 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 checkspreflight 只分類可收、補證、隔離或拒收,不代表 owner response accepted。
## 3. Cross-Packet 驗收規則
1. 四個 source response packets 都必須可解析,且 summary 欄位存在。

View File

@@ -22,6 +22,7 @@
"accepted_response_count": 0,
"rejected_response_count": 0,
"response_template_count": 5,
"intake_preflight_check_count": 6,
"acceptance_check_count": 8,
"rejection_rule_count": 10,
"token_value_collection_allowed": false,
@@ -238,6 +239,68 @@
"execution_authorized": false
}
],
"intake_preflight_checks": [
{
"check_id": "preflight-known-attestation-item",
"display_order": 1,
"title": "回覆必須對應 S4.7 已知 item",
"required": true,
"pass_condition": "`attestation_item_id` 必須是 S4.7 五個 coverage attestation items 之一。",
"failure_lane": "request_owner_correction",
"awooop_display": "request_more_evidence",
"execution_authorized": false
},
{
"check_id": "preflight-required-owner-fields",
"display_order": 2,
"title": "必填欄位完整",
"required": true,
"pass_condition": "每筆 response 必須有 owner role/team、decision、decision_reason、受影響 scope、evidence_refs 與 followup_owner。",
"failure_lane": "request_more_evidence",
"awooop_display": "request_more_evidence",
"execution_authorized": false
},
{
"check_id": "preflight-allowed-decision",
"display_order": 3,
"title": "decision 在模板允許值內",
"required": true,
"pass_condition": "`decision` 必須落在對應 response template 的 acceptable_decisions。",
"failure_lane": "request_owner_correction",
"awooop_display": "request_more_evidence",
"execution_authorized": false
},
{
"check_id": "preflight-redacted-evidence-only",
"display_order": 4,
"title": "只接受脫敏 evidence refs",
"required": true,
"pass_condition": "`evidence_refs` 只能指向 repo 內文件、snapshot 或 owner 提供的脫敏 metadata不得含 token、secret、cookie、session、private key 或私有 URL 憑證。",
"failure_lane": "quarantine_sensitive_payload",
"awooop_display": "quarantine_sensitive_payload",
"execution_authorized": false
},
{
"check_id": "preflight-no-execution-request",
"display_order": 5,
"title": "不得夾帶執行要求",
"required": true,
"pass_condition": "response 不得要求 Gitea/GitHub repo 寫入、repo 建立、visibility 修改、refs sync/delete/force-push、workflow/secret/runner 變更、scan 或 runtime action。",
"failure_lane": "reject_execution_request",
"awooop_display": "reject_execution_request",
"execution_authorized": false
},
{
"check_id": "preflight-all-five-items-before-accepted",
"display_order": 6,
"title": "接受前需覆蓋五個 items",
"required": true,
"pass_condition": "S4.9 要被標示 accepted 前,五個 response templates 都必須收到可驗收 owner response部分回覆只能維持 waiting 或 request_more_evidence。",
"failure_lane": "keep_waiting_owner_response",
"awooop_display": "ready_for_owner_review",
"execution_authorized": false
}
],
"acceptance_checks": [
{
"check_id": "maps_to_known_s4_7_item",

View File

@@ -98,7 +98,7 @@
],
"decision_options": ["approve_scope", "reject", "defer", "request_more_evidence"],
"allowed_after_approval": [
"先依 S4.9 收到並驗收 S4.7 owner coverage attestation response保留 scope decision evidence",
"先依 S4.9 收到並完成 preflight / 驗收 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"

View File

@@ -101,7 +101,7 @@
"docs/security/GITEA-AUTHENTICATED-INVENTORY-IMPORT-ACCEPTANCE.md"
],
"allowed_after_approval": [
"先依 S4.9 收到並驗收 S4.7 owner coverage attestation response更新 migration matrix 與 decision table",
"先依 S4.9 收到並完成 preflight / 驗收 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"

View File

@@ -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、received_response_count=0 與 rejection rules",
"顯示 S4.9 的 5 個 owner response templates、6 個 intake preflight checks、received_response_count=0 與 rejection rules",
"要求 owner 確認 read-only token 或 redacted export 來源",
"不保存 token value"
],
"allowed_after_decision_actions": [
"若 approve_scope先依 S4.9 收到並驗收 S4.7 owner response再更新 attestation evidence 與 scope decision",
"若 approve_scope先依 S4.9 收到並完成 preflight / 驗收 S4.7 owner response再更新 attestation evidence 與 scope decision",
"若 approve_scope只能做一次 read-only inventory 或匯入 redacted export",
"更新 migration matrix 與 repo decision table"
],

View File

@@ -112,7 +112,7 @@
"gate_state": "waiting_approved_scope",
"applies_after_decision": "approve_scope",
"minimum_required_evidence": [
"S4.9 owner response 已完成驗收,且 S4.7 owner coverage attestation 的 5 個 items 都有 scope decision",
"S4.9 owner response 已完成 intake preflight 與驗收,且 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",

View File

@@ -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_responsereceived / accepted 皆為 0且不能解鎖 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_responsereceived / accepted 皆為 0 S4.9 intake preflight 只分類可收、補證、隔離或拒收,不能解鎖 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",

View File

@@ -251,7 +251,7 @@
"docs/security/GITEA-INVENTORY-COVERAGE-ATTESTATION.md",
"docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md"
],
"notes": "目前仍是 public-only / blocked endpoint evidenceS4.5 已補 authenticated/admin export requestS4.6 已補 redacted import acceptanceS4.7 已補 owner coverage attestation requestS4.9 已補 owner response intake packetprivate/internal 全量需 approval、脫敏 payload 驗收與 owner scope decision。"
"notes": "目前仍是 public-only / blocked endpoint evidenceS4.5 已補 authenticated/admin export requestS4.6 已補 redacted import acceptanceS4.7 已補 owner coverage attestation requestS4.9 已補 owner response intake packet 與 6 個 intake preflight checksprivate/internal 全量需 approval、脫敏 payload 驗收與 owner scope decision。"
},
{
"contract": "local_git_remote_inventory_v1",

View File

@@ -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 readyS4.1 已定義 workflow / secret 名稱 inventory 契約S4.2 已補 local evidenceS4.3 已補 redacted export requestS4.4 已補 rollback ADR 草案S4.5 已補 Gitea authenticated inventory export requestS4.6 已補 redacted import acceptanceS4.7 已補 owner coverage attestation requestS4.9 已補 Gitea owner response intake packetS4.10 已補 GitHub target owner decision response intake packetS4.11 已補 refs truth owner response intake packetS4.12 已補 workflow / secret 名稱 owner response intake packetS4.13 已補四包 owner response validation rollup彙整 22 個 templates、received=0、accepted=0並標示 next_collection_candidate=S4.9,但 inventory status 仍 partialGitHub 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 readyS4.1 已定義 workflow / secret 名稱 inventory 契約S4.2 已補 local evidenceS4.3 已補 redacted export requestS4.4 已補 rollback ADR 草案S4.5 已補 Gitea authenticated inventory export requestS4.6 已補 redacted import acceptanceS4.7 已補 owner coverage attestation requestS4.9 已補 Gitea owner response intake packet 與 6 個 intake preflight checksS4.10 已補 GitHub target owner decision response intake packetS4.11 已補 refs truth owner response intake packetS4.12 已補 workflow / secret 名稱 owner response intake packetS4.13 已補四包 owner response validation rollup彙整 22 個 templates、received=0、accepted=0並標示 next_collection_candidate=S4.9,但 inventory status 仍 partialGitHub 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、received_response_count=0 與 rejection rules",
"顯示 S4.9 owner response templates、intake preflight checks、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 驗收與隔離",

View File

@@ -408,7 +408,7 @@
"display_owner_attestation_response_packet"
],
"forbidden_actions": ["store_token_value", "write_to_gitea", "delete_or_archive_repo"],
"notes": "目前是 partial/public_onlyS4.5 已補 authenticated/admin export requestS4.6 已補 redacted import acceptanceS4.7 已補 owner coverage attestation requestS4.9 已補 owner response intake packetprivate/internal 全量仍需批准後補齊。"
"notes": "目前是 partial/public_onlyS4.5 已補 authenticated/admin export requestS4.6 已補 redacted import acceptanceS4.7 已補 owner coverage attestation requestS4.9 已補 owner response intake packet 與 6 個 intake preflight checksprivate/internal 全量仍需批准後補齊。"
},
{
"contract": "local_git_remote_inventory_v1",

View File

@@ -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 收件包,但目前 received_response_count=0、accepted_response_count=0",
"S4.9 已建立 owner response 收件包與 6 個 intake preflight checks,但目前 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 reposgap 仍待 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",
"mirror S4.9 owner attestation response templates 與 intake preflight checks",
"mirror S4.13 owner response validation rollup",
"等待 read-only token 或 redacted admin export",
"更新 approval board 與 decision table"

View File

@@ -26,6 +26,14 @@ LANES = [
"github_primary_switch_authorized",
"action_buttons_allowed",
],
"expected_preflight_checks": [
"preflight-known-attestation-item",
"preflight-required-owner-fields",
"preflight-allowed-decision",
"preflight-redacted-evidence-only",
"preflight-no-execution-request",
"preflight-all-five-items-before-accepted",
],
},
{
"lane_id": "s4_10_github_target_owner_decision_response",
@@ -155,6 +163,30 @@ def validate(root: Path) -> None:
assert_equal(f"{lane['lane_id']}.rejected_response_count", summary["rejected_response_count"], 0)
assert_equal(f"{lane['lane_id']}.acceptance_check_count", summary["acceptance_check_count"], 8)
assert_equal(f"{lane['lane_id']}.rejection_rule_count", summary["rejection_rule_count"], 10)
expected_preflight_checks = lane.get("expected_preflight_checks")
if expected_preflight_checks is not None:
intake_preflight_checks = snapshot["intake_preflight_checks"]
assert_equal(
f"{lane['lane_id']}.intake_preflight_check_count",
summary["intake_preflight_check_count"],
len(expected_preflight_checks),
)
assert_equal(
f"{lane['lane_id']}.intake_preflight_check_ids",
[item["check_id"] for item in intake_preflight_checks],
expected_preflight_checks,
)
assert_equal(
f"{lane['lane_id']}.intake_preflight_display_order",
[item["display_order"] for item in intake_preflight_checks],
list(range(1, len(expected_preflight_checks) + 1)),
)
for item in intake_preflight_checks:
assert_true(f"{lane['lane_id']}.{item['check_id']}.required", item["required"])
assert_false(
f"{lane['lane_id']}.{item['check_id']}.execution_authorized",
item["execution_authorized"],
)
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(