boot.sh je javljao '0 failing' bez obzira na stvarnost — root cause + popravka (MC #106901)

MC: #106901 · Datum: 2026-08-15 · Autor: John · Verifikacija: verify-106901 (native agent, 12/13 PASS) 

 Simptom 

 boot.sh je na svakom bootu javljao Daemons: 29 loaded, 0 failing — bez obzira na stvarnost . Istog minuta launchctl list pokazuje 10 com.alai / com.john agenata s ne-nultim exitom, a RESOLVER alert javlja FLEET-CRITICAL: 7 daemon(s) in failed state . 

 Posljedica: disk incident 2026-08-06 (168 GB litestream staginga) prošao je neprimijećen jer je boot javljao da je sve u redu. 

 Dva defekta (ne tri) 

 1. Tiho preskakanje — glavni uzrok 

 PLIST="$HOME/Library/LaunchAgents/${DAEMON_ID}.plist"
if [ -f "$PLIST" ]; then # nema fajla => preskoci BEZ brojanja
 LOADED=$(launchctl print "gui/$UID_VAL/$DAEMON_ID" 2>&1 || true)
 if echo "$LOADED" | grep -q "Could not find"; then ... 

 Sedam monitorisanih tier-1/2 daemona nema plist fajl : b2-offsite-backup , network-watchdog , db-backup , ops-guardian , email-briefing , minion-dispatcher , minion-watchdog . if se za njih nikad nije otvorio, pa se launchctl nikad nije ni pozvao. Prijavljivani kao zdravi. 

 2. Pogrešan signal 

 Provjera je mjerila učitanost , ne neuspjeh . Daemon učitan ali s exit != 0 (uključujući -9 , ubijen signalom) računao se kao ispravan. 

 Povučena tvrdnja 

 U prvoj verziji nalaza tvrdio sam i treći defekt — da grep "Could not find" ne pogađa nepostojeći label. Pogađa. launchctl ispiše Bad request. u prvoj liniji i Could not find service "..." u drugoj. Oboreno nezavisnom verifikacijom; tvrdnja povučena. Defekt #1 sam objašnjava cijeli kvar. 

 Popravka 

 Jedan launchctl list snapshot; kolona 2 = last exit status, kolona 3 = label , poklapanje preko awk polja: 

 LAUNCHCTL_SNAPSHOT=$(launchctl list 2>/dev/null)
DAEMON_ROW=$(printf '%s\n' "$LAUNCHCTL_SNAPSHOT" | awk -v lbl="$DAEMON_ID" '$3 == lbl {print; exit}')
if [ -z "$DAEMON_ROW" ]; then
 # nije ucitan (ukljucujuci "nema plist") — NE preskace se
else
 DAEMON_EXIT=$(printf '%s\n' "$DAEMON_ROW" | awk '{print $2}')
 [ "$DAEMON_EXIT" != "0" ] && # pada
fi 

 Namjerno NIJE korišten grep '1\t' — taj obrazac hvata PID-ove i već je dao lažnih „22 daemon failing" u mc.js checku (triage 2026-08-07). Ista greška se ne ponavlja u drugom alatu. 

 Ispravljena je i riječ: DAEMON_TOTAL je broj monitorisanih iz inventara, ne broj učitanih. "29 loaded" je bilo netačno kad 7 nije učitano. 

 Dokaz 

 PRIJE: Daemons: 29 loaded, 0 failing
POSLIJE: Daemons: 29 monitored, 7 failing (7 nije učitano) — launchctl list 

 Kontrolni test pušta obje logike nad istim inventarom: stara → failing: 0 , nova → nije učitano: 7 . bash -n exit 0; ostale boot linije (MC / B2 / LightRAG / Disk) netaknute. 

 Backup: ~/system/boot.sh.bak-106901-20260815-135917 

 Šta ovo NE rješava — pročitati prije nego se osloniš na boot 

 Popravljena provjera javlja učitano ali pada: 0 , iako ih 10 stvarno pada. Nije bug — ti daemoni nisu u inventaru : 

 
 daemon exit u inventaru 
 
 com.alai.litestream -9 NE 
 com.alai.email-ingest-monitor 1 NE 
 com.john.lightrag-monitor 1 NE 
 com.john.infra-drift-detector 1 NE 
 com.john.critical-tools-healthcheck 1 da, ali tier=3, monitored_by_boot=false 
 
 

 Šire mjerenje (MC #107192): 157 učitanih agenata, 11 s ne-nultim exitom, 67 zapisa u inventaru, 23 zapisa pokazuju na plistove koji ne postoje, i nijedan com.alai.* agent nije u inventaru — inventar je pisan za com.john.* generaciju i nikad proširen. 

 Prije popravke boot je lagao. Poslije popravke boot govori istinu — ali usku. Razlika je bitna i ne treba je zamagliti. 

 Poznat šum 

 com.alai.ollama-serve-v2 exit 1 je benigna port-trka s homebrew.mxcl.ollama (triage 2026-08-07). Filter za takve slučajeve ide u inventar (npr. benign_nonzero_exit: true uz obrazloženje), ne u boot.sh — inače se logika opet zamagljuje. 

 Vezano 

 
 MC #107192 — inventar ne prati ono što stvarno pada (tabela odluke u ~/system/evidence/107192/ ) 
 Evidence: ~/system/evidence/106901/boot-daemon-check-fix-2026-08-15.md 
 Peer-verify: ~/system/evidence/106901/peer-verify-transcript-2026-08-15.md