A running log of what has shipped, what is in progress, and what is coming next.
Launch prep + warm list outreach wave 1
Email code fixes — sendTradeApproved prod URL, adminRoutes:2772, PL235 plain-text upgrades
Pre-launch tidy batch — browse nav, 3 missing SVGs, invoice terms, attribution, Shopify column cleanup
Email sequences — founding cohort onboarding, post-signup, post-completion nudge
Invoice tool completion — review page (PL519), talk-to-invoice prompt v2 (PL520), mic button (PL521), phone on PDF (PL522)
Re-enrichment scheduler OR category data wiring
Re-enrichment scheduler OR faq_json rendering
Post-launch issues triage
Pre-launch tidy batch — browse nav, 3 missing SVGs, invoice terms, attribution
Learn pages generator — generate_learn_page.js, OpenAI GPT-4o, human review gate, 2/day
FAQ + regulations audit — review all faq_json for regulatory claims, flag uncertain items, fix before learn pages
PL414 Mac C — Re-enrichment scheduler
Direct message threads between trades and clients inside the platform, with email and SMS fallback via Twilio.
A public page showing jobs posted but not yet matched to a trade, by category and town. Helps unregistered trades see real demand before signing up.
Admin scope detail page unlocks query now drives from trade_scope_copies instead of trade_scope_unlocks. Fixes case where unlocked trades did not appear in the admin view.
sendAdminDisputeRaised plain-text alert to ADMIN_EMAIL added. Wired to POST /client/scope/:ref/dispute and POST /trade/scope/:ref/dispute. Trade dispute route was incorrectly sending to POSTMARK_FROM — fixed.
New Postmark template bs-job-status-update (id 45100549). sendTradeCompletionSubmitted and sendClientSignoffConfirmed added. Admin status overrides to scheduled, invoiced, and completed now send bilateral emails to both trade and client.
POST /admin/clear-lockout/:email deletes all rows from portal_auth_codes for that email. Button added to admin trade and client detail pages with inline success state. Logs lockout_cleared to audit_events.
Amber pending offer banner added to client scope detail page. sendClientInvitedOfferingReceived personalises email for nominated trade. "Other trades" counter suppressed for nominated scopes.
POST /trade/scope/:ref/offering secondary guard now only fires when scope status = invited. Active scopes skip the guard. COALESCE(contact_email, invited_client_email) pattern for reading client email from canonical_json.
Nominating trade notified via sendTradeInvitedScopeActivated on client activation. Client copy personalised with trade name throughout. Nominated scopes hidden from marketplace feed (nominated_by_trade_id IS NULL). Teaser bypass for nominating trade.
Invited scopes bypass the before-photo gate. Button label shows "Activate scope — free" or "— £2.50" based on credit balance. nominated_by_trade_id added to GET and POST scope detail queries.
Migration 032 (invite_sent_at, invite_token). Trade pays £2.50 to send client invite. Client claims via /client/accept-invite. Pending trade guard added. /start success redirects to /login not /register.
add-postmark-template.js rebuilt as canonical S196 layout system. sendClientCreditIssued and sendAdminScopeActivated added. Client scope edit gate removed — edit always available. ?activated=1 banner placement fixed.
All 339 categories enriched with UK market pricing (price_min/price_max), typical_duration, extras_clause, FAQs, and meta descriptions. Circa price display for same-price ranges. Enrichment Prompt Standard v1 locked.
Brand consolidation: brand.js, wordmark functions, Staines.Build rename, BRAND_WORDMARK_SIZE, stainesAiHtml() throughout
Launch prep + warm list outreach wave 1
/features/invoices public page, featureRoutes.js, landing card, gate 3→10, PL528
sendTradeApproved sign-off — Staines.Build team copy, removed personal James sign-off
Referral credit £2.50×2 → £5.00×1, UI copy updated, PL526 raised
Email polish: bs-trade-categories-ready, referral email canonical HTML, email-system.md, scripts/email.js
PL235 — 7 plain-text notify* functions → Postmark templates. PL527 raised.
sendTradeApproved env-aware URL (tradeBase), adminRoutes:2772 → sendTradeCategoryActivated
Email brand name fix — Staines.Build (amber .Build) in header + footer, all 38 templates
Email template standardisation — 38 Postmark templates rebuilt, canonical layout, all CTAs fixed
Email audit — docs/email-audit-s195.md. All 53 functions + 38 templates audited.
Admin nav Settings dropdown, clickable stat chips, GET /admin/scopes/completed
proGateCard → /trade/subscribe (Coming Soon removed, Stripe live)
Trade referral system — migration 030, referrals page UI, 4 backend routes, admin card + remove, email templates
PL audit — 16 items confirmed live and archived. CLAUDE.md rewritten with PL Closure Rule.
Trade approval flow + S190b–S190h (8 sub-sessions)
iPad planning — AI OS architecture review, schema spot-check, AI_OS_REVIEW.md + POST_LAUNCH_BUILD_ORDER.md created
Intake 400 regression fix, /register redirect + pre-fill + scope claim, CATEGORY_SLUG wiring
Credit balance chip, empty dashboard state B+C, offering confirmation, expiry pill, approval email, drift checker
Credit balance nav chip, empty dashboard state (B+C), offering confirmation, expiry pill, approval email rewrite, staging migrations 027+028, drift checker, staging-first rules locked
Invoice tool completion — review page, v2 prompt, mic button, phone on PDF, trade_invoices table
S190: Fix duplicate approval route (sendTradeApproved now fires). Add sendAdminTradeSignupAlert on both signup paths. Pending dashboard overlay for founding cohort trades.
/updates ref pill removed, /changelog GitHub API, Platform footer section, changelog sync automated, DB cleanup
Trade↔platform communication channel — two-way message thread, trade inbox, admin thread view, Postmark notify
Invoice tool: admin controls, migrations 023–025, GET/POST /trade/invoices routes, PDF + Postmark
iPad alignment — trade approval model, session plan, warm list outreach prep
Invoice PDF full rewrite — brand + amendments + removed items
FAQ re-enrichment + icon column + footer icons + fallback
icon column, FAQ re-enrichment, trade type validation gate.
faq_json accordion + FAQPage schema
Enrichment script + price/cert/scope scripts
Migration 021 + slugs + category query fix
Post-launch emergency fixes
Legal docs review
Soft launch checklist + emergency fixes
Staging DB sync
PostgreSQL backup script
Status history wiring + job expiry cron
Admin health page
Unified join page at /join + join.staines.build
Generic public intake at /start
Sitemap + Schema.org + canonical tags + robots.txt
Reference docs overhaul + handover backfill
Homepage trade tiles → /browse?type=<key>, browse filter on load
Shopify scripts deleted. Handovers 144-164 archived. Parking lot consolidated. PL330, PL331, PL409 added pre-launch. Session order S166-S173 locked. ARCHITECTURE.md updated.
Public changelog at /updates
Landing page (staines.build)
Postmark email suppression handling
Seed category content (38 Tier 1 rows)
Added a public footer with live category links across all public pages. Trades now have a public scope list page showing their completed and active jobs.
Visitors can request a quote directly from a trade profile page. The AI chat collects job details naturally, then creates a draft scope pre-assigned to that trade.