Appearance
Project checkpoint and component links, 6 November 2026
This documents beta-2026-11-06, before the proposed invitation-free V1. It is a source recovery checkpoint, not a public-beta announcement, production certification or database backup. Detailed French map.
Immutable repository inventory
Fourteen populated repositories have the same tag and prerelease. agent-sandbox is empty. main remains the target for snag-data and snag-gitops. The shared manifest records exact commits. This page is subsequent to the snapshot; never move the tag to include it.
| Repository | Role | Branch | Commit |
|---|---|---|---|
| snag-data | Collect, normalize, match, publish catalogue/prices | main | d16bfe972818e9f110fca7cb43bdc5470c88a0a2 |
| agent-workflows | Shared engineering workflows | staging | b3b4903a8996a8ecb1fc100ad1dcde55aa06abcd |
| design | Design handoff, themes, Penpot | staging | cb7bf188fa2dd5ca1e6e797a9478705fbb218953 |
| admin-frontend | Staff console, authorized SQL, catalogue/media | staging | 1f8803de98b13df94b2b7dad160205fd2ad9c9a2 |
| snag-gitops | Kubernetes, image overlays, ArgoCD | main | 3692d654a49b06ef5ca0573fcec4d524f084d0de |
| tcg-collector-backend | API, identity, catalogue, pricing, collection, scan | staging | ea4580781516cc7c370ac94aefef7d9b71f53d9b |
| documentation | VitePress guides and change tracking | staging | 5bc276b82d77c14450c4628168c5e235135201ff |
| poc-tcg-collector | Mobile React Native / Expo | staging | 42189afcba12923df4e0d1966f0827dfbb0de717 |
| tg-bridge-ts | TypeScript bridge tooling | staging | cbcc46487f88909553f7458aa16823a09ac92a33 |
| tg-bridge-py | Python bridge tooling | staging | 694b813b73b7b87cb338b11ae52ab5ceed315010 |
| snag-landing | Public landing site | staging | fbf8247fe0a765cf445a019334be9e280af953d7 |
| test | Test repository; runtime not audited | staging | 17c6f0271026bfeed28875cc463345f03c2f42fd |
| routines | Auxiliary automations; runtime not audited | staging | e5eb124c2a8877e95056038ff8d4f8ec19fa62de |
| tg-bridge-go | Go bridge tooling | staging | 11a1bbe7c04e208553725bddfd0fccde2a92e8ce |
Connections and responsibilities
| Component | Connections and boundary |
|---|---|
| React Native / Expo mobile | Shared HTTPS /api; UI, navigation, caches and secure session transport |
| Fastify API | PostgreSQL identity/catalogue/collection, Redis prices, recognition services, validated catalogue media |
| OAuth | Backend announces providers, starts/exchanges/verifies flows; HTTPS provider callback differs from app return link |
| Admin | Staff authorization; controlled PostgreSQL functions, S3, scan test service, public reference API, GitHub and monitoring |
| snag-data | Sources -> bronze/raw -> silver -> gold -> explicit database/media publication |
| GitOps | GitHub tests/build -> registry image -> overlay commit -> ArgoCD |
| Docker production | Still observed separately; full Kubernetes migration is not established |
| EAS / Apple | Native builds and store distribution, not GitHub release creation |
| Documentation | VitePress and historical tracking; dated guides are not live-state proof |
The backend owns business rules. Client caches and interface state remain necessary; this policy does not claim every legacy client rule was already migrated.
Identity and admission
GET /api/auth/beta/status controls entry. POST /api/auth/beta/validate neither reserves nor consumes a code. Authentication and permanent account admission are separate. Beta signup follows invitation then email/Apple; direct beta email signup avoids the initial mailbox code, not recovery proofs. Returning admitted accounts regain access after reinstall by signing in again.
isBeta grants unlimited scans, but team unlimited rights need not imply isBeta. Distribution email metadata must not be confused with Apple identity binding. A 4 November observation found recipient columns missing from the live invitation table; that schema was not reaudited today.
OAuth secrets stay server-side; Apple/Google accounts do not automatically acquire a Snag password. Classic email login remains. Provider callbacks are /auth/oauth/google/callback (GET) and /auth/oauth/apple/callback (POST), separately routed from ordinary /api calls. Configured origins and exact provider return URIs belong in the protected operator inventory.
Sources: backend gate, mobile gate, invitation operations, OAuth.
Scan, collection and catalogue
The pinned mobile URL table contains /scan-lab (default), /scan, /scan-frame and /scan-sealed-lab. Historical compat/tormknd modes are not resolvable for normal captures. Route availability does not imply every mode is shown in every build.
Photo capture/preparation precedes backend identification. Returned candidates supply identity and metadata; collection writes require authentication. Bulk is pending work until confirmed. Multiple purchases of one product may have different costs; visual grouping must preserve those acquisitions. Purchase cost and market value are distinct.
Stable catalogue IDs connect scan, prices, collection and assets. Printed card numbers alone cannot identify One Piece variants. Sealed historical names/tags and source paths are preserved alongside backend labels/subtitles based on family templates and exceptions; reserved ambiguous Mini Tins are not silently renamed.
Account deletion is distinct from cache clearing or software rollback.
Media and valuation
S3/bronze upload, silver/gold processing, catalogue association and public serving are separate steps. Each needs verification. The One Piece Promos block uses fruit P; its series uses the PROMOS banner. They have different sizing/theme assets. A tagged correction does not prove every iPhone runs that build.
Redis caching remains. Client caches are server-data copies, not pricing authority. Image/price loading states differ; missing prices are not zero and pending requests are not confirmed unavailable quotes. Scroll retention does not promise unlimited memory or a fully offline catalogue. Portfolio 24h variation requires historical coverage across relevant positions; source code alone does not establish that coverage.
Sources: media route, price cache, data inventory.
Admin and publishing
The console is not merely a client of all private mobile API routes. Several features use authorized SQL directly; others use S3, the scan test service or public reference API. Staff permissions remain separate.
The data pipeline preserves provenance and expert decisions while collecting, normalizing, matching and publishing. Data PR #19 adds card text; #20 adds experimental enhancement benchmarking. Merging these did not execute gold publication or authorize replacement of catalogue artwork.
Admin data · Admin security · Data pipeline.
CI and distribution
Merged PRs: admin #124, GitOps #21, data #19/#20, design #3, agent-workflows #1. The data documentation conflict retained both sections. Combined data checks passed Ruff and 919 tests, 7 skipped, repeated after resolution. Admin CI tests passed. Design Python/JavaScript syntax passed without executing Penpot.
Image builds were blocked by missing rootlesskit on the runner. Actual workflow files at the tag override historical CI prose: backend/admin release triggers no longer include pushes to main; staging remains. Data builds from main and targets its staging overlay. Merges may trigger existing automation; no manual deployment was performed for the tags.
EAS profiles cover simulator, development, preview, production and apk. A GitHub release neither builds EAS nor submits/installs TestFlight. CI design.
Read-only runtime observations
On 6 November:
- Anonymous /api/auth/beta/status: 200, required=true, admitted=false.
- /api/auth/oauth/providers: 200, apple only; not a successful end-to-end login test.
- Anonymous /api/health: 401; not proof of an API outage.
- Docker API image skns-api:beta-0542cea running; admin snag-catalogue-admin:open-beta-0084aff healthy.
- PostgreSQL, Redis, vision and three embedding services present with healthy reported checks.
- Nginx, Caddy, Grafana, Loki and Alloy present.
- Private admin gateway unhealthy; no restart or deeper diagnosis in this task.
- Separate development services must not be mistaken for production.
Tagged source and deployed images differ. Image names do not establish immutable digests. Kubernetes runtime, backups, digests and current TestFlight versions were not audited. No secrets, personal data or private deployment paths are included.
Recovery
Choose whether restoring tagged source or a previously deployed image. Preserve local work and back up affected data/configuration before risky operations.
git fetch origin tag beta-2026-11-06
git switch --detach beta-2026-11-06
For corrective development:
git switch -c restore/beta-2026-11-06 beta-2026-11-06
Never move published tags or force-reset shared branches. Verify schema compatibility, applied migrations, external assets and API/mobile contracts. Rebuild/deploy through the approved process and retain the old image. Test email/Apple login, refresh, catalogue, images, prices, collection and gate status with a dedicated test account. Record SHA, digest, mobile build, date and checks.
Git does not restore databases, credentials, external assets or distributed binaries. Do not reverse migrations or delete collections blindly.
Proposed V1 and historical caveats
Invitation-free V1 is proposed, not implemented here. Documented retirement uses BETA_GATE_ENABLED=false and an approved API recreation, then checks required=false and email/Apple signup. Preserve admissions/additive schema. Quotas and unlimited entitlements remain a separate decision.
Older architecture, scan fan-out and OAuth guides describe historical implementation stages. Follow pinned source plus dated observations. Source presence, merge, build, deployment and device verification are different states. Old catalogue counts and naming blockage totals are not reaffirmed.