THE PLAN
A marketplace where members learn, experiment, and build, then sell what they create.
Recently shipped to staging-next · synced 2026-09-23 (delta through 66bb8334, RUN revamp-525005-1790203299)
74d4bccb): a request reaching the staging server by its local address was paired with the production database host, so the feature-switch list came back empty even though staging holds 34 switches. The staging database now always resolves to its own server, and when a database read is refused the endpoint answers “temporarily unavailable” instead of pretending there is nothing there (74d4bccb).f66f63b0): until the server has answered which features are on, a page now shows a small loading spinner (4613d373) instead of briefly flashing “Coming Soon” or the wrong content. The app remembers when that answer has arrived, and a failed answer counts as “everything off” (6ccbe189). The onboarding path now waits for the answer before redirecting anyone (56e236c6). Covered pages include Wins, Wall, Tasks, Speakers, Profile, Pairs, Member Intros, Library, Joy Circles, EPIC dashboard, Announcements, Explorer communities and the app frame (a2d58cfe, bf7e1104, 26af137d, 32fe0c6b and 11 more), with new tests for the frame, the communities page and the onboarding redirect (c738debc, f66f63b0). These are automatic in-progress snapshots on the staging machine: not yet reviewed or pushed.e85b3cee): once every table went private, the database engine refused the old per-row visibility rules, so the module could not be published anywhere. The 67 per-row rules were removed (d8edf298, e85b3cee). What a visitor may see is now decided only by the app’s endpoints, not by rules inside the database.ac155570): the sign-in check no longer writes its own database query; it asks the Users model for the member and their tier, so the "only a data model may ask the database" rule now passes for sign-in too. Tests now pass the database connection in the same way production does (ac155570).92a4ae20): a tightening of the rule that keeps pages and endpoints from reaching the database directly. The guard now also covers the middleware and contract layers, and fails the build if anything above the model layer calls the base model’s query functions itself (92a4ae20).908bf890): which features are switched on is now answered by an endpoint (9fc1e777) that can reach the database directly (8b84093a), with the database connection owned by the model layer rather than scattered around (6842c8b0), and the flags are fetched the first time something asks for them rather than the moment the page loads (908bf890, 71cf1210). Separately, the Creator Studio gate now trusts the membership tier the server resolved instead of one the browser supplied (856734c4), and the guard that keeps pages off the database was fixed so it actually tests the rule it claims to (215f8b7b). Smaller passes touched money formatting, a creator's own offers list, and the offer views (cb10da7c, e113d6cb, 3cfc17f9, 6c4f8f82, 6132441b).48a87a26): the biggest security change in this delta. All the platform's tables were closed off at the database level (93b9de18), so nothing reaches the data except through the app's own endpoints — and a signed-out visitor now reads public offers through one of those endpoints rather than by talking to the database. Along the way the client stopped subscribing to twenty-five tables nothing was reading (b70defde), two real leaks were closed — a member's contact details were arriving in every browser on the waitlist surface (4e2c9a8b) and buyer identity was leaking while the server trusted an email the browser claimed (01f8e51a) — and a creator can now only reuse images from offers they actually own (f7ca4201).0663d85d): structural, but it is what makes everything above possible. An offer now has a model (e7a76dce), a defined answer to what a creator must give us to name or save one (93b4d31c), two separate views — the offer as its creator sees it and as a stranger may (70efc0df) — and named actions for writing, reading, changing and taking one down (288bd378), plus listing the offers a creator made (b944923d). Who may create and own an offer is stated once, in one place (2b528f5b), and ownership is now proven by looking the offer up rather than believing the request (0663d85d, 2807d9e2).14abc309): the separation members will eventually feel as a faster, more reliable app. The Learning Lab browse page (2f18461d), the member-facing experiments catalog (eb4b5d58), the marketplace home card's offer count (2c68e14f), a creator's Stripe Connect standing (8814e31f), the orders list (f6d45d15) and release notes (d2234d37, 14abc309) all moved onto endpoints. A guard now blocks any component that tries to reach the database directly (4b655e3a).d53ee104): a real commerce safeguard. The price a member is charged is read from the stored tier row rather than from a number written into the code (06fe4002), and a guard makes it a build failure for a price to come from anywhere else (d53ee104). The Creator Studio gate and the founding-member badge became enforced rules in the same pass (23361bd4).c4b64c67): removes a whole class of "it worked locally" failure. The deployable functions directory is now produced from the declared endpoints (c4b64c67), the generated wrappers ship as JavaScript so the hosting platform can run them (f882d6b7), each request gets its own database connection instead of sharing one (d2542f17), and who is calling is taken from the request itself rather than trusted from the browser (36504075). A new test makes a real HTTP request to a deployed route to prove it (3bf0e9c0).ac791e35): a large, member-invisible tidy-up. The Creator Studio pages — offers, orders, communities, bundles, onboarding, gratitude wall, the studio home — each folded into their own route file (e000e985, e5605eb4, 8446b727, 5567bad2, 3fcdb5ee, 53dc0e04, 45779375), as did the Learning Lab pages (f9015a54, e33c7c11, 2e7dbb13) and the whole admin section including its experiments, tour and storage editors (ac791e35, f2767996, 12c2a6ae, 2bef1a26). The duplicate offer-create route was dropped and one offer builder now serves both the new and edit routes (3ca6cf71, 421c0c85). An unreachable marketplace admin listings page was deleted outright (52ac1d4b).4a19a8a9): the guards now have teeth in the build (4fa51a2c), every guard blocks and together they cover the whole old architecture (5e21e360), tests all moved out of the source tree into tests/ (82e2570e, and a run of follow-up moves), and only the new architecture suite runs (4a19a8a9). The short-lived releases endpoint was removed again once its readers moved (48a87a26).e2c8dba8): structural work, no member-visible change. Until now a page's access rules were scattered — some in hand-written route metadata, some in separate guard checks. A route can now declare in a single line who must be signed in to reach it and which permission check applies (c7c054b0), with the sign-in requirement and the Creator Studio permission check rewritten to sit on that shared footing (ff4aa5e1, 98dfe276). One guard now runs a page's requirements and then its permission check in order (f7780bb1), installed after the onboarding steps so a member still finishes onboarding first (d6fc3e58). The creator payouts page is the first converted to the new form (a01bece7), and a new test makes it impossible for a page to declare its rules both ways at once (7bf13cce, e2c8dba8). Work-in-progress checkpoints on the payouts page, the Studio placeholder test and the migration notes also landed (a419fd5d, 12d2cf88, 2e250ad3, ff3ef0b9).eb8aeb8f): structural work in progress, no member-visible change. The Creator Studio payouts page moved into its Views home and the "coming soon" placeholder it shared with the other unbuilt Studio pages was reclassified as a section component rather than a page of its own (eb8aeb8f). A new guard test that each view holds its own page, and the running notes tracking which pages have moved so far, were both checkpointed while the migration is mid-flight (b26189ac, 3ad7e502, b1f196a5).37dab5a5): structural work, no member-visible change. All 32 route files that previously lived in src/pages now live in src/Views, the layer folder the architecture standard says routes belong in, with the build config updated to look there (37dab5a5). Every route the member uses — the landing and login pages, the learning lab and its discover/library/accelerator pages, the explorer and communities pages, the whole creator studio including offers, orders, payouts, onboarding and settings, and the terms and privacy pages — moved as a pure rename, so nothing about what any of them does changed. The request pipeline added alongside the layers also got its supporting pieces: the middleware, request and resource contracts it passes through were fleshed out and the pipeline itself reworked to match (86e8e4cc).2045347b): structural work, no member-visible change yet. The seven layer folders a future page will be built out of — Actions, Contracts, Database, Functions, Models, Policies, Views — now exist in the codebase, and five automated guards keep them honest (9f29b74a, merged 478a964d): one restricts which layers may import which, one forbids any layer folder that is not on the approved list, two require every Action and Policy to be a single exported function sitting next to its own test, and one requires each domain type in Models to say in one line what it is. A shared request pipeline was added alongside them with its own test suite (b51ff4f7, 2045347b), and the project's own working rules were extended to say that the code in these layers has to explain itself through naming rather than through comments (27816213).0ff00885): test housekeeping only, no product code and nothing a member sees. The My Offers, Offer Builder, Communities, Offer Wizard and remaining single-page Studio tests were moved and merged into the shared tests/ directory 86ece549 92382b66 8b4c2a66, and the end-to-end setup-card note now points at the merged file rather than the old path 0ff00885.46069279): housekeeping only, no product code and nothing a member sees. Every Vite helper that had accumulated at the repository root moved into config/ — the filesystem-deny, manual-chunks, nested-checkout-deny, test, version and watch-whitelist plugins (5ca2a32a, 0ecc9854, 5d5cda68, 01842d8c, 4f242de8, feca59f9, consolidated by 3d5fedd7). The five test-setup shims — global isolation, the jsdom canvas/fetch stub, the fetch-once reset, and the drag-event and confirm polyfills — moved into tests/setup/ (6d51d51e, 4b432e56, 18b26754, 18d9dd07, 6a7590f8). The marketplace download scope note, which four tests read at runtime, moved out of a dotfile at the root into docs/marketplace-download-scope.md with its readers updated to follow (5a895cf7, 46069279). Leftover verification evidence, scratch directories and files under the retired .worktrees serving path were untracked and removed (cceac817, 847b1325), and fourteen checkpoint and notes documents were archived into .planning/finished with two restored after live tests proved they were still in use (ce5dce9c–5a482dec, 96396f87, 671b1625). Plan summaries for phases 40-01 and 40-02 also landed (057bbae7, 9e1467ba).3a5e0a3a): planning-only delta, no product code. Three plans written for the next phase of the hexagonal-architecture work landed in the previous sync. 40-01 proves the guards can actually fail — the empty-tree assertions that currently pass vacuously are de-brittled so a real violation is what turns them red (2365c5ae). 40-02 promotes the guards into a blocking CI job with a seeded-violation proof run and a legible failure message, and carries its own threat model and acceptance criteria (7f3d83d0, 84ed95f8). 40-03 scopes the remaining legacy debt and closes both open architecture forks (b9ed8dfc), moved to wave 3 so it stops overlapping 40-02 on the ownership manifest (ba394c36, 29fed1d0). ROADMAP finalized with the three-plan list (3a5e0a3a).5cdd2ef0): the architecture standard adopted in the previous sync is now actually on the branch. Seven layer folders under src/ — Actions/, Contracts/, Database/, Functions/, Models/, Policies/, Views/ — are scaffolded and held in place by five guard tests in tests/guards/: allowed-layers (only declared layers may exist), hex-layer-import-restriction (no imports across a forbidden boundary), actions-policies-colocated-test and actions-policies-single-export (every action and policy has a co-located test and exactly one export), and models-doc-comment (every model carries a doc comment). eslint.config.js gains the matching import-restriction rules and vite.config.ts wires tests/ into vitest so the guards run. Net effect across the delta: 16 files, ~1,790 insertions (8a81a824 tests first, 084917e0 implementation, d37984a6 final reapply, 5cdd2ef0 merge). The delta also contains sixteen revert/reapply commits of this same change — branch churn while the guards were stabilized, not sixteen separate pieces of work.src/ scaffold plus five build-failing guards (delta through 77895014): the codebase gains an explicit architecture standard and the structure to hold it. New top-level layers under src/ — Actions/, Contracts/, Database/, Functions/, Models/, Policies/, Views/ — are scaffolded and pinned by five new guard tests in tests/guards/: allowed-layers.guard.test.ts (only declared layers may exist), hex-layer-import-restriction.guard.test.ts (a layer cannot import across a forbidden boundary), actions-policies-colocated-test.guard.test.ts and actions-policies-single-export.guard.test.ts (every action/policy has a co-located test and exactly one export), and models-doc-comment.guard.test.ts (every model carries a doc comment). eslint.config.js, vite.config.ts and the package manifest updated to match. The standard itself and its running review log live in .planning/ARCHITECTURE-STANDARD.md and ARCHITECTURE-STANDARD-REVIEW-LOG.md, iterated across the 200-commit delta.d60ed27c, 7b15fe54, 4368f08f): the pre-push hook now uses a pinned Docker build container instead of relying on ambient tooling. Three files touched: .githooks/pre-push (modified), tests/githooks/pre-push.build-command.test.sh and tests/githooks/pre-push.wiring.guard.test.sh (new, 189 insertions total) — verifying the gate fires correctly on drift.f9ef3085, dc6ac9d1, 81c8208a, 8e447d98, 55935276): the My Offers list was not showing offers saved via the API because the caller identity did not match the stored row identity. Fixed by aligning identity resolution in useImpersonation.ts (removed 15 lines) and MyOffersView.vue across two iterations, with dedicated test files.aa75274f, 322fa918, dcb43c9a): new server-side model layers functions/lib/models/FeatureFlags.js (25 lines) and functions/lib/models/MarketplacePurchases.js (29 lines) added, plus dedicated test files for both.84247373, #974, #962, #871): three small fixes landed on top of the guest-flag fix above. A missing migration for the new attention_signals table had been failing every Staging Publish & Deploy run since it merged — declared and closed (84247373, #974). The creator-studio router regression guard was updated to match the 2026-08-28 file-based routing migration instead of asserting stale literal path/component text (50fc3adb, #962). REQ-052 recorded: staging merge conflicts are resolved, not blocked, plus a fix ensuring API failures caught by a view still auto-report (6122b19c, #871).ba2eed1a, #831): the anonymous connect path never subscribed to feature_flags, so a signed-out visitor evaluated every guest-gated flag as closed regardless of its database row. Fix: a narrow anonGuestFlagsQuery() subscribes only the GUEST_READABLE_FLAG_KEYS allowlist on the anonymous connection (new standalone subscription builder in useSpacetime.ts, allowlist in tableWaves.ts), with a new guest-flag-readability.guard.test.ts (185 lines) proving a guest can actually read a guest-gated flag and the exhaustive anon-wave expectations updated to pin the scoped allowlist. Five drifted agent docs reviewed and re-stamped; five in-flight PR paths recorded as known-absent rather than stale claims.57d8bd7a, #812): a general registry any feature can raise a signal into — new attention_signals table plus raise_attention_signal/clear_attention_signal reducers — replaces per-feature red-dot patterns. A nav item shows a glowing dot when it, or any nested area beneath it, has an active signal; the dot clears only when the member actually lands on that area (never on click-through or a timer), and the underlying signal clears only when the owning feature resolves the real thing. Area paths derive from the route structure via pathToAreaPath, so no per-feature nav mapping is hardcoded. Gated behind the new attention_breadcrumbs flag at min_tier=admin (closed until granted). First intended consumer is commerce’s unfulfilled physical-goods orders signal (interface documented, not yet wired). Same PR lands the live-chat-spaces owner agent onto staging-next (it was invisible to dispatch) and creates the cohorts owner agent recording Ethan’s model verbatim (a subscription community containing offers, NOT an offer type) and flagging the live “Live Cohort” offer-picker option as an open contradiction. Bindings regenerated.ai_draft_json gets a real column (20ebb8e3, #929): the reducer treated an omitted or blank field as an instruction to clear it, so a routine edit could silently erase a listing’s inventory_count, url, file_key and featured flag. Pure merge logic extracted into reducer-logic.marketplace.ts and pinned by reducer-logic.update-listing-data-loss.test.ts. Migration 0020 appends ai_draft_json to marketplace_listings additively (with up/down tests); bindings and schema snapshot regenerated; the joyos-labs-stdb owner doc corrected and manifest re-stamped. Offer-builder-affecting: the builder now has a durable home for the AI draft it already produces.1170d27e, #803): a new isFoundingMemberBadge accessor and shared useFoundingMemberBadge composable now drive the Founding Hub gate, the Profile banner, the AppShell feedback-visibility check, the Creator Studio Founding Creator banner, the joy_circles override in useFeatureFlags.ts, and the founding-call reminder email eligibility (which now joins user_badges instead of filtering on tier='founder'). Per arch-map decision founder-tier-to-badge-migration-scope--chosen; a commerce handoff doc specs the badge-conditional 80/20 vs 90/10 revenue split for a later change; founding-hub doctrine corrected and its agent-currency re-stamped for the 11 reviewed pairs only.d8be84d2, #923): commerce verified creator_payouts can accrue but no code path moves a row to paid_out (three write sites, zero Stripe transfer calls, schema ready and unused); anonymous probe with negative controls shows zero rows on both production and staging, so nobody is currently owed. Eleven new registry entries (REQ-065..075) cover disbursement existence, who initiates, onboarding precondition, refund-window hold, minimum threshold, idempotency, failure visibility, the PayoutsView “coming soon” honesty gap, 1099-K scope, launch posture (flagged as contradicting the standing “payouts work. period.” ruling, owed to decisions.yaml), and a creator_payouts public:true security finding routed to its owners. Tier 3 (money), blocks on Ethan.73029d67, #811): new purchase_fulfillment_checklist table (creator-scoped RLS), toggle_fulfillment_checklist_item reducer, automatic seeding on purchases of a listing with kind === 'physical', and a physical_fulfillment_checklist feature flag (closed by default, catalyst ceiling). GET/POST /api/marketplace/fulfillment-checklist exposes pendingCount as the needs-attention signal; the Orders page renders a Needs Fulfillment panel with per-item checkboxes when the flag is on. Also ships a Stripe Connect payout/tax research plan for the co-founder call and a merge fix hoisting the listing/creator lookup above the payout-accrual try block so both paths can see it. Bindings and schema snapshot regenerated.18a6ec21, #883, REQ-052): users.gratitude_public_attribution_consent defaulted to true, submit_gratitude read it as !== false (so missing/null/undefined all counted as consent), and register_user wrote an explicit true into every new account. All three fail-open sites fixed: hasGratitudeAttributionConsent() is the single strict === true read path, the column defaults to false, registration writes false, and refusal is proven across missing, null, undefined and explicit false. A structural guard enumerates every consent column against every fail-open read shape and blocks new unchecked consent columns; it surfaced two more ?? true reads (ai_personalization_consent, community_aggregation_consent) carried as explicit reasoned exemptions pending Ethan’s decision. Existing rows deliberately not remediated. 258 tests green, guard sabotage-proven both ways.2901087b, #972): both purge steps ran with no spacetime login, so maincloud rejected the runner’s stale cached credential with 401 Invalid token. Now mirrors the spacetime login --token "$SPACETIME_TOKEN" pattern deploy.yml and staging.yml already use.70942a70, #946): Ethan: "this app should always redirect to login if we ever get an expired login." Measured live twice on staging: the redirect lived in AppShell.vue, a lazy async chunk, so the splash flipped sessionExpired before AppShell's watcher existed and nobody acted on it. New src/router/sessionExpiryRedirect.ts installs the listener at module scope with immediate: true, preserves the return path via ?redirect=, never loops on /login, hard-navigates if the push rejects, and is the single consumer of the signal. The last two swallowed 401s (AdminView admin-config, WeekBlock space-audit chat) now route through the session authority instead of rendering an empty panel or telling the member to refresh.c95a61df, #931): the SpacetimeDB socket must have no say in whether a member is signed in. The no-user-row grace timer, the immediate identity-mismatch check, and the stranded-identity watcher in useSpacetime.ts now log a diagnostic warning only; a missing users row over the socket is a data-loading condition, never an auth conclusion. Five existing test files flipped to assert authError stays null on these paths. The cookie/API auth layer the mandate expects is not built in this change.e738b7a4, #935): adds vue-sonner and useApiResponseToasts, a transient 2.5s success toast for mutating methods only (silent on GET) with repeated failures collapsing into one id-keyed toast carrying an occurrence count. isApiResponseNotificationsEnabled is the pure decision function for the api_response_notifications flag: admins always on, members off unless explicitly opted in, and the single point any server-side check must call so enforcement never trusts a client boolean.cfc17ac3, #930): a text-selection drag that started inside a modal field and released over the backdrop fired a click targeted at the backdrop and closed the modal mid-typing (Ethan, live on staging: "click up handlers need to be changed to click down"). All 38 @click.self occurrences across 28 views switched to @mousedown.self, with a build-failing guard (modal-mousedown-dismiss.guard.test.ts) that refuses any new @click.self without a written allowlist reason, proven by sabotage both ways.80ec7fae, #888): the endpoint served 13 real cards anonymously while /explorer showed "coming soon" to every signed-out visitor, because the view read explorer_marketplace_public over a SpacetimeDB connection that anonymous browsers never open on that route, and all 15 unit tests mocked the flag true. The gate is now the endpoint's own feature_disabled refusal, still enforced server-side; the view loses its last database read per the frontend/backend separation rule. The flag mock now defaults to false, a source tripwire blocks any return of isFlagEnabled(, and a new server_enforced gateStyle is registered for flags with no client read.d3124e91, #892): implements Ethan's 2026-08-23 rule ("private, no exceptions" / "the storefront needs to use an api call to load public items"). list-listings.js migrated onto the shared public-marketplace-catalog.js policy so /learning-lab and /explorer cannot disagree about what is public; the old "never 5xx, return [] on error" shape replaced with three distinguishable states; new usePublicCatalog client seam reads the catalog over HTTP instead of the marketplace tables and never blocks on the SpacetimeDB connection; card allowlist widened by exactly one field (slug). This is the "ship the API first" prerequisite for locking the three marketplace tables private.4ae000ca #879, 003ce579 #837): guest-reachable-table-reads.guard.test.ts fails the build if any guest-reachable Explorer/Communities route acquires a direct table read or PUBLIC_TABLES grows (364 lines); staging-db-target-parity.test.ts fails the build when CI declarations disagree about the staging vs production database target, with build-only steps in pr-tests.yml/merge-on-green.yml exempted (386 lines).328743be #891, 8628aac0 #921): the requirements-registry id-preservation guard was wired to no workflow and its vitest control compared the registry against itself, so a destructive merge passed CI — now a never-skipped pr-tests.yml step runs it against the PR base ref before build, with a discrimination control proving it fails on deletion (proven: REQ-052..059 flagged). The PR-CI watchdog no longer counts a completed startup_failure run (zero test signal, root-caused to the 2026-08-26 GitHub platform outage) as CI coverage.c165bc97, #922): new reducer-logic test asserts the actual creator payout amounts per tier — 80/20 standard, 90/10 founding (102 lines).75600cdf, #911): the /welcome final-step button said "Start with Gratitude" but its real destination (per REQ-062, the /start gate having been archived 2026-08-25) is Creator Studio or the member's remembered lane home. Renamed to "Enter the Lab". The gratitude wall still has no composer — left as a separate open decision for Ethan.10aa4e8f, #909): locked decision Q8 ("all pages require gratitude first. global rule.") recorded in decision-log.yaml for the first time, then marked superseded by Ethan's 2026-08-25 instruction to archive the gate (evidence: 2026-08-07 Kristin call, 2026-08-25 decision D4). Two questions it raised are logged open, not settled: gratitude-requirement opt-in level (community vs cohort) and the creator-access-gate interface.e533da3d #896, cebbd88a #881): CLAUDE.md gains a verified account of how feature flags actually work (a flag is a database row; five surfaces must agree; two stale recipe steps corrected; three open items named, including feature_flags being public against the every-table-private rule). Separately records that the staging serving worktree silently stashes hand-edits via the tunnel watchdog's dev-up --force path, adds hard rule 6.12 to the agent doctrine, and pins it in doctrine-check.sh.fbcd12e6): the first slice of the frontend/database separation contract on the server side. Adds functions/lib/models/Model.js (CRUD over SpacetimeDB with auto-escaping and write-failure surfacing), User.js over the users table, MarketplaceListings.js with an ownership gate, a declarative validation contract (functions/lib/validation/contract.js), a shared request-context helper, an API exception hierarchy (errors.js) and a withApi middleware mapping those exceptions to HTTP statuses. save-offer-draft is the first endpoint rewritten onto the layer (159 lines changed, 112 removed). Tests: unit tests for every piece, a no-SQL-in-endpoints source-shape guard, and a live curl e2e of the deployed save endpoint — 1,623 lines across 17 files (2e78e8e7 tests, 552f750b impl, fbcd12e6 integrate; task 50ac1145).34d78133, #800): all three landing mockup directions (Feed, Exchange, Wall) no longer diagnose the reader ("most people have never felt it"); every story/testimonial card and showcase credit now carries a visible ILLUSTRATIVE badge plus a banner stating these are examples, not real members. Copy-only, dev-only mockup routes.c2501d91, #788): a git reference-transaction hook now blocks ref mutations (checkout/reset/branch moves) inside the shared staging-next serving worktree, with a test suite proving the block.8d97bd0f, #786): adds the receipt-format spec, a deny-by-default gate script and sabotage tests so a promotion cannot proceed without real e2e evidence. Bundled in the same PR: a btree index on feedback_message.feedback_id (migration 0013) fixing the admin subscription wave that had been silently dark since the 2026-08-01 RLS fix, regenerated bindings, and doc cleanup retiring per-PR-preview language.0b8ce7ca): a creator whose account has more than one SpacetimeDB identity (e.g. after a Google token refresh) could save an offer via the API and not see it in Creator Studio → My Offers, because the list filtered on the current identity only. Fix: new GET /api/marketplace/my-identities endpoint (auth-gated, returns every identity on the caller's users rows), a useMyIdentities composable fetched once per session, and MyOffersView.vue now matches the union of known identities. Tests: endpoint tests (success / missing token / garbage token), save-offer-draft test asserting the email-derived creator identity on the saved row, multi-identity component tests, a guard test pinning set-membership filtering, and a cross-identity Playwright e2e with screenshots — 690 lines across 8 files (cbf84393 tests, f1431d5a impl, 0b8ce7ca integrate).c4baf08a): follow-on cleanup for task bb726cf9 making the session-handling code self-explanatory — APP_TOKEN_KEY exported as a named constant, a hasStoredSession() helper added, and multi-paragraph comments cut down to single constraint lines (c4baf08a). No behaviour change.d6874075): root cause of the Creator Studio offer-save bug identified and the fix verified in tests (a7cb236a, d6874075), plus a new e2e regression spec test-offer-save.spec.js (22db0766)./creator-studio/offers/new: the standalone offer-builder entry point moved from /creator-studio/new to /creator-studio/offers/new across the router, typed-router, generated pages, and every view that linked to the old path — 17 autocommit commits (4332bbdd, 59dfab2f, a1742308, 7fa21917, 902806f4, 44a8b7a1, 73c02fde, a49b82c9, d49f1b3f, 2fee254e, e8015096, 00376705, 49eaca95, 57ae5ce4, 8285ac83, 976d1478, 7d1d5ee0). Plus two noise commits skipped: b5e52787 (stray PostScript artifacts os/sys) and a675924f (local verify-results JSON output, never pushed to origin). The write-back commit from the blocked prior attempt also included: 1e3ac848 (d1c7e637 already on live page).offer-builder-write-e2e.test.ts refactored with 94 insertions net-positive (94 in, 255 out — large structural rewrite, not deletion; cbb179cd); studio-create-listing-roundtrip.spec.ts iterated twice to fix the write-flow assertion path (540e81a6, 77c478db); and playwright-staging-auth.mjs updated to reflect current auth flow (d1c7e637).debug-reducer.mjs + debug-reducer.test.mjs pair added to functions/api/ (5967a3cf); stdb-client.js edited twice for auth-path consistency (f4b5f2df, dadadce0); and dev-magic-link.js went through a refactor cycle (first pass: 39 deletions, 10 insertions; second pass: 39 insertions, 10 deletions — net structural improvement; adb32bd6, b954f7a3).offer-builder-write-e2e.test.ts Playwright spec iterated through 9 cycles to cover the full write-to-catalog path (691a5b59, cedc6b31, 32c7de82, c50641ba, f3f364a6, c9f294a0, 808650b2, ddcdecd0, 631e4d9d); the save-offer-draft.js endpoint edited twice to fix the write path (d32ba3fe, af1e621a); and the debug-reducer.test.mjs test added to the functions directory (b2a000dd).docs/plans/offer-builder-fix/02-architecture.md committed as the Gate 2 draft, laying out the API-first architecture for the create-offer path — code already written and E2E-tested per the plan; the remaining work is deploy + live E2E verification (5a33998b). Plan lives in docs/ only..planning/index.html updated (1c7ee668).fc7145b3 — 75 commits not previously summarized: the local staging-next branch had run ahead of the most recent write-back; this run captured the missing 75 product commits into 5 themed clusters below (ff05518c–4284738c).functions/lib/stdb-client.js simplified to authenticate via the SPACETIME_TOKEN env var alone (5ee0b113); the client-side JWT-signing path is fully removed from the auth flow, with a .gitignore update for the dropped creds file (c0654304, 80aec2bc, c4f33f30); src/lib/apiError.ts got a JSON.stringify regression that was reverted (cae01a03, ba22fb20); and the connection-architecture + new-endpoint-workflow docs landed in .claude/ to make the new auth shape the single source of truth (619bb30e).list-my-offers.js auto-committed after auth migration (9137d133); the stale list-my-offers.test.ts was deleted in favor of the JS+source-grep split (15901252); save-offer-draft.test.ts and list-my-offers.test.ts regenerated (725810c5); and archive-offer.test.ts/restore-offer.test.ts added to cover the full CRUD lifecycle (ebd76715).src/models/Listing.ts iterated to expand schema coverage; the schema-complete test suite now covers 17/32 columns (slug), 16/32 (request_id), 15/32 (inventory_count), 14/32 (currency) as plan status updates rolled in; new tests added and the Listing model adjusted to match (103a6d88, 106dfe0d, 14120054, 5cf10b20, 60ff3bb8, 45d33ba8, 938b3b1d, c0b5100b, a60e9b88, 748bf4cb, f2f0d9d1, e8d54394, bf6d4ba4, db89807d). BaseModel.test.ts is now in the schema-complete sweep as well.scripts/dev.sh auto-committed three times during the EACCES / WRANGLER_HOME / HOME-override hardening sequence (c5e0d6bf, 58f93709, 3c0bfd90); docs/plans/offer-builder-api-first/00-status.md got three tracking edits as slices 7-12 closed (22dccdbd, 70bc4d96, 539ae959, b34d658d, c65d348e); the Slice 7 cont. status rollups mark slug, request_id, inventory_count, currency DONE; .claude/SKILL.md updated (9fbeed03); the new src/router/creator-studio-file-based-moves.test.ts mirrors a route-table move (151f746c); and a src/pages/zz-sabotage-probe.vue/new.vue pair recorded intent (030f4134, b7722788, 3376a305).ecbc409d through 4284738c); a PROBE-perm-owner-20260830.txt intent file plus a create(tmp-create-mode-string-boolean-probe.txt) created via the edit-test tool (840224c0, f8043455); their follow-up cleanup commits removed both probe files (42b30907, 240d2744); a stray zz-sabotage-probe.vue / create-mode probe pair created then removed (b7722788); and root CLAUDE.md rolled (ff05518c, e4ab837c). These are scaffolding artefacts, not product work.01-product.md trimmed with minor edits (4 insertions, 12 deletions) and a new 02-architecture.md committed (69 lines) as the next draft gate; 00-status.md also updated (16 insertions) — all part of the ongoing Gate 1 (Product) iteration within the offer-builder-fix plan (7a504eb6, 4797b90e, 5af14250). Plan lives in docs/ only — no app code touched.66bb8334): a third pass on the land-on-arrival workflow makes the staging publish-and-deploy workflow start when the "Land builder pull request" workflow finishes successfully, not only on a direct push to staging-next, and lets both it and the "CI is red" reporter be started by hand. Caution for whoever picks this up next: the committed YAML declares workflow_dispatch twice under on: and wraps the job conditions in a literal (>-) token, so the staging workflow may not parse until a follow-up cleans it. This landed on the GitHub copy of staging-next only; the locally served checkout has not taken it. Nothing member-facing changed.d111e830, work 752e353c): a new GitHub workflow squash-merges any non-draft pull request labelled builder into staging-next the moment it opens or updates, with no check gates; if the branch is behind it rebases and retries once, and a real conflict gets a comment asking for a manual rebase instead of a failed run. CI runs after the merge, never before it, so it cannot block a landing. When the staging publish workflow fails, a second workflow opens or updates a single issue titled "CI is red on main" labelled ci-red for the main session to hand to a builder. The follow-up commit moved the land job onto the AS3 runner and switched rebase-merge to squash-merge. The project CLAUDE.md gained a Merging section stating these rules. Nothing member-facing changed.478a964d, work 9f29b74a): seven empty top-level layer folders now exist under src/ (Models, Actions, Policies, Contracts, Functions, Database, Views), and five guard tests fail the build when code breaks the layer rules: only the allowed layer folders may exist; each Action or Policy file exports exactly one thing and has its test beside it; every Model type carries a one-line doc comment; and an ESLint rule stops Models, Actions and Policies from importing Functions, Database, Views or the database bindings. No real Model, Action or Policy content is authored yet (work order 001). This landed on the GitHub copy of staging-next through a merged pull request and is not yet on the locally served checkout.21d37312, reverting b2b789a0): the written record of the launch payout answers described in the entry below was taken back out. The direction is that a decision should live in the code and the tests that enforce it, not in a separate document. The payout ledger itself is unchanged, and nothing member-facing moved. The answers should be read as the current intent until the code that carries them lands.4c5f8928, merged 4e30efc1, decisions b2b789a0): Creator Studio can now ask an endpoint for the payouts owed to the signed-in creator, and a test proves the ledger it returns is only ever the caller's own, never another creator's. Alongside it, the open payout questions got answers: Kristin approves each payout by hand for launch (written the same way a scheduler would later, so going automatic is a swap, not a rebuild); the platform keeps holding the money and adds a transfer step, so no payout can go out on an unfulfilled order; there will be a minimum payout, amount not yet set; and there are no Stripe Connect accounts yet, so building on Stripe's current account model directly. Still open: whose Stripe account payouts run through, what happens if a real sale lands before automatic payouts exist, and the minimum amount.a7c8cff7): Creator Studio used to open an offer for editing by subscribing to the whole listing-images table in the browser and filtering it down to that offer. The my-offers endpoint now returns each offer with its pictures already attached, in the order the creator set, and the Resource names them as a plain list of image addresses. The studio page drops its raw table subscription and simply reads the pictures off the offer it was handed. Tests cover the ordering, the empty case, and the field the browser receives. Same edit screen to the creator; one fewer table the browser reaches into.1e05b485–545528cf): the Learning Lab shelf was previously assembled in the browser by subscribing to four separate database tables and stitching the rows together. It now asks a single library endpoint for what the member owns and renders what comes back. The server side is built from the same small named pieces the orders slice established — an Action that lists what this member bought, a Model for the entitlement, a Model for the listing it points at, and a Resource that decides the exact fields sent to the browser (1e05b485, 124c1ac9). A composable wraps the call for the page (a7088952), and the shelf view itself loses 111 lines of table-stitching in exchange for 35 (545528cf). Same shelf to the member; one door instead of four.223e61ba–4d88bdba): opening a single offer used to require every published listing to arrive first. An offer can now be addressed by its slug — a small request type that validates the address (223e61ba, bffc8476) feeding a storefront endpoint that returns just that one offer (8d25a243, b764bb98). The offer page consumes it through its own composable (4d88bdba, cbe7aecb), and the offer view sheds 118 lines of catalog-wide plumbing (4f7f9ffd). The storefront endpoints also picked up their rate counter in the same pass (2f840bc0).38043537): badges join the same pattern — a Model, an Action that lists this member’s badges, a Resource naming the fields returned, and a real endpoint behind it. The founding-member badge composable and the feature-flag composable were rewired onto it, with the flag composable losing most of its hand-rolled fetching.4a547c73): the router guard previously reasoned about access from state that could be stale. It now derives the answer from the session in hand via a single named caller lookup, with tests covering the cases. Two authenticated reads that were quietly sending no token now carry one (b17cced5, 26f69046) — the kind of bug that reads as “empty page” rather than as an error.506808fe, 60e4249c, c09e7981): the bindings-drift guard treated zero generated table bindings as proof of a truncated file — but with every table private, zero is the correct answer, so it now only calls truncation when a public table genuinely exists. The contracts pipeline test was rewritten to match the pipeline it claims to test, and a debugging probe that an autocommit swept in was removed (85012bc4 in, c09e7981 out).e80cf2c0–3905d34a): the empty Models/Actions/Policies skeleton from the prior pass is now filled in along one real vertical slice — a creator seeing the orders placed against their own offers. A base Model lands first (e80cf2c0), owning the SQL and the value escaping in one place so no individual model hand-builds a query, with a guard that fails the build if a model reaches around it to the database directly. Orders, Users and Listings are then rewritten to read through that base (f1938de2), and an order gains a named domain type. On top of those sits the first real Action and its policies (dc943735): listing the orders for offers a creator owns, gated by a policy that a creator only sees their own orders and a second policy covering who may enter Creator Studio at all — each with its own test beside it, as the co-located-test guard requires. The orders endpoint is then assembled from five small named pieces rather than one handler (57cc4f52): a request that says what was asked for, a resource that says what is sent back, and the function that joins them. Finally the guards themselves are tightened from placeholders into rules that actually bite (3905d34a), with the import restrictions scoped to the new layout. Nothing member-facing changes yet — this is the shape the studio pages will be rebuilt on, proven end to end on one slice before the rest follows.c8dc6d23, 064bf2f8): the migration notes now record that the Offer Builder collects images, session dates, meeting links and block structure its save path silently throws away — those fields have nowhere to be stored, so they disappear the moment a creator reloads. The note is explicit that this is a code gap rather than a schema one: the images table already exists and simply is never written to. A second gap is opened alongside it: a creator can mark an offer as a bundle, but nothing anywhere records what is IN the bundle, so a bundle can be created empty. That one is deliberately deferred — the studio pages come first — with the open decisions written down (how a bundle holds its contents, and whether it prices itself or sums its parts). The guard that keeps each view holding its own page gained matching coverage in the same pass. Nothing member-facing changes here; this is the work of naming defects before building on top of them.a0ce8e71–9d1692d1): the Creator Studio source that had been split between src/views/creator-studio and src/views/studio now lives in a single src/views/studio folder (01b9772b), with the creator onboarding view and the creator setup card moved in first (a0ce8e71, eabea4ba). Their test suites followed into tests/views/studio — setup card (55ec7e6e), bundle builder (a9a06258), orders (5f59cd04), the coming-soon placeholder (2f25ed4f) and the studio gratitude wall (9d1692d1) — so every studio test sits in one place instead of beside the component. The setup-card guard was repointed at the new path and its merged tripwires restored (ac6115d7), keeping the guard honest rather than quietly passing against a file that had moved. No member-facing behaviour changes here: this is the studio getting one address before more is built on it.9f29b74a, merged 478a964d): the structural skeleton for the layered-architecture migration, per work order 001-drafting. Seven empty top-level folders land under src/ — Models, Actions, Policies, Contracts, Functions, Database, Views — each held open by a .gitkeep. What makes this more than a folder rename is the five build-failing guards that arrive with it under tests/guards/: an allowed-layers guard that refuses any new top-level folder outside the declared set, a single-export-per-file guard over Actions and Policies, a co-located-test guard requiring every Action and Policy to carry its own test beside it, a doc-comment guard over Models, and a regression guard over the import restrictions. A new flat eslint.config.js scopes core no-restricted-imports so Models, Actions and Policies cannot reach into Functions, Database, Views, module_bindings or spacetimedb — the dependency direction is now mechanically enforced rather than documented. ESLint and the TypeScript parser join devDependencies with a lint script, and vitest's test.include grows one entry so tests/** actually runs. Deliberately no real Model, Action or Policy content is authored in this commit: the rules exist before the code they will govern.7b15fe54, tests 4368f08f, task 0248206f): the pre-push hook's build step was always a host npm run build, so a developer's local toolchain rather than CI's pinned image decided whether a push was allowed. A new joyos_build_command function in .githooks/pre-push branches on a BUILD_GATE_IMAGE variable: when set, it emits a docker run against that pinned image with the repository mounted; when unset, it falls back to the unchanged host build, so nothing breaks for anyone who has not opted in. Eleven lines of hook change, covered by two tests written first — a pure test over the build-command branch and a guard test over the hook source itself.dc6ac9d1, integrated f9ef3085/81c8208a, task e4e2e458): a second pass at the multi-identity problem in Creator Studio → My Offers. An offer saved through the API is written under the creator's email-derived SpacetimeDB identity, which need not be the identity the browser is currently connected under, so the list could come back empty for a creator who had genuinely saved offers. MyOffersView.vue's filter now matches either identity rather than the connected one alone, and fifteen lines of now-redundant identity plumbing come out of useImpersonation.ts. Shipped with five new component cases in MyOffersView.spec.ts and a source-shape guard spec pinning the identity filter so a future edit cannot quietly narrow it back to a single match.322fa918, tests dcb43c9a, integrated aa75274f, task 446df5b2): the next slice of the frontend/database separation contract, built on the base Model shipped earlier in this delta series. functions/lib/models/FeatureFlags.js adds an isEnabled read, and MarketplacePurchases.js adds an ownedByBuyer query — both following the identity-handling and quoted-literal escaping conventions the existing MarketplaceListings model established, so the layer stays internally consistent as it grows. Tests were authored before the implementations, and the full functions suite including the no-raw-SQL-in-endpoints source guard runs green, which is what keeps endpoints from drifting back to hand-written queries.d3f5d237): adds the additive space_rooms table (migration 0014) holding per-room settings for entitlement-derived chat rooms scoped to an event, cohort, or creator-connect group — discoverable (default on), retention in days (default indefinite, per Ethan), and an ordered active → disabled → archived lifecycle with archived terminal and no hard delete. Membership stays fully derived from RSVPs and active entitlements; the table never stores manual grants. Also lands the live-chat-spaces owner agent onto staging-next.7b0e783e): per Ethan 2026-08-07, bundles return to the offer picker with their OWN interface (select existing published offerings and group them), not as a sixth wizard peer. Pure composition logic (price sum, validation, item rows, entitlement fanout rows) landed RED-first, followed by the bundle_items schema and migration, the set_bundle_items reducer, entitlement fanout on purchase, and a deny-by-default feature flag.eeab86d1): Ethan 2026-08-07, verbatim: “creators only, update documentation. explorers dont submit, UNLESS! the cohort owner determins it as a requirement for cohort participation.” Supersedes the older gate-on-all-pages-for-everyone rule. requiresGratitudeSubmission(tier, cohortRequiresGratitude) in src/lib/gratitudeAudience.ts is the single source of truth; explorers and guests are exempt by default, Creator tier and admins unchanged.purchase_fulfillment_checklist (PR #973, 147f96d7): PR #811 had added the table without a migration file, tripping the pre-publish schema-migration drift gate on every staging-next deploy since 73029d67. Closed the same way as the 0014/0019 gaps: a create-table migration declaring the delta that already shipped.62bd0cd8): a follow-on test commit for task bb726cf9 pinning the save-offer-draft endpoint contract against the LIVE staging surface — proves that a headerless (unauthenticated) save is answered with 401 Not signed in, locking in the expired-session refusal behaviour shipped in the preceding hardening cycle (62bd0cd8).7c332120): follow-on executor cycle for task bb726cf9 closing the expired-auth-token save gap on both save lanes — the save flow now surfaces a “sign in again” prompt on an expired-token save (cc912e33, integrated via bfe4477c), the auth gate was hoisted above the connected lane so an expired session refuses on both lanes (d58afcb3), the offline outbox lane is gated on an expired session so a dead sign-in can no longer falsely report “Saved to your account” (237139dd), and app/id tokens are resynced from localStorage before being trusted (7c332120).4a10dc38): the “cannot save an offer in the Offer Builder” bug (task bb726cf9, suspected API auth-token issue) went through a tests-then-impl executor cycle and was integrated via merge 4a10dc38 (test commit a6e1f664, implementation commit 22780b16, with persistence evidence files verified on disk).0b811e69): nine edit-test-tracked commits on the offer-builder surface, all authored by the automated edit-test tool, working in three paired files — src/composables/useOfferBuilderSync.ts iterated four times to refine the sync/identity/hydration behaviour (c6365e54, 492a27e3, 4822b91d, 5dc3c6ea); src/views/studio/OfferBuilderView.save-button.test.ts iterated four times to keep the save-button assertions in lockstep with the composable changes (7c6ab211, c575ba84, 5d8046cf, 0b811e69); and src/composables/useAuth.ts got a single edit-test pass (8060f509). The pattern is the one the revamp-plan edit-test doctrine has been accumulating — an edit, paired with its related-test file, committed together via the edit-test tool so the test proof and the implementation land in the same atomic record.docs/plans/offer-builder-fix/ plan lays out the problem and DoD for the “Create Offer → marketplace” gap (wizard stuck, save fails, offer never reaches the catalog). Plan introduces a 4-gate flow (Product → Architecture → Program Design → Slice plan) and an explicit Slice 1 tracer-bullet. Status file: 00-status.md shows Gate 1 in progress (Product drafted, revised per Ethan, no mockup folder needed), Gates 2-4 pending (28c7344a, d86077b5, d57d16e9, 97b39768, 28da4bc7, 9f588119). Plan lives in docs/ only — no app code touched..planning/mockup-authoring-tool/ directory started with SPEC.md (parameterized HTML components, event-driven, revisions log, 8-file scaffold: button.js, callout.js, card.js, event-bus.js, parameterized-view.js, revision-logger.js, structured-form.js; 2da9414d, 5ca89e5d, 3740e723, aca069d5, c2ed8285) and .planning/storyboard-dev/ iterated (main.js, package-lock.json; 4a7bcee4); root CLAUDE.md updated with local dev config context (b09a95ba). All in .planning/ only — no app routes or production surfaces touched..planning/session-board-storyboard.html (f1fec829, 288 lines); a chore scaffold of the v2 file at .planning/session-board-storyboard-v2.html (9b8d7575); and the full v2 HeroUI build out — .planning/storyboard-dev/index.html, package.json, src/main.js, vite.config.js — alongside a 760-line session-board-storyboard-v2.html edit (80e58adf). All three land in .planning/ only; no app routes or production surfaces touched.c5d56f07 docs(plans): add research-findings page for DEV_AUTH_BYPASS removal2c94cd0b, 95157e85, 79ab7534).9515c1ab); JWT_SECRET auto-provisioning script added to dev setup (c30eabf2, d55a6992, b51940d1, d1183e0d); offer-builder API-first plan status updated (8a31c0f1); setup-stdb-token.sh dev script added and iterated (e8ebb260); functions middleware / list-my-offers updated (fb8bb4c2); new-endpoint workflow doc added to CLAUDE.md index (93b35abd)SPACETIME_TOKEN environment variable, removing a code path that was producing tokens the client no longer needs to sign (c0654304, 80aec2bc). Companion: list-my-offers.js auto-synced to the new token shape (ef7b2758, 7baf332f); .gitignore updated (c4f33f30); and Purchase.ts/Purchase.test.ts model files auto-committed after the findByListingIds() addition (bd5a429b), with a matching purchase-status.js Pages Function and its source-grep test (f37d87df).requirements-wave skill shipped (53b5d099) for systematic requirement recording; .claude/SKILL.md updated to reflect the new skill and the joyos-requirements-wave skill (dba7c826, 5a48437e, e7af41d9); a goal-loop-offer-builder.md artifact captured the offer-builder API-first goals (0366d027, 97abba0b); and the src/editproof suite gained sum.ts (b943539d, c0ccfea3)./creator-studio/payouts (a1984d30), /creator-studio/gratitude and /creator-studio/communities (f2a5f128), /creator-studio/onboarding (b00966c8), and the offer-wizard entry route settled to one canonical name (d839c388); the learning-lab nested tree (layout + discover, library, listing, accelerator, settings) migrated to src/pages/learning-lab/ (39f4b664, files at c97e6085) with a Playwright live-browser pass verifying all 11 migrated routes (ad4d6bc2); a src/pages/CONVENTION.md records the page-folder co-location convention (a89bceb7); MyOffersView links repointed to /creator-studio/offers/new (1f89ab75); and an entry-gate guard extended into a full page-shape guard (7797697e), with a deterministic route-to-page migrator script for mechanical moves (e32560da).create-offer.js and useOfferBuilderSync (d656c585 to f7ec169b, ~13 commits), the CRUD round-trip completed via update-offer.js and save-offer-draft.js (f2f16f82 to b02a4a1d, ~22 commits), the Listing model column-add pass reached 29/32 columns (6f17a62a to 026ff24a, ~10 commits), the create_listing reducer + migration 0020 landed (3232f66c to fc6bbc5e, ~10 commits), Purchase.ts/Purchase.test.ts added with findByListingIds() (e85121b3, 7f0e1a4c), ListingView.ts/ListingView.test.ts added for the catalog view-model (a1b9d483, e74dd072), and list-listings.js re-wired through Listing.findActivePublic() (7157e307); the 00-status.md final cleanup recorded COLUMN GAP now 13/32 covered, 19 known-missing, plan fully complete.list-my-offers.js swapped from the dev-only requireAuthWithDevBypass path to prod-equivalent HMAC requireAuth + getCallerIdentity (4eb626c2, 5bb7615b), a body.filters pass-through added to narrow results server-side (eb5654e7), a .toLowerCase() on the email lookup fixed the casing-404 that prior auth was hiding; creator-stats.js and creator-orders.js fixed default imports for Purchase and ListingView (45bb3ee0, 5e9b72a4); a new functions/_middleware.js intercepts every /api/* request with wrapWithLogging, paired with functions/lib/api-logger.js for daily-rotated logs/api-requests.log.YYYY-MM-DD (50MB head-truncation, auth-header redaction, 2KB body preview); and a new purchase-status.js endpoint with its source-grep test covers the purchase state surface (f37d87df).edit-test tool (tracked edit-plus-related-test runs) rolled out across the codebase, including intent-recorded dead-file removal (8367611a for src/pages/terms/index.vue, b943539d, c0ccfea3); a live staging audit of Creator Studio refuted the suspected duplicate-page and dropped-route defects (12411da1); test-mirror migration mapping captured (c32a5c4b); and full-suite failure triage notes recorded (d76e6c71).scripts/dev.sh overridden HOME to a writable path and pinned WRANGLER_HOME (EACCES fix), scripts/run-tests.sh inherits HOME from dev.sh, the dev:wrangler script wires vite + wrangler pages dev through concurrently so SPA and Pages Functions start as one process group (934f7355 to 866d71f7, ~8 commits); .claude/hooks/dev-stack-status.sh now self-heals the tunnel + dev stack on every UserPrompt (e7e02b5c, 5f7ef23b); and the no-dev-auth-shipped.spec.ts source-grep guard prevents dev-only auth code from shipping to production (5a891e8a).requireAuthWithDevBypass error (e.g. "Invalid token signature", "Missing Authorization header") instead of the sanitized "not_signed_in". Production sanitization is preserved: with NODE_ENV=production, only the two known branches ("Token expired" -> "Token expired - please sign in again", everything else -> "not_signed_in") are exposed. Tied to NODE_ENV, not DEV_AUTH_BYPASS - the two are independent concepts. (b3960f7a)list-my-offers.js gained a body.filters pass-through so the client can narrow results server-side (eb5654e7), the casing guard on the email lookup tightened (41d81505), creator-stats.js fixed default imports for Purchase and ListingView (45bb3ee0), and creator-orders.js fixed the Purchase default import (5e9b72a4) — completing the creator-dashboard API trio.Listing.ts gained findActivePublic() for the public /learning-lab catalog (457790be), the new Purchase.ts/Purchase.test.ts model layer with findByListingIds() (e85121b3, 7f0e1a4c), the ListingView.ts/ListingView.test.ts view-model for the catalog (a1b9d483, e74dd072), list-listings.js re-wired through Listing.findActivePublic() (7157e307), and the source-grep + test companions for creator-orders and creator-stats (c3b317f6, c145b70a, fae8105b, 0583ee1d) — plus the 00-status close-out marking Slice 10 done and Slice 11 underway (cebdf9eb, 22dccdbd, 70bc4d96, c4c7d13e).vite.config.ts pinned to host 0.0.0.0 / port 8788 / allowedHosts:['joyos-lab.braceyourself.solutions'] so the cloudflared tunnel finally reaches the Vite dev server (was 502-ing before), scripts/dev.sh now overrides HOME to a writable dir and pins WRANGLER_HOME (EACCES fix), scripts/run-tests.sh inherits HOME from dev.sh, and the new concurrent dev:wrangler script wires vite + wrangler pages dev through concurrently so the SPA and Pages Functions start as one process group (934f7355, 5a591b56, e6fe22d8, 8c9b9c8b, 4c8ccd85, 9953163a, 41a4d602, 866d71f7).stdb-client.js now points the dev tunnel at the freshly-created joyos-labs-dev-v3 SpacetimeDB module (prior joyos-labs-dev has CREATE not UPDATE for that CLI token), with matching stdb-client.module-routing test updates and stdb-client.d.ts type companion — the dev tunnel now reaches a clean DB without a destructive re-seed (dc578397, 7a2d67cc, 594fee5b, 7321b4b0).useAuth mocks now include sessionExpired so router guards behave correctly (8a6ac7b1), an expired login redirects at the router level before any page renders (2e6c1e72b), the return path is captured from window.location rather than the unresolved router (23236ba5a), the STDB auth-error dead-end is closed (ac01386f), the stranded-auth reassurance UI is replaced with a real sign-in prompt (2e1821c2), unsolicited "We're on it" error modal removed from client-error reporting (e672ac92), and the outbox-failure toast removed while keeping the retry machinery intact (f3f71eb90); list-my-offers.js refactored to use middleware requireAuth + getCallerIdentity instead of the dev-only requireAuthWithDevBypass path (4eb626c2).2437c539), admin route guard and message notify gate hardened (6cd56a88, a9971ffcd), offer-builder draft scoped to the route so an edit save no longer writes an unrelated draft (e674f261), and the useSpacetime composable fully spec‑covered for anon‑connect, identity‑link, reconnect, and appReady (3ebda600, a7ec3e4e, 0cc9b215).6c7e9230); routing declared the test‑mirror convention and its guard as step 1 before any file moves (35aa96f2), then added the guard itself plus two rulings from Ethan (3f0e5152); dead component removed from the archived /start route (01ac1bb5); and four tests fixed that were still red from the earlier creator-studio and Learning Lab file‑based migrations (7dda640f).a51db7ba), guest-readable feature flags locked down (fa339c72), community records writer removed from legacy path (b9c1aea7), wallview fetch stub race condition fixed (6631dc97), PII exposure on RLS closure closed (0acf20ae, 2768d8bb, be8f4129, 3e73bb9f), and Stripe idempotency key reconciled to prevent double-charges (d1c3df05).c0d369de6), offer-builder edit assertion and stale bindings restored (8dbafd6cb), offer-builder preview goes full screen above the sidebar (1342f333), offer-builder edit save actually updates the listing being edited (6ffd839f), offer-builder offer-edit route registered in the unflagged-route allowlist (1eb038b6), offer-builder category selection opened to all creators, not just admins (0a0b9cea), and the onboarding restart target fixed for the new file-based routing (2b6cab2f).requireAuth + central _middleware request logging: functions/api/marketplace/list-my-offers.js swapped from requireAuthWithDevBypass to the prod-equivalent HMAC requireAuth (so the dev tunnel signs in the same way prod does, not via a dev-only bypass), the matching list-my-offers.source-grep.test.js updated to assert the new auth function, and a .toLowerCase() on the email lookup fixes the casing-404 the prior auth was hiding — companion list-my-offers.test.js now uses a getCallerIdentity mock instead of raw SQL. New single-file functions/_middleware.js intercepts every /api/* request with a wrapWithLogging envelope, paired with functions/lib/api-logger.js for daily-rotated logs/api-requests.log.YYYY-MM-DD files (50MB head-truncation, auth-header redaction, 2KB body preview) — all logging lives in the middleware, no per-endpoint edits. .claude/hooks/dev-stack-status.sh now self-heals the tunnel + dev stack on every UserPrompt (49248fc8, a9ba5550, 5f7ef23b, 08092ab9, 5bb7615b).Listing.ts, adding featured, currency, inventory_count, request_id, and slug to listingColumns (29/32 columns covered, 3 known-missing), the Listing.schema-complete guard updates, and a final plan-doc consolidation (6f17a62a, ef48e146, 3c22f883, 4e3df14a, 76d4762e, 5990a824, a68c8750).create_listing reducer-logic API-gates test companion, the matching api-create-listing-gates reducer edits in spacetimedb/src/index.ts, and the up/down migrations 0020_api_create_listing.up.ts/0020_api_create_listing.down.ts so the new offer-builder API-first entry point ships behind a versioned schema bump (3232f66c, ac9e73dd, f1337607, aab90a1b, 897e953d, 473fc7e3, 6092b603, 4f1947ed, 1d6023bb, fc6bbc5e).useOfferBuilderSync + create-offer Pages Function: the new functions/api/marketplace/create-offer.js endpoint, its create-offer.test.ts companion, the useOfferBuilderSync category/edit-save/identity refinements, the offer-identity and category test files, and a slice-5 source-grep update — wiring the front-end offer-builder composer to the new server-side create path (d656c585, 718aff26, f5f509ad, 0b8dbe42, 55c1d0dc, a2ef95b8, d40f0025, 76f9eacb, f7776d17, 5adc2e00, 7bf2df5e, 8f92e954, 09fcf889, f7ec169b).joyos-labs-dev-v3 module: stdb-client.js now points the dev tunnel at the freshly-created joyos-labs-dev-v3 SpacetimeDB module (the prior joyos-labs-dev has CREATE not UPDATE for that CLI token), with the matching stdb-client.module-routing test updates and a stdb-client.d.ts type companion — the dev tunnel now reaches a clean DB without a destructive re-seed (dc578397, 7a2d67cc, d5e8712f, a709a480, 594fee5b).useSyncStatus.offline-outranks-auth.test.ts and useSyncStatus.subscription-error.test.ts lock in that an offline state takes precedence over an auth-error result, and that a SpacetimeDB subscription error surfaces as its own state rather than being misread as a sign-out — prevents the dead-end where a transient socket blip looks like a stranded-auth failure (1cb7fc72, a9063bc1).00-status.md final cleanup (COLUMN GAP now 13/32 covered, 19 known-missing, plan fully complete), the Slice 3b + Slice 7 close-out, plus the corresponding 00-status.md/04-slices.md auto-commits tracking the column-add pass and the joyos-labs-dev-v3 fresh-DB transition (026ff24a, 594fee5b, b1efb890, 0b3c3525, 40059e90, 65020cd1, 4372e481, 370231cb).Listing.ts/Listing.test.ts and save-offer-draft.js/save-offer-draft.test.ts tightening, plus update-offer.js save/identity/validation edits and the first list-my-offers.source-grep.test.js guard — completing the create/update/draft/test/guard slice for the offer-builder server-side path (f2f16f82, 135fe2f2, ecf610a1, 65e702d6, e4f6db4e, ff5a73aa, 7ea80eec, 76c78c32, d6e85e51, 52adb4e6, ea8373de, 53b7e281, e7e5a5b6, 0b3ab1b8, 40882a5c, 48fca1e7, 970a1162, f480597e, 985e74c3, 505fc0e5, 2e77b0a5, b02a4a1d).archive-offer.js and restore-offer.js Pages Functions — the API-side pieces of offer lifecycle (archive/restore) that pair with the new useListingArchive composable (7d99c93a, c8754464).useListingArchive composable + tests: client-side lifecycle hook for archiving and restoring a listing from the Creator Studio, with the full test pass behind it (7e5cd5cc, 8c4f4eb1, c738e919, 96e234c1, 38e9c3ac, 9ecc959b, 75f163b1, 891f0af0, f561b864).slice-6-source-grep.test.js for the offer-builder API-first plan, plus the newest slice-5-source-grep.test.ts update for the auth composable — the guard layer that keeps the implementation faithful to the spec (36bd8990, c52c757f, c88a0337).00-status.md and 04-slices.md updates (multiple), plus the planning 01-product.md and 02-architecture.md commits — refining the API-first slices, the model layer, and the source-grep guard contracts (0dbc1d77, 96eab494, 0295a04d, a8d9f04f, 7848c333, e67be60e, 326fcb36, 370231cb, f778ed1d, e60092f0, fe693a47, 789833a7, d31e595a).useAuth.ts edits, the new useAuth.dev-bypass.test.ts test companion, no-dev-auth-shipped.spec.ts source-grep guard so dev-bypass code can never reach production, CLAUDE.md refresh, and a SKILL.md update — the auth-side envelope hardening documented in CLAUDE.md's three-gate doctrine (a51c2e8b, 5a891e8b, 66a21925, dbc96b46, 97abba0b, 0366d027).BaseModel.ts stub + tests, Listing.ts stub + tests, stdb-client.d.ts, tsconfig.app.json — building the typed server-model foundation for the offer-builder API-first refactor (b6cd40f9, a709a480, b2c51454, 6b49ed96, 070686ae, aca392b6, 84cfb981, 36af9b47, be9e87b2, 91aab8cf, f634e5ba, c4d8c760).creator-orders.js, creator-stats.js, list-my-offers.js — CRUD endpoints for creator dashboard orders, stats, and offer listing (2390b3d9, 19160073, 720c0746, 7c9ba200, 78f4b4f9, c6ff1c92).creator-orders.test.ts, creator-stats.test.ts, list-my-offers.test.js, Listing.test.ts, logic.test.ts — coverage for the new creator API and model layer (5b101759, ec2b306a, 515dc583, c2bc570a, 05216bdf, 499c2ac3, 0216366d).MyOffersView.vue — creator-side offer list view wired to the new creator API endpoints (1230b73f).00-status.md (twice), 04-slices.md, planning index.html, Vite config pin, CLAUDE.md — doc refresh for Vite 8 dev-tunnel port, goal-loop record, and planning state sync (9d93b57a, 43bbd369, a06536b6, 0618f6d1, eaf7ad4f, a5781b53, 9498c3e3, f852c1aa).useSpacetime.anon-connect.test.ts spec for the anonymous-connection path in useSpacetime.ts (covers the connect-without-identity behaviour the spacetime-client guard depends on) (3ebda600).Purchase/ListingView model layer: Purchase.ts/Purchase.test.ts (initial model with findByListingIds()), the ListingView.ts/ListingView.test.ts view-model layer, the ListingsListView.test.ts hook for the new Slices 9-10, the list-listings.js route re-wired through Listing.findActivePublic(), the new creator-orders.js/creator-stats.js/creator-orders.source-grep.test.js/creator-stats.source-grep.test.js creator-side endpoints, and the docs/plans/offer-builder-api-first/00-status.md Slice-10-done / Slice-11-started close-out (7f0e1a4c, e85121b3, a1b9d483, e74dd072, 457790be, c981d857, 7157e307, 5c797d8d, 269a00cd, 515950d1, 6b505a9a, 5ca40b39, fed5885a, bbb6709b, eb5654e7, 41d81505, 7e8ea28c, c746c37e, c145b70a, dc2b6fd5, 0583ee1d, fae8105b, c3b317f6, 22dccdbd, 70bc4d96, cebdf9eb, c4c7d13e).vite.config.ts pinned with host 0.0.0.0 / port 8788 / allowedHosts:['joyos-lab.braceyourself.solutions'] so the dev tunnel reaches the Vite server (was 502-ing through the cloudflared ingress), scripts/dev.sh now overrides HOME to a writable dir and pins WRANGLER_HOME (EACCES fix), scripts/run-tests.sh inherits HOME from dev.sh, and chore(dev): add concurrent dev:wrangler + make dev run vite+wrangler together wires vite + wrangler pages dev through concurrently so the SPA and the Pages Functions start as one process group (d5d5d091, 59e9d957, 5a591b56, 934f7355, e6fe22d8, 9953163a, 4c8ccd85, 41a4d602, 373e2f3b, 8c9b9c8b, 0c7adb2e, 5a483abc, 866d71f7, c1f1a7ce, dfa998dc).useSpacetime.connect-refuses-anon-socket.test.ts, useSpacetime.identity-link-clears-auth-error.test.ts, useSpacetime.test.ts, useSpacetime.anon-gratitude-echo.test.ts, useSpacetime.appReady.test.ts, and useSpacetime.reconnect-anon-handoff.test.ts spec rollup — the auth-boundary, anonymous-gratitude-echo, appReady ladder, and reconnect-handoff behaviours the dev-bypass / 6pm hard-stop / dev-stack hooks all depend on (a7ec3e4e, 0cc9b215)..claude/settings.json edit pass plus the new tool-call-cap.sh, tool-call-cap-reset.sh, and user-prompt-cap-reminder.sh hook scripts — the per-turn tool-call cap (5 calls/turn, resets on the Stop hook) and the inbound-mail-replies reminder surface now ship from the project config, with an autocommit of all three hook files and the CLAUDE.md doctrine refresh that names them (e7af41d9, 5a48437e, dba7c826, 271d8fb7, 3047fe75, 008c7d72, 004880fd, aed0e332, ecb0614e, 435da446).docs/plans/offer-builder-api-first/01-product.md) and architecture spec (02-architecture.md) committed, defining API-first CRUD with server model layer for create/update/draft/archive/restore/list paths (f912ffed, db57bf59, 99c40d1a).src/pages convention, with the ROOT-depth import fixed in the moved tests (f8da4807, 3687f70b, 0c4eac03, merged 82f5a331).0a0b9cea, merged c4fb3ae8).8e9c6c95).isAdmin to match what actually saves (e1015a7b, merged db66392a).a89bceb7, d0bd170f), plus a fix to a stale bare-repo step in the routing-change skill (bac30881).c008f6a9), with a follow-up fix for vitest mock-proxy access to myTier/isAdmin in the block builder (3fc4dfe2), plus supporting sync/hydration edits to useOfferBuilderSync and OfferBuilderView (ea6c1f8b, d05c1610).creator-studio-offer-wizard (d839c388), moved /creator-studio/payouts, /creator-studio/gratitude, /creator-studio/communities, and /creator-studio/onboarding to file-based src/pages (fd619101, f2a5f128, b00966c8), plus a retirement pass on OfferWizardView.test.ts against the dead step-wizard DOM (0c1fd080, 113c738d).MyOffersView link targets to repoint at /creator-studio/offers/new (0502b915, 1f89ab75, fd5f119b, 888081ba, bf2a5b28, d3433f8c).useOfferBuilderSync, OfferBuilderView, CreatorOnboardingView, and CreatorStudioView, plus a router-side creator-compose-entry-points and marketplace-compose-view-retired test pass (09fcf889, ead2f955, 418e498a, de9c4559, 79832801, dee8e0d3, 6fa64c52, 66c52209).joyos-labs is now a live working copy of staging-next, not a bare repo, correcting the 2026-08-01 doctrine (e2d1d079).edit-test tool for tracked edit-plus-related-test runs, including a dead-file removal recorded by intent rather than inferred from absence (b943539d, c0ccfea3, 8367611a); a live staging audit of Creator Studio refuted a suspected duplicate-page and dropped-route defect (12411da1), plus test-mirror-migration mapping and full-suite failure triage notes (c32a5c4b, d76e6c71).35aa96f2), then added the test-mirror guard itself plus two rulings from Ethan (3f0e5152)./start route (01ac1bb5), fixed the 4 tests still red from the earlier creator-studio and Learning Lab file-based-page migrations (7dda640f), plus a router index.ts autocommit (191ea41d).7797697e), plus bookkeeping autocommits for the router-cleanup route-table audit, typed-router types, and a file-based page edit (54658c97, 7f195761, 639ef619)./learning-lab nested tree (layout + 6 children -- discover, library, listing, accelerator, settings) moved to file-based pages (39f4b664, files landed at c97e6085), with a live-browser Playwright pass against staging verifying distinct rendered content and correct gate redirects for all 11 migrated routes so far (ad4d6bc2, verification scripts at 3a3e0b6c).e32560da) moved 11 mechanically-eligible routes to file-based pages (afe2ab24), backed by a before/after route-name invariant check (7dd40e53) and a RED entry-gate currency guard (189c0ed9); dead pre-file-based-routing backup removed (0d7d3a65), plus planning notes (bdbaf811, eccbbda4).8a6ac7b1 fix(router): add sessionExpired to remaining useAuth mocks (#961)d507406c refactor(router): move the offer builder and its Creator Studio siblings to files93cd5f4a feat(router): allow file-based routing via unplugin-vue-router0c2fac4f fix(vite): watch a WHITELIST of app dirs, not a blacklist of worktreese7ebb104 fix(vite): stop watching .worktrees, which killed the dev server after the root moveb8916e12 land: frontend/SpacetimeDB boundary, client socket disabled (slice 1); paired with f59223de feat(stdb): add the boundary and disable the client socket.2e1821c2 fix(auth): replace stranded-auth reassurance UI with a real sign-in prompt (#960)e672ac92 fix: remove unsolicited "We're on it" error modal from client-error reporting (#959)ac01386f fix(auth): close the resolveStdbToken fail-open and stop the STDB auth-error dead-end (#958)6c7e9230 requirements: record REQ-066 (gratitude wall v2, shipped) and REQ-067 (attribution-consent fail-open, open gap)2437c539 land: feat/studio-gratitude-wall-v2 (#957)6cd56a88 land: guard-admin-route-gate (#956)e674f261 fix(offer-builder): scope the draft to the route, and stop an edit save writing an unrelated draft (#955)a9971ffcd land: fix-admin-message-notify-gate (#954)b791868be chore(revamp-plan): sync gallery/index.html with live page (delta through 8367611a) — 6 new commits, mostly SUMMARY.md autocommit rolls, an edit-test-tracked delete on src/pages/terms/index.vue (8367611a) with intent recorded, an editproof/sum.ts add (b943539d, c0ccfea3), and a Creator Studio live-staging audit (12411da1) that refuted a suspected duplicate-page + dropped-route defect.917f6eef6 chore(revamp-plan): sync gallery/index.html with live page (delta through 3f0e5152) — 14 new commits, mostly the routing test-mirror guard and its 2 rulings from Ethan (3f0e5152, 35aa96f2), the dead-component cleanup on the archived /start route (01ac1bb5), and 4 test-fixes for the earlier creator-studio + Learning Lab file-based migrations (7dda640f), plus planning + SUMMARY.md autocommit rolls.a7b0ec665 chore(revamp-plan): sync gallery/index.html with live page (delta through f3f71eb90)f3f71eb90 fix(outbox): removed the outbox-failure toast while keeping the retry machinery intact (#953); also parked the director-skills routing section, blocked on a permission gate (#952, b041b5919).f4c533ea0 land: routing-doctrine-and-skill (#951)23236ba5a fix(auth): capture the return path from window.location, not the unresolved router (#950)2e6c1e72b land: an expired login now redirects at the router level, before any page renders (#945)c2b6cfa96 fix(offer-builder, router): silence the casing guard on get-listing JSON, refresh stale route-count tests2141bfd45 revamp-plan: sync gallery/index.html with the live page (delta through 8dbafd6cb)8dbafd6cb fix(tests): restore re-export live bindings and update stale offer-builder edit assertion (#944)c0d369de6 fix(auth): an expired login always redirects to login, a network blip never does (#943)1342f3334, #942), and Save actually updates the listing being edited (6ffd839f2, #941).1eb038b6f fix(offer-builder): register creator-studio-offer-edit in the unflagged-route allowlistae243c8dd revamp-plan: sync recently-shipped with 04a72c48c, 30a23102930a231029 offer builder: normal edit path + real ownership-gated listing hydration (#940)04a72c48c docs(doctrine): staging-next tracks origin/main by default (standing rule) (#939)8fcd06928 swarm-test-invocation: record the two things that cost a re-run240baf865 Merge remote-tracking branch 'origin/staging-next' into sync/main-security-into-stagingff84e3605 merge origin/main into staging-next: preserve the security fix AND all 420 product commitsf1cd542e0 promote(staging-next -> main): 338 commits, closes the schema_error_events PII leak7741c0272 closes anonymous PII exposure on 9 SpacetimeDB tables via per-table RLS.f852fbfc7 offer builder: Edit links to the builder, retire the edit modal, pin the Save row (#937)04733f5b6 fix(offer-builder): send Authorization header on API-tier draft save (#934)68e1ec1ef fix(offer-builder): stop SpacetimeSplash data-unavailable panel overlapping the sidebar (#936)97e377e52), merged to staging-next (2a8b00e85).688a6685d offer builder: explicit Save control + API-tier fallback + My Offers shows local drafts (#932)76f5554f6 fix(auth): defer the users-row-delete sign-out to the auth layer, the row check alone cannot see an RLS-scoped re-point.32415f414 fix(auth): a moved users row is no longer read as a removed account — members stopped getting signed out mid-identity-migration.51ff20852 fix(auth): stop signing out on a transient auth-refresh blip (SpacetimeSplash) (#928).e300085d3 fix(notifications): defer the preference prompt off the offer-builder canvas.f7e031807 fix(auth): retry exchange-token 5xx before showing a connection error (#927), making transient auth failures self-heal instead of surfacing a false error to the user.db6f4d5db, WO 4c9cd9f060e8), merged to staging-next (e599f39e1).b9b512f27 fix(auth): repair an anonymous socket when a usable credential arrives late.adf9514e3, WO 4c9cd9f060e8), merged to staging-next (8e15e7871).ee1e3d245, 4dd6a63ad, d01242816).63955702b fix(auth): make an unusable identity fail loudly instead of running as Guest, merged via PR #920 (f73c62f36)58769c288 requirements registry: REQ-064, land the payout code 80/20 / 90/10 (confirms REQ-008)c10369a26/0cd1e9e46 chore(revamp-plan): sync worktree gallery/index.html to live page8e75552fe research(payouts): work order eb9e9be45bd7 research stage artifact (#924)652fbc531), feature_flag_overrides replaced with an authenticated endpoint (819c217bc, 3755ef8ca, 1855f46a9, 366a4853f), marketplace commerce table exposure closed (4983cf498), staging/production feedback table exposures closed (2480afb37, d06406066), 5 owner-only tables closed to anon PII (d4059cae8), deny-by-default public-table ratchet (e00b1354d), doctrine: every STDB table private, storefront via API (41eb325cb).1e3e2bc37, 288a875de, af17d29b0), real create_listing coverage replacing the slice-1 tripwire (df7f24277), block canvas wired to a durable draft store + STDB sync REQ-060 (73924b326), production block-based Offer Builder slice 1 (fe9675a88), three structurally distinct builder options + preview registration (39239e8fe).1013bce35), post-OAuth loading state with a bounded hang and blocked double-submit (27d1eb2a4), REQ-061 archived the /start gratitude gate and fork door, REQ-062 post-login destination is Creator Studio (8c26e14df, 9c3243ce5), Google sign-in error surfaced where the button actually is (71c0f2587, be88028db), gratitude authorName redaction on the unauthenticated feed (a38c2241f).158ce09a4), the end-to-end usable communities surface (92fe7e154), three authorization gaps closed (min_tier, listing ownership, owner protection) (40be1b529), visible "name already taken" validation (09b753097), communities-containing-cohorts schema seam (cbbe5ad24), community creation as a named admin privilege (aee59ca96).7dab32a87), community-switcher interaction layer (9884d3d16), category-first browsing grounded in Kristin transcripts (32ef81d3a), marketplace shell redesign + real public listings wiring (b3a970934, d51de6f64), badge-conditional revenue split 80/20 standard / 90/10 founding member (2739132fe).b92d1b242), REQ-025..033 community/cohort/product + access-model resolutions (2730bc9f6, bd3526f60), REQ-038..040 in-app promotion + delivery bar + internal-first launch (a0de1f6dc), REQ-048..051 gratitude wall/gate decisions (62c2cb835), REQ-055..059 anonymous-probe findings + private-table-via-API doctrine (203a28aae, 9d73581e0), structural guard against a registry write dropping an existing REQ id (b05220637).a499bb97d), fs.deny list reconciled into one imported source (cb20e80f9), staging schema-drift gate re-auth fix (c5fa8ef13), run_seed_step retry-budget and backoff fixes (f6643a61e, a204da53c, 5bd7bed2e), staging-seed fails loudly instead of swallowing errors (b8306be20), fail-closed env resolution after the 2026-08-12 fail-open incident (c8b7fb95c), narrowed --yes on every spacetime publish (823beb644).11e16d502 chore(revamp-plan): sync worktree gallery/index.html to live page (append 4983cf498)4983cf498 fix(security): close anonymous exposure of marketplace commerce tables (#843)b5aa2b86a chore(revamp-plan): sync worktree gallery/index.html to live page (append 2730bc9f6)bd3526f60 requirements: record Ethan 2026-08-14 access-model resolution (REQ-031..033), resolves REQ-026 (#842)2730bc9f6 requirements: record Ethan 2026-08-14 community/cohort/product interview answers (REQ-025..030), two supersessionsf3efc39fb chore(revamp-plan): sync worktree gallery/index.html to live page (append a8ff37cec..23583e14a, 9 commits)a8ff37cec fix(stdb): merge unlanded ctx.sender auth fix for feature_flags/notification_types/tier_config seeds725dfe6f8 chore(revamp-plan): sync worktree gallery/index.html to live page (append a204da53c, 69eb0fe15)f6643a61e fix(ci): switch run_seed_step to flat 180s retry gap -- exponential backoff never converged401abe505 fix: gate seedDefaultNotificationTypes/seedDefaultTierConfig by ctx.sender, not callerEmail34686f570 fix(stdb): remove vestigial callerEmail param from seedDefaultFeatureFlagsbe43ec2cf RED test: spoofed-email-arg case for seedDefaultFeatureFlagsfa02c0c83 agent-currency: exempt in-flight explorer PR files, re-stamp manifest5b6103ab7 fix(stdb): stop using autoInc for feature_flags -- explicit ids at both insert sites23583e14a fix(staging-seed): fail closed when the feature-flag seed failsa204da53c fix(ci): widen run_seed_step retry budget to match seed_demo_data's proven 5 attempts69eb0fe15 chore(revamp-plan): sync worktree gallery/index.html to live page (append 5bd7bed2e)5bd7bed2e fix(ci): retry run_seed_step on transient post-publish 530s5df9fc372 chore(revamp-plan): sync worktree gallery/index.html to live page (43 commits through 2026-08-13)39239e8fe mockups(offer-builder): three structurally distinct builder options + preview registration28bab552d Merge main into staging-next (ancestry only: every byte of main is already here)2480afb37 fix(security): close live STAGING anonymous exposure of the feedback table (#838)28b1c2f1d rescue: land requirements-registry + coverage guard from dangling laptop worktree (#814)c0c94569e feat: seed real downloadable files for staging marketplace listings (#807)32ef81d3a explorer: category-first browsing grounded in Kristin transcripts (#823)aff2a28b6 test(feedback): fix stale suppressEntirely assertions blocking staging-next (#836)d06406066 fix(security): close live production anonymous exposure of the feedback table (#835)7940d319c Merge fix/staging-seed-failclosed into staging-nextb8306be20 fix(ci): staging-seed.sh fails loudly on genuine seeder errors instead of swallowing them310bfc2d1 fix(stdb): feature_flags autoInc collides with corrupt sequence -- explicit ids at both insert sites (#830)bdb89b56a fix(feedback): stop silently dropping connection/auth/InternalError reports4efdd27d5 test: sabotage-proof runtime coverage for staging-seed.sh swallow bug (RED)c7df6dbc6 Merge fix/env-config-fail-closed: fail-closed connection-target resolutionc8b7fb95c fix(env): fail-closed connection-target resolution (2026-08-12 fail-open incident)e48b9a4a3 test(env): RED - fail-closed env resolution guard (2026-08-12 fail-open incident)f96226638 fix(explorer): failed-read visual distinction + mockup toggle (#829)99cfbe27a fix(explorer): W1/W2/W3 adversarial-pass fixes -- honest doc comment, distinct failed-read state, mockup ownership (#828)c5fa8ef13 fix(ci): staging schema-drift gate never re-authenticated with STDB_PREVIEW_TOKEN (#826)4b3454217 explorer: re-stamp ownership manifest for PR #820 content (ExplorerHomeView redesign, mockup registry entry) (#825)cbbe5ad24 Communities-containing-cohorts: schema seam + mockup (deny-by-default, no reducers) (#822)b3a970934 explorer: redesign marketplace shell (drop-in, seam-first mockup) (#820)10afa40fc explorer: fix staging-next structural-guard redness (owner, flag registry, seed allowlist, casing) (#821)50d920e39 explorer: close adversarial-verify warn findings on d51de6f64b2e73f9dc explorer: style the coming-soon fallback (design-gate REFUSE fix)d51de6f64 explorer: wire /explorer grid to real public marketplace_listings (active only)7efc7fea2 feat: explorer marketplace public shell (login-to-purchase)7290c14a5 docs: mark project-local explorer-surface agent superseded by global owner8f666a630 fix(stripe-setup): register webhook with https URL behind Cloudflare Tunnel (#818)57e2b9a92 swarm: job-1786201020-17308 (#817)512245609 swarm: job-1786200692-31728 (#816)9c75a6abb swarm: job-1786200971-3120 (#815)70445fce2 docs: capture R2 + Stream ground-truth findings (2026-08-07)cf6ff5280 chore(agents): create cohorts owner agent; cross-reference from live-chat-spacesdfbb2bf08 chore(agents): land live-chat-spaces owner agent onto staging-next2739132fe feat(commerce): badge-conditional marketplace revenue split (80/20 standard, 90/10 founding member) (#804)a9bff2fcd fix: rename internal 'experiment' listing kind to 'live_session' (#802)cf1ccb1f2 WIP: continue Catalyst->Creator tier rename (uncommitted work found during worktree cleanup audit, 2026-08-07) (#801)81890f0ae feat(marketplace): shared Archive control for listings (admin + creator surfaces) (#798)4ab701a66 docs(visual-verify): document the first-connection dev-login reload gotcha7b06e3ea2 feat(offer-wizard): add visible action buttons to entry-step offer cards (#799)037296bc5 fix(agent-currency): re-stamp StartForkView.vue for gate-autofocus promotioncbe61d274 Promote: auto-focus gratitude gate input on page load (desktop only)eefd19c43 Promote staging-next to main: 186 commits (schema resilience, RLS lockdowns, marketplace/creator-studio work, CI repairs, error-reporter timeout fix)c700cb27d feat(offer-wizard): Live Cohort entry (Option C) goes live (#795)a59ee8fd3 chore(revamp-plan): sync worktree gallery/index.html to live page79253ac44 fix(marketplace): send sessionAt/sessionJoinUrlEnc on every create/update listing call (#796)915b669a4 docs(agents): give the mockup preview harness an owner (joyos-labs-marketing) (#797)ab324a161 docs(agents): correct offer-builder Bundle Builder claim to match live merge5cbdb1452 Merge feat/offer-wizard-bundle-builder: Bundle Builder live on the Offer Wizard entry step7b701688b chore(doctrine): repoint offer-builder ownership + re-stamp agent-currency manifested4865acf fix(offer-wizard): skipImage() must also skip the session step for Bundle Builderce99061ed feat(offer-wizard): make Bundle Builder live -- kind 'bundle' via existing reducer, session step skippedad4356071 test(offer-wizard): RED tests for interactive Bundle Builder entry (kind=bundle, session step skipped)5b7022df0 chore(revamp-plan): sync worktree gallery/index.html to live page8cf2beda5 Merge fix/gate-autofocus-touch-guard: also skip autofocus on coarse-pointer touch tablets06e4fb64a fix(start-gate): gate autofocus on pointer coarseness too, not just viewport width73696c27d Merge fix/gate-input-autofocus: auto-focus gratitude gate input on page load (desktop only)4ff988244 feat(start-gate): auto-focus gratitude input on page load, desktop only0dd70b861 Landing mockups: 3 ground-up directions (Feed/Exchange/Wall) at /dev/mockups/* (#792)3f9faac3b Merge branch 'refs/heads/feat/landing-fresh-ground-up-import' into staging-next32ceb246e feat(landing): add depth and sections to all three fresh directionsbe25a673d fix(landing): mobile-breakpoint defects on Exchange/Wall + drop seat-counter urgency58d55fd5f fix: structural masonry for Wall (count-agnostic), regen non-wellness portrait, make reciprocity visible in Wall tilesf19241b09 wip: three fresh landing-page mockup directions (feed/exchange/wall)08388c893 fix(feedback): bound submit_client_error POST with a timeout (#790)4634ecb8c fix(ci): repair 3 genuine RED failures at staging-next tip (#791)0f32eced8 Merge fix/webhook-account-value-handlers-20260805 into staging-next303087ec6 feat(stripe-webhook): enumeration guard proves every ACCOUNT_VALUE_EVENTS entry is handled or exempted803cda575 docs: correct joyos-billing agent doc for new subscription handlers, re-stamp reviewed pairs07d844043 Merge remote-tracking branch 'origin/staging-next' into fix/webhook-account-value-handlers-20260805ea7315cd9 docs: add branch-inventory refresh and offer-builder buildout plan64e4a52f0 fix(spacetimedb): resolve community_records binding-drift conflict on lockdown mergeb15153a13 Merge lockdown fix/lockdown-community-records-anon-exposure-20260805 (521bbaf99) into staging-next521bbaf99 fix(spacetimedb): lock down community_records anonymous exposure14ad98e7e fix(agent-currency): re-stamp after feedback_message index fix + stranded-identity reactive fix; record in-flight session-fields-serializer spec as known-absent (PR #782)0cd4623e1 fix(stripe): handle subscription.created/paused/resumed events, no longer silent gapcd612d721 docs: retire remaining per-PR-preview language, point verification at staging64f627e0c chore: regenerate STDB bindings for feedback_message.feedback_id indexdf6e7ea3b fix(spacetimedb): index feedback_message.feedback_id to unbreak admin subscriptions1debbc325 fix(sync): detect a stranded identity reactively so it surfaces the sign-in pathb30472b77 Capture 2026-08-04 co-founder call roadmap items (planning only, no code)accd8c47e Merge branch 'fix/dedupe-community-agent-def-20260802' into staging-next (PR #781, re-landed with preserved ancestry after squash-merge correction)7cf9c8689 Revert "fix(agents): dedupe community.md / joyos-community.md agent definitions (#781)"4b2cabea4 fix(agents): dedupe community.md / joyos-community.md agent definitions (#781)d22c1a738 chore(agents): commit the community.md pre-merge backup (companion to acb4ef36e)acb4ef36e fix(agents): dedupe community.md / joyos-community.md agent definitions960b60cb8 Merge pull request #780 from braceyourself/docs/backlog-stale-instruction-fix-202608020201a7cf8 docs: correct stale merge-286-first instruction in sibling backlog docs4a7f3277e docs: correct stale merge-286-first instruction in launch backlog39ec49dba Merge pull request #779 from braceyourself/fix/legacy-writer-guard-anchor-fetch-202608029549e38c0 docs(community): record the anchored-fetch guard fix, re-stamp ownership manifeste306a2cc5 fix(guard): anchor no-legacy-writer POST detection to fetch() call args, not proximity window0ecba6298 Merge pull request #771 from braceyourself/fix/gratitude-roundtrip-probe-filter-collision24e0088b7 docs(community): record the no-legacy-writer guard's proximity-regex false positive, then re-stamp ownership manifestc0508bc5a fix(e2e): drop literal /api/community-gratitude text from a test title to stop a false-positive CI guard match689a7ae52 fix(agent-currency): re-stage manifest re-stamp that was missed before the merge commitbc0c61d2a Merge origin/staging-next into fix/gratitude-roundtrip-probe-filter-collision68b875839 Merge pull request #778 from braceyourself/fix/retire-legacy-community-records-writer-202608028b223b35a fix(gratitude): remove the last live writers into the retired community_records tablecc8472f05 Merge pull request #777 from braceyourself/docs/recovered-doctrine-and-backup-path-fix-20260802d701a4a97 docs: fold in two recovered doctrine sections, correct stale backup-path claim, mark bare-root shadow trap resolved8b0d384b5 Merge pull request #776 from braceyourself/docs/admin-emails-collapse-doc-correction-202608022fba90da4 docs: correct stale ADMIN_EMAILS hand-copy claim after PR #770 collapse37f152d38 Merge pull request #770 from braceyourself/refactor/admin-emails-collapse-to-3-sources30a6548a6 fix(auth): re-arm the deferred sign-in redirect when 'online' fires during a flap (#775)9ca89ce65 fix(agent-currency): retire the redundant adminEmailsParity guard, correct 3 stale agent docs78b2927cd refactor(admin-emails): collapse 8 hand-copied ADMIN_EMAILS declarations to 3 canonical + 4 importsd6aa60bc8 Merge pull request #774 from braceyourself/fix/agent-currency-distinguish-ownership-from-mention006fad7de fix(agent-currency): refuse to write a manifest with an unexplained dead-file claim7dd0851cc fix(auth): redirect an expired session to login, never a network failure (#772)b4b87ca8a fix(agent-currency): probe module is .mjs, not .js, in the agent docs49aff724a fix(gratitude): round-trip E2E probe text was blocklisted by the display filter89a26327b Merge fix-agent-currency-582f: review joyos-start-gate, re-stamp ownership manifestdb5d750d3 fix(agent-currency): review joyos-start-gate against gratitudeWallLayout.ts C23 change, re-stamp manifest05efd0e68 docs: correct stale gratitude-table claim in CLAUDE.md (2026-08-01 cutover)808bb54e9 fix(start-gate): wall renders cards around the open gate modal at 900x640 (RECIPE C23)d3350058b fix(agent-currency): correct community/joyos-community docs before re-stamping community-gratitude.js23f82511d Merge wall-midsize-viewport-starvation: gratitude wall no longer renders zero cards at mid-size viewports (900x640)150be7b82 chore(agent-currency): re-stamp joyos-start-gate after correcting its stale recipe index60f066916 fix(start-gate): wall renders zero cards at mid-size viewports (900x640)f94f142ea Collapse restated global safe-exec/no-verify rules to delta + cross-reference (context audit 2026-07-23)a98c62f0f feat: add verification spec for feedback #99990312cec9b3880 fix(start): own card no longer strands on resize -- drop fill:forwards from the release animation1d234dbc6 fix(start-gate): narrow own-submission cancel exemption to a same-event time window, not permanentea0ffd0c8 fix(start-gate): own-submission card no longer cancelled by the same-event gate-close redistribution7c3faf767 fix(gratitude): catch QA meta-commentary about the product UI in isTestGratitudeBody0cfa49a84 test(gratitude): RED - add QA meta-commentary fixtures for isTestGratitudeBodycd5d3d4ad fix(rls): close anonymous exposure of 1357 feedback_message rows; repair two RLS-guard parser blind spots (#769)297c64a6f fix(rls): close anonymous exposure on user_identities, notification_preferences, archetype_responses (#767)a2560c5de docs: correct stale RLS-closed HTTP-signature claim in CLAUDE.md (#768)33e1023f6 chore(agent-currency): re-stamp manifest after PR726 conflict resolutionef3488869 Merge remote-tracking branch 'origin/main' into resolve/pr726-conflict-20260801e4d595e9b Merge PR #764: sync ADMIN_EMAILS across all copies, add drift guardedc5bf0b6 chore(agents): re-stamp ownership manifest for the 3 admin-email filesc0a864d83 fix: sync ADMIN_EMAILS across all 8 copies, add drift guardd5857c5e1 Merge pull request #763 from braceyourself/offer-attachmentsf8f3aeccf Merge pull request #766 from braceyourself/doctrine-bare-root-ci-capacity-202608017e856c7a3 Merge pull request #765 from braceyourself/docs/landing-procedure-updatebf67a6d62 chore: regenerate ownership manifest + schema snapshot after rebase onto staging-next945008d98 test: raise timeout on large-file digital-upload tests (env contention, not a bug)40bd2a233 feat(creator-studio): let creators attach a digital file to an offer7fa724d10 Merge pull request #760 from braceyourself/fix/gratitude-attribution-default-2026080117eaa75f0 Merge pull request #762 from braceyourself/fix/ll-header-login-signup4af8b42ab chore(agents): re-stamp ownership manifest after gratitude-attribution repurposea68312a79 feat(gratitude): expose consented attribution on the public feed + wire onboarding/settings79e0a3f83 feat(gratitude): schema + reducer for public-attribution-by-default90ab864ff docs: document bare-repo root stale-file trap, CI runner capacity, and agent-currency re-stamp rule9f6dc3047 docs+guard: fix stale land-on-staging procedure claims, add orphaned-branch detectoraec834a6d Merge pull request #759 from braceyourself/fix/access-registry-agent-currency-manifestaae28cf5d Merge pull request #756 from braceyourself/fix/library-bundle-fulfillment562cc803f chore(agent-currency): re-stamp ownership manifest for LearningLabLayout.vue608f83740 Merge pull request #758 from braceyourself/fix/gratitude-e2e-auth-determinism453633b29 chore(agent-currency): re-stamp joyos-labs-learning-lab after MyLibraryView.vue change270545fec fix(learning-lab): add Bundle fulfillment group and panel so a purchased bundle is reachable7c6cf3f20 Merge pull request #761 from braceyourself/docs/offer-builder-doctrine-update5d0b57a5f fix(e2e): deterministic auth gate + pathname-anchored wall assertionecd8f260c fix(learning-lab): relabel auth-broken header CTA to Login, add Signup link08c93f3e3 docs: add Offer Builder update-on-semantics-change doctrine section68f56697e fix(agents): stop backticking not-yet-built access-registry paths in prosed793140da fix(e2e): correct wall-check root cause to URL-substring tautology, fail-safe on poll timeout, add real cutover E2Eaaf9c36e6 Merge pull request #757 from braceyourself/magic-link-verify-reducer-fail-loud64533088b fix(auth): verify-magic-link reports reducer-call infra failure as 503, not 41019fa611ad fix(e2e): replace fixed-timeout wall-auth check with a bounded poll for terminal statead71b997f Merge pull request #755 from braceyourself/fix/gratitude-single-source-of-truthc851c630b docs(agents): correct stale gratitude-table claims after single-source-of-truth cutover79aab17b0 feat(gratitude): single-source-of-truth cutover -- public gate reads gratitude_entries directlyccfe6aeb3 fix(start): dedup wall pool by text before positional cycle (#754)2da053fb3 Merge pull request #753 from braceyourself/fix/agent-currency-review-20260801c24c9cb60 fix(agents): review and correct all 44 stale agent/file pairs, re-stamp07376c79b Merge pull request #752 from braceyourself/fix/arch-map-tests-ci-tsconfig-20260801e1e0809b1 fix(arch-map): add local tsconfig.json so CI does not walk up to root's21c0c0dfc Merge pull request #751 from braceyourself/fix/deploy-blocking-tests-202608015ba263f0c fix(ci): clear 20 of 23 stale-test failures blocking main's deploy pipeline022fc2f40 fix(admin): add kristin@joyos.global to the client ADMIN_EMAILS lists (#750)8dcd5102c fix(ci): make merge-on-green fail closed when PR checks are absent (#748)3d067e613 ci: restore PR-triggered vitest gate + add PR CI coverage watchdog (#745)b72b17228 Merge pull request #747 from braceyourself/fix/arch-map-dead-tests-guarda703b34db Merge pull request #746 from braceyourself/fix/dashboard-sections-year-labelsa39835f63 fix(dashboard): replace vacuous parity guard with a real epicPhases fixturebd1a39d82 fix(arch-map): add local tsconfig.json so CI does not walk up to root'sc033fc5bc ci: run arch-map's own vitest suite and stop calling it deaddec080eab chore(agent-currency): re-stamp joyos-dashboard after reviewing useAuth.ts, AppShell.vue, SettingsView.vue72d646fc2 fix(dashboard): update YearSection sections.test.ts for removed epicPhases fallbackacb0190f2 Merge pull request #744 from braceyourself/fix/dashboard-tests-202607311031056a9 fix(dashboard): remove hardcoded epicPhases fallback + fix stale useStripe mocks17cdd558a Merge pull request #742 from braceyourself/fix/auth-onboarding-tests-2026073199c09e695 fix(auth): log exchange-token appToken verify failures; fix stale WelcomeHero aria-label assertionb83774172 Merge pull request #743 from braceyourself/listing-id-reuse-marketplace-views-202607317185f1502 fix(marketplace): fold marketplace_listing_views into listing-id-reuse allocator685c750ab Merge pull request #738 from braceyourself/fix/stdb-tests-202607318cfe89e3d Merge pull request #741 from braceyourself/fix/gratitude-anon-echo-test600f264a2 fix(tests): update two stale STDB guard tests against deliberate later changesb736d7ddb fix(test): update anon-gratitude-echo A.5.7 for deliberate /start banner narrowing90344e49f test(outbox): tolerate additional named imports in the loadOutboxOnBoot wiring guard (#739)1c4190a42 Merge pull request #740 from braceyourself/fix-billing-tests-20260731f96a904d3 fix(tests): update myTier-reactivity mock to real SDK (ctx, row) callback signaturea0edab738 Merge pull request #737 from braceyourself/fix/env-scoped-row-counts-and-guardbd17e26d9 fix(docs): qualify every gratitude-table row count with its environment+module, add structural guardcbe21841c Merge PR #724 into staging-next: keep both RLS-guard fixes, drop neitherfe325df51 Merge pull request #736 from braceyourself/fix/learninglab-spec-honesty-202607310387c3625 test(router): fix brittle exact-string nav-link assertion in learning-lab-library-route spec8804f004f test(learning-lab): fix stale vue-router/useSpacetime/useStripe mocks in LearningLabHomeView offline-render + ready-instrument specs46a55cc3a Merge pull request #735 from braceyourself/fix/library-unreadable-container-css7f9cb9fb4 fix(learning-lab): apply container styling to the unreadable-library state + correct an overstated commenta02aa900a Merge pull request #734 from braceyourself/fix/library-unreadable-vs-empty4f0f63351 fix(learning-lab): distinguish an unreadable library from a genuinely empty one23b8f0c7f Merge pull request #733 from braceyourself/creator-dashboard-statse8ac8bc36 docs(creator-stats): document the no-Catalyst-check posture, mirroring creator-orders.jsed813dc08 feat(creator-studio): add Performance stats/graphs panel to dashboard7ba32883b Merge fix/settings-tabs-redesign into staging-next4df00b5c8 fix(settings): redesign tab strip and demote sign-out for clarity517e2fa7f Merge pull request #732 from braceyourself/fix/anon-connect-entry-appjwt-migrate-fallbackac51606c0 fix(auth): close the identity-repair gap for ordinary OIDC token expiry3c485be4b docs(skill): point stdb-rls-filter at the new total-coverage RLS guardc01285659 test(security): add total-coverage RLS guard for every public STDB table9c8e962fd Merge pull request #731 from braceyourself/fix/learning-lab-header-accountidentity-desync1b106b999 fix(learning-lab): wire header identity to accountIdentity, not the stale cached claimd10ea67bb Merge pull request #730 from braceyourself/auth-blocked-stuck-rls-probe15b98e639 fix(auth): do not reconnect when it can only ever produce another anonymous identity1f8936632 Merge pull request #729 from braceyourself/auth-blocked-stuck-rls-probeb7e05a4ac GREEN: fix onInsert/onDelete/onUpdate listener callback arity to match the real SDK signature85b38b5fa RED: fix mock callback arity to match real SDK (ctx, row) signaturea4e9539a1 Merge pull request #727 from braceyourself/fix/magic-link-identity-link-clears-auth-error899b77b52 Merge pull request #728 from braceyourself/sec/swarm-test-skill-followupc2333c63b docs(skills): targeted manifest re-stamp recipe, jobq node-version gotcha, scratchpad-not-private findinge29facb6d fix(auth): clear stale auth-broken state once migrate_identity links a users rowfedacf079 Merge pull request #725 from braceyourself/sec/fix-privacy-guard-and-ci97d4be19b fix(security): update split-privacy-release guard for users/waitlist_signups overrided1dfbbc53 test(security): unblock prod-down test gate on two RLS/privacy guardse9c18b40a Merge pull request #723 from braceyourself/library-pending-purchase-card4add3fc09 fix(learning-lab): render a pending purchase as a real library card, not a banner over an empty shelfd711b6a0d fix(marketplace): resolve idempotent-purchase entitlement lookup, poll for pending-to-activefdd9be56c Merge pull request #721 from braceyourself/creator-stats-stdb6b94973f8 Merge pull request #722 from braceyourself/stripe-tier-derivation-fail-closed7c48b347b docs(skill): warn against editing directly in the live shared staging-next worktree5ab7d0e2a Merge pull request #720 from braceyourself/feat/gratitude-attribution-settings-toggleee9e87769 fix(stripe): fail-closed tier derivation, admin-configured prices reach Stripefe4c5acd8 fix: avoid literal */ inside block comments (mkt_views:*/mkt_views_daily:*)b2e562b52 feat(creator-stats): switch purchases/views to stdb, retire KV read pathd190aa5be Merge pull request #719 from braceyourself/docs/swarm-skill-sabotage-recipe3768edf9c feat(settings): add public-gratitude attribution toggle (reuses existing reducer)625c1d765 docs(swarm-test-invocation): add the in-container sabotage recipeae1cd6e3b Merge pull request #718 from braceyourself/fix/stripe-prices-unchecked-stdb-readec856d6f2 fix(stripe-prices): distinguish an STDB read failure from an unpriced tier6ab6d54d8 Merge pull request #717 from braceyourself/fix/seed-tier-config-price-columnse2b7e1e2c fix(seed-tier-config): seed the two price columns, and derive the guard from the schema68d516342 Merge pull request #715 from braceyourself/fix/stripe-prices-duplicate-formatpricestring9dd6d3927 fix(tier-pricing): move the .d.ts out of functions/, which was 502ing staging958f4ed90 Merge pull request #714 from braceyourself/fix/stripe-prices-duplicate-formatpricestringa0987e042 fix(stripe-prices): remove duplicate formatPriceString that broke every staging deployf256a91e5 Merge pull request #713 from braceyourself/admin-tier-pricing-source-of-truth5af19c1ad merge staging-next: combine loud tier-catalog faults with admin-configured pricing3baef6630 feat(tiers): make the admin Tiers tab the source of truth for membership prices467a2223f Merge pull request #712 from braceyourself/fix/public-tiers-loud-empty-and-seeda82d531f0 fix(public-tiers): fail loudly on an empty or corrupt tier catalog, and seed it durably0758f1ebf Merge pull request #711 from braceyourself/fix/shimmer-test-adversarial-corrections16144bb47 fix(start-gate): shimmer test's setup-call assertion was toothlessf72918512 feat(creator-studio): build real Orders page from live purchase dataf6af14397 Merge pull request #710 from braceyourself/staging-nextc80c78a86 Merge pull request #708 from braceyourself/fix/users-rls-anon-exposure0dcd60e35 Merge pull request #709 from braceyourself/fix/shimmer-ambient-no-hover-dependency556fdd297 fix(start-gate): seam shimmer runs ambient, independent of pointer state20a414d3a Merge pull request #707 from braceyourself/fix/pricing-truth-ai-promptsfd50e5788 fix(security): activate dormant users/waitlist_signups RLS filters, close invites leakced6b1a86 docs(skills): record that the agent-currency gate is already red, so measure the deltaa990c3e5d fix(pricing): stop AI listing prompts anchoring on the retired $5.97 Joy Seeker price1c02384c4 merge: sync staging-next before pricing-truth edits6386b4a24 Merge pull request #706 from braceyourself/fix/wall-card-float-desync07c2b5a07 fix(start-gate): desynchronize wall-card float paths for sequential ids1f18ead01 Merge pull request #705 from braceyourself/fix/client-silent-write-audit66694a619 fix(sync-reliability): syncStatus was swallowing a real subscription failure into 'live'0321c14ce fix(learning-lab): purchase-confirmation banner must not claim Library entitlement before it lands755ed6b70 Merge pull request #704 from braceyourself/fix/client-silent-write-auditdc2af97d2 fix(sync-reliability): stop silent failures in useTable() and unify identity display with the connection's real auth state34c6a03b1 fix(stdb): queryStdb failure can no longer masquerade as an empty result405355278 fix(start-gate): clamp persisted wall-card jitter to the CURRENT reservation (Opus adversarial REFUTE)dd65c545a test(learning-lab): pin guest browse has zero auth friction, login modal only at checkout91854b757 Revert "Merge fix/own-card-emergence-identity: own submitted card emerges from centre again"0e78e56a3 Merge fix/own-card-emergence-identity: own submitted card emerges from centre again33073923b fix(start-gate): own submitted card emerges from centre again (identity-keyed bypass)8e73b6586 test(start-gate): fix tautological seam-exclusion assertions found by sabotage4ca9ad555 Merge origin/staging-next (PR #703) into local staging-next0a9a8281b Merge pull request #703 from braceyourself/fix/wall-seam-jitter-avatare2f3f9603 fix(start-gate): wall cards get real per-axis jitter, avoid the split-line, and survive a resize without colliding84b3b9ab3 fix(start-gate): reconcile capacity-count tests with the merged per-axis perimeter fix + seam exclusionb81071958 fix(learning-lab): make pay-it-forward CTAs usable, not dead buttons4a5b81024 fix(start-gate): wall cards get real per-axis jitter, avoid the split-line, and survive a resize without colliding2aff3d349 Merge remote-tracking branch 'origin/fix/process-guard-test-runner-crash' into staging-next0c257eab3 fix(tests): bind process.stdout.write/process.exit eagerly before mutating processbd247d379 skill(swarm-test): exclude .wrangler and tolerate rsync exit 24 when mirroring the serving worktree7c84059d7 fix(start-gate): per-axis perimeter margin -- short/landscape viewports no longer starve to zero wall slots9a7384f87 docs(billing): document the unhandled-webhook default handler and the two live STDB shape traps2fd1e25f0 fix(tests): isolate process-guard test in a child process to stop it crashing the test runner6a9855565 Merge origin/staging-next (PR #702) into local staging-next117364315 Merge pull request #702 from braceyourself/fix/syncstatus-auth-stuck25931e2f7 fix(sync-status): surface auth-stuck in SyncStatusPill, closing PR #700's sibling gap76fbb9a3c Merge fix/webhook-unhandled-notify: live-STDB shape fixescca24b5dc fix(webhook): admin lookup must not use IN, and identity arrives nested -- both found by live probef064d3475 Merge fix/webhook-unhandled-notify: unclaimed webhook events notify admins instead of a silent 200d24ae2957 feat(webhook): GREEN -- an unclaimed webhook event notifies admins, never a silent 200ea1403c13 test(webhook): RED -- an unclaimed inbound webhook event must notify adminsf5289b131 Merge origin/staging-next into local staging-next (reconcile with fix/wedge-hover-disable)6b9f50c0a Merge branch 'fix/wedge-hover-disable' into staging-next-merge-tmp1e26e22f8 Merge fix/wall-perimeter-edge-margin: perimeter keep-out margin for wall cards21e662d53 fix(start-gate): disable wedge hover effect entirely, no resize/seal-shift/brightness on hoverecc763cc7 Merge pull request #701 from braceyourself/fix/start-gate-trickle-and-pile368834e58 fix(start-gate): an invisible gratitude card must also be inert (a11y)88b393103 Merge fix/wall-edge-clip-and-random-placement: wall cards never clip a viewport edge + genuinely random placementfe23f8f5e Merge origin/staging-next (PR #700 auth-blocked-recovery) into local staging-next617eb1a42 fix(start-gate): perimeter keep-out margin so wall cards sit inboard, not near the edgeeab58cd02 fix(start-gate): wall cards never clip a viewport edge + placement is genuinely random per load3d051b999 fix(stripe-webhook): an account-value event that fails is never a silent 200e3cd47b09 Merge pull request #700 from braceyourself/fix/auth-blocked-actionable-recovery329fdc1f4 fix(auth-blocked): stop claiming an automatic reconnect is ongoing once it genuinely has stopped5f8f89ff1 Merge stripe-account-value-events: an account-value webhook event that fails is never a silent 20003abc05f5 fix(stripe-webhook): an account-value event that fails is never a silent 200de98c4fec Merge origin/staging-next (PR #699 queued/released-card fix) into local staging-nextf44e32a68 Merge pull request #699 from braceyourself/fix/start-gate-trickle-and-pileeeebcb7ed fix(start-gate): queued and already-released cards stop piling opaque on the monogram785d921fd Merge fix/wall-card-never-vanishes: an unanimated gratitude card no longer paints opaque on the monogramf56da6655 fix(start-gate): an unanimated wall card sits at its own slot and still reveals2a80a4931 Merge origin/staging-next69c7776e9 fix(auth): name the missing config key when exchange-token cannot mint a session5f50fe51c fix(auth): name the missing config key when exchange-token cannot mint a sessionf370f4f29 Merge pull request #698 from braceyourself/fix/gratitude-trickle-released51fb12f2 fix(start-gate): batch-then-pump the release queue + fix radial-cards geometry test for the new one-at-a-time modelac0015b05 fix(start-gate): trickle-release queue for fresh gratitude cards (one at a time, random order, paced, never repeats)9c10fdd64 test(start-gate): RED tests for trickle release queue (one-at-a-time, random order, never-repeat)82da7c8d0 fix(ci): guard process env access in stdb-client.js (Pages Functions has no process global)d11d16641 Merge pull request #697 from braceyourself/fix/pinkbox-monogram-stranded-cards8c0b1edb4 fix(start-gate): stop stranding fresh gratitude cards frozen on the monogram9a1de1600 Merge origin/staging-next (PR #696) - disjoint from gratitude-anon-mirror-and-own-pin changes626ebcb82 Merge pull request #696 from braceyourself/fix/start-gate-notification-and-anon-echob589a8df2 Merge fix/gratitude-anon-mirror-and-own-pin: anon gratitude reliably reaches the public wall + own-entry eviction pine54f275c5 fix(start-gate): hide the internal sync/outbox debug chrome on /start, keep it observable to usf6a1d6d31 fix(gratitude): anon submissions reliably reach the public wall + own entry pinned against eviction1c4e592b8 Merge fix/float-ongate-layer: fix parallel-render-tree float bug (Opus adversarial catch)96f77b1ac fix(start-gate): hover/float vars were missing from the on-gate ambient layer (parallel-render-tree bug)dc4463d46 Merge pull request #695 from braceyourself/chore/swarm-skill-full-output-and-control-runc38797867 docs(skills): record two swarm-test-invocation gotchas from 2026-07-30 PR audit45c1e6c04 Merge pull request #684 from braceyourself/feat/table-access-mode-classification0ac5c1120 docs(onboarding): cross-domain onboarding research and a delta plan5d9b2e211 docs(skills): correct visual-verify's banned local dev server and record swarm node-down boundsc4a741bd3 feat(sync-reliability): classify every STDB table as subscription vs apibc93aefcb Merge fix/gate-modal-community-signin: hover/float-in-place motion57e64ec61 feat(start-gate): gratitude wall cards hover/float in place around their resting slot9449964af Merge fix/gate-modal-community-signin: gate-modal copy fixes + wall-scatter banding fix375b0459d fix(start-gate): remove in-card community list, reword sign-in copy, fix wall-scatter banding825da6bc2 Merge pull request #694 from braceyourself/fix/wall-stale-angle-tests4e0972b45 test(start-gate): update 2 stale data-angle assertions missed by the wall redesignb621d9c2e docs(skills): add stripe-webhook-live-diagnosis procedural skille5f9a6087 Merge pull request #693 from braceyourself/feat/gate-wall-redesignaa8fa340c fix(start-gate): fix 3 real bugs caught by Opus adversarial pass56a746480 Merge pull request #692 from braceyourself/feat/gate-wall-redesign06bfeecce fix(start-gate): shrink wall grid cells on narrow viewports (mobile starvation)15195420e test(WallView): stub the community-pool fetch so its rejection cannot log after teardown962d88359 Merge pull request #691 from braceyourself/feat/gate-wall-redesign69d18b8ce feat(start-gate): replace drift-off-screen gratitude cards with a static wall28009f4f8 fix(stripe-webhook): fail closed with 503 when a Stripe config value cannot be decrypted85db54aa3 Merge fix-seal-teleport: no-teleport fix for the stale-origin correction (second Opus adversarial catch)2468c0eec fix(start-gate): fix seal-hover teleport regression from the stale-origin fixd2cff2266 Merge fix/card-acuity-and-slowfeed: acuity, teal-ink fix, stale-origin fix, own-submission slow-feed survivalfdea65a7c fix(start-gate): fix stale radial origin on seal hover-shift + teal ink invisible-over-dark-region bug28c3161ab fix(start-gate): own-submission card survives a slow community-feed fetch53bb9747c fix(start-gate): increase visual acuity of floating gratitude entriesae01bd404 Merge pull request #683 from braceyourself/fix/phase911-test-home-isolationc17f27e7d fix(test-infra): isolate HOME in phase-9.11-e2e-verify CLI-absent test901478712 Merge pull request #682 from braceyourself/fix/rls-split-privacy-release-202607296f0609b81 fix(privacy-release): reword WallView comment to avoid tripping gratitude-pools disambiguation guarde4c75a5bc fix(privacy): narrow RLS split release closing gratitude_entries/joy_profiles + 7 more1836efdc9 Merge PR #690: RLS privacy releasea2ffb7472 chore(stdb): refresh schema snapshot timestamp after regen (no shape drift)4db2b9842 fix(privacy-release): reword WallView comment to avoid tripping gratitude-pools disambiguation guard85246716d fix(privacy): narrow RLS split release closing gratitude_entries/joy_profiles + 7 mored558be3d5 Merge fix/monogram-origin-fade: gratitude cards originate at monogram + stay invisible until clearing it4f4ea6fe8 fix(start-gate): gratitude cards originate at the monogram and stay invisible until clearing it61ae9942f Merge PR #689: bounded API fetch timeout11cd97357 fix(stdb-client): bound every outbound STDB fetch with a timeout6a8ac2a6c Merge origin/staging-next (PR #680 outbox fix) into local staging-nextb6a236b42 Merge PR #680: outbox never drops writes5ff3b2248 test(forms): harden textarea auto-grow wiring guard against comment-residue sabotageadd0be23e fix(outbox): never dead-letter writes; surface anon/rejected STDB auth as an honest, distinct status6f1d0dd3b app-version: expose servedBranch/servedCommit/servedSince (staging-drift observability)699c89305 fix(start): floating-gratitude ink tracks the wedge it is actually over6dd087b49 feat(creator-studio): run onboarding as a modal from within Creator Studioa670c38f4 docs(skills): rewrite visual-verify around the staging tunnel, not a banned local dev server556994419 feat(router): retire the bare /app dashboard and point restart-onboarding at the creator side31bfebbde fix(welcome): make hero tagline readable on cream card and remove tour link74cf7fc0c ci: schedule on shared joyos-swarm label instead of pinning as3a815ba7b8 docs: point to architecture decision map as source of truth76b57b1f5 feat(creator-studio): make onboarding transient instead of a permanent tab003d63698 feat(forms): make textarea auto-grow automatic app-wide, no per-site opt-in6e505c581 remove dead community_records_v2 client subscription surfacee5da1e911 docs: findings writeup for the offer-wizard coaching-disabled fix (PR #681)cada34464 fix(learning-lab): guard the in-page My Library link for guests12e49a5ee docs(arch-map): record swarm, ui-verify and layout-backup recipes in the owning agent954542d1a Merge feat/arch-map: decision record, layout persistence, map-currency doctrine67ed576de fix(learning-lab): hide Home nav tab for guests + redirect guest direct access to Discover124f43fc6 docs(arch-map): standing rule that every change updates the map; drift-guard design; ui and hmr verifiersf6f659867 Merge fix/gratitude-spawn-radius-tight: box-overhang-aware spawn-radius floors74c325d4e fix(start): fold card-box half-diagonal into halo/modal spawn-radius floors690529c2d feat(arch-map): persist node layout outside the model; reset affordancefbba053b9 Merge fix/gratitude-own-submission-emergence: optimistic post-submit card emergence04e3d47e8 fix(start-gate): reset gateCompletedToday mock explicitly per test (own-submission-emergence tests)d34c356bd test(start-gate): RED tests for own-submission emergence (fork-door)08e8b436a feat(arch-map): decision record - durable log of decisions already madec2924457e Merge fix/gratitude-spawn-radius-tight: tighten floating-gratitude-card spawn radiusca2c1b6be fix(start): tighten floating-gratitude-card spawn radius to hug the center composition488fe9432 feat(learning-lab): reactive buttons on the membership cardse9b2da753 test: RED - spawn-radius geometry assertions (birth ring tightening + position-hold + modal floor)5ed730b6c fix(arch-map): state the table enumeration gap instead of implying a totalf681dcceb feat(arch-map): use dagre LR layout so tiers stay legible1a8632c8c feat(arch-map): live architecture decision map from static YAMLbfb240b12 Merge pull request #681 from braceyourself/fix/coaching-disabled-classification059026648 fix(offer-wizard): classify listing kind by category, not live-session toggle5fd8ab0c2 docs: record agent-currency closure, negative-control output and one observed incident11672d95f docs(guard): warn that the ownership snapshot must be regenerated on the desktop075423faf feat(guard): add agent-currency guard with staleness, dangling-skill and ownership detectors407a872cb feat(agents): create owners for eight orphaned features, add swarm-test-invocation skillb3ad9100e chore(agents): correct stale admin and billing agents, wire project skills into gen-1 agents46b61117c Merge pull request #679 from braceyourself/feat/admin-waitlist-csv-export29d15ec70 feat(admin): add CSV export to the waitlist admin tab08e419cb9 Merge pull request #675 from braceyourself/docs/skill-safety-fixes-202607299a08d07ff Merge pull request #666 from braceyourself/fix/main-test-gates-202607282d2455e47 Merge pull request #678 from braceyourself/docs/serving-tree-detection-202607299ce4d5ae0 docs: correct the live-serving-tree detection recipe to the systemd unit250eedd72 deploy.sh: guard push subcommand against non-main branch, multi-file, and spacetimedb changesaf3fd876d docs(skills): gate deploy skill on single-file-only direct push to main; use as3.local in minio skillfaea57ce1 docs: point community agent at the guarded gratitude accessor and fix a dead migration doc linkebe84d628 docs: rewrite stdb-additive-migration skill to remove banned manual publish, wrong bindings path, and push-to-main774180aae merge: reconcile PR #666 with staging-next f95813f9e9fdcbb51a test(gratitude): pin buildGratitudeMirrorRows() 4th arg to attribution.userId608aec6d7 fix(gratitude): anonymize public-by-default community mirror rows7e5842a2a docs: findings for dead consent-export cleanup (collectOptedInIdentities)8459b277a fix(gratitude): remove dead collectOptedInIdentities export, guard against recurrence4ca59a3e1 docs(skill): fix stdb-additive-migration steps that violated repo hard rules43365338a merge: reconcile PR #666 with main dad567f5b, keeping the 0003 migrationa59107171 docs(gratitude): reconcile the Two Gratitude Tables doctrine with the mirrordad567f5b wip(job-1785259537-18545): post-agent checkpoint (claude exit 124) (#669)2be521d0b fix(gratitude): exclude harness rows from the public /start feed39173c1e5 feat(gratitude): public-by-default via G3 mirror, remove zero-row journal read3f0e0bb5d chore(bindings): regenerate client bindings for visits public:false flip223628017 fix(security): close visits table, make gratitude_entries public-by-default for display only143e8fe97 fix(migrations): renumber admin_identities away from 0003, not community_records_is_testd0fc8cd38 Revert "fix(migrations): remove duplicate 0003 community_records_is_test migration"1a589acf2 test(nav): update stale creator-sidebar specs to match approved shape6833ce157 fix(migrations): remove duplicate 0003 community_records_is_test migration3d007f1e7 Merge pull request #637 from braceyourself/staging-nextd0487a774 Merge pull request #640 from braceyourself/fix/is-test-migration278915bbf Declare the additive is_test columns in a migration (0003)562ca4734 Merge pull request #638 from braceyourself/fix/schema-shape-is-test0691a7d50 Update community_records/v2 schema-shape guards for the added is_test column07c120e73 Merge pull request #677 from braceyourself/fix/gratitude-harness-filter-202607299e8f104db fix(gratitude): exclude harness rows from the public /start feedb1dfa43dd swarm: job-1785301434-19926 -- gratitude pool guards, is_test filter parity, migration 0003/0005 dedupe (#676)f95813f9e docs: update serving-tree-recipe port tracing method (#674)d58907dec docs(stdb): add RLS service-reader grant patterns and proven findings8bdb8ea14 fix(offer-wizard): wire AI description assist into the description step (#673)7d7e840ec doc: add SpacetimeDB RLS exemption doctrine to Classic Issues sectiona35ee9a0c fix(onboarding): restart onboarding navigates to /app, not /welcome (#671)0d03f0322 fix(checkout): never report an RLS-hidden users table as "Not a registered user"793ba95ae feat(tooling): add feature status tracker (computed, never hand-typed)afd1b0db9 feat(staging): staging-currency guard (pre-push gate + checker + watchdog leg)cba9012a A gratitude entry that fails to save now gets retried automatically on a timer, instead of sitting stuck until you happen to do something elsec4c9e4f0 Added the failing test that proves a stuck save is retried on its own with no other nudge47a3d0a0 Dismissing the notification-preferences prompt now sticks for good instead of reappearing5b6d1eee Added the failing test for the notification prompt staying dismissedf5ac9010 Settings in the Learning Lab now opens as a panel over the page instead of taking you to a separate screend8ad3819 The welcome page is now a three-step sequence - intro, video, then consent4bdad529 Corrected a stale note about how the creator sidebar is filtered825a611d The creator navigation now respects the creator-onboarding switch, and old removal tests were retiredfbd9ffe2 Added the failing test for the onboarding nav item respecting its switcha6d0fd04 Creator Studio's main area now matches the dark theme so the mobile bottom strip no longer looks off8890e0b6 Creator onboarding is now limited to Catalyst members and admins, and the mobile top bar theme was fixed557413a7 Retired the old staging web address - staging now lives at one place only, joyos-lab.braceyourself.solutions, so there is no confusion about which site is the real one75bff0fd Creator Studio now has a first-pass guided setup walkthrough - four steps, hidden behind an admin-only switch while it is being shapedbdddb521 Swept the live database for anything readable by the public and wrote down every table that is currently exposed7550a8bd Corrected an earlier overstatement in the notes: the stray backup files left in the hooks folder are harmless and need no actione1a23712 Counted every file sitting in leftover working copies that was never saved anywhere else - the remaining risk of losing work is lowcb1d5c96 Retracted an inaccurate claim about the project guidance file and recorded the date of the tree currently serving staging68c0f0d9 Preserved the unsaved edits sitting in 27 leftover working copies, without disturbing any of them5d44e84e Rescued the unpushed commits from 34 leftover working copies up to the backup remote, verifiede4052747 Read-only audit of the 237 leftover working copies on disk - identified roughly 72GB that can be reclaimed, nothing deleted yet8eb7a7ec The landing page now has a clear primary button under the tagline that takes visitors straight into the entry gatef1c35f20 Wrote down the purpose plainly in the project's own guidance: joy is the goal, and values, purpose and meaning are what follow from it9b574de2 Triaged the open change requests and corrected the note explaining which schema check is intentionally skipped20d40940 The floating gratitude cards on the entry gate no longer thin out when the layout tightens - the pool of cards is now independent of how densely they are placed3abe9ca6 Locked in which gratitude source each surface reads from, so community posts and a member's own private entries can never be shown in the wrong place58f289c1 Test-only sample entries are now filtered out no matter where the marker appears in the text, not just at the start4ae8dd1b Added a check that the database client code was generated by the exact pinned tool version - the mismatch that caused last week's outage now fails the build instead of shipping60228139 Creator Studio now has a Learning Lab link in its sidebar, and the entry gate at /start carries the joyOS monogram570f9418 Community gratitude on the entry gate now draws from every post, shown in a random mix, instead of repeating the same three4a8b9d9b Regenerated the database client code so the staging build matches the live schema again (prevents the class of crash that took the site down last week)357a27b4 Email digest no longer dies on a single malformed row; a bad record is skipped instead of stopping the whole digest20ee3ebb Turned on a Stripe test that had silently stopped running, plus a guard so no test file can go dead unnoticed againd3f2623e New guard fails the build if the app ever tries to subscribe to a server-private table, closing the door on a whole class of data-exposure bug8c1dc208 Deploy alerting now watches the staging site too, not just production, so a broken staging deploy is noticed immediately9480d4e6 Removed a duplicate database migration that was blocking staging from deploying at all4a9b0468 Test runner no longer picks up stray leftover checkouts, so test runs are consistent and trustworthy562b39f2 Learning Lab pricing: the $597 Joy Catalyst card copy is now legible on its dark background, and the tier-count heading is correct4e387d2a Build system recovered another orphaned in-progress work checkpoint and replayed it onto the current code basead738833 Build system: recovered an orphaned in-progress work checkpoint and replayed it onto the current code base so nothing was lost8d90df9b Founding Hub avatars: profile-picture lookups were silently blocked by the site's security policy, so avatars never appeared. The lookup is now permitted and avatars loadf5319e9a Test data cleanup: the new “this is test content” marker on community gratitude is now declared properly in the database migration, so the change deploys cleanly17e2850e Safety checks updated so the new test-content marker does not trip the guards that watch for accidental database shape changes371b3d51 Community feed: gratitude posted while testing is now flagged as test content and hidden from the public feed, with a one-click purge for itdc0f3fb8 Wrote the failing tests first proving the public gratitude feed must never show test content3d1130e6 Deploy pipeline: fixed a staging build failure caused by missing database module dependencies07a3cf38 Staging health check no longer flags the per-viewer message table as suspiciously empty, since it only fills in as people read44492ff0 Security: admin group-chat message bodies were readable by anyone connected. Messages are now fanned out per recipient on the server so only the intended people can read themacc71338 Wrote the failing test that reproduced the world-readable admin chat messages before fixing it02f4a70a Finished wiring the app to the new per-recipient message read path93652e49 Security: private one-to-one chat messages were visible across accounts. Reads are now scoped to your own identity1477c409 Wrote the failing test that reproduced cross-account chat message readability310cbcf9 Security: admin power was granted by matching an email address, which can be spoofed. Admin trust now comes from a verified identity, closed everywhere in the codebase8859479f Personal data tables (invites, profiles, and friends) are now readable only by their owner154c5837 Wrote the failing tests exposing the admin-escalation and missing data-privacy holes before any fixf86f5f0a Declared the new verified-admin identity table in the migration so it deploys cleanly9a994971 Deploy alarm: when the health check cannot tell what the live site is serving, it now says so plainly (“freshness unverified”) instead of wrongly claiming the site is out of dateeeb9ea81 Deploy alarm: proved the alarm for real — a failed deploy sends the email, four failures in a row shout louder, an out-of-date live site is caught, and repeat runs do not spam8f91bfd1 Deploy alarm: the live site is now watched every 15 minutes from the always-on server, so a failed deploy or a stale live site raises an alert instead of going unnoticed for hours28c61616 Gratitude gate: proved on the live staging site that /start shows real member gratitude — the words people actually wrote reach the screen, and both halves of the door stay clearly readable on desktop and phone6abff0a8 Housekeeping: saved an in-progress build checkpoint so no work was lost when a long-running job timed outbdcea184 Gratitude gate: the Creator Studio side now reports when it is genuinely ready, and anyone without Catalyst access is turned away immediately instead of being left waiting at the door6dd95af5 Admin settings: the feature-flag on/off switch is now a real click target, so toggling a feature actually responds when you click it09176864 Admin settings: added the failing check that reproduced the unclickable feature-flag switch, so it cannot silently come backafa184cd Gratitude gate: the Learning Lab now reports for itself when it is genuinely ready, so the gate-open overlay lifts at the right moment — and lifts immediately rather than stranding anyone if the connection drops or the community is empty46f42724 Gratitude gate: the floating gratitude cards now settle smoothly once the gate finishes opening, instead of stopping abruptly028bedb7 Housekeeping: folded the fixes that were only on the live staging machine back into the shared staging line, together with the gate hand-off wiringadf994bb Notes: wrote up the 2026-07-25 deploy hold-up (stale tests plus a schema check that could not authenticate) so it is not re-diagnosed from scratch next timeabc7b3c5 Deploy pipeline: the schema safety check can now sign in properly, so deploys stop failing on that step55cd63d9 Deploy pipeline: refreshed old tests that still expected earlier versions of the gate and offer wizard, which were blocking every deployf5f4ab32 Gratitude gate: the two doors on /start are now live — choosing Learning Lab or Creator Studio opens the gate and hands you through to the right side78aea09b Gratitude gate: the “how many floating gratitude cards” setting is now proven to actually change how many appear on /start8fe171dd Gratitude gate: fixed a memory blow-up in the circular card layout, plus the stale tests that were masking itac1c38ce Gratitude gate: closed four issues an adversarial review found in the gate-open transition, so passing through the gate is smooth and correcta6e4d127 Housekeeping: brought the live production line back into the staging line so staging is testing against everything that has shipped81e06b43 Gratitude gate: fixed a crash that could blank the /start page when the floating gratitude cards were placed, and tightened the sign-in test doubles that were hiding ita9ffd1a8 Gratitude gate: first two slices of the gate-open transition — the page now knows when the destination behind the gate is genuinely ready, and an overlay carries the visitor through instead of a hard cut8e6696d1 Gratitude gate: fixed the floating cards’ geometry after an adversarial review, and they now recycle continuously so the field never thins out744a4e24 Gratitude gate: the ambient gratitude snippets were all clumping in the top-left corner; they now scatter properly across the panel31f3c522 Gratitude gate: added the ambient gratitude background layer to the /start fork doorb71f69e8 Creator side: the settings page moved to /creator-studio/settings, with the old address redirecting permanently so no existing link breakse605210d Reliability: pinned the SpacetimeDB command-line tool to one exact version in the deploy pipeline — a silent version drift there was the root cause of the 2026-07-22 production outage52002b32 Reliability: three follow-on deploy-pipeline fixes so a production deploy can no longer hang or stop halfway after the database schema publishes422745e0 Internal: wrote up the 2026-07-22 production incident and the resulting direction to keep the app and the database schema separated81c44569 Reliability: a safety check was failing on the wording of a code comment rather than a real problem, blocking production deploys — reworded so real deploys get throughe2b643ab Gratitude gate: the floating gratitude cards had stopped moving once the gate closed — caught by measuring the live page, and now they keep drifting3eea4ba9 Gratitude gate: gratitude cards now emanate outward from the centre with smoother motion, the call-to-action stays visible at all times, and the whole gate got a mobile passfb7b8a40 Marketplace: a change that would have shown an error when the browser blocks the post-purchase access popup was rolled back for now, so purchase behavior is unchangeda0373bb3 Internal: the control-plane spec for the autonomous build system now answers 9 of its 13 open questions, checked against how the machines actually run todaye2c2f0f4 Gratitude gate: the floating gratitude on /start is brighter and drifts more slowly, hovering a card slows its neighbours and holds an entering card in place, and the cursor no longer changes where nothing is clickable9f78b3dd Privacy settings: proved on live staging that flipping the AI personalization consent toggle really saves to the database in both directions, and locked in that the save still succeeds even if the audit-log write fails (#626)1cd5a3d2 Gratitude gate: signed-out visitors were told “your gratitude hasn’t saved yet” even though it had — the visitor now sees their own entry come back from the server, so the false failure banner is gone (#625)05fb70df Admin can now set how densely the floating gratitude cards scatter on the /start gate, instead of it being hardcoded (#624)4496cdea Privacy settings: turning the AI personalization consent toggle off now actually saves — every consent change had been silently failing and rolling back since the feature shipped (#623)17e5bf93 Marketplace: confirmed on staging that the seeded sample offers really landed in the database and render on the live Learning Lab at their real prices (#622)6a70b61f Learning Lab: full end-to-end pass on staging — browsing, filters, listing detail, checkout start, My Library, Accelerator, settings save, and every legacy redirect all verified working (#621)4b13fb0a Gratitude gate: the ambient floating gratitude on /start is now ghosted tone-on-tone text that floats bottom-to-top and stays fully on one side of the diagonal split, with card density set from an admin setting (#620)3c442631 Marketplace: staging now seeds one real active offer of each type (digital, service, bundle, experiment) for the demo creator, so every offer surface renders with real data instead of placeholders (#619)7cf9c4b2 Landing: the Enter the Lab button now sends signed-in members straight to the /start gate (#618)dfd6162c Swarm build job checkpoint landed (#617)0857a283 Creator Studio: the My Offers panel now lists the creator's real offers instead of a Coming Soon placeholder (#616)b75d495d Staging freshness: the dev tunnel now serves the correct staging-next worktree with an exact refspec, so what you see is what shipped (#615)bd2df6ff Swarm build job checkpoint landed (#614)5b503c62 Creator Studio: RED tests for the My Offers real offer list, ahead of wiring it to live data (#613)b067f901 Gratitude gate G3: the opt-in path is now live and E2E-verified on staging (#612)b856ca16 Staging verify: E2E-confirmed the single-tab checkout, unified Creator Studio shell, and gratitude-gate fixes landed on the tunnel (#604/#605/#606, #609)9dadf3b2 Gratitude fork background: the ambient scatter is now visible and passed the design gate (#UI1/#G4, #607)d64d9523 Gratitude gate: an anonymous identity no longer wipes the daily gate flag (#606)14d60dbc Creator Studio: all /creator-studio routes now share one shell, with the real Studio sub-routes wired in (#605)dd2bda58 Marketplace checkout: clicking buy now opens a single tab instead of two (#604)e9f7b698 Bindings: regenerated with the pinned SpacetimeDB CLI 2.6.1, restoring a procedures export that a drifted CLI had silently dropped (#603)755f5c41 Swarm build job landed (#602)2d1db687 Docs: reconciled the warm-Claude control-plane spec against the real worklog and tick formats (#601)7fa641d8 Docs: warm-Claude control-plane design spec (spec only) (#600)3a87491d Swarm build job landed (#599)882bce9b test(gate-bg): real display-path E2E for ambient gratitude background on /start7dc80e69 fix(fork): scatter gratitude-bg items via precomputed inline positions717c68d3 feat(fork): add ambient gratitude background layer (UI1 GREEN)3fe41e35 test(UI1): RED tests for gratitude ambient background on StartForkViewc5b8638f feat(router): GREEN - settings route moves to /creator-studio/settings with permanent redirect (#UI2)8794a1bd test(router): RED - settings route moves to /creator-studio/settings with permanent redirect (#UI2)6f0f9d46 Offline mode: when reconnect attempts run out, the app now falls back to a slow keep-alive retry and keeps showing “Connecting” instead of giving up9ea46406 Schema-drift gate: fixed two false positives that were flagging every private table as a destructive drop, and added a tombstone allowlist — unblocks the staging schema publishb095a80d Schema migrations: the migration runner now really applies and records migrations against SpacetimeDB, plus a drift check that catches an un-migrated schema change4353fac6 STDB writes: failed writes are now LOUD instead of silently resolving to an empty result6581d3b1 Hooks: stop running the test suite in git hooks on this branchae03b328 Creator Studio: creator-focused sidenav with separate Studio and Account lanesa2b6dfbe Boot: removed the static initial-splash gate entirely — no full-page loading covered1c4c51 Security: closed anonymous read access to magic-link nonces and Stripe subscriptionsc953f9fe Tests: resolved 5 inherited test failures on staging-next5af18d35 CI: allowlist 4 write-on-use tables in the staging empty-table gate7126bcdd CI: publish the staging schema only on pushes to staging-next66e0c50a Schema-migration ledger — slice 2 integrated onto staging-next4b7b0e27 Sign-in: drop the preview-token stranding path, keep the tunnel's anon builde4b676eb Tests: remove hook-scope tests obsoleted by the no-tests-in-git-hooks change (#580)b2d8ab25 Offline mode: re-landed the full offline-mode line (dev/live-tunnel) onto staging-next77282048 Schema-migration ledger — GREEN slice 1: pure kernel, CLI + STDB driver, schema_migrations table + record_migration reducer (#582)285626a9 Top-level 404 handler merged onto staging-next7a1d6671 Router: add top-level 404 handler with NotFoundView0302e51c Hooks: stop running vitest in git hooks + add regression guard (#580)697686f8 Schema-migration ledger kernel — RED slice 1 tests + stub (#579)a702e181 CI: allowlist the mutation_results empty-table gate on staging536ef08 Live E2E proving periodic re-flush recovers a stuck outbox writec70b038 Hotfix: exempt dev-auth-bypass sessions from the no-users-row grace timer3196db4 Hotfix: close stranded-legacy-untagged-anon-token gap in the login-hang fix7c71227 Hotfix: login-hang fix (signed-in-anon-socket authError + sticky-anon token guard)470d432 Docs: staging/CI gotchas — dead AS3 runner, promote-head staleness, outbox re-flush, npm-shim hangd7ea726 Docs: syncable contract spec for the local-first plan975e146 Docs: preserve local-first inversion design of record3e4d5d8 Backmerge of origin/main (login-hang hotfix) into staging-next49b9788 Merged PRs #556, #576, #577, #578