Befund
Sammel-Issue Stage-8-/Eval-Effizienz (reine CPU-/Wandzeit- und I/O-Redundanz, keine Qualitätsänderung; Review 2026-07-07):
- Dieselbe PDF wird bis 3× pro Note geparst:
eval_note öffnet die Quell-PDF via fitz in build_chunks, _verification_text, _build_presence_scorer (eval_quality_v4.py:766, 781, 124, 471) und re-encodet ALLE PDF-Chunk-Embeddings pro Note (:161). Bei 10 Notes/Lauf: bis 30 Volltextextraktionen + 10× identisches Chunk-Encoding.
- Volltext-Normalisierung pro Claim:
_verify_evidence normalisiert den gesamten PDF-Text per Regex pro Claim neu (:489 via :535); der Audit-Pfad berechnet _claim_scores_from_judge nochmal für alle Claims (:794).
- Hash-Guard scannt 24-MB-JSONL linear pro Note:
find_cached_eval (eval_quality_v4.py:844-860, Aufrufer orchestrator.py:1284) liest quality_history.jsonl (23,9 MB, Records enthalten volle retrieved_contexts-Chunk-Texte, :565) komplett und parst jede Zeile — bis 10×/Lauf, wächst linear mit Historie.
- Body-Embeddings 3-4× pro Draft: ER,
flag_redundant_siblings, CrossRef-Sibling-Ranking embedden dieselben Bodies unabhängig (orchestrator.py:427, 1188; cross_reference.py:436-437); embeddings.py hat keine Memoization.
- Stage 8 rein sequenziell + stiller Cap:
orchestrator.py:1284 for-Loop (längste serielle Strecke des Laufs) und note_files[:10] — ab der 11. Note wird nie evaluiert, ohne Meldung. Umgekehrt gathern Canonicalizer-Merges ohne Semaphore (orchestrator.py:487-488) am max_concurrent_calls-Limit vorbei.
- Disk ohne Rotation:
.cache/llm 1 579 Dateien (fresh-run-Namespaces werden nie wieder getroffen), .cache/runs 519 Traces, quality_history.jsonl 23,9 MB + 22-MB-Stale-Bak, 0-Byte-DB-Waise generative/.cache/atomic_analytics.db (zwei Cache-Roots: config.py:18 vs. db.py:27-28). Gesamt 55 MB — unkritisch, aber monoton wachsend.
- (Mit A/B-Vorbehalt) Stage 6 berechnet
concept_text_window neu statt das Stage-5-Fenster aus concept_map zu nutzen (orchestrator.py:676) — Semantik minimal anders, nur nach Messung ersetzen.
Fix-Richtung
Memoisierung pro (pdf, Lauf) für Chunks/Embeddings/_normalize_for_evidence; Hash-Guard auf Index-Datei oder die vorhandene SQLite umstellen und quality_history um retrieved_contexts kürzen/rotieren; kleiner embed_body-LRU (key: hash(body)); Stage-8-Parallelität 2-3 + Cap-Meldung; Canonicalizer unter die Semaphore; Alters-/Anzahl-Rotation analog prune_old_records.
Priorität
Nach BA — spürbar bei jedem Lauf, aber nichts davon korrektheitskritisch.
Quelle: Projekt-Review 2026-07-07 (Effizienz-Subagent, alle Punkte am Code verifiziert, Disk real gemessen).
Befund
Sammel-Issue Stage-8-/Eval-Effizienz (reine CPU-/Wandzeit- und I/O-Redundanz, keine Qualitätsänderung; Review 2026-07-07):
eval_noteöffnet die Quell-PDF via fitz inbuild_chunks,_verification_text,_build_presence_scorer(eval_quality_v4.py:766, 781, 124, 471) und re-encodet ALLE PDF-Chunk-Embeddings pro Note (:161). Bei 10 Notes/Lauf: bis 30 Volltextextraktionen + 10× identisches Chunk-Encoding._verify_evidencenormalisiert den gesamten PDF-Text per Regex pro Claim neu (:489via:535); der Audit-Pfad berechnet_claim_scores_from_judgenochmal für alle Claims (:794).find_cached_eval(eval_quality_v4.py:844-860, Aufruferorchestrator.py:1284) liest quality_history.jsonl (23,9 MB, Records enthalten volleretrieved_contexts-Chunk-Texte,:565) komplett und parst jede Zeile — bis 10×/Lauf, wächst linear mit Historie.flag_redundant_siblings, CrossRef-Sibling-Ranking embedden dieselben Bodies unabhängig (orchestrator.py:427, 1188;cross_reference.py:436-437);embeddings.pyhat keine Memoization.orchestrator.py:1284for-Loop (längste serielle Strecke des Laufs) undnote_files[:10]— ab der 11. Note wird nie evaluiert, ohne Meldung. Umgekehrt gathern Canonicalizer-Merges ohne Semaphore (orchestrator.py:487-488) ammax_concurrent_calls-Limit vorbei..cache/llm1 579 Dateien (fresh-run-Namespaces werden nie wieder getroffen),.cache/runs519 Traces, quality_history.jsonl 23,9 MB + 22-MB-Stale-Bak, 0-Byte-DB-Waisegenerative/.cache/atomic_analytics.db(zwei Cache-Roots:config.py:18vs.db.py:27-28). Gesamt 55 MB — unkritisch, aber monoton wachsend.concept_text_windowneu statt das Stage-5-Fenster ausconcept_mapzu nutzen (orchestrator.py:676) — Semantik minimal anders, nur nach Messung ersetzen.Fix-Richtung
Memoisierung pro (pdf, Lauf) für Chunks/Embeddings/
_normalize_for_evidence; Hash-Guard auf Index-Datei oder die vorhandene SQLite umstellen und quality_history umretrieved_contextskürzen/rotieren; kleinerembed_body-LRU (key: hash(body)); Stage-8-Parallelität 2-3 + Cap-Meldung; Canonicalizer unter die Semaphore; Alters-/Anzahl-Rotation analogprune_old_records.Priorität
Nach BA — spürbar bei jedem Lauf, aber nichts davon korrektheitskritisch.
Quelle: Projekt-Review 2026-07-07 (Effizienz-Subagent, alle Punkte am Code verifiziert, Disk real gemessen).