browsergraph 0.3.0 — the universal graph model
Six stages, fourteen sub-steps, 3,802,314,700,800 routes — and a search that says how much of the space it actually looked at.
Install without PyPI (the wheel is attached and verified in a clean virtualenv):
pip install https://github.com/aidonerightcorp/browsergraph/releases/download/v0.3.0/browsergraph-0.3.0-py3-none-any.whl
browsergraph capabilities
browsergraph workbench -o studio.htmlExplore it live: https://aidonerightcorp.github.io/browsergraph/
Added
- The universal graph model — portable node manifests, atomic candidates, ordered stages, complete routes, typed feedback channels and optimization profiles, with a validator that returns every problem rather than the first. Plain English: HOW_IT_WORKS.md.
- Sub-steps — stages decompose recursively. "Acquire inputs" is three decisions, not one, and drawing it flat hid 44,343× of the search space.
- Policy gating and route search — policy gates before anything is scored; greedy, beam or exhaustive, always reporting coverage.
- Receipts — route, spec, environment, per-step timing, artifacts with content hashes, and a pasteable replay line. Written for failures too.
- A capability handshake — engines declare what they can do; a graph is checked before a browser launches, and the refusal names the engines that could run it.
- Fourteen nodes — press, select, upload, download, frames, cookies, viewport, PDF, plus wait_stable, a11y_tree, assert_text, assert_url, attribute, count.
- A model router — ten roles routed to the right model with a recorded reason.
- OCR — five interchangeable backends, and a check that caught a WebKit render that laid out perfectly and drew not one glyph.
Fixed
- Every objective profile ranked identically — raw values were combined, so latency in the thousands swamped quality in [0,1]. "Balanced" was secretly speed-only.
- Beam search bought nothing — it matched plain greedy at width 1, 8, 32, 128 and 512.
- Ranking was O(n²), making exhaustive search correct and unreachable.
- The chromedriver came from PATH, not from the browser being launched.
- Playwright's frame switch was decorative.
859 tests, mypy and ruff clean.