{
  "changed": [
    "crates/spt-net/src/net/endpoint.rs",
    "crates/spt-net/src/net/pairing/meet.rs"
  ],
  "api_seam": "Added crate-private EndpointPurpose::{Node, Rendezvous} and NetEndpoint::bind_scoped_for_purpose(identity, relay, discovery, alpns, scope, purpose). Public bind_scoped keeps its existing signature and delegates with Node; public bind_rendezvous keeps its existing signature and selects Rendezvous.",
  "behavior": "The shared builder explicitly applies PortmapperConfig::Disabled for every Rendezvous scope and for ordinary Loopback. Ordinary Node All/Port retains the N0 preset's existing mapper policy. Relay, discovery, IP-family selection, transport settings, identity derivation, ALPNs, and redirect handling are unchanged.",
  "callers": "Accounted for the production pairhost::spawn_meet_rotation bind_rendezvous call and existing meet_redirects_joiner_to_the_real_pairing_endpoint guard. Both inherit the purpose selection without caller changes. NetHost::start still uses unchanged public bind_scoped and therefore Node policy; bind/bind_with_alpns also retain that path.",
  "traceability": "Added proximal REQ-MEET-PORTMAPPER-OFF doc and impl tags at bind_rendezvous and the builder's mapper policy.",
  "validation": "No builds, tests, linters, formatters, commits, or pool operations run, per assignment. No tests added. Native and field verification remains with Main.",
  "path_note": "The assigned meet.rs exists at crates/spt-net/src/net/pairing/meet.rs, not root src/net/pairing/meet.rs; only the two actual owned files were edited."
}