From fbbc960d9d61533647be6b09ad6b58a0cdc5b43a Mon Sep 17 00:00:00 2001 From: Sucukdeluxe Date: Mon, 8 Jun 2026 23:04:28 +0200 Subject: [PATCH] =?UTF-8?q?docs(tasks):=20Bug-Audit=20Batch=202=20abgeschl?= =?UTF-8?q?ossen=20=E2=80=94=205=20Fixes=20(L/M,H,J/Q,P,B/I)=20+=20verifiz?= =?UTF-8?q?ierte=20Nicht-Bugs=20(G,N,D/E,E,O,F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tasks/todo.md | 73 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/tasks/todo.md b/tasks/todo.md index f153ef8..9e1f1a9 100644 --- a/tasks/todo.md +++ b/tasks/todo.md @@ -24,36 +24,49 @@ schlechtestes Risiko/Nutzen, kann für diesen User gar nicht feuern). Advisor bestätigt Ansatz besser als bak-dance (kein Missing-File-Window). 3 neue Tests (Recovery + Retry-Pfad), 41 video-processor-Tests grün, tsc=6 (Baseline). Commit 189af22. -### Release 2 — Medium/Low (v1.7.190), ein Commit pro Fix -- [ ] **B/I** `app-controller.ts` importBackup settings-only: setSettings → applyRetroactive - CleanupPolicy purged die LIVE-Queue (Vertragsbruch "running queue stays untouched"; Dateien - bleiben aber auf Platte). **Fix (Advisor):** (b) retroaktiven Sweep NUR für diesen Import - unterdrücken (importierte Policy gilt weiter für künftige Completions über normalen Pfad) — - NICHT über updateSettings routen (zweite Landmine resetHistoryForRetention). **I:** die 5 - Live-Usage/Status-Felder overlayen wie updateSettings 322-331 INKL. Key-Filterung der - debridLinkApiKey*UsageBytes auf keyIds in restored debridLinkApiKeys (3 All-Time-Totals deckt - setSettings-Math.max schon ab). Vorher 1 grep: forward-Anwendungsstelle der Policy bestätigen. -- [ ] **C** ~~fixe Temp-Name-Kollision~~ → bereits in A subsumiert (unique Name). -- [ ] **D/E** debrid.ts Rotation: abort-Klassifizierung über `signal.reason` (TimeoutError vs - cancel) statt Text/elapsedMs; API-Pfad 'cancel' umgeht. **VORHER empirisch bestätigen:** - `AbortSignal.any([ac.signal, AbortSignal.timeout(x)]).reason?.name==='TimeoutError'` in DIESEM - Electron-Build; konservativen Fallback behalten, alte Guard nicht blind löschen. -- [ ] **F** Mega-Web empty-streak Concurrency (streak permanent-park unreachable-to-clear vorher - re-verifizieren bevor Maschinerie). -- [ ] **G** download-manager `dropItemContribution` subtrahiert Session-Totals nicht. -- [ ] **H** logger.ts `flushAsync` snapshot-by-slice korrumpiert bei 1MB-Cap-Trim während await - → move-snapshot (`linesSnapshot = pendingLines; pendingLines = []`). -- [ ] **I** → mit B zusammen (app-controller live-usage-Counter). -- [ ] **J** download-manager `abortPackagePostProcessing` löscht Task-Handle ohne Identity-Guard. -- [ ] **L** `isGermanStream` Title-Regex False-Positive. -- [ ] **M** `looksLikeGermanRelease` 'dubbed' zu breit. -- [ ] **N** `stripDualLangFromFileName` Kollision. -- [ ] **O** classifyAccountFailure abort-Branch jetzt tot (nach v1.7.187-Fix). -- [ ] **P** extractor.ts nested-Resume-Keys (`nested:`) bei jedem extractPackageArchives - gepurged (prune-Whitelist nur top-level) → `startsWith("nested:")` in prune skippen. -- [ ] **Q** (NEU, aus A-Review) `collectFilesByExtensions` filtert `~rd`-Temp-Präfix NICHT → - crash-verwaiste Teil-Remuxe könnten in Library gesammelt werden. Vorbestehend (alter fixer - `~rdtmp` wurde überschrieben, neuer unique akkumuliert) → `~`-Präfix in collect skippen. +### Release 2 — v1.7.190 (GEFIXT + verifiziert, ein Commit pro Fix) +- [x] **L+M** video-processor.ts zu weite Deutsch-Erkennung. isGermanStream Titel-Fallback nur + ganze Wörter (ger/deu raus → konnten falsche Spur picken + echte dt. löschen); looksLikeGerman + Release 'dubbed' raus (ital./franz. Dub triggerte German-first). 2 Negativtests. Commit 272a41a. +- [x] **H** logger.ts flushAsync slice-snapshot korrumpiert bei 1MB-Cap-Trim während await → + ungeschriebene Zeilen verloren. Move-snapshot (Buffer auf [] übernehmen) + Requeue bei + Schreibfehler. Commit 4432fa2. +- [x] **J+Q** download-manager. J: runPackagePostProcessing finally löschte Map-Eintrag ohne + Identity-Guard → Abort+Neustart-Race riss neuen Task raus (Waise + Doppel-Lauf); jetzt nur + löschen wenn Map noch auf DIESEN Task/Controller zeigt (handle-Objekt wegen TS2454). Q: + collectFilesByExtensions filtert `~rd`-Temp-Präfix (crash-verwaiste Teil-Remuxe nie ins + Library). Commit 3c33b98. +- [x] **P** extractor.ts nested-Resume-Keys (`nested:`) bei jedem extractPackageArchives + gepurged → verschachtelte Archive beim Resume neu entpackt; `startsWith("nested:")` im Prune + übersprungen. Commit 61a8304. +- [x] **B/I** app-controller.ts importBackup settings-only purgte LIVE-Queue (Dateien blieben auf + Platte) + rollte Usage-Zähler zurück. Fix: setSettings({suppressRetroactiveCleanup}) + + overlayLiveUsageCounters (extrahiert+wiederverwendet, inkl. Key-Filter). Commit dc05b51. + +### Verifiziert KEINE Bugs / bewusst NICHT angefasst (Advisor-Disziplin: erst belegen, dann ändern) +- **G** dropItemContribution "subtrahiert Session-Totals nicht" → **KEIN Bug**: Test "keeps + cumulative session totals when completed items are removed" kodifiziert die Absicht (Session- + Zähler kumulativ, divergieren bewusst von der Item-Map; Retry-Pfad zieht ab, weil neu geladen + wird). Fix-Versuch ließ den Test failen → revertiert, Klarstellungs-Kommentar gesetzt. +- **N** stripDualLangFromFileName "Kollision" → **bereits geguarded**: existsAsync-Skip verhindert + Überschreiben; Remux machte Inhalt eh deutsch-only; collect strippt `.DL.` downstream. Residual + = generischer Rename-TOCTOU (in JEDEM Rename-Pfad), kein spezifischer Bug hier. +- **D/E** abort-Klassifizierung über signal.reason statt Text → **deferred (Robustheit, kein + Live-Bug auf User-Pfad)**. BELEGT: mega-web-fallback normalisiert JEDEN Abort (Timeout UND + Cancel) zu `new Error("aborted:mega-web")` → aktueller Guard `/aborted/i && !/timeout/i` FEUERT + → v1.7.187-Cooldown LÄUFT auf dem Web-Pfad (User-Pfad). Einzige Imperfektion: Cancel >8s wird + fälschlich gecooled (minor). Empirisch bestätigt: `AbortSignal.any([ac,timeout]).reason?.name=== + 'TimeoutError'` (timeout) vs string/AbortError (cancel) — falls je gebaut: signal.aborted-gaten, + reason.name nutzen, Text-Fallback behalten, reason-Test. Hoch-Risiko (kritischer Unrestrict-Pfad + JEDES Downloads) → nicht für Robustheit anfassen. API-Pfad-Abort-Text nicht erschöpfend geprüft. +- **E** "API 'cancel'-Pfad umgeht" → **nicht real**: kein `'cancel'`-throw im Code gefunden. +- **O** classifyAccountFailure abort-Branch tot → **stehen lassen**: tot NUR wegen aktueller + Text-Interception; ein signal.aborted-gated D/E würde ihn wiederbeleben. Kein Kosmetik-Churn. +- **F** Mega-Web empty-streak Concurrency → **N-shaped, deferred**: Streak wird bei Erfolg (1956) + + Nicht-Limit-Fehler (2005) gecleart; "bis Neustart gesperrt" ist bewusste Tageslimit-Logik, + Restart-cleared; Mega-Web single-flight → Concurrency greift nicht. Keine fühlbare Schädigung + konstruierbar → keine Park-State-Maschinerie. +- **C** → in A subsumiert (unique Temp-Name). **K** übersprungen (auto-rename-Reorder, Risiko≫Nutzen). ---