What happens when a PDF has no text layer?
It's refused as a text source. If a whole document carries fewer than 40 letter-or-digit characters, that's not a text layer — a scanner's stray page stamp doesn't count — and the file falls through to the OCR tier instead of being guessed at.
src/Trove.Extract/PdfCapture.cs:105
Where does OCR actually run?
On the in-box Windows engine (Windows.Media.Ocr) — nothing downloads, nothing leaves the machine. It exposes no per-word confidence, so every OCR value carries a flat 0.9 — and anything below 1.0 is review-only by construction.
src/Trove.Extract/OcrCapture.cs:22
Why PdfPig and not PDFium?
Text-layer extraction is pure managed code — no native binaries to audit. Rasterization concerns never apply, because Trove reads the PDF's text layer and never renders the page.
src/Trove.Extract/PdfCapture.cs:2
How can a valid CUSIP check digit still lie?
The checksum is blind to 5↔S swaps at odd positions — the doubled digit-sums differ by exactly ten. So on scanned input, if a plausible misread also yields a valid CUSIP, the check digit proves nothing and Trove abstains, saying why.
src/Trove.Core/Checksums.cs:234 · GenericValidation.cs:96
What is the strongest single check?
The sensitive gate. SSNs, routing and bank account numbers, card numbers and the like are extracted and validated but never auto-filled — caught by their label, or by their shape (a structurally valid SSN, a Luhn-valid card number) even under a label Trove has never seen. They are masked and wait for a human to confirm.
src/Trove.Core/GenericValidation.cs:243
What does "abstain" look like in code?
A status plus a human-readable reason — the value itself is never edited. Validators can only downgrade a field (Ok → Low → Abstain); nothing in the engine can promote a doubtful value back up.
src/Trove.Core/GenericValidation.cs:274
Is a format regex enough to auto-fill from a scan?
No — and on a scan nothing auto-fills at all. Every recognized value (confidence below 1.0) starts as an amber best-guess, shown beside a crop of the source pixels, that the agent must confirm. Checksums and cross-field date rules can still knock a misread down to a blank; nothing can promote it to a silent fill.
src/Trove.Core/TextRecordParser.cs:119
Why is fill a real paste, not UIA SetValue?
SetValue writes the DOM but bypasses framework state — React's value tracker never sees it, and the form posts empty. That was proven against a live React mock, server-side, and the receipt stayed in the test suite. A real paste (focus, Ctrl+A, Ctrl+V) produces the same events a human does.
src/Trove.Forms/FormFiller.cs:140
How are labels found on pages with none?
Geometry. Prefer text on the same row to the left (gap under 260px); otherwise text directly above (gap under 44px); ties go to the smallest gap. That resolves hostile legacy pages with zero accessible names.
src/Trove.Forms/FormReader.cs:115
What if I alt-tab in the middle of a fill?
The run aborts. Between focusing a field and sending the paste chord, Trove re-checks that the target window is still foreground — if focus moved, the rest of the plan is equally unsafe, so nothing more is written and the overlay shows a red "stopped early", never a green done.
src/Trove.Forms/FormFiller.cs:150
How does a correction become permanent?
Remapping a row records (form fingerprint, field signature) → key in a local mappings.json. After three confirmations it's promoted — and a promoted mapping beats every heuristic from then on. It stores field names, never document values.
src/Trove.Forms/MappingStore.cs:11
How is every write verified?
By reading it back. After the paste, the control's value is re-read up to 12 times, 40ms apart. Outcomes are typed — "Pasted" only ever means verified, and a control that offers no readback is reported honestly as "PastedUnverified".
src/Trove.Forms/FormFiller.cs:126
Does the log ever contain document values?
No. The diagnostic log records field keys, counts and outcomes only — the filler's comments are explicit: never log the value — and it truncates itself at 512KB so an unattended machine can't accumulate an unbounded record.
src/Trove/MainWindow.xaml.cs:28
Can clipboard history leak a document?
Staged values are marked with all three Windows opt-out formats — no history, no cloud sync, no monitor processing. Clips already marked sensitive (a password manager's) are never captured at all, and the agent's original clipboard is restored after the fill.
src/Trove/ClipboardSafety.cs:19
How is "zero network calls" provable?
By absence. Search src/ for HttpClient, Socket or WebRequest: zero hits. Extraction is a string parser, managed PdfPig and the in-box OCR engine — nothing in the shipped code can open a connection. The compliance doc publishes the grep as its own reproduction step.
docs/COMPLIANCE.md:42
Could Trove ever click Submit?
There is no code path to a button. The filler exposes no Invoke on anything clickable — the only submit press in the entire repository lives in the test harness, which exists to verify what a human's submit would actually post.
docs/COMPLIANCE.md:9 · tools/Smoke/Program.cs:229
What do the validation tests actually pin?
The refusal machinery: broken routing and EIN checksums abstain, a valid routing number stays review-only, SSN-shaped and Luhn-valid card values are gated even under unknown labels, start-after-end dates abstain together, and derived name and address parts keep their source's provenance.
tests/Trove.Core.Tests/GenericValidationTests.cs:50
Why is reading handwriting correctly a test failure?
Because Trove promises not to read it. The hand-completed tier marks the handwritten fields as must-abstain; if the engine extracts them anyway, the scorer counts it as false confidence — and false confidence must be zero or the build fails.
tools/Score/Program.cs:45
What does the echo server prove?
What actually posted — not what was typed. The end-to-end harness fills a real form window, submits, then checks the server's own record: all 17 fields must arrive exactly as extracted, on all three mock forms, including the React one.
tools/Smoke/Program.cs:233
What runs when code is pushed?
A Windows runner builds the entire solution and runs both test suites — all 453 tests — on every push and pull request. The badge on the README is that check; a run takes about two minutes, and the honest habit is to run it for the exact commit under review before relying on it.
.github/workflows/ci.yml:1
Why is the CI-built installer unsigned?
Because no signing key exists in this repo at all. Every artifact here is unsigned and evaluation-only; the intended path is that the adopting company rebuilds from source and signs with its own certificate — the exe first, then the installer wrapped around it.
.github/workflows/release.yml:1