0.3.0 could describe a graph, check it, and choose a route through it. It could not execute one, and it could not draw one without a domain baked into the drawing. This release does both.
Install
pip install "browsergraph @ git+https://github.com/aidonerightcorp/browsergraph.git@v0.4.0"The wheel has no dependencies at all. Every engine, OCR backend and plotting library is an optional extra, so a graph can be built, drawn, linted, compiled and mock-run with nothing else installed.
Added
- An executor — map steps, branches, parallel workers, fallbacks, a cache, content-hashed artifacts, and receipts for failures too. Steps record when they started, not only how long they took, so a picture of a run can show two of them overlapping instead of stacking them end to end.
solve— one call that tries routes, runs them, judges the output, and returns a champion and a fallback. Judging is a separate argument because "did it work" must not mean "did it not raise": a route returning an empty record passes that test with full marks.- Seven pictures of any workbench — shape, route space, funnel, per-step evidence, run timeline, solve scoreboard, learning trend — plus Mermaid, JSON and matplotlib renderings and a self-contained HTML report that opens with no network. Domain-neutral:
viztakes a graph and knows nothing else. browsergraph drawandbrowsergraph solve— both of the above were reachable only from Python.- Eleven problem templates across nine domains, each carrying its anti-patterns.
- Bounded execution — a step gets its own process with a clock and a memory ceiling. Lifecycle isolation, not a sandbox, and it says so in its first paragraph.
- A hash-chained journal, so evidence survives the process and an edited history is detectable.
- Model-guided exploration — the model proposes, the compiler disposes, and a refused suggestion is recorded as refused.
Fixed
- A run's verdict never reached the per-candidate posteriors.
solvestamps the judge's answer onto the receipt, but only the per-step flag was read — so after six runs, a reader that produced two records and one that produced none had identical posteriors. - An optimism clamp saturated every candidate whose prior plus bonus reached 1.0 — which, since an undeclared prior is 1.0, was almost all of them. Tried and untried scored identically and the search stopped exploring.
- The pair detector compared a route's outcome against the product of two rates, a category error: on data built with no interaction at all it reported eleven.
- Exhaustive search materialised the whole product and took 53GB of the machine with it on a 3.8-trillion-route space. It now refuses above a limit, with the number in the message, and streams below it.
- Discovery and the compiler disagreed about types, so a notebook reported zero legal routes forever;
compile_routenever checked candidate ports despite a comment saying it did; artifacts were detected by name rather than content, so a second run reported writing nothing.
Full notes in CHANGELOG.md. 1,341 tests.