How the cache works
A cached step stores more than one way to find its target: where the element sits on screen, what it looks like, what text it contains, and the accessibility and structural attributes around it. Which of those signals matters for a given step is inferred from the step’s natural-language description. “The red Cancel button below the Order Summary header” leans on visual and positional signals; “the Sign in button” leans on accessibility and text. On replay, the runner matches the stored signals against the live page or screen and runs the action without invoking the LLM when there’s a match. When the signals no longer match, auto-heal re-resolves the description against the current UI and updates the entry in place.Element checks with long timeouts
Element checks (checkElementVisible,
checkElementExists, and the rest of the family) poll until their condition
holds or the timeout elapses. When the step has a cache, the poll replays from
cache on every attempt - cheap, and exactly what you want while a page is still
loading and the element hasn’t appeared yet.
If the element is present but its cached locator has gone stale (the page was
restructured, the element moved, or its surrounding signals changed), the check
periodically re-resolves the description with AI during the wait instead of only
once after the timeout. As a result the step finishes as soon as the element
is found rather than burning the entire timeout on cache-only polling.
This AI fallback only fires when the cache actually misses, on a cadence that
scales with the timeout (more frequent for short checks, less frequent for long
ones) so cost stays bounded, and a final re-resolution always runs at the end as
a safety net. Checks whose cache still resolves never spend an AI call.
Cache saving eligibility
A run only saves cache when it passes and the run is eligible.- CI runs (
CI=true) are always eligible. - Local runs are eligible when the current branch is not the main branch or a protected branch.
- Pass
--save-cacheto force eligibility.
Never cached
- AI-evaluated steps like AI check and AI extract
- Steps whose variables change every run (e.g.
{{ Date.now() }}) - Steps with caching explicitly disabled
Disabling cache
Globally:last item in list.
Cache invalidation
Cache entries are scoped per step. Changing a step’s natural-language description or the variable values it depends on (e.g. a different{{ env.USERNAME }}) re-keys the entry. Re-rendering siblings, mutating
unrelated attributes, or animating background content does not.
Storage
- Stored per organization; only accessible to authenticated runs
- Expires after 90 days of inactivity
Git-based isolation
Caches are scoped per branch so concurrent work doesn’t collide:mainkeeps per-commit caches; new branches seed from the cache at their merge base.- Non-main branches store only the latest cache.
- On merge, the merged branch’s cache is combined with
main’s previous commit so subsequent runs onmainkeep passing.