spec(§2): solution proposal — carry forward prototype shape, invert seed/gate, defer GraphQL+OAuth
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -237,7 +237,61 @@ Scenario: BUC-5a — Bring-up is rehearsable
|
||||
|
||||
## 2. Solution Proposal
|
||||
|
||||
<!-- §2 pending -->
|
||||
**Build the first vertical slice of the ecomm web application** — a
|
||||
multi-tenant modular monolith that carries forward the prototype's *proven*
|
||||
shape and inverts its *disqualifying* assumption:
|
||||
|
||||
- **Carry forward** (validated by R01–R07 of the prototype): a four-layer
|
||||
Python backend (`entrypoint → api → domains → platform`) with the layer
|
||||
contract mechanically enforced; SQLite (WAL) with forward-only numbered
|
||||
migrations and no ORM; a React/Vite SPA admin talking to a screen-shaped
|
||||
REST BFF; scenario-bound end-to-end tests (one test per BDD scenario ID);
|
||||
OHM concepts cited inline next to the rules they ground.
|
||||
- **Invert** (the prototype's bootstrap was the wrong way round for a real
|
||||
product): **no seeded tenant and no admission gate.** The prototype was born
|
||||
with one hard-coded store and one invited owner; ecomm is born *empty*.
|
||||
Identity is open sign-up via **email + one-time code** (passwordless;
|
||||
corpus 14.01.0003–0004), the storefront is created *through the product* by
|
||||
its merchant, and an empty database is a first-class, fully working state —
|
||||
which is precisely what makes BUC-5's bootstrap story true by construction
|
||||
rather than by tooling.
|
||||
- **Defer** (YAGNI for four screens): the prototype's second API surface
|
||||
(GraphQL) is not built in this MVP; the layering keeps the seam so it can be
|
||||
added later as a projection over the same domain core. Google/Apple OAuth
|
||||
and sign-in-by-emailed-link (corpus 14.01.0005–0007) are deferred the same
|
||||
way — the email-canonical identity rule (14.01.0010) keeps them addable
|
||||
without account migration.
|
||||
|
||||
**Why this approach** over the alternatives:
|
||||
|
||||
- *Do nothing / concierge* (hand-create merchants on request): fails BUC-5
|
||||
outright (every merchant is hand-seeded state) and validates nothing — the
|
||||
prototype already validated the need; the open question is productionizing.
|
||||
- *Re-architect on a heavier stack* (Postgres, separate services, SSR
|
||||
framework): buys scale and rendering properties the MVP measurably does not
|
||||
need, at the cost of slower iteration and a bigger bootstrap surface —
|
||||
directly against the "launching anywhere is routine" outcome (§1.6). The
|
||||
single-VM flotilla deployment standard (handbook §8) favors the lighter
|
||||
stack; revisit at real scale (§6.7, §7.4).
|
||||
- *Resume the prototype codebase*: it bakes in the seeded-tenant and
|
||||
invite-gate assumptions at the foundation, and the rebuild exists precisely
|
||||
to lay clean foundations. Its *patterns* are kept; its code is reference
|
||||
only.
|
||||
|
||||
**Solution-specific scope:** the landing page, sign-up/log-in (email +
|
||||
one-time code), create-storefront (both entry points: post-sign-up and
|
||||
returning-without-storefront), the empty admin shell, sign-out, and the
|
||||
bring-up story for localhost/PPE/Prod including real email delivery in
|
||||
deployed environments.
|
||||
|
||||
**Solution-specific non-goals (this release):** GraphQL surface; OAuth
|
||||
providers and magic-link completion; the onboarding questionnaire and POS
|
||||
opt-in from the corpus first-run flow (14.01.0017–0024) — the merchant lands
|
||||
directly on their admin; storefront rename/settings (14.01.0025 makes naming
|
||||
optional at creation; *changing* it later is the Settings Feature's job);
|
||||
account-lifecycle polish beyond what passwordless entry gives for free
|
||||
(password reset does not exist because passwords do not exist; the one-time
|
||||
code *is* email verification; account deletion is deferred and logged in §9).
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user