homelab-codex-ws/kb/subsystems
oskar ae16deb8d3 feat(mail-sync): scheduler PIHA, takt kb-ingest, runbook i dokumentacja
Domkniecie Kroku 7. Realizuje Decyzje (d) reconu (host schedulera + korekta
kadencji indeksowania) i doklada dokumentacje wg konwencji OKF.

Scheduler (NIEAKTYWOWANY — wlacza operator):
- jobs/mail-imap-sync/systemd/{service,timer,run.sh} — wzorzec 1:1 z kb-ingest,
  OnCalendar=hourly, Persistent=true, log do pliku (nigdy sam journal).
- hosts/piha/jobs.yaml — deklaracja jednostek host-level na PIHA. Nowy plik, bo
  services.yaml jest dla kontenerow (supervisor dopasowuje jego wpisy do world-state
  i wpis niekontenerowy dryfowalby wiecznie jako missing_service). Nic tego pliku
  nie czyta — istnieje po to, zeby "shadow-deploy family" z otwartego pytania 5
  reconu multiagentowego byla spisana, a nie tylko na nodzie.

Takt indeksowania (Decyzja (d), recon §3.3):
- kb-ingest.timer: 03:30 raz na dobe -> co 2 h. O 03:30 SOLARIA prawie na pewno spi
  (potwierdzone odczytem kb_ingest_embed_skipped 1 z 2026-08-06), a tick dostaje
  teraz etap mailowy: ~60 nowych chunkow na dobe pomijanych kazdej nocy sprawiloby,
  ze backlog rosnie monotonicznie i KbEmbedBacklogGrowing zapala sie NA STALE.
  Co 2 h zamiast stalej godziny — probe Ollamy sam wybiera okno, wiec ktorys tick
  w nie trafi niezaleznie od nawykow operatora.
- cyclic_ingest: etap mailowy (mail_body_ingest --only-unchunked), import miekki,
  wiec venv bez tego pakietu pomija etap zamiast wywracac wrapper. Predykat bledu
  JEST luzniejszy niz wlasne main() tamtego joba i to jedyne takie miejsce w tym
  wrapperze: pojedynczy trwale nieparsowalny mail nie moze zamrozic
  last_success_timestamp i zapalic KbIngestStale na zawsze. Bledy per-mail sa
  publikowane jako kb_ingest_mail_parse_errors, nie chowane.

Obserwowalnosc: KbMailSyncStale (6 h bez udanego ticku). Alert na cisze w skrzynce
ODRZUCONY (decyzja operatora, zgodna z reconem §3.4) — zero nowych maili to legalny
stan skrzynki, a alert zapalajacy sie na zdrowym systemie zostaje wyciszony
i przestaje dzialac wtedy, gdy jest potrzebny.

Dokumentacja:
- kb/services/job-mail-imap-sync.md (OKF), kb/runbooks/mail-sync-run.md — 9 krokow
  pierwszego uruchomienia, w tym checklista 4 punktow [do weryfikacji na zywo]
  z reconu (polityki dostawcow — do sprawdzenia, nie do zgadniecia) oraz pomiar
  STATUS (MESSAGES) na Fastmailu, na ktorym zapada ODLOZONA decyzja o historii.
- kb-mail-pillar.md: KOREKTA JMAP -> IMAP dla Fastmaila jako decyzja 2026-08-06;
  stary zapis zostaje jako historia z data. Zamkniete "unifikacja adaptera"
  i "sizing Gmaila"; otwarte zostaje "sizing Fastmaila" — celowo, bo rozstrzyga
  je pomiar, nie dyskusja.
- kb-m5-faza-mailowa.md: Krok 7 IN PROGRESS + tabela zakresu wdrozonego,
  kb-m5-faza3.md: korekta harmonogramu i sekwencji wrappera,
  pkg-kb-mail.md: rozpisany ze stubu, kb-postgres.md: lista migracji + 005.

Testy: 642 passed (calosc kb-mail, kb-retrieval i jobs). systemd-analyze verify
na timerze przechodzi, OnCalendar=0/2:00:00 normalizuje sie do co 2 h.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 15:30:57 +02:00
..
access-model.md feat(kb): przenosiny type=subsystem do kb/subsystems/ (18 plikow, bez SPLIT) 2026-08-04 16:58:04 +02:00
action-approval-model.md feat(kb): przenosiny type=subsystem do kb/subsystems/ (18 plikow, bez SPLIT) 2026-08-04 16:58:04 +02:00
agent-operating-procedures.md fix(kb): przepiecie wszystkich odwolan wewnetrznych po migracji 2026-08-04 16:58:46 +02:00
agent-system.md feat(kb): przenosiny type=subsystem do kb/subsystems/ (18 plikow, bez SPLIT) 2026-08-04 16:58:04 +02:00
capability-model.md feat(kb): przenosiny type=subsystem do kb/subsystems/ (18 plikow, bez SPLIT) 2026-08-04 16:58:04 +02:00
control-plane.md fix(kb): przepiecie wszystkich odwolan wewnetrznych po migracji 2026-08-04 16:58:46 +02:00
core-stack.md feat(kb): przenosiny type=subsystem do kb/subsystems/ (18 plikow, bez SPLIT) 2026-08-04 16:58:04 +02:00
deployment.md feat(kb): SPLIT deployment -> subsystem + incident 2026-08-04 16:58:46 +02:00
event-system.md feat(kb): przenosiny type=subsystem do kb/subsystems/ (18 plikow, bez SPLIT) 2026-08-04 16:58:04 +02:00
fleet-inventory-verify.md fix(kb): przepiecie wszystkich odwolan wewnetrznych po migracji 2026-08-04 16:58:46 +02:00
fleet-inventory.md feat(kb): przenosiny type=subsystem do kb/subsystems/ (18 plikow, bez SPLIT) 2026-08-04 16:58:04 +02:00
kb-documents-pillar.md fix(kb): 13 pozostalych odwolan do sciezek sprzed migracji 2026-08-04 17:02:12 +02:00
kb-mail-pillar.md feat(mail-sync): scheduler PIHA, takt kb-ingest, runbook i dokumentacja 2026-08-06 15:30:57 +02:00
kb-overview.md feat(kb): SPLIT kb-00-overview -> subsystem + decision 2026-08-04 16:58:46 +02:00
legacy-services-list.md feat(kb): przenosiny type=subsystem do kb/subsystems/ (18 plikow, bez SPLIT) 2026-08-04 16:58:04 +02:00
networking.md feat(kb): przenosiny type=subsystem do kb/subsystems/ (18 plikow, bez SPLIT) 2026-08-04 16:58:04 +02:00
observer.md feat(kb): przenosiny type=subsystem do kb/subsystems/ (18 plikow, bez SPLIT) 2026-08-04 16:58:04 +02:00
recon-multiagent.md fix(kb): przepiecie wszystkich odwolan wewnetrznych po migracji 2026-08-04 16:58:46 +02:00
repo-operating-contract.md feat(kb): stuby dla katalogow z kodem bez README (8 plikow) 2026-08-04 16:58:04 +02:00
service-lifecycle.md feat(kb): SPLIT lifecycle -> subsystem + runbook 2026-08-04 16:58:46 +02:00
service-model.md feat(kb): przenosiny type=subsystem do kb/subsystems/ (18 plikow, bez SPLIT) 2026-08-04 16:58:04 +02:00
stability-agent-architektura.md feat(kb): SPLIT stability-agent-rollout -> runbook + subsystem 2026-08-04 16:58:46 +02:00
standards.md feat(kb): przenosiny type=subsystem do kb/subsystems/ (18 plikow, bez SPLIT) 2026-08-04 16:58:04 +02:00
topology.md feat(kb): przenosiny type=subsystem do kb/subsystems/ (18 plikow, bez SPLIT) 2026-08-04 16:58:04 +02:00