SAVEPOINT bekommt den Stand v3.14: der unwirksame Platten-Schutz zuerst (wichtigster Fund), dann die gemessenen Werte, das Gebaute, die vier toten Endpunkte als Entscheidungsvorlage - und ein Abschnitt "SOFORT ENTSCHEIDEN". Der laufende Akira-Encode wird beim Fertigwerden mit dem DEPLOYTEN, alten Code versuchen, 75 GB in 37 GB zu kopieren. keepOriginal steht auf true, und den Wert hat die Aufgabe beim Start gelesen - jetzt umstellen aendert daran nichts mehr. Der Savepoint nennt die drei Optionen mit Empfehlung. Zwei Richtigstellungen an v3.13, beide durch Messung: - "progress=99 ist ein Altwert aus dem Absturz" war falsch. Beide Startpfade setzen auf 0; der Wert kam frisch vom Scan-Durchlauf. Ein Bug, kein Ueberrest. - Die Erwartung, _original_aufheben werde nur warnen, war falsch - siehe EXDEV-Fund im vorigen Commit. Ehrlich als OFFEN markiert: Was die Platte am 25.07. mittags fuellte, ist NICHT belegt. Es gibt keine Kopier-Reste, kein original-Verzeichnis und keinen einzigen Log-Eintrag von _original_aufheben, das in beiden Zweigen loggt. Der Mechanismus ist jetzt bewiesen, sein Zuschlagen an jenem Tag nicht. Lieber offen lassen als eine dritte Vermutung aufstellen. AGENTS bekommt Etappe 19 und einen neuen Abschnitt, der das wiederkehrende Muster benennt: nicht aus einem Zustandswert auf einen Mechanismus schliessen - vier belegte Faelle. Plus die Umkehrung, die diese Sitzung gekostet hat: gleiches st_dev heisst NICHT gleicher Mount. Was ausprobierbar ist, wird ausprobiert statt vorhergesagt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
4.5 KiB
AGENTS.md — Arbeits-Konventionen für Rippy
Grundregeln
1. Plan vor Code. Vor jeder Etappe: Klare Akzeptanzkriterien schreiben, dann bauen. 2. Kleine Schritte. Max. eine Feature pro Commit. Commit-Nachrichten beschreiben WAS und WARUM. 3. Beweisen statt behaupten. Testen, was gebaut wurde. Keine "es sollte funktionieren"-Commits. 4. Deutsch-Nicht-Entwickler. Der Commander liest alles — Variablennamen auf Englisch, aber Kommentare und Docs auf Deutsch.
⛔ HARTE Regeln (mechanisch geprüft — seit 22.07.2026)
A. Die CI-Ampel muss GRÜN sein, bevor irgendetwas „fertig" heißt.
.gitea/workflows/ci.yml läuft bei jedem Push auf dem Gitea-Runner (NICHT löschen, NICHT
abschwächen). Keine Tests = rot = nicht fertig. Der Commander liest die Ampel, nicht den Code.
B. Abweichung vom KONZEPT = STOPP + fragen. Anderes Werkzeug, andere Bibliothek, gestrichenes Muss-Feature → erst den Commander fragen, NIE still ersetzen. (Vorgefallen: Muss-Feature „MakeMKV lossless" wurde still durch lossy HandBrake ersetzt.)
C. Single Source of Truth ist main — es gibt nur diesen einen Branch
(seit 24.07.2026; der stable-Zwischenbranch ist abgeschafft). Die CI-Ampel
läuft bei jedem Push und PRÜFT nur (Ruff/pytest/Vite-Build) — sie befördert
nichts mehr. Deployt wird direkt aus main: auf der VM git pull bzw.
./deploy.sh (verifiziere vorher, dass die Ampel für den Commit GRÜN ist —
rot heißt: nicht deployen). Nie freihändig per SSH auf der VM bauen.
(Vorgefallen: Doppel-Anlage Rippy + rippy auf der VM durch Freihand-Deploys.)
D. Externe Schnittstellen NIE aus dem Kopf. Vor Nutzung fremder CLI-Flags oder
Bibliotheks-APIs: --help/Doku prüfen und die Fundstelle im Commit nennen.
(Vorgefallen: erfundene Celery-Methode self.send_task, erfundene abcde-Flags.)
Workflow
- Read: KONZEPT.md + ROADMAP.md lesen. Verstehen, welche Etappe dran ist.
- Plan: Was genau soll diese Sitzung bauen? Eine Zeile.
- Build: Code schreiben, testen, committen.
- Verify:
docker compose up— funktioniert das Ganze? - Savepoint: SAVEPOINT.md aktualisieren. Nächster Chat beginnt nicht von Null.
Modelle je Aufgabe
- Planung: Heavy-Modell (Reasoning) für Architektur-Entscheidungen.
- Bauen: schnelles Coding-Modell.
- Review: Heavy nochmal für Code-Review vor Merge.
Docker-Praxis
- Alles läuft in Containern:
docker compose up -d - Keine System-Pakete auf dem Host — alles im Container.
- Dockerfile immer multi-stage, kleinste Images.
Was NICHT gebaut wird
- Kein Code direkt im Host-OS.
- Kein Proxmox-LXC-Nesting-Workaround — das Projekt lebt bewusst in normalem Docker.
- Kein ARM-Fork — Rippy ist ein Eigenbau von Grund auf.
Aktueller Stand (25.07.2026)
- ✅ E2E bewiesen (v3.1): BD-50 komplett durch die Kette (43 GB → 4,8 GB)
- ✅ Etappe 13 (v3.2): Universal-Komfort-Runde — Media-Server-Integration, echte Benachrichtigungen, SMB-Klartext-Fehler, UHD-Arbeitsverzeichnis, MakeMKV-Key via UI, Job-Detail-Popup, Toast-Feedback, Ampel-Blocker behoben
- ✅ Etappe 17 (v3.10): 4K-UHD-Disc-Schlüssel — persistentes
MakeMKV-Datenverzeichnis +
KEYDB.cfgim UI - ✅ Etappe 18 (v3.11): 4K-UHD gelöst —
makemkvconholt Schlüssel unter Linux nie, unter Windows schon; Schlüsselspeicher übernehmbar. Akira-UHD geht auf der VM auf (TCOUNT:5, bewiesen) - ✅ Etappe 19 (v3.14): Durchsicht Frontend/Backend — vier Placebos weg
(Fortschritt log, Auswurf tat nichts, „Alle Tracks" konnte nichts, Encoder
wurden behauptet statt gemessen), Zombie-Erkennung gebaut, Pfad-Prüfung
gehärtet, und der Platten-Schutz aus
c065967als unwirksam entlarvt - 📝 Details immer in SAVEPOINT.md — diese Sektion nennt nur die Etappe
Was diese Sitzungen wiederholt gekostet hat
Nicht aus einem Zustandswert auf einen Mechanismus schließen. Vorgefallen:
aus „kein Schlüssel da" → „Server abgeschaltet" (falsch), aus Status
transcoding → „Celery hat neu zugestellt" (falsch), aus progress=99 →
„Altwert aus dem Absturz" (falsch — ein Bug), aus gleichem st_dev →
„os.rename funktioniert" (falsch — der Kernel vergleicht den Mount).
Jedes Mal hätte eine Messung von unter einer Minute gereicht.
Und die Umkehrung gilt genauso: gleiches st_dev heißt NICHT gleicher
Mount. Wo eine Eigenschaft ausprobierbar ist, probiere sie aus, statt sie
vorherzusagen.