fix(v5): kein stilles Scheitern mehr — Rip-Start meldet unerreichbare Ablage, Kern-Neustart verdrahtet das Fenster neu, eine Wache-Kette je Laufwerk, Rettungs-Abbild überlebt, Titel-Auftrag schlägt „unbekannt"

WAS:
- pipeline.starten fängt jede Ausnahme und meldet sie als Fehler des
  Laufwerks; vor dem Start eine Schreibprobe am Zielordner mit Klartext
  („nicht erreichbar … NAS verbunden?"). Vorher warf mkdirSync bei toter
  Ablage aus starten() heraus, der Aufrufer schluckte es: kein Fehler im
  Fenster, keine Protokollzeile, der Dialog ging zu (Sonde 10).
- kern/index.ts: unbehandelte Promise-Ablehnungen landen im Protokoll und
  im Fenster (gemessen: ein Electron-utilityProcess stirbt daran nicht,
  er schweigt); echte Ausnahmen werden protokolliert, der Kern endet
  kontrolliert, der Haupt startet ihn neu. Die Einlege-Kette hat ein
  Fangnetz.
- kernstart.ts spannt nach einem Kern-Neustart den Fenster-Port neu auf;
  das Fenster schließt den toten Port und meldet den Neustart als Zeile.
  Vorher blieb es taub, bis Rippy komplett neu gestartet wurde.
- wache.runde() löscht den geplanten Timer, bevor es einen neuen setzt —
  jeder Auswurf legte sonst eine weitere 3-s-Kette an (Sonde 3).
- beenden() räumt den leeren Roh-Ordner, verschont aber rettung.iso und
  den Bericht (RETTUNG_DATEIEN).
- Typ „unbekannt" heißt nur ohne Titel-Auftrag ISO; mit Auftrag rippt
  makemkvcon, der Typ folgt der Größe (Blu-ray/DVD) für Preset und Ordner.
WARUM: Durchsicht 12.09.2026, Funde F2, F4, F6, F8, F10 — jeder mit Test.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-09-12 21:27:47 +02:00
co-authored by Claude Opus 5
parent 12b9720386
commit 8c4456d005
7 changed files with 247 additions and 16 deletions
+29
View File
@@ -88,3 +88,32 @@ describe('DiscWache', () => {
wache.stoppen()
})
})
// 5.7.0 (Durchsicht F6): runde() von außen — nach dem Auswurf — ersetzt die
// geplante Runde, statt eine zweite Takt-Kette anzulegen. Vorher: nach
// zwanzig Auswürfen zwanzig Ketten (Sonde 3, neun statt fünf Runden).
describe('DiscWache — eine Takt-Kette, egal wie oft runde() von außen kommt', () => {
it('drei Aufrufe von außen, danach nur EINE Kette', async () => {
let gelesen = 0
const wache = new DiscWache(
() => {
gelesen += 1
return []
},
() => {},
() => {},
20,
)
wache.starten()
wache.runde()
wache.runde()
const vorher = gelesen
await new Promise((f) => setTimeout(f, 130))
wache.stoppen()
const runden = gelesen - vorher
// Eine Kette im 20-ms-Takt schafft in 130 ms höchstens ~7 Runden; drei
// Ketten schafften vorher ~19.
expect(runden).toBeLessThanOrEqual(8)
expect(runden).toBeGreaterThanOrEqual(3)
})
})