Skip to content

test(evals): Move scheduler model-choice cases to behavioral - #2519

Merged
sentry-junior[bot] merged 1 commit into
fix/integration-evals-combined-mainfrom
test/scheduler-model-choice-behavioral
Nov 2, 2026
Merged

sentry-junior[bot] merged 1 commit into
fix/integration-evals-combined-mainfrom
test/scheduler-model-choice-behavioral

Conversation

@sentry-junior

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

Copy link
Copy Markdown
Contributor

Stacked on #2520. Merge #2520 first. GitHub then retargets this PR to main.

This PR moves the scheduler cases that test model choice from the integration suite to the behavioral suite. The assertions do not change.

  • Delivery: "when a due reminder says me, mention its creator" and "when a due reminder names the Automation creator, mention its creator". Whether the reminder post writes the creator mention is model choice.
  • Creation: whether a created instruction says "the Automation creator" is model choice. The integration creation case keeps the "this channel" assertion, because only a unit test covers that createAutomation gate.

With #2520, renderTaskInput writes the creator mention in place of "the Automation creator" before the run sees the instructions. heartbeat-scheduled-automations.test.ts now checks that wiring: a stored "the Automation creator" reaches the run as the mention in the Instructions: line. So the moved "names the Automation creator" case no longer tests the swap itself. It now tests only that the model copies the mention into the post. Its assertions stay as they are.

"says me" stays model choice. Legacy instructions say "me", and only the Created by: line tells the run who that is.

Part of #2488

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 4:30am UTC

Request Review

Whether a due reminder post writes the creator's mention, and whether a
created instruction says "the Automation creator", is model choice.
The behavioral suite owns model choice. The assertions do not change.

The runtime wiring stays covered. The creator mention in the run input
is checked in heartbeat-scheduled-automations.test.ts. createAutomation
rejects "this channel", and only a unit test covers that gate, so the
integration creation case keeps that assertion.

Co-Authored-By: David Cramer <[email protected]>
@sentry-junior
sentry-junior Bot force-pushed the test/scheduler-model-choice-behavioral branch from 68d5644 to 9041739 Compare November 2, 2026 04:29
@sentry-junior
sentry-junior Bot changed the base branch from main to fix/integration-evals-combined-main November 2, 2026 04:30
@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

5 screenshot changes — 5 changed · 0 added · 0 removed

Review screenshots in Frameshift

Automation Run Details · Desktop
Automation Run Details · Desktop
Changed
Automation Run Details Light · Desktop
Automation Run Details Light · Desktop
Changed
Conversation Child Agent Drawer · Desktop
Conversation Child Agent Drawer · Desktop
Changed
Conversation Child Agent Drawer · Mobile
Conversation Child Agent Drawer · Mobile
Changed
Conversation Share Details · Desktop
Conversation Share Details · Desktop
Changed

@sentry-junior
sentry-junior Bot merged commit 3512ef0 into fix/integration-evals-combined-main Nov 2, 2026
50 checks passed
@sentry-junior
sentry-junior Bot deleted the test/scheduler-model-choice-behavioral branch November 2, 2026 16:58
dcramer added a commit that referenced this pull request Nov 2, 2026
…2520)

Integration evals on PRs off main with both #2514 and #2504 failed four
cases. Each failure has a root cause in a tool contract, a turn input,
or the eval fixture. None is a runtime double post.

**Attachments: "when the vision model cannot read an image"** (0.50 in 4
of 4 runs on main; at the 0.75 floor in 9 of 13 earlier runs)
The turn input said only that the image "could not be analyzed".
`viewImage` said "unsupported image format; use PNG, JPEG, GIF, or WebP"
for a `.png` with bad bytes. The agent then told the user that the
attachment "didn't come through" and asked for a re-upload, as if no
file arrived. Both messages now say that the file arrived but could not
be read as an image. The case now scores 1.0.

**Slack Thread Status and Title, both cases** ("expected 2 to have a
length of 1")
This is not a double post and not a second title. The failing assertion
is `replies` (lines 27 and 42). Since #2514, a how-to answer is about
2,200–2,400 characters, which is over the 2,200-character Slack inline
budget. Delivery splits it into two posts. #2514's own branch failed
this way at 08f9f6a. The fixture counted each post as a reply, and the
judge saw the answer three times.

The fixture (`slackCallReplies` in `src/fixture/results.ts`) now treats
the consecutive posts that make up one stored reply as one reply. A
repeated post is still a second reply. The comparison removes the
continuation marker and drops code fence lines. A split inside a code
block closes the block in one post and reopens it, with its language
tag, in the next. Dropping the fence lines also keeps a cut between two
real code blocks matching. The fix is fixture-only, and Slack output
code does not change. I checked it against the real split posts of the
failing runs. Unit tests cover a plain split, a split inside a ```ts
block, a cut between two code blocks, and a repeated post.

**Schedule Creation: "simple one-off reminder"** (Guardian `ask`, then
the agent asked to confirm)
The `createAutomation` description said that the automation "delivers to
the channel or DM of this conversation". Guardian believed it over the
`task_creator` outcome and returned `unclear_destination`. The new
Guardian snapshot reproduces this on the old description (run
41374373955: "schedules a reminder in the active public Slack channel")
and allows on the new one (run 41374880826). The description now says
that the automation belongs to the conversation and that its outcomes
set where its messages go. A later cleanup removes the sentences that
other surfaces already own. The `<tool-policy>` block owns creator
credentials and subscribable tool results. The trigger `identifier`
field and `searchEventTypes` own namespace-wide event reach. The cleanup
also removes the provider example from core. The first invalid call
(`timezone` beside `schedule`) is a model nesting slip that 8 earlier
passing runs also had. The strict schema catches it, and the retry
recovers.

**Scheduled Delivery: the creator mention** (run 41382009284 on
60f4efe, all 3 attempts)
`createAutomation` is in the tool list of every automation run. A change
to its description stops the stored recordings from matching, so these
cases run live. Live, a reminder for its creator often posted without
the mention: "Reminder: The Automation creator, please do
healthchecks.", "Reminder: Do your healthchecks.", and "Reminder: Do
healthchecks.". Such a reminder posts to the channel without pinging its
creator.

`requireInstructionReferences` makes a stored instruction call the
creator "the Automation creator". `renderTaskInput` passed that text
through, and only the `Created by:` line told the run to write the
mention instead. `renderTaskInput` now writes the creator mention in
place of "the Automation creator" (any case, whole words). Scheduled and
event automations pass a creator. Watches do not, so their input does
not change. The `Created by:` line stays, because it still covers "me"
and "my". `heartbeat-scheduled-automations.test.ts` now checks that a
stored "the Automation creator" reaches the run as the mention in the
`Instructions:` line. The test fails without the fix.

All three failures were on "when a due reminder says me, mention its
creator". Its legacy instruction says "me", not "the Automation
creator", so this fix does not reach it. That case stays model choice.
#2519, stacked on this PR, moves it to the behavioral suite. This PR
does not move it.

CI: pending on a35f17f.

Part of #2488

<!-- junior-request-attribution:start -->
via @dcramer.
<!-- junior-request-attribution:end -->

<!-- junior-session-footer:start -->
<!-- junior-conversation-id:agent%3A7a1dc2757924a78a9104357ce0de2cbf -->

--

[View
Session](https://junior-prod.sentry.dev/conversations/agent%3A7a1dc2757924a78a9104357ce0de2cbf)
[[Sentry]](https://sentry.sentry.io/explore/conversations/agent%3A7a1dc2757924a78a9104357ce0de2cbf/?project=4510944073809921)

<!-- junior-session-footer:end -->

---------

Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com>
Co-authored-by: David Cramer <[email protected]>

This branch was successfully deployed

1 active deployment
Preview – junior-docs — 9041739f 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