Evidence (doyle, 2026-09-24, main @ `11066dce`, spt-core 0.72.0 on both nodes).

**Field, SCELTOUIN (read-only snapshot by fall-a):**
- `spt --version` → 0.72.0; coordinator + broker image 0.72.0; `applied.json` `{"version":108}`, `applied-state.json` `{"phase":"applied","version":108}`.
- `release.json` metadata declares `"docs":{"asset_name":"spt-docs.tar.gz","sha256":"e2aa42c8…"}` — the signed set names the bundle.
- `releases/` holds NO `docs.tar.gz`; `releases/artifacts/x86_64-pc-windows-msvc.bin` rewritten 9/23 11:59 while the two linux `.bin` still date 9/21 5:30 PM → the 0.72.0 stage was a peer pull (one platform), the 0.71.0 stage was a GitHub fetch (all three).
- daemon log: `UPDATE_STAGED:108:BrainOnly (from 14efb80c…)` (= HFENDULEAM) then `BRAIN_UPDATE_RESTART`; **zero** `UPDATE_DOCS_LANDED` / `UPDATE_DOCS_SKIPPED` lines in either log file.
- `$SPT_HOME/docs` last written 9/21 5:30 PM (the 0.71.0 landing); no `docs.new` / `docs.old`; `docs/changelog.md` first heading `## [0.71.0] - 2026-09-18`.
- `http://localhost:5474/sceltouin/docs/changelog.html` (proxied from HFENDULEAM): no `0.72.0` string; `/hfenduleam/docs/changelog.html` has it.

**Control, HFENDULEAM:** same `release.json`, `releases/` also has no `docs.tar.gz` (cleared after landing, `cli.rs` ~9827), `docs/` files dated the 0.72.0 bundle build, changelog tops at 0.72.0. Its daemon log carries no `UPDATE_DOCS_*` either — those lines print on the CLI's stderr, not the daemon's, so the daemon log cannot show a docs landing on any node.

**Code:**
- `crates/spt-net/src/net/update.rs:41` `enum UpdRecord` — `Query / Offer / UpToDate / Fetch / FetchArtifact / StatusQuery / Status / Chunk / Done / Err`; no docs record.
- `crates/spt-daemon/src/propagate.rs:243-274` serve side answers `FetchArtifact` with `cache.load_artifact_for_platform` only; `:524-539` pull side stages `stage_update_set(offer, {current_platform → artifact})` — one binary, no docs.
- `crates/spt/src/cli.rs:11177-11204` — the ONLY `stage_docs` call, inside `spt update fetch` (GitHub transport).
- `crates/spt/src/cli.rs:9748-9751` `land_staged_docs`: `let Some(bundle) = cache.staged_docs() else { return; }` — comment says "docs-less release or docs fetch skipped — nothing to land", but the signed set in hand DOES declare docs; the silent return is the loud-skip contract's hole.
- `crates/spt/src/cli.rs:9827` `cache.clear_staged_docs()` after landing → the source peer keeps no servable copy.

**Discriminator for triage on any node:** `releases/artifacts` holding only this platform's `.bin` = peer pull (docs impossible today); all three = GitHub fetch (docs landed iff `docs/` mtime ≈ bundle build time).

**Fix shape (ask in the issue body):** persist the verified bundle beside the set after landing; add a `FetchDocs` leg mirroring `FetchArtifact` (serve `docs.tar.gz`, requester verifies with `verify_update_set_docs` against the signed set, then `stage_docs`); `land_staged_docs` prints `UPDATE_DOCS_SKIPPED: signed set declares docs but none staged` when `meta.docs.is_some()` and nothing is staged. int gate: peer-pull e2e lands version-matched docs (kin `docs_bundle_e2e`), plus the loud-skip arm.

**Interim workaround per node:** `spt update fetch` (GitHub) then `spt update apply` re-stages and lands the bundle; requires gh access on that node.
