Deploy

Live — the targets, probed when you loaded this. Recorded — what the runs cost. Replayed — the last run, played back at wall-clock speed. Nothing here shows a run happening now, because nothing here can see one.

20 deploy run(s) read live from D1.

Last successful deploy — 2026-10-08 07:29:20 UTC ·
Took 18m 58s Door deploy full Target none

Replay — the last run, at wall-clock speed

release · bab139135
0:00 / 18:58
tool typecheck 1111s
tool tests 943s
tool build 172s
0s120240360480600720

A replay, not a live run. Each row is a workflow step in the locked vocabulary — tool runs unattended, human suspends the run until a person answers. There is no agent step in a deploy, and that is a finding rather than an omission: no agent ships production.

Six weeks

One cell per day. Filled where a run was recorded — the record starts the day deploy-record.sh was wired, so empty is "not recorded", never "nothing shipped".

Wall clock per run

60s62s101s87s91s286s286s19s20s65s533s101s440s456s111s451s100s60s429s369s933s1698s293s46s633s599s221s295s113s1138s

Oldest left. The tall green one is the door that gated, shipped to dev, probed two routes and opened a PR; the short bars are runs that refused early — which is the gate working, not the gate failing.

Live now

probed 2026-10-08 07:48:40 UTC ·
All five deploy targets are answering.
TargetWorker Shipsms State
one.ie one-prod one.ie/web — UP — serving this page — not probed (a worker cannot fetch its own host)
api.one.ie one-gateway api/ 274 UP
channels.one.ie channels channels/ 263 UP
pay.one.ie one-core-worker pay/backend 685 UP
dev.one.ie one-dev one.ie/web (branch) 1911 UP

Ask about a deploy

Chat can answer about this page's record. It cannot ship, and there is no button here that pretends otherwise: there is no deploy:* receiver — no resolver, no route, no caller. Shipping stays a local command and a human's call.

Deployment tasks

The gates deploy.sh runs, in its order, and what each asserts. The script is the authority — this page carries no second copy of its commands.

  1. 0 Tree working tree clean — first, so a dirty tree fails in a second instead of after a full build
  2. 0.4 Credentials one credential resolved from an ordered ladder and probed with curl /user; all five services report the same account
  3. 1a Typecheck tsc --noEmit clean in all 5 services; builds packages/sdk first when dist/ is missing
  4. 1b Tests the full suite as two concurrent lanes — pool (CPU-bound, 8 forks) and typedb (one shared gateway, serial)
  5. 3 Build NODE_ENV=production astro build → dist/server/ + static assets; memoised by tree fingerprint
  6. 5 Smoke dist/server/ exists, all 5 wrangler.toml present, and no [env.production] block has grown back
  7. 6 Approval on main, a literal "yes" — other branches auto-approve
  8. 6.5 Migrations wrangler d1 migrations apply --remote. Never ship worker code ahead of its schema
  9. 7 Deploy gateway + sync + channels + pay in parallel, then astro. Every call bare — no --env, ever
  10. 8 Health 4 HTTP probes × 3 tries with backoff, cache-busted — the same pairs probed above

The workflow

Main receives merges, never edits. One direction, four doors.

DoorWhere CommandGate
edit .claude/worktrees/<name> git worktree add -b feat/<name> … verify:fast — every edit
merge the main tree, pinned to main git merge --ff-only feat/<name> none — main is a record, not a gate
promote .release/ on branch release release.sh promote <sha> one FULL gate on the clean tree at that sha
ship .release/ release.sh ship memo HIT — the suite is REUSED, never re-run

dev.one.ie is one slot, and it reads and writes production's rows. Ship code there freely; treat its data as production. A fast pass is never reported as a full pass.

Agent deploy tools

Every door an agent or an operator can open, and which of the two is expected to.

CommandDoesRun by
./deploy dev one.ie/web → one-dev. Fast lane, no approval, crons stripped. agent
./deploy the full pipeline — 5 services, FULL_VERIFY=1, human approval. human
./deploy astro | workers | gateway | sync | agents | pay scope it to one service, or the three that need no astro rebuild. either
./deploy --dry-run print every command, ship nothing. either
land.sh <branch> --pr --deploy gate → dev → probe → PR, in that order, for one branch. agent
land.sh <branch> merge main in → gate → fast-forward main. No PR. agent
release.sh promote <sha> materialise .release/ at a sha and mint its full-suite receipt. human
release.sh ship the production door. Ships from .release/, so it structurally cannot ship a dirty tree. human
deploy-record.sh --door … --phase … append a run to the record this page renders. --self-test is its red proof. script
signal-watch.sh --watch 30 every door the factory’s signals cross, with server-timing phases and a ratchet budget. either