Replace the eval tasks with four multi-turn tasks - #525
AshishKumar4 wants to merge 5 commits into
Conversation
Preview:
|
|
Posted 9 actionable inline findings. |
|
Performance is inconclusive because no task cohort is comparable. Across unmatched cohorts, pass rate fell from 83.3% to 75.0%, while mean model turns rose from 8.3 to 18.4 and tool calls from 9.4 to 19.7. Candidate trajectories carried state across turns, notably creating a document from calendar data before editing rules and querying results. Different workloads and 10 stochastic trials per cohort could explain the apparent decline. |
51cb312 to
28dc3a1
Compare
|
|
Performance is inconclusive because no task cohort is comparable. Across unmatched cohorts, pass rate fell from 86.7% to 67.5%, while mean model turns rose from 9.8 to 17.7 and tool calls from 12.1 to 19.8. Candidate trajectories sustained state across turns, notably querying calendar data, creating a document from it, then editing and rechecking the Gadget. Different workloads and only 10 stochastic trials per cohort could explain the apparent regression. |
28dc3a1 to
b92b3f4
Compare
Eval runs comparisonBaseline No cohort is comparable. Not compared:
|
|
b92b3f4 to
b1d342d
Compare
There was a problem hiding this comment.
Note
This report is out of date. Scroll down for Devin Review's latest report on this PR.
Devin Review found 1 new potential issue.
⚠️ 1 issue in files not directly in the diff
⚠️ Reconnects can undercount turn cost
A reconnect before delayed gateway accounting makes #reconnectedDuringTurn skip the cost wait. The completed turn then reports stale cumulative cost.
|
Eval runs reviewPerformance is inconclusive because every task cohort is non-comparable. Across unmatched cohorts, pass rate fell from 70.0% to 42.5%, while mean turns rose from 7.1 to 14.5 and tool calls from 9.0 to 17.3. Candidate runs sustained multi-turn state, notably querying calendar data, creating a document, then editing and rechecking rules. Replaced workloads and only 10 stochastic trials per cohort could explain the apparent decline. |
b1d342d to
9eacc4b
Compare
Eval runs reviewPerformance is inconclusive because no task cohort is comparable. Across unmatched cohorts, pass rate fell from 76.7% to 40.0%, while mean turns rose from 7.8 to 15.4 and tool calls from 9.5 to 16.8. Candidate runs sustained state across turns, notably querying calendar data, creating a document, editing rules, and re-querying results. Replaced workloads and only 10 stochastic trials per cohort could explain the apparent decline. |
|
|
Eval runs reviewMeasured. No cohort is comparable, so no valid pass, duration, tool-error, or cost deltas exist. |
|
Posted 8 new actionable inline findings. |
a075207 to
839ff35
Compare
|
Eval runs reviewMeasured. No cohort is comparable, so no valid pass, duration, tool-error, or cost deltas exist. |
|
839ff35 to
e07ebed
Compare
|
|
The three tasks were single-request contracts in toy domains, and the one that looked saturated (project-doc, 8/10) was failing on a verifier that rejected a literal reading of its own prompt. None was long-horizon, only one had a second turn, and nothing checked whether the agent's words matched the data. Four tasks replace them, all multi-turn, verified through the Gadget's RPC against references the verifier owns: - change-calendar: a maintenance-window calendar built to an exact contract, written up as a Document from its own data, changed under new rules, committed and reloaded, then asked a question whose answer is in the seeded schedule. - worker-logs: a Workers request-log analyser fed a seeded day of events with one planted bad hour; filters and rankings are added, then the agent is asked which Worker had the worst hour, in a fixed reply shape checked against the data. - incident-desk: an on-call desk where twenty responders acknowledge at once and exactly one may win, then escalation and metrics. - chess: a complete engine written without a library, then PGN, then draw detection, each checked differentially against chess.js on curated positions and seeded random games. Either en passant FEN convention is accepted. The verifier now sees the agent's chat replies for the question turns, and the verification budget grows to four minutes: these checks make hundreds of RPC calls a turn.
e07ebed to
db93290
Compare
The rebase onto main left pnpm-lock.yaml referencing a vitest 4.1.11 entry that no longer existed, so vp install failed with ERR_PNPM_LOCKFILE_MISSING_DEPENDENCY. Rebuilt from main's lockfile; the only difference is the chess.js dependency this branch adds.
Posted 3 additional actionable inline findings. |
Eval runs reviewMeasured. No cohort is comparable, so no valid pass, duration, tool-error, or cost deltas exist. |
|
Each check now fails for the wrong implementation it was meant to catch. change-calendar: conflict ids are compared element by element, not through a joined string; the plan needs one distinct bullet per window; the seeded-windows check also asks conflicts() over a range that overlaps both api-gateway windows, so the RPC is exercised after the rule change and after commit. incident-desk: every incident turn 1 left is compared on service, severity, summary, owner, timestamps and escalations, not just id and status; a race winner's owner must be the responder, and UNKNOWN_INCIDENT and ALREADY_RESOLVED must carry owner: null; escalation is exercised on an acknowledged incident and must keep its owner; metrics are checked on a service holding an open, an acknowledged and a resolved incident, and the empty service on all five fields. worker-logs: failures now include 501 and 504; three worker+route pairs share a planted slow tail so slowestRoutes has to break the p95 tie by worker then route, with a module-load guard that the data still does; turn 2 resets and re-ingests to prove reset() survived the edit. chess: a refused move must also leave the game's PGN unchanged once PGN exists; six plausible six-field FENs must be refused; Black castling, en passant and promotion have fixtures the oracle is checked to offer; the post-draw random game compares the draw fields.
…erity A refused loadPgn must leave pgn() as it was, not only the position. The one open() that wins the simultaneous-opens race must have stored the severity it was sent, not a default.
|
Eval runs reviewMeasured. No cohort is comparable, so no valid pass, duration, tool-error, or cost deltas exist. |
|
One pass over the four verifiers with three rules: after a mutation, assert the return and re-read the whole record; give every parser one input shape a lazy parser gets wrong; for rules that interact, one case where the order matters. Each check stays satisfiable by any correct reading of its prompt: the offset-timestamp probe asserts only that scheduling fails, since the prompt fixes no code for it, and K+NN vs K is left out because the prompt does not define insufficient material and engines disagree. incident-desk: the turn-one predicate covers inc-1 after resolve too; escalation must change severity and the count and nothing else, and is read back after every call including the refused one; race-open's severity is checked against the attempt its summary names; the opens a check depends on fail the check when refused. chess: compareHere also reads fen(), so the stored position is checked wherever moves and status are, including after each special move; the PGN self-comparison strips tag pairs so a Gadget that adds a Date tag is not failed for it; the repetition and fifty-move moves are asserted. change-calendar: the touching window is mw-100 so conflicts() has to sort; two new windows in one turn 22 hours apart; a +05:00 start that is outside hours in UTC must fail; a bullet may state its length as hours and minutes. worker-logs: the planted slow tail sits in one colo, so a colo-filtered ranking differs from the day's; one summary range has endpoints inside an hour.
|
All twelve read and handled in
One rule for all of these: a check that rejects a defensible reading of the prompt turns the task into a prompt-reading lottery, and with ten trials that noise is indistinguishable from a regression. Every check above is satisfiable by any correct reading of its prompt. |
This PR replaces the current existing toy tasks with more relevant, multi-turn tasks.
The set of tasks are designed to sit on a spectrum of trivially solvable to medium-hard, so we can have a set of tasks that can act as regression tests that fail if harness quality or prompt degrade, or tasks that have a high margin of improvement which can help us evaluate improvements to harness.
All are multi-turn and verified through the Gadget's RPC against references the verifier owns, so any correct implementation passes.
change-calendar (4 turns). A maintenance-window calendar for five services, built to an exact contract with five error codes. Turn 2 writes the week up as a Document, and the check walks the document's headings and bullets against the calendar's own seeded windows. Turn 3 changes two rules; existing windows must survive, and
verifyAfterAcceptcommits, reloads, and checks both data and rules persisted. Turn 4 asks how many hours one service has that week, answer as a bare number.worker-logs (3 turns). A Workers request-log analyser. The verifier pushes a seeded day of 5,869 events for six Workers across four colos, with one planted worst hour and one decoy, and computes every reference answer itself (nearest-rank p95, half-open ranges, hourly buckets with empty hours). Turn 2 adds colo and route filters, a per-colo breakdown and a slowest-routes ranking. Turn 3 asks which Worker had the worst hour by error rate, in a fixed three-line reply shape; the check parses it and compares with the planted answer. That is the fabricated-answer failure made deterministic.
incident-desk (2 turns). An on-call desk where twenty responders acknowledge the same page at once: exactly one wins, everyone else is told who. Durable Object RPCs interleave at every
await, so a check-then-write implementation fails. Turn 2 adds escalation and metrics computed from the board's own timestamps.chess (3 turns). A complete engine with no library available in the sandbox, then PGN import/export, then draw detection. Verification is differential against chess.js: legal move sets, resulting positions and status must agree on twelve curated positions (castling through check, en passant that would expose the king, promotion by capture, pins, mate, stalemate) and on seeded random games with illegal-move probes; PGN import covers three miniatures, the Opera Game, and two seeded random games; export must replay in the oracle to the same position. Both en passant FEN conventions are accepted by canonicalising through the oracle, and once a game is drawn with pieces still mobile either an empty or a full move list is accepted.
Two small harness changes: the verifier receives the agent's chat replies for the turn (
EvalVerifier.replies), and the verification budget is four minutes rather than two, since these checks make hundreds of RPC calls per turn.chess.jsis a dev dependency as the oracle.First live run (GPT 5.6 Luna, 10 trials each, 25 minutes, $1.21, no infrastructure failures, verification under 3 s per turn):
6.5openedAtreset()while self-testing and destroyed the user's loaded data, against an explicit instruction1. Nh3and after an opponent'sRxc1;O-O-Owith a knight on b1; king stepping into a pawn's attack; en passant not generatedEvery verifier was run against a minimal correct implementation and a broken one before this was opened; that caught a key-order comparison bug in
worker-logsthat would have failed every agent. The probes are not committed.