Skip to content

test(evals): Make the asking evals realistic, and ask for draft facts - #2518

Merged
dcramer merged 13 commits into
mainfrom
fix/asking-eval-overfit
Nov 2, 2026
Merged

dcramer merged 13 commits into
mainfrom
fix/asking-eval-overfit

Conversation

@sentry-junior

@sentry-junior sentry-junior Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Follow-up to #2504, part of #2488

Blocked-child case (asking.eval.ts): the case was scripted. It named spawnAgent, wrote the child's task text ("The region is not in this task"), and told the parent "get what it needs so it can finish". Now Maya asks to hand off a deploy command for a Cloud Run region that she "picked last week". Only she knows the region. The prompt does not say how to delegate or how to ask, and it names no tool. The assertions do not change: one spawnAgent call, an addReviewItem action item in the result Turn, and no ? in the replies of that Turn.

Out-of-office case (asking.eval.ts): this case also failed on the final #2504 head. The agent wrote an out-of-office reply with no dates and asked nothing. That reply is complete, so the request did not need a fact from Maya. Maya now asks for a reply that says the day she is back, which only she knows. The assertion does not change.

Drafting rule (system-prompt-rules.ts): after that request change, the agent put in a [day/date] placeholder and still asked nothing. The cause is the drafting rule, which said "use clear placeholders or ask one focused question", so a placeholder alone satisfied it. Now the agent puts a placeholder where a fact that only the person knows goes, and asks for those facts with one addReviewItem item. This matches the asking rule: deliver the rest of the work and ask about the blocked part.

Neutral prompt example (system-prompt-rules.ts): the asking rule used "another person's calendar that returns notFound" as its example of a gap that nobody can fill. That is the Google Calendar integration eval scenario, and policies/evals.md does not allow scenario phrases in product prompts. The example is now "data that only someone outside the Conversation controls". The Google Calendar integration cases still pass.

I checked the other two cases. The CSV case and the Automation case ("Check with me whether to cancel ... or move it") use requests that a person would write and name no tool. I left them unchanged.

On b984016, all four asking.eval.ts cases pass in behavioral shard 4/4.

via @dcramer.

--

View Session [Sentry]

@vercel

vercel Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
junior-docs Ready Ready Preview Nov 2, 2026 2:53am UTC

Request Review

sentry-junior Bot and others added 3 commits November 2, 2026 01:40
…e data

viewImage and imageGenerate said "unsupported image format; use PNG, JPEG,
GIF, or WebP" for a file whose bytes match no image format. For an
attached .png with bad bytes, the agent read this as "the attachment did
not load" and asked for a re-upload as if no file came through. The error
now says the file exists and its content is not PNG, JPEG, GIF, or WebP
data.

Part of #2488

Co-Authored-By: David Cramer <[email protected]>
Slack delivery splits a reply over the inline budget into several posts.
The fixture made each post its own reply, so a long answer failed
`replies` count checks, and the judge saw the answer three times: the
stored reply and each post. Consecutive posts that make up one stored
reply are now one reply. A repeated post is still a second reply.

Part of #2488

Co-Authored-By: David Cramer <[email protected]>
@sentry-junior sentry-junior Bot changed the title test(evals): Use a realistic request in the blocked child asking case test(evals): Make the asking evals realistic, and ask for draft facts Nov 2, 2026
…s go

The createAutomation description said the automation "delivers to the
channel or DM of this conversation". With a task_creator outcome, the
messages go to the creator's DM. Guardian read the description, decided
that a direct reminder asked for in a public channel would post to that
channel, and asked for confirmation (unclear_destination). The
description now says that the automation belongs to the conversation and
that its outcomes set where its messages go.

Part of #2488

Co-Authored-By: David Cramer <[email protected]>
@dcramer

dcramer commented Nov 2, 2026

Copy link
Copy Markdown
Member

evals are failing, is that related?

sentry-junior Bot and others added 7 commits November 2, 2026 02:17
…read it

When the vision model could not read an image, the turn input said only
that the attachment "could not be analyzed". The agent then told the
user that the attachment did not come through and asked for a re-upload,
as if no file arrived. The error now says the attachment arrived and the
vision model could not read it.

Part of #2488

Co-Authored-By: David Cramer <[email protected]>
The case named spawnAgent, gave the child task text, and told the parent
what to do with the result. Now Maya asks to hand off a deploy command
for a region that only she knows. The assertions do not change.

Follow-up to #2504, part of #2488

Co-Authored-By: David Cramer <[email protected]>
The asking rule named another person's calendar that returns notFound,
which is the Google Calendar eval scenario. policies/evals.md does not
allow scenario phrases in product prompts.

Co-Authored-By: David Cramer <[email protected]>
The out-of-office asking eval failed on the #2504 head and on this
branch. The agent wrote a reply without the vacation dates and asked
nothing, because it read the dates as a scope choice. A fact that only
the person knows is now a reason to ask, and the agent must not drop it
or guess it.

Co-Authored-By: David Cramer <[email protected]>
The agent can write a complete out-of-office reply without dates, so the
case asked for a fact that the request did not need. Maya now asks for
the day she is back, which only she knows. The assertion does not change.

Co-Authored-By: David Cramer <[email protected]>
The drafting rule allowed a placeholder or a question. So for a draft
that needs a fact that only the person knows, the agent put in a
placeholder and asked nothing. The out-of-office asking eval failed on
the #2504 head and on this branch for this reason. Now the agent puts in
the placeholder and asks for the facts with one addReviewItem item.

Co-Authored-By: David Cramer <[email protected]>

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

When delivery splits a reply inside a code block, it closes the block at
the end of the post and opens it again in the next post. The fixture
removed only the continuation marker, so the reopen line, such as
```ts, kept the posts from matching the stored reply. Slack output now
owns joinSlackReplyPosts, which undoes the markers and the fence close
and reopen, and the fixture uses it.

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

joinSlackReplyPosts removed a fence close at the end of a post and a
reopen at the start of the next post. A cut between two code blocks in
the same language has the same shape, so it also removed real fences
and the posts no longer matched the stored reply.

The fixture now drops code fence lines when it compares posts with the
stored reply, the same way it already drops other formatting. Both
readings of the cut then compare the same, and Slack output does not
need to export a join helper.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 0a23d5e. Configure here.

if (!postTexts[start]) return 0;
let joined = "";
for (let end = start; end < postTexts.length; end += 1) {
joined = joined ? `${joined} ${postTexts[end]}` : postTexts[end]!;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fence-only posts break reply matching

Low Severity

comparableText now drops every fence line, so a Slack split whose first chunk is only a fence close or reopen becomes an empty postTexts entry. postCount then returns immediately and never joins the later chunks, so slackCallReplies misses the stored reply.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 0a23d5e. Configure here.

@dcramer
dcramer merged commit 59025b2 into main Nov 2, 2026
50 checks passed
@dcramer
dcramer deleted the fix/asking-eval-overfit branch November 2, 2026 16:48

This branch was successfully deployed

1 active deployment
Preview – junior-docs — 0a23d5e6 Deployed Nov 2, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk: high PR risk score: high

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant