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.

Last successful deploy 2026-09-17 09:11:08 UTC ·
Took 5m 13s Door deploy full Target channels → channels.one.ie one.ie/web → one-prod (one.ie)

Replay — the last run, at wall-clock speed

release · 34802b6f3
0:00 / 5:13
tool tsc-one.ie-web 253s
tool tsc-channels 253s
tool vitest 252s
tool build pass
0s120240360480

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

263s15s14s131s50s503s38s34s1s1s306s313s

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-09-18 01:37:47 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/ 84 UP
channels.one.ie channels channels/ 553 UP
pay.one.ie one-core-worker pay/backend 518 UP
dev.one.ie one-dev one.ie/web (branch) 1508 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