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-27 07:02:18 UTC ·
Took 11m 32s Door deploy full Target channels → channels.one.ie one.ie/web → one-prod (one.ie)

Replay — the last run, at wall-clock speed

release · bc34fad29
0:00 / 11:32
tool typecheck 594s
tool tests 591s
tool build pass —
tool health pass —
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

172s20s6s4s4s5s4s222s131s181s1598s1169s700s1635s1783s2834s2s616s22s130s2068s1903s1847s1830s1549s194s1703s241s1153s692s

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-28 09:55:59 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/ 171 UP
channels.one.ie channels channels/ 424 UP
pay.one.ie one-core-worker pay/backend 539 UP
dev.one.ie one-dev one.ie/web (branch) 1833 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