{"slug": "the-cold-start-problem-for-agent-evals-what-to-gate-on-day-one-with-zero-labeled", "title": "The Cold-Start Problem for Agent Evals: What to Gate on Day One With Zero Labeled Data", "summary": "A developer proposes a solution to the cold-start problem for agent evaluations, arguing that independent evidence—such as file existence, compilation success, and embedding similarity—can gate agent outputs on day one without any labeled data. The approach categorizes checks into three tiers based on independence from the agent, warning against using LLM-as-judge for real-time gating due to circular reasoning.", "body_md": "You just shipped an agent. It works in the demo. Now someone asks the reasonable question: \"How do we know it keeps working?\" And you reach for evals — and hit a wall. You have no labeled dataset. No golden outputs. No historical traces. Nothing to grade against.\n\nSo the team stalls. \"We'll add evals once we collect data.\" Meanwhile the agent runs in production, ungated, and the first time it silently breaks is the first time anyone notices.\n\nThis is the cold-start problem, and the usual response — \"just get an LLM to score the output 1-10\" — is exactly the wrong instinct. You do not need labels to start gating. You need to understand which evidence you can trust on day one, and which you can't trust ever.\n\nMost eval discussions rank checks on a cost axis: cheap string matches at the bottom, expensive model-as-judge at the top, as if spending more buys you more truth. That's backwards. The axis that matters is **independence**: can the agent forge this signal, or not?\n\nThat reframing is the whole game for cold-start, because independent evidence needs zero labels. It's true or false about the world regardless of what your agent intended.\n\nThree tiers, ranked independent to corruptible:\n\nOn day one you have Tier 1 and Tier 2 completely for free. Neither needs a single labeled example, because neither asks \"is this good?\" — they ask \"is this real?\"\n\nHere's a starter gate for an agent that's supposed to produce a code patch. No dataset required:\n\n```\ntype GateResult = { pass: boolean; tier: 1 | 2; reason: string };\n\nasync function coldStartGate(\n  task: string,\n  output: { patch: string; targetFile: string },\n  runtime: { durationMs: number; timeoutMs: number },\n  embed: (s: string) => Promise<number[]>,\n): Promise<GateResult[]> {\n  const results: GateResult[] = [];\n\n  // Tier 1 — unforgeable facts about the world\n  results.push({\n    tier: 1, reason: \"non-empty output\",\n    pass: output.patch.trim().length > 0,\n  });\n  results.push({\n    tier: 1, reason: \"target file exists\",\n    pass: await fileExists(output.targetFile),\n  });\n  results.push({\n    tier: 1, reason: \"patch applies + compiles\",\n    pass: await applyAndCompile(output.patch, output.targetFile),\n  });\n  results.push({\n    tier: 1, reason: \"finished within timeout\",\n    pass: runtime.durationMs < runtime.timeoutMs,\n  });\n\n  // Tier 2 — statistical signal vs a baseline the agent didn't write\n  const [taskVec, patchVec] = await Promise.all([embed(task), embed(output.patch)]);\n  results.push({\n    tier: 2, reason: \"patch is on-topic for the task\",\n    pass: cosine(taskVec, patchVec) > 0.35,\n  });\n  results.push({\n    tier: 2, reason: \"diff changed something\",\n    pass: !/^\\s*$/.test(output.patch.replace(/[-+]{3}.*$/gm, \"\")),\n  });\n\n  return results;\n}\n```\n\nEvery check here is either true about the filesystem/compiler/clock, or it's a distance against the task string — which the agent received but did not author. There is nothing to label. And this catches the overwhelming majority of real failures: the stale run, the crash, the malformed output, the hallucinated file path, the empty response, the patch that wandered off into an unrelated file.\n\nThe temptation is to skip all this and let a judge model read the patch and give it a score. Resist it — and not just because you have no labels.\n\nA model judging another model's work is **circular**. Judge and judged share a substrate: the same training distribution, the same blind spots, the same confident wrongness. There's no independent ground truth in that loop. So Tier 3 is a signal about taste, never a verdict about correctness, and it may only inspect artifacts the judged agent didn't get to write — never the agent's own reasoning trace, which it can rationalize.\n\nThere are two more hard constraints. **Tier 1+2 are the real-time gate**: deterministic, effectively free, fast enough to block a run before a bad output escapes. **Tier 3 is offline-only**: metered, slow, non-deterministic — it cannot sit in the hot path. You run it later, in batch, over the ~20% subjective tail that Tier 1+2 can't adjudicate, and you label its output \"opinion, not evidence.\" Ship the 80% you can gate deterministically today; don't block your launch waiting for a judge you shouldn't trust in the loop anyway.\n\nGating output is only half the job. The other half is knowing *what happened*, and this is where cold-start teams quietly cheat: they gate on the agent's self-report, which is exactly the forgeable thing Tier 1 is supposed to route around.\n\nThis is why the eval layer and the trace layer ship as a unit. **agent-eval** scores and gates the output — the tier logic above: evals, drift, hallucination checks. **AgentLens** captures the trace of *how* the agent got there: every model call and tool step, the resolved inputs, the raw outputs. The two connect at a specific seam: Tier 1+2 need unforgeable data to score against, and the agent must not be the one who wrote it. AgentLens gives you exactly that — the real file that got written, the actual exit code, the true wall-clock duration — instead of the agent's summary of what it thinks it did.\n\nWithout the trace, your gate degrades into grading the agent's own press release. With it, \"finished within timeout\" and \"target file exists\" become facts, not claims.\n\nYou don't have a labeled dataset. You never will on day one. But you already have a filesystem, a compiler, a clock, and an embedding model — which means you already have a Tier 1+2 gate. Wire agent-eval to it, point AgentLens at your run to feed it unforgeable trace data, and gate the 80%. Collect the judge-tail labels *while* you're already protected in production, not instead of protecting it.\n\nThe cold-start problem was never about missing data. It was about asking the wrong tier for permission to launch.", "url": "https://wpnews.pro/news/the-cold-start-problem-for-agent-evals-what-to-gate-on-day-one-with-zero-labeled", "canonical_source": "https://dev.to/saurav_bhattacharya/the-cold-start-problem-for-agent-evals-what-to-gate-on-day-one-with-zero-labeled-data-4ck2", "published_at": "2026-07-22 01:02:08+00:00", "updated_at": "2026-07-22 01:33:28.357449+00:00", "lang": "en", "topics": ["artificial-intelligence", "ai-agents", "ai-safety", "developer-tools"], "entities": [], "alternates": {"html": "https://wpnews.pro/news/the-cold-start-problem-for-agent-evals-what-to-gate-on-day-one-with-zero-labeled", "markdown": "https://wpnews.pro/news/the-cold-start-problem-for-agent-evals-what-to-gate-on-day-one-with-zero-labeled.md", "text": "https://wpnews.pro/news/the-cold-start-problem-for-agent-evals-what-to-gate-on-day-one-with-zero-labeled.txt", "jsonld": "https://wpnews.pro/news/the-cold-start-problem-for-agent-evals-what-to-gate-on-day-one-with-zero-labeled.jsonld"}}