Skip to content

Pokémon French raw-card valuations use TCGgo's first Cardmarket Near Mint French price, lowest_near_mint_FR. The product owner explicitly selected this floor for V1. Card detail, condition ladders and collection valuation share the same observation; averages, global lows and EU-only lows are not substituted. Other condition factors remain estimates and the native frontend labels their provenance.

The implementation builds on the latest provider-neutral Redis branch. TCGgo batches up to 20 exact Cardmarket product IDs, bounds queue/request time, honours rate-limit backoff and shares atomic rolling budgets across API replicas and workers. Memory and the existing private Redis cache retain PostgreSQL as a fallback. Provider-neutral durable snapshots preserve a 72-hour observation age and invalidate changed printing bindings without invalidating unrelated daily catalogue guide updates. The Basic plan defaults are 90 calls per rolling 24 hours and 25 per rolling minute; background refresh has a ten-call allowance within the same total. RapidAPI remaining/reset headers retain a ten-call safety margin until the actual billing reset. Cached collection reads never enqueue French raw refresh jobs. Visible owned cards plus one adjacent row refresh lazily, with 120-ms viewport coalescing, shared live promises, one-minute missing-price throttling and preservation of newer fresh values. Background/unmount clears visible publishers. The existing PostgreSQL watch queue refreshes only Pokémon watches requested in the last 15 minutes through the API image; no BullMQ dependency is added. ReefAPI remains an explicit opt-in fallback.

The current scope is Pokémon only. Reverse and optional holo printings without explicit provider coverage remain unavailable. No card-number/name mapping guesses or One Piece import work are included.

Validation on Node 22.23.2: API unit suite 1,025 passed; ingest suite 528 passed; API integration suites 50 passed and 11 skipped for absent full scan indexes/fixtures; native Jest suite 2,240 passed and 11 skipped. Backend/test TypeScript, frontend TypeScript and ESLint passed. Fixture integration exercised real PostgreSQL and Redis, durable readers, queue leases, concurrent daily/minute/background quota exhaustion, actual upstream reset windows, viewport bounds, client deduplication, stale/mapping rejection and cache outages. A live Pokémon smoke test with the supplied test key returned an exact mapped FR/NM price. The final scan integration run used the existing local tessdata cache after the default OCR CDN returned 404; assertions and thresholds were unchanged.

All current GitHub backend checks passed, including the full compose build and API smoke. The Python dependency conflicts were repaired: embeddings use NumPy 1.26.4 and compatible OpenCV 4.10.0.84 for Ultralytics 8.2.60; vision uses Python 3.12 for its existing NumPy 2.5.3 requirement. Fourteen Python tests and a NumPy/PyTorch/OpenCV/FAISS runtime smoke passed.

Scan/detail lookups have a separate lane with a 3-second provider deadline and a 3.5-second whole-route bound. The native client prefetches after confirmed recognition, shares its NM cache/in-flight request with card detail and bounds the request to 4.5 seconds. Collections/background stop at 70 of the shared ninety-call budget, reserving twenty for scan/detail. Explorer and unowned catalogue grids read stored prices without spending upstream calls.

Android emulator and arm64 phone release APKs were built. Maestro on Snag_Motion validated navigation, gallery import and scan confirmation, the visible 0.30 EUR FR/NM price with TCGgo provenance, owned-grid scrolling and background/foreground recovery. The smoke flow's obsolete attempt to open Profile from Tools was corrected to use the Collection avatar; assertions were retained. EAS macOS builds and App Store Connect submission now provide the signed iOS release. Build 1.0.2 (32) was accepted into internal TestFlight; the catalogue fix is delivered by build 1.0.2 (33).

Backend f7598af was deployed to the VPS on 2026-10-03 after an 87 MB private database backup, configuration/image/script backups and a successful canary. Migration 0035, immutable API/ingest images, server-side pricing settings and the valuation worker were installed. Existing Redis and scan sidecars remain healthy on their private networks. The original checkout was preserved. A cold TCGgo quote took 199 ms; memory reuse took 4 ms; a freshly started API replica served the same quote from Redis in 8 ms with an observed cache hit and no provider call; public HTTPS cache response took 106 ms. The historical API remains stopped for rollback. Operational source, configuration and rollback instructions are stored in /home/shams/snag-releases/tcggo-f7598af/ on the VPS.

The supplied test key stays in ignored local/server environments and private runtime files. No secret was committed. Current budgets are ninety calls per rolling day, twenty-five per rolling minute, ten background calls within the same total and twenty reserved for scan/detail, with a further ten-call safety margin from upstream headers. Five TCGgo calls covered the deployment checks and native validation so far, including one newly visible owned-card batch. Scrolling the 258-card Scarlet/Violet catalogue set left the provider count unchanged at five. The last response reported 89 upstream requests remaining. Historical ReefAPI storage remains available; rollback reverts images and worker together without flushing Redis or restoring the whole database.

Catalogue loading and return navigation ​

Frontend issue #593 covers slow series loading across Explorer. The API returned the complete 120-card Nuit Noire catalogue in 145–296 ms; the mobile grid mounted every card, downloaded full artwork and discarded catalogue state on each return. Existing low-resolution artwork totals 2.09 MB instead of 7.97 MB for this set (74% less); immutable image caching already works on the VPS.

Frontend runtime commit 7f5fc86 fixes every series through the shared set screen: a twenty-set repository cache shares pending requests, returns fresh data for ten minutes and retains stale data for at most one day during revalidation/errors. Virtual three-column rows load thumbnails, preserve search/filters/scroll position and keep high-resolution images for details. Fixed row geometry allows native restoration beyond the initially rendered rows. Stored-price requests follow visible cards plus one neighbouring row; explicit price sorting retains access to all stored quotes. Marketplace labels retain Cardmarket/eBay; technical TCGgo attribution remains a legal-material follow-up.

Full frontend ESLint and TypeScript passed, with 2,240 Jest tests passed and eleven skipped, including the pre-push gate. Android emulator and arm64 phone release APKs were rebuilt from the final runtime. Native checks verify return to Airmure without a loading screen, unchanged scroll position, detail/back navigation and absence of TCGgo in card sources. A separate native search found card 258 in the 258-card Scarlet/Violet set, validating the second API page. API logs recorded one Nuit Noire catalogue request across both openings and zero live price requests for its Explorer grid. Physical iPhone validation remains outstanding.

The existing VPS backend deployment f7598af remains compatible; readiness returns {"ok":true} and private Redis responds PONG. These catalogue changes ship in the mobile binary and do not require an API or marketing-site replacement.

EAS iOS build 1.0.2 (33) compiled runtime 7f5fc86; Apple submission completed successfully. App Store Connect reports build 33 as VALID / IN_BETA_TESTING for internal testers; external distribution remains READY_FOR_BETA_SUBMISSION.