# S4.9 Canonical Owner Response Envelope 規範

| 項目 | 內容 |
|------|------|
| 日期 | 2026-06-05 |
| 基準 | `gitea/main=b615bde5 docs(security): 補 S4.9 owner response 缺口稽核 [skip ci]` |
| 範圍 | S4.9 owner response 收件信封、欄位別名、隔離規則與驗收前狀態邊界 |
| 模式 | 只讀文件規範，不送 request、不收 owner response、不改 API、不改 UI、不改 runtime |
| 不可誤讀 | 本文件不是 request sent、不是 owner response received、不是 accepted、不是 Gitea / GitHub / refs / workflow / secret / runner / runtime 授權 |

## 1. 核心結論

S4.9 收件流程對外只接受一個 canonical owner response envelope。任何 source template、AwoooP handoff、reviewer note 或文件摘要，都可以保留細分欄位，但進入 S4.9 驗收前必須映射回六欄：

1. `owner_role_or_team`
2. `decision`
3. `decision_reason`
4. `affected_scope`
5. `redacted_evidence_refs`
6. `followup_owner`

沒有完成六欄映射前，不得把候選回覆視為 received；沒有完成預檢、隔離檢查、跨包一致性與 reviewer checklist 前，不得視為 accepted。

## 2. Canonical Envelope

| 欄位 | 必填 | 允許格式 | 缺漏處理 | 安全邊界 |
|------|------|----------|----------|----------|
| `owner_role_or_team` | 是 | 角色、團隊、責任單位；不需要個人敏感資料 | `request_more_evidence`，不增加 received | 不收個人帳號密碼、token、session、private email |
| `decision` | 是 | `confirm`、`defer`、`reject`、`request_more_evidence` | 非允許值 `hard_reject` | 不得包含執行命令或批准 runtime action |
| `decision_reason` | 是 | 一段脫敏摘要；可含 ticket id、文件路徑、hash、短原因 | 缺漏補件；疑似敏感 payload 先隔離 | 不渲染 raw secret、token、cookie、authorization header、未脫敏截圖 |
| `affected_scope` | 是 | repo 群、endpoint、namespace、host scope、legacy disposition、canonical owner 範圍 | 缺漏補件 | 不得把 scope 回覆解讀成 repo 建立、refs sync 或 primary 切換 |
| `redacted_evidence_refs` | 是 | 文件路徑、snapshot id、ticket id、hash、脫敏 metadata pointer | 缺漏補件；疑似 payload 隔離 | 不收 secret value、masked token、partial token、private key、session value |
| `followup_owner` | 是 | 後續補證、審查或決策負責角色 / 團隊 | 缺漏補件 | 不等於執行批准人；不等於 runtime operator |

## 3. Source Template Alias 映射

Source template 可以保留 domain-specific 欄位，方便 owner 回覆，但 S4.9 validator、AwoooP 顯示與 LOGBOOK 摘要必須使用 canonical 欄位。

| Canonical 欄位 | 可接受 alias | 映射規則 | 不可誤讀 |
|----------------|--------------|----------|----------|
| `owner_role_or_team` | `owner_role`、`owner_team`、`review_owner`、`responsible_team`、`rollback_owner` | 合併為負責角色 / 團隊；個人資訊只保留必要角色稱謂 | 不代表該 owner 已批准切 primary 或執行 rollback |
| `decision` | `owner_decision`、`scope_decision`、`visibility_decision`、`canonical_decision`、`disposition` | 只能轉成四個允許值；其他值需補件或拒收 | `confirm` 只代表該題判定，不代表全包 accepted |
| `decision_reason` | `reason`、`decision_summary`、`owner_note`、`review_note`、`rationale` | 只保留脫敏摘要；含 payload 的段落移入 quarantine metadata，不回寫 raw text | 不得把長原文、聊天內容或抱怨放進產品文案 |
| `affected_scope` | `affected_repos`、`affected_sources`、`affected_repos_or_sources_or_namespace`、`canonical_namespace`、`target_repos`、`host_scope`、`legacy_scope` | 以人類可讀 scope 摘要呈現；必要時列出 repo / source ids，但不觸發任何 git action | 不代表可建立 repo、同步 refs、改 visibility、改 workflow |
| `redacted_evidence_refs` | `evidence_refs`、`redacted_refs`、`source_refs`、`snapshot_refs`、`ticket_refs`、`metadata_refs` | 只接受指標與脫敏 metadata；任何 raw payload 先隔離 | 不收 token value、secret value、hash fragment、authorization header、runner token |
| `followup_owner` | `next_owner`、`followup_team`、`reviewer_owner`、`fallback_owner`、`resolution_owner` | 映射為後續處理負責角色 / 團隊 | 不代表 AwoooP approval 或 security approval 已完成 |

## 4. 五題 Template 的 Canonical 投影

| 順序 | Template | `affected_scope` 投影 | `decision` 判讀 | `redacted_evidence_refs` 最低要求 |
|------|----------|------------------------|-----------------|-----------------------------------|
| 1 | `response-public-only-vs-local-gitea-gap` | public-only / local Gitea scope、候選 repo、是否納入 inventory | `confirm`、`defer`、`reject`、`request_more_evidence` | public probe snapshot、local inventory ref、owner note id |
| 2 | `response-org-user-endpoint-identity` | `wooo` user / org endpoint、canonical endpoint、blocked endpoint 判讀 | 同上 | endpoint probe summary、HTTP status metadata、owner note id |
| 3 | `response-internal-110-adjacent-scope` | 110 adjacent repo / host / namespace 是否 in scope | 同上 | local repo / host scope snapshot、redacted owner note |
| 4 | `response-repo-owner-canonical-scope` | repo owner、canonical source、GitHub target candidate、visibility review owner | 同上 | refs truth summary、target probe summary、owner note id |
| 5 | `response-legacy-or-inaccessible-disposition` | legacy / inaccessible / external repo disposition 與後續 owner | 同上 | disposition note、archive candidate summary、ticket id |

## 5. 收件狀態分離

S4.9 必須把以下狀態分開，不得連動調高：

| 狀態 | 可為 true / 大於 0 的前提 | 不得連動 |
|------|---------------------------|----------|
| `request_sent` / `request_sent_count` | 有人工送件 audit metadata，且送件內容未夾帶執行要求 | 不得同步調高 received / accepted |
| `received_response_count` | 收到完整六欄 canonical envelope，且敏感 payload 已先隔離 | 不得同步視為 accepted |
| `accepted_response_count` | 五題都通過 preflight、quarantine check、cross-packet consistency、reviewer checklist | 不得開 runtime gate |
| `rejected_response_count` | 實際回覆被 hard reject，且 rejection reason 已記錄 | 不得自動要求 repo / host / runtime action |
| `quarantine_response_count` | 疑似包含敏感 payload、執行要求或未脫敏 evidence | 不得渲染 raw payload，不得複製到 LOGBOOK |

## 6. Quarantine-first 規則

以下內容一律先隔離，不得進入一般文件、LOGBOOK、前端文案或 API response：

| 類別 | 範例 | 處理 |
|------|------|------|
| Secret / credential | token、secret、private key、cookie、session、authorization header、runner token、webhook secret、database URL | 隔離並記錄類型與長度，不記值 |
| 未脫敏 evidence | 未遮蔽截圖、raw API response、含 private URL credential 的 log | 隔離，只保留 redacted evidence ref |
| 執行要求 | 建 repo、改 visibility、sync refs、delete refs、force push、改 workflow、啟 runner、Kali scan、`/execute`、host update | `hard_reject` 或切出獨立人工批准流程 |
| 產品文案污染 | 內部對話、抱怨、Session 指令、聊天式同意 | 不進產品文案；只保留治理摘要 |

## 7. Reviewer Checklist

收件 reviewer 在標記 accepted 前必須逐項確認：

| 檢查 | 必須結果 |
|------|----------|
| 六欄 canonical envelope | 全部存在且可讀 |
| 五題 response templates | 全部有對應回覆或明確補件狀態 |
| Alias mapping | 所有 source 欄位已映射回 canonical 欄位 |
| Sensitive payload check | raw payload 已隔離，LOGBOOK / UI 只保留 redacted refs |
| Execution request check | 沒有 repo / refs / workflow / secret / runner / scan / host / runtime 執行要求 |
| Cross-packet consistency | S4.9 / S4.10 / S4.11 / S4.12 口徑一致，沒有互相矛盾的 owner / scope / disposition |
| Count transition | request sent、received、accepted、rejected 只依實際 audit metadata 分段更新 |
| Gate boundary | active runtime gate、GitHub primary、Kali / host maintenance、Code Review candidate automation 仍需獨立人工批准 |

## 8. 驗收前仍必須維持

```text
request_sent=false
request_sent_count=0
received_response_count=0
accepted_response_count=0
rejected_response_count=0
owner_response_received_count=0
owner_response_accepted_count=0
redacted_payload_ingested=false
active_runtime_gate_count=0
runtime_execution_authorized=false
action_buttons_allowed=false
repo_creation_authorized=false
refs_sync_authorized=false
workflow_modification_authorized=false
github_primary_switch_authorized=false
host_update_authorized=false
active_scan_authorized=false
secret_value_collection_authorized=false
```

## 9. 本輪完成度

| 工作 | 完成度 | 說明 |
|------|--------|------|
| Canonical owner response envelope | 100% | 六欄信封、alias 映射、五題投影、quarantine-first、reviewer checklist 已文件化 |
| S4.9 owner response gate | 0% | 尚未送 request、尚未收到 owner response、尚未 accepted |
| IwoooS 整體 | 維持 64% | 規範完成不代表 runtime readiness 提升 |
| active runtime gate | 0 | 不變 |
