2.12.0
Released
Features
Quest Jam examples now recur. A template describes a Jam and its rhythm, and each cycle is minted as its own row, so the weekly and monthly examples roll forward indefinitely and every run keeps its own participants and leaderboard. The index is populated between runs too: a Jam with gaps between cycles shows its next one as upcoming rather than showing nothing. (#531)
Added a public Terms of Service page at
/terms, linked from the shared site footer (so it appears on the landing page and every in-app page), from the signup form as the acceptance users agree to when they create an account, and from the pricing page's support fine print. It covers accounts, acceptable use, content ownership, the limits of AI output, subscriptions and refunds, liability, and Ontario as the governing law. (#530)
Fixes
The Quest Jams index is no longer empty on the live site. The three example Jams added in #517 were written into
supabase/seed.sql, whichsupabase db push --include-seedrecords the hash of without executing once the project knows the path — so they had never existed in production, and the page had shown its empty state since the feature shipped. (#531)
Technical changes· 7 entries for database, tooling, CI, tests and docs
Database
Added
quest_jam_templatesandensure_quest_jam_cycles(), which mints the current and next cycle of every active template. Minting is idempotent under concurrent callers, refuses to write a window that has already closed, and rejects a template whose cycles would overlap. Retiring a template leaves the Jams it created intact. (#531)
CI/CD
The Playwright job no longer runs as a matrix over
NEXT_PUBLIC_FEATURE_ONBOARDING_WIZARD. With the flag gone there is a single behaviour to exercise, so E2E runs once per CI run rather than twice, and its failure artifact is a singleplaywright-reportagain. (#533)Both Lighthouse workflows now audit
/terms. It is linked from the shared footer on every page, so a regression there is site-wide; measured 99/100/100/100 against a production build, on par with/privacy. The test that pins the audit path list covers it. (#530)The Supabase workflow now fails a pull request that changes what
seed.sqlinserts without shipping a migration alongside it. Seeded data that production needed has been lost this way three times; the rule was written in a comment and is now enforced. Comment and formatting edits to the file are ignored. (#531)
Tests
Dropped the onboarding cases that only asserted flag-off behaviour, in the E2E suite and in the middleware, callback, auth-action, and query unit tests. The two redirect-safety cases that had relied on the flag being off — an off-site
nextat/auth/callbackand at login — now pin an already-onboarded user, so they still assert the rejected destination rather than the wizard hand-off. (#533)Replaced the Quest Jam seed test, which asserted three fixed rows and stayed green for weeks while the production page was empty because it was testing the seed rather than the deployment. It now runs after migrations alone — the same guard #505 put on the public quest catalog — and asserts the property that matters: every active template has a live or upcoming Jam on the index. (#531)
Refactors
Removed the
NEXT_PUBLIC_FEATURE_ONBOARDING_WIZARDfeature flag: the first-run onboarding wizard is now unconditional. Middleware, the post-auth redirect resolver, and/onboardingitself decide purely on stored onboarding progress, and the variable is gone fromapps/web/src/lib/env.ts,.env.example,apps/web/Dockerfile,docker-compose.yml,turbo.json, and the Playwright web-server env allow-list. Users who already have acompleted_atstamp — which includes everyone backfilled when the table was created — are still never routed into it. (#533)