Mimir/docs/implementation-plan.md
2026-07-17 07:24:41 +01:00

549 lines
36 KiB
Markdown

# Implementation Plan
## Current Cut Line
Mimir is now a C# app/runtime plus native reservoir project. The live stream
machine must be direct-driver and native-buffer first.
For the source-level ownership map, read [[code-algorithm-map|Code Algorithm Map]].
- `src/Mimir.App` hosts Fensalir for windowing, rendering, and the D3D12
bridge.
- `src/Mimir.Runtime` owns stream descriptors, source polling, direct push
ingest, one rolling buffer per configured audio/video/tracking stream, and the
synchronization hub Fensalir can inspect.
- The default five-second window is an intentional latency/memory trade: use it
to line up streams and extract the volumetric audio/video field before Mimir
emits program output.
- `native/reservoir` owns the lower native rolling-buffer invariant for
Fensalir/Faust integration.
- PowerShell/FFmpeg/SRT remains a bridge utility for LAN compatibility feeds.
It is not the synchronized program or publication authority.
The old script stack is gone. Do not add a compatibility edge unless it protects
a named invariant that the native runtime cannot protect yet.
## Implemented
- Mimir public identity, branding, and Face memory.
- `Mimir.slnx` with `src/Mimir.App` and `src/Mimir.Runtime`.
- Fensalir host bootstrapping from `Mimir.App`.
- `MimirSynchronizationHub`, `MimirRollingStreamBuffer`, stream descriptors, and
`IMimirStreamSource`.
- Configurable five-second default rolling buffers for local and network audio
and video/tracking streams.
- `MimirNativeIngestStreamSource` for direct push ingest into runtime buffers.
- `MimirStreamKind.Tracking` plus `MimirTrackingObservation` carry PS Move
evidence samples as typed `mimir.move_tracking_observation.v1` documents.
Starfire and Nightwing both have USB-attached Moves. Muninn daemons publish
source-local glowing-orb marker candidates and controller/IMU/button state;
Odin owns discovery and schema projection, not pose fusion.
- `native/reservoir` exposes a `move_evidence` typed view and
`LocalcastMoveEvidenceBufferDescriptor` so Muninn Move witnesses can be
admitted as compute-upload buffers before Mimir's fusion pass and Fensalir's
GPU consumers touch them.
- `MimirNativeReservoirRuntime` is the managed owner for that native runtime
boundary. It pins Move evidence sample/descriptor batches so native reservoir
handles remain valid while Mimir prepares fusion input.
- `MimirMuninnMoveEvidenceAdapter` mirrors Muninn's marker-candidate and
controller-state document schemas and normalizes them into native Move
evidence samples. It does not associate markers to controllers or synthesize
pose.
- The realtime Move witness path uses CultMesh streaming, not CultCache polling:
Muninn publishes shared-memory stream frames, Mimir consumes the latest read
lease, normalizes the frame, and admits it to native `move_evidence`.
- `MimirMuninnMoveEvidenceAdapter.TryAdmitLatestCultMeshFrame` now exposes a
typed admission receipt for that latest read: decoded frame id, producer,
publish/read timestamps, sample counts by kind, source/arrival ranges, native
reservoir handle, and reservoir edge/window. `Mimir.BufferSmoke
--muninn-move-cultmesh-stream-smoke` asserts the receipt so the named proof
spine can be traced instead of inferred.
- `mimir.move_controller_pose.v1` is Mimir's resolved wand pose contract.
Mimir owns calibration, association, triangulation, IMU fusion, prediction,
confidence, and latency accounting for those poses before Fensalir consumes
them as interactive controller input.
- `MimirMoveFusion` is the first calibrated fusion owner for Move tracking:
it consumes native Muninn Move evidence samples, requires calibrated camera
witnesses before publishing a pose, associates marker candidates with the
USB controller state, triangulates multi-camera orb position, demotes
single-ray fallbacks through confidence, carries buttons/trigger/gyro into
`mimir.move_controller_pose.v1`, and marks orientation as
`orientation:imu-unresolved` until the IMU/prediction pass earns full 6DoF.
- `MimirMovePoseStream` frames resolved Move poses as
`mimir.move_controller_pose_stream_frame.v1` over CultMesh shared-memory
bytes streams so Fensalir and other consumers have a realtime stream contract
for Mimir-fused controller input.
- `MimirMoveProofSurface` is the observer-only dev proof surface for the named
Move chain. It combines a Muninn evidence admission receipt with a Mimir pose
stream frame and a Fensalir presentation/probe timestamp into
`mimir.move_proof_surface.v1`, then lowers the verdict to a Fensalir
`AquariumSplineFrame` probe. `Mimir.BufferSmoke --move-proof-surface-smoke`
proves the explicit
`muninn:nightwing:move-evidence:79 -> mimir:starfire:move-evidence:79 ->
mimir:starfire:move-pose:79 -> fensalir:starfire:presented-frame:79` chain,
and rejects single-ray fallback as not full pose.
- `MimirMoveProofPipeline` is the shared commit primitive for the live Move
proof path. It starts from a Muninn CultMesh shared-memory evidence frame,
admits samples to the native `move_evidence` reservoir, runs Mimir-owned
fusion, creates the Mimir pose stream frame, creates the proof surface, and
returns the Fensalir spline probe in one pass. `Mimir.BufferSmoke
--move-proof-pipeline-smoke` proves that shape against the native reservoir
debug DLL; live hardware and presented-frame capture still need to call this
primitive instead of hand-assembling a parallel path.
- `MimirRuntime` is now the live Fensalir attachment point for proof surfaces.
`PublishMoveProofSurface` accepts the Mimir-owned
`mimir.move_proof_surface.v1` document, `CreateFrame` composes its
observer-only `move-proof-*` splines into `AquariumFrame.Scene.SplineFrame`,
and `Mimir.BufferSmoke --move-proof-runtime-frame-smoke` proves the frame is
empty before publish, contains the proof splines after publish, and clears
without leaving a repair loop behind.
- `MimirMoveProofRuntimeDriver` is the bounded runtime bridge from a Muninn
CultMesh shared-memory evidence ring to `MimirRuntime.PublishMoveProofSurface`.
It derives the Mimir evidence, Mimir pose, and Fensalir frame ids from the
actual Muninn frame suffix, calls the shared proof pipeline, and suppresses
duplicate frame admission. `Mimir.BufferSmoke --move-proof-runtime-driver-smoke`
proves `MimirRuntime.Update` can pull one ring frame into the same-sequence
proof chain and visible spline frame.
- `MimirMoveProofRuntimeConfiguration` is the typed runtime configuration and
validation contract for future real Move proof subscriptions. An enabled
source names the Muninn evidence stream, native reservoir path, Mimir evidence
and pose frame prefixes, Fensalir presented-frame prefix, fusion authority,
consumer contract, and at least two calibrated camera witnesses. It creates
`MimirMoveProofRuntimeDriver` only after the supplied ring stream id matches
the configured evidence stream.
- `MimirRuntime` now owns configured Move proof activation instead of leaving
config as a readout. At scene-ready it asks an
`IMimirMoveProofEvidenceRingProvider` for the configured Muninn evidence ring,
opens the configured native reservoir, creates the driver, retains the
resources, and exposes an activation status. The default provider fails
explicitly because the current C# CultMesh ring is still in-process only;
`Mimir.BufferSmoke --move-proof-runtime-activation-smoke` injects an
in-process provider and proves config activation can produce the same named
proof chain. Real Nightwing/Starfire cross-process ring opening remains
pending.
- `mimir.move_proof_runtime_activation.v1` is the typed readiness/proof-spine
surface for configured Move proof sources. It reports the configured stream,
provider kind, active/driver state, native reservoir path, calibrated camera
ids, latest same-stream proof ids, latest verdict, and the unavailable
default-provider diagnostic. `Mimir.BufferSmoke
--move-proof-runtime-activation-surface-smoke` proves both an active injected
ring document and the inactive default runtime document without claiming live
field evidence.
- `mimir.move_proof_evidence_frame_snapshot.v1` is the one-copy fallback for
captured Muninn evidence frames while C# CultMesh has no cross-process ring
opener. A configured `EvidenceSnapshotPath` is loaded by
`MimirConfiguredMoveProofEvidenceRingProvider`, metadata-checked against the
encoded payload, copied into an owned in-process ring, and then consumed by
the same runtime driver/pipeline. `Mimir.BufferSmoke
--move-proof-runtime-snapshot-smoke` proves the named proof spine through
that file boundary. It is field capture/replay support, not the final live
shared-memory proof.
- Odin/Muninn now has the matching producer-side latest snapshot writer:
`--move-evidence-snapshot <path>` writes the Mimir-compatible
`mimir.move_proof_evidence_frame_snapshot.v1` artifact from the same Muninn
Move evidence publisher after the frame payload is accepted into the stream
ring. The Odin unit
`move_evidence_snapshot_writes_mimir_compatible_frame_artifact` decodes the
snapshot tuple and embedded Muninn frame payload. This lets Nightwing produce
a field artifact for Mimir replay while the final live ring/page transport is
still pending.
- `MimirMoveProofDevSurface` is a dev-only bootstrap gated by
`MIMIR_MOVE_PROOF_DEV_SURFACE`. It uses the same runtime proof attachment so
`Mimir.BufferSmoke --move-proof-presented-frame-smoke` can run `Mimir.App`
headless, capture the Fensalir-presented PNG, and pixel-check the named
proof probe. This verifies the renderer/probe layer; it is not live
Nightwing hardware evidence.
- `MimirMoveCalibrationProtocol` publishes the typed calibration preflight for
Starfire/Nightwing Moves: required Muninn evidence streams, optional
Quest headset/controller pose witnesses, stillness/sweep/validation phases, and
the four derived calibration outputs Mimir must produce before IMU
orientation can become authority.
- Muninn publishes Quest access as `muninn.quest_access.v1` for the USB-attached
Quest. Mimir consumes that access surface and later `muninn.quest_pose_frame.v1`
samples as optional calibration evidence; Mimir does not own ADB/Quest access.
- The old `scripts/start-nightwing-move-tracking.ps1` bring-up path is
archived. It no longer starts a receiver/recorder pair or stages a socket
witness worker. Nightwing Eye/Move evidence must enter through Muninn/Mimir
typed CultMesh stream frames and Odin-discovered CultMesh documents. The blob
stream remains optical witness evidence for later pose fusion, not the final
6DoF pose owner.
- Structured PS Move light pulses are Muninn output commands. Mimir publishes
`muninn.move_light_command.v1` over CultNet/CultMesh to the Muninn daemon on
the host that owns the USB-attached Move. Muninn writes PS Move HID report
`0x06` locally and updates command state/receipt.
`scripts/start-starfire-move-light.ps1` and Nightwing direct HID writes are
now smoke/bootstrap paths for hardware proof when Muninn is not yet running
on that host.
- Odin's Muninn organ owns Move optical candidate extraction in
`E:\Projects\Odin\crates\muninn-move-tracker` and publishes/feeds
`muninn.move_marker_candidate.v1` records. Mimir consumes those candidate
streams; it does not own raw optical extraction. Final pose, stereo
triangulation, calibration, association, IMU fusion, and prediction belong to
Mimir.
- Muninn's Move evidence stream frame no longer hardcodes an empty optical
candidate slice. The daemon frame uses the canonical
`muninn.move_marker_candidate.v1` record shape, and the Odin unit
`move_marker_candidates_publish_in_mimir_compatible_cultmesh_frame` proves a
bright Y8 frame can pass through `muninn-move-tracker` and serialize as a
non-empty marker candidate beside controller evidence. The daemon now has a
source-local Y8 extraction/publish seam and a first `serve` camera producer:
`--move-marker-camera <camera-id>=<device-path>` polls a Unix V4L2 YUYV frame,
converts it to compact Y8, and feeds that same seam. Unit tests prove the
configured camera tick publishes marker evidence through the shared frame
contract; Nightwing hardware/live V4L2 proof is still pending.
- `MimirProcessStreamSource` for bridge/network command edges.
- `MimirFrameEventProcessStreamSource` for temporary JSON-line frame metadata
from native probes into the same rolling buffers Fensalir inspects. One probe
process can accept multiple emitted `sourceId` values so it does not reopen
the same camera set once per stream.
- `native/asio_capture` plus `MimirAsioStreamSource` provide the first
production-shaped Focusrite path: a native in-process ASIO callback source
feeds sample-bearing 192 kHz Float32 blocks directly into `Mimir.Runtime`
rolling buffers on one interface clock domain.
- `src/Mimir.BufferSmoke` loads the runtime config, polls the synchronization
hub, and prints the actual rolling buffers. Use `--require-samples` when an
empty declared sensor buffer should fail the run. Use `--bioacoustic-self-test`
to render the active motif timeline into memory and verify that the decoder
recovers direct word anchors. Use `--standalone-bioacoustic-self-test` to
verify that a receiver with only the codebook/schedule can recover canonical
source offset from delayed audio. Use `--bioacoustic-train` to run the
indexed cepstral receiver hypothesis panel and write CultCache/audio receipts
under `artifacts/bioacoustic-training/`.
- `native/probes/wasapi_audio_cadence` captures WASAPI mic or render-loopback
block metadata and emits `audio-block` JSON events for the diagnostic runtime
adapter. It can probe requested shared/exclusive formats so driver state is
explicit, but Scarlett production capture belongs on ASIO.
- `native/probes/asio_audio_cadence` opens the registered Focusrite ASIO COM
driver, reports channel counts, buffer sizing, supported sample rates, and can
run a short input callback capture. Current Starfire Focusrite USB ASIO proof
with the Scarlett Solo 4th Gen shows 4 inputs / 2 outputs, including
`Loopback 1/2`, 192-frame preferred buffers, 44.1-192 kHz support, and
nonzero 4-channel `Int32LSB` input callbacks at 192 kHz. `--monitor-sweep`
emits low-gain ASIO output bursts and synchronously measures loopback/mic
response per frequency so ultrasonic acoustic claims stay measured. The probe
can also play raw mono Float32 timeline audio with `--play-f32-mono` and
capture raw interleaved Float32 ASIO input with `--record-f32-interleaved`.
- `MimirBioacousticTimeline` owns the active runtime watermark described in
[[bioacoustic-timeline-watermark|Bioacoustic Timeline Watermark]]. It renders
a low-gain birdsong-like word language: 128 self-identifying word positions,
left-speaker and right-speaker variants, four formant-rich syllables per word,
rhythm variation, and direct word identity so a correctly decoded word
identifies canonical timeline position. The active receiver is no longer a
sequence decoder: each song contour should expose multiple time/frequency
anchors through syllable timing, bends, formants, payload ornaments, rhythm,
speaker tint, and log-mel shape. Runtime active sync now reports
`evidence=bioacoustic`.
- `MimirChirpletTimeline` owns the older structured chirplet calibration stream,
PCM segment rendering, matched timing trace, and per-band response kernels.
It remains a reference/diagnostic path.
- `MimirChirpletSymbolCodebook` owns the 32 symbol definitions. Each symbol has
a unique chirp shape, with inter-chirp rhythm as additional code evidence.
- `MimirChirpletStreamDecoder` is the first constrained chirplet-transform
receiver. It owns a bounded PCM window, emits transform frames with multiple
phase-invariant symbol candidates and per-candidate refined sample offsets,
decodes code-valid triplet anchors through a local trellis that requires gap
and clock coherence, and fits a per-source sample clock from those anchors.
- `MimirAudioSynchronizationAnalyzer` ports the first live sync measurement:
sample-bearing audio blocks are resampled into the Scarlett loopback timeline.
The analyzer derives delay only from matched decoded timeline anchors.
A source without at least one matched anchor has no timing report for that
window. It accepts Float32, Int16, Int24, and Int32 PCM windows so ASIO/native
capture can feed true interface formats without a pre-conversion shim.
- `MimirAudioSynchronizationStateTracker` owns the first smoothed per-source
sync state: latest fractional delay, smoothed delay, confidence, per-band
response evidence, and delay-slope/SRO estimate in ppm.
- `faust/mimir_alignment_actuator.dsp` is the first Faust-owned sample movement
surface: six channels of bounded fractional delay and gain controls. Mimir
estimates delay/SRO; Faust/native DSP applies correction.
- `MimirRuntime` updates audio sync analysis online as a bounded rotating
service and can emit live sync telemetry with
`MIMIR_SYNC_TELEMETRY_SECONDS`. UI and telemetry read cached reports/states;
they do not run synchronization analysis.
- `MimirRuntime` publishes live ASIO spectrum history to Fensalir in two layers:
`AquariumBufferFieldFrame` carries the real buffer-field intent for spectrum
windows as spline-domain tube fields with tangent/curvature/normal/derivative
appearance and probe policy, while `AquariumSplineFrame` is the temporary
Catmull-Rom tube preview so the buffer contents remain visible before GPU
reservoir lowering owns the draw.
- `MimirRuntime` queues bioacoustic timeline PCM through Fensalir audio when the
active timing witness is allowed. `MimirAudioSynchronizationSettings.Mode`
selects `chirp-only`, `passive`, or `hybrid`; passive disables active
emission, chirp-only emits the active witness continuously, and hybrid emits
the active pilot only while passive confidence is below threshold.
- `MimirPassiveAudioSynchronizationEstimator` is the first program-audio timing
path. It estimates loopback-to-mic delay with PHAT-weighted cross-spectrum
correlation so music can act as the default timing witness before any audible
watermark is needed.
- `MimirChirpBinTimeline` is the old chirp-bin calibration path. It renders a
fixed-slope chirp-bin codebook and decodes symbols with cheap event-energy
proposals, dechirp plus fixed Goertzel bins, and the same de Bruijn triplet
timeline-anchor machine. The detector keeps
time/frequency ambiguity as candidate symbol/offset pairs so code constraints
can choose the coherent path. The analyzer refines the final fractional delay
with constrained local waveform correlation around the decoded active delay.
Each classified chirp carries the full bin-energy response surface, and stream
decodes aggregate that into per-band calibration evidence for frequency
response normalization. `MimirChirpBinCalibrationModel` now preserves usable
bands, expected-symbol versus observed-bin confusion observations, timing
residuals, delay hypotheses, phase summaries, and an adaptive codebook plan.
The reference decoder can consume that model as learned response weighting,
phase-coherence weighting, first-order group-delay correction, and joint
global delay/bin-shift hypotheses. The
runtime emitter also consumes the model's emission plan, rendering the smaller
reliable symbol alphabet at the higher recommended de Bruijn order when the
physical path cannot support all 32 bins.
Reports/states expose delay in microseconds as well as fractional samples.
Hybrid now emits the bioacoustic watermark as low-gain half-second bursts only
while passive confidence is weak; chirp-bin remains available for ASIO
calibration/replay commands.
Use `--bioacoustic-self-test` and `--standalone-bioacoustic-self-test` to
prove the active motif decoder. Use `--chirp-only-sync-self-test` to prove
that the analyzer can recover fractional delay from the bioacoustic runtime
watermark. The current synthetic active proof recovers a 317.375-sample delay
with printed 0.000 us error.
- `Mimir.BufferSmoke --render-chirp-bin-f32` and `--analyze-asio-f32` provide
the retained Scarlett calibration artifact proof. A 192 kHz chirp-bin run decoded
Focusrite `Loopback 1 -> Loopback 2` at `0.000 us` with 12 matched anchors and
0.999 confidence. `--calibrate-chirp-bin-asio-f32` can render/capture/analyze
a calibration session and persist the response/confusion/delay model under
`calibration/chirp-bin/`. `--analyze-asio-f32 --calibration ...` loads that
model into the chirp-bin reference decoder. Physical input 1 still failed pairwise timing
in the stored artifact, but it produced a useful response/confusion model
with two reliable symbols. Acoustic robustness remains separate from the clean
loopback timing proof, but failed timing windows now leave usable response
evidence instead of silence.
- `Mimir.BufferSmoke --calibrate-contestant-asio-f32` persists the active
packet-song physical calibration model under `calibration/bioacoustic/`.
It learns per-channel schedule offset, polarity, payload reliability,
response-normalization bands, gain, confidence, and pairwise propagation
delay from the same 192 kHz ASIO capture. The latest Scarlett receipt
`calibration/bioacoustic/scarlett-canary-packet-192k-rerun.json` clears the
current hot-loop budget at 10.7x realtime across four channels. Loopback
channels decode 37/37 with 2.524 us MAE; the co-streamer shotgun decodes
37/37 payload with 58.785 us MAE; the cardioid decodes 26/37 with
90.558 us MAE. This is a real response/propagation-delay model, but not yet
microsecond-accurate physical mic sync.
- `config/mimir-runtime.asio.example.json` is the minimal continuous Scarlett
runtime ingest proof. It loads `native/asio_capture` in process at 192 kHz
and declares `asio-ch0` through `asio-ch3` as accepted audio sources. A
two-second BufferSmoke run ingested more than 12,000 sample-bearing blocks
and retained 2,048 blocks per channel, proving loopback and mic channels enter
`Mimir.Runtime` together in one ASIO clock domain without stdout/base64
transport. BufferSmoke does not
emit speaker calibration audio, so that proof is ingest-only rather than a
sync report.
The active bioacoustic standalone receiver test recovers a delayed audio
stream to below printed microsecond precision using only the motif codebook
and schedule state. `--bioacoustic-actuator-self-test` estimates a synthetic
317.375-sample bioacoustic delay, applies the fractional correction, and
remeasures the residual below printed microsecond precision.
- `src/Mimir.Runtime/Synchronization` now contains the reusable Perfect Machine
module library distilled from the research pass: node profiles, decoder
profiles, language/emission profiles, path-learning sessions, benchmark
panels, audio actuator strategies, native capture profiles, camera ingest
strategies, reservoir strategies, audio/visual field profiles, compute
offload profiles, program publication profiles, CultMesh contracts, Fensalir
lowering, and assembly plans. Use
`Mimir.BufferSmoke --perfect-machine-profile-smoke` to prove the catalog
assembles, `--perfect-machine-contract-smoke` to write a CultCache contract
proof, `--perfect-machine-manifest` to export the module manifest for
tooling/UI/remote witness use, and `--perfect-machine-lowering-benchmark` to
measure the Mimir-to-Fensalir lowering path. The current six-camera/two-audio
synthetic lowering benchmark runs at roughly 2.5 us per iteration with about
2.3 KB allocated per iteration. `--move-tracking-contract-smoke` proves
Starfire-local and Nightwing-remote Move tracking observations enter
Mimir's rolling buffers with Muninn producer identity and Odin discovery
provenance.
- `MimirVideoFrameDescriptor` for dimensions, pixel format, stride, device
timestamp, and native/GPU handle metadata.
- `IMimirVideoCaptureDriver` and `MimirVideoCaptureDriverSource` as the live
driver-facing seam for Leap, Media Foundation, DirectShow, libusb, LeapC, or
shared texture capture.
- `native/reservoir` with one shared-edge rolling buffer, typed views, C ABI,
source-id hashing, producer helpers, and typed audio/render payload
descriptors.
- Windows bridge scripts for sender discovery/start/stop and simple OBS Media
Source compatibility ingest.
- `src/Mimir.Runtime/Synchronization` now contains the first typed program
composition contracts: `mimir.program_scene.v1`, `mimir.program_output.v1`,
and `mimir.eve_operator_surface.v1`. These make Mimir's scene graph,
Yggdrasil/site publication route, and Eve operator control/preview surface
manifestable through CultMesh.
- `docs/mimir-program-composition.md` is the current authority map for the new
stream-program architecture: Muninn observes on Starfire/Nightwing/Raven-class
hosts, Mimir consumes selected streams and composes the program, Eve lowers
controls/previews/stats, Yggdrasil publishes to the site, and OBS is
compatibility-only.
- `src/Mimir.CultMeshMedia` is the first explicit CultMesh media/body bridge:
`relay` hosts the document relay on CultNet RUDP `3075`, `send` reads an
MPEG-TS byte stream from stdin and publishes rolling
`mimir.cultmesh_media_frame` documents, and `recv` subscribes to those
documents and writes ordered MPEG-TS bytes to a Starfire-local UDP endpoint
for compatibility sinks. Its C# implementation now uses explicit CultLib
RUDP client/session helpers behind
`cultmesh://asgard.yggdrasil.mimir/media/raven-primary-av`; the older
`CultMesh.StartNodeAsync`/`CultMesh.ConnectClient` entrypoints no longer own
the media transport lane, and sender/receiver launchers no longer accept raw
relay host/port configuration.
- `scripts/start-raven-cultmesh-av-sender.ps1`,
`scripts/start-yggdrasil-cultmesh-media-relay.ps1`, and
`scripts/start-starfire-cultmesh-av-receiver.ps1` are the CultMesh bridge
operators. `start-raven-cultmesh-av-sender.ps1` is the Mimir-owned
`Mimir.CultMeshMedia` bootstrap/body-bridge lane; it is not the real Muninn
OBS/SRT feed owner. The actual Raven OBS/plugin feed now routes through
Odin's Muninn actuator `E:\Projects\Odin\scripts\activate-muninn-raven-av-srt.ps1`,
with `scripts/start-raven-muninn-obs-feed.ps1` in this repo as a thin local
wrapper around the real `GameCult-Muninn-Activate` task and
`muninn.exe activate` body. `-LocalBootstrap` on the CultMesh sender remains
a direct local bootstrap edge only for the separate body-bridge lane. Raven
capture still defaults to FFmpeg desktop frames plus Mimir's WASAPI loopback
capture muxed as H.264/AAC MPEG-TS; DirectShow audio remains an explicit
fallback.
- `src/Mimir.EveDashboard` is archived until the dashboard returns as a pure
CultMesh/Odin publisher and Eve lowering. The old HTTP/WebSocket deck broker,
local health route, socket command channel, and provider route catalog are not
daemon transport. Dashboard state must be published as typed CultMesh/Eve
documents through Odin, and dashboard commands must arrive as typed Odin/
CultMesh command documents.
- `src/Mimir.EveBrowserReference` serves static browser lowerings and can
publish its own `idunn.daemon_health` record over
`cultnet.transport.rudp.v0`. It remains a renderer/reference surface, not
program authority.
- Documentation for OBS receiver setup, native rebuild boundaries, the viable
stream app, and the Mimir Face.
## Temporary
- Audio and video may still traverse separate OBS/SRT endpoints during bridge
testing, but Mimir/Eve owns independent controls.
- The CultMesh media bridge still lowers to local UDP for compatibility sinks
because OBS is not a CultMesh consumer. Network transit between Raven,
Yggdrasil, and Starfire is the Odin-discovered CultMesh/CultNet path;
OBS-local UDP is an egress adapter only.
- CultLib RUDP is the default typed CultNet/CultMesh document transport for
daemon truth. Idunn RUDP health publication is the current freshness witness;
provider advertisements, command boundaries, transport profiles, and retained
daemon state should follow the same path. Odin still owns Verse/service
discovery, Idunn owns keepalive decisions, and Mimir-owned dashboard/reference
surfaces only report their own observed state. Product/debug render surfaces
stay lowerings or compatibility evidence.
- `Mimir.CultMeshMedia` has completed its explicit RUDP transport cut. Do not
add another private bridge, status shim, or renderer-derived service truth
while the RUDP document lane exists.
- Process-backed stream sources are only acceptable for network bridge feeds or
diagnostics. Six-camera local ingest belongs behind direct capture drivers.
- Frame-event process sources are diagnostic only. They prove source cadence and
runtime plumbing without dragging stdout bytes into the pixel hot loop.
- Calibration artifacts may remain on disk as evidence, but live state must be
in memory inside Mimir/Fensalir/native runtime surfaces.
## Next
Before expanding Muninn media or Sleipnir input transport, apply the traffic
contracts distilled in
`docs/research/moonlight-muninn-sleipnir-study-2026-07-16.md`: latest-state,
ordered-edge, video-deadline, audio-playout, and reliable-control. Preserve the
existing Muninn packetizer/feedback foundations. The first implementation pass
should make input supersession and edge preservation structural, replace the
two-second media default with consumer-derived field budgets, and prove the
result under controlled loss/jitter/reorder before changing carriers.
The first cut landed in Odin on 2026-07-16: experimental CultLib snapshot
`8965f3c0`, epoch/sequence/edge-ack HID delivery, 100 ms default LAN media
deadline, CultNet `realtime` A/V delivery, bounded queues, expiring/late-aware
repair, and decode-chain-owned keyframe pressure. The production video path now
uses typed V4 Cauchy GF(256) FEC in independent 8-data/4-parity blocks. Each
block schedules data and parity as separate lanes, including fixed protection
for a short tail block. Canonical video and parity use CultNet's unreliable
`realtime` lane; selective repair and IDR recovery remain deadline-bound.
Canonical AAC ADTS audio and its fixed 864-byte parity shards also use
`realtime`; 4+2 FEC, 120 ms reorder, and
concealment own continuity without an ACK/retransmit window. Sender access units enter the
handoff queue independently, and CultMesh catalog publication runs outside the
realtime media loop. Repair material becomes available when a video frame enters
the queue, and the receiver may issue bounded repair requests at 64/96/128 ms.
The remaining work is duplicate/reconnect acceptance, longer iid runs, and the
long-duration mixed soak.
The socket harness and bounded PCM loss recovery have now landed. Odin's
`cultnet-impair` proxy supplies deterministic seeded loss/burst/reorder/
duplicate/jitter/stall profiles around real CultNet endpoints. Muninn emits a
typed fixed 4+2 audio parity block after each four constant-size PCM packets;
the production Mimir OBS receiver reconstructs up to two missing packets inside
the 40 ms reorder budget and feeds them through the existing playout owner.
Both sides use the experimental CultLib/CultMesh snapshot lineage used by Eve,
Aetheria, and VoidBot; no stable-branch transport shim was introduced.
Receiver pressure now closes into the long-lived NVENC encoder as bounded AIMD
bitrate control. Startup begins at half of the configured encoder ceiling
because fixed block parity can roughly double wire rate, and additive recovery
is capped at half of that configured ceiling. Late/decode/repair/queue
pressure backs off by 15 percent; clean recovery adds one-fiftieth of the safe
cap only after ten stable seconds. The live encoder proof reconfigured 12 Mbps to 6 Mbps without a
restart and emitted the required transition IDR. The exact remaining completion
gate is tracked in
`docs/research/moonlight-reliability-acceptance-2026-07-16.md`; no cross-host
claim is allowed until its Raven-to-Starfire field matrix passes.
The production receiver follow-up fixed two contract contradictions: early
video repair no longer declares the frame late (which had made Odin discard all
repair requests), and the OBS audio decoder now consumes Muninn's actual float
PCM contract rather than treating it as AAC. Audio reorder is bounded to 40 ms
with short silence concealment. The next audio cut is Opus with explicit
FEC/PLC for variable-rate compressed audio; PCM now has bounded 4+2 erasure
recovery plus concealment. The controllable video encoder owner now exists and
forces the next NVENC frame to IDR without restarting the video session. A live
D3D11 desktop proof verified the command-generated IDR. The Raven bundle and
OBS receiver are now deployed over the direct LAN route. Raven activation is an
interactive-token scheduled task whose PowerShell action uses
`-WindowStyle Hidden`; no WireGuard path or foreground terminal is part of the
runtime. The active field cut uses D3D11/NVENC video, WASAPI loopback audio,
typed CultNet media, and the experimental CultLib lineage. The named direct and
proxy impairment profiles and long soak remain the completion gate.
1. Replace the frame-event diagnostic bridge with concrete direct capture
drivers for Leap stereo IR first, then the
other cameras.
2. Cut the remaining dashboard service truth paths from older renderer-derived
assumptions to explicit CultNet RUDP records,
preferably authorized-peer dialing where the peer catalog exists. Preserve
OBS-local UDP as egress only for compatibility sinks.
3. Feed those drivers into `MimirVideoCaptureDriverSource` and prove sustained
frame cadence in the rolling buffers.
4. Promote the packet-song physical calibration receipt into the runtime
receiver. The live decoder should keep its ear open for self-identifying
song contours, extract intra-call time/frequency anchors from log-mel parts,
apply learned per-output/mic path weighting, and feed a global
delay/clock/path hypothesis. Keep chirp-bin calibration artifacts as
reference data, not the runtime target.
5. Add the synchronization actuator: drive a variable-rate resampler and
fractional delay line per non-reference stream from the smoothed
`MimirAudioSynchronizationState`. First, prove the bioacoustic motif decoder
through real loopback and microphone paths so every correctly heard word
becomes a deterministic timeline anchor before the actuator moves samples.
6. Prove the bioacoustic hybrid fallback through real loopback and microphones
with probe durations long enough to keep loopback and mic windows live.
7. Wire real Move proof production into `MimirMoveProofRuntimeDriver`: attach
real Muninn Nightwing and Starfire evidence rings, require calibrated optical
witnesses, publish `mimir:starfire:move-pose:<sequence>` through the shared
runtime path, and replace the dev-gated presented-frame smoke with a
same-sequence capture from real field evidence.
8. Bind Fensalir UI to the synchronization hub so buffer depth, stream cadence,
source timestamps, and output settings are visible and adjustable.
9. Implement the Mimir program scene graph as the shared commit primitive for
source subscription, transforms, crop, chroma key, visibility, layer order,
preview, and output publication. Import the current OBS scene only as an
initial mirror, then make Eve GUI/TUI the operator surface.
10. Add the Yggdrasil-facing site publisher daemon that consumes the Mimir
program output and publishes it without owning a second composition.
11. Lower `AquariumBufferFieldFrame` spline tube fields into Fensalir compute:
sample buffer-domain paths stochastically by visual contribution, emit SDF
splat probes, write them into the spatiotemporal splat reservoir, and sample
that reservoir in the temporally antialiased scene pass. The direct spline
preview must stay a witness until this path owns rendering.
12. Move GPU feature extraction, fusion, material fitting, render budgeting, and
Spout2 publication into Fensalir.
13. Move mic alignment, room suppression, voice separation, spatialization, and
stem generation into Faust/native DSP.
14. Keep the OBS bridge witness ledger as evidence before expanding receiver
machinery.