## softmata/horus — v0.2.1…v0.2.2

_196+ commits._

### Features
- **feat(tensor): add TensorHandle::from_shape ergonomic constructor** (17b8f5a)
- **feat(horus_cpp): action/service FFI server drivers + on_shutdown lifecycle** (45e358a)
- **fanout: version FANOUT_MAGIC for the new SHM layout (advisor follow-up)** (92ade07)
- **feat(fanout): align both backends on lock-free drop-oldest (latest-wins) seqlock** (e00b634)

### Fixes
- **fix(py): build_messages() fails clearly for pip-installed users** (eb2c44b)
- **fix(record): capture RT-node inputs (record export was empty for RT nodes)** (6e610d6)
- **fix(py): Tensor topic round-trip + DetectionList.append accept horus.Detection** (2b53c68)
- **fix(cargo_gen): inject serde so message! projects compile** (8753a7b)
- **fix(record): include per-tick snapshots in JSON export** (a25ea81)
- **fix(run): stream live output from multi-node Python launches** (1424469)
- **fix(rt): RT nodes ran at half their configured rate** (da15931)
- **fix(cli): repair `horus msg` and `horus deps` on a normal install** (0a186a6)
- **fix(cpp): make C++ projects build, link and honor their tick rate** (acf90f8)
- **fix(cpp): make the C++ pipeline reachable from detection and build** (ea83e2a)
- **fix(install): repair the install -> first-run path end to end** (cbdd0d8)
- **fix(services): don't panic server thread on malformed client response_topic** (ddba5ee)
- **fix(topic): drop tautological SpscShm||SpscShm assert + stale intra names** (1aacc3e)
- **Fix integration/bench/loom tests for SHM-only backends** (3d7f279)
- **fix(replay): derive synthetic replay tick period from recorded wall-clock span** (2a5504e)
- **Merge: fix on_error failure-swallow + delete_recording return type (audit code findings)** (292949c)
- **fix(py): delete_recording honors documented '-> bool' contract (return found/not-found)** (94aecb5)
- **fix(py): on_error must not swallow tick failure — re-raise so FailurePolicy escalates** (1ae4a54)
- **fix #2: executor watchdog feed — healthy RT node + .watchdog() spuriously e-stops** (3db5458)
- **fix #5: executor tick-context — horus::time API inert on executor-run nodes** (2bfe9b4)
- **fix(net-estop): wire the SEND path with a rising-edge anti-storm gate** (4075bb0)
- **fix(security): gate plugin execution on out-of-repo trust (SEC2 + SEC3)** (2cc8b6a)
- **fix(manager): preserve comments/formatting on horus add & remove (toml_edit)** (d8257d9)
- **Merge remote-tracking branch 'origin/fix/net-estop-sched-h1' into fix/net-f1-hardening** (f3baf85)
- **fix(manager): preserve driver crate version (F1) and skip non-Cargo member deps (F4)** (a8b61bb)
- **fix(manager): keep git source on workspace-member deps that also have features** (73c1953)
- **fix(manager): route dual-listed packages by project language (F6)** (731b50a)
- **fix(manager): write horus.lock and horus.toml atomically (temp + rename)** (9af20f0)
- **fix(manager): fail on signal-killed subprocesses instead of reporting exit 0 (F9)** (028a7c2)
- **fix(registry): verify Ed25519 signature on the pre-built-binary install path (SEC1)** (19e215a)
- **fix(actions): make async ActionClient await_result work standalone + count node metrics (F-ACT1/F-ACT2)** (7f12fed)
- **fix(scheduling): wire the external emergency-stop hook to the scheduler (SCHED-H1)** (0cb3efd)
- **fix(topic): reuse intra-fanout endpoint slots so re-registration can't panic (COMM-H1, intra half)** (498812d)
- **fix(topic): reclaim spilled TensorPool slots so FanoutShm stops dropping large messages (COMM-H3/F-MEM2)** (71263d3)
- **fix(python): keep tensor slot alive under zero-copy numpy/torch views (F-PY1)** (c92c0aa)
- **fix(memory): release grid tensor when cost alloc fails in CostMap::new_on (F-MEM3)** (a796dff)
- **fix(scheduling): feed non-RT watchdog nodes to stop spurious e-stop (SCHED-H2)** (774d289)
- **fix(services): PID-scope ServiceClient ids to stop cross-process response theft (F-SVC1)** (edf0453)
- **fix(memory): reuse pool region by physical capacity, not last logical size (F-MEM1)** (400bfc5)
- **fix(horus_cpp): route action results/feedback per client-PID (F2)** (fe40d81)
- **fix(horus_cpp): close service handler heap overflow (F1) + wire-cap alignment (F4)** (d75e906)
- **fix(ipc): multi-subscriber zero-copy UAF (COMM-H2) + try_retain generation-ABA** (417b72e)
- **fix(horus_core,sys,py): stub-audit fixes — failure_policy, actions, honest errors** (e604892)
- **fix(rt): make .no_alloc() usable — exempt a node's first tick (warmup)** (dbd5f8f)
- **fix(rt): stop per-tick alloc+leak in .no_alloc() instrumentation; prove hot path** (5226910)
- **cut: remove ~2.2K LOC dead code + fix horus_library generator bugs** (1d38b6e)
- **fix(fanout): deliver oversized serde messages on FanoutShm via pool spill** (db5b24d)
- **fix(memory): validate SHM header geometry in TensorPool::open (M-E)** (e91b0ad)
- **fix(scheduler): operator pause on a main-thread node must persist (Sched2)** (8257d84)
- **fix(safety): make print_line non-fatal on broken stdout** (c3d872b)
- **fix(memory): reject integer overflow in TensorPool offset+size and align_up** (b4ef167)
- **fix(memory): bounds-check slot_id and add write-path generation check in TensorPool** (cab2dfc)
- **fix(safety): isolate fault-path node callbacks so one node's recovery panic can't kill all nodes** (26ccf48)
- **fix(safety): latch e-stop before logging so a broken stderr can't skip it** (4a03175)
- **fix(topic): non-POD multi-subscriber broadcast lost all but one subscriber** (7e5012c)
- **fix(fanout): drop ring-owned non-POD payloads at FanoutIntra teardown** (3f9ac02)
- **fix(topic): early cross-process subscriber no longer loses buffered messages (softmata-brain bug #2)** (1221bd4)
- **fix(topic): SHM multi-subscriber is BROADCAST, not competing — fixes the detector, resolves the "concurrent consumer-join" (softmata-brain 1327)** (d58393e)
- **fix(topic): CAS slot-claim in MP send paths — eliminates overshoot data corruption** (e9eeebe)
- **fix(topic): SpmcShm consumer-join double-delivery via flush-on-resync (softmata-brain 1327, consumer side)** (97b9e4d)
- **fix(topic): unify SpscShm onto the MpscShm atomic-claim protocol — eliminates multi-producer convergence loss (softmata-brain 1327)** (52d602b)
- **fix(topic): preserve consumed frontier across same-data-plane resync — COMPLETES 1327 sp->mp fix, lifts DO NOT MERGE** (8226d2f)
- **[DO NOT MERGE] fix(topic): sp->mp ready-flag conversion (correct-but-insufficient, softmata-brain 1327)** (b14dca7)
- **fix(scheduler): rebuild dependency graph after RT/executor node partition (hang)** (fa0da97)
- **fix(tensor_pool): eliminate concurrent double-allocation (brain 1333)** (1e1f269)
- **fix(topic): role=Both query methods read local counters, not stale SHM header** (4cde2cf)
- **fix(topic): reliable process_epoch propagation on migration (multi-producer delivery)** (4cd926a)
- **fix(topic): recv drained-detection overshoot — the real cross-thread hang** (f4c7d06)

### Backend
- **release: v0.2.2** (e82e3c3)
- **bench: retarget latency bins to SHM backends (drop removed intra paths)** (1b5d4d7)
- **Update tests for SHM-only backends** (55002e6)
- **Simplify detect_optimal_backend to SHM-only + prune backend-map registry** (706ea5e)
- **Remove dead intra/DirectChannel/colo IPC backends** (4726ea5)
- **Merge: executor tick-context + watchdog feed (audit #5 + #2)** (47d3310)
- **Merge: wire networked e-stop SEND path with rising-edge anti-storm gate (audit #1)** (b6b6df0)
- **Merge: cross-process fanout crash-liveness via flock (COMM-H1 xproc)** (5f6254f)
- **step4 in-process COMM-H1 tests (bitmask reuse, holes, flock reclaim/guard)** (4bc426d)
- **step3 FanoutShm Drop arm (clear bit+PID+release lock) + loud-once exhaustion warn** (c1dcccd)
- **step2 flock claim/reclaim protocol** (7eba7e6)
- **step1 meta layout + version bump** (c5a9928)
- **Merge: networked e-stop hardening + SCHED-H1 wiring (NET-F1 ⊕ SCHED-H1)** (dd102fd)
- **§6 gate tests for §1–§5** (791ba9c)
- **§5 presence path-traversal guard** (3756cc4)
- **§4 estop policy gate + freshness (NOT fake auth)** (94d3223)
- **§3 fragment reassembly DoS bounds** (bae6c61)
- **§2 process_packet dispatch order** (6362e51)
- **§1 bit-7 announcement discriminator** (75beebc)
- **Merge: gate plugin execution on out-of-repo trust (SEC2 + SEC3)** (d988bcf)
- **cut(#4): drop net from default features — LAN replication now opt-in** (278f9b0)
- **cut(gpu+dlpack): strip DLPack protocol + GPU bindings from horus_py** (b27b95c)
- **cut(gpu+dlpack): remove GPU compute stack + DLPack Rust FFI from horus_core** (5d81564)
- **harden(horus_cpp): C++ bindings test + safety surface** (65816b8)
- **revert: drop eager header.tail flush — it breaks multi-subscriber broadcast** (f0f46a2)

### Tests
- **test(topic): lock 1:1 reject-newest/keep-oldest overflow contract** (a9c6736)
- **test(comm-h1): bump LocalState footprint budget to 4 cache lines** (45d2d26)
- **test(safety): cover S2 fault-path escalation (critical -> e-stop, non-critical -> stop)** (148f249)
- **test(topic): prove real multi-thread non-POD broadcast works; scope the flush fix honestly** (c52d24b)
- **test(fanout): capture observed non-POD vs POD backend-selection asymmetry (#[ignore])** (da2e621)
- **test(fanout): loom-prove producer overwrite-reclaim double-frees (phase 2)** (49a5dbe)
- **test(topic): remove/update 14 outdated MpmcRing/MpmcShm tests** (48f56d1)
- **test: un-ignore 11 more reliable integration tests (tensorpool_matrix, user_stories)** (1dc8ce3)
- **test: un-ignore 29 passing integration tests (were bare #[ignore] with no reason)** (bdf5d9f)
- **test(topic): parallel-contention harness verifies brain-1334 torn read is closed; un-ignore the standalone test** (fa98f7d)
- **test(topic): add MP-send overshoot corruption gate (#[ignore], demonstrates bug)** (7548707)
- **test(cross-process): characterize cross_process_mpsc as lifetime-edge, not convergence** (ace5804)
- **test(topic): add deterministic SpmcShm consumer-join exactly-once gate (currently #[ignore], demonstrates bug)** (0171c84)
- **test(cross-process): correct cross_process_mpsc_3_pub_1_sub ignore note — it's a pre-existing late-consumer/producer-lifetime issue, not a spawn-harness failure** (2716114)
- **test(topic): guard SpscShm->SpmcShm consumer-join against torn reads; document pre-existing SpmcShm double-delivery** (241eb9d)
- **test: enable serial execution + ignore 2 service-layer 1327 convergence tests** (1283c1b)
- **test(topic_type_safety): update 2 stale tests to the stricter type-name contract** (ac27edc)
- **test: ignore 2 multi-producer MPSC convergence tests (brain 1327)** (ea3847d)
- **test(harness): serialize SHM-touching integration tests via cleanup_stale_shm guard** (3fcd16a)
- **test(scheduler_unified): serialize tests sharing global SHM (pre-existing flake)** (60d632c)
- **test(acceptance_topic): fix pre-existing broken + flaky topic tests** (7c2b4b9)
- **test: quarantine rare MpscShm torn-read repro (brain 1334)** (aa27885)
- **test(tensor_pool): quarantine + tighten repro for CRITICAL double-alloc (brain 1333)** (573a259)
- **test: de-flake horus_sys isolation + horus_core timing/artifact gates** (b94fd1c)
- **test(topic): accurate dispositions for 3 verified pre-existing bugs** (5a114ae)
- **test(topic): #[ignore] residual timing-flaky multi-producer tests** (12f31c6)
- **test(topic): #[ignore] cross-thread convergence-oscillation hangs (SPMC + concurrent-migration)** (76269b8)
- **test(topic): #[ignore] the 2 multi-producer crash tests (pre-existing race)** (110a999)
- **test(topic): fix housekeeping + clone-migration tests for SHM-backed topics** (6e763c1)

### Docs
- **docs(install.sh): fix stale 'release' branch references in header comment** (bfd7163)
- **docs: correct #9 diagnosis — real intermittent race in shipped wheel** (1803d5d)
- **docs: record round-4 resolutions (#10-#13 fixed, #9 refuted)** (25fdd9f)
- **docs: record message!/serde fix (R6) and the three-language acceptance test** (32888d9)
- **docs: record round-3 conformance sweep (RT half-rate + 4 more product bugs)** (f013a48)
- **docs: record the C++ journey findings and two retractions** (457a9c0)
- **docs: record e2e audit resolution status and remaining gaps** (2314b81)
- **docs(topic): retire stale intra/DirectChannel comment terminology** (fc423e9)
- **docs(topic): note the 64B colo slot geometry is the cross-language wire contract** (2030579)
- **docs(core): correct is_safe_state / severity comments to match runtime** (0e3e78e)
- **docs(py): fix Node.order docstring default 100 -> 0 (matches code)** (3927c1c)
- **docs(1327): record the concurrent consumer-join root, tried-and-reverted fixes, and candidate refactor** (563871e)
- **docs(1334): record that the MP-send CAS claim structurally fixes the torn-read root** (878fc60)
- **docs(test-harness): document serial integration runs; drop the .cargo/config approach** (01dac30)
- **docs(horus_core): fix HorusResult doctest (duplicate fn definition)** (79eb484)
- **docs(horus): fix broken Quick Start doctest (undefined CmdVel)** (e666720)
- **docs(tensor_pool): correct pop_and_claim crash-recovery caveat** (247559e)

### Chore
- **chore(deps): bump serde_with 3.18.0 -> 3.21.0 (GHSA-7gcf-g7xr-8hxj)** (aa33d47)
- **ci(security): add minimal GITHUB_TOKEN permissions to remaining workflows** (cc5e84c)
- **ci(security): set minimal GITHUB_TOKEN permissions on C++ binding workflows** (e04ea8a)
- **refactor(horus_py): rename dlpack_utils.rs -> tensor_convert.rs** (bbdbd8f)
- **chore(horus_cpp): sync Cargo.lock with loom + proptest dev-deps** (a27da3f)
- **chore(clippy): keep horus_core clippy-clean under -D warnings** (6465d46)
- **refactor(topic): adopt eager header.tail flush (now safe post-CAS); load-robust fanout test** (e9f782f)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/softmata/horus?utm_source=github-action)._