The project's README from github.com/awss1i/assay. As one markdown file: README.md.
Drives your web page in a real browser and tells you what broke. No tests to write, no LLM.
Checking a drag-to-reorder list with a bug in it. pip install assay-ui
assay opens your page in Chromium, finds every control on it, uses all of them, and reports what went wrong.
pip install assay-ui # Python 3.10+
uv tool install assay-ui # no Python 3.10+? uv downloads one
pipx install assay-ui # its own environment, for when pip says "externally managed"
If pip isn't found, use python3 -m pip install assay-ui. The first run
downloads Chromium if needed.
To work on assay itself:
git clone https://github.com/awss1i/assay.git && cd assay
pip install -e ".[dev]"
Install the CLI above first, then follow the harness setup → to add the skill or plugin in any of the fifteen supported harnesses.
assay ./my-app # check index.html in this folder
assay ./my-app --report out.html # also write an HTML report with screenshots
assay ./my-app --one-line # short summary, for scripts and agents
This repository includes a drawing program whose Undo is broken:
$ assay bench/programs/dsh/gpt-oss-120b/37_draw2
24 case(s) planned, 24 carried out, 23 passed, 1 failed
C016 [FAILED] draw on canvas twice, then press Undo twice
→ pressing this twice from the same starting point, the first press changed nothing and the second did, so it reacts one press late
The exit code is non-zero if anything failed, and nothing is written to disk unless you ask.
The full flags, the Python API and the HTML report →
The skill works in all fifteen supported harnesses: Claude Code, DeepSeek Harness, opencode, Antigravity, Codex App, Codex CLI, Cursor, Devin CLI, Factory Droid, Gemini CLI, GitHub Copilot CLI, Grok Build CLI, Kimi Code, Pi and Hermes Agent. It tells your agent to run assay after finishing a page and end its reply with the result:
assay: checked todo/todo.html, 8 checks, nothing flagged.
The plugin (Claude Code and the DeepSeek Harness) adds a hook that runs the check automatically at the end of each turn that changed a page. Either way, the agent reports what assay found and doesn't change code because of it unless you ask.
/plugin marketplace add awss1i/assay
/plugin install assay@assay
How the skill and plugin work →
Scored on two sets of pages in this repository. Every number here is written by the scoring script, never typed by hand.
Pages written by AI. 225 small web apps an AI wrote from 75 prompts, three times each, which a person then opened and tried.
Found the real bug on 15 of the 20 broken pages, with 0 of the 205 working pages flagged. Every page and result.
Pages with bugs added on purpose. 10 working apps, each copied with 5 bugs added and written down.
Found 12 of the 50 added bugs, with 0 of the 10 original pages flagged. Every bug and result.
assay doesn't know what your page is for, so a button that changes nothing isn't a failure by itself. Instead it reports places where the page contradicts itself. For example:
NaN appears where a number should be,Playwright and Cypress need tests someone wrote. Visual regression needs a reference screenshot. Asking a model to review the code means reading it, not running it. assay runs it, with nothing prepared in advance.
| needs tests written | needs a baseline | runs the program | |
|---|---|---|---|
| Playwright / Cypress | yes | no | yes, the parts you wrote |
| Percy / Chromatic | no | yes | it screenshots it |
| ask a model to review it | no | no | no, it reads the source |
| assay | no | no | yes, all of it |
npm install or your build. Point it
at a source tree and it tells you what to run first.Report bugs and false alarms as issues, send changes as pull requests, and ask questions in Discussions. See CONTRIBUTING.md.
MIT.