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

_315+ commits._

### Features
- **new: rust-analyzer had no project to load until the first build** (a0aad61)
- **TOOL-2: add the man page, Dockerfile and devcontainer HORUS never had** (c805674)
- **feat(schema): ship the horus.toml JSON Schema; make check --json carry findings** (be629c4)

### Fixes
- **LIVE-5: echo still dropped messages — my own fix resumed from the wrong point** (2a16eab)
- **fix(core,py): deterministic mode was not deterministic, and astype always panicked** (c976116)
- **fix(py): the shipped Python example panicked on every tick** (6c98f27)
- **fix(net,manager): three more places asked the environment instead of the accessor** (8220845)
- **fix(net): the presence receiver read the namespace a different way from everyone else** (9983f9e)
- **fix(manager): `horus check` reported a package's own modules as missing** (91c7968)
- **fix(manager): `horus check` failed on this repository over a test fixture** (1d9d3a8)
- **fix(manager): `horus check` said a module was missing without naming it** (432a0be)
- **fix: HORUS's own horus.toml failed HORUS's own validator** (113a48f)
- **fix(manager): the CLI printed instructions naming commands it does not have** (65578e0)
- **fix(core): reading local presence deleted the fleet's remote host records** (5a429e0)
- **fix(manager): `topic list` called every topic active, including empty ones** (93c8881)
- **fix(core): a node whose registry was wiped reported Healthy at 0 ticks** (889a457)
- **fix(core): a migration pulled a consumer's read position backward** (cc4c82e)
- **fix(core): a generic type name was stored mangled and mismatched itself** (d6eb82a)
- **fix(manager): `topic info` said "(none)" for a topic with live endpoints** (9f2ccfb)
- **fix(manager): `horus service list` reported 0 servers for a serving service** (557962d)
- **fix(manager): `topic pub` published a payload nothing could ever read** (c065745)
- **fix(manager): `topic echo` and `topic pub` could not be used together** (14c1ddb)
- **fix(manager): `clean --shm --force` wiped every robot on the machine** (998a001)
- **fix(manager): `horus topic echo` printed hex for 83 of 92 message types** (991562d)
- **fix(sys): every `cargo test` ran in the same shared memory a robot uses** (ce6af52)
- **fix(py): a failing Python node reported its exception without the traceback** (8995d48)
- **fix(net): an e-stop that reached nobody was indistinguishable from one that worked** (6ea656a)
- **fix(core): a crashed owner's SHM region hung every process that opened it** (7271082)
- **fix(core): the lossy send blocked for 100ms rather than dropping** (eee09fc)
- **fix(core): send_blocking ignored its deadline until it had already blocked** (5a19d2d)
- **fix(core): a lapped subscriber lost messages with every counter reading zero** (9515f86)
- **fix(net): the import guard could not tell what this robot publishes** (faa1d9a)
- **fix(net): `cargo test -p horus_net` failed on every run, for four reasons** (228e707)
- **fix(core,sys,cpp): a print on a broken stream killed the thread printing it** (836403f)
- **fix(net): a diagnostic on a broken stderr killed the replicator thread** (189ecf2)
- **fix(net): a peer was declared link-lost before it could answer** (7970b21)
- **fix(net): outbound replication stopped once the topology settled** (ad571cc)
- **fix(core): a topic created before the network hook existed stayed invisible** (715152a)
- **fix(net): the default import mode admitted nothing, so no remote data arrived** (2dbdc36)
- **fix(services,actions): a panic in user code no longer kills the server** (28ee95a)
- **fix(scheduler): a node name can no longer forge lines in the runtime's output** (e8cf7de)
- **fix(rt): throttle the per-tick diagnostics that were destroying the log** (5813bee)
- **fix(shm): a publisher restart no longer deafens its subscribers** (731adef)
- **fix(topic): a lapped broadcast subscriber received nothing at all** (70a407a)
- **fix(rt): a closed stdout no longer kills the real-time thread** (94b08b8)
- **horus_core: fix flaky tests, restore two disabled ones, characterize an ordering defect** (d9cc784)
- **fix(introspection): make topic echo stream, and let msg see robotics types** (e64039b)
- **fix(rt): warn when the build or kernel cannot deliver the requested real-time** (5760bb5)
- **fix(doctor): grade toolchains per language instead of as a fraction** (240cdac)
- **fix(new,test): make generated projects scriptable, unique and lint-clean** (678d52a)
- **fix(help): correct the alias and the missing commands, and guard the template** (b0b5830)
- **fix(ci): stop building an arbitrary docs ref in privileged context** (8d99bbf)
- **fix(setup-rt): install the kernel Ubuntu actually has, and ask first** (7633382)
- **fix(watchdog): stop claiming a hung node was safed** (15de61f)
- **fix(deps): drop extract-zip by upgrading puppeteer in the e2e harness** (aa41ada)
- **fix(scheduler): announce when .rate() switches on real-time enforcement** (fd29bbe)
- **fix(net,deps): make --net actually enable networking; ask before sudo apt** (ee0dfca)
- **fix(deploy): ship the binary, build the right manifest, expand the remote tilde** (78ad724)
- **fix(arm): build for 32-bit ARM, and add the CI job that would have caught it** (60364ad)
- **fix(health): count failed ticks and stop reporting a failing node as healthy** (ed12cc9)
- **fix(blackbox): record node panics, and find the recorder from a subdirectory** (55e016e)
- **fix(rt,build,sim): stop hiding real-time degradation, cargo warnings, and sim-mode intent** (cc78d2c)
- **fix(message!): replace the recursion trap with an actionable parse error** (bf75961)
- **fix(errors,manifest): stop printing errors twice; report unknown horus.toml keys** (0004df3)

### Backend
- **LIVE-13: cut 0.4.0 — 0.3.0 was tagged and never published** (59a516a)
- **docs harness: a generated message header is not a shipped one** (4e924d2)
- **DX remediation: subscriber liveness, message codegen, C++ example, shared linking** (cb35969)
- **DX remediation: CLI help, --sim safety, prompts, env, python path** (a81d1e8)
- **Merge branch 'dx/remediation' into dev** (0f73139)
- **DX remediation: install, uninstall, containers (TOOL-1, TOOL-2, TRUST-2)** (fbdf832)
- **DX remediation: manager CLI, config and codegen** (8fafeb0)
- **DX remediation: runtime crates (LIVE-4, LIVE-6, LIVE-9, LIVE-11, LIVE-12)** (ca85925)
- **DOC-1: doctor called a ninja toolchain ready, then the build demanded make** (ad8ad71)
- **Merge remote-tracking branch 'origin/dependabot/github_actions/actions-fa5c6157e7' into dev** (0a7e628)
- **Merge remote-tracking branch 'origin/dependabot/cargo/rust-minor-86a2a23f01' into dev** (1e72833)
- **Merge branch 'dx/output-and-ipc' into dev** (689121f)
- **LIVE-13: cut 0.3.0 — the tree was 244 commits past the last release** (a584ddc)
- **Merge remote-tracking branch 'origin/dx/remediation' into dev** (36e575f)
- **Merge remote-tracking branch 'origin/main' into dev** (4a588b0)
- **horus_py: every astype() to a different dtype panicked** (b36bb85)
- **LIVE-8: the Rust and C++ templates still named every node 'controller'** (33aefc2)
- **horus_sys: a restarted node's topic was deleted by `horus topic list`** (f32e06b)
- **clean: the cleaner looked at target/, where a template project has nothing** (8ce611e)
- **run: the build honoured CARGO_TARGET_DIR and the lookup did not** (a7a7161)
- **horus: the frame tree was reachable from Python and C++ but not Rust** (1fa7f38)
- **docs harness: an ellipsis in prose skipped the whole block** (050f956)
- **horus_py: Miss.SAFE_MODE never reached a Python node's enter_safe_state** (83bdc27)
- **horus_py: Topic.name reported the message type, not the topic** (327f513)
- **docs harness: a longer type name silently excused wrong-field errors** (6b610b5)
- **LIVE-5: `topic echo` sampled the newest slot instead of streaming** (a0fa1d8)
- **DOC-3, PATH-6: a footer crediting a file that did not exist, and a failure for a suite that did not** (4139cb2)
- **DOCS-3, FLAG-1, FLAG-2: what the reference omitted, and a safety flag with holes** (7abbae9)
- **CFG-4, CFG-6: two findings I reported closed while a third of each was undone** (2830abb)
- **PATH-3: a failed install poisoned the cache permanently, and silently** (7515283)
- **core: a migration drain that could only ever report on the scheduler** (9f2902a)
- **docker: the image is built now, and it could not do what its header claimed** (9d31af8)
- **core: a lapped resume point could move the consumer's tail backward** (82a2a7a)
- **tests: the flaky suite was mostly one hung process, and a diagnostic that could not tell two defects apart** (6992625)
- **docker: the image pinned a Rust version the workspace no longer declares** (1c1967c)
- **INTEROP-1: the C ABI, so a generated type can be published from C++** (9852a5c)
- **deploy: cross-compile the C++ bindings, and stop letting crates.io fail the suite** (d98a20d)
- **core: a broadcast test asked for a guarantee the transport disclaims** (f4722ea)
- **INTEROP-1: `horus msg gen` — one definition, four artifacts** (1790cc6)
- **ONB-1: guards for navigation links and Prev/Next derivation** (7ffbef8)
- **GEN-1: the README's Rust did not compile, and taught a different language** (89ae87d)
- **LIVE-6, LIVE-7: introspection described a system that was not running** (b1dccfd)
- **ONB-2: install.sh could not build HORUS, and the MSRV was wrong in both directions** (a6283e9)
- **LIVE-1: `[rust]`, so cargo settings survive a build** (8323c00)
- **LIVE-3, LIVE-10, LIVE-11: C++ was not a supported language, it was a gap** (bef14c1)
- **CFG-3: a manifest that will not load must say what is wrong and where** (db17c9e)
- **GEN/DOCS: the docs-example gate was flaky, and covered a quarter of the docs** (9e181db)
- **INTEROP-1a/1b/1c: the hash the CLI prints, the Python generator that built nothing, the codegen decoy** (7fad66e)
- **LIVE-12: a killed node stayed "Running" forever, and the ring test was measuring the wrong backend** (a8e28cc)
- **TOOL-3, TRUST-3: two real proxy bugs, silent shell edits, and translation guards** (611b29c)
- **CI-1, EX-2: CI advertised CLI coverage that did not exist, and never built the examples** (2d40c24)
- **LIVE-9, PATH-2, PATH-7, HELP-4, DOC-2: runtime and CLI noise, and undocumented commands** (612a0f6)
- **core: reject lapped ring slots — recv() reordered and duplicated under overload** (0649956)
- **CFG-2: remove the dead `language` key from HORUS's own manifests** (959337b)
- **EX-1: nine of ten Rust examples and all six C++ examples did not compile** (a8b1f06)
- **TRUST-1: the ROS2 comparison was not measured, and contradicted its own source** (d348582)
- **INTEROP: layout-checked topics, a facade that hides its internals, a stable msg hash** (88bac56)
- **RT-2: Miss::SafeMode safed the node every tick instead of once, plus a CHANGELOG** (5be03e9)
- **DX: install URL, Python typing, lifecycle hooks, config docs, test reliability** (043cf87)
- **deps(cargo): bump the rust-minor group with 7 updates** (848dc89)
- **Merge: docs contract findings, framework fixes and harness hardening** (8025645)

### Tests
- **test(core): the ten-node robot test needed 17Hz per node in a 3s window** (0f9d981)
- **test(manager): corrupt presence files are cleaned when old, not on sight** (3a7d8ac)
- **test(manager): the live introspection poll gave up before a loaded machine could answer** (53cbfbf)
- **test(manager): the examples contract failed when there was nothing to check** (1eb1352)
- **test(core): two presence stress tests corrupted each other's directory** (919bcbc)
- **test(core): the dual-write routing test read a process-global counter** (3319040)
- **test(core): the CLI tests failed with NotFound instead of skipping** (503df9a)
- **test(docs): skip C++ blocks that include a header the reader supplies** (6ddc219)
- **test(docs): check nested subcommands, flag-value parsing, empty quarantine** (f2e5d94)

### Docs
- **DOCS: guards for navigation reachability and environment-variable coverage** (2987e1b)
- **docs: drop DX_REMEDIATION.md** (3e4d06c)
- **docs: drop DX_REMEDIATION.md** (daa7f7d)
- **docs: drop DX_REMEDIATION.md** (1477a93)
- **docs: update coverage after the RT warning and introspection fixes** (42dc2c6)
- **docs: update coverage after the schema, json and doctor fixes** (17a0dd9)
- **docs: record coverage against the original 61-finding audit** (639cd83)
- **docs: update remediation status after the RT, watchdog and setup-rt fixes** (13ebb98)
- **docs: update remediation status after the deploy, net and health fixes** (2325374)
- **docs: record DX remediation status and the ranked next steps** (b84cdd2)

### Chore
- **chore: drop the scratch probe example** (9f9db8e)
- **chore(core): drop the now-unused expected-stream vector** (070ab6b)
- **style: rustfmt the shm holder-lifetime guard** (6f14dd5)
- **ci(actions): bump the actions group with 2 updates** (219425d)
- **chore: ignore scratch target dirs, and drop one that was committed** (f793d88)
- **chore: drop a stray horus.toml committed into horus_manager/** (451ce31)

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