← back to Lifestyle Asset Intel

ROADMAP.md

122 lines

# ROADMAP — lifestyle-asset-intel

Derived from `BLUEPRINT.md`. Each phase is a concrete next-session task list.
Standing rules from `~/.claude/CLAUDE.md` and Steve's MEMORY apply at every phase.

## v0 — this scaffold (DONE)

- [x] Express + PG skeleton in Steve's canonical pattern
- [x] Canonical schema (10 tables) under `db/migrations/0001_canonical_schema.sql`
- [x] Stub valuation engine returning blueprint-shaped contract
- [x] Console with sort + density + grid-search + dark/light + schema.org
- [x] Smoke tests via `node --test`
- [x] pm2 ecosystem on port 9820
- [x] Gitified from start, author `steve@designerwallcoverings.com`

## v0.1 — domain + email (small, do this first when picking up)

- [ ] Pick a brand domain (TLD defaults to `.com` per Steve's standing rule)
- [ ] Use the **`domain-name-agent`** subagent to:
  - check availability (Verisign WHOIS, not just GoDaddy FAST)
  - register at GoDaddy/Cloudflare/Namecheap/Porkbun
  - create CF zone, swap NS, clean stale records, provision LE SSL
- [ ] Use the **`onboard-domain-agent`** subagent if a public-facing site is desired
- [ ] Provision `info@<domain>` at Purelymail (Steve's hard build-time rule);
  set MX/SPF/DKIM/DMARC. Set `CONTACT_EMAIL=info@<domain>` and `BRAND_DOMAIN=<domain>` in `.env`
- [ ] Update `views/partials/foot.ejs` so the footer renders the live email
  (the current TODO indicator disappears automatically)
- [ ] Add ad-signals tracker entry per Steve's portfolio convention (only if site goes live)

## v0.2 — first source connector: Sotheby's (Tier 1)

- [ ] **Run `/best-practices`** before starting — pre-flight against Steve's standing rules
  (CAN-SPAM, TOS, robots, image source rules)
- [ ] Use the **`browserbase`** skill (Steve's default) for headless work — NOT local
  Playwright/Puppeteer
- [ ] Build `lib/connectors/sothebys.js` — captures closed-lot results into `raw_observations`
- [ ] Build `lib/normalizers/sothebys.js` — maps lot → `transactions` row with
  `gross_transaction_price`, `all_in_buyer_price` (hammer + buyer's premium),
  `expected_net_seller_proceeds`, currency, region
- [ ] Add migration `0002_connector_state.sql` — connector cursor / dedupe table
- [ ] Add launchd job (Mac2 default per Steve's rule, NOT cloud) for hourly polling
- [ ] Replace stub aggregations in `lib/valuation.js` with live comp retrieval

## v0.3 — image-intake stub (CLIP, local)

- [ ] Stand up CLIP embedding service — local model, no API costs
- [ ] Use **Mac Studio 1** (`192.168.1.133:11434`) per Steve's default-Ollama rule
  if any LLM call is involved (e.g., caption generation)
- [ ] Add migration `0003_image_assets.sql` — `image_assets` + `image_embeddings`
- [ ] Wire upload → embed → top-k canonical_assets candidate retrieval
- [ ] Console gets a "Match by photo" entry point

## v0.4 — condition normalization (vision-based)

- [ ] Adopt the `enrich-ai-tags` skill pattern (Gemini vision)
- [ ] Migration `0004_condition_facets.sql` — facet table (corner wear, hardware,
  handle, lining, odor, repairs)
- [ ] Replace seed `condition_facets` jsonb with structured facet rows
- [ ] Recalibrate `condition_grade` ordinal from facets

## v0.5 — confidence model (replaces stub)

- [ ] Train calibrated regressor over comp count, source weight, recency,
  similarity, image-match score
- [ ] Replace `confidence_breakdown` stub jsonb with model output
- [ ] Add MLflow registry; champion/challenger promotion path

## v0.6 — liquidity model

- [ ] Per-config sell-through ratio, time-to-sell, ask-curve depth
- [ ] Migration `0005_liquidity_features.sql`
- [ ] Surface in console + `/api/valuation/:slug.latest_snapshot.liquidity_score`

## v1.0 — enterprise auth gateway

- [ ] OIDC + OAuth + SAML + SCIM (per blueprint)
- [ ] Tenant-aware RBAC, scoped API tokens, immutable audit logs
- [ ] Use **`next-auth-gate`** skill for the console pre-public exposure
- [ ] Use the central `admin.agentabrams.com` SSO if going internal-DW only

## v1.1 — index publisher

- [ ] Indices: `birkin-30-togo-neutral`, `birkin-25-pastels`, `sellier-premium`,
  `recent-stamp-premium`
- [ ] Daily recompute job; weekly frozen snapshots
- [ ] Public benchmark pages (gated behind paid tier)

## v2.0 — category expansion

- [ ] Watches first — Chrono24 connector, ChronoPulse parity (>600k txns since 2019)
- [ ] Sneakers — StockX (new-condition only, sized SKU)
- [ ] Jewelry — auction-house weighted, smaller sample sizes; needs higher
  authenticity-risk threshold and human-in-the-loop on rare lots

## Cross-cutting standing rules (apply at every phase)

- **Default Ollama target = Mac Studio 1** (`http://192.168.1.133:11434`)
- **Default voice = ElevenLabs** (never piper/say/coqui as primary)
- **Default browser = Browserbase** (Playwright/Puppeteer only as fallback)
- **NEVER use the Anthropic API key** — Claude inference via `claude` CLI only
- **No stock images** — public-domain only on any public-facing surface
- **info@<domain>** required at build time; block launch if missing
- **No DNS edits** to `designerwallcoverings.com` or `studentdebtcrisis(center).org`
- **CAN-SPAM / §17529.5 / TCPA / CCPA** review before any outbound email/SMS/push
  via the **`comms-compliance`** subagent
- **Audit batches >10% failure rate** — alert via George
- **Every grid view** must keep sort + density + dark/light + grid-search
- **Gitified** — commit per logical change, never `--force` to main

## Open product question (driver of v0.1+ packaging)

The biggest unresolved decision per the blueprint is which buyer drives the first
paid contract:

1. **Enterprise valuation API + benchmark indices** ← Steve picked this for v0
2. Quote-conversion partnerships (lender/insurer/concierge)
3. Portfolio intelligence (HNW client dashboards)
4. White-labeled consumer UX

v0 wedge is locked to (1). v1.0 packaging will need a re-vote with whichever
prospect is closest to signing.