Skip to content

Optional/QoL: headless-browser verification for web & canvas apps (browser_check) — not roadmap #127

Description

@itigges22

Status: exploratory, purely QoL — NOT on the roadmap, not committed to building. Capturing the idea + research so it isn't lost.

The gap

The agent can verify Python (run it, catch crashes) and a web server (curl → 200 + HTML), but has no feedback loop for what actually runs in the browser — uncaught JS exceptions, canvas rendering, gameplay logic. So it can ship a page that "serves 200" yet is broken in a browser (the recurring example: a generated Snake game that renders but doesn't move).

The idea

A browser_check tool: load the served page (http://localhost:PORT) in a headless browser and report uncaught JS exceptions + console errors; optionally simulate input (keypress/click) and screenshot for a later vision check. (A working proxy tool + sandbox endpoint were prototyped and then dropped — see git history if revisiting.)

Why it's not being built now

  • It would not fix the main pain (logic/visual correctness like the Snake dx/dy bug — no JS error, just wrong). That class needs a vision loop (screenshot → multimodal model), which is gated on running a vision-capable model. A console-error rail catches a narrower, different class (JS crashes).
  • The bigger quality lever already shipped: the lens-training loop (/good·/bad + atlas lens retrain) catches bad writes more generally.

Research findings (adversarially verified — so a future attempt doesn't re-litigate)

  • jsdom / happy-dom: unreliable even for error capture — async exceptions escape to Node and can crash the host; no real canvas. Not viable.
  • Lightpanda: AGPL-3.0 (license), no rendering engine (no canvas/screenshots), Beta; headline RAM/speed claims didn't survive verification. Not viable for this.
  • Servo / servoshell: genuinely rasterizes canvas, but too immature for headless container automation as of 2026 (feature-flagged, screenshot/automation maturity unestablished).
  • Viable path = real Chromium headless-shell (Playwright --only-shell, or @sparticuz/chromium ~130 MiB uncompressed, or the chromedp/headless-shell image): real engine, does both tiers, ~150 MB not ~1 GB. Should be an opt-in service (compose profile) so the default sandbox stays lean.

If ever revisited

Build it once, properly: headless-shell + input simulation + screenshot + vision, as an opt-in atlas-browser service — when there's a vision-capable model to make the visual/logic check real. Don't ship a partial Tier-1-only rail that gets rebuilt later.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions