rdmsm4x-changelog-20260922-2313-scanroo-native-scanner
Replaced the rejected custom iPhone scanner with Apple's public document camera, preserved native corrected page quality, and installed build 2026092204 on rdip17air.
Scope and decision
- Host: rdmsm4x. Product: ScanRoo, Prototype. Ticket: ISSUE-20260922-14.
- Writer: codex@rdmsm4x/01a04089. Worktree:
/Users/richh/dev/_handoff/scanroo-camera-first-20260922. - Branch:
codex/scanroo-native-capture-20260922. Commit:49c5c660ed062b1a4de2c005f7436a3e62c0b5e3. - DEC-SCANROO-20260922-01 chooses
VNDocumentCameraViewControllerrather than an inaccurate homegrown rectangle overlay. Full-screen camera opens on supported hardware; Save/Cancel returns to recent scans and Library/Import access. - Apple's corrected output is normalized upright without downsampling and stored losslessly. No secondary crop, grayscale or illumination processing. Detail now prefers verified full-resolution assets instead of the 640-pixel thumbnail.
- No bundle/container identity change, stored schema migration, scan deletion, new network service, App Store release or paid dependency.
Exact source files
All paths below are relative to the worktree above:
AGENTS.mdApps/Mobile/DocumentCameraView.swiftApps/Mobile/RScanMobileApp.swiftApps/Mobile/VisionKitCaptureAdapter.swiftPackages/ScanRooKit/Sources/RScanCaptureSupport/CaptureAdapter.swiftPackages/ScanRooKit/Sources/RScanUI/ScanDetailView.swiftPackages/ScanRooKit/Sources/RScanUI/ScanIngestionService.swiftPackages/ScanRooKit/Tests/RScanUITests/ScanIngestionServiceTests.swiftSESSION-STATE.mdScanRoo.xcodeproj/project.pbxprojScanRoo.xcodeproj/xcshareddata/xcschemes/RScanMobileCaptureTests.xcschemeTests/MobileCaptureTests/NativeDocumentCameraTests.swiftdocs/history/2026-09-22-native-scanner-review.mdproject.yml
Additional durable metadata:
/Users/richh/dev/PROJECTS.md;
/Users/richh/Library/Mobile Documents/com~apple~CloudDocs/Codex/projects/AGENTS.md principles/PROJECTS.md;
/Users/richh/.agent-coordination/checkins/codex-scanroo-camera-first-20260922.json;
ticket comment and fleet bus request
20260922-231248-5F688DCD. This archive and an identically
titled Note belong to host folder rdmsm4x.
Commands and independently reproducible evidence
swift test --package-path Packages/ScanRooKit --parallel: 271 tests passed.- Native preservation regression initially failed 18 assertions (2000x2800 became 1143x1600 and JPEG); fixed. Detail selection regression initially failed 3 assertions; fixed. These are synthetic pixel-preservation tests, not camera-accuracy measurements.
xcodebuild -project ScanRoo.xcodeproj -scheme RScanMobileCaptureTests -destination 'platform=iOS Simulator,id=72B1907C-4A4B-4A80-BBEB-B96098789C0A' CODE_SIGNING_ALLOWED=NO test: 7 UIKit/delegate tests passed, final rerun 23:10 EDT.xcodebuildRScanMobile Debug: signed generic iOS build and unsigned generic iOS Simulator build passed.xcodebuildRScanMac Debug withARCHS='arm64 x86_64' ONLY_ACTIVE_ARCH=NO CODE_SIGNING_ALLOWED=NO: passed;lipo -archsconfirmed both slices.codesign --verify --deep --stricton the iPhone artifact: passed. Existing Apple Development identity retained.xcrun devicectl device install appinstalled build 2026092204 on rdip17air.device info apps --bundle-id app.scanroo.ScanRooindependently reported 0.1.0 / 2026092204. Final launch failed because phone is locked. rdip18p and rdip17p installs also encountered locked devices.git diff --checkpassed; explicit-path staged commit is clean in the handoff worktree.- One Luna/high read-only reviewer; budget advice proceed. No agy invocation or additional fanout. Reviewed race at permission completion fixed before final builds.
All build/test/device evidence and preserved artifacts are under
/Users/richh/dev/_handoff/scanroo-iphone-test-20260922/:
native-* logs/JSON, NativeCameraDerivedData,
NativeCameraTests, NativeCameraSimulator,
NativeCameraMac.
Integration and remaining acceptance
Canonical main was independently clean at 7b111cf; per
the current external-worker isolation rule, canonical integration was
requested from Claude on the internal bus. Dispatch is not acceptance or
completion. Do not claim a main merge until it is independently
observed.
Physical camera quality and parity with Apple Notes are not yet measured. The source report contains a same-phone comparison matrix for paper, long receipts, mock checks, skew/shadows, multi-page capture and saved output. Rich must open the app directly on the physical phone; Mirroring is not a camera-quality test.
Known limits recorded honestly: pending save retry is memory-only; pre-existing partial ingestion on individual disk-write failure and mixed-page OCR mapping need further hardening; zoom/review polish is not part of this baseline. No existing scans were removed.
Preservation and undo
Base 7b111cfedda65f0976b6ba00fa798074209c19f4 and custom
scanner source remain in Git. Previous build artifacts remain under the
evidence directory; no cleanup performed. Source rollback is a reviewed
git revert 49c5c660ed062b1a4de2c005f7436a3e62c0b5e3 by the
integration owner, never a reset of shared work. Device rollback can
reinstall the retained prior signed test app without uninstalling or
erasing the app's data container.
Outstanding owner action is physical capture validation/unlock only; code integration is assigned internally, not handed to Rich as a coding task.
Notes persistence independently verified at 23:16 EDT in folder
rdmsm4x, exact title above, Note ID
5CD3A136-3169-42BD-98F6-D9AE6A8C3B89. Clipboard delivery
reported a timeout but the full body and title were read back
successfully; no duplicate note was created. The ticket's source-writer
lease was released, leaving the physical acceptance gate open.