Repository navigation
feat(evals): wire @corbits/evals and add dispatch-routing eval - #1411
Conversation
|
Triage: Pass No changes needed from you. A maintainer will review this pull request. |
fc8f617 to
23881ac
Compare
TheGreatAxios
left a comment
There was a problem hiding this comment.
Review · Request changes
Wires @corbits/evals and a dispatch-routing prompt eval. The route gate can pass when routing is wrong, and the drop gate does not stick.
Findings
-
scripts/eval-prompts-dispatch.ts:147—routesis a case-insensitive substring over the whole reply, andexpect.decoysis parsed and never checked. The reply format names every specialist, so a reply that is only the roster passesroutesfor every case. A reply ofreviewerplus a refusal passes the coder case. Score the chosen route as its own line, and fail when a decoy is the chosen route. -
scripts/eval-prompts-dispatch.ts:185—allow.routesis{ miss: 6, drop: 0 }andlast.jsonis gitignored. The library skips drops when that file is missing, andevaluatewritessavebefore throwing. A clean tree never appliesdrop: 0. After a 9/9 baseline, a 4/9 run fails once and then exits 0 because the overwritten baseline is inside the miss budget. Keep the baseline that drop is measured against from being replaced by the failing run. -
scripts/eval-prompts-dispatch.ts:153—noDiyscans the whole reply, including the required second-line brief.coderplus "I will just patch the login flow and add a test." passes.shakespeareplus "I'll write the architecture doc" fails. Limit the DIY scan to the route line, or stop treating brief verbs as DIY. -
scripts/eval-prompts-dispatch.ts:179—under({ ms: 120_000 })never aborts the run.timeoutis not passed toevaluate, so a hung Ollama chat never becomes afastmiss and never unblocks the process. Pass a timeout that matches the budget.
a5054b0 to
af2a425
Compare
TheGreatAxios
left a comment
There was a problem hiding this comment.
Review · Request changes
Dispatch routing is scored on the first line, and a stored pass that drops fails the run.
Findings
scripts/eval-prompts-dispatch.ts:227—routesallows 6 misses. A miss that is not a drop of a stored pass still returns 0 (:241). The baseline is copied only whenroutes.missedis 0, so a case that is not already stored as a pass can stay wrong, and a sibling that did pass on that run is never stored. A later flip of that sibling is not a drop.scripts/eval-prompts-dispatch.test.ts:281locks the within-budget miss, not this hole.scripts/eval-prompts-dispatch.ts:188—noDiyscores onlyrouteLine, which is a specialist id. The DIY phrase list cannot fail a caserouteswould pass.
TheGreatAxios
left a comment
There was a problem hiding this comment.
Review · Approve
Dispatch routing fails an unbaselined route miss, stores a new pass next to a stored miss, and no longer runs the dead DIY check.
No findings.
First step of CL-10452 (wire @corbits/evals + trajectory scorers).
What
@corbits/evals@0.1.1as a devDependency.@corbits/system-one@^0.3.0(peer@intx/workflowoptional). Dev-time eval harness only, never bundled into the product.dispatch-routing.agents/dispatch/src/prompt.ts, exported by@corbits/code-agent-dispatch) against 9 brand-new routing requests (evals/prompts/dispatch-routing/cases.jsonl).evaluate()with checks (mentionsroutes,avoidsDIY,under120s) and allowed-miss gating (routes: miss 6, noDiy: miss 2, fast: 0), plus compare/save drop gating vialast.json.bun run eval:prompts-dispatch(local Ollama by default;EVAL_MODEL/EVAL_OLLAMA_URLoverrides).Results (smoke run, local
qwen3:0.6b)routes: { miss: 6 }is intentionally loose for the 0.6B smoke model (observed 3/9); README says to tighten (e.g.miss: 1) when running a capable model. The drop gate against a stored capable-model baseline is the regression protection.Verify
bun scripts/eval-prompts-dispatch.ts→ exit 0tsc --noEmit→ clean (also run by pre-commit)oxfmt --check+oxlinton changed files → cleanNot in scope
@corbits/system-onegateway; code checks only for now.ranSteps/@corbits/evals/workflow) are the CL-10452 follow-up.