diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index 66deb59f..b9630a8d 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -9076,7 +9076,7 @@ "aiLoopLogSources": { "eyebrow": "P0 visual state", "title": "Current blocker and repair intake", - "subtitle": "Shows the blocker, SSH diagnosis, and receipt contract first; technical fields are collapsed so the workbench does not read like a long text list.", + "subtitle": "Shows the blocker, blocker diagnosis, and receipt contract first; technical fields are collapsed so the workbench does not read like a long text list.", "loading": "Loading LOG source labels", "empty": "No LOG source labels read back yet.", "blocker": "Current blocker: {value}", @@ -9084,7 +9084,7 @@ "details": "Expand technical fields", "visual": { "blocker": "Current blocker", - "diagnosis": "SSH diagnosis", + "diagnosis": "Blocker diagnosis", "receipt": "Receipt contract", "receiptValue": "{inputs} inputs / {outputs} outputs", "currentCd": "Latest CD run", @@ -9094,8 +9094,23 @@ "rootCause": { "sessionTimeout": "Key accepted, session timeout", "offerTimeout": "Publickey offer timeout", + "controlledCdLaneGuardrails": "SSH control path and Harbor v2 are readable; controlled CD lane guardrails are still blocked.", "unknown": "Waiting for queue diagnosis" }, + "phases": { + "ssh": { + "label": "SSH control path", + "value": "ready" + }, + "harbor": { + "label": "Harbor v2", + "value": "ready" + }, + "cdLane": { + "label": "Controlled CD lane", + "value": "guardrails blocked" + } + }, "metrics": { "tags": "Tags", "groups": "Groups", diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index c4de46ea..1dd07bd3 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -9076,7 +9076,7 @@ "aiLoopLogSources": { "eyebrow": "P0 視覺狀態", "title": "目前卡點與修復收件", - "subtitle": "先顯示目前真正卡住的 blocker、SSH 診斷與收件契約;技術欄位收在展開區,避免把工作台變成長文字清單。", + "subtitle": "先顯示目前真正卡住的 blocker、阻塞診斷與收件契約;技術欄位收在展開區,避免把工作台變成長文字清單。", "loading": "讀取 LOG 來源貼標中", "empty": "尚未讀回 LOG 來源貼標。", "blocker": "Current blocker:{value}", @@ -9084,7 +9084,7 @@ "details": "展開技術欄位", "visual": { "blocker": "目前卡點", - "diagnosis": "SSH 診斷", + "diagnosis": "阻塞診斷", "receipt": "收件契約", "receiptValue": "{inputs} inputs / {outputs} outputs", "currentCd": "最新 CD run", @@ -9094,8 +9094,23 @@ "rootCause": { "sessionTimeout": "Key accepted,session timeout", "offerTimeout": "Publickey offer timeout", + "controlledCdLaneGuardrails": "SSH 控制通道與 Harbor v2 已可讀;目前卡在 controlled CD lane guardrails。", "unknown": "等待 queue 診斷" }, + "phases": { + "ssh": { + "label": "SSH 控制通道", + "value": "ready" + }, + "harbor": { + "label": "Harbor v2", + "value": "ready" + }, + "cdLane": { + "label": "Controlled CD lane", + "value": "guardrails blocked" + } + }, "metrics": { "tags": "Tags", "groups": "分群鍵", diff --git a/apps/web/src/app/[locale]/awooop/work-items/page.tsx b/apps/web/src/app/[locale]/awooop/work-items/page.tsx index f9621941..c99346ea 100644 --- a/apps/web/src/app/[locale]/awooop/work-items/page.tsx +++ b/apps/web/src/app/[locale]/awooop/work-items/page.tsx @@ -7851,6 +7851,9 @@ function AiLoopLogSourceTagsPanel({ summary?.ai_loop_current_blocker_deployment_closure_state ?? evidence?.ai_loop_current_blocker_deployment_closure_state ?? ""; + const currentBlockerId = summary?.ai_loop_current_blocker_id ?? ""; + const controlledCdLaneGuardrailsBlocked = + currentBlockerId === "controlled_cd_lane_guardrails_blocked"; const labelMap: Record = { project_id: t("tagLabels.projectId"), product: t("tagLabels.product"), @@ -7916,19 +7919,44 @@ function AiLoopLogSourceTagsPanel({ : queueNormalizerFieldIds.some((id) => id.includes("publickey_offer_timeout")) ? t("rootCause.offerTimeout") : t("rootCause.unknown"); + const blockerDiagnosis = controlledCdLaneGuardrailsBlocked + ? t("rootCause.controlledCdLaneGuardrails") + : rootCause; + const controlledCdLanePhases = controlledCdLaneGuardrailsBlocked + ? [ + { + key: "ssh-control-path", + label: t("phases.ssh.label"), + value: t("phases.ssh.value"), + tone: "border-[#b9d9c2] bg-[#f2fbf3] text-[#236332]", + }, + { + key: "harbor-v2", + label: t("phases.harbor.label"), + value: t("phases.harbor.value"), + tone: "border-[#b9d9c2] bg-[#f2fbf3] text-[#236332]", + }, + { + key: "controlled-cd-lane", + label: t("phases.cdLane.label"), + value: t("phases.cdLane.value"), + tone: "border-[#f0c6a8] bg-[#fff8f1] text-[#9a4d16]", + }, + ] + : []; const visualCards = [ { key: "blocker", icon: TriangleAlert, label: t("visual.blocker"), - value: summary?.ai_loop_current_blocker_id ?? "--", + value: currentBlockerId || "--", tone: "border-[#f0c6a8] bg-[#fff8f1] text-[#9a4d16]", }, { key: "diagnosis", icon: SearchCheck, label: t("visual.diagnosis"), - value: rootCause, + value: blockerDiagnosis, tone: "border-[#c9d8ea] bg-[#eef5ff] text-[#1f5b9b]", }, { @@ -8025,6 +8053,29 @@ function AiLoopLogSourceTagsPanel({ ); })} + {controlledCdLanePhases.length > 0 ? ( +
+ {controlledCdLanePhases.map((phase) => ( +
+
+ {phase.label} +
+
+ {loading ? "--" : phase.value} +
+
+ ))} +
+ ) : null}
{metrics.map((metric) => { const Icon = metric.icon;