homelab-codex-ws/docs/sessions/2026-08-05-kb-mail-batching.md
oskar 04251b5bfb docs(sessions): log sesji 2026-08-05 — batching embed (start fazy mailowej)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-05 15:26:41 +02:00

3 KiB
Raw Permalink Blame History

okf type visibility status updated links
0.1 session-log private active 2026-08-05

Sesja 2026-08-05 — batching embed (start fazy mailowej)

Weryfikacja zaległości

  • Uninstall natywnego ollama.service na PIHA — POTWIERDZONY. Unit i binarka nie istnieją.
  • Session log fazy 4 istniał już na masterze (e619c00). Zgłoszony brak był fałszywym alarmem z niedociągniętego working tree na SOLARII.
  • task/prune-fix (R1R3 + M1 VPS) gotowy do review w subsystemie A — 0526af1, 285 insertions, z testami.

Task kb-mail-batching

Zmergowany do mastera: 02a0079 + 75116ad.

Bug blokujący Etap B (znaleziony i naprawiony)

Goły builtins.TimeoutError z wyczerpanego aiohttp ClientTimeout nie był łapany przez flush_embed_buffer — obsługa łapała wyłącznie ClientError. Skutek: zawieszona Ollama (failure mode „przyjmuje połączenie i milczy") wywalała cały run, bez breakera i bez flushu. Klasy przejściowe wyliczone są teraz jawnie w TRANSIENT_EMBED_ERRORS.

embed_batch_resilient()

  • Retry z backoffem wykładniczym.
  • Po wyczerpaniu retry — probe /api/tags:
    • backend żywy → bisekcja izolująca trujący chunk,
    • backend martwygave_up, bez bisekcji.

Semantyka breakera (zmiana)

Breaker liczy give-upy (backend down wg probe), nie nieudane batche. Porażka częściowa nie przesuwa licznika. Zmiana znaczenia --max-embed-failures opisana w kb/phases/kb-m5-faza-mailowa.md §9.

Parametryzacja i metryki

  • Flagi: --batch-size, --embed-retries, --embed-backoff, --embed-timeout (env MAIL_INGEST_*).
  • Metryka embed_ms_per_chunk.
  • Wiersze zembedowane w umierającym batchu są commitowane przed abortem.

Decyzja: brak fallbacku SOLARIA→PIHA dla backfillu

Świadomie nie powstaje — 790 ms/embed na CPU × 271k ≈ 60 h na współdzielonym nodzie. Tor online (embed_router) zachowuje fallback. Rozdział torów udokumentowany w docstringu embed.py / embed_batch oraz w kb/services/job-mail-body-ingest.md.

Benchmark mail-body-ingest-bench

Read-only (SELECT + inferencja). Wyniki na SOLARII (bge-m3, GPU), próbka 640 chunków (avg 1559 znaków):

batch ms/chunk
32 22.70
64 16.57
128 15.82

Default batch 64 POTWIERDZONY — zysk z 128 to ~4.5%, a przy 64 koszt bisekcji jest mniejszy. Ekstrapolacja na 271k chunków: ~1.25 h GPU vs ~11 h przy per-request.

Testy

117 testów zielonych.

Wyjątki procesowe

Żadnych. Commit z PIHA nie zaistniał — CC nie dopisał wskaźnika, uznano za zbędne.

TODO wynikające

  • Rotacja hasła kb-postgres — poszło do historii shella i na screeny sesji.
  • POSTGRES_PASSWORD plaintext w services/*/service.yaml — kandydat na backlog sekretów.
  • kb-site robots.txt blokuje fetch Claude (ROBOTS_DISALLOWED) — fix: X-Robots-Tag noindex zamiast Disallow (wariant B), przy okazji taska kb-site.
  • Backfill 271k — dopiero po merge + deploy task/prune-fix (subsystem A).