RECORDGOD
Go to file
type-two fce64c72d3 fix(cache): build_disc_cache wrote NULL artists it did not have to
The builder read release.artists_sort alone, which is NULL for roughly 9.1M of
the 10.4M releases in this dump, and cached that NULL. Not merely a blank column:
recordgod's admin inventory list runs its artist SEARCH and SORT on dc.artist
too, so an affected record becomes unfindable by artist name. Genre, style, label
and country all looked fine on the same row because those read disc_release_*;
the artist is the one catalog field where this cache is the only source.

Seen on release 447087 - cached as title "Mezcal", artist NULL, showing a dash in
the admin list, while Discogs plainly says Urban D.K.

The name was never missing. release_artist has it regardless of artists_sort, so
fall back to that. extra=0 is the RELEASE artist: extra=1 rows are credits, and
447087 also lists Carl Clarke and Jim Eliot as Producers, so folding those in
would be worse than the blank. Comma-joined rather than reconstructing Discogs
join_strings, since this only fires where artists_sort is already NULL.

Verified against the mirror: 447087 to Urban D.K. and 564101 to Idjut Boys are
recovered, while 3018249 (Skirt (7)) and 314753 (Dahlback & Dahlback) still come
from artists_sort unchanged. No credits leak in.

This mattered urgently because the builder TRUNCATEs disc_cache and rebuilds, so
the next run would have silently undone the prod backfill of those two rows.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 13:50:04 +10:00
.claude feat(builder): storefront customizer 2026-06-21 21:29:55 +10:00
app feat(storegod_v1): ping returns name+role (parity with STOREGOD) 2026-07-07 22:23:29 +10:00
docs docs: DIG_FLIP_HANDOVER — port THRIFTGOD's evolved crate-riffle into /store 2026-07-02 22:52:26 +10:00
monsterrobot.party-Coverage-2026-07-06 refactor: wowplatter_v1 → storegod_v1; mount /storegod/v1 canonical + /wowplatter/v1 legacy alias 2026-07-07 21:50:46 +10:00
site feat(shop): DECKS — two-channel preview mixer on release pages (Serato internal-mode vibe) 2026-07-06 22:57:47 +10:00
webstore fix(virtual): cyclorama extent for east/west coves + never frustum-cull the cove 2026-07-02 23:07:28 +10:00
wp-bridge feat(bridge): RecordGod WP bridge plugin (WowPlatter successor) + thumb on browse/release 2026-06-24 01:43:30 +10:00
.dockerignore security(pii): keep customer SQL dumps out of git and the Docker image 2026-07-05 02:04:45 +10:00
.DS_Store refactor: wowplatter_v1 → storegod_v1; mount /storegod/v1 canonical + /wowplatter/v1 legacy alias 2026-07-07 21:50:46 +10:00
.gitignore feat(shop): DECKS — two-channel preview mixer on release pages (Serato internal-mode vibe) 2026-07-06 22:57:47 +10:00
audio_sync.py feat(shop): per-track Apple previews (lazy iTunes) + jog mini-player + dead-YouTube check 2026-06-23 23:44:17 +10:00
build_disc_cache.py fix(cache): build_disc_cache wrote NULL artists it did not have to 2026-08-22 13:50:04 +10:00
customer_woo_sync.py feat(app): payments/packs/discogs-mp/dealgod modules + admin, shop, sales route work 2026-07-02 23:07:28 +10:00
disc_images_backfill.py feat(inventory): CRUD backend (add/edit/delete/bulk) — first cream from the WowPlatter audit; + migration audit doc 2026-06-22 22:39:17 +10:00
disc_sync.py feat(app): payments/packs/discogs-mp/dealgod modules + admin, shop, sales route work 2026-07-02 23:07:28 +10:00
Dockerfile feat: deploy-ready — env-aware Discogs enrichment + Dockerfile 2026-06-21 13:08:49 +10:00
migrate_virtual.py feat(virtual): lift the 3D store out of WordPress — scene API + raw Three.js renderer 2026-06-19 17:59:52 +10:00
migrate.py feat(pos): full Sales console + migrate customers/discounts/settings 2026-06-22 02:40:35 +10:00
README.md docs: point the PLATFORM.md link at ../dealgod/PLATFORM.md (now version-controlled) 2026-07-08 14:03:37 +10:00
refresh.sh feat: Woo customer sync (non-destructive, in refresh.sh) + AusPost rates mirror & quote calc 2026-06-24 00:55:56 +10:00
requirements-migrate.txt feat: RecordGod founding — service scaffold + MariaDB→Postgres migration 2026-06-19 17:18:50 +10:00
requirements.txt feat(distro): Inertia xlsx ingest + cost/new-used/margin in inventory editor 2026-06-27 11:39:39 +10:00
REVIEW_BRIEF.md refactor: wowplatter_v1 → storegod_v1; mount /storegod/v1 canonical + /wowplatter/v1 legacy alias 2026-07-07 21:50:46 +10:00
schema.sql feat(pos): full Sales console + migrate customers/discounts/settings 2026-06-22 02:40:35 +10:00
shipping_sync.py feat(shipping): use current AusPost own-packaging rates (RecordGod not live pre-1-Jul, no dating needed) 2026-06-24 01:05:12 +10:00
test_dealgod_supply.py feat(app): payments/packs/discogs-mp/dealgod modules + admin, shop, sales route work 2026-07-02 23:07:28 +10:00
test_smoke.py feat: RecordGod founding — service scaffold + MariaDB→Postgres migration 2026-06-19 17:18:50 +10:00
test_startup_ddl.py feat(app): payments/packs/discogs-mp/dealgod modules + admin, shop, sales route work 2026-07-02 23:07:28 +10:00

RecordGod

The records vertical — Discogs-native intake, canon/lore enrichment, storefront, 3D vinyl, and the store-side API that PriceGod codes against. Records is the first and biggest module of StoreGod, not a standalone product.

Architecture is canonical in PLATFORM.md. If this README disagrees with that file, that file wins. Read it first for the three surfaces (dealgod.pro dashboard / store admin / storegod.pro marketing) and the three keys.


⚠️ Status — this repo is the origin, not the live code

RecordGod started life here as its own Postgres-native back-office app (a strangler replacing the old WordPress plugin). It has since been migrated into StoreGod as a plugin. The live shop robotmonster.party/admin runs the StoreGod storegod-new image, and the records code it executes is ../STOREGOD/plugins/recordgod/ — not this repo.

  • Canonical / live code: ../STOREGOD/plugins/recordgod/ (mounted by core.packs when the store's STOREGOD_MODULES includes records). That tree is newer and is what deploys.
  • This repo: the originating standalone app + the full docs/history vault. Recent commits here are kept in parity with the StoreGod plugin (e.g. the storegod_v1 rename), but new feature work lands in StoreGod. Treat this as legacy/reference — verify against the plugin before trusting anything here as current.

If you are doing store-app work, work in ../STOREGOD. This repo is for archaeology, the docs in docs/, and the data/migration scripts at the root.


The name change

"WowPlatter" is dead. It was the WordPress founder and the original API namespace. The name is retired in favour of StoreGod. The API is now /storegod/v1 (canonical) with /wowplatter/v1 kept only as a legacy alias for old PriceGod installs — remove once nothing hits it. See app/storegod_v1.py.

Where RecordGod sits in the platform

  • DealGod is the brain (value / identify / lore / supply / ScanGod) and the account+billing home. RecordGod is a client of it — the store server holds a StoreGod connect key (minted in the dealgod.pro STOREGOD tab) and calls DealGod's /api/* server-side. See app/dealgod.py.
  • StoreGod is the store software a merchant runs. RecordGod is a module inside it, not a separate service.
  • Management moved. A store is provisioned and its connect key minted in the dealgod.pro STOREGOD tab — there is no separate storegod.pro admin panel. storegod.pro is a marketing site only.
  • PriceGod (the Discogs seller extension) is the main API consumer. Staff laptops carry a staff rg_… token (handed out via the one-paste SG1. connect code), authenticate to the store, and the store proxies value to DealGod. No DealGod key ever touches the floor.

The store contract (/storegod/v1)

The seam PriceGod codes against (app/storegod_v1.py, require_token in app/auth.py):

Route Purpose
GET /ping connection test + identity chip (store, plan, name, role)
GET /inventory/lookup?release_id= / ?barcode= "do WE have this?" — the daily driver
POST /inventory/intake new-stock intake → enrich from the discogs_full mirror → stage locally; carries est_market_value (the DealGod target from the PriceGod overlay)

release_id (Discogs release id) is the universal join key. Intake stages non-destructively (UPSERT on SKU); live/Woo stays authoritative for sale-state (see docs/RECORDGOD_PLAN.md §6).

What's in this repo

app/            FastAPI app (main.py) — admin, shop, intake, sales, layout, payments (Square),
                storegod_v1 contract, dealgod client, 3D virtual store
schema.sql      inventory / virtual-store / sales tables, release_id-keyed, store_id seam
migrate*.py     one-shot MariaDB(clone)→Postgres migrators
disc_sync.py, customer_woo_sync.py, shipping_sync.py, audio_sync.py, refresh.sh
                data pipelines (Discogs disc art, Woo customer/shipping sync, previews)
docs/           the planning vault — RECORDGOD_PLAN.md (charter), WOWPLATTER_*_AUDIT/DEEPDIVE,
                DIG_FLIP_HANDOVER, NAVIGATOR/STOREFRONT/AI_AGENT plans, SCANGOD bridge briefs

Run it (dev)

python3 -m venv .venv && ./.venv/bin/pip install -r requirements.txt
RECORDGOD_TOKEN=dev-tok ./.venv/bin/uvicorn app.main:app --reload --port 8010
./.venv/bin/python test_smoke.py    # infra-free self-check
psql recordgod < schema.sql         # Postgres schema

DB is recordgod-db on the VPS. Deploy of the live store is a StoreGod baked-image rebuild (../STOREGOD, bash deploy.sh), not a deploy of this repo — see PLATFORM.md § Hosting.

Start here