No description
  • Rust 93.2%
  • PowerShell 5.7%
  • C 0.5%
  • HLSL 0.4%
  • Batchfile 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Meta Vens e66c2565fb Bound the media sender: one deadline owner, whole-group drops, a drivable seam
The sender's queues were unbounded (mpsc::channel plus two VecDeques), expired
payloads one at a time so half a frame could leave after the other half died,
gave repairs a fresh deadline from the clock, spun on a 1 ms sleep, and could
not be driven without PowerShell, ffmpeg and WASAPI. The latency budget also had
two owners: a 2 s producer default that the receiver's 250 ms age never matched.

MediaSendCore (new media_send.rs) owns the queues, hub, feedback intake, repair
cache and budget, and progress counters. run_rudp_mux_once now spawns encoders,
feeds readers into the core and publishes; it decides no deadline.

- The unit is a group: one access unit with its parity, or one audio packet,
  stamped produced_at + the request's latency budget when it leaves the
  packetizer. Expiry is per group; a group is sent whole or not at all.
- Queues are capped per kind (audio 256, video 512 groups), drop the oldest
  group and count it (groups_dropped_audio, groups_dropped_video). The reader
  channel is a bounded sync_channel.
- The Annex B packetizer returns one group per access unit and no longer errors
  on pending overflow: an unfinished access unit larger than the ceiling is
  dropped and counted.
- Repairs inherit the deadline of their frame and are not sent after it. A
  blocked send polls resends and stops at the group deadline; the sleep is gone.
- MUNINN_RUDP_MEDIA_RECEIVER_ASSEMBLY_DEADLINE_MS is deleted. The default budget
  is 250 ms (Q7), used only when a request names none and offered as the
  advertisement's default_latency_budget_ms. The profile loses its three copies
  of the budget; the telemetry JSON carries one latency_budget_ms.
- A test harness drives the real readers and core over loopback through a
  seeded drop relay to a CultNet RUDP client, from a committed H.264 clip
  (testdata/clip.h264, ffmpeg command recorded beside it) and a PCM ramp.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 20:04:17 +02:00
crates Bound the media sender: one deadline owner, whole-group drops, a drivable seam 2026-09-29 20:04:17 +02:00
deployment/idunn An Idunn-launched serve presents itself to Odin; a recipe for Raven 2026-09-11 13:49:30 +02:00
docs Merge realtime robustness Cuts 0-1: maps corrected, receiver residue deleted 2026-09-29 16:09:40 +02:00
native Observe scheduled Move hues through PSMoveAPI 2026-07-12 22:07:41 +01:00
scripts Presence publisher sequence survives a restart 2026-09-11 14:40:05 +02:00
.gitignore Give the extracted Muninn a root of its own 2026-09-09 23:04:41 +02:00
Cargo.lock Pin CultLib by full sha so odin-core and this crate resolve one source 2026-09-11 14:09:30 +02:00
Cargo.toml Drop the comment for the patch that is gone 2026-09-11 15:03:51 +02:00
README.md Give the extracted Muninn a root of its own 2026-09-09 23:04:41 +02:00

Muninn

Local capture broker for the GameCult swarm.

Muninn resolves what data streams a host can offer, advertises them, and serves them to CultMesh peers on request. Screen and loopback audio, cameras, PS Move controllers and their optical markers, HID and XInput gamepads, Quest access.

Muninn running does not mean Muninn is broadcasting. Each feed it can reach is available for another service to request. Mimir asks for sensors. Sleipnir asks for input. A stream asks for screen and audio. Muninn does not decide what any of them are for.

Extracted from Odin with its full history. Muninn had lived as three crates inside the repository of the service that discovers it, with its document schemas owned by odin-core — an inversion of the ownership it needs to hold. Same shape as the Idunn extraction of 2026-09-05, and done deliberately after it.


Status

This repository does not build yet. It is a faithful history extraction, not a finished cut. muninn-daemon still depends on odin-core by path for the twenty record types and schema constants it uses, and that dependency is one of the things being removed.

See docs/teardown-map.md for the working map: current body, the authorities currently fused into one 14,567-line main.rs, schema decomposition, extraction blast radius, and the measured diagnosis of the audio decay that prompted the rebuild.

Authority

  • Owner: Muninn owns local source enumeration, capability advertisement, per-consumer stream grants, and transport of granted streams.
  • Input: locally reachable devices; typed capture stream commands from requesting peers.
  • Output: CultMesh Media Streams and typed sensor records.
  • Not Muninn's: the media protocol itself (a general CultMesh contract, owned by CultLib), discovery and rendezvous (Odin), deployment and continuity (Idunn), the hue programs that decide what colour a Move should be (Mimir), and any consumer's lowering — OBS, browser, or otherwise.

Muninn is one producer of a general contract. It is not the contract.