Use when working with focr/franken_ocr: OCR CLI, OcrEngine, robot NDJSON, .focrq artifacts, Model Zoo (GOT, SmolVLM2, OneChart, TrOMR), kernels, quantization, or ~/projects/franken_ocr.
Use when working with focr/franken_ocr: OCR CLI, OcrEngine, robot NDJSON, .focrq artifacts, Model Zoo (GOT, SmolVLM2, OneChart, TrOMR), kernels, quantization, or ~/projects/franken_ocr.
dependencies
["franken_ocr repo or installed focr binary","Rust nightly when building from source","jq for robot/JSON inspection","Baidu/GOT/SmolVLM2/OneChart/TrOMR source weights or a .focrq model for real inference; TrOMR also needs tokenizer tables beside the artifact"]
focr / franken_ocr
One Rule
Do not invent capability. First classify a surface as current, scaffolded,
planned, or stale, then give the user commands and code that match that class.
Truth Stack
Use this order when facts conflict:
Current committed franken_ocr source and tests. A dirty live worktree can
identify candidate names and code paths, but it is live-WIP until the diff is
understood and the matching tests/Beads agree.
Live help from the exact binary that will run, after confirming it is not
stale.
br/bv --robot-* issue evidence for current closure/open status.
AGENTS.md, README.md, COMPREHENSIVE_PLAN_FOR_FRANKEN_OCR.md, and
docs/ as narrative context that can lag source and Beads.
cass session history, as historical context only.
If a command exists in source but not in focr --help, treat the binary as
stale and run from source or rebuild before drawing conclusions.
This repository-local skill is the maintained copy for this checkout. If a
global installed $focr skill disagrees with .claude/skills/focr, use this
project-local skill plus live ~/projects/franken_ocr source/Beads evidence.
If ~/projects/franken_ocr is dirty, run git status --short --branch and
git diff --stat before trusting changed prose or comments. Uncommitted docs
that advertise a feature, uncommitted source that has not passed the relevant
gate, or extreme diffs that look mechanically corrupted are not current
capability. Label them live-WIP, then check br show <id> --json, tests, and
committed origin/main before updating user-facing claims.
Cold-Start Boundary Card (July 8, 2026)
Dated update (2026-08-18). The card below is preserved verbatim as the
July 8 observation; these deltas supersede its point-in-time facts:
Latest binary release is v0.7.2 (published 2026-07-13), not v0.6.0.
Six release binaries now ship, adding Windows ARM64.
The "Latest" GitHub release slot can be a weights release. Weights ship
as their own non-prerelease releases (models-*), so /releases/latest
returned models-unlimited-wasm-v1 in August 2026 and broke bare installer
runs (GH #12; installers on main now filter for semver v* tags). Never
equate "latest release" with "latest binary release" here.
The default artifact is versioned:focr pull installs
unlimited-ocr.v0.7.0.int8.focrq (4.16 GB, 3 verified parts) under the
cache root, using the conservative recipe
unlimited-ocr-ffn-int8-attn-bf16-lmhead-bf16-v1. The old
unlimited-ocr.int8.focrq name and the ~3.9 GB figure are stale.
All five runtime models (unlimited-ocr, got-ocr2, smolvlm2, onechart,
tromr) are pullable; TrOMR publishes int8 (default) and f32 artifacts.
If you are fresh to focr, keep these five ledgers separate before answering:
GitHub release: latest observed GitHub release is v0.6.0, a real,
non-draft, non-prerelease release named "v0.6.0 — certified faster than
PyTorch, end to end", published 2026-07-08T14:47:48Z with Apple Silicon,
macOS x86-64, Linux x86-64, Linux ARM64, and Windows x86-64 binaries plus
.sha256 assets. The release tag is 29516b9 / v0.6.0. This is proof of
the release-asset boundary, not proof of the installed binary on the user's
PATH, and it does not include source commits after the tag. Historical
release name to preserve for archaeology: v0.5.2 — the cold-start release.
Public source head:origin/main is 592426c, with clean committed
source describing as v0.6.0-4-g592426c; the inspected checkout had no
tracked source diff and only untracked .claude/worktrees/. The post-v0.5.2
chain is now: 0924479 README source/binary clarification, efd83e8 formal
bd-av64.10 G2 re-measurement and closeout, 3f2f97ebd-2mo.26 gauntlet
harness fixes, 4291807 SmolVLM2 untied lm_head int8+top-K-refine
default-on certification, 91c12fd README selftest evidence refresh,
ae7b8f2 bead-scoped perf evidence bundle, c248e6dbd-2mo.26
head-to-head PERF_LEDGER rows, c4c1684bd-2mo.26 plus rounds 9-10
closeout, c29a78b release certification achievement, 7c7bd00 Beads
closeout for bd-wp8.8, bd-wp8.9, and bd-wp8.10, 29516b9v0.6.0
release version/tag, beaed7c CI/dist supplement notes, db02421 README
release-readiness evidence refresh, 5df6395 committed post-certification
fuzz corpus growth, and 592426c README release-identity refresh for the
now-unified v0.6.0 source tag plus binary release. This is current committed
source/tracker evidence, not proof that a user's installed binary came from
the same source without an installed-binary check.
Committed source features:507cebe mmap-loader half, GOT
, / OneChart ,
SmolVLM2 , and SmolVLM2 untied-
int8+top-K-refine default-on certification are current source evidence with
scoped proofs. The boundary proves paired describe output
byte-identical f32-head vs int8+refine, armed L5 VQA green under the lever,
full describe/VQA e2e suite pass, about , and
decode ; is the f32-head kill
switch. This is not a public VQA benchmark, broad quality proof, or guarantee
that the release asset includes the post-tag source. Formal
G2/PERF_LEDGER rows now exist for both and : the
final state records GOT e2e , OneChart
, SmolVLM2 , and decode-per-token
; the later head-to-head rows record
focr-int8 vs pinned HF bf16 page_0009 e2e and page_0014 e2e
with CER / , best-of-5 warm, N=8 both sides, and cv%
under the 5% bar.
Mnemonic: release object, source head/features, installed binary,
post-certification corpus/live-WIP boundary, and readiness artifact are five
different truth surfaces.
First 90 Seconds
Use this checklist before reading deep references:
Name the surface: CLI command, Rust library API, model/artifact, verification
gate, performance claim, or source edit.
Classify the evidence boundary: installed binary, current source, committed
main, live worktree, Beads status, or historical docs.
Dirty-worktree claims need an explicit live-WIP/committed-main
distinction before they become advice.
For install/release/version questions, keep four facts separate:
source/Cargo version, pushed tag, GitHub release object/assets, and the
actual installed binary help/version. Do not infer one from another.
If git describe says v0.5.0-N-gHASH, v0.5.1-N-gHASH,
v0.5.2-N-gHASH, or v0.6.0-N-gHASH, current main is ahead of that tagged
release. If it says v0.5.2-dirty or v0.6.0-dirty, the tag/release
boundary can still be real while the checkout contains uncommitted work.
Treat source tag, release object, release assets, and installed binary as
four separate facts.
Pick one operator/reference from the router below; do not read every file.
If the claim is about "done", "green", "conformant", "fast", or "quality",
name the exact gate and what it does not prove.
End with concrete commands or code and an explicit proof gap when a model,
fixture, binary, or tracker close is missing.
Default Answer Shape
When answering from this skill, use this order unless the user asked for a
different format:
Action: the exact focr command, Rust API, file path, or verification gate.
Exclusions: the adjacent thing this does not prove, for example "not a
GitHub release asset", "not full bd-2mo.22 closure", "not SmolVLM2
statics caching", or "not a formal PERF_LEDGER row".
Proof gap: one command or artifact the next agent should check if the user
needs stronger certainty.
This keeps answers ergonomic: lead with what works, then attach the smallest
necessary caveat. Do not bury the usable command under the entire history.
Fresh-Agent Reading Plan
Do not read this skill linearly. Use it like an operator console:
Read the Cold-Start Boundary Card and First 90 Seconds checklist.
Choose one surface from the Fresh-Agent Router: CLI, library, model/artifact,
verification, performance, release, or troubleshooting.
Open exactly one matching reference first. Use OPERATORS.md when the
question is about proof boundaries, state classification, or avoiding
overclaims; use CLI.md, LIBRARY.md, or ARTIFACTS-AND-ENV.md for
concrete commands and APIs.
Search within the skill for the exact bead, commit, env var, command, model
id, or operator tag. If a global/installed copy of the focr skill disagrees
with this project-local skill, use this project-local skill plus live
~/projects/franken_ocr source/Beads as the fresher evidence.
Stop once you can state the boundary, action, exclusion, and proof gap. More
history is not better unless the user asks for archaeology.
Fresh-Agent Router
Cold start if you know nothing: read this router, classify the exact surface
with OP-LC (Live Contract Probe), check the model row in the Model Surface Map,
then open only the matching reference. Do not read RESEARCH.md first; it is
historical context after current source/help/Beads are settled.
Asked "can focr do X?" Start with CLI.md, then confirm
source/help and Beads before answering yes/no.
Editing or reviewing franken_ocr source? Use DEVELOPMENT.md
and VERIFICATION.md; read repo AGENTS.md and
README.md first.
SmolVLM2 work splits by evidence layer: OP-SC conversion/decoder census,
OP-ST tokenizer, OP-SV vision/connector, OP-SP preprocess/prompt/route,
OP-VQ Rust VQA guard and C10 CLI e2e script. Sub-epic C is now closed, but
each claim still needs the right evidence layer. Source at/after 9b2a03b
has smolvlm2::SmolStatics, OcrModel::smol_statics, and
smolvlm2.hydrate(cached) as committed pass-8 evidence: SigLIP tower,
modality projection, and widened untied text embed hydrate once per model and
are shared by sequential describe/VQA and batch paths. Keep it scoped to
byte-identical describe source evidence plus lib-green proof. The parent
bd-av64.10 now has a formal closeout at efd83e8, but pass 8 by itself is
not release readiness, public VQA quality, or a standalone PERF_LEDGER row.
Model-zoo distribution work is OP-ZM: ece14f9 / closed bd-av64.7
publishes the embedded pull manifest for all five ready models, and
bd-av64.8 / bd-av64.9 add the public GitHub release and clean-cache pull
verification for models-smolvlm2-v1, models-onechart-v1, and
models-tromr-v1. focr pull smolvlm2, focr pull onechart, and
focr pull tromr are now current when the running binary embeds or resolves
that manifest; clean-cache evidence says the GitHub release assets, hashes,
sidecars, idempotent repull, and real inference paths work. Use
and ,
, , , and
separate checks for , ,
, and before making pullability/quant claims. Keep
the TrOMR boundary precise after : now publishes
both and ; the default
resolves the storage artifact, while
gets the bit-exact reference artifact. Do not turn that into an int8-compute,
speed, or quality-improvement claim. Also keep the mirror
boundary precise: production pulls are GitHub-first and verified; HF mirror
spot-checks returned 401 and remain a resilience/auth follow-up, and the
dedicated one-command pull-e2e script is still deferred.
exact oracle, relation, fixture, or corpus boundary
"Is it conformant/release-ready?"
OP-CM plus OP-LS/OP-GA/OP-DG as needed
accounting result and every separate proof family still needed
"Is it deterministic?"
OP-DG, then OP-MR for transform consistency
same-input byte identity vs oracle quality kept separate
"Did the whole ladder pass?"
OP-LS
scorecard schema, all_green, skipped_no_model, and first-failure boundary
"Is it fast?"
OP-BG/OP-GB
architecture/selftest vs PERF_LEDGER/gauntlet rows, benchmark guardrails, and negative evidence kept separate
"Why does my binary differ?"
OP-SQ
exact binary path/version and release-lag/stale-local classification
Model Surface Map
Use this as the first-pass model router. For non-trivial claims, load the
matching operator/reference before answering.
Unlimited-OCR: default focr ocr lane. Setup is focr pull. Do not
claim generic arbitrary-checkpoint runtime.
GOT-OCR2: focr ocr --task formula|tables|chart|molecular|geometry|music
or --format. Setup is focr pull got-ocr2; keep qwen.tiktoken beside the
artifact. Do not call it a default replacement for plain OCR.
SmolVLM2: focr ocr --task describe [--question ...]. Setup is
focr pull smolvlm2; it installs smolvlm2.int8.focrq plus
tokenizer.json. Do not claim public VQA benchmark or human-label quality
proof. Source at/after f1ac972 routes vision_rows through
vision_siglip::forward_frames_batched by default, with FOCR_SIGLIP_SEQ=1
as the kill switch back to the per-frame loop; the current proof is
byte-identical source/fixture evidence plus modest loaded-host timing wins,
not a formal quiet-host PERF_LEDGER row.
OneChart: focr ocr --task chart-data. Setup is focr pull onechart;
it installs onechart.int8.focrq plus OPT tokenizer sidecars. Do not invent
focr chart or broad chart quality.
TrOMR: focr ocr --task music --model tromr.int8.focrq after the default
pull, or --model tromr.focrq after focr pull tromr --quant f32, to
partwise MusicXML. Setup is focr pull tromr; default pull installs
tromr.int8.focrq plus four tokenizer tables, while
focr pull tromr --quant f32 installs the bit-exact tromr.focrq.
Current evidence includes bd-av64.2 per-staff
skip resilience, robot staff events, music-run JSON staves, closed
bd-av64.6 Spohr real-scan corpus v1 measuring-device evidence, closed
bd-av64.14 fit-first geometry/p169 evidence, closed bd-av64.5
annotate-only musical-sanity warnings, closed bd-av64.13 residual-skew plus
measured-negative/reverted TTA and one-crop levers, closed bd-av64.12
TrOMR int8 storage publication, and the bd-2sez losing f32 PERF_LEDGER
baseline. Do not claim , int8 compute, a perf win,
camera dewarp, default/lossless barline quality, ,
/ event names, a schema-version bump for
or , every-page PDF music , automatic
correction from sanity warnings, or broad real-scan SER completion.
is an experimental over-budget-staff recognition-count
rescue path only; it is not default behavior or a broad barline-quality proof.
The int8 artifact is a published quantized-storage artifact, not a current
int8-kernel runtime.
Current Reality Snapshot
Public release/install facts and source facts can still differ, and the July 8,
2026 check now has a published v0.6.0 release plus newer post-release source
commits. f0a538b created the v0.4.0 public release boundary.
bf28fd7 bumps Cargo.toml / Cargo.lock and the pushed annotated tag to
v0.5.0; the v0.5.0 tag points at bf28fd7, and the GitHub release named
"cross-page parsing, hardened music lane, faster vision tower" was published
2026-07-07T23:49:41Z with binary plus .sha256 assets for Apple Silicon,
macOS x86-64, Linux x86-64, Linux ARM64, and Windows x86-64. 8de3674 tags
the source/package as v0.5.1; the GitHub release named "v0.5.1 — the
vision-pipeline efficiency patch" was published 2026-07-08T05:02:37Z with the
same five platform binary families plus .sha256 assets. 4cedacd tags the
source/package as v0.5.2; the GitHub release named "v0.5.2 — the cold-start
release" was published 2026-07-08T06:05:23Z with the same five platform binary
families plus .sha256 assets. 29516b9 tags the source/package as v0.6.0;
the GitHub release named "v0.6.0 — certified faster than PyTorch, end to end"
was published 2026-07-08T14:47:48Z with the same five platform binary families
plus .sha256 assets. install.sh / install.ps1 still keep
v0.4.0 as the fallback constant for failed release lookup, and installed
binaries can still lag; normal online installers resolve the latest release
object first. The 592426c README has been refreshed for v0.6.0, but the
standing support rule remains: when README/manual prose and the release API
disagree, verify the actual release object/assets before making support claims.
The July 8, 2026 source probe saw public origin/main at 592426c
(v0.6.0-4-g592426c for clean source; the inspected checkout had no tracked
source diff). The post-v0.5.2 commits are 0924479, a README-only
clarification, efd83e8, the formal bd-av64.10 G2 re-measurement / Beads
closeout, 3f2f97e, the bd-2mo.26 gauntlet harness bring-up fix, 4291807
SmolVLM2 untied int8+refine certification, CPU selftest
README refresh, perf evidence bundle, head-to-head
PERF_LEDGER rows, plus rounds 9-10 closeout,
release certification achieved, Beads closure for the release
certification trio, tag/version bump, CI/dist
supplement notes, README release-readiness evidence refresh,
committed post-certification fuzz corpus growth, and
README release-identity refresh. Treat
, , ,
, , , , , , ,
, , , , , , ,
, pass-6 , source version bump , mmap-loader half
, Beads note , README/release-readiness commits
/, pass-7 OneChart statics /, pass-8
SmolVLM2 statics , README docs , and source/package tag
, README clarification , G2 closeout , and harness
fixes , SmolVLM2 head certification , selftest README refresh
, perf evidence bundle , head-to-head rows ,
closeout , release certification , Beads closeout
, tag , CI/dist supplement , README
release-readiness refresh , fuzz corpus commit , and README
release-identity refresh as current committed source evidence unless
a newer release asset, installed binary, or live checkout proves otherwise. If
the checkout is dirty after , classify only those uncommitted diffs as
live-WIP;
uncommitted docs are not stronger evidence than committed source, tests, and
Beads.
Always verify the exact installed , help, tag, GitHub release
object/assets, and installer path before support claims; stale README/manual
prose is not stronger evidence than the release API or the installed binary.
The public
source/release boundary includes , , JSON
layout boxes, , , , int8 , robot
commands, scanned PDFs via , and layout APIs.
Post- additions covered by this skill include
multi-page cross-page parsing ( and PDF
), multi-page streaming events, the 2-page and
10-page L5 multi-oracle rungs plus the frozen 20-page reference-collapse
fixture, additive TrOMR robot/JSON observability, fit-first
TrOMR staff crop geometry, experimental barline rescue,
annotate-only TrOMR / JSON sanity telemetry,
per-band TrOMR residual-skew refinement,
model-aware rollups, and offline prepacked
layouts, default TrOMR storage publication with
as the f32 reference artifact, and the closed
negative-evidence ledger for TTA/one-crop routing. Treat those as
release-or-current-source claims only after the exact binary/help, tag, release
assets, and Beads closure agree.
Closed-current verification additions after the boundary also include
property/fuzz plumbing, the decode decompression-bomb guard, and
pass-4 shared SAM/SigLIP/TrOMR/projector pre-transposed-linear
evidence ( plus Beads evidence in ), pass-5 SmolVLM2 SigLIP
frame batching (), pass-6 GOT statics caching (), pass-7
OneChart statics caching ( / ), pass-8 SmolVLM2 statics
caching (), README docs , source/package tag ,
README split-clarification , formal G2 closeout
, gauntlet harness hardening , and
SmolVLM2 untied-head certification , head-to-head rows
, release certification , Beads closeout,
tag , CI/dist supplement , README release-readiness
refresh , fuzz corpus commit , README release-identity
refresh , and source-current
CI/gate closure.
/ are in the ancestry; post-tag follow-ons now
extend through public in this checkout. The
important new boundaries are:
ab6e083 / 50d5dad: SIMD/polynomial-exp softmax in SAM attention measured
dead and was reverted. Unit-level exp/softmax accuracy did not preserve token
output; use the negative-evidence ledger rather than retrying it as an easy
speed lever.
ab6fa6c / 3f3d9d0: round 8 is CLEAN after 4 fuzz targets x 5 minutes
(4.7M total runs, zero crashes), PROPTEST_CASES=2048 8/8 green, and a 6/6
advisory matrix, but this is bounded deep evidence, not exhaustive fuzzing or
release readiness.
5df6395: the post-certification fuzz corpus is committed, not dirty local
WIP. It adds 3,271 seed files across focrq_parse, image_decode,
pretok_split, and safetensors_parse. The later convergence sweep records
four fuzz targets x four minutes, about 3.65M total zero-crash runs, plus
PROPTEST_CASES=2048 8/8 green. Keep the old round-8 4.7M sweep as bounded
historical evidence and the round-11 3.65M sweep plus committed corpus as the
current convergence/corpus evidence.
592426c: README-only current-source refresh for the public v0.6.0
identity. It replaces stale badge/install/manual-download references,
documents that source tag and binary assets are both v0.6.0, updates the
binary-size claim from the old 5 MB-era language to about 13-17 MB, and
clarifies CPU backend wording: Apple Silicon prefers SDOT, non-Apple ARM64
can dispatch SMMLA/i8mm, and Intel/AMD select AVX-512-VNNI, AVX-VNNI, AVX2,
or scalar by runtime feature detection. This is README/public-support
evidence, not a new runtime feature.
8cacf52 / ff22366 / 2665750 / 9bc715e: these are now historical
bundle bring-up commits. They made scripts/gauntlet_cert.py --bundle real
and converted certification_bundle into a live release_certificate.json
cell rather than a hard-coded red/self-referential predicate. The old
certified-false state is superseded by the later c29a78b/7c7bd00
certification closure; keep the bring-up details only when debugging how the
bundle gate works.
48a9896: README and fuzz metadata now name v0.5.0; installer fallback
constants and installed binaries are still separate checks.
f1ac972: SmolVLM2 SigLIP frame batching is current source. It proves
byte-identical forward_frames_batched behavior with as a
sequential kill switch and loaded-host self-relative wins. The later
G2 rows are the formal closeout state; this individual pass remains
pass evidence, not a standalone release-readiness or quality claim.
Dirty-worktree-only surfaces to quarantine, not promote, now mean new
uncommitted deltas after public 592426c, not the
already-landed Linear::from_row_major, --bundle, forward_frames_batched,
row-tile-negative-evidence/baseline-restore, GotStatics, or mmap-loader facts
or OneChart/SmolVLM2 statics facts, the v0.5.2 source tag, or the README
source/binary split, G2 closeout, gauntlet harness fixes, SmolVLM2 head
certification, head-to-head perf rows, or release certification described
above. In the inspected checkout, committed fuzz corpus growth belongs to
5df6395 and the current README release-identity refresh belongs to 592426c;
only new tracked diffs or untracked files after that boundary should be treated
as live-WIP.
focr pull [MODEL] --manifest <path-or-url> resolves manifest source as
explicit --manifest, then FOCR_MANIFEST_URL, then the built-in repo
manifest (BUILTIN_MANIFEST_JSON = include_str!("../models/manifest.json")).
Closed bd-av64.7 / commit ece14f9 makes that manifest the distribution
source for all five ready models: the top-level default unlimited-ocr
artifact, and named models.got-ocr2, models.smolvlm2, models.onechart,
and models.tromr entries. Non-primary models install under
~/.cache/franken_ocr/models/<model-id>/, with ModelEntry.sidecars carrying
tokenizers and auxiliary files. focr models --json exposes each row's pull
object with in_manifest and quants; use that instead of guessing from the
registry row. Current main also has focr models, .focrqmodel_id,
implemented GOT-OCR2 (focr pull got-ocr2, got-ocr2.int8.focrq), implemented
SmolVLM2 (focr pull smolvlm2, smolvlm2.int8.focrq), implemented OneChart
(focr pull onechart, onechart.int8.focrq), implemented TrOMR
(focr pull tromr, default tromr.int8.focrq plus
focr pull tromr --quant f32 for tromr.focrq and tokenizer sidecars), GOT
/ , and routing for
. GOT tasks
imply GOT format mode and need ; routes
through SmolVLM2 and needs , plus optional ;
routes through OneChart and needs plus the
OPT tokenizer files beside it; is dual-lane: with it is GOT
sheet-music format mode, and with it is native Polyphonic-TrOMR OMR to
partwise MusicXML. with no explicit quant now selects the
published storage artifact; use or a
preverified local when byte-exact reference weights matter, and
do not turn either artifact into an int8 compute claim.
Closed bd-av64.8 and bd-av64.9 move the zoo story beyond "manifest
prepared": GitHub releases models-smolvlm2-v1, models-onechart-v1, and
models-tromr-v1 were published and then clean-cache verified. Evidence covers
exact release sizes/hashes, sidecar sets, per-model cache subdirectories,
idempotent repull, then-current TrOMR f32 fallback behavior now superseded by
the bd-av64.12 default storage-int8 artifact, and real inference for TrOMR
MusicXML, SmolVLM2 description, and OneChart chart-data. The known
distribution gap is HF mirror auth/resilience: spot-checks returned 401 across
the weights mirrors, while GitHub-first production pulls work. Do not describe
HF mirroring as verified, and do not claim the deferred one-command pull-e2e
script exists until source/Beads show it.
Latest main also wires preprocessing controls into the engine:
--base-size, --image-size, and --crop-mode now reach
PreprocessOverrides; default crop mode is base. --crop-mode gundam is live
reference dynamic tiling, with first e2e evidence in bd-1e9n
(rc=0, 7 views, CER 0.0179 / WER 0.0138 on page_0107), but do not round that
up to a full parity sweep. SmolVLM2 conversion is now implemented and
model-gated-proven on real weights (bd-3jo6.3.2): focr convert --model-id smolvlm2 produced 489 tensors = 224 int8 decoder GEMMs + 265 F32
high-precision tensors with an untied high-precision lm_head; C5 then
certified the text-only SmolVLM2 decoder seam (bd-3jo6.3.5: f32 cos
1.000000 + 24-token L4 exact, int8 cos 0.998301 argmax-exact, DISC-002 near-tie
flip recorded). C6 tokenizer conformance is also closed (bd-3jo6.3.6):
PretokScheme::SmolLm2 is selected from tokenizer JSON, the GPT-2
ByteLevel/Digits pretokenizer path is id-exact, and the real-tokenizer gate is
128/128 token-id and decode exact against pinned HF tokenizers. Current main
has C3/C4/A8/A9 closed for SmolVLM2 vision and connector seams: SigLIP post-LN
parity on 13 real frames, NaViT bucketized position ids, bit-exact
pixel_shuffle, and connector projection within measured tolerance.
bd-3jo6.3.7 and bd-3jo6.3.9 are now closed: preprocess_smolvlm2 uses
Pillow-bit-exact LANCZOS (resample: 1) with longest-side 2048, row-major
512-frame tiling plus a final global 512 frame; src/native_engine/smolvlm2.rs
assembles prompt ids, vision rows, <image> splices, and SmolLM2 KV-cache
greedy decode; --question / FOCR_SMOLVLM2_QUESTION set the VQA question;
model_arch reports SmolVLM2 implemented=true; and the int8 route was proven
live with "What is in the sky..." -> "There is a sun in the sky."
SmolVLM2 sub-epic C is now closed in live Beads/source. bd-3jo6.3.8 closed
the C8 parity/e2e quality/perf gate with: L0b preprocess exact, L0c prompt
876/876 id-exact, L2 SigLIP cos 1.0, L3 prefill drift <5e-5 and
argmax-exact, L4 opt-in FOCR_SMOLVLM2_CERT_FULL=1 O(n^2) re-prefill greedy
64/64 id-exact, ledgered DISC-003 KV-cache near-tie behavior, and L5
informational VQA 7/7 on both f32 and int8 with int8 answers identical to f32.
Measured release-int8 informational times on Apple M4 were describe e2e 51.8s
and VQA 13.0s; use A11/PERF_LEDGER rows for fairness-controlled performance
claims. bd-3jo6.3.10 closed C10 with per-module tests plus
scripts/smolvlm2_describe_e2e.sh; bd-3jo6.3 closed the sub-epic. So support
focr ocr --task describe --model smolvlm2.int8.focrq [--question "..."], and
support focr pull smolvlm2 after closed bd-av64.7 when the running binary
embeds or resolves the updated manifest. Still avoid claiming public benchmark
quality or concurrency-safe per-request question handling unless
source/evidence specifically says so.
Latest C8 VQA work adds an informational L5 guard with exact evidence:
scripts/gen_smolvlm2_vqa_fixtures.py writes
tests/fixtures/smolvlm2/vqa_fixtures.json from torch-oracle greedy answers on
the committed sample photo, and vqa_quality_matches_oracle_l5 scores focr's
answers by normalized exact match or symmetric content-word containment >=0.5.
The guard fails below 70% f32 or 50% int8 matches when FOCR_SMOLVLM2_DIR has
model.safetensors and/or smolvlm2.int8.focrq; live close evidence reports
7/7 on both legs. Treat skips as missing artifacts, not green evidence.
Current source also contains scripts/smolvlm2_describe_e2e.sh, a C10
CLI gate that emits smolvlm2_describe_e2e/v1 NDJSON, checks missing-model and
wrong-family negative paths, then runs describe and VQA through the real int8
artifact. Treat it as model-gated e2e evidence and cite C10 closure only when
live Beads/source agree.
If src/cli.rs still has an older doc comment saying OcrTask::Describe is
planned, treat it as stale inline prose; the usage guards, forward_smolvlm2
dispatch, Beads, README examples, and DISC-003 are the current route evidence.
OneChart is now a ready runtime and pull route for chart-to-data extraction
when the running binary embeds or resolves the bd-av64.7 manifest.
bd-3jo6.4.2 closed the D2 arch-aware conversion half: focr convert --model-id onechart classifies OPT decoder GEMMs under
, verifies the tied against
, dedups the tied head, writes
plus the Apache-2.0 notice, converts the real 500 MB
checkpoint from 384 source records to 383 records, produces 72 int8
GEMMs (12 layers x q/k/v/out/fc1/fc2), keeps vision/projector/number-head/norms
high precision, and records a 346 MB artifact. / later
publishes that artifact through the committed pull manifest, so is current when the running binary embeds or resolves that manifest.
closed D9 tokenizer conformance: (plain GPT-2 regex, no
Digits stage), , +
+ , base control tokens
as splittable specials, pinned ids 50265 / 50266 /
50267 / 50268, bos=eos 2, pad 1, and 29/29 token-id-exact
이 SKILL.md는 매우 커서 SkillsMP가 여기에는 첫 섹션만 미리 보여줍니다.GitHub에서 보기
3f2878d
GotStatics
38ab806
a9a406e
OnechartStatics
9b2a03b
SmolStatics
4291807
lm_head
4291807
lm_head
6.99 -> ~1.2 ms/tok
40.4 -> 55-57 tok/s
FOCR_GOT_INT8_LMHEAD=0
v0.5.2
bd-av64.10
bd-2mo.26
bd-av64.10
0.624 -> 0.885
0.546 -> 0.755
0.878 -> 0.890
3.046x / 2.249x / 1.499x
bd-2mo.26
3.41x
2.81x
0.00943
0.03529
Post-certification fuzz corpus:5df6395 commits the post-head-to-head
corpus growth that used to look like untracked fuzz WIP: 3,271 seed files
across focrq_parse (1,269), image_decode (603), pretok_split (967), and
safetensors_parse (432), about 721 KB total. The final convergence sweep
also records four fuzz targets x four minutes, 3.65M total zero-crash runs,
and PROPTEST_CASES=2048 8/8 green in round 11. 592426c is README-only
current-source evidence that replaces stale v0.5.1/v0.5.2 public-facing
release identity, manual-download URL, binary-size, and CPU-backend summary
prose with v0.6.0 facts. Treat only new deltas after committed 592426c as
live-WIP; do not delete, clean, or fold untracked files into release/source
claims.
Readiness artifact:bd-wp8.8, bd-wp8.9, and bd-wp8.10 are now
closed in Beads. c29a78b regenerates
docs/gauntlet/RELEASE_READINESS.json as
franken_ocr.release_readiness.v1 with ship:true, green:13, red:0,
certification_bundle green, and gauntlet_convergence green with
rounds=11/10, tail_clean=True;
docs/gauntlet/bundle/release_certificate.json says certified:true at
v0.5.2-8-gc4c1684. That apparent version mismatch is expected: the bundle
certificate was generated at c4c1684; c29a78b then folded the live
certificate into the all-green release-readiness scorecard, and 29516b9
tagged the certified state as v0.6.0. This is the ship-gate receipt, not
proof of unrelated open epics such as parent bd-2mo, bd-3gaa, ARM64
Windows bd-3u97, or a user's installed binary.
focr models --json
pull.in_manifest
pull.quants
models/manifest.json
BUILTIN_MANIFEST_JSON
ModelEntry.sidecars
br show ... --json
bd-av64.7
bd-av64.8
bd-av64.9
bd-av64.12
efccce9
models-tromr-v1
tromr.int8.focrq
tromr.focrq
focr pull tromr
int8
focr pull tromr --quant f32
OneChart work is OP-OC: D1-D9 are now closed and --task chart-data is a
current runtime route. Distribution is also source-current after
bd-av64.7: focr pull onechart installs onechart.int8.focrq,
vocab.json, merges.txt, and added_tokens.json into the OneChart model
cache subdirectory. Source at/after 38ab806 / a9a406e has
onechart::OnechartStatics, OcrModel::onechart_statics, and
onechart.hydrate(cached) as committed pass-7 evidence: SAM tower,
pre-transposed mm_projector, and widened OPT embed table hydrate once per
model and are shared by sequential, batch, and number-head-tap paths. Keep it
scoped to byte-identical chart-data source evidence plus full-lib/fmt/clippy
proof. The parent bd-av64.10 now has a formal closeout at efd83e8, but
pass 7 by itself is not release readiness, broad chart quality, or a
standalone PERF_LEDGER row. Do not invent a separate focr chart subcommand.
TrOMR work is OP-TM: E2 conversion, E6 WordLevel music tokenizer, E3
hybrid ResNetV2+ViT encoder, E4 four-head AR decoder, E7 semantic merge /
MusicXML, E9 focr ocr --task music --model tromr.int8.focrq after the
default pull or --model tromr.focrq after focr pull tromr --quant f32, E8
single-staff parity/SER, E5 v1 staff detection/full-page runtime, E10
coverage, and sub-epic E are closed in current franken_ocrmain
(ab0bae0). Distribution is current after bd-av64.7 and bd-av64.12:
default focr pull tromr installs tromr.int8.focrq plus
tokenizer_rhythm.json,
tokenizer_pitch.json, tokenizer_lift.json, and
tokenizer_note.json; focr pull tromr --quant f32 installs
tromr.focrq. Keep the
boundary precise: TrOMR supports single-staff and v1 printed/scanned
full-page OMR to partwise MusicXML, and has a bd-2sez TrOMR f32
PERF_LEDGER baseline row. That row is an honest losing baseline against
pinned upstream torch
(vision_encode ratio 0.308, decode-per-token 0.428, end-to-end 0.424),
not a speed win. The TrOMR int8 artifact is weight-storage int8 only:
Weights::mat() / Weights::vec() transparently dequant QInt8PerChan
records and TrOMR compute remains f32; qint8() consumers are unchanged.
Still claim no standalone focr music subcommand, no int8 compute proof, no
TrOMR perf win or int8 perf row, no camera dewarp, and no **kern export.
Barline splitting now exists only as the experimental FOCR_TROMR_SPLIT=1 rescue
path from closed bd-av64.4; it is off by default because the
detection-lossless quality gate failed on isolated segments.
TrOMR bd-av64.2 is closed-current for both control-flow resilience and
staff-level observability: 3da9dac landed the resilience core, 8af3887
landed robot/JSON observability, and 4e881d7 closed the bead. Current source
has PageRecognition { staves, skips }, StaffSkip { index, bbox, reason },
recognize_page skips failed staff crops instead of aborting the whole page
when at least one staff succeeds, all-fail pages report every staff reason,
forward_tromr prints a human skip note on stderr, and FOCR_TIMING can
print per-staff dims/outcome. The observability surface is now also current:
MusicPageMeta, OcrModel::take_music_meta,
OcrEngine::take_music_page_meta(), robot::staff_event, robot event kind
staff, and music_meta_to_json feed robot staff events plus detection-
ordered --json / -o .jsonstaves arrays for music runs. The emitted
robot event is staff, not the older bead wording staff_detection /
staff_result; its payload is {staff, total, bbox, status, reason?} with
1-based staff numbers, status: "ok"|"skipped", and skip reasons only when
skipped. Schema stays v1 because adding the staff event kind is additive;
do not invent a schema bump. Tests anchoring this are
staff_event_shapes_ok_and_skipped,
music_meta_json_interleaves_in_detection_order,
schema_advertises_all_events, and the scripts/tromr_music_e2e.sh robot
staff-event arm. The known caveat is PDF+music multi-page runs: the
side-channel exposes only the last page's staves, while single-image music is
the documented flow. Resilience warnings and staff metadata are not crop
geometry evidence by themselves.
TrOMR crop geometry has a committed source landing at eb0c70e, and
40ee875/91d552f/3ae26b1 now close bd-av64.14 for the fit-first
geometry lane and Cadwallader p169 5/5 recognized-staff acceptance. The
committed mechanics are in src/preprocess/staff_detect.rs: 40ee875 makes
the logic fit-first, so staff bands that already fit the 1280-column position
budget keep the historic full-width geometry byte-for-byte. Only over-budget
bands get horizontal ink-extent trim with line-spacing pad,
neighbor-bounded vertical extend-to-fit, non-overlapping bands, and explicit
skip/error handling for bands that still cannot fit. Focused tests are
fitting_bands_keep_the_classic_full_width_geometry,
trim_cuts_page_margins_but_keeps_ink,
wide_staff_with_room_fits_the_positional_budget,
packed_staves_stop_at_the_midline,
unpressured_band_keeps_the_generous_margins,
tromr_page_skips_overwide_staff_and_keeps_the_rest, and
tromr_page_all_staves_failing_is_a_named_error. Keep the closure scoped:
this is not camera dewarp, TrOMR int8, perf evidence, or broad note-level SER
completion; those remain separate follow-up lanes despite bd-av64.12 and
bd-av64.13 closing their scoped experiments.
TrOMR barline splitting is current only as OP-TM experimental/gated evidence:
64edce3 / closed bd-av64.4 adds staff_detect::barline_columns,
recognize_split, and FOCR_TROMR_SPLIT=1 for over-budget staff bands. The
measured doctrine outcome is not "lossless quality shipped": isolated
segments are out of distribution, continuation pitch registration can drift,
rhythm agreement was about 0.2, and pixel clef-prepend context measured
worse. Use it as recognition-count rescue, for example p055 5/7 -> 7/7
recognized when armed, not as a default route, camera dewarp, broad SER,
int8 decoder-kernel evidence, or a perf win.
TrOMR musical sanity and residual-skew work are current but scoped. d51d7d9
closes bd-av64.5: tromr::sanity_warnings adds annotate-only warnings for
overfull bars, underfull non-final bars, impossible durations, and cross-staff
key mismatches. The surfaces are XML <!--focr-sanity: ...--> comments that
strip cleanly without changing musical content, robot music_warning events,
music-run JSON warnings, stderr count summaries, and FOCR_TIMING lines.
This is telemetry and deterministic fallback, not auto-correction. 39651e6
lands bd-av64.13 lever 1: refine_band_skew() sweeps each detected staff
band over +/-1.5 degrees at 0.1-degree steps, engages only when the best angle
is at least 0.2 degrees from flat, re-derives line centers, and abandons the
refinement if the five-line group cannot be re-found. Straight bands stay
byte-stable and the corpus gate stayed green, but the no21 double-dotted XFAIL
did not flip. 69039c3 closes bd-av64.13 by measuring and reverting the
remaining levers: FOCR_TROMR_TTA=3 micro-rotation voting regressed
no17_sys at 2.8x cost because degraded scans dropped time signatures and
inverted the bar-sum scorer, while one-crop routing through the refined band
broke the committed golden by re-trimming a tight crop. Do not retry either
without a held-out bd-av64.15-style corpus and a presence-first scorer.
TrOMR int8 is current after efccce9 / closed bd-av64.12, but only as a
quantized-storage artifact. src/quant/convert.rs now marks exactly the 40
Seq2SeqDense decoder GEMM suffixes (to_{q,k,v}, to_out.0,
net.0.proj, net.3) as int8; encoder/embeddings/norms/heads stay high
precision. src/native_engine/weights.rs lets f32 accessors dequant
QInt8PerChan via dequant_qint8() so the existing f32 TrOMR forward can
run tromr.int8.focrq. Evidence: committed golden byte-identical, 5/6
real-scan corpus fixtures byte-identical MusicXML, corpus gate delta 0, one
tier-2 no-truth p100 fork ledgered as DISC-005, clean-cache pull
byte-exact, and pulled-artifact inference byte-matching the committed golden.
Do not call this int8 compute, a speed win, or a broad quality improvement.
Use focr pull tromr --quant f32 / an existing tromr.focrq for bit-exact
reference work; current focr convert has no f32 quant mode.
Property/fuzz infrastructure is now closed-current after f9f4c49 /
2dda846 / closed bd-10sb.1. It is verification/safety infrastructure, not
a user-facing CLI feature. The committed surface is proptest dev-dependency
plumbing,
tests/property_suite.rs, tests/support/proptest_support.rs, and the
fuzz/ cargo-fuzz workspace with targets focrq_parse, safetensors_parse,
image_decode, and pretok_split; tokenizer::pretok is public because it
is an untrusted-Unicode fuzz surface. The property suite covers
SIMD-vs-scalar bit identity, i32-vs-i64 accumulator agreement up to K=6848,
preprocess geometry totality, .focrq parser totality under byte mutations,
and model-gated byte-level-BPE round trip. The day-one fuzz finding was real:
image_decode found a tiny PNG declaring huge dimensions and the fix bounds
decoded images before allocation with the pdf.rs 1 Gpx policy, decoder
limits, decompression_bomb_png_is_rejected_before_allocation, and the typed
InputDecode exit-4 contract. CI/gate closure is now current but still
scoped: e80360b unblocks the GitHub Actions provisioning failure caused by
frankensqlite moving its asupersync dependency off the old /dp/asupersync
path; cc79d70 registers the frozen tests/fixtures/multi_page oracle
directory plus narrows check_release_linkage.py byte scanning to linkage
tokens such as libpython, libtorch, torch_cpu, _PyObject, and
Py_Initialize; c960b77 keeps golden-loop .actual diff aids out of the
fixture-manifest gate; 29aa40a adds always-uploaded gate-log artifacts and
an advisory bench-guardrail job; 7777e34 fixes the aarch64 advisory
SMMLA layout comparison by un-permuting panels before logical equality; and
2e5801b / 18712cc close bd-4yks with macOS+Ubuntu gate jobs green on
the full scripts/check.sh battery, dist green, and the advisory matrix
noted 6/6 after the SMMLA fix. Do not describe bd-10sb.1, bd-4yks, or
those gate repairs as an exhaustive fuzz campaign, a scheduled full-model
self-hosted run, ARM64 Windows completion, or all-green release-readiness:
there is still no in-repo TEST_LOG_DIR capture layer, the 6.67GB-weight
full-model scheduled job needs a self-hosted runner, native Windows x86_64 is
now supported/proven end-to-end, ARM64 Windows remains bd-3u97, and CI/fuzz
evidence still needs separate release-scorecard approval. Current OP-SG
release approval is the c29a78b / 7c7bd00 / 29516b9v0.6.0
release-readiness evidence, not the CI gate itself.
TrOMR real-scan quality work is OP-TM plus OP-VG, with a new current
boundary after bd-av64.6 / af13d3e / 3ae26b1: corpus v1 is closed for
the measuring device, with six public-domain 1843 Spohr fixtures under
tests/fixtures/realscan_music/ plus scripts/realscan_music_gate.sh. The
gate emits realscan_music/v1 NDJSON and uses three truth tiers:
human-verified attributes in truth/attributes.json, frozen
goldens/*.musicxml as regression anchors not truth, and robustness floors
via robot staff events. It is model-gated skip-with-SUCCESS when TrOMR
weights are absent, but XFAILs are never silent skips: an XPASS is a failure
that must promote the fixture. Do not inflate this scoped closure into broad
note-level SER completion, a full 10-20 item expansion, GOT cross-reference
scorecard completion, or aggregate SER. Known current source refinements:
40ee875 promotes Spohr p055 and p100 from page-level XFAILs into
truth-floor checks (min_recognized 5 and 1), and 91d552f makes
scripts/realscan_music_gate.sh read those full-page floors from
truth/attributes.json instead of duplicated shell literals. Closed
bd-av64.4 adds experimental split rescue for some over-budget duet bands,
but it is not broad SER closure or default quality. GOT auto-format
misclassifies narrow staff strips as SMILES/molecules, so cross-reference full
systems; documented --json music semantic output is still a doc/code gap
unless source has since added it.
The double-dotted system XFAIL remains after closed bd-av64.13; the
measured voting and one-crop levers were negative/reverted, so future work
belongs to held-out corpus/model-quality calibration, not to residual-skew
refinement by default.
Runtime/cancellation/thread-budget work is OP-OE/OP-RP current as of
59d376b / closed bd-223.2: look for request_shutdown,
shutdown_requested, reset_shutdown, cancel_checkpoint,
thread_budget, stream_pages, FOCR_THREADS, ctrlc, robot threads,
and checkpoint calls in decoder loops. If an installed binary lacks those
surfaces, classify it as stale/pre-bd-223.2 before changing docs.
Run-state and sync work is OP-RS: current source after 03eadd2 / closed
bd-223.4 contains src/storage.rs, pub mod storage, RunStore,
RunRecord, FOCR_RUN_STORE, live focr runs, and live
focr sync export-jsonl / import-jsonl. Treat it as closed-current when
source/help/tests agree; quarantine older binaries that still scaffold or omit
it. bd-wp8.11 later froze the run/sync one-way JSONL contract with
tests/fixtures/runs_schema.json, populated-store/empty-history cases,
stdout purity, and locked atomic sync.
Doctor work is OP-DR: current source after 25eadc5 / closed bd-wp8.4
implements focr doctor detect-only, --fix, --dry-run, undo,
capabilities --json, robot-docs, and --robot-triage through pure
detectors plus a single mutation chokepoint. bd-wp8.4.1 pins the fixture
suite. Do not call doctor scaffolded; do not run --fix casually when the
user asked only for diagnostics.
Robot triage and agent ergonomics are OP-RT: 055e513 / closed bd-wp8.7
adds the one-round-trip focr robot triage JSON mega-command with
quick_ref, health, recommendations, commands, and exit_codes.
Prefer it for automation over several human/help probes.
Release ship claims are OP-SG: 2bdccc5 adds
scripts/gauntlet_cert.py --release-readiness and
docs/gauntlet/RELEASE_READINESS.json; 8cacf52 adds --bundle; 9bc715e
makes certification_bundle a live release_certificate.json cell and keeps
--bundle from certifying itself. The old red state (ship:false,
green:11, red:2, rounds=8/10, tail_clean=False) is now historical.
c29a78b is the ship-gate receipt and 29516b9 tags that certified state as
the public v0.6.0 release. Release readiness is ship:true, green:13,
red:0; the bundle is certified; convergence is
rounds=11/10, tail_clean=True; and 7c7bd00 closes bd-wp8.8,
bd-wp8.9, and bd-wp8.10 in Beads. beaed7c adds the CI/dist supplement,
db02421 refreshes README evidence, and 5df6395 commits the
post-certification fuzz corpus. 592426c refreshes public README release
identity/asset-size/backend prose for v0.6.0. Keep this exact boundary: it
proves the
release certification bundle and Phase-5 ship gate, not arbitrary model
quality, not open Phase-3/int4/ARM64-Windows epics, and not the user's
installed binary without a binary/version check.
PDF page selection, spread splitting, and PDF rotation normalization are
OP-PS: bd-av64.11 is closed after 11f60ea / 9546571 / 5679268 /
b3f74b6. Current committed source exposes --pages and --split-spreads
for scanned PDFs, and the pure-Rust PDF renderer applies both page /Rotate
and axis-aligned content-stream image-placement rotation via
content_rotation before OCR/spread splitting. Treat page ranges as PDF-only,
1-based comma/range syntax; split-spread output is heuristic left/right
logical pages. --split-spreads does not compose with --extract-figures
yet; source should return a clean usage error rather than guessing figure
names across split halves.
Multi-page cross-page parsing is OP-MP: 4afcaca / f115403 / b9cc16c
close bd-1gv.25 for the infer_multi core and
focr ocr-batch <images...> --multi-page; a2dd1c9 plus 750a69a add the
PDF half as focr ocr doc.pdf --multi-page. This is one Unlimited-OCR
cross-page document pass, not a concatenation of independent page parses.
Source uses reference-faithful 640x640 squash preprocessing
(preprocess_dynamic_squash, PIL-bicubic hard-wired at this site), one
111-placeholder visual block per page, a single cross-page prompt/decode with
ngram_window=1024, and <PAGE> separators in the final markdown. PDF
--multi-page composes with --pages, but not --split-spreads or
--extract-figures; for image lists use ocr-batch --multi-page. 828ea4c
closes the rest of bd-2z0y: robot-mode PDF multi-page can now emit additive
page events with status:"decoded", page, chars, and raw text as
<PAGE> boundaries are crossed during token streaming. 727701b closes
bd-1gv.26 for the 2-page L5 multi oracle rung. 3201e8c and e1332a7
then close bd-1465: the 10-page rung
l5_multi_page_10p_long_horizon is committed with fixture p10, subject cap
7600 as a true-prefix comparison, plate byte-exactness, markers 8-vs-9, and
CER 0.4045 <= 0.50; the uncapped subject terminates cleanly at the 32768
position cap (31653 generated + 1115 prefill) where the bf16 oracle EOSes at
7117. The 20-page p20 oracle fixture is also frozen and shows the reference
itself collapsing (7 <PAGE> markers for 20 pages plus repetition tail), so
treat it as upper-bound/degradation evidence, not as a meaningful 40-page CER
gate or proof of arbitrary long-document quality.
Backend, SIMD, and performance claims are OP-BG/OP-GB territory. Use
robot backends for selected/available CPU tier facts, robot selftest for
selected-kernel parity, and docs/PERF_LEDGER.md / gauntlet evidence for
speed. ad3ad20 and the adb4ee6 e2e prove robot selftest.models, a
per-model rollup for unlimited-ocr, got-ocr2, smolvlm2, and onechart
whose verdicts must match their underlying case rows. Closed
bd-3jo6.1.12/sub-epic A evidence reports 44/44 cases green on scalar,
sdot, and smmla, with model-specific overflow rows. TrOMR is intentionally
absent because its published int8 artifact is storage-only and runtime
dequants through f32 accessors rather than int8 decoder kernels. Never turn a
selftest pass into a throughput claim.
A11 zoo performance claims are OP-GB, not batch-spine or selftest evidence.
The historical v0.4.0 README summarizes docs/PERF_LEDGER.md
matched-thread Apple SDOT decode-per-token rows as GOT-OCR2 3.37x,
OneChart 2.58x, and SmolVLM2 1.67x over pinned Hugging Face CPU
references. Those are decode-per-token ratios; full end-to-end rows are
still kept, including slower totals from artifact load or preprocessing.
Prefer the later efd83e8 final rows for bd-av64.10 closeout claims. Do
not mix either family with the scoped dense-batch rows (1.32x SmolVLM2,
1.27x OneChart, GOT +3-16%) or with the TrOMR f32 loss row.
Release-evidence instruments are OP-SG/OP-CM/OP-VG: the scorecard comes from
scripts/gauntlet_cert.py --release-readiness, the conformal ratchet from
docs/conformance/RATCHET.md, the anytime-valid invariants from the Ville
e-process --eprocess-fold / --eprocess-state path, and the capacity
certificate from capacity_certificate_bounded_stream_soak. These are
separate proof families. They do not override a red release-readiness cell,
an open capstone bead, or a missing armed fixture directory such as
FOCR_FIXTURES_DIR.
Phase-2/P3 source status must not be rounded up: bd-1es is closed for the
validated weight-only int8 decoder recipe, bd-2mo.1 is closed for runtime
ISA dispatch through FOCR_FORCE_ARCH and the bit-identical scalar oracle,
and bd-2mo.3 / bd-2mo.3.1 are closed for offline arch-specific SMMLA
prepacking. focr convert --arch aarch64-smmla now emits real SMMLA panels
through src/simd/pack.rs; the loader preserves panels on SMMLA dispatch and
un-permutes with a warning otherwise. This is a layout/correctness and
zero-runtime-shuffle fact, not an M-series throughput win and not proof that
packed-consuming x86 kernels exist for VNNI/AMX. The fcb8289 tracker sweep
closed
13 SIMD kernel/dispatch/proof beads, but bd-2mo is still open and important
levers remain open: the non-mmap remainder of memory/allocator reuse
(bd-2mo.22), NUMA/USL pool sizing (bd-2mo.21), int8 attention, vectorized
exp, and several fusions. 8de3674 adds memmap2 to the committed v0.5.1
Cargo dependency graph; the v0.5.1 GitHub release now exists with
platform binaries and SHA256 assets, but release publication is still
separate from source work after the tag. 507cebe ships the read-only mmap
loader half:
Weights::load defaults to Backing::Mapped, FOCR_NO_MMAP=1 forces the
owned-buffer fallback, mmap failures also fall back to owned bytes, and
mmap_load_is_byte_identical_to_owned_read proves mapped-vs-owned tensor and
directory identity. 0401df2 adds the Beads note that bd-2mo.22 is still
open for 64B alignment, decode-loop buffer reuse, and mimalloc measurement.
Treat closed kernel parity and mmap-loader correctness as current capability
evidence, not as proof every perf lever or P3 exit gate is done.
Default fused-QKV decode is OP-BG/OP-GB territory too: 98cc790 /
5474ae0 close bd-241s by making the int8 decoder's fused
q/k/v projection the default path. FOCR_QKV_FUSED is no longer an opt-in
speed lever; it is a kill switch where FOCR_QKV_FUSED=0 / off / false
/ no restores the older three-call projection path for parity/profiling.
Source anchors are qkv_fused_enabled, fuse_qkv, CachedLayerI8.qkv, and
fused_qkv_gemv_is_byte_identical_to_three_calls. Evidence anchors are
closed bd-1waa, bd-3pg7, bd-241s, docs/NEGATIVE_EVIDENCE.md, the
page_0590 SHA/CER checks, the 20-page CER equality, and the controlled
page_0009 A/B row (0.072 -> 0.052 s/tok, best-of-3). Keep the boundary
precise: this fuses decode q/k/v projection only; prefill still uses
per-projection paths, and stale adjacent source comments must not override
qkv_fused_enabled() or the close evidence.
Ngram-lmhead fusion is a measured negative, not a likely next win:
bd-2mo.24 / a0ad299 ledgered FOCR_FUSE_NGRAM_LMHEAD as
correct-but-does-not-pay. The code stays harmless and opt-in behind
FOCR_FUSE_NGRAM_LMHEAD with unit proof
fused_ngram_lmhead_is_byte_identical_to_separate_mask, but the measured
page_0023 A/B moved decode best only 16.43s -> 16.40s (0.2%, inside noise)
with byte-identical outputs. Keep it off by default and do not retry unless
the workload changes the arithmetic: multi-image ngram_window=1024 ban sets
or a roughly 10x faster decode step; rerun the same A/B first.
Dense batched decode work is OP-BS/OP-GB territory: bd-3jo6.1.7.5 is now
closed/current after 8497080, cf0b037, 4ca1577, and fdd1d64, and it
ships in the v0.4.0 source boundary. Preserve the layering because it is how
agents avoid false speed claims. 8497080 added the reusable dense pieces:
gemm_i8_bias_prequant_batched, BatchedQwen2KvCache,
qwen2_batched_decode_step, DenseDecoderBatchStep, and
generate_greedy_batched. cf0b037 first routed GOT-OCR2 ocr-batch
through OcrModel::recognize_batch -> recognize_batch_dense_got ->
got::recognize_batch under value-parsed FOCR_BATCH_SPINE.
4ca1577 broadens the dense zoo route through
OcrModel::recognize_batch_dense for got-ocr2, smolvlm2, and onechart,
adds per-model recognize_batch helpers, and makes
generate_greedy_batched(weights, cfg, inputs_embeds, caps: &[usize], eos)
preserve each page's generation budget through PageStream::with_max_emit.
Dense zoo vision/splice/prefill stay model-specific per page; the active
decode streams then share one continuous-batch greedy decode and per-page
finalization stays the same as sequential recognition. The scheduler default
from src/native_engine/batch_scheduler.rs is DEFAULT_BATCH_SIZE = 128,
capped at MAX_BATCH_SIZE = 256; FOCR_BATCH_PACK groups similar prefill
lengths and must restore input order; FOCR_BATCH_VISION is default-on inside
the original batch spine and can be killed with 0/off/false/no.
Lossless proof is four-layered: bit-identical per stream f32::to_bits step
gates for Qwen/Llama and OPT families, scheduler identity including mixed caps
[6,3,5] and real mid-batch EOS retirement, real binary byte-identical
markdown for GOT/SmolVLM2/OneChart, and the durable model-gated GOT e2e gate
recognize_batch_matches_sequential_e2e with skip-with-SUCCESS NDJSON when
unarmed. Honest throughput is scoped: SmolVLM2 decode 700 tok is 74.6s vs
98.3s (1.32x), OneChart 438 tok is 2.39s vs 3.04s (1.27x), and GOT remains
vision-dominated at roughly +3% to +16% on the cited fixtures. Still do not
claim broad batched lm_head, a fairness-controlled A11/PERF_LEDGER row, or
decode-heavy B>=8 throughput until follow-up evidence lands.
Follow-on d25dbd7 improves the GOT-OCR2 batch path itself:
got::recognize_batch now hydrates SamWeights, mm_projector_vary, and
model.embed_tokens.weight once per batch, then logs got.hydrate(batch)
and got.vision+splice(batch of N). The commit reports same-binary 3-page
sequential 14.47s vs batch 13.53s (~6.5%) with
recognize_batch_matches_sequential_e2e byte identity. Attribute that narrow
hoist honestly; do not roll it into the larger SAM-attention win or into
final A11 throughput. Current public source at 3f2878d extends this into
model-level GotStatics: the GOT SAM tower, projector, and widened embed
table hydrate once on OcrModel and both sequential and batch page paths log
got.hydrate(cached). Treat that as committed pass-6 evidence; the parent
bd-av64.10 closeout is now separate formal G2 evidence at efd83e8, not
something pass 6 alone proves.
GOT e2e performance triage has moved, and efd83e8 now closes bd-av64.10
with formal G2 re-measurement rows. The earlier bd-av64.10 measurement
overturned the older artifact-hydration premise, 01f07fe landed pass 1 of the
bit-identical SAM attention optimization work, f3d3215 landed pass 2 with
head-parallel global attention across the 12 heads, 0298651 landed the
committed CLIP-tower pass 3, f65fded / 3c1b1ea make the broader
shared-Linear pre-transpose battery pass-4/current evidence, and f1ac972
lands SmolVLM2 SigLIP frame batching as pass 5. Public origin/main also
contains the row-tile experiment and its reversal: c5e535a added
row-tiled SAM global-attention score buffers, 8bd4037 restored the untiled
baseline, and b757bc0 ledgered the measured negative result in
docs/NEGATIVE_EVIDENCE.md plus
artifacts/perf/bd-av64.10-rowtile/. The tiled path was byte-identical on the
cited real Unlimited-OCR and GOT-OCR2 fixtures, but slower in all four
interleaved Apple-Silicon pairs because the cache-local score-buffer idea
multiplied small GEMM dispatches. Treat the SAM vision lever list as
exhausted unless a fresh target-specific profile proves a different hardware
regime and the replacement avoids the dispatch explosion.
With
FOCR_TIMING,
GOT sample text showed sam.hydrate around 0.03s and the forward gap
dominated by SAM vision, especially sam.block attn(GLOBAL),
sam.block attn(win), and MLP timing. Pass 1 parallelized the 25 window
attentions, hoisted window rel-pos tables, removed per-element division from
bias add, and made the QKV split contiguous-copy based. Pass 2 parallelizes
global-attention heads across rayon disjoint output spans while preserving
per-head arithmetic and byte identity. Cumulative evidence reports
attn(win) 1.88s -> 0.72s, attn(GLOBAL) 2.10s -> 1.66s, sam.forward
5.55s -> 4.24s -> 3.4-3.6s, GOT forward 6.7s -> 5.7s -> 4.6-4.8s, and
unlimited-OCR real page 19.3s -> 13.5s (-30%), with byte-identical output,
armed GOT certs 8/8, vision_sam 37/37, and clippy -D clean. Pass 3
pre-transposes vision_clip::LinearParams into GEMM layout once
at hydration, caches ClipWeights on OcrModel, removes 96 per-forward
transposes (~1.2 GB data movement), and reports vision.clip 2.49s -> 0.77s
steady-state on page_0009 with byte-identical output, armed L2 certs, 41/41
vision_clip, and 957 full-lib tests. Pass 4 moves
vision_sam::Linear to a validating Linear::from_row_major constructor
that stores a GEMM-ready cached [in,out]Mat once at hydration and checks
matrix metadata on apply; it removes repeated row-major transpose work
across SAM block qkv/proj/mlp weights, GOT and OneChart projectors,
SmolVLM2 modality projection, SigLIP linears, and TrOMR
encoder/decoder/feed-forward/head linears. Treat that as committed
self-relative optimization evidence, not final matched-reference
A11/PERF_LEDGER closure. Pass 5 stacks SmolVLM2 SigLIP frames through
vision_siglip::forward_frames_batched; FOCR_SIGLIP_SEQ=1 forces the old
per-frame loop, and batched_frames_match_sequential_byte_for_byte is the
proof anchor. Treat the reported loaded-host SmolVLM2 vision+splice wins as
pass evidence; the later closeout rows below are the formal G2 state. Do not list SIMD-exp
softmax as a remaining easy path: ab6e083 measured it dead and reverted it,
and 50d5dad records artifacts/perf/bd-av64.10-simd-exp/. Do not list
row-tiled SAM attention either: b757bc0 makes the negative/reverted result a
public current-main fact, not just local checkout lore.
d25dbd7 first hoists GOT batch hydration once per batch; count that as the
predecessor batch-path amortization win, not as closure of bd-av64.10's
wider e2e lane. 3f2878d then lands pass 6: got::GotStatics hydrates the
GOT SAM tower, mm_projector_vary projector, and widened embed_tokens table
(~1 GB f32) once via an OcrModelOnceLock, routes both sequential and
batch GOT page paths through that cache, and logs got.hydrate(cached).
Honest scope: measured about 0.8s/page saved on the sequential page loop
(got.vision+splice 4.15 -> 3.31s/page on a 2-page batch, one 0.14s hydrate
total), GOT sample output byte-identical, full lib 959 green, fmt/clippy/ubs
clean, and the armed batch-vs-sequential e2e gate covers the contract. Treat
pass 6 as committed source evidence, not as the formal closeout by itself.
38ab806 / a9a406e then land pass 7:
onechart::OnechartStatics hydrates the OneChart SAM tower, mm_projector,
and widened OPT embed table once on OcrModel; onechart::recognize,
recognize_batch, vision_features, build_inputs_embeds, and the
Number-head finish pass all reuse it. Evidence is chart-data output
byte-identical to the pre-statics reference, full lib 960 green, fmt/clippy
clean, and onechart.hydrate(cached) about 0.10s once per model. Treat pass 7
as scoped committed source evidence, not as release readiness, broad chart
quality, or the formal closeout by itself.
9b2a03b then lands pass 8: smolvlm2::SmolStatics hydrates the SigLIP
tower, modality_projection, and widened untied text embed once on
OcrModel; recognize, recognize_batch, vision_rows, and
build_inputs_embeds reuse it. Evidence is describe output byte-identical to
the pre-statics reference, lib green, and Beads comment 91 reports
smolvlm2.hydrate(cached) about 0.14s once per model. Treat pass 8 as scoped
committed source evidence, not as release readiness, public VQA quality, or
the formal closeout by itself. All four zoo lanes now hydrate model-constant
tensors exactly once per process.
4291807 then certifies and flips the SmolVLM2 untied lm_head
int8+top-K-refine path on by default. Evidence: paired describe outputs
byte-identical f32-head vs int8+refine, armed L5 VQA green under the lever,
full describe/VQA e2e suite pass, lm_head about 6.99 -> ~1.2 ms/tok, and
decode 40.4 -> 55-57 tok/s; FOCR_GOT_INT8_LMHEAD=0 remains the f32-head
kill switch. Treat it as a scoped runtime/head certification, not a public VQA
benchmark or a reason to store the SmolVLM2 .focrqlm_head as int8.
efd83e8 is the formal closeout: nine 2026-07-08 PERF_LEDGER rows under
artifacts/perf/bd-av64.10-g2r/, hash-anchored by SHA256SUMS, at matched
8 threads against the frozen 2026-07-05 references, with cv<=1.7%. Final
end-to-end ratios improved but stayed below the original >=1.0x target:
GOT 0.624 -> 0.885, OneChart 0.546 -> 0.755, and SmolVLM2
0.878 -> 0.890. Decode-per-token remains positive and should be cited as
the new final rows, not the older v0.4.0 summary: GOT 3.046x, OneChart
2.249x, SmolVLM2 1.499x. The honest close reason is "lever list
exhausted with receipts": 8 landed bit-identical passes, 3 measured negatives
(SIMD exp, row tiling, per-head batching absorbed by head-parallelism),
and remaining e2e gap attributed to load-inclusion bias plus vision f32 GEMMs
near kernel peak. Future speed work belongs in bd-2mo kernel epics or a new
measured corpus bead, not in another artifact-load-tax retry.
At/after 3f2f97e, scripts/gauntlet_timing.py parses the cited SAM/CLIP
drill-down labels; ae7b8f2 records the bead-scoped evidence bundle; and
c248e6d lands the bd-2mo.26 head-to-head rows: page_0009 e2e 3.41x
(vision 5.38x, prefill 4.62x, decode/tok 1.85x, CER 0.00943) and
page_0014 e2e 2.81x (vision 5.62x, prefill 4.91x, decode/tok 1.92x,
CER 0.03529) against pinned HF bf16. c4c1684 closes bd-2mo.26 with
rounds 9-10. Use raw [focr-timing] stderr only for newer unknown stage
names.
Verification infrastructure claims are OP-VG: current main has closed
bd-zc1o robot schema contract tests, bd-n68o structured test logging,
bd-29wv model-gated skip-with-SUCCESS e2e discipline, and bd-re8.7 L5
OCR parity fixtures. Treat those as scoped gates, not proof that every
corpus, model, or perf row is complete. Source at/after adb4ee6 refreshes
tests/fixtures/robot_schema_v1.json and the advertised-events assertion for
additive TrOMR staff events; source at/after 0b74af0 also advertises
additive schema-v1 music_warning in the frozen fixture and hard-coded event
inventory. The older bd-wp8.2.2 tracker item may still appear open or stale,
so verify the focused schema tests before making a tracker-closure claim. Do
not require a schema v2 for staff or music_warning, and do not let stale
Beads wording override current fixture/source evidence.
Determinism and fixture-provenance claims are OP-DG: committed 3e85c7d
closes bd-3kge and bd-2pgf with shared
assert_deterministic / assert_outputs_deterministic helpers, real-model
e2e adoption, tests/fixtures/PROVENANCE.md,
tests/fixtures/MANIFEST.toml, and scripts/check_fixture_manifest.py
wired into scripts/check.sh. Keep this separate from oracle
nondeterminism-floor work.
Conformance-accounting claims are OP-CM: committed fb52843 (format follow-up
c685818) closes bd-re8.12 with ConformanceTest,
RequirementLevel, ConformanceCategory, conformance_registry(), and
tests/conformance_matrix.rs. The matrix enumerates [SPEC-NNN] clauses
from docs/truth-pack/EXISTING_UNLIMITED_OCR_STRUCTURE.md, requires MUST
coverage >= 0.95, logs per-clause NDJSON, checks XFAIL sites against
DISC-NNN or stated phase gaps, and runs registry entries in-process. Treat
it as release/conformance accounting, not a universal OCR-quality proof.
Differential, metamorphic, and golden-artifact claims are OP-DF/OP-MR/OP-GA:
current main has closed bd-re8.9, bd-re8.10, and bd-re8.11.
Differential compares a subject implementation against a bf16 oracle through
per-op and L3-L5 ULP/tolerance rows; metamorphic checks oracle-free
self-consistency under documented transforms and explicitly rejects the false
multi-page concat/sum relation; golden tests
freeze CLI/robot/schema/numeric artifacts with exact, fuzzy, scrubbed, or
canonicalized comparison rules. Keep those three proof families separate from
conformance accounting and from model-gated skip behavior.
Ordered L0-L5 ladder scorecard claims are OP-LS: committed 1b84428 adds
scripts/ladder_scorecard.sh, and 1112cf8 plus the bd-re8.19 close
evidence make the ladder runner tracker-closed. The runner folds
event=parity rows and event=result outcomes from the serial
parity_ladder integration test into one focr-ladder-scorecard/v1 artifact
with gates, all_green, skipped_no_model, receipt, and
not_meaningful annotations above the first hard failure. Armed evidence on
July 6, 2026 reported all six gates green; unarmed no-model runs still report
skipped_no_model=true and all_green=false, so do not call skips green.
Benchmark guardrail claims are OP-GB: bd-1a6h / 60d8af4 add
scripts/bench_guardrail.py plus benches/.bench-history/baseline.json.
The guardrail compares gauntlet_focr.sh stage records against frozen
per-regime baselines, exits 1 on >10% regressions by default, logs one NDJSON
row per stage, refuses perf reporting without an all-green L0-L5 parity
receipt, treats cv_pct > 5 and fairness-posture mismatches as ineligible
rather than wins/losses, and skips-green when required fixtures, baselines, or
receipts are absent. Baselines move only under explicit reviewed --ratchet,
never automatically or in CI. Roofline floors remain gauntlet_row.py
ledger columns; the guardrail is the frozen-baseline ratchet half.
If output is for automation, prefer robot/JSON commands and keep stdout/stderr
contracts explicit.
focr music
**kern
staff_detection
staff_result
staff
music_warning
staves
FOCR_TROMR_SPLIT=1
lm_head
91c12fd
ae7b8f2
c248e6d
c4c1684
bd-2mo.26
c29a78b
7c7bd00
29516b9
v0.6.0
beaed7c
db02421
5df6395
592426c
c960b77
29aa40a
7777e34
2e5801b
18712cc
ab6e083
50d5dad
ab6fa6c
3f3d9d0
8cacf52
ff22366
f1ac972
2665750
48a9896
c5e535a
8bd4037
b757bc0
9bc715e
3f2878d
8de3674
507cebe
0401df2
a391793
c8682a3
38ab806
a9a406e
9b2a03b
8d6601d
4cedacd
0924479
efd83e8
3f2f97e
4291807
91c12fd
ae7b8f2
c248e6d
c4c1684
c29a78b
7c7bd00
v0.6.0
29516b9
beaed7c
db02421
5df6395
592426c
592426c
focr --version
v0.4.0
ocr <image-or-pdf>
-o/--output
--extract-figures
ocr-batch
pull
convert
PdfPages
v0.4.0
ocr-batch --multi-page
ocr --multi-page
page
staff
FOCR_TROMR_SPLIT=1
music_warning
warnings
robot selftest
aarch64-smmla
.focrq
tromr.int8.focrq
tromr.focrq
bd-av64.13
v0.4.0
bd-10sb.1
bd-av64.10
f65fded
3c1b1ea
f1ac972
3f2878d
38ab806
a9a406e
9b2a03b
8d6601d
4cedacd
0924479
bd-av64.10
efd83e8
bd-2mo.26
3f2f97e
4291807
bd-2mo.26
c248e6d
c29a78b
7c7bd00
v0.6.0
29516b9
beaed7c
db02421
5df6395
592426c
bd-4yks
e80360b
cc79d70
v0.5.0
origin/main
592426c
FOCR_SIGLIP_SEQ=1
efd83e8
c5e535a / 8bd4037 / b757bc0: row-tiled SAM global-attention score
buffers were a public experiment, then a public baseline restore and negative
evidence ledger entry. Tiling was byte-identical but slower on Apple Silicon
because many small GEMM dispatches outweighed cache locality. Do not retry row
tiling as the next obvious win unless a fresh profile on a different hardware
regime shows the score matrix is actually DRAM-bound and the replacement uses
a fused blocked kernel rather than a loop of small matmul calls.
3f2878d: GOT pass 6 makes GotStatics public current-main source rather
than checkout-only evidence. The model-level OnceLock caches the GOT SAM
tower, projector, and widened embed table for both sequential and batch paths.
Keep its claim scoped to the committed evidence above; the formal G2 closeout
is the later efd83e8 row bundle, not the pass-6 commit by itself.
8de3674 / 4cedacd / historical release v0.5.2: source/package tags
v0.5.1 and v0.5.2 are committed; 8de3674 bumps Cargo to 0.5.1 and
adds memmap2, while 4cedacd bumps/tagged source/package v0.5.2. The
v0.5.2 GitHub release object and platform assets are real, published
2026-07-08T06:05:23Z, but no longer latest after public v0.6.0. Keep
release publication separate from post-tag source commits and from the
installed binary on a user's PATH.
507cebe / 0401df2: the mmap half of bd-2mo.22 is now current committed
source. The default loader uses read-only mmap, FOCR_NO_MMAP=1 and mapping
failures force the owned-buffer fallback, and the byte-identity/is-mapped test
proves mapped-vs-owned parser equivalence. Do not close or overclaim the full
bead: 64B scratch alignment, decode-loop buffer reuse, and mimalloc
measurement remain open.
38ab806 / a9a406e: OneChart pass 7 is now committed source. OnechartStatics
owns the hydrated SAM tower, pre-transposed mm_projector, and widened OPT
embed table; OcrModel::onechart_statics caches it with a OnceLock; and
sequential, dense batch, and number-head finish paths use it. Evidence:
chart-data output byte-identical to pre-statics reference, full lib 960,
fmt/clippy clean, and Beads comment 90 reports onechart.hydrate(cached)
about 0.10s once per model. Do not turn this individual pass into broad
OneChart quality, release readiness, or a standalone G2/PERF_LEDGER row.
9b2a03b: SmolVLM2 pass 8 is now committed source. SmolStatics owns the
SigLIP tower, modality_projection, and widened untied text embed;
OcrModel::smol_statics caches it with a OnceLock; and sequential describe,
VQA, and batch paths reuse it. Evidence: describe output byte-identical to
pre-statics, lib green, and Beads comment 91 reports smolvlm2.hydrate(cached)
about 0.14s once per model. Do not turn this individual pass into public VQA
quality, release readiness, or a standalone G2/PERF_LEDGER row.
4291807: the SmolVLM2 untied lm_head int8+top-K-refine path is now
certified and default-on. Evidence: paired describe outputs byte-identical
f32-head vs int8+refine, armed L5 VQA green under the lever, full
describe/VQA e2e suite pass, lm_head about 6.99 -> ~1.2 ms/tok, decode
40.4 -> 55-57 tok/s, default-path output re-proven byte-identical, and
full lib 960 green. FOCR_GOT_INT8_LMHEAD=0 is the f32-head kill switch.
Keep conversion/storage separate: the .focrq still records the untied head
as F32; the default-on lever is a runtime head path.
0924479 / efd83e8: 0924479 is README-only source-vs-binary
clarification after the v0.5.2 tag. efd83e8 is the first post-release
source commit that changes the project evidence surface: it lands the formal
bd-av64.10 G2 rows and closes the bead with the measured final state
described above. It is current source evidence, not part of the v0.5.2
release asset.
3f2f97e: committed bd-2mo.26 gauntlet harness bring-up, not a new model
feature. It skips AppleDouble ._*.rs junk in check_ledgers.py, teaches
scripts/gauntlet_timing.py the new SAM/CLIP timing vocabulary
(sam.hydrate, sam.blocks, sam.forward, sam.block ...,
clip.hydrate(cached), clip.blocks), and lets scripts/gauntlet_runbook.sh
write to a fresh evidence home with OUT_DIR. It is now harness bring-up
only; c248e6d and c4c1684 are the later perf-row and closeout commits.
ae7b8f2 / c248e6d / c4c1684: bd-2mo.26 is closed. Evidence bundles
live under artifacts/perf/bd-2mo.26/ and
artifacts/perf/bd-re8.17/G2-*-20260708/; page_0009 records e2e 3.41x
(vision 5.38x, prefill 4.62x, decode/tok 1.85x, CER 0.00943), and
page_0014 records e2e 2.81x (vision 5.62x, prefill 4.91x,
decode/tok 1.92x, CER 0.03529) against pinned HF bf16 with best-of-5
warm runs, N=8 both sides, stdout identical on both sides, and cv% under 5.
c29a78b / 7c7bd00 / 29516b9: release certification is now current and
publicly tagged as v0.6.0. The readiness
scorecard reports ship:true, green:13, red:0; the bundle certificate is
certified:true; convergence is rounds=11/10, tail_clean=True; and Beads
closes bd-wp8.8, bd-wp8.9, and bd-wp8.10. beaed7c supplies the
CI/dist supplement and db02421 refreshes README evidence. Do not inflate
this into closure of parent bd-wp8, parent bd-2mo, int4 (bd-3gaa),
ARM64 Windows (bd-3u97), or proof that installed release binaries match a
user's local PATH without a version check. Native Windows x86_64 is supported;
only native ARM64 Windows hardware/package proof remains with bd-3u97.