Mimir/state/evidence.jsonl
2026-05-31 01:09:28 +01:00

251 lines
139 KiB
JSON

{"ts":"2026-05-21T17:31:13+00:00","type":"implementation","status":"ok","note":"MimirVideoFrameDescriptor carries dimensions, pixel format, stride, device timestamp, and optional native/GPU handle; MimirNativeIngestStreamSource can push LeapStereoIr or other camera frames directly into rolling buffers while process-backed ingest remains a network/diagnostic edge."}
{"ts":"2026-05-21T17:40:33+00:00","type":"decision","status":"ok","note":"Mimir live camera ingest should talk directly to drivers through IMimirVideoCaptureDriver: LeapUVC/libusb, LeapC images, Media Foundation, DirectShow, or GPU shared textures."}
{"ts":"2026-05-21T18:55:00+00:00","type":"implementation","status":"ok","note":"Deleted script-era packages, tests, helper tools, dependency manifests, archived research mirrors, and stale docs from the working tree. The repo's live surface is C# Mimir.Runtime, Mimir.App, native reservoir, PowerShell bridge utilities, Aquarium, and Faust/native DSP."}
{"ts":"2026-05-21T19:05:00+00:00","type":"correction","status":"ok","note":"Restored the research archive as reference-only memory. Research may preserve external examples and failed-path lessons, but live implementation must be rebuilt through direct drivers, native buffers, Aquarium GPU compute, and Faust/native DSP."}
{"ts":"2026-05-21T19:30:00+00:00","type":"verification","status":"ok","note":"Raw PS3 Eye libusb/WinUSB cadence probe measured both cameras simultaneously at 320x240 requested 187 Hz: camera 0 delivered 915 frames in 5.005s (182.81 fps), camera 1 delivered 916 frames in 5.005s (183.01 fps). At 640x480 requested 60 Hz they delivered 58.69 fps and 57.09 fps. Leap remains unmeasured in raw UVC/KS mode."}
{"ts":"2026-05-21T20:05:00+00:00","type":"verification","status":"ok","note":"Native LeapUVC Kernel Streaming probe measured VID_F182 through usbvideo.sys without Media Foundation, DirectShow, OpenCV, or frame processing. Advertised 640x240 YUY2 stereo IR mode is 115 fps; the minimal one-buffer blocking KS read loop delivered 415 frames in 5.003s (82.95 fps). 640x120 delivered 155.40 fps against a 214 fps advertised mode. Next driver cut needs queued KS/AVStream streaming, or an explicit WinUSB/libusb UVC driver rebind decision if usbvideo.sys remains the bottleneck."}
{"ts":"2026-05-21T20:25:00+00:00","type":"verification","status":"ok","note":"LeapUVC KS probe now keeps eight asynchronous NtDeviceIoControlFile reads queued. The path reports async=yes but cadence stays effectively unchanged: 640x240 YUY2 delivered 415 frames in 5.004s (82.93 fps), and 640x120 delivered 777 frames in 5.000s (155.39 fps). The limiting factor is not simply an empty user-mode read queue."}
{"ts":"2026-05-21T20:55:00+00:00","type":"verification","status":"ok","note":"LeapUVC KS control sweep showed the short-window 83 fps result was mostly startup drag. With two seconds of warm-up discarded and eight queued async KS reads, 640x240 YUY2 delivered about 110.7 fps against 115 fps advertised; 640x120 YUY2 delivered 1030 frames in 5.003s (205.87 fps) against 214 fps advertised. Exposure, gamma, HDR/LED, gain, and dark-frame controls are reachable through KS; digital gain=0 and the old FPS-ratio selector are rejected with ERROR_INVALID_PARAMETER."}
{"ts":"2026-05-21T21:25:00+00:00","type":"verification","status":"ok","note":"Razer Kiyo direct KS probe measured VID_1532 PID_0E03 and PID_0E05 camera interfaces with eight queued async reads and two-second warm-up discard. Plain Kiyo is exposure-limited by default: 1920x1080 MJPG reaches 30.27 fps with manual exposure -9/-10, and 1280x720 MJPG reaches 51.51 fps after manual exposure/gain sweep against 60 fps advertised. Kiyo Pro advertises 60 fps at 1280x720 and 1920x1080 MJPG, but the current KS path delivers only about 25 fps regardless of manual exposure; it needs separate control/driver investigation before high-cadence use."}
{"ts":"2026-05-21T21:55:00+00:00","type":"verification","status":"ok","note":"Online Kiyo Pro research found matching trouble reports: Razer documents 1080p60/720p60, HDR can reduce frame rate, anti-flicker/powerline can interact with frame rate, and Microsoft maps low-light compensation to AUTO_EXPOSURE_PRIORITY, which can vary frame rate. Local KS follow-up found Kiyo Pro reports low-light priority=1 and powerline=50Hz. Setting low-light priority to 0 did not improve cadence; setting powerline to 60Hz moved 720p/1080p MJPG only from about 25 fps to about 29 fps. Standard KS controls are not enough; next step is compare Synapse/OBS and inspect vendor/extension controls or firmware state."}
{"ts":"2026-05-21T22:15:00+00:00","type":"verification","status":"ok","note":"Kiyo Pro HDR-off test added KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR get/set with filter-scope and pin-0 extended-property headers. The camera returns Element not found for standard extended Video HDR, and setting HDR off does not change cadence: 720p/1080p MJPG remain about 25 fps. HDR may still be controlled through Razer/Synapse, but not via the standard Windows extended Video HDR KS property on this path."}
{"ts":"2026-05-21T22:45:00+00:00","type":"verification","status":"ok","note":"Kiyo Pro controls-only probe parsed USB descriptors through hub IOCTLs without Synapse. The device exposes UVC extension units {2c49d16a-32b8-4485-3ea8-643a152362f2} and {23e49ed0-1178-4f31-ae52-d2fb8a8d3b48}; the second answers KS selector probes including writable selectors 1,3,4,6,11,12,14,15 and readable selector 10 returns ASCII PYTHON_V2B. Stronger finding: the local Kiyo Pro is behind a Genesys Logic VID_05E3&PID_0610 hub at USB speed 2 / bcdUSB 0x0210, so it is on a high-speed USB 2.x path rather than SuperSpeed USB 3.x. Verify/move bus topology before mutating unknown vendor controls."}
{"ts":"2026-05-21T23:10:00+00:00","type":"verification","status":"ok","note":"After moving Kiyo Pro to a motherboard USB3 port, the descriptor path changed to root_hub30 port 7 with bcdUSB 0x0320 and 720p/1080p YUY2/MJPG/H264/NV12 all advertised at 60 fps. Windows still reports USB speed enum 2 (UsbHighSpeed, not UsbSuperSpeed). Baseline cadence remains locked around 25 fps across all tested 720p/1080p formats: YUY2 24.96/24.98, MJPG 25.20/25.03, H264 25.19/25.01, NV12 25.07/25.16. Verify a true SuperSpeed cable/port path before blaming unknown vendor selectors."}
{"ts":"2026-05-21T23:25:00+00:00","type":"verification","status":"ok","note":"Kiyo Pro moved to a second motherboard USB3 port: composite device is now Port_#0008.Hub_#0003 on the same AMD ROOT_HUB30. The device descriptor remains bcdUSB 0x0320 but hub IOCTL reports negotiated speed UsbHighSpeed(2), not UsbSuperSpeed(3). Cadence was not rerun because this is the same high-speed fallback state; next physical test is a known-good USB3 data cable or a known-good SuperSpeed device on the same ports."}
{"ts":"2026-05-22T00:05:00+00:00","type":"verification","status":"ok","note":"Kiyo Pro moved to neighbor sender machine Raven. PnP reports camera/media/composite/microphone interfaces present. Descriptor-only probe reports VID_1532 PID_0E05 on Raven USB3 root hub port 6 with bcdUSB 0x0320 but negotiated speed UsbHighSpeed(2), not UsbSuperSpeed(3); Raven hub inventory reports zero SuperSpeed devices. Same cable/camera failing SuperSpeed on two machines makes the stock cable or Kiyo Pro SuperSpeed lane the stronger suspect."}
{"ts":"2026-05-22T00:30:00+00:00","type":"verification","status":"partial","note":"Simultaneous local camera pull found only three camera devices visible: LeapUVC, Kiyo Pro, and one PS3 Eye; regular Kiyo and the second PS3 Eye were absent. KS multi harness plus raw PS3 Eye probe pulled Leap 640x240 YUY2, Kiyo Pro 1080p MJPG, and PS3 Eye concurrently. With PS3 Eye 640x480@60: Leap 40.12 fps, Kiyo Pro 24.99 fps, PS3 Eye 56.06 fps. With PS3 Eye 320x240@187: Leap 81.10 fps, Kiyo Pro 25.33 fps, PS3 Eye 185.74 fps. Leap loses cadence under shared USB load; split high-rate cameras across controllers before claiming six-camera viability."}
{"ts":"2026-05-22T00:50:00+00:00","type":"verification","status":"ok","note":"After port swapping, five camera devices / six optical sensors were visible and pulled simultaneously: LeapUVC's packed stereo IR pair, Kiyo Pro, regular Kiyo, and two PS3 Eyes. Kiyo Pro still negotiated UsbHighSpeed(2) on root_hub30 despite bcdUSB 0x0320; hub inventory reported zero SuperSpeed devices. With both PS3 Eyes at 640x480@60: Leap stereo 57.33 fps, Kiyo Pro 24.97 fps, Kiyo 30.30 fps, PS3 Eye 0 59.59 fps, PS3 Eye 1 57.60 fps. With both PS3 Eyes at 320x240@187: Leap stereo 81.05 fps, Kiyo Pro 24.97 fps, Kiyo 30.28 fps, PS3 Eye 0 187.60 fps, PS3 Eye 1 187.03 fps. All currently intended optical sensors can be pulled at once through direct-driver probes; Leap remains topology-sensitive."}
{"ts":"2026-05-22T01:10:00+00:00","type":"verification","status":"partial","note":"Port isolation follow-up put Leap alone on the blue rear USB3 group/root_hub30#5 port 3, Kiyos together on root_hub30#7&18eea21b, and Eyes on remaining front/back USB-A ports. Only one PS3 Eye enumerated. Visible simultaneous pull with PS3 Eye at 320x240@187 delivered Leap stereo 80.99 fps, Kiyo Pro 24.93 fps, Kiyo 30.37 fps, and PS3 Eye 185.85 fps. Leap did not recover to its solo ~110 fps cadence despite root-hub isolation, so the bottleneck is not only same-row/same-root-hub contention; investigate broader xHCI scheduling, CPU/interrupt pressure, or KS/usbvideo behavior under multi-device load."}
{"ts":"2026-05-22T01:30:00+00:00","type":"verification","status":"partial","note":"After splitting cameras across Mimir and Raven, the local Mimir host enumerated LeapUVC, regular Kiyo, and one PS3 Eye. Local simultaneous pull with PS3 Eye 320x240@187 delivered Leap 81.34 fps, Kiyo 30.27 fps, and PS3 Eye 185.56 fps. Leap+Kiyo only delivered Leap 82.77 fps and Kiyo 16.83 fps. Leap-only same-session baseline delivered 84.18 fps, with best fast-combined scenario 92.87 fps and 640x120 baseline 173.62 fps. Offloading Kiyo Pro and one PS3 Eye did not restore the previous ~110.8 fps Leap result; current hypothesis shifts to Leap port/controller/device state or KS/usbvideo behavior, not only total local camera bandwidth."}
{"ts":"2026-05-22T01:45:00+00:00","type":"verification","status":"ok","note":"Moving the Focusrite Scarlett Solo away from the Leap USB neighborhood substantially recovered local split-host cadence. Leap-only baseline rose to 95.48 fps, best fast-combined scenario to 101.67 fps, and 640x120 baseline to 192.83 fps. With local Leap + regular Kiyo + one PS3 Eye at 320x240@187 active, Leap delivered 105.10 fps, Kiyo 30.17 fps, and PS3 Eye 185.81 fps. The split-host local set is viable; the prior ~81 fps Leap band was caused by local USB layout including the Focusrite, not just camera count."}
{"ts":"2026-05-22T02:05:00+00:00","type":"verification","status":"partial","note":"Raven PS3 Eye raw interface initially had no driver binding. Exported the working Mimir host libwdi WinUSB driver package from oem26.inf, copied it to Raven under C:\\Meta\\mimir-ps3eye-winusb-driver, added the libwdi self-signed certificate to Raven Root and TrustedPublisher stores, and installed it as oem34.inf with pnputil. Raven now reports VID_1415&PID_2000&MI_00 as USBDevice OK, provider libwdi, service WinUSB. The copied ps3eye_dual_cadence.exe opens the device, but cadence is not viable yet: 320x240@187 delivered 132.24 fps then 78.93 fps, and 640x480@60 delivered 6.32 fps with multi-second gaps. Driver open is solved; Raven USB path/device cadence still needs isolation."}
{"ts":"2026-05-22T02:35:00+00:00","type":"verification","status":"ok","note":"Moved the Raven PS3 Eye back to the Mimir host. Local enumeration showed LeapUVC, regular Kiyo, and two PS3 Eyes; Kiyo Pro was not local. With Focusrite away from the Leap USB neighborhood, all local sensors ran in parallel cleanly. With both PS3 Eyes at 320x240@187: Leap 106.07 fps, Kiyo 30.33 fps, PS3 Eye 0 186.57 fps, PS3 Eye 1 186.14 fps. With both PS3 Eyes at 640x480@60: Leap 108.07 fps, Kiyo 30.34 fps, PS3 Eye 0 57.79 fps, PS3 Eye 1 58.08 fps. Current local topology is viable for Leap stereo + regular Kiyo + both PS3 Eyes."}
{"ts":"2026-05-22T02:55:00+00:00","type":"verification","status":"ok","note":"Moved Kiyo Pro back to the Mimir host. Local enumeration showed LeapUVC, Kiyo Pro, and two PS3 Eyes; regular Kiyo was not local. Kiyo Pro remained on root_hub30#7&18eea21b port 8 at UsbHighSpeed(2), bcdUSB 0x0320. With both PS3 Eyes at 320x240@187: Leap 110.80 fps, Kiyo Pro 24.97 fps, PS3 Eye 0 187.46 fps, PS3 Eye 1 186.89 fps. With both PS3 Eyes at 640x480@60: Leap 110.72 fps, Kiyo Pro 24.87 fps, PS3 Eye 0 59.91 fps, PS3 Eye 1 59.19 fps. Kiyo Pro does not poison Leap cadence in the current layout; it remains a ~25 fps high-speed USB RGB source."}
{"ts":"2026-05-22T03:15:00+00:00","type":"verification","status":"ok","note":"Moved regular Kiyo from front panel to rear port and mouse into Leap USB neighborhood. All five camera devices / six optical sensors were visible locally: LeapUVC stereo, Kiyo Pro, regular Kiyo, and two PS3 Eyes. With both PS3 Eyes at 320x240@187: Leap 110.84 fps, Kiyo Pro 25.08 fps, Kiyo 30.18 fps, PS3 Eye 0 187.59 fps, PS3 Eye 1 187.02 fps. With both PS3 Eyes at 640x480@60: Leap 110.76 fps, Kiyo Pro 25.14 fps, Kiyo 30.18 fps, PS3 Eye 0 59.66 fps, PS3 Eye 1 59.95 fps. The full intended local optical set is viable; Kiyo Pro remains cadence-limited by high-speed USB negotiation."}
{"ts":"2026-05-22T03:35:00+00:00","type":"verification","status":"ok","note":"Rechecked the final full local topology after the regular Kiyo was moved to a rear port and a mouse moved into the Leap USB neighborhood. All five camera devices / six optical sensors remained visible and cadence stayed healthy. High-rate Eye run: Leap 110.84 fps, Kiyo Pro 25.08 fps, regular Kiyo 30.18 fps, PS3 Eye 0 187.59 fps, PS3 Eye 1 187.02 fps. Full-frame Eye run: Leap 110.76 fps, Kiyo Pro 25.14 fps, regular Kiyo 30.18 fps, PS3 Eye 0 59.66 fps, PS3 Eye 1 59.95 fps. Mouse traffic does not reproduce the Focusrite-induced Leap collapse."}
{"ts":"2026-05-22T04:10:00+00:00","type":"implementation","status":"ok","note":"Added a diagnostic frame-event path from native camera probes into Mimir.Runtime rolling buffers. MimirFrameEventProcessStreamSource reads JSON-line video-frame metadata into MimirVideoFrameDescriptor samples; KS and repo-owned PS3 Eye probes can emit those frame events. This is a playground witness for Aquarium UI/cadence, not the final pixel hot path."}
{"ts":"2026-05-22T04:45:00+00:00","type":"verification","status":"partial","note":"Mimir.BufferSmoke loaded the probe runtime config, started the KS and PS3 Eye frame-event probes, polled MimirSynchronizationHub, and confirmed live samples in rolling buffers for leap-stereo-ir, kiyo-rgb, ps3-eye-0, and ps3-eye-1. Kiyo Pro is declared but empty: the KS path enumerates the device and modes, then fails at KSSTATE_ACQUIRE with ERROR_INVALID_HANDLE. PnP camera interface reports OK, composite reports OK, media interface reports Error, and non-elevated pnputil restart is denied."}
{"ts":"2026-05-22T05:05:00+00:00","type":"verification","status":"ok","note":"After replugging the Kiyo Pro, all Pro PnP interfaces reported OK and the KS probe again measured 1280x720 MJPG at 24.97 fps and 1920x1080 MJPG at 25.19 fps. Mimir.BufferSmoke with --require-samples then confirmed all five declared local optical buffers received samples: kiyo-pro-rgb 99, kiyo-rgb 120, leap-stereo-ir 401, ps3-eye-0 937, ps3-eye-1 937 over the 8 second smoke run. Pro remains UsbHighSpeed and ~25 fps, but it is now in the runtime buffers."}
{"ts":"2026-05-22T05:35:00+00:00","type":"verification","status":"ok","note":"Added native/probes/wasapi_audio_cadence and MimirAudioBlockDescriptor so WASAPI audio-block metadata enters Mimir.Runtime rolling buffers through the diagnostic event adapter. Endpoint inventory found five capture endpoints and four render endpoints. Full Mimir.BufferSmoke with --require-samples and active music on Scarlett speakers proved ten non-empty buffers: five camera buffers, Focusrite mic, Kiyo mic, Kiyo Pro mic, one USB Camera mic, and Scarlett speaker loopback. Scarlett loopback is silent/no-packet when no render stream is active; the second USB Camera mic endpoint enumerates OK but produced zero WASAPI packets in standalone and simultaneous tests."}
{"ts":"2026-05-22T05:50:00+00:00","type":"verification","status":"partial","note":"Correlated the two PS3 Eye audio endpoints to their USB parents. The working endpoint is Microphone (5- USB Camera-B4.09.24.1), MMDEVAPI {57befef3-599c-4c73-a0cd-9539ffc2f54f}, parent USB\\VID_1415&PID_2000&MI_01\\9&35158e62&0&0001 / composite USB\\VID_1415&PID_2000\\8&29c54ea8&0&4; its camera interface MI_00 is bound to libusbK and WASAPI emits 480-frame blocks. The silent endpoint is Microphone (4- USB Camera-B4.09.24.1), MMDEVAPI {f26c55af-5018-438a-8cc1-6dbead205a3c}, parent USB\\VID_1415&PID_2000&MI_01\\9&11052345&0&0001 / composite USB\\VID_1415&PID_2000\\8&2efe0359&0&1; its camera interface MI_00 is bound to WinUSB/libwdi and standalone WASAPI capture opens but emits zero packets. Both MI_01 audio devices report Microsoft usbaudio OK, so the failure is stream data, not endpoint enumeration."}
{"ts":"2026-05-22T06:05:00+00:00","type":"verification","status":"ok","note":"After the other PS3 Eye was unplugged/replugged, the previously silent Microphone (4- USB Camera-B4.09.24.1) endpoint started emitting 480-frame WASAPI blocks even though its MI_00 camera interface remained on oem26.inf / WinUSB/libwdi. Full Mimir.BufferSmoke with --require-samples proved 11 non-empty buffers: five camera buffers, Focusrite mic, Kiyo mic, Kiyo Pro mic, both PS3 Eye mics, and active Scarlett speaker loopback. The earlier driver-as-cause hypothesis is weakened; the failure was fixed by device re-enumeration without changing the camera-side driver binding."}
{"ts":"2026-05-22T06:25:00+00:00","type":"implementation","status":"ok","note":"Ported the first synchronization measurement loop into the current runtime. WASAPI probe can emit base64 sample payloads with audio-block JSON, MimirFrameEventProcessStreamSource decodes them into MimirStreamSample.Data, and MimirAudioSynchronizationAnalyzer estimates delay by normalized cross-correlation against mic-focusrite-local. Two-mic sync smoke with sample payloads proved both buffers and reported mic-focusrite-local->mic-usb-camera-0 delaySamples=2138, delayMs=44.542, confidence=0.393 over 4800 compared samples. This is measurement only; SRO smoothing, adaptive resampling, and fractional-delay correction are still next."}
{"ts":"2026-05-22T11:39:31+01:00","type":"verification","status":"partial","note":"Chirplet-backed sync smoke used Scarlett speaker loopback as timing authority with 9-16 kHz calibration chirps playing, resampled 48 kHz mics into the 44.1 kHz loopback timeline, and built an aligned audio frame with 4 channels: loopback, mic-focusrite-local delaySamples=-768 confidence=0.160, mic-kiyo delaySamples=-256 confidence=0.119, and mic-kiyo-pro delaySamples=-1664 confidence=0.118. Both PS3 Eye audio buffers were empty in this run while both PS3 Eye camera buffers were live, so PS3 Eye audio remains enumeration/runtime-fragile rather than solved."}
{"ts":"2026-05-22T11:48:37+01:00","type":"verification","status":"ok","note":"After replugging the PS3 Eyes, full Mimir.BufferSmoke with --require-samples proved both PS3 Eye audio buffers were live again: mic-usb-camera-0 count=324 and mic-usb-camera-1 count=210, each reporting 2ch 48000Hz Float32 480-frame WASAPI blocks. Both PS3 Eye camera buffers were live at the same time. Loopback-referenced sync reports included mic-usb-camera-0 delaySamples=2368 confidence=0.095 and mic-usb-camera-1 delaySamples=-2304 confidence=0.152; only mic-usb-camera-1 cleared the current aligned-frame confidence gate in that run."}
{"ts":"2026-05-22T11:58:15+01:00","type":"verification","status":"ok","note":"Delay signs were suspect because MimirAudioSynchronizationAnalyzer compared latest sample tails from buffers with different edge timestamps. The analyzer now estimates each pair at a shared timestamp edge and BuildAlignedAudioFrame chooses an output edge all positive-late channels can supply. Controlled 9-16 kHz chirplet smoke after the fix reported positive loopback-relative PS3 Eye delay: mic-usb-camera-1 delaySamples=704, delayMs=15.964, confidence=0.166, and the aligned frame contained loopback plus mic-usb-camera-1."}
{"ts":"2026-05-22T12:38:53+01:00","type":"implementation","status":"ok","note":"Documented the chirplet calibration model and started the structured implementation. MimirChirpletCalibrationPhrase now owns a harmonic-ish phrase around 8 kHz, 10 kHz, 12 kHz, and 16 kHz, PCM rendering for Aquarium emission, matched chirplet timing traces, and per-band matched-energy response hooks. MimirRuntime emits that shared phrase instead of a separate hard-coded sweep, and MimirAudioSynchronizationAnalyzer uses the same phrase for loopback-referenced delay analysis with 16-sample hops and parabolic fractional peak interpolation. BufferSmoke output now includes fractionalDelaySamples and per-band energy."}
{"ts":"2026-05-22T12:42:00+01:00","type":"verification","status":"ok","note":"Built Mimir.slnx with zero warnings after structured chirplet changes. A 4-second Mimir.BufferSmoke run against the full probe config printed fractional delays and band energy, and built a 5-channel aligned frame: loopback plus mic-focusrite-local fractionalDelaySamples=2239.233 confidence=0.105, mic-kiyo fractionalDelaySamples=1859.505 confidence=0.496, mic-usb-camera-0 fractionalDelaySamples=2338.772 confidence=0.395, and mic-usb-camera-1 fractionalDelaySamples=1934.795 confidence=0.183. This run verifies report plumbing; the final response normalizer and fractional-delay actuator are still future work."}
{"ts":"2026-05-22T12:46:18+01:00","type":"implementation","status":"ok","note":"Added MimirAudioSynchronizationStateTracker and MimirAudioSynchronizationState. The hub now updates confidence-gated per-source sync state from chirplet reports, smoothing fractional delay and estimating delay-slope/SRO in ppm. Mimir.BufferSmoke polls sync during the run and prints sync-state lines; Aquarium UI exposes the smoothed state. Verification built cleanly and a phrase-backed smoke printed sync-state loopback-scarlett-speakers->mic-usb-camera-0 smoothedDelaySamples=47.397 delayMs=1.075 sroPpm=0.000 confidence=0.216. Final fresh reports can still disappear when loopback rendering stops or falls outside the shared buffer edge, so active loopback remains a live precondition."}
{"ts":"2026-05-22T12:53:02+01:00","type":"implementation","status":"ok","note":"Changed chirplet calibration from a single repeated motif to a stateless timeline fingerprint. MimirChirpletCalibrationPhrase.ForIndex(N) deterministically generates phrase N; runtime emits N mod 16 every 3.25 seconds, and the analyzer searches the 16-phrase cycle. Each phrase is a birdsong-like asymmetric motif with six chirplets spread over about 1.38 seconds. Mimir.slnx built cleanly. A short BufferSmoke run completed without analyzer errors, but loopback emitted zero packets during that smoke, so it verified plumbing only, not fresh delay estimates."}
{"ts":"2026-05-22T13:12:32+01:00","type":"verification","status":"partial","note":"Actual Mimir.App runtime test with MIMIR_RUNTIME_CONFIG=config/mimir-runtime.probes.example.json and MIMIR_SYNC_TELEMETRY_SECONDS enabled proved Aquarium WASAPI output wakes the Scarlett loopback in the real app path. Headless run showed loopbackCount rising to 57 with mic buffers live; visible-window run showed loopbackCount 77 with Focusrite/Kiyo/Kiyo Pro/PS3 Eye mic buffers live. The runtime now updates sync analysis on a 0.5s cadence and telemetry prints loopback, reports, states, and audio buffer counts. No confident acoustic sync state locked in these app runs: reports were absent until enough phrase audio accumulated, then a live report appeared with confidence 0.000. Treat this as online emission/capture proven, online acoustic lock not yet solved."}
{"ts":"2026-05-22T13:34:00+01:00","type":"implementation","status":"ok","note":"Replaced the discrete 16-phrase chirplet cycle with MimirChirpletTimeline, a deterministic unbounded chirplet stream. MimirRuntime now continuously queues uncached 0.5-second PCM segments through Aquarium audio with 1 second of lead, and MimirAudioSynchronizationAnalyzer extracts continuous chirplet atom energy traces from loopback and mic windows rather than searching a finite phrase cycle. Short headless Mimir.App telemetry runs proved the actual runtime path now locks online: loopback and all six audio buffers were live, reports were produced, and sync states appeared for Focusrite, Kiyo, Kiyo Pro, and both PS3 Eye mics. Delay estimates are still jumpy enough that the fractional-delay/SRO actuator should wait for better state filtering."}
{"ts":"2026-05-22T14:10:00+01:00","type":"implementation","status":"partial","note":"Changed MimirChirpletTimeline from anonymous deterministic texture to an explicit order-3 de Bruijn symbol timeline over 32 separated chirp symbols. Any three consecutive correctly detected symbols identify a timeline event within the current operating horizon; reports now expose timelineMatchedEvents and timelineConfidence when event-index refinement is used. A synthetic check rendered two seconds of canonical timeline audio and decoded events 0, 1, and 2 back to a window start of -0.0015 seconds. Real headless app sniff did not provide a clean physical proof because Scarlett loopback capture again stopped advancing early; build remains clean."}
{"ts":"2026-05-22T14:32:00+01:00","type":"implementation","status":"ok","note":"Reworked MimirChirpletTimeline symbols from fixed frequency slots into time/frequency constellations. The order-3 de Bruijn sequence still gives three-chirp timeline placement, but each symbol now carries identity through start band, glide shape, duration, and following inter-chirp gap. Event start times are precomputed over the de Bruijn period instead of using a fixed stride. Synthetic verification rendered two seconds of canonical timeline audio and decoded interior events 9, 10, and 11 back to a zero-second window start, proving placement does not rely on the opening triplet."}
{"ts":"2026-05-22T14:48:00+01:00","type":"verification","status":"partial","note":"Attempted a 20-second real-world Mimir.App chirplet sync run with all configured local mics. The headless path only emitted one telemetry tick before runtime updates stopped. Switching to the normal app path produced telemetry through t=4.26s with all six audio buffers live and sync states for Focusrite, Kiyo, Kiyo Pro, and both PS3 Eye mics. Timeline-symbol refinement appeared on Focusrite, Kiyo, and one PS3 Eye, but delay estimates were unstable and the app did not continue telemetry to 20 seconds. Replaced the coarse acquisition trace with envelope energy to avoid matched-filter scans in the hot acquisition path; symbol decoding remains the refinement step."}
{"ts":"2026-05-22T15:20:00+01:00","type":"implementation","status":"partial","note":"Removed hidden re-entrant synchronization analysis from the live app path. MimirRuntime now calls a bounded rotating AnalyzeAudioSynchronizationStep every 0.1s, MimirSynchronizationHub caches per-source reports/states, and UI/telemetry read cached state instead of invoking the analyzer or BuildAlignedAudioFrame. FitDelayFromEvents now collapses duplicate candidate event observations by strongest energy, fixing the real app crash 'An item with the same key has already been added. Key: 0'. Dotnet build passed. A visible Mimir.App run with all configured mics no longer crashed at the earlier 4s wall and produced telemetry through runtime t=17.28s in a 22s wall-time harness; it did not reach a full 20 runtime seconds because startup consumed wall time. All non-loopback mics produced cached reports/states, but delay estimates remained unstable and timeline event refinement was intermittent, so the next live invariant is robust outlier rejection/state filtering before any actuator drives resampling."}
{"ts":"2026-05-22T16:05:00+01:00","type":"implementation","status":"partial","note":"Documented the intended decoder as a constrained chirplet transform: known dictionary projection to symbol observations, code-valid de Bruijn triplets to canonical timeline anchors, anchors to affine source clock fits, and delay/SRO from comparing loopback and mic clock fits. Added MimirChirpletStreamDecode records and MimirChirpletStreamDecoder with a bounded PCM window, absolute sample offsets, triplet anchors, and clock fits. MimirAudioSynchronizationAnalyzer now prefers matched decoded timeline anchors before falling back to the older chirplet-energy lag search. Synthetic self-test over two seconds of emitted timeline audio currently decodes 12 symbols and one correct anchor for event 9 at sample 47520 with clock 48000 Hz; this proves the new spine but also proves the symbol likelihood/codebook layer is not finished enough to place every triplet yet."}
{"ts":"2026-05-22T16:35:00+01:00","type":"implementation","status":"partial","note":"Replaced one-best-symbol triplet placement with a constrained transform/trellis pass. DecodeStreamWindow now emits transform frames with multiple symbol candidates per chirp, enumerates candidate triplets through the de Bruijn map, scores measured inter-chirp gaps, and keeps the coherent local clock path rather than accepting any random valid triplet. Synthetic two-second emitted timeline check improved from one anchor to 11 coherent anchors, including events 0-9, with fitted clock 47978.350 Hz, confidence 0.885, and 8.741 sample MAE. This is the right decoder shape; remaining work is symbol/codebook separation and sub-frame timing precision so the fit lands exactly at 48000 Hz and covers every emitted triplet."}
{"ts":"2026-05-22T17:05:00+01:00","type":"implementation","status":"ok","note":"Removed the legacy synchronization pipelines from live code. MimirAudioSynchronizationAnalyzer no longer contains chirplet-energy lag search, normalized cross-correlation, approximate runtime clock placement, known-event observation, or integer aligned-frame construction; it only emits timing reports from at least three matched decoded timeline anchors. Deleted MimirAlignedAudioFrame and removed BuildAlignedAudioFrame from MimirSynchronizationHub and BufferSmoke. MimirChirpletTimeline no longer exposes DecodeReferenceWindow, ObserveKnownEvents, BuildTimelineEnergyTrace, or one-best-symbol triplet placement. approximateTimelineSeconds was removed from sync analysis signatures because canonical chirplet anchors now own placement."}
{"ts":"2026-05-22T17:35:00+01:00","type":"implementation","status":"ok","note":"Separated chirplet symbol ownership into MimirChirpletSymbolCodebook and added per-candidate refined sample offsets to transform frames. The codebook now guarantees each of the 32 symbols has a unique chirp shape; rhythm is additional code evidence rather than an acoustic alias. ClassifySymbolsAt now does coarse dictionary search, local sample-resolution search, and parabolic sub-sample refinement per symbol candidate. Synthetic two-second emitted timeline check now detects all 15 emitted chirps, decodes 13 possible triplet anchors for events 0-12, and fits clock=48001.819 Hz with confidence=0.952 and MAE=5.171 samples, improved from 11 anchors / 47978.350 Hz / MAE=8.741."}
{"ts":"2026-05-22T17:45:00+01:00","type":"implementation","status":"ok","note":"Replaced single-phase chirplet matching with quadrature sine/cosine kernels and fixed emitted timeline segment gain so canonical chirps are not amplitude-renormalized per half-second segment. Added `Mimir.BufferSmoke --chirplet-self-test` as a first-class synthetic invariant check. The check renders two seconds of canonical timeline audio, detects all 15 emitted chirps, keeps 13 triplet anchors for events 0-12, fits clock=47999.999990 Hz with confidence=1.000, and holds anchor MAE to 0.000014 samples. The next proof is the same deterministic anchor stability through actual loopback and microphone paths."}
{"ts": "2026-05-22T15:52:26+00:00", "type": "implementation", "status": "ok", "note": "Restored the repo-local Python persistence helpers from the Epiphany-style helper family after checking VoidBot and sibling repos. Mimir now has tools/localcast_state.py for status/evidence/branch edits and tools/localcast_prepare_compaction.py for pre-compaction state audits; AGENTS.md points future agents at both helpers."}
{"ts": "2026-05-22T17:34:45+01:00", "type": "verification", "status": "ok", "note": "Aquarium WASAPI resampler used int multiplication for source.Length * targetSampleRate; a 60s 48k chirplet batch overflowed and queued one 44.1k output frame. Switching to double-length arithmetic restored 2,646,000 output frames and audible chirplets."}
{"ts": "2026-05-22T18:08:51+01:00", "type": "verification", "status": "partial", "note": "Release live chirplet decoder test: Scarlett loopback->Scarlett mic produced repeated runtime reports in ~230-335 ms per 2s analysis window, typically 3-5 matched timeline events. Pair tests also produced reports for Kiyo mic. Kiyo Pro and both USB Camera mics showed chirplet energy but failed to form valid triplet anchors in this pass. Six-audio-source fan-out exposed process-probe buffer continuity/overlap failures, with many candidates rejected as insufficient-window."}
{"ts": "2026-05-22T18:34:16+01:00", "type": "research", "status": "ok", "note": "Archived chirplet decoder research under research/chirplet-sync-decoder. Distilled conclusion: current BuildChirpletEnergyTrace is dense sliding matched filtering; for Mimir's controlled sync beacon, redesign symbol codebook for dechirp+FFT/Goertzel classification so code constraints shape the receiver before expensive scoring."}
{"ts": "2026-05-22T18:47:44+01:00", "type": "implementation", "status": "ok", "note": "Added runtime-owned audio sync mode selection for chirp-only, no-chirp, and hybrid. Config/env now expose MIMIR_AUDIO_SYNC_MODE plus audioSync.mode/referenceSourceId/calibrationGain; no-chirp disables active calibration and reports passive sync as not wired yet, while hybrid currently uses the active pilot until passive confidence gating and shaped watermark emission are implemented. dotnet build and chirplet self-test passed."}
{"ts": "2026-05-22T19:08:10+01:00", "type": "implementation", "status": "ok", "note": "Renamed the public no-chirp mode to passive and started the real hybrid sync machine. Added MimirPassiveAudioSynchronizationEstimator using PHAT-weighted cross-spectrum delay estimation over loopback/program audio; MimirAudioSynchronizationAnalyzer now reports passive evidence in passive/hybrid modes and falls back to chirplet anchors when hybrid passive confidence is weak. Hybrid runtime emission now queues short active pilot chunks only while passive confidence stays below threshold. dotnet build, passive sync self-test, and chirplet self-test passed."}
{"ts": "2026-05-22T19:08:56+01:00", "type": "verification", "status": "partial", "note": "Passive live smoke with MIMIR_AUDIO_SYNC_MODE=passive and config/mimir-runtime.probes.example.json emitted no calibration audio and produced loopback/program-audio reports: Focusrite delaySamples=6653 confidence=0.805, Kiyo Pro delaySamples=6804 confidence=0.227, USB Camera 0 delaySamples=-882 confidence=1.000 over 88200 compared 44.1k samples. This proves the passive path can lock on real loopback/music, but the negative Eye delay needs timestamp/window-sign inspection before driving an actuator."}
{"ts": "2026-05-22T19:33:21+01:00", "type": "verification", "status": "ok", "note": "Fixed passive sync confidence bug. Negative passive lags now produce status=passive-negative-lag with confidence=0, single-window passive confidence is capped at 0.85, and hub invalidates cached reports/state for negative-lag traces. Passive self-test now proves both positive delay recovery and reversed-input zero confidence. A 14s live passive smoke showed negative Focusrite evidence at confidence 0 without leaving a report/state, while positive passive reports stayed capped at 0.85."}
{"ts": "2026-05-22T19:49:43+01:00", "type": "implementation", "status": "partial", "note": "Built the first chirp-bin active watermark machine. MimirChirpBinTimeline renders a fixed-slope/window 32-bin chirp codebook and decodes with one dechirp plus fixed Goertzel bin scoring, then feeds de Bruijn triplet anchors and clock fitting. Hybrid fallback now renders/decodes chirp-bin evidence instead of the old dense chirplet matcher. Synthetic --chirp-bin-self-test passed with 23 frames, 21 anchors, 48000 Hz clock, and zero MAE; old --chirplet-self-test still passed. A real hybrid app run emitted chirp-bin batches, but the current probe config's 30s capture limit left loopback/mic windows stale before acoustic chirp-bin reports could be proven."}
{"ts": "2026-05-22T19:58:44+01:00", "type": "implementation", "status": "ok", "note": "Fixed hybrid watermark being obtrusive. Root causes: Aquarium applied EnqueuePcm16Base64 gain twice, Mimir treated immediate audio chunks like scheduled future segments and caught up missed hybrid segments as audible backlog, and probe configs stopped WASAPI capture after 30s. Aquarium now applies queued PCM gain once; Mimir hybrid uses separate low watermarkGain default 0.035, emits one 0.5s chirp-bin burst every 2s only while passive confidence is weak, and skips missed segments instead of catch-up dumping. Probe audio durations are now 3600s. Short hybrid app run showed batches at firstSegment 0,4,8,12 with gain 0.035."}
{"ts": "2026-05-22T20:32:10+01:00", "type": "verification", "status": "ok", "note": "Hybrid chirp-bin analyzer no longer inherits passive 2s gate: short-window self-test feeds rolling buffers with 1s chirp-bin loopback/candidate audio and recovers a 317-sample delay exactly with 5 matched events and 0.854 confidence. Live app smoke after the fix did not prove acoustic decode because Scarlett loopback stalled after one block, so that run is loopback freshness evidence rather than duration evidence."}
{"ts": "2026-05-23T10:26:32+01:00", "type": "verification", "status": "ok", "note": "Chirp-bin hybrid analyzer now proves microsecond-scale fractional timing in memory: --hybrid-sync-self-test uses a 317.375-sample delayed rolling-buffer candidate and recovers 317.392716 samples, 0.017716 samples / 0.369 us error, with 5 matched chirp-bin events and 0.851 confidence. Reports and sync states now expose delayUs alongside fractional samples."}
{"ts": "2026-05-23T10:39:21+01:00", "type": "verification", "status": "partial", "note": "Focusrite Scarlett Solo currently exposes only generic Windows audio behavior before driver install: no ASIO registry entries, shared WASAPI capture 48000Hz Float32, shared Scarlett loopback 44100Hz Float32, and strict WASAPI exclusive 24-bit/192kHz requests are rejected with unsupported format. Official Focusrite Control 3.27.0 installer was downloaded from Focusrite to artifacts/drivers/focusrite_control_v3_27_0.exe with SHA256 07F1B031ABAB6F0F641B2BD6219AC264B37932332BE5B3997BADC00AEC113AD9; install/verify ASIO before cutting the Scarlett hot path."}
{"ts": "2026-05-23T16:01:35+01:00", "type": "verification", "status": "ok", "note": "Focusrite driver install registered Focusrite USB ASIO and Focusrite Thunderbolt ASIO in HKLM\\\\SOFTWARE\\\\ASIO. The new native ASIO probe instantiated Focusrite USB ASIO from CLSID {AC4D0455-50D7-4498-B3CD-9A41D130B759}, reported 2 inputs / 2 outputs, preferred 192-frame buffers, accepted 44.1/48/88.2/96/176.4/192 kHz, and captured nonzero 2-channel Int32LSB input callbacks at 192 kHz for 5 seconds. Scarlett ASIO is now usable; next cut is feeding ASIO buffers into Mimir.Runtime instead of the WASAPI diagnostic bridge."}
{"ts": "2026-05-23T16:19:02+01:00", "type": "verification", "status": "ok", "note": "Raven ASIO verification succeeded over SSH. Focusrite USB ASIO is registered on Raven and the copied native asio_audio_cadence probe set 192000 Hz, reported 4 inputs / 2 outputs, 192-frame preferred buffers, 44.1-192 kHz support, Int32LSB input channels named Input 1, Input 2, Loopback 1, Loopback 2, and captured nonzero 4-channel callbacks for 5 seconds: 4990 callbacks, 958080 frames, estimated wall-clock rate 191546.848 Hz. Raven can pull Scarlett ASIO at 192 kHz, including driver loopback channels."}
{"ts": "2026-05-23T17:06:31+01:00", "type": "verification", "status": "ok", "note": "Starfire now has the Scarlett Solo 4th Gen attached locally: USB VID_1235 PID_8218 serial S1DE2FP360D5F6. Focusrite USB ASIO exposes 4 inputs / 2 outputs locally: Input 1, Input 2, Loopback 1, Loopback 2, all Int32LSB. The ASIO probe set 192000 Hz and captured nonzero 4-channel callbacks for 5 seconds with 192-frame preferred buffers. This restores local ASIO loopback ownership to the Mimir host; Raven no longer needs to carry game-audio loopback for the soundfield timing path."}
{"ts": "2026-05-23T17:56:26+01:00", "type": "verification", "status": "partial", "note": "Added monitor-sweep mode to the ASIO cadence probe and ran Starfire Scarlett Solo 4th Gen at 192 kHz with 0.02 full-scale output bursts from 8-40 kHz. ASIO loopback channels detected the emitted tone at about 0.01949 amplitude for every tested frequency through 40 kHz. Acoustic input channel 1 detected weak tone energy around 8 kHz and 12 kHz (~0.00041, about -33.5 dB relative to loopback), dropped by 14-16 kHz, and was extremely weak above 20 kHz (roughly -58 dB at 20 kHz, -62 dB at 24 kHz, -80 dB at 32 kHz). Current studio-monitor/acoustic path is not a strong ultrasonic sync carrier; ASIO loopback is excellent for local reference and acoustic calibration should stay near the highest measured robust audible band unless stronger transducers/mics prove otherwise."}
{"ts": "2026-05-23T18:46:59+01:00", "type": "verification", "status": "ok", "note": "Added sample-rate selection to the hybrid chirp-bin self-test and removed the high-rate timing plateau bias from MimirChirpBinTimeline while preserving the 48 kHz compatibility behavior. Synthetic active chirp-bin timing now scales with sample rate: 48 kHz recovered 317.392716 vs 317.375 samples (0.369 us error), 96 kHz recovered 634.766098 vs 634.75 samples (0.168 us error), and 192 kHz recovered 1269.499997 vs 1269.5 samples (about 0.000003 samples, below printed microsecond precision). This proves the timing kernel benefits from 192 kHz in memory; live hardware proof still requires feeding ASIO callbacks into Mimir.Runtime instead of the diagnostic WASAPI/process path."}
{"ts": "2026-05-23T19:03:44+01:00", "type": "measurement", "status": "ok", "note": "Scarlett ASIO chirp-only artifact at 192 kHz: Loopback 1 -> Loopback 2 decoded at 0.000 us with 7 anchors and 0.896 confidence; physical input 2 decoded at 616.226 samples / 3209.508 us with 3 anchors and 0.516 confidence; physical input 1 had no anchors. One 2-second matched-kernel chirplet comparison took roughly 100 seconds, so the current chirp-only decoder is diagnostic, not the runtime hot path."}
{"ts": "2026-05-23T19:22:00+01:00", "type": "implementation", "status": "ok", "note": "Made the active audio sync path use the receiver-cheap chirp-bin decoder for both chirp-only and hybrid modes. The old arbitrary chirplet matcher remains diagnostic/reference only. The chirp-bin decoder now uses bounded energy/onset proposals, dechirp plus fixed Goertzel bins, explicit time/frequency ambiguity candidates, and constrained local waveform correlation for final fractional delay. Synthetic 192 kHz chirp-only and hybrid self-tests both recover a 1269.5-sample delay with printed 0.000 us error; a real Scarlett ASIO chirp-bin artifact decodes Loopback 1 -> Loopback 2 at 0.000 us with 12 anchors and 0.999 confidence, while physical mic channels still need acoustic robustness work."}
{"ts": "2026-05-23T19:40:50+01:00", "type": "implementation", "status": "ok", "note": "Extended active chirp-bin decoding toward the Perfect Machine receiver shape: standalone DecodeStreamWindow now refines source offset against the scheduled waveform so a listener with only codebook/schedule state can place delayed audio on canonical time. Synthetic 192 kHz standalone tests recover 1269.5 samples exactly, 96000 samples / 500 ms to below printed microsecond precision, and 13789.75 samples within 0.021 us. Pairwise Mimir sync now rejects independent clock-fit differences outside a 10s live horizon so coherent period aliases do not become absurd delays. Fensalir project references were updated from removed Aquarium.LocalCast to Aquarium.Fensalir."}
{"ts": "2026-05-23T19:47:34+01:00", "type": "implementation", "status": "ok", "note": "Active chirp-bin decoding now preserves calibration evidence as well as timing: each classified chirp carries the full dechirped 32-bin energy surface, stream decodes aggregate those bins into BandResponses, and sync reports print/expose those per-band response estimates. This makes the chirp stream a timing witness and a frequency-response calibration surface. Verified dotnet build, 192 kHz chirp-only self-test, 500 ms standalone self-test, and Scarlett ASIO loopback artifact with response bands."}
{"ts": "2026-05-23T20:03:21+01:00", "type": "implementation", "status": "ok", "note": "Added chirp-bin calibration profiles as the live meatspace response surface. MimirChirpBinCalibrationProfile summarizes per-source frames, anchors, clock confidence, anchor error, usable bins, and strongest measured bands from active chirp-bin decodes. MimirAudioSynchronizationAnalyzer keeps profiles even when timing reports are rejected, and BufferSmoke now prints them for runtime and ASIO artifact analysis. Verified build, 192 kHz chirp-only self-test, 500 ms standalone receiver self-test, Scarlett loopback sync, and physical input calibration evidence from the stored ASIO artifact."}
{"ts": "2026-05-23T20:19:36+01:00", "type": "implementation", "status": "ok", "note": "Replaced the profile-only chirp-bin calibration cut with a usable physical calibration model. The model records per-source usable bands, symbol reliability, expected-vs-observed confusion observations, timing residuals, delay hypotheses, phase summaries, and an adaptive codebook plan. MimirChirpBinTimeline can now decode with learned per-symbol weights, group-delay correction, and persisted delay-hypothesis seeds. BufferSmoke can run --calibrate-chirp-bin-asio-f32 to render/capture/analyze/persist the model, and --analyze-asio-f32 can load it via --calibration. The ASIO native worker now supports --emit-json-blocks so Focusrite ASIO callbacks can feed Mimir.Runtime continuously through the existing frame-event adapter while the native ABI cut is still pending."}
{"ts": "2026-05-23T20:31:27+01:00", "type": "implementation", "status": "ok", "note": "Completed the physical chirp-bin calibration loop instead of stopping at summaries. The calibration model now owns a shared emission plan from measured reliable symbols, and MimirRuntime renders chirp-bin calibration with that plan so dead bins are removed from the emitted alphabet and sequence order rises as needed. MimirChirpBinTimeline decodes variable-order codewords from the same emission plan, keeps learned response weights/group-delay correction, records bin-shift in confusion/delay hypotheses, and still preserves the default 32-symbol path when no model is loaded. ASIO callback ingestion remains continuous through the ASIO worker's sample-bearing runtime stream path; the next native ABI cut removes process transport overhead, not clock-domain ownership."}
{"ts": "2026-05-23T20:33:00+01:00", "type": "verification", "status": "ok", "note": "Verified continuous runtime ASIO ingestion through the ASIO worker stream path. Using config/mimir-runtime.asio.example.json, BufferSmoke ran for 2 seconds against Focusrite USB ASIO at 192 kHz and ingested 13,324 sample-bearing audio blocks across asio-ch0..asio-ch3, 3,331 blocks per channel, each 192 Float32 frames. This proves loopback and mic channels enter Mimir.Runtime buffers continuously in one ASIO clock domain; the run did not sync because BufferSmoke does not emit speaker calibration audio."}
{"ts": "2026-05-23T21:41:47+01:00", "type": "implementation", "status": "ok", "note": "Implemented the in-process Focusrite ASIO runtime source. native/asio_capture owns the ASIO COM driver/callback buffers and MimirAsioStreamSource drains 192 kHz Float32 blocks into Mimir.Runtime buffers for asio-ch0..asio-ch3 without stdout/base64 transport. The chirp-bin calibration model is now per output/mic path and the active decoder uses learned symbol weights, phase-coherence weights, group-delay correction, and joint global delay/bin-shift hypotheses."}
{"ts": "2026-05-23T21:41:53+01:00", "type": "verification", "status": "ok", "note": "Verified the in-process ASIO runtime ingest and active decoder after the native ASIO cut. dotnet build Mimir.slnx and cmake --build native/asio_capture/build --config Release passed cleanly. BufferSmoke with config/mimir-runtime.asio.example.json ingested 12,196 sample-bearing blocks in two seconds at 192 kHz, with 2,048 buffered 192-frame Float32 blocks on each asio-ch0..asio-ch3 channel. The standalone 192 kHz chirp-bin receiver recovered a 96,000-sample delay with 0.000001 sample error, and calibrated ASIO artifact analysis recovered asio-ch2->asio-ch3 at 0.000 us with 0.812 confidence."}
{"ts": "2026-05-23T21:43:33+01:00", "type": "verification", "status": "ok", "note": "Reran the in-process ASIO ingest after native cleanup changes. BufferSmoke with config/mimir-runtime.asio.example.json ingested 12,204 sample-bearing blocks in two seconds at 192 kHz and retained 2,048 192-frame Float32 blocks for each asio-ch0..asio-ch3 buffer. This remains an ingest proof only because BufferSmoke does not emit calibration audio in that run."}
{"ts": "2026-05-23T22:45:11+01:00", "type": "implementation", "status": "ok", "note": "Separated Mimir's app runtime from Fensalir's demo runtime. MimirRuntime no longer references Aquarium.Fensalir or delegates Frame/RenderPlan/Audio/Synth/Update/ComposeFrame to FensalirRuntime. It owns an empty scene with heightfield tracing and starfield disabled, its own audio/UI/render-plan documents, and only emits calibration audio when the configured reference audio buffer exists. Headless Mimir.App boots with 'Mimir empty scene runtime booted' and no Fensalir splash reconstruction/fractal scene in Mimir source."}
{"ts": "2026-05-23T23:10:00+01:00", "type": "verification", "status": "partial", "note": "Live chirp-only physical Scarlett run on 2026-05-23 emitted through the Focusrite output path and captured 4 ASIO inputs at 192 kHz. Runtime app telemetry locked Loopback 1->Loopback 2 (asio-ch2->asio-ch3) with 13-14 matched chirp-bin events and confidence 1.000. Physical mic input asio-ch1 heard enough energy to calibrate 145 frames / 64 anchors over the 20s capture, with 6 reliable symbols and delay hypotheses around 2,748 samples, but the current pairwise analyzer still failed to produce a timing report in a 2s window. asio-ch0 produced usable band energy but zero anchors. Persisted calibration/chirp-bin/scarlett-live-20260523-230642.json; raw capture remains ignored under artifacts/."}
{"ts": "2026-05-23T23:19:38+01:00", "type": "verification", "status": "partial", "note": "After raising physical mic gain, reran live chirp-only ASIO and a 20s Scarlett calibration capture on 2026-05-23. Runtime still locked digital loopback asio-ch2->asio-ch3 at confidence 1.000 with 13-14 matched events. Physical mic asio-ch1 improved in the long capture from 64 to 74 anchors and clock confidence from 0.806 to 0.879, with 5 reliable symbols and delay hypotheses around 2682-2692 samples. The current 2s calibrated pairwise analyzer still failed to report asio-ch1 because short slices often decode 0-4 candidate anchors with no matched triplet path. asio-ch0 remains energy-only with zero anchors. Persisted calibration/chirp-bin/scarlett-hotmic-20260523-231637.json."}
{"ts": "2026-05-23T23:30:55+01:00", "type": "decision", "status": "ok", "note": "Added source-level code algorithm map and linked Perfect Machine hypotheses research note."}
{"ts": "2026-05-23T23:45:11+01:00", "type": "decision", "status": "ok", "note": "Added Perfect Machine domain index plus 2026-05-23 architecture/optimization/reference study and sample implementation sketches for decoder, SIMD/GPU scoring, actuator, and native rings."}
{"ts": "2026-05-24T01:55:37+01:00", "type": "decision", "status": "ok", "note": "Completed corrected two-hour Perfect Machine study pass from 2026-05-23T23:54:42.9041588+01:00 through 2026-05-24T01:54:56.9747630+01:00; research/perfect-machine-study-2026-05-23 now indexes decoder architecture, acoustic field models, calibration sessions, Fensalir/native boundaries, distributed receivers, benchmarks, failure modes, low-level notes, and sample implementation sketches."}
{"ts": "2026-05-24T11:38:08+01:00", "type": "implementation", "status": "ok", "note": "Added bioacoustic indexed-cepstral training harness with CultLib/CultCache typed result receipts and WAV artifact directories. Latest run artifacts/bioacoustic-training/bioacoustic-20260524-103438 scored 20 hypothesis/degradation cases; identity often survives mel-cepstral warp/blur, but timing MAE under warp points next at a global clock/path hypothesis rather than larger brute-force matching."}
{"ts": "2026-05-24T16:06:07+01:00", "type": "implementation", "status": "ok", "note": "Added global bioacoustic clock hypothesis scoring to the training harness and the first Faust-owned alignment actuator surface. Corrected receipt artifacts/bioacoustic-training/bioacoustic-20260524-150000 favors baseline-mfcc-index/blur-light with total 0.766 after penalizing low-anchor timing fits. bioacoustic-actuator-self-test estimates 317.375 samples, applies fractional correction, and remeasures 0.000 us residual; faust/mimir_alignment_actuator.dsp validates through Faust C++ generation."}
{"ts": "2026-05-24T16:09:30+01:00", "type": "implementation", "status": "ok", "note": "Extended the corrected bioacoustic training run to 0.75s in artifacts/bioacoustic-training/bioacoustic-20260524-150729. Compact indexing wins clean throughput at total 0.752/realtime 6.6x, baseline remains steadier under degradation, highband has warped-path value, and anchor density/time-to-lock should become explicit metrics."}
{"ts": "2026-05-24T17:02:15+01:00", "type": "implementation", "status": "ok", "note": "Promoted Perfect Machine research configurations into Mimir.Runtime module library: decoder/language/path-learning/localization/benchmark/actuator/capture/ingest/reservoir/distributed/network/authority/publication profiles, CultMesh contracts, Fensalir lowering, manifest export, and BufferSmoke profile/contract smoke commands."}
{"ts": "2026-05-24T17:06:40+01:00", "type": "verification", "status": "ok", "note": "Added and optimized Mimir-to-Fensalir lowering benchmark. Six synthetic camera buffers plus two audio sync states lower in about 2.5 us/iteration with roughly 2.3 KB allocated per iteration after pre-sizing lists and removing LINQ sort/projection."}
{"ts": "2026-05-24T22:26:12+01:00", "type": "experiment", "status": "ok", "note": "Added log-mel-domain warp/blur damage and log-mel spectral-flux proposal decoder variants to the bioacoustic contestant arena. Canary packet plus packet-razor-index remains best: 92.522 language score on logmel-warp-light-blur. Naive flux proposals preserve anchors but lose to managed FFT overhead, so fuse flux into the existing feature pass before promoting it."}
{"ts": "2026-05-24T22:46:18+01:00", "type": "experiment", "status": "ok", "note": "Built packet-razor-streaming-faust: schedule-owned local packet windows with four payload hypotheses and tiny timing refinement, plus Faust front-end lowering target. Arena result on canary-packet-trill: best language score 1121.012 on logmel-blur-light, 62.6x realtime, 6/6 events, 100% payload. Lesson: wide MFCC search is acquisition/reference; hot loop should lock clock then inspect scheduled local packet windows."}
{"ts": "2026-05-24T22:47:10+01:00", "type": "verification", "status": "ok", "note": "Verified faust/mimir_packet_razor_frontend.dsp with Faust 2.85.5 C++ generation. The DSP front-end exposes 16 log-spaced resonant band-energy outputs plus 16 positive-flux outputs for the packet razor streaming receiver lowering target."}
{"ts": "2026-05-24T23:04:57+01:00", "type": "experiment", "status": "partial", "note": "First real-world packet razor ASIO test: rendered canary-packet-trill at 192 kHz, played through Focusrite ASIO, captured four inputs. Corrected probe needed --set-sample-rate 192000; first run stayed at 44.1 kHz. Loopback channels 2/3 correlated at +1623 samples and decoded 37/37 events with payload=1.000, timing=1.000, delay=8453.125 us. Acoustic channel 1 decoded only 1/37 and channel 0 none, so room/mic path still needs acquisition/level/channel work."}
{"ts": "2026-05-24T23:10:02+01:00", "type": "experiment", "status": "partial", "note": "Second physical 192 kHz packet run with cardioid and co-streamer shotgun: loopback channels 2/3 still decode 37/37 payload=1.000 at offset 1623 samples. Shotgun channel 1 locks with per-channel offset 2122 samples: 37/37 payload=1.000, timing=0.828, delay=11166.397 us. Cardioid channel 0 partially decodes at offset 2519: 26/37 payload=0.595. Added polarity-invariant scoring for the streaming packet-local path because mic correlations were inverted."}
{"ts": "2026-05-24T23:22:46+01:00", "type": "experiment", "status": "partial", "note": "Promoted canary-packet physical ASIO calibration into a persisted bioacoustic response model at calibration/bioacoustic/scarlett-canary-packet-192k-rerun.json. The command clears the hot-loop budget at 10.7x realtime across four 192 kHz channels after template caching and two-sample coarse search with sub-sample refinement. Loopback channels remain 37/37 with 2.524 us MAE. Co-streamer shotgun reaches 37/37 payload=1.000 with 58.785 us MAE and 2.940 ms acoustic delay relative to loopback. Cardioid reaches 26/37 payload=0.703 with 90.558 us MAE and 4.636 ms acoustic delay. This is exact enough to build response normalization and propagation-delay profiles, but not yet true microsecond sync for physical mics."}
{"ts": "2026-05-24T23:35:51+01:00", "type": "decision", "status": "ok", "note": "Active bioacoustic sync is no longer sequence-coded. The live receiver should keep its ear open for self-identifying song contours; one heard call carries enough log-mel contour, syllable timing, formant, rhythm, payload, and speaker-tint evidence to pin multiple time/frequency anchors at once. De Bruijn/triplet machinery is demoted to retained chirplet/chirp-bin reference artifacts only, not runtime authority."}
{"ts": "2026-05-24T23:45:19+01:00", "type": "experiment", "status": "partial", "note": "Fresh 192 kHz canary-packet physical ASIO run after song-contour authority cut: persisted calibration/bioacoustic/scarlett-canary-packet-192k-contour-fresh.json. Decoder cleared the 10x realtime budget at about 10.0x over four channels. Loopback remains 37/37 payload=1.000 with 2.524 us MAE. Co-streamer shotgun improved to 37/37 payload=1.000 with 34.083 us MAE and 2.710 ms path delay relative to loopback. Cardioid improved to 31/37 payload=0.811 but still measures 92.996 us MAE and 4.636 ms path delay. Current physical ceiling is tens of microseconds on mics; true microsecond sync needs intra-call contour anchors instead of one offset per packet word."}
{"ts": "2026-05-25T00:08:44+01:00", "type": "experiment", "status": "partial", "note": "Built the first anchor-rich canary packet: timing chips, formant pivots, harmonic-envelope notches, payload ornaments, renderer-level template caching, and per-event intra-call anchor measurements in the physical calibration receipt. Fresh 192 kHz ASIO receipt calibration/bioacoustic/scarlett-canary-packet-anchor-rich-192k.json clears 10x realtime and records hundreds of anchors per channel. Loopback improves to about 2.23 us MAE with anchor residuals under 0.3 samples. Physical mics did not improve yet: shotgun 36/37 payload=0.973 at 56.365 us MAE, cardioid 27/37 payload=0.730 at 101.522 us MAE. The new anchors expose path bias; the next cut should shape/weight anchors for acoustic survivability instead of trusting every formant feature equally."}
{"ts": "2026-05-25T00:42:12+01:00", "type": "experiment", "status": "partial", "note": "Added path-level loopback truth to the anchor-rich calibration: matched mic anchors are compared directly against loopback anchors, then event-local waveform correlation against the captured loopback packet chooses the path delay. Release calibration clears the realtime budget at 21.1x on the stored anchor-rich capture. Best stored-result path precision improved to cardioid 7.576 us and shotgun 6.578 us. A fresh room capture at calibration/bioacoustic/scarlett-canary-packet-anchor-rich-latest-192k.json keeps shotgun near 5.916 us but worsens cardioid to 18.930 us. The razor timing-chip emitter mutation was rejected because it reduced physical reliability. Current floor is single-digit microseconds for the shotgun, not yet the one-microsecond target; next required cut is phase/group-delay correction or a direct-path anchor family that survives both mics."}
{"ts": "2026-05-25T01:05:00+01:00", "type": "experiment", "status": "rejected", "note": "Tested a recursive event-local waveform delay fitter: start from the current path hypothesis, resample candidate song windows against loopback, shrink the residual search radius, and weight events by phase-lock consistency. The naive time-domain version improved one stored cardioid path from 7.576 us to 5.141 us, but it also worsened the stored shotgun from 6.578 us to 10.236 us and locked the fresh cardioid onto a later reflection lobe at 65.666 us instead of the prior 18.930 us. Reverted the code and receipts. Lesson: recursive refinement is a valid shape only when constrained by a real phase/group-delay/path model; plain waveform resampling is not sufficient and nanosecond claims are physically dishonest in the current acoustic path."}
{"ts": "2026-05-25T01:25:00+01:00", "type": "research", "status": "ok", "note": "Looked at open realtime DSP/sonar-adjacent systems after the recursive-fit rejection. liquid-dsp, an underwater acoustic modem using liquid-dsp, pyAPRiL passive radar, GNU Radio stream/tag synchronization, OpenTDS, Signalsmith DSP, Open Echo, and ahoi all point the same way: acquisition should use matched filters/ambiguity search; refinement should track complex phase, timing, SRO, and channel response; multipath should be modeled as later residual taps; and exact stream positions should be propagated as tags/state. Added research/sonar-dsp-recursive-refinement-2026-05-25.md. The next implementation cut should be a complex contour matched-filter bank plus direct-path acoustic tracker, not another raw waveform recursion pass."}
{"ts": "2026-05-25T01:41:00+01:00", "type": "research", "status": "ok", "note": "Persisted the sonar/DSP source trail behind recursive refinement. Added research/sonar-dsp-recursive-refinement-2026-05-25/sources.md with per-source summaries and Mimir implementation implications, plus local mirrors under research/sonar-dsp-recursive-refinement-2026-05-25/mirrors/ for liquid-dsp, liquid-dsp releases, the acoustic modem PDF, pyAPRiL, GNU Radio correlate/tag docs, OpenTDS, Signalsmith DSP, Open Echo, and ahoi hardware overview."}
{"ts": "2026-05-25T02:24:00+01:00", "type": "implementation", "status": "partial", "note": "Built the first sonar-shaped recursive refinement slice: MimirComplexContourMatchedFilterBank emits complex matched-filter contour-anchor hits with multiple candidate lobes, and MimirDirectPathTracker uses the current predicted path delay as authority, selects the coherent direct-path cluster inside that gate, and records later clusters as reflection taps. Synthetic reflection smoke passes: at 192 kHz with delay 693.5 samples and a louder reflection 116 samples later, estimate is 692.492189 samples (5.249 us error). Stored Scarlett ASIO receipts run through --complex-contour-asio-f32: shotgun path prediction errors are -5.860 us and +7.247 us; cardioid errors are -15.817 us and +8.963 us. This is a better receiver architecture, but low confidence and multi-sample MAE mean the full phase/group-delay channel model is still missing."}
{"ts": "2026-05-25T02:42:00+01:00", "type": "implementation", "status": "partial", "note": "Extended the complex contour tracker with per-band phase/delay residual observations and a MimirDirectPathChannelModel correction surface. BufferSmoke replay panel now prints strongest band residuals and phase MAE: stored/fresh shotgun phase MAE is 0.617/0.852 rad, stored/fresh cardioid phase MAE is 0.687/0.657 rad. A same-window correction experiment improved one case but worsened others, so it was not promoted; channel correction must be learned across time/captures before it can influence live timing authority."}
{"ts": "2026-05-25T02:53:00+01:00", "type": "verification", "status": "ok", "note": "Added persisted complex contour replay receipt generation. `dotnet run -c Release --no-build --project src/Mimir.BufferSmoke/Mimir.BufferSmoke.csproj -- --complex-contour-replay-panel --output calibration/bioacoustic/complex-contour-replay-panel.json` writes the four stored/fresh shotgun/cardioid cases with delay error, phase MAE, reflection taps, and strongest band residuals. Build passes and synthetic 192 kHz reflection smoke still reports 5.249 us error."}
{"ts": "2026-05-25T03:40:00+01:00", "type": "implementation", "status": "partial", "note": "Built explicit complex contour channel learning and evaluation. `--learn-complex-contour-channel-model` learns path-scoped per-band delay/phase correction and reflection taps from `calibration/bioacoustic/complex-contour-replay-panel.json`, writing `calibration/bioacoustic/complex-contour-channel-model.json`. `MimirDirectPathTracker` now applies supplied channel-model phase/group-delay correction and downweights bands outside the usable learned surface. `--evaluate-complex-contour-channel-model` writes `calibration/bioacoustic/complex-contour-channel-model-evaluation.json`: current model improves 3/4 absolute path-seed errors, mean absolute path error by 2.137 us, and mean cluster MAE by 0.713 samples; fresh cardioid reaches 0.202 us from seed, but stored cardioid worsens from 15.817 us to 17.476 us. Treat the model as explicit calibration evidence, not default runtime authority, until more captures prove stability."}
{"ts": "2026-05-25T04:25:00+01:00", "type": "implementation", "status": "partial", "note": "Moved the complex contour receiver from artifact-only replay into runtime shape. `MimirComplexContourRuntimeAnalyzer` reads Float32 samples from `MimirRollingStreamBuffer`, maps runtime time into the configured bioacoustic witness profile, runs the complex contour matched-filter/direct-path tracker, applies path-scoped `MimirComplexContourChannelModelDocument` corrections, and emits `evidence=complex-contour` synchronization reports. `MimirRuntime` now emits `MimirBioacousticContestantRenderer` audio when `enableComplexContourRuntime` is true, so the live sound and contour decoder share one song profile. Synthetic proof: `--complex-contour-runtime-self-test` at 192 kHz recovers a 693.5-sample delay with 0.219 us error from runtime-shaped rolling buffers. Real Scarlett loopback/mic proof remains the next gate."}
{"ts": "2026-05-25T06:37:00+01:00", "type": "verification", "status": "partial", "note": "Ran a fresh live Scarlett complex-contour pass through the physical output/input path. Rendered `artifacts/asio/canary-packet-live-20260525-063229-f32.raw`, played it through Focusrite ASIO at 192 kHz, and captured `artifacts/asio/scarlett-canary-packet-live-20260525-063229-f32.raw` from all four inputs. Loopback 1 -> Loopback 2 measured -0.014 us with 216 direct hits and 0.008 sample MAE. With `calibration/bioacoustic/complex-contour-channel-model.json` loaded, shotgun measured -3.984 us from prior seed and cardioid measured +1.547 us from prior seed. This proves fresh meatspace viability, but physical mic confidence remains low; next work is stronger direct-path confidence and independent distance/path truth. Receipt: `calibration/bioacoustic/complex-contour-live-20260525-063229.md`."}
{"ts": "2026-05-25T06:50:00+01:00", "type": "implementation", "status": "ok", "note": "Corrected `MimirDirectPathTracker` confidence scoring. The old score normalized direct-cluster confidence against all alternate matched-filter lobes, which made a nearly perfect loopback lock report only 0.126 confidence. Confidence now primarily belongs to the selected direct cluster: direct-hit count, residual tightness, phase coherence, and prediction agreement; nearby competing lobes apply only an ambiguity penalty. Reanalysis of `scarlett-canary-packet-live-20260525-063229-f32.raw` leaves delays unchanged but raises Loopback 1 -> Loopback 2 confidence to 0.971, cardioid confidence to 0.488, and the weaker/disconnected-looking channel to 0.335."}
{"ts": "2026-05-25T06:59:00+01:00", "type": "correction", "status": "invalidated", "note": "Invalidated the apparent cardioid timing proof in `calibration/bioacoustic/complex-contour-live-20260525-063229.md`. The log-mel spectrogram and channel statistics show `asio-ch0` is not a real acoustic signal in that capture: RMS is almost flat (`0.00208350` to `0.00209815` by 0.1s block), peak is only `0.00334287`, and zero-lag correlation with loopback is `0.000032`. The near-seed +1.547 us contour estimate was a seeded tracker fit against noise, not physical mic evidence. The receipt remains valid as a loopback/interface proof (`asio-ch2` -> `asio-ch3` at -0.014 us, confidence 0.971) plus a weak/non-authoritative input witness."}
{"ts": "2026-05-25T07:05:34+01:00", "type": "implementation", "status": "ok", "note": "Added runtime FFT spectra and Fensalir readiness gating. Fensalir now calls IAquariumRuntime.OnSceneReady after the first presented ready frame; Mimir waits for that callback before emitting bioacoustic test audio, running sync analysis, or updating the cached spectrum diagnostics. MimirAudioSpectrumAnalyzer computes bounded Hann-windowed radix-2 FFT snapshots from rolling audio buffers, exposes top peaks/log bands/RMS/peak, and Mimir renders cached spectra in the DirectWrite UI plus telemetry. Verification run with ASIO config showed scene-ready before bioacoustic chunks and live 8192-point spectra for asio-ch0 through asio-ch3; asio-ch0 remains flat low-level noise while loopback/mic-bearing channels show song-band peaks."}
{"ts": "2026-05-25T07:11:48+01:00", "type": "correction", "status": "ok", "note": "Tightened the Fensalir scene-ready gate after runtime spectra testing showed the app still created sources and emitted telemetry before the render path was ready. Runtime config now stores lazy stream-source factories; Mimir.App creates/registers ASIO/process/native sources only inside OnSceneReady, MimirRuntime.Update returns without polling, spectra, sync, telemetry, or audio emission until that callback, and Fensalir constructs the WASAPI/AquaSynth host only after the first presented ready frame. Verification log artifacts/runtime/mimir-ready-gate-20260525-071121.out.log shows no ASIO buffer polling, spectrum telemetry, or bioacoustic batch before D3D12 shader pipelines ready and Mimir Fensalir scene ready."}
{"ts": "2026-05-25T07:51:20+01:00", "type": "verification", "status": "ok", "note": "Audacity WASAPI speech spectrogram corresponds to live physical mic input, not the previously invalidated ASIO noise lane. Focusrite ASIO channel enumeration reports input[0]=Input 1, input[1]=Input 2, input[2]=Loopback 1, input[3]=Loopback 2. A fresh 5s raw ASIO capture artifacts/asio/scarlett-channel-id-20260525-075058-f32.raw inspected with --inspect-asio-f32 shows ch1/Input 2 carrying real speech-band energy (rms 0.009809, peak 0.069316, speechRms 0.007206), ch0/Input 1 at low floor (rms 0.002092), and loopbacks ch2/ch3 silent with no playback. Treat Audacity channel 2 as one-based physical Input 2 => Mimir asio-ch1; do not interpret it as loopback asio-ch2."}
{"ts": "2026-05-25T07:55:48+01:00", "type": "implementation", "status": "ok", "note": "Made runtime audio spectra labels first-class. MimirStreamDescriptor now carries an optional DisplayName/Label, MimirRuntimeConfigFile can assign per-source labels through sourceLabels, and the ASIO example labels Focusrite Input 1, Focusrite Input 2, Focusrite Loopback 1, and Focusrite Loopback 2. The FFT panel and telemetry now render human labels alongside machine source ids, so buffer sanity checks show both meaning and id. Verification with mimir-labeled-fft-20260525-075447.out.log showed labeled spectra for all four Focusrite ASIO lanes."}
{"ts": "2026-05-25T08:16:14+01:00", "type": "verification", "status": "ok", "note": "Rendered Fensalir MelSpectrumStack from Mimir ASIO rolling buffers with canary-packet-trill chirp-only song after scene-ready; captured artifacts/runtime/mimir-mel-spectrum-stack.png with four labeled 192 kHz Focusrite lanes."}
{"ts": "2026-05-25T13:18:43+01:00", "type": "verification", "status": "ok", "note": "Rendered live ASIO audio as Fensalir 3D spline spectrograms: each mel FFT window is one AquariumSpline3D per source, channels are stacked on Y, window history recedes on Z with alpha fade, and capture artifacts/runtime/mimir-3d-spectrum-splines.png proves the scene pass draws the rolling history after scene-ready with canary-packet-trill chirp-only output."}
{"ts": "2026-05-25T13:47:32+01:00", "type": "implementation", "status": "ok", "note": "Fensalir spline rendering now follows the XRLineRenderer-style shape: AquariumSpline3D carries Catmull-Rom subdivision plus radius/emission/alpha/zero-threshold/feather style, D3D12 expands sampled spline segments into camera-facing ribbon geometry, and D3D12SplinePS shades coverage from an SDF-like width coordinate. Mimir renders ASIO rolling mel windows through this primitive; capture artifacts/runtime/mimir-catmull-sdf-spectrum-splines.png verifies the canary-packet-trill runtime path."}
{"ts": "2026-05-25T13:56:03+01:00", "type": "decision", "status": "ok", "note": "Fensalir spectrum visualization authority split: Mimir now emits AquariumBufferFieldFrame spline tube fields as the real buffer-domain contract, with tangent/curvature/normal/derivative appearance and probe policy for future compute SDF splat reservoir lowering. AquariumSplineFrame remains only the immediate Catmull-Rom preview witness until compute lowering owns rendering."}
{"ts": "2026-05-25T15:55:00+01:00", "type": "decision", "status": "ok", "note": "Fensalir/Mimir spectrum visualization moved from C# spline authority to DSL-authored texture field authority. config/mimir-spectrum-field.aquafield binds a rolling spectrum texture, declares surface graph nodes, and asks for texture-dimension splinefield lowering. Fensalir now compiles Aquarium field DSL text, uploads texture samples/program packets, and ProgramMode=3 in D3D12FractalReservoirCompute emits stochastic reservoir splats from the texture field. Current canary is mechanically through the reservoir at 131072 splats with low CPU record time, but visual framing/material is still not the final beautiful spectrum surface."}
{"ts": "2026-05-25T17:43:25+01:00", "type": "decision", "status": "ok", "note": "Fensalir direct splinefield correction: texture-derived tube trails are direct SDF envelope surfaces, not point-splat fractal dust. AquariumFieldScriptCompiler supports direct; D3D12Renderer now derives AquariumSplineFrame tube-envelope trails from BufferFieldFrame texture spline programs, the spline pipeline declares triangle topology, and D3D12SplinePS writes color, metadata/control, and reservoirGuide outputs. Mimir capture artifacts/runtime/mimir-direct-sdf-tube-spectrum.png proves the DSL-authored ASIO spectrum appears through the direct SDF tube path with ~0.64 ms record CPU in the canary."}
{"ts": "2026-05-25T18:01:04+01:00", "type": "decision", "status": "ok", "note": "EVE native program output is now a D3D12 shared-texture contract: Fensalir owns completed backbuffer pixels and publishes Global\\MimirFensalirProgramTexture when FENSALIR_PROGRAM_OUTPUT_D3D12=1; Mimir records the EVE publication profile and WebKit remains forbidden as pixel/layout authority."}
{"ts": "2026-05-25T18:25:00+01:00", "type": "decision", "status": "ok", "note": "Mimir's spectrum field script no longer chooses direct or reservoir backend lowering. It declares rolling texture-to-splinefield intent plus an auto lowering budget; Fensalir owns backend selection and LOD. MIMIR_SYNTHETIC_SPECTRUM_PREVIEW=1 exists only as a render-proof source when ASIO startup would block headless capture; real audio buffers remain runtime authority."}
{"ts": "2026-05-25T19:14:58+01:00", "type": "implementation", "status": "ok", "note": "Mimir spectrum layout now matches the intended coordinate contract: frequency runs along X, amplitude displaces Y, history windows step along Z, channels stack along Y via Fensalir column groups, and the runtime camera is placed at (0, spectrumCount * spacing, -spectrumCount * spacing) looking at the spline AABB center. Proof capture: artifacts/runtime/mimir-aabb-camera-spectrum-splines.png."}
{"ts": "2026-05-25T20:32:20+01:00", "type": "decision", "status": "ok", "note": "Spectrum spline camera fit now uses a CultMath/HLSL-shaped projection invariant: camera targets the spline-history AABB center, distance/angle are polar YZ controls, frustum near/far and symmetric FOV planes are fitted from AABB corner slopes, and telemetry reports CPU-projected clip bounds. Fensalir frame constants required explicit C# padding before float4 fields to match HLSL cbuffer packing; without it shaders read shifted frustum values."}
{"ts": "2026-05-25T22:44:59+01:00", "type": "implementation", "status": "ok", "note": "Eve dashboard path now uses Fensalir shared D3D12 program texture -> Mimir.EveRelay H.264 Annex-B WebSocket -> EveCanvas native AVSampleBufferDisplayLayer. Local Windows firewall blocked direct inbound TCP 8792, so launch script opens an SSH reverse tunnel and EveCanvas tries localhost before LAN. Live health reported h264-annexb 1264x681 with one connected client."}
{"ts": "2026-05-25T23:02:30+01:00", "type": "implementation", "status": "ok", "note": "Mimir local spectrum dashboard now forces Fensalir texture-spline field lowering to ReservoirSplats instead of auto direct tubes. Auto mode chose direct tubes for 160 columns, so the screen was not the final sampled reservoir. Spectrum rows now map age-from-newest explicitly: newest/front at z=0, older windows recede +Z. Live run shows 131,072 visible reservoir splats and four 192 kHz ASIO lanes."}
{"status":"ok","note":"Spectrum dashboard authority cut: Mimir no longer submits AquariumBufferFieldFrame/reservoir splats for the live audio spectrum view. The surface is direct AquariumSplineFrame tube trails only; config/mimir-spectrum-field.aquafield was deleted so the old ReservoirSplats path cannot reappear through configuration.","type":"correction","ts":"2026-05-26T10:08:18+01:00"}
{"status":"ok","note":"Corrected the previous overcut: the spectrum dashboard is back on a single AquariumBufferFieldFrame reservoir authority with direct spline triangles disabled. Defaults are 32768 reservoir samples, 8192 updates/frame, one candidate/update, and WorldCenterRadius=(0,0,0,1) to prevent sample radii from inflating into giant discs. Fensalir transparent-field splats no longer enforce the 0.035*fieldRadius minimum billboard radius. Runtime proof logs 32768 visible splats at about 3-6 ms CPU frame time and about 0.2 ms command recording. Compute sampling is still hash-jittered rather than true blue-noise texture driven.","type":"correction","ts":"2026-05-26T10:31:00+01:00"}
{"ts": "2026-05-26T10:48:57+01:00", "type": "correction", "status": "ok", "note": "Spectrum dashboard authority is direct spline-tube SDF again: Mimir submits AquariumSplineFrame trails and leaves AquariumBufferFieldFrame empty, so fractal ReservoirSplats cannot own the view. The live run artifacts/runtime/mimir-spectrum-sdf-temporal-sparse.out.log showed four 192 kHz ASIO lanes, no D3D12 fractal reservoir lines, and about 4-7 ms D3D12 CPU frames with record near 3 ms using sparse rotating spline budgets."}
{"ts": "2026-05-26T11:01:55+01:00", "type": "implementation", "status": "ok", "note": "Spectrum spline heat now drives HDR bloom instead of relying on flat color. Mimir maps normalized band energy through a hard-drive curve: quiet bins stay dim/transparent, hot bins raise alpha and HDR red/yellow/white energy before Fensalir bloom/ACES tonemapping. Live ASIO proof artifacts/runtime/mimir-spectrum-hot-bloom-screen.png shows loopback lanes glowing while quiet lanes stay subdued; frame timing remained about 4.5-6.9 ms with no ReservoirSplats/fractal dashboard path."}
{"ts": "2026-05-26T11:13:09+01:00", "type": "correction", "status": "ok", "note": "Rebuilt spectrum spline history around temporal identity instead of render-frame sampling. The failed path rotated row and band selection by frameIndex, so visible line identity changed every frame and older windows teleported by integer queue age. Mimir now stores timestamped spectrum history frames with sequence ids, computes Z from continuous age, keeps source ordering across the full history, and only decimates by stable history-sequence/frequency-bin identity. Full no-decimation proof was coherent but exposed Fensalir CPU spline expansion at ~25 ms record; stable LOD defaults restore ~6-8 ms without frame-phase flicker. Proof: artifacts/runtime/mimir-spectrum-coherent-lod-screen.png and .out.log."}
{"ts": "2026-05-26T11:29:14+01:00", "type": "correction", "status": "ok", "note": "Corrected spectrum spline surface ownership: Fensalir direct splines no longer alpha-blend segment overlap, D3D12SplinePS writes true camera travel into colorTravel.a instead of alpha, coverage/confidence now lives in control/reservoirGuide, and direct blue-noise jitter was removed from the fallback surface. Headless proof artifacts/runtime/mimir-spline-travel-owner-smooth.png shows smooth deterministic synthetic spectrum tubes after the fix. This is still the direct SDF debug path, not the future stochastic reservoir producer."}
{"ts": "2026-05-26T11:39:49+01:00", "type": "correction", "status": "ok", "note": "Added the Fensalir invariant explicitly: Fensalir is not a traditional renderer. Mimir must treat it as a field/evidence machine where contributors emit bounded claims with travel/depth, metadata, control, and reservoir-guide lanes. Pixel-only drawing is fallback/debug, not the Perfect Machine surface. This correction is now in notes/current-system-map.md and docs/implementation-plan.md."}
{"ts": "2026-05-26T11:46:55+01:00", "type": "decision", "status": "ok", "note": "Recorded the support-scale reservoir invariant: Fensalir may resolve at pixel level, but reservoir contents are not pixel-sized by default. Smooth surfaces can be represented by few broad claims; Aquarium-style heightfields should use brush-painted quadtree tiles and emit SDF surface splats adaptively by projected footprint, curvature, brush/material detail, silhouette risk, and temporal uncertainty."}
{"ts": "2026-05-26T13:26:28+01:00", "type": "decision", "status": "ok", "note": "Initiated the full Mimir/Fensalir rendering teardown protocol. Mimir now has docs/fensalir-rendering-rebuild-migration.md as the app-side migration map: Mimir owns rolling physical observations, calibration constraints, and surface intent; Fensalir owns field claims, selected lowerings, evidence reservoirs, temporal guide lanes, and program presentation. Direct spectrum splines remain diagnostic until they are expressed as surface intent."}
{"ts": "2026-05-26T14:04:08+01:00", "type": "implementation", "status": "ok", "note": "Phase 1 Mimir bridge skeleton is live in src/Mimir.Runtime/Synchronization/MimirFensalirBridgeContracts.cs. It defines pure DTOs for rolling stream windows, observations, calibration constraints, and surface intent plus mappers from rolling buffers and audio sync state/report surfaces. No rendering, device reads, timers, JSON/base64 hot paths, or backend-specific visual choices were added. dotnet build Mimir.slnx passed with one pre-existing EveRelay CA2024 warning."}
{"ts": "2026-05-26T14:39:17+01:00", "type": "correction", "status": "ok", "note": "Corrected the Phase 1 field evidence boundary: Mimir no longer emits AquariumFieldBackendPacket rows with Backend=Unknown for surface intents. Surface intent now lowers only to field domains, claims, and candidates; backend packet selection remains Fensalir authority. dotnet build Mimir.slnx --no-restore passed with 0 warnings and 0 errors after the cut."}
{"ts": "2026-05-26T14:44:02+01:00", "type": "implementation", "status": "ok", "note": "Added BufferSmoke --fensalir-field-evidence-smoke as a hardware-free contract receipt. It builds a synthetic rolling audio window, observation, bioacoustic calibration constraint, and audio-spectrum surface intent, lowers them through MimirFensalirFieldLowering, validates with AquariumFieldEvidenceValidator, and verifies Fensalir receives three pending lowering requests and zero backend packets. Smoke passed: domains=4 claims=3 candidates=3 packets=0 requests=3 errors=False."}
{"ts": "2026-05-26T14:50:33+01:00", "type": "implementation", "status": "ok", "note": "MimirRuntime now publishes AquariumFieldEvidenceFrame on every AquariumSceneState from live rolling buffers, latest observations, audio sync calibration constraints, and per-source surface intent. Existing direct spectrum splines remain diagnostic; Fensalir receives backend-neutral domains/claims/candidates through FieldEvidenceFrame. dotnet build Mimir.slnx --no-restore passed with the pre-existing EveRelay CA2024 warning, and --fensalir-field-evidence-smoke still passes."}
{"ts": "2026-05-26T16:21:31+01:00", "type": "implementation", "status": "ok", "note": "Added the typed Fensalir resource boundary for field evidence. AquariumFieldEvidenceFrame now carries AquariumFieldResourceDeclaration rows; claims/packets that use mimir:resource:* handles validate against declared resources, and the lowering planner defers missing, CPU-only, or backend-incompatible resource requests. MimirFensalirFieldLowering emits resource declarations from live MimirBridgePayloadView/native handles, and observation claims reference those resource keys instead of bare kind:handle strings. dotnet build Mimir.slnx passed with the pre-existing EveRelay CA2024 warning; BufferSmoke --fensalir-field-evidence-smoke passed with domains=4 resources=1 claims=3 candidates=3 packets=0 requests=3 errors=False."}
{"ts": "2026-05-26T16:42:17+01:00", "type": "implementation", "status": "blocked", "note": "Resource-backed Fensalir lowering now reaches planned packets but not visible rendering. Mimir audio spectrum/waveform surface intents use the source observation's mimir:resource:* key, so --fensalir-field-evidence-smoke produces one planned TubeField packet and two deferred non-backend claims. Fensalir's AquariumFieldScriptCompiler.CompileEvidence can bind declared resources in DSL; --fensalir-field-dsl-resource-smoke produces one planned TubeField packet with no deferred requests. The next blocker is engine-side D3D12 packet/resource resolution: Fensalir must import/alias GPU-resident structured buffers, textures, meshes, surface pages, and volumes and bind them to selected shader lowerings before planned packets can render visibly."}
{"ts": "2026-05-26T17:29:30+01:00", "type": "correction", "status": "ok", "note": "Corrected the resource-boundary model: Mimir is a client running inside the Fensalir runtime, so Mimir-declared buffers are Fensalir resource declarations, not cross-process payload truth. Fensalir now has the first D3D12 field resource registry cut for declared structured/curve buffers: valid declarations allocate/reuse/retire engine-owned GPU slots under the resource key, and duplicate resource keys are validation errors. Visible rendering is now blocked on TubeField shader binding for resolved slots, not on deciding who owns the buffers. Texture, mesh, surface-page, and volume resource kinds remain future Fensalir resolver cuts."}
{"ts": "2026-05-26T18:50:34+01:00", "type": "correction", "status": "ok", "note": "Tightened the resource invariant: rendering buffers should move to GPU residency ASAP and stay there, with Fensalir passing handles/SRVs/UAVs between compute and render lowerings instead of copying samples through CPU. Fensalir's TubeField DSL now describes 2D rolling Float32 buffers as Catmull-Rom XY tubes with modulo column addressing, amplitude power/normalization, radius scaling, ramp texture path, and emission scale. D3D12 shared structured/curve resources import by GPU handle or stay unsupported; Fensalir only allocates a GPU slot when it is the producer. Visible rendering still needs shader-side TubeField expansion/binding over the GPU slot."}
{"ts": "2026-05-26T20:13:00+01:00", "type": "implementation", "status": "ok", "note": "Fensalir now has the first D3D12 TubeField rendering path for Mimir-declared rolling float buffers: compute shader expansion binds the resolved GPU sample buffer read-only, emits endpoint-clamped Catmull-Rom tube envelopes into fixed-budget vertex/index UAVs, honors declared sample stride with byte-address loads, draws opaque field geometry through the spline SDF pipeline, and reports requested/dispatched/truncated segment counts. Mimir build and both Fensalir field evidence smokes pass; remaining cuts are per-pixel source-row material sampling, ramp texture binding/fallback, indirect draw packets, and non-buffer resolvers."}
{"ts": "2026-05-26T20:22:00+01:00", "type": "implementation", "status": "ok", "note": "Fensalir TubeField rendering now includes the pixel-material side Mimir asked for: compute expansion records one draw batch per lowering, and the TubeField pixel shader binds the matching source buffer/constants and resamples the rolling buffer per pixel by column+spline coordinate using the cheap 5-tap path. Initial material is opaque field geometry with fallback black-to-warm ramp, squared normalized emission, and fake Fresnel center-bright/edge-dark shaping. Real blackbody ramp texture binding, indirect draw packets, and non-buffer resolvers remain future cuts. Headless Fensalir dev reload, Aquarium.Engine.Tests, Mimir build, and both field smokes passed."}
{"ts": "2026-05-26T20:40:00+01:00", "type": "implementation", "status": "ok", "note": "Fensalir now exposes Texture2D local asset resources for engine users. The field DSL accepts `texture2d id=... key=... path=...`, TubeField `ramp=...` resolves aliases to resource keys, D3D12 lazily uploads local Rgba8 assets and binds the ramp SRV with linear clamp sampling, and unresolved ramps use a Fensalir-owned 0-1 fallback texture. Mimir's DSL smoke now proves two resources, one TubeField lowering, automatic ramp handle binding, and one planned TubeField packet. Headless Fensalir reload, Aquarium.Engine.Tests, Mimir build, and both field smokes passed."}
{"ts": "2026-05-26T20:59:00+01:00", "type": "implementation", "status": "ok", "note": "Fensalir TubeField compute now emits GPU-resident D3D12 indirect draw argument packets. Render still binds one batch at a time because source/ramp material root bindings differ, but draw count/start index authority now comes from the compute-emitted packet and render uses ExecuteIndirect. Fensalir build/tests/headless reload, Mimir build, and both field smokes passed. Remaining renderer migration cuts are mesh, surface-page, and volume resource resolvers."}
{"ts": "2026-05-26T21:05:00+01:00", "type": "implementation", "status": "ok", "note": "Fensalir now resolves SurfacePage field resources. Contracts and DSL can declare GPU-resident 2D surface pages with dimensions, format, version, and optional local source; D3D12FieldResourceRegistry allocates empty shader-readable page textures or lazily loads local source-backed pages. This creates resource authority for future Height/SDF/material lowerings, but does not yet make a surface-page render lowering. Fensalir build/tests/headless reload, Mimir build, and both field smokes passed."}
{"ts": "2026-05-26T21:11:00+01:00", "type": "implementation", "status": "ok", "note": "Fensalir now resolves VolumeTexture field resources. Contracts and DSL can declare GPU-resident 3D textures with width/height/depth/format/version, and D3D12FieldResourceRegistry allocates shader-readable Texture3D resources for future density/extinction/SDF3D lowerings. This is resource authority only, not a volume render lowering. Fensalir build/tests/headless reload, Mimir build, and both field smokes passed. Mesh remains the resolver that needs a real vertex/index ownership contract."}
{"ts": "2026-05-26T21:24:00+01:00", "type": "implementation", "status": "ok", "note": "Fensalir now resolves Mesh field resources as one package: Mesh.Vertices and Mesh.Indices describe the GPU vertex/index buffers, with topology, index format, bounds, submesh count, and version on the package. The DSL accepts `mesh id=... key=... vertices=... vertexStride=... indices=... indexFormat=... topology=...`, and D3D12FieldResourceRegistry allocates/reuses the GPU-resident buffers under the mesh resource key. This is resolver authority only; mesh draw/material lowerings remain future work. Fensalir build/tests/headless reload passed."}
{"ts": "2026-05-26T21:42:00+01:00", "type": "implementation", "status": "blocked", "note": "Fensalir's evidence DSL can now plan generic resource-backed claims with `claim id=... resource=... encoding=... layer=...`, so Mesh, SurfacePage, and VolumeTexture resources reach backend packet planning. The remaining renderer cut is blocked on selected render-lowering contracts: Mesh drawing needs explicit vertex attribute/material semantics because count/stride/index format only describe buffer shape, not how bytes become position, normal, uv, color, transform, or material."}
{"ts": "2026-05-26T21:58:00+01:00", "type": "decision", "status": "ok", "note": "Clarified Fensalir Mesh layout authority: imported/user-facing FBX/OBJ-style meshes use the standard PositionNormalUvColor vertex layout, while generated meshes declare PipelinePrivate and let their selected lowering own the exact minimal byte layout. The generic mesh ABI is no longer the blocker; next renderer work should choose the first selected mesh/page/volume lowering and material path."}
{"ts": "2026-05-26T22:49:00+01:00", "type": "implementation", "status": "ok", "note": "Fensalir TubeField now renders through the first explicit pipeline-private generated mesh lane. Compute owns the private D3D12TubeFieldVertex/index/indirect argument layout; render binds those buffers as a D3D12PipelinePrivateGeneratedMesh before applying TubeField source/ramp/material root bindings and ExecuteIndirect. This follows the generated-mesh option without adding a public imported mesh renderer."}
{"ts": "2026-05-26T22:52:00+01:00", "type": "implementation", "status": "ok", "note": "Fensalir lifted the DrawIndexed indirect command signature from TubeField to the generated-mesh lane. TubeField still emits its own indirect argument buffer, but future pipeline-private generated mesh lowerings can share the same five-uint D3D12 DrawIndexedArguments ABI with their own producer buffers/material bindings."}
{"ts": "2026-05-26T22:55:00+01:00", "type": "implementation", "status": "ok", "note": "Fensalir TubeField expansion now follows selected backend packet authority. D3D12Renderer expands only TubeSplineLowerings whose claim has a planned TubeField packet; unplanned lowerings are counted in debug status instead of rendered. This prevents explicit lowering metadata from bypassing validation/planning."}
{"ts": "2026-05-26T22:58:00+01:00", "type": "implementation", "status": "ok", "note": "Fensalir validation now rejects TubeSpline lowering metadata if the referenced claim is not Tube-encoded or if the lowering resource differs from the claim payload resource. TubeField split authority is caught at validation, before renderer packet gating. Fensalir build/tests/headless reload passed."}
{"ts": "2026-05-26T23:03:00+01:00", "type": "implementation", "status": "ok", "note": "Mimir's typed Fensalir surface-intent lowering now emits AquariumFieldTubeSplineLowering metadata for audio spectrum/waveform Tube claims. The hardware-free field evidence smoke now proves one resource, three claims, one TubeSpline lowering, one planned TubeField packet, and two deferred non-backend claims; the DSL smoke still proves resource-bound TubeSpline lowering with ramp binding."}
{"ts": "2026-05-26T23:18:00+01:00", "type": "correction", "status": "ok", "note": "Silenced the legacy direct spectrum spline path. MimirRuntime now submits AquariumSplineFrame.Empty and the old BuildSpectrumSplineFrame/direct spline styling helpers were deleted, so live spectrum visualization authority is FieldEvidence TubeField only. Mimir build and both Fensalir field smokes passed."}
{"ts": "2026-05-26T23:36:00+01:00", "type": "implementation", "status": "ok", "note": "Mimir now feeds spectral frames into the GPU buffer path. Current audio spectra are normalized into a row-major Float32 matrix, declared as mimir:resource:spectrum:field-upload, attached as a field ResourceUpload, and consumed by the TubeField claim/lowering. Fensalir now uploads ResourceUpload Float32 data into resolved structured buffers before TubeField compute runs. Mimir build, Fensalir build/tests/headless reload, and both field smokes passed."}
{"ts": "2026-05-26T23:44:26+01:00", "type": "verification", "status": "ok", "note": "Added Mimir.BufferSmoke --mimir-spectrum-upload-smoke to exercise the actual MimirRuntime frame path. The smoke verifies one Float32 spectrum ResourceUpload, one declared GPU structured buffer, one Tube claim/lowering, one planned TubeField packet, and no legacy AquariumSplineFrame or AquariumBufferFieldFrame dashboard input."}
{"ts": "2026-05-26T23:48:24+01:00", "type": "verification", "status": "ok", "note": "Headless Fensalir with Mimir.Runtime and MIMIR_SYNTHETIC_SPECTRUM_PREVIEW=1 captured artifacts/runtime/mimir-spectrum-upload-headless.png. The screenshot shows visible TubeField spectrum arcs from the resource-upload path; stderr was empty. Use Mimir.Runtime.csproj, not Mimir.App.csproj, as the dev-reload client assembly because the runtime factory lives there."}
{"ts": "2026-05-26T23:49:49+01:00", "type": "implementation", "status": "ok", "note": "Mimir's runtime spectrum FieldEvidence path now declares the blackbody PNG as a GPU-resident Texture2D field resource and binds the TubeSpline lowering to that ramp by resource key, instead of falling back to unbound white/linear material."}
{"ts": "2026-05-26T23:51:02+01:00", "type": "verification", "status": "ok", "note": "Runtime blackbody ramp binding verified. Mimir build passed with one unrelated existing Mimir.EveRelay CA2024 warning; --mimir-spectrum-upload-smoke reports resources=2/uploads=1/planned=1/errors=False; both Fensalir field smokes pass; headless Fensalir captured artifacts/runtime/mimir-spectrum-upload-headless-ramp.png with visible ramp-colored TubeField arcs and empty stderr."}
{"ts": "2026-05-27T11:33:22+01:00", "type": "implementation", "status": "ok", "note": "Mimir spectrum upload is now a rolling column matrix instead of a latest-frame row dump. The shared Float32 resource flattens physical columns as history-age/source-lane pairs; Mimir emits one TubeField claim/lowering per source with ColumnStride=sourceCount and ColumnStep.z=0.1 so each source gets its own age trail through the shared GPU buffer."}
{"ts": "2026-05-27T11:38:16+01:00", "type": "implementation", "status": "ok", "note": "Mimir spectrum resource declarations now use fixed history capacity instead of growing with the currently filled trail. The runtime smoke proves 48 bands x 4 source lanes x 40 history capacity = 7680 uploaded floats while only the active history count is emitted through each source lowering. This avoids frame-to-frame GPU buffer resizing while preserving the rolling age trail."}
{"ts": "2026-05-27T11:41:00+01:00", "type": "implementation", "status": "ok", "note": "Mimir now exposes MIMIR_SPECTRUM_TUBE_SUBDIVISIONS as the first runtime cost lever for TubeField overflow. The spectrum upload smoke sets it to 2 and verifies every emitted source-lane TubeSpline lowering uses that Catmull-Rom subdivision count, so Fensalir's requested/dispatched/truncated segment report can be answered without changing code."}
{"ts": "2026-05-27T11:47:48+01:00", "type": "implementation", "status": "ok", "note": "Mimir spectrum upload now has fixed source-lane capacity as well as fixed history capacity. MIMIR_SPECTRUM_SOURCE_LANES sets the lane budget, TubeSpline lowerings use that budget as ColumnStride, surplus sources are truncated and reported in the runtime UI, and --mimir-spectrum-upload-smoke verifies 48 bands x 8 lanes x 40 history capacity = 15360 uploaded floats while emitting only four active TubeField claims/lowerings."}
{"ts": "2026-05-27T11:54:44+01:00", "type": "implementation", "status": "ok", "note": "Mimir spectrum history now uses true ring addressing. Physical history slots are keyed by sequence modulo the fixed history capacity, TubeSpline lowerings carry RollingOffset for newest logical age, and --mimir-spectrum-upload-smoke verifies the expected offset with the fixed 8-lane resource. This makes partial column uploads possible without changing shader sampling semantics."}
{"ts": "2026-05-27T12:00:41+01:00", "type": "implementation", "status": "ok", "note": "Mimir now emits partial spectrum resource uploads for the active ring slots it samples. The declared GPU buffer remains fixed at 48 bands x 8 lanes x 40 history slots, but the smoke now verifies three offset uploads totaling 1152 floats for the three active ages instead of a full 15360-float backing-store upload. Headless Fensalir rendered the offset-copy path with empty stderr."}
{"ts": "2026-05-27T12:21:38+01:00", "type": "implementation", "status": "ok", "note": "Mimir now sends only the newest spectrum ring slot as an offset Float32 resource upload. Fensalir owns rolling structured-buffer slot validity and clamps TubeField dispatch to valid contiguous logical columns, so invalid older slots cannot reach shader sampling after renderer allocation or partial update. Smoke reports uploadFloats=384 and headless render succeeded with empty stderr."}
{"ts": "2026-05-27T12:32:42+01:00", "type": "implementation", "status": "ok", "note": "Updated docs/fensalir-rendering-rebuild-migration.md so the rendering migration map matches the live spectrum TubeField path: newest-slot Float32 uploads, fixed source-lane capacity, RollingOffset ring addressing, Fensalir-owned valid-slot gating, stable claim-derived TubeField metadata ids, and the current budget levers."}
{"ts": "2026-05-27T12:43:45+01:00", "type": "implementation", "status": "ok", "note": "Camera descriptors now lower through FieldEvidence instead of the retired direct GPU sensor frame bridge. GPU/native video handles declare shared Texture2D resources and camera claims; metadata-only cadence frames remain observations with no render payload, so missing pixels cannot become fake latest-window requests. --fensalir-camera-observation-smoke verifies the split and camera image claims defer until Fensalir owns a selected visual-fusion lowering."}
{"ts": "2026-05-27T12:49:27+01:00", "type": "implementation", "status": "ok", "note": "Fensalir now resolves shared Texture2D field resources by native D3D12 handle and accepts Mimir video format names (Bgra8, Gray8/R8, Rg8, Nv12, LeapStereoIr). The camera observation bridge therefore produces resource declarations that can become real engine GPU resources before a selected camera/feature lowering exists."}
{"ts": "2026-05-27T12:54:07+01:00", "type": "implementation", "status": "ok", "note": "Mimir's proof path no longer uses the direct AquariumAcousticFieldFrame builder. Sync states lower into FieldEvidence calibration constraints through MapCalibrationConstraints, and the profile/benchmark smokes now measure the claim/defer path until Fensalir owns a selected acoustic visualization/fusion lowering."}
{"ts": "2026-05-27T13:26:42+01:00", "type": "decision", "status": "ok", "note": "Fensalir-owned Texture2D leases are the preferred live camera payload authority: Mimir receives AquariumRuntimeServices, requests keyed D3D12 texture/fence leases, writes decoded frames into the engine-owned shared texture, commits producer fence values, and lowers the resource key through FieldEvidence. Imported shared texture handles remain fallback/import edges."}
{"ts": "2026-05-27T13:32:24+01:00", "type": "decision", "status": "ok", "note": "Texture lease services now propagate from MimirRuntime into direct video capture sources. MimirVideoCaptureDriverSource forwards a MimirFensalirTextureLeaseClient to drivers that implement IMimirFensalirTextureLeaseReceiver, so a direct camera driver can request its Fensalir-owned destination texture before it emits the frame descriptor and producer fence value."}
{"ts": "2026-05-27T13:37:42+01:00", "type": "decision", "status": "ok", "note": "Camera ingest policy is now closest-to-device first. Fensalir-owned Texture2D leases remain the render-input authority, but each native camera backend must choose the most direct device path available and report unavoidable copy count. Managed wrappers, process bridges, and system-memory rings are diagnostics or fallbacks, not production hot-path owners."}
{"ts": "2026-05-27T14:07:32+01:00", "type": "decision", "status": "ok", "note": "Raw single-plane CPU-origin camera frames now have an explicit Fensalir texture upload fallback. MimirVideoCaptureDriverSource uploads returned frame bytes into the leased Fensalir Texture2D through the broker, clears the live managed payload after successful upload, and increments MimirVideoFrameDescriptor.UnavoidableCopyCount. CPU NV12 upload is rejected until Fensalir has a real planar copy path; GPU/direct producers should bypass this lane and remain at zero copies."}
{"ts": "2026-05-27T14:21:26+01:00", "type": "decision", "status": "ok", "note": "Mimir now has a production-shaped in-process KS/UVC camera driver. native/camera_capture builds mimir_camera_capture.dll, which opens a Kernel Streaming capture pin and queues uncompressed UVC frames; MimirKsVideoCaptureDriver feeds those frames through IMimirVideoCaptureDriver so MimirVideoCaptureDriverSource can upload single-plane raw pixels into Fensalir texture leases and count the unavoidable copy. MJPG/H264 remain future device/GPU decode producer work."}
{"ts": "2026-05-27T14:25:26+01:00", "type": "verification", "status": "ok", "note": "The new in-process KS/UVC driver pulled a real LeapUVC 640x240 YUY2 frame through native/camera_capture, MimirKsVideoCaptureDriver, and MimirVideoCaptureDriverSource, then uploaded 307200 bytes into the Fensalir texture lease for mimir:resource:camera:leap-stereo-ir:texture2d with UnavoidableCopyCount=1. Managed live payload bytes were cleared after upload."}
{"ts": "2026-05-27T14:31:40+01:00", "type": "verification", "status": "ok", "note": "Direct camera driver smokes pulled and uploaded real camera pixels into Fensalir texture leases: LeapUVC 640x240 YUY2 uploaded 307200 bytes, PS3 Eye 0 and 1 each uploaded 320x240 Bayer8 / 76800 bytes, Kiyo Pro uploaded 1920x1080 YUY2 / 4147200 bytes, and regular Kiyo uploaded 640x480 YUY2 / 614400 bytes. All successful paths cleared live managed payload bytes after upload and reported UnavoidableCopyCount=1. Regular Kiyo 1280x720 YUY2 did not open; compressed MJPG/H264 still require a device/GPU decode producer."}
{"ts": "2026-05-27T16:35:32+01:00", "type": "verification", "status": "ok", "note": "Media Foundation GPU decode is now a Mimir-owned producer path. native/camera_capture/mimir_mf_gpu_capture.dll runs SourceReader with a D3D11 device manager, selects Kiyo Pro compressed modes, decodes MJPG/H264 on the GPU, copies the decoded GPU surface into a shared BGRA D3D11 texture, and MimirMediaFoundationGpuVideoCaptureDriver publishes a shared-d3d11-texture handle with empty live CPU payload bytes. Kiyo Pro 1920x1080 MJPG->RGB32 and H264->RGB32 smokes passed and lowered to valid Fensalir camera resources. Direct shared NV12 texture creation failed with E_INVALIDARG, so planar NV12 remains future plane-aware interop or GPU bridge-copy work."}
{"ts": "2026-05-27T17:19:41+01:00", "type": "verification", "status": "ok", "note": "The MF GPU direct texture path now carries D3D11/D3D12 synchronization instead of relying on flush timing. native/camera_capture/mimir_mf_gpu_capture.dll creates a shared D3D11 fence, signals it after copying the decoded GPU surface into the shared BGRA texture, and MimirMediaFoundationGpuVideoCaptureDriver carries the fence handle/value through MimirVideoFrameDescriptor into Fensalir field resource declarations. Kiyo Pro 1920x1080 MJPG->RGB32 and H264->RGB32 smokes passed with zero live CPU payload bytes, nonzero shared texture handles, nonzero producer fence handles, and valid Fensalir camera resources."}
{"ts": "2026-05-27T17:53:38+01:00", "type": "decision", "status": "ok", "note": "Synchronized camera Texture2D resources are not a mandate to invent production visual fusion now. Camera image claims remain debug-view-only until the renderer and audio work are fixed; future camera fusion/feature-extraction lowerings need a separate selected policy decision."}
{"ts": "2026-05-27T18:03:11+01:00", "type": "decision", "status": "ok", "note": "Runtime audio sync states now derive explicit actuator command frames through MimirAlignmentActuatorBank: measured delay remains analyzer truth, the bank converts offsets into nonnegative Faust holdback controls with stable source slots, reference holdback, and overflow reporting. This is control-plane publication only; Faust/native DSP still owns live sample movement."}
{"ts": "2026-05-27T18:06:41+01:00", "type": "decision", "status": "ok", "note": "MimirRuntime now queues the latest MimirAlignmentActuatorBank frame into AquariumAudioDocument as an engine audio control frame. This creates the Mimir-to-Fensalir control contract for Faust/native DSP targets, but remains control-plane only until a streaming DSP sample mover consumes it."}
{"ts": "2026-05-27T18:54:28+01:00", "type": "decision", "status": "ok", "note": "Mimir now declares faust/mimir_alignment_actuator.dsp as an AquariumStreamingDspProgram before queuing actuator controls, giving Fensalir both the persistent Faust DSP graph and the control frames. Live sample alignment still waits on the next device I/O/stem-routing cut."}
{"ts": "2026-05-27T20:18:50+01:00", "type": "verification", "status": "ok", "note": "MimirRuntime now queues sample-bearing AquariumStreamingAudioBlock lanes for actuator source buffers after publishing the control frame. Channel indices are derived from the bank-assigned Faust sourceN control path, so source disappearance does not reshuffle lanes. Mimir build passed; Fensalir tests prove declared blocks enter the streaming Faust DSP host."}
{"ts": "2026-05-27T20:28:43+01:00", "type": "verification", "status": "ok", "note": "Fensalir now publishes processed streaming Faust DSP output lanes as AquariumAudioStemFrame records through an engine-owned IAquariumAudioStemBus. Mimir declares deterministic aligned-source output stems when queuing faust/mimir_alignment_actuator.dsp, so processed actuator lanes have stable stem names before OBS-facing publication consumes them. Fensalir build and Aquarium.Engine.Tests passed; Mimir build and --audio-actuator-bank-smoke passed."}
{"ts": "2026-05-27T20:33:41+01:00", "type": "verification", "status": "ok", "note": "Mimir now has an OBS-facing stem publication state for the Fensalir Faust stem bus. It consumes AquariumAudioStemFrame records without copying audio, validates them against the alignment-actuator stem profile, reports ready/missing/unconfigured stems, and telemetry can print publication readiness. --audio-stem-publication-smoke passed; Mimir build passed."}
{"ts": "2026-05-27T20:55:23+01:00", "type": "verification", "status": "blocked", "note": "OBS stem plugin path is now chosen and scaffolded. Mimir publishes validated stem snapshots into a fixed Windows shared-memory ABI (Local\\\\MimirObsStemBus), and native/obs_stem_source defines the first libobs audio source plugin that reads one named stem and calls obs_source_output_audio. dotnet build and --obs-stem-shared-memory-smoke passed. Local native plugin build is blocked until an OBS/libobs SDK with libobsConfig.cmake is installed or supplied via libobs_DIR."}
{"ts": "2026-05-27T21:03:27+01:00", "type": "verification", "status": "ok", "note": "The OBS/libobs SDK is now staged locally through obsproject/obs-plugintemplate under artifacts/obs-sdk. Its CMake bootstrap downloaded obs-deps, Qt deps, and OBS 31.1.1 sources, built Debug/Release libobs development components, and installed libobsConfig.cmake under .deps/cmake. native/obs_stem_source configured with libobs_DIR plus CMAKE_PREFIX_PATH and built Release/mimir_obs_stem_source.dll successfully. Added scripts/build-obs-stem-plugin.ps1 to repeat the SDK staging/build."}
{"ts": "2026-05-27T21:26:51+01:00", "type": "verification", "status": "ok", "note": "native/obs_stem_source now registers both OBS sources: Mimir Audio Stem for Local\\\\MimirObsStemBus stem blocks and Mimir Program Texture for Fensalir's named shared D3D12 program output. The video source opens Global\\\\MimirFensalirProgramTexture, copies it GPU-to-GPU into an OBS-readable shared D3D11 texture during render, and draws it without CPU readback or Spout2. Mimir build and scripts/build-obs-stem-plugin.ps1 passed; Fensalir build passed after publishing the program texture back to COMMON for external readers."}
{"ts": "2026-05-27T21:29:19+01:00", "type": "verification", "status": "ok", "note": "Added scripts/install-obs-mimir-plugin.ps1 as the installation boundary for the native OBS plugin. It can build/copy mimir_obs_stem_source.dll into an OBS root's obs-plugins\\\\64bit directory, supports OBS_STUDIO_ROOT or -ObsRoot for portable installs, and -WhatIf verified the local standard OBS path without writing into Program Files."}
{"ts": "2026-05-27T21:30:23+01:00", "type": "verification", "status": "ok", "note": "The OBS plugin install path now uses OBS's plugin package layout under C:\\\\ProgramData\\\\obs-studio\\\\plugins by default instead of requiring writes to C:\\\\Program Files. scripts/install-obs-mimir-plugin.ps1 -SkipBuild installed mimir_obs_stem_source.dll to C:\\\\ProgramData\\\\obs-studio\\\\plugins\\\\mimir_obs_stem_source\\\\bin\\\\64bit, registering Mimir Program Texture and Mimir Audio Stem for the next OBS launch."}
{"ts": "2026-05-27T21:31:36+01:00", "type": "verification", "status": "ok", "note": "Installed Mimir OBS plugin was loaded by local OBS Studio 32.1.2 from C:\\\\ProgramData\\\\obs-studio\\\\plugins\\\\mimir_obs_stem_source\\\\bin\\\\64bit. A hidden launch/kill smoke produced OBS log line 'Mimir OBS sources loaded' and listed mimir_obs_stem_source.dll. OBS also warned that en-US text was missing for the module; locale packaging is cosmetic but should be cleaned before distribution. Live video rendering still needs an OBS scene source while Fensalir publishes Global\\\\MimirFensalirProgramTexture."}
{"ts": "2026-05-27T23:34:13+01:00", "type": "verification", "status": "ok", "note": "Live OBS program texture proof succeeded. With Mimir/Fensalir publishing Global\\\\MimirFensalirProgramTexture at 1264x681 and MIMIR_OBS_PROOF_VISUAL=1, OBS 32.1.2 loaded mimir_obs_stem_source.dll, the Mimir Program Texture source opened the shared texture, and the user visually confirmed the Fensalir debug/proof scene in OBS. The working bridge uses a legacy shared D3D11 texture because libobs accepts that handle path; D3D12 opens the same bridge texture and copies GPU-to-GPU from the Fensalir D3D12 program texture. This removes Spout2 and CPU readback from the program-video proof path while retaining the explicit D3D12-to-D3D11 boundary copy."}
{"ts": "2026-05-27T23:55:25+01:00", "type": "verification", "status": "ok", "note": "OBS program texture bridge now opens Fensalir's named D3D12 producer fence Global\\\\MimirFensalirProgramFence and the shared program texture Global\\\\MimirFensalirProgramTexture; live OBS 32.1.2 log showed producer fence value 1061 and texture 1264x681 while the proof visual appeared in OBS."}
{"ts": "2026-05-28T00:03:43+01:00", "type": "verification", "status": "ok", "note": "Optional OBS program texture ring proof passed: with FENSALIR_PROGRAM_OUTPUT_RING_COUNT=3, Fensalir published Global\\\\MimirFensalirProgramTexture.0/.1/.2 plus Global\\\\MimirFensalirProgramFence, and OBS 32.1.2 opened Mimir Program Texture at 1264x681 ring=3 with producer fence value 1149."}
{"ts": "2026-05-28T00:08:37+01:00", "type": "verification", "status": "ok", "note": "Fensalir program output now uses a dedicated shared publication fence instead of the private frame fence. Ring proof reran with FENSALIR_PROGRAM_OUTPUT_RING_COUNT=3; OBS opened Global\\\\MimirFensalirProgramFence at value 1252 and Global\\\\MimirFensalirProgramTexture ring=3 at 1264x681."}
{"ts": "2026-05-28T00:16:37+01:00", "type": "verification", "status": "ok", "note": "Two-way OBS program texture ring proof passed: OBS published Global\\\\MimirObsProgramConsumerFence, Fensalir opened that consumer fence, OBS opened Global\\\\MimirFensalirProgramFence at value 903 and the 1264x681 ring=3 texture set. Fensalir can now avoid reusing busy ring slots when the consumer fence is configured."}
{"ts": "2026-05-28T00:27:19+01:00", "type": "verification", "status": "blocked", "note": "Fresh complex-contour Scarlett proof 20260528-002313: ASIO loopback ch2->ch3 measured -0.062 us with 0.956 confidence and 257 direct hits, but physical inputs ch0/ch1 produced zero contour hits against 1480 reference hits. Physical mic proof is blocked on input signal/gain/routing/source placement, not receiver code."}
{"ts": "2026-05-28T08:09:07+01:00", "type": "verification", "status": "ok", "note": "Monitor-routed complex-contour Scarlett proof 20260528-080727: loopback ch2->ch3 measured -0.014 us at 0.971 confidence; physical Input 1/asio-ch0 landed -0.410 us from seed at 0.524 confidence with 24 direct hits; Input 2/asio-ch1 landed -2.467 us at 0.363 confidence with 14 direct hits. Previous 080604 run was headphone-routed by mistake and is marked as misroute witness."}
{"ts": "2026-05-28T08:14:31+01:00", "type": "observation", "status": "ok", "note": "Physical mapping for monitor-routed complex-contour proof: asio-ch0/Input 1 is the shotgun, about 1.5 m from right monitor and 3.0 m from left; asio-ch1/Input 2 is the cardioid, about 0.5 m from left monitor and 1.5 m from right. Geometry should be used when interpreting 20260528-080727 path delays."}
{"ts": "2026-05-28T08:20:48+01:00", "type": "verification", "status": "blocked", "note": "ASIO monitor split proof 20260528-081813 added --play-output-channel and captured output 0/output 1 separately. Loopback channels confirmed distinct ASIO output buffers, but physical mic delays were nearly identical across outputs (shotgun delta about 20.885 us; cardioid delta about 24.789 us), inconsistent with declared left/right monitor geometry. Downstream monitor routing/isolation must be verified before learning left/right acoustic paths."}
{"ts": "2026-05-28T12:06:53+01:00", "type": "implementation", "status": "ok", "note": "Fensalir now selects FieldEvidence AudioPath Phase/Confidence claims as DebugOverlay backend packets, so Mimir acoustic calibration constraints are planned rather than deferred. Mimir profile smoke now reports acousticPlanned=1 acousticDeferred=0; acoustic source volumes remain Phase 5 fusion work."}
{"ts": "2026-05-28T12:10:23+01:00", "type": "implementation", "status": "ok", "note": "Phase 5 synthetic audio-source proof added: Mimir lowers an SRP/PHAT-style localized source candidate with calibration/source identity and a world-space confidence envelope; Fensalir plans it as a FieldEvidence DebugOverlay packet. Live room geometry still needs an explicit coordinate frame before physical candidates become runtime truth."}
{"ts": "2026-05-28T12:13:46+01:00", "type": "implementation", "status": "ok", "note": "Phase 5 synthetic marker proof added: deterministic multi-camera marker candidates lower with calibration/marker identity and world-space support, and Fensalir plans them as FieldEvidence DebugOverlay packets. Ambiguous raw camera feature claims still defer."}
{"ts": "2026-05-28T12:14:54+01:00", "type": "implementation", "status": "ok", "note": "Rendering migration Phase 6 reconciled as structurally complete: OBS consumes final Mimir/Fensalir program surfaces and stems through the native plugin, with recorded live texture, ring, producer-fence, and consumer-fence proofs. Raw feeds remain debug inputs, not synchronization truth."}
{"ts": "2026-05-28T12:42:24+01:00", "type": "implementation", "status": "ok", "note": "TubeField demo now uses the reservoir/TAA guide path honestly: Fensalir's TubeField pixel shader writes stable field id plus real tube normals into metadata and coverage/confidence into reservoirGuide, so post resolve can validate history with the same spatiotemporal guide surfaces used by other field paths. Live synthetic spectrum demo log at artifacts/runtime/mimir-spectrum-reservoir-demo.log showed 4 planned TubeField packets, 0 deferred, 0 unplanned, 0 truncated."}
{"ts": "2026-05-28T12:58:22+01:00", "type": "implementation", "status": "ok", "note": "TubeField render now binds Fensalir's engine blue-noise texture and jitters the tube-local SDF sample inside the generated proxy fragment shader before writing coverage/normals/reservoir guide data. The pass also uses scene depth so opaque generated field geometry resolves by nearest surface instead of draw order. Live demo compiled and planned 4 TubeField packets with 0 deferred/0 truncated; screenshot still shows generated segment structure, so the final smooth tube marcher remains a renderer-quality cut."}
{"ts": "2026-05-28T14:00:43+01:00", "type": "decision", "status": "ok", "note": "Tube proof render now uses Blender 5.1 OCIO ACES 2.0 sRGB transform baked into Fensalir post, eight-octave Sonic Ether-style normalized bloom, and an explicit scene-state bit to disable studio background for dark proof scenes. Current proof capture is artifacts/runtime/mimir-single-tube-headless-aces2-sebloom-core-preserve.png; core/halo are close enough to continue, remaining deltas are capsule geometry/cap shading rather than tone-map authority."}
{"ts": "2026-05-28T14:17:52+01:00", "type": "implementation", "status": "ok", "note": "TubeField spectrum material now separates normalized material value from shaped Y amplitude: geometry still applies AmplitudePower for tube height, while radius, blackbody ramp coordinate, and emission use the normalized Catmull-Rom sample, so emission is normalized^2 * scale instead of a double-shaped value. Mimir now declares the live blackbody ramp from E:\\Projects\\Aetheria\\Assets\\Resources\\Gradients\\blackbody.png; spectrum upload smoke passes and the headless verification capture is artifacts/runtime/mimir-spectrum-dashboard-blackbody-material-fixed.png."}
{"ts": "2026-05-28T14:24:24+01:00", "type": "decision", "status": "ok", "note": "Mimir now consumes the Fensalir built-in blackbody ramp resource instead of declaring a project-local Aetheria absolute path; Fensalir owns the copied asset at Assets/Textures/Gradients/blackbody.png and exposes AquariumBuiltInFieldResources for client declarations."}
{"ts": "2026-05-28T15:07:14+01:00", "type": "decision", "status": "ok", "note": "Spectrum TubeField emission scale now drives high normalized blackbody-ramp samples hard enough to cross Fensalir's bright-pass bloom, while hue comes from the Fensalir built-in blackbody ramp and intensity comes from normalized amplitude squared."}
{"ts": "2026-05-28T19:09:40+01:00", "type": "correction", "status": "ok", "note": "Corrected the Fensalir reservoir authority wording: the shared spatiotemporal field reservoir is the rendering organ, while TubeField is only the current rolling-buffer tube claim/candidate producer. Mimir and Fensalir docs now explicitly forbid payload-specific paths from becoming private reservoir renderers or final composition authorities."}
{"ts": "2026-05-28T19:49:23+01:00", "type": "implementation", "status": "ok", "note": "Fensalir TubeField now feeds the shared field reservoir without device removal on the synthetic spectrum dashboard. The producer uses deterministic tile-local candidate enumeration for opaque primary tube visibility, cheap same-pixel temporal reuse, conservative compatible-neighbor spatial reuse, finite projection guards, explicit tile-count SRV binding, and first-frame reservoir clearing. Headless proof: artifacts/runtime/restir-spectrum-dashboard-deterministic-initial.png."}
{"ts": "2026-05-28T19:54:37+01:00", "type": "decision", "status": "ok", "note": "Recorded the Fensalir reservoir/TAA divergence: pure ReSTIR usually reuses lighting/path samples after primary visibility is known, while Fensalir often samples visible field candidates directly. Claim producers own local visibility candidate generation; the shared reservoir owns temporally reused field presentation; TAA remains only a pixel filter/denoiser, not the owner of field identity."}
{"ts": "2026-05-28T19:59:14+01:00", "type": "correction", "status": "ok", "note": "Promoted the reservoir/TAA decision: target architecture has no separate TAA organ. Claim producers generate local visibility candidates; the shared spatiotemporal reservoir plus reservoir resolve own temporal antialiasing, history validation, reconstruction, and temporally reused field presentation. Downstream pixel-history filtering cannot repair missing field identity."}
{"ts": "2026-05-28T20:28:02+01:00", "type": "implementation", "status": "ok", "note": "Fensalir field candidate inlet widened from hardcoded two-slot handling to a fixed four-slot resolver-owned budget per pixel. TubeField injection now replaces the worst shared candidate slot, reservoir resolve loops over all shared slots, and TubeField ReSTIR writes into the same generic inlet rather than selecting a private winner."}
{"ts": "2026-05-28T21:01:32+01:00", "type": "implementation", "status": "ok", "note": "Fensalir reservoir presentation history moved from single-sample pixel-history MRTs to ping-ponged structured reservoir-history buffers with four rows per pixel. Presentation resolve now reads current shared candidates plus previous structured history rows, validates by field id/travel/normal/coverage/reservoir guide, writes structured history rows, and outputs only final color to the backbuffer."}
{"ts": "2026-05-28T21:08:06+01:00", "type": "verification", "status": "ok", "note": "Structured reservoir history verified after root-signature cleanup: Fensalir and Mimir builds passed, --mimir-spectrum-upload-smoke passed, and headless D3D12 capture succeeded at artifacts/runtime/structured-reservoir-history-clean-root-smoke.png with renderTargets=25, confirming the old history MRTs are no longer allocated."}
{"ts": "2026-05-28T21:10:02+01:00", "type": "correction", "status": "ok", "note": "Corrected structured reservoir history admission so producer candidates use all four shared rows per pixel. Scene fallback only occupies row 0 when no shared candidate exists. Verified with Fensalir/Mimir builds, spectrum upload smoke, and headless capture artifacts/runtime/structured-reservoir-history-four-row-smoke.png."}
{"ts": "2026-05-28T21:25:00+01:00", "type": "implementation", "status": "ok", "note": "Fensalir reservoir history update/reuse now runs in a shared compute pass, not the presentation shader. The pass writes the next four structured rows per pixel and emits a resolved HDR field texture consumed by bloom/presentation. Verified with Fensalir and Mimir builds, --mimir-spectrum-upload-smoke, and headless synthetic spectrum capture artifacts/runtime/reservoir-history-compute-spectrum-smoke.png."}
{"ts": "2026-05-28T21:45:00+01:00", "type": "correction", "status": "ok", "note": "Noisy reservoir smoke traced to TubeField reuse/export, not Mimir packet lowering. Fensalir now re-evaluates shifted temporal/spatial TubeField samples at the receiving pixel and exports the best four deterministic current candidates into shared reservoir rows. Verified with Fensalir/Mimir builds, --mimir-spectrum-upload-smoke, and headless capture artifacts/runtime/reservoir-deterministic-top4-spectrum.png. Remaining dashboard busyness is many age-column tubes plus generated proxy segment structure, not fixed by smoke timing."}
{"ts": "2026-05-28T22:05:00+01:00", "type": "decision", "status": "ok", "note": "For many-hundreds-spline rendering, Fensalir stays on cheap segmented TubeField proxies rather than spline-wide SDF evaluation. The current cut fixes segment continuity by carrying consistent start/end radius pairs through generated proxy vertices and storing true start/end radii in compute segment packets. Verified with Fensalir/Mimir builds, --mimir-spectrum-upload-smoke, and headless capture artifacts/runtime/tubefield-cheap-continuity-spectrum.png."}
{"timestamp":"2026-05-29T01:46:00+01:00","type":"decision","status":"ok","note":"Fensalir TubeField spectrum rendering now uses rolling-buffer column packets as reservoir candidate authority rather than generated segment packets. Expansion emits one GPU-resident column packet per logical history/source column, ReSTIR evaluates Catmull-Rom SDF/material samples directly from the source buffer, and generated mesh draw args are zeroed for the live path. Verified through Mimir.App headless synthetic spectrum capture artifacts/runtime/mimir-column-packet-final-headless.png."}
{"ts": "2026-05-29T22:23:04+01:00", "type": "decision", "status": "ok", "note": "Raven display/audio sync uses shared clock-domain correction: Raven display frames can be tagged raven-sync, while Raven audio routed into Scarlett earns the timing offset applied by MimirSynchronizedBufferPlanner; network arrival timestamps remain metadata."}
{"ts": "2026-05-29T23:50:56+01:00", "type": "decision", "status": "ok", "note": "Fast stereo depth is mapped as a future Fensalir-owned D3D12 compute lane, with libSGM as permissive SGM provenance rather than a CUDA dependency. External TensorRT/monocular depth projects remain reference evidence only; live depth must consume Mimir-declared texture resources, calibration, and fences, then emit GPU disparity/depth/confidence resources and FieldEvidence claims."}
{"ts": "2026-05-29T23:52:11+01:00", "type": "decision", "status": "ok", "note": "Mimir Program panel now owns Fensalir presentation intent: video visibility/solo/opacity/layer filters production surface intents, audio mute/solo/gain feeds Faust controls and streaming samples, and LUT presets are typed postprocess state with exposure/bloom mapped to current GraphicsSettings until renderer LUT sampling lands."}
{"ts": "2026-05-30T00:21:36+01:00", "type": "implementation", "status": "ok", "note": "Added the first stereo-depth contract slice: MimirStereoDepthConfigurations names a non-dependency libSGM-provenance D3D12 SGM profile, compute/visual/module catalogs include stereo depth, and MimirFensalirFieldLowering.BuildStereoDepthCandidateFrame lowers synthetic rectified stereo depth into GPU-resident R16F disparity SurfacePage plus R8 confidence Texture2D and a Height FieldEvidence claim. Verified with --stereo-depth-contract-smoke and --perfect-machine-profile-smoke; actual HLSL/D3D12 SGM kernel remains future work."}
{"ts": "2026-05-30T00:29:32+01:00", "type": "implementation", "status": "ok", "note": "Stereo-depth FieldEvidence socket now declares its R16F disparity SurfacePage as compute-writable UnorderedAccess, matching Fensalir's new UAV-capable SurfacePage resolver. Verified Mimir build after shutting down stale build servers plus --stereo-depth-contract-smoke and --perfect-machine-profile-smoke; Fensalir focused test verifies UAV SurfacePage allocation/descriptors/reuse. The SGM HLSL kernels still remain future work."}
{"ts": "2026-05-30T00:30:23+01:00", "type": "decision", "status": "ok", "note": "MimirSceneEditorState now owns the Mimir-window editor graph: editor camera, source/text/model nodes, visibility, transform reset, grab/rotate/resize gizmo intent, and derived Fensalir spline/handle presentation. Smoke: --scene-editor-smoke. World SDF glyph rendering, ASSIMP mesh import/upload, and pixel-accurate gizmo hit-testing remain Fensalir renderer cuts."}
{"ts":"2026-05-30T00:38:19+01:00","type":"implementation","status":"ok","note":"Stereo-depth FieldEvidence now emits dispatch metadata, not just an output page. MimirFensalirFieldLowering declares synthetic rectified left/right Texture2D inputs, the UAV R16F disparity SurfacePage, the confidence texture, the Height claim, and an AquariumFieldStereoDepthLowering sidecar carrying profile, calibration, camera pair, inputs, output, disparity settings, and depth range. Verified with Mimir build, --stereo-depth-contract-smoke, --perfect-machine-profile-smoke, and Fensalir StereoDepth contract tests. The SGM HLSL kernel remains future work."}
{"ts":"2026-05-30T00:39:40+01:00","type":"decision","status":"ok","note":"Stereo-depth lowerer does not fabricate shared input handles. BuildStereoDepthCandidateFrame accepts caller-declared input resources, then emits the UAV disparity SurfacePage, confidence texture, Height claim, and AquariumFieldStereoDepthLowering sidecar that references those real texture resource keys. The BufferSmoke proof supplies synthetic input declarations only for contract validation."}
{"ts":"2026-05-30T00:44:38+01:00","type":"decision","status":"ok","note":"Fensalir now owns stereo-depth dispatch readiness accounting before the SGM kernel exists: it only counts a lowering ready when the Height claim is planned and left/right textures plus the UAV disparity SurfacePage resolve. Mimir remains responsible for real input texture resource identity; no placeholder depth output is written."}
{"ts":"2026-05-30T00:48:04+01:00","type":"implementation","status":"ok","note":"Stereo-depth profile/candidate/lowering now carries SGM constants through Mimir into the Fensalir sidecar: min disparity 0, 128 disparities, four aggregation paths, census radius 2, P1 8, and P2 96 for the libSGM-provenance D3D12 profile. Verified Mimir build, --stereo-depth-contract-smoke, and --perfect-machine-profile-smoke."}
{"ts":"2026-05-30T21:58:00+01:00","type":"implementation","status":"ok","note":"Mimir now lowers live Leap packed stereo IR into the stereo-depth FieldEvidence lane. MimirRuntime merges a Leap depth frame when a live LeapStereoIr rolling window has a declared GPU texture resource; BuildLeapPackedStereoDepthCandidateFrame treats the packed R8G8 texture as left/right resource identity with R/G observation lanes, emits the pending-calibration Height claim, UAV R16F disparity SurfacePage, R8 confidence texture, and AquariumFieldStereoDepthLowering sidecar. Verified with Mimir build, --leap-packed-stereo-depth-smoke, and --stereo-depth-contract-smoke."}
{"ts": "2026-05-30T22:01:42+01:00", "type": "implementation", "status": "ok", "note": "Self-hosted Mimir live edge has a deployed origin proof. Mimir.Broadcast builds the Starfire FFmpeg/NVENC RTMP push to rtmp://127.0.0.1:11935/live/mimir through an SSH local forward; Yggdrasil nginx now has libnginx-mod-rtmp, localhost RTMP ingest, /srv/mimir-live/hls, and a live.mimir.gamecult.org HTTP vhost with CORS for mimir.gamecult.org. An eight-second synthetic NVENC push on 2026-05-30 generated mimir.m3u8 and four TS segments on Yggdrasil. Public DNS/TLS for live.mimir.gamecult.org remains the activation blocker."}
{"ts": "2026-05-30T22:04:09+01:00", "type": "verification", "status": "ok", "note": "Yggdrasil target-host fanout smoke ran during an active Starfire synthetic NVENC push through the SSH RTMP tunnel. With LIVE_URL pinned to localhost via curl --resolve, the benchmark fetched a live HLS segment from nginx 320 times with CLIENTS=16 and REQUESTS_PER_CLIENT=20 in 1256 ms. wrk is not installed yet, so p95 latency remains future instrumentation."}
{"ts": "2026-05-30T22:18:07+01:00", "type": "decision", "status": "ok", "note": "Viewer authority moved to root gamecult-site at https://gamecult.org/livestream. Mimir no longer owns a static live viewer page; Mimir.Broadcast remains the Starfire sender, and Yggdrasil serves HLS through the existing StreamPixels TLS route https://streampixels.gamecult.org/mimir/live/hls/mimir.m3u8. The deployed StreamPixels nginx route health check returned mimir-live-ok, and an active synthetic NVENC push generated playlist/segments served publicly through StreamPixels; curl fallback benchmark fetched 320 segment requests in 6756 ms over HTTPS from Yggdrasil."}
{"ts": "2026-05-30T22:45:01+01:00", "type": "decision", "status": "ok", "note": "Added Raven/Eve ingest setup: ffmpeg-rawvideo runtime source decodes SRT feeds into Mimir video samples; raven-display listens on 5200, eve-camera on 5201; Raven desktop sender script uses gdigrab plus NVENC. Eve receiver lane exists but the iPad camera producer remains an explicit AVFoundation/external-app decision."}
{"ts": "2026-05-30T22:46:17+01:00", "type": "verification", "status": "warn", "note": "Raven/Eve ingest host probe: Eve SSH is reachable and reports iPadOS Darwin 20.3.0, but /var/mobile/Projects/Eve only contains the receiver/control app sources and no ffmpeg/avcapture helper was found. Raven SSH with the recorded key still fails publickey authentication, so Raven screen capture is prepared as a desktop-run script until SSH authority is repaired."}
{"ts": "2026-05-30T22:53:29+01:00", "type": "decision", "status": "ok", "note": "Leap dense geometry now has a Mimir-side point-cloud root: live Leap packed stereo lowers to R16F disparity, and Mimir declares a derived GPU FieldMesh PointList resource that plans as a Mesh backend packet. This is a typed socket only; Fensalir still owns D3D12 vertex generation, editor draw, and global residual/calibration ownership."}
{"ts": "2026-05-30T23:05:53+01:00", "type": "implementation", "status": "ok", "note": "EveCanvas now owns Eve sensor uplink: AVFoundation camera frames are JPEG frame-events to ws://Starfire:8793/eve/camera and AVAudioEngine mic blocks are Float32 audio-block events to ws://Starfire:8794/eve/mic. Mimir.EveSensorReceiver validates those WebSocket frame-events and emits JSON lines for the existing frame-events runtime adapter; raven-eve config now wires eve-camera and eve-mic through it."}
{"ts": "2026-05-30T23:07:16+01:00", "type": "verification", "status": "ok", "note": "Raven/Eve runtime config smoke ran for 1s with MIMIR_RUNTIME_CONFIG=config/mimir-runtime.raven-eve.example.json. It started Focusrite ASIO plus raven-display/eve-camera/eve-mic sources after fixing command resolution so bare PATH commands like ffmpeg are not resolved under config/. With no senders active, ASIO ingested 7120 samples across 4 channels and network sources remained empty as expected."}
{"ts": "2026-05-30T23:14:23+01:00", "type": "verification", "status": "ok", "note": "Fensalir branch codex/leap-packed-depth now has the first D3D12 point-cloud render lane for Mimir's Leap mesh socket: derived-from SurfacePage meshes allocate UAV-capable buffers, point vertices/indices are generated from disparity, and the point list renders through scene candidate targets. Verified Fensalir engine/client builds, stereo/resize tests, headless pipeline capture, and Mimir BufferSmoke rebuild against the updated contracts."}
{"ts": "2026-05-31T00:47:41+01:00", "type": "verification", "status": "warn", "note": "Eve dialogue probe: added Mimir.EveDialogue and EveCanvas dialogue/ack handling. Eve host reached Starfire dialogue /health on 192.168.1.66:8792, proving network path. EveCanvas binary contains dialogue code and builds on-device, but launching via uiopen or SSH did not open /stream; remaining blocker is foreground/SpringBoard app activation or observing/accepting the UI on the iPad, not Starfire reachability."}
{"ts": "2026-05-31T01:03:07+01:00", "type": "verification", "status": "ok", "note": "Eve dashboard proof: EveCanvas rendered the native dashboard on device from Mimir.EveDashboard snapshots, showing scene graph/source panels and transform controls. A command smoke moved eve-camera and received version 2 state. Screenshot exposed legacy debug overlay occlusion; EveCanvas now hides the debug overlay while dashboard mode is active."}
{"ts": "2026-05-31T01:06:44+01:00", "type": "verification", "status": "ok", "note": "Live Leap surface-claim proof captured artifacts/runtime/mimir-leap-surface-claims-clean.png. With AQUARIUM_DISABLE_RESERVOIR_HISTORY=1, Fensalir now presents the current reservoir resolver target instead of an unwritten history target; LeapUVC frames uploaded through the Fensalir-owned D3D12 texture, packed stereo depth dispatched, point-cloud compute generated 19,200 SDF/PBR/radiosity surface splats, point-list rendering stayed diagnostic at rendered 0, and visible Leap-derived splats reached presentation."}