Last section of the SOP. The one that changed how I think about the whole build:
Silence was ambiguous.
My agent stays quiet when no setup passes the confluence gate. That's by design — I don't want "found nothing" spam, or the alert stops meaning anything.
But an agent that found nothing and an agent that crashed at 08:03 look identical on my phone. Both produce no message. I could go three days thinking the market was quiet when the process had been dead since Tuesday.
Worse: my alert layer runs server-side, independent of my agent. So the trigger still fires — into nothing. No error, no crash report, no trace.
Fix isn't a notification. It's a heartbeat: every completed run writes one line to my morning brief. No ping, no noise. But next time I sit down I can see it ran. Plus a watchdog that messages me only if that line goes missing for 24 hours — the one alert that fires when the system is quiet.
Second thing: I split partial failures by blast radius. One ticker fails → use the rest, but name the gap. Shared dependency fails → stop everything. Half-built output → discard entirely.
Throwing away good work because unrelated work failed is bad. A gap you don't name is worse — that's when you think you've seen the whole market.