
Base: a1df50b6 (main)

## What this lane does

Three W3 issues of the WEBSERVE milestone, plus the XFER retirement rider, plus the two
drift riders that hold the new generated surfaces to a contract.

**releases#268 — the changelog becomes a page.** `CHANGELOG.md` is now rendered into
`docs-site/src/changelog.md` by `xtask gen` and drift-gated by `xtask check`, so the published
book cannot disagree with the repository changelog. Traceability comments are cut whole; a
tracker code in visible prose is KEPT, so the published-docs scan rejects the page and the
wording is fixed in the changelog rather than hidden by the generator. The two existing
`(releases#222)` citations are rewritten here for that reason.

**releases#265 — an adapter's docs get a reserved segment.** `[adapter].docs_dir` is published
in the manifest schema and validated at register: adapter-relative only, no absolute path, no
parent-directory component, each refusal naming `adapter.docs_dir` so an operator reading
someone else's manifest knows which rule they broke. The canonical half is re-resolved at every
request rather than trusted from load time, because the directory named at load can be replaced
by a link before the next fetch.

**releases#266 — LAN bootstrap.** A stranger on the LAN can be handed the binary, or the
listener refuses to start and says so by name.

**releases#246 rider — XFER retired** (#246 closed at W2 by #199; this lane carries its
retirement rider). The surface leaves the table, a RETIRED list
arrives beside it, and every store load reports `ACCESS_SURFACE_RETIRED` for a rule that still
names it. The rule is KEPT, never dropped: that report IS the fleet census of whether anyone
ever used the surface. The Xfer stream family, its serve gate, its wire record and its tests
leave together (`StreamFamily::ALL` 19 → 18). `spt_store::xfer`'s `XferProgress`/`transfers_dir`
survive — the shell channel's progress record was never the transport.

## What the gate found, and what it cost

Three reds, all closed at a named mechanism, none by rerun.

1. **The composed head bf6f493d did not compile.** The drift riders import `gen_changelog` and
   `PUBLISHED_DOC_PATHS`; the producer had implemented both behaviours inline and cut neither
   seam. Merge-tree clean, `traceable-reqs` 0, `E0432` on both OSes — tag presence is not build
   truth, and a `unit` stage had been activated on that reading. `gen_changelog` is now
   root-parameterised and RETURNING (an exiting seam cannot be called by the cell that tests its
   failure path; the exit moved to the CLI edge), and `PUBLISHED_DOC_PATHS` REPLACES the
   scanner's local array rather than sitting beside it.
2. **The generator laundered the leak.** It cut visible body codes as well as commented ones, so
   a citation vanished from the page while the source still cited a private tracker and nobody
   was told. Comments are still cut whole; visible prose is preserved for the scan to reject.
3. **A census stale by one, and a refusal that did not name its rule.** Removing Xfer left
   `Web`/`Unknown` on their old indices — caught by the bijection cell, which is what it exists
   for. And two of `validate_docs_dir`'s three arms named `adapter.docs_dir` while the third did
   not, so the sibling cell over a complying arm reported the convention as held: a convention
   enforced by no mechanism degrades one arm at a time.

## Evidence

Gate battery at fd296557 (the merged sha): doyle's verdict comment on this PR carries every
leg, pair, ladder and mutation with its exit file. Lane legs at fd296557: `clippy --workspace
--all-targets -D warnings` 0, `nextest` over the spt-daemon/spt-runtime/spt-store libs
1703/1703 passed (one Summary line), `xtask check` 0, `traceable-reqs check` 0.

Requirements carried: `REQ-DOCS-CHANGELOG-PAGE`, `REQ-WEB-ADAPTER-DOCS-FACET`,
`REQ-WEB-LAN-BOOTSTRAP-LISTENER`, `REQ-WEB-LAN-BOOTSTRAP-INTEGRITY`, `REQ-XFER-RETIRED`,
`REQ-WEB-ACCESS-SURFACE`, with `REQ-REACH-1`'s transfer half struck from its title.

fixes BigscreenVR/spt-bs-releases#268
fixes BigscreenVR/spt-bs-releases#265
fixes BigscreenVR/spt-bs-releases#266

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_015SQWGdNjq4sUbTzPQMLEQA
