Repository navigation
Conversation
Base automatically changed from
wiffletree/ui-evaluators-isolated-model-pinned-evaluator-ru
to
main
November 4, 2026 15:26
added 6 commits
November 4, 2026 10:27
An app run's start_evaluation now names its target: the app's executable, arguments with a test data folder of its own, and the variables it needs. For each turn, the host starts that copy with --automation-socket on a socket of the run's own. Its environment is cleared and holds no session variable or token, a given PATH goes first, and WORKSPACE_SKIP_LOGIN_ENV keeps the copy's host from adopting the login shell's PATH. The provider starts only once the socket answers; a copy that exits or never answers fails the run with the reason. However the turn ends, the copy's group and every group it started are stopped. Two unended runs cannot share a data folder, and none may use Wiffletree's own. The run's only MCP server is the app driver, wiffletree-host app-driver-mcp: screenshot, click, double_click, right_click, move, type_text, key, scroll, drag, resize_window and window, in window points. The Claude and Codex launches and their start and tool-call checks allow exactly that server and those tools. The automation socket gains capture, which renders the app's own window through CGWindowListCreateImage at points or native scale, and resize, which keeps the window within its minimum and its display. Measured on macOS 27.0.1 from a launch with no Screen Recording grant: the app captured its own window, while screencapture -l failed. drive_desktop.py's shot uses it, so it no longer needs the permission.
The driver runs outside the evaluator's sandbox, so a link already in the run folder could lead a screenshot's write, or the folders created for it, out of the folder. Each existing part of the path must not be a link, and the file opens with O_NOFOLLOW.
…ta-dir workspace-desktop uses the last --data-dir it is given, so a target with several could open a folder the checks never saw; only one is allowed now. A profile not created yet is resolved from its deepest existing ancestor with . and .. applied, so two spellings of one new folder are the same folder to the same-data-folder refusal.
The coordinator now creates the data folder before start_evaluation, and Wiffletree canonicalizes it, so links and .. cannot hide an overlap with its own folder or a folder another run uses; the partial resolution of folders not yet created is gone. The --data-dir=<path> spelling is refused, so the only data folder checked is the one the app reads. The screenshot tool says Claude downsizes images over 2000 pixels on the long edge, so pixels are sampled from a points shot. The design states the driver as Codex's one MCP exception.
The stop listed only the copy's current descendants, so a helper in a session of its own lost its parent when the copy exited, at startup or later, and was never signalled. The copy's tree is now followed by the process watcher, which keeps orphaned members, and the stop signals every group it followed.
MHohlios
force-pushed
the
wiffletree/ui-evaluators-app-driver-over-the-automation-soc
branch
from
November 4, 2026 15:37
2db6620 to
514340f
Compare
…re signalling it The copy's exit check and the stop's grace loop reaped it, after which its id, and its group's, could name an unrelated process the stop still signalled. The exit check now leaves it unreaped, the copy's group is stopped as a provider's is, frozen while the watcher looks, and each group of what it started is stopped with stop_group, only while a process the watcher followed is alive in it. A test waiting for a pid file is bounded.
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.
Summary
This is the second of the stacked PRs for the OpenSpec change
ui-evaluators, on top of #261, which is now on main. App-only evaluator runs can now drive the app under test, and only that app.start_evaluationin app mode takes a target: an absolute executable, arguments with one--data-dir <existing folder>, and an environment. Before each turn the host launches the copy with--automation-socketon a short socket path for the run.WORKSPACE_SKIP_LOGIN_ENV=1makes its host skip login-shell PATH adoption. NoWORKSPACE_*or*_TOKENvariable reaches it...can't get around the checks. A data folder that overlaps Wiffletree's own data is refused. So are a second unended run on the same folder, a repeated--data-dir, and the--data-dir=<path>form.wiffletree-host app-driver-mcpis the run's only MCP server, namedapp. Its tools are screenshot, click, double_click, right_click, move, type_text, key, scroll, drag, resize_window and window. Coordinates are window points. Screenshots are saved only inside the run folder; links out of it are refused, and the file is opened withO_NOFOLLOW.capturestep gets the app's own window fromCGWindowListCreateImage, at 1× and at the display's native scale. This was measured from a launch with responsibility disclaimed (CGPreflightScreenCaptureAccess= 0): the capture worked whilescreencapture -lfailed.scripts/drive_desktop.py shotnow uses this step.appserver and exactly its tools. The start and tool-call checks reject anything else.provider::app_targettests.Decisions
How it was tested
cargo fmt --checkandcargo clippy --workspace --all-targets -D warningsare clean, andcargo test --workspacepasses...;workspace-desktopthrough every tool, including both screenshot scales and resizes to 960×600, the largest size and 1280×820;mcp__app__*tools, and the image reached the model.Follow-ups
crates/workspace-desktop/src/automation.rs:249).wiffletree-hostno longer holds Screen Recording (openspec/changes/ui-evaluators/specs/ui-evaluators/spec.md:92).crates/workspace-host/src/app_driver.rs:262).main.rs; tests only check that the launcher sets it (crates/workspace-host/src/main.rs:173).crates/workspace-host/src/provider/app_target.rs:48).Reviewed with Wiffletree: 2 full reviews and 2 re-checks, 6 rounds (Tests, Claude, Codex, Style)
🤖 Generated with Claude Code