# 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**:

<table id="bkmrk-daemonexitu-inventar"><thead><tr><th>daemon</th><th>exit</th><th>u inventaru</th></tr></thead><tbody><tr><td>`com.alai.litestream`</td><td>**-9**</td><td>NE</td></tr><tr><td>`com.alai.email-ingest-monitor`</td><td>1</td><td>NE</td></tr><tr><td>`com.john.lightrag-monitor`</td><td>1</td><td>NE</td></tr><tr><td>`com.john.infra-drift-detector`</td><td>1</td><td>NE</td></tr><tr><td>`com.john.critical-tools-healthcheck`</td><td>1</td><td>da, ali tier=3, `monitored_by_boot=false`</td></tr></tbody></table>

Š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`