Skip to content

v0.9.0 — tall-capture strip routing and the low-yield guard

Latest

Choose a tag to compare

@Dicklesworthstone Dicklesworthstone released this 23 Aug 03:39
· 62 commits to main since this release

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_complete robot event carries low_yield fields and a stderr warning is printed. Opt-in --fail-on-low-yield turns 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, repairing cargo install builds 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|backends JSON-validated, robot selftest int8 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: asupersync 76c93637, frankentorch 9627f39c, frankensqlite bda32118.

Verification

  • cargo fmt --check, cargo check --locked --all-targets, and cargo clippy --locked --all-targets -- -D warnings green at the release commit; the full cargo test --locked suite green on the Linux build host (31 suites, 0 failures).
  • Release-ref gate: scripts/gauntlet_cert.py --dist-ref-preflight PASS for tag v0.9.0 at 1f7f669 (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 repaired bda3211 before 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.