W2 of milestone releases#331 (SEAMLESS-UPDATES): releases#335 + #278 + #62, with #329 and #2 arm 1 answered below.

## releases#335: one thread per adapter
- `cmd_adapter_update` → `fan_out_adapter_updates`: uses `std::thread::scope` with one thread per selected adapter, started after the core leg (the composite order is unchanged).
- New `spt_proto::emit::Capture` (thread-local). `emit_line_err!`/`emit_block_err!` honour it, and the new `cap_eprintln!`/`cap_println!` are drop-ins for `eprintln!`/`println!`. The update path's print sites are converted. Each adapter's block is replayed whole as soon as that adapter finishes. `ADAPTER_UPDATE_SUMMARY` stays in selection order, and the 0/3/1 exit is unchanged. A panicking thread reports `FAILED` in its own block.
- `ADAPTER_COMMIT_LOCK` serializes the swap, the registry re-register and the nudges. The registry write is an unlocked RMW (REQ-HAZARD-INFO-RMW-LOST-UPDATE class). Fetch, verify, floor peek and `[update.post]` stay parallel.
- Fetch scratch (`_github/.fetch-<adapter>`) and the staged archive (`<safe>.<adapter>.update.spt`) are keyed per adapter. Two adapters that share a repo or the default `adapter.spt` would otherwise overwrite each other's download.

## releases#278: `strings/` mirrors the archive
- `SwapAction::{Place, Prune}`. Prune rows cover only files under `<install>/strings/` that the staged tree does not ship. The swap's own `.new`/`.old[-N]` files are never pruned. Pruning runs after the commit loop succeeds, and a rolled-back commit prunes nothing. Emptied dirs are removed; `strings/` itself is kept. Both apply routes (CLI direct and daemon `adapter_apply`) share the one plan.
- The doc comment on `apply_release_crc_swap` is replaced, since it stated the "stale file is harmless" premise that #278 proved false.

## releases#62: exec bit on declared entries (ruled (b))
- New `spt_runtime::entry_exec`. A "declared entry" is the program token of a command spt-core spawns (session roles, history normalize, digest extractor, translation command/path, service, update command, update.post, shell spawn/wake), filled with `{adapter_dir}`/`{adapter_name}` and resolved per REQ-INSTALL-11 into the install dir.
- On Unix it forces +x and prints `ADAPTER_ENTRY_EXEC_FORCED:<adapter>: <path> extracted <mode> — packaging defect upstream`. It runs on `adapter add`, on every update run (applied or up to date, which fixes a mode-only difference the content swap can't see), and inside the daemon apply before the translation child restarts. It is a no-op on Windows.

## releases#329: no code
The floor basis is already the staged core under the composite: unit `REQ-ADAPTER-FLOOR-VS-STAGED-CORE` (v0.60.0, `floor_basis` in cli.rs). The fan-out threads `core_version` through unchanged. Closure rides the releases#336 int.

## releases#2 arm 1: measured GREEN, so no step-aside build
On Windows, `spt adapter update` of an adapter whose exe is RUNNING from the install dir:
- Control: a plain overwrite is REFUSED (sharing violation).
- The update exits 0 and the v2 bytes land on disk.
- The live process keeps running from its image, now renamed to `svc.exe.old`.
- The registry reads 1.1.0.

This is the shipped crc_swap C1 displace, i.e. ruled shape 2. Scope: CLI-direct route only; the daemon-coordinated route (live endpoint / `[service]`) was not measured. Evidence: `.spt/preserved/331/todlando-w2/ARM1-RESULT.md`.

## Evidence
- `cargo clippy --workspace --all-targets -D warnings`: exit 0 (HFENDULEAM).
- `xtask check`: OK.
- `traceable-reqs 0.4.1 check`: exit 0.
- Targeted nextest, HFENDULEAM: 180/180 after one fixture fix (Unix arms skipped).
- Targeted nextest, kitsubito: 156/156 exit 0, including both Unix exec-bit arms.
- Mutation proofs (all go red):
  - Prune arm removed: `a.md` survives.
  - Serial loop instead of fan-out: `POST_HOLD_TIMEOUT`, 62.9 s.
  - `force_entry_exec` neutered (kitsubito): the post-step fails with `Permission denied (os error 13)`, reproducing the field brick.
- The concurrency int is gated on a rendezvous of the three post-steps, not on wall time. `PARALLEL_WALL` is printed only, for the record.

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

https://claude.ai/code/session_014j8UXzGXXsDsTJBYYUSCTC
