From 532731eb9edf312260a267c7059a1415bee5283c Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 17 May 2026 22:49:36 +0800 Subject: [PATCH] docs(security): add workflow secret owner response intake [skip ci] --- docs/LOGBOOK.md | 37 ++ ..._secret_name_owner_response_v1.schema.json | 222 ++++++++++ ...WOOOP-MIRROR-ONLY-CONSUMPTION-CHECKLIST.md | 9 +- ...ECURITY-SUPPLYCHAIN-INTEGRATION-HANDOFF.md | 13 +- .../GITEA-GITHUB-MIGRATION-INVENTORY.md | 8 +- docs/security/SECURITY-APPROVAL-GATE.md | 2 +- docs/security/SECURITY-APPROVAL-QUEUE.md | 2 +- .../SECURITY-APPROVAL-REVIEW-PACKET.md | 2 +- .../SECURITY-FOLLOWUP-RUNTIME-GATE.md | 2 +- docs/security/SECURITY-MIRROR-READINESS.md | 2 + .../security/SECURITY-MIRROR-STATUS-ROLLUP.md | 11 +- ...SECURITY-SUPPLY-CHAIN-CONTRACT-MANIFEST.md | 2 +- .../SECURITY-SUPPLY-CHAIN-PROGRESS.md | 18 +- .../SOURCE-CONTROL-MIGRATION-MATRIX.md | 10 +- .../SOURCE-CONTROL-PRIMARY-READINESS-GATE.md | 12 +- ...ROL-WORKFLOW-SECRET-NAME-EXPORT-REQUEST.md | 8 +- ...-CONTROL-WORKFLOW-SECRET-NAME-INVENTORY.md | 8 + ...ROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md | 126 ++++++ .../security-approval-gate.snapshot.json | 7 +- .../security-approval-queue.snapshot.json | 9 +- ...urity-approval-review-packet.snapshot.json | 8 +- ...curity-followup-runtime-gate.snapshot.json | 6 +- .../security-mirror-readiness.snapshot.json | 8 +- ...ecurity-mirror-status-rollup.snapshot.json | 18 +- ...pply-chain-contract-manifest.snapshot.json | 8 +- ...ntrol-primary-readiness-gate.snapshot.json | 3 + ...w-secret-name-export-request.snapshot.json | 15 + ...rkflow-secret-name-inventory.snapshot.json | 15 + ...w-secret-name-owner-response.snapshot.json | 418 ++++++++++++++++++ 29 files changed, 960 insertions(+), 49 deletions(-) create mode 100644 docs/schemas/source_control_workflow_secret_name_owner_response_v1.schema.json create mode 100644 docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md create mode 100644 docs/security/source-control-workflow-secret-name-owner-response.snapshot.json diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index d8f916e1..95ad259b 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,40 @@ +## 2026-05-17 | 資安供應鏈 S4.12:Workflow / Secret Name Owner Response 收件包 + +**背景**:S4.1 / S4.2 / S4.3 已把 workflow、webhook、runner、deploy key、branch protection / CODEOWNERS、repository secret 名稱 inventory 與 redacted export request 文件化;但 owner 真正回覆時仍缺一份可填、可驗收、可拒收的 intake 格式。為了維持低摩擦,本輪不新增第 36 個主 contract、不新增第 9 個 approval item、不收 secret value、不使用 write token、不修改 workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / repo secret、不啟用 GitHub hosted runner、不同步 refs、不切 primary;只新增 S4.12 owner response 收件包。 + +**完成**: +- 新增 `docs/schemas/source_control_workflow_secret_name_owner_response_v1.schema.json`。 +- 新增 `docs/security/source-control-workflow-secret-name-owner-response.snapshot.json` 與 `docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md`。 +- 定義 5 個 response templates,對應 webhook redacted export、runner label owner、deploy key redacted export、branch protection / CODEOWNERS 與 repository secret name parity。 +- 定義 8 個 acceptance checks 與 10 個 rejection rules,避免 owner response 夾帶 secret value、write token、runner token、deploy key material、未脫敏 webhook payload、workflow 修改、runner 啟用、refs sync 或 GitHub primary switch。 +- 特別標記 runner lane 的 GitHub hosted minutes 風險:可做 risk review,但不授權啟用 GitHub hosted runner,也不增加 GitHub Actions 免費額度消耗風險。 +- 更新 workflow / secret inventory、export request、manifest、mirror readiness、status rollup、primary readiness gate、approval queue / gate / review packet / follow-up gate、AwoooP checklist、handoff、migration inventory、migration matrix 與 progress,使 AwoooP 能只讀顯示 S4.12 response templates。 + +**仍未完成**: +- 尚未收到任何 workflow / secret 名稱 owner response。 +- 尚未接受任何 webhook、runner、deploy key、branch protection / CODEOWNERS 或 repository secret name parity disposition。 +- 尚未完成實際 redacted export。 +- 尚未解開 workflow-secret parity blocker 或 GitHub primary readiness blocker。 + +**仍禁止**: +- 不收 secret value、token value、cookie、session、private key、deploy key material、runner token 或 webhook secret。 +- 不保存完整 webhook URL、query token、header / cookie / body payload 或未脫敏截圖。 +- 不使用 write token。 +- 不修改 workflow、webhook、runner、deploy key、branch protection、CODEOWNERS 或 repository secret。 +- 不啟用 GitHub hosted runner,不讓此階段消耗 GitHub Actions hosted minutes。 +- 不建立 GitHub repo、不修改 visibility、不 sync refs、不 delete refs、不 force push、不切 GitHub primary。 +- 不把 S4.12 response packet 當成 workflow 修改、secret 建立、runner 啟用、refs sync 或 primary approval。 + +**驗證**: +- JSON 全量 parse 通過:141 個 JSON files。 +- S4.12 assertion 通過:candidate repos 8 個、in-scope repos 7 個、export requests 7 個、export lanes 5 個、local evidence repos 4 個、workflow files 31 個、referenced secret names 43 個。 +- Owner response assertion 通過:response templates 5 個、received / accepted / rejected response 皆為 0、acceptance checks 8 個、rejection rules 10 個。 +- Safety flag assertion 通過:secret value collection、write token、workflow / webhook / runner / deploy key / branch protection / repo secret change、GitHub hosted runner enablement、refs sync、GitHub primary switch 與 action buttons 皆為 false。 +- Readiness assertion 通過:contract manifest 仍為 35 個主 contracts、mirror readiness 維持 32 ready / 2 partial / 1 contract-only / 0 blocked。 +- Approval lane assertion 通過:approval queue / review packets / follow-up runtime gate templates 維持 8 / 8 / 8,`active_runtime_gates=0`,`github_primary_ready_count=0`。 +- `git diff --check` 通過。 +- 敏感字串掃描確認本輪未保存 Kali SSH 密碼樣式、常見 token pattern、private key material 或 `GITEA_READONLY_TOKEN` value。 + ## 2026-05-17 | 資安供應鏈 S4.11:Source Control Ref Truth Owner Response 收件包 **背景**:`source_control_ref_truth_classification_v1` 已把 `awoooi`、`clawbot-v5`、`wooo-aiops` 的 141 個 refs review items 拆成 main/dev truth、deprecated drift、release tag 與 GitHub-only refs review lane;但 owner 真正回覆時仍缺一份可填、可驗收、可拒收的 intake 格式。為了維持低摩擦,本輪不新增第 36 個主 contract、不新增第 9 個 approval item、不 fetch、不 push refs、不 delete refs、不 force push、不切 primary;只新增 S4.11 owner response 收件包。 diff --git a/docs/schemas/source_control_workflow_secret_name_owner_response_v1.schema.json b/docs/schemas/source_control_workflow_secret_name_owner_response_v1.schema.json new file mode 100644 index 00000000..a9afe97e --- /dev/null +++ b/docs/schemas/source_control_workflow_secret_name_owner_response_v1.schema.json @@ -0,0 +1,222 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "urn:awoooi:source-control-workflow-secret-name-owner-response-v1", + "title": "Source Control Workflow / Secret Name Owner Response 收件契約 v1", + "description": "定義 owner 回覆 workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / repository secret 名稱 parity 時的收件欄位、驗收規則與拒收規則。此 schema 不授權收集 secret value、使用 write token、修改 workflow/webhook/runner/deploy key/branch protection/secret、建立 repo、sync refs 或切換 GitHub primary。", + "type": "object", + "required": [ + "schema_version", + "status", + "date", + "mode", + "runtime_execution_authorized", + "source_contract", + "target_contract", + "source_indexes", + "summary", + "response_templates", + "acceptance_checks", + "rejection_rules", + "allowed_outputs", + "forbidden_actions" + ], + "properties": { + "schema_version": { + "const": "source_control_workflow_secret_name_owner_response_v1" + }, + "status": { + "type": "string", + "enum": ["draft_waiting_owner_response"] + }, + "date": { + "type": "string" + }, + "mode": { + "type": "string", + "enum": ["owner_workflow_secret_name_response_intake_only"] + }, + "runtime_execution_authorized": { + "type": "boolean", + "const": false + }, + "source_contract": { + "type": "string", + "const": "source_control_workflow_secret_name_inventory_v1" + }, + "target_contract": { + "type": "string", + "const": "source_control_workflow_secret_name_export_request_v1" + }, + "source_indexes": { + "type": "array", + "items": {"type": "string"}, + "minItems": 1 + }, + "summary": { + "type": "object", + "required": [ + "owner_response_status", + "candidate_repo_count", + "in_scope_repo_count", + "export_request_count", + "export_lane_count", + "local_evidence_repo_count", + "local_workflow_file_count", + "local_referenced_secret_name_count", + "response_template_count", + "received_response_count", + "accepted_response_count", + "rejected_response_count", + "acceptance_check_count", + "rejection_rule_count", + "secret_value_collection_allowed", + "write_token_allowed", + "workflow_modification_authorized", + "webhook_modification_authorized", + "runner_change_authorized", + "deploy_key_change_authorized", + "branch_protection_change_authorized", + "repo_secret_change_authorized", + "github_hosted_runner_enable_authorized", + "refs_sync_authorized", + "github_primary_switch_authorized", + "action_buttons_allowed" + ], + "properties": { + "owner_response_status": {"type": "string", "enum": ["waiting_owner_response"]}, + "candidate_repo_count": {"type": "integer", "minimum": 0}, + "in_scope_repo_count": {"type": "integer", "minimum": 0}, + "export_request_count": {"type": "integer", "minimum": 0}, + "export_lane_count": {"type": "integer", "minimum": 0}, + "local_evidence_repo_count": {"type": "integer", "minimum": 0}, + "local_workflow_file_count": {"type": "integer", "minimum": 0}, + "local_referenced_secret_name_count": {"type": "integer", "minimum": 0}, + "response_template_count": {"type": "integer", "minimum": 0}, + "received_response_count": {"type": "integer", "minimum": 0}, + "accepted_response_count": {"type": "integer", "minimum": 0}, + "rejected_response_count": {"type": "integer", "minimum": 0}, + "acceptance_check_count": {"type": "integer", "minimum": 0}, + "rejection_rule_count": {"type": "integer", "minimum": 0}, + "secret_value_collection_allowed": {"type": "boolean", "const": false}, + "write_token_allowed": {"type": "boolean", "const": false}, + "workflow_modification_authorized": {"type": "boolean", "const": false}, + "webhook_modification_authorized": {"type": "boolean", "const": false}, + "runner_change_authorized": {"type": "boolean", "const": false}, + "deploy_key_change_authorized": {"type": "boolean", "const": false}, + "branch_protection_change_authorized": {"type": "boolean", "const": false}, + "repo_secret_change_authorized": {"type": "boolean", "const": false}, + "github_hosted_runner_enable_authorized": {"type": "boolean", "const": false}, + "refs_sync_authorized": {"type": "boolean", "const": false}, + "github_primary_switch_authorized": {"type": "boolean", "const": false}, + "action_buttons_allowed": {"type": "boolean", "const": false} + }, + "additionalProperties": false + }, + "response_templates": { + "type": "array", + "items": { + "type": "object", + "required": [ + "template_id", + "lane", + "affected_repos", + "risk", + "covered_repo_count", + "requested_owner_decision", + "required_owner_fields", + "acceptable_decisions", + "minimum_evidence_refs", + "acceptance_criteria", + "rejection_conditions", + "allowed_outputs", + "execution_authorized" + ], + "properties": { + "template_id": {"type": "string"}, + "lane": {"type": "string"}, + "affected_repos": { + "type": "array", + "items": {"type": "string"}, + "minItems": 1 + }, + "risk": {"type": "string"}, + "covered_repo_count": {"type": "integer", "minimum": 0}, + "requested_owner_decision": {"type": "string"}, + "required_owner_fields": { + "type": "array", + "items": {"type": "string"}, + "minItems": 1 + }, + "acceptable_decisions": { + "type": "array", + "items": {"type": "string"}, + "minItems": 1 + }, + "minimum_evidence_refs": { + "type": "array", + "items": {"type": "string"}, + "minItems": 1 + }, + "acceptance_criteria": { + "type": "array", + "items": {"type": "string"}, + "minItems": 1 + }, + "rejection_conditions": { + "type": "array", + "items": {"type": "string"}, + "minItems": 1 + }, + "allowed_outputs": { + "type": "array", + "items": {"type": "string"}, + "minItems": 1 + }, + "execution_authorized": {"type": "boolean", "const": false} + }, + "additionalProperties": false + }, + "minItems": 1 + }, + "acceptance_checks": { + "type": "array", + "items": { + "type": "object", + "required": [ + "check_id", + "title", + "required", + "pass_condition", + "failure_lane", + "execution_authorized" + ], + "properties": { + "check_id": {"type": "string"}, + "title": {"type": "string"}, + "required": {"type": "boolean"}, + "pass_condition": {"type": "string"}, + "failure_lane": {"type": "string"}, + "execution_authorized": {"type": "boolean", "const": false} + }, + "additionalProperties": false + }, + "minItems": 1 + }, + "rejection_rules": { + "type": "array", + "items": {"type": "string"}, + "minItems": 1 + }, + "allowed_outputs": { + "type": "array", + "items": {"type": "string"}, + "minItems": 1 + }, + "forbidden_actions": { + "type": "array", + "items": {"type": "string"}, + "minItems": 1 + } + }, + "additionalProperties": false +} diff --git a/docs/security/AWOOOP-MIRROR-ONLY-CONSUMPTION-CHECKLIST.md b/docs/security/AWOOOP-MIRROR-ONLY-CONSUMPTION-CHECKLIST.md index bb0df21f..bcc7af62 100644 --- a/docs/security/AWOOOP-MIRROR-ONLY-CONSUMPTION-CHECKLIST.md +++ b/docs/security/AWOOOP-MIRROR-ONLY-CONSUMPTION-CHECKLIST.md @@ -55,7 +55,7 @@ AwoooP 初期不得直接啟動掃描、不得呼叫 Codex patch runner、不得 | `source_control_ref_truth_classification_v1` | refs diff 真相來源與 deprecated 候選分類;S4.11 owner response 收件包 | Repo owner review queue、migration reviewer handoff | approval-only | 只顯示分類、5 個 response templates 與人工判定隊列,不執行 sync/delete/force push | | `source_control_primary_readiness_gate_v1` | GitHub primary readiness / parity gate | Source-control review、Operator Console、Audit | approval-only | 只顯示 primary blockers、parity gates、rollback ADR 缺口;目前 `primary_ready_count=0` | | `source_control_primary_rollback_adr_v1` | GitHub primary rollback ADR 草案與 validation window | Source-control review、Operator Console、Audit | approval-only | 只顯示 7 個 repo 的 rollback draft、owner review、validation window;不得執行 rollback 或切 primary | -| `source_control_workflow_secret_name_inventory_v1` | workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / secret 名稱 inventory gate | Source-control review、Secret hygiene audit、Operator Console | approval-only | 只顯示缺口、S4.2 local evidence 與 S4.3 redacted export request;目前 `inventory_complete_count=0`,不得保存 secret value | +| `source_control_workflow_secret_name_inventory_v1` | workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / secret 名稱 inventory gate;S4.12 owner response 收件包 | Source-control review、Secret hygiene audit、Operator Console | approval-only | 只顯示缺口、S4.2 local evidence、S4.3 redacted export request 與 5 個 response templates;目前 `inventory_complete_count=0`,不得保存 secret value | | `local_repo_canonical_probe_v1` | 本機 working tree lineage 比對 | Canonical decision evidence | mirror-only | 不自動合併、不自動建 repo、不刪除 | | `git_remote_refs_probe_v1` | 指定 repo remote refs read-only probe | Source readiness evidence | mirror-only | 不 fetch、不 push、不自動 mirror | | `approval_required_event_v1` | 上述事件的高風險 gate | Approval queue、Audit | approval-only | `blocked_until_approved=true` | @@ -127,6 +127,7 @@ AwoooP 初期不得直接啟動掃描、不得呼叫 Codex patch runner、不得 | `source_control_reconcile_plan_v1.status=draft_blocked` | `approve_required` | 只顯示 refs reconcile 草案與 gate,不執行 sync | | `source_control_ref_detail_diff_v1.status=draft_blocked` | `observe` | 顯示 branch/tag 明細 diff,支援人工 review | | `source_control_ref_truth_classification_v1.status=draft_blocked` | `approve_required` | 顯示 main/dev 真相來源、drift deprecated 候選、release / UAT tag review lane 與 S4.11 owner response templates;不執行分類結果 | +| `source_control_workflow_secret_name_inventory_v1.status=draft_missing_evidence` | `approve_required` | 顯示 S4.2 local evidence、S4.3 export request 與 S4.12 owner response templates;不收 secret value、不改 workflow、不啟用 runner | | `local_repo_canonical_probe_v1.status=unrelated` | `approve_required` | 禁止自動合併,需人工 canonical 判定 | | `git_remote_refs_probe_v1.status=ok` | `observe` | 可作 source evidence,但仍需 GitHub target 與 approval | | `security_rollout_policy_v1.enforcement_level=mirror_only` | `observe` | 只顯示 policy,不阻擋既有流程 | @@ -182,6 +183,7 @@ AwoooP 初期不得直接啟動掃描、不得呼叫 Codex patch runner、不得 | Source Control workflow / secret name inventory | `docs/security/source-control-workflow-secret-name-inventory.snapshot.json` / `docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-INVENTORY.md` | | Source Control workflow / secret name local evidence | `docs/security/source-control-workflow-secret-name-local-evidence.snapshot.json` / `docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-LOCAL-EVIDENCE.md` | | Source Control workflow / secret name export request | `docs/security/source-control-workflow-secret-name-export-request.snapshot.json` / `docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-EXPORT-REQUEST.md` | +| Source Control workflow / secret name owner response 收件包 | `docs/security/source-control-workflow-secret-name-owner-response.snapshot.json` / `docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md` | | Kali 112 integration status | `docs/security/kali-integration-status.snapshot.json` / `docs/security/KALI-INTEGRATION-STATUS.md` | | Security finding contract | `docs/security/security-finding-kali-sample.snapshot.json` / `docs/security/SECURITY-FINDING-CONTRACT.md` | | Kali scan scope approval package | `docs/security/kali-scan-scope-approval.snapshot.json` / `docs/security/KALI-SCAN-SCOPE-APPROVAL-PACKAGE.md` | @@ -213,5 +215,6 @@ AwoooP 初期不得直接啟動掃描、不得呼叫 Codex patch runner、不得 2. Security Supply Chain Session 補齊 Gitea 全量 repo inventory 的只讀 token 或管理匯出來源。 3. Security Supply Chain Session 依 S4.10 收到並驗收 7 個 GitHub target owner / visibility / canonical response。 4. Security Supply Chain Session 依 S4.11 收到並驗收 5 個 refs truth owner response templates;response 通過也只更新 read-only classification / reconcile / readiness wording。 -5. AwoooP 只建立 mirror/read-only policy 入口,不新增 execution action。 -6. 任一方要把事件升級成實際執行,都必須先產出 `approval_required_event_v1`,並在 `security_approval_queue_v1` 中維持 `blocked_until_approved=true` 直到人工決策完成。 +5. Security Supply Chain Session 依 S4.12 收到並驗收 5 個 workflow / secret 名稱 owner response templates;response 通過也只更新 read-only inventory / export request / readiness wording。 +6. AwoooP 只建立 mirror/read-only policy 入口,不新增 execution action。 +7. 任一方要把事件升級成實際執行,都必須先產出 `approval_required_event_v1`,並在 `security_approval_queue_v1` 中維持 `blocked_until_approved=true` 直到人工決策完成。 diff --git a/docs/security/AWOOOP-SECURITY-SUPPLYCHAIN-INTEGRATION-HANDOFF.md b/docs/security/AWOOOP-SECURITY-SUPPLYCHAIN-INTEGRATION-HANDOFF.md index da0e6bc2..d673b4d0 100644 --- a/docs/security/AWOOOP-SECURITY-SUPPLYCHAIN-INTEGRATION-HANDOFF.md +++ b/docs/security/AWOOOP-SECURITY-SUPPLYCHAIN-INTEGRATION-HANDOFF.md @@ -73,7 +73,7 @@ ```text Kali / Code Review / GitHub / Gitea / Codex -> security_supply_chain_contract_manifest_v1 - -> security_mirror_readiness_v1 / security_mirror_intake_plan_v1 / security_mirror_event_v1 / security_mirror_route_v1 / security_mirror_acceptance_v1 / security_mirror_quarantine_v1 / security_mirror_dry_run_v1 / security_mirror_status_rollup_v1 / security_finding_v1 / kali_scan_scope_approval_v1 / security_approval_queue_v1 / security_approval_gate_v1 / security_approval_decision_record_v1 / 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 / coding_task_v1 / source_control_migration_event_v1 / gitea_repo_inventory_v1 / local_git_remote_inventory_v1 / github_target_probe_v1 / github_target_decision_v1 / github_target_owner_decision_response_v1 / github_target_repo_approval_package_v1 / security_rollout_policy_v1 + -> security_mirror_readiness_v1 / security_mirror_intake_plan_v1 / security_mirror_event_v1 / security_mirror_route_v1 / security_mirror_acceptance_v1 / security_mirror_quarantine_v1 / security_mirror_dry_run_v1 / security_mirror_status_rollup_v1 / security_finding_v1 / kali_scan_scope_approval_v1 / security_approval_queue_v1 / security_approval_gate_v1 / security_approval_decision_record_v1 / 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 / source_control_workflow_secret_name_owner_response_v1 / coding_task_v1 / source_control_migration_event_v1 / gitea_repo_inventory_v1 / local_git_remote_inventory_v1 / github_target_probe_v1 / github_target_decision_v1 / github_target_owner_decision_response_v1 / github_target_repo_approval_package_v1 / security_rollout_policy_v1 -> AWOOOI ingestion / asset_inventory / AIOps KPI / AOL -> mirror 到 AwoooP Runtime State / Channel Event / Audit -> AwoooP Policy / Approval / Exception / Operator Console @@ -245,7 +245,9 @@ S4.2 local evidence:已新增本機只讀 collector 與 snapshot,7 個 local S4.3 export request:已新增 `source_control_workflow_secret_name_export_request_v1` supporting schema、snapshot 與人讀版;7 個 in-scope repos、5 類 export lanes:webhook、runner、deploy key、branch protection / CODEOWNERS、repository secret name parity。`write_token_allowed=false`、`secret_value_collection_allowed=false`。 -AwoooP 初期處理方式:只顯示 inventory lane 缺口、S4.2 local evidence、S4.3 export request、要求 redacted snapshot 與人工 review;不得收集 secret value、修改 workflow、rotate secret、sync refs 或切 GitHub primary。 +S4.12 owner response:已新增 `source_control_workflow_secret_name_owner_response_v1` supporting schema、snapshot 與人讀版;5 個 response templates 對應 webhook、runner、deploy key、branch protection / CODEOWNERS、repository secret name parity。`received_response_count=0`、`accepted_response_count=0`、`secret_value_collection_allowed=false`、`write_token_allowed=false`。 + +AwoooP 初期處理方式:只顯示 inventory lane 缺口、S4.2 local evidence、S4.3 export request、S4.12 owner response templates、要求 redacted snapshot 與人工 review;不得收集 secret value、修改 workflow、rotate secret、啟用 GitHub hosted runner、sync refs 或切 GitHub primary。 ### `security_mirror_readiness_v1` @@ -339,7 +341,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 筆;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.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 筆、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。 @@ -853,6 +855,8 @@ Console 初期不提供高風險執行按鈕。 2026-05-13 S4.3 workflow / secret name redacted export request 追加:已新增 `docs/schemas/source_control_workflow_secret_name_export_request_v1.schema.json`、`docs/security/source-control-workflow-secret-name-export-request.snapshot.json` 與 `docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-EXPORT-REQUEST.md`。本輪只定義 7 個 in-scope repos、5 類 export lanes 的 owner / read-only export 欄位與拒收規則:webhook、runner、deploy key、branch protection / CODEOWNERS、repository secret name parity;`write_token_allowed=false`、`secret_value_collection_allowed=false`,不得呼叫 API 或修改 GitHub/Gitea。 +2026-05-17 S4.12 workflow / secret name owner response 追加:已新增 `docs/schemas/source_control_workflow_secret_name_owner_response_v1.schema.json`、`docs/security/source-control-workflow-secret-name-owner-response.snapshot.json` 與 `docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md`。目前 5 個 response templates 對應 webhook、runner、deploy key、branch protection / CODEOWNERS 與 repository secret name parity;received / accepted response 皆為 0。AwoooP 可 mirror 成 owner response intake queue,但不得把 response packet 當成 secret value collection、workflow modification、GitHub hosted runner enablement 或 GitHub primary approval。 + 2026-05-13 S4.4 GitHub primary rollback ADR 追加:已新增 `docs/schemas/source_control_primary_rollback_adr_v1.schema.json`、`docs/security/source-control-primary-rollback-adr.snapshot.json` 與 `docs/security/SOURCE-CONTROL-PRIMARY-ROLLBACK-ADR.md`。本輪只定義 7 個 in-scope repos 的 rollback ADR 草案、precondition、trigger、validation window 與 owner review;`owner_approved_count=0`、`dry_run_completed_count=0`、`active_cutover_count=0`,不得切 GitHub primary、不得執行 rollback、不得停用 Gitea。 2026-05-13 S4.5 Gitea 認證清冊匯出請求追加:已新增 `docs/schemas/gitea_authenticated_inventory_export_request_v1.schema.json`、`docs/security/gitea-authenticated-inventory-export-request.snapshot.json` 與 `docs/security/GITEA-AUTHENTICATED-INVENTORY-EXPORT-REQUEST.md`。本輪只定義 Gitea 私有 / 內部全量清冊的脫敏匯出請求;目前未認證公開範圍 repo 2 個、本機可見 Gitea unique repo 4 個、覆蓋缺口 2 個、匯出來源選項 2 類;不得保存 token value、不得使用 write token、不得寫入 Gitea、不得建立或刪除 repo、不得 sync refs、不得切 GitHub primary。 @@ -943,6 +947,8 @@ Console 初期不提供高風險執行按鈕。 - [source_control_workflow_secret_name_local_evidence_v1 snapshot](/Users/ogt/awoooi/docs/security/source-control-workflow-secret-name-local-evidence.snapshot.json) - [Source Control workflow / secret name redacted export request](/Users/ogt/awoooi/docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-EXPORT-REQUEST.md) - [source_control_workflow_secret_name_export_request_v1 snapshot](/Users/ogt/awoooi/docs/security/source-control-workflow-secret-name-export-request.snapshot.json) +- [Source Control workflow / secret name owner response](/Users/ogt/awoooi/docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md) +- [source_control_workflow_secret_name_owner_response_v1 snapshot](/Users/ogt/awoooi/docs/security/source-control-workflow-secret-name-owner-response.snapshot.json) - [source-control workflow / secret name local collector](/Users/ogt/awoooi/scripts/security/source-control-workflow-secret-name-local-inventory.py) - [本機 repo canonical lineage snapshot](/Users/ogt/awoooi/docs/security/LOCAL-REPO-CANONICAL-EWOOOC-MOMO-SNAPSHOT.md) - [local_repo_canonical_probe_v1 snapshot](/Users/ogt/awoooi/docs/security/local-repo-canonical-ewoooc-momo.snapshot.json) @@ -983,6 +989,7 @@ Console 初期不提供高風險執行按鈕。 - [source_control_workflow_secret_name_inventory_v1 schema](/Users/ogt/awoooi/docs/schemas/source_control_workflow_secret_name_inventory_v1.schema.json) - [source_control_workflow_secret_name_local_evidence_v1 schema](/Users/ogt/awoooi/docs/schemas/source_control_workflow_secret_name_local_evidence_v1.schema.json) - [source_control_workflow_secret_name_export_request_v1 schema](/Users/ogt/awoooi/docs/schemas/source_control_workflow_secret_name_export_request_v1.schema.json) +- [source_control_workflow_secret_name_owner_response_v1 schema](/Users/ogt/awoooi/docs/schemas/source_control_workflow_secret_name_owner_response_v1.schema.json) - [local_repo_canonical_probe_v1 schema](/Users/ogt/awoooi/docs/schemas/local_repo_canonical_probe_v1.schema.json) - [git_remote_refs_probe_v1 schema](/Users/ogt/awoooi/docs/schemas/git_remote_refs_probe_v1.schema.json) - [approval_required_event_v1 schema](/Users/ogt/awoooi/docs/schemas/approval_required_event_v1.schema.json) diff --git a/docs/security/GITEA-GITHUB-MIGRATION-INVENTORY.md b/docs/security/GITEA-GITHUB-MIGRATION-INVENTORY.md index 4d9fa795..d6bac70e 100644 --- a/docs/security/GITEA-GITHUB-MIGRATION-INVENTORY.md +++ b/docs/security/GITEA-GITHUB-MIGRATION-INVENTORY.md @@ -27,6 +27,7 @@ | Source Control branch/tag detail diff | `docs/security/SOURCE-CONTROL-REF-DETAIL-DIFF.md` / `docs/security/source-control-ref-detail-diff.snapshot.json` | | Source Control ref truth classification | `docs/security/SOURCE-CONTROL-REF-TRUTH-CLASSIFICATION.md` / `docs/security/source-control-ref-truth-classification.snapshot.json` | | Source Control ref truth owner response | `docs/security/SOURCE-CONTROL-REF-TRUTH-OWNER-RESPONSE.md` / `docs/security/source-control-ref-truth-owner-response.snapshot.json` | +| Workflow / secret name owner response | `docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md` / `docs/security/source-control-workflow-secret-name-owner-response.snapshot.json` | | Source Control 遷移矩陣 | `docs/security/SOURCE-CONTROL-MIGRATION-MATRIX.md` | | Canonical repo 判定表 | `docs/security/SOURCE-CONTROL-CANONICAL-DECISION-TABLE.md` | @@ -50,6 +51,7 @@ - GitHub target 決策表已建立,8 個候選中 7 個需人工批准;其中 `ewoooc`、`bitan-pharmacy`、`tsenyang-website` 在 target visibility / owner 決策前不得自動建立或同步。 - GitHub target repo-by-repo approval package 已建立,7 個 approval-required targets 拆成 refs reconcile、target 建立 / 授權、internal remote 用途確認三條路徑;此 package 採低摩擦原則,只 gate 高風險執行,不阻擋 read-only evidence。 - Source Control ref truth classification 已建立,141 個 refs review items 已拆成 4 個真相來源判定、114 個 drift deprecated 候選、3 個 release tag review、20 個 GitHub-only refs review;S4.11 已補 5 個 owner response templates,received / accepted response 皆為 0。這是人工判定隊列與收件框架,不是同步批准。 +- Workflow / secret 名稱 owner response 已建立,S4.12 補 5 個 response templates,received / accepted response 皆為 0;這只允許 owner 補 webhook、runner、deploy key、branch protection / CODEOWNERS、repository secret name parity 的 redacted disposition,不授權收 secret value、修改 workflow、啟用 GitHub hosted runner 或切 GitHub primary。 - 本機可見 Git working tree 輔助盤點已找到 13 個 repo,其中去重後 Gitea repo 4 個、GitHub repo 5 個、110 內部 repo 4 個;此結果可用來補遷移矩陣,但不能取代 Gitea server 全量清單。 因此後續必須先完成「repo/branch/tag/workflow/webhook/permission/secrets 名稱」全量 inventory,再逐步 mirror 與驗證。 @@ -80,6 +82,7 @@ | Source Control draft reconcile plan | `docs/security/source-control-reconcile-plan.snapshot.json`,只產生 `draft_blocked` 草案,不授權 refs sync | | Source Control branch/tag detail diff | `docs/security/source-control-ref-detail-diff.snapshot.json`,保存 3 個 refs-blocked mapped repos 的 branch/tag 明細,不授權 fetch/push | | Source Control ref truth classification | `docs/security/source-control-ref-truth-classification.snapshot.json`,將 ref diff 轉成單 ref 人工判定隊列,不授權 sync/delete | +| Workflow / secret name owner response | `docs/security/source-control-workflow-secret-name-owner-response.snapshot.json`,固定 5 類 response templates,不授權 secret value collection、workflow modification、hosted runner enablement 或 primary switch | ## 1.1 Gitea repo list snapshot @@ -223,5 +226,6 @@ GitHub target repo-by-repo approval package 已建立於 `docs/security/GITHUB-T 2. 依 `github_target_decision_v1` 對需要人工批准的 target 做 owner / visibility / canonical 決策。 3. 依 `docs/security/SOURCE-CONTROL-REF-TRUTH-CLASSIFICATION.md` 由 repo owner 對 main/dev、release tags、GitHub-only refs 與 drift deprecated 候選逐項判定;仍不 push refs。 4. 標記「可 mirror」、「需人工判斷」、「需封存」、「不可搬」。 -5. 產出 GitHub primary ADR,定義切換 gate 與 rollback。 -6. 將 `source_control_migration_event_v1`、`gitea_repo_inventory_v1`、`local_git_remote_inventory_v1` mirror 到 AwoooP,初期只作為 evidence。 +5. 依 S4.12 workflow / secret name owner response 收件包驗收 webhook、runner、deploy key、branch protection / CODEOWNERS、repository secret name parity;仍不得收 secret value、改 workflow 或啟用 hosted runner。 +6. 產出 GitHub primary ADR,定義切換 gate 與 rollback。 +7. 將 `source_control_migration_event_v1`、`gitea_repo_inventory_v1`、`local_git_remote_inventory_v1` mirror 到 AwoooP,初期只作為 evidence。 diff --git a/docs/security/SECURITY-APPROVAL-GATE.md b/docs/security/SECURITY-APPROVAL-GATE.md index d875d61c..d3a3aff8 100644 --- a/docs/security/SECURITY-APPROVAL-GATE.md +++ b/docs/security/SECURITY-APPROVAL-GATE.md @@ -38,7 +38,7 @@ S3.1 開始,實際人工決策紀錄由 `security_approval_decision_record_v1` | 1 | Redacted finding ingestion | 只批准設計或 draft PR | | 2 | Safe web crawl | 只批准低噪音 scope 定義 | | 3 | Gitea owner attestation + read-only inventory | 先依 S4.9 驗收 S4.7 owner response,再只批准只讀 inventory 或 redacted admin export | -| 4 | GitHub target decisions | 只批准逐 repo S4.10 response 驗收與決策草案 | +| 4 | GitHub target decisions | 只批准逐 repo S4.10 response 與 S4.12 workflow / secret 名稱 response 驗收與決策草案 | | 5 | Ref truth review | 只批准 S4.11 owner response 驗收、人工分類與 reconcile 草案 | | 6 | Credentialed scan | 只允許人工 exception 設計,仍需 runtime gate | | 7 | Kali full-upgrade / reboot | 只允許維護窗口與 rollback 規劃 | diff --git a/docs/security/SECURITY-APPROVAL-QUEUE.md b/docs/security/SECURITY-APPROVAL-QUEUE.md index 699ad603..7f209359 100644 --- a/docs/security/SECURITY-APPROVAL-QUEUE.md +++ b/docs/security/SECURITY-APPROVAL-QUEUE.md @@ -35,7 +35,7 @@ S3.0 開始,人工批准範圍由 `security_approval_gate_v1` 承接。S3.1 | 1 | `kali-finding-runtime-ingestion-approval-20260513` | 先接 redacted finding evidence,風險低、價值高 | | 2 | `kali-safe-web-crawl-approval-20260513` | TLS/header/basic crawl 屬低噪音,但仍需批准 scope | | 3 | `gitea-private-internal-server-side-inventory-2026-05-12` | 先依 S4.9 收到並驗收 S4.7 owner coverage attestation response,再審 Gitea 全量版本轉 GitHub 的只讀 inventory gate | -| 4 | `source-control-target-repo-approval-bundle-20260513` | 先依 S4.10 驗收逐 repo owner / visibility / canonical response | +| 4 | `source-control-target-repo-approval-bundle-20260513` | 先依 S4.10 驗收逐 repo owner / visibility / canonical response,並依 S4.12 驗收 workflow / secret 名稱 owner response | | 5 | `source-control-ref-truth-review-bundle-20260513` | 先依 S4.11 驗收 refs truth owner response,再看 deprecated / release tag review | | 6 | `kali-credentialed-scan-approval-20260513` | 需要憑證,風險較高 | | 7 | `kali-full-upgrade-reboot-approval-20260513` | 需要維護窗口、snapshot、rollback 與 post-check | diff --git a/docs/security/SECURITY-APPROVAL-REVIEW-PACKET.md b/docs/security/SECURITY-APPROVAL-REVIEW-PACKET.md index 14987e50..bde83ff2 100644 --- a/docs/security/SECURITY-APPROVAL-REVIEW-PACKET.md +++ b/docs/security/SECURITY-APPROVAL-REVIEW-PACKET.md @@ -39,7 +39,7 @@ S3.4 開始,等待 runtime gate 時要看哪些前置條件,由 `security_fo | 1 | Redacted finding ingestion | `design_or_draft_review` | 只審是否可設計或建立 draft PR | | 2 | Safe web crawl | `low_noise_scan_scope_review` | 只審低噪音 scope 定義 | | 3 | Gitea owner attestation + read-only inventory | `read_only_inventory_review` | 先依 S4.9 審 S4.7 owner response,再審只讀 token 或 redacted export | -| 4 | GitHub target decisions | `design_or_draft_review` | 先審 S4.10 owner response,再審 owner / visibility / canonical 草案 | +| 4 | GitHub target decisions | `design_or_draft_review` | 先審 S4.10 owner response 與 S4.12 workflow / secret 名稱 response,再審 owner / visibility / canonical 草案 | | 5 | Ref truth review | `design_or_draft_review` | 先審 S4.11 owner response 驗收,再審人工分類與 reconcile 草案 | | 6 | Credentialed scan | `manual_exception_review` | 只審 exception 設計 | | 7 | Kali full-upgrade / reboot | `manual_exception_review` | 只審維護窗口與 rollback 計畫 | diff --git a/docs/security/SECURITY-FOLLOWUP-RUNTIME-GATE.md b/docs/security/SECURITY-FOLLOWUP-RUNTIME-GATE.md index 0bd74f61..f3079a25 100644 --- a/docs/security/SECURITY-FOLLOWUP-RUNTIME-GATE.md +++ b/docs/security/SECURITY-FOLLOWUP-RUNTIME-GATE.md @@ -34,7 +34,7 @@ | Redacted finding ingestion | MEDIUM | 只準備 ingestion adapter 的 redaction / audit 前置條件 | | Safe web crawl scope | MEDIUM | 只準備 TLS/header/basic crawl 的低噪音 scope | | Gitea owner attestation + read-only inventory | MEDIUM | 先依 S4.9 驗收 S4.7 owner response,再準備 read-only token 或 redacted export inventory | -| GitHub target decision | HIGH | 只準備 S4.10 owner response 驗收、owner / visibility / canonical / workflow parity 決策 | +| GitHub target decision | HIGH | 只準備 S4.10 owner response、S4.12 workflow / secret 名稱 response 驗收、owner / visibility / canonical / workflow parity 決策 | | Ref truth review | HIGH | 只準備 S4.11 owner response 驗收、refs truth / deprecated / release tag 人工判定 | | Credentialed scan exception | HIGH | 只準備人工 exception、credential lifecycle 與停用方式 | | Kali full-upgrade / reboot | HIGH | 只準備維護窗口、snapshot、rollback 與 post-health | diff --git a/docs/security/SECURITY-MIRROR-READINESS.md b/docs/security/SECURITY-MIRROR-READINESS.md index 54e19fb9..6a493087 100644 --- a/docs/security/SECURITY-MIRROR-READINESS.md +++ b/docs/security/SECURITY-MIRROR-READINESS.md @@ -91,4 +91,6 @@ GitHub target 決策面需同時 mirror S4.10 `GITHUB-TARGET-OWNER-DECISION-RESP Ref truth 決策面需同時 mirror S4.11 `SOURCE-CONTROL-REF-TRUTH-OWNER-RESPONSE.md` 與 `source-control-ref-truth-owner-response.snapshot.json`,只顯示 5 個 owner response templates、received / accepted response 皆為 0、8 個 acceptance checks 與 10 個 rejection rules;不得把 response packet 當成 refs sync、delete、force push 或 GitHub primary approval。 +Workflow / secret 名稱決策面需同時 mirror S4.12 `SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md` 與 `source-control-workflow-secret-name-owner-response.snapshot.json`,只顯示 5 個 owner response templates、received / accepted response 皆為 0、8 個 acceptance checks 與 10 個 rejection rules;不得把 response packet 當成 secret value 收集、workflow 修改、GitHub hosted runner 啟用或 GitHub primary approval。 + 整個 S2 不新增 execution router、不新增執行按鈕、不新增 runtime blocker。 diff --git a/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md b/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md index 2733178f..6de05d4c 100644 --- a/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md +++ b/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md @@ -27,10 +27,10 @@ | Review packets | S3.2 已建立;8 packets、7 ready for human review、1 block candidate | | State transitions | S3.3 已建立;5 個 decision options 都有 next state,且都不授權執行 | | 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 筆 | +| 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 筆 | | 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 收件包;目前 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;0 個 inventory complete、禁止收集 secret value、禁止 write token | +| 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 | | Dry-run | `contract_defined_not_executed` | | Runtime actions | `false` | | Payload ingestion | `false` | @@ -63,8 +63,9 @@ 4. GitHub target / owner / visibility / canonical:先依 S4.10 收到並驗收 7 個 owner decision response templates;received / accepted response 目前皆為 0,不得把 response packet 當成 repo creation、visibility change、refs sync 或 primary approval。 5. Kali `/execute` 維持 block candidate。 6. Refs truth owner response:先依 S4.11 顯示 main/dev truth、deprecated drift、release tag、GitHub-only refs 的 5 個 response templates;received / accepted response 目前皆為 0,不得把 response packet 當成 refs sync、delete、force push 或 primary approval。 -7. GitHub primary readiness blockers 與 rollback ADR 缺口。 -8. S4.4 GitHub primary rollback ADR 草案:先顯示 7 個 repo 的 rollback owner、validation window 與 triggers,owner approval 前不可執行。 -9. workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / secret 名稱 inventory 缺口,先看 S4.2 local evidence,再依 S4.3 redacted export request 補 webhook / runner / deploy key / branch protection / repository secret parity;只保存名稱與 owner,不保存 value,不使用 write token。 +7. Workflow / secret 名稱 owner response:先依 S4.12 顯示 webhook、runner、deploy key、branch protection / CODEOWNERS、repository secret name parity 的 5 個 response templates;received / accepted response 目前皆為 0,不得把 response packet 當成 secret value 收集、workflow 修改、GitHub hosted runner 啟用或 primary approval。 +8. GitHub primary readiness blockers 與 rollback ADR 缺口。 +9. S4.4 GitHub primary rollback ADR 草案:先顯示 7 個 repo 的 rollback owner、validation window 與 triggers,owner approval 前不可執行。 +10. workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / secret 名稱 inventory 缺口,先看 S4.2 local evidence,再依 S4.3 redacted export request 與 S4.12 owner response 收件包補 webhook / runner / deploy key / branch protection / repository secret parity;只保存名稱與 owner,不保存 value,不使用 write token。 任何批准後的執行仍需下一階段 runtime gate 與獨立 evidence,不得由本 rollup 自動觸發。 diff --git a/docs/security/SECURITY-SUPPLY-CHAIN-CONTRACT-MANIFEST.md b/docs/security/SECURITY-SUPPLY-CHAIN-CONTRACT-MANIFEST.md index 5d1a4cdf..6ae0cbbc 100644 --- a/docs/security/SECURITY-SUPPLY-CHAIN-CONTRACT-MANIFEST.md +++ b/docs/security/SECURITY-SUPPLY-CHAIN-CONTRACT-MANIFEST.md @@ -50,7 +50,7 @@ | `source_control_ref_truth_classification_v1` | approval-only | refs diff 的真相來源候選與 deprecated 候選分類;S4.11 已補 owner response 收件包,5 templates、received 0 | `source-control-ref-truth-classification.snapshot.json` / `source-control-ref-truth-owner-response.snapshot.json` | | `source_control_primary_readiness_gate_v1` | approval-only | GitHub primary readiness / parity gate | `source-control-primary-readiness-gate.snapshot.json` | | `source_control_primary_rollback_adr_v1` | approval-only | GitHub primary rollback ADR 草案與 validation window | `source-control-primary-rollback-adr.snapshot.json` | -| `source_control_workflow_secret_name_inventory_v1` | approval-only | workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / secret 名稱 inventory gate;S4.2 已補 local evidence,S4.3 已補 redacted export request | `source-control-workflow-secret-name-inventory.snapshot.json` / `source-control-workflow-secret-name-local-evidence.snapshot.json` / `source-control-workflow-secret-name-export-request.snapshot.json` | +| `source_control_workflow_secret_name_inventory_v1` | approval-only | workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / secret 名稱 inventory gate;S4.2 已補 local evidence,S4.3 已補 redacted export request,S4.12 已補 owner response 收件包 | `source-control-workflow-secret-name-inventory.snapshot.json` / `source-control-workflow-secret-name-local-evidence.snapshot.json` / `source-control-workflow-secret-name-export-request.snapshot.json` / `source-control-workflow-secret-name-owner-response.snapshot.json` | | `local_repo_canonical_probe_v1` | mirror-only | momo/ewoooc lineage evidence | `local-repo-canonical-ewoooc-momo.snapshot.json` | | `git_remote_refs_probe_v1` | mirror-only | 110 / GitHub remote refs readiness | `bitan-tsenyang`、`wooo-infra-config` | | `approval_required_event_v1` | approval-only | 高風險 / 敏感邊界 approval | `gitea-readonly-inventory-approval.snapshot.json` | diff --git a/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md b/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md index 4c9e2253..888b17fc 100644 --- a/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md +++ b/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md @@ -4,7 +4,7 @@ |------|------| | 日期 | 2026-05-17 | | 狀態 | S0/S1 read-only evidence 建置中 | -| 本階段完成 | 資安供應鏈 contract manifest + Source Control Approval Board + Draft Reconcile Plan + Ref Detail Diff + Ref Truth Classification + Source Control Ref Truth Owner Response 收件包 + GitHub Primary Readiness Gate + GitHub Primary Rollback ADR + GitHub Target Owner Decision Response 收件包 + Gitea 認證清冊匯出請求 + Gitea 認證清冊匯入驗收契約 + Gitea 清冊覆蓋 Owner Attestation + Gitea Owner Attestation Approval Lane 對齊 + Gitea Owner Attestation Response 收件包 + Workflow / Secret Name Inventory + Workflow / Secret Name Local Evidence + Workflow / Secret Name Redacted Export Request + Kali 112 live integration status + Security Finding contract + Kali scan scope approval package + Security Approval Queue + S3 人工批准 Gate + S3 人工決策紀錄 + S3 人工審查封包 + S3 人工決策狀態轉移 + S3 後續 runtime gate 準備契約 + 鏡像 readiness index + 鏡像接收計畫 + 鏡像事件信封 + 鏡像路由矩陣 + 鏡像驗收契約 + 鏡像隔離契約 + 鏡像 dry-run 報告契約 + 鏡像狀態彙整契約 | +| 本階段完成 | 資安供應鏈 contract manifest + Source Control Approval Board + Draft Reconcile Plan + Ref Detail Diff + Ref Truth Classification + Source Control Ref Truth Owner Response 收件包 + GitHub Primary Readiness Gate + GitHub Primary Rollback ADR + GitHub Target Owner Decision Response 收件包 + Gitea 認證清冊匯出請求 + Gitea 認證清冊匯入驗收契約 + Gitea 清冊覆蓋 Owner Attestation + Gitea Owner Attestation Approval Lane 對齊 + Gitea Owner Attestation Response 收件包 + Workflow / Secret Name Inventory + Workflow / Secret Name Local Evidence + Workflow / Secret Name Redacted Export Request + Workflow / Secret Name Owner Response 收件包 + Kali 112 live integration status + Security Finding contract + Kali scan scope approval package + Security Approval Queue + S3 人工批准 Gate + S3 人工決策紀錄 + S3 人工審查封包 + S3 人工決策狀態轉移 + S3 後續 runtime gate 準備契約 + 鏡像 readiness index + 鏡像接收計畫 + 鏡像事件信封 + 鏡像路由矩陣 + 鏡像驗收契約 + 鏡像隔離契約 + 鏡像 dry-run 報告契約 + 鏡像狀態彙整契約 | | 原則 | 低摩擦分階段;文件、schema、read-only evidence 優先;不做 runtime enforcement、不切 primary | ## 0. 本階段完成後整體進度 @@ -38,10 +38,11 @@ | S3.2 人工審查封包契約 | 完成草案 | `security_approval_review_packet_v1` 已建立;8 個 review packets、7 ready for human review、1 block candidate、0 個 runtime action 授權 | AwoooP 可顯示 review lane,不可把 packet 當批准或執行 | | S3.3 人工決策狀態轉移契約 | 完成草案 | `security_approval_state_transition_v1` 已建立;5 個 decision options 都有 next state、0 個 runtime action 授權 | AwoooP 可顯示決策後狀態,不可把 transition 當執行 | | S3.4 後續 runtime gate 準備契約 | 完成草案 | `security_followup_runtime_gate_v1` 已建立;8 個 gate templates、0 個 active runtime gates、0 個 approved scope | AwoooP 可顯示前置 evidence、preflight checks 與 rollback / disable requirement,不可啟用 runtime gate | -| S4.0 GitHub primary readiness gate | 完成草案 | `source_control_primary_readiness_gate_v1` 已建立;8 個 candidate repos、7 個 in-scope blocked、0 個 primary ready;S4.10 已補 target owner response gate;S4.11 已補 refs truth owner response gate | AwoooP 可顯示 parity、owner、rollback ADR 缺口,不可切 primary | +| S4.0 GitHub primary readiness gate | 完成草案 | `source_control_primary_readiness_gate_v1` 已建立;8 個 candidate repos、7 個 in-scope blocked、0 個 primary ready;S4.10 已補 target owner response gate;S4.11 已補 refs truth owner response gate;S4.12 已補 workflow / secret 名稱 owner response gate | AwoooP 可顯示 parity、owner、rollback ADR 缺口,不可切 primary | | S4.1 Workflow / Secret 名稱 inventory 契約 | 完成草案 | `source_control_workflow_secret_name_inventory_v1` 已建立;8 個 candidate repos、7 個 in-scope repos 尚缺實際 inventory、0 個 complete、禁止收集 secret value | AwoooP 可顯示 workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / secret 名稱缺口,不可修改 workflow 或 secret | | S4.2 Workflow / Secret 名稱 local evidence | 完成草案 | 已建立 local read-only collector 與 snapshot;7 個 local repos visible、4 個 local evidence repos、31 個 workflow files、43 個 referenced secret names、secret value detected=false | 補 webhook / deploy key / branch protection / repository secret parity 的 redacted evidence;仍不可切 primary | | S4.3 Workflow / Secret 名稱 redacted export request | 完成草案 | 已建立 export request schema / snapshot / 人讀版;7 個 in-scope repos、5 類 export lanes:webhook、runner、deploy key、branch protection / CODEOWNERS、repository secret name parity;write token allowed=false | repo owner 或未來只讀 API 依 request 補 redacted export;仍不可收 secret value、不可修改 GitHub/Gitea | +| S4.12 Workflow / Secret Name Owner Response 收件包 | 完成草案 | 已建立 owner response schema / snapshot / 人讀版;5 個 response templates、8 個 acceptance checks、10 個 rejection rules、candidate repos 8、in-scope repos 7、received response 0、accepted 0、execution authorized=false | owner 依模板回覆 webhook、runner、deploy key、branch protection / CODEOWNERS、repository secret name parity;response 通過只更新 read-only inventory / export request / readiness wording,不代表收 secret value、改 workflow、啟用 runner 或 primary approval | | S4.4 GitHub Primary rollback ADR | 完成草案 | 已建立 rollback ADR schema / snapshot / 人讀版;7 個 in-scope rollback drafts、0 owner approved、0 dry-run completed、0 active cutover | repo owner 審查 rollback owner、validation window 與 triggers;仍不可切 primary 或執行 rollback | | S4.5 Gitea 認證清冊匯出請求 | 完成草案 | 已建立匯出請求 schema / snapshot / 人讀版;目前未認證公開範圍 repo 2 個、本機可見 Gitea unique repo 4 個、覆蓋缺口 2 個、匯出來源選項 2 類;允許收集 token value=false | repo owner 依只讀 token API 或已脫敏管理匯出補私有 / 內部全量 repo list;仍不可保存 token、不可 write Gitea、不可 refs sync | | S4.6 Gitea 認證清冊匯入驗收契約 | 完成草案 | 已建立匯入驗收 schema / snapshot / 人讀版;目前 received payload 0、accepted 0、rejected 0;定義 10 個驗收檢查、10 個拒收規則與 4 個 quarantine lanes | owner 提供脫敏 payload 後先驗收 / 拒收 / 隔離;仍不可把驗收當 primary approval | @@ -101,6 +102,8 @@ | Source Control workflow / secret name local collector | `scripts/security/source-control-workflow-secret-name-local-inventory.py` | | Source Control workflow / secret name export request | `docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-EXPORT-REQUEST.md` | | Source Control workflow / secret name export request JSON | `docs/security/source-control-workflow-secret-name-export-request.snapshot.json` | +| Source Control workflow / secret name owner response 收件包 | `docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md` | +| Source Control workflow / secret name owner response JSON | `docs/security/source-control-workflow-secret-name-owner-response.snapshot.json` | | Kali 112 integration status | `docs/security/KALI-INTEGRATION-STATUS.md` | | Kali 112 integration status JSON | `docs/security/kali-integration-status.snapshot.json` | | Security finding contract | `docs/security/SECURITY-FINDING-CONTRACT.md` | @@ -162,8 +165,9 @@ 1. 先依 S4.9 `GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md` 收到並驗收 S4.7 `GITEA-INVENTORY-COVERAGE-ATTESTATION.md` 的 owner response;S4.8 已把這件事接到既有 approval queue / gate / review packet / follow-up runtime gate。之後再依 S4.5 `GITEA-AUTHENTICATED-INVENTORY-EXPORT-REQUEST.md` 取得 Gitea 認證清冊;收到 payload 後依 S4.6 `GITEA-AUTHENTICATED-INVENTORY-IMPORT-ACCEPTANCE.md` 驗收 / 拒收 / 隔離。目前未認證公開範圍 2 個、本機可見 Gitea unique 4 個、覆蓋缺口 2 個、attestation items 5 個、owner response 0 筆;只能用只讀 token API 或已脫敏管理匯出補私有 / 內部 server-side 全量 repo list,不保存 token value。 2. 依 S4.10 `GITHUB-TARGET-OWNER-DECISION-RESPONSE.md` 與 `SOURCE-CONTROL-APPROVAL-BOARD.md` 對 7 個 `approval_required=true` 的 GitHub target 做 owner / visibility / canonical response;目前 response 0 筆、accepted 0 筆,通過後也只更新 read-only decision table / approval package / readiness gate,不代表 repo creation、visibility change、refs sync 或 primary approval。 3. 依 S4.11 `SOURCE-CONTROL-REF-TRUTH-OWNER-RESPONSE.md` 與 `SOURCE-CONTROL-REF-TRUTH-CLASSIFICATION.md` 對 `awoooi`、`clawbot-v5`、`wooo-aiops` 做單 repo / 單 ref owner response 驗收;response 通過也只更新 read-only classification / reconcile / readiness wording,仍不得 push/delete refs 或 force push。 -4. 對 `ewoooc` / `momo-pro-system` 完成 server-side canonical 判定。 -5. 依 `KALI-SCAN-SCOPE-APPROVAL-PACKAGE.md` 取得 safe crawl、credentialed scan、runtime ingestion、full-upgrade / reboot 等 gate 的人工批准;不得直接接 `/execute`。 -6. AwoooP 主線先讀 `security_mirror_readiness_v1`、`security_mirror_intake_plan_v1`、`security_mirror_event_v1`、`security_mirror_route_v1`、`security_mirror_acceptance_v1`、`security_mirror_quarantine_v1`、`security_mirror_dry_run_v1`、`security_mirror_status_rollup_v1`、`security_approval_gate_v1`、`security_approval_decision_record_v1`、`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`,只建立 mirror-only / read-only policy 入口,不新增執行按鈕;其中 Gitea inventory 需同時顯示 S4.5 認證清冊匯出請求、S4.6 匯入驗收契約、S4.7 owner coverage attestation 與 S4.9 owner response 收件包,GitHub target 決策需同時顯示 S4.10 owner decision response templates,refs truth 需同時顯示 S4.11 owner response templates,workflow / secret inventory 需同時顯示 S4.3 redacted export request,primary readiness 需同時顯示 S4.4 rollback ADR 草案。 -7. AwoooP 主線消費 `security_rollout_policy_v1` 時,只做 read-only policy,不做 runtime blocking。 -8. AwoooP 主線再讀 `security_approval_queue_v1`、`security_approval_gate_v1`、`security_approval_decision_record_v1`、`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` 與 `security_supply_chain_contract_manifest_v1`,顯示 review order、批准範圍、審查封包、決策紀錄、決策後狀態、後續 runtime gate 準備條件、Gitea inventory 覆蓋缺口、S4.5 認證匯出請求、S4.6 匯入驗收 / 隔離規則、S4.7 owner attestation items、S4.9 owner response templates、S4.10 GitHub target owner response templates、S4.11 refs truth owner response templates、GitHub primary readiness blockers、rollback ADR 草案、workflow / secret 名稱 inventory 缺口、redacted export request 與 blocked reason,不新增 execution router。 +4. 依 S4.12 `SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md` 與 `SOURCE-CONTROL-WORKFLOW-SECRET-NAME-EXPORT-REQUEST.md` 對 webhook、runner、deploy key、branch protection / CODEOWNERS、repository secret name parity 做 owner response 驗收;response 通過也只更新 read-only inventory / export request / readiness wording,仍不得收 secret value、改 workflow 或啟用 runner。 +5. 對 `ewoooc` / `momo-pro-system` 完成 server-side canonical 判定。 +6. 依 `KALI-SCAN-SCOPE-APPROVAL-PACKAGE.md` 取得 safe crawl、credentialed scan、runtime ingestion、full-upgrade / reboot 等 gate 的人工批准;不得直接接 `/execute`。 +7. AwoooP 主線先讀 `security_mirror_readiness_v1`、`security_mirror_intake_plan_v1`、`security_mirror_event_v1`、`security_mirror_route_v1`、`security_mirror_acceptance_v1`、`security_mirror_quarantine_v1`、`security_mirror_dry_run_v1`、`security_mirror_status_rollup_v1`、`security_approval_gate_v1`、`security_approval_decision_record_v1`、`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`,只建立 mirror-only / read-only policy 入口,不新增執行按鈕;其中 Gitea inventory 需同時顯示 S4.5 認證清冊匯出請求、S4.6 匯入驗收契約、S4.7 owner coverage attestation 與 S4.9 owner response 收件包,GitHub target 決策需同時顯示 S4.10 owner decision response templates,refs truth 需同時顯示 S4.11 owner response templates,workflow / secret inventory 需同時顯示 S4.3 redacted export request 與 S4.12 owner response templates,primary readiness 需同時顯示 S4.4 rollback ADR 草案。 +8. AwoooP 主線消費 `security_rollout_policy_v1` 時,只做 read-only policy,不做 runtime blocking。 +9. AwoooP 主線再讀 `security_approval_queue_v1`、`security_approval_gate_v1`、`security_approval_decision_record_v1`、`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` 與 `security_supply_chain_contract_manifest_v1`,顯示 review order、批准範圍、審查封包、決策紀錄、決策後狀態、後續 runtime gate 準備條件、Gitea inventory 覆蓋缺口、S4.5 認證匯出請求、S4.6 匯入驗收 / 隔離規則、S4.7 owner attestation items、S4.9 owner response templates、S4.10 GitHub target owner response templates、S4.11 refs truth owner response templates、S4.12 workflow / secret 名稱 owner response templates、GitHub primary readiness blockers、rollback ADR 草案、workflow / secret 名稱 inventory 缺口、redacted export request 與 blocked reason,不新增 execution router。 diff --git a/docs/security/SOURCE-CONTROL-MIGRATION-MATRIX.md b/docs/security/SOURCE-CONTROL-MIGRATION-MATRIX.md index 814956cc..dece973e 100644 --- a/docs/security/SOURCE-CONTROL-MIGRATION-MATRIX.md +++ b/docs/security/SOURCE-CONTROL-MIGRATION-MATRIX.md @@ -13,6 +13,7 @@ | Source Control draft reconcile plan | `docs/security/SOURCE-CONTROL-RECONCILE-PLAN.md` | | Source Control branch/tag detail diff | `docs/security/SOURCE-CONTROL-REF-DETAIL-DIFF.md` | | Source Control ref truth classification | `docs/security/SOURCE-CONTROL-REF-TRUTH-CLASSIFICATION.md` | +| Workflow / secret name owner response | `docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md` | | 原則 | 只做盤點與分類,不做同步、不刪除、不切 primary | ## 0. 核心結論 @@ -122,6 +123,8 @@ Repo-by-repo approval package 已建立,7 個 approval-required targets 皆為 Ref truth classification 已建立,將 `awoooi`、`clawbot-v5`、`wooo-aiops` 的 141 個 refs 差異拆成 review lane。`main` / `dev` 屬真相來源判定,`drift/adopt-*` 先列 deprecated candidate,release / UAT tags 先列保留判定;S4.11 已補 owner response 收件包,5 個 templates、received / accepted response 皆為 0。不得把分類結果或 response packet 直接執行成同步、刪除、force push 或 primary switch。 +Workflow / secret name owner response 已建立,S4.12 補 5 個 templates,對應 webhook、runner、deploy key、branch protection / CODEOWNERS 與 repository secret name parity;received / accepted response 皆為 0。不得把 response packet 當成 secret value collection、workflow modification、GitHub hosted runner enablement 或 primary approval。 + ## 3. 必要驗收 gate 任何 repo 進入「已可切 GitHub primary」之前,都必須通過: @@ -152,6 +155,7 @@ Ref truth classification 補充:完整 review lane 見 `docs/security/SOURCE-C 1. 先批准 Gitea read-only inventory package,再用只讀 token 或管理匯出補齊 Gitea server repo list。 2. 依 GitHub target repo-by-repo approval package 處理 7 個 approval-required target。 3. 依 S4.11 ref truth owner response 收件包與 classification 釐清 `wooo/awoooi`、`wooo/clawbot-v5`、`wooo/wooo-aiops` 的雙端分歧來源;仍不得 push/delete refs。 -4. 釐清 `wooo/ewoooc`、`root/momo-pro-system`、`momo-pro-system`、`momo_pro_system` 的 canonical 關係。 -5. 釐清 `bitan-pharmacy`、`tsenyang-website` 是否仍 active,並決定 GitHub owner / visibility。 -6. 產出 GitHub primary ADR 前,不做主控切換。 +4. 依 S4.12 workflow / secret name owner response 收件包補 webhook、runner、deploy key、branch protection / CODEOWNERS、repository secret name parity 的 redacted disposition;仍不得收 secret value、改 workflow 或啟用 hosted runner。 +5. 釐清 `wooo/ewoooc`、`root/momo-pro-system`、`momo-pro-system`、`momo_pro_system` 的 canonical 關係。 +6. 釐清 `bitan-pharmacy`、`tsenyang-website` 是否仍 active,並決定 GitHub owner / visibility。 +7. 產出 GitHub primary ADR 前,不做主控切換。 diff --git a/docs/security/SOURCE-CONTROL-PRIMARY-READINESS-GATE.md b/docs/security/SOURCE-CONTROL-PRIMARY-READINESS-GATE.md index c21e5426..8ee785cc 100644 --- a/docs/security/SOURCE-CONTROL-PRIMARY-READINESS-GATE.md +++ b/docs/security/SOURCE-CONTROL-PRIMARY-READINESS-GATE.md @@ -9,6 +9,7 @@ | Rollback ADR | `docs/security/source-control-primary-rollback-adr.snapshot.json` | | GitHub target owner response | `docs/security/GITHUB-TARGET-OWNER-DECISION-RESPONSE.md` | | Ref truth owner response | `docs/security/SOURCE-CONTROL-REF-TRUTH-OWNER-RESPONSE.md` | +| Workflow / secret owner response | `docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md` | | 模式 | `primary_readiness_gate_only` | | runtime 執行授權 | `false` | @@ -37,7 +38,7 @@ |------|----------|------| | Gitea authenticated inventory | blocked | private/internal 全量 repo list 尚未完成;S4.7 owner coverage attestation 與 S4.9 owner response 仍未收到 | | refs truth / branch-tag parity | blocked | 3 個 mapped repos 仍有 refs drift;S4.11 已補 refs truth owner response 收件包,received / accepted response 皆為 0 | -| workflow / runner / secret name parity | missing evidence | S4.1 已建立 inventory 契約;尚未有實際 redacted workflow、webhook、runner、secret 名稱 snapshot | +| workflow / runner / secret name parity | missing evidence | S4.1 已建立 inventory 契約;S4.12 已補 owner response 收件包,received / accepted response 皆為 0;尚未有實際 redacted workflow、webhook、runner、secret 名稱 snapshot | | owner / visibility / canonical | pending review | 7 個 in-scope targets 仍需人工決策;S4.10 已補 owner response 收件包,received / accepted response 皆為 0 | | rollback ADR | pending review | S4.4 已建立 rollback ADR 草案;7 個 in-scope repos 仍需 owner approval、dry-run 與 validation window | @@ -46,12 +47,13 @@ 1. 顯示每個 repo 的 readiness state、blockers 與 evidence refs。 2. 顯示 `primary_ready_count=0`。 3. 將 7 個 in-scope repos 維持在 approval / review lane。 -4. 顯示哪些 evidence 仍缺:Gitea authenticated inventory、S4.7 owner coverage attestation、S4.9 owner response、S4.11 refs truth owner response、workflow/runner/secret name inventory、rollback ADR。 +4. 顯示哪些 evidence 仍缺:Gitea authenticated inventory、S4.7 owner coverage attestation、S4.9 owner response、S4.11 refs truth owner response、S4.12 workflow / secret name owner response、workflow/runner/secret name inventory、rollback ADR。 5. 連到 S4.10 `github_target_owner_decision_response_v1` 顯示 7 個 owner decision response templates、8 個 acceptance checks、10 個 rejection rules,且 received / accepted response 皆為 0。 6. 連到 S4.11 `source_control_ref_truth_owner_response_v1` 顯示 5 個 refs owner response templates、8 個 acceptance checks、10 個 rejection rules,且 received / accepted response 皆為 0。 7. 連到 `source_control_workflow_secret_name_inventory_v1` 顯示 8 個 candidate repos 的 inventory lane 缺口與 S4.2 local evidence;只保存 secret 名稱與 owner,不保存 value。 -8. 連到 `source_control_primary_rollback_adr_v1` 顯示 7 個 in-scope repos 的 rollback owner、trigger 與 validation window 草案。 -9. 把狀態寫入 Audit evidence 與 Operator Console。 +8. 連到 S4.12 `source_control_workflow_secret_name_owner_response_v1` 顯示 5 個 owner response templates、8 個 acceptance checks、10 個 rejection rules,且 received / accepted response 皆為 0。 +9. 連到 `source_control_primary_rollback_adr_v1` 顯示 7 個 in-scope repos 的 rollback owner、trigger 與 validation window 草案。 +10. 把狀態寫入 Audit evidence 與 Operator Console。 ## 4. AwoooP 不可做 @@ -67,6 +69,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 收件包;它們只是 scope decision 與 response 驗收框架,不是 migration approval、repo creation approval、visibility change approval、refs sync approval、delete approval、force-push 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 收件包,S4.10 已補上 GitHub target owner decision response 收件包,S4.11 已補上 refs truth owner response 收件包,S4.12 已補上 workflow / secret 名稱 owner response 收件包;它們只是 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/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-EXPORT-REQUEST.md b/docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-EXPORT-REQUEST.md index d13f15c3..082c0a51 100644 --- a/docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-EXPORT-REQUEST.md +++ b/docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-EXPORT-REQUEST.md @@ -7,6 +7,7 @@ | Schema | `docs/schemas/source_control_workflow_secret_name_export_request_v1.schema.json` | | Snapshot | `docs/security/source-control-workflow-secret-name-export-request.snapshot.json` | | 來源契約 | `source_control_workflow_secret_name_inventory_v1` | +| Owner response 收件包 | `docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md` / `docs/security/source-control-workflow-secret-name-owner-response.snapshot.json` | | 模式 | `redacted_export_request_only` | | runtime 執行授權 | `false` | @@ -14,7 +15,7 @@ S4.3 把 S4.2 還缺的控制面 evidence 拆成可交接的 redacted export request。 -這不是 API 執行、不是 GitHub primary cutover、也不是 workflow / secret 修改。它只是告訴 repo owner 或未來只讀匯出工具:每個 repo 要補哪些欄位、哪些欄位可以保存、哪些敏感值必須拒收。 +這不是 API 執行、不是 GitHub primary cutover、也不是 workflow / secret 修改。它只是告訴 repo owner 或未來只讀匯出工具:每個 repo 要補哪些欄位、哪些欄位可以保存、哪些敏感值必須拒收。S4.12 已補 owner response 收件包,讓回覆可審、可驗收、可拒收,但仍不授權任何變更。 ## 1. 摘要 @@ -24,6 +25,8 @@ S4.3 把 S4.2 還缺的控制面 evidence 拆成可交接的 redacted export req | In-scope export requests | 7 | | External scope review | 1 | | Export lanes | 5 | +| S4.12 response templates | 5 | +| S4.12 received / accepted / rejected | `0 / 0 / 0` | | Webhook export request repos | 2 | | Runner export request repos | 4 | | Deploy key export request repos | 1 | @@ -63,6 +66,7 @@ S4.3 把 S4.2 還缺的控制面 evidence 拆成可交接的 redacted export req 3. 顯示 GitHub hosted runner 可能造成額度消耗的 review lane。 4. 把完成的 redacted export 作為 Audit evidence 等待人工審查。 5. 若 payload 含敏感值,送進 mirror quarantine。 +6. 顯示 S4.12 owner response templates、acceptance checks 與 rejection rules。 ## 5. AwoooP 不可做 @@ -76,4 +80,6 @@ S4.3 把 S4.2 還缺的控制面 evidence 拆成可交接的 redacted export req S4.1 建立 inventory gate,S4.2 補本機 workflow / CODEOWNERS / referenced secret name evidence,S4.3 補「下一步匯出請求包」。 +S4.12 補「owner response 收件包」,固定 5 類 export lanes 的回覆欄位與拒收規則,避免後續誤收 secret value、誤用 write token、誤啟 GitHub hosted runner 或誤改 workflow。 + 這仍然是低摩擦框架期:先把資料責任、欄位邊界與拒收規則定清楚,避免後續真的接 owner export 或只讀 API 時誤收秘密值、誤用 write token,或誤把資料補齊當成主控切換批准。 diff --git a/docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-INVENTORY.md b/docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-INVENTORY.md index ec2101b8..1494a8e8 100644 --- a/docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-INVENTORY.md +++ b/docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-INVENTORY.md @@ -8,6 +8,7 @@ | Snapshot | `docs/security/source-control-workflow-secret-name-inventory.snapshot.json` | | Local evidence | `docs/security/source-control-workflow-secret-name-local-evidence.snapshot.json` | | Export request | `docs/security/source-control-workflow-secret-name-export-request.snapshot.json` | +| Owner response 收件包 | `docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md` / `docs/security/source-control-workflow-secret-name-owner-response.snapshot.json` | | 模式 | `inventory_contract_only` | | runtime 執行授權 | `false` | @@ -23,6 +24,8 @@ S4.2 已補本機可見 evidence:4 個 repos 有 workflow / CODEOWNERS evidenc S4.3 已補 redacted export request package:7 個 in-scope repos 需要 owner / read-only export,5 類 export lanes 包含 webhook、runner、deploy key、branch protection / CODEOWNERS 與 repository secret name parity;所有 export 都禁止 secret value 與 write token。 +S4.12 已補 owner response 收件包:5 個 response templates 對應 webhook、runner、deploy key、branch protection / CODEOWNERS 與 repository secret name parity;目前 received / accepted response 皆為 0。response 通過也只更新 read-only evidence,不代表修改 workflow、secret、runner、deploy key 或 branch protection。 + ## 1. 目前狀態 | 指標 | 數量 | @@ -38,6 +41,8 @@ S4.3 已補 redacted export request package:7 個 in-scope repos 需要 owner | Local referenced secret names | 43 | | Redacted export request repos | 7 | | Redacted export lanes | 5 | +| S4.12 response templates | 5 | +| S4.12 received / accepted / rejected | `0 / 0 / 0` | ## 2. Inventory Lanes @@ -60,6 +65,7 @@ S4.3 已補 redacted export request package:7 個 in-scope repos 需要 owner 5. 將失敗或含敏感值 payload 交給 mirror quarantine。 6. 顯示 S4.2 本機 evidence 與仍缺的 API / export lanes。 7. 顯示 S4.3 export request 的欄位清單、拒收欄位與 acceptance gate。 +8. 顯示 S4.12 owner response templates、acceptance checks 與 rejection rules。 ## 4. AwoooP 不可做 @@ -79,4 +85,6 @@ S4.2 讓本機可見 workflow / CODEOWNERS / referenced secret names 先形成 p S4.3 讓後續 webhook、runner、deploy key、branch protection / CODEOWNERS 與 repository secret parity 的 owner / read-only export 有明確的欄位、拒收規則與驗收 gate。 +S4.12 讓 owner response 有固定收件格式與拒收規則,避免 GitHub hosted runner 額度風險、secret value、write token 或未脫敏 payload 被誤接進 AwoooP。 + 這仍是低摩擦框架期:只定義欄位、只顯示缺口、只留痕,不碰任何實際 secret 或發版流程。後續即使取得 redacted export,也只代表 evidence 可 review,不代表 GitHub primary ready。 diff --git a/docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md b/docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md new file mode 100644 index 00000000..c0297112 --- /dev/null +++ b/docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md @@ -0,0 +1,126 @@ +# Workflow / Secret Name Owner Response 收件包 + +| 項目 | 內容 | +|------|------| +| 日期 | 2026-05-17 | +| 狀態 | 草案,等待 owner response | +| 資料契約 | `docs/schemas/source_control_workflow_secret_name_owner_response_v1.schema.json` | +| 快照 | `docs/security/source-control-workflow-secret-name-owner-response.snapshot.json` | +| 來源契約 | `source_control_workflow_secret_name_inventory_v1` | +| 目標契約 | `source_control_workflow_secret_name_export_request_v1` | +| 模式 | `owner_workflow_secret_name_response_intake_only` | +| 執行面授權 | `false` | + +## 0. 核心結論 + +S4.12 補的是「owner 要怎麼回覆 workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / repository secret 名稱 parity」。 + +S4.12 不是 secret 搬移、不是 workflow 修改、不是 runner 啟用、不是 deploy key 變更,也不是 GitHub primary approval。它只把 owner response 的欄位、可接受決策、驗收規則、拒收規則與允許輸出固定下來,讓 AwoooP 可以只讀顯示並等待人工補證。 + +此文件不要求貼 token,不接受 raw secret,不使用 write token,不修改 workflow、webhook、runner、deploy key、branch protection、CODEOWNERS 或 repository secret,不建立 repo、不 sync refs、不切 primary,也不停用 Gitea。 + +## 1. Response 摘要 + +| 指標 | 值 | +|------|----| +| owner response 狀態 | `waiting_owner_response` | +| candidate repos | 8 | +| in-scope repos | 7 | +| redacted export requests | 7 | +| export lanes | 5 | +| local evidence repos | 4 | +| local workflow files | 31 | +| local referenced secret names | 43 | +| response templates | 5 | +| 已收到 response | 0 | +| 已接受 response | 0 | +| 已拒收 response | 0 | +| acceptance checks | 8 | +| rejection rules | 10 | +| 允許收集 secret value | `false` | +| 允許 write token | `false` | +| 授權修改 workflow / webhook / runner / deploy key / branch protection / secret | `false` | +| 授權啟用 GitHub hosted runner | `false` | +| 授權 sync refs / 切 GitHub primary | `false` | + +## 2. Owner Response 必填欄位 + +每筆 response 至少要能回答: + +1. `owner_role_or_team`:回覆者角色或團隊,不要求個人敏感資訊。 +2. `decision`:必須是該 lane template 允許的決策值。 +3. `decision_reason`:為什麼做此 redacted export / no-data / hold 判定。 +4. `repo` 與 `provider`:必須標示 GitHub / Gitea / local evidence 來源。 +5. lane-specific owner:例如 `webhook_owner`、`runner_owner`、`key_owner`、`ruleset_owner`、`rotation_owner`。 +6. lane-specific metadata:只能填允許欄位,例如 host redacted、runner label、key name、required check names、secret name list。 +7. `evidence_refs`:只能指向 repo 內文件、snapshot 或 owner 提供的脫敏 metadata。 + +## 3. 五個 Response Template + +| Template | Lane | 覆蓋範圍 | 驗收重點 | +|----------|------|----------|----------| +| `response-webhook-redacted-export` | `webhook_redacted_export_request` | `awoooi`、`wooo-aiops` | 只收 redacted host / event types / owner,不收 webhook secret 或 URL token | +| `response-runner-label-owner` | `runner_label_owner_export_request` | `awoooi`、`wooo-aiops`、`wooo-infra-config`、`ewoooc` | 確認 self-hosted / hosted 與額度風險,不授權啟用 GitHub hosted runner | +| `response-deploy-key-redacted-export` | `deploy_key_redacted_export_request` | `wooo-infra-config` | 只收 key name / read-only flag / owner,不收 private key 或完整 public key | +| `response-branch-protection-codeowners` | `branch_protection_codeowners_export_request` | `awoooi`、`clawbot-v5`、`wooo-infra-config`、`ewoooc` | 只收 required checks / CODEOWNERS path / ruleset owner,不修改規則 | +| `response-repository-secret-name-parity` | `repository_secret_name_parity_export_request` | 7 個 in-scope repos | 只收 secret name / scope / present-absent / owner,不收 value、hash、partial token | + +## 4. 可接受決策值 + +| Lane | Decision | +|------|----------| +| `webhook_redacted_export_request` | `provide_redacted_webhook_inventory_candidate`、`mark_no_webhook_candidate`、`hold_pending_webhook_owner`、`unknown_requires_more_evidence` | +| `runner_label_owner_export_request` | `keep_self_hosted_runner_candidate`、`approve_hosted_runner_risk_review_candidate`、`mark_no_runner_candidate`、`hold_pending_runner_owner`、`unknown_requires_more_evidence` | +| `deploy_key_redacted_export_request` | `provide_deploy_key_name_scope_candidate`、`mark_no_deploy_key_candidate`、`mark_write_capable_key_risk_candidate`、`hold_pending_key_owner`、`unknown_requires_more_evidence` | +| `branch_protection_codeowners_export_request` | `provide_branch_protection_codeowners_candidate`、`mark_no_branch_protection_candidate`、`hold_pending_ruleset_owner`、`unknown_requires_more_evidence` | +| `repository_secret_name_parity_export_request` | `provide_secret_name_presence_map_candidate`、`mark_no_repository_secret_candidate`、`hold_pending_secret_owner`、`unknown_requires_more_evidence` | + +## 5. 驗收規則 + +1. response 必須對應 S4.3 既有 export lane。 +2. `decision` 必須在該 lane template 的允許值內。 +3. 必須標示 repo、provider 與 lane;批次 secret name parity 必須有可重現 repo list。 +4. 必須有 owner 或補證 owner;未知時要明確選 hold / unknown。 +5. 只能包含 lane allowed fields,不得加入 request body、header、credential 或 raw config。 +6. 不得包含 secret、token、cookie、private key、deploy key、runner token、webhook secret、password、hash、masked token 或 partial credential。 +7. 不得要求 write API、rotate secret、修改 workflow、webhook、runner、deploy key 或 branch protection。 +8. 不得要求建立 repo、sync refs、切 GitHub primary、停用 Gitea,或把 inventory 視為 primary ready。 + +## 6. 必須拒收 + +1. secret value、PAT、cookie、session、CSRF token、private key、deploy key value、runner token、webhook secret 或 partial credential。 +2. 完整 webhook payload URL、query token、authorization header、request body 或未脫敏截圖。 +3. runner registration token、runner admin token、SSH private key、host password 或 API token。 +4. deploy key private material、完整 public key、token value、password 或 credential value。 +5. secret value、secret hash、partial token、masked token 或任何可還原片段。 +6. 要求 write API、修改 workflow/webhook/runner/deploy key/branch protection/CODEOWNERS 或 rotate secret。 +7. 要求建立 repo、sync refs、切 GitHub primary、停用或封存 Gitea。 +8. 缺 repo、provider、lane owner 或 no-data disposition。 +9. 把 owner response 當成 inventory complete、workflow ready、secret parity complete 或 GitHub primary ready。 +10. 任何不確定是否含敏感值、私有 URL 憑證、完整 key material 或未脫敏截圖的回覆。 + +## 7. AwoooP 可做 + +1. 顯示 5 個 owner response templates。 +2. 顯示 8 個 acceptance checks 與 10 個 rejection rules。 +3. 顯示 GitHub hosted runner 額度風險 review lane,但不啟用 hosted runner。 +4. 在 owner response 到來後,只更新 read-only inventory、export request、primary readiness blocker wording 與 status rollup。 +5. 將不完整或可疑 response 放進 mirror quarantine。 +6. 持續顯示 `received_response_count=0`、`accepted_response_count=0`,直到真的收到脫敏 response。 + +## 8. AwoooP 不可做 + +1. 不要求使用者貼 token、secret、private key、cookie、session、deploy key 或 runner token。 +2. 不把 response 當成 workflow 修改批准。 +3. 不把 response 當成 secret 建立 / 複製 / rotate 批准。 +4. 不把 response 當成 GitHub hosted runner 啟用批准。 +5. 不把 response 當成 GitHub primary approval。 +6. 不建立 GitHub repo。 +7. 不修改 GitHub/Gitea repo。 +8. 不新增執行按鈕。 + +## 9. 階段定位 + +S4.12 是 S4.1 / S4.2 / S4.3 後面的 owner response 收件包。 + +它讓 workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / repository secret 名稱 parity 的 owner response 變得可審、可驗收、可拒收,但仍停在框架期。真正進入 GitHub primary 前,仍必須等 Gitea inventory、GitHub target response、refs truth、workflow-secret parity、rollback ADR、owner approval 與後續 runtime gate 全部補齊。 diff --git a/docs/security/security-approval-gate.snapshot.json b/docs/security/security-approval-gate.snapshot.json index 8d731311..2afd52bd 100644 --- a/docs/security/security-approval-gate.snapshot.json +++ b/docs/security/security-approval-gate.snapshot.json @@ -140,7 +140,9 @@ "decision_options": ["approve_scope", "reject", "defer", "request_more_evidence"], "allowed_after_approval": [ "依 S4.10 驗收 owner decision response", + "依 S4.12 驗收 workflow / secret 名稱 owner response", "逐 repo 更新 owner/visibility/canonical decision", + "更新 workflow / secret name parity read-only wording", "產生 draft reconcile plan 或 ADR", "更新 GitHub target decision snapshot" ], @@ -148,6 +150,7 @@ "建立 repo", "修改 visibility", "把 S4.10 response packet 當成 repo creation 或 visibility approval", + "把 S4.12 response packet 當成 secret value collection、workflow modification 或 runner enablement approval", "push refs", "delete refs", "切 GitHub primary" @@ -158,7 +161,9 @@ "docs/security/source-control-approval-board.snapshot.json", "docs/security/GITHUB-TARGET-REPO-APPROVAL-PACKAGE.md", "docs/security/GITHUB-TARGET-OWNER-DECISION-RESPONSE.md", - "docs/security/github-target-owner-decision-response.snapshot.json" + "docs/security/github-target-owner-decision-response.snapshot.json", + "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md", + "docs/security/source-control-workflow-secret-name-owner-response.snapshot.json" ] }, { diff --git a/docs/security/security-approval-queue.snapshot.json b/docs/security/security-approval-queue.snapshot.json index 77168f15..f96ee39d 100644 --- a/docs/security/security-approval-queue.snapshot.json +++ b/docs/security/security-approval-queue.snapshot.json @@ -126,7 +126,7 @@ "risk": "HIGH", "state": "pending_approval", "recommended_awooop_mode": "approve_required", - "requested_decision": "是否依 S4.10 逐 repo 收到並驗收 GitHub target、owner、visibility、canonical response;此 bundle 不授權執行。", + "requested_decision": "是否依 S4.10 逐 repo 收到並驗收 GitHub target、owner、visibility、canonical response,並依 S4.12 驗收 workflow / secret 名稱 owner response;此 bundle 不授權執行。", "blocked_until_approved": true, "required_reviewers": [ "migration-engineer", @@ -138,11 +138,15 @@ "docs/security/source-control-approval-board.snapshot.json", "docs/security/GITHUB-TARGET-REPO-APPROVAL-PACKAGE.md", "docs/security/GITHUB-TARGET-OWNER-DECISION-RESPONSE.md", - "docs/security/github-target-owner-decision-response.snapshot.json" + "docs/security/github-target-owner-decision-response.snapshot.json", + "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md", + "docs/security/source-control-workflow-secret-name-owner-response.snapshot.json" ], "allowed_after_approval": [ "依 S4.10 驗收 owner decision response", + "依 S4.12 驗收 workflow / secret 名稱 owner response", "逐 repo 更新 owner/visibility/canonical decision", + "更新 workflow / secret name parity read-only wording", "產生 draft reconcile plan 或 ADR", "更新 GitHub target decision snapshot" ], @@ -150,6 +154,7 @@ "建立 repo", "修改 visibility", "把 S4.10 response packet 當成 repo creation 或 visibility approval", + "把 S4.12 response packet 當成 secret value collection、workflow modification 或 runner enablement approval", "push refs", "delete refs", "切 GitHub primary" diff --git a/docs/security/security-approval-review-packet.snapshot.json b/docs/security/security-approval-review-packet.snapshot.json index dd811b92..57234de6 100644 --- a/docs/security/security-approval-review-packet.snapshot.json +++ b/docs/security/security-approval-review-packet.snapshot.json @@ -169,22 +169,26 @@ "docs/security/source-control-approval-board.snapshot.json", "docs/security/GITHUB-TARGET-REPO-APPROVAL-PACKAGE.md", "docs/security/GITHUB-TARGET-OWNER-DECISION-RESPONSE.md", - "docs/security/github-target-owner-decision-response.snapshot.json" + "docs/security/github-target-owner-decision-response.snapshot.json", + "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md", + "docs/security/source-control-workflow-secret-name-owner-response.snapshot.json" ], "allowed_pre_decision_actions": [ "顯示 7 個 approval-required target", "顯示 S4.10 owner response templates、received_response_count=0 與 rejection rules", + "顯示 S4.12 workflow / secret 名稱 owner response templates、received_response_count=0 與 rejection rules", "要求 repo owner 補 owner/visibility/canonical 判定", "維持 refs action disabled" ], "allowed_after_decision_actions": [ - "若 approve_scope,只能更新 S4.10 response 驗收結果、決策草案、draft reconcile plan 或 ADR", + "若 approve_scope,只能更新 S4.10 / S4.12 response 驗收結果、決策草案、workflow parity wording、draft reconcile plan 或 ADR", "任何 repo creation 或 visibility change 仍需後續 runtime gate" ], "still_forbidden": [ "建立 repo", "修改 visibility", "把 S4.10 response packet 當成 repo creation 或 visibility approval", + "把 S4.12 response packet 當成 secret value collection、workflow modification 或 runner enablement approval", "push refs", "delete refs", "切 GitHub primary" diff --git a/docs/security/security-followup-runtime-gate.snapshot.json b/docs/security/security-followup-runtime-gate.snapshot.json index 545981a7..3f94334e 100644 --- a/docs/security/security-followup-runtime-gate.snapshot.json +++ b/docs/security/security-followup-runtime-gate.snapshot.json @@ -13,7 +13,8 @@ "docs/security/security-rollout-policy.snapshot.json", "docs/security/gitea-inventory-coverage-attestation.snapshot.json", "docs/security/gitea-inventory-owner-attestation-response.snapshot.json", - "docs/security/source-control-ref-truth-owner-response.snapshot.json" + "docs/security/source-control-ref-truth-owner-response.snapshot.json", + "docs/security/source-control-workflow-secret-name-owner-response.snapshot.json" ], "summary": { "total_gate_templates": 8, @@ -157,6 +158,7 @@ "applies_after_decision": "approve_scope", "minimum_required_evidence": [ "S4.10 owner decision response 驗收結果:docs/security/github-target-owner-decision-response.snapshot.json", + "S4.12 workflow / secret 名稱 owner response 驗收結果:docs/security/source-control-workflow-secret-name-owner-response.snapshot.json", "repo owner / visibility / canonical decision", "GitHub target 是否已存在的最新 probe", "workflow parity checklist", @@ -169,6 +171,7 @@ ], "preflight_checks": [ "確認 S4.10 response packet 未被當成 repo creation、visibility change、refs sync 或 primary approval", + "確認 S4.12 response packet 未被當成 secret value collection、workflow modification、runner enablement 或 primary approval", "確認 not_found_or_private 不被當成可自動建立 repo", "確認 visibility change 仍未授權", "確認 refs action disabled", @@ -176,6 +179,7 @@ ], "allowed_pre_runtime_artifacts": [ "owner decision response acceptance note", + "workflow-secret owner response acceptance note", "target decision table update", "draft reconcile ADR", "repo owner review note", diff --git a/docs/security/security-mirror-readiness.snapshot.json b/docs/security/security-mirror-readiness.snapshot.json index 8ba0805d..48fa04b4 100644 --- a/docs/security/security-mirror-readiness.snapshot.json +++ b/docs/security/security-mirror-readiness.snapshot.json @@ -380,14 +380,16 @@ "snapshot_paths": [ "docs/security/source-control-workflow-secret-name-inventory.snapshot.json", "docs/security/source-control-workflow-secret-name-local-evidence.snapshot.json", - "docs/security/source-control-workflow-secret-name-export-request.snapshot.json" + "docs/security/source-control-workflow-secret-name-export-request.snapshot.json", + "docs/security/source-control-workflow-secret-name-owner-response.snapshot.json" ], "human_docs": [ "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-INVENTORY.md", "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-LOCAL-EVIDENCE.md", - "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-EXPORT-REQUEST.md" + "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-EXPORT-REQUEST.md", + "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md" ], - "notes": "可 mirror workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / secret 名稱 inventory 缺口;S4.2 local evidence 有 4 個 repos、31 個 workflow files、43 個 referenced secret names;S4.3 export request 有 7 個 repos、5 類 export lanes;secret_value_collection_allowed=false。" + "notes": "可 mirror workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / secret 名稱 inventory 缺口;S4.2 local evidence 有 4 個 repos、31 個 workflow files、43 個 referenced secret names;S4.3 export request 有 7 個 repos、5 類 export lanes;S4.12 owner response templates 5 個、received_response_count=0;secret_value_collection_allowed=false。" }, { "contract": "local_repo_canonical_probe_v1", diff --git a/docs/security/security-mirror-status-rollup.snapshot.json b/docs/security/security-mirror-status-rollup.snapshot.json index 388c3aa3..cb9c9827 100644 --- a/docs/security/security-mirror-status-rollup.snapshot.json +++ b/docs/security/security-mirror-status-rollup.snapshot.json @@ -30,6 +30,7 @@ "docs/security/source-control-workflow-secret-name-inventory.snapshot.json", "docs/security/source-control-workflow-secret-name-local-evidence.snapshot.json", "docs/security/source-control-workflow-secret-name-export-request.snapshot.json", + "docs/security/source-control-workflow-secret-name-owner-response.snapshot.json", "docs/security/security-rollout-policy.snapshot.json" ], "summary": { @@ -76,7 +77,13 @@ "workflow_secret_inventory_unique_secret_name_count": 43, "workflow_secret_inventory_export_request_count": 7, "workflow_secret_inventory_export_lane_count": 5, + "workflow_secret_owner_response_template_count": 5, + "workflow_secret_owner_received_response_count": 0, + "workflow_secret_owner_accepted_response_count": 0, + "workflow_secret_owner_rejected_response_count": 0, "workflow_secret_inventory_write_token_allowed": false, + "workflow_secret_modification_authorized": false, + "workflow_secret_github_hosted_runner_enable_authorized": false, "secret_value_collection_allowed": false, "secret_value_detected": false, "pending_approval_count": 7, @@ -113,8 +120,8 @@ { "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;S4.10 已補 GitHub target owner decision response intake packet;S4.11 已補 refs truth owner response intake packet,但 inventory status 仍 partial,GitHub target response 與 refs truth response 仍 0 筆。", - "next_gate": "依 S4.9 收到並驗收 S4.7 Gitea owner response、依 S4.10 收到並驗收 7 個 GitHub target owner / visibility / canonical response、依 S4.11 收到並驗收 5 個 refs truth owner response templates、authenticated inventory payload 通過 S4.6 驗收、workflow / webhook / runner / deploy key / branch protection / repository secret parity redacted evidence、rollback ADR owner approval 與逐 repo 人工批准。" + "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;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,但 inventory status 仍 partial,GitHub target / refs truth / workflow-secret response 仍 0 筆。", + "next_gate": "依 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 人工批准。" } ], "next_safe_actions": [ @@ -302,13 +309,17 @@ "source_contract": "source_control_workflow_secret_name_inventory_v1", "allowed_processing": [ "顯示 8 個 candidate repos 的 inventory lanes、4 個 repos 的 local evidence 與 7 個 repos 的 redacted export request", + "顯示 S4.12 owner response templates、received_response_count=0 與 rejection rules", "要求 repo owner 補 redacted workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / secret 名稱 snapshot", "顯示 GitHub hosted runner 額度風險與 self-hosted runner owner review lane", + "response 通過後只更新 read-only inventory、export request 與 readiness blocker wording", "只保存 secret name、owner 與 present/absent metadata,不保存 value" ], "blocked_processing": [ + "把 S4.12 response packet 當成 workflow 修改、secret 建立、runner 啟用或 primary approval", "收集或保存 secret value", "修改 workflow 或 webhook", + "啟用 GitHub hosted runner 或消耗 GitHub Actions 額度", "rotate secret", "sync refs 或切 GitHub primary" ] @@ -348,7 +359,8 @@ "S4.8 只把既有 Gitea approval queue/gate/review packet/follow-up gate 對齊 S4.7 先行條件;approval_queue_total 仍為 8、active_runtime_gates 仍為 0,不新增執行入口。", "S4.9 只新增 Gitea owner attestation response 收件包;required_response_item_count=5、received_response_count=0、accepted_response_count=0,不把 response packet 當 inventory 執行或 primary approval。", "S4.10 只新增 GitHub target owner decision response 收件包;response_template_count=7、received_response_count=0、accepted_response_count=0,不把 response packet 當 repo creation、visibility change、refs sync 或 GitHub primary approval。", - "S4.11 只新增 refs truth owner response 收件包;response_template_count=5、received_response_count=0、accepted_response_count=0,不把 response packet 當 refs sync、delete、force push 或 GitHub primary approval。" + "S4.11 只新增 refs truth owner response 收件包;response_template_count=5、received_response_count=0、accepted_response_count=0,不把 response packet 當 refs sync、delete、force push 或 GitHub primary approval。", + "S4.12 只新增 workflow / secret 名稱 owner response 收件包;response_template_count=5、received_response_count=0、accepted_response_count=0,不把 response packet 當 secret value collection、workflow modification、GitHub hosted runner enablement 或 GitHub primary approval。" ], "forbidden_actions": [ "start_kali_scan", diff --git a/docs/security/security-supply-chain-contract-manifest.snapshot.json b/docs/security/security-supply-chain-contract-manifest.snapshot.json index 84ba6100..3f9fd486 100644 --- a/docs/security/security-supply-chain-contract-manifest.snapshot.json +++ b/docs/security/security-supply-chain-contract-manifest.snapshot.json @@ -603,12 +603,14 @@ "snapshot_paths": [ "docs/security/source-control-workflow-secret-name-inventory.snapshot.json", "docs/security/source-control-workflow-secret-name-local-evidence.snapshot.json", - "docs/security/source-control-workflow-secret-name-export-request.snapshot.json" + "docs/security/source-control-workflow-secret-name-export-request.snapshot.json", + "docs/security/source-control-workflow-secret-name-owner-response.snapshot.json" ], "human_docs": [ "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-INVENTORY.md", "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-LOCAL-EVIDENCE.md", - "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-EXPORT-REQUEST.md" + "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-EXPORT-REQUEST.md", + "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md" ], "consumer": "AwoooP source-control review / Secret hygiene audit / Operator Console", "consumption_mode": "approval_only", @@ -626,7 +628,7 @@ "sync_refs", "switch_github_primary" ], - "notes": "定義 S4.1 workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / secret 名稱 inventory 契約;S4.2 已補 local evidence:4 repos、31 workflow files、43 個 referenced secret names;S4.3 已補 7 repos / 5 lanes 的 redacted export request;仍不保存 secret value。" + "notes": "定義 S4.1 workflow / webhook / runner / deploy key / branch protection / CODEOWNERS / secret 名稱 inventory 契約;S4.2 已補 local evidence:4 repos、31 workflow files、43 個 referenced secret names;S4.3 已補 7 repos / 5 lanes 的 redacted export request;S4.12 已補 5 個 owner response templates,received_response_count=0;仍不保存 secret value。" }, { "contract": "local_repo_canonical_probe_v1", diff --git a/docs/security/source-control-primary-readiness-gate.snapshot.json b/docs/security/source-control-primary-readiness-gate.snapshot.json index 41b2c4ab..3a27ab5b 100644 --- a/docs/security/source-control-primary-readiness-gate.snapshot.json +++ b/docs/security/source-control-primary-readiness-gate.snapshot.json @@ -13,6 +13,7 @@ "docs/security/source-control-ref-truth-classification.snapshot.json", "docs/security/source-control-ref-truth-owner-response.snapshot.json", "docs/security/source-control-workflow-secret-name-inventory.snapshot.json", + "docs/security/source-control-workflow-secret-name-owner-response.snapshot.json", "docs/security/source-control-primary-rollback-adr.snapshot.json", "docs/security/gitea-repo-inventory.snapshot.json", "docs/security/gitea-authenticated-inventory-export-request.snapshot.json", @@ -99,11 +100,13 @@ ], "current_gap": [ "S4.1 已定義 workflow / webhook / runner / secret 名稱 inventory 契約,但尚未收集實際 redacted snapshot", + "S4.12 已建立 workflow / secret 名稱 owner response 收件包,但目前 received_response_count=0、accepted_response_count=0", "不得搬移或輸出 secret value", "不得因缺資料而假設 GitHub ready" ], "allowed_now": [ "建立 read-only inventory plan", + "mirror S4.12 owner response templates、acceptance checks 與 rejection rules", "列出需要 owner 補證的欄位", "維持 GitHub primary blocked" ], diff --git a/docs/security/source-control-workflow-secret-name-export-request.snapshot.json b/docs/security/source-control-workflow-secret-name-export-request.snapshot.json index 198a14cc..24eb2659 100644 --- a/docs/security/source-control-workflow-secret-name-export-request.snapshot.json +++ b/docs/security/source-control-workflow-secret-name-export-request.snapshot.json @@ -8,6 +8,7 @@ "source_indexes": [ "docs/security/source-control-workflow-secret-name-inventory.snapshot.json", "docs/security/source-control-workflow-secret-name-local-evidence.snapshot.json", + "docs/security/source-control-workflow-secret-name-owner-response.snapshot.json", "docs/security/source-control-primary-readiness-gate.snapshot.json", "docs/security/security-rollout-policy.snapshot.json" ], @@ -17,6 +18,9 @@ "external_scope_review_count": 1, "export_request_count": 7, "export_lane_count": 5, + "owner_response_template_count": 5, + "owner_response_received_count": 0, + "owner_response_accepted_count": 0, "webhook_export_request_repo_count": 2, "runner_export_request_repo_count": 4, "deploy_key_export_request_repo_count": 1, @@ -27,6 +31,17 @@ "runtime_actions_authorized": false, "action_buttons_allowed": false }, + "owner_response_packet": { + "schema_version": "source_control_workflow_secret_name_owner_response_v1", + "snapshot_path": "docs/security/source-control-workflow-secret-name-owner-response.snapshot.json", + "human_doc": "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md", + "response_template_count": 5, + "received_response_count": 0, + "accepted_response_count": 0, + "rejected_response_count": 0, + "execution_authorized": false, + "allowed_effect": "response 通過後只更新 read-only inventory / export request / readiness wording,不授權 workflow/secret/runner/deploy key 變更" + }, "export_lanes": [ { "lane_id": "webhook_redacted_export_request", diff --git a/docs/security/source-control-workflow-secret-name-inventory.snapshot.json b/docs/security/source-control-workflow-secret-name-inventory.snapshot.json index 818eb5d2..66bb6c15 100644 --- a/docs/security/source-control-workflow-secret-name-inventory.snapshot.json +++ b/docs/security/source-control-workflow-secret-name-inventory.snapshot.json @@ -8,6 +8,7 @@ "docs/security/source-control-primary-readiness-gate.snapshot.json", "docs/security/source-control-workflow-secret-name-local-evidence.snapshot.json", "docs/security/source-control-workflow-secret-name-export-request.snapshot.json", + "docs/security/source-control-workflow-secret-name-owner-response.snapshot.json", "docs/security/github-target-decision.snapshot.json", "docs/security/source-control-approval-board.snapshot.json", "docs/security/source-control-reconcile-plan.snapshot.json", @@ -19,10 +20,23 @@ "external_scope_count": 1, "inventory_complete_count": 0, "missing_inventory_count": 7, + "owner_response_template_count": 5, + "owner_response_received_count": 0, + "owner_response_accepted_count": 0, "secret_value_collection_allowed": false, "runtime_actions_authorized": false, "action_buttons_allowed": false }, + "owner_response_packet": { + "schema_version": "source_control_workflow_secret_name_owner_response_v1", + "snapshot_path": "docs/security/source-control-workflow-secret-name-owner-response.snapshot.json", + "human_doc": "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-OWNER-RESPONSE.md", + "response_template_count": 5, + "received_response_count": 0, + "accepted_response_count": 0, + "rejected_response_count": 0, + "execution_authorized": false + }, "inventory_lanes": [ { "lane_id": "workflow_file_inventory", @@ -413,6 +427,7 @@ "此 inventory 完成前,GitHub primary readiness gate 必須維持 blocked。", "S4.2 已補本機可見 workflow / CODEOWNERS / referenced secret name evidence,但 webhook、deploy key、branch protection 與 repository secret parity 仍未完成。", "S4.3 已補 redacted export request package,將 webhook、runner、deploy key、branch protection/CODEOWNERS 與 repository secret name parity 的 owner / read-only export 欄位、拒收欄位與 acceptance gate 文件化;它仍不是 API 執行或 primary cutover 批准。", + "S4.12 已補 owner response 收件包,將 5 類 export lanes 的 response 欄位、驗收規則與拒收規則文件化;received_response_count=0,仍不得收集 secret value 或修改 workflow。", "inventory snapshot 只能 mirror 成 Operator Console / Audit evidence,不得新增 execution action。" ], "forbidden_actions": [ diff --git a/docs/security/source-control-workflow-secret-name-owner-response.snapshot.json b/docs/security/source-control-workflow-secret-name-owner-response.snapshot.json new file mode 100644 index 00000000..b32abc62 --- /dev/null +++ b/docs/security/source-control-workflow-secret-name-owner-response.snapshot.json @@ -0,0 +1,418 @@ +{ + "schema_version": "source_control_workflow_secret_name_owner_response_v1", + "status": "draft_waiting_owner_response", + "date": "2026-05-17", + "mode": "owner_workflow_secret_name_response_intake_only", + "runtime_execution_authorized": false, + "source_contract": "source_control_workflow_secret_name_inventory_v1", + "target_contract": "source_control_workflow_secret_name_export_request_v1", + "source_indexes": [ + "docs/security/source-control-workflow-secret-name-inventory.snapshot.json", + "docs/security/source-control-workflow-secret-name-local-evidence.snapshot.json", + "docs/security/source-control-workflow-secret-name-export-request.snapshot.json", + "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-INVENTORY.md", + "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-LOCAL-EVIDENCE.md", + "docs/security/SOURCE-CONTROL-WORKFLOW-SECRET-NAME-EXPORT-REQUEST.md", + "docs/security/source-control-primary-readiness-gate.snapshot.json", + "docs/security/security-approval-review-packet.snapshot.json", + "docs/security/security-followup-runtime-gate.snapshot.json" + ], + "summary": { + "owner_response_status": "waiting_owner_response", + "candidate_repo_count": 8, + "in_scope_repo_count": 7, + "export_request_count": 7, + "export_lane_count": 5, + "local_evidence_repo_count": 4, + "local_workflow_file_count": 31, + "local_referenced_secret_name_count": 43, + "response_template_count": 5, + "received_response_count": 0, + "accepted_response_count": 0, + "rejected_response_count": 0, + "acceptance_check_count": 8, + "rejection_rule_count": 10, + "secret_value_collection_allowed": false, + "write_token_allowed": false, + "workflow_modification_authorized": false, + "webhook_modification_authorized": false, + "runner_change_authorized": false, + "deploy_key_change_authorized": false, + "branch_protection_change_authorized": false, + "repo_secret_change_authorized": false, + "github_hosted_runner_enable_authorized": false, + "refs_sync_authorized": false, + "github_primary_switch_authorized": false, + "action_buttons_allowed": false + }, + "response_templates": [ + { + "template_id": "response-webhook-redacted-export", + "lane": "webhook_redacted_export_request", + "affected_repos": [ + "owenhytsai/awoooi", + "owenhytsai/wooo-aiops" + ], + "risk": "MEDIUM", + "covered_repo_count": 2, + "requested_owner_decision": "回覆 webhook 名稱、redacted host、事件類型、enabled flag 與 owner;不得包含 webhook secret、token URL、header、cookie 或 payload body。", + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "repo", + "provider", + "webhook_name_or_none", + "destination_host_redacted", + "event_types", + "active_enabled_flag", + "webhook_owner", + "evidence_refs" + ], + "acceptable_decisions": [ + "provide_redacted_webhook_inventory_candidate", + "mark_no_webhook_candidate", + "hold_pending_webhook_owner", + "unknown_requires_more_evidence" + ], + "minimum_evidence_refs": [ + "docs/security/source-control-workflow-secret-name-export-request.snapshot.json", + "docs/security/source-control-primary-readiness-gate.snapshot.json", + "docs/security/security-mirror-quarantine.snapshot.json" + ], + "acceptance_criteria": [ + "只允許保存 redacted host、event types、enabled flag 與 owner。", + "必須標示 primary cutover 後哪一端負責發 webhook,或明確要求補證。", + "必須承認 response 通過後只更新 read-only inventory / readiness wording,不修改 webhook。" + ], + "rejection_conditions": [ + "含 webhook secret、完整 payload URL、query token、header、cookie 或 request body。", + "要求立即建立、停用或修改 webhook。", + "缺 repo、provider、webhook owner 或 no-webhook disposition。" + ], + "allowed_outputs": [ + "更新 `source-control-workflow-secret-name-export-request.snapshot.json` 的 webhook read-only owner response 欄位。", + "更新 `source-control-primary-readiness-gate.snapshot.json` 的 workflow/webhook blocker wording。", + "建立 request_more_evidence / quarantine lane。" + ], + "execution_authorized": false + }, + { + "template_id": "response-runner-label-owner", + "lane": "runner_label_owner_export_request", + "affected_repos": [ + "owenhytsai/awoooi", + "owenhytsai/wooo-aiops", + "owenhytsai/wooo-infra-config", + "owenhytsai/ewoooc" + ], + "risk": "HIGH", + "covered_repo_count": 4, + "requested_owner_decision": "回覆 runner label、executor type、hosted/self-hosted、owner 與 GitHub hosted minutes 風險;不得包含 runner registration token、admin token、SSH key 或 host password。", + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "repo", + "provider", + "runner_label_or_none", + "runner_scope", + "executor_type", + "hosted_or_self_hosted", + "runner_owner", + "github_hosted_minutes_risk", + "maintenance_window", + "evidence_refs" + ], + "acceptable_decisions": [ + "keep_self_hosted_runner_candidate", + "approve_hosted_runner_risk_review_candidate", + "mark_no_runner_candidate", + "hold_pending_runner_owner", + "unknown_requires_more_evidence" + ], + "minimum_evidence_refs": [ + "docs/security/source-control-workflow-secret-name-local-evidence.snapshot.json", + "docs/security/source-control-workflow-secret-name-export-request.snapshot.json", + "docs/security/source-control-primary-readiness-gate.snapshot.json" + ], + "acceptance_criteria": [ + "必須標示 runner 是 self-hosted 或 hosted;若 hosted,必須列入額度風險 review,而不是啟用批准。", + "必須指定 runner owner 與維護窗口,或明確要求補證。", + "必須承認 response 不授權新增 runner、不授權改 workflow、不授權消耗 GitHub hosted minutes。" + ], + "rejection_conditions": [ + "含 runner registration token、admin token、SSH private key、host password 或 API token。", + "要求立即啟用 GitHub hosted runner 或改 runner label。", + "把 hosted runner risk review candidate 當成使用 GitHub Actions 額度的批准。" + ], + "allowed_outputs": [ + "更新 runner label owner review lane。", + "更新 GitHub hosted runner 額度風險 wording。", + "維持 workflow / runner execution disabled。" + ], + "execution_authorized": false + }, + { + "template_id": "response-deploy-key-redacted-export", + "lane": "deploy_key_redacted_export_request", + "affected_repos": [ + "owenhytsai/wooo-infra-config" + ], + "risk": "HIGH", + "covered_repo_count": 1, + "requested_owner_decision": "回覆 deploy key / machine key 名稱、read-only flag、repo scope 與 owner;不得包含 private key、完整 public key、token value 或 password。", + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "repo", + "provider", + "key_name_or_none", + "read_only_flag", + "repo_scope", + "key_owner", + "rotation_owner", + "evidence_refs" + ], + "acceptable_decisions": [ + "provide_deploy_key_name_scope_candidate", + "mark_no_deploy_key_candidate", + "mark_write_capable_key_risk_candidate", + "hold_pending_key_owner", + "unknown_requires_more_evidence" + ], + "minimum_evidence_refs": [ + "docs/security/source-control-workflow-secret-name-export-request.snapshot.json", + "docs/security/GIT-REMOTE-REFS-WOOO-INFRA-CONFIG-SNAPSHOT.md", + "docs/security/security-mirror-quarantine.snapshot.json" + ], + "acceptance_criteria": [ + "只允許 key 名稱、read-only flag、repo scope、owner 與 rotation owner。", + "write-capable key 只能列為風險 candidate,不得自動 rotate 或刪除。", + "必須承認 response 不授權搬移 key、不授權貼 private key、不授權修改 deploy key。" + ], + "rejection_conditions": [ + "含 private key、完整 public key、token value、password 或 credential value。", + "要求立即 rotate、刪除或新增 deploy key。", + "缺 key owner / rotation owner 或 no-key disposition。" + ], + "allowed_outputs": [ + "更新 deploy key read-only risk lane。", + "更新 primary readiness key blocker wording。", + "建立 key_owner request_more_evidence lane。" + ], + "execution_authorized": false + }, + { + "template_id": "response-branch-protection-codeowners", + "lane": "branch_protection_codeowners_export_request", + "affected_repos": [ + "owenhytsai/awoooi", + "owenhytsai/clawbot-v5", + "owenhytsai/wooo-infra-config", + "owenhytsai/ewoooc" + ], + "risk": "MEDIUM", + "covered_repo_count": 4, + "requested_owner_decision": "回覆 protected branch、required checks、required review count、CODEOWNERS path 與 owner teams;不得包含 team secret、PAT、admin override token 或 session cookie。", + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "repo", + "provider", + "protected_branch_name_or_none", + "required_review_count", + "required_status_check_names", + "codeowners_path_or_none", + "owner_team_names", + "ruleset_owner", + "evidence_refs" + ], + "acceptable_decisions": [ + "provide_branch_protection_codeowners_candidate", + "mark_no_branch_protection_candidate", + "hold_pending_ruleset_owner", + "unknown_requires_more_evidence" + ], + "minimum_evidence_refs": [ + "docs/security/source-control-workflow-secret-name-local-evidence.snapshot.json", + "docs/security/source-control-workflow-secret-name-export-request.snapshot.json", + "docs/security/source-control-primary-readiness-gate.snapshot.json" + ], + "acceptance_criteria": [ + "必須列出 required status check names,並標示與 workflow / runner label 對應狀態。", + "缺 CODEOWNERS 或 branch protection 只能形成 readiness gap,不代表可修改規則。", + "必須指定 ruleset owner 或 request_more_evidence owner。" + ], + "rejection_conditions": [ + "含 PAT、admin override token、session cookie、team secret 或未脫敏截圖。", + "要求立即修改 branch protection、ruleset、required checks 或 CODEOWNERS。", + "把 branch protection response 當成 primary readiness complete。" + ], + "allowed_outputs": [ + "更新 branch protection / CODEOWNERS owner review lane。", + "更新 required status check parity wording。", + "維持 primary_ready_count=0。" + ], + "execution_authorized": false + }, + { + "template_id": "response-repository-secret-name-parity", + "lane": "repository_secret_name_parity_export_request", + "affected_repos": [ + "owenhytsai/awoooi", + "owenhytsai/clawbot-v5", + "owenhytsai/wooo-aiops", + "owenhytsai/wooo-infra-config", + "owenhytsai/ewoooc", + "owenhytsai/bitan-pharmacy", + "owenhytsai/tsenyang-website" + ], + "risk": "HIGH", + "covered_repo_count": 7, + "requested_owner_decision": "回覆 repository secret 名稱 parity、scope、owning team、used-by workflow 與 present_in_gitea / present_in_github metadata;不得包含 value、hash、partial token 或可還原片段。", + "required_owner_fields": [ + "owner_role_or_team", + "decision", + "decision_reason", + "repo", + "provider", + "secret_name_list_or_none", + "secret_scope", + "owning_team", + "used_by_workflow_name", + "rotation_owner", + "present_in_gitea", + "present_in_github", + "evidence_refs" + ], + "acceptable_decisions": [ + "provide_secret_name_presence_map_candidate", + "mark_no_repository_secret_candidate", + "hold_pending_secret_owner", + "unknown_requires_more_evidence" + ], + "minimum_evidence_refs": [ + "docs/security/source-control-workflow-secret-name-local-evidence.snapshot.json", + "docs/security/source-control-workflow-secret-name-export-request.snapshot.json", + "docs/security/security-mirror-quarantine.snapshot.json" + ], + "acceptance_criteria": [ + "只允許保存 secret name、scope、owner、used-by workflow、present/absent metadata。", + "不得保存 value、hash、partial token、masked token 或任何可還原片段。", + "缺漏 secret 只建立 owner review lane,不自動建立、複製、rotate 或刪除 secret。" + ], + "rejection_conditions": [ + "含 secret value、plaintext、hash、partial token、private key、credential value 或未脫敏截圖。", + "要求立即建立、複製、修改、rotate 或刪除 repository secret。", + "把 secret name parity response 當成 workflow 已可執行或 primary ready。" + ], + "allowed_outputs": [ + "更新 repository secret name parity owner review lane。", + "更新 workflow / secret name inventory gap wording。", + "維持 inventory_complete_count=0 與 primary_ready_count=0。" + ], + "execution_authorized": false + } + ], + "acceptance_checks": [ + { + "check_id": "maps_to_known_export_lane", + "title": "回覆對應既有 export lane", + "required": true, + "pass_condition": "`lane` 必須對應 S4.3 既有 export lanes:webhook、runner、deploy key、branch protection / CODEOWNERS 或 repository secret name parity。", + "failure_lane": "reject_unknown_export_lane", + "execution_authorized": false + }, + { + "check_id": "decision_value_allowed", + "title": "決策值在允許範圍內", + "required": true, + "pass_condition": "`decision` 必須是該 response template 的 acceptable_decisions 之一。", + "failure_lane": "request_owner_correction", + "execution_authorized": false + }, + { + "check_id": "repo_scope_present", + "title": "repo scope 已標示", + "required": true, + "pass_condition": "每筆回覆必須有 repo、provider 與 lane;批次 secret name parity 必須有可重現 repo list。", + "failure_lane": "request_more_evidence", + "execution_authorized": false + }, + { + "check_id": "owner_present", + "title": "owner 或補證 owner 已標示", + "required": true, + "pass_condition": "每筆回覆必須有 owner role/team,且 lane-specific owner 不得空白;未知時必須選 hold/unknown。", + "failure_lane": "request_owner_assignment", + "execution_authorized": false + }, + { + "check_id": "allowed_fields_only", + "title": "只含允許欄位", + "required": true, + "pass_condition": "回覆只能包含 lane allowed_fields 與 owner/evidence metadata,不得加入 request body、header、credential 或 raw config。", + "failure_lane": "quarantine_unexpected_payload", + "execution_authorized": false + }, + { + "check_id": "secret_values_absent", + "title": "未包含 secret value", + "required": true, + "pass_condition": "不得包含 secret/token/cookie/private key/deploy key/runner token/webhook secret/password、hash、masked token 或 partial credential。", + "failure_lane": "quarantine_sensitive_payload", + "execution_authorized": false + }, + { + "check_id": "no_write_or_rotation_requested", + "title": "不含 write 或 rotation 要求", + "required": true, + "pass_condition": "回覆不得要求 write API、rotate secret、修改 workflow、修改 webhook、修改 runner、修改 deploy key 或修改 branch protection。", + "failure_lane": "reject_runtime_change_request", + "execution_authorized": false + }, + { + "check_id": "no_primary_or_refs_action_requested", + "title": "不含 primary 或 refs action", + "required": true, + "pass_condition": "回覆不得要求建立 repo、sync refs、切 GitHub primary、停用 Gitea 或把 inventory 視為 primary ready。", + "failure_lane": "reject_primary_or_refs_action", + "execution_authorized": false + } + ], + "rejection_rules": [ + "回覆含 secret value、PAT、cookie、session、CSRF token、private key、deploy key value、runner token、webhook secret 或 partial credential 時必須拒收。", + "回覆含完整 webhook payload URL、query token、authorization header、request body 或未脫敏截圖時必須拒收。", + "回覆含 runner registration token、runner admin token、SSH private key、host password 或 API token 時必須拒收。", + "回覆含 deploy key private material、完整 public key、token value、password 或 credential value 時必須拒收。", + "回覆含 secret value、secret hash、partial token、masked token 或任何可還原片段時必須拒收。", + "回覆要求 write API、修改 workflow/webhook/runner/deploy key/branch protection/CODEOWNERS 或 rotate secret 時必須拒收。", + "回覆要求建立 repo、sync refs、切 GitHub primary、停用或封存 Gitea 時必須拒收。", + "回覆缺 repo、provider、lane owner 或 no-data disposition 時不得標記 accepted。", + "回覆把 owner response 當成 inventory complete、workflow ready、secret parity complete 或 GitHub primary ready 時必須拒收。", + "任何不確定是否含敏感值、私有 URL 憑證、完整 key material 或未脫敏截圖的回覆必須先進 mirror quarantine。" + ], + "allowed_outputs": [ + "更新 `source-control-workflow-secret-name-inventory.snapshot.json` 的 read-only owner response 欄位。", + "更新 `source-control-workflow-secret-name-export-request.snapshot.json` 的 response status wording。", + "更新 `source-control-primary-readiness-gate.snapshot.json` 的 workflow / webhook / runner / secret name blocker wording。", + "更新 `security-mirror-status-rollup.snapshot.json` 的 workflow_secret owner response summary。", + "建立 request_more_evidence / quarantine lane。", + "維持 `inventory_complete_count=0`、`github_primary_ready_count=0` 與所有 workflow / secret / repo / refs / primary execution flags false。" + ], + "forbidden_actions": [ + "收集或保存 secret value、token value、cookie、session、private key、deploy key value、runner token 或 webhook secret。", + "使用 write token 或 write API。", + "修改 workflow、webhook、runner、deploy key、branch protection、CODEOWNERS 或 repository secret。", + "rotate secret、建立 secret、複製 secret 或刪除 secret。", + "啟用 GitHub hosted runner 或消耗 GitHub Actions 額度。", + "建立 GitHub repo 或修改 visibility。", + "sync refs、push refs、delete refs 或 force push。", + "切 GitHub primary。", + "停用、刪除、封存或降級 Gitea repo。", + "新增 AwoooP execution action button。" + ] +}