diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json
index 7aea0d7de..92d04c80c 100644
--- a/apps/web/messages/en.json
+++ b/apps/web/messages/en.json
@@ -2709,6 +2709,45 @@
}
}
},
+ "progressHoldMovementGates": {
+ "title": "Why 58% Is Still Holding",
+ "subtitle": "S2.50 surfaces the headline progress movement gates directly: work is moving, but none of the five gates that can trigger a 58% review has real evidence yet. Framework, docs, and frontend visibility accumulate in the 80-85% framework track, not in the landed headline.",
+ "gateLabel": "Movement gate",
+ "moveLabel": "When it moves",
+ "guardLabel": "No inflation rule",
+ "items": {
+ "ownerResponseAccepted": {
+ "title": "Owner response accepted is still 0",
+ "body": "S4.9-S4.12 still have no owner response received / accepted; S4.9 is request-ready only.",
+ "move": "The headline can be reviewed after the first redacted owner responses pass S4.9 preflight and the S4.13 rollup.",
+ "guard": "Do not treat request-ready, templates, preflight, or focus as received / accepted."
+ },
+ "redactedPayloadIngested": {
+ "title": "Redacted payload ingestion is not enabled",
+ "body": "Evidence refs, redaction examples, quarantine, and preflight exist, but there is no accepted payload ingestion yet.",
+ "move": "Runtime landing can be reviewed after redacted payloads are approved, pass preflight, and enter read-only ingestion.",
+ "guard": "No raw payloads, credential plaintext, or doc examples as ingestion."
+ },
+ "activeRuntimeGate": {
+ "title": "Active runtime gate is still 0",
+ "body": "Kali `/execute`, SSH, host updates, blocking control, repo / refs / workflow actions remain outside an active gate.",
+ "move": "It moves only after human approval, scope, rollback, post-check metrics, and a separate active runtime gate.",
+ "guard": "Do not open runtime gates from IwoooS, progress numbers, or checklists."
+ },
+ "githubPrimaryReady": {
+ "title": "GitHub primary ready is still 0",
+ "body": "GitHub targets, refs truth, workflow / secret name parity, and rollback ADR are still in owner-response / readiness phases.",
+ "move": "primary_ready_count can become greater than 0 after at least one repo passes target, refs, workflow / secret name, and rollback readiness.",
+ "guard": "No repo creation, refs sync, primary switch, or candidate as readiness."
+ },
+ "awooopReadOnlyLanding": {
+ "title": "AwoooP landing is not yet production-consumed",
+ "body": "IwoooS is visible, but the AwoooP main line still needs read-only consumption of rollup, evidence refs, and guard results without execution routing.",
+ "move": "User-visible progress improves after AwoooP consumes this state read-only and passes guard checks, still without production execution.",
+ "guard": "Read-only landing is not an action button, approval, runtime execution, or blocking control."
+ }
+ }
+ },
"progressAcceleration": {
"title": "Progress Acceleration And Real Unlock Points",
"subtitle": "Progress is moving, but the 58% headline only gets reassessed when owner responses, runtime gates, GitHub primary readiness, or AwoooP production landing produce real evidence. This board makes the next visible unlock points explicit.",
diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json
index a46010c66..ff027376e 100644
--- a/apps/web/messages/zh-TW.json
+++ b/apps/web/messages/zh-TW.json
@@ -2710,6 +2710,45 @@
}
}
},
+ "progressHoldMovementGates": {
+ "title": "為什麼 58% 還不動",
+ "subtitle": "S2.50 把 headline progress 的移動門檻直接顯示出來:目前不是沒有推進,而是五個會讓 58% 進入下一輪重估的 gate 都還沒有實質 evidence。框架、文件、前端可見性會累積在 80-85% 框架進度,但不會灌水成落地百分比。",
+ "gateLabel": "移動門檻",
+ "moveLabel": "什麼時候會動",
+ "guardLabel": "不灌水原則",
+ "items": {
+ "ownerResponseAccepted": {
+ "title": "Owner response accepted 仍是 0",
+ "body": "S4.9-S4.12 都還沒有 owner response received / accepted,S4.9 目前只是 request-ready。",
+ "move": "第一批脫敏 owner response 通過 S4.9 preflight 與 S4.13 rollup 後,headline 才有重估依據。",
+ "guard": "不把 request-ready、template、preflight 或 focus 當成 received / accepted。"
+ },
+ "redactedPayloadIngested": {
+ "title": "Redacted payload ingestion 仍未啟用",
+ "body": "目前只定義 evidence refs、redaction examples、quarantine 與 preflight,尚未有 accepted payload ingestion。",
+ "move": "脫敏 payload 經人工批准、通過 preflight、進入只讀 ingestion 後,runtime landing 才能重估。",
+ "guard": "不收 raw payload、不收 credential plaintext、不把文件範例當 ingestion。"
+ },
+ "activeRuntimeGate": {
+ "title": "Active runtime gate 仍是 0",
+ "body": "Kali `/execute`、SSH、主機更新、blocking control、repo / refs / workflow 動作都仍在獨立 gate 之外。",
+ "move": "人工批准、scope、rollback、post-check metrics 完整,並另開 active runtime gate 後才會動。",
+ "guard": "不從 IwoooS 前端、progress 數字或 checklist 開 runtime gate。"
+ },
+ "githubPrimaryReady": {
+ "title": "GitHub primary ready 仍是 0",
+ "body": "GitHub target、refs truth、workflow / secret name parity、rollback ADR 都還在 owner response / readiness 階段。",
+ "move": "至少一批 repo 通過 target、refs、workflow / secret name 與 rollback readiness,primary_ready_count 才可大於 0。",
+ "guard": "不建 repo、不 sync refs、不切 primary、不把 candidate 當 readiness。"
+ },
+ "awooopReadOnlyLanding": {
+ "title": "AwoooP landing 仍未進 production 消費",
+ "body": "IwoooS 已可見,但 AwoooP 主線仍需只讀消費 rollup、evidence refs 與 guard result,且不得接 execution router。",
+ "move": "AwoooP 以只讀模式消費這組狀態並通過 guard 後,使用者體感會提升,但仍不代表 production execution。",
+ "guard": "read-only landing 不是 action button、approval、runtime execution 或 blocking control。"
+ }
+ }
+ },
"progressAcceleration": {
"title": "進度加速與真正解鎖點",
"subtitle": "目前不是沒有推進,而是 58% headline 只在 owner response、runtime gate、GitHub primary readiness 或 AwoooP production landing 有實質 evidence 時才會重估。這裡把下一批有感推進點集中顯示。",
diff --git a/apps/web/src/app/[locale]/iwooos/page.tsx b/apps/web/src/app/[locale]/iwooos/page.tsx
index b9840fab5..d32e50657 100644
--- a/apps/web/src/app/[locale]/iwooos/page.tsx
+++ b/apps/web/src/app/[locale]/iwooos/page.tsx
@@ -38,6 +38,13 @@ type ProgressAccelerationLane = {
tone: 'steady' | 'warn' | 'locked'
}
+type ProgressHoldMovementGate = {
+ key: string
+ gate: string
+ icon: typeof ShieldCheck
+ tone: 'steady' | 'warn' | 'locked'
+}
+
type OwnerResponseNextActionFocusItem = {
key: string
focus: string
@@ -344,6 +351,14 @@ const progressAccelerationLanes: ProgressAccelerationLane[] = [
{ key: 'cadenceCompression', lane: 'PAL6', icon: CheckCircle2, tone: 'steady' },
]
+const progressHoldMovementGates: ProgressHoldMovementGate[] = [
+ { key: 'ownerResponseAccepted', gate: 'G1', icon: ClipboardCheck, tone: 'warn' },
+ { key: 'redactedPayloadIngested', gate: 'G2', icon: FileText, tone: 'warn' },
+ { key: 'activeRuntimeGate', gate: 'G3', icon: Lock, tone: 'locked' },
+ { key: 'githubPrimaryReady', gate: 'G4', icon: GitBranch, tone: 'warn' },
+ { key: 'awooopReadOnlyLanding', gate: 'G5', icon: Radar, tone: 'steady' },
+]
+
const ownerResponseNextActionFocusItems: OwnerResponseNextActionFocusItem[] = [
{ key: 'giteaOwnerAttestation', focus: 'S4.9', icon: ClipboardCheck, tone: 'warn' },
{ key: 'githubTargetOwnerDecision', focus: 'S4.10', icon: GitBranch, tone: 'warn' },
@@ -877,6 +892,38 @@ function ProgressAccelerationLaneCard({ item }: { item: ProgressAccelerationLane
)
}
+function ProgressHoldMovementGateCard({ item }: { item: ProgressHoldMovementGate }) {
+ const t = useTranslations('iwooos.progressHoldMovementGates')
+ const Icon = item.icon
+ return (
+
{t('progressAcceleration.title')}
diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md
index 3fdc098f6..ad2961321 100644
--- a/docs/LOGBOOK.md
+++ b/docs/LOGBOOK.md
@@ -1,3 +1,17 @@
+## 2026-05-20 | 資安供應鏈 S2.50:IwoooS Progress Hold Movement Gates
+
+**背景**:統帥指出整體進度長時間停在 58% 看起來像卡住。本輪不灌水提高 headline,而是把 58% 不動的真實原因直接顯示在 IwoooS:框架、文件、前端可見性確實累積在 80-85% 框架進度,但 headline 只在 owner response accepted、redacted payload ingestion、active runtime gate、GitHub primary ready 或 AwoooP read-only landing 有 evidence 時才進入重估。
+
+**完成**:
+- `/iwooos` 新增「為什麼 58% 還不動」五個 movement gates:Owner response accepted 仍是 0、Redacted payload ingestion 仍未啟用、Active runtime gate 仍是 0、GitHub primary ready 仍是 0、AwoooP landing 仍未進 production 消費。
+- `iwooos_posture_projection_v1` schema / snapshot 新增 `progress_hold_movement_gates` 與 `progress_hold_movement_gate_count=5`,每個 gate 固定 `headline_percent_delta=0`、owner response received / accepted = 0、payloads_ingested=false、active_runtime_gate_count=0、github_primary_ready_count=0、production_landing_enabled=false、progress_change_applied=false、runtime_execution_authorized=false、action_buttons_allowed=false、not_authorization=true。
+- `security_mirror_status_rollup_v1` micro progress ledger 新增 `s2_50_iwooos_progress_hold_movement_gates`,headline progress 仍維持 58%。
+- `security-mirror-progress-guard.py` 開始驗證五個 movement gates、movement signals、current counters、zero / false 邊界、allowed frontend output 與 forbidden output。
+
+**仍禁止**:
+- progress hold movement gates 不代表進度已加分、owner response received / accepted、payload ingestion、runtime gate、GitHub primary ready、AwoooP production landing、approval record、action button、Kali `/execute`、SSH 登入、主機變更、Kali 更新或 blocking control。
+- 整體資安網 headline 仍是 58%;框架 / 治理 / 文件 / schema / read-only evidence 仍約 80-85%;真正落地執行 / runtime ingestion / GitHub primary / AwoooP production landing 仍約 35-40%。
+
## 2026-05-20 | 資安供應鏈 S2.49:IwoooS S4.9 Owner Response Request Templates
**背景**:S2.48 已把 S4.9 收件前 preflight 顯示在 IwoooS;本輪把 owner 真正要逐項回覆的五個 request templates 顯示出來,讓下一個 P0 owner response 不只知道「如何驗收」,也知道「要回覆哪五題」。
diff --git a/docs/schemas/iwooos_posture_projection_v1.schema.json b/docs/schemas/iwooos_posture_projection_v1.schema.json
index b898645f7..e5eef66fc 100644
--- a/docs/schemas/iwooos_posture_projection_v1.schema.json
+++ b/docs/schemas/iwooos_posture_projection_v1.schema.json
@@ -14,6 +14,7 @@
"source_paths",
"summary",
"progress",
+ "progress_hold_movement_gates",
"progress_acceleration_lanes",
"owner_response_next_action_focus_items",
"s4_9_owner_response_preflight_checks",
@@ -147,6 +148,7 @@
"host_owner_decision_record_human_record_owner_review_candidate_outcome_lane_count",
"host_owner_decision_record_human_record_owner_review_preparation_packet_count",
"host_owner_decision_record_human_record_owner_review_preparation_checklist_item_count",
+ "progress_hold_movement_gate_count",
"progress_acceleration_lane_count",
"action_buttons_allowed",
"owner_response_next_action_focus_item_count",
@@ -349,6 +351,10 @@
"type": "integer",
"const": 9
},
+ "progress_hold_movement_gate_count": {
+ "type": "integer",
+ "const": 5
+ },
"progress_acceleration_lane_count": {
"type": "integer",
"const": 6
@@ -3832,6 +3838,113 @@
"additionalProperties": false
}
},
+ "progress_hold_movement_gates": {
+ "type": "array",
+ "minItems": 5,
+ "maxItems": 5,
+ "items": {
+ "type": "object",
+ "required": [
+ "gate_id",
+ "display_order",
+ "movement_signal",
+ "current_counter_name",
+ "current_counter_value",
+ "current_state_label",
+ "required_evidence",
+ "expected_review_effect",
+ "display_mode",
+ "headline_percent_delta",
+ "owner_response_received_count",
+ "owner_response_accepted_count",
+ "payloads_ingested",
+ "active_runtime_gate_count",
+ "github_primary_ready_count",
+ "production_landing_enabled",
+ "progress_change_applied",
+ "runtime_execution_authorized",
+ "action_buttons_allowed",
+ "not_authorization"
+ ],
+ "properties": {
+ "gate_id": {
+ "type": "string"
+ },
+ "display_order": {
+ "type": "integer",
+ "minimum": 1
+ },
+ "movement_signal": {
+ "type": "string"
+ },
+ "current_counter_name": {
+ "type": "string"
+ },
+ "current_counter_value": {
+ "type": [
+ "integer",
+ "boolean"
+ ]
+ },
+ "current_state_label": {
+ "type": "string"
+ },
+ "required_evidence": {
+ "type": "string"
+ },
+ "expected_review_effect": {
+ "type": "string"
+ },
+ "display_mode": {
+ "const": "progress_hold_movement_gate_only"
+ },
+ "headline_percent_delta": {
+ "type": "integer",
+ "const": 0
+ },
+ "owner_response_received_count": {
+ "type": "integer",
+ "const": 0
+ },
+ "owner_response_accepted_count": {
+ "type": "integer",
+ "const": 0
+ },
+ "payloads_ingested": {
+ "type": "boolean",
+ "const": false
+ },
+ "active_runtime_gate_count": {
+ "type": "integer",
+ "const": 0
+ },
+ "github_primary_ready_count": {
+ "type": "integer",
+ "const": 0
+ },
+ "production_landing_enabled": {
+ "type": "boolean",
+ "const": false
+ },
+ "progress_change_applied": {
+ "type": "boolean",
+ "const": false
+ },
+ "runtime_execution_authorized": {
+ "type": "boolean",
+ "const": false
+ },
+ "action_buttons_allowed": {
+ "type": "boolean",
+ "const": false
+ },
+ "not_authorization": {
+ "type": "boolean",
+ "const": true
+ }
+ }
+ }
+ },
"progress_acceleration_lanes": {
"type": "array",
"minItems": 6,
diff --git a/docs/security/IWOOOS-POSTURE-PROJECTION.md b/docs/security/IWOOOS-POSTURE-PROJECTION.md
index 3ef4f04ee..cfbe2dccf 100644
--- a/docs/security/IWOOOS-POSTURE-PROJECTION.md
+++ b/docs/security/IWOOOS-POSTURE-PROJECTION.md
@@ -77,6 +77,7 @@ IwoooS 首版只讀取或對齊以下已提交 evidence:
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。
47. 5 個 S4.9 owner response request templates,直接顯示 owner 要逐項回覆的 public-only / local gap、org/user endpoint、110 adjacent source、repo owner / canonical scope、legacy / inaccessible disposition,但不送出 request、不催收、不代填、不標記 received / accepted、不完成 Gitea inventory、不寫 Gitea、不 sync refs、不切 GitHub primary。
+48. 5 個 progress hold movement gates,直接顯示 58% 仍維持的五個實質門檻:owner response accepted、redacted payload ingestion、active runtime gate、GitHub primary ready、AwoooP read-only landing,但不把 gate 顯示當成進度加分、授權或 runtime execution。
## 3.1 既有前端資安頁面整合
@@ -795,6 +796,22 @@ S2.49 將 S4.9 owner response 的五個 request templates 拉到 IwoooS 可見
這個 request template board 不代表 S4.9 request 已寄出、owner response 已收到、owner response 已接受或 Gitea 清冊已完成。它只把第一個 owner response 收件包需要 owner 回覆的五題顯示清楚,讓後續真正收件時不再模糊。
+## 3.41 Progress Hold Movement Gates
+
+S2.50 回應「為什麼進度仍停在 58%」:這不是沒有推進,而是五個能讓 headline 進度進入下一輪重估的實質 gate 仍全部為 0 / false。IwoooS 只把這些 gate 顯示清楚,不自動提高百分比、不收 payload、不開 runtime gate、不切 GitHub primary、不把 AwoooP landing 當 production execution。
+
+| 順序 | Movement gate | 目前狀態 | 需要的實質 evidence |
+|------|---------------|----------|----------------------|
+| 1 | Owner response accepted | `owner_response_validation_accepted_count=0` | S4.9 / S4.10 / S4.11 / S4.12 任一 owner response 通過脫敏 preflight、S4.13 rollup 與人工 review |
+| 2 | Redacted payload ingested | `payloads_ingested=false` | 脫敏 payload 經人工批准、通過 preflight / quarantine,並以 read-only ingestion 進入可驗證狀態 |
+| 3 | Active runtime gate | `active_runtime_gate_count=0` | 人工批准、scope、rollback、post-check metrics 與獨立 active runtime gate 完整建立 |
+| 4 | GitHub primary ready | `github_primary_ready_count=0` | 至少一批 repo 通過 GitHub target、refs truth、workflow / secret name parity 與 rollback readiness |
+| 5 | AwoooP read-only landing | `production_landing_enabled=false` | AwoooP 主線以只讀模式消費 rollup、evidence refs 與 guard result,且未接 execution router |
+
+每個 progress hold movement gate 都固定 `display_mode=progress_hold_movement_gate_only`、`headline_percent_delta=0`、`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`、`progress_change_applied=false`、`runtime_execution_authorized=false`、`action_buttons_allowed=false`、`not_authorization=true`。
+
+這個 movement gate board 不代表進度已加分、owner response 已收到或接受、payload ingestion 已啟用、runtime gate 已開啟、GitHub primary 已 ready 或 AwoooP 已進 production execution。它只把 58% 維持的理由轉成使用者可理解、也可被 guard 驗證的五個門檻。
+
## 4. 仍禁止
IwoooS 不得提供下列輸出:
@@ -838,10 +855,11 @@ IwoooS 不得提供下列輸出:
37. 把 owner decision record human record owner review preparation packet 當成 approval、標記 preparation completed、開始 human record owner review、標記 review ready、收 owner decision、由 preparation packet 建立 decision record,或從 preparation packet 開 runtime gate。
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. 把 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. 把 S4.9 owner response request template 當成 request sent、owner response received / accepted、audit emitted、Gitea inventory completed、Gitea write、repo / refs mutation、token collection、runtime gate 或 GitHub primary switch。
-43. 把 58% progress、contract count、mirror readiness 或前端可見狀態當成授權。
+40. 把 progress hold movement gate 當成進度加分、owner response received / accepted、payload ingestion、runtime gate、GitHub primary ready、AwoooP production landing 或 action button。
+41. 把 owner response next-action focus 當成催收、代填、received、accepted、approval record、runtime gate、repo / refs mutation、secret value collection 或 GitHub primary switch。
+42. 把 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。
+43. 把 S4.9 owner response request template 當成 request sent、owner response received / accepted、audit emitted、Gitea inventory completed、Gitea write、repo / refs mutation、token collection、runtime gate 或 GitHub primary switch。
+44. 把 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 b9e636300..91417b758 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 依序排隊;S2.48 已補 6 個 S4.9 owner response preflight checks,讓下一個 P0 owner response 的可收件條件可見;S2.49 已補 5 個 S4.9 owner response request templates,讓 owner 要逐項回覆的五題可見;仍不新增 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 的可收件條件可見;S2.49 已補 5 個 S4.9 owner response request templates,讓 owner 要逐項回覆的五題可見;S2.50 已補 5 個 progress hold movement gates,解釋為什麼 58% 仍維持且五個真實 movement signal 都是 0 / false;仍不新增 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` |
@@ -133,6 +133,7 @@
| 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 仍全部鎖住 |
| S2.49 IwoooS S4.9 owner response request templates | framework detail | 0 | 只顯示 S4.9 五個 request-ready-not-sent templates;request sent、received、accepted、rejected、audit emitted、Gitea inventory completed、Gitea write、repo / refs mutation、token collection、runtime gate、GitHub primary 與 action button 仍全部鎖住 |
+| S2.50 IwoooS progress hold movement gates | framework detail | 0 | 只顯示 58% 維持的五個實質門檻;owner response accepted、redacted payload ingestion、active runtime gate、GitHub primary ready、AwoooP read-only landing 仍全部為 0 / false,不把 gate 顯示當授權、進度加分或 action button |
headline 進度要再往上,至少需要下列任一高層 gate 有實質 evidence:
diff --git a/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md b/docs/security/SECURITY-SUPPLY-CHAIN-PROGRESS.md
index 7d2625754..8a505e3af 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 + Workflow / Secret Name Owner Response 收件包 + Source Control Owner Response Validation Rollup + 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 報告契約 + 鏡像狀態彙整契約 + IwoooS 前端態勢入口 + IwoooS posture projection contract + IwoooS 既有前端資安頁面整合 + IwoooS 覆蓋與邊界矩陣 + IwoooS 只讀資安處理旅程 + IwoooS owner evidence readiness board + IwoooS host coverage view + IwoooS host action gate matrix + IwoooS host evidence readiness board + IwoooS host evidence collection order + IwoooS host evidence intake preflight + IwoooS host evidence review outcome lanes + IwoooS host evidence review handoff packets + IwoooS host evidence reviewer checklist + IwoooS host evidence reviewer outcome lanes + IwoooS host owner decision candidate packets + IwoooS host owner decision review checklist + IwoooS host owner decision review outcome lanes + IwoooS host owner decision record draft packets + IwoooS host owner decision record draft review checklist + IwoooS host owner decision record draft review outcome lanes + IwoooS host owner decision record write-up packets + IwoooS host owner decision record write-up review checklist + IwoooS host owner decision record write-up review outcome lanes + IwoooS host owner decision record formal candidate packets + IwoooS host owner decision record formal candidate review checklist + IwoooS host owner decision record formal candidate review outcome lanes + IwoooS host owner decision record formal record queue packets + IwoooS host owner decision record formal record queue review checklist + IwoooS host owner decision record formal record queue review outcome lanes + IwoooS host owner decision record human handoff readiness packets + IwoooS host owner decision record human handoff readiness review checklist + IwoooS host owner decision record human handoff readiness review outcome lanes + IwoooS host owner decision record human record owner review candidate packets + IwoooS host owner decision record human record owner review candidate checklist + IwoooS host owner decision record human record owner review candidate outcome lanes + IwoooS host owner decision record human record owner review preparation packets + IwoooS host owner decision record human record owner review preparation checklist + IwoooS progress acceleration lanes + IwoooS owner response next-action focus |
+| 本階段完成 | 資安供應鏈 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 收件包 + Source Control Owner Response Validation Rollup + 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 報告契約 + 鏡像狀態彙整契約 + IwoooS 前端態勢入口 + IwoooS posture projection contract + IwoooS 既有前端資安頁面整合 + IwoooS 覆蓋與邊界矩陣 + IwoooS 只讀資安處理旅程 + IwoooS owner evidence readiness board + IwoooS host coverage view + IwoooS host action gate matrix + IwoooS host evidence readiness board + IwoooS host evidence collection order + IwoooS host evidence intake preflight + IwoooS host evidence review outcome lanes + IwoooS host evidence review handoff packets + IwoooS host evidence reviewer checklist + IwoooS host evidence reviewer outcome lanes + IwoooS host owner decision candidate packets + IwoooS host owner decision review checklist + IwoooS host owner decision review outcome lanes + IwoooS host owner decision record draft packets + IwoooS host owner decision record draft review checklist + IwoooS host owner decision record draft review outcome lanes + IwoooS host owner decision record write-up packets + IwoooS host owner decision record write-up review checklist + IwoooS host owner decision record write-up review outcome lanes + IwoooS host owner decision record formal candidate packets + IwoooS host owner decision record formal candidate review checklist + IwoooS host owner decision record formal candidate review outcome lanes + IwoooS host owner decision record formal record queue packets + IwoooS host owner decision record formal record queue review checklist + IwoooS host owner decision record formal record queue review outcome lanes + IwoooS host owner decision record human handoff readiness packets + IwoooS host owner decision record human handoff readiness review checklist + IwoooS host owner decision record human handoff readiness review outcome lanes + IwoooS host owner decision record human record owner review candidate packets + IwoooS host owner decision record human record owner review candidate checklist + IwoooS host owner decision record human record owner review candidate outcome lanes + IwoooS host owner decision record human record owner review preparation packets + IwoooS host owner decision record human record owner review preparation checklist + IwoooS progress acceleration lanes + IwoooS owner response next-action focus + IwoooS S4.9 owner response preflight + IwoooS S4.9 owner response request templates + IwoooS progress hold movement gates |
| 原則 | 低摩擦分階段;文件、schema、read-only evidence 優先;不做 runtime enforcement、不切 primary |
## 0. 本階段完成後整體進度
@@ -27,7 +27,9 @@ 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.49 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.50 IwoooS posture projection contract 都是有效進展,但它們是 framework detail,不是 owner response、runtime gate、production ingestion 或 GitHub primary readiness。因此 headline 仍維持 58%,避免把只讀框架誤算成已落地執行。
+
+S2.50 也把「為什麼 58% 還不動」拆成五個可見 gate:owner response accepted、redacted payload ingestion、active runtime gate、GitHub primary ready、AwoooP read-only landing。這五個 gate 目前仍全部是 0 / false,所以 headline 不應被灌水提高。
| 最近完成 | 目前狀態 | headline delta |
|----------|----------|----------------|
@@ -109,6 +111,7 @@ python3 scripts/security/security-mirror-progress-guard.py
| 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 |
| S2.49 IwoooS S4.9 owner response request templates | 已完成草案,將 S4.9 五個 request-ready-not-sent templates 顯示在 IwoooS;request sent、received / accepted / rejected、audit emitted 仍為 0 | 0 |
+| S2.50 IwoooS progress hold movement gates | 已完成草案,將 58% 維持原因拆成 owner response accepted、redacted payload ingestion、active runtime gate、GitHub primary ready、AwoooP read-only landing 五個 gate;全部仍為 0 / false | 0 |
headline 要再往上,需要 S4.9 / S4.10 / S4.11 / S4.12 任一 owner response 收到並通過脫敏驗收,或人工批准後出現 active runtime gate、redacted payload ingestion、GitHub primary readiness 這類落地 evidence。
@@ -177,6 +180,7 @@ headline 要再往上,需要 S4.9 / S4.10 / S4.11 / S4.12 任一 owner respons
| 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 |
| S2.49 IwoooS S4.9 Owner Response Request Templates | 完成草案 | `/iwooos` 新增 S4.9 owner response 五個回覆 template,顯示 public-only / local gap、org/user endpoint、110 adjacent source scope、repo owner / canonical scope、legacy / inaccessible disposition | 使用者能理解第一個 owner response 要回哪五題;templates 仍不是 request sent、received、accepted、audit emitted、Gitea inventory completed、Gitea write、refs sync、token collection、runtime gate 或 GitHub primary |
+| S2.50 IwoooS Progress Hold Movement Gates | 完成草案 | `/iwooos` 新增「為什麼 58% 還不動」五個 movement gates,顯示 owner response accepted、redacted payload ingestion、active runtime gate、GitHub primary ready、AwoooP read-only landing 仍全部未滿足 | 使用者能理解 58% 維持不是卡死,而是不灌水;gate 顯示仍不是進度加分、授權、payload ingestion、runtime gate、GitHub primary 或 production landing |
| 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 460d7fecb..4411ed4c6 100644
--- a/docs/security/iwooos-posture-projection.snapshot.json
+++ b/docs/security/iwooos-posture-projection.snapshot.json
@@ -72,6 +72,7 @@
"host_owner_decision_record_human_record_owner_review_candidate_outcome_lane_count": 9,
"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_hold_movement_gate_count": 5,
"progress_acceleration_lane_count": 6,
"owner_response_next_action_focus_item_count": 4,
"s4_9_owner_response_preflight_check_count": 6,
@@ -143,6 +144,7 @@
"allowed_frontend_outputs": [
"display_security_posture",
"display_progress_estimate",
+ "display_progress_hold_movement_gates",
"display_progress_acceleration_lanes",
"display_non_blocking_lanes",
"display_existing_frontend_security_surfaces",
@@ -377,7 +379,14 @@
"write_gitea_from_s4_9_template",
"sync_refs_from_s4_9_template",
"switch_primary_from_s4_9_template",
- "collect_token_from_s4_9_template"
+ "collect_token_from_s4_9_template",
+ "treat_progress_hold_gate_as_percent_increase",
+ "increase_headline_without_gate_evidence",
+ "mark_owner_response_received_from_hold_gate",
+ "mark_payload_ingested_from_hold_gate",
+ "open_runtime_gate_from_hold_gate",
+ "mark_github_primary_ready_from_hold_gate",
+ "enable_production_landing_from_hold_gate"
],
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
@@ -5864,6 +5873,118 @@
"not_authorization": true
}
],
+ "progress_hold_movement_gates": [
+ {
+ "gate_id": "progress_hold_owner_response_accepted",
+ "display_order": 1,
+ "movement_signal": "owner_response_accepted",
+ "current_counter_name": "owner_response_validation_accepted_count",
+ "current_counter_value": 0,
+ "current_state_label": "owner_response_validation_accepted_count=0",
+ "required_evidence": "S4.9 / S4.10 / S4.11 / S4.12 任一 owner response 通過脫敏 preflight、S4.13 rollup 與人工 review。",
+ "expected_review_effect": "trigger_headline_progress_review",
+ "display_mode": "progress_hold_movement_gate_only",
+ "headline_percent_delta": 0,
+ "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,
+ "progress_change_applied": false,
+ "runtime_execution_authorized": false,
+ "action_buttons_allowed": false,
+ "not_authorization": true
+ },
+ {
+ "gate_id": "progress_hold_redacted_payload_ingested",
+ "display_order": 2,
+ "movement_signal": "redacted_payload_ingested",
+ "current_counter_name": "payloads_ingested",
+ "current_counter_value": false,
+ "current_state_label": "payloads_ingested=false",
+ "required_evidence": "脫敏 payload 經人工批准、通過 preflight / quarantine,並以 read-only ingestion 進入可驗證狀態。",
+ "expected_review_effect": "trigger_runtime_landing_progress_review",
+ "display_mode": "progress_hold_movement_gate_only",
+ "headline_percent_delta": 0,
+ "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,
+ "progress_change_applied": false,
+ "runtime_execution_authorized": false,
+ "action_buttons_allowed": false,
+ "not_authorization": true
+ },
+ {
+ "gate_id": "progress_hold_active_runtime_gate",
+ "display_order": 3,
+ "movement_signal": "active_runtime_gate",
+ "current_counter_name": "active_runtime_gate_count",
+ "current_counter_value": 0,
+ "current_state_label": "active_runtime_gate_count=0",
+ "required_evidence": "人工批准、scope、rollback、post-check metrics 與獨立 active runtime gate 完整建立。",
+ "expected_review_effect": "trigger_runtime_gate_progress_review",
+ "display_mode": "progress_hold_movement_gate_only",
+ "headline_percent_delta": 0,
+ "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,
+ "progress_change_applied": false,
+ "runtime_execution_authorized": false,
+ "action_buttons_allowed": false,
+ "not_authorization": true
+ },
+ {
+ "gate_id": "progress_hold_github_primary_ready",
+ "display_order": 4,
+ "movement_signal": "github_primary_ready",
+ "current_counter_name": "github_primary_ready_count",
+ "current_counter_value": 0,
+ "current_state_label": "github_primary_ready_count=0",
+ "required_evidence": "至少一批 repo 通過 GitHub target、refs truth、workflow / secret name parity 與 rollback readiness。",
+ "expected_review_effect": "trigger_source_control_progress_review",
+ "display_mode": "progress_hold_movement_gate_only",
+ "headline_percent_delta": 0,
+ "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,
+ "progress_change_applied": false,
+ "runtime_execution_authorized": false,
+ "action_buttons_allowed": false,
+ "not_authorization": true
+ },
+ {
+ "gate_id": "progress_hold_awooop_read_only_landing",
+ "display_order": 5,
+ "movement_signal": "awooop_read_only_landing",
+ "current_counter_name": "production_landing_enabled",
+ "current_counter_value": false,
+ "current_state_label": "production_landing_enabled=false",
+ "required_evidence": "AwoooP 主線以只讀模式消費 rollup、evidence refs 與 guard result,且未接 execution router。",
+ "expected_review_effect": "trigger_user_visible_landing_progress_review",
+ "display_mode": "progress_hold_movement_gate_only",
+ "headline_percent_delta": 0,
+ "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,
+ "progress_change_applied": false,
+ "runtime_execution_authorized": false,
+ "action_buttons_allowed": false,
+ "not_authorization": true
+ }
+ ],
"progress_acceleration_lanes": [
{
"lane_id": "progress_acceleration_owner_responses",
diff --git a/docs/security/security-mirror-status-rollup.snapshot.json b/docs/security/security-mirror-status-rollup.snapshot.json
index 32e1bb39a..9845e4afc 100644
--- a/docs/security/security-mirror-status-rollup.snapshot.json
+++ b/docs/security/security-mirror-status-rollup.snapshot.json
@@ -1058,6 +1058,18 @@
"runtime_delta": false,
"execution_authorized": false,
"not_authorization": true
+ },
+ {
+ "delta_id": "s2_50_iwooos_progress_hold_movement_gates",
+ "display_order": 79,
+ "completed_stage": "S2.50 IwoooS progress hold movement gates",
+ "progress_axis": "framework_detail",
+ "headline_percent_delta": 0,
+ "framework_delta_visible": true,
+ "why_headline_unchanged": "progress hold movement gates 只顯示 58% 維持的五個實質門檻;owner response accepted、payload ingestion、active runtime gate、GitHub primary readiness、AwoooP read-only landing 都仍未改變。",
+ "runtime_delta": false,
+ "execution_authorized": false,
+ "not_authorization": true
}
],
"next_safe_actions": [
@@ -1456,7 +1468,8 @@
"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.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。",
- "S2.49 新增 IwoooS S4.9 owner response request templates;s4_9_owner_response_request_template_count=5,顯示 public-only/local gap、org/user endpoint、110 adjacent scope、repo owner/canonical scope、legacy/inaccessible disposition 五個 request-ready-not-sent templates;request sent、owner response received/accepted/rejected 與 audit events emitted 仍為 0,不自動催收、代填、送出 request、標記 received/accepted、完成 Gitea inventory、寫 Gitea、sync refs 或切 GitHub primary。"
+ "S2.49 新增 IwoooS S4.9 owner response request templates;s4_9_owner_response_request_template_count=5,顯示 public-only/local gap、org/user endpoint、110 adjacent scope、repo owner/canonical scope、legacy/inaccessible disposition 五個 request-ready-not-sent templates;request sent、owner response received/accepted/rejected 與 audit events emitted 仍為 0,不自動催收、代填、送出 request、標記 received/accepted、完成 Gitea inventory、寫 Gitea、sync refs 或切 GitHub primary。",
+ "S2.50 新增 IwoooS progress hold movement gates;progress_hold_movement_gate_count=5,顯示 owner_response_accepted、redacted_payload_ingested、active_runtime_gate、github_primary_ready、awooop_read_only_landing 五個真正會讓 58% 進入下一輪重估的 gate;owner response received/accepted、payloads_ingested、active_runtime_gate_count、github_primary_ready_count、production_landing_enabled 仍全部為 0/false,不把 gate 顯示當進度加分、授權或 runtime execution。"
],
"forbidden_actions": [
"start_kali_scan",
diff --git a/scripts/security/security-mirror-progress-guard.py b/scripts/security/security-mirror-progress-guard.py
index a862e8df4..d781328e3 100755
--- a/scripts/security/security-mirror-progress-guard.py
+++ b/scripts/security/security-mirror-progress-guard.py
@@ -201,6 +201,7 @@ def validate(root: Path) -> None:
"s2_47_iwooos_owner_response_next_action_focus",
"s2_48_iwooos_s4_9_owner_response_preflight",
"s2_49_iwooos_s4_9_owner_response_request_templates",
+ "s2_50_iwooos_progress_hold_movement_gates",
]
assert_equal(
"progress_delta_ledger.delta_ids",
@@ -884,6 +885,111 @@ def validate(root: Path) -> None:
progress_display_policy["headline_status"],
)
assert_true("iwooos_projection.progress.not_authorization", iwooos_progress["not_authorization"])
+ expected_progress_hold_movement_gate_ids = [
+ "progress_hold_owner_response_accepted",
+ "progress_hold_redacted_payload_ingested",
+ "progress_hold_active_runtime_gate",
+ "progress_hold_github_primary_ready",
+ "progress_hold_awooop_read_only_landing",
+ ]
+ assert_equal(
+ "iwooos_projection.summary.progress_hold_movement_gate_count",
+ iwooos_projection["summary"]["progress_hold_movement_gate_count"],
+ len(expected_progress_hold_movement_gate_ids),
+ )
+ progress_hold_movement_gates = iwooos_projection["progress_hold_movement_gates"]
+ assert_equal(
+ "iwooos_projection.progress_hold_movement_gates.gate_ids",
+ [item["gate_id"] for item in progress_hold_movement_gates],
+ expected_progress_hold_movement_gate_ids,
+ )
+ assert_equal(
+ "iwooos_projection.progress_hold_movement_gates.display_order",
+ [item["display_order"] for item in progress_hold_movement_gates],
+ list(range(1, len(expected_progress_hold_movement_gate_ids) + 1)),
+ )
+ assert_equal(
+ "iwooos_projection.progress_hold_movement_gates.movement_signals",
+ [item["movement_signal"] for item in progress_hold_movement_gates],
+ [
+ "owner_response_accepted",
+ "redacted_payload_ingested",
+ "active_runtime_gate",
+ "github_primary_ready",
+ "awooop_read_only_landing",
+ ],
+ )
+ assert_equal(
+ "iwooos_projection.progress_hold_movement_gates.current_counter_names",
+ [item["current_counter_name"] for item in progress_hold_movement_gates],
+ [
+ "owner_response_validation_accepted_count",
+ "payloads_ingested",
+ "active_runtime_gate_count",
+ "github_primary_ready_count",
+ "production_landing_enabled",
+ ],
+ )
+ assert_equal(
+ "iwooos_projection.progress_hold_movement_gates.current_counter_values",
+ [item["current_counter_value"] for item in progress_hold_movement_gates],
+ [0, False, 0, 0, False],
+ )
+ for item in progress_hold_movement_gates:
+ assert_equal(
+ f"iwooos_projection.progress_hold_movement_gates.{item['gate_id']}.display_mode",
+ item["display_mode"],
+ "progress_hold_movement_gate_only",
+ )
+ assert_equal(
+ f"iwooos_projection.progress_hold_movement_gates.{item['gate_id']}.headline_percent_delta",
+ item["headline_percent_delta"],
+ 0,
+ )
+ assert_equal(
+ f"iwooos_projection.progress_hold_movement_gates.{item['gate_id']}.owner_response_received_count",
+ item["owner_response_received_count"],
+ 0,
+ )
+ assert_equal(
+ f"iwooos_projection.progress_hold_movement_gates.{item['gate_id']}.owner_response_accepted_count",
+ item["owner_response_accepted_count"],
+ 0,
+ )
+ assert_false(
+ f"iwooos_projection.progress_hold_movement_gates.{item['gate_id']}.payloads_ingested",
+ item["payloads_ingested"],
+ )
+ assert_equal(
+ f"iwooos_projection.progress_hold_movement_gates.{item['gate_id']}.active_runtime_gate_count",
+ item["active_runtime_gate_count"],
+ 0,
+ )
+ assert_equal(
+ f"iwooos_projection.progress_hold_movement_gates.{item['gate_id']}.github_primary_ready_count",
+ item["github_primary_ready_count"],
+ 0,
+ )
+ assert_false(
+ f"iwooos_projection.progress_hold_movement_gates.{item['gate_id']}.production_landing_enabled",
+ item["production_landing_enabled"],
+ )
+ assert_false(
+ f"iwooos_projection.progress_hold_movement_gates.{item['gate_id']}.progress_change_applied",
+ item["progress_change_applied"],
+ )
+ assert_false(
+ f"iwooos_projection.progress_hold_movement_gates.{item['gate_id']}.runtime_execution_authorized",
+ item["runtime_execution_authorized"],
+ )
+ assert_false(
+ f"iwooos_projection.progress_hold_movement_gates.{item['gate_id']}.action_buttons_allowed",
+ item["action_buttons_allowed"],
+ )
+ assert_true(
+ f"iwooos_projection.progress_hold_movement_gates.{item['gate_id']}.not_authorization",
+ item["not_authorization"],
+ )
assert_equal(
"iwooos_projection.summary.progress_acceleration_lane_count",
iwooos_projection["summary"]["progress_acceleration_lane_count"],
@@ -4226,6 +4332,7 @@ def validate(root: Path) -> None:
for output in [
"display_security_posture",
"display_progress_estimate",
+ "display_progress_hold_movement_gates",
"display_progress_acceleration_lanes",
"display_owner_response_next_action_focus",
"display_s4_9_owner_response_preflight_checks",
@@ -4423,6 +4530,13 @@ def validate(root: Path) -> None:
"collect_owner_decision_from_human_record_owner_review_preparation_checklist",
"create_host_owner_decision_record_from_human_record_owner_review_preparation_checklist",
"open_runtime_gate_from_human_record_owner_review_preparation_checklist",
+ "treat_progress_hold_gate_as_percent_increase",
+ "increase_headline_without_gate_evidence",
+ "mark_owner_response_received_from_hold_gate",
+ "mark_payload_ingested_from_hold_gate",
+ "open_runtime_gate_from_hold_gate",
+ "mark_github_primary_ready_from_hold_gate",
+ "enable_production_landing_from_hold_gate",
"treat_progress_acceleration_as_authorization",
"increase_headline_from_progress_acceleration_lane",
"open_runtime_gate_from_progress_acceleration_lane",