Rank4AI Fleet · Operations

Fleet Automations — Operations Guide

Where the fleet automations live, what's in them, that they're tracked, and how to pick them up. 46 agents run on this Mac via launchd. Verified live 3 Jul 2026.

Change today — everything now runs inside desk hours (9–5) with retries

3 Jul 2026: Automations only fire when the Mac is awake. Rather than move to a cloud VPS, 18 agents that were scheduled at night or early morning were moved into ~09:00–16:30, each with two+ retry slots — so if the first attempt is missed or fails, a later slot the same day picks it up automatically. The laptop stays the host; the schedule now matches when it's reliably on. Originals backed up to ~/.launchagents-backup-2026-07-03/.
Residual to decide: four weekly jobs (content-refresh, embeddings-audit, question-monitor, peptideclear weekly-intelligence) still land on Sunday — a day you're often not at your desk. Moving them to a weekday afternoon would close the last gap (was mid-change when paused).

1 · Where everything lives (4 places)

ThingLocationNotes
Triggers / schedules~/Library/LaunchAgents/*.plistmacOS launchd. One .plist per agent = schedule + which script + env vars. 45 active.
Disabled agents~/Library/LaunchAgents/_disabled/Parked (mostly a separate trading project + retired jobs). 59. Moving a plist here = off.
The scripts~/*.py, ~/fleet-tools/*, ~/automations/*, ~/rank4ai-dashboard/scripts/*The plist's ProgramArguments gives the exact path.
Logs/tmp/*.log⚠️ /tmp wipes on reboot — an empty log ≠ never ran. Path is in each plist's StandardOutPath.
"Did it run?" markers~/.rank4ai_*, ~/.merchanthq_*, ~/.peptideclear_*, ~/.fleet_*Dated dotfiles in home. The most reliable "is it producing?" signal.

2 · What's in them (46 loaded agents)

Content publishing (8)

PeptideClear suite (blog, questions, deep-dive, weekly-intel, citation-refresh, data-fetch), MI gap-finder, github-publish

YouTube pipelines (3)

merchanthq, peptideclear, marketinvoice

Indexing / search (6)

merchanthq daily-indexing email, Google indexing, Bing monitor + reminder, weekly-citations, ai-citation-watch

Audits / quality (7)

site-audit, fleet-baseline-audit, antislop-spotcheck, deploy-health, embeddings-audit, content-refresh, reality-check

Leads / monitoring (7)

form-canary, lead-canary, lead-watcher, lead-telegram, forum-monitor, question-monitor, quora-prompt

Finance data feeds (4)

companies-house, fca, boe-base-rate, licensing-refresh

Infra (8)

dashboard, fleet-sync, fleet-inbox-sync, sync-icloud, functions-guard, audit-server, cloudflared-tunnel, bigquery-reminder

The watchdog (1)

automation-health — see section 3

Full per-agent detail: ~/control-panel/FLEET_SITES_AND_AUTOMATIONS.md

3 · Tracking — the watchdog (so nothing dies silently)

Built 2 Jul 2026 after YouTube + the MerchantHQ email failed unnoticed for weeks. It's the safety net.
Script~/fleet-tools/automation-health.py (pinned to /usr/bin/python3 so a brew upgrade can't break it)
Agentcom.fleet.automation-health — runs 12:00 / 16:00 / 20:00 daily
Checks(1) any agent with a non-zero last exit · (2) a critical agent that got disabled/unloaded · (3) a daily producer whose output marker is stale
AlertsTelegram on any problem; silent when healthy
Status file~/control-panel/AUTOMATION_HEALTH.md — always shows the last result

4 · How to pick them up (the commands)

# what's running + last exit status (0 = ok, non-zero = failed last run)
launchctl list | grep -iE "rank4ai|fleet|merchanthq|peptideclear"

# current health in one shot
/usr/bin/python3 ~/fleet-tools/automation-health.py

# inspect one agent (schedule, script, log, env)
plutil -p ~/Library/LaunchAgents/com.merchanthq.daily-indexing.plist

# read its log + confirm it produced today
tail -30 /tmp/merchanthq_daily_indexing.log
ls -lat ~/.merchanthq_*

# turn an agent ON / OFF / run it NOW
launchctl load -w  ~/Library/LaunchAgents/<label>.plist
launchctl unload   ~/Library/LaunchAgents/<label>.plist
launchctl kickstart -k gui/$(id -u)/<label>

5 · Gotchas (learned the hard way)

Laptop-asleep = silent skip

launchd only fires when the Mac is awake — a missed slot is skipped, not deferred. That's why we moved jobs into desk hours + added retries.

Bare python3 is fragile

A Homebrew upgrade to 3.14 broke every agent calling bare python3 (missing PIL / anthropic). Fixed by installing deps into brew python; pinned interpreters are immune.

Empty /tmp log ≠ not run

Reboot wipes /tmp. Trust the ~/. dated markers, not the logs.

Never double-run deploys

Two hosts running the same deploy/publish job = clobbering + double-posts. One host at a time.