Repository navigation
Flows: follow named flows through a build, with named checkpoints that two runs pair up by - #74
Draft
brentvatne wants to merge 3 commits into
Draft
brentvatne wants to merge 3 commits into
brentvatne wants to merge 3 commits into
Conversation
…t two runs pair up by
explore:binary and explore:session take --flows FILE: named flows, each a list of exact actions
(the --replay format), steps described in words ({"do": …}) and named checkpoints. Each flow after
the first starts from a relaunched app. A model carries out each described step on its own, with
only observe and act, so the explorer still records and blocks what it always does.
The explorer offers start_flow, checkpoint and end_flow to a flows run. A checkpoint is always
recorded, reusing the picture taken on arrival when nothing has happened since. A flow becomes a
journey of the map, named after the flow, and the exploration report lists each flow with its
status and its checkpoints in order (exploration.flows, optional). A failed step ends its flow
and names the checkpoints it did not reach; the next flow still runs.
|
Viewer preview of d944e7d · reports from brentvatne/euxy#163
The link stays the same on every push. Deploy run |
…nch left stale From a review of #74 and an adversarial review of its fixes: - A checkpoint reused the picture taken on arriving at a screen even after a relaunch, or after the model looked again. The arrival picture now lasts only until the next look at the app. - Flows and checkpoints went missing from exploration.flows: a flow whose relaunch failed, a checkpoint whose observation threw (its flow still said completed), and on a budget stop, everything not reached. start_flow now creates the record before relaunching; a checkpoint that throws is recorded as missing and fails its flow; and when the run ends, the explorer asks the strategy which checkpoints it never attempted and records them as missing. A run blocked at launch records every flow as failed. - explore:session's first flow started wherever the app was. The first open relaunches when the run follows flows, before the check that the app stays open. - A flow's journey stopped at the first screen change that was not a transition. The walk now goes on as another journey of the flow (journeyIds). - A launch-URL error, at the start or during a relaunch, was a plain error that ended the run without its secrets removed. Both are wrapped through failureText. After two relaunches fail in a row, the flows stop. - A described step or a secret limited to another platform no longer needs a model or a value. - assertFlowsFit counts the tool calls the flows take, as assertReplayFits does.
brentvatne
added a commit
that referenced
this pull request
Oct 24, 2026
… access by platform, counts turns, and hands the explorer the checkpoints a flows run never attempted
…alls, and skip flows with nothing to compare From a second review of #74: - A checkpoint was marked attempted before the explorer answered, so a screen, turn or time budget that stopped the run during the call dropped it from exploration.flows. It is now marked once the call returns, and recorded as "The run stopped before it." otherwise. - A described step's 40-call limit relied on the session's maxTurns, which a Codex session does not have: one step could spend the whole run's budgets. runGoal now counts the calls and fails the step at the limit. - A checkpoint on a screen that withholds its picture (a secret on it, a blocked screenshot) is recorded without one and its flow goes on, as the code did; the README said it ended the flow. The docs now say so, and the run's summary lists such checkpoints. - A flow with no checkpoint on the platform being run is skipped, and its steps need no model or secrets. - explore:session --flows without --platform required every platform's secrets. It now checks them once the session reports its platform, still before any device work. - A test runs a described step through runBoundedSession, which rejects with AGENT_CANCELLED when step_done ends the step, as the real sessions do.
brentvatne
added a commit
that referenced
this pull request
Oct 24, 2026
…nputs wait for the session's platform on a flows run runSessionExploration now chooses its strategy before it knows the platform, so the #74 change is ported onto strategyInputs: a flows run without --platform reads its secrets once the session reports its platform.
This branch has not been deployed
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.
Someone who wants to look at particular paths through an app (signing in, or opening a pattern) can now name those flows and the checkpoints along each one. The same flows in two runs (two builds, or an iPhone and an Android phone) line up checkpoint by checkpoint. This is the first capture strategy beyond model exploration and
--replay, and the comparison builds on it.{ "flows": [ { "name": "Open a pattern", "steps": [ { "action": "tap", "label": "Patterns" }, { "checkpoint": "Patterns" }, { "do": "Open the first pattern in the list" }, { "checkpoint": "Pattern" } ] } ] }How it works
--replayformat;do);checkpoint.src/binary/flows.ts). It gets onlyobserveandact, plusstep_doneandstep_blocked, so the explorer records every action and refuses the same controls it always does. A step gets 40 tool calls, counted by the runner because a Codex session has no turn limit of its own. A flows file with only exact steps needs no model.start_flow,checkpointandend_flow(src/binary/explorer.ts).open <app> --relaunch, which ends the process and keeps the app's data. The run's first open relaunches too, so onexplore:sessionthe first flow doesn't start wherever the app was left.journeyIds), with ids derived from the flow's name, so they are the same in every run. When the app moved without a recordable transition, the walk goes on as another journey;exploration.jsongains an optionalexploration.flows, holding each flow's status and its checkpoints in order (ExplorationFlowinsrc/contracts/standalone-report.ts).{{secret:NAME}}inputs indosteps, and--provider/--model/--hintswhen there is no described step. A described step or a secret limited byplatformsto another platform needs no model or value, and a flow with no checkpoint on the platform is skipped. Onexplore:sessionwithout--platform, secrets are checked once the session reports its platform.Tried on euxy
Three runs of a three-flow file on a euxy
e2ebuild (main 07d5aab), each on a local iPhone 17 Pro simulator, withgpt-6.1-solfor the described steps:Not in this PR
Tests
test/node/binary-flows.test.mjs(23 tests) drives the real explorer with a scripted device and a scripted model.test/helpers/flows-host.tsgives the tests the explorer's ownCiError, so a device error is recognised as one.test/node/binary-local.test.mjsadds 3 tests throughrunBinaryExplorationwith a fake local controller:runBoundedSession, which rejects withAGENT_CANCELLEDwhenstep_doneends the step.npm testpasses (1732 tests),tscis clean, and lint shows only the 6 existing Viewer warnings.🤖 Generated with Claude Code