Every agent-driving-a-simulator demo you have seen quietly skips the hard part: how does the agent know what it is looking at? Coordinates break when layout moves. Screenshots-and-OCR guess. v0.7.0 is about replacing guessing with resolution, and then checking the result mechanically.
The resolver ladder
Element references now resolve through four layers, tried cheapest and most-reliable first:
- Accessibility tree, labels and ids straight from the AX tree. Exact, fast (~36 ms warm), and stable across layout changes.
- Element map, persistent per-app element ids that survive relaunches, so a spec keeps working across runs.
- Template match, grayscale normalized cross-correlation against a captured template, for custom-drawn controls the AX tree never exposes.
- OCR, text-only fallback. Always reported as such, so you know when your spec is standing on sand.
# every action resolves through the ladder, cheapest reliable layer first
manzanas tap_element {label: "Sign In"} # 1. accessibility tree (fastest, exact)
manzanas tap_element {id: "login-button"} # falls through on miss...
# 2. element map, stable per-app element ids across launches
# 3. template match, normalized cross-correlation on the frame (NCC threshold)
# 4. OCR, text exists somewhere, but no structure; last resort, always reported
# whichever layer resolved, the journal records it:
$ manzanas journal tail $MANZANAS_LEASE
lse_9f2 seq=14 tap_element label="Sign In" resolved_by=ax elapsed_ms=36 ok=trueDeterministic asserts
Resolution answers "where is it." Asserts answer "is it right." The same run-spec can now carry mechanical checks, visibility, absence, touch-target size, label contrast, that fail the run with an annotated screenshot in the journal instead of passing silently while the button moved.
- name: quality gate
assert:
- visible: {label: "Welcome, agent!"}
- not_visible: {label: "Invalid credentials"}
- touch_target: {label: "Sign In", min_pt: 44}
- contrast: {label: "Welcome, agent!", min_ratio: 4.5}These are the checks that catch what green unit tests never see: the light-mode button nobody re-checked, the tap target that shrank under 44pt, the label that lost contrast after a color-token refactor.
Also in v0.7.0
manzanas doctor, one-shot setup diagnosis where every failure names its fix.npx manzanasd-client@latest doctor, the whole install collapsed to one line; the npm wrapper fetches the right binary for your platform and proxies everything.- Setup wizard, wait-for-pixel-stability, scroll gestures with momentum, and mirrord capture/input hardening across three macOS capture backends.
Get it
Everything above is in the released v0.7.0 binaries, the homebrew tap, and npm today.
npx manzanasd-client@latest doctorFull changelog on the v0.7.0 release.