Skip to content

Feat: Bestätigtes Audiojournal für Diktat-Recovery #41

Open

Description

@LeonStadler

Ziel

Aufnahmeaudio wird begrenzt gepuffert und mit einem nachweisbaren Checkpoint gespeichert, damit ein Prozessabbruch höchstens etwa eine Sekunde bestätigtes Audio verliert.

Umfang

  • Normalisiertes 16-kHz-Mono-Float32-Audio vor veränderlicher Vorverarbeitung in separaten Artefaktdateien journalisieren.
  • Audio-Callbacks bleiben frei von DB-Zugriff, AI, Hashprüfung und blockierender Dateiarbeit.
  • Begrenzte Queue, Backpressure, Speicherknappheit, Datenträgerfehler und Unterbrechungen behandeln.
  • Checkpoint-Reihenfolge zwischen Dateidaten und SQLite-Metadaten definieren; Startup-Abgleich implementieren.

Abhängigkeiten

Teil von #28; Job-ID/Repository aus #39.

Akzeptanzkriterien

  • Prozessabbruch an jeder Schreibgrenze lässt bestätigte Daten wiederherstellbar.
  • Speicherfehler führen zu kontrolliertem Stop und keinem stillen Datenverlust.
  • Audiojournal-Puffer bleiben begrenzt unabhängig von der Gesamtdauer.
  • Aufnahme bleibt reaktionsfähig; bestätigtes Verlustziel wird auf Zielhardware gemessen.

Activity

  1. LeonStadler commented on Oct 30, 2026

    @LeonStadler
    OwnerAuthor

    Implementierungsstand (2026-10-30)

    Teilweise umgesetzt auf refactor/architecture-foundation: PCMJournalWriter schreibt 16-kHz-Mono-Float32 über eine begrenzte Queue; Checkpoints werden erst nach Dateisynchronisierung und erfolgreichem Metadatenschreiben bestätigt. Runtime erzeugt den Job vor Capture, hängt den Writer an Aufnahme und begrenzt den bestätigten Bereich bei Recovery. Erfolgreiches Ergebnis wird gesichert, bevor Audio gelöscht wird.

    Noch offen: gezielte Prozessabbruch-/Stromausfallgrenzen, reale 1-Sekunden-Dauerhaftigkeitsmessung unter Last und systematischer Bereinigungsabgleich verwaister Dateien. Issue bleibt offen.

  2. LeonStadler commented on Oct 30, 2026

    @LeonStadler
    OwnerAuthor

    Umsetzungsfortschritt – 2026-10-30

    Commit 684f93d schließt einen Teil des normalen Finalize-Pfads an das bestehende bestätigte Audiojournal an:

    • Nach Journal-Finish beendet der neue ASR-Vertrag laufende Live-Partials und gibt deren Sessionpuffer frei.
    • Final-ASR liest nur den SQLite-bestätigten Sample-Bereich, verarbeitet ihn blockweise in eine Float32-WAV und verwendet den gespeicherten Audio-Settings-Snapshot.
    • Der finale Decode nutzt transcribeFile; Reprocessing wurde auf dieselbe Float32-Eingabepräzision umgestellt.
    • Crash-/Journal-Tests belegen Float32-WAV-Header, exakte Samples und dass nicht bestätigte Endbereiche ausgelassen werden.

    Nachweise: vollständige Swift-Testmatrix, Xcode Debug-Build für macOS 26, Generator-Prüfung bestanden.

    Issue bleibt offen: Während der Aufnahme halten beide ASR-Adapter noch vollständige/wachsende [Float]-Audioarrays für die kumulative Live-Partial-Semantik. Die ASR-RAM-Begrenzung, Live-Fensterzusammenführung, bestätigtes Verlustfenster auf Zielhardware, Crash-Injection und reale Langlauftests sind noch nicht abgeschlossen.

  3. LeonStadler commented on Oct 30, 2026

    @LeonStadler
    OwnerAuthor

    Commit f18455f trennt Audio-Checkpoint-Updates von Versuchsstatus und verhindert rückläufige bestätigte Offsets. Dadurch kann ein verspäteter Checkpoint einen zuvor gespeicherten Abbruchzustand nicht auf running zurücksetzen. Gezielt mit SQLite getestet; Crash-Injection und Messung des Verlustziels auf Zielhardware bleiben offen.

  4. LeonStadler commented on Oct 30, 2026

    @LeonStadler
    OwnerAuthor

    Architekturprogramm – echte Prozessabbrüche an der Checkpoint-Grenze

    Commit bb889d1 ergänzt einen Integrationstest mit separatem XCTest-Prozess und SIGKILL. Der Prozess endet nach synchronisiertem Schreiben der zweiten Audiopartie unmittelbar vor beziehungsweise nach dem SQLite-Checkpoint. Nach dem Wiederöffnen stimmen bestätigter Offset und wiederhergestellte Float32-Samples überein; der laufende Versuch wird als unterbrochen erkannt und ein vorheriges Ergebnis bleibt im Verlauf sichtbar.

    Nachweise: beide Abbruchpunkte, vollständige Swift-Test-Suite und macOS-Debug-App-Build erfolgreich. Vier Modell-Smokes wurden mangels Test-Audio übersprungen. Weitere Schreib-/Transaktionsgrenzen, tatsächliche Audioaufnahme unter Last, Dateisystem-/Stromausfall und Messung des Ein-Sekunden-Ziels bleiben offen.

  5. LeonStadler commented on Oct 30, 2026

    @LeonStadler
    OwnerAuthor

    Commit 6ba2164 behandelt Konvertierungsfehler und fehlende Audiopuffer ausdrücklich: Die betroffene aktive Session wird mit Diagnose beendet, bestätigtes Audio bleibt für Recovery erhalten. Ein leerer Konverterausgang ohne Fehler wird akzeptiert. Die Session-ID verhindert, dass verspätete Fehler eine beendete oder andere Session abbrechen. Acht Runtime-Service-Tests und der macOS-Debug-Build waren erfolgreich; Fehler-Injection über echte Aufnahmehardware sowie Queue-/Langlaufnachweise bleiben offen.

  6. LeonStadler commented on Oct 30, 2026

    @LeonStadler
    OwnerAuthor

    Commit 592e31b begrenzt ausstehende Mikrofonpuffer auf zwei Sekunden im Eingabeformat, erstellt vor asynchroner Verarbeitung eigene Kopien und bindet sie an die Session-ID. Überlauf und Kopierfehler stoppen die aktive Session mit Diagnose; bestätigtes Audio bleibt erhalten. Tests prüfen Gate-Grenze und unabhängige Kopien für interleaved/nicht-interleaved Float32. Vollständige Swift-Suite und macOS-Debug-Build erfolgreich; vier Modell-Smokes mangels Test-Audio übersprungen. Echte Hardware-/Lastmessungen und das Ein-Sekunden-Verlustziel bleiben offen; die zwei Sekunden sind eine Queue-Grenze, keine Dauerhaftigkeitsgarantie.

  7. LeonStadler commented on Oct 30, 2026

    @LeonStadler
    OwnerAuthor

    Commit a908839 bietet dem AVAudioConverter jeden Capture-Puffer pro Konvertierungsaufruf nur einmal an; weitere Anforderungen melden vorläufig fehlende Daten. Ein Test mit echtem 48-kHz-zu-16-kHz-Konverter und 32 Puffern prüft die Ausgabemenge. Vollständige Swift-Test-Suite und macOS-Debug-Build waren erfolgreich; vier Modell-Smokes mangels Test-Audio übersprungen. Reale Mikrofonformate, Tail-Verhalten und die Langlauf-/Verlustzielabnahme bleiben offen.

  8. LeonStadler commented on Oct 30, 2026

    @LeonStadler
    OwnerAuthor

    Commit 74520e2 liest beim Stop und Abbruch die verzögerte Ausgabe des AVAudioConverter vor dem Journalabschluss aus. Ein Test mit echtem 48-kHz-zu-16-kHz-Konverter bestätigt, dass zurückgehaltene Samples ausgegeben werden und die Gesamtzahl nach 32 Puffern der erwarteten Dauer entspricht; eine leere Aufnahme wird ebenfalls geprüft. Vollständige Swift-Suite und macOS-Debug-Build erfolgreich, vier Modell-Smokes mangels Test-Audio übersprungen. Mikrofonhardware, weitere Eingabeformate, Ablaufrennen und Langlauf bleiben offen.

  9. LeonStadler commented on Oct 30, 2026

    @LeonStadler
    OwnerAuthor

    Commit 9ada783 schließt das Capture-Gate beim Stop und wartet, bis bereits angenommene Callbacks ihre Kopien auf die Verarbeitungsqueue übergeben haben. Erst danach laufen Queue-/Konverter-/Journalabschluss; neue Callbacks werden abgewiesen. Ein Nebenläufigkeitstest deckt die Übergabereihenfolge ab. Vollständige Swift-Suite und macOS-Debug-Build waren erfolgreich; vier Modell-Smokes mangels Test-Audio übersprungen. Das Warten erfolgt derzeit synchron und umfasst nur Callback-Kopie/Queue-Übergabe; reale Latenz, weitere Lifecycle-Rennen und die Actor-basierte Entkopplung bleiben offen.

  10. LeonStadler commented on Oct 30, 2026

    @LeonStadler
    OwnerAuthor

    Teilfortschritt auf refactor/architecture-foundation-next, Commit 0c56752: Audiojournal-Fehlercallbacks tragen die ursprünglichen Job- und Session-IDs. Ein verspäteter Callback wird dem aktuellen Job zugeordnet und ein Abbruch auf die ursprünglich aktive Session beschränkt, damit ein späterer Start nicht durch den alten Callback abgebrochen wird. Journal-, Recovery- und Session-Tests sowie der macOS-Debug-Build waren erfolgreich. Ein gezielter Integrationstest, der den zeitlichen Randfall in der tatsächlichen Runtime erzwingt, steht noch aus; das Issue bleibt offen.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions