page-audit
Skill1 starsChanged 5 months agoMITView on GitHub
Audit a local HTML page's layout and rendering the trustworthy way. Measured facts (overflow, element widths) via an instrumented iframe harness, then screenshots via modern headless Chrome with animations neutralized. Use before diagnosing any visual bug, and instead of eyeballing headless screenshots.
2 other projects use a version of this.
Adopted by
Most recently taken up by
- manusco/resonancetheir own version, first seen Oct 22, 2026
- flakey-caster542/superseo-skillstheir own version, first seen Apr 13, 2026
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 2
- manusco/resonance★ 38same name
- flakey-caster542/superseo-skills★ 1same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository33 other files it gives its agents.
- architecture-blueprintSkill
- burnSkill
- calm-ui-auditSkill
- capitalizeSkill
- cardSkill
- commit-mineSkill
- continuity-contextSkill
- elonizeSkill
- frontierSkill
- full-throttleSkill
- grade-sessionSkill
- groundSkill
- harmonizeSkill
- harvestSkill
- honeSkill
- milkSkill
- mirrorSkill
- moonwalkSkill
- nightshiftSkill
- pmfSkill
- postSkill
- promptSkill
- publishSkill
- razeSkill
- redlineSkill
- relaySkill
- snipSkill
- stashSkill
- tasteSkill
- tidySkill
- untilSkill
- vacationSkill
- vaultSkill
The file
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 2 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 10
Run the bundled harness against the page at each target width (default 390,768,1440.
- Distinctive: line 34
Only after the measurements, capture visuals with modern headless and animations neutralized:
- Distinctive: line 46
If the user reported a visual bug the audit can't reproduce, say "not reproduced under measurement" rather than inventing a cause.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
You are auditing a local HTML page. The core rule: measurements are facts; screenshots are testimony. Headless rendering betrays you in version-dependent ways: older headless builds handled --window-size inconsistently for screenshots, viewport-relative units (svh/vh) balloon in tall capture windows, and IntersectionObserver reveals race the shutter. Version history matters when reading old advice: new headless became the default for bare --headless in Chrome 112, and Chrome 132 removed --headless=old entirely (old headless survives only as the separate chrome-headless-shell binary). The harness below sidesteps the window-size question entirely: width is pinned by an iframe, not the browser window, so it returns the same numbers on any Chrome that can run JS. Facts first, pictures second, and neither is believed unconditionally: both have artifact catalogues below.
Step 1 - Measure (facts)
Run the bundled harness against the page at each target width (default 390,768,1440; honor $ARGUMENTS):
python3 ~/agent-armor/page-audit/scripts/measure_page.py <page.html> --widths 390,768,1440Mechanics, so you can interpret its output: it wraps the page in a fixed-width iframe (so media queries apply per width regardless of the browser window), renders via --dump-dom under --virtual-time-budget=5000 with a 1.8s in-page settle, and reports per width: scrollWidth vs viewport (horizontal overflow) and every element whose bounding rect exceeds the viewport by more than 2px after rounding to whole pixels (tag.class, right edge, width; capped at 20 offenders, so bleeds that round to 2px or less never appear in the list). It finds Chrome automatically (CHROME_BIN overrides). If the harness errors, fix the invocation; do not fall back to eyeballing.
When the MEASUREMENT lies (check before filing an overflow bug)
| Measured symptom | Likely false positive |
OVERFLOW, but an ancestor has overflow: hidden/clip | Clipped decoration. The user can never see or scroll to it. Confirm ancestor overflow before filing. |
| Offender is an animated element (entrance OR autoplay) | Animations never advance under --dump-dom virtual time; everything measures at its from state, often off-canvas by design. |
| Offenders in below-fold reveal sections | The iframe viewport is 900px tall; IntersectionObserver reveals below that never fire, so below-fold geometry is the pre-reveal (often transformed) state. |
Decision rule: a measurement beats a screenshot for geometry, but an OVERFLOW verdict still needs a user-visibility confirm. Clipped by an ancestor, or an animation start state? Then it's an artifact, not a bug.
What "clean" does NOT mean
The harness measures horizontal overflow only. Vertical overlap, z-index collisions, zero-height collapses, and contrast are invisible to it. "clean" means "no horizontal overflow at these widths", nothing more. That's what Step 2's screenshots are for.
Scope
- The harness resolves its argument as a local file path;
http(s)URLs are not accepted. It runs Chrome with--allow-file-access-from-files, so pages built byfetch()of local files or ES-module imports DO measure their full JS-built layout underfile://. For served apps, audit the built static page with the harness and point Step 2's screenshots at the dev server URL. - Attribution blindness: the verdict (scrollWidth) sees everything; the offender scan (
querySelectorAll+ bounding rects) does not. OVERFLOW with an EMPTY offenders list means the offender is invisible to the element scan. Verified causes: overflowing inline text, e.g. a long unbroken string whose block's rect stays at viewport width (the most common mobile overflow bug); a wide::before/::afterpseudo-element; a shadow-DOM-hosted element; or, when the scrollWidth delta is only 1-2px, a bleed that rounded under the offender threshold. The verdict is trustworthy; attribution needs DevTools. - The inverse state also occurs: "clean" WITH offenders listed means the listed elements are clipped by an ancestor (
overflow: hiddenkeeps scrollWidth at viewport width). That is the clipped-decoration row of the false-positive table, already confirmed: no user-visible bug.
Step 2 - Render (pictures, done right)
Only after the measurements, capture visuals with modern headless and animations neutralized:
CHROME="${CHROME_BIN:-$(command -v google-chrome || echo '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome')}"
"$CHROME" --headless=new --disable-gpu --force-device-scale-factor=1 \
--force-prefers-reduced-motion --hide-scrollbars \
--window-size=1440,900 --screenshot=/tmp/audit-desktop.png "file://<abs-path>"Repeat at 390x844 for mobile. For below-the-fold content prefer one tall capture (e.g. 1440x4500) and remember: any svh/vh-sized section stretches with the capture window. That's an artifact, not a bug. --force-prefers-reduced-motion makes pages with reveal animations show everything instantly (if the page handles reduced motion; if sections are still blank, that is a finding about the page's reduced-motion path, not proof of broken layout). Anchor fragments (page.html#section) do not reliably scroll in headless; don't use them as evidence of anything.
Step 3 - Read the screenshots with the Read tool and report
- Lead with the measured verdict (overflow or clean, per width), then visual observations.
- Arbitrate every discrepancy through the two catalogues: a screenshot symptom that a measurement contradicts is presumed a screenshot artifact; an OVERFLOW that fails the user-visibility confirm is presumed a measurement artifact. Say which, explicitly.
- If the user reported a visual bug the audit can't reproduce, say "not reproduced under measurement" rather than inventing a cause.
When the SCREENSHOT lies (check before claiming a bug)
| Symptom in screenshot | Likely artifact |
| Text clipped at right edge, but scrollWidth == viewport | Headless window-size handling; trust the measurement |
| Giant empty void above/below a hero | svh/vh section scaled to a tall capture window |
| Sections blank/black mid-page | Reveal transitions raced the shutter (use --force-prefers-reduced-motion) |
| Anchor screenshot shows the top of the page | Headless didn't scroll to the fragment |
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

