Fixes BigscreenVR/spt-bs-releases#280 ## Change Publish `MSG_IN` from the existing `api listen` delivery closure through `crate::cli::publish_msg_io`, after presentation/context injection. Valid queued backlog and live TCP deliveries now reach the same IOLOG and LAST_MSGS consumers as hook polling. No new emitter, consumer, storage path, or wire format. Two real-CLI regression cells cover backlog plus live delivery, LAST_MSGS, retained delivered spool records, a subsequent hook poll with a fresh-message positive control and no duplicate relay stamps, and filtered notifications producing no message observations. The IO projection excludes lifecycle boundaries such as `boot`; the existing boundary suite still exercises that event family. Includes an Unreleased fix note. No version bump. ## Gate base One commit, `ec7936b90331cf5261ccf276b22541872680781a`, based on `9f809f8dc322df6843cb61c28aa6dfd6108f9c94`. Doyle delivery15 accepted this gate base after main's documentation-only `68e34ae5` advance; no rebase requested for the gate. Windows and Linux final source patches are byte-identical after normalizing only the transported changelog's Linux line endings: 12,285 bytes, SHA256 `6f9c599d06e49c4087266b9dacca78076b820932c33191229c8a69008bf36c97`. ## Windows proof All nextest commands used `--test-threads 1 --no-fail-fast`. | Leg | Observed result | Exit file | | --- | --- | --- | | Workspace binaries | built | `final-windows-build.exit`: 0 | | Relay regressions | 2 run, 2 passed, 4 unrelated tests skipped | `final-windows-relay.exit`: 0 | | Compatibility: IO events, polling, boundaries, listen seed retry | 10 run, 10 passed, 0 skipped | `final-windows-io-events.exit`: 0 | | Publisher-removal build | built | `final-windows-mutant-build.exit`: 0 | | Publisher-removal regressions | 2 run, 1 passed, 1 failed; expected one-arm red | `final-windows-mutant-relay.exit`: 100 | | Restored build | built | `final-windows-restored-build.exit`: 0 | | Restored regressions | 2 run, 2 passed, 4 unrelated tests skipped | `final-windows-restored-relay.exit`: 0 | | Strict clippy | `cargo clippy -p spt --all-targets -- -D warnings` | `final-windows-clippy.exit`: 0 | | Generated docs/drift gate | `cargo run -p xtask -- check` | `final-windows-check.exit`: 0 | | Requirement evidence | 877 complete, 0 incomplete, 0 findings | `final-windows-traceability.exit`: 0 | ### Mutation's one-arm shape Only the newly added relay publisher statement was removed. `relay_backlog_and_live_deliveries_stamp_once_even_after_hook_poll` went red: its receiver IO ledger was empty instead of containing the backlog and live `MSG_IN` rows. `a_notification_filtered_by_the_relay_publishes_no_msg_in` held green. This is a delivery-cell red / filtered-cell green mutation, not a blanket failure of both tests. After restoring the publisher, both cells passed. The source's SHA256 before mutation and after restoration was exactly `cad6d4413c39f4d16a0591b8d7a6a61b8333567b3e63354aa0e1bb17a3af76f3`. `final-windows-mutation-summary.json` records the one-arm checks and byte-exact restoration; `final-windows-mutation.exit` is 0. ## Linux proof On kitsubito at the same final base: workspace build, 10/10 compatibility regressions, strict clippy, xtask check, and traceable-reqs all exited 0. The compatibility sweep includes both new relay cells. Release-note transport normalization was followed by `final-linux-traceability-normalized.exit`: 0. The earlier Linux publisher-removal experiment also produced the same one-arm shape; the final-base Windows mutation above is the current acceptance proof. ## Evidence locations Local, preserved and not committed: - Windows raw logs, runner preflights, and exit files: `.worktrees/relay-msg-in-280/.spt/gate/`. - Final Linux gate copies: `.worktrees/relay-msg-in-280/.spt/final-linux-gate/`. - Cross-host patch fidelity: `.worktrees/relay-msg-in-280/.spt/gate/final-source-fidelity.json`. Windows runner occupancy was checked before every heavy leg. Busy preflights returned 75 without starting cargo; the superseded initial build cancellation remains explicitly recorded and is not counted as a passing gate. Mutation and gate-runner scaffolding has been removed; raw/exit evidence is retained.