userFRM
Found by Codex (GPT-5.4) during PR #29 audit: 1. **CRITICAL: `PodBus::subscriber()` copies publisher's raw pointers** — `ring_ptr` and `write_seq_ptr` point into the publisher's mmap. If publisher drops first, subscriber dereferences dangling pointers. Fix: subscriber must open its own mmap and derive pointers from it. 2. **HIGH: No lock discipline** — `create()` calls `remove_file` then recreates. A second publisher can replace a live bus, splitting subscribers between old/new inodes. Fix: add exclusive lock file like `ShmPublisher::create()`. 3. **MEDIUM: Alignment not enforced for `T: Pod`** — Ring starts at `base + 64`. If `align_of::<Slot<T>>() > 64`, every cast is misaligned UB. Fix: validate `align_of::<T>() <= 8` in `create()` (matching `register_typed`). 4. **LOW: Idle publisher heartbeat goes stale** — Publisher only updates heartbeat every 1024 publishes. An idle publisher is declared dead after 5s. Fix: expose `heartbeat()` method or extend timeout. 5. **Design: `publish(&self)` + `Sync` allows concurrent calls** — Documented as SPMC but not enforced at type level. Consider `publish(&mut self)` or document the data-race-on-concurrent-publish tradeoff.