diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index d97724101..bf185e567 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -6738,7 +6738,7 @@ "signals": { "coverageVisible": { "title": "資產已放進只讀視圖", - "body": "產品、網站、工具與三台主機已在同一張資安網裡可讀。" + "body": "產品、網站、新專案、工具與三台主機已在同一張資安網裡可讀。" }, "evidenceMissing": { "title": "推進證據仍未到齊", @@ -6768,11 +6768,11 @@ "cards": { "visibleWork": { "title": "已完成可見工作", - "body": "IwoooS 已把焦點導覽、視覺資安網、拓樸圖、決策跑道、執行閘雷達、AwoooP與VibeWork 納管呈現到前台。" + "body": "IwoooS 已把焦點導覽、視覺資安網、拓樸圖、決策跑道、執行閘雷達、AwoooP、VibeWork 與 agent-bounty-protocol 納管呈現到前台。" }, "assetMesh": { "title": "資產與主機已納管", - "body": "8 類產品 / 網站 / 工具面與112、111、168 三台主機已放入同一個只讀資安網。" + "body": "9 類產品 / 網站 / 工具面與112、111、168 三台主機已放入同一個只讀資安網。" }, "nextBlocker": { "title": "待補關鍵證據", @@ -6819,7 +6819,7 @@ "productScope": { "label": "覆蓋範圍", "title": "全產品資安範圍", - "body": "看 AwoooI、AwoooP、IwoooS、網站、VibeWork與主機納管。" + "body": "看 AwoooI、AwoooP、IwoooS、網站、VibeWork、agent-bounty-protocol 與主機納管。" }, "hostTools": { "label": "主機工具", @@ -6849,7 +6849,7 @@ }, "ledger": { "title": "證據台帳下鑽", - "body": "產品範圍、主機工具鏈、VibeWork與交付明細集中在進階證據區。" + "body": "產品範圍、主機工具鏈、VibeWork、agent-bounty-protocol 與交付明細集中在進階證據區。" }, "runtime": { "title": "執行期仍鎖定", @@ -7141,7 +7141,7 @@ "paths": { "externalToGate": { "title": "公開入口到執行閘", - "evidence": "8 類資產與版本來源已在同一張圖。", + "evidence": "9 類資產與版本來源已在同一張圖。", "risk": "公開入口仍需接上可信版本證據。", "next": "先補 S4.9 負責人回覆。", "locked": "不開掃描與自動修復。" @@ -7183,7 +7183,7 @@ "items": { "assetContext": { "title": "資產關聯", - "signal": "8 類產品、網站與新專案已進入同一個資產面。", + "signal": "9 類產品、網站與新專案已進入同一個資產面。", "interpretation": "先確認哪些入口已納管,再下鑽檢視資產證據。", "next": "補上負責人證據後,資產圖才能變成可信驗收範圍。", "ring": "關聯已可讀;尚未代表完成驗收。" @@ -7222,7 +7222,7 @@ }, "nodes": { "productSurface": { - "body": "以同一資產面呈現 AwoooI、AwoooP、IwoooS、公開網站與VibeWork的關聯、責任邊界與低摩擦治理狀態。" + "body": "以同一資產面呈現 AwoooI、AwoooP、IwoooS、公開網站、VibeWork 與 agent-bounty-protocol 的關聯、責任邊界與低摩擦治理狀態。" }, "sourceControl": { "body": "GitHub / Gitea 是版本來源關鍵節點;目前只顯示 S4.9 負責人回覆待補與決策紀錄缺口,不執行分支參照或工作流程變更。" @@ -7249,7 +7249,7 @@ "title": "架構分層", "mapTitle": "程式碼 → 資產 → 主機 → 證據 → 閘門", "detail": "用五層結構看 IwoooS:產品與網站、版本來源、Kali / 開發主機、監控與AwoooP、最後才是執行閘。", - "evidence": "8 類產品 / 網站、3 台主機、6 條工具鏈已進入同一張只讀圖譜。", + "evidence": "9 類產品 / 網站、3 台主機、6 條工具鏈已進入同一張只讀圖譜。", "next": "將 S4.9 負責人回覆與脫敏證據接成可驗證節點。", "locked": "架構圖不是執行期授權,不代表可以掃描或修復。" }, @@ -7265,7 +7265,7 @@ "title": "攻擊面路徑", "mapTitle": "外部資產面 → 版本來源 → 執行期邊界", "detail": "將公開入口、產品、版本來源與執行閘 0 串成攻擊面圖,優先呈現可被利用的關聯與治理邊界。", - "evidence": "目前可看見 8 類資產與S4.9 版本來源待補證據,但爆炸半徑仍維持 0,避免誤導成已完成攻防驗證。", + "evidence": "目前可看見 9 類資產與S4.9 版本來源待補證據,但爆炸半徑仍維持 0,避免誤導成已完成攻防驗證。", "next": "先完成 GitHub 主來源 / Gitea 負責人證據,再讓風險路徑有可信來源。", "locked": "版本來源變更未授權,GitHub 主來源切換未授權。" }, @@ -7304,7 +7304,7 @@ "layers": { "externalSurface": { "title": "外部資產面", - "body": "公開網站、產品入口與VibeWork 先進入可理解範圍。" + "body": "公開網站、產品入口、VibeWork 與 agent-bounty-protocol 先進入可理解範圍。" }, "codeSupply": { "title": "版本來源面", @@ -7420,6 +7420,10 @@ "title": "VibeWork 納管", "body": "新專案已放入全產品資安面。" }, + "agentBounty": { + "title": "agent-bounty-protocol 收件", + "body": "先列入只讀驗證與控管範圍,不啟用 agent 執行、claim、submit 或 bounty 撥付。" + }, "kali": { "title": "Kali 192.168.0.112", "body": "列入資安主機,但目前只讀顯示。" @@ -7787,11 +7791,11 @@ "summary": { "scopeCount": { "label": "產品範圍", - "detail": "核心、網站、版本來源、主機、工具、VibeWork、未來產品七類。" + "detail": "核心、網站、版本來源、主機、工具、VibeWork、agent-bounty-protocol、未來產品八類。" }, "readOnlyScopes": { "label": "只讀已套", - "detail": "七類都先套只讀治理與低摩擦可視化。" + "detail": "八類都先套只讀治理與低摩擦可視化。" }, "runtimeReady": { "label": "執行期就緒", @@ -7839,13 +7843,17 @@ "futureProducts": { "title": "未來新增產品", "body": "預設繼承只讀 governance、繁中可視化與分階段收斂。" + }, + "agentBountyProtocol": { + "title": "agent-bounty-protocol 新專案", + "body": "已納入 IwoooS 只讀資安框架;MCP / A2A / cron / treasury 只列 scope,外部 agent 與金流動作仍為 false。" } } }, "globalSecurityMeshMatrix": { "eyebrow": "全域資安納管矩陣", "title": "所有產品、主機、工具放在同一張表", - "subtitle": "將 AwoooI、AwoooP、IwoooS、公開網站群、VibeWork、Kali 112、開發主機與GitHub / Gitea 版本來源放到同一個只讀矩陣,先呈現納管範圍,再決定哪一段要收證或開人工閘門。", + "subtitle": "將 AwoooI、AwoooP、IwoooS、公開網站群、VibeWork、agent-bounty-protocol、Kali 112、開發主機與GitHub / Gitea 版本來源放到同一個只讀矩陣,先呈現納管範圍,再決定哪一段要收證或開人工閘門。", "coverageLabel": "覆蓋", "evidenceLabel": "證據", "runtimeLabel": "執行", @@ -7855,11 +7863,11 @@ "summary": { "assets": { "label": "資產列", - "detail": "八類產品、主機與工具同表。" + "detail": "九類產品、主機與工具同表。" }, "readOnly": { "label": "只讀納管", - "detail": "八類都只先納入觀測與證據欄位。" + "detail": "九類都只先納入觀測與證據欄位。" }, "runtime": { "label": "執行期", @@ -7934,6 +7942,14 @@ "evidence": "待 S4.9", "runtime": "仍鎖住", "next": "不建立 專案庫、不同步參照、不改 工作流程或機密設定。" + }, + "agentBountyProtocol": { + "title": "agent-bounty-protocol 新專案", + "layer": "MCP、A2A、外部 agent、cron、traffic、webhook、admin 與 treasury 邊界。", + "coverage": "已納入", + "evidence": "待補 7 項", + "runtime": "仍鎖住", + "next": "先完成 owner、資料分級、版本來源、部署、外部 agent 與財務邊界收件。" } } }, @@ -8038,7 +8054,7 @@ "summary": { "readOnly": { "label": "納管狀態", - "detail": "已進七類產品範圍。" + "detail": "已進八類產品範圍。" }, "missingEvidence": { "label": "待補證據", @@ -12202,12 +12218,18 @@ "current": "預設繼承三軸進度、繁中可視化、只讀 governance與低摩擦收斂節奏。", "next": "新產品先接框架與證據欄位,再依 負責人證據 分階段收嚴。", "boundary": "不得讓新產品一建立就套高強度限制或執行期 enforcement。" + }, + "agentBountyProtocol": { + "title": "agent-bounty-protocol 新專案", + "current": "已納入全產品三軸進度、IwoooS可視化、只讀 governance 與外部 agent / treasury 邊界欄位。", + "next": "先補 owner、資料分級、版本來源、部署邊界、外部 agent 邊界與財務邊界,再評估分階段收嚴。", + "boundary": "不得因新專案納管就自動掃描、部署、啟用 cron、讓 agent claim / submit、改專案庫或執行 payout。" } } }, "productRolloutWaveLedger": { "title": "全產品分階段套用台帳", - "subtitle": "將「所有專案產品都套用」轉成七個 分階段套用 wave,並把 VibeWork 新專案納入只讀波次:先套只讀可視化與證據欄位,再依 負責人證據、人工審查與執行期閘門 分段收嚴。這仍是產品套用台帳,不是掃描、修復、部署或主機操作入口。", + "subtitle": "將「所有專案產品都套用」轉成八個 分階段套用 wave,並把 VibeWork 與 agent-bounty-protocol 新專案納入只讀波次:先套只讀可視化與證據欄位,再依 負責人證據、人工審查與執行期閘門 分段收嚴。這仍是產品套用台帳,不是掃描、修復、部署、外部 agent 或主機操作入口。", "waveLabel": "波次", "allowedLabel": "目前可做", "beforeRuntimeLabel": "進 執行期 前", @@ -12217,7 +12239,7 @@ "summary": { "waves": { "label": "套用波次", - "detail": "七個波次覆蓋核心產品、網站、版本來源、主機、工具、VibeWork與未來產品。" + "detail": "八個波次覆蓋核心產品、網站、版本來源、主機、工具、VibeWork、agent-bounty-protocol 與未來產品。" }, "current": { "label": "目前波次", @@ -12274,12 +12296,18 @@ "allowed": "新專案預設繼承三軸進度、繁中 UI、只讀 governance、執行期=false 旗標。", "beforeRuntime": "需要產品 負責人、資料分級、範圍、回復、disable 條件與逐階段審查。", "forbidden": "不得讓新產品一建立就套 阻擋 enforcement、host action、來源-control mutation或production 部署。" + }, + "agentBountyProtocol": { + "title": "agent-bounty-protocol 新專案波次", + "allowed": "先顯示新專案已納入 IwoooS,只讀治理、MCP / A2A / cron / treasury scope、owner 證據欄位與執行期=false 旗標。", + "beforeRuntime": "需要產品 owner、資料分級、版本來源、部署邊界、外部 agent 邊界、財務邊界、回復條件與逐階段審查。", + "forbidden": "不得讓 agent-bounty-protocol 一納管就觸發掃描、部署、cron、daemon、claim / submit、payout、專案庫 / 參照 / 工作流程變更。" } } }, "productRolloutAcceptanceGates": { "title": "全產品 分階段套用 波次驗收門檻", - "subtitle": "將七個產品波次再補上六個驗收門檻:每個波次都要先通過只讀證據、負責人證據、脫敏審查、版本來源證明、主機安全窗口與回復 / disable 條件,才可能被列入後續 執行期候選。這仍是驗收門檻可視化,不是批准或執行。", + "subtitle": "將八個產品波次再補上六個驗收門檻:每個波次都要先通過只讀證據、負責人證據、脫敏審查、版本來源證明、主機安全窗口與回復 / disable 條件,才可能被列入後續 執行期候選。這仍是驗收門檻可視化,不是批准或執行。", "gateLabel": "門檻", "requiredEvidenceLabel": "需要證據", "acceptanceSignalLabel": "驗收訊號", @@ -14216,6 +14244,68 @@ "body": "目前 啟用中的執行期閘門 是 0;SSH、掃描、修復、部署、主機更新、專案庫 / 參照 / 工作流程 變更都還沒被批准。" } } + }, + "agentBountySecurityOnboarding": { + "eyebrow": "Agent Bounty 新專案收件卡", + "title": "先納入視野,外部 agent 與金流先鎖住", + "subtitle": "agent-bounty-protocol 已納入 IwoooS,但目前只補 scope、owner、資料分級、版本來源、部署邊界、外部 agent 邊界與財務邊界;執行期仍維持 0。", + "checkLabel": "檢查", + "stateLabel": "狀態", + "missingLabel": "目前缺口", + "nextLabel": "下一步", + "boundaryTitle": "Agent Bounty 收件邊界", + "boundaryIntro": "以下鍵值固定:這是只讀收件,不讀 env、不建立儲存庫、不同步參照、不部署、不掃描、不啟用 cron、不讓 agent claim / submit、不執行 payout 或 withdrawal。", + "summary": { + "readOnly": { + "label": "納管狀態", + "detail": "已進八類產品範圍。" + }, + "missingEvidence": { + "label": "待補證據", + "detail": "七項收件欄位仍待負責人補齊。" + }, + "runtime": { + "label": "執行期", + "detail": "仍為 0,不進執行。" + } + }, + "items": { + "owner": { + "title": "產品負責人與責任邊界", + "missing": "尚未建立產品、資安、部署、外部 agent、通知與 treasury 的可追溯 owner。", + "next": "先收只讀 owner 證據;不得把口頭同意或 AwoooP approval 視為資安批准。" + }, + "dataClass": { + "title": "任務、agent 與 webhook 資料分級", + "missing": "尚未標示 task、solution、agent reputation、traffic、webhook、admin 與 settlement 的資料分級。", + "next": "只收欄位類型與脫敏摘要,不收 raw payload、未脫敏互動內容、cookie 或 token。" + }, + "sourceRepo": { + "title": "版本來源與 dirty workspace 判定", + "missing": "本機 repo 有 51 個修改或未追蹤項目;尚未判定 WIP、release candidate 與 canonical remote。", + "next": "先收 refs truth 與 dirty workspace disposition;不得 push、rebase、同步 refs 或改 workflow。" + }, + "deployBoundary": { + "title": "部署邊界與回復條件", + "missing": "README 與部署腳本顯示主機線索需 owner 確認;尚未建立正式 smoke、TLS、rollback 與維護窗口。", + "next": "先補 production host、compose directory、domain、TLS、health check 與 rollback owner,不觸發部署。" + }, + "externalAgent": { + "title": "MCP / A2A / cron 外部 agent 邊界", + "missing": "AUTO_CLAIM、AUTO_SUBMIT、RUN_DAEMON、A2A dispatcher、self-replicate 與外部送訊尚未授權。", + "next": "先列 route、tool、cron 與 daemon 名稱,不啟用外部 claim / submit / listener / dispatcher。" + }, + "treasuryBoundary": { + "title": "Treasury / staking / payout 邊界", + "missing": "staking、withdrawal、payout、Stripe、wallet 類能力尚未有財務 owner 與停用條件。", + "next": "只收 capability 與 owner metadata,不收 private key、seed phrase、Stripe secret 或 payout instruction。" + }, + "runtimeGate": { + "title": "執行期閘門分離", + "missing": "尚未有任何掃描、修復、部署、cron、daemon、agent action 或金流操作授權。", + "next": "保持閘門 0;等 owner 證據接受後才討論後續候選。" + } + } } } } diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index d97724101..bf185e567 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -6738,7 +6738,7 @@ "signals": { "coverageVisible": { "title": "資產已放進只讀視圖", - "body": "產品、網站、工具與三台主機已在同一張資安網裡可讀。" + "body": "產品、網站、新專案、工具與三台主機已在同一張資安網裡可讀。" }, "evidenceMissing": { "title": "推進證據仍未到齊", @@ -6768,11 +6768,11 @@ "cards": { "visibleWork": { "title": "已完成可見工作", - "body": "IwoooS 已把焦點導覽、視覺資安網、拓樸圖、決策跑道、執行閘雷達、AwoooP與VibeWork 納管呈現到前台。" + "body": "IwoooS 已把焦點導覽、視覺資安網、拓樸圖、決策跑道、執行閘雷達、AwoooP、VibeWork 與 agent-bounty-protocol 納管呈現到前台。" }, "assetMesh": { "title": "資產與主機已納管", - "body": "8 類產品 / 網站 / 工具面與112、111、168 三台主機已放入同一個只讀資安網。" + "body": "9 類產品 / 網站 / 工具面與112、111、168 三台主機已放入同一個只讀資安網。" }, "nextBlocker": { "title": "待補關鍵證據", @@ -6819,7 +6819,7 @@ "productScope": { "label": "覆蓋範圍", "title": "全產品資安範圍", - "body": "看 AwoooI、AwoooP、IwoooS、網站、VibeWork與主機納管。" + "body": "看 AwoooI、AwoooP、IwoooS、網站、VibeWork、agent-bounty-protocol 與主機納管。" }, "hostTools": { "label": "主機工具", @@ -6849,7 +6849,7 @@ }, "ledger": { "title": "證據台帳下鑽", - "body": "產品範圍、主機工具鏈、VibeWork與交付明細集中在進階證據區。" + "body": "產品範圍、主機工具鏈、VibeWork、agent-bounty-protocol 與交付明細集中在進階證據區。" }, "runtime": { "title": "執行期仍鎖定", @@ -7141,7 +7141,7 @@ "paths": { "externalToGate": { "title": "公開入口到執行閘", - "evidence": "8 類資產與版本來源已在同一張圖。", + "evidence": "9 類資產與版本來源已在同一張圖。", "risk": "公開入口仍需接上可信版本證據。", "next": "先補 S4.9 負責人回覆。", "locked": "不開掃描與自動修復。" @@ -7183,7 +7183,7 @@ "items": { "assetContext": { "title": "資產關聯", - "signal": "8 類產品、網站與新專案已進入同一個資產面。", + "signal": "9 類產品、網站與新專案已進入同一個資產面。", "interpretation": "先確認哪些入口已納管,再下鑽檢視資產證據。", "next": "補上負責人證據後,資產圖才能變成可信驗收範圍。", "ring": "關聯已可讀;尚未代表完成驗收。" @@ -7222,7 +7222,7 @@ }, "nodes": { "productSurface": { - "body": "以同一資產面呈現 AwoooI、AwoooP、IwoooS、公開網站與VibeWork的關聯、責任邊界與低摩擦治理狀態。" + "body": "以同一資產面呈現 AwoooI、AwoooP、IwoooS、公開網站、VibeWork 與 agent-bounty-protocol 的關聯、責任邊界與低摩擦治理狀態。" }, "sourceControl": { "body": "GitHub / Gitea 是版本來源關鍵節點;目前只顯示 S4.9 負責人回覆待補與決策紀錄缺口,不執行分支參照或工作流程變更。" @@ -7249,7 +7249,7 @@ "title": "架構分層", "mapTitle": "程式碼 → 資產 → 主機 → 證據 → 閘門", "detail": "用五層結構看 IwoooS:產品與網站、版本來源、Kali / 開發主機、監控與AwoooP、最後才是執行閘。", - "evidence": "8 類產品 / 網站、3 台主機、6 條工具鏈已進入同一張只讀圖譜。", + "evidence": "9 類產品 / 網站、3 台主機、6 條工具鏈已進入同一張只讀圖譜。", "next": "將 S4.9 負責人回覆與脫敏證據接成可驗證節點。", "locked": "架構圖不是執行期授權,不代表可以掃描或修復。" }, @@ -7265,7 +7265,7 @@ "title": "攻擊面路徑", "mapTitle": "外部資產面 → 版本來源 → 執行期邊界", "detail": "將公開入口、產品、版本來源與執行閘 0 串成攻擊面圖,優先呈現可被利用的關聯與治理邊界。", - "evidence": "目前可看見 8 類資產與S4.9 版本來源待補證據,但爆炸半徑仍維持 0,避免誤導成已完成攻防驗證。", + "evidence": "目前可看見 9 類資產與S4.9 版本來源待補證據,但爆炸半徑仍維持 0,避免誤導成已完成攻防驗證。", "next": "先完成 GitHub 主來源 / Gitea 負責人證據,再讓風險路徑有可信來源。", "locked": "版本來源變更未授權,GitHub 主來源切換未授權。" }, @@ -7304,7 +7304,7 @@ "layers": { "externalSurface": { "title": "外部資產面", - "body": "公開網站、產品入口與VibeWork 先進入可理解範圍。" + "body": "公開網站、產品入口、VibeWork 與 agent-bounty-protocol 先進入可理解範圍。" }, "codeSupply": { "title": "版本來源面", @@ -7420,6 +7420,10 @@ "title": "VibeWork 納管", "body": "新專案已放入全產品資安面。" }, + "agentBounty": { + "title": "agent-bounty-protocol 收件", + "body": "先列入只讀驗證與控管範圍,不啟用 agent 執行、claim、submit 或 bounty 撥付。" + }, "kali": { "title": "Kali 192.168.0.112", "body": "列入資安主機,但目前只讀顯示。" @@ -7787,11 +7791,11 @@ "summary": { "scopeCount": { "label": "產品範圍", - "detail": "核心、網站、版本來源、主機、工具、VibeWork、未來產品七類。" + "detail": "核心、網站、版本來源、主機、工具、VibeWork、agent-bounty-protocol、未來產品八類。" }, "readOnlyScopes": { "label": "只讀已套", - "detail": "七類都先套只讀治理與低摩擦可視化。" + "detail": "八類都先套只讀治理與低摩擦可視化。" }, "runtimeReady": { "label": "執行期就緒", @@ -7839,13 +7843,17 @@ "futureProducts": { "title": "未來新增產品", "body": "預設繼承只讀 governance、繁中可視化與分階段收斂。" + }, + "agentBountyProtocol": { + "title": "agent-bounty-protocol 新專案", + "body": "已納入 IwoooS 只讀資安框架;MCP / A2A / cron / treasury 只列 scope,外部 agent 與金流動作仍為 false。" } } }, "globalSecurityMeshMatrix": { "eyebrow": "全域資安納管矩陣", "title": "所有產品、主機、工具放在同一張表", - "subtitle": "將 AwoooI、AwoooP、IwoooS、公開網站群、VibeWork、Kali 112、開發主機與GitHub / Gitea 版本來源放到同一個只讀矩陣,先呈現納管範圍,再決定哪一段要收證或開人工閘門。", + "subtitle": "將 AwoooI、AwoooP、IwoooS、公開網站群、VibeWork、agent-bounty-protocol、Kali 112、開發主機與GitHub / Gitea 版本來源放到同一個只讀矩陣,先呈現納管範圍,再決定哪一段要收證或開人工閘門。", "coverageLabel": "覆蓋", "evidenceLabel": "證據", "runtimeLabel": "執行", @@ -7855,11 +7863,11 @@ "summary": { "assets": { "label": "資產列", - "detail": "八類產品、主機與工具同表。" + "detail": "九類產品、主機與工具同表。" }, "readOnly": { "label": "只讀納管", - "detail": "八類都只先納入觀測與證據欄位。" + "detail": "九類都只先納入觀測與證據欄位。" }, "runtime": { "label": "執行期", @@ -7934,6 +7942,14 @@ "evidence": "待 S4.9", "runtime": "仍鎖住", "next": "不建立 專案庫、不同步參照、不改 工作流程或機密設定。" + }, + "agentBountyProtocol": { + "title": "agent-bounty-protocol 新專案", + "layer": "MCP、A2A、外部 agent、cron、traffic、webhook、admin 與 treasury 邊界。", + "coverage": "已納入", + "evidence": "待補 7 項", + "runtime": "仍鎖住", + "next": "先完成 owner、資料分級、版本來源、部署、外部 agent 與財務邊界收件。" } } }, @@ -8038,7 +8054,7 @@ "summary": { "readOnly": { "label": "納管狀態", - "detail": "已進七類產品範圍。" + "detail": "已進八類產品範圍。" }, "missingEvidence": { "label": "待補證據", @@ -12202,12 +12218,18 @@ "current": "預設繼承三軸進度、繁中可視化、只讀 governance與低摩擦收斂節奏。", "next": "新產品先接框架與證據欄位,再依 負責人證據 分階段收嚴。", "boundary": "不得讓新產品一建立就套高強度限制或執行期 enforcement。" + }, + "agentBountyProtocol": { + "title": "agent-bounty-protocol 新專案", + "current": "已納入全產品三軸進度、IwoooS可視化、只讀 governance 與外部 agent / treasury 邊界欄位。", + "next": "先補 owner、資料分級、版本來源、部署邊界、外部 agent 邊界與財務邊界,再評估分階段收嚴。", + "boundary": "不得因新專案納管就自動掃描、部署、啟用 cron、讓 agent claim / submit、改專案庫或執行 payout。" } } }, "productRolloutWaveLedger": { "title": "全產品分階段套用台帳", - "subtitle": "將「所有專案產品都套用」轉成七個 分階段套用 wave,並把 VibeWork 新專案納入只讀波次:先套只讀可視化與證據欄位,再依 負責人證據、人工審查與執行期閘門 分段收嚴。這仍是產品套用台帳,不是掃描、修復、部署或主機操作入口。", + "subtitle": "將「所有專案產品都套用」轉成八個 分階段套用 wave,並把 VibeWork 與 agent-bounty-protocol 新專案納入只讀波次:先套只讀可視化與證據欄位,再依 負責人證據、人工審查與執行期閘門 分段收嚴。這仍是產品套用台帳,不是掃描、修復、部署、外部 agent 或主機操作入口。", "waveLabel": "波次", "allowedLabel": "目前可做", "beforeRuntimeLabel": "進 執行期 前", @@ -12217,7 +12239,7 @@ "summary": { "waves": { "label": "套用波次", - "detail": "七個波次覆蓋核心產品、網站、版本來源、主機、工具、VibeWork與未來產品。" + "detail": "八個波次覆蓋核心產品、網站、版本來源、主機、工具、VibeWork、agent-bounty-protocol 與未來產品。" }, "current": { "label": "目前波次", @@ -12274,12 +12296,18 @@ "allowed": "新專案預設繼承三軸進度、繁中 UI、只讀 governance、執行期=false 旗標。", "beforeRuntime": "需要產品 負責人、資料分級、範圍、回復、disable 條件與逐階段審查。", "forbidden": "不得讓新產品一建立就套 阻擋 enforcement、host action、來源-control mutation或production 部署。" + }, + "agentBountyProtocol": { + "title": "agent-bounty-protocol 新專案波次", + "allowed": "先顯示新專案已納入 IwoooS,只讀治理、MCP / A2A / cron / treasury scope、owner 證據欄位與執行期=false 旗標。", + "beforeRuntime": "需要產品 owner、資料分級、版本來源、部署邊界、外部 agent 邊界、財務邊界、回復條件與逐階段審查。", + "forbidden": "不得讓 agent-bounty-protocol 一納管就觸發掃描、部署、cron、daemon、claim / submit、payout、專案庫 / 參照 / 工作流程變更。" } } }, "productRolloutAcceptanceGates": { "title": "全產品 分階段套用 波次驗收門檻", - "subtitle": "將七個產品波次再補上六個驗收門檻:每個波次都要先通過只讀證據、負責人證據、脫敏審查、版本來源證明、主機安全窗口與回復 / disable 條件,才可能被列入後續 執行期候選。這仍是驗收門檻可視化,不是批准或執行。", + "subtitle": "將八個產品波次再補上六個驗收門檻:每個波次都要先通過只讀證據、負責人證據、脫敏審查、版本來源證明、主機安全窗口與回復 / disable 條件,才可能被列入後續 執行期候選。這仍是驗收門檻可視化,不是批准或執行。", "gateLabel": "門檻", "requiredEvidenceLabel": "需要證據", "acceptanceSignalLabel": "驗收訊號", @@ -14216,6 +14244,68 @@ "body": "目前 啟用中的執行期閘門 是 0;SSH、掃描、修復、部署、主機更新、專案庫 / 參照 / 工作流程 變更都還沒被批准。" } } + }, + "agentBountySecurityOnboarding": { + "eyebrow": "Agent Bounty 新專案收件卡", + "title": "先納入視野,外部 agent 與金流先鎖住", + "subtitle": "agent-bounty-protocol 已納入 IwoooS,但目前只補 scope、owner、資料分級、版本來源、部署邊界、外部 agent 邊界與財務邊界;執行期仍維持 0。", + "checkLabel": "檢查", + "stateLabel": "狀態", + "missingLabel": "目前缺口", + "nextLabel": "下一步", + "boundaryTitle": "Agent Bounty 收件邊界", + "boundaryIntro": "以下鍵值固定:這是只讀收件,不讀 env、不建立儲存庫、不同步參照、不部署、不掃描、不啟用 cron、不讓 agent claim / submit、不執行 payout 或 withdrawal。", + "summary": { + "readOnly": { + "label": "納管狀態", + "detail": "已進八類產品範圍。" + }, + "missingEvidence": { + "label": "待補證據", + "detail": "七項收件欄位仍待負責人補齊。" + }, + "runtime": { + "label": "執行期", + "detail": "仍為 0,不進執行。" + } + }, + "items": { + "owner": { + "title": "產品負責人與責任邊界", + "missing": "尚未建立產品、資安、部署、外部 agent、通知與 treasury 的可追溯 owner。", + "next": "先收只讀 owner 證據;不得把口頭同意或 AwoooP approval 視為資安批准。" + }, + "dataClass": { + "title": "任務、agent 與 webhook 資料分級", + "missing": "尚未標示 task、solution、agent reputation、traffic、webhook、admin 與 settlement 的資料分級。", + "next": "只收欄位類型與脫敏摘要,不收 raw payload、未脫敏互動內容、cookie 或 token。" + }, + "sourceRepo": { + "title": "版本來源與 dirty workspace 判定", + "missing": "本機 repo 有 51 個修改或未追蹤項目;尚未判定 WIP、release candidate 與 canonical remote。", + "next": "先收 refs truth 與 dirty workspace disposition;不得 push、rebase、同步 refs 或改 workflow。" + }, + "deployBoundary": { + "title": "部署邊界與回復條件", + "missing": "README 與部署腳本顯示主機線索需 owner 確認;尚未建立正式 smoke、TLS、rollback 與維護窗口。", + "next": "先補 production host、compose directory、domain、TLS、health check 與 rollback owner,不觸發部署。" + }, + "externalAgent": { + "title": "MCP / A2A / cron 外部 agent 邊界", + "missing": "AUTO_CLAIM、AUTO_SUBMIT、RUN_DAEMON、A2A dispatcher、self-replicate 與外部送訊尚未授權。", + "next": "先列 route、tool、cron 與 daemon 名稱,不啟用外部 claim / submit / listener / dispatcher。" + }, + "treasuryBoundary": { + "title": "Treasury / staking / payout 邊界", + "missing": "staking、withdrawal、payout、Stripe、wallet 類能力尚未有財務 owner 與停用條件。", + "next": "只收 capability 與 owner metadata,不收 private key、seed phrase、Stripe secret 或 payout instruction。" + }, + "runtimeGate": { + "title": "執行期閘門分離", + "missing": "尚未有任何掃描、修復、部署、cron、daemon、agent action 或金流操作授權。", + "next": "保持閘門 0;等 owner 證據接受後才討論後續候選。" + } + } } } } diff --git a/apps/web/src/app/[locale]/iwooos/page.tsx b/apps/web/src/app/[locale]/iwooos/page.tsx index 4a4ad00cd..b46f2fe42 100644 --- a/apps/web/src/app/[locale]/iwooos/page.tsx +++ b/apps/web/src/app/[locale]/iwooos/page.tsx @@ -239,6 +239,14 @@ type VibeWorkSecurityOnboardingItem = { tone: 'steady' | 'warn' | 'locked' } +type AgentBountySecurityOnboardingItem = { + key: string + check: string + state: string + icon: typeof ShieldCheck + tone: 'steady' | 'warn' | 'locked' +} + type IwoooSCommandMapItem = { key: IwoooSCommandMapMode metric: string @@ -961,7 +969,7 @@ const postureMetrics: PostureMetric[] = [ ] const progressIntegritySignals: IwoooSProgressIntegritySignal[] = [ - { key: 'coverageVisible', value: '8 類', percent: 92, icon: Network, tone: 'steady' }, + { key: 'coverageVisible', value: '9 類', percent: 92, icon: Network, tone: 'steady' }, { key: 'evidenceMissing', value: '0 / 3', percent: 0, icon: FileText, tone: 'warn' }, { key: 'executionLocked', value: '0', percent: 0, icon: Lock, tone: 'locked' }, ] @@ -971,7 +979,7 @@ const progressIntegrityRibbonBoundaries = [ 'iwooos_progress_integrity_ribbon_signal_count=3', 'iwooos_progress_integrity_ribbon_headline_percent=64', 'iwooos_progress_integrity_ribbon_headline_delta=3', - 'iwooos_progress_integrity_ribbon_read_only_scope_count=8', + 'iwooos_progress_integrity_ribbon_read_only_scope_count=9', 'iwooos_progress_integrity_ribbon_pending_evidence_gate_count=3', 'iwooos_progress_integrity_ribbon_runtime_gate_count=0', 'owner_response_received_count=0', @@ -1209,8 +1217,8 @@ const responseFlowSteps: ResponseFlowStep[] = [ ] const allProductCoverageSnapshotSummary = [ - { key: 'scopeCount', value: '7', icon: ListChecks, tone: 'steady' }, - { key: 'readOnlyScopes', value: '7', icon: ShieldCheck, tone: 'steady' }, + { key: 'scopeCount', value: '8', icon: ListChecks, tone: 'steady' }, + { key: 'readOnlyScopes', value: '8', icon: ShieldCheck, tone: 'steady' }, { key: 'runtimeReady', value: '0', icon: Lock, tone: 'locked' }, { key: 'nextGate', value: 'S4.9', icon: ClipboardCheck, tone: 'warn' }, ] as const @@ -1222,18 +1230,21 @@ const allProductCoverageSnapshotItems: AllProductCoverageSnapshotItem[] = [ { key: 'hosts', scope: 'P4', stateKey: 'approvalRequired', icon: Activity, tone: 'warn' }, { key: 'toolsMonitoring', scope: 'P5', stateKey: 'readOnlyFirst', icon: Radar, tone: 'steady' }, { key: 'vibeWork', scope: 'P6', stateKey: 'newProjectReadOnly', icon: FileText, tone: 'warn' }, - { key: 'futureProducts', scope: 'P7', stateKey: 'templateReady', icon: ListChecks, tone: 'warn' }, + { key: 'agentBountyProtocol', scope: 'P7', stateKey: 'newProjectReadOnly', icon: Workflow, tone: 'warn' }, + { key: 'futureProducts', scope: 'P8', stateKey: 'templateReady', icon: ListChecks, tone: 'warn' }, ] const allProductCoverageSnapshotBoundaries = [ - 'iwooos_all_product_coverage_snapshot_scope_count=7', - 'iwooos_all_product_coverage_snapshot_read_only_count=7', + 'iwooos_all_product_coverage_snapshot_scope_count=8', + 'iwooos_all_product_coverage_snapshot_read_only_count=8', 'iwooos_all_product_coverage_snapshot_runtime_ready_count=0', 'iwooos_all_product_coverage_snapshot_default_summary_mode=compact_first', 'iwooos_all_product_coverage_snapshot_detail_ledger_collapsed=true', 'iwooos_all_product_coverage_snapshot_next_gate=s4_9_owner_response_accepted', 'vibework_project_read_only_in_scope=true', 'vibework_runtime_ready=false', + 'agent_bounty_project_read_only_in_scope=true', + 'agent_bounty_runtime_ready=false', 'runtime_execution_authorized=false', 'active_runtime_gate_count=0', 'action_buttons_allowed=false', @@ -1804,8 +1815,8 @@ const iwooosConcreteSecurityBlockerResolutionBoundaries = [ ] as const const globalSecurityMeshMatrixSummary = [ - { key: 'assets', value: '8', icon: Radar, tone: 'steady' }, - { key: 'readOnly', value: '8', icon: ShieldCheck, tone: 'steady' }, + { key: 'assets', value: '9', icon: Radar, tone: 'steady' }, + { key: 'readOnly', value: '9', icon: ShieldCheck, tone: 'steady' }, { key: 'runtime', value: '0', icon: Lock, tone: 'locked' }, { key: 'nextGate', value: 'S4.9', icon: ClipboardCheck, tone: 'warn' }, ] as const @@ -1816,15 +1827,16 @@ const globalSecurityMeshMatrixItems: GlobalSecurityMeshMatrixItem[] = [ { key: 'iwooos', code: 'G3', icon: Activity, coverageTone: 'steady', evidenceTone: 'steady', runtimeTone: 'locked' }, { key: 'publicSites', code: 'G4', icon: FileText, coverageTone: 'steady', evidenceTone: 'warn', runtimeTone: 'locked' }, { key: 'vibeWork', code: 'G5', icon: ListChecks, coverageTone: 'steady', evidenceTone: 'warn', runtimeTone: 'locked' }, - { key: 'kali112', code: 'G6', icon: SearchCheck, coverageTone: 'steady', evidenceTone: 'warn', runtimeTone: 'locked' }, - { key: 'devHosts', code: 'G7', icon: Activity, coverageTone: 'steady', evidenceTone: 'warn', runtimeTone: 'locked' }, - { key: 'sourceControl', code: 'G8', icon: GitBranch, coverageTone: 'warn', evidenceTone: 'warn', runtimeTone: 'locked' }, + { key: 'agentBountyProtocol', code: 'G6', icon: Workflow, coverageTone: 'steady', evidenceTone: 'warn', runtimeTone: 'locked' }, + { key: 'kali112', code: 'G7', icon: SearchCheck, coverageTone: 'steady', evidenceTone: 'warn', runtimeTone: 'locked' }, + { key: 'devHosts', code: 'G8', icon: Activity, coverageTone: 'steady', evidenceTone: 'warn', runtimeTone: 'locked' }, + { key: 'sourceControl', code: 'G9', icon: GitBranch, coverageTone: 'warn', evidenceTone: 'warn', runtimeTone: 'locked' }, ] const globalSecurityMeshMatrixBoundaries = [ 'iwooos_global_security_mesh_first_layer=true', - 'iwooos_global_security_mesh_asset_count=8', - 'iwooos_global_security_mesh_read_only_count=8', + 'iwooos_global_security_mesh_asset_count=9', + 'iwooos_global_security_mesh_read_only_count=9', 'iwooos_global_security_mesh_runtime_gate_count=0', 'iwooos_global_security_mesh_source_control_mutation_authorized=false', 'iwooos_global_security_mesh_kali_execution_authorized=false', @@ -1912,6 +1924,44 @@ const vibeWorkSecurityOnboardingBoundaries = [ 'production_deploy_authorized=false', ] as const +const agentBountySecurityOnboardingSummary = [ + { key: 'readOnly', value: '已納管', icon: ShieldCheck, tone: 'steady' }, + { key: 'missingEvidence', value: '7', icon: ListChecks, tone: 'warn' }, + { key: 'runtime', value: '0', icon: Lock, tone: 'locked' }, +] as const + +const agentBountySecurityOnboardingItems: AgentBountySecurityOnboardingItem[] = [ + { key: 'owner', check: 'AB1', state: '待補', icon: ClipboardCheck, tone: 'warn' }, + { key: 'dataClass', check: 'AB2', state: '待分級', icon: ShieldCheck, tone: 'warn' }, + { key: 'sourceRepo', check: 'AB3', state: '待證據', icon: GitBranch, tone: 'warn' }, + { key: 'deployBoundary', check: 'AB4', state: '待界定', icon: FileText, tone: 'warn' }, + { key: 'externalAgent', check: 'AB5', state: '未授權', icon: Workflow, tone: 'locked' }, + { key: 'treasuryBoundary', check: 'AB6', state: '未授權', icon: Lock, tone: 'locked' }, + { key: 'runtimeGate', check: 'AB7', state: '未開', icon: Lock, tone: 'locked' }, +] + +const agentBountySecurityOnboardingBoundaries = [ + 'agent_bounty_security_onboarding_item_count=7', + 'agent_bounty_security_onboarding_read_only=true', + 'agent_bounty_owner_evidence_received=false', + 'agent_bounty_data_classification_received=false', + 'agent_bounty_source_control_evidence_received=false', + 'agent_bounty_deployment_boundary_received=false', + 'agent_bounty_external_agent_boundary_received=false', + 'agent_bounty_treasury_boundary_received=false', + 'agent_bounty_auto_claim_submit_authorized=false', + 'agent_bounty_bounty_payout_authorized=false', + 'agent_bounty_runtime_gate_open=false', + 'runtime_execution_authorized=false', + 'active_runtime_gate_count=0', + 'action_buttons_allowed=false', + 'not_authorization=true', + 'repo_creation_authorized=false', + 'refs_sync_authorized=false', + 'workflow_modification_authorized=false', + 'production_deploy_authorized=false', +] as const + const iwooosThreeAxisProductProgressSummary = [ { key: 'headline', value: '64%', icon: Activity, tone: 'warn' }, { key: 'framework', value: '92%', icon: ShieldCheck, tone: 'steady' }, @@ -1926,17 +1976,20 @@ const iwooosThreeAxisProductProgressItems = [ { key: 'hosts', scope: 'P4', state: '待授權', icon: Activity, tone: 'warn' }, { key: 'toolsMonitoring', scope: 'P5', state: '只讀先行', icon: Radar, tone: 'steady' }, { key: 'vibeWork', scope: 'P6', state: '新專案只讀', icon: FileText, tone: 'warn' }, - { key: 'futureProducts', scope: 'P7', state: '分階段', icon: ListChecks, tone: 'warn' }, + { key: 'agentBountyProtocol', scope: 'P7', state: '新專案只讀', icon: Workflow, tone: 'warn' }, + { key: 'futureProducts', scope: 'P8', state: '分階段', icon: ListChecks, tone: 'warn' }, ] as const const iwooosThreeAxisProductProgressBoundaries = [ 'iwooos_three_axis_progress_headline_percent=64', 'iwooos_three_axis_progress_framework_percent=92', 'iwooos_three_axis_progress_runtime_percent=40-45', - 'iwooos_three_axis_progress_product_scope_count=7', + 'iwooos_three_axis_progress_product_scope_count=8', 'iwooos_three_axis_progress_all_products_read_only=true', 'iwooos_three_axis_progress_vibework_read_only_in_scope=true', 'iwooos_three_axis_progress_vibework_runtime_ready=false', + 'iwooos_three_axis_progress_agent_bounty_read_only_in_scope=true', + 'iwooos_three_axis_progress_agent_bounty_runtime_ready=false', 'iwooos_three_axis_progress_runtime_product_rollout_count=0', 'iwooos_three_axis_progress_first_runtime_gate=s4_9_owner_response_accepted', 'iwooos_three_axis_progress_owner_response_accepted_count=0', @@ -1957,7 +2010,7 @@ const iwooosThreeAxisProductProgressBoundaries = [ ] as const const iwooosProductRolloutWaveLedgerSummary = [ - { key: 'waves', value: '7', icon: ListChecks, tone: 'steady' }, + { key: 'waves', value: '8', icon: ListChecks, tone: 'steady' }, { key: 'current', value: '只讀波次', icon: ShieldCheck, tone: 'steady' }, { key: 'runtime', value: '0', icon: Lock, tone: 'locked' }, { key: 'nextGate', value: 'S4.9', icon: ClipboardCheck, tone: 'warn' }, @@ -1970,15 +2023,18 @@ const iwooosProductRolloutWaveLedgerItems = [ { key: 'hostCoverage', wave: 'W3', state: '等授權', icon: Activity, tone: 'warn' }, { key: 'monitoringTools', wave: 'W4', state: '只讀輸出', icon: Radar, tone: 'steady' }, { key: 'vibeWorkProject', wave: 'W5', state: '新專案只讀', icon: FileText, tone: 'warn' }, - { key: 'futureTemplate', wave: 'W6', state: '預設套用', icon: ListChecks, tone: 'warn' }, + { key: 'agentBountyProtocol', wave: 'W6', state: '新專案只讀', icon: Workflow, tone: 'warn' }, + { key: 'futureTemplate', wave: 'W7', state: '預設套用', icon: ListChecks, tone: 'warn' }, ] as const const iwooosProductRolloutWaveLedgerBoundaries = [ - 'iwooos_product_rollout_wave_count=7', - 'iwooos_product_rollout_all_products_count=7', + 'iwooos_product_rollout_wave_count=8', + 'iwooos_product_rollout_all_products_count=8', 'iwooos_product_rollout_current_wave=read_only_visibility', 'iwooos_product_rollout_vibework_project_wave=read_only_visibility', 'iwooos_product_rollout_vibework_runtime_ready=false', + 'iwooos_product_rollout_agent_bounty_project_wave=read_only_visibility', + 'iwooos_product_rollout_agent_bounty_runtime_ready=false', 'iwooos_product_rollout_runtime_wave_count=0', 'iwooos_product_rollout_enforcement_wave_count=0', 'iwooos_product_rollout_owner_response_accepted_count=0', @@ -2736,7 +2792,7 @@ const iwooosExecutiveSnapshotBoundaries = [ const iwooosFocusDeckItems: IwoooSFocusDeckItem[] = [ { key: 'workMap', href: '#iwooos-decision-gate-visuals', metric: '6', icon: Radar, tone: 'warn' }, { key: 'unlockPath', href: '#iwooos-decision-gate-visuals', metric: 'S4.9', icon: ListChecks, tone: 'warn' }, - { key: 'productScope', href: '#iwooos-scope-evidence-visuals', metric: '8/8', icon: ShieldCheck, tone: 'steady' }, + { key: 'productScope', href: '#iwooos-scope-evidence-visuals', metric: '9/9', icon: ShieldCheck, tone: 'steady' }, { key: 'hostTools', href: '#iwooos-scope-evidence-visuals', metric: '3', icon: Activity, tone: 'warn' }, { key: 'sourceControl', href: '#iwooos-decision-gate-visuals', metric: '0', icon: GitBranch, tone: 'locked' }, ] @@ -2755,7 +2811,7 @@ const iwooosFocusDeckBoundaries = [ ] as const const iwooosImmediateVisualMeshNodes: IwoooSImmediateVisualMeshNode[] = [ - { key: 'products', metric: '8', icon: ShieldCheck, tone: 'steady' }, + { key: 'products', metric: '9', icon: ShieldCheck, tone: 'steady' }, { key: 'hosts', metric: '112 / 111 / 168', icon: Activity, tone: 'warn' }, { key: 'sourceControl', metric: 'S4.9', icon: GitBranch, tone: 'warn' }, { key: 'monitoring', metric: '6', icon: Radar, tone: 'steady' }, @@ -2764,7 +2820,7 @@ const iwooosImmediateVisualMeshNodes: IwoooSImmediateVisualMeshNode[] = [ ] const iwooosImmediateVisualMeshStats = [ - { key: 'assetScope', value: '8', icon: Radar, tone: 'steady' }, + { key: 'assetScope', value: '9', icon: Radar, tone: 'steady' }, { key: 'hostScope', value: '3', icon: Activity, tone: 'warn' }, { key: 'runtimeGate', value: '0', icon: Lock, tone: 'locked' }, ] as const @@ -2789,12 +2845,12 @@ const iwooosImmediateVisualMeshBoundaries = [ const iwooosTopologyAtlasLenses: IwoooSTopologyAtlasLens[] = [ { key: 'architecture', metric: '5層', icon: Boxes, tone: 'steady' }, { key: 'topology', metric: '3主機', icon: Network, tone: 'warn' }, - { key: 'attackSurface', metric: '8面', icon: Route, tone: 'warn' }, + { key: 'attackSurface', metric: '9面', icon: Route, tone: 'warn' }, { key: 'evidenceFlow', metric: '閘門 0', icon: Workflow, tone: 'locked' }, ] const iwooosTopologyAtlasNodes: IwoooSTopologyAtlasNode[] = [ - { key: 'productSurface', metric: '8', x: 14, y: 30, icon: Boxes, tone: 'steady' }, + { key: 'productSurface', metric: '9', x: 14, y: 30, icon: Boxes, tone: 'steady' }, { key: 'sourceControl', metric: 'S4.9', x: 35, y: 18, icon: Code2, tone: 'warn' }, { key: 'kali', metric: '112', x: 58, y: 30, icon: Server, tone: 'warn' }, { key: 'devHosts', metric: '111 / 168', x: 77, y: 50, icon: Network, tone: 'warn' }, @@ -2824,7 +2880,7 @@ const iwooosTopologyAtlasCompactPositions: Record +
+
+
+
+ + {t('eyebrow')} +
+

{t('title')}

+

+ {t('subtitle')} +

+
+ +
+ {agentBountySecurityOnboardingSummary.map(item => { + const Icon = item.icon + return ( +
+
+ {t(`summary.${item.key}.label` as never)} + +
+
+ {item.value} +
+

+ {t(`summary.${item.key}.detail` as never)} +

+
+ ) + })} +
+
+ +
+ {agentBountySecurityOnboardingItems.map(item => { + const Icon = item.icon + return ( +
+
+ + {t('checkLabel')} {item.check} + + +
+
+
+ {t(`items.${item.key}.title` as never)} +
+
+ {t('stateLabel')}:{item.state} +
+
+
+

+ {t('missingLabel')}:{t(`items.${item.key}.missing` as never)} +

+

+ {t('nextLabel')}:{t(`items.${item.key}.next` as never)} +

+
+
+ ) + })} +
+ +
+ + {t('boundaryTitle')} + +

+ {t('boundaryIntro')} +

+
+ {agentBountySecurityOnboardingBoundaries.map(item => ( + + {item} + + ))} +
+
+
+ + ) +} + function ProgressAccelerationLaneCard({ item }: { item: ProgressAccelerationLane }) { const t = useTranslations('iwooos.progressAcceleration') const Icon = item.icon @@ -17931,6 +18121,7 @@ export default function IwoooSPage({ params }: { params: { locale: string } }) { + None: assert_equal( "iwooos_projection.summary.progress_integrity_ribbon_read_only_scope_count", iwooos_projection["summary"]["progress_integrity_ribbon_read_only_scope_count"], - 8, + 9, ) assert_equal( "iwooos_projection.summary.progress_integrity_ribbon_pending_evidence_gate_count", @@ -1676,12 +1676,12 @@ def validate(root: Path) -> None: assert_equal( "iwooos_projection.summary.all_product_coverage_snapshot_scope_count", iwooos_projection["summary"]["all_product_coverage_snapshot_scope_count"], - 7, + 8, ) assert_equal( "iwooos_projection.summary.all_product_coverage_snapshot_read_only_count", iwooos_projection["summary"]["all_product_coverage_snapshot_read_only_count"], - 7, + 8, ) assert_equal( "iwooos_projection.summary.all_product_coverage_snapshot_runtime_ready_count", @@ -2168,7 +2168,7 @@ def validate(root: Path) -> None: assert_equal( "iwooos_projection.summary.decision_runway_dependency_count", iwooos_projection["summary"]["decision_runway_dependency_count"], - 6, + 7, ) assert_equal( "iwooos_projection.summary.decision_runway_boundary_signal_count", @@ -2244,12 +2244,12 @@ def validate(root: Path) -> None: assert_equal( "iwooos_projection.summary.global_security_mesh_matrix_asset_count", iwooos_projection["summary"]["global_security_mesh_matrix_asset_count"], - 8, + 9, ) assert_equal( "iwooos_projection.summary.global_security_mesh_matrix_read_only_count", iwooos_projection["summary"]["global_security_mesh_matrix_read_only_count"], - 8, + 9, ) assert_equal( "iwooos_projection.summary.global_security_mesh_matrix_runtime_gate_count", @@ -2297,6 +2297,24 @@ def validate(root: Path) -> None: iwooos_projection["summary"]["vibework_security_onboarding_runtime_gate_count"], 0, ) + assert_true( + "iwooos_projection.summary.agent_bounty_security_onboarding_first_layer", + iwooos_projection["summary"]["agent_bounty_security_onboarding_first_layer"], + ) + assert_false( + "iwooos_projection.summary.agent_bounty_security_onboarding_default_visible", + iwooos_projection["summary"]["agent_bounty_security_onboarding_default_visible"], + ) + assert_equal( + "iwooos_projection.summary.agent_bounty_security_onboarding_item_count", + iwooos_projection["summary"]["agent_bounty_security_onboarding_item_count"], + 7, + ) + assert_equal( + "iwooos_projection.summary.agent_bounty_security_onboarding_runtime_gate_count", + iwooos_projection["summary"]["agent_bounty_security_onboarding_runtime_gate_count"], + 0, + ) expected_iwooos_surface_ids = [ "security_compliance", "legacy_security", @@ -7006,6 +7024,7 @@ def validate(root: Path) -> None: "display_forbidden_actions", "display_source_control_primary_readiness_board", "display_vibework_security_onboarding", + "display_agent_bounty_security_onboarding", ]: assert_contains("iwooos_projection.allowed_frontend_outputs", iwooos_projection["allowed_frontend_outputs"], output) for output in [ @@ -10650,14 +10669,16 @@ def validate(root: Path) -> None: "IwoooSAllProductCoverageSnapshotBoard", ) for text in [ - "iwooos_all_product_coverage_snapshot_scope_count=7", - "iwooos_all_product_coverage_snapshot_read_only_count=7", + "iwooos_all_product_coverage_snapshot_scope_count=8", + "iwooos_all_product_coverage_snapshot_read_only_count=8", "iwooos_all_product_coverage_snapshot_runtime_ready_count=0", "iwooos_all_product_coverage_snapshot_default_summary_mode=compact_first", "iwooos_all_product_coverage_snapshot_detail_ledger_collapsed=true", "iwooos_all_product_coverage_snapshot_next_gate=s4_9_owner_response_accepted", "vibework_project_read_only_in_scope=true", "vibework_runtime_ready=false", + "agent_bounty_project_read_only_in_scope=true", + "agent_bounty_runtime_ready=false", "runtime_execution_authorized=false", "active_runtime_gate_count=0", "action_buttons_allowed=false", @@ -10740,6 +10761,7 @@ def validate(root: Path) -> None: "hosts", "toolsMonitoring", "vibeWork", + "agentBountyProtocol", "futureProducts", ]: assert_contains( @@ -10769,8 +10791,8 @@ def validate(root: Path) -> None: ) for text in [ "iwooos_global_security_mesh_first_layer=true", - "iwooos_global_security_mesh_asset_count=8", - "iwooos_global_security_mesh_read_only_count=8", + "iwooos_global_security_mesh_asset_count=9", + "iwooos_global_security_mesh_read_only_count=9", "iwooos_global_security_mesh_runtime_gate_count=0", "iwooos_global_security_mesh_source_control_mutation_authorized=false", "iwooos_global_security_mesh_kali_execution_authorized=false", @@ -10831,7 +10853,7 @@ def validate(root: Path) -> None: list(web_messages_en["iwooos"]["globalSecurityMeshMatrix"]["summary"].keys()), key, ) - for key in ["awoooi", "awooop", "iwooos", "publicSites", "vibeWork", "kali112", "devHosts", "sourceControl"]: + for key in ["awoooi", "awooop", "iwooos", "publicSites", "vibeWork", "agentBountyProtocol", "kali112", "devHosts", "sourceControl"]: assert_contains( "web_messages.zh-TW.iwooos.globalSecurityMeshMatrix.items", list(web_messages_zh["iwooos"]["globalSecurityMeshMatrix"]["items"].keys()), @@ -11037,6 +11059,102 @@ def validate(root: Path) -> None: list(web_messages_en["iwooos"]["vibeWorkSecurityOnboarding"]["items"].keys()), key, ) + assert_text_contains( + "iwooos_page.agent_bounty_security_onboarding_testid", + iwooos_projection_page, + 'data-testid="iwooos-agent-bounty-security-onboarding-board"', + ) + assert_text_contains( + "iwooos_page.agent_bounty_security_onboarding_boundary_testid", + iwooos_projection_page, + 'data-testid="iwooos-agent-bounty-security-onboarding-boundaries"', + ) + assert_text_contains( + "iwooos_page.agent_bounty_security_onboarding_component", + iwooos_projection_page, + "IwoooSAgentBountySecurityOnboardingBoard", + ) + for text in [ + "agent_bounty_security_onboarding_item_count=7", + "agent_bounty_security_onboarding_read_only=true", + "agent_bounty_owner_evidence_received=false", + "agent_bounty_data_classification_received=false", + "agent_bounty_source_control_evidence_received=false", + "agent_bounty_deployment_boundary_received=false", + "agent_bounty_external_agent_boundary_received=false", + "agent_bounty_treasury_boundary_received=false", + "agent_bounty_auto_claim_submit_authorized=false", + "agent_bounty_bounty_payout_authorized=false", + "agent_bounty_runtime_gate_open=false", + "runtime_execution_authorized=false", + "active_runtime_gate_count=0", + "action_buttons_allowed=false", + "not_authorization=true", + "repo_creation_authorized=false", + "refs_sync_authorized=false", + "workflow_modification_authorized=false", + "production_deploy_authorized=false", + ]: + assert_text_contains( + "iwooos_page.agent_bounty_security_onboarding_boundary", + iwooos_projection_page, + text, + ) + assert_contains( + "web_messages.zh-TW.iwooos.agentBountySecurityOnboarding", + list(web_messages_zh["iwooos"].keys()), + "agentBountySecurityOnboarding", + ) + assert_contains( + "web_messages.en.iwooos.agentBountySecurityOnboarding", + list(web_messages_en["iwooos"].keys()), + "agentBountySecurityOnboarding", + ) + for key in [ + "eyebrow", + "title", + "subtitle", + "summary", + "items", + "checkLabel", + "stateLabel", + "missingLabel", + "nextLabel", + "boundaryTitle", + "boundaryIntro", + ]: + assert_contains( + "web_messages.zh-TW.iwooos.agentBountySecurityOnboarding.keys", + list(web_messages_zh["iwooos"]["agentBountySecurityOnboarding"].keys()), + key, + ) + assert_contains( + "web_messages.en.iwooos.agentBountySecurityOnboarding.keys", + list(web_messages_en["iwooos"]["agentBountySecurityOnboarding"].keys()), + key, + ) + for key in ["readOnly", "missingEvidence", "runtime"]: + assert_contains( + "web_messages.zh-TW.iwooos.agentBountySecurityOnboarding.summary", + list(web_messages_zh["iwooos"]["agentBountySecurityOnboarding"]["summary"].keys()), + key, + ) + assert_contains( + "web_messages.en.iwooos.agentBountySecurityOnboarding.summary", + list(web_messages_en["iwooos"]["agentBountySecurityOnboarding"]["summary"].keys()), + key, + ) + for key in ["owner", "dataClass", "sourceRepo", "deployBoundary", "externalAgent", "treasuryBoundary", "runtimeGate"]: + assert_contains( + "web_messages.zh-TW.iwooos.agentBountySecurityOnboarding.items", + list(web_messages_zh["iwooos"]["agentBountySecurityOnboarding"]["items"].keys()), + key, + ) + assert_contains( + "web_messages.en.iwooos.agentBountySecurityOnboarding.items", + list(web_messages_en["iwooos"]["agentBountySecurityOnboarding"]["items"].keys()), + key, + ) assert_text_contains( "iwooos_page.three_axis_product_progress_testid", iwooos_projection_page, @@ -11051,10 +11169,12 @@ def validate(root: Path) -> None: "iwooos_three_axis_progress_headline_percent=64", "iwooos_three_axis_progress_framework_percent=92", "iwooos_three_axis_progress_runtime_percent=40-45", - "iwooos_three_axis_progress_product_scope_count=7", + "iwooos_three_axis_progress_product_scope_count=8", "iwooos_three_axis_progress_all_products_read_only=true", "iwooos_three_axis_progress_vibework_read_only_in_scope=true", "iwooos_three_axis_progress_vibework_runtime_ready=false", + "iwooos_three_axis_progress_agent_bounty_read_only_in_scope=true", + "iwooos_three_axis_progress_agent_bounty_runtime_ready=false", "iwooos_three_axis_progress_runtime_product_rollout_count=0", "iwooos_three_axis_progress_first_runtime_gate=s4_9_owner_response_accepted", "iwooos_three_axis_progress_owner_response_accepted_count=0", @@ -11128,6 +11248,7 @@ def validate(root: Path) -> None: "hosts", "toolsMonitoring", "vibeWork", + "agentBountyProtocol", "futureProducts", ]: assert_contains( @@ -11151,11 +11272,13 @@ def validate(root: Path) -> None: "IwoooSProductRolloutWaveLedgerBoard", ) for text in [ - "iwooos_product_rollout_wave_count=7", - "iwooos_product_rollout_all_products_count=7", + "iwooos_product_rollout_wave_count=8", + "iwooos_product_rollout_all_products_count=8", "iwooos_product_rollout_current_wave=read_only_visibility", "iwooos_product_rollout_vibework_project_wave=read_only_visibility", "iwooos_product_rollout_vibework_runtime_ready=false", + "iwooos_product_rollout_agent_bounty_project_wave=read_only_visibility", + "iwooos_product_rollout_agent_bounty_runtime_ready=false", "iwooos_product_rollout_runtime_wave_count=0", "iwooos_product_rollout_enforcement_wave_count=0", "iwooos_product_rollout_owner_response_accepted_count=0", @@ -11231,6 +11354,7 @@ def validate(root: Path) -> None: "hostCoverage", "monitoringTools", "vibeWorkProject", + "agentBountyProtocol", "futureTemplate", ]: assert_contains( @@ -12782,7 +12906,7 @@ def validate(root: Path) -> None: assert_equal( "iwooos_projection.progress_integrity_ribbon_signals.values", [item["value"] for item in progress_integrity_signals], - ["8 類", "0 / 3", "0"], + ["9 類", "0 / 3", "0"], ) for item in progress_integrity_signals: signal_id = item["signal_id"] @@ -12862,7 +12986,7 @@ def validate(root: Path) -> None: "iwooos_progress_integrity_ribbon_signal_count=3", "iwooos_progress_integrity_ribbon_headline_percent=64", "iwooos_progress_integrity_ribbon_headline_delta=3", - "iwooos_progress_integrity_ribbon_read_only_scope_count=8", + "iwooos_progress_integrity_ribbon_read_only_scope_count=9", "iwooos_progress_integrity_ribbon_pending_evidence_gate_count=3", "iwooos_progress_integrity_ribbon_runtime_gate_count=0", "owner_response_received_count=0", @@ -14252,7 +14376,7 @@ def validate(root: Path) -> None: "iwooos_decision_runway_first_layer=true", "iwooos_decision_runway_step_count=5", "iwooos_decision_runway_default_step=ownerEvidence", - "iwooos_decision_runway_dependency_count=6", + "iwooos_decision_runway_dependency_count=7", "iwooos_decision_runway_boundary_signal_count=4", "iwooos_decision_runway_above_gate_radar=true", "iwooos_decision_runway_interactive_step_allowed=true", @@ -14941,6 +15065,7 @@ def validate(root: Path) -> None: "iwooos", "awooop", "vibework", + "agentBounty", "kali", "devHosts", "monitoring",