User Flow Map — gskillpacks.com Deck Creation

Confirmed alignment page for /user-flow-map. Flow structure only: screens, routes, actions, decisions, branches, states, failure paths, handoffs, and wireframe-level notes. No visual styling, no animation mechanics, no implementation plan.

alignment_status: confirmed prototype tier Updated — confirmed 2026-06-10
generated: 2026-06-10 (review)
confirmed: 2026-06-10
skill: user-flow-map v0.0 (product-design pack)
product path: skills-showcase (active in research/.progress.yaml)
confirmed artifacts: specs/skills-showcase/user-flow-deck-creation.md · specs/skills-showcase/user-flow-deck-creation-interview.md
approval source: final compiled YAML, 12/12 gates answered, section_feedback: [], no needs-clarification, no requested edits (verbatim record in §14)
prior review page: archived at docs/history/archive/2026-06-10/192601/alignment/user-flow-map-deck-creation.html
upstream: apps/skills-showcase/docs/deck-builder-ux.md (locked UX decisions) · docs/decks.md · animation plan Amendment 2 (routed the phase-slot question here)
downstream: /ui-interview --requirements-only deck-creation (requires /pack install ui-interview)
This page is finished and current for the completed alignment cycle. It remains amendable: later research may change or extend these conclusions only by archiving this confirmed page first and highlighting the amendment against the preserved approval record.

1. Context & Evidence

/user-flow-map was invoked to map the full deck-creation flow on gskillpacks.com — landing on the table through deck completion and CLI unlock, covering preset (canonical) decks, customization (swap/overlay), and custom decks — and to pressure-test whether phase-labeled slots mirroring the canonical card list make building feel like a chore versus user-defined phases. That second question was explicitly routed here by Amendment 2 of the animation design plan.

amended 2026-06-10 Scope resolved to the active product path skills-showcase. Research evidence: research/skills-showcase/idea-brief.md. Gap: customer discovery and positioning have not run yet (manifest next_skill: /customer-discovery), so persona assumptions come from the idea brief, not validated research. The flow map carries this as a standing risk.

Evidence behind load-bearing decisions

Claim / decisionEvidence (observed)InferenceConfidence
Entry is deck-first; site is one canvas with real URLs; add gesture is tap-to-add; slots are phase-labeledapps/skills-showcase/docs/deck-builder-ux.md — four decisions marked "Decided with user 2026-06-10"The flow map composes these locked decisions into a full flow rather than re-deciding themHigh
Five preset decks: VARD, ORD, Business AFPS, Devtool AFPS, Game AFPS; graduation VARD→Business AFPS, ORD→Devtool AFPSdocs/decks.md domain × tempo grid and graduation pathsPreset deck inventory and graduation arrows are fixed inputs to the flowHigh
Deck completion produces npx skillpacks install-deck <slug>; modified decks need an explicit pack listdocs/skillpacks-npm-distribution.md — CLI maps deck slug → pack list via manifestSystem decision D3 (canonical-intact check) is structural, not cosmeticHigh
The phase-slot chore concern came from demo review, with choice valves already in the locked UXAnimation plan Amendment 2 (alignment/animation-design-planner-deck-builder-transitions.html): demo's 1:1 card-to-slot mapping "reads as building a deck is a chore with no choices"The pressure-test must answer chore-vs-structure for preset decks, not re-litigate animationHigh
User direction for this flow: preset decks with default phases, modifiable as neededTerminal interview answer, 2026-06-10 (recorded verbatim in §2)Resolution in §3 keeps default phase slots on presets and concentrates user-defined phases in custom decksHigh (user-stated)
No deck routes exist today; deck-builder is greenfield page structureapps/skills-showcase/app/ has /, /workflows, /packs, /catalog, /benchmarks, /inspect, /follow, /prototype; no /deck/* or /card/*The flow map defines target structure, archiving old pages per the idea briefHigh (repo-observed)
Generated site data contains zero deck definitionspublic/assets/skills-data.js via scripts/generate-skills-showcase-data.mjs — no deck shapesDeck data pipeline is a dependency for implementation; flagged in §11, out of flow-map scopeHigh (repo-observed)
Persistence is localStorage per deck slug; packs reseal per session; no accountsdeck-builder-ux.md state & persistence sectionResume, share, and failure paths must work without server stateHigh

Gate: evidence coverage Updated — confirmed 2026-06-10

Is this evidence base sufficient for a flow map, accepting the recorded gap that ICP/positioning have not run yet?

Answered: Sufficient — proceed on idea-brief personas

Recorded from final compiled YAML · status: answered · 2026-06-10

2. Flow Assumptions Record

Confirmed in the terminal interview on 2026-06-10 ("Confirmed as-is"). The slot-model direction was answered verbatim: "we have preset decks which users can modify as needed with default phases." Mobile branch notes were explicitly included.

#AssumptionSource
1Primary persona: developer evaluating GSkillPacks who wants to assemble a workflow deck[from research]
2Secondary persona: existing user configuring a new repo fast[from research]
3First success = copyable npx skillpacks install-deck … or project.json download[from artifact]
4Primary entry: / table — 5 preset blueprints + pack shelf, deck-first[from artifact — locked]
5Hard-load entries: /deck/[slug], /card/[id], shared /deck/custom?c=…[from artifact]
6Returning visitor: localStorage restores deck progress; packs reseal per session[from artifact]
7Redirects: /catalog/, /packs/[from artifact]
8Happy path: table → blueprint morph → builder → ghost-slot tap → pack glow → tear → fan → tap-to-add / add-all → card flight → last core slot fills → stack-flip → CLI unlock → copy[from artifact]
9Preset decks ship with default phases; users modify as needed (swap/remove/overlay); modification produces a custom variant with explicit-pack-list CLI output[user answer + artifact]
10[Custom deck +] = from-scratch building; user-defined phases live here[from artifact]
11Overlay row (code-review, gitops, …) is additive and never blocks unlock[from artifact]
12Shelf-first browsing is inspect-only; "add to deck" prompts deck choice[from artifact]
13Graduation arrows: VARD→Business AFPS, ORD→Devtool AFPS[from artifact]
14User decisions: deck choice, accept vs swap, overlays, name, share. System decisions: one-liner vs explicit pack-list CLI; unlock gated on core slots only[from artifact]
15Designed states: fresh table, partial ("🔒 N more to unlock"), complete, custom-converted, in-flight (optimistic commit, snap-to-end), restored session[from artifact]
16Not yet designed (added in this flow map): data-load failure, corrupt share URL / localStorage, clipboard failure, empty custom deck[inferred]
17Handoffs: web→terminal (copy CLI), web→repo (project.json), share URL; no accounts or server state[from artifact]
18Animation mechanics locked — flow work only decides slot targets; styling & CLI internals out of scope[from artifact]
19Mobile: wireframe-level branch notes included[user answer]

Gate: assumptions record Updated — confirmed 2026-06-10

Does this record accurately capture the confirmed assumptions, including the verbatim slot-model direction?

Answered: Accurate — carry into the spec

Recorded from final compiled YAML · status: answered · 2026-06-10

3. Slot-Model Pressure-Test Resolution

The question

Do phase-labeled slots that mirror the canonical card list 1:1 make building a preset deck feel like a chore with no choices — and should phases instead be user-defined?

Analysis

The chore risk is real but concentrated, not structural. Slot-by-slot interaction cost per preset deck: VARD 3 taps, ORD 3, Devtool AFPS 8, Game AFPS 11, Business AFPS ~35. Transcription fatigue lives almost entirely in Business AFPS; the locked UX already mitigates it there with stacked pack-slots and per-fan add-all.

The genre distinction that matters: netdecking vs brewing. Deck-builder games separate copying a known list (netdecking — players want one-click import) from composing your own (brewing — players want freedom). Preset decks are netdecks: nobody wants to place a known-good list card by card. The chore is not the phase structure — it is being forced through per-card placement when the user has already made their one real decision ("I want this deck"). The fix is speed, not loosened structure.

Why user-defined phases on preset decks would cost more than they give. (a) The one-line npx skillpacks install-deck <slug> contract depends on the preset staying canonical; editable phase structure forces every deck onto the explicit-pack-list path. (b) "The deck IS the pipeline" is the product's teaching mechanism — phase columns read left-to-right as execution order; user-defined phases delete the lesson. (c) Graduation arrows (VARD→Business AFPS, ORD→Devtool AFPS) connect canonical structures; they have no meaning between freeform trays.

Interaction cost: slot-by-slot taps vs Collect-all decisions

Resolution (encodes the user's direction)

Preset decks keep default phase-labeled slots. Users modify as needed. User-defined phases live in custom decks.

  • Keep: phase-labeled slot columns mirroring each preset's canonical chain — the teaching artifact and the basis of the one-line CLI output.
  • Add — speed valve: a deck-level Collect-all action ("Collect all N for this deck") that batches the whole preset in one decision. This is the netdeck import path and the primary chore killer. It extends the locked per-fan add-all across packs and needs a small animation-plan amendment (flight batching across sequential pack opens) — flagged in §11.
  • Add — choice valve: [Custom deck +] is promoted to a first-class sixth tile on the table, not a buried affordance. Brewing is a peer entry point, with user-defined phases (add/rename/remove phase columns).
  • Keep (locked): modification valves on presets — swap a suggested card or remove it, converting to a custom variant (editable name, explicit-pack-list CLI); freeform overlay row that never blocks unlock.

Consequence for the locked animation contracts: the card-flight target contract (slot identity/position) is unchanged — phase slots remain the targets. Only the new deck-level Collect-all needs animation-plan review; movement mechanics (optimistic commit, clone overlay, snap-to-end) are untouched.

Gate: slot-model verdict Updated — confirmed 2026-06-10

Accept this resolution — preset decks keep default phase slots with modification valves, deck-level Collect-all is added, and user-defined phases are scoped to custom decks?

Answered: Accept resolution as written

Recorded from final compiled YAML · status: answered · 2026-06-10

4. Persona, Goal & Entry Points

PersonaGoalSuccess conditionTempo
Evaluator — developer assessing GSkillPacks for adoption [provisional — ICP not yet run]Understand what decks/packs/cards are and assemble a deck matching their workflowCopies npx skillpacks install-deck … or downloads project.json for a deck they understandExploratory — inspects cards, reads phases, may browse shelf first
Returner — existing user configuring a new repoFastest path to the right pack listSame artifact, minimal interactions (Collect-all or unmodified preset)Direct — knows the deck they want; speed valves exist for them

Entry points & preconditions

IDEntryTriggerPreconditionLands on
E1/ — the tableOrganic, docs link, npm README, redirectsSkills data loadsS1 fresh (or restored) table
E2/deck/[slug] hard loadShared preset link, docs deep link, refresh mid-buildSlug matches a preset deckS2 builder open (no morph); invalid slug → F2
E3/deck/custom?c=…Shared custom/modified deckPayload decodes to known card idsS3 custom builder seeded from payload; corrupt → F3
E4/card/[id] standaloneSEO, shared card linkCard id existsS5 standalone card page with "Open on the table" CTA → S1
E5Return visitAny URL abovelocalStorage has per-deck progressSame screen with restored slots; packs resealed
E6/catalog, /packsOld bookmarks/linksRedirect to / (S1)

5. Happy Path + Interactive Walkthrough

Happy path (preset deck, Evaluator)

#StepScreen
1Land on the table: 5 preset blueprints + [Custom deck +] tile, pack shelf below, graduation arrows between related blueprintsS1 /
2Tap a blueprint → blueprint-morph into the builder (URL becomes /deck/[slug])S1 → S2
3Builder shows default phase columns with ghost-suggestion slots, empty overlay row, and the locked CLI panel ("🔒 N more to unlock")S2
4Tap a ghost slot → the shelf pack containing that card glowsS2
5Tear the glowing pack open → fan drawer of its cardsS2 + S4
6Tap wanted card(s), or "Collect all N" — optimistic commit, card flight to phase slot, slot fills and pulses, counter ticksS4 → S2
7Repeat 4–6 across packs, or use deck-level Collect-all to batch every remaining suggestion in one decisionS2/S4
8Last core slot fills (all flights landed) → slots gather into a stacked deck, stack flips to the output panelS2 → S6
9Copy npx skillpacks install-deck <slug> (or download project.json / share / keep editing) → terminal handoff H1S6

Interactive walkthrough (flow states, not motion)

This is an ephemeral preview of flow structure — which screens, actions, and states connect. Motion timing/mechanics are owned by the approved animation plan and are deliberately not simulated. Not production code.
screen: table (/)
table — Happy-path step 1. Tap the VARD blueprint to morph into its builder. Other blueprints are stubbed in this preview.

Flow diagram (all screens & transitions)

Screens & transitions
Entries E1–E6 S1 Table / S2 Preset builder /deck/[slug] S3 Custom builder /deck/custom S4 Pack fan client state S6 Output panel deck back / CLI unlock S5 Card detail /card/[id] S7 Deck picker modal — shelf-first add tap blueprint (morph) [Custom deck +] open pack (inspect-only) open pack / card flight complete → stack flip keep editing swap → custom variant complete (≥1 card) add to deck → pick inspect ⇄ → H1 terminal

Gate: proposed flow map Updated — confirmed 2026-06-10

Do you accept the happy path and the screen/transition graph as the binding flow structure for the deck-creation experience?

Answered: Accept as proposed

Recorded from final compiled YAML · status: answered · 2026-06-10

6. Branches & Decision Points

Alternate paths

IDBranchDiverges atBehaviorRejoins
B1Deck-level Collect-all new in this flow mapS2, any time core slots remainOne action batches every remaining suggested card: packs open in sequence, flights are staggered batches. Returner fast path; the netdeck import.Happy path step 8
B2Modify a preset (swap / remove)S2, any filled or ghost slotReplacing a suggestion or removing a card converts the deck to a custom variant: name becomes editable ("VARD — modified" default), CLI output switches to explicit pack list. Removal returns a slot to its ghost; unlock state recomputes.Happy path step 8 (gate now evaluates current slots)
B3Overlay additionsS2/S3 overlay rowAny card may be added to the freeform overlay row (e.g. code-review, gitops). Never blocks unlock; emits extra install <pack> lines in the output.No divergence from gate logic
B4Custom deck from scratchS1 [Custom deck +] tileEmpty builder at /deck/custom with user-defined phases: starts with one unnamed phase column; add/rename/remove phases; freeform slots accept any card. Unlock gate: ≥1 card.S6 with explicit-pack-list output and encoded share URL
B5Shelf-first browsingS1 pack shelfPacks open in inspect-only mode (no deck context). Cards show "add to deck" which opens the deck picker (S7); choosing a deck navigates to its builder with the card committed.S2/S3 mid-build
B6Card inspectionS4 (flip), S2 slots (flip), anywhere via /card/[id]Flip shows stats/benchmark back. Standalone page (E4) is the SEO surface with a "Open on the table" CTA.Where the user left off
B7Dismiss & resumeS2/S3, any timeDismiss morphs back to the table; progress persists per deck slug in localStorage. Blueprints on S1 show progress badges ("2/3"). Packs reseal each session.Re-entry at step 3 with restored slots
B8GraduationS1 arrows; S6 hint after completing VARD/ORDFaint arrows VARD→Business AFPS and ORD→Devtool AFPS; tapping routes to the target preset's builder.Step 2 for the graduated deck
B9Keep editing after completionS6Stack unflips to the builder; swaps/overlays continue (may convert to custom variant per B2). Re-completion re-runs the gather without ceremony loss.Step 8
B10ShareS6Unmodified preset → canonical URL /deck/[slug]. Modified/custom → /deck/custom?c=… URL-encoded card list + name.Recipient enters at E2/E3

Decision points

IDTypeWhereDecisionBranch rule
D1UserS1Preset blueprint vs [Custom deck +] vs browse shelf→ S2 / S3 / B5
D2UserS2 slotAccept suggestion, swap, or leave emptySwap/remove → B2 custom variant
D3SystemS2→S6Canonical-intact check: do filled slots exactly match the preset list?Yes → one-line install-deck <slug>; no → explicit pack list
D4SystemS2/S3Unlock gatePreset: all core slots filled (overlay ignored). Custom: ≥1 card
D5UserS2/S3Add overlay cards?B3; never affects D4
D6UserS6Copy CLI vs download project.json vs share vs keep editingH1 / H2 / B10 / B9
D7SystemS6 shareShare URL formCanonical slug if D3 passed; else encoded ?c= payload
D8UserS7Which deck receives a shelf-first add?Existing in-progress deck, fresh preset, or new custom
D9SystemE2/E3/E5Input validity (slug, ?c= payload, localStorage schema, card ids vs current data)Invalid → F2/F3/F4/F7 recovery
D10UserS1/S6Follow a graduation arrow?B8

Gate: branch & decision coverage Updated — confirmed 2026-06-10

Are B1–B10 and D1–D10 the complete branch/decision set for v1, with nothing collapsed into "standard flow" language?

Answered: Complete for v1

Recorded from final compiled YAML · status: answered · 2026-06-10

7. Screen/Route Inventory & Per-Screen Matrix

IDScreenRoutePurposeInputsOutputs / destinationsEvidence
S1Table/Orient; choose a deck or browse packsskills data, localStorage progressS2, S3, S4 (inspect-only), S5deck-builder-ux.md (deck-first, canvas)
S2Preset builder/deck/[slug] — intercepting overlay over the table + real route for hard loadsFill default phase slots; modify; reach unlockpreset definition, progress, shelfS4, S5, S6, back to S1deck-builder-ux.md (phase slots, ghosts, CLI lock)
S3Custom builder/deck/custom (+ ?c= seed)From-scratch deck; user-defined phasesoptional share payload, shelfS4, S5, S6, back to S1deck-builder-ux.md ([Custom deck +]); §3 resolution
S4Pack fan drawerclient state (no route)Open a pack; inspect/collect cardspack contents, deck context (or none)card flights to S2/S3; S7 when context-free; S5 flipprototype flow (SealedPack/PackOpener/BottomSheet)
S5Card detailmodal in-flow; standalone /card/[id]Inspect a skill: stats, benchmark evidence, commandcard id"add to deck" → S7/S2/S3; standalone CTA → S1deck-builder-ux.md (card pages, SEO)
S6Output panelstate within S2/S3 (deck back)Deliver the artifact: CLI, project.json, sharecompleted deck composition, D3 resultH1/H2/H3; B9 back to builderdeck-builder-ux.md (completion, CLI unlock)
S7Deck pickermodal (no route)Route a shelf-first add to a deckcard being added, deck list + progressS2/S3 with card committed; cancel → S4deck-builder-ux.md (shelf browsable, add prompts deck selection)

Kept outside this flow's scope: /follow and /admin/newsletter (unchanged), legacy showcase pages (archived once the deck-builder ships, per the idea brief). /catalog and /packs become redirects (E6).

Per-screen action/state matrix

ScreenActionsNavigationDisabled / blocked rulesValidationStates
S1 TableTap blueprint; tap [Custom deck +]; open pack (inspect-only); tap graduation arrow; tap card progress badge→ S2/S3/S4/S5Blueprint taps ignored while a morph is in progress (animation contract); shelf packs never "tear" accidentally on scrollloading (data fetch), fresh, restored (progress badges), data-error (F1), reduced-motion
S2 Preset builderTap ghost (glow source pack); tap filled slot (flip → inspect/remove); swap suggestion; deck-level Collect-all; open pack; add overlay card; rename (only after custom-variant conversion); copy CLI; share; download; dismiss→ S4, S5, S6, S1CLI copy disabled in locked state — button visible from first paint with "🔒 N more to unlock"; rename disabled while canonical; remove only from flipped slot backSlot accepts only its suggested card unless swapping (B2); overlay accepts any card not already in the deckempty, partial, in-flight, complete, custom-variant, restored, stale-data (F7), reduced-motion
S3 Custom builderName deck; add/rename/remove phase column; add any card to any slot; overlay adds; copy CLI; share (encoded); download; dismiss→ S4, S5, S6, S1CLI locked until ≥1 card (D4); phase removal with cards inside asks before discarding (destructive)Duplicate cards rejected with notice; phase names length-cappedempty (helper text), partial, complete, seeded-from-share, corrupt-payload recovery (F3)
S4 Pack fanFlip card; tap-to-add (deck context); per-fan "Collect all N"; "add to deck" (no context → S7); drag-dismiss→ S2/S3 (flights), S5, S7Re-tap of in-flight/collected card is a no-op; collected cards dimmed with "in deck ♦" badge; close mid-flight snaps flights to end (locked contract)fanned, partially-collected, all-collected ("all in deck"), inspect-only, closing
S5 Card detailFlip; "add to deck" / "in deck ♦"; copy command; (standalone) "Open on the table"→ S7 or back; standalone → S1"add to deck" hidden when card already in the active deckUnknown card id on hard load → F2-style fallbackfront, back (stats/benchmarks), standalone, in-deck
S6 Output panelCopy CLI; download project.json; share; keep editing→ S2/S3 (B9) or exitAppears only after D4 passes and all flights have landed (locked contract)Clipboard failure → F5 fallbackcanonical output (one-liner), custom output (pack list + overlay lines), copied-confirmation, copy-failed
S7 Deck pickerChoose deck; create new custom; cancel→ S2/S3 or back to S4Decks already containing the card shown as "already in deck" (not selectable)list (with progress per deck), empty-progress (all fresh)

Gate: screen inventory & matrix Updated — confirmed 2026-06-10

Is the seven-screen inventory with its action/state matrix the right v1 surface set (with /follow kept, old pages archived, /catalog+/packs redirected)?

Answered: Right surface set

Recorded from final compiled YAML · status: answered · 2026-06-10

8. State Coverage

State classWhere it appearsStatus
EmptyS1 fresh table; S2 all-ghost builder; S3 empty custom deck with helper text ("add a card to unlock the CLI"); S7 all-fresh deck listS3 helper newly designed; rest locked
LoadingS1 initial data load (single skeleton pass — data is one static JS asset)Newly designed
ErrorF1 data-load failure (retry panel); F2 bad slug; F3 corrupt payload; F5 clipboard deniedNewly designed
PartialS2/S3 some-slots-filled with locked CLI counter ("🔒 N more to unlock"); S1 blueprint progress badgesLocked (deck-builder-ux.md)
SuccessS6 unlocked output; copied-confirmation; per-slot fill pulseLocked
Permission-deniedOnly clipboard (F5) — site has no accounts or gated dataNewly designed
OfflineStatic site: after first load everything except the initial fetch works offline; copy/download/share unaffected. Initial-load-offline is browser-default, explicitly out of scopeScoped note
ValidationS3 duplicate-card rejection, phase-name cap; S2 slot accepts only suggestion unless swapping; D9 input validityNewly designed
Edge — in-flightOptimistic commit at tap; interruption snaps flights to end; completion defers until all flights landLocked (animation contract)
Edge — restoredE5 localStorage restore; packs resealed; stale card ids pruned (F7)Pruning newly designed
Edge — reduced motionState parity required: every flow state reachable with flights/morphs replaced by fades (mechanics owned by animation plan)Parity requirement stated here

Gate: state coverage Updated — confirmed 2026-06-10

Does this state set cover v1, including the newly designed error/validation states?

Answered: Covers v1

Recorded from final compiled YAML · status: answered · 2026-06-10

9. Failure/Recovery Paths & Handoffs

Failure & recovery

IDFailureRecovery
F1Skills data fails to load (S1 or any hard load)Error panel with retry; no interactive surfaces rendered half-broken. Table never renders from stale partial data
F2Invalid deck slug at /deck/[slug], or unknown card id at /card/[id]Redirect to / with a "deck/card not found" toast; no dead-end 404 inside the experience
F3Corrupt or unparseable ?c= share payload/deck/custom opens fresh and empty with a "couldn't read the shared deck" toast; salvageable known card ids are kept when partially parseable
F4Corrupt or schema-mismatched localStorageVersioned schema key; mismatch discards progress silently for that deck and starts fresh — never blocks entry
F5Clipboard API denied/unavailable on copyCommand text auto-selects with a "press Ctrl+C / ⌘C" hint; download and share unaffected
F6Interruption mid-flight (drawer close, builder dismiss, route change)All flights snap to end; optimistic commits are kept — no rollback (locked animation contract)
F7Restored progress references a card id no longer in the catalog (data updated between sessions)Stale ids pruned at load; affected slots revert to ghosts; one notice ("1 card is no longer available"); unlock recomputes
F8Custom deck completion attempted with zero cardsCLI stays locked (D4); helper text names the unlock condition instead of a dead button
F9Offline after first loadEverything except the initial data fetch works; initial-load-offline is browser default (out of scope)
F10Contradictory choice: swapping in a card already in the overlay rowCard moves from overlay to the phase slot (no duplicates); reverse direction (slot→overlay) via remove-then-add

Handoffs & external/manual dependencies

IDHandoffMechanismFailure surface
H1Web → terminalCopy npx skillpacks install-deck <slug> (or explicit install <packs> list)F5 clipboard; CLI-side errors are the CLI's scope, not the showcase's
H2Web → repoDownload project.json mirroring .agents/project.json (enabled_packs + deck metadata)Browser download permission (browser-default)
H3Person → personShare URL: canonical slug (D3 pass) or encoded ?c= payloadF3 corrupt payload on the receiving side
H4Docs/npm → showcaseInbound links to /, /deck/[slug], /card/[id]F2 invalid targets
H5System dependencyCustom/modified decks must emit explicit pack lists — the CLI deck manifest only maps canonical slugsDrift between showcase deck definitions and CLI manifest; flagged in §11 (shared data source needed)

Gate: failure & handoff coverage Updated — confirmed 2026-06-10

Do F1–F10 and H1–H5 cover the failure and handoff surface for v1?

Answered: Covered for v1

Recorded from final compiled YAML · status: answered · 2026-06-10

10. Low-Fidelity Wireframe Notes

Structural regions only — no styling, spacing, or visual design. Those belong to /ui-interview and later stages.

S1 Table (/)

┌─ brand strip ──────────────────────────────────────────────┐
│                                                            │
│  BLUEPRINT ROW (primary)                                   │
│  [VARD 2/3] [ORD] [Biz AFPS] [Devtool AFPS] [Game AFPS]    │
│      └────traction──→ [Biz AFPS]   (faint arrows)          │
│  [ + Custom deck ]   ← first-class sixth tile (§3)         │
│                                                            │
│  PACK SHELF (secondary, below the fold acceptable)         │
│  ( 7 sealed boosters, horizontal scroll )                  │
└────────────────────────────────────────────────────────────┘

S2 Preset builder (/deck/[slug])

┌─ deck name (editable only as custom variant)      [✕] ─────┐
│  PHASE COLUMNS, left→right = execution order               │
│  ┌ Scan ─┐  ┌ Align ─┐  ┌ Ship ─┐                          │
│  │ ghost │  │ FILLED │  │ ghost │   ← ghost = suggestion   │
│  └───────┘  └────────┘  └───────┘     outline + /command   │
│  Business AFPS: column = stacked pack-slot w/ counter      │
│  ─ overlay row (freeform, any card) ───────────────────    │
│  [ Collect all N ]                ← deck-level (B1)        │
│  CLI PANEL (persistent): 🔒 2 more to unlock │ [copy]      │
│  ─ condensed shelf strip (packs reachable in-context) ──   │
└────────────────────────────────────────────────────────────┘

S3 Custom builder (/deck/custom)

┌─ [name your deck…]                                [✕] ─────┐
│  ┌ Phase 1 (rename) ─┐  [+ add phase]                      │
│  │ empty freeform    │   phases: add / rename / remove     │
│  │ slots (any card)  │   (remove asks if cards inside)     │
│  └───────────────────┘                                     │
│  ─ overlay row ─────────────────────────────────────────   │
│  CLI PANEL: 🔒 add a card to unlock │ explicit pack list    │
└────────────────────────────────────────────────────────────┘

S4 Pack fan drawer

╔═ bottom sheet (drag-dismiss) ══════════════════════════════╗
║  pack name · fan of cards (flip = inspect, tap = collect)  ║
║  [card] [card] [card] [card]      [ Collect all 4 ]        ║
║  inspect-only mode: tap → card detail, "add to deck" → S7  ║
╚════════════════════════════════════════════════════════════╝

S5 Card detail / S6 Output / S7 Deck picker

S5: [ card art/front | stats back: type, benchmark grade,    S6 (deck back):
      version, /command, pack ]                               npx skillpacks install-deck vard   [copy]
    [add to deck]  (standalone: [Open on the table])          + install code-review (overlay)
                                                              [⬇ project.json] [share] [keep editing]
S7: "Add /benchmark-card to…"  ▸ VARD (2/3)  ▸ ORD  ▸ + new custom deck   [cancel]

Mobile branch notes (wireframe level)

Gate: wireframe notes Updated — confirmed 2026-06-10

Are these structural notes right as handoff guidance for /ui-interview (and properly free of visual-design decisions)?

Answered: Right as handoff guidance

Recorded from final compiled YAML · status: answered · 2026-06-10

11. Open Questions, Risks & Non-Goals

ItemDetailOwner / where it resolves
Collect-all motion mechanicsDoes deck-level Collect-all open packs sequentially (spectacle) or fly cards directly from the shelf (speed)? Either way it is a new trigger for the card-flight batching contract.Small amendment to the animation design plan after this flow map is approved
Swap gesture detailHow does a user swap a filled slot's card — tap-while-occupied prompt from the fan, or a slot context action? Flow defines that swap exists and converts to custom variant (B2); the interaction detail is per-screen content design./ui-interview --requirements-only deck-creation
Custom phase editing depthProposed: add/rename/remove only; defer drag-reorder of phases out of v1.Confirm in /ui-interview
Next 16.2.6 intercepting routesClient-state-first with shallow pushState is the routing decision; the spike is the top implementation risk (carried from the animation plan, not re-decided here).First implementation task
Persona validationEvaluator/Returner personas come from the idea brief; customer discovery and positioning have not run.amended 2026-06-10
/customer-discovery → positioning (business-discovery pack, installed)
Deck data pipelineskills-data.js has zero deck definitions; deck shapes must be added to generate-skills-showcase-data.mjs output and shared with the CLI manifest (H5 drift risk).Implementation planning

Explicit non-goals

12. Artifact Destination & Proposed File Changes

Destination approval and mutation scope are separate decisions below (the destination is a path choice; the file-change set includes the index update and page confirmation).

FileChangeArchive needed?
specs/skills-showcase/user-flow-deck-creation.mdNew — canonical flow spec containing §§2–11 contentNo (new file)
specs/skills-showcase/user-flow-deck-creation-interview.mdNew — interview log: evidence consulted, assumptions checkpoint + answers (incl. verbatim slot-model direction), coverage checkpoint, remaining gapsNo (new file)
alignment/index.htmlUpdate — dated entry for this page (already added with the review page)No (index maintenance)
alignment/user-flow-map-deck-creation.htmlConvert reviewconfirmed after approval (prior review page archived to docs/history/archive/ first)Yes (archive-first)

Gate: artifact destination Updated — confirmed 2026-06-10

Write the canonical flow spec to specs/skills-showcase/user-flow-deck-creation.md (product-path-scoped), with the interview log beside it?

Answered: Approve destination

target_path: specs/skills-showcase/user-flow-deck-creation.md

Recorded from final compiled YAML · status: answered · 2026-06-10

Gate: proposed file changes Updated — confirmed 2026-06-10

Approve the full mutation set above (two new spec files, index maintenance, page confirmation), executed only after final compiled YAML?

Answered: Approve file change set

Recorded from final compiled YAML · status: answered · 2026-06-10

13. Post-Approval Route

The AFPS design route after an approved flow map is per-screen content requirements, then layout exploration: /ui-interview --requirements-only deck-creation/ux-variations --layout-mode. The ui-interview skill is in the product-design pack, which is not installed (only user-flow-map and brainstorm are individually enabled) — so the route has an install prerequisite: /pack install ui-interview (or the full pack). A second, smaller follow-up is the animation-plan amendment for the Collect-all batching trigger (§11).

Gate: post-approval route Updated — confirmed 2026-06-10

After the spec is written, how should the work route?

Answered: /pack install ui-interview, then /ui-interview --requirements-only deck-creation

Recorded from final compiled YAML · status: answered · 2026-06-10

14. Approval Record Updated — confirmed 2026-06-10

Final compiled YAML received 2026-06-10: all 12 gates answered, section_feedback: [], no needs-clarification, no requested edits. The user's compiled YAML is preserved verbatim below as the read-only approval record. The compile controls that produced it were removed when this page converted from review to confirmed.

alignment_page: alignment/user-flow-map-deck-creation.html
approval_status: ready-for-agent-review
gate_answers:
  - section: "Context & Evidence"
    gate_type: "evidence coverage"
    status: answered
    answer: "Sufficient — proceed on idea-brief personas"
  - section: "Flow Assumptions Record"
    gate_type: "assumptions/confidence"
    status: answered
    answer: "Accurate — carry into the spec"
  - section: "Slot-Model Pressure-Test Resolution"
    gate_type: "candidate/verdict decisions"
    status: answered
    answer: "Accept resolution as written"
  - section: "Happy Path & Flow Map"
    gate_type: "flow map"
    status: answered
    answer: "Accept as proposed"
  - section: "Branches & Decision Points"
    gate_type: "branch/decision coverage"
    status: answered
    answer: "Complete for v1"
  - section: "Screen/Route Inventory & Per-Screen Matrix"
    gate_type: "coverage checkpoint"
    status: answered
    answer: "Right surface set"
  - section: "State Coverage"
    gate_type: "state coverage"
    status: answered
    answer: "Covers v1"
  - section: "Failure/Recovery Paths & Handoffs"
    gate_type: "failure/handoff coverage"
    status: answered
    answer: "Covered for v1"
  - section: "Low-Fidelity Wireframe Notes"
    gate_type: "wireframe notes"
    status: answered
    answer: "Right as handoff guidance"
  - section: "Artifact Destination & Proposed File Changes"
    gate_type: "artifact destination"
    status: answered
    answer: "Approve destination"
    target_path: "specs/skills-showcase/user-flow-deck-creation.md"
  - section: "Artifact Destination & Proposed File Changes"
    gate_type: "proposed file changes"
    status: answered
    answer: "Approve file change set"
  - section: "Post-Approval Route"
    gate_type: "post-approval route"
    status: answered
    answer: "/pack install ui-interview, then /ui-interview --requirements-only deck-creation"
section_feedback: []

What changed during confirmation