Commit Graph

24 Commits

Author SHA1 Message Date
HMS MediaEngine Agent cbe1360aaa Native Renderkern: Rust/GStreamer-Plugin nach ADR-0004 (996 Zeilen)
- Cargo.toml: gstreamer-rs 0.22, windows-rs 0.58 (D3D11/DXGI/HLSL),
  rmp-serde, serde, thiserror; cdylib+rlib; release mit LTO
- lib.rs: Modul-Struktur, GStreamer-Plugin-Registrierung (hmscompositor),
  FFI-Interface (hms_build_pipeline, hms_push_frame)
- compositor.rs: alle 9 Blend-Modi (§12.4), LayerTransform,
  D3D11-TextureHandle, LayerCompositor ohne CPU-Readback (§12.6)
- shader_loader.rs: HmsParams-cbuffer nach §14.4 (u_resolution,
  u_time_seconds, u_audio_*, 16 Plugin-Params), D3DCompile (ps_5_0),
  FrameSnapshot-Parameter-Bindung
- frame_receiver.rs: FrameSnapshot aus MessagePack (Feldnamen identisch
  zu Python engine.py), Thread-sicher
- pipeline_builder.rs: d3d11h264dec -> d3d11convert -> hmscompositor ->
  d3d11videosink (§13.1)
- README.md: Windows-Build-Anleitung, Python-Integration (ctypes)
- Nicht kompiliert (ADR-0008: kein cargo im Container); zwei
  Pruefpunkte fuer Windows-Durchlauf dokumentiert:
  SimpleElement-Subklasse, D3DCompile-Signatur
2026-09-11 08:37:06 +02:00
HMS MediaEngine Agent 73da76f44a Renderer-Engine: Sync->Advance->Snapshot-Kette (§12, §11.4, §29.2)
- RenderEngine: orchestriert alle Quellen pro Frame mit fester
  Master-Bildrate (§12.2): Sync aus StateMirror, Playback-Advancement,
  unveraenderlicher FrameSnapshot, Telemetry (§28.2)
- SourceHandle: verbindet PlaybackController + PreloadSlot +
  Parameterpfade; Transport (Play/Pause/Stop/Retrigger) aus Mirror;
  Clip-Wechsel atomar ueber Preload/Commit (§12.2, §16.5)
- FrameSnapshot: unveränderlich pro Frame (§11.4): Parameter,
  Positionen, Transport-Zustaende, aktive Assets; halbe Zustaende
  ausgeschlossen
- RenderTelemetry: Frame-Index, FPS, Framezeit, aktive Layer,
  pending Preloads, Events (§25.4, §28.2)
- TransportState-Mapping: int-Werte 0/1/2 aus Mirror auf Enum
- 9 Unit-Tests: Frame-Snapshots, Play-Command, Positions-Advancement,
  atomarer Asset-Wechsel, Retrigger, Snapshot-Unveränderlichkeit,
  Telemetry, Multi-Source-Speed, Stopped-Verhalten
- Gesamtsuite 595 gruen, Ruff gruen
2026-09-11 08:34:13 +02:00
HMS MediaEngine Agent 2b1e6af6c0 Phase 7: Audio-Analyse und Mapping-Engine (§20)
- AudioFeatures: Peak, RMS, FFT-Spektrum, Bass/Low-Mid/Mid/High-Mid/
  Treble, Spectral Flux, Beat, BPM, Beat-Phase, Confidence,
  Stilleerkennung; timestamped mit monotoner Zeitbasis (§20.2, §20.3)
- BeatDetector: adaptiver Schwellwert ueber Flux-Fenster, Mindestabstand,
  BPM-Median ueber Inter-Beat-Intervalle, Sentinel-Fix fuer ersten Beat
- RingBuffer: begrenzter Kreisring statt unkontrollierter Queues (§20.3,
  §33)
- AudioBinding (§20.4): Gate/Threshold, Normalisierung, Gain, Kurve
  (linear/quadratic/cubic/exponential), Attack/Release, Min/Max
- Modulatoren ohne Audio (§20.5): LFO Sine/Triangle/Saw/Square,
  Random mit Seed (deterministisch), Step Sequencer BPM-synchron
- ModulatorEngine: verwaltet Audio-Bindings und Modulatoren;
  Ergebnisse ueber Parameter-Engine mit AUDIO-Prioritaet 6 (§11.2)
- 29 Unit-Tests: RMS/Peak, RingBuffer-Kapazitaet, FFT-Peak-Frequenz,
  Band-Energie, Flux, BPM-Recovery (120 BPM), Min-Interval,
  Silent-Tone-Analyse, Kurven, Binding-Pipeline, LFO-Periodizitaet,
  Random-Seed-Determinismus, Sequencer-Cycling
- Gesamtsuite 586 gruen, Ruff gruen
2026-09-11 03:19:38 +02:00
HMS MediaEngine Agent 82c79ec485 Phase 5: Projekt-/Media-/Plugin-API im Control Core (§23.1, §13.3)
- Projekte: CRUD + Activate (State-Store-Revision), §23.1/§24.2
- Medien: Import mit Duplikaterkennung (§13.3), Liste mit
  Missing-Markierung (§13.2)
- Plugins: Listing nach Lifecycle-Status gruppiert (§14.5),
  Enable mit Lifecycle-Advancement, 404 bei unbekanntem Plugin
- Art-Net-Status-Endpunkt (§23.1)
- Diagnostics erweitert um State-/Projekt-Revisionen (§28.2)
- Commands schreiben jetzt auch in den State-Store (§6.4)
- SQLite check_same_thread=False für FastAPI async handlers
- python-multipart für UploadFile hinzugefügt
- Discovery-Fix: Builtin-Plugins nach Kategorie-Unterverzeichnissen
  (generators/, filters/) durchsuchen statt nur Direktkinder
- 8 neue Integrationstests: Projekt-CRUD-Roundtrip, Activate,
  Media-Import mit Duplikat, Plugin-Listing (10+14 verifiziert),
  Enable-404, Diagnostics-Revisionen
- Gesamtsuite 557 grün, Ruff grün
2026-09-11 03:13:43 +02:00
HMS MediaEngine Agent bae05ea8ad STATUS: Phase 5 Basis-Workspace dokumentiert 2026-09-11 03:03:13 +02:00
HMS MediaEngine Agent c6a3cf7751 Phase 5: Web-Bedienoberfläche nach §17 (React+Vite, ADR-0006)
- ADR-0006: React 18/19 mit Vite im statischen SPA-Modus
- Workspace §17.2: Statusleiste 32px, einklappbare Werkzeugleiste,
  Layer-Tabelle, Inspector ~30% mit Divider-Resize, umschaltbare
  rechte Seitenleiste, Fußleiste mit Setup/Live-Lock
- Layer-Tabelle §17.3: alle 10 Pflichtspalten, Zeilen 30px,
  7 unterscheidbare Zustände (Glyph+Farbe+Text, nie nur Farbe),
  Pfeiltasten-Navigation, Opacity-Fader mit echtem parameter.set
- Inspector §17.4: 7 Tabs, Zahlenfelder mit Tippen/Ziehen/Pfeiltasten,
  Release-Befehl, Live-Lock sperrt Struktur
- Design-Tokens §17.6: alle als CSS-Variablen (Flächen, Text,
  Akzent-Blau, Zustandsfarben, 4px-Raster, 2-4px Radien,
  Monospace tabular-nums, 100-180ms)
- WebSocket: Snapshot bei Connect, Deltas danach, Reconnect
  1s/2s/4s max 30s; Browser-Neustart stoppt Output nicht (§3.2)
- REST: health/identity/cluster-nodes/parameters/diagnostics,
  Commands mit expected_revision + Revert bei 409
- Kein GO-Button, keine Standby-Anzeige, keine Cue-Carts (§17.1)
- Build: tsc strict + vite, 27 Module, 262KB JS gzip 80KB
- Python-Suite 549 grün unberührt
2026-09-11 03:02:38 +02:00
HMS MediaEngine Agent 423bd00b4e Phase 4 abgeschlossen: Patch-Verwaltung und DMX-Verkabelung (§16.2, §11)
- FixturePatch: Layer-Fixtures mit 64-Kanal-Adressen, Validierung
  (UUIDs, Universe-Grenzen, keine Überlappung), 8 Layer = 1 Universe,
  Master-Overlap-Prüfung, CSV-Export nach §16.2 (Node-ID, Short Name,
  IP, Universe, Startadresse, Layernummer, Fixture-Version)
- PatchEntry: stabile UUID-basierte Layer-/Kompositions-IDs (§10.2)
- DmxToParameterRouter: DMX → Patch → Master32/Layer64 → ParameterEngine
  - Master-Blackout mit SAFETY-Priorität (§11.2), Release beim Aufheben
  - Load/Commit-Events erzeugen pending_loads für Renderer-Preload (§16.5)
  - Signalverlust: HOLD (keine Änderung) oder FADE_TO_BLACK (SAFETY)
  - Layer-Flankenzustand je Instanz; Telemetrie (Updates, Commits, Blackouts)
- 17 Integrationstests ohne Mocks: Adressvalidierung, Überlappungen,
  8-Layer-Voll-Universe, CSV-Export-Felder, Blackout-SAFETY-Release,
  Load/Commit-Kette, Signalverlust-Policies
- Gesamtsuite 549 grün, Ruff grün
2026-09-11 02:18:00 +02:00
HMS MediaEngine Agent 4e15fe9d47 STATUS: Phase 3 abgeschlossen, Phase 4 Fixture-Engine dokumentiert 2026-09-11 02:07:43 +02:00
HMS MediaEngine Agent abffff3711 Phase 4: Fixture-Engine Master32/Layer64 (§16.2–§16.6)
- Master32Engine: 32-Kanal-Dekodierung: 16-Bit Intensitaet/BPM/Dauer,
  Blackout (hoechste Prioritaet), Freeze, Preset Bank/Index,
  Flanken-Trigger Preset Recall/Tap Tempo/Release, Audio/AI-Freigabe,
  Testpattern, Global Hue/Sat, Fallback; reservierte Kanaele neutral
- Layer64Engine: 64-Kanal-Dekodierung: Enable, 16-Bit Opacity,
  Source-Type Media/Generator/Solid/Live, modusabhaengiger Source-Block
  (Kanal 13-20: Media=Speed/Position/In/Out, Generator=G1-G8),
  Transport-Enum, Blend, 16-Bit signed Position, Scale, Rotation,
  Crop, Color, FX1/FX2 mit P1-P8, Load/Commit-Semantik mit pending
  selection (§16.5: Fader bewegt nichts ohne Flanke), Retrigger
- map_speed (§16.6): Mittelpunkt=Pause, untere Haelfte -4x..0,
  obere 0..+4x, definierter Wert 40960 = exakt 1x; monoton,
  dokumentiert und getestet (Fehler im ersten Entwurf korrigiert:
  32768 war faelschlich 1x statt Pause)
- UniversePlan: kollisionsfreie Bereiche je Node, Ueberschneidung
  = Blocker-Fehler (§16.2), Preflight-Check
- 26 Unit-Tests: Speed-Referenzwerte/-Monotonie, Master32-Kanaele,
  Trigger-Flanken, reservierte Kanaele, Layer64-Modi, Load/Commit,
  Retrigger, FX-Bloecke, Universe-Kollisionen; 8x64=512-Verifikation
- Gesamtsuite 532 gruen, Ruff gruen
2026-09-11 02:06:58 +02:00
HMS MediaEngine Agent 985f156525 Phase 3: Plugin-SDK-Dokumentation (docs/plugin-sdk/, 7 Dateien)
- README: Pluginarten, Verzeichnisstruktur, Quick Start (§14.1/§14.2)
- manifest-reference: komplette plugin.json-Feldreferenz mit
  Validator-Regeln und ZIP-Sicherheit (§27.2)
- shader-contract: Standard-Uniformsatz je Backend, cbuffer-Layout,
  16-Byte-Alignment, Multipass, AQ-Bindung, GLES-Einschraenkungen (§14.4)
- parameters-and-dmx: dmx_slots max 8 (§14.7), Kurven, 16-Bit-Werte,
  gemeinsamer Effektvertrag mix/blend/quality (§14.8)
- lifecycle: Zustandsmaschine, Quarantaene, Show-Lock (§14.5/§26.3)
- adaptive-quality: Varianten, Semantik-Erhalt, Kompilierung vor
  Aktivierung, Framegrenzen-Wechsel (§5.2)
- example-walkthrough: komplettes Filter-Plugin anhand vignette
- 1199 Zeilen, Deutsch, alle Beispiele aus echten Repo-Dateien
2026-09-11 01:57:30 +02:00
HMS MediaEngine Agent 75ca88ddbe Phase 3: Alle 24 Pflicht-Plugins (10 Generatoren + 14 Filter, §15.1/§15.2)
- 10 Generatoren mit Manifest + HLSL + GLSL + GLES je Plugin:
  solid, gradient, checker_grid, stripes_chaser, noise_clouds
  (AQ Octaves 2/3/5), plasma, wave_bars, shapes, drops_ripples,
  starfield (AQ 32/128/512 Partikel)
- 14 Filter mit Manifest + Shader je Backend:
  transform2d (keine AQ-Geometriereduktion), color_adjust,
  gradient_map, blur_sharpen (separabel 2-Pass, AQ 5/9/17 Samples),
  pixelate_quantize, mirror_tile, kaleidoscope, wave_displace
  (Noise adaptiv, Amount unverändert), rgb_split, glow_bloom
  (Kaskade 2/4/8), edge_emboss, vignette, strobe_pulse (Safety
  clamp 2 Hz, nie durch DMX allein freischaltbar), feedback_trails
  (Double-Buffer, Clear-Trigger, §15.3)
- Uniform-Vertrag §14.4 in allen 75 Shadern; Generatoren sampeln nie
  u_input_texture; alle Filter mit mix-0-Bypass (§15.3)
- 195 parametrisierte Plugin-Tests: Manifest/Backends/DMX-Slots<=8/
  AQ>=3 Varianten/Uniform-Satz/Vollstaendigkeit exakt 10+14
- Nachtraegliche Manifest-Fixes: AQ-Bloecke fuer 4 1-Pass-Filter,
  mix-Parameter fuer feedback_trails (Slot-Overlap vermieden)
- Gesamtsuite 506 gruen, Ruff gruen
2026-09-11 01:53:48 +02:00
HMS MediaEngine Agent b4c4f214d3 Phase 3: Plugin-Lifecycle-Manager (§14.5, §14.6, §26.3)
- Zustandsgraph discovered->validated->installed->enabled->compiled->active
  mit quarantined/incompatible/disabled; nur definierte Kanten
- discover(): scannt Plugin-Verzeichnis, validiert Manifest + Shader,
  quarantiniert Ungueltiges mit dokumentierter Ursache (kein stiller
  Fehler, §33); Projekt bleibt nutzbar (§3.5)
- Show-Lock (§26.3): Installation/Update gesperrt; Aktivieren bereits
  installierter Plugins erlaubt (§17.7 Live); Versionswechsel geblockt
- Update ohne Lock: neuer Zyklus ab VALIDATED
- Backend-Kompatibilitaet: Schnittmenge entrypoints & supported_backends
- 14 Unit-Tests (Discovery, Happy Path, Sprung-/Ruecksprung-Verbot,
  Quarantaene mit Ursache, Show-Lock-Blockaden, Versionsupdate, Backends)
- Gesamtsuite 311 gruen, Ruff gruen
2026-09-11 01:37:47 +02:00
HMS MediaEngine Agent b2610e35e5 Phase 2 abgeschlossen: Renderer-State-Sync über echte IPC (§6.2, §6.4)
- RemoteStateMirror (Renderer): Snapshot-Pflicht nach (Re-)Connect,
  Deltas mit neu/geaendert/geloescht, Deltas vor erstem Snapshot werden
  abgelehnt (Re-Sync), Duplikate/Veraltete idempotent
- RendererStateLink (Control Core): connect_and_sync mit Pflicht-Snapshot,
  sync_if_changed versendet Deltas seit letzter gesendeter Revision,
  Reconnect loest immer neuen Snapshot aus (kein halber Zustand)
- End-to-End-Integrationstests ueber echtes TCP-Loopback ohne Mocks:
  Snapshot->Delta-Kette, Reconnect-Re-Sync, Delta-vor-Snapshot-Ablehnung,
  Duplikat-No-Op
- Gesamtsuite 297 gruen, Ruff gruen
2026-09-11 01:33:47 +02:00
HMS MediaEngine Agent cc119d3751 Phase 2: State-Sync-Fundament – State-Store, Gruppen, Clock, Aktivierung
- ProjectStateStore (§6.4, §24.2): monotone State-/Projekt-Revisionen,
  Snapshot nach Verbindung, Delta mit neu/geaendert/geloescht,
  Szenenabruf als Zielzustand (Uebergang macht der Renderer, §18.1),
  Projekt-/Livezustand strikt getrennt
- GroupRouter (§6.3, §10.1): Ziele All/Node/Output/ServerGroup,
  Regeln selected/tag_query/all, Commit-Vorschau (§17.5)
- ClockEstimator (§6.4): RTT-Min-Filter (<=2x Min gegen Jitter),
  Offset-/Drift-Schaetzung (Drift erst ab 1 s Fenster belastbar),
  Showzeit -> lokale Node-Zeit
- ActivationCoordinator (§6.5): zeitgestempelte Preset-Aktivierung,
  200 ms Vorlauf, Arm/Execute/Ack-Kette, FAILED bei fehlender
  Arm-Bestaetigung (kein stilles Ueberbruecken)
- 35 neue Unit-Tests; Gesamtsuite 293 gruen, Ruff gruen
2026-09-11 01:31:26 +02:00
HMS MediaEngine Agent d24fe3a963 Phase 2: Medien-Engine – Transport, Preload, Library, Content-Manifest
- PlaybackController (§12.5): Play/Pause/Stop/Retrigger, Loop/Once/
  Ping-Pong mit In/Out-Fenstern, variable Geschwindigkeit ±4x (§16.6),
  Ende-Ereignis genau einmal je Pass, monotone Ereignis-Zeitbasis (§12.2)
- PreloadSlot (§12.2): atomarer Clipwechsel preload->ready->commit;
  nicht bereites Medium wechselt nie (Policy beim Aufrufer)
- MediaLibrary (§13.2/§13.3): Import mit SHA-256-Duplikaterkennung,
  Bank-Slots als explizite Show-Metadaten, fehlende Dateien markiert,
  Relink; Import laeuft im Control-Core-Worker, nie im Renderthread
- ContentManifest (§6.4/§10.1): SHA-256 je Datei + resumierbare
  Chunk-Hashes, Verifikation gegen Veraenderung, Diff fuer Sync-Plan,
  deterministische Serialisierung mit Revision
- 35 neue Unit-Tests; Gesamtsuite 258 gruen, Ruff gruen
2026-09-11 01:25:23 +02:00
HMS MediaEngine Agent 402ff7268c Phase 2: Domänenmodell nach §10.1 (plattformneutral, Pydantic)
- Project/Composition/Layer/Source/EffectInstance/MediaAsset/OutputSurface/
  PresetScene mit schema_version 1 (§10, §24.4)
- Validierungen: 2 Effekt-Slots (§4.1), eindeutige Layer-IDs/Z-Reihenfolge,
  max 64 Layer, in<out-Punkte, speed ±4x (§16.6), portable relative Pfade
  ohne Traversal (§9.1), eindeutige Asset-Pfade (§13.3), Canvas-Bounds bis
  8192 (§3.3), Adjustment/Group ohne Quelle (§12.3)
- OutputSurface mit Canvas-Slice-Modell (§22.2 Mapping-Datenmodell ab V1)
- PresetScene: normalisierter Snapshot + Übergänge V1 (§18.1, §18.3)
- keine Backend-Typen im Modell (§12.6)
- 24 Unit-Tests; Gesamtsuite 223 gruen, Ruff gruen
2026-09-11 01:15:11 +02:00
HMS MediaEngine Agent e4e76a7ede Phase 1 abgeschlossen: Node-Identitaet in Control Core verkabelt (§3.6, §6.3)
- NodeIdentity/NodeRole in hms_domain: persistente node_id aus
  userdata/identity, Rollen RENDER_NODE/COORDINATOR/CONTROL_DESK,
  plausible Kombinationen validiert, keine Auto-Leader-Wahl (§6.3)
- Control Core: create_app(identity) injizierbar; Dev-Modus ephemeral;
  Registry registriert eigene Node; neue Endpunkte /system/identity
  (ohne Secrets, §27.1) und /cluster/nodes (UI-Kategorien §6.3)
- 16 neue/aktualisierte Integrationstests; Gesamtsuite 199 gruen
2026-09-11 01:10:49 +02:00
HMS MediaEngine Agent c4574927fd Phase 1: Cluster-Fundament – Nachrichten, Registry, Paarung, Discovery
- hms_cluster: ClusterMessage (§6.5: Pflichtfelder, Sequenzen, Revisionen,
  execute_at, Trace-ID), CommandTracker (idempotent, vorwärts-only:
  accepted->armed->executed/failed)
- NodeRegistry: online/degraded/stale/offline über Schwellen, UI-Kategorien
  discovered/paired/unknown/incompatible/offline, Doppel-Node-ID blockiert,
  IP-Wechsel erhaelt node_id (§6.3, §6.5)
- Pairing: PIN (TTL 120s, Versuchslimit), Fingerprint (SHA-256 gruppiert),
  Token nur als Hash, Scopes read/control/content_sync/admin, Ablauf +
  sofortiger Widerruf (§6.3, §27.1, ADR-0010)
- Discovery-Modell: _hmsmedia._tcp.local. TXT ohne Secrets, Capability-
  Digest, persistente manuelle Fallback-Liste (ADR-0009)
- ADR-0009 (mDNS + Fallback) und ADR-0010 (Paarung) dokumentiert
- 25 Unit-Tests; Gesamtsuite 183 Tests gruen, Ruff gruen
2026-09-11 01:06:26 +02:00
HMS MediaEngine Agent 80dc10de22 Phase 1: Supervisor/Launcher mit Prozessüberwachung (§6.1A, §26)
- Supervisor: echte Kindprozesse, portable Umgebung, freie Portwahl
- Kontrolliertes Beenden: terminate -> wait -> kill mit Recovery-Markierung
- Restart-Policy mit Crashloop-Erkennung (Zeitfenster-Schwelle)
- Recovery-Marker: forced-kill wird persistent dokumentiert (§26.4)
- 10 Tests mit echten Prozessen (keine Mocks): Start/Stop, Crash-Restart,
  Crashloop, SIGTERM-resistenter Prozess, Environment-Vererbung
2026-09-11 00:54:45 +02:00
HMS MediaEngine Agent de7d1a840f Phase 1: SQLite-Persistenz (WAL, Migrationen, Backup, Integritätscheck)
- hms_persistence: Database-Klasse nach §24
- WAL-Modus, Foreign Keys, kurze Transaktionen, Busy-Timeout
- Migrationen mit Backup vor Schemaänderung (§24.4)
- Integritätscheck beim Öffnen (§24.1)
- Projekt-/Einstellungs-/Plugin-Status-CRUD
- 18 Unit-Tests inkl. Altdaten-Migration und Reopen-Roundtrips
2026-09-11 00:52:27 +02:00
HMS MediaEngine Agent 34dc112fa0 Cleanup: IPC-Peer-Daten speichern, Ruff-Fixes 2026-09-11 00:50:55 +02:00
HMS MediaEngine Agent 9536e08748 Phase 1: IPC-Verbindungsschicht + Build-first-Strategie (ADR-0008)
- ADR-0008: Build-first, gesammelte Windows-Validierung (Auftraggeber-Freigabe)
- ADR-0004 vorläufig: Rust auf GStreamer-D3D11-Elementpfad
- ADR-0005 vorläufig: Nuitka Onefolder
- hms_protocol: IpcServer/IpcClient mit Handshake (hello/welcome),
  Capabilities-Austausch, Heartbeat 500 ms bidirektional, Snapshot/Delta,
  Loopback-only-Enforcement, Re-Sync nach Reconnect, Version-Mismatch-Fehler
- 9 Integrationstests: echter TCP-Loopback, kein Mock
2026-09-11 00:50:03 +02:00
HMS MediaEngine Agent b0599d8b86 Dokumentation: verifizierte Testergebnisse eintragen (121 Tests, Ruff grün) 2026-09-11 00:37:23 +02:00
HMS MediaEngine Agent 0922cc1d68 Phase 0: Repository-Initialisierung nach Bauplan v1.2
- Struktur gemäß §8 (Eigentumsgrenzen), PLAN.md als normative Basis
- Pflichtdokumente: STATUS.md, ERRORS.md, TEST_REPORT.md, CHANGELOG.md, ADRs
- ADR-0001 Python 3.13-Pin, ADR-0002 GStreamer 1.28.6-Pin (Windows),
  ADR-0003 IPC TCP+MessagePack v1
- Kernpakete: hms_protocol, hms_domain, hms_parameter, hms_artnet,
  hms_adaptive, hms_capabilities, hms_plugin_sdk
- Renderer-Spike: D3D11-Primärpfad + Dev-GL-Pfad (§36 Nr. 4-5)
- Control Core: FastAPI REST + WebSocket (§36 Nr. 9)
- Beispielplugins: Passthrough + Gaussian Blur (3 Adaptive-Quality-
  Varianten, HLSL/GLSL/GLES)
- Tools: Art-Net-Emulator, Fixture-Generator (Master32/Layer64-CSV),
  Capability-Probe
- JSON-Schemas: IPC, Plugin, Projekt, Cluster
- 121 Unit-/Integrationstests grün, Ruff grün

Gate 0 bleibt offen: Hardwaremessungen nur auf echter Windows-Referenz-
hardware gültig (§29.7, §33).
2026-09-11 00:36:59 +02:00