# W0 (#248) gate checklist — doyle, pre-staged 2026-09-06 17:35Z while todlando is held

Source of truth: `WEBSERVE-272-JIT.md` §W0 (incl. ADR-0057 Am.2 ruling 16:35Z) + ADR-0056/0057/0058
Amendment 1 AS ON MAIN (`a26ca59a` ADR-0058 Am.1, `ef9171a6` ADR-0056 Am.1). Gate reads go to
SOURCE, never the PR body.

## 0. Pre-flight (before any command)
- [ ] ⛔ OPERATOR CPU HOLD on hfenduleam from 2026-09-06 18:02Z until the operator says
      "i'm done": no local cargo/nextest/clippy here and NO push that triggers Windows CI here.
      Linux legs on kitsubito may run. Clear this line only on the operator's word.
- [ ] Open GATE-TEST-INDEX.md (memory) — first touch of a gate.
- [ ] `git fetch` then assert origin/main == GitHub main (`gh api …/branches/main`).
- [ ] `git merge-base --is-ancestor origin/main <tip>` — if false, rebase BEFORE gating.
- [ ] List every other open PR with CI running; land the expensive-rerun sibling first.
- [ ] IR-76 three-arm golden check; record free GB beside the floor line (`xtask disk-floor`).
- [ ] Worktree `.worktrees/gate-w0-<sha>` detached at the tip; own pool; claim FROM inside.

## 1. Mechanical legs (exit FILES read, never the harness notification)
- [ ] `traceable-reqs check` (exit 2 = did not parse — read the code).
- [ ] workspace-bins prebuild → `xtask check` (docs drift + spacerun + internal-codes scan).
- [ ] clippy strict; `nextest --no-fail-fast` filtered: spt-store, spt-daemon, spt (serveverb),
      spt-runtime (manifest web_short_path), + `webserve_e2e` + any e2e bin touched.
- [ ] Same legs on kitsubito. Mutation: rule-2.5 routing cell red/green (JIT rider).

## 2. Source reads (one per REQ; note file:line in the verdict)
- [ ] REQ-WEB-URL-NODE-PREFIX: bare `/` → 302 `/<node>/`; reserved `f/ docs/ a/ m/ bin/ install`
      404-with-facet-name BEFORE any registry lookup; `/<other-node>/…` → 502-with-node; docs
      bare paths byte-true (REQ-DOCS-LOCAL-SERVER surface untouched); `?json` index twin.
- [ ] REQ-WEB-SERVING-REGISTRY: `$SPT_HOME/serve/registry`, spt-store owns format, daemon single
      writer (CLI goes through the control client, no direct writer); entry fields per JIT;
      `<stem>~<n>.<ext>` per `(stem, ext)`, counter persisted; **Am.2: history = name → (last
      abs path, kind); same path re-takes its name; different path takes next suffix**;
      `--as` under the same rule; reference-served resolves at request time (deleted → 404).
- [ ] ADR-0057 Am.1: served root `$SPT_HOME/adapters/<adapter>/web/`, created empty at
      activation, entry removed at deactivation, DIR + bytes retained; alias = same entry;
      reserved alias refused at ACTIVATION (not just HTTP).
- [ ] ADR-0058 Am.1: `ttl_ms` + `audience` optional on every kind; no reaping/enforcement in W0.
- [ ] REQ-WEB-ACCESS-SURFACE: `WEB` row `default_on: true`, non-attributable; `--help` Control
      surfaces section grows by table composition; nothing dials it in W0; XFER row still present.
- [ ] Startup warning for reserved OS hostnames: warns, never refuses boot/join.
- [ ] REQ-MANIFEST-UNKNOWN-KEY-WARN (rider 18:15Z): unknown `[adapter]` key → ONE stderr line
      naming table+key, registration PROCEEDS (never refuse; no `deny_unknown_fields` added
      anywhere); unit cell for the typo case + the known-key-silent case; manifest.md paragraph.
- [ ] Docs: `docs-site/src/serving/overview.md` + SUMMARY + llms.txt; `reference.md` regen;
      `api.md` untouched; MANIFEST.md + manifest.md carry `web_short_path` under `[adapter]`;
      STORAGE.md carries the registry schema incl. Am.2 history shape; ADR-0057 carries Am.2.
- [ ] CHANGELOG `[Unreleased]` entry, user-facing wording, no internal codes.
- [ ] Commit trailer `Co-authored by: todlando` (grep, never `%(trailers:)`); wip checkpoint
      squashed; PR body `Fixes BigscreenVR/spt-bs-releases#248` ONLY (#249/#272 stay open).

## 3. Field acceptance (mine, real daemon, browser)
- [ ] `http://localhost:5474/hfenduleam/` renders the index; lists a file I `serve add`.
- [ ] Two `report.md` from two dirs → `report.md` + `report~1.md`.
- [ ] `serve rm report.md`, re-add the SAME file → `report.md` again (Am.2).
- [ ] Re-add a DIFFERENT third `report.md` → `report~2.md`.
- [ ] Adapter deactivate → activate: alias unchanged (no `~1`), bytes retained.
- [ ] `curl -I http://localhost:5474/` → 302; `/hfenduleam/docs/` byte-equal to `/docs/` page.
- [ ] `curl http://localhost:5474/hfenduleam/f/` → 404 naming the facet, not a registry miss.

## 4. Land
- [ ] CI green at the tested sha; re-run the ancestor check at land time; ff-only; tested == merged.
- [ ] Pick-audit; alchemy sweep → #248 ACCEPTANCE; W1 dispatch (`#249`) via alchemy `dispatch`.
- [ ] Pool: todlando releases; hertz W3 branch rebases when W3 opens (not now).
