v1.1.0: v1.1.0 — first staging-first prod release
v1.1.0 — first production release under staging-first discipline Marks the first prod cutover that ran through the staging-first workflow documented in CLAUDE.md + DEPLOYMENT.md. From here on, every production change goes: push to main → CI → auto-deploy to demo.kotobaseed.net → ≥24h soak → tag vX.Y.Z → maintenance banner ≥12h ahead → Sophia approves in the production GitHub Environment → deploy + smoke → drop banner. This release rolls up everything shipped after v1.0.0: Chat - Rate limits on offer / accept / reject / demo-video write paths - WS broadcast throttle (TYPING + READ_RECEIPT) - Mobile UX overhaul: single-pane phone layout, 44px tap targets, sticky safe-area composer, responsive offer modal - Inline OfferModal extracted to its own component Page builder - Auto-save (manual Save button retired) - TipTap rich-text fields with R2-backed image upload - Tier-2 schools blocks: Team roster, Programs showcase, Booking CTA - Public team endpoint backing the roster block Demo conversion funnel - Brand wizard at /try/tutor/build (theme → bio+photo → languages → live preview) - Stripe Connect chained into the demo-to-real conversion handoff - Demo sealed: chrome + tutor menu stay on demo.kotobaseed.net; /login and /register redirect to /try Safety + correctness - Stripe environment boot-guard (refuse sk_live_ + ENVIRONMENT=test AND sk_test_ + ENVIRONMENT=production) - Datetime UTC normaliser sweep finished — AuditLog, Ticket, RecurringPlan, Project, TeacherRating, Notification - sweep_expired_trials wired into APScheduler (daily 04:15 UTC) Process - CLAUDE.md + extended DEPLOYMENT.md encoding the staging-first rule - PRE_DEPLOY_CHECKLIST.md for per-release staging walks - SECRET_ROTATION.md for the quarterly key roll - GH Actions deploy-staging.yml fixed for BEERANKED_KEY var resolution Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>