Files
awoooi/docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md

260 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Gitea 清冊 Owner Attestation Response 收件包
| 項目 | 內容 |
|------|------|
| 日期 | 2026-06-04 |
| 狀態 | 草案,等待 owner response |
| 資料契約 | `docs/schemas/gitea_inventory_owner_attestation_response_v1.schema.json` |
| 快照 | `docs/security/gitea-inventory-owner-attestation-response.snapshot.json` |
| 來源契約 | `gitea_inventory_coverage_attestation_v1` |
| 目標契約 | `gitea_repo_inventory_v1` |
| 模式 | `owner_response_intake_only` |
| 執行面授權 | `false` |
## 0. 核心結論
S4.9 補的是「owner 要怎麼回覆 S4.7 的 5 個 coverage attestation items」。
S4.7 已定義要問什麼S4.8 已把它接到 AwoooP approval laneS4.9 則把回覆欄位、驗收規則、拒收規則與允許輸出固定下來,避免 owner response 混入 token、DB dump、git object、repo 建立、refs sync 或 GitHub primary approval。
此文件不要求貼 token不接受 raw secret不寫 Gitea不建立 GitHub repo不 sync refs也不把任何 attestation response 當成 migration approval。
## 1. Response 摘要
| 指標 | 值 |
|------|----|
| owner response 狀態 | `waiting_owner_response` |
| 必要 response items | 5 |
| 已收到 response | 0 |
| 已接受 response | 0 |
| 已拒收 response | 0 |
| response templates | 5 |
| owner response template statuses | 5 |
| owner response audit event templates | 3 |
| owner response redaction examples | 5 |
| owner response display sections | 8 |
| owner response request packet | 1 |
| owner response collection checks | 6 |
| intake preflight checks | 6 |
| intake outcome lanes | 5 |
| acceptance checks | 8 |
| rejection rules | 10 |
| 允許收集 token value | `false` |
| 允許 raw secret | `false` |
| 允許 repo write / refs sync | `false` |
| 授權切換 GitHub primary | `false` |
| 允許 action button | `false` |
## 1.1 2026-06-04 Current Intake Readiness
本段把 S4.9 從「已經有收件契約」再推進成「目前可直接照表收件與預檢」的狀態。這只代表收件準備度完成,不代表 request 已送出、owner 已回覆、response 已接受或任何執行授權。
| 指標 | 目前值 | 邊界 |
|------|--------|------|
| S4.9 收件準備度 | `100%` | 五個 templates、必填欄位、收件檢查、預檢、拒收規則與 outcome lanes 已可用 |
| S4.9 owner response gate | `0%` | `received_response_count=0``accepted_response_count=0``rejected_response_count=0` |
| 下一個收件焦點 | `S4.9 Gitea owner attestation response` | S4.10 / S4.11 / S4.12 仍排隊,不可提前視為 accepted |
| 可收資料 | owner role / team、decision、decision reason、affected scope、redacted evidence refs、followup owner | 只收脫敏 metadata 或 repo 內文件參照 |
| 不可收資料 | token、secret、private key、cookie、session、DB dump、git object、repo archive、private URL credential、執行 payload | 疑似敏感值先 quarantine執行要求 hard reject |
| 可更新結果 | read-only coverage wording、migration matrix、decision table、readiness blocker | 不寫 Gitea、不建 GitHub repo、不同步 refs、不切 primary、不開 runtime gate |
### 1.1.1 五題缺口矩陣
| 順序 | Template | 目前缺口 | 合格回覆最小條件 | 失敗路由 |
|------|----------|----------|------------------|----------|
| 1 | `response-public-only-vs-local-gitea-gap` | `wooo/clawbot-v5``wooo/wooo-aiops` 是否屬本輪 scope 尚未由 owner 判定 | 逐 repo 填 owner、decision、reason、affected repos、redacted evidence refs、followup owner | 缺 repo 粒度時 `request_more_evidence`;含 refs / repo 執行要求時 `hard_reject` |
| 2 | `response-org-user-endpoint-identity` | `wooo` 應以 user、org 或兩者盤點尚未確認 | 指定 canonical namespace 或要求管理者補脫敏 evidence | 把 org 404 當完成時 `request_more_evidence`;要求 write/admin token 時 `hard_reject` |
| 3 | `response-internal-110-adjacent-scope` | 110 adjacent sources 是否納入本輪 scope 尚未確認 | 逐 source 判定 in-scope / out-of-scope / legacy / external / follow-up | 一句話排除全部時 `request_more_evidence`;要求 fetch / push / delete refs 時 `hard_reject` |
| 4 | `response-repo-owner-canonical-scope` | in-scope repo owner、canonical source、GitHub target 與 visibility review owner 尚未收齊 | 指定 repo owner、canonical source、GitHub target candidate、visibility review owner 與 evidence refs | 缺 owner 或 canonical 時 `request_more_evidence`;把 target candidate 當 repo creation approval 時 `hard_reject` |
| 5 | `response-legacy-or-inaccessible-disposition` | legacy、inaccessible、external repo disposition 與後續 owner 尚未收齊 | 指定 disposition、理由、後續 owner 與脫敏 evidence refs | 把 legacy candidate 當刪除 / 封存 approval 時 `hard_reject` |
### 1.1.2 收件結果分流
| Outcome | 何時使用 | 計數影響 |
|---------|----------|----------|
| `keep_waiting_owner_response` | 只有 request packet、template status 或空回覆 | received / accepted 維持 0 |
| `request_more_evidence` | 欄位缺漏、repo/source 粒度不足、evidence refs 不足 | 不增加 accepted |
| `quarantine_sensitive_payload` | 疑似含 token、secret、private key、cookie、session、未脫敏截圖或 private URL credential | 不保存 raw payload |
| `reject_execution_request` | 夾帶 repo / refs / workflow / secret / runner / Kali / primary 執行要求 | 不建立 action button、不進 runtime gate |
| `ready_for_reviewer_validation` | 五題欄位完整、evidence 已脫敏、無執行要求 | 只進 reviewer checklist仍非 accepted |
## 2. Owner Response 必填欄位
每筆 response 至少要能回答:
1. `owner_role_or_team`:回覆者的角色或團隊,不要求個人敏感資訊。
2. `decision`:必須是該 S4.7 item 允許的決策值。
3. `decision_reason`:為什麼做此 scope / disposition 判定。
4. `affected_repos``affected_sources``canonical_namespace`:指出受影響 repo、namespace 或 110 adjacent source。
5. `evidence_refs`:只能指向 repo 內文件、snapshot 或 owner 提供的脫敏 metadata。
6. `followup_owner`:若需要補 evidence需指定下一個負責角色或團隊。
## 2.0 Owner Response Request Packet
AwoooP 可顯示 `owner_response_request_packet` 給 owner要求只回覆 S4.9 五個 templates
1. `response-public-only-vs-local-gitea-gap`
2. `response-org-user-endpoint-identity`
3. `response-internal-110-adjacent-scope`
4. `response-repo-owner-canonical-scope`
5. `response-legacy-or-inaccessible-disposition`
允許填寫的內容只限 owner role/team、decision、decision reason、受影響 repo/source/namespace、canonical source、GitHub target candidate、visibility review owner、脫敏 evidence refs 與 followup owner。
禁止貼 token、secret、private key、cookie、session、DB dump、git object pack、repo archive、write/admin API request、repo/refs 執行要求或 workflow/secret/runner 執行要求。此 request packet 只是收件提示,不是 approval也不授權 inventory、migration 或 primary。
## 2.0.1 Owner Response Collection Checklist
AwoooP 顯示 request packet 後,必須用 `owner_response_collection_checks` 維持 request / received / accepted 三種狀態分離:
| 順序 | 檢查 | 目的 |
|------|------|------|
| 1 | `collection-request-packet-displayed` | 只確認 request packet 已顯示,不代表 response 已收到 |
| 2 | `collection-read-only-submission-mode` | 限定 markdown response、redacted metadata pointer 或 request more evidence |
| 3 | `collection-five-template-tracking` | 五個 templates 逐項追蹤,不接受整體口頭同意 |
| 4 | `collection-redacted-evidence-only` | 只收 repo 內路徑或脫敏 metadata pointer |
| 5 | `collection-no-approval-language` | 不把「同意 / OK / 可進行」升級成 inventory、migration 或 primary approval |
| 6 | `collection-audit-metadata-only` | 只記錄 audit metadata不保存敏感值 |
這 6 個 checks 只幫 AwoooP 維持收件秩序。request 已顯示仍然是 `waiting_owner_response`;部分 response 到齊也只能進 preflight / outcome lane不能直接變成 accepted。
## 2.0.2 Owner Response Template Status Ledger
AwoooP 可用 `owner_response_template_statuses` 顯示五個 templates 的逐項狀態:
| 順序 | Template | 目前狀態 | Request 狀態 | Received / Accepted / Rejected | 下一步 |
|------|----------|----------|--------------|-------------------------------|--------|
| 1 | `response-public-only-vs-local-gitea-gap` | `waiting_owner_response` | `request_ready_not_sent` | `0 / 0 / 0` | 逐項判定 `wooo/clawbot-v5``wooo/wooo-aiops` 是否屬本輪 scope |
| 2 | `response-org-user-endpoint-identity` | `waiting_owner_response` | `request_ready_not_sent` | `0 / 0 / 0` | 說明 `wooo` 應以 user、org 或兩者盤點 |
| 3 | `response-internal-110-adjacent-scope` | `waiting_owner_response` | `request_ready_not_sent` | `0 / 0 / 0` | 逐項判定 110 adjacent sources 是否納入 |
| 4 | `response-repo-owner-canonical-scope` | `waiting_owner_response` | `request_ready_not_sent` | `0 / 0 / 0` | 指定 owner、canonical source、GitHub target candidate 與 visibility review owner |
| 5 | `response-legacy-or-inaccessible-disposition` | `waiting_owner_response` | `request_ready_not_sent` | `0 / 0 / 0` | 留下 legacy / inaccessible / external disposition、理由與後續 owner |
這個 ledger 只顯示逐項狀態,不是 approval queue。`request_ready_not_sent` 只代表 AwoooP 有資料可顯示;在 owner 真的回覆前,`received_response_count``accepted_response_count``rejected_response_count` 都必須維持 0。
## 2.0.3 Owner Response Audit Event Templates
AwoooP 可用 `owner_response_audit_event_templates` 做未來 audit metadata 的格式參考:
| 順序 | Event template | 觸發點 | 允許記錄 |
|------|----------------|--------|----------|
| 1 | `audit-owner-response-request-shown` | 顯示 request packet 時 | request id、template ids、target contract、顯示角色、台北時間與來源文件 |
| 2 | `audit-owner-response-received-metadata` | 收到 owner response metadata pointer 時 | template id、attestation item、owner role/team、台北時間與脫敏 evidence refs |
| 3 | `audit-owner-response-outcome-classified` | 完成 collection / preflight / outcome 分類時 | template id、collection status、outcome lane、next owner action、分類角色與台北時間 |
這 3 個 event templates 目前都是 `template_only_not_emitted``emitted_event_count=0`。它們不代表 AwoooP production ingestion 已啟用,也不保存 owner response raw body、token、secret、private key、cookie、session、DB dump、git object pack、repo archive 或 execution request payload。
## 2.0.4 Owner Response Redaction Examples
AwoooP 可用 `owner_response_redaction_examples` 顯示 owner 回覆時應該怎麼引用 evidence而不是貼 raw payload
| 順序 | Example | 用途 |
|------|---------|------|
| 1 | `redaction-existing-doc-ref` | 引用 repo 內既有文件或 snapshot不貼 API raw body |
| 2 | `redaction-owner-decision-metadata` | 只填角色、decision、理由與 followup owner不貼密碼、session 或 token |
| 3 | `redaction-private-url-metadata` | 私有 remote 只保留 host、namespace、repo slug 與 credential_present=true/false |
| 4 | `redaction-api-export-summary` | 只保留匯出來源類型、count、redaction status 與 evidence ref |
| 5 | `redaction-quarantine-pointer` | 不確定是否含敏感值時只留下 quarantine reason 與下一步,不保存原文 |
這 5 個 examples 全部都是 `template_example_only`,只供 AwoooP 顯示與 owner 填寫參考。它們不代表 response 已收到、不代表 response accepted、不啟用 production ingestion也不允許保存 raw payload。
## 2.0.5 Owner Response Display Sections
AwoooP 顯示 S4.9 時,可依 `owner_response_display_sections` 固定 8 個只讀區塊:
| 順序 | Section | 顯示內容 |
|------|---------|----------|
| 1 | `display-owner-response-summary` | waiting 狀態、0/0/0 計數與 false flags |
| 2 | `display-owner-response-request-packet` | 五個 requested templates、允許欄位與 forbidden payloads |
| 3 | `display-template-status-ledger` | 五個 template 的 waiting / request ready / 0 counts |
| 4 | `display-audit-event-templates` | 0 emitted 的脫敏 audit metadata templates |
| 5 | `display-redaction-examples` | 安全回覆形狀、必要脫敏與 forbidden raw values |
| 6 | `display-collection-checks` | request / received / accepted 分離與收件模式 |
| 7 | `display-preflight-and-outcome-lanes` | 可審、補證、隔離、拒收或等待的分類 |
| 8 | `display-acceptance-and-rejection-rules` | acceptance checks、rejection rules 與 forbidden actions |
這 8 個 sections 全部都是 `display_contract_only`。AwoooP 只能顯示區塊與禁止事項,不得藉由 section 顯示啟用 action button、標記 received / accepted、建立 GitHub repo、寫 Gitea、sync refs 或切 GitHub primary。
## 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。
## 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 | 驗收重點 |
|----------|----------------|----------|
| `response-public-only-vs-local-gitea-gap` | `public_only_vs_local_gitea_gap` | 逐項判定 `wooo/clawbot-v5``wooo/wooo-aiops` 是否屬本輪 scope |
| `response-org-user-endpoint-identity` | `org_user_endpoint_identity` | 說明 `wooo` 應以 user、org 或兩者盤點;不得把 404 視為完成 |
| `response-internal-110-adjacent-scope` | `internal_110_adjacent_scope` | 逐項判定 `bitan-pharmacy``root/momo-pro-system``tsenyang-website``wooo/wooo-infra-config` |
| `response-repo-owner-canonical-scope` | `repo_owner_canonical_scope` | 為 in-scope repo 指定 owner、canonical source、GitHub target candidate 與 visibility review owner |
| `response-legacy-or-inaccessible-disposition` | `legacy_or_inaccessible_repo_disposition` | 對 legacy / inaccessible / external repo 留下 disposition、理由與後續 owner |
## 4. 驗收規則
1. response 必須對應 S4.7 的 5 個 item 之一。
2. `decision` 必須在該 item 的允許值內。
3. 必須有 owner 理由,不能只有「同意」或「排除」。
4. `evidence_refs` 必須已脫敏,不得包含 token、secret、cookie、session、private key 或私有 URL 憑證。
5. 必須列出受影響 repo、namespace 或 source。
6. 不得夾帶 runtime 或 source-control 執行要求。
7. 要把 S4.7 標示為 accepted 前5 個 items 都必須有可驗收 response。
8. response 通過後GitHub primary readiness 仍維持 blocked`primary_ready_count` 不得因此大於 0。
## 5. 必須拒收
1. token value、PAT、cookie、session、CSRF token 或 partial token。
2. webhook secret、repository secret value、runner registration token 或 deploy key private key。
3. private key、DB dump、git object pack、裸 repo tarball 或可還原 credential 的 artifact。
4. 要求使用 write-capable token、admin token 或 secret scope token。
5. 要求建立、刪除、封存或修改 Gitea repo。
6. 要求建立 GitHub repo、修改 visibility、sync refs、delete refs 或 force push。
7. 未逐項對應 S4.7 attestation item。
8. 只提供口頭同意、截圖或不完整 repo metadata。
9. 把 owner attestation 當成 repo migration approval 或 GitHub primary approval。
10. 任何不確定是否含敏感值的回覆。
## 6. AwoooP 可做
1. 顯示 5 個 owner response templates。
2. 顯示 owner response request packet、template status ledger、audit event templates、redaction examples、display sections、6 個 collection checks、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。
## 7. AwoooP 不可做
1. 不要求使用者貼 token、secret、private key、cookie、session 或 DB dump。
2. 不把 response 當成 read-only inventory 已執行。
3. 不把 response 當成 repo migration approval。
4. 不建立 GitHub repo。
5. 不修改 Gitea repo。
6. 不 sync refs。
7. 不新增執行按鈕。
## 8. 階段定位
S4.9 是 S4.7 / S4.8 後面的安全收件包。
它讓 owner response 變得可審、可驗收、可拒收,但仍然停在框架期。真正讓 `gitea_repo_inventory_v1.status=ok`,仍必須等 S4.6 脫敏 payload 通過、S4.7 五個 owner response 全部接受、refs truth / workflow-secret parity / rollback ADR / runtime gate 都補齊後,才能進下一階段。