<!-- spt:source=llm spt:routed_at_ms=1785204674879 spt:node=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d spt:vector=14efb80cb72297a1068c87a4aa45f30547c4474b60d1284b122bdc1a91c85f2d:85850 -->
## omp-spt — msg-body-corruption MODE-2: CLOSED and SHIPPED (v0.3.31)

**Status:** Done for this task. v0.3.31 published (GitHub Latest, tag `v0.3.31`, commit `ef1812d`, tree `2ad0c24`), `dist/adapter.spt` sha256 `52aeb3e3f7a1e033ed1ae9dc17e4adcd3063363340ed6502631c5f9c54f0ff98`. This node self-updated 0.3.30 → 0.3.31. Release notes committed (`9961775`).

**Root cause (MODE-2):** delivered peer message body was spliced into only the FIRST provider request of a turn; OMP rebuilds every provider request from session store where the delivery is just a `<msg from="peer"/>` stub, so any turn that called a tool before replying saw an EMPTY peer message on the continuation request. Not size-related, not reassembly, not core spool — confirmed via instrumented live adapter probe and hertz's transcript (`stopReason: toolUse` ×2 before empty-message reply).

**Fix:** delivered bodies now remembered per delivery signature and re-spliced idempotently into every later context boundary lacking them; bounded 64 entries / 512KB, oldest-first eviction. Filed as `KNOWN-HAZARDS #10` / `REQ-HAZARD-DELIVERY-BODY-DURABILITY`, two regression tests added. RECV-silence watchdog hazard renumbered to #11.

**Memory files updated:**
- `msg-body-corruption.md` — MODE-2 closure section added (verified no mojibake), MODE-1 (0.3.27) history preserved.
- `MEMORY.md` index updated to reflect MODE-2 closed and new `release-authority.md` entry.
- New file `release-authority.md` created: standing authority granting emphasys (omp-spt DRI) release authority without operator sign-off (ruling 2026-07-27) — bump/freeze/build/validate/pack/tag/push/`gh release create` on own judgment; ask first only if risky/breaking or outside adapter's own surface.
- Role (`/role`) updated durably with the same standing-authority paragraph (`ROLE_SET:emphasys`, 3649 bytes).

**Notifications sent:** doyle (QUEUED — his inbox), hertz (SENT) — both informed of v0.3.31 and instructed hertz must bounce his endpoint to load it:
```
spt endpoint stop hertz
spt endpoint run --adapter omp-spt --id hertz --create --start
```

**Not done (operator's known bar, unchanged/pre-existing gap):** 3-host native acceptance testing + per-target evidence JSON, requires disposable msvc/gnu/musl hosts — same limitation as prior releases (0.3.24/0.3.25/0.3.29/0.3.30).

**Separately noted, not yet acted on:** doyle's heads-up that emphasys's owlery row holds a dead relay pid (44160) while showing `status=online`, breaking idle-injection — attributed to a core 0.45.0 convergence gap owned by todlando, not the adapter. Emphasys plans to drain inbound manually until it converges; no action taken yet this session.

**Next steps:** monitor for hertz's bounce confirmation and doyle's reply; verify long inbound messages now survive tool-calling continuations once hertz reloads. No other open lane from this session.