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:

  1. Accessibility tree, labels and ids straight from the AX tree. Exact, fast (~36 ms warm), and stable across layout changes.
  2. Element map, persistent per-app element ids that survive relaunches, so a spec keeps working across runs.
  3. Template match, grayscale normalized cross-correlation against a captured template, for custom-drawn controls the AX tree never exposes.
  4. OCR, text-only fallback. Always reported as such, so you know when your spec is standing on sand.
shell
# 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=true

Deterministic 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.

shell
- 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.

shell
npx manzanasd-client@latest doctor

Full changelog on the v0.7.0 release.