A real run against an AI-generated page

The Agent said done. The 360px phone disagreed.

One deterministic pass found a missing service worker, a text-enlargement overflow, and an oversized initial download. After the repair, every blocking root cause was gone.

Evidence board

Same page, measured before and after

Select any matrix cell. Both screenshots and the dimension status update together; the screenshots are copied unchanged from the report.

Mobile parameter matrix

Before repair

Agent-complete

fail
Generated vocabulary page at 360 by 800 with 1.5 times text: the bottom controls push outside the narrow layout.

1.5× text makes the page 5px wider than a 360px viewport. The service worker fails in all eight variants.

After repair

Delivery-safe

warn
The repaired vocabulary page at 360 by 800 with 1.5 times text: controls wrap and stay inside the layout.

The bottom controls wrap inside the viewport. The service worker error is gone. Only the 710KB transfer warning remains.

Selected 360 × 800 · 1.5× text · 34px safe area

Before console_error · text_scale_layout_break · transfer_budget

After transfer_budget only

Root-cause ledger

Three problems, three repairs

The Agent summary aggregates repeats across viewports. These are root causes, not eight copies of the same warning.

  1. console_error

    Missing service worker

    Every matrix cell logged a 404 while fetching the service-worker script.

    Repair Remove the stale registration and load only the shipped worker.

    resolved

  2. text_scale_layout_break

    Five pixels outside the phone

    At 1.5× text on 360px, the page became 5px wider than its viewport.

    Repair Let the bottom actions wrap instead of forcing a single row.

    resolved

  3. transfer_budget

    710KB initial download

    Two requests exceed the 400KB transfer budget. This remains visible after the blocking defects are fixed.

    Next Audit the largest asset before treating performance as complete.

    warning

Machine-readable trail

The Agent gets a repair list, not a screenshot verdict

Each root cause includes its selector, affected triggers, suggested repair, and a reproduction command. Open the compact summaries below or inspect the complete report in the repository.

Before repair fail · 10 block · 3 roots
{
  "status": "fail",
  "summary": {
    "total_block": 10,
    "total_warn": 8,
    "unique_root_causes": 3,
    "affected_viewports": 8
  },
  "failed_items": [
    "console_error",
    "text_scale_layout_break",
    "transfer_budget"
  ]
}
Open complete before JSON
After repair warn · 0 block · 1 root
{
  "status": "warn",
  "summary": {
    "total_block": 0,
    "total_warn": 8,
    "unique_root_causes": 1,
    "affected_viewports": 8
  },
  "failed_items": [
    "transfer_budget"
  ]
}
Open complete after JSON

Run it on your page

One command. Eight phone variants. No test file.

The default pass opens the page in Chromium, probes the primary action safely, and leaves screenshots plus structured evidence.

python -m pip install ego-webqa then ego-webqa https://your-preview.example