Main #4116
fix(inbound): never auto-create domains rows; case-insensitive domain resolve (#111)
fix(inbound): case-insensitive domain + mailbox lookup in the router (#110)
feat(inbound): HTTP_HOST bind address so the webhook can be tailnet-only (#109)
feat(web): show a "new version available" prompt instead of requiring a manual hard-refresh (#108)
fix(nav): fail open on unknown role + feat(domains): move a domain to another workspace (#107)
feat(mail): AlecRae⇄Vapron adapters — outbound relay provider + inbound webhook (#171) (#106)
docs: correct the mail architecture — AlecRae rides on Vapron (kill the dedicated-mail-box fiction) (#105)
fix(domains): normalize domain to lowercase + case-insensitive lookups (mailbox/send/receive) (#104)
docs: record the 2026-08-08 production deploy (c908fc4); tick go-live Phase 0 (#103)
docs: add the canonical business-email go-live checklist (#102)
fix(dns): add a per-domain fix hint to Porkbun auth errors (#101)
feat(admin): make multi-platform business email come together — mailbox-aware inbox, setup wizard, workspace badges, nav de-clutter (#100)
feat(mta): MTA_RELAY_MODE overflow - send at full volume via relay while the cold IP warms in parallel (#99)
docs: close issue #143 to the archive - the e2e suite now executes in CI (PR #96) (#98)
ci: execute the e2e API suite against a live API on every push (#143) (#96)
fix(honesty): eliminate the fabricated-output batch - real implementations or honest refusals at ~16 sites (#166) (#97)
feat(inbound): emit email.received events + webhooks for mail arriving on our own MX (#169, bounded half) (#95)
fix(spine): close the receive chain's six breaks + send-path traps found by the 2026-08-07 spine audit (#164, #165) (#94)
docs: restructure CLAUDE.md into a lean operating doc; archive full history (#93)
chore: allow gh pr merge/ready and gh read commands without prompting
docs: record the 2026-08-06 production deploy; close issue #104
Merge audit/production-readiness-2026-07-28: issues #120-#163
fix(ci): make the dependency audit actually audit; correct four SOC 2 attestations (#161)
docs: record #159/#160 as fixed; tidy the disabled scripts endpoint
fix(warmup): make adaptive safety actually fire, on every send path, in recipients (#159)
fix(security): encrypt DKIM private keys at rest (#160)
docs: record the 2026-08-05 production-readiness audit (issues #155-160) + 115-commit prod-stale finding
fix(ops): box-deploy must not restart the emergency-stopped MTA; drift check must see IPv6 binds
fix(security): unscanned attachment is not a clean verdict
fix(send): derive compliance unsubscribe/address from the real body, not hardcoded false
fix(scripts): disable RCE via /scripts/:id/test new Function() escape
fix(db): correct out-of-order migration journal that would skip 0008-0010 on next deploy
docs: regenerate route-coverage.md (was 3+ weeks stale while listed as authoritative)
fix(web): make all legal pages publicly reachable; remove footer links to nonexistent pages
fix(ui): define the accent and text-text colour vocabularies; stop the attachments header claiming virus scanning
fix(health): MTA probe verifies a worker is consuming the queue, not just that the queue is readable
fix(ui): define the 573 colour utilities the app was already using
fix(inbound): close the open relay in the receiver, before it is deployed
docs: record the business-email path, and #152/#153/#154
fix(send): unify the pre-send gate across every producer (#151)
feat(mailboxes): mailbox management UI + PATCH endpoint
fix(inbound): file quarantined mail into spam instead of the user's inbox
docs: session pause — resume point at the top of NEXT ACTIONS
docs: reopen+refix #124 on the agent builder; log #151 (producers skipping the gates)
fix(agent): header injection on the agent send path (issue #124, second builder)
docs: record #76(c) as fixed — both label systems were write-only
fix(labels): unify the two label systems and make labels readable at all (#76c)
docs: record the route-header mount-path fix across all six files
fix(docs): route headers stated mount paths that did not exist (#73k, #74h, #75f)
docs: record #75(d) as fixed, noting both halves were understated
fix(scheduling): conflict window looked at the wrong date; meeting type was never classified
docs: record #75(b) and #75(c) as fixed
fix(sentiment): repair trends query and two more mismatched cursors (issue #75b, #75c)
docs: record #73(a) and the #74(g) cursor half as fixed
fix(meetings,pagination): stop persisting fabricated summaries; correct keyset cursors
docs: record #73(e)(f) and #76(g) as fixed
fix(delegation,programs): enforce expiry and reviewer authz; stop dry-runs polluting stats
docs: record #76(b) fixed and #76(d) already-fixed-but-listed-open
fix(inbox,dns): real thread identity for mutes; honest Vapron DNS failure
docs: issue #111 fully closed — Redis client pooling
refactor(redis): one shared client, closed once (closes issue #111)
docs: record issues #149 (split-box Redis) and #150 (unrunnable preflight)
fix(infra): shared Redis over the tailnet, and make preflight actually runnable
docs: issue #113 fully closed — (b) SMTPUTF8/punycode and (c) MIME bounds
fix(mta): punycode domains and detect SMTPUTF8 need (issue #113b)
fix(mime): bound multipart nesting and width (issue #113c)
docs: record the DNS and AI halves of issue #111 as fixed
fix(ai): handle Claude 429/529 explicitly instead of failing over silently
fix(mta,inbound): bound every DNS lookup (issue #111, DNS half)
docs: record issue #113(a) as fixed — three charset bugs, not one
fix(email-parser): honour declared charset on import (issue #113a)
fix(dns): customer DMARC reports could never be delivered (issue #148)
docs: record the provider 429-backoff half of issue #111 as fixed
fix(sync): back off when Gmail/Outlook rate-limit us (issue #111, first half)
fix(tracking): throttle event recording — the public endpoints amplified into customer webhooks
docs: record issues #144-146 (DKIM fail-open, open redirect, unrun services)
fix(tracking): close the click-tracking open redirect
fix(mta): refuse to send unsigned mail — DKIM signing was failing open
docs: record issues #141-143 (fabricated virus verdict, random rule test, dead e2e suite)
fix(attachments,rules): stop fabricating a virus verdict; make rule-testing real
fix(lint,test): clear the four lint errors and a CI flake in the dunning tests
docs: record the warmup-ramp and API_URL findings (issues #139, #140)
fix(deliverability): enforce the IP warmup ramp and require API_URL in production
docs: record the false-automation empty states (#138)
fix(web): six empty states promised automation that will never happen
docs: record the ignored-degradation findings (#137)
fix: honest degradation signals the UI ignored — placeholder text shown as AI output
docs: record the envelope/contract sweep (#136)
fix: response-envelope and request-contract mismatches found by a sweep
docs: record the AI-quota-on-reads finding (#135)
fix: AI quota was charged for reads that make no AI call
docs: record the Sent-page 422 (#133) and the fabricated-fallback sweep (#134)
fix(web): delete dead API surfaces that fabricated user data
docs: tick off Sent; record that the audit missed a rejected request
fix: the Sent page 422'd on every load, and its "Opened" badge was always false
docs: record the auth-mount gaps (#131) and correct the dispatcher estimate (#132)
fix: five routers 401'd on every request — no authMiddleware was mounted
docs: record the unbounded ingestion AI spend (#130)
fix: bound AI spend on the mail-ingestion path (unbounded per-message cost)
docs: Phase 1 complete — all seven broken journeys closed
fix: repair the Integrations page — the last broken journey
docs: tick off Security Overview in the journey audit
fix: repair the Security Center Overview tab (404'd for every user)
docs: record the E2EE fabrication (#129)
fix(security): stop the server minting encryption keys; remove the false E2EE claim
docs: record iteration 4 (MTA receiver root cause #128, credential stuffing #117)
feat(security): per-account failed-login tracking + credential-stuffing detection (#117)
fix(mta): the outbound service should never have listened on port 25 (#105 root cause)
docs: record the open-relay and Return-Path findings (#127, #82a)
fix(mta): close the open relay (#105) — it was never actually fixed
feat(mta): VERP return path so async bounces actually reach suppression (#82a)
docs: record the spam-protection pass (issues #117, #124-126)
feat(security): send-volume anomaly detection; close connected-account abuse gaps
fix(security): close header injection on the send path; wire the outbound spam gate
fix: repair the Achievements journey; stop rendering invented badges
docs: correct stale claims found by the 2026-07-28 audit
feat: make Drafts real — persistence, list filter, reopen without data loss
fix: repair the Files journey; enforce storage quota, which nothing did
fix: repair the Translation journey end to end; stop quota burn on reads
fix(web): make PlanGate derive its tier from FEATURE_PLANS
fix: repair @alecrae/ai-engine packaging; restore 46 non-executing tests
docs: full 49-journey ground-truth audit + build plan
feat: GDPR Article 15 self-service export; fix Google OAuth test-user doc gap
feat: dunning notification emails, real Vapron transport, real file/voice storage
docs: record round 2 of the audit backlog fixes (9 more issues closed)
fix: handle Outlook delta-query deletions (issue #113e)
fix: prevent duplicate Stripe subscriptions on repeat checkout
docs: warn that JWT_SECRET rotation breaks OAuth token decryption
feat: add live service/port drift detection (issue #112)
fix: wire the real bounce classifier into delivery events (issue #113d)
fix: anti-injection framing for lib/ai.ts's aiComplete() (issue #118)
docs: verify migration 0008's unique constraint is safe on production
fix: delegation cross-workspace/cross-account gaps + push re-parent
fix: apply SSRF guard to webhook delivery, integration test, transcription
docs: record the incident, the full audit, and remaining findings
fix: add Stripe webhook idempotency
fix: account deletion honors a real 30-day soft-delete window
feat: add process-wide AI spend circuit breaker
feat: add PII redaction before the automatic AI triage call
fix: anti-injection framing for all ai-writing.ts prompts
fix: DB-level dedup constraint + apply Gmail-reported deletions locally
fix: wire the built-and-tested DSN bounce processor into inbound
fix: unsubscribe now actually writes to suppression, not just analytics
fix: make offline compose actually queue and send, not just claim to
fix: add per-IP abuse throttling to the MTA SMTP listener
fix: wire TlsManager into the MTA — was hardcoded off entirely
fix: scope gamification leaderboard to caller's account
fix: close cross-tenant passkey deletion in account.ts
fix: close chat.ts IDOR — every channel route trusted the URL alone
docs: record the Jarvis production deploy + drift-check timer going live
fix: deploy-drift-check bugs found during first live install on Jarvis
feat: wire email.received webhook event, fix event-type naming mismatch
fix: stop files/upload and voice-message record silently losing data
docs: enable branch protection on main, record issue #66 follow-up
feat: deploy-drift detection — expose commit SHA + scheduled drift check
docs: record issue #102 (AI usage quotas) and close out this session's pass
feat: add AI usage quotas — no ceiling on Claude spend previously existed
docs: record issues #98-101 — voice-clone gating, ai-writing honesty, scope audit, dictation UI
feat: wire dictation into compose — "reply by voice" is now real
fix: grant 6 more missing baseline scopes — agent, collaborate, dictation, templates, translate, programs, calendar, analytics:read
fix: ai-writing.ts — honest degraded flag instead of fake confidence on fallback
fix: voice-clone plan gating + honest AI-unavailable response
docs: record issues #93-96 — rule engine, semantic-search indexing, ai-intelligence fakes, local grammar
fix: ai-intelligence.ts writing-coach + predictive-actions — real Claude calls
feat: wire the local WebGPU grammar engine into compose
fix: auto-index new mail into semantic search
feat: build the email-rules execution engine — rules previously never ran
docs: record issues #88-92 — state persistence, snooze, undo-send, DNS page, 5-router accountId bug
fix: broken accountId context lookup in 4 more Tier-7 AI routers
fix: sentiment-timeline.ts — real Claude analysis + broken accountId lookup
fix: encrypt OAuth tokens + IMAP/SMTP passwords at rest (issue #80)
fix: close the send-time engagement tracking loop
fix: domains page shows real DNS records; translate.ts cross-tenant cache leak
fix: wire up undo-send — registerUndoable had zero callers
fix: snooze end to end — missing list endpoint, metadata clobbering, no resurface
fix: real read/starred/folder state for emails — archive/delete/star now persist
fix: grant inbox:*/recall:* baseline session scopes (issue #45/#49 class)
docs: record the 2026-07-19 audit + Big Five fixes (issues #79, #84-87)
fix: enforce plan tiers server-side for Pro-gated AI features
fix: make workspace invitations actually reachable end to end
fix: Gmail/Outlook sync accountId bug, background re-sync, honest security data
docs: known issue #83 — VAPRON_API_KEY wrong scheme (vpk_ vs btf_sk_), all Vapron integrations 401 in prod
docs: record Vapron DNS provider ship + deliverability pre-send gate (issue #82)
test: raise timeout on first snooze.js import test (flaked 2x under parallel load)
feat(dns): Vapron DNS auto-config provider — zero-credential record push
docs: ground-truth pass — deploy drift incident, Redis reality, new known issues 78-81
feat(web): add Domains to admin sidebar nav
fix(web): founder bypass in PlanGate and session diagnostics on settings
fix(api): reconcile owner plan on /me and switch-workspace, expose isFounder and scopes
docs: refresh DEVOPS_TRACKER coverage snapshot after wiring campaign
feat: UI wiring tranche 5 — settings cluster + semantic search (75% -> 78% floor)
feat: UI wiring tranche 4 — inbox/compose power features + 3 domains (68% -> 75%)
feat: UI wiring tranche 3 — intelligence/analytics tail, 5 domains (61% -> 68%)
feat: UI wiring tranche 2 — AI-intelligence cluster, 5 domains, ~55 endpoints (53% -> 61%)
feat: UI wiring tranche 1 — 5 domains, ~56 endpoints (46% -> 53% coverage)
fix: eqeqeq lint errors in godaddy.ts — CI lint (and everything gated on it) red since 2026-07-04
docs: Phase 0 COMPLETE — PTR changed to smtp.alecrae.com, FCrDNS verified
docs: Phase 0 mail DNS executed — smtp.alecrae.com is the MTA identity
docs: add DNS end-state roadmap — staged Cloudflare exit onto Vapron DNS
docs: record mail-box decision (Option A: 158 stays as dedicated mail box)
docs: disambiguate box naming — 158 = 149.28.119.158 (old Vapron box)
docs: full 2026-07-13 audit — Bible overhaul, mail plan, postmortem, infra doc sweep
fix: repair 3 typecheck breaks that kept main red since 2026-07-04
docs: record 2026-07-07..11 outage root cause + resolution in DEVOPS_TRACKER
feat: automated route-coverage tracker + kill orphaned apps/admin
fix: first full codebase audit — ~30 bugs across 16 files
fix: inbox error boundary + workspace domain filter race condition
Merge pull request #90 from ccantynz-alt/claude/admin-workspace-account-limit-gm2wza
fix: plan tier never reached the UI, plus pre-existing CI lint/type errors
feat: multi-workspace support — one login, several separate businesses
fix(documents): wire AI-assist endpoint to Claude via aiComplete()
fix(documents): implement real markdown and HTML document export
fix(billing): unify quota enforcement to Redis counter as single source of truth
fix(billing): wire processExpiredGrace() on a daily interval at startup
fix(billing): normalize API plan tier names to frontend PlanTier values
fix(auth): unblock /dpa/sign and /forgot-password from auth middleware
fix(auth): issue admin:read and admin:write scopes to owner/admin roles
fix(security): verify WebAuthn assertion signature in passkey login
feat: wire Postmaster Tools v1 reputation + v2 compliance monitoring
docs: ground-truth CLAUDE.md update from 2026-07-01 audit
fix: encrypt meeting tokens with AES-256-GCM (closes known issue #29)
chore(security): stop tracking .env.production/.env.test in git
Merge pull request #89 from ccantynz-alt/claude/ecstatic-hopper-77iamv
fix: use strict equality in ai-triage page (eqeqeq lint rule)
feat: AI Triage page + fix Inbox Agent broken endpoint + docs sweep (part 2)
docs: sweep all infra docs to Vapron-only, remove Vercel/Fly.io/CF Pages
fix: prevent stale-page caching that broke platform after deploys
Merge pull request #88 from ccantynz-alt/claude/ecstatic-hopper-77iamv
feat: DNS auto-configuration for Cloudflare, GoDaddy, and Porkbun
docs(claude): record issues #56 and #57 as fixed in PR #87
Merge pull request #87 from ccantynz-alt/claude/ecstatic-hopper-77iamv
feat(domains): DNS setup wizard with provider-specific instructions and auto-polling
fix(domains): add loading state and inline result feedback to Verify Now button
docs(claude): Vapron Type 2 migration complete — all DNS verified, smoke test passed
Merge pull request #86 from ccantynz-alt/claude/ecstatic-hopper-77iamv
fix(dns): remove non-null assertion to satisfy no-non-null-assertion lint rule
fix(dns): handle split DKIM TXT records from providers like Porkbun
fix(docs): correct Step 8 smoke test curl format in vapron-migration-type2
Merge pull request #85 from ccantynz-alt/claude/ecstatic-hopper-77iamv
fix: repair test mocks broken by connected-account fast-path
fix: route connected Gmail/Outlook sends through provider API, bypass MTA domain check
fix: remove all env-derived data from log output to clear CodeQL taint alert
fix: mask ACCOUNT_ID in log output to resolve CodeQL sensitive-data alert
docs: add Vapron Type 2 migration runbook and seed-vapron-templates script
Merge pull request #84 from ccantynz-alt/claude/ecstatic-hopper-77iamv
fix: replace != with !== to satisfy eqeqeq lint rule in import routes
fix: resolve no-empty-function lint error in workspace page catch handler
fix: go-live audit — Gmail/Outlook import, scope bugs, sidebar 404s, auth refresh
Merge pull request #83 from ccantynz-alt/claude/compassionate-johnson-wx8jgb
fix(ui): remove duplicate onBodyChange declaration in compose-editor
Merge remote-tracking branch 'origin/claude/compassionate-johnson-wx8jgb' into worktree-agent-ad66dda893bc71a5c
feat: dashboard overhaul — plan gating, 8 new product pages, sidebar reorganization, AI visibility
docs(claude): record issue #51 dashboard gap fix, update session status + timestamp
feat(dashboard): plan-gated product pages + professional sidebar overhaul
Merge pull request #82 from ccantynz-alt/claude/elegant-wozniak-yd2br4
fix(domains): crash-proof DomainCard and mapDomain against unexpected status values
fix: DNS records modal — tap-to-select values, Copy button with visual confirmation
fix: correct Domain.status field name mismatch (API returns status, not verificationStatus)
docs: record issues #48-50 and update session status
fix: crash-causing Box as=option, Automations scope errors, and auth bypass
fix(web): fix React hydration error #418 in QuickReply
docs(claude): update status — PRs #80+#81 merged, 9 new UI pages live
Merge pull request #81 from ccantynz-alt/feat/missing-ui-pages-batch2
feat(web): add A/B Testing page
feat(web): add Documents page (AlecRae Docs replacement)
Merge pull request #80 from ccantynz-alt/claude/code-audit-vapron-migration-6jya3k
docs(claude): record fixes #43-47 (hydration, MTA port, grammar, DNS modal, UI pages)
feat(web): add Team Chat page
feat(web): add Mail Merge page with campaign management
feat(web): add Shared Inboxes and Delegation page
feat(web): add Smart Folders page with full CRUD
feat(compose+domains): wire AI grammar checking + DNS records modal
Merge pull request #79 from ccantynz-alt/claude/code-audit-vapron-migration-6jya3k
fix(mta): use caught error in warn message (no-unused-vars)
Merge pull request #78 from ccantynz-alt/claude/code-audit-vapron-migration-6jya3k
fix(mta): make health server non-fatal, default port 8080→8082
Merge pull request #77 from ccantynz-alt/claude/code-audit-vapron-migration-6jya3k
fix(web): fix navigator.onLine hydration mismatch (React error #418)
Merge pull request #76 from ccantynz-alt/claude/code-audit-vapron-migration-6jya3k
Merge branch 'main' into claude/code-audit-vapron-migration-6jya3k
docs(infra): update DNS zone + morning-setup for box deployment + Resend relay
chore: fix stale Vienna comment + document alecrae.com gateway routing
fix(api): graceful 503 when Redis unavailable on email send + CLAUDE.md status update
fix(infra): fix env template + docs for MTA/Redis/Resend on the box
fix(ui): guard navigator.platform access in QueryConsole for SSR
docs: update CLAUDE.md — mark issues #41/#29 fixed, update status + timestamp
fix(api): resolve ESLint errors in health.ts breaking CI
fix: unmount warmup route + add morning setup runbook for Craig
feat: enable warmup route + fix health detailed DB probe
fix(web): remove react-hooks/exhaustive-deps eslint-disable comment
feat(web): add indeterminate progress bar animation to Tailwind config
fix(onboarding): wire Go to inbox CTA to handleGoToInbox handler
feat: smart startup health check + real onboarding progress
feat(ai): auto-triage every incoming email with Claude Haiku
fix(sync): exactOptionalPropertyTypes — conditionally spread receivedAt
fix(sync): correct ReceivedAddress shape — use address field not email
fix: wire Gmail/Outlook sync to DB, remove Vercel, clean up for Vapron
Merge pull request #75 from ccantynz-alt/claude/code-audit-vapron-migration-6jya3k
fix(infra): fix env template + docs for MTA/Redis/Resend on the box
Merge pull request #74 from ccantynz-alt/claude/code-audit-vapron-migration-6jya3k
fix(ui): guard navigator.platform access in QueryConsole for SSR
Merge pull request #73 from ccantynz-alt/claude/code-audit-vapron-migration-6jya3k
docs: update CLAUDE.md — mark issues #41/#29 fixed, update status + timestamp
Merge pull request #72 from ccantynz-alt/claude/code-audit-vapron-migration-6jya3k
fix(api): resolve ESLint errors in health.ts breaking CI
fix: unmount warmup route + add morning setup runbook for Craig
feat: enable warmup route + fix health detailed DB probe
fix(web): remove react-hooks/exhaustive-deps eslint-disable comment
feat(web): add indeterminate progress bar animation to Tailwind config
fix(onboarding): wire Go to inbox CTA to handleGoToInbox handler
feat: smart startup health check + real onboarding progress
feat(ai): auto-triage every incoming email with Claude Haiku
fix(sync): exactOptionalPropertyTypes — conditionally spread receivedAt
fix(sync): correct ReceivedAddress shape — use address field not email
fix: wire Gmail/Outlook sync to DB, remove Vercel, clean up for Vapron
Merge pull request #71 from ccantynz-alt/claude/dreamy-wozniak-hlrxof
feat: real MBOX/EML import + nullable-domain email model (gap #39, 3/3)
feat(web): workspace setup (mailboxes + team) + fix systemic scope/auth trap (gap #39, 2/3)
feat(web): real admin console wired to /v1/admin/* (gap #39, 1/3)
Merge pull request #70 from ccantynz-alt/claude/dreamy-wozniak-hlrxof
fix: sidebar re-expand, silent token refresh, working Gmail/Outlook connect
Merge pull request #69 from ccantynz-alt/claude/loving-edison-25o6q3
feat(web): adopt the official 'Email, Evolved.' tagline on the landing page
feat(auth): owner allowlist — founder gets full access, never plan-gated
Merge pull request #68 from ccantynz-alt/claude/loving-edison-25o6q3
ci(deploy): one-command box deploy script + manual 'Deploy to Box' workflow
Merge pull request #66 from ccantynz-alt/claude/google-oauth-setup-UYn0R
Merge pull request #67 from ccantynz-alt/claude/loving-edison-25o6q3
feat(web,ui): re-skin dashboard to AlecRae identity + surface the AI layer
feat(web): premium landing redesign + first-run onboarding routing + role badge
fix(api): use stable JWT_SECRET (HS256) instead of ephemeral keys
Merge pull request #65 from ccantynz-alt/claude/code-audit-feature-gaps-acq2mv
docs(bible): record box-is-production deployment state; fix(web): Secure session cookie
feat(web): public /api/version deployment fingerprint
Merge pull request #64 from ccantynz-alt/claude/code-audit-feature-gaps-acq2mv
feat(deploy): Vapron job reads VAPRON_API_KEY from Vercel production env
feat(deploy): make Vapron deploy manually triggerable via workflow_dispatch
feat(deploy): one-command Vapron deploy path — script, runbook, gated CI job
Merge pull request #63 from ccantynz-alt/claude/code-audit-feature-gaps-acq2mv
feat(api,db): migrate all in-memory stores to Postgres + audit close-out (issues #26–#28, #31, #32)
fix(services): remaining .dev placeholder hosts in inbound/imap/support → .com / env-driven
feat(web,dns,mta,api): wire orphaned features, expose 7 new UI domains, kill .dev hosts, env fail-fast
fix(web): satisfy typed routes in sidebar onNavigate (router.push as Route)
Merge pull request #62 from ccantynz-alt/claude/code-audit-feature-gaps-acq2mv
fix(web,api): dead sidebar navigation + unprotected /v1/admin endpoints
docs: full feature-gap audit — web UI exposes ~20% of backend (issues #27–#30)
Merge pull request #61 from ccantynz-alt/claude/google-oauth-setup-UYn0R
fix(web): allow /google/callback through the auth middleware
Merge pull request #60 from ccantynz-alt/claude/google-oauth-setup-UYn0R
fix(lint): use T[] instead of Array<T> in google-workspace (eslint array-type)
feat(email): Google Workspace domain import (Phase 1) + approved Business pricing
Merge pull request #59 from ccantynz-alt/claude/google-oauth-setup-UYn0R
feat(email): native mailbox provisioning + harden Google sign-in
Merge pull request #58 from ccantynz-alt/claude/google-oauth-setup-UYn0R
fix(api): gate Redis on 'ready' to fix lazy-connect race (rate-limit/idempotency/quota)
fix(db): complete migration baseline (136 tables) + schema-drift CI guard
fix(db): reconcile schema drift that broke db:seed on fresh DB
Merge pull request #57 from ccantynz-alt/claude/google-oauth-setup-UYn0R
feat(api): support HOST env for loopback binding
Merge pull request #56 from ccantynz-alt/claude/google-oauth-setup-UYn0R
fix(api): boot from repo root on Vapron; fix BullMQ colon queue crash
fix(web): point client at production API instead of localhost
test(encryption): give DB keygen tests headroom over the 5s default
Merge pull request #55 from ccantynz-alt/claude/google-oauth-setup-UYn0R
fix(sync): correct Gmail-connect redirect URI default
Merge pull request #54 from ccantynz-alt/claude/google-oauth-setup-UYn0R
fix(vapron): rebuild platform client against published tRPC API
Merge pull request #52 from ccantynz-alt/claude/fix-web-lint-pricing
Merge pull request #53 from ccantynz-alt/claude/google-login-setup-p7ke2e
docs(infra): add Google sign-in go-live checklist
ci: gate credential-dependent workflows to keep the board green
fix(web): restore green CI — Reveal import + checkout Suspense
fix(web): remove unused fadeUp var failing web lint
Merge pull request #51 from ccantynz-alt/claude/docs-clean-and-green
chore(docs): enforce clean + green docs with timestamp CI gate
Merge pull request #50 from ccantynz-alt/claude/chore-docs-timestamp-remove-aws
Merge branch 'main' into claude/chore-docs-timestamp-remove-aws
chore(ci,docs): remove off-stack AWS deploy; add doc timestamp rule
Merge pull request #49 from ccantynz-alt/claude/vigilant-keller-7chXT
Merge branch 'main' into claude/vigilant-keller-7chXT
Merge pull request #48 from ccantynz-alt/claude/google-oauth-setup-UYn0R
feat(ai,email): Vapron AI fallback + transactional email + Face ID label
feat(vapron): typed REST client for Vapron platform (email, AI, storage, secrets)
feat(auth): add Sign in with Google (identity-only) to login
Merge pull request #47 from ccantynz-alt/claude/solid-block-specs-copy-vtOdH
ci: use canonical gitleaks [allowlist] format for test SAML keypair
ci: allowlist test-only SAML keypair in gitleaks; mark S1-S5/P4 done
fix: verify SAML assertion signatures + guard fallback secrets (S1, S4)
fix: ssrf-guard lint errors + Framer Motion off Hero (P4)
fix: SSRF guard on link-preview fetch (S3)
fix: persist E2E encryption keys to Postgres (S5)
fix: sign OAuth state to prevent account-linking CSRF (S2)
docs: record security review results + decision items (S1-S5, P4)
docs: SOC 2 Type I starter kit (C4 groundwork)
perf: cut landing-page JS + add real bundle-size CI gate
fix: critical auth-bypass + reflected XSS; wire real status-page uptime
Merge pull request #46 from ccantynz-alt/claude/solid-block-specs-copy-vtOdH
docs: update go-live gaps — G1-G5/G8-G10 done, add bundle/perf gaps P1-P5
feat: AI fallback hardening + dunning test + preflight/load-test polish
Merge pull request #45 from ccantynz-alt/claude/solid-block-specs-copy-vtOdH
ci: make GateTest a real gate (lint+typecheck+test+build)
feat: launch-hardening — preflight, dunning, DPA signing, load tests
docs: add verified go-live gaps audit and Craig infra checklist
fix(types): exactOptionalPropertyTypes for participants + Route casts in billing/settings/pricing
feat(ai): wire priority scoring, smart replies, sentiment, categorization, context extraction to Claude
feat(web): add Stripe checkout flow and billing management page
chore: ignore Claude Code internal worktree directories
docs(claude): session update 2026-05-29 — CI green, marketing landing live
Merge pull request #44 from ccantynz-alt/claude/vigilant-keller-7chXT
feat(web): wire full dark marketing landing page + add ProductSuite section
fix(ci): drop Node 20 from matrix and fix build command
fix(ci): remove Turbo cache restore-keys to prevent stale cross-commit cache hits
fix(tests): make full test suite pass across all packages
fix(build): cast Footer link hrefs to Route for Next.js typedRoutes
fix(ci): replace bunx tsc --noEmit with bun run typecheck (no root tsconfig.json)
fix(lint): resolve remaining API lint errors (non-null assertions, eqeqeq, import types, inferrable types)
fix(typecheck): resolve all 93 pre-existing TypeScript errors in API package
fix(lint): resolve all API package lint errors (93 errors across 41 files)
fix(lint): resolve all MTA service lint errors
fix(typecheck): repair CachedEmail mapping and remaining unused-var lint errors
fix(lint): clear remaining no-empty-function and no-unused-vars errors
fix(lint): resolve all remaining lint and typecheck failures in CI
fix(ci): resolve workflow failures blocking CI green
fix: resolve pre-existing lint and typecheck failures blocking CI
feat(mobile): rename app to Rae for App Store + fix all submission blockers
c comment · e edit title · m merge · a approve · r request changes · ? shortcuts