HMS MediaEngine Agent
696e8eb1b3
PORTABLE INSTALLATION: umgeht 16-GB-Pruefung von macOS Installer.app
...
URSACHE GEFUNDEN: macOS Installer.app verlangt 10-16 GB freien
Speicher als SYSTEMRESERVE - obwohl GStreamer nur 146 MB gross
ist. Diese Pruefung blockiert Installationen auf vollen Platten.
LOESUNG: HMS-Portable-Install.command
- Laedt GStreamer .pkg (146 MB) per curl
- Entpackt mit 'pkgutil --expand-full' OHNE Installer.app
(keine 16-GB-Pruefung, kein sudo, nichts systemweit)
- Kopiert GStreamer.framework in runtime/ im Projektordner
- Loescht Download + Temp (gibt ~750 MB zurueck)
- Schreibt runtime/env.sh mit allen Umgebungsvariablen
- Braucht NUR ca. 800 MB WAHREND der Installation
- Danach: ca. 500-600 MB im Projektordner (portable, loeschbar)
Integration:
- run.py: laedt portable env automatisch VOR gi-Import
(DYLD_LIBRARY_PATH, GST_PLUGIN_PATH, GI_TYPELIB_PATH,
PYTHONPATH fuer gi-Bindings)
- App-Launcher: sourced runtime/env.sh falls vorhanden
- launcher_core.py: gleiche portable env-Logik
- Freien Speicher pruefen (nur 800 MB noetig, nicht 16 GB)
Drei Installationswege jetzt verfuegbar:
1. HMS-Portable-Install.command (wenig Speicher, nichts systemweit)
2. HMS-Mac-Install.command (Homebrew, mehr Komfort)
3. HMS-MediaEngine.app startet mit whichever verfuegbar ist
2026-09-11 23:33:19 +02:00
HMS MediaEngine Agent
34b1cb8cec
FESTPLATTE: Kompakt-Installation (spart ca. 1-1,5 GB) + Cache-Aufräumen
...
Mac-Installer fragt jetzt nach dem Installationsumfang:
- VOLLSTÄNDIG: alle 21 Effekte, GStreamer belegt ca. 1,5-2,5 GB
- KOMPAKT: 15 Effekte, nur ca. 0,5-1 GB (verzichtet auf 6
Effekte aus gst-plugins-bad/ugly: Blur/Schärfen, Solarize,
Brennen, Dilate, Exclusion). Videowiedergabe (libav),
Compositor und alle 15 restlichen Effekte voll nutzbar.
- Auswahl läuft über native macOS-Dialoge (osascript, 3 Buttons)
- Danach: Homebrew-Cache-Aufräumen anbieten (gibt 0,5-2 GB frei,
Installation bleibt unverändert) - nativer Ja/Nein-Dialog,
zusätzlich im GUI-Installer nach Mac-Installation
- GUI-Installer hat Variante als Combobox (wird an Worker durchgereicht)
Gesamt-Festplatte nach Installation (Kompakt): ca. 1-1,5 GB
statt ca. 2,5 GB. RAM unverändert ca. 42 MB Leerlauf (gemessen).
GUI-Smoke-Test: Variante vorhanden, Cleanup-Dialog existiert und
läuft mit gemockter Antwort durch, Fenster sauber beendet.
2026-09-11 23:29:01 +02:00
HMS MediaEngine Agent
bc1da530de
Mac-Installer: native Passwort-Dialoge (kein Terminal-Tippen)
...
- Homebrew-Installation laeuft ueber osascript administrator privileges:
macOS zeigt den Passwort-Dialog als Systemfenster, kein sudo im
Terminal
- Button-Erkennung korrigiert (osascript gibt Button-Text zurueck,
Exit-Code ist immer 0) -> grep auf 'Weiter' statt ?
- Abbruch wird jetzt korrekt erkannt und quittiert
- Fortschritts-Fenster zeigt klar: Abfragen kommen als eigene Fenster
2026-09-11 23:16:51 +02:00
HMS MediaEngine Agent
1e921a9085
DOPPELKlick-WELT: Grafischer Installer + App-Bundles (kein Terminal mehr noetig)
...
Der Nutzer will KEINE Konsole - jetzt ist alles Doppelklick:
1) GRAFISCHER INSTALLER (installer_gui.py, 336 Zeilen):
- Fenster mit Status-Checks (Python/GStreamer/Homebrew: fehlt/vorhanden),
Fortschrittsbalken beim Download, Log-Bereich, grosse Buttons
- macOS: Homebrew + GStreamer + PyGObject + tkinter via brew;
Passwort-Dialog kommt NATIV von macOS (osascript administrator
privileges) - kein sudo-Tippen
- Windows: laedt und startet die OFFIZIELLEN Installer-GUIs
(GStreamer-MSI + Python-Setup) - Nutzer klickt nur Weiter/Fertig
- Nach Installation: Button 'MediaEngine starten' spawnt die Engine
UNSICHTBAR im Hintergrund und oeffnet den Browser
- Smoke-Test im Container bestanden (xvfb): Fenster baut sich auf,
Statuschecks laufen, sauber beendet
2) macOS: 'HMS MediaEngine.app' (echtes App-Bundle im Repo):
- CFBundleExecutable HMS-Launcher (Bash): sucht brew-python3,
prueft GStreamer unsichtbar -> Engine nohup im Hintergrund +
Browser oeffnet sich; fehlt etwas -> grafischer Installer
- make_mac_app.py: App neu erzeugen falls noetig
- HMS-Mac-Install.command: Doppelklick-Installation mit nativen
osascript-Dialogen (Abbrechen/Weiter) + GUI-Installer am Ende
3) Windows: HMS-Start.vbs (unsichtbar) + HMS-Install.vbs (sichtbar):
- HMS-Start.vbs: findet pythonw (4 Pfade + versteckte PATH-Suche
ohne Konsolenblitz), startet launcher.pyw KOMPLETT unsichtbar
(CREATE_NO_WINDOW) -> nur Browser erscheint
- HMS-Install.vbs: oeffnet grafischen Installer; fehlt Python,
oeffnet offizielle Downloadseite mit Hinweis auf PATH-Haeckchen
- launcher_core.py: gemeinsame Logik (gst_ok -> Engine-Spawn ->
Health-Poll -> webbrowser.open; sonst Installer-Fenster)
4) BEWEISE (im Container ausgefuehrt):
- Launcher-E2E: launch() -> Engine unsichtbar gestartet, Health
gruen, Browser-URL korrekt (http://localhost:8080 ), RC=0
- GUI-Smoke-Test: Fenster + 'Alles bereit' + sauber beendet
- VBS: sh.Run-Zeilen geprueft (Chr(34)-Konstruktion, versteckte
cmd-Suche)
- Alle 5 Regressionssuiten unveraendert gruen:
Projekte 25/25 + Cue 35/35 + Verteilung 33/33 + App 14/14 +
FX 16/16 = 123 Checks
Download: TAR.GZ (macOS, erhaelt Exec-Bits!) oder ZIP (Windows)
2026-09-11 19:41:26 +02:00
HMS MediaEngine Agent
02765e6b34
CUE-SZENENLISTE PRO LAYER + macOS-SUPPORT (35/35 E2E, 123 Checks gesamt)
...
1) Cue-/Szenenliste JE Layer (35/35 E2E):
- Cue sichern = Snapshot (Quelle, Alpha, Position, Groesse, Z-Order,
FX1/FX2 + Intensitaeten); Name + fade_ms + follow_ms pro Cue
- GO vor/zurueck (steps), Goto (Index), Wrap-around am Listenende
- FADE: Quellwechsel = dip-to-black (Phase1 runter, Wechsel bei 0,
Phase2 hoch; E2E: alpha 0.49 -> 0.32 -> Ziel 0.8), sonst sanfter
Tween von Alpha + FX-Intensitaeten; laufende Fades abbrechbar
- AUTO-FOLLOW: follow_ms schaltet nach Ablauf automatisch weiter
(E2E: Cue mit 600ms -> Wrap zum naechsten)
- DMX CUE-GO: cue_go_channel (Settings + UI), steigende Flanke
>=128 = GO auf allen Layern; ohne Flanke kein GO (E2E: 0->1,
1==1 bei High-Halten, neue Flanke 1->0); Sequenzfilter aktiv
- Cue-Entfernen mit Indexkorrektur; Cues in Projekten
speicher-/ladbar (3 Cues nach Projekt-Load erhalten)
- UI: Cue-Bereich je Layer (Cue sichern / GO / Zurueck / Goto /
Loeschen, aktiver Cue markiert, Fade+Follow-Anzeige)
- Fehlerfaelle: unbekannter Layer 400, fehlendes Medium 400,
unbekannter Generator 400
2) macOS (Apple Silicon + Intel) mit Skript:
- setup_macos.sh: Homebrew installiert python@3.12 , python-tk,
GStreamer + alle Plugin-Sets + PyGObject; Apple-Silicon-PATH-
Hinweis (/opt/homebrew); Erklaerung warum Homebrew statt
gstreamer-.pkg (keine PyGObject-Bindings in .pkg)
- Bootstrap (--bootstrap): darwin-Zweig mit brew-Installationspfad
- run.py --generate-setup erzeugt jetzt 3 Skripte
(Windows .ps1 / Linux .sh / macOS .sh); Bash-Syntax geprueft
3) Gefundene + behobene FEHLER:
- WEB-UI-ABSTURZ (echter JS-Ternary-Klammerfehler in loadServers,
seit Verteilungs-Commit unentdeckt, weil API-Tests den Browser-
Code nie parsen): Klammerstruktur korrigiert + JS-Syntax nun per
node --check verifizierbar (Syntax OK) + Remote-Buttons robust
per data-Attribute (kein Quote-Escaping mehr)
- update_layer blockierte Quellwechsel Video->Generator (Cues
brauchen beides): Name entscheidet jetzt den Typ, Wechsel in
beide Richtungen
- Cue-E2E-Timing: dip-to-black hat 2 Phasen (Pruefung 0.2s/0.6s),
Auto-Follow-Index-Fix, Art-Net-Sequenznummern im Test
inkrementierend (Sequenzfilter verwirft Duplikate korrekt)
E2E-Bilanz: Cue 35/35 + Regressionen Projekte 25/25,
Verteilung 33/33, App 14/14, FX 16/16 = 123 Checks gruen
2026-09-11 13:34:43 +02:00
HMS MediaEngine Agent
7e191ff6c9
GENERATOREN + MEDIEN-VERTEILUNG + AUTOSTART-SETTINGS (33/33 E2E)
...
1) MADRIX-artige Generator-Layer (15 prozedurale Quellen):
- engine.GENERATORS: ball (animiert), gradient, pinwheel (animiert),
zone-plate (animiert), checkers, snow (Rauschen animiert), circular,
spokes, smpte, gamut, red/green/blue/black/white - alle per
gst-launch verifiziert, kombinierbar mit FX1/FX2 (Generator+FX
gerendert, 28 Frames im Test)
- add_generator + Pattern-Wechsel zur Laufzeit (ball->snow) mit
Rebuild, Katalog-Endpoint /api/generators, UI-Dropdown im Layer-Tab
- Generatoren in Projekten speicher-/ladbar (gradient nach Load aktiv)
- Ungueltige Generator-IDs werden mit 400 abgewiesen
2) Medien-Verteilung ueber mehrere Server:
- hms_app/distribution.py: Server-Check (/api/health),
Remote-Medien-Liste, Streaming-Import mit Upload-Sicherung
- config.servers: Remote-Server registrieren (Name+URL, HTTP-only,
Duplikat-Schutz), /api/servers (online/offline + Medien),
servers/import: Datei von Remote ins lokale Archiv ziehen
- UI: Remote-Server in Einstellungen verwalten, Remote-Medien im
Medien-Tab mit 'Ins Archiv ziehen'-Button
- run.py --data-root: mehrere Instanzen auf einer Maschine mit
getrennten config/media/projects-Ordnern
- E2E mit ZWEI echten Servern: A registriert B, sieht B-Medien,
zieht clip byte-identisch (SHA verifiziert) und spielt ihn als
Layer; Offline-Erkennung nach B-Stop; 404/400-Faelle
3) Autostart in den Einstellungen:
- Einstellungen: Autostart-Projekt-Dropdown (aus Projektliste),
abwaehlbar; Projekte-Tab weiterhin mit Autostart-Button
- FIX Settings-Save-Merge: POST /api/settings merged jetzt auf die
AKTUELLEN Settings - Autostart und registrierte Server gehen beim
Speichern anderer Einstellungen nicht mehr verloren (E2E: Autostart
ueberlebt Settings-Save, FPS uebernommen)
E2E: 33/33 PASS (Verteilung/Generatoren) + Regressionen:
Projekte 25/25, App 14/14, FX 16/16 - alle gruen
2026-09-11 13:11:54 +02:00
HMS MediaEngine Agent
70502458d8
PROJEKTE: Speichern/Laden/Autostart (25/25 E2E inkl. Server-Neustart)
...
- hms_app/projects.py: ProjectStore mit atomarem Speichern
(.hms.json in projects/), Format-Kennung, Namens-Sanitize
(Pfad-Traversal-Schutz, Leerzeichen erlaubt), Liste/Loeschen
- engine.py: export_state() (Layer mit Alpha/Pos/Groesse/Z/FX +
Intensitaeten + Master) und load_state() (ersetzt alle Layer,
fehlende Medien werden uebersprungen und gemeldet, Werte geclamped,
ungueltige FX-IDs verworfen)
- server.py: /api/projects (GET Liste + Autostart),
POST projects/save|load|delete|autostart; Loeschen des
Autostart-Projekts raeumt config.json automatisch auf
- config.py: engine.autostart_project (validiert, optional)
- run.py: laedt Autostart-Projekt beim Programmstart
- ui.py: neuer Reiter 'Projekte': Name eingeben + Speichern,
Tabelle mit Laden/Autostart/Loeschen, Autostart-Badge
E2E-BEWEIS (25/25 PASS, mit ECHTEM Server-Neustart):
1 Server startet · 2 Upload · 3 Layer · 4 FX/Alpha/Pos gesetzt ·
5 Projekt 'Show A' gespeichert · 6 Traversal-Name sanitizet zu 'evil' ·
7 Liste · 8 Layerzahl · 9 Zustand geleert (master=0.1) ·
10 Projekt geladen · 11 Layer wiederhergestellt ·
12 Alpha 0.7 wiederhergestellt · 13 FX1 blur 0.8 wiederhergestellt ·
14 Position x=50 y=20 wiederhergestellt · 15 Master 0.9 ·
16 Engine rendert · 17 Autostart gesetzt ·
18 Server NEU GESTARTET · 19 Autostart: Layer+FX automatisch geladen ·
20 Autostart: Engine rendert (60 Frames) · 21 config.json Autostart ·
22 fehlendes Projekt 404 · 23 geloescht ·
24 Autostart automatisch geleert · 25 config.json geleert
Regressionen: App-E2E 14/14 (app=0) + FX-E2E 16/16 (fx=0) unveraendert gruen
2026-09-11 12:55:50 +02:00
HMS MediaEngine Agent
10b988c33a
EFFECTS LIVE: 21 Effekte in der Pipeline (FX1/FX2 je Layer, 16/16 E2E)
...
Echte GPU-nahe GStreamer-Effekte, zur Laufzeit pro Layer schaltbar:
- FX_CATALOG: 21 verfuegbare Effekte (gst-inspect verifiziert):
blur, sharpen, color, contrast, brightness, gamma, pixelate,
solarize, vertigo, edge, ripple, radioactv, revtv, quark, op,
burn, dilate, warp, streak, aging, exclusion
- FX1 + FX2 pro Layer (Kette: videoconvert ! FX1 ! videoconvert !
FX2 ! videoconvert - Muster gegen gst-launch verifiziert)
- Intensitaet je FX live regelbar OHNE Rebuild
(Property-Update direkt am Element, Frames laufen weiter 118->120)
- Strukturwechsel (FX waehlen/entfernen) -> atomarer Rebuild mit
Rollback; Intensitaeten werden auf neue Pipeline uebertragen
- DMX: fx1_channel/fx2_channel optional konfigurierbar -> steuert
FX-Intensitaet live (E2E: Kanal 20 = 255 -> Intensitaet 1.0)
- UI: Layer-Editor mit FX1/FX2-Dropdown (Katalog via /api/fx)
+ Intensitaets-Slider je FX
- /api/fx: Effekt-Katalog mit Label/Bereich fuer die UI
- config.py: fx1_channel/fx2_channel in Validierung (optional, 1-512)
- Ungueltige FX-IDs werden abgewiesen (fallback None)
E2E-BEWEIS (16/16 PASS, im Container):
1 Health · 2 Katalog 21 Effekte · 3-8 alle Kern-FX enthalten ·
9 Layer · 10 FX1 blur -> Rebuild laeuft (118 Frames) ·
11 Intensitaet live ohne Ruckler · 12 FX2 color dazu (161 Frames) ·
13 FX entfernen ok (180 Frames) · 14 fx1_channel konfiguriert ·
15 DMX steuert FX-Intensitaet auf 1.0 · 16 ungueltiger FX abgewiesen
Regression: kompletter App-E2E weiterhin 14/14 PASS (app=0 fx=0)
2026-09-11 12:01:22 +02:00
HMS MediaEngine Agent
68ce87e5ac
ECHTES PROGRAMM: Medienverwaltung + Upload + konfigurierbares Art-Net (14/14 E2E bestanden)
...
Vollständige Anwendung in hms_app/ (6 Module) + schlanker run.py:
- config.py: config.json-Persistenz, Defaults, strikte Validierung
(Bereiche, Universes, Kanal-Mapping; ungültige Settings => 400)
- media.py: Upload-Streaming (chunkweise, Größenlimit, .part-Sicherung),
Duplikat-Umbenennung, Thumbnail-Erzeugung per GStreamer,
Metadaten-Cache (Dauer via query_duration), Löschen, Pfad-Schutz
- artnet.py: ArtDMX voll KONFIGURIERBAR (Port, Universes, Kanäle),
Sequenz-/Duplikat-Filter, Signalverlust-Policy hold/fade_black,
Watchdog, Live-Restart nach Settings-Änderung
- engine.py: dynamische Layer (Video + Bild via imagefreeze),
atomarer Rebuild mit Rollback (alte Pipeline läuft bei Fehler weiter),
Positions/Größen/Z-Order/Alpha je Layer, EOS-Loop, DMX-Mapping
- server.py: REST komplett (upload/delete, layers add/remove/update,
master/blackout/playback, settings GET/POST mit Validierung),
Thumbnails + Datei-Download, Traversal-Schutz
- ui.py: 4-Tabs-WebUI: Live (Preview+Slider+Diagnose), Medien
(Drag&Drop-Upload mit Fortschritt, Thumbnails, Als-Layer/Delete),
Layer-Editor (Alpha/Pos/Größe/Z), Einstellungen (Art-Net komplett
umstellbar inkl. Port/Universes/Kanäle, Preview, Engine, Upload-Limit)
- setup.py: Bootstrap + setup_windows.ps1/setup_linux.sh Generierung
- run.py: Einstieg (--port, --setup, --bootstrap, --generate-setup,
Datei-Import via CLI)
E2E-BEWEIS (14/14 PASS, im Container ausgeführt):
1 Health OK · 2 Video-Upload via HTTP · 3 Bild-Upload · 4 Bibliothek
mit Metadaten (Video-Dauer erkannt) · 5 Thumbnail JPEG ·
6 Traversal-Schutz (404) · 7/8 Layer Video+Bild dynamisch ·
9 Engine rendert (91 Frames) · 10 Art-Net live auf Port 6455 mit
Master-Kanal 10 umgestellt · 11 DMX steuert Master 0.251 auf NEUEM
Port/Kanal · 12 Layer-Alpha via DMX · 13 config.json persistiert ·
14 Layer-Remove ohne Absturz (258 Frames, atomar) ·
Ungültige Settings werden mit 400 + Feldname abgewiesen
Fixes: Bild-Caps kombiniert (parse-Fehler), Thumbnail-Namens-Mapping,
kind_of-Methode, atomarer Rebuild mit Rollback, DMX-accepted-Zähler
2026-09-11 11:05:01 +02:00
HMS MediaEngine Agent
25d6041654
FUNKTIONSFÄHIG: Vollständiger Medienserver mit E2E-Beweis
...
BEWEISE (alle im Container verifiziert, System-Python 3.14 + GStreamer 1.28.4):
- 2 Layer echtes Video gemischt (Ball + SMPTE), 300 Frames gerendert
- MJPEG-Browser-Stream: 74 JPEG-Frames / 1.4MB in 5s
- ECHTES ArtDMX-Paket (Spec-konform, 512 Kanäle): steuert
Master 0.502, Layer1 0.502, Layer2 0.126 - sichtbar im Status
- REST-API: Master/Layer-Alpha/Blackout/Playback live steuerbar
- Blackout: effektives Alpha 0.0
run.py (903 Zeilen, Single-File, keine weiteren Abhängigkeiten):
- MediaEngine: compositor-Mixing bis 4 Layer mit xpos/ypos/zorder,
alpha je Pad (Laufzeit), Loop (EOS-Seek), BGRA, optionaler
Fullscreen-Zweig (Windows d3d11videosink / Linux autovideosink)
- ArtNetInput: ArtDMX auf UDP 6454, OpCode/ProtVer validiert
- EngineServer: ThreadingHTTPServer mit /stream.mjpg,
/api/status, /api/health, POST /api/master|layers|blackout|playback
- Web-UI: dunkles Layout, Live-Preview, Master/Layer-Slider,
Play/Pause/BLK, DMX-Paket-Counter, FPS-Zähler, Diagnose-Tabelle
- DMX-Map Demo: Ch1=Master Ch2-5=Layer Ch6=Play Ch8=Blackout
- Setup-Dialog (--setup, tkinter): Video-Auswahl, Port, Fullscreen
- Bootstrap (--bootstrap): GStreamer-Install Linux/Windows
- setup_windows.ps1 + setup_linux.sh: einmalige Erstinstallation
(GStreamer MSI/Python auf Windows; apt/dnf auf Linux)
Fixes: Compositor-Pads zuerst definieren (parse_launch-Reihenfolge),
Content-Length als bytes (Binär-Stream), Blackout dimmt nur (pausiert nicht),
JS-Slider-Template korrigiert
Nutzung: python3 run.py [videos] [--port N] [--output] [--setup]
2026-09-11 09:42:51 +02:00
HMS MediaEngine Agent
3ec46dda29
FUNKTIONIERENDER Renderer: Echtes Video-Playback + MJPEG-Browser-Stream
...
BEWEIS (im Container getestet, System-Python 3.14 + GStreamer 1.28.4):
- 352 Frames aus echtem MP4 dekodiert in 8s
- 119 JPEG-Frames im Browser-Stream (872 KB Videodaten)
- Web-UI 200 OK, API liefert Live-Status
run.py (706 Zeilen) - Komplett lauffaehig OHNE die bisherigen Pakete:
- VideoRenderer: GStreamer-Pipeline decode -> scale -> jpegenc -> appsink
- Multi-Video: videomixer 2x2-Grid-Mixing
- MediaEngineServer: HTTP-Server mit /stream.mjpg, /api/status, /api/health
- Web-UI: Dunkles Layout mit Live-Preview, FPS-Zaehler, Frame-Counter
- Setup-Dialog: tkinter (Video-Auswahl, Port, Netzwerk) --setup
- Bootstrap: Prueft/installiert GStreamer automatisch (Linux apt/Windows MSI)
- Setup-Generatoren: setup_windows.ps1 (Python+GStreamer+uv+Frontend),
setup_linux.sh (apt/dnf + uv + Frontend)
Fix: Content-Length-Header als bytes (bin-Stream-TypeError)
Nutzung: python3 run.py [videos...] [--port N] [--setup] [--bootstrap]
2026-09-11 09:36:04 +02:00
HMS MediaEngine Agent
12e600b196
STATUS: Finales Pre-Windows-Test Update
2026-09-11 08:45:39 +02:00
HMS MediaEngine Agent
9788fefcb4
Fix: ungenutzten vi-Import aus LayerTable.test entfernt (TS6133)
2026-09-11 08:44:59 +02:00
HMS MediaEngine Agent
739a81bcf1
Build: Windows Portable-Build (§30.2) + Frontend-Tests (§17.10)
...
- build_portable.sh: Nuitka Onefolder (ADR-0005), 5 Schritte:
uv sync -> Frontend -> Rust (cargo optional) -> Nuitka ->
GStreamer-Buendelung + portable Struktur + SHA-256 + ZIP
- Portable Struktur (§9): PORTABLE_MODE, runtime/gstreamer, web/,
plugins/, projects/, media/, userdata/, config/, logs/, licenses/
- Frontend-Tests: Vitest + Testing Library, 9 Tests:
LayerTable (10 Spalten, Selektion, 7 Zustaende, Screen-Reader),
StatusBar (FPS 2 Dezimalstellen, Quality Auto, Art-Net-Status)
- Gesamtsuite 595 Python + 9 Vitest gruen
2026-09-11 08:41:44 +02:00
HMS MediaEngine Agent
f7f52f909d
Launcher: vollständiger Startablauf nach §9.2
...
- run(): App-Root bestimmen, Schreibbarkeit prüfen (§9.1), freie Ports
wählen (§6.1A), Renderer + Control Core über Supervisor starten
- Healthcheck: wartet bis /api/v1/system/health 200 OK (§9.2 Nr. 7)
- Recovery-Markierung: unsauberer Shutdown wird sichtbar (§26.4)
- Browser: plattformneutral öffnen (Windows/Darwin/Linux, optional)
- Hauptschleife: Supervisor-Überwachung, Crashloop-Erkennung,
SIGINT/SIGTERM mit kontrolliertem Beiden beider Prozesse (§26.4)
- Exit-Code 0 bei kontrolliertem Beenden, 1 bei Healthcheck-Fehler
2026-09-11 08:38:05 +02:00
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