Repository navigation
v0.8.0 - a shippable release, and the evidence for it
The release that makes every improvement since April actually reachable.
pip install oswright has been serving 0.3.1 since April, which cannot
start: it pins mcp[cli]>=1.0, and mcp 2.x removed mcp.server.fastmcp, so a
fresh install resolves to a version the server cannot import. It also pulled
EasyOCR (and PyTorch) on every platform and named the wrong package for Windows
OCR. Those were fixed in v0.4.0 and never shipped.
Verified before publishing, in a clean virtual environment: the wheel installs,
resolves mcp 1.29.1, pulls no PyTorch on Windows, and the console script starts
an MCP server exposing 43 working tools.
What changed since 0.3.1
Perception was rebuilt around one measurement: the median observation
changes 0.012% of the screen's pixels. Re-reading everything does far more work
than the change warrants.
- Incremental screen model that rescans only what moved
- Compositor dirty rectangles via hand-written DXGI Desktop Duplication
bindings: 0.14 ms to establish "nothing changed", against ~33 ms to capture
a frame and discover it - Resolution cascade: memory, then incremental OCR, then the accessibility
tree, then the application's own text buffer, then a full read - Screen atlas that recognises previously-seen screens and verifies by pixels
rather than by re-reading text - Settle detection that waits as long as the interface takes, not a fixed sleep
Measured end to end: latency per step 212 ms to 33 ms, tokens per observation
~2,764 to ~49, post-action wait 300 ms to 61.5 ms.
Evidence, not adjectives
Task success is graded against each application's own state -- UI Automation, or
the window title -- never against OCR, across Calculator, File Explorer, Chrome
and VS Code. Across four configurations accuracy is identical and token cost
falls 23x.
Against Windows-MCP on the same tasks, graded the same way: 19/20 against
their 20/20, at 832 tokens against their 14,053. Cheaper, and slightly less
reliable. Both numbers are in the README, because I built the harness and
reporting only the flattering half would be worthless.
docs/ENGINEERING_LOG.md records the reasoning, including 28 things that went
wrong.