feat(web): add IwoooS host collection order

This commit is contained in:
Your Name
2026-05-19 21:46:44 +08:00
parent c0eeca2ec6
commit 33e793bb76
11 changed files with 471 additions and 6 deletions

View File

@@ -1361,6 +1361,49 @@
}
}
},
"hostEvidenceCollection": {
"title": "Host Evidence Collection Order",
"subtitle": "Orders the seven host evidence items into a recommended collection sequence. Each step only names the next reviewable item and does not change received / accepted from 0.",
"stepLabel": "Collection step",
"dependencyLabel": "Dependency",
"items": {
"scopeFirst": {
"title": "Define scope boundary first",
"body": "Confirm allowed targets, exclusions, depth, and rate limits first. No scope means no scan.",
"dependency": "none; this is the first host collection step"
},
"ownerSecond": {
"title": "Collect owner decision second",
"body": "Confirm who approves, the approved range, and the decision record; queue state cannot replace human control.",
"dependency": "requires readable scope boundary"
},
"credentialThird": {
"title": "Isolate credential handling",
"body": "If future scans need credentials, define credential source, storage boundary, redaction, and rejection first.",
"dependency": "requires owner decision; plaintext credential collection remains forbidden"
},
"maintenanceFourth": {
"title": "Schedule maintenance window",
"body": "Before updates, tuning, or SSH changes, confirm the window, impact scope, and notification.",
"dependency": "requires owner decision and change scope"
},
"rollbackFifth": {
"title": "Add rollback plan",
"body": "Every host action needs recovery for packages, settings, services, and toolchain versions.",
"dependency": "requires maintenance window and change list"
},
"validationSixth": {
"title": "Define validation metrics",
"body": "Define post-check metrics and failure handling lanes before execution is discussed.",
"dependency": "requires rollback plan"
},
"redactedSeventh": {
"title": "Collect redacted ingestion last",
"body": "Findings / scan results enter mirror only as redacted summaries, never as raw payload.",
"dependency": "requires validation metrics; payloads_ingested=false"
}
}
},
"nextGate": {
"title": "Next High-level Gate",
"body": "S4.9 Gitea owner attestation response is the recommended next owner evidence. Headline progress should only increase after owner responses, redacted payload ingestion, active runtime gates, or GitHub primary readiness actually change."

View File

@@ -1362,6 +1362,49 @@
}
}
},
"hostEvidenceCollection": {
"title": "主機 Evidence 收件順序",
"subtitle": "把七個主機 evidence 排成建議收件順序。每一步都只代表下一個可審項目,不會把 received / accepted 從 0 改掉。",
"stepLabel": "收件步驟",
"dependencyLabel": "前置依賴",
"items": {
"scopeFirst": {
"title": "先定義 scope boundary",
"body": "先確認允許目標、排除範圍、深度與速率。沒有 scope不進 scan。",
"dependency": "無;這是主機收件第一步"
},
"ownerSecond": {
"title": "再收 owner decision",
"body": "確認誰批准、批准範圍與決策紀錄,不用 queue 狀態替代人控決策。",
"dependency": "需要 scope boundary 可讀"
},
"credentialThird": {
"title": "隔離 credential handling",
"body": "若未來要帶憑證掃描,先定義憑證來源、保存邊界、遮蔽與拒收。",
"dependency": "需要 owner decision仍禁止收集憑證明文"
},
"maintenanceFourth": {
"title": "安排 maintenance window",
"body": "更新、調校或 SSH 變更前先確認窗口、影響範圍與通知。",
"dependency": "需要 owner decision 與變更範圍"
},
"rollbackFifth": {
"title": "補 rollback plan",
"body": "每個主機動作都要能回復套件、設定、服務與工具鏈版本。",
"dependency": "需要 maintenance window 與變更清單"
},
"validationSixth": {
"title": "定義 validation metrics",
"body": "先定義 post-check 指標與失敗處理 lane再談執行。",
"dependency": "需要 rollback plan"
},
"redactedSeventh": {
"title": "最後才收 redacted ingestion",
"body": "finding / scan result 只用脫敏摘要進 mirror不吃 raw payload。",
"dependency": "需要 validation metricspayloads_ingested=false"
}
}
},
"nextGate": {
"title": "下一個高層 Gate",
"body": "S4.9 Gitea owner attestation response 是目前建議先收的 owner evidence。任何 headline 提升都要等 owner response、redacted payload ingestion、active runtime gate 或 GitHub primary readiness 有真實變化。"

View File

@@ -95,6 +95,13 @@ type HostEvidenceReadinessItem = {
tone: 'steady' | 'warn' | 'locked'
}
type HostEvidenceCollectionStep = {
key: string
step: string
icon: typeof ShieldCheck
tone: 'steady' | 'warn' | 'locked'
}
const postureMetrics: PostureMetric[] = [
{ key: 'overall', value: '58%', tone: 'warn' },
{ key: 'framework', value: '80-85%', tone: 'steady' },
@@ -216,6 +223,16 @@ const hostEvidenceReadinessItems: HostEvidenceReadinessItem[] = [
{ key: 'redactedIngestion', gate: 'S1.6', icon: ShieldCheck, tone: 'locked' },
]
const hostEvidenceCollectionSteps: HostEvidenceCollectionStep[] = [
{ key: 'scopeFirst', step: '01', icon: Radar, tone: 'warn' },
{ key: 'ownerSecond', step: '02', icon: ClipboardCheck, tone: 'warn' },
{ key: 'credentialThird', step: '03', icon: Lock, tone: 'locked' },
{ key: 'maintenanceFourth', step: '04', icon: Clock3, tone: 'warn' },
{ key: 'rollbackFifth', step: '05', icon: FileWarning, tone: 'warn' },
{ key: 'validationSixth', step: '06', icon: CheckCircle2, tone: 'warn' },
{ key: 'redactedSeventh', step: '07', icon: ShieldCheck, tone: 'locked' },
]
const evidenceItems = [
'iwooos-posture-projection.snapshot.json',
'security-rollout-policy.snapshot.json',
@@ -546,6 +563,34 @@ function HostEvidenceReadinessCard({ item, index }: { item: HostEvidenceReadines
)
}
function HostEvidenceCollectionCard({ item }: { item: HostEvidenceCollectionStep }) {
const t = useTranslations('iwooos.hostEvidenceCollection')
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('stepLabel')}</span>
</div>
<span style={{ fontSize: 11, color: '#9b978b' }}>{item.step}</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('dependencyLabel')}</div>
<div style={{ fontSize: 11, color: toneColors[item.tone], lineHeight: 1.45 }}>
{t(`items.${item.key}.dependency` as never)}
</div>
</div>
</div>
)
}
export default function IwoooSPage({ params }: { params: { locale: string } }) {
const t = useTranslations('iwooos')
@@ -678,6 +723,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('hostEvidenceCollection.title')}</h2>
<p style={{ fontSize: 12, color: '#6f6d66', margin: '6px 0 0', lineHeight: 1.55 }}>
{t('hostEvidenceCollection.subtitle')}
</p>
</div>
<div
style={{
display: 'grid',
gridTemplateColumns: 'repeat(auto-fit, minmax(210px, 1fr))',
gap: 12,
}}
>
{hostEvidenceCollectionSteps.map(item => (
<HostEvidenceCollectionCard key={item.key} item={item} />
))}
</div>
</section>
<section
style={{
display: 'grid',

View File

@@ -1,3 +1,17 @@
## 2026-05-19 | 資安供應鏈 S2.17IwoooS Host Evidence Collection Order
**背景**S2.16 已把主機動作前缺少的 evidence 顯示成 readiness board本輪補上只讀收件順序讓使用者知道 scope、owner decision、credential handling、maintenance window、rollback、validation metrics 與 redacted ingestion 應該先後怎麼收,不把每個缺口混成同一層。
**完成**
- `/iwooos` 新增「主機 Evidence 收件順序」,顯示七個 collection steps 與前置依賴。
- `iwooos_posture_projection_v1` schema / snapshot 新增 `host_evidence_collection_order``host_evidence_collection_step_count=7`,每個 step 固定 `display_mode=collection_order_only``received_count=0``accepted_count=0``runtime_execution_authorized=false``action_buttons_allowed=false``not_authorization=true`
- `security-mirror-progress-guard.py` 開始驗證七個 host evidence collection steps、順序、source item、dependency、received / accepted 仍為 0以及 no runtime / no action button 邊界。
- `security_mirror_status_rollup_v1` micro progress ledger 新增 `s2_17_iwooos_host_evidence_collection_order`headline progress 仍維持 58%。
**仍禁止**
- host evidence collection order 不代表 evidence received / accepted、active scan、credentialed scan、Kali `/execute`、SSH 登入、主機變更、Kali 更新、raw host evidence ingestion、runtime gate 或 blocking control。
- 下一步仍需先收脫敏 scope boundary 與 owner decision之後才談 credential handling、maintenance window、rollback、validation metrics 與 redacted ingestion。
## 2026-05-19 | 資安供應鏈 S2.16IwoooS Host Evidence Readiness Board
**背景**S2.15 已把主機高風險動作拆成只讀 gate matrix本輪補上主機 evidence readiness board讓使用者知道 active scan、credentialed scan、SSH / host change、Kali update 或 runtime blocking 前到底還缺哪些前置證據。

View File

@@ -23,6 +23,7 @@
"host_coverage_items",
"host_action_gate_items",
"host_evidence_readiness_items",
"host_evidence_collection_order",
"frontend_surface_coverage_groups",
"evidence_refs",
"allowed_frontend_outputs",
@@ -85,6 +86,7 @@
"host_coverage_item_count",
"host_action_gate_item_count",
"host_evidence_readiness_item_count",
"host_evidence_collection_step_count",
"action_buttons_allowed"
],
"properties": {
@@ -166,6 +168,10 @@
"host_evidence_readiness_item_count": {
"type": "integer",
"const": 7
},
"host_evidence_collection_step_count": {
"type": "integer",
"const": 7
}
},
"additionalProperties": false
@@ -814,6 +820,71 @@
},
"additionalProperties": false
}
},
"host_evidence_collection_order": {
"type": "array",
"minItems": 7,
"items": {
"type": "object",
"required": [
"step_id",
"display_order",
"source_item_id",
"depends_on_step_ids",
"collection_state",
"display_mode",
"received_count",
"accepted_count",
"runtime_execution_authorized",
"action_buttons_allowed",
"not_authorization"
],
"properties": {
"step_id": {
"type": "string"
},
"display_order": {
"type": "integer",
"minimum": 1
},
"source_item_id": {
"type": "string"
},
"depends_on_step_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"collection_state": {
"type": "string"
},
"display_mode": {
"const": "collection_order_only"
},
"received_count": {
"type": "integer",
"const": 0
},
"accepted_count": {
"type": "integer",
"const": 0
},
"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

@@ -44,6 +44,7 @@ IwoooS 首版只讀取或對齊以下已提交 evidence
12. 3 個只讀主機覆蓋 itemsKali 112、開發主機 168、開發主機 111。
13. 6 個主機動作 gate itemsactive scan、credentialed scan、Kali `/execute`、SSH / host change、Kali update、runtime blocking control。
14. 7 個主機 evidence readiness itemsscope boundary、owner decision、credential handling、maintenance window、rollback plan、validation metrics、redacted ingestion。
15. 7 個主機 evidence collection order steps顯示收件順序與前置依賴。
## 3.1 既有前端資安頁面整合
@@ -157,6 +158,24 @@ S2.16 將主機動作解鎖前需要的 evidence 顯示成只讀 readiness board
每個 item 都固定 `display_mode=evidence_readiness_only`,且 `active_scan_authorized=false``credentialed_scan_authorized=false``ssh_change_authorized=false``host_update_authorized=false``runtime_execution_authorized=false``action_buttons_allowed=false``not_authorization=true`
## 3.8 主機 Evidence 收件順序
S2.17 將 S2.16 的七個主機 evidence readiness items 排成建議收件順序。這一層只回答「先收哪個、下一個依賴什麼」,不把任何 evidence 標成 received / accepted。
| 順序 | 收件步驟 | Source item | 前置依賴 | 狀態 |
|------|----------|-------------|----------|------|
| 1 | 先定義 scope boundary | `host_scope_boundary_evidence` | 無 | `next_collection_candidate`received=0、accepted=0 |
| 2 | 再收 owner decision | `host_owner_decision_record_evidence` | `collect_scope_boundary_first` | `waiting_previous_step`received=0、accepted=0 |
| 3 | 隔離 credential handling | `host_credential_handling_evidence` | `collect_owner_decision_second` | `waiting_previous_step`received=0、accepted=0 |
| 4 | 安排 maintenance window | `host_maintenance_window_evidence` | `collect_owner_decision_second` | `waiting_previous_step`received=0、accepted=0 |
| 5 | 補 rollback plan | `host_rollback_plan_evidence` | `collect_maintenance_window_fourth` | `waiting_previous_step`received=0、accepted=0 |
| 6 | 定義 validation metrics | `host_validation_metrics_evidence` | `collect_rollback_plan_fifth` | `waiting_previous_step`received=0、accepted=0 |
| 7 | 最後才收 redacted ingestion | `host_redacted_ingestion_evidence` | `collect_validation_metrics_sixth` | `waiting_previous_step`received=0、accepted=0 |
每個 step 都固定 `display_mode=collection_order_only`,且 `runtime_execution_authorized=false``action_buttons_allowed=false``not_authorization=true`
這個順序是收件提示,不是工作佇列。不得因為某個 step 顯示為下一個候選,就啟動 scan、SSH、Kali update、raw payload ingestion、runtime blocking control或把對應 evidence 標成已收到 / 已接受。
## 4. 仍禁止
IwoooS 不得提供下列輸出:
@@ -169,7 +188,8 @@ IwoooS 不得提供下列輸出:
6. SSH 到主機、開 SSH session、更新 Kali、package upgrade、credentialed scan 或 active scan。
7. 套用 runtime blocking control。
8. 將主機 evidence 標記為 received / accepted或匯入 raw host evidence。
9. 把 58% progress、contract count、mirror readiness 或前端可見狀態當成授權
9. 推進 host collection state 或跳過 host evidence dependency
10. 把 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 items仍不新增 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 steps仍不新增 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` |
@@ -100,6 +100,7 @@
| S2.14 IwoooS host coverage view | framework detail | 0 | 只顯示 Kali 112 與 168 / 111 開發主機已納入 observe-only 資安視野,不代表 active scan、SSH 變更、主機更新、credentialed scan、runtime gate 或 Kali `/execute` 授權 |
| S2.15 IwoooS host action gate matrix | framework detail | 0 | 只把 active scan、credentialed scan、Kali `/execute`、SSH / host change、Kali update 與 runtime blocking control 拆成只讀 gate不代表任何主機動作或 runtime enforcement 已批准 |
| S2.16 IwoooS host evidence readiness board | framework detail | 0 | 只顯示主機動作前仍缺 scope、owner decision、credential handling、maintenance window、rollback、validation metrics 與 redacted ingestion evidencereceived / accepted 仍為 0不代表任何主機動作已批准 |
| S2.17 IwoooS host evidence collection order | framework detail | 0 | 只把七個主機 evidence readiness items 排成只讀收件順序與依賴關係received / accepted 仍為 0不代表 active scan、SSH、Kali update、raw evidence ingestion 或 runtime control 已批准 |
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 |
| 本階段完成 | 資安供應鏈 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 |
| 原則 | 低摩擦分階段文件、schema、read-only evidence 優先;不做 runtime enforcement、不切 primary |
## 0. 本階段完成後整體進度
@@ -76,6 +76,7 @@ python3 scripts/security/security-mirror-progress-guard.py
| S2.14 IwoooS host coverage view | 已完成草案,將 Kali 112、開發主機 168、開發主機 111 固定為 3 個只讀 host coverage itemsactive scan、SSH 變更、主機更新、credentialed scan 與 runtime control 仍未批准 | 0 |
| S2.15 IwoooS host action gate matrix | 已完成草案,將 active scan、credentialed scan、Kali `/execute`、SSH / host change、Kali update、runtime blocking control 固定為 6 個只讀 gate items | 0 |
| S2.16 IwoooS host evidence readiness board | 已完成草案,將 scope boundary、owner decision、credential handling、maintenance window、rollback plan、validation metrics、redacted ingestion 固定為 7 個只讀 readiness items | 0 |
| S2.17 IwoooS host evidence collection order | 已完成草案,將七個主機 evidence readiness items 排成只讀收件順序與依賴關係received / accepted 仍為 0 | 0 |
headline 要再往上,需要 S4.9 / S4.10 / S4.11 / S4.12 任一 owner response 收到並通過脫敏驗收,或人工批准後出現 active runtime gate、redacted payload ingestion、GitHub primary readiness 這類落地 evidence。
@@ -111,6 +112,7 @@ headline 要再往上,需要 S4.9 / S4.10 / S4.11 / S4.12 任一 owner respons
| S2.14 IwoooS Host Coverage View | 完成草案 | `/iwooos` 新增主機覆蓋視圖,明確顯示 Kali 112 與 168 / 111 兩台開發主機已納入 observe-only 資安視野 | 使用者能看到指定主機已納管到資安架構視圖;仍不新增 SSH、scan、update、execute、credentialed scan 或 blocking control |
| S2.15 IwoooS Host Action Gate Matrix | 完成草案 | `/iwooos` 新增主機動作 gate 矩陣,將 active scan、credentialed scan、Kali `/execute`、SSH / host change、Kali update 與 runtime blocking control 拆成只讀 gate | 使用者能看懂主機動作為什麼仍需人工批准;仍不新增任何主機操作或 runtime enforcement |
| S2.16 IwoooS Host Evidence Readiness | 完成草案 | `/iwooos` 新增主機 evidence readiness board顯示主機動作前仍缺 scope、owner decision、credential handling、maintenance window、rollback、validation metrics 與 redacted ingestion evidence | 使用者能看懂主機行動前置證據,不會把規劃誤認為已批准;仍不新增任何主機操作 |
| S2.17 IwoooS Host Evidence Collection Order | 完成草案 | `/iwooos` 新增主機 evidence 收件順序,將 scope、owner decision、credential handling、maintenance window、rollback、validation metrics 與 redacted ingestion 排成只讀依賴 | 使用者能知道下一步先收什麼;仍不把任何 evidence 標成 received / accepted也不啟動掃描、SSH、更新或 runtime control |
| 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

@@ -42,7 +42,8 @@
"owner_evidence_readiness_item_count": 7,
"host_coverage_item_count": 3,
"host_action_gate_item_count": 6,
"host_evidence_readiness_item_count": 7
"host_evidence_readiness_item_count": 7,
"host_evidence_collection_step_count": 7
},
"progress": {
"overall_percent": 58,
@@ -121,7 +122,8 @@
"display_host_evidence_readiness_board",
"display_evidence_refs",
"display_next_gate",
"display_forbidden_actions"
"display_forbidden_actions",
"display_host_evidence_collection_order"
],
"forbidden_frontend_outputs": [
"add_scan_button",
@@ -146,7 +148,9 @@
"mark_host_evidence_accepted",
"ingest_raw_host_evidence",
"production_deploy",
"treat_progress_as_authorization"
"treat_progress_as_authorization",
"advance_host_collection_state",
"skip_host_evidence_dependency"
],
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
@@ -920,5 +924,110 @@
"action_buttons_allowed": false,
"not_authorization": true
}
],
"host_evidence_collection_order": [
{
"step_id": "collect_scope_boundary_first",
"display_order": 1,
"source_item_id": "host_scope_boundary_evidence",
"depends_on_step_ids": [],
"collection_state": "next_collection_candidate",
"display_mode": "collection_order_only",
"received_count": 0,
"accepted_count": 0,
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
"not_authorization": true
},
{
"step_id": "collect_owner_decision_second",
"display_order": 2,
"source_item_id": "host_owner_decision_record_evidence",
"depends_on_step_ids": [
"collect_scope_boundary_first"
],
"collection_state": "waiting_previous_step",
"display_mode": "collection_order_only",
"received_count": 0,
"accepted_count": 0,
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
"not_authorization": true
},
{
"step_id": "collect_credential_handling_third",
"display_order": 3,
"source_item_id": "host_credential_handling_evidence",
"depends_on_step_ids": [
"collect_owner_decision_second"
],
"collection_state": "waiting_previous_step",
"display_mode": "collection_order_only",
"received_count": 0,
"accepted_count": 0,
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
"not_authorization": true
},
{
"step_id": "collect_maintenance_window_fourth",
"display_order": 4,
"source_item_id": "host_maintenance_window_evidence",
"depends_on_step_ids": [
"collect_owner_decision_second"
],
"collection_state": "waiting_previous_step",
"display_mode": "collection_order_only",
"received_count": 0,
"accepted_count": 0,
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
"not_authorization": true
},
{
"step_id": "collect_rollback_plan_fifth",
"display_order": 5,
"source_item_id": "host_rollback_plan_evidence",
"depends_on_step_ids": [
"collect_maintenance_window_fourth"
],
"collection_state": "waiting_previous_step",
"display_mode": "collection_order_only",
"received_count": 0,
"accepted_count": 0,
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
"not_authorization": true
},
{
"step_id": "collect_validation_metrics_sixth",
"display_order": 6,
"source_item_id": "host_validation_metrics_evidence",
"depends_on_step_ids": [
"collect_rollback_plan_fifth"
],
"collection_state": "waiting_previous_step",
"display_mode": "collection_order_only",
"received_count": 0,
"accepted_count": 0,
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
"not_authorization": true
},
{
"step_id": "collect_redacted_ingestion_seventh",
"display_order": 7,
"source_item_id": "host_redacted_ingestion_evidence",
"depends_on_step_ids": [
"collect_validation_metrics_sixth"
],
"collection_state": "waiting_previous_step",
"display_mode": "collection_order_only",
"received_count": 0,
"accepted_count": 0,
"runtime_execution_authorized": false,
"action_buttons_allowed": false,
"not_authorization": true
}
]
}

View File

@@ -708,6 +708,18 @@
"runtime_delta": false,
"execution_authorized": false,
"not_authorization": true
},
{
"delta_id": "s2_17_iwooos_host_evidence_collection_order",
"display_order": 46,
"completed_stage": "S2.17 IwoooS host evidence collection order",
"progress_axis": "framework_detail",
"headline_percent_delta": 0,
"framework_delta_visible": true,
"why_headline_unchanged": "IwoooS host evidence collection order 只把 scope boundary、owner decision、credential handling、maintenance window、rollback、validation metrics 與 redacted ingestion 排成只讀收件順序received / accepted 仍為 0沒有 active scan、SSH/host change、Kali update、raw evidence ingestion、runtime execution 或 action button 授權。",
"runtime_delta": false,
"execution_authorized": false,
"not_authorization": true
}
],
"next_safe_actions": [

View File

@@ -168,6 +168,7 @@ def validate(root: Path) -> None:
"s2_14_iwooos_host_coverage_view",
"s2_15_iwooos_host_action_gate_matrix",
"s2_16_iwooos_host_evidence_readiness_board",
"s2_17_iwooos_host_evidence_collection_order",
]
assert_equal(
"progress_delta_ledger.delta_ids",
@@ -358,6 +359,15 @@ def validate(root: Path) -> None:
"host_validation_metrics_evidence",
"host_redacted_ingestion_evidence",
]
expected_iwooos_host_evidence_collection_step_ids = [
"collect_scope_boundary_first",
"collect_owner_decision_second",
"collect_credential_handling_third",
"collect_maintenance_window_fourth",
"collect_rollback_plan_fifth",
"collect_validation_metrics_sixth",
"collect_redacted_ingestion_seventh",
]
assert_equal(
"iwooos_projection.summary.frontend_surface_coverage_group_count",
iwooos_projection["summary"]["frontend_surface_coverage_group_count"],
@@ -393,6 +403,11 @@ def validate(root: Path) -> None:
iwooos_projection["summary"]["host_evidence_readiness_item_count"],
len(expected_iwooos_host_evidence_readiness_item_ids),
)
assert_equal(
"iwooos_projection.summary.host_evidence_collection_step_count",
iwooos_projection["summary"]["host_evidence_collection_step_count"],
len(expected_iwooos_host_evidence_collection_step_ids),
)
iwooos_progress = iwooos_projection["progress"]
assert_equal("iwooos_projection.progress.overall_percent", iwooos_progress["overall_percent"], progress["overall_percent"])
assert_equal(
@@ -732,6 +747,73 @@ def validate(root: Path) -> None:
f"iwooos_projection.host_evidence_readiness_items.{item['item_id']}.not_authorization",
item["not_authorization"],
)
iwooos_host_evidence_collection_order = iwooos_projection["host_evidence_collection_order"]
assert_equal(
"iwooos_projection.host_evidence_collection_order.ids",
[item["step_id"] for item in iwooos_host_evidence_collection_order],
expected_iwooos_host_evidence_collection_step_ids,
)
assert_equal(
"iwooos_projection.host_evidence_collection_order.display_order",
[item["display_order"] for item in iwooos_host_evidence_collection_order],
list(range(1, len(expected_iwooos_host_evidence_collection_step_ids) + 1)),
)
expected_iwooos_host_evidence_collection_source_ids = [
"host_scope_boundary_evidence",
"host_owner_decision_record_evidence",
"host_credential_handling_evidence",
"host_maintenance_window_evidence",
"host_rollback_plan_evidence",
"host_validation_metrics_evidence",
"host_redacted_ingestion_evidence",
]
assert_equal(
"iwooos_projection.host_evidence_collection_order.source_item_ids",
[item["source_item_id"] for item in iwooos_host_evidence_collection_order],
expected_iwooos_host_evidence_collection_source_ids,
)
expected_iwooos_host_evidence_collection_dependencies = [
[],
["collect_scope_boundary_first"],
["collect_owner_decision_second"],
["collect_owner_decision_second"],
["collect_maintenance_window_fourth"],
["collect_rollback_plan_fifth"],
["collect_validation_metrics_sixth"],
]
assert_equal(
"iwooos_projection.host_evidence_collection_order.depends_on_step_ids",
[item["depends_on_step_ids"] for item in iwooos_host_evidence_collection_order],
expected_iwooos_host_evidence_collection_dependencies,
)
for item in iwooos_host_evidence_collection_order:
assert_equal(
f"iwooos_projection.host_evidence_collection_order.{item['step_id']}.display_mode",
item["display_mode"],
"collection_order_only",
)
assert_equal(
f"iwooos_projection.host_evidence_collection_order.{item['step_id']}.received_count",
item["received_count"],
0,
)
assert_equal(
f"iwooos_projection.host_evidence_collection_order.{item['step_id']}.accepted_count",
item["accepted_count"],
0,
)
assert_false(
f"iwooos_projection.host_evidence_collection_order.{item['step_id']}.runtime_execution_authorized",
item["runtime_execution_authorized"],
)
assert_false(
f"iwooos_projection.host_evidence_collection_order.{item['step_id']}.action_buttons_allowed",
item["action_buttons_allowed"],
)
assert_true(
f"iwooos_projection.host_evidence_collection_order.{item['step_id']}.not_authorization",
item["not_authorization"],
)
assert_equal(
"iwooos_projection.non_blocking_lane_ids",
iwooos_projection["non_blocking_lane_ids"],
@@ -757,6 +839,7 @@ def validate(root: Path) -> None:
"display_host_coverage_view",
"display_host_action_gate_matrix",
"display_host_evidence_readiness_board",
"display_host_evidence_collection_order",
"display_evidence_refs",
"display_forbidden_actions",
]:
@@ -780,6 +863,8 @@ def validate(root: Path) -> None:
"mark_host_evidence_received",
"mark_host_evidence_accepted",
"ingest_raw_host_evidence",
"advance_host_collection_state",
"skip_host_evidence_dependency",
"apply_runtime_blocking_control",
"switch_github_primary",
"production_deploy",