# Rename Checklist — 16 binary gates

Companion to the "Rename a URL Without Losing the Traffic" workflow.
Binary pass/fail, no partial credit. An unchecked box sends the rename back a step.

Version 1.0 · 2026-09-09

---

## Before you rename (5 gates)

- [ ] **1.** A ledger file of every URL the site currently publishes exists and is committed.
- [ ] **2.** The ledger was generated from the **build product**, not from the content
      directory, the sitemap, or a route table.
- [ ] **3.** The ledger stores **site-relative** paths (`/en/about/`), not absolute URLs.
- [ ] **4.** One sentence, written down somewhere durable, defines what "published" means
      for this site — and exactly one piece of code implements it.
- [ ] **5.** The old URL appears in the ledger. (If it does not, it is unguarded: add it and
      commit that first, as a separate change.)

## Writing the redirect (5 gates)

- [ ] **6.** The rule's **source** is a site-relative path. Not an absolute URL. Not a
      protocol-relative `//host/path`.
- [ ] **7.** The status is **301**, not 302 and not the platform default.
- [ ] **8.** The destination exists in the build product — verified by looking, not by
      intending.
- [ ] **9.** If a wildcard is used, a **negative control** path that merely resembles the old
      tree is confirmed *not* to match.
- [ ] **10.** If an explicit rule and a wildcard could both match, the explicit rule is
      ordered first, and the ordering rule of the host is confirmed from its documentation.

## After the build (4 gates)

- [ ] **11.** The gate ran against the real build output and reported the old URL as either
      still served or redirected.
- [ ] **12.** No URL in the ledger is missing from the build product without a matching 301.
- [ ] **13.** The count of ledger entries not yet satisfied is **zero**, or each exception is
      named and justified in the change description.
- [ ] **14.** The new URL has been appended to the ledger, in a separate, reviewable commit.

## Discipline (2 gates)

- [ ] **15.** **No line was deleted from the ledger.** If one was, the change description says
      which obligation is being discharged and why.
- [ ] **16.** The append step is **not** wired into the build. A verifier that updates its own
      expectations can only get greener.

---

## Notes on the two gates people skip

**Gate 6** is the one that fails silently. A source beginning with `//` starts with a slash,
so it survives a naive "must be a relative path" check, may be counted among the valid
rules, and never matches anything. Nothing warns you.

**Gate 15** looks like bureaucracy and is not. Once a URL has been public, it owes a
destination forever. Removing its ledger line does not end that obligation — it ends your
ability to notice it.
