## Scope HANDED-FILE W2: receipt-authorized audience reuse, bounded prompt-time delivery, and the XML-entity delivery-exclusion rider. Based on landed W1 cd0e4216; no CI-policy changes. - Reuse one live input-reference entry and URL across admitted receiving endpoints; persist the visible audience without extending the original 24-hour deadline or changing origin. Unrelated registrations remain conflicts. - Deduplicate user-input helpers by endpoint/session/filepath, not whole prose. A new session/endpoint can resurface the existing URL. - Share one internal 500ms deadline across report setup, ACK and owner-result waiting. Completion notification follows helper publication. Late results remain eligible for the next poll; no-path input performs no helper IPC/wait. Bound prompt workers through notification writes and preserve original controller custody. - Preserve singleton audiences as legacy strings; only multi/empty sets use arrays. Accept both representations; empty remains deny-all. - Compare physical peer-delivery evidence using exact, ASCII-edge-trimmed, and symmetric single-pass XML-decoded/trimmed hashes. Stream all variants at successful physical writes without retaining bodies. Named XML entities and valid numeric references are supported; malformed references/bare ampersands remain literal. - Explain seated-user provenance in API docs and actual CLI help; adapters must never report peer-delivered bodies as user input. ## Security and upgrade limits The #320 field RED came from physical decoded `marker="A&B" ` versus reported `"A&B" <probe>`: the old exact/trim comparisons miss, allowing controller-bound registration. Two new regressions failed before the fix and pass afterward. Entity comparison is single-pass, not recursive. Double-encoded copies need not be excluded. A genuinely typed body equal to a physically delivered body's decoded form is indistinguishable and is excluded: accepted false-positive cost. The new hash is recorded at write time, not reconstructed from old hashes. Restart the daemon, not only its brain, to obtain the protection; deliveries written before that restart are not covered. ## Rollback and recovery Pinned actual 0.71.0 SHA256 bc277e6c9f0486e8b2a643a38cade6751685f05838c11fafd22d8dac71d0c182 served the singleton positive control. With an array row, it refused BOTH that row and an unrelated registry-backed row with HTTP500 SERVING_REGISTRY_LOAD_FAIL; mutation failed and registry bytes remained unchanged. This is fail-closed, NOT mixed-version serving compatibility. Waiting 24h does not heal the outage: the old binary cannot parse the registry to reap expiry. Roll forward, or stop the old daemon and remove the array row from a backed-up registry while preserving name-allocation history. Never delete the registry or unrestrict the entry. Candidate roll-forward restored both rows to HTTP200 and preserved URL, audience, origin and original deadline. ## Verification - Final rebased head 1143a6dccf177cee46ca387f2be0637ee4bd324a: targeted W1+W2+#320 battery 127/127, 2360 outside-filter skips; native exit0. - Pre-rebase W2+#320 battery 111/111; original W2 battery100/100. #320 pre-fix:2 expected failures. - Workspace clippy exit0; own fresh spt/xtask build, generation and documentation checks exit0. Rebased docs check exit0. Trace938/938 complete, zero findings. - Actual candidate CLI help and human/JSON serve-list smoke; isolated HTTP rollback/roll-forward; zero own smoke survivors, consumed homes removed. - Captured legacy singleton row now comes from the immutable actual0.71.0 registry snapshot and is pinned LF. The first post-rebase battery was126/127 due a fixture CRLF/provenance mistake; corrected fixture then passed127/127. No runtime code changed for that correction. - Own worktree pool released exit0. No cargo fmt; all native Cargo serialized at jobs2. - Hertz's independent isolated two-node run observed all SEVEN cells on the pinned candidate: spaced-path fetch, one helper for original/trimmed reports, helper in the original prompt with zero later duplicates, two independent second-endpoint admissions reusing the SAME entry/URL and original deadline, and exact plus XML-reencoded peer exclusion with zero helper/rows over 11s and explicit exclusion traces. `SEVEN-CELL-OBSERVATIONS.json` confirms the current contracts; the retained old own-entry/no-widening comparator mismatches intentionally under amended #319. - Hertz's final `DELIVERY.json` records field acceptance and verified teardown: seven owned served rows and nine hash-verified source files removed, endpoints purged, adapter inactive, both isolated nodes stopped, zero candidate/launcher/task survivors and no port35474 listeners on either host. Resident broker/brain identity records and full firewall output are unchanged. Remote launcher exit remains null; independent extinction proof is not relabeled exit0. Doyle granted field acceptance (S3AIOGZW / ARDLGA6M); this does not declare the whole milestone accepted. - Doyle independently gated exact head1143a6dc: targeted suites46+53+25 green, clippy0, trace938/938. ## Provenance / receipts `.spt/preserved/318/todlando-w2/`: entity-red, entity-green, security-{clippy,build,gen,docs-check,final-trace}, rebased-final-tests, rebased-trace, rebased-docs-check and release JSON/log receipts. `rollback/result.json`, `rollforward-result.json`, `fixture-correction.json` retain measurement and correction provenance. Independent field evidence: `.spt/preserved/318/hertz/w2-two-node/SEVEN-CELL-OBSERVATIONS.json` and `driver/RESULT.json`. Both live broker/brain pairs were pinned to the candidate hash below; resident daemons were not stopped or restarted. Final field delivery: `.spt/preserved/318/hertz/w2-two-node/DELIVERY.json`, reported SHA256 `978dc9a8bff2ace22837037ed3606d5fd678d862c45c2f5503fabace20b79a36`; cleanup proof in `POST-FIXTURE-CUSTODY.json` and `FINAL-CLEANUP.json`. Hertz's separate trace932/932 covers his checkout, not the candidate source. Pinned field candidate `.spt/preserved/318/todlando-w2/candidate/spt.exe`, SHA256 a4cc7798625c93f9512be464bba72ac48376c48871cba4552abf98c103e75c1a, was built from dirty W2+#320 source before commit/rebase. It is not a runtime attestation of the later commit SHA. Five relevant production-source byte hashes remain identical after rebase (`candidate/rebased-source-comparison.json`); later commits correct only test fixture/checkout policy. Closes BigscreenVR/spt-bs-releases#317 Closes BigscreenVR/spt-bs-releases#319 Closes BigscreenVR/spt-bs-releases#320 Refs BigscreenVR/spt-bs-releases#318