From 8f2b615ba9610e3d041c9ca7a49bf50c7b4969ed Mon Sep 17 00:00:00 2001 From: Codex Date: Sun, 21 Jun 2026 14:30:35 +0000 Subject: [PATCH] fix: improve code agent otel trace selection --- scripts/src/platform-infra-observability.ts | 23 +++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/scripts/src/platform-infra-observability.ts b/scripts/src/platform-infra-observability.ts index 7f1ecdbc..7e4beaee 100644 --- a/scripts/src/platform-infra-observability.ts +++ b/scripts/src/platform-infra-observability.ts @@ -335,7 +335,7 @@ function parseDiagnoseCodeAgentOptions(args: string[]): DiagnoseCodeAgentOptions let businessTraceId: string | null = null; let traceId: string | null = null; let limit = 40; - let candidateLimit = 20; + let candidateLimit = 300; let lookbackMinutes = 10080; for (let index = 0; index < args.length; index += 1) { const arg = args[index]; @@ -362,7 +362,7 @@ function parseDiagnoseCodeAgentOptions(args: string[]): DiagnoseCodeAgentOptions const value = args[index + 1]; if (value === undefined || value.startsWith("--")) throw new Error("--candidate-limit requires a value"); const parsed = Number(value); - if (!Number.isInteger(parsed) || parsed < 1 || parsed > 100) throw new Error("--candidate-limit must be an integer from 1 to 100"); + if (!Number.isInteger(parsed) || parsed < 1 || parsed > 500) throw new Error("--candidate-limit must be an integer from 1 to 500"); candidateLimit = parsed; index += 1; } else if (arg === "--lookback-minutes" || arg === "--since-minutes") { @@ -2646,6 +2646,7 @@ def candidate_score(trace_id, meta, trace_body, trace_rc, trace_err): ) if is_workbench_get_single_span: add(-80, "single-span Workbench GET/SSE trace") + candidate_quality = "low-confidence-workbench-single-span" if is_workbench_get_single_span else "normal" service_path = { service: ("reached" if service in services else "missing") for service in ("hwlab-cloud-api", "agentrun-manager", "agentrun-runner") @@ -2664,6 +2665,8 @@ def candidate_score(trace_id, meta, trace_body, trace_rc, trace_err): "identity": {key: identity.get(key) for key in ("runId", "commandId", "runnerJobId", "runnerId", "backendProfile") if identity.get(key) not in (None, "")}, "terminalStatus": agentrun.get("terminalStatus"), "errorSpanCount": len(error_spans), + "candidateQuality": candidate_quality, + "lowConfidence": candidate_quality != "normal", "rootTraceName": meta_root_name or None, "rootServiceName": meta_root_service or None, "spanNamePreview": names[:8], @@ -2720,6 +2723,13 @@ def resolve_trace(): break candidate_summaries.sort(key=lambda item: item.get("score", -999999), reverse=True) selected_summary = next((item for item in candidate_summaries if item.get("traceId") == selected_trace_id), None) + selected_quality = selected_summary.get("candidateQuality") if isinstance(selected_summary, dict) else None + selected_low_confidence = bool(selected_summary.get("lowConfidence")) if isinstance(selected_summary, dict) else False + selected_service_path = selected_summary.get("servicePath") if isinstance(selected_summary, dict) else None + selected_complete = bool(selected_service_path.get("complete")) if isinstance(selected_service_path, dict) else False + selected_rejected_reason = None + if selected_low_confidence and not selected_complete: + selected_rejected_reason = "best candidate is only a single-span Workbench GET/SSE trace; no high-confidence Code Agent trace was found in the scanned window" mapping = { "mode": "business-trace-id", "businessTraceId": BUSINESS_TRACE_ID, @@ -2732,6 +2742,9 @@ def resolve_trace(): "scannedCandidateCount": scanned, "candidateSelectionMode": "scored-service-and-span-content", "selectedScore": selected_score, + "selectedQuality": selected_quality, + "selectedLowConfidence": selected_low_confidence, + "selectedRejectedReason": selected_rejected_reason, "selectedReasons": selected_summary.get("reasons", []) if isinstance(selected_summary, dict) else [], "selectedMeta": compact_meta(selected), "candidatePreview": candidate_summaries[:8], @@ -2741,6 +2754,8 @@ def resolve_trace(): mapping["rawSearchBody"] = search_parsed if isinstance(search_parsed, dict) else search_body[-12000:] if selected_trace_id is None: return None, mapping, "no OTel trace found for business trace" + if selected_rejected_reason is not None: + return None, mapping, selected_rejected_reason return selected_trace_id, mapping, None resolved_trace_id, mapping, resolve_error = resolve_trace() @@ -2754,8 +2769,8 @@ if resolved_trace_id is None: "facts": [], }, "next": { - "expandWindow": "bun scripts/cli.ts platform-infra observability diagnose-code-agent --target ${target.id} --business-trace-id ${businessTraceIdForNext} --lookback-minutes 10080 --candidate-limit 100 --full", - "search": "bun scripts/cli.ts platform-infra observability search --target ${target.id} --query '{ .traceId = \\"${businessTraceIdForNext}\\" }' --lookback-minutes 10080 --candidate-limit 100 --limit 10", + "expandWindow": "bun scripts/cli.ts platform-infra observability diagnose-code-agent --target ${target.id} --business-trace-id ${businessTraceIdForNext} --lookback-minutes 10080 --candidate-limit 500 --full", + "search": "bun scripts/cli.ts platform-infra observability search --target ${target.id} --query '{ .traceId = \\"${businessTraceIdForNext}\\" }' --lookback-minutes 10080 --candidate-limit 500 --limit 10", }, } print(json.dumps(payload, ensure_ascii=False, indent=2))