Agent-compatibility testing, in your pipeline.
Playwright replays scripts you maintain. Frictionary sends real frontier-model agents at your app with no script, tells you, task by task, model by model, whether they can complete it and where the risk is, and fails the build when they can’t.
Every run answers two questions per task × model: can an agent complete it, and how safe was the path? A task can pass at high risk, completed, but the agent took a destructive or flaky route, which success/fail alone hides.
gpt-5.4-mini claude-haiku-4-5 gemini add to cart ✓ ~? ✓ checkout ✗! ✗! ✗! sign up ✓ ✓ ✓ ✓ completes ~ detours ✗ fails ! high-risk ? medium-risk
Config as code
frictionary.json next to your code, the target project, the pass bar, what fails the build.// frictionary.json
{
"projectId": "<from the app>",
"minScore": 80,
"failOnBlocking": true
}Gate in CI
# .github/workflows/frictionary.yml
- name: Agent-readiness gate
env:
FRICTIONARY_API_KEY: ${{ secrets.FRICTIONARY_API_KEY }}
run: npx frictionary test --min-score 80Or call the API
# Start a run
curl -X POST https://frictionary.ai/v1/runs \
-H "Authorization: Bearer $FRICTIONARY_API_KEY" \
-H "content-type: application/json" \
-d '{"projectId":"..."}'
# Poll, returns score + the compatibility matrix
curl https://frictionary.ai/v1/runs/<id> \
-H "Authorization: Bearer $FRICTIONARY_API_KEY"Agents are becoming the client
You test that browsers can render your app. Agents are the next runtime, test that they can operate it, before your customers’ agents find out they can’t.
No scripts to maintain
Tests are intents (“complete checkout”), not brittle step-by-step selectors. The agent figures out the path; you learn where it breaks.
Across the models that matter
GPT, Claude, and Gemini attempt each task. Cross-model disagreement is a finding a single-model test can never surface.
Readiness as CI history
Runs carry the commit and branch, so agent-readiness reads like any other check, green on main, red on the PR that broke it.