Skip to content

chore: refresh eval results - #239

Draft
supabase-evals-releaser[bot] wants to merge 8 commits into
sean/ai-1034-harness-native-promptsfrom
chore/refresh-eval-results-sean/ai-1034-harness-native-prompts-workflow_dispatch
Draft

chore: refresh eval results#239
supabase-evals-releaser[bot] wants to merge 8 commits into
sean/ai-1034-harness-native-promptsfrom
chore/refresh-eval-results-sean/ai-1034-harness-native-prompts-workflow_dispatch

Conversation

@supabase-evals-releaser

Copy link
Copy Markdown
Contributor

Refreshes apps/web/src/data/eval-results.json from the latest automated eval run.

The eval harness handed every agent a synthetic system prompt. For the
three CLI harnesses that prompt described a tool surface they do not have
(`bash`, `files_read`) and coached them on how to end a turn — both of
which bias exactly what an eval is supposed to measure: out-of-the-box
behaviour.

The CLI engine now treats the system prompt as optional. When it is
empty, nothing is staged and nothing is passed:

- `engine` writes `$HOME/.eval/system-prompt.txt` only for a non-empty
  prompt, and leaves `RunnerExecArgs.systemPromptPath` undefined otherwise.
- claude-code omits `--append-system-prompt-file` entirely.
- codex and opencode, which have no system-prompt flag, stop prepending a
  block (and its blank-line separator) to the *user* prompt.

Refs AI-1034, #164
…034)

With each CLI discovering, advertising and loading skills itself,
`buildSkillsPrompt` becomes ai-sdk-only, like `buildToolSurfaceAddendum`.
The block it rendered told agents to read `.claude/skills/<name>/SKILL.md`
with `files_read` — a path Codex cannot see and a tool no CLI harness has,
duplicating and contradicting what the agent's own harness already tells it.

`buildToolSurfaceAddendum` gets the same gate: `createCliAgent` ignores
`args.tools`, so a CLI agent works the workspace through its own built-in
tools and that text names tools it does not have.

Refs AI-1034, #164
… (AI-1034)

Prompt assembly moves out of `run-eval.ts` (an entry script that runs
`main()` on import, so it cannot be unit-tested) into
`harness/system-prompt.ts`, keyed on `exp.agent.id`. Every block is now
ai-sdk-only — the task framing, the tool-surface addendum, the skills
listing — so a CLI harness assembles to `''` and the engine stages no
system prompt file. The two "end your turn with a short summary" sentences
are gone from both modes: stopping behaviour is part of what is measured.

`runOne` now returns the exact assembled `systemPrompt`, so it lands in
`results/<experiment>/<eval>.json` and what an agent was told is
verifiable from the artifacts. It was previously unrecorded for every CLI
harness. `export-results.ts` builds an explicit whitelist, so it does not
reach the published web data.

`apps/framework` gains a `test` script (`vitest run harness`), wired into
`check`, so the prompt-assembly tests have a runner.

Refs AI-1034, #164
…aller

buildSystemPrompt gated its base framing on the agent but passed the
addendum and skills blocks straight through. Both are ai-sdk-only today,
but that's enforced by their producers across three files rather than by
the assembler, and a block reaching a CLI harness fails silently: no
error, no red test, just an eval measuring our prompt instead of the
agent's own behaviour.

An MCP server carrying a promptAddendum is the live path in. Only
executorMcpServer has one, and only ai-sdk experiments use it, so nothing
changes today — a new CLI-harness experiment paired with it would.
buildSystemPrompt discarded a non-empty addendum for a CLI harness. That
is as silent as injecting it, and the block can be load-bearing:
executorMcpServer's addendum is the pause/resume protocol its tools
require, not a tool description. A CLI harness paired with it would get
the tools and none of the protocol, then stall on the first paused
execution with a recorded prompt of '' explaining nothing.

Throw instead. The producers already gate their output, so anything
arriving here means an experiment is misconfigured.

Also drop BareSandboxHandle.promptAddendum. Its only caller is guarded by
agentRunsInSandbox, true only for CLI harnesses, so buildSkillsPrompt
could only ever return '' for it.
run-eval.ts called main() at module scope, so importing it dispatched a
run and then called process.exit. Nothing exercised that until this
branch added `vitest run harness`, which sweeps in run-eval.test.ts, and
that file imports assertLocalMatchesInterface from run-eval.js. The suite
passes only because main() loses the race with vitest teardown; with
credentials in the environment it would start real sandbox work inside
the test worker and leak containers past process.exit.

Guard the invocation on argv[1]. Importing the module is now inert, and
running it directly is unchanged.

Also name the offending argument in the buildSystemPrompt error and point
at the runtime or MCP server that produced it, rather than calling it a
"harness addendum" when local-stack hands over a pre-joined blob.
Dropping promptAddendum left createBareSandbox with an agent option it
never reads and a comment claiming it decides whether skills are
advertised in the prompt. Nothing in that function advertises anything.
The local-stack session still needs its agent; this one does not.
@vercel

vercel Bot commented Aug 25, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
evals Ready Ready Preview Aug 25, 2026 9:01pm

Request Review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant