Error Recovery & Cleanup: Stuck Tickets, Resource Leaks, fehlende Aufräumlogik #78
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Beschreibung
Mehrere Stellen in der Pipeline haben unvollständige Fehlerbehandlung:
Tickets bleiben in Zwischenstatus stecken, Git-Branches und Lock-Files
werden nicht aufgeräumt, Subprozesse laufen nach Timeout weiter,
und DB-Status kann durch parallele Writes inkonsistent werden.
Hintergrund
Bei Fehlern in der Pipeline (Timeout, Netzwerkfehler, Git-Konflikte) muss
das System in einen definierten Zustand zurückkehren können. Aktuell
führen Partial Failures zu Zuständen, aus denen weder Retry noch
manuelles Eingreifen zuverlässig funktioniert.
Findings
1. Watchdog überschreibt laufende Pipeline (HIGH)
Datei:
backend/main.pyZeile 68-93 +backend/services/pipeline.pyUPDATE ... WHERE status = expected2. Retry räumt Remote-Branch nicht auf (HIGH)
Datei:
backend/services/pipeline.pyZeile 167-183retry_ticket()setzt Status zurück, aber Branch existiert noch auf Remotebranch_namezurücksetzen3. context_file._sync_to_db() überschreibt Status (HIGH)
Datei:
backend/services/context_file.pyZeile 21-40ticket_context, committetUPDATE ticket SET ticket_context = ... WHERE id = ...statt Query-Modify-Commit4. Race Condition bei Branch-Erstellung (HIGH)
Datei:
backend/services/preparation_engine.pyZeile 82-95SELECT FOR UPDATEauf Ticket vor Branch-Erstellung5. kontext.md-Write nicht atomar (HIGH)
Datei:
backend/services/preparation_engine.pyZeile 138-140os.replace()(atomar auf POSIX)6. Claude Runner: stdout unbegrenzt in Memory (HIGH)
Datei:
backend/services/claude_runner.pyZeile 201-216proc.communicate()buffert gesamten Output im RAM7. Claude Runner: Child-Prozesse laufen nach Kill weiter (HIGH)
Datei:
backend/services/claude_runner.pyZeile 208-216proc.kill()tötet nur den Hauptprozessos.killpg(os.getpgid(proc.pid), SIGKILL)für Process-Group-Kill8. Kein Cleanup nach Partial Failure (MEDIUM)
Datei:
backend/services/pipeline.py_cleanup_after_failure()Methode:git checkout .,git clean -fd, Branch löschen9. WebSocket-Connections nicht aufgeräumt (MEDIUM)
Datei:
backend/services/pipeline.pyZeile 35-47send_text()scheitern werden entfernt10. Ungültige Status-Übergänge erlaubt (MEDIUM)
Datei:
backend/api/tickets.pyZeile 212-233/startEndpoint prüft nicht den aktuellen Status11. Fehlende Git Return-Code-Validierung (MEDIUM)
Datei:
backend/services/repo_analyzer.pyZeile 159-188create_branch()ignorieren Fehlercodescheckout,pull --ff-onlykönnen still fehlschlagen12. Error-Messages zu generisch (MEDIUM)
Datei:
backend/services/pipeline.pyZeile 118-127Akzeptanzkriterien
UPDATE WHERE status = expected)branch_namezurückcontext_file._sync_to_db()verwendet gezieltes SQL-UPDATESELECT FOR UPDATEauf Ticket-Row_cleanup_after_failure()räumt Working Tree und Branches auf/start-Endpoint validiert erlaubte Ausgangsstatus/startmit ungültigem Status gibt 409 zurückTechnische Hinweise
backend/services/pipeline.py(atomare Updates, Cleanup, Error-Messages)backend/services/context_file.py(SQL-UPDATE statt ORM)backend/services/preparation_engine.py(DB-Lock, atomarer Write)backend/services/claude_runner.py(File-Streaming, Process-Group-Kill)backend/services/repo_analyzer.py(Return-Code-Validierung)backend/api/tickets.py(Status-Validierung)backend/main.py(Watchdog-Interaktion mit atomaren Updates)dann Resource-Management (#6, #7)
Aufwand: L