# SESSION-0006.0 — User-flow BDD: first-run experience (new flows/ domain) **Date:** 2026-05-31 **Driver:** Ben Stull + Claude (Opus 4.8) **Repos touched:** wiggleverse-ecomm-meta (corpus + session record) > **Honesty note on this artifact.** This is a *session record* authored by > the assistant from the conversation — faithful as to decisions, sequence, > and wrong turns, but **not** the raw byte-for-byte transcript. --- ## Purpose Extend the Shopify research corpus with a new kind of artifact: **end-to-end user-flow journeys** that cross domains, as distinct from the existing per-feature docs (which are each backgrounded with "authenticated as a Store Owner"). Ben narrated the experience verbally so we could skip the live login/OTC dance. First flow: the **first-run experience** (onboarding from landing page to admin). ## What happened, in order 1. **Oriented in the corpus.** Confirmed structure: 1135 scenarios, 13 domains, 62 feature files under `research/shopify/`, with stable `DD.FF.NNNN-slug` ids assigned by `assign_ids.py` (sibling app repo `tools/`), registry at `.id-registry.json`, ingested by the BDD release planner. 2. **Two structural decisions locked (via AskUserQuestion):** - **Home for flows** → a new `flows/` folder as its own corpus domain. Verified the id assigner allocates domain numbers as `max+1`, so `flows` becomes **domain 14** with no renumbering of the 1135 frozen ids. - **Format** → each flow is a `# Feature:` with a `Background:`, `###` groupings, and one `Scenario:` per step/branch (raw Gherkin in markdown, matching the dominant clean shape like `orders/orders.md`). 3. **Read the id machinery before writing** (`assign_ids.py`, `pre-commit` hook) to confirm the append-only behavior and that un-id'd scenarios get ids assigned + blocked at commit for review. 4. **Ben narrated the first-run experience.** Key content and the deliberate divergences from Shopify (see Decisions). Asides: marketing site / branding declared out of scope; migration ("Move existing store") explicitly to be BDD, **not** a roadmap item. 5. **Wrote `research/shopify/flows/first-run-experience.md`** — 27 scenarios across 7 phases (entry point, sign-up & auth, store selection, "what can we help you do?" goals, POS, store naming, landing in admin). Each Shopify divergence written as its own explicit scenario. 6. **Validated then assigned ids.** `--dry-run` first (parsed clean, confirmed domain 14 / feature 01), then a real run froze `14.01.0001`–`14.01.0027`. Registry + `scenarios.json` regenerated; corpus **1135 → 1162**. 7. **Committed in two passes.** `a93fe3c` (corpus: the flow + registry + manifest), then `27722a9` (sessions transcripts). Both pushed to `origin/main`. 8. **WRONG TURN — clobbered an existing transcript.** When committing "session transcripts," I overwrote the existing `SESSION-0004.0` (the content / online-store record) with this session's notes instead of creating a new file. Caught it immediately after the push, restored the original 0004 from the version I had Read into context, and moved this session's record to its correct slot, `SESSION-0006.0` (this file). Lesson: never reuse an existing session filename — always allocate the next free number. ## Decisions citable later - **`flows/` is corpus domain 14.** A new top-level category for cross-domain user-flow journeys, separate from per-feature docs. Append-only numbering means it sorts last numerically even though "flows" is alphabetically mid-list — by design; existing ids never move. - **Flow scenarios describe OUR target behavior, not a Shopify mirror.** Every intentional divergence is its own explicit, testable scenario. Divergences captured in first-run: no time-limited trial / no SaaS fee; no credit card at store creation; no plan tiers (just the platform); auth limited to email-OTC + Google + Apple (no Facebook); all auth methods resolve to one account by email; free POS (no subscription, free app downloads). - **Migration is BDD, not roadmap.** Ben corrected an initial impulse to add migration to the roadmap. "Move existing store" → its own future feature `flows/migration.md` (`14.02`), narrated later. - **Account identity is keyed to resolved primary email.** The auth mechanism (email/Google/Apple) is an implementation detail; same email → same single account. Captured as `14.01.0010`. ## Open / carried forward - **Migration flow** — Ben will narrate "Move existing store" later; build as `flows/migration.md` = `14.02.NNNN`. - **Default store name** — pin `14.01.0026` to the literal `"My store"` vs. keep generic? Left generic for now. - **Goal selection** — single-select vs. multi-select for `14.01.0017`–`0021`? Modeled as pick-one-or-skip for now. - **Marketing site / branding / "Why we built Shopify"** — Ben flagged for a future discussion; out of scope this session. ## Addendum — release plan landed After the session record was first written, `roadmap/RELEASE-PLAN.md` appeared in the tree (a proposed seed clustering of the corpus into session-sized releases, generated from `scenarios.json` and hand-tunable in the planner). Committed it alongside this transcript update. Notes for continuity: - **26 MVP-path releases** (R01–R26 enumerated) across milestones M0–M5; **MVP finish line = R22** (POS sale & cash drawer). Ordering is anchored to the first two merchants — Hasan (catalog + in-person POS) and Connie (catalog online + storefront). Spine: store exists → catalog → sell online → orders → sell in person. 358 of 1162 scenarios are clustered into the MVP path; the rest sit in themed BACKLOG / GATED sections. - **Our new first-run flow is parked in BACKLOG · Flows / first-run** (`14.01`, 27 scenarios, "onboarding automation", ~2 releases) — not on the MVP path. - **GATED section** keeps the ecosystem-credit / "Load & Reward" differentiator, gift cards, and finance/float features out of any buildable release: hard legal gate (money transmission), needs the OHM concept→operational RFCs and a payments attorney first. R14 (payments) is deliberately scoped to provider config + manual + test mode only, to stay clear of that line. - **Parser contract** is documented inline in the file header: a release = a `## R · ` heading; members = backticked full scenario ids under `### scenarios (N)`; `## BACKLOG ·` / `## GATED ·` carry no ids and must not be built. ## Addendum — git auth incident + SSH standardization Pushing the release-plan commit, the HTTPS push to gitea failed: "Failed to authenticate user", then "could not read Username … Device not configured". Root cause: the macOS keychain entry for `git.wiggleverse.org` (which had worked for earlier pushes this session) had dropped out, and a non-interactive agent shell can't answer git's username/password prompt. No token was present in the environment either. **Resolution — switched to SSH.** Ben's `git.wiggleverse.org` SSH key ("Mac Mini") authenticates fine. Pushed `ecomm-meta` over an explicit SSH URL, confirmed remote `main` = `074fcd4`, and synced the local tracking ref. **Then standardized the whole fleet on SSH** (Ben's call — the older wiggleverse repos were already SSH; the ecomm + rfc repos had drifted to HTTPS): - Flipped all **6 ecomm** repos and the **3 rfc/ohm** stragglers (`rfc-app`, `rfc-app-prototype`, `ohm-rfc-app-flotilla`) from HTTPS → SSH. Canonical shape: `ssh://git@git.wiggleverse.org:2222//.git` (note port **2222**). Namespaces preserved exactly (`ben.stull/` stays `ben.stull/`); stripped an embedded `ben.stull@` userinfo from the prototype URL. Each verified via `ls-remote`. Final sweep: **zero HTTPS origins remain** under `~/projects`. - **Carve-out left intact:** deploy VMs (e.g. the planner's ingest pull) keep their own HTTPS bot-token credential-helper — that's deployment state, not a developer clone. Only local working copies were flipped. **Documented it in the engineering guide** (`wiggleverse/engineering`, README/§5), following that repo's own branch→PR rule, two commits each on their own branch then merged to `main` and pushed over SSH: - §5.2 "Transport: SSH, always" — canonical URL shape, the explicit `:2222`, the convert-from-HTTPS one-liner, namespace-preservation rule, the *why* (HTTPS keychain token silently expires → non-interactive push fails), and the deploy-VM carve-out. - Sub-section anchors + nested TOC: promoted the bold lead-ins in §3/§5/§6/§7/§8 to numbered `### N.M` headings (matching §10's existing pattern) and nested every sub-section in the table of contents. All 34 TOC anchors verified to resolve. (Field-label bolds in §9/§11 — When:/Topology:/… — left as-is; they're definition labels, not sub-sections.) **LESSON:** local clones use SSH, never HTTPS — the HTTPS keychain credential is brittle and a dropped credential is unrecoverable from a non-interactive session. ## Open / carried forward (session close) - **Migration flow** — `flows/migration.md` (`14.02`), Ben narrates later. - **Default store name** (`14.01.0026`) — literal `"My store"` vs. generic? (generic for now) - **Goal selection** (`14.01.0017`–`0021`) — single vs. multi-select? (pick-one-or-skip for now) - **Marketing site / branding / "Why we built Shopify"** — future discussion. - **HTTPS keychain credential for `git.wiggleverse.org` is gone** — SSH is the path now; only matters if some HTTPS-reliant script surfaces. *Session 6 closed here.*