Repository navigation
Eval: judge each case on the outcome a user would see - #5167
Merged
Merged
Conversation
…lated site registry
11 of 13 tasks
…delete each other's sites Cases created their sites at ~/Studio/<site name> and deleted that folder before the turn, so two runs of the same case at once, including repeats, destroyed each other's site mid-turn. The runner now sets a temporary sites root per case before anything reads it.
chubes4
marked this pull request as ready for review
October 21, 2026 02:39
Collaborator
📊 Performance Test ResultsComparing 29c1f63 vs trunk app-size
site-editor
site-startup
Results are median values from multiple test runs. Legend: 🟢 Improvement (faster) | 🔴 Regression (slower) | ⚪ No change (<50ms diff) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Related issues
How AI was used in this PR
Claude (via the Pi coding agent in a Roadie session) wrote the outcome capture, the checks, their unit tests and the isolation, and ran the suite on this branch and on the #5146 spike. I reviewed the diff and the results. The checks in
outcome.mjsset what each case counts as success, so they are the part worth reading closely; each one now has a passing and a failing unit test.Proposed Changes
~/Studio/<site name>and delete that folder before the turn. Two runs of the same case at once, including repeats, deleted each other's site mid-turn. The runner now loads through a small entry (eval-runner-entry.ts) that sets a temporary sites root per case before anything reads it.site-paths.tshonours it underE2E, the same waywell-known-paths.tshonoursE2E_CLI_CONFIG_PATH. Eval sites no longer land in~/Studio. Ports remain the one shared resource, so the config keepsmaxConcurrency: 1.eval-outcome.ts). The checks live inoutcome.mjs, with parameters in each case's vars. There is still no LLM grader.scripts/eval/outcome.test.mjsruns each check inoutcome.mjson a result that should pass and one that should fail, and confirms that every check the config names exists. Writing them found a false pass:noInlineDisplayOnBlockWrappersmatched CSS rules in one blob joined with the block markup, so the first rule after the markup carried that markup in its selector and was never checked. It now reads each stylesheet on its own (theme.cssfiles, custom CSS,<style>blocks and theme.jsoncss).answers: [{ label: Cancel }]) and passes when nothing was pushed and the agent asked, either with a question (questions) or in its reply.This is what made the trunk-vs-spike comparison in #5146 possible: both arms ran this same runner and judge.
Testing Instructions
npm run eval -- --filter-pattern "identifies as|leaves a working new site": both pass on this branch, built from trunk.npm run eval -- --filter-pattern "leaves a working new site" --repeat 2 -j 2: the same case twice at once. Both pass, each with its site in its own folder.npx vitest run apps/cli/lib/tests/site-paths.test.ts scripts/eval/outcome.test.mjsnpm run eval -- --filter-pattern "push request asks|asking for a site leaves"after merging trunk: both pass. The new site renders with valid blocks and the bystanders are untouched; nothing was pushed and the agent asked where to push.differentiate-preview-vs-remote.Pre-merge Checklist