ComposeProof MCP  /  Equal AI  /  Agentic Workflow

The agent tests UI regressions.

A live ComposeProof session driving the production Equal AI app — drive the snooze flow, then assert the change from the live ViewModel. No human eyeballing a screenshot.

6test beats
PASSstate-level assert
1real production app
01 / Baseline

Capture the golden. The agent records what "correct" looks like.

cp_inspect_current_screen → cp_take_device_screenshot
02 / Act

Drive the snooze flow — the agent taps, the app responds.

cp_device_interact  action=tap
03 / Choose

Pick a duration. The agent selects by element text, not coordinates.

cp_device_interact  tap_element="1 hr" → "OK"
04 / Drift

The state changes. On → Off, with a scheduled return.

cp_take_device_screenshot
05 / Assert

The catch — assert from the live ViewModel, not the pixels.

cp_inspect_ui_tree + cp_inspect_viewmodel_state
06 / Restore

Leave it as you found it. Toggle back, re-verify.

cp_device_interact  → cp_inspect_viewmodel_state
07 / Tool Calls

The snooze regression test, in order.

01
cp_inspect_current_screen
Establish state — Activity, theme, dimensions.
MainActivity · dark · en-IN
02
cp_take_device_screenshot
Capture the baseline — assistant On.
baseline on
03
cp_device_interact  tap
Tap the toggle — open the snooze sheet.
dialog open
04
cp_device_interact  tap_element
Pick "1 hr" by text, confirm "OK".
snooze set
05
cp_inspect_ui_tree
Assert the "Off" node in the semantics tree.
state flipped · off
06
cp_inspect_viewmodel_state
Read snoozeState straight from the ViewModel.
assert pass
07
cp_device_interact
Toggle back on — restore + re-verify.
restored
08 / Why It's Different

It reads the ViewModel, not the pixels.

SignalBaselineAfter snooze
banner textAI Assistant is OnAI Assistant is Off
assistantStatusACTIVESNOOZED
snoozeStateActiveSnoozed
_showSnoozeDialogfalsefalse
scheduled return1:41 pm today
VerdictgoldenPASS — flip confirmed

Thank you.

▚ Android Pod composeproof.dev →
composeproof.dev
01 / 00