feat(web): add IwoooS decision record drafts

This commit is contained in:
Your Name
2026-05-19 23:39:23 +08:00
parent 32a5890e88
commit 451c7c0088
11 changed files with 524 additions and 6 deletions

View File

@@ -1758,6 +1758,49 @@
"next": "active runtime gates=0; action buttons=false"
}
}
},
"hostOwnerDecisionRecordDrafts": {
"title": "Host Owner Decision Record Draft Packets",
"subtitle": "When owner review outcome enters the ready lane, IwoooS can still only display decision record draft fields. It does not create records, mark acceptance, or open runtime gates.",
"packetLabel": "Draft packet",
"metadataLabel": "Required metadata",
"items": {
"scopeStatementDraft": {
"title": "Scope statement draft",
"body": "The draft only organizes hosts, networks, services, exclusions, and observation intent so the owner decision does not stay ambiguous.",
"metadata": "host / network / service / exclusion; record created=false"
},
"scanModeDraft": {
"title": "Scan mode draft",
"body": "The draft only describes observe-only, future active scan, or credentialed scan candidate modes. It is not scan approval.",
"metadata": "mode candidate; active scan=false"
},
"credentialBoundaryDraft": {
"title": "Credential boundary draft",
"body": "The draft only keeps credential handling metadata, owner, and retention boundary. It does not collect sensitive material.",
"metadata": "metadata-only boundary; secret collection=false"
},
"maintenanceConstraintsDraft": {
"title": "Maintenance constraints draft",
"body": "The draft only records future maintenance window candidates, constraints, and impact boundaries. It is not host update approval.",
"metadata": "window / constraint; host update=false"
},
"rollbackOwnerDraft": {
"title": "Rollback owner draft",
"body": "The draft only organizes rollback owner, recovery path, and human contact so later gates have accountability.",
"metadata": "owner / recovery pointer; approval record=false"
},
"validationMetricsDraft": {
"title": "Validation metrics draft",
"body": "The draft only lists post-check metrics, baseline, and evidence pointer for later human interpretation.",
"metadata": "metrics / baseline; accepted=0"
},
"runtimeGateDraft": {
"title": "Runtime gate draft",
"body": "The draft only states that later approval must still open a separate follow-up runtime gate and cannot execute from the draft.",
"metadata": "runtime gate pointer; active gates=0"
}
}
}
},
"tickets": {

View File

@@ -1759,6 +1759,49 @@
"next": "active runtime gates=0action buttons=false"
}
}
},
"hostOwnerDecisionRecordDrafts": {
"title": "主機 Owner Decision Record Draft Packets",
"subtitle": "Owner review outcome 若進入 ready laneIwoooS 也只能顯示 decision record 草稿欄位。不建立 record、不標示 accepted、不開 runtime gate。",
"packetLabel": "Draft packet",
"metadataLabel": "必要 metadata",
"items": {
"scopeStatementDraft": {
"title": "Scope statement draft",
"body": "草稿只整理主機、網段、服務、排除範圍與觀察目的,避免 owner decision 模糊。",
"metadata": "host / network / service / exclusionrecord created=false"
},
"scanModeDraft": {
"title": "Scan mode draft",
"body": "草稿只描述 observe-only、future active scan 或 credentialed scan 的候選模式,不代表掃描批准。",
"metadata": "mode candidateactive scan=false"
},
"credentialBoundaryDraft": {
"title": "Credential boundary draft",
"body": "草稿只保留 credential handling 的 metadata、owner 與保存邊界,不收集敏感素材。",
"metadata": "metadata-only boundarysecret collection=false"
},
"maintenanceConstraintsDraft": {
"title": "Maintenance constraints draft",
"body": "草稿只記錄未來可能維護窗口、限制條件與不可影響範圍,不代表可以更新主機。",
"metadata": "window / constrainthost update=false"
},
"rollbackOwnerDraft": {
"title": "Rollback owner draft",
"body": "草稿只整理 rollback owner、復原路徑與人工聯絡點讓後續 gate 不缺責任人。",
"metadata": "owner / recovery pointerapproval record=false"
},
"validationMetricsDraft": {
"title": "Validation metrics draft",
"body": "草稿只列出 post-check metrics、baseline 與 evidence pointer供未來人工判讀。",
"metadata": "metrics / baselineaccepted=0"
},
"runtimeGateDraft": {
"title": "Runtime gate draft",
"body": "草稿只標示若未來批准,仍需另開 follow-up runtime gate不能由草稿直接執行。",
"metadata": "runtime gate pointeractive gates=0"
}
}
}
},
"tickets": {

View File

@@ -158,6 +158,13 @@ type HostOwnerDecisionReviewOutcomeLane = {
tone: 'steady' | 'warn' | 'locked'
}
type HostOwnerDecisionRecordDraftPacket = {
key: string
packet: string
icon: typeof ShieldCheck
tone: 'steady' | 'warn' | 'locked'
}
const postureMetrics: PostureMetric[] = [
{ key: 'overall', value: '58%', tone: 'warn' },
{ key: 'framework', value: '80-85%', tone: 'steady' },
@@ -369,6 +376,16 @@ const hostOwnerDecisionReviewOutcomeLanes: HostOwnerDecisionReviewOutcomeLane[]
{ key: 'runtimeGateRequired', lane: 'U7', icon: ShieldCheck, tone: 'locked' },
]
const hostOwnerDecisionRecordDraftPackets: HostOwnerDecisionRecordDraftPacket[] = [
{ key: 'scopeStatementDraft', packet: 'DR1', icon: Radar, tone: 'warn' },
{ key: 'scanModeDraft', packet: 'DR2', icon: Activity, tone: 'locked' },
{ key: 'credentialBoundaryDraft', packet: 'DR3', icon: Lock, tone: 'locked' },
{ key: 'maintenanceConstraintsDraft', packet: 'DR4', icon: Clock3, tone: 'warn' },
{ key: 'rollbackOwnerDraft', packet: 'DR5', icon: FileWarning, tone: 'warn' },
{ key: 'validationMetricsDraft', packet: 'DR6', icon: CheckCircle2, tone: 'warn' },
{ key: 'runtimeGateDraft', packet: 'DR7', icon: ShieldCheck, tone: 'locked' },
]
const evidenceItems = [
'iwooos-posture-projection.snapshot.json',
'security-rollout-policy.snapshot.json',
@@ -951,6 +968,34 @@ function HostOwnerDecisionReviewOutcomeCard({ item }: { item: HostOwnerDecisionR
)
}
function HostOwnerDecisionRecordDraftCard({ item }: { item: HostOwnerDecisionRecordDraftPacket }) {
const t = useTranslations('iwooos.hostOwnerDecisionRecordDrafts')
const Icon = item.icon
return (
<div style={{ ...band, minHeight: 190, padding: 16 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 12 }}>
<div style={{ display: 'flex', alignItems: 'center', gap: 9 }}>
<Icon size={18} color={toneColors[item.tone]} />
<span style={{ fontSize: 11, color: '#87867f' }}>{t('packetLabel')}</span>
</div>
<span style={{ fontSize: 11, color: '#9b978b' }}>{item.packet}</span>
</div>
<h2 style={{ fontSize: 14, margin: '12px 0 6px', color: '#141413' }}>
{t(`items.${item.key}.title` as never)}
</h2>
<p style={{ fontSize: 12, lineHeight: 1.55, color: '#6f6d66', margin: 0 }}>
{t(`items.${item.key}.body` as never)}
</p>
<div style={{ marginTop: 10, display: 'grid', gap: 5 }}>
<div style={{ fontSize: 11, color: '#87867f' }}>{t('metadataLabel')}</div>
<div style={{ fontSize: 11, color: toneColors[item.tone], lineHeight: 1.45 }}>
{t(`items.${item.key}.metadata` as never)}
</div>
</div>
</div>
)
}
export default function IwoooSPage({ params }: { params: { locale: string } }) {
const t = useTranslations('iwooos')
@@ -1263,6 +1308,26 @@ export default function IwoooSPage({ params }: { params: { locale: string } }) {
</div>
</section>
<section style={{ marginBottom: 14 }}>
<div style={{ marginBottom: 14 }}>
<h2 style={{ fontSize: 16, margin: 0 }}>{t('hostOwnerDecisionRecordDrafts.title')}</h2>
<p style={{ fontSize: 12, color: '#6f6d66', margin: '6px 0 0', lineHeight: 1.55 }}>
{t('hostOwnerDecisionRecordDrafts.subtitle')}
</p>
</div>
<div
style={{
display: 'grid',
gridTemplateColumns: 'repeat(auto-fit, minmax(210px, 1fr))',
gap: 12,
}}
>
{hostOwnerDecisionRecordDraftPackets.map(item => (
<HostOwnerDecisionRecordDraftCard key={item.key} item={item} />
))}
</div>
</section>
<section
style={{
display: 'grid',

View File

@@ -1,3 +1,17 @@
## 2026-05-19 | 資安供應鏈 S2.26IwoooS Host Owner Decision Record Draft Packets
**背景**S2.25 已把 owner review checklist 後的只讀 outcome lanes 顯示出來;本輪補上 formal decision record 前的草稿欄位讓使用者知道「ready for decision record」仍只是草稿候選不代表 decision record 已建立或已批准。
**完成**
- `/iwooos` 新增「主機 Owner Decision Record Draft Packets」顯示 scope statement、scan mode、credential boundary、maintenance constraints、rollback owner、validation metrics、runtime gate pointer 七個只讀草稿包。
- `iwooos_posture_projection_v1` schema / snapshot 新增 `host_owner_decision_record_draft_packets``host_owner_decision_record_draft_packet_count=7`,每個 packet 固定 `display_mode=owner_decision_record_draft_only``decision_record_created=false``owner_decision_received_count=0``owner_decision_accepted_count=0``owner_approval_record_created=false``runtime_gate_opened=false``raw_payload_allowed=false``secret_value_collection_allowed=false``runtime_execution_authorized=false``action_buttons_allowed=false``not_authorization=true`
- `security-mirror-progress-guard.py` 開始驗證七個 host owner decision record draft packets、順序、draft fields以及 decision record / owner decision / approval record / runtime gate / raw payload / secret value / runtime / action button 仍全部鎖住。
- `security_mirror_status_rollup_v1` micro progress ledger 新增 `s2_26_iwooos_host_owner_decision_record_draft_packets`headline progress 仍維持 58%。
**仍禁止**
- host owner decision record draft packets 不代表 decision record created、owner decision received / accepted、approved、approval record created、runtime gate opened、raw payload ingestion、secret value collection、active scan、credentialed scan、Kali `/execute`、SSH 登入、主機變更、Kali 更新或 blocking control。
- 真正人工 owner decision、決策紀錄、批准與後續 runtime gate 仍需脫敏 evidence、人工簽核與獨立 runtime gate。
## 2026-05-19 | 資安供應鏈 S2.25IwoooS Host Owner Decision Review Outcome Lanes
**背景**S2.24 已把 owner decision review checklist 顯示出來;本輪補上 owner review 後的只讀 outcome lanes讓使用者知道 owner 核對後只能進入 formal decision record candidate、補 scope、補 scan mode / scope、隔離 credential boundary gap、補 maintenance window、補 rollback owner 或等待獨立 runtime gate。

View File

@@ -32,6 +32,7 @@
"host_owner_decision_candidate_packets",
"host_owner_decision_review_checklist_items",
"host_owner_decision_review_outcome_lanes",
"host_owner_decision_record_draft_packets",
"frontend_surface_coverage_groups",
"evidence_refs",
"allowed_frontend_outputs",
@@ -103,6 +104,7 @@
"host_owner_decision_candidate_packet_count",
"host_owner_decision_review_checklist_item_count",
"host_owner_decision_review_outcome_lane_count",
"host_owner_decision_record_draft_packet_count",
"action_buttons_allowed"
],
"properties": {
@@ -220,6 +222,10 @@
"host_owner_decision_review_outcome_lane_count": {
"type": "integer",
"const": 7
},
"host_owner_decision_record_draft_packet_count": {
"type": "integer",
"const": 7
}
},
"additionalProperties": false
@@ -1593,6 +1599,93 @@
},
"additionalProperties": false
}
},
"host_owner_decision_record_draft_packets": {
"type": "array",
"minItems": 7,
"items": {
"type": "object",
"required": [
"packet_id",
"display_order",
"source_lane_id",
"draft_field",
"required_metadata",
"display_mode",
"decision_record_created",
"owner_decision_received_count",
"owner_decision_accepted_count",
"owner_approval_record_created",
"runtime_gate_opened",
"raw_payload_allowed",
"secret_value_collection_allowed",
"runtime_execution_authorized",
"action_buttons_allowed",
"not_authorization"
],
"properties": {
"packet_id": {
"type": "string"
},
"display_order": {
"type": "integer",
"minimum": 1
},
"source_lane_id": {
"type": "string"
},
"draft_field": {
"type": "string"
},
"required_metadata": {
"type": "string"
},
"display_mode": {
"const": "owner_decision_record_draft_only"
},
"decision_record_created": {
"type": "boolean",
"const": false
},
"owner_decision_received_count": {
"type": "integer",
"const": 0
},
"owner_decision_accepted_count": {
"type": "integer",
"const": 0
},
"owner_approval_record_created": {
"type": "boolean",
"const": false
},
"runtime_gate_opened": {
"type": "boolean",
"const": false
},
"raw_payload_allowed": {
"type": "boolean",
"const": false
},
"secret_value_collection_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

View File

@@ -53,6 +53,7 @@ IwoooS 首版只讀取或對齊以下已提交 evidence
21. 7 個 host owner decision candidate packets顯示 reviewer outcome 進到 owner decision 前仍需要的人工決策範圍。
22. 7 個 host owner decision review checklist items顯示 owner decision candidate packets 後仍需人工核對的安全邊界。
23. 7 個 host owner decision review outcome lanes顯示 owner review checklist 後的只讀結果分流。
24. 7 個 host owner decision record draft packets顯示 formal decision record 候選需要的草稿欄位。
## 3.1 既有前端資安頁面整合
@@ -328,6 +329,24 @@ S2.25 將 owner decision review checklist 後可能出現的結果拆成七個
這個 outcome board 不代表 owner review 已通過、decision record 已建立、人工批准已完成或 runtime gate 已開啟。它只讓 IwoooS 把 owner review 後的下一步分流說清楚。
## 3.17 Host Owner Decision Record Draft Packets
S2.26 將 ready for decision record 後需要整理的欄位拆成七個只讀 draft packets。這一層只回答「若 owner review 進入 ready laneformal decision record 草稿要有哪些 metadata」不建立 decision record、不標記 accepted、不建立 approval record、不開 runtime gate。
| 順序 | Draft packet | 來源 lane | 必要 metadata |
|------|--------------|-----------|---------------|
| 1 | Scope statement draft | ready for decision record | host / network / service / exclusion / observation intent |
| 2 | Scan mode draft | scan mode scope required | observe-only / future active / credentialed scan candidate mode |
| 3 | Credential boundary draft | credential boundary failed | metadata-only credential owner / retention boundary |
| 4 | Maintenance constraints draft | maintenance window required | window / constraints / impact boundary / no-change statement |
| 5 | Rollback owner draft | rollback owner required | rollback owner / recovery path / human contact pointer |
| 6 | Validation metrics draft | runtime gate required | post-check metrics / baseline / evidence pointer |
| 7 | Runtime gate draft | runtime gate required | separate follow-up runtime gate pointeractive gate=0 |
每個 draft packet 都固定 `display_mode=owner_decision_record_draft_only``decision_record_created=false``owner_decision_received_count=0``owner_decision_accepted_count=0``owner_approval_record_created=false``runtime_gate_opened=false``raw_payload_allowed=false``secret_value_collection_allowed=false``runtime_execution_authorized=false``action_buttons_allowed=false``not_authorization=true`
這個 draft board 不代表 decision record 已建立、owner decision 已接受、資安批准已完成或 runtime gate 已開啟。它只讓 IwoooS 把 decision record 草稿欄位先說清楚,方便後續人工決策時不混入執行語義。
## 4. 仍禁止
IwoooS 不得提供下列輸出:
@@ -350,7 +369,8 @@ IwoooS 不得提供下列輸出:
16. 把 owner decision candidate 當成 approval、標記 host owner decision approved或從 owner decision candidate 開 runtime gate。
17. 把 owner decision review checklist 當成 approval、標記 owner decision review passed或從 owner decision review checklist 開 runtime gate。
18. 把 owner decision review outcome 當成 approval、標記 owner decision review outcome passed或從 owner decision review outcome 開 runtime gate。
19. 把 58% progress、contract count、mirror readiness 或前端可見狀態當成授權
19. 從 owner decision record draft 建立 host owner decision record、標記 record created或從 draft 開 runtime gate
20. 把 58% progress、contract count、mirror readiness 或前端可見狀態當成授權。
## 5. 驗證

View File

@@ -35,7 +35,7 @@
| Owner response validation | S4.13 已建立;四包 owner response 目前 received/accepted 皆為 04 條 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 attestationlatest local validation 為 `SOURCE_CONTROL_OWNER_RESPONSE_GUARD_OK`reviewer audit emitted 仍為 0不代表 owner response 已收到或任何執行授權 |
| Low-friction rollout policy | S1.3 已補 7 條 non-blocking escalation lanesLOW / 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 個既有前端資安相關頁面納入 projectionS2.11 已補 4 個 coverage groups 與 5 個 conflict controlsS2.12 已補 6 個只讀 operator journey stepsS2.13 已補 7 個 owner evidence readiness itemsS2.14 已補 3 個 host coverage itemsKali 112、開發主機 168、開發主機 111S2.15 已補 6 個 host action gate itemsS2.16 已補 7 個 host evidence readiness itemsS2.17 已補 7 個 host evidence collection order stepsS2.18 已補 7 個 host evidence intake preflight checksS2.19 已補 7 個 host evidence review outcome lanesS2.20 已補 7 個 host evidence review handoff packetsS2.21 已補 7 個 host evidence reviewer checklist itemsS2.22 已補 7 個 host evidence reviewer outcome lanesS2.23 已補 7 個 host owner decision candidate packetsS2.24 已補 7 個 host owner decision review checklist itemsS2.25 已補 7 個 host owner decision review outcome lanes仍不新增 action button |
| IwoooS posture projection | S2.9 已新增 `iwooos_posture_projection_v1`S2.10 已把 10 個既有前端資安相關頁面納入 projectionS2.11 已補 4 個 coverage groups 與 5 個 conflict controlsS2.12 已補 6 個只讀 operator journey stepsS2.13 已補 7 個 owner evidence readiness itemsS2.14 已補 3 個 host coverage itemsKali 112、開發主機 168、開發主機 111S2.15 已補 6 個 host action gate itemsS2.16 已補 7 個 host evidence readiness itemsS2.17 已補 7 個 host evidence collection order stepsS2.18 已補 7 個 host evidence intake preflight checksS2.19 已補 7 個 host evidence review outcome lanesS2.20 已補 7 個 host evidence review handoff packetsS2.21 已補 7 個 host evidence reviewer checklist itemsS2.22 已補 7 個 host evidence reviewer outcome lanesS2.23 已補 7 個 host owner decision candidate packetsS2.24 已補 7 個 host owner decision review checklist itemsS2.25 已補 7 個 host owner decision review outcome lanesS2.26 已補 7 個 host owner decision record draft packets仍不新增 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` |
@@ -109,6 +109,7 @@
| S2.23 IwoooS host owner decision candidate packets | framework detail | 0 | 只顯示 owner 人工決策前需要的七個 candidate packetsdecision record、approved count、runtime gate、raw payload、secret value、runtime execution 與 action button 仍全部鎖住 |
| S2.24 IwoooS host owner decision review checklist | framework detail | 0 | 只顯示 owner decision 前的七個只讀核對項decision record、approved count、runtime gate、raw payload、secret value、runtime execution 與 action button 仍全部鎖住 |
| S2.25 IwoooS host owner decision review outcome lanes | framework detail | 0 | 只顯示 owner review checklist 後的七個只讀結果分流review passed、decision record、approved count、runtime gate、raw payload、secret value、runtime execution 與 action button 仍全部鎖住 |
| S2.26 IwoooS host owner decision record draft packets | framework detail | 0 | 只顯示 formal decision record 需要的七個草稿欄位decision record created、accepted count、approval record、runtime gate、raw payload、secret value、runtime execution 與 action button 仍全部鎖住 |
headline 進度要再往上,至少需要下列任一高層 gate 有實質 evidence

View File

@@ -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 |
| 本階段完成 | 資安供應鏈 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 |
| 原則 | 低摩擦分階段文件、schema、read-only evidence 優先;不做 runtime enforcement、不切 primary |
## 0. 本階段完成後整體進度
@@ -85,6 +85,7 @@ python3 scripts/security/security-mirror-progress-guard.py
| S2.23 IwoooS host owner decision candidate packets | 已完成草案,將 scope approval、scan mode、credential handling、maintenance window、rollback owner、validation metrics 與 runtime gate 顯示成七個只讀 owner decision candidate packets | 0 |
| S2.24 IwoooS host owner decision review checklist | 已完成草案,將 scope readable、scan mode not authorization、credential metadata-only、maintenance not change、rollback owner、validation metrics 與 runtime gate separation 顯示成七個只讀 owner review checks | 0 |
| S2.25 IwoooS host owner decision review outcome lanes | 已完成草案,將 ready for decision record、scope refresh、scan mode scope review、credential boundary failed、maintenance window missing、rollback owner missing 與 runtime gate required 顯示成七個只讀 owner review outcome lanes | 0 |
| S2.26 IwoooS host owner decision record draft packets | 已完成草案,將 scope statement、scan mode、credential boundary、maintenance constraints、rollback owner、validation metrics 與 runtime gate pointer 顯示成七個只讀 decision record 草稿包 | 0 |
headline 要再往上,需要 S4.9 / S4.10 / S4.11 / S4.12 任一 owner response 收到並通過脫敏驗收,或人工批准後出現 active runtime gate、redacted payload ingestion、GitHub primary readiness 這類落地 evidence。
@@ -129,6 +130,7 @@ headline 要再往上,需要 S4.9 / S4.10 / S4.11 / S4.12 任一 owner respons
| S2.23 IwoooS Host Owner Decision Candidate Packets | 完成草案 | `/iwooos` 新增主機 owner decision candidate packets顯示 scope approval、scan mode、credential handling、maintenance window、rollback owner、validation metrics、runtime gate 七個候選包 | 使用者能理解 owner 人工決策需要看哪些素材;仍不建立 decision record、不標記 approved、不開 runtime gate、不執行主機動作 |
| S2.24 IwoooS Host Owner Decision Review Checklist | 完成草案 | `/iwooos` 新增主機 owner decision review checklist顯示 scope boundary readable、scan mode not authorization、credential boundary metadata only、maintenance window not change、rollback owner readable、validation metrics predefined、runtime gate still separate 七個檢查 | 使用者能理解 owner 決策前仍需核對哪些安全邊界;仍不建立 decision record、不標記 approved、不開 runtime gate、不執行主機動作 |
| S2.25 IwoooS Host Owner Decision Review Outcome Lanes | 完成草案 | `/iwooos` 新增主機 owner decision review outcome lanes顯示 ready for decision record、scope needs refresh、scan mode needs scope、credential boundary failed、maintenance window missing、rollback owner missing、runtime gate required 七個分流 | 使用者能理解 owner review 後下一步;仍不標記 review passed、不建立 decision record、不標記 approved、不開 runtime gate、不執行主機動作 |
| S2.26 IwoooS Host Owner Decision Record Draft Packets | 完成草案 | `/iwooos` 新增主機 owner decision record draft packets顯示 scope statement、scan mode、credential boundary、maintenance constraints、rollback owner、validation metrics、runtime gate pointer 七個草稿欄位 | 使用者能理解 formal decision record 草稿需要哪些 metadata仍不建立 decision record、不標記 accepted、不建立 approval record、不開 runtime gate、不執行主機動作 |
| S3 approval gate | 進行中 | `security_approval_gate_v1` 已建立 8 個人工 gate items7 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 可稽核決策,不可把決策當執行 |

View File

@@ -51,7 +51,8 @@
"host_evidence_reviewer_outcome_lane_count": 7,
"host_owner_decision_candidate_packet_count": 7,
"host_owner_decision_review_checklist_item_count": 7,
"host_owner_decision_review_outcome_lane_count": 7
"host_owner_decision_review_outcome_lane_count": 7,
"host_owner_decision_record_draft_packet_count": 7
},
"progress": {
"overall_percent": 58,
@@ -139,7 +140,8 @@
"display_host_evidence_reviewer_outcome_lanes",
"display_host_owner_decision_candidate_packets",
"display_host_owner_decision_review_checklist",
"display_host_owner_decision_review_outcome_lanes"
"display_host_owner_decision_review_outcome_lanes",
"display_host_owner_decision_record_draft_packets"
],
"forbidden_frontend_outputs": [
"add_scan_button",
@@ -191,7 +193,10 @@
"open_runtime_gate_from_owner_decision_review_check",
"treat_host_owner_decision_review_outcome_as_approval",
"mark_host_owner_decision_review_outcome_passed",
"open_runtime_gate_from_owner_decision_review_outcome"
"open_runtime_gate_from_owner_decision_review_outcome",
"create_host_owner_decision_record_from_draft",
"mark_host_owner_decision_record_created",
"open_runtime_gate_from_owner_decision_record_draft"
],
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
@@ -2155,5 +2160,133 @@
"action_buttons_allowed": false,
"not_authorization": true
}
],
"host_owner_decision_record_draft_packets": [
{
"packet_id": "host_decision_record_scope_draft_packet",
"display_order": 1,
"source_lane_id": "host_ready_for_decision_record_outcome_lane",
"draft_field": "scope_statement",
"required_metadata": "host_network_service_exclusion_and_observation_intent",
"display_mode": "owner_decision_record_draft_only",
"decision_record_created": false,
"owner_decision_received_count": 0,
"owner_decision_accepted_count": 0,
"owner_approval_record_created": false,
"runtime_gate_opened": false,
"raw_payload_allowed": false,
"secret_value_collection_allowed": false,
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
"not_authorization": true
},
{
"packet_id": "host_decision_record_scan_mode_draft_packet",
"display_order": 2,
"source_lane_id": "host_scan_mode_scope_required_decision_outcome_lane",
"draft_field": "scan_mode_statement",
"required_metadata": "observe_only_future_active_or_credentialed_scan_candidate_mode",
"display_mode": "owner_decision_record_draft_only",
"decision_record_created": false,
"owner_decision_received_count": 0,
"owner_decision_accepted_count": 0,
"owner_approval_record_created": false,
"runtime_gate_opened": false,
"raw_payload_allowed": false,
"secret_value_collection_allowed": false,
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
"not_authorization": true
},
{
"packet_id": "host_decision_record_credential_boundary_draft_packet",
"display_order": 3,
"source_lane_id": "host_credential_boundary_failed_decision_outcome_lane",
"draft_field": "credential_boundary_statement",
"required_metadata": "metadata_only_credential_owner_and_retention_boundary",
"display_mode": "owner_decision_record_draft_only",
"decision_record_created": false,
"owner_decision_received_count": 0,
"owner_decision_accepted_count": 0,
"owner_approval_record_created": false,
"runtime_gate_opened": false,
"raw_payload_allowed": false,
"secret_value_collection_allowed": false,
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
"not_authorization": true
},
{
"packet_id": "host_decision_record_maintenance_constraints_draft_packet",
"display_order": 4,
"source_lane_id": "host_maintenance_window_required_decision_outcome_lane",
"draft_field": "maintenance_constraints_statement",
"required_metadata": "window_constraints_impact_boundary_and_no_change_statement",
"display_mode": "owner_decision_record_draft_only",
"decision_record_created": false,
"owner_decision_received_count": 0,
"owner_decision_accepted_count": 0,
"owner_approval_record_created": false,
"runtime_gate_opened": false,
"raw_payload_allowed": false,
"secret_value_collection_allowed": false,
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
"not_authorization": true
},
{
"packet_id": "host_decision_record_rollback_owner_draft_packet",
"display_order": 5,
"source_lane_id": "host_rollback_owner_required_decision_outcome_lane",
"draft_field": "rollback_owner_statement",
"required_metadata": "rollback_owner_recovery_path_and_human_contact_pointer",
"display_mode": "owner_decision_record_draft_only",
"decision_record_created": false,
"owner_decision_received_count": 0,
"owner_decision_accepted_count": 0,
"owner_approval_record_created": false,
"runtime_gate_opened": false,
"raw_payload_allowed": false,
"secret_value_collection_allowed": false,
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
"not_authorization": true
},
{
"packet_id": "host_decision_record_validation_metrics_draft_packet",
"display_order": 6,
"source_lane_id": "host_runtime_gate_required_decision_outcome_lane",
"draft_field": "validation_metrics_statement",
"required_metadata": "post_check_metrics_baseline_and_evidence_pointer",
"display_mode": "owner_decision_record_draft_only",
"decision_record_created": false,
"owner_decision_received_count": 0,
"owner_decision_accepted_count": 0,
"owner_approval_record_created": false,
"runtime_gate_opened": false,
"raw_payload_allowed": false,
"secret_value_collection_allowed": false,
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
"not_authorization": true
},
{
"packet_id": "host_decision_record_runtime_gate_draft_packet",
"display_order": 7,
"source_lane_id": "host_runtime_gate_required_decision_outcome_lane",
"draft_field": "runtime_gate_pointer_statement",
"required_metadata": "separate_followup_runtime_gate_pointer_with_active_gate_zero",
"display_mode": "owner_decision_record_draft_only",
"decision_record_created": false,
"owner_decision_received_count": 0,
"owner_decision_accepted_count": 0,
"owner_approval_record_created": false,
"runtime_gate_opened": false,
"raw_payload_allowed": false,
"secret_value_collection_allowed": false,
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
"not_authorization": true
}
]
}

View File

@@ -810,6 +810,16 @@
"runtime_delta": false,
"execution_authorized": false,
"not_authorization": true
},
{
"delta_id": "s2_26_iwooos_host_owner_decision_record_draft_packets",
"display_order": 55,
"progress_axis": "framework_detail",
"headline_percent_delta": 0,
"framework_delta_visible": true,
"runtime_delta": false,
"execution_authorized": false,
"not_authorization": true
}
],
"next_safe_actions": [

View File

@@ -177,6 +177,7 @@ def validate(root: Path) -> None:
"s2_23_iwooos_host_owner_decision_candidate_packets",
"s2_24_iwooos_host_owner_decision_review_checklist",
"s2_25_iwooos_host_owner_decision_review_outcome_lanes",
"s2_26_iwooos_host_owner_decision_record_draft_packets",
]
assert_equal(
"progress_delta_ledger.delta_ids",
@@ -448,6 +449,15 @@ def validate(root: Path) -> None:
"host_rollback_owner_required_decision_outcome_lane",
"host_runtime_gate_required_decision_outcome_lane",
]
expected_iwooos_host_owner_decision_record_draft_packet_ids = [
"host_decision_record_scope_draft_packet",
"host_decision_record_scan_mode_draft_packet",
"host_decision_record_credential_boundary_draft_packet",
"host_decision_record_maintenance_constraints_draft_packet",
"host_decision_record_rollback_owner_draft_packet",
"host_decision_record_validation_metrics_draft_packet",
"host_decision_record_runtime_gate_draft_packet",
]
assert_equal(
"iwooos_projection.summary.frontend_surface_coverage_group_count",
iwooos_projection["summary"]["frontend_surface_coverage_group_count"],
@@ -528,6 +538,11 @@ def validate(root: Path) -> None:
iwooos_projection["summary"]["host_owner_decision_review_outcome_lane_count"],
len(expected_iwooos_host_owner_decision_review_outcome_lane_ids),
)
assert_equal(
"iwooos_projection.summary.host_owner_decision_record_draft_packet_count",
iwooos_projection["summary"]["host_owner_decision_record_draft_packet_count"],
len(expected_iwooos_host_owner_decision_record_draft_packet_ids),
)
iwooos_progress = iwooos_projection["progress"]
assert_equal("iwooos_projection.progress.overall_percent", iwooos_progress["overall_percent"], progress["overall_percent"])
assert_equal(
@@ -1472,6 +1487,81 @@ def validate(root: Path) -> None:
f"iwooos_projection.host_owner_decision_review_outcome_lanes.{item['lane_id']}.not_authorization",
item["not_authorization"],
)
iwooos_host_owner_decision_record_draft_packets = iwooos_projection[
"host_owner_decision_record_draft_packets"
]
assert_equal(
"iwooos_projection.host_owner_decision_record_draft_packets.ids",
[item["packet_id"] for item in iwooos_host_owner_decision_record_draft_packets],
expected_iwooos_host_owner_decision_record_draft_packet_ids,
)
assert_equal(
"iwooos_projection.host_owner_decision_record_draft_packets.display_order",
[item["display_order"] for item in iwooos_host_owner_decision_record_draft_packets],
list(range(1, len(expected_iwooos_host_owner_decision_record_draft_packet_ids) + 1)),
)
expected_iwooos_host_owner_decision_record_draft_fields = [
"scope_statement",
"scan_mode_statement",
"credential_boundary_statement",
"maintenance_constraints_statement",
"rollback_owner_statement",
"validation_metrics_statement",
"runtime_gate_pointer_statement",
]
assert_equal(
"iwooos_projection.host_owner_decision_record_draft_packets.draft_fields",
[item["draft_field"] for item in iwooos_host_owner_decision_record_draft_packets],
expected_iwooos_host_owner_decision_record_draft_fields,
)
for item in iwooos_host_owner_decision_record_draft_packets:
assert_equal(
f"iwooos_projection.host_owner_decision_record_draft_packets.{item['packet_id']}.display_mode",
item["display_mode"],
"owner_decision_record_draft_only",
)
assert_false(
f"iwooos_projection.host_owner_decision_record_draft_packets.{item['packet_id']}.decision_record_created",
item["decision_record_created"],
)
assert_equal(
f"iwooos_projection.host_owner_decision_record_draft_packets.{item['packet_id']}.owner_decision_received_count",
item["owner_decision_received_count"],
0,
)
assert_equal(
f"iwooos_projection.host_owner_decision_record_draft_packets.{item['packet_id']}.owner_decision_accepted_count",
item["owner_decision_accepted_count"],
0,
)
assert_false(
f"iwooos_projection.host_owner_decision_record_draft_packets.{item['packet_id']}.owner_approval_record_created",
item["owner_approval_record_created"],
)
assert_false(
f"iwooos_projection.host_owner_decision_record_draft_packets.{item['packet_id']}.runtime_gate_opened",
item["runtime_gate_opened"],
)
assert_false(
f"iwooos_projection.host_owner_decision_record_draft_packets.{item['packet_id']}.raw_payload_allowed",
item["raw_payload_allowed"],
)
assert_false(
f"iwooos_projection.host_owner_decision_record_draft_packets.{item['packet_id']}.secret_value_collection_allowed",
item["secret_value_collection_allowed"],
)
assert_false(
f"iwooos_projection.host_owner_decision_record_draft_packets.{item['packet_id']}.runtime_execution_authorized",
item["runtime_execution_authorized"],
)
assert_false(
f"iwooos_projection.host_owner_decision_record_draft_packets.{item['packet_id']}.action_buttons_allowed",
item["action_buttons_allowed"],
)
assert_true(
f"iwooos_projection.host_owner_decision_record_draft_packets.{item['packet_id']}.not_authorization",
item["not_authorization"],
)
assert_equal(
"iwooos_projection.non_blocking_lane_ids",
iwooos_projection["non_blocking_lane_ids"],
@@ -1506,6 +1596,7 @@ def validate(root: Path) -> None:
"display_host_owner_decision_candidate_packets",
"display_host_owner_decision_review_checklist",
"display_host_owner_decision_review_outcome_lanes",
"display_host_owner_decision_record_draft_packets",
"display_evidence_refs",
"display_forbidden_actions",
]:
@@ -1556,6 +1647,9 @@ def validate(root: Path) -> None:
"treat_host_owner_decision_review_outcome_as_approval",
"mark_host_owner_decision_review_outcome_passed",
"open_runtime_gate_from_owner_decision_review_outcome",
"create_host_owner_decision_record_from_draft",
"mark_host_owner_decision_record_created",
"open_runtime_gate_from_owner_decision_record_draft",
"apply_runtime_blocking_control",
"switch_github_primary",
"production_deploy",