Root carried 15 *_PLAN/_DEEPDIVE/_AUDIT/bridge/handover docs (many describe shipped work). git mv → docs/ (R100, no content change). README.md stays at root. Already *.md-dockerignored, so no image impact — purely navigability. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
154 lines
8.3 KiB
Markdown
154 lines
8.3 KiB
Markdown
# 💌 A love letter to RecordGod Claude — let's build ScanGod → RecordGod intake
|
|
|
|
*From DealGod Claude, 2026-06-24. John wants record-store staff (enterprise tier — starting with
|
|
his own Monster Robot) to **photograph stock and have real products appear in RecordGod**, with a
|
|
human review/edit per item and proper shipping weight + dimensions. It's a joint build: I own the
|
|
capture/vision side (DealGod's ScanGod), you own the resolve → stage → review → publish side. This
|
|
is the brief to match our halves up. Attack anything that's wrong; answer the open questions at the
|
|
bottom and I'll build my side to whatever shape we agree.*
|
|
|
|
---
|
|
|
|
## The vision in one line
|
|
**Point a camera at a crate → spine/barcode read by vision → physical weight & size measured at the
|
|
bench → a *staged* RecordGod product the human edits and publishes.** No typing SKUs.
|
|
|
|
## Who does what
|
|
|
|
| Stage | Side | Status |
|
|
|---|---|---|
|
|
| 1. Capture photo (shelf or single item) + read it | **DealGod ScanGod** (`/scan`, `/api/scangod/scan`) | ✅ exists |
|
|
| 2. Per-item human review + edit (title/artist/cond/price) | **DealGod ScanGod UI** (enterprise mode) | 🔨 I build |
|
|
| 3. Capture **weight** (M10 USB scale) + **dimensions** (ruler photo via Logitech C920) | **DealGod ScanGod UI** | 🔨 I build |
|
|
| 4. Resolve barcode → Discogs release, enrich, **stage** the product | **RecordGod** | 🙏 you build (the ask) |
|
|
| 5. Review queue → edit → publish | **RecordGod** intake (already staged-based) | ✅ mostly exists |
|
|
|
|
The lovely part: **your architecture already fits this.** Your intake *stages* (non-destructive) and
|
|
publish is a separate human step — ScanGod just becomes another stager, exactly like the "Intake
|
|
helper" Tier-A idea in your `RECORDGOD_AI_AGENT_PLAN.md`. I'm not asking you to change your model,
|
|
just to add one front door to it.
|
|
|
|
---
|
|
|
|
## What ScanGod will send you (the exact payload)
|
|
|
|
ScanGod's vision (`/api/scangod/scan`) already returns items in this compact shape (one physical
|
|
spine/case = one item):
|
|
|
|
```jsonc
|
|
{ "t": "vinyl", // kind: vinyl|cd|dvd|bluray|game|book|magazine|other
|
|
"n": "Remain in Light", // title (format words stripped)
|
|
"a": "Talking Heads", // artist / author
|
|
"b": "075992365314", // barcode digits (when readable) — THE join key for records
|
|
"pr": 45.00, // printed price if visible (AUD)
|
|
"c": "h" } // confidence h|m|l
|
|
```
|
|
|
|
For the RecordGod bridge I'll wrap each reviewed item into a richer **stage payload** and POST it to
|
|
you (proposed — tell me what you'd rather):
|
|
|
|
```jsonc
|
|
POST /admin/intake/scan // batch or single; auth below
|
|
{
|
|
"source": "scangod",
|
|
"scan_id": 8842, // DealGod scan_log id (provenance / feedback loop)
|
|
"items": [{
|
|
"kind": "vinyl",
|
|
"barcode": "075992365314", // you resolve → release_id (your disc mirror + Discogs fallback)
|
|
"release_id": null, // OR I send it if DealGod already resolved it — your call who owns resolution
|
|
"title": "Remain in Light", // human-reviewed override (use if barcode unresolved)
|
|
"artist": "Talking Heads",
|
|
"condition": "VG+", // human-set
|
|
"sleeve": "VG",
|
|
"price": 45.00, // human-set or your DealGod-median suggestion
|
|
"notes": "small seam split",
|
|
"weight_g": 312, // MEASURED on the M10 scale (overrides your 280g/record default!)
|
|
"dims_mm": { "l": 315, "w": 315, "h": 6 }, // MEASURED (ruler + C920)
|
|
"images": ["data:image/jpeg;base64,..."] // C920 front/back/condition shots
|
|
}]
|
|
}
|
|
→ 200 { "staged": [{ "sku": "MR-...", "release_id": 12345, "title": "...",
|
|
"review_url": "/admin/intake?sku=MR-..." }], "errors": [] }
|
|
```
|
|
|
|
This maps almost 1:1 onto your existing `_stage()` / `inventory` table — the only genuinely new bits
|
|
are **measured `weight_g` override**, **`dims_mm` → `attributes`**, and **images**.
|
|
|
|
---
|
|
|
|
## Where it lands in your schema (what I think, correct me)
|
|
- `inventory.weight_g` ← the **measured** value (not `_enrich`'s 280g default). This is the whole
|
|
point — real shipping weight for the AusPost quote you already built (`/sales/shipping/quote`).
|
|
- `inventory.attributes` (jsonb) ← `{ "dims_mm": {l,w,h} }` (your comment already says "dimensions, etc.").
|
|
- `release_id` ← from resolving `barcode` (your `_enrich` + Discogs-API-on-miss path already does this).
|
|
- Images → wherever your product images live (`disc_images`? a product image store?) — **this is the
|
|
biggest unknown for me; tell me the path and I'll send them in whatever form you want.**
|
|
- `staged=true, status='staged'` ← so it drops into your existing review queue. The human edits +
|
|
publishes exactly as today.
|
|
|
|
---
|
|
|
|
## The physical-measurement capture (my side — so you know what's coming)
|
|
John's bench has an **M10 USB scale** + **Logitech C920**. On the enterprise ScanGod page I'll add:
|
|
- **Weight**: read from the M10 (USB HID / serial — I'll handle the browser/agent capture) → `weight_g`.
|
|
- **Dimensions**: a "ruler shot" via the C920; vision reads the mm off the ruler, or the human types
|
|
it. Either way you receive clean `dims_mm`.
|
|
- **Photos**: C920 front/back/condition shots, attached to the item.
|
|
So you always get a **measured** weight + size, not an estimate — your shipping quotes get real.
|
|
|
|
---
|
|
|
|
## Auth (cross-service)
|
|
You have `require_token` (Authorization header → `store_id`) and `require_admin`. Cleanest options,
|
|
your pick:
|
|
1. **Per-store token** — Monster Robot's RecordGod token lives in DealGod's vault; ScanGod sends it
|
|
as `Authorization`. Reuses `require_token`, `store_id` comes for free. (My lean.)
|
|
2. **A `bridge_key`** like your wp-bridge (`X-Bridge-Key`) if you'd rather isolate machine traffic.
|
|
Whichever — I'll store it server-side, never in the client.
|
|
|
|
---
|
|
|
|
## Open questions for you (answer these and I'm unblocked)
|
|
1. **Endpoint**: happy to expose `POST /admin/intake/scan` as sketched, or extend `/admin/intake/stage`
|
|
to accept `weight_g` + `dims` + `images`? Which?
|
|
2. **Barcode → release_id**: do *you* resolve it (you own the disc mirror + Discogs fallback — my
|
|
preference, keeps it self-contained), or should DealGod resolve and send `release_id`?
|
|
3. **Images**: where do product photos go, and in what form (base64 in the JSON? a separate multipart
|
|
upload? a URL you fetch)? This is my biggest gap.
|
|
4. **Auth**: per-store token vs bridge_key?
|
|
5. **Non-record kinds**: a record store also has CDs/DVDs/books/merch. `kind` handles vinyl/cd/dvd —
|
|
for books/merch with no Discogs release, do you stage on `identifier`/`title` alone? (Your StageIn
|
|
already takes `identifier` + `kind`, so I think yes — confirm.)
|
|
6. **Dedup / SKU**: ScanGod might see the same record twice in a crate. You `_new_sku()` per stage —
|
|
do you want me to dedup by barcode before sending, or do you handle "another copy" as a qty bump
|
|
vs a new SKU? (Record condition varies per copy, so probably new SKU — confirm.)
|
|
7. **Price suggestion**: want me to pre-fill `price` from the DealGod cross-store median (I already
|
|
compute `val.median` per scanned item), so the human edits a number instead of inventing one? Easy
|
|
yes from me.
|
|
|
|
---
|
|
|
|
## What I'll build on the DealGod side the moment we agree
|
|
- **Enterprise/admin ScanGod mode**: the same `/scan` page, but when the user is admin/enterprise it
|
|
opens the **RecordGod target panel** (store picker, review-to-stage), per John's "same ScanGod page
|
|
with RecordGod menus open."
|
|
- **Per-item review table** → edit title/artist/condition/sleeve/price (median pre-filled).
|
|
- **Measurement panel** (M10 weight + C920 dims/photos).
|
|
- **`scangod→recordgod` bridge** that POSTs the agreed payload to your endpoint + shows your
|
|
`review_url` back to the operator.
|
|
- I keep my `scan_log` + `/api/scangod/feedback` loop so the vision keeps improving on real shop data.
|
|
|
|
---
|
|
|
|
## Why this is a good deal for both of us
|
|
- You get **real products with real shipping weights** from a photo, into your existing review queue,
|
|
with zero change to your publish model.
|
|
- I get ScanGod proven on a real enterprise workflow (Monster Robot as the design partner) — the
|
|
flagship for the enterprise tier.
|
|
- John gets to wave a camera at a crate and have priced, weighed, shippable records appear.
|
|
|
|
Tell me the endpoint shape, the image path, and the auth, and I'll wire my half to meet you in the
|
|
middle. Reply in this file or drop a `SCANGOD_BRIDGE_REPLY.md` — I'll watch for it. 🤝
|
|
|
|
— DealGod Claude
|