Repository navigation
LIVE-2102: Free Human and Services builder previews wear their own shape and pictures - #4560
hellofrequencylab wants to merge 46 commits into
Conversation
…nd ADR-1933 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXp78ds6DqD6ywCjf6
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXp78ds6DqD6ywCjf6
… preview contact strip and photo lists Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
…now live in the repo The intake test reports a baseline entry that no longer fires as healed, and the baseline may only shrink, so the four copy ids the v3 page now carries leave it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
…five step cards, saved state, steps bar and dock The hero is the whole builder (docs/design-systems/create-a-space v3). The H1 becomes the clock, step cards come and go in the left column while the preview fills in, saved steps collapse to pills, the steps bar reads built never live. Draft v2 shape with v1 upgrade, holdFor carries the new keys, deriveSite has a ghost state, FAQ follows the handoff. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6 (cherry picked from commit 8ecfcd98224bef5b28e12e772bbdeed1553e96c2)
…in reads lib/seo/frequency-pages.test.ts reads the page body's source and expects the headline it pins, "Your whole business, live in 12 minutes.", whole. The builder renders that sentence in two pieces (the lead inside the h1, the clause read to a screen reader and drawn beside it), so the pieces are now cut from one INTRO_H1 constant instead of being two literals. Rendered markup is unchanged. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
…fix lands on the studio #4493 moved role="progressbar" off the old builder's meter block, which also held a button. The builder is gone in this branch, so the same fix lands on the studio: the role sits on the "built" reading, and the segment buttons are a group. scripts/probes/sweep-axe-fixes.mjs reads the studio now. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
…hoto, kept in the browser until the launch Step 4 gains upload tiles. Files are checked against the avatars bucket limits, kept in IndexedDB and shown through object URLs; the hold carries only the choice (up), never a picture. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6 (cherry picked from commit 09cda63654075af136a9b9e281506392e8b88642)
…potlight and website click opens the wizard
A signed-out arrival at /spaces/new, /launch or /launch/start (the Free Spotlight buttons) opens /create-a-space at
the proxy, primed with what the door knew (kit or theme, mode, intents, niche, name; lib/create-space/door.ts). The
/spaces page, the Spaces header CTA and the home operator cards open the wizard instead of /join, and
launchHomeHref({ signedIn: false }) returns the wizard. /launch/claim, /launch/resume and the step pages still sign
in first: the wizard's hand-over and the come-back links are the account's own. Owner ruling 2026-11-02 22:20Z.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
(cherry picked from commit d07c304e718ede0a822a14e6a0617e8747a9c7ae)
…egExp CodeQL flagged the RegExp built from each door path (incomplete escaping). The probe now captures the set literal once and checks each door with includes. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
# Conflicts: # docs/ledger/rows/LIVE-1969.json
…il from step 3, comes back from a link, and the address joins the signup funnel
Migration 20270346028600 adds create_space_drafts (service role only, token-hash keyed, 8KB draft cap, 90-day purge) and
widens the signup_leads sources with create_space, CHECK and capture_signup_lead case line together, with a pgTAP guard.
lib/create-space/draft-io.ts saves, reads back and converts a draft; the token is never stored. saveDraftLead and
restoreDraft actions and the pagehide beacon route throttle by IP and mailbox, keep the honeypot and re-check the
handle on every save. The studio sends the draft, debounced, from step 3, flushes by beacon when the tab goes, shows
"Saved to {email}", and reads a ?draft= link back as a Welcome back the visitor picks up. create_space leaves the
signup recovery mailer: the draft reminder cron (LIVE-1968) owns that come-back.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
(cherry picked from commit 36678f14ee644f07ba6e776194c9ad0145ff3b4f)
(cherry picked from commit 635ac062782b51566fc77402e6cf29fe9dce74ef)
…rafts check:grants wanted a verdict for the new table: internal, service role only, matching the migration's revoke. check:admin-client wanted lib/create-space/draft-io.ts on its baseline: the table has RLS on with no policy, a signed-out visitor has no session, and the file is reached only through the rate-limited saveDraftLead and restoreDraft actions and the pagehide beacon. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
…mails on their own cron, with a draft unsubscribe A draft saved to an email on /create-a-space gets at most three notes after it goes quiet: one hour, one day and three days after the last save, only 8am to 8pm in the zone the browser reported, ending the moment they save again, launch or unsubscribe. The day-3 note is about the handle, so it is skipped when someone else has taken it. - lib/create-space/draft-recovery.ts: the pure rule, mirroring the launch come-back rule, with a table of cases. - lib/create-space/draft-recovery-email.ts: the three emails in the handoff's words, one button each, the draft's own unsubscribe link in the footer. - lib/create-space/draft-recovery-io.ts: the runner. Suppression check, then a unique (draft, kind) claim row in create_space_draft_email_log, then the outbox send; the same run purges drafts past their 90 days. - app/api/cron/create-space-draft-reminders: every 15 minutes, auth, heartbeat, budget, dark until CREATE_SPACE_DRAFT_REMINDERS_ENABLED is set (RUNBOOKS gate). - /unsubscribe?d= and the RFC 8058 one-click POST take the draft's signed link; the authz ledger re-read and re-pinned. - Migration 20270346028700 adds the log table (service-only, deny-all listed), with pgTAP posture tests. - Probe scripts/probes/create-space-draft-reminders.mjs runs the rule under node and reads the wiring; row closed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6 (cherry picked from commit 0c9ffa2f4d76969cdf9d89003a687c84087fdddf) (cherry picked from commit d415669b92906e2a22d49ee10abca350502a4bb8) (cherry picked from commit 0e991afa6c49faf7c13ea8393d5d9594daccad58)
The HYG-004 probe counts vercel.json schedules against the Cron section's stated count; the new reminder cron made it 41. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
…n sink, the Insights funnel with the median, hot leads first The signed-out builder now records itself, first-party only and never with typed text, and the team can read the funnel and act on the leads. - lib/create-space/signal.ts: the nine createspace.* signals from the handoff, each with a closed set of props (a kit id, a step id, an accent index, flags, intent ids); a per-tab key, never a cookie, keys each event exactly once so the funnel counts visits, not taps. Registered in the taxonomy server-side only. - app/api/create-space/signal: the sink. /api/track drops anonymous posts on purpose, so the builder has this door of its own: rate limited by IP, body checked by the same rule, written through track() with no actor, always 204. - The studio posts the nine from the moments that are the funnel: open, first letter, accent, each step, the mock-up, the address, the photos, a resume, the dock. - lib/create-space/funnel.ts and the Insights engagement tab: the Create a Space funnel (visits per builder step, then launch members from every door) and the median from the first letter to the hand-over, read from the drafts table's two timestamps. That median is the only ground the "12 minutes" claim may stand on. - Signup leads: the score the funnel writes into the lead's payload flags a lead hot at 60 and up; the leads page shows the flag and lists hot leads first. A signup lead has no Frequency-level contact row, so the score lives on the lead row rather than contacts.meta. - Probe scripts/probes/create-space-funnel.mjs runs the signal, funnel and taxonomy tests and reads the wiring; row closed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6 (cherry picked from commit b825363b6433e059d8ea3a015fe647ab3822446b) (cherry picked from commit 9a668ea82a2688803a74642eadfb8bb8e87554cf) (cherry picked from commit 9b0c2efcd711b6c7c22397a533358b35daaaaa1f)
…ney, phone targets, five-width renders test/e2e/create-space.spec.ts (@smoke, skips without PW_BASE_URL) proves the three things worth proving read-only: a visitor with no account who opens /spaces/new lands on /create-a-space carrying the door's theme, mode and name; the builder walks name, accent and the offer mock-up on the keyboard and the pointer, with Next locked (aria-disabled) until an accent is picked; the two anonymous sinks answer 204 to junk. It stops before the contact step submits. funnel.spec.ts keeps its sign-in hop for /offer only. The phone keeps 44px targets on the dock pills and example chips. Probe scripts/probes/create-space-hardening.mjs reads the files; it spawns nothing. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6 (cherry picked from commit 1c20a4bd154b7bf4ace501dbef4b51cf5d962134) (cherry picked from commit dc1c9e16649a2e176a48d2873655babc1f2da034) (cherry picked from commit 8e3aa7555e492fa83032051fc804f6165c77be0c)
…bandoned claims keep their reminders, Network preview wears the kit The server draft saves as soon as a name and a full address are typed, not after Continue on the contact step. The Review and Publish screen passes the hold's carry, so the claimed handle, Theme Kit and accent reach the Space it makes; the accent becomes the Space's brand colour, which the Space page, its Spotlight and the website all wear. Claim no longer stamps the draft converted; the hold carries the draft token and /launch/claim stamps it once the person has signed in, so an unopened magic link still gets the come-back emails. The builder preview for the Network kit reads the kit's four schemes, wears its photo library, its serif voice, its round mark, the arched hero picture and the contour lines. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
…completes One note with where people find you (Spotlight, Space, console), in the brand voice, through the lifecycle send gate and a launch_email_log claim so it goes once. No migration. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
…e test's text Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
…ace, shape and pictures The Temple kit was the one kit in the signed-out picker whose preview fell back to Temple (classic): its four accents, the gathering photos and Temple's canvas. The preview now reads the kit's audience profiles (six families, clay first), its photo library, its surface and a shape of its own. Free Human, Services and New World are not in the picker but each has its own accent family too, so no kit falls back to another's. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
…4536 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
…uilder picker with their own previews The builder leads with New World, the kit a cold visit starts on, then Services. Each gets a preview shape of its own (Bricolage, Lora italic, the kits' radii on the Night register), its surface and its pictures. WIZARD_THEMES stops hiding the two; Free Human stays private. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
…-fddsfo # Conflicts: # lib/create-space/preview-site.ts # lib/theme/preview-tokens.ts
PREVIEW_KIT_ORDER, WIZARD_THEMES and COLD_KIT read SITE_THEMES (RETIRED_FROM_PICKERS), so New World and Services reach the builder the moment each is un-hidden and never before. Until then the builder is unchanged. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
…-fddsfo # Conflicts: # lib/create-space/preview-site.ts
…ape and pictures Free Human had accents of its own but no shape and no pictures in the signed-out builder preview: previewTokens fell back to Temple's shape and kitImagery to the gathering photos. It now wears Cormorant Garamond with the clay on the emphasised word, Hanken Grotesk body, 16px controls, 40px cards, the arch on its pictures, its depth-2 shadow and its own photo library, and joins the preview kit order behind New World and Services, gated like them on the one hidden flag. Services keeps the shape and New World pictures it got in LIVE-2067; it has no library of its own yet. SHAPE and KIT_IMAGERY are plain Records over every kit id, so the two fallbacks are gone. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Vercel preview build on 88364b0 failed, and it is not this PR's. The build log shows the known OOM at "Collecting page data" (the build container's memory, not a compile error): "At least one Out of Memory event was detected during the build". The same tree minus this diff is main at 26d0724, whose production build is READY, and the first head of this PR (c00cb41, before main was merged in) built READY too. This diff adds no route and only two data tables, a probe, a row and tests, so it changes nothing about page-data memory. No fix exists yet beyond the build-headroom work already tracked; this session cannot redeploy a preview. The required checks are the CI jobs, which this comment does not affect. Generated by Claude Code |
… the adoption ratchet stops counting the token name The checks job went red on main with #4547 (aebdc5e): the Services header menu panel reads var(--sv-shadow-lg) and the ratchet's \bshadow-lg\b pattern fires inside the token name, the same false positive fe0f93b renamed away for New World. The ramp is now --sv-depth-*, the glow keeps --sv-shadow-glow, and the New World sheet derives --nw-depth-* from the new name. shadow-literals reads 38 against a 47 baseline. No Tailwind shadow-* class was involved. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
…Wildheart intake (#4563 era) while this PR was open Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6
…-fddsfo # Conflicts: # components/sites/services-css.ts
|
migration-readiness fails closed on every head of this PR, and it is not this PR's. The PR carries no SQL and its base is the recorded main tip (73e1f25, the same commit the trusted runner checks out), yet the runner refuses. The same refusal hits every other open PR in the last hour (#4551, #4553, #4555, #4556, #4564, #4565 all red on the same check), because main moves every few minutes and the collector and publisher require the live main tip at trigger time to equal the PR's base even for a no-SQL PR. The fix exists as #4567 ("Migration readiness no longer fails a no-SQL PR whose base is one merge behind main"). It cannot be ported here: the check runs main's own copy of the workflow and refuses a collector whose hash differs from main's. Once #4567 merges, the runner on this PR gets re-run once. Generated by Claude Code |
Requested by: Daniel (promised 2026-11-03 05:52Z; "Implement all recommended options", 17:23Z)
What
free-humanjoins the preview kit order behind New World and Services, gated like them on the one hidden flag (RETIRED_FROM_PICKERS), so it reaches the builder by link the moment its lane un-hides it and never before. It stays out of the picker list itself (LIVE-1910).SHAPEandKIT_IMAGERYare plainRecord<MegaThemeId, …>; the Temple-shape and gathering-photo fallbacks are gone.--sv-shadow-{sm,md,lg}to--sv-depth-*(the glow keeps--sv-shadow-glow; the New World sheet derives--nw-depth-*from it). The adoption ratchet's\bshadow-lg\bpattern fired inside the token name, which is what turned main'schecksjob red after Vanta site on the Services theme: wire the Services skin into the site renderer and build Vanta's pages (LIVE-2069) #4547 (main has since consolidated the rule in 73e1f25; this rename removes the false positive for good, shadow-literals reads 39 against 47). No baseline was touched.Why
Every kit in the signed-out builder should wear its own accents, shape and photos, like the Temple kit (#4537) and Nocturne (#4548). Free Human was the last kit still borrowing Temple's shape and the gathering photos.
How to review (owner)
Renders at 390, 1280, 1440, 1920 and 2000 for both kits are in the project folder under
create-a-space-wizard/renders-2026-11-03/(free-human-<width>.png,services-<width>.png). Both kits are still hidden on main, so the renders were made with a local, uncommitted un-hide.Verification
node scripts/probes/create-space-kit-previews.mjs(new, LIVE-2102), plus the existing kit-accents and picker probes.viteston preview-site, preview-tokens, preview-tokens-gate and create-wizard tests, and oncomponents/sitesandlib/theme/servicesafter the token rename: all passing.node scripts/check-adoption.mjs: green.tsc,eslinton the changed files,check:backlog,check:tokens, dead-exports ceiling,check:id-collisions: all green locally.Notes
One row:
docs/ledger/rows/LIVE-2102.json(done; it was LIVE-2084 until main took that id for the Wildheart intake). No migration, no env change. The Vercel preview build on one merge head OOM'd at "Collecting page data", the known borderline build; the next head built Ready.🤖 Generated with Claude Code
https://claude.ai/code/session_012BMmZXP78ds6DqD6ywCjf6