{
  "changed_files": [
    "crates/spt-daemon/src/nethost.rs",
    "crates/spt-daemon/src/pairhost.rs"
  ],
  "implementation": "NetHost now owns a separate two-worker spt-meet runtime. spawn_meet_rotation preserves all arguments and returns a must-use MeetRotation ownership guard; its sole caller retains it. Main endpoint runtime, mapping policy, canary, dials, streams and pairing ceremony are unchanged.",
  "shutdown_order": [
    "NetHost field order drops MeetRotation first: sends cancellation and synchronously awaits only the spawned rotation task's completion.",
    "On meet workers, rotation aborts both current and previous JoinSets, then awaits both shutdowns. Listener values never leave their spawned tasks; rotation also joins expired windows before recycling their sets.",
    "NetHost next drops the meet Runtime, stopping remaining descendant actors and waiting for spawned work, then drops the existing broker Runtime."
  ],
  "preserved_behavior": "Previous-window overlap, per-window detached-subnet filtering, fixed-port remapping and soft per-subnet bind failures remain.",
  "failure_cases": [
    "Meet-runtime construction failure propagates io::Error through NetHost::start.",
    "Individual bind errors retain existing logging and skip only that listener.",
    "JoinSet ownership aborts children if rotation unwinds, rather than detaching JoinHandles; owned runtime shutdown remains the final descendant cleanup boundary.",
    "Non-yielding native calls cannot be forcibly cancelled and can delay synchronous teardown. No shutdown timeout, background-runtime leak, new thread fallback or async-context block_on path was added; the synchronous start/drop requirement is documented."
  ],
  "source_evidence": [
    "nethost.rs:1192-1201 declares guard -> meet runtime -> broker runtime teardown order.",
    "nethost.rs:1317-1322 builds spt-meet with two workers; 1389-1399 routes rotation to its handle.",
    "pairhost.rs:161-187 documents and implements the blocking ownership guard.",
    "pairhost.rs:227-228 owns both windows with JoinSets; 292-311 handles rotation cancellation and drain.",
    "Tokio Runtime shutdown semantics: https://docs.rs/tokio/latest/tokio/runtime/struct.Runtime.html",
    "Tokio JoinSet cancellation semantics: https://docs.rs/tokio/latest/tokio/task/struct.JoinSet.html",
    "Tokio JoinHandle guarantees task destructor completion before observed completion: https://docs.rs/tokio/latest/tokio/task/struct.JoinHandle.html"
  ],
  "test_seam": "Declared cfg(test) child pairhost::meet_runtime_tests. Actual bind/serve futures are wrapped with literal stages \"bind\" and \"serve\"; returned real listener is wrapped by observe_listener. Hertz owns child implementation; untouched.",
  "traceability": "Added adjacent doc/impl REQ-MEET-RUNTIME-ISOLATION tags and removed stale same-runtime documentation.",
  "validation": "Not run, per explicit assignment; Main owns integration/native validation. LSP unavailable in worker tool inventory; narrow source search found only nethost caller and it is migrated."
}