The canonical sequence for shipping articulate-ai.work. Written by Dicky after two SEV-1 failures inside one deploy. Reviewed adversarially by Kendall. Older variants in deploy-log.md headers and various personas' notes are superseded.
This is the only command shape Dicky hands Anthony. Everything else is a fail.
git status -s returns anything — STOP. That's a dirty tree. Don't deploy until commits are clean. See the dirty-tree trap below.Before writing or editing a file under ~/ClaudeWork/Articulate/website/, read the existing pattern. Reference posts: blog/slaying-the-memoryless-dragon.html (canonical post template), index.html (top-level template), team/index.html (microsite template).
Refused: building a parallel publish pipeline (e.g. deploy-2026-05-24/public/) instead of using website/. FAIL-DEPLOY-PARALLEL-INFRA, 2026-05-24.
Routine deploy (blog post, copy fix, nav patch): Kendall's gate is short — does the diff match the brief, and is there a rollback path. Two questions, answered in one paragraph. Don't theatre it.
Structural deploy (template change, vercel.json rewrites, new section): full charter pass — five alternatives, atomic rollback per step, named prior art, honest probability, Anthony-hours declared.
Refused: single-option plans, "should work," missing rollback. Override phrase: "skip Kendall, ship it." — logged to Kendall's decisions.md.
Empty output = clean. Anything else = STOP. If there are uncommitted changes not part of this deploy, commit them by concern OR stash, then re-check. Never deploy on top of unrelated dirty work — last week's local edits get swept into prod.
Refused: "I'll deploy and clean up the tree later." FAIL-DEPLOY-SEQUENCE-WHOLE step 5, 2026-05-24.
Never hand Anthony a bare vercel --prod --yes and a separate cd instruction. The two get split when pasted, the shell state resets between his pastes (Last login: on every fresh shell), and the bare vercel runs from ~. Vercel will prompt "You are deploying your home directory. Continue?" and Anthony in a hurry will type yes.
Refused: any command Dicky hands Anthony that doesn't include the cd inline. FAIL-DEPLOY-CMD-NO-CWD, 2026-05-24, SEV 1.
Every line must be 200. A 308 is acceptable only on root-vanity URLs that rewrite to a longer canonical path. 404, 500, 502 = revert.
Refused: Dicky calling a deploy "shipped" without running the curl sweep. FAIL-2026-05-16-plex-URL-not-tested, FAIL-2026-05-18-broken-postgraduate-assistant-link.
Per the rule locked 2026-05-20 in HOME.md:
URLs are clickable Markdown hyperlinks at the TOP of the brief. No "click through to verify," no URL in the footer, no plain-text URLs to copy-paste. If the deploy is still in flight when the brief is written: "URL pending — will fill in once deploy returns" and update the moment it lands.
Vercel's git-integration is connected but does not auto-deploy on push as of 2026-05-24 — confirmed by 20 consecutive deploys with gitDirty=1 from local CLI. The deploy step is mandatory; revert-and-push alone is not enough.
For instant rollback to a known-good deploy, use the Vercel dashboard → Deployments → "Promote to Production" on the previous green build. Faster than a revert + redeploy when the bad ship is breaking the site.
Two sandbox constraints:
git push fails with "could not read Username for 'https://github.com'". Anthony's laptop uses macOS Keychain auth.api.vercel.com, so vercel --prod --yes fails from the sandbox. Allowlist is locked at api.elevenlabs.io, *.cloudfront.net, higgsfield.ai, api.openai.com.Both are addressable in future sessions (Vercel PAT to credentials.md, allowlist expansion request, or wire the Vercel git-integration dashboard toggle to auto-deploy on push). Until then: Dicky writes the cwd-guarded one-liner; Anthony pastes; Dicky verifies via curl.
| ID | Pattern | Forcing function |
|---|---|---|
| FAIL-DEPLOY-CMD-NO-CWD (2026-05-24, SEV 1) | Bare vercel --prod --yes with separate cd instruction | Gate 4 — cwd guard inline, every time |
| FAIL-DEPLOY-PARALLEL-INFRA (2026-05-24) | Built deploy-2026-05-24/public/ parallel pipeline instead of website/ | Gate 1 — read canon first |
| FAIL-DEPLOY-SEQUENCE-WHOLE step 5 (2026-05-24) | Dirty-tree deploy swept unrelated edits to prod | Gate 3 — git status -s empty before push |
| FAIL-2026-05-18-postgraduate-assistant | Deploy shipped with broken root-vanity URL, only Anthony caught it | Gate 5 — curl sweep before "shipped" |
| FAIL-2026-05-16-plex-URL-not-tested | "Done" claimed without HTTP probe | Gate 5 — same |