THE PLAN

JoyOS Lab v1.2

A marketplace where members learn, experiment, and build, then sell what they create.

MVP REFOCUS (2026-07-03): The app is being driven to its two sides -- CREATE (creators offer services) and LEARN (members purchase via Stripe). Fastest path to a working buy/sell loop. Archetype profiles, gratitude surfaces beyond the existing gate, and other assessments are deferred. Phases below are re-badged against this focus.
Progress as of 2026-07-02 Live build status, layered on top of the decisions captured below

Done Shipped to staging

  • Schema-resilience foundation (PR #396): pre-connect schema gate, hardened prod CI, safe migration path
  • Entry / fork-door (Phase 24): /start gate, Creator Studio = Catalyst + admin only
  • Onboarding O-1..O-9, O-10, O-11 fully built to staging
  • Onboarding O-12: auto-initiate for not-yet-initiated users, live E2E verified on staging
  • Offline-first / instant app: durable outbox, no false tier-locks, splash retired
  • Learning Lab browse, offer detail, personalized home, My Library (P1a/P1b/P2/P3/P6)
  • Marketplace core: live on PROD since 2026-06-01, zero data loss
  • Community gratitude gate + anonymous-to-signed-in gratitude carry-through

In progress Being verified / finished now

  • Landing-redirect removal + infinite-"Connecting" resilience fix
  • Creator Studio nav polish to match mockups

Pending Not started yet

  • Marketplace payments + Stripe Connect (Phases 26-35)
  • Admin Support Console (Phase 38)
  • Email verification flow
  • Ratings & Reviews (P4), Shelves & Recommendations (P5)
  • Schema-Guard maincloud relay

How to read the badges below: every phase card in the console now carries a small DONE / IN PROGRESS / PENDING pill next to its title, reflecting real build+ship status on staging-next as of this update. This is a status layer only -- none of the decision answers captured in each phase's plan were changed.

Recently shipped to staging (last synced 2026-07-04 08:25 ET)

  1. 611dd6e7 fix(start): couple fork-door active-visual state to activeSide
  2. fcfef1ad feat(login-p1): GREEN - useDailyGratitude/useLanePersistence/useLastVisitedPage
  3. 71dde710 test(login-p1): RED - useDailyGratitude/useLanePersistence/useLastVisitedPage
  4. 7df06dc7 docs(money-loop-m4): checkpoint -- Integrate phase, staged for push to staging-next
  5. 043cd8a9 fix(money-loop-m4): supply refund_reason/refunded_at on shared purchase insert
  6. 06518ce5 feat(money-loop-m4): GREEN -- payout idempotency + refund skeleton
  7. c8f62735 test(money-loop-m4): RED -- payout idempotency + refund skeleton pins
  8. f207df17 fix(money-loop-m4): re-add blessed creator_payouts allowlist entry post-revert + checkpoint
  9. a8d74208 Revert "test(money-loop-m4): RED -- payout idempotency + refund skeleton pins"
  10. 19a65b86 Revert "feat(money-loop-m4): GREEN -- payout idempotency + refund skeleton"
  11. bff7c60a docs(money-loop-m4): checkpoint -- landed on staging-next as 5713be3c (FF, no rebase needed)
  12. 5713be3c feat(money-loop-m4): GREEN -- payout idempotency + refund skeleton
  13. ce5874b0 test(money-loop-m4): RED -- payout idempotency + refund skeleton pins
  14. f07be472 fix(money-loop-m3): creator_payouts RLS admin OR-clause is unpublishable -- drop to owner-only
  15. 906d139c docs(money-loop-m3): checkpoint - landed on staging-next as aa338211 (FF, no rebase needed)
  16. aa338211 fix(money-loop-m3): creator_payouts RLS admin branches must test :sender, not creator_identity
  17. ad7adef0 docs(money-loop-m3): mark GREEN checkpoint complete
  18. 944081e6 feat(money-loop-m3): GREEN - creator_payouts ledger + frozen fee + I4 invariant + per-creator RLS
  19. 6a3175f3 wip(money-loop-m3): checkpoint - GREEN impl + 4 M3 spec files passing (pre-full-suite)
  20. 4a405b8e test(money-loop-m3): RED for creator_payouts ledger schema + I4/RLS/identity-migration pins
  21. ba125d30 feat(money-loop-m2): GREEN - identity-migration extension + coverage meta-guard + Layer-B ownership key
  22. f9375746 test(money-loop-m2): add RED tests for identity-migration extension + Layer B ownership key
  23. 9868b3ae fix(money-loop-m1): close adversarial findings F1 (poison-claim) and F2 (webhook retry gate)
  24. a227b3e3 feat(money-loop-m1): GREEN - outcome-explicit record_purchase + pending_purchases
  25. 5cb818c1 test(money-loop-m1): add RED tests for outcome-explicit record_purchase (M1)
  26. 03ace566 test(onboarding): relax O-12 spec stale bug-symptom assertions to correct auto-initiate contract
  27. b8cf2151 fix(onboarding): O-12 auto-initiate fires reactively, not just from a one-shot guard check (GREEN)
  28. 96305067 test(onboarding): live E2E for O-12 auto-initiate (task #98)
  29. 9d7257e0 fix(security): GREEN - register_user fast-path no longer trusts args.email (task 87 remainder, P0)
  30. c6b7faea test(security): RED tests for register_user fast-path email-stamp admin takeover (task 87 remainder)
  31. 04a3a75e fix(learning-lab): remove mockup-artifact surface switcher and CTA from learner header
  32. d0fe6b1a test(learner-header): RED tests to remove mockup-gallery switcher and Join CTA
  33. 16da34ba Revert "merge: consolidation Increment 1 (/app -> lane-aware redirect) into staging-next"
  34. 6b2bc7a5 fix(119): GREEN - Offer Wizard price-step type-safe numeric handling
  35. cc257f9d test(119): RED repro for Offer Wizard price-step .trim() crash on real <input type=number> path
  36. 4022d59e feat(creator-nav): rebuild AppShell sidebar to Phase 31.5 mockup (GREEN)
  37. d96a90bc test(nav): add failing test suite for creator-side sidebar revamp (RED)
  38. 4f55d320 docs: add creator-side sidebar revamp spec (phase-31-5 mockup mapping)
  39. 4532e0a9 test(lane-c): convert PURCHASE_RECORDER_IDENTITIES it.todo tests to live tests
  40. aa8ed194 docs(lane-c): prep spec for purchase-recorder identity allowlist
  41. 1c6a7665 merge: consolidation Increment 1 (/app -> lane-aware redirect) into staging-next
  42. 4da517a4 feat(inc1): GREEN for /app -> lane-aware redirect (consolidation Increment 1)
  43. d2826273 test(inc1): RED for /app -> /creator-studio lane-redirect foundations
  44. 2c5958f3 merge: mockdata-wave1 library creator attribution (fix/library-creator-attribution) into staging-next
  45. e6307d47 fix(library): resolve real creator attribution on My Library cards (GREEN)
  46. 8e872c36 test(library): RED tests for real creator attribution on My Library cards
  47. 19503da9 Revert "test(119): RED for Offer Wizard (Option A) - route + component specs"
  48. 8644326e Revert "feat(119): Offer Wizard (Option A) - guided create flow for Creator Studio"
  49. f8110d2f Mock-data purge Wave 3: real experiment duration + durable joy_pairs seed
  50. 8e97c297 Merge origin/staging-next (offer-wizard) into staging-next-merge-tmp2
  51. b7e6024f fix(test): update stale LearningLabBrowseView reference pattern in liveCategories spec
  52. 7c4789ff feat(119): Offer Wizard (Option A) - guided create flow for Creator Studio
  53. 6865a26f test(119): RED for Offer Wizard (Option A) - route + component specs
  54. 3fba4d53 Merge fix/offline-first-view-sweep-a into staging-next
  55. 3bf7892b fix(offline-sweep-a): migrate wave A views off subscriptionReady view-blanking
  56. d910ebee test(offline-sweep-a): RED tests for wave A offline-first data-read gaps
  57. de6df67b merge: offline-first view sweep Wave B (fix/offline-first-view-sweep-b) into staging-next
  58. cb547902 fix(offline-sweep-b): migrate Wave B views to useDataStore's useTable (GREEN)
  59. 31374288 test(offline-sweep-b): RED tests for Wave B offline-first data-read gaps
  60. 2dbb0869 test(buildjourney): pin Wave 2 de-fabrication acceptance criteria per-component
  61. eb47a814 fix(buildjourney): defabricate Wave 2 dashboard widgets
  62. 5eb84bfd Merge feat/commerce-l5-receipt-download into staging-next
  63. fd7d1625 feat(commerce-l5): entitlement-gated download + receipt owned-state
  64. c15a9760 test(L5): RED entitlement-primary download gate + You-own-this receipt state
  65. a92373d0 test(onboarding): live staging E2E for reprompt-persistence fix
  66. 0019ae5c fix(onboarding): demographics Save must dismiss optimistically and persist across reload
  67. 11987c7a Merge feat/route-site-map-alignment into staging-next
  68. c7572234 feat(120): align Creator Studio route to site-map (/app/studio -> /creator-studio)
  69. 93d8d636 test(120): RED for route site-map alignment (Creator Studio path move)
  70. 6221757b Merge pull request #490 from braceyourself/fix/trialconfig-upsert-and-reducer-verify
  71. 3afc6b54 fix(admin-pairs): resolve real identities in admin_match_pair
  72. 1e225a95 fix(fork-door): make Enter CTA reachable by real mouse travel
  73. 8924991e fix(trial-config): upsert missing seeker tier_config row
  74. 365dd859 test(trial-config): RED for update_trial_config upsert bug (2-layer)
  75. 77d6954c merge: learner-side persistent header (feat/learner-persistent-header) into staging-next
  76. d06d6916 test(studio): fix CreatorStudioView back-to-gate sibling-contract check after #113
  77. 03ba8b40 feat(learning-lab): persistent learner-side header via LearningLabLayout.vue (#113)
  78. 30f294f7 test(learning-lab): RED tests for persistent learner-side header (#113)
  79. 7ab1ea2d merge: signin helper stale-default fix (fix/signin-helper-stale-default) into staging-next
  80. 0ac37133 fix(e2e): signInToStaging navigates directly to /app instead of relying on removed / auto-redirect
  81. afa7c05b merge: router unwanted /app redirect fix (fix/router-unwanted-app-redirect) into staging-next
  82. c413be3e fix(router): stop unwanted /app navigations (#105, #124)
  83. 4b010de1 merge: reducer positional-args batch fix (fix/reducer-positional-args-batch) into staging-next
  84. 324bf660 fix(reducers): pass single object argument to 10 misshaped reducer call sites
  85. 5aba4f76 test(router): RED tests for #105 root redirect and #124 tour self-navigation
  86. 797d5bec test: RED - 10 reducer call sites must send OBJECT shape, not positional args
  87. 004d51ed merge: O5 demographics write fix (fix/o5-demographics-write) into staging-next
  88. 121d995c fix: saveDemographics sends { roleType, timezone } object, not positional args
  89. 9596fa24 test: RED - saveDemographics must send { roleType, timezone } object, not positional args
  90. 4fa298c8 merge: auth session persistence fix into staging-next
  91. 71b08504 Merge pull request #489 from braceyourself/feat/commerce-l4-webhook-grant
  92. ba50c950 feat(commerce-l4): idempotent webhook purchase+entitlement grant, retire KV
  93. 3f0c3a79 test(commerce-l4): RED tests for STDB-based webhook idempotency, 7-arg record_purchase, mark-after-success ordering, KV retirement
  94. 793a073d fix: actively recover STDB connection on auth-error refresh success
  95. 6163909e test: RED tests for auth-session recovery completion (2-layer pattern)
  96. 6ebe6a08 fix: preserve app session on recoverable STDB auth-error
  97. 4fe7e1bb test: RED tests for auth-session-persistence fix (2-layer pattern)
  98. 024b87af merge: Learning Lab filter Option A (compact dual dropdown) into staging-next
  99. 316f9008 feat(learning-lab): filter Option A - compact dual dropdown
  100. e16916ad feat(commerce-l3): buy-flow login gate with shared sign-in panel (#488)
  101. b58a69f1 Merge pull request #487 from braceyourself/feat/creator-studio-sidenav
  102. 7a9cc212 feat(creator-studio): GREEN - sidenav matching locked mockup + lane-switch to gate
  103. 4ac49e11 test(creator-studio): RED - sidenav match + lane-switch-to-gate + Catalyst gate guard
  104. 9a7b2749 merge: O-5 setup modal + confirmed-store notification (feat/o5-setup-modal-notify) into staging-next
  105. d45f473a feat(o5): modal + confirmed-store notification for setup prompt
  106. 72d1b14d test(o5): 2-layer RED for modal + confirmed-store notification
  107. 96e8e519 Merge pull request #486 from braceyourself/feat/commerce-l2-stripe-customer
  108. ddd33ec1 feat(commerce-l2): stripe customer create/reuse + full checkout metadata
  109. b7867aae test(commerce-l2): RED tests for Stripe Customer + reconciliation metadata (commerce-l2-stripe-customer)
  110. eeb0c1a9 Merge pull request #485 from braceyourself/feat/commerce-l1-entitlement-fee-customerid
  111. 93736de0 fix(commerce-l1): entitlement idempotency guard used reference equality, not value equality
  112. 5124c8e5 feat(commerce-l1): grant entitlement, persist stripe customer id, real fee split, staging recorder identity
  113. 7e387050 test(marketplace): RED tests for lane L1 fee model, entitlement grant, stripe_customer_id (commerce-l1-entitlement-fee-customerid)
  114. 561a94a3 merge: listing category slug-source-of-truth fix
  115. 6971804a fix: source listing category from live marketplace_categories, not hardcoded display names
  116. 4820f8a9 test: RED for listing category slug-source-of-truth fix
  117. 0371f4b9 Merge pull request #484 from braceyourself/feat/prod-magic-link-privatetable-fix
  118. 230d0261 GREEN: verify-magic-link.js now uses verify_magic_link_nonce reducer instead of raw SQL on private table
  119. b5fbc67c RED: verify-magic-link.js prod exchange must use a reducer, not raw SQL on a private table
  120. ad1efcb9 Merge pull request #483 from braceyourself/feat/learninglab-header-logo-image-fill
  121. b1e2734c feat(learning-lab): GREEN - real JoyOS mark in header, images always fill
  122. 94100f18 test(learning-lab): RED - header monogram must be real JoyOS mark, images must always fill
  123. 73be5c6a Merge pull request #481 from braceyourself/feat/forkdoor-cta-active-only
  124. 52585d83 feat(fork-door): GREEN hover-activates-CTA (desktop hover = mobile tap)
  125. 8860b9fe test(fork-door): RED for hover-activates-CTA (desktop hover = mobile tap)
  126. 78c14e67 Merge pull request #480 from braceyourself/feat/gratitude-wall-lazyload
  127. 0475c73e fix(gratitude-wall): lazy/incremental loading + row layout
  128. fc47bb70 test(wall): RED tests for gratitude wall lazy-load + row layout (task #109)
  129. 808cf55e fix(stdb): register magic_link_exchange_results in the schema table registry (#479)
  130. 2fa1d8a8 Merge pull request #478 from braceyourself/chore/revamp-sync-stop-hook
  131. ace3ceb4 fix(auth): staging dev-login exchange 401s because magic_link_nonces is private (task #97) (#477)
  132. 7957b515 wire revamp-sync Stop hook into settings.json
  133. 452a8c48 Merge pull request #414 from braceyourself/hotfix/kristin-joyos-email-admin
  134. bb7500ef chore: add kristin@joyos.global to ADMIN_EMAILS allowlist
  135. 8f99b25b fix(marketplace): seed demo listings with curated category strings (#107) (#476)
  136. ff390c8d fix(onboarding-o5): clarify role/timezone prompt copy (#106) (#475)
  137. 1d544fbe fix(onboarding): O-12 waits for feature_flags subscription before evaluating kill-switch (#474)
  138. cefbdd80 Merge pull request #471 from braceyourself/feat/marketplace-live-categories-v2
  139. f3ffc80f GREEN: marketplace categoryRows sourced from live marketplace_categories
  140. dd48da50 RED: marketplace categoryRows derives from live marketplace_categories table
  141. 8fb7d083 O-12: auto-initiate onboarding for any not-yet-initiated user (#470)
  142. a3f32129 LL P3: My Library (purchased items + fulfillment) (#469)
  143. 2947e26f GREEN: LL P2 personalized Learning Lab Home (locked Inner tab)
  144. 17fe93e9 RED: LL P2 personalized Learning Lab Home (locked Inner tab)
  145. 34cfd28c fix(onboarding): wire isFlagEnabled to O-11 rollout-percentage gate (#467)
  146. dad0819a Onboarding O-11: admin funnel + progressive rollout gate (#466)
  147. a35c4b13 Merge pull request #465 from braceyourself/feat/ll-detail-match
  148. bae8a3c7 feat(learning-lab): GREEN for Offer Detail P1b (content-preview, related rail, reviews slot)
  149. 4216e9e2 test(learning-lab): RED contract for Offer Detail P1b (content-preview, related rail, reviews slot)
Review Console 0 / 15 phases seen
Full plan (all phases)