refactor(generative): Wiring-Dedup + RunContext statt 19er-Tupel (#152)#227
Merged
Conversation
Frozen-Dataclass generative/schemas/run_context.py als benannter Ersatz fuer das
19er-Positions-Tupel, das _run_extraction_stages bisher zurueckgab. Stil analog
zu CitationMeta/RuntimeConfig ("einmal bauen, alle lesen"). Noch nicht verdrahtet
- reine Typ-Einfuehrung, damit dieser Commit gruen bleibt.
- Gemeinsame _plan_and_extract(): die duplizierte Planner->(Cap)->Background-> Extractor-Kette (by-chapter vs. Normalpfad) liegt jetzt an EINER Stelle. Die bug-anfaellige Verdrahtung (welcher Text in planner.run/filter_hallucinated/ run_extractors_per_concept, welche background_map) ist single-source; nur die 7 dokumentierten Pfad-Divergenzen (Textbasis, Cap-Semantik, Background-Gate, related-Akkumulation, concept_map-Merge, Stage-Labels, Ellipsis) bleiben parametrisiert - Verhalten pro Pfad exakt erhalten. - _run_extraction_stages und _load_draft_state liefern beide dieselbe RunContext-Struktur; main() greift per Attribut zu statt 19er-Tupel-Unpacking. Die load-drafts-Rekonstruktion (q_title/citation/word_count, #95/#96/#210) wandert nach _load_draft_state. - Positions-Tests in test_orchestrator_quality_wiring.py auf Attributzugriff umgeschrieben (RED->GREEN-Hebel). - Folge (Div. 7): by-chapter erbt Planner-/Extractor-Spans (Bookkeeping ohne model-Feld, keine Aggregations-Auswirkung); BackgroundExtractor-Span bleibt normalpfad-only, da by-chapter den Background-Extractor bewusst nicht faehrt.
…truktion (#152) _save_draft_state -> _load_draft_state baut citation (ueber _build_citation inkl. physical_pages-Zweit-Check #95/#96), q_title, word_count, dropped_total und extractor_failures aus dem persistierten State neu auf - bislang nur manuell verifiziert. Test fixiert alle 19 RunContext-Felder gegen einen realistischen, minimalen Zustand ueber tmp_path (keine LLM-/Netz-/Vault-Zugriffe).
Owner
Author
|
Reale E2E-Abnahme nachgeholt und BESTANDEN (2026-07-12 abends, entkoppelter Lauf nach Maintainer-Go trotz RAM < 3 GB):
Ein erster Lauf-Versuch wurde nach ~7,5 min vom 10-Minuten-Tool-Timeout der Orchestrator-Session gekillt (Trace zeigte bis dahin gesunde Calls) — kein Code-Problem; Wiederholung entkoppelt via Start-Process. Damit ist die Draft-Bedingung erfüllt. |
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.
Setzt #152 um. Draft, bis die reale E2E-Abnahme nachgeholt ist (RAM-blockiert, s. u.). Closes #152 (bei Merge).
Was
_plan_and_extract(...)— die zwei nahezu identischen Wiring-Blöcke (Normalpfad vs.--by-chapter: planner.run → filter_hallucinated → cap_actionable_concepts → secondary_mention-Filter → run_extractors_per_concept) sind dedupliziert; by-chapter iteriert über die gemeinsame Funktion. Jede Planner-/Extractor-Änderung berührt künftig EINE Stelle.RunContext(frozen Dataclass,generative/schemas/run_context.py, MusterCitationMeta/RuntimeConfig) ersetzt das 19er-Positions-Tupel von_run_extraction_stages; der--load-drafts-Pfad (_load_draft_state) liefert dieselbe Struktur (Rekonstruktion inkl. Zitier-Seite bei PDFs ohne /PageLabels = physischer Index statt gedruckter Seite (Offset-Sonderdrucke) #95/Zitat-Metadaten (Autor + Jahr) ohne Quellendeckung — LLM konfabuliert (Merrill 2006, Knowles→Landry 2019) #96/Subscription-Backend: CLI-Timeout (300s) killt Läufe bzw. verschluckt Konzepte still — kein Retry-Budget, Exit 0 trotz Verlust #210-Kommentare 1:1 migriert);main()greift per Attribut zu — kein Mega-Unpacking mehr.Verhaltens-Erhalt (Kern des Reviews)
Alle 7 Pfad-Divergenzen bewusst parametrisiert erhalten (kein stiller Semantik-Wechsel):
background_map={}hart im by-chapter (#102 bleibt offen), kumulatives remaining_concepts-Dekrement (Äquivalenzcount_actionable == len(actionable)im Review verifiziert),chunk.textvs.overview/textals Planner-/Filter-Basis (drei getrennte Text-Params), related_mentions-Dedup, concept_map-setdefault-Merge, Stage-Labels/Ellipsis pro Pfad. Einzige gewollte Änderungen: by-chapter erbt durch die Dedup die Planner-/Extractor-_spans (No-op ohne Phoenix; BackgroundExtractor-Span bleibt korrekt Normal-only).RED-Beweis (TDD)
test_orchestrator_quality_wiring.pyvon Positions-Indizes (result[7],result[-1], …) auf Attribut-Zugriffe umgeschrieben → gegen den Tupel-Code 2 failed (AttributeError: 'tuple' object has no attribute 'citation'/'quality_report') → nach Refactor grün. Keine Assertion abgeschwächt (Attribut-Asserts sind strikter).Suite
5766 passed, 3 skipped, 4 deselected (339 s); ruff format+check sauber. CI-Smoke-E2E (voller main()-Stage-0–7 auf examples/zettelkasten-primer.pdf, LLM gestubbt, inkl. CrossRef-Override-Zweig der historischen Wiring-Bugs), by-chapter-capsys-Integrationstests: grün und unverändert. Der
_save_draft_state→_load_draft_state-Roundtrip war zunächst nur eine manuelle Probe (Kontrollrunden-Fund: keine CI-Abdeckung) — jetzt als committeter Regressionstestgenerative/tests/test_load_draft_state_roundtrip.py(Commit 91ef915: alle 19 RunContext-Felder, citation-Factory inkl. physical_pages-Spy; Suite 5766 → 5767 passed).Offene Abnahme: realer E2E-Dry-Run (Grund für Draft-Status)
Der geforderte reale LLM-Lauf wurde protokollkonform NICHT gestartet: freier RAM die gesamte Session 1,1–2,1 GB (< 3-GB-Guard; RAM-Kill-Lehre aus den #185-Messläufen). Nachhol-Kommando (aus dem Worktree, sobald ≥ 3 GB frei):
Erfolgskriterien: Exit 0, ≥1 Note in
.cache/eval/baseline/zettelkasten-primer/, kein[Stage-6-Crash], kein Traceback. Der Lauf ergänzt echte Backend-Calls + Stage 8 — die geänderte Wiring-Logik selbst ist durch Smoke+Suite+Roundtrip abgedeckt.Reviews
continue-Semantik des leeren Kapitels). 1 Minor:citation-Feld könnteOptional[CitationMeta]typisiert sein (Kosmetik, Backlog).Kontrollrunde (2026-07-12, zweite unabhängige Review-Ebene)
count_actionable == len(actionable)-Äquivalenz per Probe bestätigt; RunContext-Konstruktion nutzt ausschließlich Keyword-Args (Positionsrisiko strukturell ausgeschlossen); stdout/Stage-Labels exakt erhalten. 8 Kandidaten aktiv widerlegt (u. a. Empty-Chapter-related-Akkumulation, Dekrement-Timing, source_path-Identität). Einziger Fund (Low, Coverage): die--load-drafts-Rekonstruktion hatte keinen committeten Regressionstest, und die Roundtrip-Formulierung im Body implizierte CI-Abdeckung — beides behoben: Test nachgezogen (91ef915), Body-Satz korrigiert (s. o.).len(TEXT.split()) == 10neben dem eigentlichenctx.word_count-Assert) — adjudiziert: harmlos, dokumentiert die Herleitung des Erwartungswerts, kein Handlungsbedarf.