visual-qa-starter
no WebMCP host · 7 tools ready

WebMCP review session

The agent triages the drift. You decide what is a defect.

Three screens went to build and came back different. Sweeping all of them, ranking them and drafting the ticket is mechanical work, and this page hands that to your agent as WebMCP tools. What is left is the part that needs a person: looking at the two frames and saying whether a difference is a bug or a decision somebody already made.

The agent cannot set a status. It can put a screen in front of you, argue for a finding, and record what you say, with a reason, which is why the number moved. Everything it does shows up on this page as it happens, and everything you do is readable by it.

Sample data

This repo is public and ships no API key, so the three screen pairs below are original mockups generated by scripts/make-samples.mjs, not anyone’s real product, with the divergences planted on purpose, and their findings recorded on 2026-08-25 and checked into src/lib/samples/data.ts. No vision model runs in this session.

Everything downstream of the model is live: the scoring arithmetic, the adjudication, the rescore that follows a dismissal, and the ticket. To run the model against your own screenshots, use the uploader on the home page with an API key set.

This session

get_summary()
Screens checked

3

Average 78/100

Needs a call

12

Findings nobody has judged yet

Accepted

0

Confirmed defects

Dismissed

0

Intentional, out of the score

Screens

get_worst_offenders() ranks these worst first
Under review

Order summary

Design frame at 1x, build captured at 2x · model confidence: high

63/100

Needs rework

as recorded, nothing dismissed yet

Several major divergences, or something structural is wrong.

5 marked regions on the build
Designapproved frame · 1x
Design capture
Implementationbuild capture · 2x
Implementation capture

Findings on order summary

5 unreviewed · 0 accepted · 0 dismissed
  • 01CriticalMissing or extra elements
    needs a call

    Promo code entry never shipped

    The design places a dashed promo-code row between the line items and the totals block. The build goes straight from the last line item to the subtotal, so there is no way to enter a code on this screen.

    os-1Promo code row
  • 02MajorColour & contrast
    needs a call

    Pay button uses a slate fill instead of the brand green

    The primary action reads as a neutral slate rather than the green used everywhere else in the flow. On a checkout screen the primary action is the one element that should be unmistakably branded.

    os-2Pay $212.66 buttonroughly #4A5568 against #1F7A5A in the design
  • 03MinorLayout & spacing
    needs a call

    Line-item spacing is looser than the design

    The gap between line items is visibly wider, which pushes the totals block down and leaves a large empty band above the pay button.

    os-3Line items list~12px more per gap
  • 04MinorTypography
    needs a call

    Total amount renders a weight lighter

    The total is the number the customer checks before paying, and it is set noticeably lighter than the design, so it no longer outweighs the subtotal rows above it.

    os-4Total amountabout two weight steps lighter

    Judgement call Weight differences can be a font-loading artifact in a capture rather than a code difference. Worth a human eye before it becomes a ticket.

  • 05MinorAlignment
    needs a call

    Encrypted-checkout note is left aligned

    The reassurance line under the pay button is centred in the design and left aligned in the build, so it no longer reads as attached to the button.

    os-5Encrypted checkout note
Not assessable from two stills
  • — Pressed and disabled states of the pay button.
  • — Anything the keyboard covers when the promo field has focus.

Dismissing removes a finding from the score. Every status on this list is visible to the agent through get_drift_report, and every status the agent sets is visible here.

Where the points went

recomputed from what survived adjudication
  • Missing or extra elements−22

    weight 22 · 1C 0M 0m

  • Colour & contrast−7.2

    weight 18 · 0C 1M 0m

  • Layout & spacing−3.25

    weight 26 · 0C 0M 1m

  • Typography−2.5

    weight 20 · 0C 0M 1m

  • Alignment−1.75

    weight 14 · 0C 0M 1m

Ticket

Ask the agent to file_ticket once you have judged the findings, or press the button in the console below. It is composed from what survived, so dismissed findings never reach whoever picks the ticket up.

Agent console

Demo mode

No WebMCP host was detected in this browser, on either document.modelContext or navigator.modelContext, so there is no agent to drive the page. These buttons call the exact same tool functions an agent would, through the same code path, so the whole loop is visible anyway.

Triage
Per screen
Adjudicate as the agent

dismiss_finding without a reason is rejected on purpose. Clear the id and try accept_finding with a bad id to see the error an agent gets back.

Tool responses appear here, exactly as an agent receives them.

Session log

0 events

Nothing yet. Every tool call and every judgement lands here, tagged with who made it.

What this page publishes

Registered through registerTool on whichever host global carries it, document.modelContext or navigator.modelContext (Chrome 146+), with a batch provideContext fallback for hosts that expose that shape instead. Source: src/webmcp/tools.ts.