Soldi · MVP completion & QA · handoff dossier · July 6, 2026

The MVP is nearly there — one deploy, three decisions, two engines.

Pick-up-where-we-left-off dossier for humans and agents. Payments are live and settled, the last open MVP code gap (mobile buyer shell) is implemented and verified locally, live production QA is clean, and what remains is enumerated below with exact next actions. The authoritative beta-release spec — testable "beta-ready" criteria B1–B15, deploy runbook, rollback, tester onboarding — is docs/plans/mvp-build-public-release/BETA_READINESS.md. Master operational note: docs/implementation-notes/platform-completion.md.

01 · Status board

AreaStateEvidence / pointer
Payments (Stripe)LIVE + PROVENP1 GREEN, B7 battery complete — COMPLETION_TRACKER.md; live 409-gate + stripe_live checkout re-proven 2026-07-06. See the Stripe runbook.
Buyer product (Market/Leads/Territories/Pipeline/Billing/Settings)LIVEF4/Q adversarial QA green; 2026-07-06 API battery below; bundle assets/index-CXgZFR3a.js.
Admin/supply (refunds, intake, pricing, funnel)LIVEA1–A3 + C2 live-proven; authz re-verified 2026-07-06 (401/403 correct).
Mobile buyer shellLIVE 07-07Deployed + live-proven: 375px zero-overflow on all five buyer pages, chrome 132.5px, drawer navigates+closes. Shots: artifacts/soldi-completion-2026-07/shots/live-*-20260707.png.
Realtime Wave 3 (DO, live echoes, chat)LIVE 07-07DO migration v1 applied; wss:…/rt/floor 101 + hello history; LIVE ticker + Room presence proven in browser. (Plain GET 404s by design — WS-only routing.)
Sequences send engineIN FLIGHTCodex gpt-5.4 lane building docs/content/SPEC_SEQUENCES.md plan on feat/sequences-send-engine (2026-07-07); PR pending, merge/deploy gated.
Comps live providerIN FLIGHTCodex gpt-5.4 lane building docs/content/SPEC_COMPS.md plan on feat/comps-live-provider (mock stays default until ATTOM/Anthropic keys exist); PR pending, merge/deploy gated.
Seller payouts / ConnectSPEC-ONLYGated on Decision #0 (docs/content/prd/SUPPLY_SIDE.md §3). No money-out rails exist.
Docs truthFIXED 07-06SHARE_WITH_ZAK payments bullet + realtime drift, ROADMAP stale Stripe lines, TESTING_PLAN proof gaps, implementation-notes index corrected; Clerk + /auth/me ADRs in DECISIONS.md; beta spec added (BETA_READINESS.md); Zak Text 2 drafted (gated).
Growth PRDs (Consent Mode v2, offline conversions)BACKLOGSpecced, not MVP blockers — docs/content/prd/.

02 · Payments decision (settled)

Stay Stripe; Clerk Billing rejected. Confirmed by Cam 2026-07-06; research and owner agree independently. ADR: docs/content/DECISIONS.md.

RailFee (US card)Fits Soldi's wallet?
Stripe2.9% + $0.30Yes — amount-only Checkout live today; Connect covers future payouts
Clerk Billing2.9% + $0.30 + 0.7% (Stripe still required underneath)No — Plan-ID subscriptions only, no escrow/payout primitives, would entangle live PBKDF2 auth

Reversal only if Clerk ships a real wallet/payments product (none as of 2026-07). Everything operational — integration map, curl probes, webhook idempotency, test cards, Connect roadmap — lives in the Stripe payments runbook.

03 · Open Cam decisions

Each with exact next action + what it unblocks. Full options/implications/recommendations and safe defaults-if-undecided: docs/plans/mvp-build-public-release/BETA_READINESS.md §5.

P2 — duplicate Stripe test Customer

Next action: delete the pre-PR#123 duplicate for demo@soldi.cc (keep cus_UouKZd8WGskgex; steps: runbook §05) or accept as documented artifact. Unblocks: tracker terminal state + Zak "Text 2". Safe default: accept-as-documented (test mode, zero money risk). Minutes.

minutes
App deploy — DONE 2026-07-07

Cam directed the finish after Zak flagged app.soldi.cc stale; shell + Wave 3 deployed together (worker 9c8b6452), battery + live 375px + realtime proofs green. B6–B12 MET in BETA_READINESS.md.

done
Stripe mode for beta

Next action: ratify staying in test mode for the beta (testers fund wallets with test cards, no real money) vs flipping live keys. Recommendation: stay test mode. Unblocks: honest tester onboarding wording.

ratify
Decision #0 — seller business model

Lead marketplace vs principal/committed-offer (docs/content/prd/SUPPLY_SIDE.md §3). Gates payouts/Connect and seller status promises — not a beta blocker; the documented default (pure-marketplace semantics, no seller promises) holds until decided.

gates payouts
admin@soldi.cc rotation

Next action: rotate the password before beta invites go out (minutes), or disable. Long-lived proof credentials shouldn't survive the beta week.

hygiene

04 · Mobile buyer shell (this session's build)

The last open MVP code gap (open-decisions "Mobile buyer shell"; scoped as a drawer in platform-completion session 20260703-5ff01a1-shell2) is now implemented on main:

  • New app/src/layouts/MobileNav.tsx — at ≤640px a compact current-section button opens a grouped drawer (Market / My Leads / Account / Admin); the disabled Floor pill moves inside the menu, out of first paint. Nav link lists are shared with TopNav so the rails can't drift.
  • TopNav — phone chrome is a single 52px row (brand | section | account); tablet 641–920px keeps the segmented rail; desktop unchanged.
  • ScoreboardBar — the ≤640px wrap-to-rows block becomes one thin scrollable status line (kill-switch first, referral promo last): ~40px vs ~129px.
  • Net: first-viewport chrome at 375px drops from ~264px to ~130px (nav 52 + scoreboard ~40 + ticker 38); the Territories table lands in the first viewport (~518px vs 648px live today).

Proof: sandbox linux verify green — typecheck + 30 files / 245 tests (5 new MobileNav tests) + build (assets/index-CFrs7sov.js); in-repo tsc -b green. Done (2026-07-07): deployed with Realtime Wave 3, live 375px re-proof green on all five buyer pages, drawer interaction verified on production, deck refreshed. Full evidence trail: docs/plans/mvp-build-public-release/BETA_READINESS.md §1 (B6–B12).

05 · Live QA battery — 2026-07-06

Non-destructive curl battery against production, demo account. All 21 probes passed; zero 5xx; responses 0.1–0.3s. Highlights:

CheckResult
Health + bundle/api/v1/health ok; root serves assets/index-CXgZFR3a.js (matches last green build — no drift)
AuthDemo login 200; wrong password 401; /auth/me round-trips
Market / dossier3 demo-inventory rows; dossier contact fields populated (filtering is client-side by design)
Territories persistenceStanding-order bid 17500→18000→17500 round-trip verified, state restored
Pipeline / portfolio24 leads across stages (new 15, contacted 1, offer 4, assigned 2, dead 2); KPIs render
Billing gateWallet $117, held $0; deposit → 409 stripe_checkout_required; /wallet/checkoutstripe_live URL (not visited)
AuthzAdmin endpoints: 403 as demo, 401 unauthenticated; protected APIs 401 unauthenticated
Realtime/api/v1/rt/floor 404 — expected (Wave 3 not deployed)

Informational notes (no fixes needed): unauthenticated /auth/me returns 200 {"user":null} rather than 401 (deliberate SPA bootstrap pattern — ADR recorded 2026-07-06 in docs/content/DECISIONS.md); Market filters are client-side; /user/preferences is PATCH-only.

06 · Remaining engineering

Sequences send engine (ROADMAP slice 7)

Enroll → schedule → cron dispatch (email via the Resend REST API — note: @velli/email-relay is not a repo dependency) → engagement status; triggers off pipeline stage events. Implementation-ready plan (build order, claim-before-send idempotency, rate caps, kill switch, test plan): docs/content/SPEC_SEQUENCES.md §Implementation plan. Schema (migration 0007) + read routes exist; the page stays hidden until the engine works. Needs RESEND_API_KEY as a worker secret (exists in repo .env only).

not built
Comps live provider (ROADMAP slice 5)

ATTOM + Anthropic behind a provider seam over app/worker/comps.ts; cost/latency tracked in D1; fallback-to-mock on any external failure. Implementation-ready plan + test plan: docs/content/SPEC_COMPS.md §Implementation plan. Human prerequisite: procure ATTOM_API_KEY + ANTHROPIC_API_KEY — neither exists anywhere today.

not built

Both are post-beta acceptable: Comps works today on the mock provider and Sequences is hidden. Neither blocks beta testers.

07 · Environment & deploy quirks (read before touching)

  • Host-mounted repo, mac node_modules: never run installs in /workspace/soldi; its node_modules belong to the macOS host. Tests/build fail in-repo (native esbuild/rollup/workerd mismatch) — typecheck is the only in-repo gate.
  • Sandbox-copy verify recipe: copy the repo (minus node_modules/.git) to scratch, bun install there, bun run verify there; port patches back and re-run tsc -b in-repo.
  • Never bun install in sites/fhc-pages (dirties root bun.lock; restore with git checkout -- bun.lock).
  • Live probes: always curl -sL (trailing-slash 307s). Demo: demo@soldi.cc/soldidemo; ?demo=1 auto-login.
  • Deploys: repo root only (bun run deploy:<surface>, shared .env CF token); app deploy needs explicit owner approval and next one applies the Wave 3 DO migration. fhc deploy exit-1 can be benign — verify the upload log.

08 · This week, in order

  1. Cam: P2 duplicate-Customer decision (minutes; runbook §05) → mark P2 GREEN or PARKED_ACCEPTED.
  2. Mac session: 375px screenshot proof of the new mobile shell → owner-approved deploy:app (brings mobile shell + Realtime Wave 3 live together) → post-deploy battery + live 375px re-proof → deck/walkthrough refresh. Full runbook: BETA_READINESS.md §2.
  3. Cam: rotate admin@soldi.cc password before invites; ratify test-mode-for-beta.
  4. Cam: send Zak "Text 2" (drafted, marked DO-NOT-SEND, in SHARE_WITH_ZAK.md) once 1–2 are done; invite beta testers with the onboarding brief (BETA_READINESS.md §4).
  5. Cam: Decision #0 seller business model → unlocks payout/Connect spec work (not a beta blocker).
  6. Eng (post-beta): Sequences engine, then Comps live provider — both specs now implementation-ready (§06).
Companion artifact: Stripe payments runbook — integration map, operating procedures, test recipes, P2 steps, Connect roadmap.