You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Feat: Bestätigtes Audiojournal für Diktat-Recovery #41
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Activity
LeonStadler commentedon Oct 30, 2026
Implementierungsstand (2026-10-30)
Teilweise umgesetzt auf
refactor/architecture-foundation:PCMJournalWriterschreibt 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.
LeonStadler commentedon Oct 30, 2026
Umsetzungsfortschritt – 2026-10-30
Commit
684f93dschließt einen Teil des normalen Finalize-Pfads an das bestehende bestätigte Audiojournal an:transcribeFile; Reprocessing wurde auf dieselbe Float32-Eingabepräzision umgestellt.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.LeonStadler commentedon Oct 30, 2026
Commit
f18455ftrennt Audio-Checkpoint-Updates von Versuchsstatus und verhindert rückläufige bestätigte Offsets. Dadurch kann ein verspäteter Checkpoint einen zuvor gespeicherten Abbruchzustand nicht aufrunningzurücksetzen. Gezielt mit SQLite getestet; Crash-Injection und Messung des Verlustziels auf Zielhardware bleiben offen.LeonStadler commentedon Oct 30, 2026
Architekturprogramm – echte Prozessabbrüche an der Checkpoint-Grenze
Commit
bb889d1ergänzt einen Integrationstest mit separatem XCTest-Prozess undSIGKILL. 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.
LeonStadler commentedon Oct 30, 2026
Commit
6ba2164behandelt 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.LeonStadler commentedon Oct 30, 2026
Commit
592e31bbegrenzt 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.LeonStadler commentedon Oct 30, 2026
Commit
a908839bietet demAVAudioConverterjeden 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.LeonStadler commentedon Oct 30, 2026
Commit
74520e2liest beim Stop und Abbruch die verzögerte Ausgabe desAVAudioConvertervor 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.LeonStadler commentedon Oct 30, 2026
Commit
9ada783schließ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.LeonStadler commentedon Oct 30, 2026
Teilfortschritt auf
refactor/architecture-foundation-next, Commit0c56752: 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.