Fix: Deferred-Final-Pass benennt frische Dateien vor dem Collect um
Folge-Fund zu18eada9(Opus-Verifikation des deferFreshFiles-Konzepts):18eada9schloss den "frische Datei landet mit Original-Scene-Namen in der Library"-Bug nur fuer den Hybrid-Pfad (deferFreshFiles=true + Mehrfach-Paesse). Der finale Deferred-Pass blieb betroffen. Root Cause (verifiziert via failing Test gegen HEAD): - runDeferredPostExtraction macht Rename -> Collect (deferFreshFiles=false). Ist eine Datei beim Deferred-Rename noch "frisch" (juenger als fileStabilizeMinAgeMs, prod=2000ms) -- v.a. eine eben per Nested-Extraction geschriebene Datei -- ueberspringt der Frische-Gate sie, und der Collect moved sie mit Original- Scene-Namen in die Library. collectMkvFilesToLibrary benennt selbst nicht um (buildUniqueFlattenTargetPath, nur Flatten). - Im Deferred-FINAL-Pass gibt es keinen concurrent Extractor-Write mehr (Extraktion inkl. Nested ist awaited) -- der Frische-Gate ist dort ein False Positive. Pre-existierender Gap (Frische-Skip aelter als18eada9), auch v1.7.162 betroffen. Fix (minimal): treatFilesAsStable-Param durch autoRenameExtractedVideoFiles(Impl). Der Deferred-Final-Pass ruft mit treatFilesAsStable=true -> Frische-Gate umgangen -> alle Dateien werden umbenannt, bevor der Collect sie sammelt. Hybrid-Pfad unangetastet (nutzt ...Impl mit Default false -> Frische-Skip bleibt aktiv). Regressionstest: frische Datei im Deferred-Pass landet UMBENANNT in der Library. 623 Tests gruen, tsc unveraendert (9 pre-existing). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
30dbbbae9e
commit
35622445da
@@ -68,3 +68,25 @@ App läuft headless auf Windows-Server → Nutzer sitzt nicht davor. Größte L
|
||||
- ⏭️ **M3** (`cancelPendingAsyncSaves` wartet nicht auf laufenden Save) — Report stuft selbst als reines I/O-Overlap ein; die Generation-Guard (storage.ts:1022) schützt die Datenintegrität bereits (stale Write wird verworfen). Kein Korrektheitsgewinn, daher kein Eingriff.
|
||||
|
||||
**Verifikation:** 30 Test-Dateien, 621 Tests grün. Build sauber. Advisor-Review vor Implementierung (fing H2-Falle: Hybrid-Controller nicht in die Deferred-Map legen, sonst killt `runDeferredPostExtraction` sie selbst).
|
||||
|
||||
---
|
||||
|
||||
## D. DEFERRED-PFAD RENAME-GAP (2026-05-28, Opus-Verifikation von 18eada9)
|
||||
|
||||
**Kontext:** Eine abgestürzte Session (API 400 thinking-blocks) hinterließ ein uncommittetes Working-Tree, das **drei** releaste Commits revertierte (08372f9 Passwort + 18eada9 Hybrid-Rename + 98dc366 Support-Bundle, zurück auf v1.7.159). Kein dokumentierter Intent → als Crash-Debris bewertet, non-destruktiv **gestasht** (`git stash` — recoverable), HEAD/v1.7.162 wiederhergestellt.
|
||||
|
||||
**Verifizierter Fund (Folge-Bug zu 18eada9):**
|
||||
- 18eada9 schloss den "frische Datei landet unbenannt"-Bug nur für den **Hybrid-Pfad** (`deferFreshFiles=true` + Mehrfach-Pässe).
|
||||
- Der **finale Deferred-Pass** (`runDeferredPostExtraction`) macht Rename (12125) → Collect (12156, `deferFreshFiles=false`). Ist eine Datei beim Deferred-Rename noch frisch (< `fileStabilizeMinAgeMs`, prod=2000ms) — v.a. eine eben per **Nested-Extraction** (12045, unmittelbar davor) geschriebene Datei — überspringt der Frische-Gate sie, und der Collect moved sie mit **Original-Scene-Namen** in die Library. `collectMkvFilesToLibrary` benennt selbst nicht um (Move-Body: `buildUniqueFlattenTargetPath`, nur Flatten).
|
||||
- Pre-existierender Gap (Frische-Skip-Block älter als 18eada9); auch HEAD/v1.7.162 betroffen.
|
||||
|
||||
**Gate (TDD, vor Fix):** neuer Regressionstest "deferred final pass renames fresh files before collecting them" → reproduzierte den Bug zuverlässig gegen HEAD (Datei landete unbenannt).
|
||||
|
||||
**Fix (minimal, Root-Cause):** `treatFilesAsStable`-Param durch `autoRenameExtractedVideoFiles(Impl)`. Im Deferred-**Final**-Pass (kein concurrent Extractor-Write mehr, Extraktion awaited) wird der Frische-Gate umgangen → alle Dateien werden umbenannt, bevor der Collect sie sammelt. Hybrid-Pfad unangetastet (nutzt `...Impl` mit Default `false` → Frische-Skip bleibt aktiv, schützt weiter vor Rename mitten in concurrent Write).
|
||||
|
||||
**Verifikation:** neuer Test grün, Hybrid-Test grün (kein Regress), **623 Tests grün** (31 Dateien), tsc unverändert (9 pre-existing). Advisor-Gate vor Fix (verlangte Repro-Test statt Timing-Argument).
|
||||
|
||||
**Offen / bewusst nicht angefasst:**
|
||||
- Gestashtes Crash-Debris (`stash@{0}`): enthält Revert von 08372f9/18eada9/98dc366 + log.old. Bei Bedarf inspizierbar/recoverbar; sonst irgendwann verwerfbar.
|
||||
- 08372f9 (Passwort-Daemon-Reset) bewusst nicht neu aufgerollt (außerhalb dieses Goals, kein Hinweis auf Defekt).
|
||||
- Untracked `*-postprocess/` + `fix-library-renames.mjs`: alte Experimente (Apr/Mai), unverändert gelassen.
|
||||
|
||||
Reference in New Issue
Block a user