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.
Decisions -- 2026-07-04
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-08 14:10 ET)

  1. ca0968db Merge PR #537 — waitlist optimistic outbox + identity migration fix (task #202)
  2. a8ff5970 fix: Learning Lab item-card click no-op — backfill missing listing slugs
  3. 112a80e0 Merge — gate redirect before paint + /learning-lab gate-before-entry
  4. aab6e1a0 feat(gate): redirect before first paint on cold load via date-stamped localStorage fast path
  5. 84e463e9 test(gate): RED tests for pre-paint gate redirect fast path
  6. b5e8074a fix(waitlist): wire waitlist_signups into repointIdentityTables (#202)
  7. b0250a41 feat(waitlist): GREEN — dbVersion reactivity + outbox natural-key confirm + MAX_ATTEMPTS dead-letter (#202)
  8. be362815 feat(waitlist): make /app/circles join/leave optimistic + durable (task #202)
  9. 96fe1fa9 Merge PR #535 feat/creator-sidebar-flatten — flattened creator-side sidebar
  10. 4be4a92e feat(sidebar): flatten creator-side AppShell sidebar (task #201 part 3)
  11. 169fc5c2 Merge integrate/silent-write-fixes into staging-next
  12. 406a4fc7 fix(onboarding): surface fireReducer failures instead of silently swallowing them
  13. e4d632b7 fix(journey): surface enrollInJourney() failures instead of silently swallowing
  14. 7c00c869 fix(wall): surface updateGratitude write errors instead of silent swallow
  15. 679d6d14 Merge PR #533 feat/ll-p5-shelves — category shelves + recommendations rail
  16. a9bb12fc test(ll-p5): add local Vite render harness for shelves/recommendations visual verification
  17. 90bcf21c feat(ll-p5): GREEN — category shelves + recommendations rail on Learning Lab home
  18. a0696765 test(ll-p5): RED — shelves + recommendations rail on Learning Lab home
  19. 7a6c17b7 chore(staging): allowlist notif-engine write-on-use tables in empty-table gate
  20. ab7f29ab Merge notification engine (task #203, Increments 1–6b) into staging-next
  21. 9d684265 chore(hooks): defer full test suite + build to swarm CI; keep cheap local guards
  22. 68316464 docs(notif-engine): Increment 6b proof artifacts (adversarial, GREEN-verify, local-STDB E2E) (task #204)
  23. fd8871bf feat(notif-engine): GREEN — Increment 6b per-type digest_frequency (task #204)
  24. 6986d069 test(notif-engine): RED — Increment 6b per-type digest_frequency (task #204)
  25. 70283c32 feat(notif-engine): GREEN — Increment 6 digest queue (daily/weekly, marketplace product-sharing)
  26. 789ce5b0 fix(notif-engine): wire notification_preferences/notification_events into identity migration
  27. 876cb7e1 feat(notif-engine): GREEN — Increment 5a seed_default_notification_types
  28. 61011170 test(notif-engine): RED — Increment 5a notification-type catalog seed
  29. 52fc8601 fix(notif-engine): set_notification_preference insert() missing id field crashes with 530
  30. 69c1923a fix(notif-engine): guard notification-preferences computed against missing tables in mocks
  31. 7482289c feat(notif-engine): GREEN — Increment 4 preference center + onboarding prompt
  32. 2369f0b7 test(notif-engine): RED — Increment 4 preference center + onboarding prompt
  33. 796eb766 fix(notifications): prevent double-send on status write-back failure
  34. a57b2326 feat(notif-engine): GREEN — Increment 3 email channel drainer Pages Function
  35. 8c623ddf test(notif-engine): RED — email channel drainer Pages Function (Increment 3)
  36. 9a67db69 feat(notif-engine): GREEN — Increment 2 in-app channel wiring
  37. 957dd3cc test(notif-engine): RED — in-app channel wiring pure helper (Increment 2)
  38. 2c09e886 fix(notif-engine): emit_notification frequency cap + idempotency-first dedupe
  39. 27210385 feat(notif-engine): GREEN — Increment 1 engine core (tables + emit_notification + resolveChannels)
  40. 5596e208 test(notif-engine): RED — resolveChannels + emit_notification decision-path pure helpers (Increment 1)
  41. 79100511 Merge PR #532 fix/199-gate-bypass-guard — auto-tracked reactive backstop closes gate-bypass leak (#199)
  42. 71a69c1d fix(#199): auto-tracked reactive backstop closes gate-bypass leak (GREEN)
  43. 7e908560 test(#199): RED test pinning the reactive-backstop leak (watch tracks only 3 of ~6 predicate signals)
  44. b6e9cda9 docs(#199): investigation — pin exact URL-edit gate-bypass leak in reactive backstop
  45. 1d999648 Merge PR #531 feat/slug-product-urls — slug-based product URLs (#186)
  46. 5e74e782 docs(#186): adversarial self-check findings (all 5 checks PASS)
  47. b92443b8 feat(#186): slug-based product URLs
  48. cd0bbb06 docs(#186): GREEN + Schema spec for slug-based product URLs
  49. 330facb7 test(#186): RED tests for slug-based product URLs (2-layer pattern)
  50. 5f942743 fix(#195): stack earnings rail below main on mobile (grid-column reset) (#530)
  51. a7fcdb1e Merge PR #529 hotfix/ci-drop-setup-node-npm-cache
  52. 21c45979 hotfix(ci): drop npm cache from setup-node (AS3 runner stall)
  53. b189fd44 Merge PR #528 fix(#195): Creator Studio responsive mobile view
  54. 86cc72bd Merge PR #527 fix/fork-static-cta — fork learner CTA fully static
  55. 2699a96f docs(#193): add adversarial verification artifact for fork-static-cta
  56. 4254ed10 fix(#191,#192): invite code optional + login Back = browser-back (#526)
  57. d7aa2a98 fix(fork): make learner CTA fully static, ignore ?redirect= (GREEN #193)
  58. 3ccf60f2 test(fork): RED tests pinning static (non-redirect) fork CTA destinations
  59. 403a1e28 Merge PR #525 fix/ll-header-hide-avatar-signed-out — Learning Lab: hide header avatar for signed-out visitors (#190)
  60. 33ddc125 docs(#190): add adversarial-verify artifact (CONFIRMED)
  61. 5f9bfac0 feat(learning-lab): hide header avatar for signed-out visitors (#190) GREEN
  62. a28bd86a test(learning-lab): RED — hide header avatar for signed-out visitors (#190)
  63. 832a46eb Merge PR #523 fix/ll-checkout-entitlement — Learning Lab checkout entitlement fix (#187)
  64. bd011e2b fix(learning-lab): LearningLabHomeView entitlement filter used stale 'granted' status (#187 adversarial follow-up)
  65. 0782531f fix(#187): GREEN — LL checkout entitlement bug (status literal + preview grant)
  66. 0c4e4b78 test(#187): RED tests for LL checkout entitlement bug (2-layer pattern)
  67. cfbfcee1 Merge PR #522 fix/creator-studio-polish — Creator Studio #189 nav polish
  68. 677bf182 docs(#189): add adversarial + green verification artifacts for creator-studio-polish
  69. 432898d0 feat(creator-studio): polish #189 — remove status strip, gate founding banner on badge, drop View all link
  70. d1d20102 test(creator-studio): RED tests for #189 polish
  71. 9a5b14af Merge PR #521 integrate/188-remove-creator-marketplace — remove Marketplace from creator-side nav
  72. d9a42388 docs(#188): add adversarial-verify artifact (CONFIRMED)
  73. acdc0121 feat(#188): remove Marketplace from creator-side nav (GREEN)
  74. 9451ed5d test(#188): add RED tests for removing Marketplace from creator-side nav
  75. 1ef4e6ea Merge PR #520 integrate/185-ll-public — /learning-lab public + user-agnostic when signed out
  76. 29f647e8 docs(#185): add adversarial-verify artifact (CONFIRMED)
  77. 7ef000b5 docs(#185): GREEN summary note
  78. 63a1e2dd feat(#185): make /learning-lab public and user-agnostic when signed out
  79. 6b427a23 test(#185): RED tests for public/user-agnostic Learning Lab landing
  80. cabe655b Merge PR #519 fix/purchased-gate-scope-integrated
  81. 9bc55ed9 docs(#184): add adversarial-verify artifact (CONFIRMED)
  82. 13283712 fix(#184): scope purchased-param gate exemption to marketplace route only
  83. ffd53d2c test(#184): RED tests for purchased-param gate-escape scope bug
  84. ed55d2e2 Merge PR #518 fix/reconcile-stripe-idempotency-key
  85. 88f32016 fix(mobile): reserve bottom-FAB clearance so avatar menu FAB stops overlapping card content
  86. d1c3df05 fix(#183): add deterministic Stripe Idempotency-Key to reconcile mint calls
  87. 1149c253 test(#183): RED tests for Stripe Idempotency-Key on reconcile mint calls
  88. 35e7017d Merge PR #517 feat/gate-all-pages — gratitude gate on ALL pages + fork-decision pairing
  89. f5c171d1 fix(router): update stale dev-auth-bypass tripwire test for #180 entry-gate refactor
  90. 60e1560b feat(router): gratitude gate on ALL pages + fork-decision pairing (GREEN, #180)
  91. 5fe54dc5 test(gate-all-pages): RED tests for entry-gate classification + gratitude/fork pairing
  92. 2ef353ed fix(#178): Stripe price Option A — server-authoritative persistence (adversarial-fixed) (#516)
  93. fa12d122 Merge PR #515 feat/ll-nav-strip
  94. b8db3b52 docs: add planning artifacts for #181 nav-strip (green/adversarial/testfix reports)
  95. a952c7e5 test(learning-lab): make nav-coverage tripwire and active-class tests genuine
  96. 01ec2edd feat(learning-lab): add persistent nav strip + fix back-button target (#181)
  97. 3bd65140 test(learning-lab): RED tests for #181 nav-strip coverage + back-button target
  98. eb953cc9 fix: remove Back to the gate link from Creator Studio greeting (#514)
  99. 2cac8ec9 feat(learning-lab): /learning-lab routes render standalone LearningLabLayout (#178) (#513)
  100. c655af87 Merge PR #512 integrate/gate-backstop-refix
  101. 690ad784 fix(router): close cold-load gratitude-gate backstop race via afterEach re-check
  102. 8ea26f0e Merge PR #510 fix/dev-magic-link-register-user-gap
  103. 955b787d test(e2e): fix STDB /sql response parsing + poll instead of flat wait
  104. 9326eb88 Merge PR #509 fix/dev-magic-link-register-user-gap
  105. 2e313401 Merge PR #508 learning-lab-nav-route-updates
  106. 6247ef3d fix(auth): drop redundant client-side MAGIC_LINK_ENABLED gate on magic-link fallback
  107. 1302b885 feat(learning-lab): Home at /learning-lab, catalog moved to /discover (#176), My Library onto shared shell (#177), sidenav collapsed to one Learning Lab link (#175)
  108. 15ef2aa0 fix(test): remove async vi.mock hoisting race in ListingDetailModal.newtab.spec.ts (#507)
  109. a7686366 Merge PR #506 integrate/gate-reactive-backstop
  110. c1e5167f Merge PR #505 fix/dev-magic-link-register-user-gap
  111. 2dd5f199 merge: integrate gate-reactive-backstop into staging-next
  112. fee2c66d fix(auth): register/reconcile dev-magic-link identity via migrate_identity fallback
  113. fc8fe1b8 fix(router): add reactive gratitude-gate backstop for cold /app bypass (GREEN)
  114. d80e93e4 test(router): RED tests for gratitude-gate reactive backstop (cold /app bypass)
  115. 00bdfaab Merge feat/router-404-catchall into staging-next
  116. 720b9660 fix(routing H2): add top-level 404 catch-all -> redirect / (audit H2)
  117. 0c46d776 Merge fix/marketplace-nav-redirect-learning-lab into staging-next
  118. 511336b2 Merge feat/routing-loop-fixes into staging-next
  119. 6f192800 fix(nav): redirect Marketplace sidenav link to Learning Lab front door
  120. 8d928d22 fix(routing H3): consume welcome ?redirect= + marketplace immunity
  121. 2079df7c fix(routing H1): fork-door lane choice completes onboarding step 4
  122. 60e28164 Merge feat/warm-threshold into staging-next
  123. cdb0fd3f test(warm-threshold): reconcile in-shell spec to D2 standalone reality
  124. 4302920d fix(warm-threshold): harden identity-split test + fix identity-agnostic idempotence
  125. 93790495 feat(warm-threshold): W1 /start standalone route + W2 idle chunk-prefetch (GREEN)
  126. 90df2eb7 test(warm-threshold): RED tests for W1 route-flatten + W2 idle chunk-prefetch
  127. fc3f727e Merge pull request #504 from braceyourself/merge-u5-docs
  128. c03c929f docs(u5): supersede locked standalone chrome direction + fix stale STDB-connect doc (Option A, Phase U5)
  129. 09ba294f Merge pull request #503 from braceyourself/merge-u4-forkdoor
  130. cec80463 feat(u4): fold fork-door + AppShell anon mode into shared shell (Option A, Phase U4)
  131. 744ae47a test(u4): RED tests for fork-door + AppShell anon-mode fold (Option A merge, Phase U4)
  132. 1eb6f147 fix(staging-ci): allowlist marketplace_listing_id_counter as write-on-first-create
  133. f29fdb32 fix(marketplace): never-reuse listing-id allocator (task #162, money-adjacent) (#500)
  134. 45c09d4d Merge pull request #502 (merge-u3-learning-lab) into staging-next
  135. 1fcc4690 feat(u3): fold Learning Lab Home + My Library into the shared AppShell (Option A, Phase U3)
  136. d1be8791 test(u3): RED tests for Learning Lab Home/Library-in-shell fold (Option A merge, Phase U3)
  137. b9b517f0 Merge pull request #499 (merge-u2-creator-studio) into staging-next
  138. 2c75b422 feat(u2): fold Creator Studio into the shared AppShell (Option A, Phase U2)
  139. 600e7beb test(u2): RED tests for Creator Studio-in-shell fold (Option A merge, Phase U2)
  140. 1d1190f2 Merge pull request #498 (fix/checkout-115-reland) into staging-next
  141. 515faae3 Reapply "merge: checkout->gate fix (MKT-115, onboardingPathGuard phantom-overlay + redirect-query fix) into staging-next"
  142. cf780783 fix(auth): dev-magic-link mint honors body.returnUrl, not just query ?return=1 (task 160) (#497)
  143. c895c52c Merge pull request #496 from braceyourself/merge-u1-helpers
  144. e204ef0e feat(u1): extract canEnterCreatorSide + laneHomePath SoT helpers
  145. 48755872 test(u1): RED tests for canEnterCreatorSide + laneRouting SoT helpers
  146. fe7ef30e Merge pull request #495 from braceyourself/feat/offer-featured-toggle
  147. 10fff995 feat(marketplace): admin-only featured toggle in offer editor (#157)
  148. 8881fe81 Merge pull request #494 (fix/task-161-refreshtoken-resilience) into staging-next
  149. 8d3e27d9 fix(auth): don't discard refresh token on transient network/server errors (task #161)
  150. 082919ec Revert "merge: checkout->gate fix (MKT-115, onboardingPathGuard phantom-overlay + redirect-query fix) into staging-next"
  151. ab4eb8af fix(offer-wizard): route publish() through the offline outbox instead of hard-blocking (task #159)
  152. 0426506a Merge pull request #493 from braceyourself/fix/reviews-l1-public-listing-wiring
  153. 32580d91 fix(reviews-l1): wire real reviews into the public Learning Lab listing detail page
  154. b03b83a8 chore(mkt-115): add reusable staging-freshness-check.sh preflight script
  155. 89d18b22 fix(epic): read snapshot origin from trigger column, not nonexistent source (task #158 / M1) (#492)
  156. 153dfe3f merge: checkout->gate fix (MKT-115, onboardingPathGuard phantom-overlay + redirect-query fix) into staging-next
  157. b6c579b5 test(mkt-115): flip checkout-return-guard-immunity it.todo placeholders to live assertions
  158. c3308b97 fix(mkt-115): checkout-return-gate onboarding-guard GREEN implementation
  159. ec2e7366 test(mkt-115): wait for register_user migration before cleanup deleteListing too
  160. bdac5098 test(mkt-115): retry the guard-decision navigation to avoid false-pass on data-not-ready wave-through
  161. af2b4d95 test(mkt-115): wait for register_user migration before calling createListing
  162. 97ab6e04 test(mkt-115): wait for STDB identity resolution before reading it in signInAndLand
  163. dab71bc9 test(mkt-115): repair E2E RED spec -- welcome_seen pre-seed, DML-blocked workaround, reducer-based seeding
  164. df7dbe37 test(mkt-115): RED tests for checkout-return-gate onboarding-guard fix
  165. 7b907dda fix(C1): seed joy_profile flag in both client and server default lists
  166. d2f0499e fix(marketplace): Creator Studio Edit no longer duplicates listings (#154)
  167. ae919f28 fix(offer-wizard): render category picker via cache-first useTable + fix STDB connect gap
  168. dc1b31cc fix(creator-studio): full-bleed dark background on root wrapper
  169. 645ea255 fix(reducers): graceful no-op for anonymous caller in lane/preference setters (#152)
  170. 7bab05b3 test(coach): mock fetch explicitly in community-aggregation describe block
  171. b27e5083 fix(fork-door): remove duplicate .cta span on active state, keep enter-btn
  172. 468b294e test(fork-door): lock in pointer-events guard for click-blocking layers above wedges
  173. c3c7d545 fix(ll-p4): graceful anon-caller return (no 530) + publish reviews immediately
  174. 3a73698e docs(ll-p4): GREEN completion checkpoint
  175. 7fff851b fix(ll-p4): correct E2E spec assertions for authoritative status resolution B
  176. 3e137b3f chore(ll-p4): regenerate STDB bindings + snapshot for submit_review + status column
  177. b1e915b6 feat(ll-p4): GREEN - submit_review reducer, status column, GET filter, ReviewsSection slot-in
  178. d25f310c fix(ll-p4): cast unpublished submit_review reducer through as-any so RED commit builds clean
  179. bd64143e test(34-ratings-reviews): RED - reducer helpers, GET endpoint, review components, E2E spec
  180. 1a5a199d wip: LL P4 RED - SubmitReviewForm + ReviewsSection components
  181. 786a5af0 wip: LL P4 RED - reducer-logic helpers + reviews GET endpoint
  182. 611dd6e7 fix(start): couple fork-door active-visual state to activeSide
  183. fcfef1ad feat(login-p1): GREEN - useDailyGratitude/useLanePersistence/useLastVisitedPage
  184. 71dde710 test(login-p1): RED - useDailyGratitude/useLanePersistence/useLastVisitedPage
  185. 7df06dc7 docs(money-loop-m4): checkpoint -- Integrate phase, staged for push to staging-next
  186. 043cd8a9 fix(money-loop-m4): supply refund_reason/refunded_at on shared purchase insert
  187. 06518ce5 feat(money-loop-m4): GREEN -- payout idempotency + refund skeleton
  188. c8f62735 test(money-loop-m4): RED -- payout idempotency + refund skeleton pins
  189. f207df17 fix(money-loop-m4): re-add blessed creator_payouts allowlist entry post-revert + checkpoint
  190. a8d74208 Revert "test(money-loop-m4): RED -- payout idempotency + refund skeleton pins"
  191. 19a65b86 Revert "feat(money-loop-m4): GREEN -- payout idempotency + refund skeleton"
  192. bff7c60a docs(money-loop-m4): checkpoint -- landed on staging-next as 5713be3c (FF, no rebase needed)
  193. 5713be3c feat(money-loop-m4): GREEN -- payout idempotency + refund skeleton
  194. ce5874b0 test(money-loop-m4): RED -- payout idempotency + refund skeleton pins
  195. f07be472 fix(money-loop-m3): creator_payouts RLS admin OR-clause is unpublishable -- drop to owner-only
  196. 906d139c docs(money-loop-m3): checkpoint - landed on staging-next as aa338211 (FF, no rebase needed)
  197. aa338211 fix(money-loop-m3): creator_payouts RLS admin branches must test :sender, not creator_identity
  198. ad7adef0 docs(money-loop-m3): mark GREEN checkpoint complete
  199. 944081e6 feat(money-loop-m3): GREEN - creator_payouts ledger + frozen fee + I4 invariant + per-creator RLS
  200. 6a3175f3 wip(money-loop-m3): checkpoint - GREEN impl + 4 M3 spec files passing (pre-full-suite)
  201. 4a405b8e test(money-loop-m3): RED for creator_payouts ledger schema + I4/RLS/identity-migration pins
  202. ba125d30 feat(money-loop-m2): GREEN - identity-migration extension + coverage meta-guard + Layer-B ownership key
  203. f9375746 test(money-loop-m2): add RED tests for identity-migration extension + Layer B ownership key
  204. 9868b3ae fix(money-loop-m1): close adversarial findings F1 (poison-claim) and F2 (webhook retry gate)
  205. a227b3e3 feat(money-loop-m1): GREEN - outcome-explicit record_purchase + pending_purchases
  206. 5cb818c1 test(money-loop-m1): add RED tests for outcome-explicit record_purchase (M1)
  207. 03ace566 test(onboarding): relax O-12 spec stale bug-symptom assertions to correct auto-initiate contract
  208. b8cf2151 fix(onboarding): O-12 auto-initiate fires reactively, not just from a one-shot guard check (GREEN)
  209. 96305067 test(onboarding): live E2E for O-12 auto-initiate (task #98)
  210. 9d7257e0 fix(security): GREEN - register_user fast-path no longer trusts args.email (task 87 remainder, P0)
  211. c6b7faea test(security): RED tests for register_user fast-path email-stamp admin takeover (task 87 remainder)
  212. 04a3a75e fix(learning-lab): remove mockup-artifact surface switcher and CTA from learner header
  213. d0fe6b1a test(learner-header): RED tests to remove mockup-gallery switcher and Join CTA
  214. 16da34ba Revert "merge: consolidation Increment 1 (/app -> lane-aware redirect) into staging-next"
  215. 6b2bc7a5 fix(119): GREEN - Offer Wizard price-step type-safe numeric handling
  216. cc257f9d test(119): RED repro for Offer Wizard price-step .trim() crash on real <input type=number> path
  217. 4022d59e feat(creator-nav): rebuild AppShell sidebar to Phase 31.5 mockup (GREEN)
  218. d96a90bc test(nav): add failing test suite for creator-side sidebar revamp (RED)
  219. 4f55d320 docs: add creator-side sidebar revamp spec (phase-31-5 mockup mapping)
  220. 4532e0a9 test(lane-c): convert PURCHASE_RECORDER_IDENTITIES it.todo tests to live tests
  221. aa8ed194 docs(lane-c): prep spec for purchase-recorder identity allowlist
  222. 1c6a7665 merge: consolidation Increment 1 (/app -> lane-aware redirect) into staging-next
  223. 4da517a4 feat(inc1): GREEN for /app -> lane-aware redirect (consolidation Increment 1)
  224. d2826273 test(inc1): RED for /app -> /creator-studio lane-redirect foundations
  225. 2c5958f3 merge: mockdata-wave1 library creator attribution (fix/library-creator-attribution) into staging-next
  226. e6307d47 fix(library): resolve real creator attribution on My Library cards (GREEN)
  227. 8e872c36 test(library): RED tests for real creator attribution on My Library cards
  228. 19503da9 Revert "test(119): RED for Offer Wizard (Option A) - route + component specs"
  229. 8644326e Revert "feat(119): Offer Wizard (Option A) - guided create flow for Creator Studio"
  230. f8110d2f Mock-data purge Wave 3: real experiment duration + durable joy_pairs seed
  231. 8e97c297 Merge origin/staging-next (offer-wizard) into staging-next-merge-tmp2
  232. b7e6024f fix(test): update stale LearningLabBrowseView reference pattern in liveCategories spec
  233. 7c4789ff feat(119): Offer Wizard (Option A) - guided create flow for Creator Studio
  234. 6865a26f test(119): RED for Offer Wizard (Option A) - route + component specs
  235. 3fba4d53 Merge fix/offline-first-view-sweep-a into staging-next
  236. 3bf7892b fix(offline-sweep-a): migrate wave A views off subscriptionReady view-blanking
  237. d910ebee test(offline-sweep-a): RED tests for wave A offline-first data-read gaps
  238. de6df67b merge: offline-first view sweep Wave B (fix/offline-first-view-sweep-b) into staging-next
  239. cb547902 fix(offline-sweep-b): migrate Wave B views to useDataStore's useTable (GREEN)
  240. 31374288 test(offline-sweep-b): RED tests for Wave B offline-first data-read gaps
  241. 2dbb0869 test(buildjourney): pin Wave 2 de-fabrication acceptance criteria per-component
  242. eb47a814 fix(buildjourney): defabricate Wave 2 dashboard widgets
  243. 5eb84bfd Merge feat/commerce-l5-receipt-download into staging-next
  244. fd7d1625 feat(commerce-l5): entitlement-gated download + receipt owned-state
  245. c15a9760 test(L5): RED entitlement-primary download gate + You-own-this receipt state
  246. a92373d0 test(onboarding): live staging E2E for reprompt-persistence fix
  247. 0019ae5c fix(onboarding): demographics Save must dismiss optimistically and persist across reload
  248. 11987c7a Merge feat/route-site-map-alignment into staging-next
  249. c7572234 feat(120): align Creator Studio route to site-map (/app/studio -> /creator-studio)
  250. 93d8d636 test(120): RED for route site-map alignment (Creator Studio path move)
  251. 6221757b Merge pull request #490 from braceyourself/fix/trialconfig-upsert-and-reducer-verify
  252. 3afc6b54 fix(admin-pairs): resolve real identities in admin_match_pair
  253. 1e225a95 fix(fork-door): make Enter CTA reachable by real mouse travel
  254. 8924991e fix(trial-config): upsert missing seeker tier_config row
  255. 365dd859 test(trial-config): RED for update_trial_config upsert bug (2-layer)
  256. 77d6954c merge: learner-side persistent header (feat/learner-persistent-header) into staging-next
  257. d06d6916 test(studio): fix CreatorStudioView back-to-gate sibling-contract check after #113
  258. 03ba8b40 feat(learning-lab): persistent learner-side header via LearningLabLayout.vue (#113)
  259. 30f294f7 test(learning-lab): RED tests for persistent learner-side header (#113)
  260. 7ab1ea2d merge: signin helper stale-default fix (fix/signin-helper-stale-default) into staging-next
  261. 0ac37133 fix(e2e): signInToStaging navigates directly to /app instead of relying on removed / auto-redirect
  262. afa7c05b merge: router unwanted /app redirect fix (fix/router-unwanted-app-redirect) into staging-next
  263. c413be3e fix(router): stop unwanted /app navigations (#105, #124)
  264. 4b010de1 merge: reducer positional-args batch fix (fix/reducer-positional-args-batch) into staging-next
  265. 324bf660 fix(reducers): pass single object argument to 10 misshaped reducer call sites
  266. 5aba4f76 test(router): RED tests for #105 root redirect and #124 tour self-navigation
  267. 797d5bec test: RED - 10 reducer call sites must send OBJECT shape, not positional args
  268. 004d51ed merge: O5 demographics write fix (fix/o5-demographics-write) into staging-next
  269. 121d995c fix: saveDemographics sends { roleType, timezone } object, not positional args
  270. 9596fa24 test: RED - saveDemographics must send { roleType, timezone } object, not positional args
  271. 4fa298c8 merge: auth session persistence fix into staging-next
  272. 71b08504 Merge pull request #489 from braceyourself/feat/commerce-l4-webhook-grant
  273. ba50c950 feat(commerce-l4): idempotent webhook purchase+entitlement grant, retire KV
  274. 3f0c3a79 test(commerce-l4): RED tests for STDB-based webhook idempotency, 7-arg record_purchase, mark-after-success ordering, KV retirement
  275. 793a073d fix: actively recover STDB connection on auth-error refresh success
  276. 6163909e test: RED tests for auth-session recovery completion (2-layer pattern)
  277. 6ebe6a08 fix: preserve app session on recoverable STDB auth-error
  278. 4fe7e1bb test: RED tests for auth-session-persistence fix (2-layer pattern)
  279. 024b87af merge: Learning Lab filter Option A (compact dual dropdown) into staging-next
  280. 316f9008 feat(learning-lab): filter Option A - compact dual dropdown
  281. e16916ad feat(commerce-l3): buy-flow login gate with shared sign-in panel (#488)
  282. b58a69f1 Merge pull request #487 from braceyourself/feat/creator-studio-sidenav
  283. 7a9cc212 feat(creator-studio): GREEN - sidenav matching locked mockup + lane-switch to gate
  284. 4ac49e11 test(creator-studio): RED - sidenav match + lane-switch-to-gate + Catalyst gate guard
  285. 9a7b2749 merge: O-5 setup modal + confirmed-store notification (feat/o5-setup-modal-notify) into staging-next
  286. d45f473a feat(o5): modal + confirmed-store notification for setup prompt
  287. 72d1b14d test(o5): 2-layer RED for modal + confirmed-store notification
  288. 96e8e519 Merge pull request #486 from braceyourself/feat/commerce-l2-stripe-customer
  289. ddd33ec1 feat(commerce-l2): stripe customer create/reuse + full checkout metadata
  290. b7867aae test(commerce-l2): RED tests for Stripe Customer + reconciliation metadata (commerce-l2-stripe-customer)
  291. eeb0c1a9 Merge pull request #485 from braceyourself/feat/commerce-l1-entitlement-fee-customerid
  292. 93736de0 fix(commerce-l1): entitlement idempotency guard used reference equality, not value equality
  293. 5124c8e5 feat(commerce-l1): grant entitlement, persist stripe customer id, real fee split, staging recorder identity
  294. 7e387050 test(marketplace): RED tests for lane L1 fee model, entitlement grant, stripe_customer_id (commerce-l1-entitlement-fee-customerid)
  295. 561a94a3 merge: listing category slug-source-of-truth fix
  296. 6971804a fix: source listing category from live marketplace_categories, not hardcoded display names
  297. 4820f8a9 test: RED for listing category slug-source-of-truth fix
  298. 0371f4b9 Merge pull request #484 from braceyourself/feat/prod-magic-link-privatetable-fix
  299. 230d0261 GREEN: verify-magic-link.js now uses verify_magic_link_nonce reducer instead of raw SQL on private table
  300. b5fbc67c RED: verify-magic-link.js prod exchange must use a reducer, not raw SQL on a private table
  301. ad1efcb9 Merge pull request #483 from braceyourself/feat/learninglab-header-logo-image-fill
  302. b1e2734c feat(learning-lab): GREEN - real JoyOS mark in header, images always fill
  303. 94100f18 test(learning-lab): RED - header monogram must be real JoyOS mark, images must always fill
  304. 73be5c6a Merge pull request #481 from braceyourself/feat/forkdoor-cta-active-only
  305. 52585d83 feat(fork-door): GREEN hover-activates-CTA (desktop hover = mobile tap)
  306. 8860b9fe test(fork-door): RED for hover-activates-CTA (desktop hover = mobile tap)
  307. 78c14e67 Merge pull request #480 from braceyourself/feat/gratitude-wall-lazyload
  308. 0475c73e fix(gratitude-wall): lazy/incremental loading + row layout
  309. fc47bb70 test(wall): RED tests for gratitude wall lazy-load + row layout (task #109)
  310. 808cf55e fix(stdb): register magic_link_exchange_results in the schema table registry (#479)
  311. 2fa1d8a8 Merge pull request #478 from braceyourself/chore/revamp-sync-stop-hook
  312. ace3ceb4 fix(auth): staging dev-login exchange 401s because magic_link_nonces is private (task #97) (#477)
  313. 7957b515 wire revamp-sync Stop hook into settings.json
  314. 452a8c48 Merge pull request #414 from braceyourself/hotfix/kristin-joyos-email-admin
  315. bb7500ef chore: add kristin@joyos.global to ADMIN_EMAILS allowlist
  316. 8f99b25b fix(marketplace): seed demo listings with curated category strings (#107) (#476)
  317. ff390c8d fix(onboarding-o5): clarify role/timezone prompt copy (#106) (#475)
  318. 1d544fbe fix(onboarding): O-12 waits for feature_flags subscription before evaluating kill-switch (#474)
  319. cefbdd80 Merge pull request #471 from braceyourself/feat/marketplace-live-categories-v2
  320. f3ffc80f GREEN: marketplace categoryRows sourced from live marketplace_categories
  321. dd48da50 RED: marketplace categoryRows derives from live marketplace_categories table
  322. 8fb7d083 O-12: auto-initiate onboarding for any not-yet-initiated user (#470)
  323. a3f32129 LL P3: My Library (purchased items + fulfillment) (#469)
  324. 2947e26f GREEN: LL P2 personalized Learning Lab Home (locked Inner tab)
  325. 17fe93e9 RED: LL P2 personalized Learning Lab Home (locked Inner tab)
  326. 34cfd28c fix(onboarding): wire isFlagEnabled to O-11 rollout-percentage gate (#467)
  327. dad0819a Onboarding O-11: admin funnel + progressive rollout gate (#466)
  328. a35c4b13 Merge pull request #465 from braceyourself/feat/ll-detail-match
  329. bae8a3c7 feat(learning-lab): GREEN for Offer Detail P1b (content-preview, related rail, reviews slot)
  330. 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)