Skip to content

feat(studio): X01a eval gate runner over observe datasets - #1115

Merged
LinuxDevil merged 6 commits into
mainfrom
fb-x01a-eval-gate
Nov 14, 2026
Merged

LinuxDevil merged 6 commits into
mainfrom
fb-x01a-eval-gate

Conversation

@LinuxDevil

Copy link
Copy Markdown
Owner

Summary

  • spec.evals becomes a real AgentSpecV2 section: EvalGateSpec (dataset, single-key gates — calledTool/notCalledTool/maxCostUsd/maxSteps/judge — and minPassRate), replacing the pendingField placeholder; strict zod schema with per-gate variant checks and top-level-only key handling for inline subagents.
  • New apps/agent-forge/server/evals/ runner (runEvalGates): fetches each named observe dataset (cap 50 examples), runs candidates sequentially through the spec-v2 build path under a separate <agentId>-evals observe name, applies deterministic gate checks, and grades judge gates through PassRunner eval_judge jobs (sha256-keyed dedupe, 20 s timeout). Missing/empty/unreachable datasets and unavailable judges all fail — a gate that could not be checked never passes.
  • Per-example 60 s abort cap implemented with setTimeout + AbortController so fake timers can drive it; now/fetch/runExample injectable for tests.
  • Export bundle's defensive evals read updated now that the section is real; canvas specTypes re-exports the SDK EvalGateSpec.

X01b (publish wiring + 409 + UI) lands next — runEvalGates intentionally has no route caller yet.

Test plan

  • npm run typecheck:server --workspace apps/agent-forge
  • npm run test:server --workspace apps/agent-forge (export fixtures updated to the real eval shape)
  • SDK spec suite: 614 tests incl. new evals.test.ts
  • npm run fallow — dead code clean; health findings are the pre-existing baseline
  • New tests: 16 gate-runner + 14 dataset-client cases (all gate kinds, nullable cost, missing/empty dataset, daemon down, 51→50 cap, run error, judge pass/low/unavailable, fake-timer abort, pass enqueue shape)

Generated with Devin

LinuxDevil and others added 2 commits November 14, 2026 13:47
spec.evals becomes a real AgentSpecV2 section (EvalGateSpec: dataset,
single-key gates, minPassRate) replacing the pending placeholder, and
server/evals/ gains the runner X01b will call from publish: dataset
fetch capped at 50 examples, deterministic gate checks, model judge via
PassRunner eval_judge jobs, and candidate runs through the spec-v2 build
path under a separate -evals observe name with a 60 s per-example cap.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
LinuxDevil and others added 4 commits November 14, 2026 15:02
The deep relative specifiers tripped lousho/no-sdk-source in lint:imports;
both types are already re-exported from the public spec subpath. Document
the EvalGate union members the re-export surfaced to typedoc.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@LinuxDevil
LinuxDevil merged commit 8ef618c into main Nov 14, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant