docs(security): add GitHub target owner handoff [skip ci]

This commit is contained in:
Your Name
2026-06-04 19:25:11 +08:00
parent 382285e626
commit 1715b463ac
5 changed files with 318 additions and 10 deletions

View File

@@ -1,3 +1,36 @@
## 2026-06-04IwoooS P1-3 GitHub Target Owner Response Handoff
**背景**P1-2 已把 Gitea authenticated inventory request handoff 補齊;本段接著補 P1-3 / S4.10 GitHub target owner response handoff。目標是讓 owner 逐項回覆 7 個 GitHub target 的 owner、visibility、canonical 與 target disposition同時避免把 `not_found_or_private` 誤讀成 repo 不存在或可直接建立。
**本輪完成**
- 更新 `GITHUB-TARGET-OWNER-DECISION-RESPONSE.md`:日期改為 2026-06-04新增 P1-3 handoff 摘要、6 項送件前檢查、9 欄交接封套與送後不變條件。
- 更新 `github-target-owner-decision-response.snapshot.json`:新增 `target_owner_handoff_package_ready=true``target_owner_handoff_completion_percent=100``target_owner_handoff_check_count=6``target_owner_handoff_packet_field_count=9`,並維持 `received_response_count=0``accepted_response_count=0``repo_creation_authorized=false``visibility_change_authorized=false`
- 更新 `github_target_owner_decision_response_v1.schema.json`:同步納入 handoff preflight、handoff packet 與 post-dispatch invariants避免 snapshot 與 schema 漂移。
- 更新 IwoooS P0/P1 主控總帳P1 只讀重盤工作完成度從 `64%` 調到 `66%`GitHub primary readiness gate 仍 `0`
**完成度更新**
- P1-3 GitHub target owner response handoff`100%`
- P1 GitHub primary readiness 只讀重盤階段:`66%`
- S4.10 owner response gate`0%`received / accepted / rejected 全部為 `0`
- GitHub primary readiness gate`0`
**驗證**
- `python3 -m json.tool docs/security/github-target-owner-decision-response.snapshot.json`:通過。
- `python3 -m json.tool docs/schemas/github_target_owner_decision_response_v1.schema.json`:通過。
- 本段自訂結構檢查:`GITHUB_TARGET_OWNER_HANDOFF_STRUCTURE_OK`
- `git diff --check`:通過。
- `python3 scripts/security/source-control-owner-response-guard.py --root .``SOURCE_CONTROL_OWNER_RESPONSE_GUARD_OK`
- `python3 scripts/security/security-mirror-progress-guard.py --root .``SECURITY_MIRROR_PROGRESS_GUARD_OK`
- URL credential pattern 檢查:本段異動檔案無命中。
- Schema validator 限制:本地沒有 Python `jsonschema` 與 Node AJV未跑完整 JSON Schema validator本段以 JSON parse、自訂結構檢查與既有 guard 補位。
- Production 頁面檢查:本段只改 docs / snapshot / schema / LOGBOOK未改前端、未部署、未宣稱新的 production 狀態;沿用 P0 `/zh-TW/iwooos` desktop / mobile live sanity 作為基準。
**目前邊界**
- `not_found_or_private` 只代表 read-only probe 看不到,不代表 repo 不存在、可建立或可改 visibility。
- `nexu-io/open-design` 只作 external scope evidence不納入 AWOOOI 7 個 approval-required target queue。
- 不建立 GitHub repo、不改 visibility、不同步或刪除 refs、不 force push、不修改 workflow / secret、不切 GitHub primary、不停 Gitea。
- S4.10 response 即使未來通過,也只能更新 read-only target decision table、approval package、approval board 與 readiness wording。
## 2026-06-04IwoooS P1-2 Gitea Authenticated Inventory Request Handoff
**背景**P1 GitHub primary readiness 只讀重盤仍卡在 Gitea authenticated / admin export 全量清冊缺口public-only user endpoint 只能看到 2 個 repo本機 remote evidence 至少有 4 個 unique Gitea repos不能把 public-only 結果當完整清冊。本段補 P1-2 請求交接封套,讓後續 owner / 管理者知道可以提供什麼、禁止提供什麼,以及 S4.9 owner response gate 仍是先行條件。

View File

@@ -14,6 +14,9 @@
"target_contract",
"source_indexes",
"summary",
"target_owner_handoff_preflight_checks",
"target_owner_handoff_packet",
"post_dispatch_invariants",
"response_templates",
"acceptance_checks",
"rejection_rules",
@@ -75,7 +78,16 @@
"refs_sync_authorized",
"github_primary_switch_authorized",
"secret_value_collection_allowed",
"action_buttons_allowed"
"action_buttons_allowed",
"target_owner_handoff_package_ready",
"target_owner_handoff_completion_percent",
"target_owner_handoff_check_count",
"target_owner_handoff_packet_field_count",
"target_owner_request_dispatch_authorized",
"not_found_or_private_as_absent_allowed",
"repo_creation_allowed_without_owner_response",
"visibility_change_allowed_without_owner_response",
"github_target_owner_response_handoff_not_approval"
],
"properties": {
"owner_response_status": {
@@ -101,10 +113,112 @@
"refs_sync_authorized": {"type": "boolean", "const": false},
"github_primary_switch_authorized": {"type": "boolean", "const": false},
"secret_value_collection_allowed": {"type": "boolean", "const": false},
"action_buttons_allowed": {"type": "boolean", "const": false}
"action_buttons_allowed": {"type": "boolean", "const": false},
"target_owner_handoff_package_ready": {"type": "boolean", "const": true},
"target_owner_handoff_completion_percent": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"target_owner_handoff_check_count": {"type": "integer", "minimum": 0},
"target_owner_handoff_packet_field_count": {"type": "integer", "minimum": 0},
"target_owner_request_dispatch_authorized": {"type": "boolean", "const": false},
"not_found_or_private_as_absent_allowed": {"type": "boolean", "const": false},
"repo_creation_allowed_without_owner_response": {"type": "boolean", "const": false},
"visibility_change_allowed_without_owner_response": {"type": "boolean", "const": false},
"github_target_owner_response_handoff_not_approval": {"type": "boolean", "const": true}
},
"additionalProperties": false
},
"target_owner_handoff_preflight_checks": {
"type": "array",
"items": {
"type": "object",
"required": [
"check_id",
"display_order",
"check",
"current_status",
"execution_authorized"
],
"properties": {
"check_id": {"type": "string"},
"display_order": {"type": "integer", "minimum": 1},
"check": {"type": "string"},
"current_status": {
"type": "string",
"enum": ["defined_not_dispatched"]
},
"execution_authorized": {"type": "boolean", "const": false}
},
"additionalProperties": false
},
"minItems": 1
},
"target_owner_handoff_packet": {
"type": "object",
"required": [
"request_id",
"stage_id",
"prerequisite_gates",
"requested_templates",
"target_probe_summary",
"recipient_role_or_team_required",
"required_response_fields",
"forbidden_inputs",
"not_approval",
"execution_authorized"
],
"properties": {
"request_id": {"type": "string"},
"stage_id": {"type": "string"},
"prerequisite_gates": {
"type": "array",
"items": {"type": "string"},
"minItems": 1
},
"requested_templates": {
"type": "array",
"items": {"type": "string"},
"minItems": 1
},
"target_probe_summary": {
"type": "object",
"required": [
"candidate_count",
"exists_count",
"not_found_or_private_count",
"external_scope_summary_repo"
],
"properties": {
"candidate_count": {"type": "integer", "minimum": 0},
"exists_count": {"type": "integer", "minimum": 0},
"not_found_or_private_count": {"type": "integer", "minimum": 0},
"external_scope_summary_repo": {"type": "string"}
},
"additionalProperties": false
},
"recipient_role_or_team_required": {"type": "boolean", "const": true},
"required_response_fields": {
"type": "array",
"items": {"type": "string"},
"minItems": 1
},
"forbidden_inputs": {
"type": "array",
"items": {"type": "string"},
"minItems": 1
},
"not_approval": {"type": "boolean", "const": true},
"execution_authorized": {"type": "boolean", "const": false}
},
"additionalProperties": false
},
"post_dispatch_invariants": {
"type": "array",
"items": {"type": "string"},
"minItems": 1
},
"owner_response_request_packet": {
"type": "object",
"description": "AwoooP 可直接顯示給 owner 的 S4.10 GitHub target owner decision 回覆請求;只說明要填什麼與不得貼什麼,不授權 repo、visibility、refs 或 primary 執行。",

View File

@@ -2,8 +2,8 @@
| 項目 | 內容 |
|------|------|
| 日期 | 2026-05-17 |
| 狀態 | 草案,等待 owner response |
| 日期 | 2026-06-04 |
| 狀態 | 草案與 P1-3 handoff 已整理,等待 owner response |
| 資料契約 | `docs/schemas/github_target_owner_decision_response_v1.schema.json` |
| 快照 | `docs/security/github-target-owner-decision-response.snapshot.json` |
| 來源契約 | `github_target_decision_v1` |
@@ -44,6 +44,56 @@ S4.10 不是 repo creation approval、不是 visibility change approval、不是
| 授權切換 GitHub primary | `false` |
| 允許收集 secret value | `false` |
| 允許 action button | `false` |
| P1-3 handoff package | `ready` |
| request dispatch authorized | `false` |
| `not_found_or_private` 當不存在 | `false` |
## 1.0 2026-06-04 P1-3 GitHub Target Owner Handoff
本段把 S4.10 從「收件包已定義」推到「P1-3 可交接請 owner 逐項回覆」。這是 handoff readiness不是 request sent、不是 owner response received、不是 repo 建立或 visibility 變更批准。S4.9 owner response gate 與 P1-2 Gitea authenticated inventory request handoff 仍是前置依賴;未通過前不得把 GitHub target decision 視為可執行。
| 指標 | 值 |
|------|----|
| P1-3 handoff package | ready |
| handoff completion | 100% |
| request dispatch authorized | false |
| target probe candidates | 8 |
| approval-required targets | 7 |
| external scope summary target | `nexu-io/open-design` |
| `not_found_or_private` targets | 3 |
| owner response received | 0 |
| owner response accepted | 0 |
| repo creation authorized | false |
| visibility change authorized | false |
### 1.0.1 送件前檢查
| 順序 | 檢查項 | 完成條件 | 目前狀態 |
|------|--------|----------|----------|
| 1 | 基線同步 | 送件前確認 `gitea/main`、GitHub target probe、S4.9 / P1-2 最新狀態 | 已定義,未送件 |
| 2 | 七個 target 範圍 | 只向 7 個 approval-required targets 收 owner / visibility / canonical 回覆 | 已定義,未送件 |
| 3 | external scope 摘要 | `nexu-io/open-design` 只作 external scope evidence不納入 AWOOOI target approval queue | 已定義,未送件 |
| 4 | `not_found_or_private` 語意 | 只能表示 read-only probe 看不到;不得視為 repo 不存在或可直接建立 | 已定義,未送件 |
| 5 | 回覆欄位 | 必須有 owner role/team、decision、reason、canonical source、target disposition、visibility review owner、redacted evidence refs | 已定義,未送件 |
| 6 | 執行要求拒收 | repo creation、visibility change、refs sync、workflow / secret 修改、primary switch 全部 hard reject | 已定義,未送件 |
### 1.0.2 交接封套欄位
| 欄位 | 內容規則 |
|------|----------|
| `request_id` | `p1_3_github_target_owner_response_handoff` |
| `stage_id` | `S4.10` |
| `prerequisite_gates` | S4.9 owner response gate、P1-2 Gitea authenticated inventory request handoff |
| `requested_templates` | 只引用本文件第 3 節七個 template id |
| `target_probe_summary` | 8 個 candidates、5 個 exists、3 個 `not_found_or_private`、1 個 external scope summary |
| `recipient_role_or_team` | 只填 role / team不收個人敏感資料或 credential |
| `required_response_fields` | owner role/team、decision、decision reason、canonical source、target disposition、visibility review owner、redacted evidence refs、followup owner |
| `forbidden_inputs` | token、secret、private key、private clone URL credential、repo archive、git object pack、API request body |
| `not_approval` | 必須為 `true` |
### 1.0.3 送件後不變條件
即使後續 owner 實際回覆,也只能先進 S4.10 intake preflight 與 reviewer validation。通過後可更新 read-only GitHub target decision table、approval package、approval board 與 readiness wording不得直接建立 repo、修改 visibility、sync / delete refs、force push、改 workflow / secret、切 GitHub primary 或停用 Gitea。
## 1.1 Owner Response Request Packet

View File

@@ -1,7 +1,7 @@
{
"schema_version": "github_target_owner_decision_response_v1",
"status": "draft_waiting_owner_response",
"date": "2026-05-17",
"date": "2026-06-04",
"mode": "owner_decision_response_intake_only",
"runtime_execution_authorized": false,
"source_contract": "github_target_decision_v1",
@@ -37,8 +37,116 @@
"refs_sync_authorized": false,
"github_primary_switch_authorized": false,
"secret_value_collection_allowed": false,
"action_buttons_allowed": false
"action_buttons_allowed": false,
"target_owner_handoff_package_ready": true,
"target_owner_handoff_completion_percent": 100,
"target_owner_handoff_check_count": 6,
"target_owner_handoff_packet_field_count": 9,
"target_owner_request_dispatch_authorized": false,
"not_found_or_private_as_absent_allowed": false,
"repo_creation_allowed_without_owner_response": false,
"visibility_change_allowed_without_owner_response": false,
"github_target_owner_response_handoff_not_approval": true
},
"target_owner_handoff_preflight_checks": [
{
"check_id": "p1-3-baseline-sync",
"display_order": 1,
"check": "送件前確認 gitea/main、GitHub target probe、S4.9 / P1-2 最新狀態。",
"current_status": "defined_not_dispatched",
"execution_authorized": false
},
{
"check_id": "p1-3-seven-target-scope",
"display_order": 2,
"check": "只向 7 個 approval-required targets 收 owner / visibility / canonical 回覆。",
"current_status": "defined_not_dispatched",
"execution_authorized": false
},
{
"check_id": "p1-3-external-scope-summary",
"display_order": 3,
"check": "nexu-io/open-design 只作 external scope evidence不納入 AWOOOI target approval queue。",
"current_status": "defined_not_dispatched",
"execution_authorized": false
},
{
"check_id": "p1-3-not-found-or-private-semantics",
"display_order": 4,
"check": "not_found_or_private 只能表示 read-only probe 看不到;不得視為 repo 不存在或可直接建立。",
"current_status": "defined_not_dispatched",
"execution_authorized": false
},
{
"check_id": "p1-3-required-owner-fields",
"display_order": 5,
"check": "必須有 owner role/team、decision、reason、canonical source、target disposition、visibility review owner、redacted evidence refs。",
"current_status": "defined_not_dispatched",
"execution_authorized": false
},
{
"check_id": "p1-3-execution-request-rejected",
"display_order": 6,
"check": "repo creation、visibility change、refs sync、workflow / secret 修改、primary switch 全部 hard reject。",
"current_status": "defined_not_dispatched",
"execution_authorized": false
}
],
"target_owner_handoff_packet": {
"request_id": "p1_3_github_target_owner_response_handoff",
"stage_id": "S4.10",
"prerequisite_gates": [
"S4.9 owner response gate",
"P1-2 Gitea authenticated inventory request handoff"
],
"requested_templates": [
"target-awoooi-refs-blocked",
"target-clawbot-v5-refs-blocked",
"target-wooo-aiops-refs-blocked",
"target-wooo-infra-config-internal-remote",
"target-ewoooc-private-or-new",
"target-bitan-pharmacy-private-or-new",
"target-tsenyang-website-private-or-new"
],
"target_probe_summary": {
"candidate_count": 8,
"exists_count": 5,
"not_found_or_private_count": 3,
"external_scope_summary_repo": "nexu-io/open-design"
},
"recipient_role_or_team_required": true,
"required_response_fields": [
"owner_role_or_team",
"decision",
"decision_reason",
"canonical_source",
"github_target_disposition",
"visibility_review_owner",
"redacted_evidence_refs",
"followup_owner"
],
"forbidden_inputs": [
"token_value",
"secret_value",
"private_key",
"private_clone_url_credential",
"repo_archive",
"git_object_pack",
"api_request_body",
"repo_creation_command",
"visibility_change_command",
"refs_sync_or_delete_request",
"github_primary_switch_request"
],
"not_approval": true,
"execution_authorized": false
},
"post_dispatch_invariants": [
"Owner response 到來後仍需先進 S4.10 intake preflight 與 reviewer validation。",
"not_found_or_private 不得自動視為 repo 不存在或可建立。",
"通過後只可更新 read-only target decision table、approval package、approval board 與 readiness wording。",
"不得直接建立 repo、修改 visibility、sync/delete refs、force push、改 workflow / secret、切 GitHub primary 或停用 Gitea。"
],
"owner_response_request_packet": {
"request_id": "s4_10_github_target_owner_decision_response_request",
"display_status": "ready_to_request_owner_response",

View File

@@ -23,7 +23,7 @@
| runtime landing | 40-45% | 否 | production 只讀頁存在,不等於 runtime ingestion 或 execution router |
| active runtime gate | 0 | 否 | 必須維持 0直到獨立人工批准、rollback、post-check 與 guard 成立 |
| S4.9 owner response gate | 0% | 可在收到合格回覆後調整 | 目前只定義欄位、預檢、收件與驗收,不標記 received / accepted |
| GitHub primary readiness | 0 | 否 | primary gate 仍為 0P1 只讀重盤工作本身目前約 64%,不代表可切 primary |
| GitHub primary readiness | 0 | 否 | primary gate 仍為 0P1 只讀重盤工作本身目前約 66%,不代表可切 primary |
| Kali 112 維護準備 | 只讀證據已納管,維護尚未開始 | 否 | 不更新套件、不重啟、不 hardening、不 active scan |
| 111 / 168 開發主機納管 | observe-only mapping 已有,維護包需補強 | 可補文件,不調 runtime | 仍不 credentialed scan、不讀未授權資料、不自動修復 |
| VibeWork 納入 IwoooS | 前端態勢已有 onboarding 欄位,產品邊界需補規範 | 可補文件 | 保留 VibeWork 獨立產品邊界 |
@@ -147,16 +147,17 @@ S4.9 是目前 IwoooS 64% 能往前的第一優先 gate。驗收前所有 count
|------|--------|-----------------|--------|
| `awoooi` Gitea / GitHub refs refresh | 100% | Gitea heads `170`、GitHub heads `2`、Gitea tags `2`、GitHub tags `0`、main SHA 不一致 | 已重產 ref detail diff / ref truth classification下一步收 S4.11 owner response |
| Gitea public repo inventory refresh | 100% | user endpoint public-only 仍只見 `wooo/awoooi``wooo/ewoooc`org endpoint 仍 blocked / 404 | 取得只讀 token 或 redacted admin export 批准 |
| GitHub target probe refresh | 100% | 8 個候選中 5 個可讀、3 個 `not_found_or_private``open-design` heads `644` 只作 external scope evidence | owner / visibility / canonical response 仍待收 |
| GitHub target probe refresh | 100% | 8 個候選中 5 個可讀、3 個 `not_found_or_private``open-design` heads `644` 只作 external scope evidence | P1-3 handoff 已補;owner / visibility / canonical response 仍待收 |
| Workflow / secret 名稱本機 evidence refresh | 100% | 31 個 workflow files、42 個 unique referenced secret names、`secret_value_detected=false` | 補 webhook、runner owner、deploy key、branch protection、secret name parity |
| Primary readiness gate 文件更新 | 90% | 已寫入 2026-06-04 refs truth 重產結果與禁止誤讀規則 | 跑 guard 後以 LOGBOOK 封存 |
| Gitea authenticated inventory request handoff | 100% | S4.5 請求已對齊 S4.9 owner response gate補 5 項 request dispatch preflight、8 欄 handoff packet 與送後不變條件 | 仍未收 token value、未收 payload、未 import inventoryS4.6/S4.9 驗收前不得標記 status=ok |
| GitHub target owner response handoff | 100% | S4.10 已對齊 2026-06-04 target probe補 6 項 target owner handoff preflight、9 欄 handoff packet 與送後不變條件 | `not_found_or_private` 不得視為不存在received / accepted 仍 0不建 repo、不改 visibility |
| 全量 Gitea 專案版本盤點 | 25% | 目前仍是 public-only + 本機輔助 evidence | 需只讀 token / admin export不使用 write credential |
| 逐 repo refs truth queue | 100% | S4.11 current queue 已重產為 `194` refs review items真相來源 `4`、deprecated / archive 候選 `142`、release tag `3`、GitHub-only `20` | 送 owner responsereceived / accepted 仍維持 0 |
| Workflow / runner / secret parity owner response | 15% | 有 local evidence 與 template但 received / accepted 皆 0 | 只收 redacted metadata不收 value |
| GitHub primary cutover readiness | 0% | `primary_ready_count=0``github_primary_switch_authorized=false` | 需 owner、parity、rollback ADR、人工批准全部成立 |
P1 只讀重盤階段整體完成度:`64%`。它代表 freshness / inventory / handoff 工作進度,不代表 GitHub primary gate、authenticated inventory gate 或 runtime gate 提升。
P1 只讀重盤階段整體完成度:`66%`。它代表 freshness / inventory / handoff 工作進度,不代表 GitHub primary gate、authenticated inventory gate、owner response accepted 或 runtime gate 提升。
## 6.2 規範分析:已不符合、需新增、需調整
@@ -179,7 +180,7 @@ P1 只讀重盤階段整體完成度:`64%`。它代表 freshness / inventory /
|------|------|------|----------|
| P1-1 | Source-control refs truth 重產 | 以 2026-06-04 `awoooi` refs refresh 重產 detail diff / truth classification | 新 queue 已改為 `194` items不再引用舊 `141` 為 current |
| P1-2 | Gitea authenticated inventory request | 已補 2026-06-04 request handoff packageS4.9 owner response gate 作先行條件,只讀 token API / redacted admin export 二選一 | 只收 metadata不保存 token valuereceived / accepted / imported 全部仍為 0 |
| P1-3 | GitHub target owner response | 對 7 個 in-scope targets 收 owner / visibility / canonical 決策 | received / accepted 前仍全部 0 |
| P1-3 | GitHub target owner response | 已補 2026-06-04 target owner handoff package對 7 個 in-scope targets 收 owner / visibility / canonical 決策 | received / accepted 前仍全部 0`not_found_or_private` 不代表不存在或可建立 |
| P1-4 | Workflow / runner / secret parity evidence | webhook、runner owner、deploy key、branch protection、CODEOWNERS、secret name parity | redacted evidence refs 完整secret value 仍拒收 |
| P1-5 | Primary rollback ADR 補強 | 逐 repo rollback owner、trigger、validation window、fallback role | ADR approved 前不切 primary |
| P1-6 | AwoooP Session 同步 | 同步 commits、runs、production sanity、P1 refresh counts、gate 0 / false | 另一 Session 不再使用舊 refs count |
@@ -207,6 +208,8 @@ P1 只讀重盤階段整體完成度:`64%`。它代表 freshness / inventory /
| P1 workflow / secret 名稱 refresh | 31 個 workflow files、42 個 unique referenced secret names、`secret_value_detected=false` |
| P1-2 Gitea authenticated inventory request handoff | S4.5 request 日期更新為 2026-06-04補 5 項 dispatch preflight、8 欄 request handoff packet、送後不變條件payload received / accepted / imported 仍 0 |
| P1-2 JSON parse / structure check | `gitea-authenticated-inventory-export-request.snapshot.json` 與 schema JSON parse 通過;本段自訂結構檢查 `GITEA_AUTHENTICATED_INVENTORY_HANDOFF_STRUCTURE_OK`;本地無 `jsonschema` / AJV未跑完整 schema validator |
| P1-3 GitHub target owner response handoff | S4.10 日期更新為 2026-06-04補 6 項 target owner handoff preflight、9 欄 handoff packet、送後不變條件received / accepted / rejected 仍 0 |
| P1-3 JSON parse / structure check | `github-target-owner-decision-response.snapshot.json` 與 schema JSON parse 通過;本段自訂結構檢查 `GITHUB_TARGET_OWNER_HANDOFF_STRUCTURE_OK`;本地無 `jsonschema` / AJV未跑完整 schema validator |
| P1 JSON parse | `gitea-github-awoooi-inventory``github-target-probe``source-control-primary-readiness-gate``source-control-workflow-secret-name-local-evidence`、Gitea repo / search / org blocked snapshots 皆通過 |
| P1 production 頁面檢查 | 本輪未改前端、未改 production 文案、未新增 deploy不宣稱新的 production 狀態,沿用 P0 live sanity 作為基準 |