Repository navigation
fix(evals): Give delegation children fixed docs pages and assert the deployment watch - #2420
sentry-junior[bot] wants to merge 5 commits into
Conversation
…for child research findMeetingTimes returned empty slots with no reason when the requester, who is required by default, was busy for the whole window. The agent then retried day by day and hit the 60-second idle limit. The result now names the required attendees who are never free in the window (blockedBy). The delegation case waits for three child agents' research and the parent's summary. In live runs one child Turn alone can take more than 60 seconds, so the case gets a 120-second idle budget through a new idleTimeoutMs call option. policies/evals.md names this exception. Refs #2413 Co-Authored-By: David Cramer <david@sentry.io>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Sentry Evalsjunior-behavioral
Base commit junior-guardian
Base commit junior-integration
Base commit junior-router
Base commit |
The deployment watch case required a github_getDeployment call before watchEvents. In live runs the agent often finds the deployment_source identifier through searchEventTypes and creates the exact correct watch. The user-visible outcome is the same, so the case now asserts the watch and the reply, not the step that produced the identifier. Refs #2413 Co-Authored-By: David Cramer <david@sentry.io>
|
Case 4 (deployment watch): decided it's an eval bug, not a product gap. The agent creates the exact correct |
|
Research on the open questions, from the Deployment watch: passed live on Delegation, 120s idle: passed live in 101.5s with 3 child agents. In 70 recent samples, 47 started child agents. 38 passed (up to 107s) and 9 hit the old 60s idle limit while children were working (64–127s total). The other 23 never started a child agent and did the research directly. Those fail the spawn assertion, or they time out first. After this PR they will fail on the assertion. So expect this case to stay red about 1 run in 3. That is a real behavior miss (it skips delegation), not a timeout. Recurring slot, The real cause is in the tool input. In 178 recorded Proposed fix (not in this PR): when the model leaves the requester out, |
|
Correction to my last comment. The proposal to add an omitted requester as optional is withdrawn. I wrote that the model leaves the requester out of The real miss: the requester said their afternoons are DNS holds, and the model put them in Next candidate, not done yet: when only the requester blocks every slot, the result says so and points to |
The live run returned blockedBy correctly, but the recurring-slot case still timed out. No run shows that the field changes what the agent does, so it does not belong in this eval-fix PR. The recurring-slot case needs a separate change to how findMeetingTimes treats the requester's holds. Refs #2413 Co-Authored-By: David Cramer <david@sentry.io>
The delegation case measures the parent's choice to start child agents in its first Turn. It waited for the children's live research and the parent's summary, which take more than 60 seconds, so the earlier fix raised the idle budget to 120 seconds. Instead, the person says "stop" after the parent's first reply. The stop ends the child agents, so the call no longer waits for research that the case does not check. A child waits at its first tool request until the stop is sent, so replays make the same requests as the recording run. This removes the idleTimeoutMs call option and its policy exception. Refs #2413
The delegation case measures the parent's choice to start child agents. The children read live PostgreSQL, MySQL, and SQLite docs pages, which made the run slow and depended on live pages that the case does not check. A new mockWebPages() fixture helper answers webFetch reads of some origins with fixed pages. The case gives the children three short docs pages and search results for them. The database docs origins are no longer reached through Roach, so they leave ALLOWED_ORIGINS. This replaces the earlier stop after the parent's first reply. There is no idle budget option and no policy exception. Refs #2413 Co-Authored-By: David Cramer <david@sentry.io>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 0ed43ae. Configure here.
| // choice to delegate, not the quality of the children's research. | ||
| const { run } = await agent({ limits: { maxToolCallsPerTurn: 6 } }); | ||
| mockWebSearchResults([POSTGRES_DOCS, MYSQL_DOCS, SQLITE_DOCS]); | ||
| mockWebPages(DATABASE_DOCS_PAGES); |
There was a problem hiding this comment.
Delegation eval waits for unused research
Medium Severity
The case only asserts that the parent calls spawnAgent, but run() now waits for the children's research and the parent's summary. Live delegated runs already took 45–126s and hit the 60s idle limit. mockWebPages makes webFetch instant and does not shorten live model turns, so the idle failure this change removes the stop path to avoid can still happen.
Reviewed by Cursor Bugbot for commit 0ed43ae. Configure here.


Refs #2413.
This PR keeps only the fixes that a live run supports. Evidence comes from the 160 most recent
junior-behavioralruns on evals.sentry.dev (Oct 14 – Oct 30). A run of 2–10 s is a replayed recording, so the counts below use live runs.1. Watches: "exact deployment before GitHub creates it": eval bug, fixed
The case failed in all 33 live runs where the agent called
searchEventTypesfirst. In those runs the agent created the correctdeployment_sourcewatch, and the judge, identifier and events assertions passed. Only the assertion thatgithub_getDeploymentran first failed. In this fixture the deployment does not exist, so that lookup has no visible effect. The assertion checked the order of steps, not the outcome.Fix: drop that assertion. The watch, no-polling and reply checks and the user message are unchanged. The case passed live on
db253e9d.2. Delegation: "independent research tracks": children read live docs, mocked
The case checks that the parent starts child agents. The children read live PostgreSQL, MySQL and SQLite docs pages, which the case does not check. Live runs that delegated took 45–126 s, and the idle limit is 60 s.
Fix: a new
mockWebPages()helper insrc/fixture/web.tsanswerswebFetchreads of some origins with fixed pages before the Roach replay. The case gives the children three short docs pages (a few sentences each on locking, rewrite cost and replication) andmockWebSearchResults()for them. The database docs origins are no longer reached through Roach, so they leaveALLOWED_ORIGINS. The user message and thespawnAgentassertion are unchanged. There is no idle-limit option, no stop message and no policy exception.Unverified: the first live run of this version is on
0ed43ae3. The mock coverswebFetchandwebSearchonly. A child or the parent that usescurlinbashstill reaches the real site from the Vercel Sandbox. Most of the time is model time of the child Turns and the parent's summary, so mocked pages may not bring the case under 60 s.Not fixed here: in about 1 of 3 live samples the parent does not delegate and does the research itself. That is a real behavior miss and fails the assertion.
Not in this PR
blockedByresult tofindMeetingTimes. The live run returned it correctly, but the case still timed out, so nothing shows it helps. I removed it (295953dd). The cause is in how the tool fits this use case; the proposal is on Fix behavioral eval cases that fail on unrelated PRs #2413.optionalAttendeeshere and passes.Checks
@sentry/junior-googletests (22) and typecheck after removingblockedBy0ed43ae3: junior-evals typecheck, harness tests (16 passed, 1 expected fail), prettier,test-architecture:check,file-length:checkdb253e9d: 81/82; the one miss was the recurring-slot casevia David Cramer.
--
View Session [Sentry]