rdmsm4x — RDReceipt: OCR deadlines, full-corpus run, publication, session continuity
2026-08-31 12:45 → 21:48 EDT on rdmsm4x. Claude
Code, Opus 5. Continues the 12:44 changelog.
One line: RDReceipt gained a hard OCR timeout, was
run over its whole 3,353-file corpus for the first time with zero
failures, got its first page on dev.ecs0.net (removing a
false verified claim that had been published for a week), and was
registered and made resumable under the new
SESSION_CONTINUITY standard.
Scope
One project: ~/dev/apps/RDReceipt, worked in its
worktree
.claude/worktrees/rdreceipt-chat-thread-setup-a94cd2. Fleet
files touched: ~/dev/PROJECTS.md,
~/dev/data/products.json (+ status-updates/),
~/dev/data/project-docs/RDReceipt.json,
~/dev/fleet/ops/resume/*-rdreceipt*, and one new
LaunchAgent. No other host touched.
What changed
| File | Change |
|---|---|
Apps/ReceiptRoo/Shared/Engine/ReceiptReader.swift |
per-page (60 s) and per-file (180 s) OCR deadlines;
timedOutPageCount; -partial engine suffix |
Apps/ReceiptRoo/Shared/Engine/IngestEngine.swift |
counts timed-out pages; engine switch made
prefix-matched so a -partial read is not filed as
"hybrid" |
Apps/ReceiptRoo/Tools/check_fixtures/FixtureCheck.swift |
now runs both fixture files, routed by version key |
CORPUS-RUN.md (new) |
the 3,353-file run, led by what the numbers are not |
STATUS.md, ISSUES.md,
SESSION-STATE.md, CLAUDE.md |
items 7, 8, 11 closed; state rewritten to the six-question standard |
~/dev/data/project-docs/RDReceipt.json (new) |
source for the published page; 17 features with boundaries |
~/dev/fleet/ops/resume/{PINNED-SESSION-rdreceipt,resume_rdreceipt_on_login.zsh}
(new) |
auto-resume for this session |
~/Library/LaunchAgents/com.eastcoastscience.claude-resume-rdreceipt.plist
(new) |
loads it at GUI login |
Evidence
- Corpus run: 3,353 files in ~17 min, zero
read failures, zero OCR deadline hits. 1,037 distinct after
content-hash dedup — 2,316 files (69.1%) are exact
duplicates. Of 868 distinct PDFs, 25.7% needed no
OCR, which finally sources the "26% of PDFs" figure
that had lived only in
products.jsonwith no stated sample. - OCR deadline proven both ways: forced at 1 ms →
vision-ocr-partial, no fabricated fields; non-overshoot re-verified at load average 24 → zero field differences vs the pre-deadline run. - Fixtures: 16 cases across 2 files, all pass; both branches made to fail against doctored expectations first.
- Build:
xcodebuild -scheme ReceiptRoo-macOS→** BUILD SUCCEEDED **. - Page live:
curl -H 'Host: dev.ecs0.net' http://127.0.0.1:8788/projects/rdreceipt.html→ 200, zero external references. Checkeddocker inspect ecs0-dev-wiki-1first to confirm which docroot is actually mounted —gen_site.pywrites a different tree. - Resume agent: three paths verified — normal,
qualifier-disabled (recovers, logs
GLOB QUALIFIER FAILED), stale pin (stops, says so differently).
Corrections made to previously published claims
products.jsonpublished "installed on both iPhones" as tested-with-evidence. It is false — the app has never been built for a device. Removed; both dashboards now state the negative.- The product entry was renamed
ReceiptRoo→RDReceipt(slugrdreceipt). - Two of my own claims about a peer's script were retracted after measurement; see below.
Backups / how to undo
Nothing deleted. ~/dev/data/products.json backed up
beside itself (.bak-20260831-*). The superseded dashboard
page was moved, not deleted:
~/dataroo.net/wiki/p/receiptroo.html →
~/dataroo.net/wiki/archive/superseded-20260831/. All code
is on work/expense-export-and-parser-bakeoff at
87de52e, pushed to the private remote. Disable auto-resume
with
launchctl unload -w ~/Library/LaunchAgents/com.eastcoastscience.claude-resume-rdreceipt.plist.
Traps worth carrying off this project
- A timeout measures the machine, not the file. A 20 s OCR deadline truncated a healthy page at load average 24. Verify a bound under the load that will actually exist.
- A guard that inherits the option it depends on is not a guard. Proven by running from a shell with the option switched off, not by reasoning.
- A recovery path the failure prevents you from reaching is not a recovery path. zsh aborts on an unmatched qualified glob; the fallback never ran until the glob was contained in a subshell.
- Logged where nobody reads it is not the same as caught.
- A fill rate is not an accuracy rate. 42 of 42 confidently-classified non-receipts still got a merchant.
- Retracted after measurement: an
unrecognized modifiererror I attributed to a peer's script line —launchd.err.log(15:47:22) predates the file itself (15:47:44), so it came from a version that no longer exists.
Outstanding owner actions
DEC-20260831-05— may receipt contents leave the machine via the planned MCP server?DEC-20260831-02— off-host backup of the 1.5 GB corpus (code is already on a private remote).- Merge to
mainis still blocked — the primary checkout holds another session's uncommitteddataroo→ecs0rename in the same two files, unchanged for 46h. - Concur field recon remains blocked at the sign-in wall.
No secrets are recorded here. Work registered as
FEAT-20260831-02; resumable state is that repo's
SESSION-STATE.md.