Everything in this file ran on 2026-10-06 unless a section says it is still to do. The commands are PowerShell, run from the repo root. Set this once per window, because wrangler caches a wrong account otherwise:
$env:CLOUDFLARE_ACCOUNT_ID = "72fe41e9f39ad60cfb6937bb26ab50c3"What was deployed
| Worker | Live now | Roll back to | What it carries |
|---|---|---|---|
comms (logicspike-communication, folder communication) |
a4171bcf-d16d-4e33-a711-d8999b7a4fe7 |
62876ebb-308f-4152-91e3-2000824c8840; before the whole set: 9a3c7aff-bdf4-4cd8-b19a-4d917f1c913b |
the SES guard, no credentials in logs, owner alerts, sweeper armed from traffic, vlozi.app inbound, founder reserved |
mailbox (logicspike-mailbox) |
d3019d86-26cc-4421-84b0-84c9e65e20d1 |
1d673365-94e7-46b1-ab94-7becb8359317; before: 1d3a3dd9-4d85-4a17-90dd-a4c409977fc9 |
role mailboxes on vlozi.app, canReceive, founder claimable |
manager (logicspike-manager) |
8284200f-8d07-4a3a-87ac-2a458ba79554 |
3fb346bf-eba5-4358-8a8d-e7039a16d6c5 |
name rule, invite and OTP limits, workspace and account deletion fixes |
newsletter (logicspike-newsletter, folder newsletter-service) |
67975b1f-e8bc-4d57-ab22-1701f294b12d |
07651f8d-d899-4c52-a615-f512ae48326d |
pauses a campaign on the new guard code |
forms (vlozi-forms-service) |
5e7ff3ac-ccbb-4ca7-8bcb-a072f0c4a273 |
8a2a0ffd-470f-4bcf-a985-eefe78cec0c0 |
one-line notification subjects, guard message |
engagement (vlozi-engagement-service) |
11dbb2a3-ed83-4422-8564-bdaa11464257 |
702535ed-c9e3-48ee-9ecf-a02442f3055f |
one-line notification subjects |
The core database migration (tenants.deleted_at and purged_at, two nullable columns; 7 workspaces, none deleted) ran before the workers. The dashboard
deployed from the push to main (Vercel). The website went out as Cloudflare Pages 79cc17b9, before the operator identity and the four new policy
pages existed. They went live when the owner redeployed the website on 2026-10-07 (checked: the live text matches the repository). internal-api changed only tests and was not redeployed. apps/billing-crons was pushed to main but not deployed.
To roll a worker back: cd apps\<folder>; npx wrangler rollback <version-id>, or redeploy the previous commit. To deploy one:
cd apps\<folder>; npx wrangler deploy --minify, then npx wrangler deployments list (the newest version should be 100%).
What this changed in production
- The SES declared-use guard is ON. Every send from a workspace on
mail.vlozi.app(shared-lane newsletters, mailbox replies, form notifications, flows, API sends) is refused with 503TENANT_SENDING_NOT_ENABLED, because Resend serves onlyvlozi.app. Platform mail (login codes, invitations, billing notices, owner alerts) is unaffected. Replies from a role mailbox onvlozi.appwork, through Resend. To switch the guard off, set the comms secretSES_TENANT_SENDINGtotrue(wrangler secret bulk). - Login codes, reset links and invitation links are no longer stored in the comms mail log.
- Owner alerts go to the workspace owner's verified account email, at most one SLA alert per hour per workspace.
- Workspace deletion now dates the deletion, revokes the workspace's API keys and repoints every member's default workspace. It does not cancel billing.
- Account deletion no longer fails for owners of already-deleted workspaces or for users with linked rows.
- The role addresses can be mailboxes on
vlozi.appin Vlozi's own workspace.
What was checked afterwards
Read-only, through the gateway: sender identities (comms), workspace and billing balance (manager), subscriber list (newsletter), forms list (forms).
Later that day the ten role mailboxes were created, and a platform-sent test to each was watched in the worker logs: nine arrived and were filed by the
Mailbox. hello@ reached neither worker, probably because of an explicit Cloudflare rule (gap-log G55). The mailbox /health answers ok. Engagement
and mailbox inbound were not exercised beyond that.
npx tsx scripts/check-prod-schema.ts --app core now reports only the three leftover communication.* tables (gap-log G53); anything else is new drift.
Still to do
Outside-account tests (you). Send a test from an outside address to each role address and reply once from the dashboard
(contact-addresses.md §4). The platform-sent tests prove inbound works, not that an outside Gmail can reach it.
Data scripts (you). Each is a dry run until you add --apply, and each writes production data. Before running any of them, check that
COMMS_DATABASE_URL and NL_DATABASE_URL are not set in your shell: the scripts prefer an environment variable over .dev.vars, so a stale one would
send the write to another database.
| Script | When | What it does |
|---|---|---|
node apps/communication/scripts/clear-system-mail-content.mjs |
any time (comms is deployed) | clears login-code, reset-link and invitation-link bodies already stored in the mail log |
node apps/newsletter-service/scripts/revoke-unconsented-import.mjs |
overdue: the website is already live (gap-log G61) | revokes consent on Vlozi's own ~503 un-consented contacts; nothing is deleted |
node packages/core-database/scripts/close-deleted-workspaces.mjs |
any time | revokes API keys and repoints members of workspaces deleted before the change (none were deleted on 2026-10-06, so it should report nothing to do) |
The website (you). The pre-flight and the deploy command are in R8 of readiness-checklist.md. Afterwards,
curl.exe -i https://vlozi.app/.well-known/security.txt should be 200.
Smoke checks after any later worker deploy.
- Through the Vlozi tools:
workspace_whoamiandcomms_get_sender_identitiesstill answer. - Log in to the dashboard and open Mailbox.
npx wrangler tail logicspike-communication(fromapps\communication) showsstale_claim_sweptwithin minutes of traffic. The tail prints recipient addresses, so do not paste its output into evidence.