The mental model
A typical Momentic test is written as explicitclick and type steps and
spells out how to reach an outcome. Click this, type that. Instead, with AI
action you tell Momentic what you want, and then AI figures out the how.
Planning with AI is slow, so the agent caches the steps it resolves on the first
successful run and replays them deterministically afterward, paying the model
cost once instead of on every run.
This changes what you maintain. Instead of a list of steps tied to the current
layout, you keep a short statement of intent. Because your goal names the
outcome rather than the exact path, the test holds up through UI churn, and the
agent re-resolves the steps whenever the UI moves. The rest of this guide
refines that approach: when to split a goal, how to guard it, and what to avoid.
Rolling up a Google Flights search
This section uses a flight search on Google Flights to show the highest-leverage move in AI action. You take a series of low-level steps whose only purpose is to reach some state, then collapse them into a single goal that names that state. First, here is the search written the imperative way. It spells out every click and keystroke, so the actual intent of searching two cities for two dates gets buried in the mechanics, and a reader has to reconstruct it from the steps.flight-search.test.yaml
flight-search.test.yaml
Assert the end state with a postcondition
Before the agent calls a goal done, it always checks a postcondition and derives one from the goal if you do not supply your own. You write an explicitpostcondition when you need to be precise about the end state, either because
the derived check is too loose or because the goal alone does not tell the agent
what “done” should look like. For a flight search you might require that results
actually rendered, not just that the form was submitted. Either way the
postcondition is a protected check that runs against the live page once the
agent finishes, and the agent cannot skip or edit it.
flight-search.test.yaml
act, since it spells out
what “done” means for that step. That makes each step a clean checkpoint when
you chain them together, so one act hands off to the next at a known state
instead of wherever the goal happened to stop. The
section on guards below goes
deeper and covers preconditions too.
Group goals into semantic phases
The rollup above has a counterpart, which is that you should not collapse an entire test into one giant goal either. The sweet spot is a few AI actions that each map to a phase a reader would recognize. Eachact becomes a labeled
checkpoint in the trace, so when something fails you know which phase broke.
browse-products.test.yaml
Guarding a flow with pre- and post-conditions
The rollup introducedpostcondition. Its counterpart is precondition, which
guards the start of a flow. Both are protected assertions the agent cannot
edit or skip, so they are the honest definition of “did this work”. A
postcondition is more than a pass/fail gate, because if it is not met when the
agent finishes, the agent treats it as a target and keeps working toward it,
failing the step only if it cannot get there. A flow that “completed” in the
wrong place is therefore either corrected or fails loudly.
login-guarded.test.yaml
precondition to fail fast and clearly when setup is wrong (wrong page,
not logged out) instead of letting the agent flail. Add an explicit
postcondition whenever the auto-generated one is too loose for a
state-changing goal.
Pre- and post-conditions follow the same rules as AI
check steps. Assert structural,
qualitative facts (“a confirmation is shown”), and never exact counts, prices,
timestamps, or IDs that change between runs.
Feeding the agent context it cannot infer
The agent only knows what is on screen. Anything external (an invite code, a specific record to act on, credentials) must come in through variables. Reference them with{{ env.NAME }} in
the goal.
login.test.yaml
Limitations of AI action
An AI action is a bounded planning agent, not a general program. Designing within these limits keeps tests fast and deterministic.No unbounded or infinite loops
The agent will not “keep clicking Next until the list is empty” forever. It runs a bounded plan with a retry budget and then stops, and it will not repeat an ineffective interaction more than a couple of times. If your intent is genuinely to repeat until some condition, express the bound explicitly and keep it finite.- Avoid
Keep loading more results until every order is on screen. - Prefer
Click "Load more" up to 3 times, then stop.