focr v0.9.0 — tall-capture strip routing and the low-yield guard
v0.9.0 ships the same six-platform raw-executable matrix as v0.8.0 (each asset with a SHA256 sidecar) and continues to pin the immutable, hash-verified v0.7.0 Unlimited-OCR model artifact (unlimited-ocr-ffn-int8-attn-bf16-lmhead-bf16-v1). Install with the one-liner; focr pull fetches weights.
Highlights
- Tall full-page captures work now (GH #15). Browser-extension "capture full page" screenshots (e.g. Awesome Screenshot) produce images 5-20× taller than wide; these previously came back near-empty with exit 0, or hung. Single images at least 3× taller than wide are now automatically OCRed as smart-cut horizontal strips: cut lines are chosen at minimum-ink rows so text lines are never severed, each strip runs through the standard pipeline, and layout boxes are retranslated into whole-image coordinates.
- Low-yield guard. Any run on an image ≥ 0.5 MP that produces fewer than 50 characters per megapixel is now flagged: the
run_completerobot event carrieslow_yieldfields and a stderr warning is printed. Opt-in--fail-on-low-yieldturns that condition into new stable exit code 8, so automation can stop treating silent near-empty output as success. The robot schema stays v1 (additive fields); the frozen schema fixture, surface matrix, and parity pins were updated in lockstep. - crates.io packaging repair. The published crate now ships
models/manifest-v2.json, repairingcargo installbuilds of the embedded pull manifest.
Platform notes
- macOS Apple Silicon, macOS Intel, Linux x86-64 (glibc 2.17+), Linux ARM64 (glibc 2.17+), Windows x86-64, and Windows ARM64.
- macOS binaries and Linux x86-64 were built and smoke-tested (
--version,robot schema|health|backendsJSON-validated,robot selftestint8 kernels bit-identical to the scalar oracle) on their build hosts; Windows x86-64 was built natively on Windows and passed the same smoke + selftest. Linux ARM64 was cross-built with the pinned zigbuild glibc-2.17 floor (readelf-verified GLIBC_2.17 max on both Linux assets) but not executed (no ARM64 Linux host in the pipeline). Windows ARM64 was cross-arch built on x86-64 Windows with the MSVC ARM64 toolchain + LLVM (ring's aarch64 path) and, like v0.7.2/v0.8.0, was not executed on ARM64 hardware — full-model OCR verification on physical ARM64 Windows remains a release-verification obligation. - Built by the DSR local release pipeline (not GitHub Actions) from source commit
1f7f6698e3513554331e2d83e213db4822e13caf, with the pinned sibling closure: asupersync76c93637, frankentorch9627f39c, frankensqlitebda32118.
Verification
cargo fmt --check,cargo check --locked --all-targets, andcargo clippy --locked --all-targets -- -D warningsgreen at the release commit; the fullcargo test --lockedsuite green on the Linux build host (31 suites, 0 failures).- Release-ref gate:
scripts/gauntlet_cert.py --dist-ref-preflightPASS for tagv0.9.0at1f7f669(tag == Cargo version, reachable from origin/main). - Sibling build inputs pinned and verified at checkout on every host (dist.yml env == repos.d registry): the first frankensqlite pin (
339410c) turned out to be a broken-HEAD window upstream and was advanced to the repairedbda3211before any artifact was produced. - Each asset ships with a SHA256 sidecar; sidecars re-verified after transfer to the staging host.
- The GH #15 tall-capture path is covered by 18 unit tests on synthetic tall images (including the 494×2000 incident shape); a model-level end-to-end run on real full-page captures was NOT part of this gate (no weights on the gate hosts).
Full history: see CHANGELOG.md §0.9.0.