Skip to content

Promote develop to main: take-and-run, voice setup, SMS ceilings, Node 24, Railway IaC, landing page (#15–#20) - #23

Merged
rvegajr merged 19 commits into
mainfrom
develop
Oct 1, 2026
Merged

rvegajr merged 19 commits into
mainfrom
develop

Conversation

@rvegajr

@rvegajr rvegajr commented Oct 1, 2026

Copy link
Copy Markdown
Member

Promotes develop (f4e2b13) to main, which deploys production. This is the same code that's live on uat via #22.

PR What
#15 Weekly times kept 8 weeks ahead; one-minute tick (top-up, offer cascade, 24h reminders); name-only sign-up; coach nav
#16 Talk your week in: setup draft → preview → Publish
#17 One guarded SMS send path with the SPEC §10 ceilings; test servers bind 127.0.0.1
#18 Node 24 LTS, Express 5, PGlite 0.5, TypeScript 6, ESLint 10
#19 .railway/railway.ts replaces railway.json
#20 Landing page with a "say your week" box; texted week → one-time start link

Migrations 0007–0010 are additive only and have already run cleanly on development and uat.

Verified on uat (21bbe13): boot log Coachatron listening on 3000 (Node v24.21.0), / serves the week box, /signin 200, DB-backed routes answer, /start/<bad token> 410, and /app/schedule redirects when signed out.

Rollback: production's current deployment is on 97012f4 with Node 24.

🤖 Generated with Claude Code

rvegajr and others added 19 commits September 30, 2026 09:30
Weekly times are saved and filled 8 weeks ahead, and a one-minute tick
keeps them topped up, advances expired overflow offers, and sends 24-hour
reminders outside quiet hours. Sign-up needs only a name, schedule cards
open the session, every coach screen shares one nav, and overflow texts
name the session and the backup coach's pay.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
On the schedule screen, a coach with nothing on the calendar says their
week into one box (or texts it). The model fills a closed setup schema;
product code validates it, asks for a missing price or headcount instead of
guessing, renders the preview, and writes nothing until Publish. Publish
runs once and reuses anything that already exists. PLATFORM.md R5 gains an
additive-setup exception.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Every text now goes through sendText: one segment (typography flattened
so it never silently becomes UCS-2), +1 destinations only, 300 per coach
per day, 2,000 per coach per month, 400 per active coach per product day
with a floor of 500, and 5 sign-in codes per number per day. Every attempt
is logged. Adds an opt-in eval of voice setup against the live model.

Test servers answer Connection: close, so fetch never reuses a dead
pooled socket when a later server gets the same port.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A bare listen(0) binds every interface, and macOS will give it a port
another program already holds on 127.0.0.1; a test's request to
127.0.0.1:<port> then reached that program and hung or got a 401.
listenLoopback binds loopback explicitly and waits for the port.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…erywhere.

.nvmrc and package.json engines name Node 24; a test keeps them and CI in
step, CI's required check reads .nvmrc, and a non-blocking job runs the
newest LTS and Current. Railway reads engines, so production moves from
22 to 24 on the next deploy. Express 5, PGlite 0.5, TypeScript 6.0,
ESLint 10, @types/node 24; npm ci refuses an older Node.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A RAILPACK_NODE_VERSION=22 variable, which Railpack reads before engines,
pins all three environments; merging this alone leaves production on 22.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
.railway/railway.ts describes the web service in development, uat, and
production, rebuilt from the live configuration with every variable
preserved. Plan reports it already matches all three environments, and it
has been applied to each with no change. It owns only web, so Postgres and
slack-cards are untouched. RAILPACK_NODE_VERSION comes from .nvmrc.
railway.json is deleted before Railway's 2026-12-01 cutoff.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Keep a coach's week on the calendar and run the background work
Let a coach talk their week in and publish it
Stop a texting loop in the send path, and fix the flaky test servers
Run on Node 24 LTS and current dependencies, with one Node version everywhere
Move Railway from railway.json to Infrastructure as Code
The stub at / is a Postcard marketing page. Typed text rides a cookie through
phone sign-in; a stranger's text gets a one-time link. The model runs only
after the phone is proven, and nothing goes live until Publish.

Co-authored-by: Cursor <cursoragent@cursor.com>
Say your week on the home page and start taking bookings
@rvegajr
rvegajr merged commit 1a17e40 into main Oct 1, 2026
10 checks passed

This branch was previously deployed

1 inactive deployment
coachatron / development — f4e2b132 Deployed Oct 1, 2026 by railway-app[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant