Mail Pipeline E2E Debug — MC #105892 (2026-07-17)
Agent ID: john Verdict: FINDINGS (FINAL — svih 5 rola isporučilo; R5 E2E = FAIL na koracima slack-feed i search)
MC #105892 — Mail pipeline E2E debug: konsolidovani izvještaj
Tim: petter-graff (R1 arhitektura), martin-kleppmann (R2 fetch), codecraft (R3 triage), bruce-momjian (R4 storage/index), angie-jones (R5 E2E user test). Evidence: architecture.md, fetch-layer.md, triage-layer.md, index-layer.md, e2e-user-test.md (ovaj dir). Metod: read-only debug, bez izmjena koda, bez restarta daemona, LightRAG/neo4j netaknuti, 1 bounded test mail (R5).
Izvršni sažetak (za CEO)
Mail sistem NIJE "slomljen na čitanju" — svih 19 naloga se polluje svakih 5 min i kanonski store (~/system/databases/email-inbox.db, 30.7 MB, 7518 mailova) se aktivno piše. Slomljeni su SORTIRANJE i INDEKSIRANJE, a MONITORING o fetch sloju sistematski laže:
- TRIAGE MRTAV: inbox-watcher.js (jedina klasifikacijska autoritet, kreira MC taskove, označava \Seen) — njegov launchd job NIJE aktivan. Mailovi ulaze u DB i ostaju u status='new' zauvijek. Ovo je root cause zašto su Avaz/Asmir mailovi visili nepročitani 3 sedmice (uz sekundarni faktor: boot signal se izvršava samo na ručni session start, nema cron kadencu).
- MONITORING LAŽE: email-imap-db-audit.js zna kredencijale za samo 5 od 18 naloga → 13 naloga "Unknown account" u svakom runu → 197 uzastopnih hourly lažnih/šumnih alarma od 10.07.; watchdog exit 1 je "alarm poslan" (by design), ne crash. Jedini TVRDI ingest gap: alai INBOX 69/70 poruka (zadnja 2 dana) nije ušlo u DB.
- INDEKSIRANJE NE POSTOJI: discover.js nema EMAIL kategoriju; email-inbox.db nema FTS. 7518 mailova je nevidljivo tool-first pretrazi (gap protiv ZAKON NULA). Dodatno, 532/7518 (7.1%) redova nema body — backfill alat ima regex bug (0/96 success).
- KRHKOST FETCHA: 19 sekvencijalnih
bw get itempoziva pod globalnim lockom po ciklusu → 1198 ETIMEDOUT u ~mjesec dana (samoizlječivo, ali hronični porez; 3 uzastopna faila = 30-min blackout po nalogu). - SECURITY: NODE_TLS_REJECT_UNAUTHORIZED=0 hardkodiran u plistu email-agenta (gasi TLS verifikaciju za cijeli proces) + copy-paste u vault-fix.sh i vault-keeper.js.
Ključne korekcije pogrešnih premisa (vrijednost cross-verifikacije)
- "email-inbox.db = 0 B mrtvi keš" → POGREŠNO: to je decoy u ~/system/tools/ (+ još 3 stub kopije); živa baza je ~/system/databases/email-inbox.db (R2+R4 nezavisno).
- "13/17 naloga ne fetcha" → POGREŠNO: to je bug audit alata (VAULT_NAMES 5/18), fetch radi (R2 enumeracija svih 19 + R3 root cause).
- "slack #inbox posta inbox-watcher svakih 5 min" → POGREŠNO: posta mail-digest.js, event-driven 8–100+ min (R3); watcher uopšte ne radi.
- "signal filter guta Avaz mailove" → POGREŠNO: grep pattern ispravan (repro R3); problem je kadenca izvršavanja + slice(-15) latentni rizik.
- himalaya putanja nije mrtav kod: namjerno HIMALAYA_DISABLED=1 (MC #104595, R2).
Detaljni nalazi po sloju
R1 architecture.md — dvofazna arhitektura (email-agent fetch → email-inbox.db → inbox-watcher triage), tabela kanonskih skripti vs duplikata/decoya, 8 rangiranih failure modova.
R2 fetch-layer.md — per-account tabela (19/19 OK u ciklusu 12:41–12:44), bw lock bottleneck mehanika (mail-native.js:117-210), circuit breaker putanja, TLS=0 lokacija (plist), himalaya status, DB dokaz da su Avaz/Asmir mailovi ingestovani 5–6 dana kasno (01.07. 19:42) u status='new'.
R3 triage-layer.md — ingest-monitor exit-kod semantika (0/1/2), VAULT_NAMES 5-vs-18 root cause, gap-state 197h, signal-filter repro (UID 51/52/53 matchuju), slack feed liveness (12:43), email-classifications.jsonl mrtav od 19.06. (writer nikad daemonizovan), DLQ replay path mismatch (~/Library/Logs/ALAI/ vs ~/system/logs/).
R4 index-layer.md — kanonski store dokaz (7518 redova, MAX created_at danas 12:44), discover.js bez EMAIL izvora (test upiti vraćaju samo LightRAG/BookStack ručne bilješke), nema FTS tabele, body-integrity 0/96 regex bug, alai INBOX 69/70 gap, audit "Unknown account" za 13 naloga.
R5 e2e-user-test.md — VERDIKT: FAIL (2 od 6 koraka pala). Test mail UID 647, poslan 13:01:30Z.
- SEND: PASS (uz 1 bw vault timeout od 30 s prije uspješnog retryja — potvrđuje R2 contention).
- UNREAD: PASS — pojavio se ~4 s nakon slanja, stabilan i nakon 11 min.
- SIGNAL FILTER: PASS — test mail ispravno NE matchuje, stvarni Avaz/Asmir signali i dalje matchuju (nula lažnih pozitiva/negativa — potvrđuje R3 repro).
- SLACK #inbox: FAIL — 3 polla kroz 11 min, feed zamrznut na 12:43; ni test mail ni drugi novi mail (UID 648) nisu objavljeni. Napomena sinteze: R3 je utvrdio da poster (mail-digest.js) objavljuje event-driven s razmacima 8–100+ min, pa je "FAIL unutar 11 min" FAIL naspram DOKUMENTOVANOG očekivanja od ~5 min — samo očekivanje je pogrešno/nedokumentovano, a feed je u najboljem slučaju nepredvidiv (za CEO signal svrhu = nepouzdan).
- READ: PASS — header/body/marker tačni.
- SEARCH (discover.js): FAIL — 0 stvarnih pogodaka u 2 pokušaja / 11 min. Napomena sinteze: Angin pripisani uzrok ("email-inbox.db = 0 B keš") je zastarjela premisa — stvarni uzrok po R4: discover.js nema EMAIL izvor + baza nema FTS. Zaključak (nema živog mail indeksa) stoji. Angine preporuke pokrivene follow-upovima F3 (search) i F4/F1 (feed/triage kadenca).
Follow-up fix taskovi (prijedlog, po prioritetu)
F1 (H) Reaktivirati/popraviti inbox-watcher launchd job — triage autoritet ne radi; mailovi ostaju u status='new'; uzrok utvrditi instrumentisanim replayem (logovi rotirani). F2 (H) email-imap-db-audit.js: proširiti VAULT_NAMES na svih 18 naloga → gasi 197h lažnih alarma i vraća povjerenje u monitoring; zatim istražiti stvarni alai INBOX 69/70 gap. F3 (M) discover.js EMAIL kategorija + FTS5 indeks nad emails(subject, body, from_addr) — zatvara ZAKON NULA gap. F4 (M) Boot-signal kadenca: launchd/cron trigger za signal grep (ne samo ručni session start); riješiti slice(-15) prozor za stare unread. F5 (M) email-body-integrity-check.js envelope-ID regex fix (0/96) + backfill 532 praznih bodyja. F6 (M) Vault throughput: keširati bw kredencijale po ciklusu / smanjiti 19 sekvencijalnih poziva pod lockom (1198 ETIMEDOUT/mjesec). F7 (L) Ukloniti NODE_TLS_REJECT_UNAUTHORIZED=0 iz plist/vault-fix.sh/vault-keeper.js — CA chain fix (Securion). F8 (L) DLQ replay path fix + odluka o email-classifications.jsonl writeru (daemonizovati ili ugasiti); počistiti 4 decoy email-inbox.db stuba i .bak fajlove.