hooks: a nested write without req is not in the transaction
Kenneth Courtney
auth: the baseline is a door, not a reminder
Kenneth Courtney
settings: set the listing-page cover where you set the logo
Kenneth Courtney
shop: one page, one hero
Kenneth Courtney
auth: a texted code was inventing a second identity
Kenneth Courtney
ai: stop pinning a Gemini generation, and price the models that actually serve
Kenneth Courtney
the jobs queue is running, not pending
Kenneth Courtney
the edge was down because nothing starts it
Kenneth Courtney
media: a relationship id that arrives as a string is not an id
Kenneth Courtney
jobs: shouldAutoRun does not stop the scheduler, only the runner
Kenneth Courtney
leo: a draft is not an absence
Kenneth Courtney
admin: say which stack you are looking at
Kenneth Courtney
email: "nobody configured this" was answering as a 500
Kenneth Courtney
what shipped of the plan, and the one env var standing between it and running
Kenneth Courtney
jobs: the crontab moves into Payload's queue, where failures are rows
Kenneth Courtney
the plan for auto-deploy, scheduled work, and what the laptop is now
Kenneth Courtney
footguns: cloudflared keeps its start-time config, and I verified the wrong hosts
Kenneth Courtney
footguns: editing a container's config from Windows silently CRLFs it
Kenneth Courtney
ai: GOOGLE_MODEL was flattening every tier, so escalation did nothing
Kenneth Courtney
chat: the URL is a navigation source, not just an initial one
Kenneth Courtney
restore the 11 gtagEcommerce tests I clobbered
Kenneth Courtney
analytics: every GA4 event was reporting 100× — and add_to_cart never fired
Kenneth Courtney
leo: an image with no media id left the tools blind
Kenneth Courtney
Payload 3.77 → 3.86.0, Next 16.1.6 → 16.2.12
Kenneth Courtney
notifications: the vendor's name doesn't belong in the domain
Kenneth Courtney
product: the gallery is a fixed frame, sized by the copy beside it
Kenneth Courtney
hero: splitPanel bleeds to the top too — the type Kessela actually uses
Kenneth Courtney
header: the cart is a square target, and a full-bleed hero starts at the top
Kenneth Courtney
leo: the cart tools were writing to a field that does not exist
Kenneth Courtney
vision: a dead analysis run must not own the image forever
Kenneth Courtney
leo: a stalled "..." now heals on its own clock
Kenneth Courtney
leo: the SPACE owns a message's tenant, not the portal you asked from
Kenneth Courtney
scripts: the _status guard did not fire, because it knew one incident
Kenneth Courtney
kessela: retire the Buy Now page, and give products the bands it carried
Kenneth Courtney
product: the gallery crashed again, one line over from yesterday
Kenneth Courtney
handoff for the next thread
Kenneth Courtney
product: the gallery crashed on an unpopulated image — and I caused it
Kenneth Courtney
branding: the sign-in pages said Angel OS on every portal
Kenneth Courtney
blocks: the gradient showcase band — their most recognisable section
Kenneth Courtney
kessela: forms where the forms were promised, and no more mailto
Kenneth Courtney
kessela: propose the words instead of asking for a list
Kenneth Courtney
portrait video (both forms), Ubuntu runbook, Kessela monitored
Kenneth Courtney
kessela: the incontinence landing page — structure now, claims later
Kenneth Courtney
kessela: the plan catches up with a day of David
Kenneth Courtney
kessela: payment methods are a setup step, not an assumption
Kenneth Courtney
checkout: stop switching off buy-now-pay-later in code
Kenneth Courtney
fee: per-tenant platform fee, and one resolver for every checkout
Kenneth Courtney
a layout update that omits _status silently UNPUBLISHES the page
Kenneth Courtney
kessela: the 10% is the platform fee, and what the ad accounts actually need
Kenneth Courtney
blocks: FAQ accordion with FAQPage schema, and Kessela's own badge copy
Kenneth Courtney
trust row on the buy page, Gotify + Uptime Kuma restored
Kenneth Courtney
runbook: the Cloudflare section, and the autostart gap it exposed
Kenneth Courtney
theme: pin the auth-card button labels instead of chasing a rendering I can't reproduce
Kenneth Courtney
theme: the sign-in page and the nav were unreadable in dark mode
Kenneth Courtney
kessela: the account list for the setup session
Kenneth Courtney
scripts: cast through unknown — the new block type broke the build, not tsc
Kenneth Courtney
tickets: the public claim and return desk — one block, two placements
Kenneth Courtney
kessela: kessela.com is David's — the platform domain is the one that matters
Kenneth Courtney
kessela: David's server is the decision — record it, then de-risk it cheaply
Kenneth Courtney
gate: the members-only page sent signed-out visitors nowhere useful
Kenneth Courtney
kessela: what each ask unlocks, the studies format, creator and Stephanie options
Kenneth Courtney
leo: an uploaded image is "look at this", never "make me one"
Kenneth Courtney
kessela: the 8 studies are a blog now, not eight orphan pages
Kenneth Courtney
add the tickets slice to the continuation handoff
Kenneth Courtney
tickets: warranty claims, returns and support — one primitive, one queue
Kenneth Courtney
rewrite the continuation as a Kessela-tightening handoff
Kenneth Courtney
chat: LEO's replies were unreadable in light theme
Kenneth Courtney
kessela: their hero still and their favicon — and the tab stops saying Angel OS
Kenneth Courtney
media-text: a real video player for uploaded media, not a background loop
Kenneth Courtney
lexical: an internal link made a page unsaveable
Kenneth Courtney
heros: splitPanel wasn't selectable — I'd been editing a DEAD config file
Kenneth Courtney
record the unresolved stuck-placeholder bug for a fresh session
Kenneth Courtney
leo: stop inventing failure reasons, and stop talking like a cosmology
Kenneth Courtney
mark header consolidation done in the continuation prompt
Kenneth Courtney
header: one control instead of three — portal switch + edit page in the account menu
Kenneth Courtney
continuation prompt for a fresh context
Kenneth Courtney
header: my own overflow-hidden was clipping every dropdown
Kenneth Courtney
heros: splitPanel — the corporate product hero, added not substituted
Kenneth Courtney
branding: per-Endeavor opt-out for the platform credit, and stop saying "dev"
Kenneth Courtney
kessela: nav labels that fit, dark chrome, and the cache gotcha
Kenneth Courtney
ui: the polish pass, done with eyes on the page instead of greps
Kenneth Courtney
import: sectioned layouts — copy, picture, copy, picture
Kenneth Courtney
kessela: a store, a lead form, and the provisioning gaps you spotted
Kenneth Courtney
hero: make the fullScreen hero selectable, and take Kessela live
Kenneth Courtney
import: mirror a brochure site into a tenant — and provision Kessela
Kenneth Courtney
merlin.spacesangels.com routes to Merlin, and the edge config is backed up
Kenneth Courtney
crm: the sequence engine — drip that runs unattended and stops on purchase
Kenneth Courtney
crm: first-touch attribution, and a join between the CRM and the till
Kenneth Courtney
access: anyone could make themselves tenant_admin of any tenant
Kenneth Courtney
header: the mobile menu ignored the pins the desktop bar honours
Kenneth Courtney
booking: a deprecated field's validator was blocking every deposit
Kenneth Courtney
a continuity runbook — keeping the platform alive without Ken
Kenneth Courtney
booking: read the provider's real Google Calendar, and write bookings back
Kenneth Courtney
footguns: the test gate is green — and it found a live no-req write
Kenneth Courtney
footguns: a hook that writes without `req`, and 20 more tests that lied
Kenneth Courtney
footguns: bound every fetch, close three more `authenticated` holes, make 12 lying tests honest
Kenneth Courtney
FOOTGUNS.md — a handoff for turning instance-fixes into class-fixes
Kenneth Courtney
chat: action icons invisible on touch; LEO no longer promises work it can't do
Kenneth Courtney
leo: a departed client no longer destroys the turn
Kenneth Courtney
leo: image analysis hung forever — dead model, thinking model, unbounded fetch
Kenneth Courtney
docs: ship the markdown — /dashboard/docs reported 0 documents
Kenneth Courtney
auth: unify login and create-account contrast — theme-independent cards
Kenneth Courtney
money: 95/5 everywhere — one number, enforced and displayed
Kenneth Courtney
money: the 40% platform take was LIVE — route every fee through the 5% dial
Kenneth Courtney
monetization: platform_solvency + set_platform_fee — the number, and the dial
Kenneth Courtney
shop: render the hero — storefront.shopHeroImage was a dead setting
Kenneth Courtney
auth,theme: theme toggle on mobile; passwordless signup as the default
Kenneth Courtney
nav: derive the whole menu; the header doc becomes an override layer
Kenneth Courtney
links: link picker offers posts/products/events — with the schema to match
Kenneth Courtney
active-endeavor switch — one context switch replaces five escape hatches
Kenneth Courtney
nav: promote the membership join page — it was losing to a soundbar
Kenneth Courtney
deploy: check in the whole self-host stack, not just the heartbeat
Kenneth Courtney
endpoints: fix donation + export-site suites (11 failures)
Kenneth Courtney
ensureTenantMembership: rewrite against the signature that exists
Kenneth Courtney
security: sweep bare `authenticated` reads off customer-reachable data
Kenneth Courtney
security: bookings were readable and writable by every signed-in user
Kenneth Courtney
admin: give /admin/login a route back to the site
Kenneth Courtney
deploy: check in the heartbeat sidecar files
Kenneth Courtney
vercel: disable git deployments on main — local-only iteration
Kenneth Courtney
booking: flat deposits so quote-only trades can hold a slot
Kenneth Courtney
leo: portal-targeted page/branding tools; fix brand duplicated in every title
Kenneth Courtney
leo: configure_service can target another portal + take an hourly rate
Kenneth Courtney
_local: fold Bill's 4 pending invites into one person (email + phone anchors)
Kenneth Courtney
domains: spacesangels.com is the canonical apex, not payloadnuke.com
Kenneth Courtney
300s hang RESOLVED — pg_blocking_pids probe, deadlock gotcha, cleanup closed
Kenneth Courtney
provisioning: the 300s hang — syncUserTenants deadlocked the tenant tx
Kenneth Courtney
continuation handoff 260725 — tunnel shortcut, 300s provisioning hang, CRM plank
Kenneth Courtney
provisioning: thread req into default pages/nav; make nav creates sequential
Kenneth Courtney
provisioning: owner memberships were silently dropped on tenant create
Kenneth Courtney
punch-list: close 403-reads + Gap B; log intent-preclassifier (defer learned tier)
Kenneth Courtney
list reads return empty-200 not 403; Quick Invite now writes a Contact
Kenneth Courtney
onboarding: ONE baseline-membership floor for every door
Kenneth Courtney
Core host port 3000->3001 (dual-mapped during flip); Merlin reclaims 3000
Kenneth Courtney
map the lead→contact→invitation→campaign flow; correct punch-list (campaign IS built)
Kenneth Courtney
railway: correct pooler db to 'railway'; note core-kendev deleted
Kenneth Courtney
railway: pgbouncer wildcard pool serves both angels + kendev cores
Kenneth Courtney
snapshot self-host compose (pgbouncer added) — datacenter dir is not versioned
Kenneth Courtney
pgbouncer: local stack pooled (live); Railway runbook for a 3rd pgbouncer service
Kenneth Courtney
punch-list: today's fixes + send_campaign, mediaToAiBus, 403-reads, no-pgbouncer
Kenneth Courtney
dashboard: count real federation-peers, not a bogus 'ping_received' audit action
Kenneth Courtney
leo: image-only messages 400'd — 'Missing or empty: message' before attachments checked
Kenneth Courtney
voice: end-of-call report → cost ledger (telephony) + call log on the Contact
Kenneth Courtney
crm: invite + accept now advance the Contact funnel (lead → invited → accepted)
Kenneth Courtney
auth: Google callback 500 on non-cookie-domain origins — invalid 'domains contains' query path
Kenneth Courtney
availability: validate only the schedule group matching availabilityType
Kenneth Courtney
invites: invitationName — the typed name survives the phone invite
Kenneth Courtney
punch list — media-anywhere primitive P1 (photos + generated images to any surface)
Kenneth Courtney
team: phone on the roster + guarded contact edit for pending invites
Kenneth Courtney
settings: Site Logo control on General tab — disambiguate from Discovery Card badge
Kenneth Courtney
punch list — close LEO media-id P1 + stale header-logo P2; Start-S branding batch
Kenneth Courtney
leo: surface attached media IDs to the model so media tools get args
Kenneth Courtney
punch list — Start-S portal + media-picker leak batch
Kenneth Courtney
media: one tenant-scoped library query for the chat picker
Kenneth Courtney
invites: invite by phone number — copy link, text it, OTP in
Kenneth Courtney
HANDOFF_260722 + punch list update (demo-day live-ops batch)
Kenneth Courtney
vision: retire dead gemini-2.0-flash fallback + auth polish batch
Kenneth Courtney
auth: provider-style code sign-in button + self-service phone + docs
Kenneth Courtney
chat: tenant-scope the media library picker; full composer in LEO sidebar
Kenneth Courtney
auth: degrade gracefully when Twilio rejects CustomFriendlyName (60204)
Kenneth Courtney
auth: portal-branded sign-in texts
Kenneth Courtney
uploads+login: raise 10MB middleware body cap; fix invisible login text in light mode
Kenneth Courtney
migration: tenant-scoped redirects engine — old-site URLs keep working
Kenneth Courtney
dashboard: fold Connections into the Account page
Kenneth Courtney
leo: video attachments no longer crash the stream — acknowledged in text
Kenneth Courtney
auth: sign in by texted code (Twilio Verify) + surface passwordless login
Kenneth Courtney
auth: passwordless email-code sign-in on the login page + Twilio env fallback
Kenneth Courtney
auth: surface passwordless email-code sign-in on the login page
Kenneth Courtney
crm: every lead auto-harvests a Contact — voice and web form
Kenneth Courtney
voice: handle Vapi 'tool-calls' events — tools were silently no-oping
Kenneth Courtney
dashboard: command-center stats match the tenant on the masthead
Kenneth Courtney
punch-list: voice trunk line + tools + per-portal failover shipped
Kenneth Courtney
voice: per-tenant Vapi fallback number + portal pivot
Kenneth Courtney
voice: trunk line never matched + assistant had no callable tools
Kenneth Courtney
punch-list: dashboard settings consolidation audit + costs/bus rename plan
Kenneth Courtney
voice: lead capture as the primary path + preloaded business briefing
Kenneth Courtney
punch-list: phone assistant site-content RAG shipped + proposal-page exposure
Kenneth Courtney
voice: give the phone assistant real tools + site-content RAG
Kenneth Courtney
punch-list: Vapi server.url vs legacy serverUrl trap + dangling assistantId
Kenneth Courtney
punch-list: LEO on Gemini (~10x cheaper) — GOOGLE_AI_API_KEY + flash-lite pin
Kenneth Courtney
punch-list: VAPI voice fixed end-to-end (serverUrl repoint + AI provider order)
Kenneth Courtney
punch-list: ecommerce cross-tenant leak FIXED+verified; category filter leak staged
Kenneth Courtney
multitenant: scope shop category filter to the portal's tenant
Kenneth Courtney
multitenant: tenant-scope carts/addresses/transactions (stop cross-portal leak)
Kenneth Courtney
punch-list: expand cross-tenant leak to carts+addresses+transactions with refs
Kenneth Courtney
chat: optimistic attachment link so channel media survives DB pressure
Kenneth Courtney
punch-list: create_post layout crash (fix staged) + channel media lost on refresh
Kenneth Courtney
leo: create_post guards required content instead of crashing on Layout
Kenneth Courtney
punch-list: cart cross-portal leak, staged link-filter, white-label nav hides
Kenneth Courtney
multitenant: scope link-editor page picker to tenant; land Google login on origin portal
Kenneth Courtney
punch-list: log login-killing idle-in-tx DB jam + 60s guard
Kenneth Courtney
neurocarepro: strip horizontalrule nodes from rendered doc pages
Kenneth Courtney
team: copy-invite-link action on pending invites
Kenneth Courtney
neurocarepro: render proposal docs as on-brand Pages
Kenneth Courtney
handoff — NeuroCare Pro engagement + session platform work
Kenneth Courtney
theme: per-tenant default theme (branding.defaultTheme)
Kenneth Courtney
theme: default the public site to light, not the visitor's OS
Kenneth Courtney
punch-list: MediaText shipped; log Merlin/Core :3000 collision
Kenneth Courtney
blocks: MediaText — two-column text + video section (WordPress parity)
Kenneth Courtney
punch-list: surface pending-invite links in admin UI
Kenneth Courtney
global punch list — single living triage board
Kenneth Courtney
hero: full-screen hero supports video background
Kenneth Courtney
hero: full-screen cover hero type (WordPress-style full-bleed home)
Kenneth Courtney
types: regen payload-types for GoogleReviewsBlock
Kenneth Courtney
railway: pre-deploy checklist, sequence-repair, cost/size reality + trim build context
Kenneth Courtney
chat: LEO bubble header deep-links to full-width Spaces + shows space/channel binding
Kenneth Courtney
provision: reachable portal domains on self-host
Kenneth Courtney
260719 handoff — self-host container/env config map + session work + on-deck
Kenneth Courtney
leo: create_event tool — LEO can now make calendar Events
Kenneth Courtney
chat: render the reuse-image picker in compact mode too
Kenneth Courtney
leo: order-history health query used invalid 'pending' enum
Kenneth Courtney
leo: gate federation out of the enterprise health check when flagged off
Kenneth Courtney
ai: use gemini-flash-latest alias for direct Google Flash tier
Kenneth Courtney
media: coerce media relationship ids to Number in analysis + AI-bus hooks
Kenneth Courtney
comments: coerce page-channel space/tenant ids to Number
Kenneth Courtney
booking: don't clear the deposit form when clicking the current wizard step
Kenneth Courtney
routing: resolve tenants by bound domain aliases, not just primary domain
Kenneth Courtney
booking: confirm booking on deposit payment (server-verified)
Kenneth Courtney
booking: soft-hold expiry so abandoned deposit checkouts free the slot
Kenneth Courtney
reviews: GoogleReviews block (Places API) for pages/posts/products
Kenneth Courtney
stripe: runtime-config provider for NEXT_PUBLIC keys (self-host)
Kenneth Courtney
booking: pass Stripe publishable key from server to deposit step
Kenneth Courtney
booking: drop relationship sort + log provider resolution
Kenneth Courtney
booking: resolve provider to whoever configured availability
Kenneth Courtney
leo: fail over to a direct provider on GATEWAY rate-limit too
Kenneth Courtney
routing: /products redirects to /shop instead of 404
Kenneth Courtney
cart: make Add To Cart visibly confirm + explain disabled state
Kenneth Courtney
checkout: pass Stripe publishable key from server at runtime (self-host)
Kenneth Courtney
checkout: don't reuse cart line-item id as transactions_items id
Kenneth Courtney
re-trigger deploy (prior build hit transient 'bad object' git fetch on Vercel)
Kenneth Courtney
checkout: db-repair-sequences ops endpoint — heal drifted id sequences
Kenneth Courtney
260719 handoff for the next dev thread
Kenneth Courtney
dashboard: hide federation viz + welcome banner on tenant dashboards
Kenneth Courtney
payments: clear error + lazy key resolution when STRIPE_SECRET_KEY missing
Kenneth Courtney
identity: identity-graph schema + migration design (for review)
Kenneth Courtney
image-gen: native Gemini generateContent path (not OpenRouter)
Kenneth Courtney
State of The Angel OS — have/testing/open-items + locked identity graph
Kenneth Courtney
ai: consolidate image-gen onto the existing providerHealth breaker
Kenneth Courtney
ai: fail-soft/fail-up provider chain with passive circuit breaker
Kenneth Courtney
image-gen: IMAGE_PROVIDER env override for node-level provider choice
Kenneth Courtney
federation: de-couple hardcoded node domains → config/DB-driven
Kenneth Courtney
platform: payloadnuke.com is a first-class platform apex
Kenneth Courtney
appointments: List / Calendar view toggle with month grid
Kenneth Courtney
analytics: only mount Vercel Analytics/SpeedInsights on Vercel
Kenneth Courtney
spaces: bare /dashboard/spaces lands on the tenant's default space, not platform '1'
Kenneth Courtney
media: chat-attachment tenant follows the space, not the cookie
Kenneth Courtney
clearwater: shop pagination, Book nav, services dashboard, /products links + Soul Van service
Kenneth Courtney
260718 handoff — self-host live, focus areas (onboarding, monetization, rentals vertical)
Kenneth Courtney
cors: allow *.payloadnuke.com (self-hosted primary node)
Kenneth Courtney
portal: unify dashboard chooser on FQDN (matches brochure)
Kenneth Courtney
types: regenerate payload-types (commission_endeavor Circle/kind desc)
Kenneth Courtney
local self-host build guide + 260717 handoff; AGENTS build path
Kenneth Courtney
checkout: per-item remove (x) button in the order summary
Kenneth Courtney
contacts: Google People API import + LEO tool — bulk-pull contacts, config-free
Kenneth Courtney
onboarding: conversational first-run driver — new user -> Circle via LEO
Kenneth Courtney
portal: active-endeavor switch — smooth in-app portal<->endeavor, no subdomain reload
Kenneth Courtney
deploy: Dockerize Core for Railway (off Vercel) — validated locally end-to-end
Kenneth Courtney
nodes: resolve Merlin's URL dynamically from the registry — kill the hardcoded tunnel
Kenneth Courtney
readme: rewrite as a lean feature map — drop the sprint/dev-push history
Kenneth Courtney
search: proxy Leo's web search through the Merlin node (residential IP + offload)
Kenneth Courtney
nav: promote Spaces to the top of OVERVIEW — Home, Dashboard, Spaces, My Circles
Kenneth Courtney
leo: harmonize COO prompt to the locked model (53) — Endeavor, not Enterprise
Kenneth Courtney
tenants: Circle creation seam + guardian-angel flavor backfill (53) — best-guess answers
Kenneth Courtney
tenants: tenant flavors (53) — Circle/Business/Guardian Angel/Personal Portal as first-class types
Kenneth Courtney
leo: generated images become message attachments — land in the channel gallery
Kenneth Courtney
vocab: lock the canonical model (53) — Enterprise=root, Tenant=primitive, Endeavor=tenant-you-organize-around
Kenneth Courtney
vocab: unify Enterprise/Endeavor toward canonical (53) — pass 1, UI surfaces
Kenneth Courtney
admin: regenerate importMap for R2 — admin was blank across all collections
Kenneth Courtney
addresses: add Remove — the ecommerce hook has no delete
Kenneth Courtney
cards: Leo product/post create-update drops a home-screen card link
Kenneth Courtney
circles: 'Open' hops to the circle's own portal FQDN, not /dashboard/spaces
Kenneth Courtney
dashboard: delete orphaned code from the retired setup wizard (53)
Kenneth Courtney
endeavor-type: one canonical option list (53) — colocated with the union
Kenneth Courtney
branding: one canonical font catalog (53) — kill the drift
Kenneth Courtney
docs+chore: AGENTS.md node-bootstrap runbook + CSP/build-skip refinements
Kenneth Courtney
dashboard: retire the Enterprise Setup wizard, collapse the setup surfaces
Kenneth Courtney
images: allowlist r2.dev for Next/Image — storefront images resolve post-R2
Kenneth Courtney
vision: feed image BYTES to the model, not a rate-limited r2.dev URL
Kenneth Courtney
media: device direct-upload endpoints — large clips past the 4.5MB wall
Kenneth Courtney
deps: resync pnpm-lock for storage-s3 pin — unblocks the R2 build
Kenneth Courtney
media: flip to Cloudflare R2 — cutover
Kenneth Courtney
media: R2 storage wiring (dormant) — direct-upload + zero-egress, ready to flip
Kenneth Courtney
media: allow small video clips (Phase 1) — size-guarded direct upload
Kenneth Courtney
cards: page-published directive — the first real auto-trigger
Kenneth Courtney
auth: passwordless email-OTP login (request + verify)
Kenneth Courtney
cards: directive cards — Core pushes a home-screen card to the device
Kenneth Courtney
vercel: skip prod builds for docs-only pushes (ignoreCommand)
Kenneth Courtney
provision: channel create sends a NUMERIC space id — the real empty-Community-space cause
Kenneth Courtney
diag: probe can run the onboarding preamble first to reproduce the poisoned context
Kenneth Courtney
diag: temp probe-channel-create endpoint — find which create strategy survives prod
Kenneth Courtney
provision: run community-channel writes as super_admin — the real empty-space cause
Kenneth Courtney
provision: community-space channels created reliably — thread req + surface errors
Kenneth Courtney
Merlin deploy truths — vmc-only runner, zombie-restart fix, dynamic tunnel live
Kenneth Courtney
rbac: channels + messages opt out of the multi-tenant access-AND
Kenneth Courtney