docs(sessions): log sesji 2026-08-05 — batching embed (start fazy mailowej)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
oskar 2026-08-05 15:26:41 +02:00
parent 75116ad0a5
commit 04251b5bfb

View file

@ -0,0 +1,87 @@
---
okf: "0.1"
type: session-log
visibility: private
status: active
updated: 2026-08-05
links: []
---
# 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 **martwy**`gave_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).