feat(db): 0-Notes-Läufe in pipeline_runs erfassen (#330) - #338
Merged
Conversation
Laeufe, die 0 Notes erzeugen (Konzeptmangel oder stiller Totalverlust, #281), kehrten in orchestrator.main() an zwei Stellen vor dem Erfolgspfad-Insert zurueck und hinterliessen dadurch keine pipeline_runs-Zeile. Solche Laeufe waren in DB/Dashboard unsichtbar -- Run-Zaehlung, Token-/Kosten-Tracking und die Frage "wie oft produziert die Pipeline nichts?" waren systematisch untererfasst. Beide Fruehausstiege (direkt nach der Extraktion, und nach _drop_artifacts()) schreiben jetzt per neuem _insert_zero_notes_run()- Helper eine Zeile mit n_generated=0 und echten Token-/Dauer-Werten. Additive nullable Spalte abort_reason unterscheidet den Grund (no_concepts, all_secondary_mentions, extraction_total_loss, all_artifacts) -- Migration ueber das etablierte _add_column-Muster, Erfolgspfad-Zeilen bleiben NULL.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #330.
Problem
Läufe, die 0 Notes erzeugen, kehrten in
orchestrator.main()an zwei Stellen VOR dem Erfolgspfad-Insert (#198 P1) zurück und hinterliessen dadurch keinepipeline_runs-Zeile. Solche Läufe waren in DB und Dashboard unsichtbar — Run-Zählung, Token-/Kosten-Tracking und die Frage „wie oft produziert die Pipeline nichts?" waren systematisch untererfasst. 2 Belege aus der Coverage-Serie 2 (Lauf 1 dbv-Framework: 198s/15.325 Tokens, Lauf 4 Witt: 268s/51.272 Tokens — beide Exit 0, beide ohne DB-Zeile).Abgedeckte Frühausstiege
Beide
if not drafts:-Rückkehrpunkte inmain()(nach_run_extraction_stages, vor Dedup/Stage-6/Vault-Write) bekommen jetzt eineninsert_run-Aufruf mitn_generated=0und echten Token-/Dauer-Werten:if not drafts:) — deckt sowohl legitimen Konzeptmangel (0 Konzepte geplant, alleaction=skip, oder alleorigin=secondary_mention) als auch den stillen [MITTEL] Lauf mit Totalverlust endet mit "Fertig."/Exit 0 — Fehlersignal nur in stderr #281-Totalverlust (>=1 Konzept versucht, 0 überlebt,exit_code == _EXIT_TOTAL_LOSS) ab._drop_artifacts()(if not drafts:) — Konzepte wurden extrahiert (n_extracted >= 1), landeten aber komplett als Abwesenheits-Artefakte statt echter Notes.abort_reasonunterscheidet den Grund:no_conceptsall_secondary_mentionssecondary_mentiongefiltert)extraction_total_lossall_artifactsErfolgspfad-Inserts (weiter unten in
main(), >=1 geschriebene Note) bleiben unverändert —abort_reasondort implizitNULL(Key wird nicht gesetzt).Feld-/Migrationsentscheidung
Additive nullable Spalte
abort_reason TEXTinpipeline_runs(kein bestehendes Feld passte semantisch). Migration über das etablierte_add_column-Muster indb.py::init_db()(analog #235profile, #239wall_clock_s) — Bestandszeilen bleibenNULL, kein Datenverlust, kein Schema-Bruch. Bewusst keinDEFAULT '', damitNULLechtes „kein Abbruch" bedeutet statt eines leeren, aber gesetzten Strings.Ein neuer Helper
_insert_zero_notes_run()inorchestrator.pybündelt den DB-Write (Trace-Token-Aggregation,AGENT_VERSION,runtime_config.profile, eigenes try/except analog dem Erfolgspfad-Insert) und wird an beiden Frühausstiegen aufgerufen.Dashboard-Neutralität (Punkt 4)
Geprüft, keine Anpassung nötig —
eval_dashboard_server.py/eval_dashboard.pybleiben unverändert:eval_dashboard_server.pyberechnetaccept_pct = round(n_vlt / n_gen * 100, 1) if n_gen > 0 else 0.0— für einen 0-Notes-Run istn_gen == 0, der Guard greift, keinZeroDivisionError.runs_by_version/pdf_n_total-Aggregation (fix(dashboard): Overlap-Guard auf Routing-Corpus mit n_total-Gewichtung (#314) #336) summiert nurn_total/n_vault/… — ein 0-Notes-Run addiert überall0, verzerrt also keine Summen.n_runssteigt korrekt um 1 (das ist der Zweck des Fixes: die Run-Zählung soll diese Läufe jetzt mitzählen).note_evals-basierte KPIs (Halluzinationsrate, Coverage,query_kpi_trend) sind komplett unberührt — ein 0-Notes-Run schreibt nienote_evals-Zeilen (keine Note wurde evaluiert).version_delta()'s PDF-Overlap-Guard (total = sum(latest_pdf_notes.values()); if total: …) bleibt sicher, da ein 0-Notes-Run nur einen0-Beitrag zur Summe liefert.RED-Nachweis
generative/tests/test_zero_notes_run_persisted.py(neu, 4 Tests) +generative/tests/test_db.py(4 neue Tests) schlugen vor der Implementierung fehl:Nach Implementierung: alle grün (siehe Suite-Zahlen unten).
Suite-Zahlen
uv run pytest generative lib/decision_engine/tests shared/tests -q: 6197 passed, 3 skipped, 8 deselected, 0 failed (475s)uv run ruff check .: All checks passed!uv run ruff format --check .: 303 files already formatted (nachruff formatauf den einen betroffenen Testfile)Geänderte Dateien
generative/orchestrator.py—_insert_zero_notes_run()-Helper + 2 Aufrufstellen (beide Frühausstiege NACH Planner/Extractor, VOR Dedup/Stage-6/Vault-Write; die separat bearbeitete Extractor-Dispatch-Region/run_extractors_per_conceptbleibt unangetastet)generative/db.py—insert_run()+ Migration umabort_reasonerweitertshared/db_schema.py— Schema umabort_reason TEXTerweitertgenerative/tests/test_zero_notes_run_persisted.py— neu, 4 Integrationstests (--load-drafts-Harness wietest_orchestrator_total_loss_exit_code.py)generative/tests/test_db.py— 4 neue Unit-Tests + Regex-Fix in der bestehendenwall_clock_s-Migrationsprobe (jetzt nicht mehr letzte Spalte, brauchte ein Komma-Update)