Files
abdulive/docs/offene-punkte.md
T
ZeasyAlexandClaude Opus 5 5f6301268a Native Windows-Auslieferung statt Container
Docker faellt weg. Das Projekt hat keine npm-Abhaengigkeiten und Node fuehrt
TypeScript direkt aus - der Container schrieb nur noch drei Programme fest,
und dafuer braucht es keine Virtualisierung, sondern einen Ordner.

Der Anlass war, dass ADR-0004 zwar `docker compose pull` versprach, es aber
nie ein veroeffentlichtes Image gab. Wer installieren wollte, musste
whisper.cpp aus dem Quelltext uebersetzen.

Plattformschicht (packages/core/src/platform.ts):
- Programme werden neben der Anwendung gesucht, nicht im PATH
- Daten unter %LOCALAPPDATA%, damit Installation und Update ohne
  Administratorrechte auskommen
- Schriften mitgeliefert: ohne fontsdir setzt libass wortlos eine
  Ersatzschrift ein - gemessen 720 statt 826 Pixel Zeilenbreite

Windows-Eigenheiten, an echtem ffmpeg 8.1 durchprobiert:
- Pfade im Filtergraphen brauchen alle drei Schritte (Vorwaertsschraegstriche,
  escapter Doppelpunkt, Anfuehrungszeichen); je zwei davon reichen nicht
- `nice` gibt es nicht, ersetzt durch os.setPriority

Auslieferung:
- scripts/build-package.ts baut das Paket, laeuft auch unter Linux
- install.ps1 ohne Administratorrechte, Autostart ueber den Aufgabenplaner
- update legt neue Fassungen bereit; eingespielt wird beim naechsten Start,
  nie mitten im Stream
- ZIP lesen und schreiben ohne Abhaengigkeiten (packages/core/src/zip.ts)

Kein `irm ... | iex`-Einzeiler: git.zeasy.dev antwortete instanzweit mit einer
Umleitung auf /user/login, und `iex` fuehrte die Anmeldeseite als PowerShell
aus. Der Updater verfolgt Umleitungen jetzt nicht und hat keine erfundene
Vorgabeadresse mehr.

Ausserdem: backup.ps1 war an zwei Stellen dokumentiert, aber nie geschrieben.

ADR-0007 ersetzt ADR-0004. 84 Tests, Typpruefung sauber.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AhVSfMFdWnXKCv5JfLnArZ
2026-09-09 17:39:26 +02:00

117 lines
6.3 KiB
Markdown

# Offene Punkte
Stand 2026-09-09. Sortiert nach Dringlichkeit, nicht nach Aufwand.
Erledigtes wandert raus, nicht ins Archiv — die Historie steht in Git.
## Blockiert, bis jemand am Stream-PC sitzt
- [ ] **S2 abnehmen.** Der obs-websocket-Client ist gebaut und getestet, soweit
es ohne OBS geht: Anmeldeverfahren, Pfadübersetzung, Warten auf die
fertige Datei. Ungeprüft ist das tatsächliche Gespräch mit einem
laufenden OBS. Bis dahin ist `!clip` nicht bewiesen.
- [ ] **Strecke IRC → Datenbank im Livebetrieb.** Die Teile sind einzeln
getestet, die Verdrahtung wird erst beim ersten echten Stream sichtbar.
- [ ] **Layout umstellen** nach [`obs-layout.md`](obs-layout.md) und danach
`calibrate` laufen lassen.
## Bekannte Lücke im Betrieb
- [ ] **Aufräumen im Arbeitsordner.** Jede Rohdatei landet unter `work/<clipId>/`
und bleibt dort liegen. Bei fünf Clips pro Stream und mehreren hundert MB
je Datei läuft das Volume in wenigen Wochen voll. Gebraucht wird eine
Aufbewahrungsregel — Vorschlag: Rohdateien der letzten 30 Clips behalten,
ältere löschen, sobald `status = 'rendered'`. **Das ist der Punkt, der als
Erstes weh tun wird.**
- [ ] Was passiert, wenn der Rechner mitten im Rendern ausgeht? Clips bleiben
auf `status = 'raw'` stehen und werden nach Neustart nicht wieder
eingereiht.
## Untertitel verbessern
Der Durchlauf am echten Clip war brauchbar, aber nicht gut. Was auffiel:
- [ ] **Größeres Modell testen.** `ggml-small` machte aus „Danke" ein „Dank es"
und aus „Sabrina" ein „Savina". `medium` ist etwa dreimal so langsam —
bei 30-Sekunden-Clips nach dem Stream ist das egal. Vergleich an
demselben Clip fahren und entscheiden.
- [ ] **Wörter mit niedriger Wahrscheinlichkeit prüfen.** Whisper liefert je
Token ein `p`. Bei den Fehlgriffen lag es unter 0,15, bei korrekten
Wörtern über 0,9. Entweder weglassen oder gedimmt anzeigen.
- [ ] **Schrift.** DejaVu Sans ist im Image vorhanden, aber unauffällig. Auf
Shorts trägt eine fettere, rundere Schrift (Montserrat ExtraBold,
Inter Black). Braucht eine Schriftdatei im Image und eine Lizenzprüfung.
- [ ] **Nur das aktuelle Wort hervorheben** statt fortlaufend einzufärben. Der
heutige Karaoke-Effekt lässt gesprochene Wörter gefärbt stehen; der Stil,
der auf TikTok funktioniert, hebt genau ein Wort hervor. Braucht mehrere
Dialogzeilen je Zeile statt einer.
- [ ] **Position prüfen.** 340 px Abstand nach unten ist geschätzt, nicht
gemessen. An einem echten Handy gegen die TikTok-, Reels- und
Shorts-Oberfläche halten.
- [ ] **Seitliche Ränder gegengeprüft**, aber nur rechnerisch gegen eine
gemessene mittlere Zeichenbreite. Bei einer anderen Schrift (siehe
Punkt oben) muss `CHAR_WIDTH_RATIO` in `subtitles.ts` neu eingemessen
werden — sonst bricht die Zeile wieder an der falschen Stelle.
- [ ] **Nur transkribieren, wenn Abdu spricht.** Bei getrennten Tonspuren
reicht ein Pegelfilter auf der Mikrofonspur, damit aus Stille kein
erfundener Text wird.
## Streamsetup
- [ ] **Live-Captions verschieben.** Sie liegen im Gameplay-Band und sind fest
eingebrannt. Zwei Vorschläge stehen in [`obs-layout.md`](obs-layout.md).
Welche OBS-Quelle sie überhaupt zeichnet, sagt
`abdulive sources` — das war vorher unbekannt.
- [ ] **Spieluntertitel abschalten.**
- [ ] **Bessere Bildquelle für die Facecam** — Plugin `Source Record` oder
`Aitum Vertical`. Damit entfällt die 2,25-fache Vergrößerung. Lohnt sich
erst, wenn regelmäßig Shorts entstehen.
## Auslieferung
- [ ] **Wo liegen die Pakete?** Das ist die Entscheidung, die als Naechstes
ansteht — ohne sie funktioniert `abdulive update` gar nicht.
`git.zeasy.dev` verlangt **instanzweit** eine Anmeldung: `/explore`,
die API und jede Rohdatei antworten mit 303 auf `/user/login`. Ein
`irm … | iex`-Einzeiler bekommt dadurch die Anmeldeseite und versucht,
sie als PowerShell auszufuehren. Drei Wege:
*(a)* eine Ablage ohne Anmeldung, etwa `dl.zeasy.software` — am
einfachsten, und das Paket enthaelt ohnehin den vollstaendigen Quelltext
als lesbare `.ts`-Dateien;
*(b)* Gitea-Release plus Lese-Token auf Abdus Rechner — der Token darf
dann aber das ganze private Repo lesen;
*(c)* kein Updater, Alexander spielt neue Fassungen per Fernwartung ein.
Code und Installer sind auf *(a)* und *(b)* vorbereitet: `update.url` in
der `config.yaml`, Token im verschluesselten Speicher.
- [ ] **Code-Signing.** Das Paket ist nicht signiert, SmartScreen warnt bei
jeder Installation vor einem unbekannten Herausgeber. Ein
OV-Zertifikat kostet rund 200 EUR im Jahr, ein EV-Zertifikat mehr und
braucht Hardware. Solange nur Abdu installiert, reicht ein Klick auf
"Trotzdem ausfuehren" - sobald jemand Drittes das Paket bekommt, nicht
mehr.
- [ ] **CI auf git.zeasy.dev.** `scripts/build-package.ts` laeuft bisher von
Hand. Als Forgejo-Action beim Tag gebaut und als Veroeffentlichung
hochgeladen, findet `abdulive update` sie von allein.
- [ ] **Update noch nie im Feld gelaufen.** Bereitlegen und Pruefsumme sind
getestet, der Tausch durch `launcher.ps1` nur gelesen. Vor dem ersten
echten Update einmal kuenstlich durchspielen.
- [ ] **Hardware-Encoding.** Der mitgelieferte ffmpeg kann QSV, AMF und NVENC
(`--enable-libvpl`, `--enable-amf`, `--enable-ffnvcodec`) - aus WSL2
heraus ging das nicht. `clipper.ffmpeg.encoder` steht weiter auf
`libx264`. Auf Abdus Rechner messen, ob `h264_qsv` etwas bringt.
## Nach dem MVP
- [ ] **Spitzen-Erkennung scharf schalten.** Sie läuft mit und schreibt jeden
Kandidaten samt Punktzahl in `events`. Sobald ein paar Streams
protokolliert sind: an echten Daten kalibrieren, dann `armed: true`.
- [ ] Automatischer Upload zu TikTok und YouTube.
- [ ] EventSub für Follows, Subs, Raids — bisher reicht IRC plus Polling.
- [ ] Follower-Prüfung bei `!clip`, falls die Abklingzeiten nicht reichen.
- [ ] Die übrigen acht Werkzeuge, siehe [`04-roadmap.md`](04-roadmap.md).
## Kleinigkeiten
- [ ] Die Fortschrittsanzeige schreibt `\r`-Zeilen; im Protokoll der Aufgabe
sieht das unschoen aus. Beim Umleiten in eine Datei besser unterdruecken.