Your iOS app already has a CLI.

It's called accessibility.

The Button Heist runs inside your app and makes the live accessibility contract programmable: state, actions, waits, diffs, receipts.

Settled screen

button Pay activate
static text Total $49.00
text field Email type text
adjustable Quantity increment
action on element Activate(.label("Pay"))

Semantic diff

appeared
Payment Complete
updated
Total

Expectation

expect
appeared
target
label("Payment Complete")
evidence
matched diff
result
expectation held
Activate(.label("Pay"))
    .expect(.appeared(.label("Payment Complete")))

Agents steer from evidence.

Each action returns what changed, so the next step comes from the current contract.

Tests assert the contract.

Durable black-box tests over product semantics, not view internals.

Every heist audits accessibility.

If a workflow cannot be reached or operated through the live tree, that failure matters.

In-process because that is where the real interface lives.

Outside the app you get proxies, snapshots, and tap coordinates. Inside the app you get the live accessibility hierarchy and interaction surface.