diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index b6626b5b7..e9cd10dd3 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -4889,6 +4889,35 @@ "detail": "kept at 0 before approval" } }, + "operatorNextTasks": { + "title": "下一步任務板", + "subtitle": "把 61% 往下一階段推進需要的工作拆成四件事;這裡只顯示任務與完成條件,不送出請求、不啟動掃描、不建立執行。", + "stepLabel": "任務", + "doneLabel": "完成條件", + "boundary": "固定邊界:owner_response_received_count=0;owner_response_accepted_count=0;active_runtime_gate_count=0;runtime_execution_authorized=false;action_buttons_allowed=false;repo_creation_authorized=false;github_primary_switch_authorized=false。", + "items": { + "s49OwnerResponse": { + "title": "先收 S4.9 負責人回覆", + "body": "第一個可推動 headline 的工作,是收到 Gitea 清冊負責人的可追溯、已脫敏回覆。", + "done": "收到後仍要通過收件預檢與 reviewer 接受,才可能成為 headline review 候選。" + }, + "redactedEvidencePacket": { + "title": "補齊脫敏證據包", + "body": "把來源、範圍、負責人判定、脫敏聲明與 evidence refs 放進可審查封包。", + "done": "只接受脫敏 payload;機密明文、完整掃描輸出、host dump 與 raw log 不進 mirror。" + }, + "runtimeGatePreflight": { + "title": "準備執行期 gate 前置條件", + "body": "先整理 scope、rollback、維護窗口、post-check metrics 與人工決策格式。", + "done": "目前仍不開 gate;人工批准前 active runtime gate 必須維持 0。" + }, + "githubPrimaryReadiness": { + "title": "累積 GitHub primary readiness", + "body": "整理 GitHub 目標、分支 / 標籤真相、workflow / secret 名稱與 rollback 依據。", + "done": "只做就緒度證據;不得建立專案庫、同步 refs、改 workflow、切 primary 或停用 Gitea。" + } + } + }, "pillars": { "exposure": { "title": "暴露面態勢", diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index b700c27a9..2878cbb4a 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -4890,6 +4890,35 @@ "detail": "人工批准前維持 0" } }, + "operatorNextTasks": { + "title": "下一步任務板", + "subtitle": "把 61% 往下一階段推進需要的工作拆成四件事;這裡只顯示任務與完成條件,不送出請求、不啟動掃描、不建立執行。", + "stepLabel": "任務", + "doneLabel": "完成條件", + "boundary": "固定邊界:owner_response_received_count=0;owner_response_accepted_count=0;active_runtime_gate_count=0;runtime_execution_authorized=false;action_buttons_allowed=false;repo_creation_authorized=false;github_primary_switch_authorized=false。", + "items": { + "s49OwnerResponse": { + "title": "先收 S4.9 負責人回覆", + "body": "第一個可推動 headline 的工作,是收到 Gitea 清冊負責人的可追溯、已脫敏回覆。", + "done": "收到後仍要通過收件預檢與 reviewer 接受,才可能成為 headline review 候選。" + }, + "redactedEvidencePacket": { + "title": "補齊脫敏證據包", + "body": "把來源、範圍、負責人判定、脫敏聲明與 evidence refs 放進可審查封包。", + "done": "只接受脫敏 payload;機密明文、完整掃描輸出、host dump 與 raw log 不進 mirror。" + }, + "runtimeGatePreflight": { + "title": "準備執行期 gate 前置條件", + "body": "先整理 scope、rollback、維護窗口、post-check metrics 與人工決策格式。", + "done": "目前仍不開 gate;人工批准前 active runtime gate 必須維持 0。" + }, + "githubPrimaryReadiness": { + "title": "累積 GitHub primary readiness", + "body": "整理 GitHub 目標、分支 / 標籤真相、workflow / secret 名稱與 rollback 依據。", + "done": "只做就緒度證據;不得建立專案庫、同步 refs、改 workflow、切 primary 或停用 Gitea。" + } + } + }, "pillars": { "exposure": { "title": "暴露面態勢", diff --git a/apps/web/src/app/[locale]/iwooos/page.tsx b/apps/web/src/app/[locale]/iwooos/page.tsx index f273af116..c71fc1259 100644 --- a/apps/web/src/app/[locale]/iwooos/page.tsx +++ b/apps/web/src/app/[locale]/iwooos/page.tsx @@ -54,6 +54,13 @@ type HeadlineMovementAcceptanceGate = { tone: 'steady' | 'warn' | 'locked' } +type IwoooSOperatorNextTask = { + key: string + step: string + icon: typeof ShieldCheck + tone: 'steady' | 'warn' | 'locked' +} + type AwoooPReadOnlyLandingReadinessItem = { key: string item: string @@ -605,6 +612,13 @@ const postureMetrics: PostureMetric[] = [ { key: 'activeGates', value: '0', tone: 'locked' }, ] +const operatorNextTasks: IwoooSOperatorNextTask[] = [ + { key: 's49OwnerResponse', step: 'N1', icon: ClipboardCheck, tone: 'warn' }, + { key: 'redactedEvidencePacket', step: 'N2', icon: FileText, tone: 'warn' }, + { key: 'runtimeGatePreflight', step: 'N3', icon: Lock, tone: 'locked' }, + { key: 'githubPrimaryReadiness', step: 'N4', icon: GitBranch, tone: 'warn' }, +] + const progressAccelerationLanes: ProgressAccelerationLane[] = [ { key: 'ownerResponses', lane: 'PAL1', icon: ClipboardCheck, tone: 'warn' }, { key: 'redactedIngestion', lane: 'PAL2', icon: FileText, tone: 'warn' }, @@ -3369,6 +3383,68 @@ function MetricCard({ item }: { item: PostureMetric }) { ) } +function IwoooSOperatorNextTasksBoard() { + const t = useTranslations('iwooos.operatorNextTasks') + return ( +
+
+

{t('title')}

+

+ {t('subtitle')} +

+
+
+ {operatorNextTasks.map(item => { + const Icon = item.icon + return ( +
+
+
+ + {t('stepLabel')} +
+ {item.step} +
+

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

+

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

+
+
{t('doneLabel')}
+
+ {t(`items.${item.key}.done` as never)} +
+
+
+ ) + })} +
+
+ {t('boundary')} +
+
+ ) +} + function ProgressAccelerationLaneCard({ item }: { item: ProgressAccelerationLane }) { const t = useTranslations('iwooos.progressAcceleration') const Icon = item.icon @@ -11770,6 +11846,8 @@ export default function IwoooSPage({ params }: { params: { locale: string } }) { {postureMetrics.map(item => )} + +

{t('progressHoldMovementGates.title')}

diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index 5f17cdd47..a36d28b56 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,28 @@ +## 2026-05-29|IwoooS 下一步任務板補強 + +**背景**: + +- IwoooS 首頁已收斂成「摘要優先、證據可展開」,但 61% 後的下一步仍容易被理解成抽象 gate,而不是可交付工作。 +- 本段維持 scaffold-first / read-only;不啟用 Kali、SSH、runtime gate、repo / refs / workflow / GitHub primary 或 Gitea 停用。 + +**本次調整**: + +- 在 `/zh-TW/iwooos` 預設展開的「一眼看懂」區塊新增「下一步任務板」。 +- 任務板把下一階段拆成四件可讀工作:S4.9 負責人回覆、脫敏證據包、執行期 gate 前置條件、GitHub primary readiness。 +- 新增 `data-testid="iwooos-operator-next-tasks-board"`,並由 `security-mirror-progress-guard.py` 鎖住,避免後續 UI 改版把任務板拿掉。 + +**仍維持鎖住**: + +```text +owner_response_received_count=0 +owner_response_accepted_count=0 +active_runtime_gate_count=0 +runtime_execution_authorized=false +action_buttons_allowed=false +repo_creation_authorized=false +github_primary_switch_authorized=false +``` + ## 2026-05-25|IwoooS 首頁資訊架構收斂 **背景**: diff --git a/docs/security/IWOOOS-PRODUCTION-LANDING-EVIDENCE.md b/docs/security/IWOOOS-PRODUCTION-LANDING-EVIDENCE.md index 8a756ddc9..67206b30f 100644 --- a/docs/security/IWOOOS-PRODUCTION-LANDING-EVIDENCE.md +++ b/docs/security/IWOOOS-PRODUCTION-LANDING-EVIDENCE.md @@ -75,3 +75,14 @@ gitea_disablement_authorized=false | 本機桌面 scrollHeight | `4,728px` | | 證據保留 | 所有 read-only board 與 `data-testid` 保留 | | runtime / Kali / repo 權限變更 | `false` | + +## 7. 下一步任務板 + +2026-05-29 追加「下一步任務板」到 IwoooS 預設展開的「一眼看懂」區塊,讓使用者不用展開整份稽核底稿,也能理解 61% 後真正要推進的工作。 + +| 任務 | 完成條件 | 授權邊界 | +|------|----------|----------| +| S4.9 負責人回覆 | 收到可追溯、已脫敏回覆並通過 reviewer 接受 | 不標記已收到 / 已接受,除非證據成立 | +| 脫敏證據包 | 補齊來源、範圍、負責人判定、脫敏聲明與 evidence refs | 不收機密明文、raw log、host dump 或完整掃描輸出 | +| 執行期 gate 前置 | 整理 scope、rollback、維護窗口、post-check metrics 與人工決策格式 | active runtime gate 維持 `0` | +| GitHub primary readiness | 整理目標、分支 / 標籤真相、workflow / secret 名稱與 rollback 依據 | 不建立 repo、不同步 refs、不改 workflow、不切 primary、不停用 Gitea | diff --git a/scripts/security/security-mirror-progress-guard.py b/scripts/security/security-mirror-progress-guard.py index f60c7fcb1..e9e34245f 100755 --- a/scripts/security/security-mirror-progress-guard.py +++ b/scripts/security/security-mirror-progress-guard.py @@ -7650,6 +7650,21 @@ def validate(root: Path) -> None: iwooos_projection_page, "HeadlineMovementAcceptanceGateBoard", ) + assert_text_contains( + "iwooos_page.operator_next_tasks_items", + iwooos_projection_page, + "operatorNextTasks", + ) + assert_text_contains( + "iwooos_page.operator_next_tasks_board", + iwooos_projection_page, + "IwoooSOperatorNextTasksBoard", + ) + assert_text_contains( + "iwooos_page.operator_next_tasks_testid", + iwooos_projection_page, + 'data-testid="iwooos-operator-next-tasks-board"', + ) for text in [ "headline_percent_after_this_stage=61", "headline_movement_signal_count=1",