fix(awooop): reduce home text density
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / build-and-deploy (push) Has been cancelled
CD Pipeline / tests (push) Has been cancelled
CD Pipeline / post-deploy-checks (push) Has been cancelled

This commit is contained in:
Your Name
2026-07-03 15:13:40 +08:00
parent 20db53ae04
commit bb687d37d0
3 changed files with 206 additions and 208 deletions

View File

@@ -109,12 +109,24 @@
"refresh": "重新整理"
},
"sources": {
"0": { "error": "狀態清理資料未回讀" },
"1": { "error": "Gitea private inventory 資料未回讀" },
"2": { "error": "Gitea / runner 資料未回讀" },
"3": { "error": "Runtime surface 資料未回讀" },
"4": { "error": "Backup readiness 資料未回讀" },
"5": { "error": "P0-006 reboot drill preflight 資料未回讀" }
"0": {
"error": "狀態清理資料未回讀"
},
"1": {
"error": "Gitea private inventory 資料未回讀"
},
"2": {
"error": "Gitea / runner 資料未回讀"
},
"3": {
"error": "Runtime surface 資料未回讀"
},
"4": {
"error": "Backup readiness 資料未回讀"
},
"5": {
"error": "P0-006 reboot drill preflight 資料未回讀"
}
},
"metrics": {
"loaded": "資料來源",
@@ -202,19 +214,19 @@
"empty": "目前沒有 Delivery workbench 回傳的待處理焦點。"
},
"lanes": {
"release": {
"title": "乾淨 release 工作流",
"description": "把可交付的變更切出乾淨分支與可驗證提交,避免髒分支整包推送。",
"metric": "阻擋 gate {blocked}"
},
"production_deploy": {
"title": "Production deploy",
"description": "讀回 Gitea CD、production image tag 與 runner readiness不把 source ready 誤判成已部署。",
"metric": "CD #{run} {status}"
},
"gitea_private_inventory": {
"title": "Gitea private inventory",
"description": "把 private/internal inventory 收斂到 Gitea-only scorecardGitHub 只保留 stopped / do_not_use 背景狀態。",
"release": {
"title": "乾淨 release 工作流",
"description": "把可交付的變更切出乾淨分支與可驗證提交,避免髒分支整包推送。",
"metric": "阻擋 gate {blocked}"
},
"production_deploy": {
"title": "Production deploy",
"description": "讀回 Gitea CD、production image tag 與 runner readiness不把 source ready 誤判成已部署。",
"metric": "CD #{run} {status}"
},
"gitea_private_inventory": {
"title": "Gitea private inventory",
"description": "把 private/internal inventory 收斂到 Gitea-only scorecardGitHub 只保留 stopped / do_not_use 背景狀態。",
"metric": "產品列 {present}/{expected} · {scope}"
},
"cicd_baseline": {
@@ -3782,21 +3794,21 @@
"health": {
"title": "監測健康",
"status": "狀態",
"statuses": {
"healthy": "Healthy",
"controlled_queue": "受控隊列",
"blocked": "Blocked"
},
"statuses": {
"healthy": "Healthy",
"controlled_queue": "受控隊列",
"blocked": "Blocked"
},
"freshnessSla": "新鮮度 SLA",
"slaValue": "{slaHours}h + {graceHours}h",
"staleAfter": "過期時間",
"priorityGate": "升級關卡",
"blockedIntegrations": "已擋下整合",
"blockers": "阻擋",
"blocked": "已阻擋",
"controlledReverify": "AI 受控重驗",
"clear": "通過",
"noBlockers": "無受控阻擋"
"blockers": "阻擋",
"blocked": "已阻擋",
"controlledReverify": "AI 受控重驗",
"clear": "通過",
"noBlockers": "無受控阻擋"
},
"cadence": {
"title": "定期評估",
@@ -3819,10 +3831,10 @@
"statuses": {
"baseline_protected": "基準受保護",
"blocked_needs_evidence": "需要證據",
"controlled_review_required": "需要受控審查",
"controlled_priority_review": "優先級受控審查",
"operator_review_required": "需要受控審查",
"operator_priority_review": "優先級受控審查",
"controlled_review_required": "需要受控審查",
"controlled_priority_review": "優先級受控審查",
"operator_review_required": "需要受控審查",
"operator_priority_review": "優先級受控審查",
"watch_only_blocked": "觀察已阻擋",
"watch_only_monitoring": "觀察中",
"registered_no_review": "尚未審查"
@@ -8747,9 +8759,9 @@
"blockers": {
"dataIncomplete": "來源或品質資料尚未完整讀回;先補資料鏈,不把空值當成功。",
"repairVerifierGap": "已驗證自動修復 {verified}/{evaluated};仍需補執行、驗證或學習回寫。",
"manualGate": "仍有待處理工作 {open}、controlled gate {gates};需要 AI policy / verifier 判定。",
"ready": "來源、修復驗證與學習回寫已達可宣稱門檻;持續監看新事件。",
"watch": "目前沒有足夠條件宣稱全自動;先看 Runs、工作項與批准卡點。"
"watch": "目前沒有足夠條件宣稱全自動;先看 Runs、工作項與批准卡點。",
"controlledGate": "仍有待處理工作 {open}、controlled gate {gates};需要 AI policy / verifier 判定。"
},
"nextFocus": {
"workItems": "先處理卡住的工作項",
@@ -8887,7 +8899,7 @@
"contractsDetail": "專案 / 代理 / Policy contract 發布狀態"
},
"disposition": {
"title": "處置語義",
"title": "處置節點",
"diagnosis": {
"title": "只讀診斷",
"signal": "AI 已收集證據",
@@ -8906,11 +8918,11 @@
"owner": "負責MCP 閘道 執行並稽核",
"route": "流向:執行狀態 / Audit"
},
"manual": {
"title": "AI 補齊升級",
"controlled": {
"title": "AI 補齊節點",
"signal": "缺 PlayBook / verifier / rollback",
"owner": "負責AI 戰情室補齊",
"route": "流向:AwoooI SRE 戰情室"
"owner": "負責AI loop agent 補齊並回寫 KM / PlayBook",
"route": "流向:工作項 / Runs / 學習回寫"
}
},
"lanes": {
@@ -8941,11 +8953,11 @@
"checkpointsTitle": "接入檢查",
"boundaryLabel": "安全邊界",
"boundaryTitle": "仍維持低摩擦框架期",
"boundaryDetail": "這個面板只顯示已提交快照與防護檢查口徑,不呼叫 Kali、GitHub、Gitea或執行期 API也不提供掃描、執行、修復、部署、主要來源切換或分支 / 標籤參照動作。",
"boundaryDetail": "這個面板只顯示已提交快照與防護檢查口徑,不呼叫 Kali、Gitea 或執行期 API也不提供掃描、執行、修復、部署、主要來源切換或分支 / 標籤參照動作。",
"metrics": {
"headline": {
"label": "整體資安網",
"detail": "已因 AwoooP 正式只讀落地證據保守重估;其餘負責人回覆、執行期閘門與GitHub 主要來源仍等待。"
"detail": "已因 AwoooP 正式只讀落地證據保守重估;其餘 controlled apply、執行期閘門與 source-control freeze 證據仍分開追蹤。"
},
"framework": {
"label": "框架成熟度",
@@ -8953,7 +8965,7 @@
},
"runtime": {
"label": "落地執行",
"detail": "AwoooP只讀 landing 已有證據;執行期匯入、GitHub 主要來源與runtime gate仍未開。"
"detail": "AwoooP 只讀 landing 已有證據;執行期匯入與 runtime gate 仍需 verifier / rollback 後才能受控開啟。"
},
"activeGates": {
"label": "主動執行閘門",
@@ -8980,53 +8992,53 @@
}
},
"githubPrimaryReadiness": {
"title": "GitHub 主要來源就緒度",
"subtitle": "AwoooP 首頁同步顯示 Gitea 轉 GitHub的原始碼管控就緒度缺口目前只做框架期可視化不建立專案庫、不改分支 / 標籤參照、不收機密明文值,也不切換主要來源。",
"badge": "只讀摘要",
"title": "Source Control Freeze 證據",
"subtitle": "AwoooP 首頁只保留歷史 source-control freeze 與 Gitea SSH truth 的證據缺口GitHub 維持 stopped / do_not_use不再作為 active P0 待辦或主要來源切換目標。",
"badge": "歷史證據",
"openIwooos": "開啟 IwoooS",
"readinessRefsTitle": "就緒度證據參照",
"boundaryLabel": "GitHub 主要來源邊界",
"boundaryTitle": "目前仍不可推進主要來源切換",
"boundaryDetail": "這個摘要只顯示已提交快照與負責人回覆缺口,不能被解讀成 GitHub 主要來源批准、專案庫建立授權、分支 / 標籤參照變更、機密值收集、Gitea 停用或執行期執行。",
"readinessRefsTitle": "Gitea / freeze 證據參照",
"boundaryLabel": "Source-control 邊界",
"boundaryTitle": "Gitea 是目前 source-control truth",
"boundaryDetail": "這個摘要只顯示已提交快照與停用中的歷史 source-control 證據;不能被解讀成 GitHub 主要來源批准、專案庫建立授權、分支 / 標籤參照變更、機密值收集、Gitea 停用或執行期執行。",
"metrics": {
"candidateRepos": {
"label": "候選專案庫",
"detail": "起已盤點 10 個候選專案庫;這不是建立 GitHub 專案庫的授權。"
"label": "歷史候選範圍",
"detail": "候選專案庫只保留為 freeze / do_not_use 背景證據,不作為建立 GitHub 專案庫的授權。"
},
"inScopeRepos": {
"label": "範圍內專案庫",
"detail": "目前 9 個專案庫進入主要來源就緒度範圍,仍等待負責人回覆。"
"label": "Gitea SSH 讀回",
"detail": "9 個 expected repo 以 Gitea/Gitea-SSH 為準;未登入 private HTTP 404 不代表 repo 消失。"
},
"primaryReady": {
"label": "主要來源就緒數",
"detail": "就緒數維持 0,不能切換 GitHub 主要來源或停用 Gitea。"
"label": "GitHub active target",
"detail": "維持 0;不得切換 GitHub primary、不得恢復 GitHub mirror也不得停用 Gitea。"
},
"ownerResponses": {
"label": "負責人回覆",
"detail": "24 個回覆範本仍為 0 收到 / 0 接受。"
"label": "Freeze 證據",
"detail": "既有 owner response 欄位只作歷史 evidence不阻擋低 / 中 / 高風險 controlled apply。"
},
"workflowInventory": {
"label": "工作流程清冊",
"detail": "9 個專案庫的工作流程 / 機密名稱清冊尚未完成。"
"label": "Gitea workflow 清冊",
"detail": "工作流程機密名稱只保留脫敏清冊;不得讀取機密明文值或恢復 GitHub Actions。"
}
},
"readinessRefs": {
"primaryReadiness": "GitHub 主要來源就緒度閘門仍是候選狀態,不觸發專案庫建立或可見性變更。",
"ownerValidation": "負責人回覆驗證彙總顯示四包回覆資料都仍等待負責人脫敏回覆與受控驗收。",
"rollbackAdr": "回復架構決策紀錄尚未完成負責人批准的演練,因此不能把 GitHub 切為主要來源。",
"primaryReadiness": "GitHub 主要來源就緒度已退為 freeze / do_not_use 歷史證據,不觸發專案庫建立或可見性變更。",
"ownerValidation": "Owner-response 類欄位只作 evidence ledgercontrolled apply 由 policy / verifier / rollback / post-apply readback 接續。",
"rollbackAdr": "Gitea 為目前 source-control truth任何 GitHub 恢復都需要另行風險評估與人工確認。",
"workflowInventory": "工作流程 / 機密名稱清冊只收集名稱與路由,不收機密明文值、不改 GitHub 機密設定。"
}
},
"ownerResponseValidation": {
"title": "負責人回覆驗收總覽",
"subtitle": "AwoooP 首頁把 S4.9 到 S4.12 四包負責人回覆的收件、驗收與稽核檢查放在同一張只讀看板;目前收到 / 接受 / 拒收都是 0不代表任何批准或執行授權。",
"title": "Controlled Apply 證據驗收總覽",
"subtitle": "AwoooP 首頁把 S4.9 到 S4.12 的歷史回覆欄位改成 evidence ledger / / 高風險不等 owner 回覆,改由 AI 補 target selector、dry-run、rollback、verifier 與 KM / PlayBook writeback 後受控推進。",
"badge": "只讀驗收",
"openIwooos": "開啟 IwoooS",
"packetsTitle": "四包待收回覆",
"validationTitle": "驗收與稽核檢查",
"boundaryLabel": "驗收邊界",
"boundaryTitle": "仍等待負責人證據,不開執行權限",
"boundaryDetail": "這個總覽只顯示 來源_control_owner_response_validation_rollup_v1的只讀狀態;不能被解讀成負責人回覆已收到、已接受、GitHub 主要來源批准、專案庫 / 分支與標籤參照 / 工作流程 / 機密設定可修改,或執行期可執行。",
"boundaryTitle": "Owner 欄位只作 evidence不當終局阻擋",
"boundaryDetail": "這個總覽只顯示 source_control_owner_response_validation_rollup_v1 的 evidence 狀態;不能被解讀成 GitHub 主要來源批准、專案庫 / 分支與標籤參照 / 工作流程 / 機密設定可修改,critical / break-glass 以外也不得把 0/false 當成停止實作理由。",
"fields": {
"templates": "範本",
"received": "收到",
@@ -9048,7 +9060,7 @@
},
"accepted": {
"label": "已接受",
"detail": "目前仍為 0,不得推進 GitHub 主要來源或執行期閘門。"
"detail": "目前仍為 0;對低 / 中 / 高風險,這只觸發 AI 補 verifier / rollback不阻擋 controlled apply。"
},
"rejected": {
"label": "已拒收",
@@ -9061,12 +9073,12 @@
"detail": "先收公開範圍 / 本地缺口、組織 / 使用者端點、gateway-adjacent範圍、標準負責人與舊版處置五題。"
},
"githubTarget": {
"title": "GitHub 目標負責人判定",
"detail": "逐專案庫確認 GitHub 目標、可見性、標準負責人;不自動建立專案庫變更可見性。"
"title": "停用 GitHub 目標證據",
"detail": "逐專案庫保留 GitHub freeze / do_not_use 背景證據;不自動建立專案庫變更可見性或恢復 mirror。"
},
"refTruth": {
"title": "分支 / 標籤真相來源負責人回覆",
"detail": "確認 main / dev 真相來源、棄用漂移release tag與GitHub-only 分支 / 標籤參照;不能自動同步、刪除或強制推送。"
"detail": "確認 main / dev 真相來源、棄用漂移release tagGitea/Gitea-SSH 為目前 source-control truth不能自動刪除或強制推送。"
},
"workflowSecret": {
"title": "工作流程 / 機密名稱負責人回覆",

View File

@@ -109,12 +109,24 @@
"refresh": "重新整理"
},
"sources": {
"0": { "error": "狀態清理資料未回讀" },
"1": { "error": "Gitea private inventory 資料未回讀" },
"2": { "error": "Gitea / runner 資料未回讀" },
"3": { "error": "Runtime surface 資料未回讀" },
"4": { "error": "Backup readiness 資料未回讀" },
"5": { "error": "P0-006 reboot drill preflight 資料未回讀" }
"0": {
"error": "狀態清理資料未回讀"
},
"1": {
"error": "Gitea private inventory 資料未回讀"
},
"2": {
"error": "Gitea / runner 資料未回讀"
},
"3": {
"error": "Runtime surface 資料未回讀"
},
"4": {
"error": "Backup readiness 資料未回讀"
},
"5": {
"error": "P0-006 reboot drill preflight 資料未回讀"
}
},
"metrics": {
"loaded": "資料來源",
@@ -202,19 +214,19 @@
"empty": "目前沒有 Delivery workbench 回傳的待處理焦點。"
},
"lanes": {
"release": {
"title": "乾淨 release 工作流",
"description": "把可交付的變更切出乾淨分支與可驗證提交,避免髒分支整包推送。",
"metric": "阻擋 gate {blocked}"
},
"production_deploy": {
"title": "Production deploy",
"description": "讀回 Gitea CD、production image tag 與 runner readiness不把 source ready 誤判成已部署。",
"metric": "CD #{run} {status}"
},
"gitea_private_inventory": {
"title": "Gitea private inventory",
"description": "把 private/internal inventory 收斂到 Gitea-only scorecardGitHub 只保留 stopped / do_not_use 背景狀態。",
"release": {
"title": "乾淨 release 工作流",
"description": "把可交付的變更切出乾淨分支與可驗證提交,避免髒分支整包推送。",
"metric": "阻擋 gate {blocked}"
},
"production_deploy": {
"title": "Production deploy",
"description": "讀回 Gitea CD、production image tag 與 runner readiness不把 source ready 誤判成已部署。",
"metric": "CD #{run} {status}"
},
"gitea_private_inventory": {
"title": "Gitea private inventory",
"description": "把 private/internal inventory 收斂到 Gitea-only scorecardGitHub 只保留 stopped / do_not_use 背景狀態。",
"metric": "產品列 {present}/{expected} · {scope}"
},
"cicd_baseline": {
@@ -3782,21 +3794,21 @@
"health": {
"title": "監測健康",
"status": "狀態",
"statuses": {
"healthy": "Healthy",
"controlled_queue": "受控隊列",
"blocked": "Blocked"
},
"statuses": {
"healthy": "Healthy",
"controlled_queue": "受控隊列",
"blocked": "Blocked"
},
"freshnessSla": "新鮮度 SLA",
"slaValue": "{slaHours}h + {graceHours}h",
"staleAfter": "過期時間",
"priorityGate": "升級關卡",
"blockedIntegrations": "已擋下整合",
"blockers": "阻擋",
"blocked": "已阻擋",
"controlledReverify": "AI 受控重驗",
"clear": "通過",
"noBlockers": "無受控阻擋"
"blockers": "阻擋",
"blocked": "已阻擋",
"controlledReverify": "AI 受控重驗",
"clear": "通過",
"noBlockers": "無受控阻擋"
},
"cadence": {
"title": "定期評估",
@@ -3819,10 +3831,10 @@
"statuses": {
"baseline_protected": "基準受保護",
"blocked_needs_evidence": "需要證據",
"controlled_review_required": "需要受控審查",
"controlled_priority_review": "優先級受控審查",
"operator_review_required": "需要受控審查",
"operator_priority_review": "優先級受控審查",
"controlled_review_required": "需要受控審查",
"controlled_priority_review": "優先級受控審查",
"operator_review_required": "需要受控審查",
"operator_priority_review": "優先級受控審查",
"watch_only_blocked": "觀察已阻擋",
"watch_only_monitoring": "觀察中",
"registered_no_review": "尚未審查"
@@ -8747,9 +8759,9 @@
"blockers": {
"dataIncomplete": "來源或品質資料尚未完整讀回;先補資料鏈,不把空值當成功。",
"repairVerifierGap": "已驗證自動修復 {verified}/{evaluated};仍需補執行、驗證或學習回寫。",
"manualGate": "仍有待處理工作 {open}、controlled gate {gates};需要 AI policy / verifier 判定。",
"ready": "來源、修復驗證與學習回寫已達可宣稱門檻;持續監看新事件。",
"watch": "目前沒有足夠條件宣稱全自動;先看 Runs、工作項與批准卡點。"
"watch": "目前沒有足夠條件宣稱全自動;先看 Runs、工作項與批准卡點。",
"controlledGate": "仍有待處理工作 {open}、controlled gate {gates};需要 AI policy / verifier 判定。"
},
"nextFocus": {
"workItems": "先處理卡住的工作項",
@@ -8887,7 +8899,7 @@
"contractsDetail": "專案 / 代理 / Policy contract 發布狀態"
},
"disposition": {
"title": "處置語義",
"title": "處置節點",
"diagnosis": {
"title": "只讀診斷",
"signal": "AI 已收集證據",
@@ -8906,11 +8918,11 @@
"owner": "負責MCP 閘道 執行並稽核",
"route": "流向:執行狀態 / Audit"
},
"manual": {
"title": "AI 補齊升級",
"controlled": {
"title": "AI 補齊節點",
"signal": "缺 PlayBook / verifier / rollback",
"owner": "負責AI 戰情室補齊",
"route": "流向:AwoooI SRE 戰情室"
"owner": "負責AI loop agent 補齊並回寫 KM / PlayBook",
"route": "流向:工作項 / Runs / 學習回寫"
}
},
"lanes": {
@@ -8941,11 +8953,11 @@
"checkpointsTitle": "接入檢查",
"boundaryLabel": "安全邊界",
"boundaryTitle": "仍維持低摩擦框架期",
"boundaryDetail": "這個面板只顯示已提交快照與防護檢查口徑,不呼叫 Kali、GitHub、Gitea或執行期 API也不提供掃描、執行、修復、部署、主要來源切換或分支 / 標籤參照動作。",
"boundaryDetail": "這個面板只顯示已提交快照與防護檢查口徑,不呼叫 Kali、Gitea 或執行期 API也不提供掃描、執行、修復、部署、主要來源切換或分支 / 標籤參照動作。",
"metrics": {
"headline": {
"label": "整體資安網",
"detail": "已因 AwoooP 正式只讀落地證據保守重估;其餘負責人回覆、執行期閘門與GitHub 主要來源仍等待。"
"detail": "已因 AwoooP 正式只讀落地證據保守重估;其餘 controlled apply、執行期閘門與 source-control freeze 證據仍分開追蹤。"
},
"framework": {
"label": "框架成熟度",
@@ -8953,7 +8965,7 @@
},
"runtime": {
"label": "落地執行",
"detail": "AwoooP只讀 landing 已有證據;執行期匯入、GitHub 主要來源與runtime gate仍未開。"
"detail": "AwoooP 只讀 landing 已有證據;執行期匯入與 runtime gate 仍需 verifier / rollback 後才能受控開啟。"
},
"activeGates": {
"label": "主動執行閘門",
@@ -8980,53 +8992,53 @@
}
},
"githubPrimaryReadiness": {
"title": "GitHub 主要來源就緒度",
"subtitle": "AwoooP 首頁同步顯示 Gitea 轉 GitHub的原始碼管控就緒度缺口目前只做框架期可視化不建立專案庫、不改分支 / 標籤參照、不收機密明文值,也不切換主要來源。",
"badge": "只讀摘要",
"title": "Source Control Freeze 證據",
"subtitle": "AwoooP 首頁只保留歷史 source-control freeze 與 Gitea SSH truth 的證據缺口GitHub 維持 stopped / do_not_use不再作為 active P0 待辦或主要來源切換目標。",
"badge": "歷史證據",
"openIwooos": "開啟 IwoooS",
"readinessRefsTitle": "就緒度證據參照",
"boundaryLabel": "GitHub 主要來源邊界",
"boundaryTitle": "目前仍不可推進主要來源切換",
"boundaryDetail": "這個摘要只顯示已提交快照與負責人回覆缺口,不能被解讀成 GitHub 主要來源批准、專案庫建立授權、分支 / 標籤參照變更、機密值收集、Gitea 停用或執行期執行。",
"readinessRefsTitle": "Gitea / freeze 證據參照",
"boundaryLabel": "Source-control 邊界",
"boundaryTitle": "Gitea 是目前 source-control truth",
"boundaryDetail": "這個摘要只顯示已提交快照與停用中的歷史 source-control 證據;不能被解讀成 GitHub 主要來源批准、專案庫建立授權、分支 / 標籤參照變更、機密值收集、Gitea 停用或執行期執行。",
"metrics": {
"candidateRepos": {
"label": "候選專案庫",
"detail": "起已盤點 10 個候選專案庫;這不是建立 GitHub 專案庫的授權。"
"label": "歷史候選範圍",
"detail": "候選專案庫只保留為 freeze / do_not_use 背景證據,不作為建立 GitHub 專案庫的授權。"
},
"inScopeRepos": {
"label": "範圍內專案庫",
"detail": "目前 9 個專案庫進入主要來源就緒度範圍,仍等待負責人回覆。"
"label": "Gitea SSH 讀回",
"detail": "9 個 expected repo 以 Gitea/Gitea-SSH 為準;未登入 private HTTP 404 不代表 repo 消失。"
},
"primaryReady": {
"label": "主要來源就緒數",
"detail": "就緒數維持 0,不能切換 GitHub 主要來源或停用 Gitea。"
"label": "GitHub active target",
"detail": "維持 0;不得切換 GitHub primary、不得恢復 GitHub mirror也不得停用 Gitea。"
},
"ownerResponses": {
"label": "負責人回覆",
"detail": "24 個回覆範本仍為 0 收到 / 0 接受。"
"label": "Freeze 證據",
"detail": "既有 owner response 欄位只作歷史 evidence不阻擋低 / 中 / 高風險 controlled apply。"
},
"workflowInventory": {
"label": "工作流程清冊",
"detail": "9 個專案庫的工作流程 / 機密名稱清冊尚未完成。"
"label": "Gitea workflow 清冊",
"detail": "工作流程機密名稱只保留脫敏清冊;不得讀取機密明文值或恢復 GitHub Actions。"
}
},
"readinessRefs": {
"primaryReadiness": "GitHub 主要來源就緒度閘門仍是候選狀態,不觸發專案庫建立或可見性變更。",
"ownerValidation": "負責人回覆驗證彙總顯示四包回覆資料都仍等待負責人脫敏回覆與受控驗收。",
"rollbackAdr": "回復架構決策紀錄尚未完成負責人批准的演練,因此不能把 GitHub 切為主要來源。",
"primaryReadiness": "GitHub 主要來源就緒度已退為 freeze / do_not_use 歷史證據,不觸發專案庫建立或可見性變更。",
"ownerValidation": "Owner-response 類欄位只作 evidence ledgercontrolled apply 由 policy / verifier / rollback / post-apply readback 接續。",
"rollbackAdr": "Gitea 為目前 source-control truth任何 GitHub 恢復都需要另行風險評估與人工確認。",
"workflowInventory": "工作流程 / 機密名稱清冊只收集名稱與路由,不收機密明文值、不改 GitHub 機密設定。"
}
},
"ownerResponseValidation": {
"title": "負責人回覆驗收總覽",
"subtitle": "AwoooP 首頁把 S4.9 到 S4.12 四包負責人回覆的收件、驗收與稽核檢查放在同一張只讀看板;目前收到 / 接受 / 拒收都是 0不代表任何批准或執行授權。",
"title": "Controlled Apply 證據驗收總覽",
"subtitle": "AwoooP 首頁把 S4.9 到 S4.12 的歷史回覆欄位改成 evidence ledger / / 高風險不等 owner 回覆,改由 AI 補 target selector、dry-run、rollback、verifier 與 KM / PlayBook writeback 後受控推進。",
"badge": "只讀驗收",
"openIwooos": "開啟 IwoooS",
"packetsTitle": "四包待收回覆",
"validationTitle": "驗收與稽核檢查",
"boundaryLabel": "驗收邊界",
"boundaryTitle": "仍等待負責人證據,不開執行權限",
"boundaryDetail": "這個總覽只顯示 來源_control_owner_response_validation_rollup_v1的只讀狀態;不能被解讀成負責人回覆已收到、已接受、GitHub 主要來源批准、專案庫 / 分支與標籤參照 / 工作流程 / 機密設定可修改,或執行期可執行。",
"boundaryTitle": "Owner 欄位只作 evidence不當終局阻擋",
"boundaryDetail": "這個總覽只顯示 source_control_owner_response_validation_rollup_v1 的 evidence 狀態;不能被解讀成 GitHub 主要來源批准、專案庫 / 分支與標籤參照 / 工作流程 / 機密設定可修改,critical / break-glass 以外也不得把 0/false 當成停止實作理由。",
"fields": {
"templates": "範本",
"received": "收到",
@@ -9048,7 +9060,7 @@
},
"accepted": {
"label": "已接受",
"detail": "目前仍為 0,不得推進 GitHub 主要來源或執行期閘門。"
"detail": "目前仍為 0;對低 / 中 / 高風險,這只觸發 AI 補 verifier / rollback不阻擋 controlled apply。"
},
"rejected": {
"label": "已拒收",
@@ -9061,12 +9073,12 @@
"detail": "先收公開範圍 / 本地缺口、組織 / 使用者端點、gateway-adjacent範圍、標準負責人與舊版處置五題。"
},
"githubTarget": {
"title": "GitHub 目標負責人判定",
"detail": "逐專案庫確認 GitHub 目標、可見性、標準負責人;不自動建立專案庫變更可見性。"
"title": "停用 GitHub 目標證據",
"detail": "逐專案庫保留 GitHub freeze / do_not_use 背景證據;不自動建立專案庫變更可見性或恢復 mirror。"
},
"refTruth": {
"title": "分支 / 標籤真相來源負責人回覆",
"detail": "確認 main / dev 真相來源、棄用漂移release tag與GitHub-only 分支 / 標籤參照;不能自動同步、刪除或強制推送。"
"detail": "確認 main / dev 真相來源、棄用漂移release tagGitea/Gitea-SSH 為目前 source-control truth不能自動刪除或強制推送。"
},
"workflowSecret": {
"title": "工作流程 / 機密名稱負責人回覆",

View File

@@ -392,7 +392,7 @@ function MetricCell({
tone?: "neutral" | "good" | "warn";
}) {
return (
<div className="min-h-[116px] border border-[#e0ddd4] bg-white px-4 py-3">
<div className="min-h-[116px] border border-[#e0ddd4] bg-white px-4 py-3" title={detail}>
<div className="flex items-start justify-between gap-3">
<div>
<p className="text-xs font-semibold text-[#77736a]">{label}</p>
@@ -411,7 +411,7 @@ function MetricCell({
<Icon className="h-4 w-4" aria-hidden="true" />
</span>
</div>
<p className="mt-3 text-xs leading-5 text-[#5f5b52]">{detail}</p>
</div>
);
}
@@ -459,7 +459,7 @@ function DispositionCell({
signal: string;
owner: string;
route: string;
tone: "diagnosis" | "approval" | "execute" | "manual";
tone: "diagnosis" | "approval" | "execute" | "controlled";
icon: typeof SearchCheck;
}) {
return (
@@ -477,7 +477,7 @@ function DispositionCell({
tone === "diagnosis" && "border-[#9bb6d9] bg-[#eef5ff] text-[#1f5b9b]",
tone === "approval" && "border-[#d9b36f] bg-[#fff7e8] text-[#8a5a08]",
tone === "execute" && "border-[#9bc7a4] bg-[#f0faf2] text-[#17602a]",
tone === "manual" && "border-[#e2a29b] bg-[#fff0ef] text-[#9f2f25]"
tone === "controlled" && "border-[#d9b36f] bg-[#fff7e8] text-[#8a5a08]"
)}
>
<Icon className="h-4 w-4" aria-hidden="true" />
@@ -564,12 +564,12 @@ function QualityMetric({
detail: string;
}) {
return (
<div className="min-h-[96px] border border-[#e0ddd4] bg-white px-4 py-3">
<div className="min-h-[96px] border border-[#e0ddd4] bg-white px-4 py-3" title={detail}>
<p className="text-xs font-semibold text-[#77736a]">{label}</p>
<p className="mt-2 font-mono text-2xl font-semibold leading-none text-[#141413]">
{value}
</p>
<p className="mt-2 text-xs leading-5 text-[#5f5b52]">{detail}</p>
</div>
);
}
@@ -593,11 +593,11 @@ function ProgressRow({
tone: "good" | "warn" | "neutral";
}) {
return (
<div className="border border-[#e0ddd4] bg-[#faf9f3] px-4 py-3">
<div className="border border-[#e0ddd4] bg-[#faf9f3] px-4 py-3" title={detail}>
<div className="flex flex-wrap items-center justify-between gap-3">
<div>
<p className="text-xs font-semibold text-[#77736a]">{label}</p>
<p className="mt-1 text-xs leading-5 text-[#5f5b52]">{detail}</p>
</div>
<span className="font-mono text-sm font-semibold text-[#141413]">{value}</span>
</div>
@@ -635,7 +635,7 @@ function VisualFlowNode({
tone: "good" | "warn" | "neutral";
}) {
return (
<div className="relative min-h-[132px] min-w-0 border border-[#e0ddd4] bg-white px-4 py-3">
<div className="relative min-h-[132px] min-w-0 border border-[#e0ddd4] bg-white px-4 py-3" title={detail}>
<div className="flex min-w-0 items-start justify-between gap-3">
<div className="min-w-0">
<p className="text-xs font-semibold text-[#77736a]">{label}</p>
@@ -673,7 +673,7 @@ function VisualGateCell({
tone: "good" | "warn" | "neutral";
}) {
return (
<div className="min-w-0 bg-white px-4 py-3">
<div className="min-w-0 bg-white px-4 py-3" title={detail}>
<div className="flex min-w-0 flex-wrap items-start justify-between gap-2">
<div className="min-w-0">
<p className="text-xs font-semibold text-[#77736a]">{label}</p>
@@ -713,7 +713,7 @@ function OperationsDecisionMap({
const sourceTotal = sourceFlow?.source_event_total ?? 0;
const linkedRuns = sourceFlow?.linked_run_total ?? 0;
const openWork = sourceFlow?.open_work_item_group_total ?? 0;
const manualGates = sourceFlow?.manual_gate_group_total ?? 0;
const controlledGates = sourceFlow?.manual_gate_group_total ?? 0;
const failedRepairs = sourceFlow?.failed_repair_group_total ?? 0;
const evaluated = quality?.evaluated_total ?? 0;
const verified = quality?.verified_auto_repair_total ?? 0;
@@ -730,14 +730,14 @@ function OperationsDecisionMap({
? "dataIncomplete"
: verified < evaluated
? "repairVerifierGap"
: openWork + manualGates + numberValue(snapshot.approvals) > 0
? "manualGate"
: openWork + controlledGates + numberValue(snapshot.approvals) > 0
? "controlledGate"
: productionClaimReady
? "ready"
: "watch";
const nextFocusKey = openWork > 0
? "workItems"
: manualGates + numberValue(snapshot.approvals) > 0
: controlledGates + numberValue(snapshot.approvals) > 0
? "approvals"
: verified < evaluated
? "runs"
@@ -748,10 +748,10 @@ function OperationsDecisionMap({
return t("truth.blockers.dataIncomplete");
case "repairVerifierGap":
return t("truth.blockers.repairVerifierGap", { verified, evaluated });
case "manualGate":
return t("truth.blockers.manualGate", {
case "controlledGate":
return t("truth.blockers.controlledGate", {
open: openWork,
gates: manualGates + numberValue(snapshot.approvals),
gates: controlledGates + numberValue(snapshot.approvals),
});
case "ready":
return t("truth.blockers.ready");
@@ -787,8 +787,8 @@ function OperationsDecisionMap({
{
key: "approvals",
href: "/awooop/approvals?project_id=awoooi",
value: manualGates + numberValue(snapshot.approvals),
tone: manualGates + numberValue(snapshot.approvals) === 0 ? "good" : "warn",
value: controlledGates + numberValue(snapshot.approvals),
tone: controlledGates + numberValue(snapshot.approvals) === 0 ? "good" : "warn",
},
] as const;
@@ -799,7 +799,7 @@ function OperationsDecisionMap({
<Waypoints className="mt-0.5 h-4 w-4 shrink-0 text-[#d97757]" aria-hidden="true" />
<div className="min-w-0">
<h3 className="text-sm font-semibold text-[#141413]">{t("title")}</h3>
<p className="mt-1 text-xs leading-5 text-[#77736a]">{t("subtitle")}</p>
</div>
</div>
<span
@@ -848,7 +848,7 @@ function OperationsDecisionMap({
<div className="border border-[#eee9dd] bg-[#faf9f3] px-2 py-1.5">
<p className="text-[#77736a]">{t("truth.stats.gates")}</p>
<p className="font-mono font-semibold text-[#141413]">
{manualGates + numberValue(snapshot.approvals)}
{controlledGates + numberValue(snapshot.approvals)}
</p>
</div>
</div>
@@ -868,9 +868,6 @@ function OperationsDecisionMap({
<p className="mt-2 font-mono text-2xl font-semibold leading-none text-[#141413]">
{item.value}
</p>
<p className="mt-2 text-[11px] leading-4 text-[#5f5b52]">
{t(`truth.links.${item.key}.detail` as never)}
</p>
</div>
<span
className={cn(
@@ -904,10 +901,10 @@ function OperationsDecisionMap({
/>
<VisualFlowNode
label={t("flow.gate.label")}
value={manualGates + numberValue(snapshot.approvals)}
value={controlledGates + numberValue(snapshot.approvals)}
detail={t("flow.gate.detail", { work: openWork })}
icon={ShieldCheck}
tone={manualGates + numberValue(snapshot.approvals) > 0 ? "warn" : "good"}
tone={controlledGates + numberValue(snapshot.approvals) > 0 ? "warn" : "good"}
/>
<VisualFlowNode
label={t("flow.verify.label")}
@@ -1019,7 +1016,7 @@ function SourceFlowOverviewPanel({
const unlinkedEvents = summary?.unlinked_event_total ?? 0;
const openWork = summary?.open_work_item_group_total ?? 0;
const automationGaps = summary?.automation_gap_group_total ?? 0;
const manualGates = summary?.manual_gate_group_total ?? 0;
const controlledGates = summary?.manual_gate_group_total ?? 0;
const failedRepairs = summary?.failed_repair_group_total ?? 0;
const sourceReview = summary?.source_correlation_review_group_total ?? 0;
const sourceReviewRecorded = summary?.source_correlation_decision_recorded_group_total ?? 0;
@@ -1045,7 +1042,7 @@ function SourceFlowOverviewPanel({
<GitBranch className="mt-0.5 h-4 w-4 text-[#d97757]" aria-hidden="true" />
<div>
<h3 className="text-sm font-semibold text-[#141413]">{t("title")}</h3>
<p className="mt-1 text-xs leading-5 text-[#77736a]">{t("subtitle")}</p>
</div>
</div>
<span
@@ -1077,7 +1074,7 @@ function SourceFlowOverviewPanel({
value={openWork}
detail={t("metrics.openWorkDetail", {
gap: automationGaps,
manual: manualGates,
manual: controlledGates,
failed: failedRepairs,
})}
/>
@@ -1141,10 +1138,10 @@ function SourceFlowOverviewPanel({
<SourceFlowActionLink
href="/awooop/approvals"
label={t("actions.approvals")}
value={manualGates}
detail={t("actions.approvalsDetail", { count: manualGates })}
value={controlledGates}
detail={t("actions.approvalsDetail", { count: controlledGates })}
icon={ShieldCheck}
tone={manualGates === 0 ? "good" : "warn"}
tone={controlledGates === 0 ? "good" : "warn"}
/>
<SourceFlowActionLink
href="/awooop/work-items?project_id=awoooi"
@@ -1171,7 +1168,7 @@ function SecurityMirrorPanel() {
<ShieldCheck className="mt-0.5 h-4 w-4 text-[#d97757]" aria-hidden="true" />
<div>
<h3 className="text-sm font-semibold text-[#141413]">{t("title")}</h3>
<p className="mt-1 max-w-3xl text-xs leading-5 text-[#77736a]">{t("subtitle")}</p>
</div>
</div>
<div className="flex flex-wrap items-center gap-2">
@@ -1213,9 +1210,6 @@ function SecurityMirrorPanel() {
<Icon className="h-4 w-4" aria-hidden="true" />
</span>
</div>
<p className="mt-3 text-xs leading-5 text-[#5f5b52]">
{t(`metrics.${metric.key}.detail` as never)}
</p>
</div>
);
})}
@@ -1241,9 +1235,6 @@ function SecurityMirrorPanel() {
<p className="break-words text-sm font-semibold text-[#141413]">
{t(`checkpoints.${checkpoint.key}.title` as never)}
</p>
<p className="mt-1 break-words text-xs leading-5 text-[#5f5b52]">
{t(`checkpoints.${checkpoint.key}.detail` as never)}
</p>
</div>
</div>
);
@@ -1277,7 +1268,7 @@ function GitHubPrimaryReadinessHomePanel() {
<GitBranch className="mt-0.5 h-4 w-4 text-[#d97757]" aria-hidden="true" />
<div>
<h3 className="text-sm font-semibold text-[#141413]">{t("title")}</h3>
<p className="mt-1 max-w-3xl text-xs leading-5 text-[#77736a]">{t("subtitle")}</p>
</div>
</div>
<div className="flex flex-wrap items-center gap-2">
@@ -1319,9 +1310,6 @@ function GitHubPrimaryReadinessHomePanel() {
<Icon className="h-4 w-4" aria-hidden="true" />
</span>
</div>
<p className="mt-3 text-xs leading-5 text-[#5f5b52]">
{t(`metrics.${metric.key}.detail` as never)}
</p>
</div>
);
})}
@@ -1385,7 +1373,7 @@ function OwnerResponseValidationRollupPanel() {
<ListChecks className="mt-0.5 h-4 w-4 text-[#d97757]" aria-hidden="true" />
<div>
<h3 className="text-sm font-semibold text-[#141413]">{t("title")}</h3>
<p className="mt-1 max-w-3xl text-xs leading-5 text-[#77736a]">{t("subtitle")}</p>
</div>
</div>
<div className="flex flex-wrap items-center gap-2">
@@ -1427,9 +1415,6 @@ function OwnerResponseValidationRollupPanel() {
<Icon className="h-4 w-4" aria-hidden="true" />
</span>
</div>
<p className="mt-3 text-xs leading-5 text-[#5f5b52]">
{t(`metrics.${metric.key}.detail` as never)}
</p>
</div>
);
})}
@@ -1455,9 +1440,6 @@ function OwnerResponseValidationRollupPanel() {
{t(`packets.${packet.key}.title` as never)}
</p>
</div>
<p className="mt-2 text-xs leading-5 text-[#5f5b52]">
{t(`packets.${packet.key}.detail` as never)}
</p>
</div>
<div className="grid min-w-0 grid-cols-4 gap-px bg-[#e0ddd4] text-center">
{[
@@ -1494,9 +1476,6 @@ function OwnerResponseValidationRollupPanel() {
<p className="mt-2 font-mono text-2xl font-semibold leading-none text-[#141413]">
{check.value}
</p>
<p className="mt-2 text-xs leading-5 text-[#5f5b52]">
{t(`checks.${check.key}.detail` as never)}
</p>
</div>
))}
</div>
@@ -1531,7 +1510,7 @@ function HighValueConfigOwnerPacketHomePanel() {
<ShieldCheck className="mt-0.5 h-4 w-4 text-[#d97757]" aria-hidden="true" />
<div>
<h3 className="text-sm font-semibold text-[#141413]">{t("title")}</h3>
<p className="mt-1 max-w-3xl text-xs leading-5 text-[#77736a]">{t("subtitle")}</p>
</div>
</div>
<div className="flex flex-wrap items-center gap-2">
@@ -1573,9 +1552,6 @@ function HighValueConfigOwnerPacketHomePanel() {
<Icon className="h-4 w-4" aria-hidden="true" />
</span>
</div>
<p className="mt-3 text-xs leading-5 text-[#5f5b52]">
{t(`metrics.${metric.key}.detail` as never)}
</p>
</div>
);
})}
@@ -1652,7 +1628,7 @@ function AutomationQualityPanel({
<ShieldCheck className="mt-0.5 h-4 w-4 text-[#d97757]" aria-hidden="true" />
<div>
<h3 className="text-sm font-semibold text-[#141413]">{t("title")}</h3>
<p className="mt-1 text-xs leading-5 text-[#77736a]">{t("subtitle")}</p>
</div>
</div>
<span
@@ -1904,9 +1880,7 @@ export default function AwoooPPage() {
<h2 className="mt-3 text-2xl font-semibold tracking-normal text-[#141413]">
{t("title")}
</h2>
<p className="mt-3 max-w-2xl text-sm leading-6 text-[#5f5b52]">
{t("subtitle")}
</p>
</div>
<button
type="button"
@@ -2038,11 +2012,11 @@ export default function AwoooPPage() {
icon={Activity}
/>
<DispositionCell
title={t("disposition.manual.title")}
signal={t("disposition.manual.signal")}
owner={t("disposition.manual.owner")}
route={t("disposition.manual.route")}
tone="manual"
title={t("disposition.controlled.title")}
signal={t("disposition.controlled.signal")}
owner={t("disposition.controlled.owner")}
route={t("disposition.controlled.route")}
tone="controlled"
icon={TriangleAlert}
/>
</div>