Files
awoooi/docs/security/security-rollout-policy.snapshot.json
Your Name 9e15fd08b3
All checks were successful
CD Pipeline / tests (push) Successful in 1m39s
Code Review / ai-code-review (push) Successful in 15s
CD Pipeline / build-and-deploy (push) Successful in 5m19s
CD Pipeline / post-deploy-checks (push) Successful in 2m11s
feat(web): land iwooos security posture surfaces
2026-05-25 20:35:52 +08:00

199 lines
8.0 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"schema_version": "security_rollout_policy_v1",
"status": "draft",
"default_mode": "observe",
"enforcement_level": "mirror_only",
"non_blocking_escalation_lane_count": 7,
"non_blocking_escalation_lanes": [
{
"lane_id": "lane-low-medium-observation",
"display_order": 1,
"trigger": "LOW / MEDIUM finding 且不涉及不可逆變更、secret value、repo / refs / deploy / primary control plane。",
"initial_mode": "warn",
"allowed_action": "標記風險、建立 follow-up、補 evidence_ref 或準備草案。",
"forbidden_escalation": "不得阻擋 deploy、不得自動 patch、不得自動 merge、不得建立 runtime blocker。",
"owner_review_required_before_blocking": true,
"runtime_blocking_allowed": false,
"awooop_display_mode": "display_low_friction_non_blocking_lane_only",
"not_authorization": true
},
{
"lane_id": "lane-owner-response-missing",
"display_order": 2,
"trigger": "S4.9 / S4.10 / S4.11 / S4.12 owner response 尚未收到或尚未 accepted。",
"initial_mode": "observe",
"allowed_action": "顯示 missing lane、next collection candidate、template status 與 request packet。",
"forbidden_escalation": "不得把未回覆當成拒絕、不得停止產品流程、不得自動補 owner response。",
"owner_review_required_before_blocking": true,
"runtime_blocking_allowed": false,
"awooop_display_mode": "display_low_friction_non_blocking_lane_only",
"not_authorization": true
},
{
"lane_id": "lane-mirror-data-incomplete",
"display_order": 3,
"trigger": "mirror snapshot、redacted payload 或 contract coverage 不完整,但未涉及 raw secret / token / exploit payload。",
"initial_mode": "warn",
"allowed_action": "顯示 partial / quarantine reason、要求補 redacted snapshot、保留 retry gate。",
"forbidden_escalation": "不得阻擋無關 runtime、不得把 partial mirror 當 production incident、不得吞入未脫敏 payload。",
"owner_review_required_before_blocking": true,
"runtime_blocking_allowed": false,
"awooop_display_mode": "display_low_friction_non_blocking_lane_only",
"not_authorization": true
},
{
"lane_id": "lane-source-control-drift-draft",
"display_order": 4,
"trigger": "GitHub / Gitea refs、target、visibility 或 canonical decision 存在差異,但尚未 owner approved。",
"initial_mode": "warn",
"allowed_action": "維持 draft reconcile plan、ADR、read-only diff 與 owner review lane。",
"forbidden_escalation": "不得 sync refs、delete refs、force push、建立 repo、修改 visibility 或切 GitHub primary。",
"owner_review_required_before_blocking": true,
"runtime_blocking_allowed": false,
"awooop_display_mode": "display_low_friction_non_blocking_lane_only",
"not_authorization": true
},
{
"lane_id": "lane-kali-observe-finding",
"display_order": 5,
"trigger": "Kali finding 或 scan scope 仍在 observe / approval package 階段。",
"initial_mode": "warn",
"allowed_action": "只顯示 redacted finding summary、evidence_ref、scan scope approval candidate 與 block reason。",
"forbidden_escalation": "不得自動啟動 active scan、不得呼叫 /execute、不得把 finding 直接變 deploy blocker。",
"owner_review_required_before_blocking": true,
"runtime_blocking_allowed": false,
"awooop_display_mode": "display_low_friction_non_blocking_lane_only",
"not_authorization": true
},
{
"lane_id": "lane-workflow-secret-name-gap",
"display_order": 6,
"trigger": "workflow、webhook、runner、deploy key、branch protection、CODEOWNERS 或 secret 名稱 parity 尚缺 redacted evidence。",
"initial_mode": "warn",
"allowed_action": "要求 redacted export、顯示 owner response template 與只讀 readiness blocker wording。",
"forbidden_escalation": "不得收集 secret value、不得啟用 GitHub hosted runner、不得修改 workflow / webhook / repository secret。",
"owner_review_required_before_blocking": true,
"runtime_blocking_allowed": false,
"awooop_display_mode": "display_low_friction_non_blocking_lane_only",
"not_authorization": true
},
{
"lane_id": "lane-progress-display-holding",
"display_order": 7,
"trigger": "headline progress 維持 58%,但 framework detail ledger 持續增加。",
"initial_mode": "observe",
"allowed_action": "顯示 micro progress、latest delta、not_authorization 與下一個高層 gate。",
"forbidden_escalation": "不得把 progress holding 解讀成卡住、不得把 micro progress 當 runtime approval。",
"owner_review_required_before_blocking": true,
"runtime_blocking_allowed": false,
"awooop_display_mode": "display_low_friction_non_blocking_lane_only",
"not_authorization": true
}
],
"allowed_awooop_outputs": [
"display_non_blocking_escalation_lanes",
"create_followup_without_blocking",
"show_owner_review_required_before_blocking",
"keep_runtime_blocking_false"
],
"policy_items": [
{
"condition": "read_only_inventory_or_evidence_mirror",
"mode": "observe",
"allowed": [
"collect_metadata",
"write_redacted_snapshot",
"update_docs",
"mirror_to_awooop_runtime_state"
],
"forbidden": [
"change_runtime",
"write_to_remote_system",
"delete_or_archive_repo",
"sync_refs"
],
"reason": "初期先建立可見性與追溯性,不阻擋產品與架構推進。"
},
{
"condition": "low_or_medium_observation_without_irreversible_change",
"mode": "warn",
"allowed": [
"label_risk",
"create_followup_item",
"add_evidence_ref",
"prepare_draft_plan"
],
"forbidden": [
"block_deploy",
"force_owner_decision",
"auto_patch",
"auto_merge"
],
"reason": "LOW / MEDIUM observation 先累積 evidence不把日常流程變成審批地獄。"
},
{
"condition": "uses_readonly_token_or_admin_export",
"mode": "approve_required",
"allowed": [
"request_human_approval",
"run_once_after_approval",
"store_token_present_boolean_only",
"write_redacted_inventory"
],
"forbidden": [
"store_token_value",
"reuse_write_token",
"write_to_gitea",
"create_repo"
],
"reason": "只讀 token 與管理匯出會碰敏感邊界,需 approval但仍不授權任何同步或寫入。"
},
{
"condition": "repo_creation_visibility_change_or_refs_sync",
"mode": "approve_required",
"allowed": [
"create_approval_candidate",
"prepare_migration_plan",
"prepare_rollback_plan"
],
"forbidden": [
"execute_without_owner_approval",
"push_refs",
"change_visibility",
"switch_primary"
],
"reason": "這些動作會改供應鏈控制面,必須逐 repo 核准。"
},
{
"condition": "secret_rbac_network_firewall_deploy_or_primary_switch",
"mode": "approve_required",
"allowed": [
"create_approval_required_event",
"prepare_dry_run_plan",
"define_rollback"
],
"forbidden": [
"auto_execute",
"store_secret_value",
"skip_human_review"
],
"reason": "這些動作有生產、權限或安全 blast radius不進入初期自動化。"
},
{
"condition": "destructive_action_without_rollback_or_secret_value_storage",
"mode": "block_candidate",
"allowed": [
"record_block_reason",
"request_manual_exception"
],
"forbidden": [
"force_push",
"delete_repo",
"store_raw_secret",
"disable_audit"
],
"reason": "不可逆且無 rollback 的動作不屬於初期框架建置範圍。"
}
]
}