feat(iwooos): show controlled cd lane live metric proof
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 1s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Failing after 42s
CD Pipeline / build-and-deploy (push) Has been skipped
CD Pipeline / post-deploy-checks (push) Has been skipped

This commit is contained in:
Your Name
2026-07-02 12:46:51 +08:00
parent f426610d83
commit e7cf3f2aad
6 changed files with 508 additions and 1 deletions

View File

@@ -9111,6 +9111,20 @@
"value": "guardrails blocked"
}
},
"liveMetrics": {
"enforcer": "110 enforcer",
"ready": "metric fresh",
"missing": "metric missing",
"enforcerDetail": "apply={apply} · metadata-only={metadata}",
"drainGuard": "Drain guard",
"drainGuardValue": "active={active} / staging={staging}",
"blockers": "blockers={count}",
"jobs": "Jobs / lane",
"jobsValue": "jobs={jobs} / lane={lane}",
"restoreSources": "restore sources={count}",
"load": "110 load",
"loadValue": "load5/core={value}"
},
"metrics": {
"tags": "Tags",
"groups": "Groups",

View File

@@ -9111,6 +9111,20 @@
"value": "guardrails blocked"
}
},
"liveMetrics": {
"enforcer": "110 enforcer",
"ready": "metric 已更新",
"missing": "metric 未讀回",
"enforcerDetail": "apply={apply} · metadata-only={metadata}",
"drainGuard": "Drain guard",
"drainGuardValue": "active={active} / staging={staging}",
"blockers": "阻塞={count}",
"jobs": "Jobs / lane",
"jobsValue": "jobs={jobs} / lane={lane}",
"restoreSources": "restore sources={count}",
"load": "110 load",
"loadValue": "load5/core={value}"
},
"metrics": {
"tags": "Tags",
"groups": "分群鍵",

View File

@@ -1046,6 +1046,21 @@ type PriorityWorkOrderResponse = {
ai_loop_current_blocker_safe_next_action_command?: string | null;
ai_loop_current_blocker_safe_next_action_post_verifier?: string | null;
ai_loop_current_blocker_safe_next_action_requires_local_console?: boolean | null;
controlled_cd_lane_live_metric_status?: string | null;
controlled_cd_lane_live_metric_metadata_only?: boolean | null;
controlled_cd_lane_live_enforcer_metric_present?: boolean | null;
controlled_cd_lane_live_enforcer_last_run_fresh?: boolean | null;
controlled_cd_lane_live_enforcer_apply_performed?: number | null;
controlled_cd_lane_live_active_job_containers?: number | null;
controlled_cd_lane_live_lane_process_count?: number | null;
controlled_cd_lane_live_root_restore_sources_left?: number | null;
controlled_cd_lane_live_controlled_drain_active_allowed?: boolean | null;
controlled_cd_lane_live_controlled_drain_staging_allowed?: boolean | null;
controlled_cd_lane_live_host_load5_per_core?: number | null;
controlled_cd_lane_live_gitea_actions_active_container_count?: number | null;
controlled_cd_lane_live_gitea_actions_active_process_count?: number | null;
controlled_cd_lane_live_metric_blocker_count?: number | null;
controlled_cd_lane_live_metric_blockers?: string[] | null;
ai_loop_log_source_grouping_key_count?: number | null;
ai_loop_log_source_grouping_keys?: string[] | null;
ai_loop_log_source_tagging_contract_count?: number | null;
@@ -1066,6 +1081,21 @@ type PriorityWorkOrderResponse = {
ai_loop_current_blocker_safe_next_action_command?: string | null;
ai_loop_current_blocker_safe_next_action_post_verifier?: string | null;
ai_loop_current_blocker_safe_next_action_requires_local_console?: boolean | null;
controlled_cd_lane_live_metric_status?: string | null;
controlled_cd_lane_live_metric_metadata_only?: boolean | null;
controlled_cd_lane_live_enforcer_metric_present?: boolean | null;
controlled_cd_lane_live_enforcer_last_run_fresh?: boolean | null;
controlled_cd_lane_live_enforcer_apply_performed?: number | null;
controlled_cd_lane_live_active_job_containers?: number | null;
controlled_cd_lane_live_lane_process_count?: number | null;
controlled_cd_lane_live_root_restore_sources_left?: number | null;
controlled_cd_lane_live_controlled_drain_active_allowed?: boolean | null;
controlled_cd_lane_live_controlled_drain_staging_allowed?: boolean | null;
controlled_cd_lane_live_host_load5_per_core?: number | null;
controlled_cd_lane_live_gitea_actions_active_container_count?: number | null;
controlled_cd_lane_live_gitea_actions_active_process_count?: number | null;
controlled_cd_lane_live_metric_blocker_count?: number | null;
controlled_cd_lane_live_metric_blockers?: string[] | null;
} | null;
}>;
};
@@ -7851,6 +7881,54 @@ function AiLoopLogSourceTagsPanel({
summary?.ai_loop_current_blocker_deployment_closure_state ??
evidence?.ai_loop_current_blocker_deployment_closure_state ??
"";
const liveMetricStatus =
summary?.controlled_cd_lane_live_metric_status ??
evidence?.controlled_cd_lane_live_metric_status ??
"";
const liveMetricMetadataOnly =
summary?.controlled_cd_lane_live_metric_metadata_only ??
evidence?.controlled_cd_lane_live_metric_metadata_only ??
false;
const liveEnforcerMetricPresent =
summary?.controlled_cd_lane_live_enforcer_metric_present ??
evidence?.controlled_cd_lane_live_enforcer_metric_present ??
false;
const liveEnforcerFresh =
summary?.controlled_cd_lane_live_enforcer_last_run_fresh ??
evidence?.controlled_cd_lane_live_enforcer_last_run_fresh ??
false;
const liveEnforcerApplyPerformed =
summary?.controlled_cd_lane_live_enforcer_apply_performed ??
evidence?.controlled_cd_lane_live_enforcer_apply_performed ??
0;
const liveActiveAllowed =
summary?.controlled_cd_lane_live_controlled_drain_active_allowed ??
evidence?.controlled_cd_lane_live_controlled_drain_active_allowed ??
false;
const liveStagingAllowed =
summary?.controlled_cd_lane_live_controlled_drain_staging_allowed ??
evidence?.controlled_cd_lane_live_controlled_drain_staging_allowed ??
false;
const liveActiveJobContainers =
summary?.controlled_cd_lane_live_active_job_containers ??
evidence?.controlled_cd_lane_live_active_job_containers ??
0;
const liveLaneProcessCount =
summary?.controlled_cd_lane_live_lane_process_count ??
evidence?.controlled_cd_lane_live_lane_process_count ??
0;
const liveRootRestoreSourcesLeft =
summary?.controlled_cd_lane_live_root_restore_sources_left ??
evidence?.controlled_cd_lane_live_root_restore_sources_left ??
0;
const liveHostLoad5PerCore =
summary?.controlled_cd_lane_live_host_load5_per_core ??
evidence?.controlled_cd_lane_live_host_load5_per_core ??
0;
const liveMetricBlockerCount =
summary?.controlled_cd_lane_live_metric_blocker_count ??
evidence?.controlled_cd_lane_live_metric_blocker_count ??
0;
const currentBlockerId = summary?.ai_loop_current_blocker_id ?? "";
const controlledCdLaneGuardrailsBlocked =
currentBlockerId === "controlled_cd_lane_guardrails_blocked";
@@ -7912,6 +7990,75 @@ function AiLoopLogSourceTagsPanel({
ids: receiptOutputIds,
},
];
const liveMetricCards =
controlledCdLaneGuardrailsBlocked && liveMetricStatus
? [
{
key: "enforcer",
icon: ShieldCheck,
label: t("liveMetrics.enforcer"),
value:
liveEnforcerMetricPresent && liveEnforcerFresh
? t("liveMetrics.ready")
: t("liveMetrics.missing"),
detail: t("liveMetrics.enforcerDetail", {
apply: String(liveEnforcerApplyPerformed),
metadata: String(Boolean(liveMetricMetadataOnly)),
}),
tone:
liveEnforcerMetricPresent && liveEnforcerFresh
? "border-[#b9d9c2] bg-[#f2fbf3] text-[#236332]"
: "border-[#f0c6a8] bg-[#fff8f1] text-[#9a4d16]",
},
{
key: "drain-guard",
icon: Activity,
label: t("liveMetrics.drainGuard"),
value: t("liveMetrics.drainGuardValue", {
active: String(Boolean(liveActiveAllowed)),
staging: String(Boolean(liveStagingAllowed)),
}),
detail: t("liveMetrics.blockers", {
count: liveMetricBlockerCount,
}),
tone:
liveActiveAllowed || liveStagingAllowed
? "border-[#b9d9c2] bg-[#f2fbf3] text-[#236332]"
: "border-[#f0c6a8] bg-[#fff8f1] text-[#9a4d16]",
},
{
key: "jobs",
icon: ListChecks,
label: t("liveMetrics.jobs"),
value: t("liveMetrics.jobsValue", {
jobs: liveActiveJobContainers,
lane: liveLaneProcessCount,
}),
detail: t("liveMetrics.restoreSources", {
count: liveRootRestoreSourcesLeft,
}),
tone:
liveActiveJobContainers === 0 &&
liveLaneProcessCount === 0 &&
liveRootRestoreSourcesLeft === 0
? "border-[#b9d9c2] bg-[#f2fbf3] text-[#236332]"
: "border-[#f0c6a8] bg-[#fff8f1] text-[#9a4d16]",
},
{
key: "load",
icon: Gauge,
label: t("liveMetrics.load"),
value: t("liveMetrics.loadValue", {
value: liveHostLoad5PerCore.toFixed(2),
}),
detail: liveMetricStatus,
tone:
liveHostLoad5PerCore <= 1
? "border-[#b9d9c2] bg-[#f2fbf3] text-[#236332]"
: "border-[#f0c6a8] bg-[#fff8f1] text-[#9a4d16]",
},
]
: [];
const rootCause = queueNormalizerFieldIds.some((id) =>
id.includes("server_accepts_key_then_session_timeout")
)
@@ -8076,6 +8223,35 @@ function AiLoopLogSourceTagsPanel({
))}
</div>
) : null}
{liveMetricCards.length > 0 ? (
<div
className="mt-3 grid gap-2 border border-[#d8d3c7] bg-white p-2 sm:grid-cols-2 xl:grid-cols-4"
data-testid="ai-loop-controlled-cd-lane-live-metrics"
>
{liveMetricCards.map((metric) => {
const Icon = metric.icon;
return (
<div
key={metric.key}
className={cn("min-w-0 border px-3 py-2", metric.tone)}
>
<div className="flex items-center justify-between gap-2">
<span className="text-[11px] font-semibold">
{metric.label}
</span>
<Icon className="h-3.5 w-3.5 shrink-0" aria-hidden="true" />
</div>
<div className="mt-2 break-words font-mono text-xs font-semibold text-[#141413]">
{loading ? "--" : metric.value}
</div>
<div className="mt-1 break-words font-mono text-[10px] leading-4 text-[#5f5b52]">
{loading ? "--" : metric.detail}
</div>
</div>
);
})}
</div>
) : null}
<div className="mt-4 grid gap-px border border-[#e0ddd4] bg-[#e0ddd4] sm:grid-cols-2 xl:grid-cols-4">
{metrics.map((metric) => {
const Icon = metric.icon;