From 52e3137f4806489b5d2ae71d2000fe615e85c0ec Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 20 May 2026 13:19:11 +0800 Subject: [PATCH] feat(web): add IwoooS S4.9 preflight --- apps/web/messages/en.json | 45 ++++ apps/web/messages/zh-TW.json | 45 ++++ apps/web/src/app/[locale]/iwooos/page.tsx | 68 ++++++ docs/LOGBOOK.md | 14 ++ .../iwooos_posture_projection_v1.schema.json | 155 +++++++++++++- docs/security/IWOOOS-POSTURE-PROJECTION.md | 21 +- .../security/SECURITY-MIRROR-STATUS-ROLLUP.md | 3 +- .../SECURITY-SUPPLY-CHAIN-PROGRESS.md | 4 +- .../iwooos-posture-projection.snapshot.json | 199 +++++++++++++++++- ...ecurity-mirror-status-rollup.snapshot.json | 15 +- .../security-mirror-progress-guard.py | 124 +++++++++++ 11 files changed, 685 insertions(+), 8 deletions(-) diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index 8cd7f8b33..7a46730eb 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -2786,6 +2786,51 @@ "guard": "No secret value collection, workflow mutation, runner enablement, or write token use." } } + }, + "s49OwnerResponsePreflight": { + "title": "S4.9 Owner Response Intake Preflight", + "subtitle": "S2.48 surfaces the 6 S4.9 intake preflight checks in IwoooS: known attestation item, complete fields, allowed decision, redacted evidence, no execution request, and no accepted state until all five items are covered. This is preflight display only: no request send, received marking, or audit event creation.", + "checkLabel": "Preflight", + "failureLabel": "If it fails", + "guardLabel": "Still forbidden", + "items": { + "knownAttestationItem": { + "title": "Match a known S4.7 item", + "body": "The owner response must map to public-only / local gap, org/user endpoint, 110 adjacent source, canonical owner, or legacy disposition.", + "failure": "Unclear mapping can only request owner correction.", + "guard": "Do not treat vague text as coverage attestation or auto-map it to an item." + }, + "requiredOwnerFields": { + "title": "Required owner fields complete", + "body": "Each response needs owner role/team, decision, decision reason, affected scope, evidence refs, and followup owner.", + "failure": "Missing fields can only request more evidence.", + "guard": "No verbal OK and no approval record from incomplete responses." + }, + "allowedDecision": { + "title": "Decision is allowed", + "body": "The decision must fit the acceptable decisions for the matching template so free text is not misread as authorization.", + "failure": "Invalid decisions request owner correction.", + "guard": "Do not upgrade OK / looks fine language into migration or primary approval." + }, + "redactedEvidenceOnly": { + "title": "Redacted evidence refs only", + "body": "Evidence may only point to repo docs, snapshots, or redacted metadata pointers; no tokens, secrets, cookies, sessions, private keys, or private URL credentials.", + "failure": "Sensitive payloads go to quarantine.", + "guard": "No raw secret storage, DB dump import, git object pack, or repo archive collection." + }, + "noExecutionRequest": { + "title": "No execution request", + "body": "Responses must not request Gitea/GitHub writes, repo creation, visibility changes, refs sync/delete/force-push, workflow/secret/runner changes, scans, or runtime actions.", + "failure": "Embedded execution asks are rejected.", + "guard": "No Gitea writes, GitHub repo creation, refs sync, or runtime gate opening." + }, + "allFiveItemsBeforeAccepted": { + "title": "All five items before Accepted", + "body": "S4.9 cannot be accepted until all five response templates have acceptable owner responses.", + "failure": "Partial responses remain waiting or request more evidence.", + "guard": "Visible preflight is not request sent, received, accepted, or audit emitted." + } + } } }, "tickets": { diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index 3077eb554..3792a4a6f 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -2787,6 +2787,51 @@ "guard": "不收 secret value、不改 workflow、不啟用 runner、不使用 write token。" } } + }, + "s49OwnerResponsePreflight": { + "title": "S4.9 Owner Response 收件前 Preflight", + "subtitle": "S2.48 把 S4.9 的 6 個收件前檢查拉到 IwoooS:先確認回覆是否對應已知 attestation item、欄位完整、decision 合法、evidence 脫敏、沒有執行要求,且五個 items 到齊前不得 accepted。這裡只顯示 preflight,不寄送 request、不標記 received、不建立 audit event。", + "checkLabel": "Preflight", + "failureLabel": "不通過時", + "guardLabel": "仍禁止", + "items": { + "knownAttestationItem": { + "title": "對應 S4.7 已知 item", + "body": "owner response 必須明確對應 public-only / local gap、org/user endpoint、110 adjacent source、canonical owner 或 legacy disposition 其中之一。", + "failure": "不明確時只能 request owner correction,不能進 accepted。", + "guard": "不把模糊回覆當作 coverage attestation,也不自動補成某個 item。" + }, + "requiredOwnerFields": { + "title": "必填欄位完整", + "body": "每筆回覆都要有 owner role/team、decision、decision reason、受影響 scope、evidence refs 與 followup owner。", + "failure": "欄位不足只能 request more evidence。", + "guard": "不接受口頭 OK、不用缺欄位回覆建立 approval record。" + }, + "allowedDecision": { + "title": "Decision 在允許值內", + "body": "decision 必須落在該 template 允許的 acceptable decisions,避免自由文字被誤讀成授權。", + "failure": "decision 不合規時 request owner correction。", + "guard": "不把同意、可進行、看起來沒問題升級成 migration 或 primary approval。" + }, + "redactedEvidenceOnly": { + "title": "只接受脫敏 evidence refs", + "body": "evidence 只能指向 repo 內文件、snapshot 或脫敏 metadata pointer,不貼 token、secret、cookie、session、private key 或私有 URL 憑證。", + "failure": "出現敏感 payload 只能 quarantine sensitive payload。", + "guard": "不保存 raw secret、不匯入 DB dump、不收 git object pack 或 repo archive。" + }, + "noExecutionRequest": { + "title": "不得夾帶執行要求", + "body": "回覆不得要求 Gitea/GitHub 寫入、repo 建立、visibility 修改、refs sync/delete/force-push、workflow/secret/runner 變更、scan 或 runtime action。", + "failure": "夾帶執行要求時 reject execution request。", + "guard": "不寫 Gitea、不建 GitHub repo、不同步 refs、不開 runtime gate。" + }, + "allFiveItemsBeforeAccepted": { + "title": "五個 items 到齊前不得 Accepted", + "body": "S4.9 要被標示 accepted 前,五個 response templates 都必須收到可驗收的 owner response。", + "failure": "部分回覆只能維持 waiting 或 request more evidence。", + "guard": "preflight 可見不代表 request sent、received、accepted 或 audit emitted。" + } + } } }, "tickets": { diff --git a/apps/web/src/app/[locale]/iwooos/page.tsx b/apps/web/src/app/[locale]/iwooos/page.tsx index ccb7bf857..ccb93012f 100644 --- a/apps/web/src/app/[locale]/iwooos/page.tsx +++ b/apps/web/src/app/[locale]/iwooos/page.tsx @@ -45,6 +45,13 @@ type OwnerResponseNextActionFocusItem = { tone: 'steady' | 'warn' | 'locked' } +type S49OwnerResponsePreflightCheck = { + key: string + check: string + icon: typeof ShieldCheck + tone: 'steady' | 'warn' | 'locked' +} + type Pillar = { key: string icon: typeof ShieldCheck @@ -337,6 +344,15 @@ const ownerResponseNextActionFocusItems: OwnerResponseNextActionFocusItem[] = [ { key: 'workflowSecretOwnerResponse', focus: 'S4.12', icon: Lock, tone: 'locked' }, ] +const s49OwnerResponsePreflightChecks: S49OwnerResponsePreflightCheck[] = [ + { key: 'knownAttestationItem', check: 'P1', icon: SearchCheck, tone: 'warn' }, + { key: 'requiredOwnerFields', check: 'P2', icon: ListChecks, tone: 'warn' }, + { key: 'allowedDecision', check: 'P3', icon: CheckCircle2, tone: 'warn' }, + { key: 'redactedEvidenceOnly', check: 'P4', icon: Lock, tone: 'locked' }, + { key: 'noExecutionRequest', check: 'P5', icon: AlertTriangle, tone: 'locked' }, + { key: 'allFiveItemsBeforeAccepted', check: 'P6', icon: ShieldCheck, tone: 'locked' }, +] + const posturePillars: Pillar[] = [ { key: 'exposure', icon: Radar, tone: 'warn' }, { key: 'sourceControl', icon: GitBranch, tone: 'warn' }, @@ -878,6 +894,38 @@ function OwnerResponseNextActionFocusCard({ item }: { item: OwnerResponseNextAct ) } +function S49OwnerResponsePreflightCard({ item }: { item: S49OwnerResponsePreflightCheck }) { + const t = useTranslations('iwooos.s49OwnerResponsePreflight') + const Icon = item.icon + return ( +
+
+
+ + {t('checkLabel')} +
+ {item.check} +
+

+ {t(`items.${item.key}.title` as never)} +

+

+ {t(`items.${item.key}.body` as never)} +

+
+
{t('failureLabel')}
+
+ {t(`items.${item.key}.failure` as never)} +
+
{t('guardLabel')}
+
+ {t(`items.${item.key}.guard` as never)} +
+
+
+ ) +} + function PillarCard({ item }: { item: Pillar }) { const t = useTranslations('iwooos.pillars') const Icon = item.icon @@ -2105,6 +2153,26 @@ export default function IwoooSPage({ params }: { params: { locale: string } }) { +
+
+

{t('s49OwnerResponsePreflight.title')}

+

+ {t('s49OwnerResponsePreflight.subtitle')} +

+
+
+ {s49OwnerResponsePreflightChecks.map(item => ( + + ))} +
+
+

{t('journey.title')}

diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index de842d3d2..176c4ddca 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,17 @@ +## 2026-05-20 | 資安供應鏈 S2.48:IwoooS S4.9 Owner Response Preflight + +**背景**:S2.47 已把下一個 P0 owner response 焦點固定在 S4.9 Gitea owner attestation;本輪把 S4.9 真正收件前需要確認的 preflight 條件顯示在 IwoooS,讓後續 owner response 可被準備與人工判讀,但不把 preflight 誤認成 request sent、received、accepted 或 runtime authorization。 + +**完成**: +- `/iwooos` 新增「S4.9 Owner Response 收件前 Preflight」,顯示 known attestation item、required owner fields、allowed decision、redacted evidence only、no execution request、all five items before accepted 六個檢查。 +- `iwooos_posture_projection_v1` schema / snapshot 新增 `s4_9_owner_response_preflight_checks` 與 `s4_9_owner_response_preflight_check_count=6`,每個 check 固定 request sent / received / accepted / rejected / preflight passed / audit emitted = 0,request sent / owner response collection / mark passed / mark received / mark accepted / approval record / runtime gate / Gitea write / repo or refs mutation / secret value collection / sensitive payload / runtime execution / action button = false。 +- `security_mirror_status_rollup_v1` micro progress ledger 新增 `s2_48_iwooos_s4_9_owner_response_preflight`,headline progress 仍維持 58%。 +- `security-mirror-progress-guard.py` 開始驗證 6 個 S4.9 preflight checks、source check ids、failure lanes 與 zero / false 邊界。 + +**仍禁止**: +- S4.9 owner response preflight 不代表 request sent、owner response received / accepted / rejected、preflight passed、audit event emitted、approval record、runtime gate、Gitea write、repo / refs mutation、secret value collection、GitHub primary readiness、Kali `/execute`、SSH、主機變更、Kali 更新或 blocking control。 +- 真正 headline 進度仍要等 owner 提供脫敏 evidence,通過 S4.9 source packet preflight / S4.13 rollup,並保持 runtime gate 與 source-control cutover 獨立批准。 + ## 2026-05-20 | 資安供應鏈 S2.47:IwoooS Owner Response Next-Action Focus **背景**:S2.46 已把真正能推動 58% 的解鎖點集中顯示;本輪把第一個 P0 owner response 收件焦點固定到 IwoooS,讓下一步從 S4.9 Gitea owner attestation 開始收斂,而不是繼續新增細碎 checklist。 diff --git a/docs/schemas/iwooos_posture_projection_v1.schema.json b/docs/schemas/iwooos_posture_projection_v1.schema.json index 67c3c1073..7fa5e0af3 100644 --- a/docs/schemas/iwooos_posture_projection_v1.schema.json +++ b/docs/schemas/iwooos_posture_projection_v1.schema.json @@ -16,6 +16,7 @@ "progress", "progress_acceleration_lanes", "owner_response_next_action_focus_items", + "s4_9_owner_response_preflight_checks", "posture_pillars", "non_blocking_lane_ids", "existing_frontend_surfaces", @@ -147,7 +148,8 @@ "host_owner_decision_record_human_record_owner_review_preparation_checklist_item_count", "progress_acceleration_lane_count", "action_buttons_allowed", - "owner_response_next_action_focus_item_count" + "owner_response_next_action_focus_item_count", + "s4_9_owner_response_preflight_check_count" ], "properties": { "route_path": { @@ -352,6 +354,10 @@ "owner_response_next_action_focus_item_count": { "type": "integer", "const": 4 + }, + "s4_9_owner_response_preflight_check_count": { + "type": "integer", + "const": 6 } }, "additionalProperties": false @@ -4036,6 +4042,153 @@ }, "additionalProperties": false } + }, + "s4_9_owner_response_preflight_checks": { + "type": "array", + "minItems": 6, + "maxItems": 6, + "items": { + "type": "object", + "required": [ + "preflight_id", + "display_order", + "source_check_id", + "source_packet", + "pass_condition_summary", + "failure_lane", + "display_mode", + "required", + "request_sent_count", + "owner_response_received_count", + "owner_response_accepted_count", + "owner_response_rejected_count", + "preflight_passed_count", + "audit_events_emitted_count", + "request_sent_allowed", + "owner_response_collection_allowed", + "mark_passed_allowed", + "mark_received_allowed", + "mark_accepted_allowed", + "approval_record_created", + "runtime_gate_opened", + "gitea_write_allowed", + "repo_or_refs_mutation_allowed", + "secret_value_collection_allowed", + "sensitive_payload_allowed", + "runtime_execution_authorized", + "action_buttons_allowed", + "not_authorization" + ], + "properties": { + "preflight_id": { + "type": "string" + }, + "display_order": { + "type": "integer", + "minimum": 1 + }, + "source_check_id": { + "type": "string" + }, + "source_packet": { + "type": "string" + }, + "pass_condition_summary": { + "type": "string" + }, + "failure_lane": { + "type": "string" + }, + "display_mode": { + "const": "s4_9_owner_response_preflight_only" + }, + "required": { + "type": "boolean", + "const": true + }, + "request_sent_count": { + "type": "integer", + "const": 0 + }, + "owner_response_received_count": { + "type": "integer", + "const": 0 + }, + "owner_response_accepted_count": { + "type": "integer", + "const": 0 + }, + "owner_response_rejected_count": { + "type": "integer", + "const": 0 + }, + "preflight_passed_count": { + "type": "integer", + "const": 0 + }, + "audit_events_emitted_count": { + "type": "integer", + "const": 0 + }, + "request_sent_allowed": { + "type": "boolean", + "const": false + }, + "owner_response_collection_allowed": { + "type": "boolean", + "const": false + }, + "mark_passed_allowed": { + "type": "boolean", + "const": false + }, + "mark_received_allowed": { + "type": "boolean", + "const": false + }, + "mark_accepted_allowed": { + "type": "boolean", + "const": false + }, + "approval_record_created": { + "type": "boolean", + "const": false + }, + "runtime_gate_opened": { + "type": "boolean", + "const": false + }, + "gitea_write_allowed": { + "type": "boolean", + "const": false + }, + "repo_or_refs_mutation_allowed": { + "type": "boolean", + "const": false + }, + "secret_value_collection_allowed": { + "type": "boolean", + "const": false + }, + "sensitive_payload_allowed": { + "type": "boolean", + "const": false + }, + "runtime_execution_authorized": { + "type": "boolean", + "const": false + }, + "action_buttons_allowed": { + "type": "boolean", + "const": false + }, + "not_authorization": { + "type": "boolean", + "const": true + } + }, + "additionalProperties": false + } } }, "additionalProperties": false diff --git a/docs/security/IWOOOS-POSTURE-PROJECTION.md b/docs/security/IWOOOS-POSTURE-PROJECTION.md index e5a352b1c..c5f96a14f 100644 --- a/docs/security/IWOOOS-POSTURE-PROJECTION.md +++ b/docs/security/IWOOOS-POSTURE-PROJECTION.md @@ -75,6 +75,7 @@ IwoooS 首版只讀取或對齊以下已提交 evidence: 43. 9 個 host owner decision record human record owner review preparation checklist items,顯示 preparation packets 進人工 record owner review 前仍需只讀核對的條件,但不標記 preparation completed、不標記 checklist passed、不開始 review、不標記 ready、不收 owner decision、不建立 decision record、不開 runtime gate。 44. 6 條 progress acceleration lanes,直接顯示 58% 為何維持、哪些高層 gate 能解鎖下一輪進度判讀,以及後續節奏要改成 milestone batch,但不把 acceleration lane 當授權、加分、owner response、runtime gate、GitHub primary 或 production execution。 45. 4 個 owner response next-action focus items,直接顯示 S4.9 目前是下一個收件焦點,S4.10 / S4.11 / S4.12 依序排隊,但不催收、不代填、不標記 received / accepted、不建立 approval record、不開 runtime gate。 +46. 6 個 S4.9 owner response preflight checks,直接顯示第一個 P0 owner response 在收件前要確認的已知 item、必填欄位、allowed decision、脫敏 evidence、無 execution request 與五項到齊規則,但不寄送 request、不標記 received / accepted、不建立 audit event、不寫 Gitea、不 sync refs、不開 runtime gate。 ## 3.1 既有前端資安頁面整合 @@ -760,6 +761,23 @@ S2.47 將 owner response 的下一步收件焦點從 S4.13 rollup 拉到 IwoooS 這個 focus board 不代表 S4.9 request 已送出、owner response 已收到、owner response 已接受或下一步可自動推到 GitHub migration。它只把 P0 收件順序顯示清楚,讓後續工作從 S4.9 開始收斂,而不是再繼續新增細碎 checklist。 +## 3.39 S4.9 Owner Response Preflight + +S2.48 將 S4.9 owner response 的收件前 preflight 從 Gitea owner attestation response packet 拉到 IwoooS 可見面板。這一層只回答「第一個 P0 owner response 送入驗收前要檢查什麼」,不寄送 request、不催收、不代填、不標記 received、不標記 accepted、不建立 audit event、不寫 Gitea、不 sync refs、不開 runtime gate、不切 GitHub primary。 + +| 順序 | Preflight check | Failure lane | 核對條件 | +|------|-----------------|--------------|----------| +| 1 | Known attestation item | `request_owner_correction` | 回覆必須對應 S4.7 五個 coverage attestation items 之一 | +| 2 | Required owner fields | `request_more_evidence` | owner role/team、decision、decision reason、受影響 scope、evidence refs、followup owner 完整 | +| 3 | Allowed decision | `request_owner_correction` | decision 必須落在對應 response template 的 acceptable decisions | +| 4 | Redacted evidence only | `quarantine_sensitive_payload` | evidence 只能是 repo 內文件、snapshot 或脫敏 metadata pointer | +| 5 | No execution request | `reject_execution_request` | 不得夾帶 repo / refs / workflow / secret / runner / scan / runtime 執行要求 | +| 6 | All five items before accepted | `keep_waiting_owner_response` | 五個 response templates 都可驗收前,不得標記 S4.9 accepted | + +每個 S4.9 owner response preflight check 都固定 `display_mode=s4_9_owner_response_preflight_only`、`request_sent_count=0`、`owner_response_received_count=0`、`owner_response_accepted_count=0`、`owner_response_rejected_count=0`、`preflight_passed_count=0`、`audit_events_emitted_count=0`、`request_sent_allowed=false`、`owner_response_collection_allowed=false`、`mark_passed_allowed=false`、`mark_received_allowed=false`、`mark_accepted_allowed=false`、`approval_record_created=false`、`runtime_gate_opened=false`、`gitea_write_allowed=false`、`repo_or_refs_mutation_allowed=false`、`secret_value_collection_allowed=false`、`sensitive_payload_allowed=false`、`runtime_execution_authorized=false`、`action_buttons_allowed=false`、`not_authorization=true`。 + +這個 preflight board 不代表 S4.9 request 已送出、owner response 已收到、owner response 已接受、audit event 已建立或 Gitea / GitHub migration 可執行。它只把第一個能真正推動 58% 的 owner response 收件條件顯示清楚。 + ## 4. 仍禁止 IwoooS 不得提供下列輸出: @@ -804,7 +822,8 @@ IwoooS 不得提供下列輸出: 38. 把 owner decision record human record owner review preparation checklist 當成 approval、標記 preparation checklist passed 或 preparation completed、開始 human record owner review、標記 review ready、收 owner decision、由 preparation checklist 建立 decision record,或從 preparation checklist 開 runtime gate。 39. 把 progress acceleration lane 當成授權、進度自動加分、owner response received、runtime gate、GitHub primary readiness 或 production execution。 40. 把 owner response next-action focus 當成催收、代填、received、accepted、approval record、runtime gate、repo / refs mutation、secret value collection 或 GitHub primary switch。 -41. 把 58% progress、contract count、mirror readiness 或前端可見狀態當成授權。 +41. 把 S4.9 owner response preflight 當成 request sent、owner response received / accepted、preflight passed、audit emitted、approval record、Gitea write、repo / refs mutation、runtime gate 或 GitHub primary switch。 +42. 把 58% progress、contract count、mirror readiness 或前端可見狀態當成授權。 ## 5. 驗證 diff --git a/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md b/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md index 53851aba9..b5f26ca04 100644 --- a/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md +++ b/docs/security/SECURITY-MIRROR-STATUS-ROLLUP.md @@ -35,7 +35,7 @@ | Owner response validation | S4.13 已建立;四包 owner response 目前 received/accepted 皆為 0;4 條 missing response lanes、4 步 collection order、next collection candidate、6 條 evidence routing rules、8 個 display sections、7 條 state transition rules、9 個 reviewer checklist items、7 條 reviewer outcome lanes、4 個 reviewer audit event templates、5 個 reviewer audit display sections、6 個 reviewer audit collection checks、5 個 reviewer audit redaction examples、5 條 reviewer audit retention rules、6 個 reviewer audit retention checks、6 個 reviewer audit handoff packets、6 個 reviewer audit handoff checks、6 個 parallel session sync checks、6 條 parallel session conflict lanes、6 個 parallel session recovery checks 與 7 條 parallel session recovery outcome lanes 可供 AwoooP 直接顯示;下一個建議收件為 S4.9 Gitea owner attestation;latest local validation 為 `SOURCE_CONTROL_OWNER_RESPONSE_GUARD_OK`,reviewer audit emitted 仍為 0,不代表 owner response 已收到或任何執行授權 | | Low-friction rollout policy | S1.3 已補 7 條 non-blocking escalation lanes;LOW / MEDIUM、缺 owner response、partial mirror、source-control drift、Kali observe finding、workflow / secret name gap 與 headline holding 初期只能 observe / warn;`owner_review_required_before_blocking=true`、`runtime_blocking_allowed=false` | | IwoooS frontend posture | S2.8 已新增 `/iwooos` read-only Information Security 入口;顯示 Security Posture / Exposure、source-control supply chain、Kali 112 Mesh、approval boundary、non-blocking lanes 與 evidence refs;不新增執行按鈕 | -| IwoooS posture projection | S2.9 已新增 `iwooos_posture_projection_v1`;S2.10 已把 10 個既有前端資安相關頁面納入 projection;S2.11 已補 4 個 coverage groups 與 5 個 conflict controls;S2.12 已補 6 個只讀 operator journey steps;S2.13 已補 7 個 owner evidence readiness items;S2.14 已補 3 個 host coverage items:Kali 112、開發主機 168、開發主機 111;S2.15 已補 6 個 host action gate items;S2.16 已補 7 個 host evidence readiness items;S2.17 已補 7 個 host evidence collection order steps;S2.18 已補 7 個 host evidence intake preflight checks;S2.19 已補 7 個 host evidence review outcome lanes;S2.20 已補 7 個 host evidence review handoff packets;S2.21 已補 7 個 host evidence reviewer checklist items;S2.22 已補 7 個 host evidence reviewer outcome lanes;S2.23 已補 7 個 host owner decision candidate packets;S2.24 已補 7 個 host owner decision review checklist items;S2.25 已補 7 個 host owner decision review outcome lanes;S2.26 已補 7 個 host owner decision record draft packets;S2.27 已補 7 個 host owner decision record draft review checklist items;S2.28 已補 7 個 host owner decision record draft review outcome lanes;S2.29 已補 7 個 host owner decision record write-up packets;S2.30 已補 7 個 host owner decision record write-up review checklist items;S2.31 已補 7 個 host owner decision record write-up review outcome lanes;S2.32 已補 7 個 host owner decision record formal candidate packets;S2.33 已補 7 個 host owner decision record formal candidate review checklist items;S2.34 已補 8 個 host owner decision record formal candidate review outcome lanes;S2.35 已補 8 個 host owner decision record formal record queue packets;S2.36 已補 8 個 host owner decision record formal record queue review checklist items;S2.37 已補 8 個 host owner decision record formal record queue review outcome lanes;S2.38 已補 8 個 host owner decision record human handoff readiness packets;S2.39 已補 8 個 host owner decision record human handoff readiness review checklist items;S2.40 已補 9 個 host owner decision record human handoff readiness review outcome lanes;S2.41 已補 9 個 host owner decision record human record owner review candidate packets;S2.42 已補 9 個 host owner decision record human record owner review candidate checklist items;S2.43 已補 9 個 host owner decision record human record owner review candidate outcome lanes;S2.44 已補 9 個 host owner decision record human record owner review preparation packets;S2.45 已補 9 個 host owner decision record human record owner review preparation checklist items;S2.46 已補 6 條 progress acceleration lanes,顯示 58% holding 原因與下一個高層解鎖 gate;S2.47 已補 4 個 owner response next-action focus items,顯示 S4.9 為下一個收件焦點且 S4.10-S4.12 依序排隊;仍不新增 action button | +| IwoooS posture projection | S2.9 已新增 `iwooos_posture_projection_v1`;S2.10 已把 10 個既有前端資安相關頁面納入 projection;S2.11 已補 4 個 coverage groups 與 5 個 conflict controls;S2.12 已補 6 個只讀 operator journey steps;S2.13 已補 7 個 owner evidence readiness items;S2.14 已補 3 個 host coverage items:Kali 112、開發主機 168、開發主機 111;S2.15 已補 6 個 host action gate items;S2.16 已補 7 個 host evidence readiness items;S2.17 已補 7 個 host evidence collection order steps;S2.18 已補 7 個 host evidence intake preflight checks;S2.19 已補 7 個 host evidence review outcome lanes;S2.20 已補 7 個 host evidence review handoff packets;S2.21 已補 7 個 host evidence reviewer checklist items;S2.22 已補 7 個 host evidence reviewer outcome lanes;S2.23 已補 7 個 host owner decision candidate packets;S2.24 已補 7 個 host owner decision review checklist items;S2.25 已補 7 個 host owner decision review outcome lanes;S2.26 已補 7 個 host owner decision record draft packets;S2.27 已補 7 個 host owner decision record draft review checklist items;S2.28 已補 7 個 host owner decision record draft review outcome lanes;S2.29 已補 7 個 host owner decision record write-up packets;S2.30 已補 7 個 host owner decision record write-up review checklist items;S2.31 已補 7 個 host owner decision record write-up review outcome lanes;S2.32 已補 7 個 host owner decision record formal candidate packets;S2.33 已補 7 個 host owner decision record formal candidate review checklist items;S2.34 已補 8 個 host owner decision record formal candidate review outcome lanes;S2.35 已補 8 個 host owner decision record formal record queue packets;S2.36 已補 8 個 host owner decision record formal record queue review checklist items;S2.37 已補 8 個 host owner decision record formal record queue review outcome lanes;S2.38 已補 8 個 host owner decision record human handoff readiness packets;S2.39 已補 8 個 host owner decision record human handoff readiness review checklist items;S2.40 已補 9 個 host owner decision record human handoff readiness review outcome lanes;S2.41 已補 9 個 host owner decision record human record owner review candidate packets;S2.42 已補 9 個 host owner decision record human record owner review candidate checklist items;S2.43 已補 9 個 host owner decision record human record owner review candidate outcome lanes;S2.44 已補 9 個 host owner decision record human record owner review preparation packets;S2.45 已補 9 個 host owner decision record human record owner review preparation checklist items;S2.46 已補 6 條 progress acceleration lanes,顯示 58% holding 原因與下一個高層解鎖 gate;S2.47 已補 4 個 owner response next-action focus items,顯示 S4.9 為下一個收件焦點且 S4.10-S4.12 依序排隊;S2.48 已補 6 個 S4.9 owner response preflight checks,讓下一個 P0 owner response 的可收件條件可見;仍不新增 action button | | Dry-run | `contract_defined_not_executed`;已納入 `CHECK_PROGRESS_GUARD` 與 `CHECK_OWNER_RESPONSE_GUARD`,latest local validation 為 `repo_snapshot_guard_pass`,仍不代表 production ingestion | | Runtime actions | `false` | | Payload ingestion | `false` | @@ -131,6 +131,7 @@ | S2.45 IwoooS host owner decision record human record owner review preparation checklist | framework detail | 0 | 只顯示 human record owner review preparation packets 後的九個只讀核對項;preparation completed、checklist passed、review started、review ready、handoff started、decision record created、accepted count、approval record、runtime gate、raw payload、secret value、runtime execution 與 action button 仍全部鎖住 | | S2.46 IwoooS progress acceleration lanes | framework detail | 0 | 只顯示 owner response、redacted ingestion、runtime gate、GitHub readiness、AwoooP landing 與 cadence compression 六條解鎖 lane;headline percent、owner response、payload ingestion、runtime gate、GitHub primary、production execution 與 action button 仍全部鎖住 | | S2.47 IwoooS owner response next-action focus | framework detail | 0 | 只顯示 S4.9 為下一個 owner response 收件焦點,S4.10 / S4.11 / S4.12 依序排隊;received、accepted、rejected、audit emitted、approval record、runtime gate、repo / refs mutation、secret value collection 與 action button 仍全部鎖住 | +| S2.48 IwoooS S4.9 owner response preflight | framework detail | 0 | 只顯示 S4.9 六個收件前檢查與 failure lanes;request sent、received、accepted、rejected、preflight passed、audit emitted、Gitea write、repo / refs mutation、runtime gate、GitHub primary 與 action button 仍全部鎖住 | headline 進度要再往上,至少需要下列任一高層 gate 有實質 evidence: diff --git a/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md b/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md index 774e324a4..01a36296a 100644 --- a/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md +++ b/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md @@ -27,7 +27,7 @@ python3 scripts/security/security-mirror-progress-guard.py ### 0.2 Headline 58% 不代表停滯 -近期 S4.10 request packet、template status ledger、audit event templates、redaction examples、collection checks、intake preflight checks、S4.11 request packet / template status ledger / audit event templates / redaction examples / collection checks / intake preflight checks、S4.12 request packet / template status ledger / audit event templates / redaction examples / collection checks / intake preflight checks、S4.13 evidence routing rules / display sections / state transition rules / reviewer checklist / reviewer outcome lanes / reviewer audit event templates / reviewer audit display sections / reviewer audit collection checks / reviewer audit redaction examples / reviewer audit retention rules / reviewer audit retention checks / reviewer audit handoff packets / reviewer audit handoff checks / parallel session sync checks / parallel session conflict lanes / parallel session recovery checks / recovery outcome lanes、S1.3 non-blocking escalation lanes、S2.8 IwoooS frontend posture entry,以及 S2.9-S2.47 IwoooS posture projection contract 都是有效進展,但它們是 framework detail,不是 owner response、runtime gate、production ingestion 或 GitHub primary readiness。因此 headline 仍維持 58%,避免把只讀框架誤算成已落地執行。 +近期 S4.10 request packet、template status ledger、audit event templates、redaction examples、collection checks、intake preflight checks、S4.11 request packet / template status ledger / audit event templates / redaction examples / collection checks / intake preflight checks、S4.12 request packet / template status ledger / audit event templates / redaction examples / collection checks / intake preflight checks、S4.13 evidence routing rules / display sections / state transition rules / reviewer checklist / reviewer outcome lanes / reviewer audit event templates / reviewer audit display sections / reviewer audit collection checks / reviewer audit redaction examples / reviewer audit retention rules / reviewer audit retention checks / reviewer audit handoff packets / reviewer audit handoff checks / parallel session sync checks / parallel session conflict lanes / parallel session recovery checks / recovery outcome lanes、S1.3 non-blocking escalation lanes、S2.8 IwoooS frontend posture entry,以及 S2.9-S2.48 IwoooS posture projection contract 都是有效進展,但它們是 framework detail,不是 owner response、runtime gate、production ingestion 或 GitHub primary readiness。因此 headline 仍維持 58%,避免把只讀框架誤算成已落地執行。 | 最近完成 | 目前狀態 | headline delta | |----------|----------|----------------| @@ -107,6 +107,7 @@ python3 scripts/security/security-mirror-progress-guard.py | S2.45 IwoooS host owner decision record human record owner review preparation checklist | 已完成草案,將 preparation identity trace readable、owner boundary readable、decision summary readable、scope / expiry current、scan limits not authorization、credential metadata-only、maintenance / rollback traceable、validation / runtime gate separate、no-execution attestation present 顯示成九個只讀核對項 | 0 | | S2.46 IwoooS progress acceleration lanes | 已完成草案,將 owner response、redacted ingestion、runtime gate、GitHub readiness、AwoooP landing 與 cadence compression 六個真正會影響進度感的解鎖 lane 顯示在 IwoooS;headline 仍只在高層 gate 有 evidence 時 review | 0 | | S2.47 IwoooS owner response next-action focus | 已完成草案,將 S4.9 Gitea owner attestation 固定為下一個收件焦點,S4.10 / S4.11 / S4.12 依序排隊;received / accepted 仍為 0 | 0 | +| S2.48 IwoooS S4.9 owner response preflight | 已完成草案,將 S4.9 六個收件前檢查顯示在 IwoooS;request sent、received / accepted / rejected、preflight passed、audit emitted 仍為 0 | 0 | headline 要再往上,需要 S4.9 / S4.10 / S4.11 / S4.12 任一 owner response 收到並通過脫敏驗收,或人工批准後出現 active runtime gate、redacted payload ingestion、GitHub primary readiness 這類落地 evidence。 @@ -173,6 +174,7 @@ headline 要再往上,需要 S4.9 / S4.10 / S4.11 / S4.12 任一 owner respons | S2.45 IwoooS Host Owner Decision Record Human Record Owner Review Preparation Checklist | 完成草案 | `/iwooos` 新增主機 owner decision record human record owner review preparation checklist,顯示 preparation identity trace readable、owner boundary readable、decision summary readable、scope / expiry current、scan limits not authorization、credential metadata-only、maintenance / rollback traceable、validation / runtime gate separate、no-execution attestation present 九個只讀核對項 | 使用者能理解 human record owner review preparation checklist 仍不是 preparation completed、checklist passed、review started、review ready、owner decision 或正式紀錄;仍不建立 decision record、不標記 accepted、不開 runtime gate、不執行主機動作 | | S2.46 IwoooS Progress Acceleration Lanes | 完成草案 | `/iwooos` 新增進度加速與 58% 解鎖面板,顯示 owner response、redacted ingestion、runtime gate、GitHub readiness、AwoooP landing 與 cadence compression 六條 acceleration lanes | 使用者能理解前面看起來慢是因為 S2.38-S2.45 都是防止誤讀的 framework detail;後續改採 milestone batch,但 acceleration lane 仍不是 owner response、進度加分、runtime gate、GitHub primary 或 production execution | | S2.47 IwoooS Owner Response Next-Action Focus | 完成草案 | `/iwooos` 新增 owner response 下一步收件焦點,顯示 S4.9 Gitea owner attestation 先收、S4.10 GitHub target、S4.11 refs truth、S4.12 workflow / secret name 依序排隊 | 使用者能理解下一個有感工作是收斂 P0 owner response;focus 仍不是催收、代填、received、accepted、approval record、runtime gate、repo / refs mutation、secret value collection 或 GitHub primary | +| S2.48 IwoooS S4.9 Owner Response Preflight | 完成草案 | `/iwooos` 新增 S4.9 owner response 收件前 preflight,顯示 known attestation item、required owner fields、allowed decision、redacted evidence only、no execution request、all five items before accepted 六個檢查 | 使用者能理解下一步不是再拆 checklist,而是把第一個 P0 owner response 的可收件條件說清楚;preflight 仍不是 request sent、received、accepted、audit emitted、Gitea write、refs sync、runtime gate 或 GitHub primary | | S3 approval gate | 進行中 | `security_approval_gate_v1` 已建立 8 個人工 gate items:7 pending、1 block candidate、0 approved | 不得繞過人工批准;批准後仍需 follow-up runtime gate | | S3.0 人工批准 Gate 契約 | 完成草案 | 定義批准範圍、決策選項、required reviewers、still forbidden 與 follow-up runtime gate | AwoooP 可記錄決策,不可執行 gate item | | S3.1 人工決策紀錄契約 | 完成草案 | `security_approval_decision_record_v1` 已建立;目前 0 筆 decision records、0 個 runtime action 授權 | AwoooP 可稽核決策,不可把決策當執行 | diff --git a/docs/security/iwooos-posture-projection.snapshot.json b/docs/security/iwooos-posture-projection.snapshot.json index acaf40061..605f95533 100644 --- a/docs/security/iwooos-posture-projection.snapshot.json +++ b/docs/security/iwooos-posture-projection.snapshot.json @@ -73,7 +73,8 @@ "host_owner_decision_record_human_record_owner_review_preparation_packet_count": 9, "host_owner_decision_record_human_record_owner_review_preparation_checklist_item_count": 9, "progress_acceleration_lane_count": 6, - "owner_response_next_action_focus_item_count": 4 + "owner_response_next_action_focus_item_count": 4, + "s4_9_owner_response_preflight_check_count": 6 }, "progress": { "overall_percent": 58, @@ -183,7 +184,8 @@ "display_host_owner_decision_record_human_record_owner_review_candidate_outcome_lanes", "display_host_owner_decision_record_human_record_owner_review_preparation_packets", "display_host_owner_decision_record_human_record_owner_review_preparation_checklist", - "display_owner_response_next_action_focus" + "display_owner_response_next_action_focus", + "display_s4_9_owner_response_preflight_checks" ], "forbidden_frontend_outputs": [ "add_scan_button", @@ -354,7 +356,16 @@ "skip_s4_9_from_owner_response_focus", "open_runtime_gate_from_owner_response_focus", "switch_github_primary_from_owner_response_focus", - "create_repo_from_owner_response_focus" + "create_repo_from_owner_response_focus", + "treat_s4_9_preflight_as_request_sent", + "treat_s4_9_preflight_as_received", + "mark_s4_9_preflight_passed_from_frontend", + "accept_s4_9_owner_response_from_preflight", + "emit_s4_9_audit_event_from_preflight", + "open_runtime_gate_from_s4_9_preflight", + "write_gitea_from_s4_9_preflight", + "sync_refs_from_s4_9_preflight", + "switch_primary_from_s4_9_preflight" ], "runtime_execution_authorized": false, "action_buttons_allowed": false, @@ -6060,5 +6071,187 @@ "action_buttons_allowed": false, "not_authorization": true } + ], + "s4_9_owner_response_preflight_checks": [ + { + "preflight_id": "s4_9_preflight_known_attestation_item", + "display_order": 1, + "source_check_id": "preflight-known-attestation-item", + "source_packet": "docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md", + "pass_condition_summary": "回覆必須對應 S4.7 五個 coverage attestation items 之一。", + "failure_lane": "request_owner_correction", + "display_mode": "s4_9_owner_response_preflight_only", + "required": true, + "request_sent_count": 0, + "owner_response_received_count": 0, + "owner_response_accepted_count": 0, + "owner_response_rejected_count": 0, + "preflight_passed_count": 0, + "audit_events_emitted_count": 0, + "request_sent_allowed": false, + "owner_response_collection_allowed": false, + "mark_passed_allowed": false, + "mark_received_allowed": false, + "mark_accepted_allowed": false, + "approval_record_created": false, + "runtime_gate_opened": false, + "gitea_write_allowed": false, + "repo_or_refs_mutation_allowed": false, + "secret_value_collection_allowed": false, + "sensitive_payload_allowed": false, + "runtime_execution_authorized": false, + "action_buttons_allowed": false, + "not_authorization": true + }, + { + "preflight_id": "s4_9_preflight_required_owner_fields", + "display_order": 2, + "source_check_id": "preflight-required-owner-fields", + "source_packet": "docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md", + "pass_condition_summary": "每筆 response 必須有 owner role/team、decision、decision_reason、受影響 scope、evidence_refs 與 followup_owner。", + "failure_lane": "request_more_evidence", + "display_mode": "s4_9_owner_response_preflight_only", + "required": true, + "request_sent_count": 0, + "owner_response_received_count": 0, + "owner_response_accepted_count": 0, + "owner_response_rejected_count": 0, + "preflight_passed_count": 0, + "audit_events_emitted_count": 0, + "request_sent_allowed": false, + "owner_response_collection_allowed": false, + "mark_passed_allowed": false, + "mark_received_allowed": false, + "mark_accepted_allowed": false, + "approval_record_created": false, + "runtime_gate_opened": false, + "gitea_write_allowed": false, + "repo_or_refs_mutation_allowed": false, + "secret_value_collection_allowed": false, + "sensitive_payload_allowed": false, + "runtime_execution_authorized": false, + "action_buttons_allowed": false, + "not_authorization": true + }, + { + "preflight_id": "s4_9_preflight_allowed_decision", + "display_order": 3, + "source_check_id": "preflight-allowed-decision", + "source_packet": "docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md", + "pass_condition_summary": "decision 必須落在對應 response template 的 acceptable_decisions。", + "failure_lane": "request_owner_correction", + "display_mode": "s4_9_owner_response_preflight_only", + "required": true, + "request_sent_count": 0, + "owner_response_received_count": 0, + "owner_response_accepted_count": 0, + "owner_response_rejected_count": 0, + "preflight_passed_count": 0, + "audit_events_emitted_count": 0, + "request_sent_allowed": false, + "owner_response_collection_allowed": false, + "mark_passed_allowed": false, + "mark_received_allowed": false, + "mark_accepted_allowed": false, + "approval_record_created": false, + "runtime_gate_opened": false, + "gitea_write_allowed": false, + "repo_or_refs_mutation_allowed": false, + "secret_value_collection_allowed": false, + "sensitive_payload_allowed": false, + "runtime_execution_authorized": false, + "action_buttons_allowed": false, + "not_authorization": true + }, + { + "preflight_id": "s4_9_preflight_redacted_evidence_only", + "display_order": 4, + "source_check_id": "preflight-redacted-evidence-only", + "source_packet": "docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md", + "pass_condition_summary": "evidence_refs 只能指向 repo 內文件、snapshot 或 owner 提供的脫敏 metadata。", + "failure_lane": "quarantine_sensitive_payload", + "display_mode": "s4_9_owner_response_preflight_only", + "required": true, + "request_sent_count": 0, + "owner_response_received_count": 0, + "owner_response_accepted_count": 0, + "owner_response_rejected_count": 0, + "preflight_passed_count": 0, + "audit_events_emitted_count": 0, + "request_sent_allowed": false, + "owner_response_collection_allowed": false, + "mark_passed_allowed": false, + "mark_received_allowed": false, + "mark_accepted_allowed": false, + "approval_record_created": false, + "runtime_gate_opened": false, + "gitea_write_allowed": false, + "repo_or_refs_mutation_allowed": false, + "secret_value_collection_allowed": false, + "sensitive_payload_allowed": false, + "runtime_execution_authorized": false, + "action_buttons_allowed": false, + "not_authorization": true + }, + { + "preflight_id": "s4_9_preflight_no_execution_request", + "display_order": 5, + "source_check_id": "preflight-no-execution-request", + "source_packet": "docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md", + "pass_condition_summary": "response 不得要求 repo 寫入、repo 建立、visibility 修改、refs sync/delete/force-push、workflow/secret/runner 變更、scan 或 runtime action。", + "failure_lane": "reject_execution_request", + "display_mode": "s4_9_owner_response_preflight_only", + "required": true, + "request_sent_count": 0, + "owner_response_received_count": 0, + "owner_response_accepted_count": 0, + "owner_response_rejected_count": 0, + "preflight_passed_count": 0, + "audit_events_emitted_count": 0, + "request_sent_allowed": false, + "owner_response_collection_allowed": false, + "mark_passed_allowed": false, + "mark_received_allowed": false, + "mark_accepted_allowed": false, + "approval_record_created": false, + "runtime_gate_opened": false, + "gitea_write_allowed": false, + "repo_or_refs_mutation_allowed": false, + "secret_value_collection_allowed": false, + "sensitive_payload_allowed": false, + "runtime_execution_authorized": false, + "action_buttons_allowed": false, + "not_authorization": true + }, + { + "preflight_id": "s4_9_preflight_all_five_items_before_accepted", + "display_order": 6, + "source_check_id": "preflight-all-five-items-before-accepted", + "source_packet": "docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md", + "pass_condition_summary": "S4.9 要被標示 accepted 前,五個 response templates 都必須收到可驗收 owner response。", + "failure_lane": "keep_waiting_owner_response", + "display_mode": "s4_9_owner_response_preflight_only", + "required": true, + "request_sent_count": 0, + "owner_response_received_count": 0, + "owner_response_accepted_count": 0, + "owner_response_rejected_count": 0, + "preflight_passed_count": 0, + "audit_events_emitted_count": 0, + "request_sent_allowed": false, + "owner_response_collection_allowed": false, + "mark_passed_allowed": false, + "mark_received_allowed": false, + "mark_accepted_allowed": false, + "approval_record_created": false, + "runtime_gate_opened": false, + "gitea_write_allowed": false, + "repo_or_refs_mutation_allowed": false, + "secret_value_collection_allowed": false, + "sensitive_payload_allowed": false, + "runtime_execution_authorized": false, + "action_buttons_allowed": false, + "not_authorization": true + } ] } diff --git a/docs/security/security-mirror-status-rollup.snapshot.json b/docs/security/security-mirror-status-rollup.snapshot.json index 2a1d33665..d05e8fa39 100644 --- a/docs/security/security-mirror-status-rollup.snapshot.json +++ b/docs/security/security-mirror-status-rollup.snapshot.json @@ -1034,6 +1034,18 @@ "runtime_delta": false, "execution_authorized": false, "not_authorization": true + }, + { + "delta_id": "s2_48_iwooos_s4_9_owner_response_preflight", + "display_order": 77, + "completed_stage": "S2.48 IwoooS S4.9 owner response preflight", + "progress_axis": "framework_detail", + "headline_percent_delta": 0, + "framework_delta_visible": true, + "why_headline_unchanged": "S4.9 owner response preflight 只顯示六個收件前檢查;request sent、owner response received/accepted/rejected、audit emitted、runtime gate、Gitea write、refs mutation、GitHub primary readiness 與 production landing 仍未改變。", + "runtime_delta": false, + "execution_authorized": false, + "not_authorization": true } ], "next_safe_actions": [ @@ -1430,7 +1442,8 @@ "S2.44 只新增 IwoooS host owner decision record human record owner review preparation packets;host_owner_decision_record_human_record_owner_review_preparation_packet_count=9、human_record_owner_review_prepared_count=0、human_record_owner_review_check_passed_count=0、human_record_owner_review_started_count=0、human_record_owner_review_ready_count=0、human_record_owner_handoff_review_passed_count=0、human_record_owner_handoff_started_count=0、human_record_owner_handoff_ready_count=0、formal_record_queue_review_passed_count=0、formal_record_queue_enqueued_count=0、decision_record_created=false、owner_decision_received_count=0、owner_decision_accepted_count=0、owner_approval_record_created=false、runtime_gate_opened=false,不把 review preparation packet 當 preparation completed、review started、review ready、owner decision、正式 decision record、批准或 runtime gate。", "S2.45 只新增 IwoooS host owner decision record human record owner review preparation checklist;host_owner_decision_record_human_record_owner_review_preparation_checklist_item_count=9、human_record_owner_review_prepared_count=0、human_record_owner_review_check_passed_count=0、human_record_owner_review_started_count=0、human_record_owner_review_ready_count=0、human_record_owner_handoff_review_passed_count=0、human_record_owner_handoff_started_count=0、human_record_owner_handoff_ready_count=0、formal_record_queue_review_passed_count=0、formal_record_queue_enqueued_count=0、decision_record_created=false、owner_decision_received_count=0、owner_decision_accepted_count=0、owner_approval_record_created=false、runtime_gate_opened=false,不把 review preparation checklist 當 preparation completed、checklist passed、review started、review ready、owner decision、正式 decision record、批准或 runtime gate。", "S2.46 新增 IwoooS progress acceleration lanes;progress_acceleration_lane_count=6、headline_percent_after_this_stage=58、owner_response_received_count=0、owner_response_accepted_count=0、payloads_ingested=false、active_runtime_gate_count=0、github_primary_ready_count=0、production_landing_enabled=false,不把 acceleration lane 當授權、進度加分、runtime gate、owner response received、GitHub primary 或 production execution。", - "S2.47 新增 IwoooS owner response next-action focus;owner_response_next_action_focus_item_count=4,顯示 S4.9 Gitea owner attestation 為下一個收件焦點,S4.10/S4.11/S4.12 依序排隊;owner response received/accepted/rejected 與 audit events emitted 仍為 0,不自動催收、代填、標記 received/accepted、建立 approval record、開 runtime gate 或切 GitHub primary。" + "S2.47 新增 IwoooS owner response next-action focus;owner_response_next_action_focus_item_count=4,顯示 S4.9 Gitea owner attestation 為下一個收件焦點,S4.10/S4.11/S4.12 依序排隊;owner response received/accepted/rejected 與 audit events emitted 仍為 0,不自動催收、代填、標記 received/accepted、建立 approval record、開 runtime gate 或切 GitHub primary。", + "S2.48 新增 IwoooS S4.9 owner response preflight;s4_9_owner_response_preflight_check_count=6,顯示 known item、required owner fields、allowed decision、redacted evidence only、no execution request、all five items before accepted 六個收件前檢查;request sent、owner response received/accepted/rejected、preflight passed 與 audit events emitted 仍為 0,不標記 sent/received/accepted、不建立 approval record、不寫 Gitea、不 sync refs、不開 runtime gate 或切 GitHub primary。" ], "forbidden_actions": [ "start_kali_scan", diff --git a/scripts/security/security-mirror-progress-guard.py b/scripts/security/security-mirror-progress-guard.py index 4bc41686c..fbcf03761 100755 --- a/scripts/security/security-mirror-progress-guard.py +++ b/scripts/security/security-mirror-progress-guard.py @@ -199,6 +199,7 @@ def validate(root: Path) -> None: "s2_45_iwooos_host_owner_decision_record_human_record_owner_review_preparation_checklist", "s2_46_iwooos_progress_acceleration_lanes", "s2_47_iwooos_owner_response_next_action_focus", + "s2_48_iwooos_s4_9_owner_response_preflight", ] assert_equal( "progress_delta_ledger.delta_ids", @@ -1059,6 +1060,119 @@ def validate(root: Path) -> None: f"iwooos_projection.owner_response_next_action_focus_items.{item['focus_id']}.not_authorization", item["not_authorization"], ) + expected_s4_9_owner_response_preflight_ids = [ + "s4_9_preflight_known_attestation_item", + "s4_9_preflight_required_owner_fields", + "s4_9_preflight_allowed_decision", + "s4_9_preflight_redacted_evidence_only", + "s4_9_preflight_no_execution_request", + "s4_9_preflight_all_five_items_before_accepted", + ] + assert_equal( + "iwooos_projection.summary.s4_9_owner_response_preflight_check_count", + iwooos_projection["summary"]["s4_9_owner_response_preflight_check_count"], + len(expected_s4_9_owner_response_preflight_ids), + ) + s4_9_owner_response_preflight_checks = iwooos_projection["s4_9_owner_response_preflight_checks"] + assert_equal( + "iwooos_projection.s4_9_owner_response_preflight_checks.ids", + [item["preflight_id"] for item in s4_9_owner_response_preflight_checks], + expected_s4_9_owner_response_preflight_ids, + ) + assert_equal( + "iwooos_projection.s4_9_owner_response_preflight_checks.display_order", + [item["display_order"] for item in s4_9_owner_response_preflight_checks], + list(range(1, len(expected_s4_9_owner_response_preflight_ids) + 1)), + ) + assert_equal( + "iwooos_projection.s4_9_owner_response_preflight_checks.source_check_ids", + [item["source_check_id"] for item in s4_9_owner_response_preflight_checks], + [ + "preflight-known-attestation-item", + "preflight-required-owner-fields", + "preflight-allowed-decision", + "preflight-redacted-evidence-only", + "preflight-no-execution-request", + "preflight-all-five-items-before-accepted", + ], + ) + assert_equal( + "iwooos_projection.s4_9_owner_response_preflight_checks.failure_lanes", + [item["failure_lane"] for item in s4_9_owner_response_preflight_checks], + [ + "request_owner_correction", + "request_more_evidence", + "request_owner_correction", + "quarantine_sensitive_payload", + "reject_execution_request", + "keep_waiting_owner_response", + ], + ) + for item in s4_9_owner_response_preflight_checks: + assert_equal( + f"iwooos_projection.s4_9_owner_response_preflight_checks.{item['preflight_id']}.source_packet", + item["source_packet"], + "docs/security/GITEA-INVENTORY-OWNER-ATTESTATION-RESPONSE.md", + ) + assert_equal( + f"iwooos_projection.s4_9_owner_response_preflight_checks.{item['preflight_id']}.display_mode", + item["display_mode"], + "s4_9_owner_response_preflight_only", + ) + assert_true(f"iwooos_projection.s4_9_owner_response_preflight_checks.{item['preflight_id']}.required", item["required"]) + assert_equal( + f"iwooos_projection.s4_9_owner_response_preflight_checks.{item['preflight_id']}.request_sent_count", + item["request_sent_count"], + 0, + ) + assert_equal( + f"iwooos_projection.s4_9_owner_response_preflight_checks.{item['preflight_id']}.owner_response_received_count", + item["owner_response_received_count"], + 0, + ) + assert_equal( + f"iwooos_projection.s4_9_owner_response_preflight_checks.{item['preflight_id']}.owner_response_accepted_count", + item["owner_response_accepted_count"], + 0, + ) + assert_equal( + f"iwooos_projection.s4_9_owner_response_preflight_checks.{item['preflight_id']}.owner_response_rejected_count", + item["owner_response_rejected_count"], + 0, + ) + assert_equal( + f"iwooos_projection.s4_9_owner_response_preflight_checks.{item['preflight_id']}.preflight_passed_count", + item["preflight_passed_count"], + 0, + ) + assert_equal( + f"iwooos_projection.s4_9_owner_response_preflight_checks.{item['preflight_id']}.audit_events_emitted_count", + item["audit_events_emitted_count"], + 0, + ) + for flag in [ + "request_sent_allowed", + "owner_response_collection_allowed", + "mark_passed_allowed", + "mark_received_allowed", + "mark_accepted_allowed", + "approval_record_created", + "runtime_gate_opened", + "gitea_write_allowed", + "repo_or_refs_mutation_allowed", + "secret_value_collection_allowed", + "sensitive_payload_allowed", + "runtime_execution_authorized", + "action_buttons_allowed", + ]: + assert_false( + f"iwooos_projection.s4_9_owner_response_preflight_checks.{item['preflight_id']}.{flag}", + item[flag], + ) + assert_true( + f"iwooos_projection.s4_9_owner_response_preflight_checks.{item['preflight_id']}.not_authorization", + item["not_authorization"], + ) assert_equal( "iwooos_projection.posture_pillars.ids", [item["pillar_id"] for item in iwooos_projection["posture_pillars"]], @@ -4010,6 +4124,7 @@ def validate(root: Path) -> None: "display_progress_estimate", "display_progress_acceleration_lanes", "display_owner_response_next_action_focus", + "display_s4_9_owner_response_preflight_checks", "display_non_blocking_lanes", "display_existing_frontend_security_surfaces", "display_frontend_surface_coverage_matrix", @@ -4217,6 +4332,15 @@ def validate(root: Path) -> None: "open_runtime_gate_from_owner_response_focus", "switch_github_primary_from_owner_response_focus", "create_repo_from_owner_response_focus", + "treat_s4_9_preflight_as_request_sent", + "treat_s4_9_preflight_as_received", + "mark_s4_9_preflight_passed_from_frontend", + "accept_s4_9_owner_response_from_preflight", + "emit_s4_9_audit_event_from_preflight", + "open_runtime_gate_from_s4_9_preflight", + "write_gitea_from_s4_9_preflight", + "sync_refs_from_s4_9_preflight", + "switch_primary_from_s4_9_preflight", "apply_runtime_blocking_control", "switch_github_primary", "production_deploy",