tatmapper-app

TatMapper release-readiness ledger

Updated: 2026-08-01

Shipping direction: free Planar Photo Mapping Beta

Public-store status: NOT READY

This is the source of truth. Build success, repository polish, or a screenshot does not equal Play/App Store acceptance or physical dimensional validation.

Calibration-suite stacked PR

Draft PR #110 (feat/print-calibration-suite) is stacked on draft PR #108. It adds persistent appearance, TM-CAL-1, Print Path Profiles, four-corner planar rectification, coin/custom/manual fallbacks, and corrected export metadata.

Local compatibility analysis and focused tests pass at commit 54400a9, and the calibration PDFs passed mathematical and 96/300 DPI visual inspection. Authoritative hosted checks are BLOCKED before execution by the GitHub account’s failed-payment/spending-limit state. Physical printer, stencil, camera, coin, iOS, and final-ruler evidence remains NOT TESTED. PR #110 must not be described as green or ready.

Executive result

The former blank-canvas → dual-photo → “flatten” product path was not a defensible mapping system. The beta now uses one registered coordinate system: capture/import a photo, calibrate two points in that image, trace over it, place a PNG in image coordinates, and export physical PDF geometry from stored px/mm.

The app describes this honestly as planar. It does not model a curved surface.

Current matrix

Area Current evidence Status
Stabilization PR #101 Final head 80f5731; all required CI jobs green; merged as f4eb683 Verified and merged
Planar schema/calibration v2 model, source-image points, validation, round-trip tests Verified in feature CI
Photo workflow bounded off-isolate normalization, atomic project-owned copy, explicit camera state machine Verified in automated tests; device QA pending
Trace photo-backed separate strokes, finger/stylus pointer input, undo/redo Implemented; device gesture QA pending
PNG design import/normalize, drag, scale, rotation, persistence, transparent sample Verified in tests/renders; device QA pending
PDF physical layout, vector strokes, PNG transform, ruler/instructions, oversize refusal Implemented; physical print pending
Monetization/privacy ads, IAP, ATT, paywall, trial, Sentry removed; local-first startup Verified by source/dependency/manifest gates
Android API 36 APK/AAB green; AAB validated; exact APK clean-installed/started on x86_64 Not Play-ready
iOS Xcode 26 no-sign build green; privacy manifest included Not TestFlight-ready
Public assets generated sample inputs, six reproducible product renders, animated walkthrough, demo script Implemented; final store screenshots pending
Project lifecycle per-project JSON/media directory, safe replacement/deletion, startup temp cleanup Verified in deterministic storage tests
Save ordering serialized, debounced coordinator with flush/retry/error state Verified with slow/failing stores
First-party license Bradley C. Peter confirmed as 2025–2026 proprietary holder in issue #109 Verified; repository remains private
Third-party notices Noto Sans OFL, dependency inventory, in-app license viewer, owner-recorded logo provenance Verified

Pre-device hardening

The current planar branch no longer writes one SharedPreferences blob while leaving copied media behind. Each resumable project owns a private projects/<project-id>/ directory containing recoverable JSON and imported media. Replacements commit the new file and project state before deleting an old TatMapper-owned file. Full deletion removes the project directory, while canonical containment checks refuse external paths. Bundled samples use asset paths and create no project directory.

ProjectSaveCoordinator permits one store write at a time, coalesces rapid changes, flushes on close/lifecycle transitions, and keeps the workflow open when persistence fails. The artist can retry, explicitly discard, or remain on the current screen.

Image ingestion caps input at 32 MiB and 24 million source pixels, rejects damaged/unsupported/extreme-aspect inputs, requires at least 256 pixels per dimension, bakes EXIF orientation, and limits the normalized working image to 4096 pixels on its longest side without upscaling. Decode, resize, and encode run outside the UI isolate; the verified result is atomically renamed into the project directory. Design PNG pixels, including white and near-white artwork, are preserved.

The disconnected dual-photo, OpenCV/body-patch, native FFI, old session, settings, paywall/trial/ad, stylus prototype, and web compatibility source was removed from the shipping tree. Git history remains the archive. A direct dependency and generated-plugin allowlist prevents those surfaces from returning silently.

Issue #109 records Bradley C. Peter as the 2025–2026 proprietary copyright holder and the creator/owner of the current TatMapper logo. The canonical license and third-party notice now reflect that decision, the old MIT and conflicting commercial files remain removed, and both dedicated license gates pass at PR #108 head 64f09bd. The repository remains private; no merge, production signing, store upload, or public source distribution is authorized.

Verified stabilization evidence

PR #101 final head passed:

Runs: 29833677602, 29833677847, and 29833677536. The detailed baseline, bundletool inspection, emulator startup, and limitations are in evidence/release-readiness/2026-07-21/stabilization.md.

Verified planar-beta evidence

Product head eb21257 passed Flutter CI run 29854728917 and Release Readiness run 29854728975:

Bundletool 1.18.3 validated the exact AAB and reported package com.tatmapper.app, version 2.0.0 (versionCode 3), min SDK 24, target SDK 36, and armeabi-v7a, arm64-v8a, and x86_64 native libraries. The manifest contains camera plus Android’s app-scoped dynamic-receiver permission; no Internet, broad storage, audio, billing, ad-ID, or AdMob permission/metadata is present.

The exact CI APK was clean-installed on the API 36 Pixel_7a x86_64 AVD. Package metadata matched the values above, the TatMapper process remained alive, and filtered logcat contained no TatMapper fatal exception, ANR, or E/flutter. am start -W timed out because the emulator system image never set sys.boot_completed; this is recorded as an environment limitation and not as a complete UI-flow pass.

Artifact checksums and command-level evidence are in evidence/release-readiness/2026-07-21/planar-beta.md.

Planar product acceptance

Registration and persistence

Calibration and export

UI/accessibility

Privacy and monetization acceptance

Android gates

iOS gates

Owner/physical blockers

Owner authority or hardware is required for:

No secrets or user photos belong in source control.

Definition of release ready

TatMapper is release ready only when the applicable boxes above have linked evidence, signed builds install through the stores’ test channels, the primary flow passes on representative real hardware, and the 100 mm printed fixture meets a written tolerance. Until then, status language is verified, failed, not tested, or blocked—never “should work” or “mostly ready.”