Cron jobs10
Launchd agents11
Fortress jobs14
Power events1
Generated05 Sep 2026 09:00
Clock now09:00 SGT / 21:00 ET

The daily rhythm (SGT, with ET in brackets)

21:30 (09:30 ET)
US market OPENS. Nothing fires yet: the evening_run gate is deliberately set 2 min later so the opening auction and IBKR's busiest moment pass first.
21:32 (09:32 ET)
evening_run fires its first attempt (open + 2 min); retries every 5 min until TWS answers. On every OPEN run it launches the 4 live watch tools, even after batch failures (a watcher can do its own fetch and recover).
21:32-04:00
US regular trading hours. sector_pulse refreshes every 2 min and pushes the live snapshots to CF. The live watch tools stream all session.
03:00 (15:00 ET)
Last plain retry slot for the day's main run.
03:10
pmset wakes the Mac, so a sleeping machine still makes the 03:15 EOD and 04:30 jobs.
03:15 (15:15 ET)
EOD close run (--force --skip-live-covered), Tue-Sat. Refreshes dashboards 45 min before the close, but SKIPS any batch job whose live watcher is still streaming (its CF dashboard is already fresher). Does not launch live tools. STOPS all live watchers the moment it finishes, to clear the IBKR queues.
03:29 (15:29 ET)
BACKSTOP stop of all live watchers (launch_live.sh --action stop), Tue-Sat. The 03:15 EOD run already stops them when it finishes; this only catches a run that hangs past 03:29. Watchers relaunch clean on the next 21:32 open run.
04:00 (16:00 ET)
US market CLOSES.
04:30
nightly_cron: docs/publish pass, CF deploy, git push, regression gate. Emails only on failure.
Sat 08:00 / 08:30 / 09:00
Weekly maintenance: purge aged run artifacts, calibration report, then this page regenerates.
Sun 05:30
Encrypted weekly backup to iCloud.
Sun 22:00
Health workout tracker refresh + deploy (not fortress).

Cron jobs

JobWhenWhat it doesCommandType
Nightly refresh + publish04:30 (every day)16:30 ETThe docs/publish pass (no IBKR analysis). Runs 11 jobs in order: miner_update, x_digest_html, update_tool_reference, sheet_to_pf_export, sheet_to_pf, trade_query, cc_timing, hedge_iv, deploy_cf, git_push, regression_suite (the full pytest suite, ~13s parallel). Emails ONLY on failure.bash ~/fortress/scripts/nightly_cron.shFortress
Main analysis run21:32, 22:32 (every day)The full 4-lane IBKR pipeline: Lane A cc_scanner, Lane B fortress_rebuild, Lane C fortress_fight/stock_fight/fortress_repair, Lane D light jobs; then the Phase 2b readers (cc_check, cc_manager), a retry pass for transient IBKR failures, RunStats, deploy_cf and NTFY. On every OPEN run it also launches the 4 _live watch tools (even after batch failures, so a watcher can do its own fetch and recover missed data).bash ~/fortress/scripts/evening_run.shFortress
Main analysis runevery 5 min, 00,01,02,21,22,23 (every day)The full 4-lane IBKR pipeline: Lane A cc_scanner, Lane B fortress_rebuild, Lane C fortress_fight/stock_fight/fortress_repair, Lane D light jobs; then the Phase 2b readers (cc_check, cc_manager), a retry pass for transient IBKR failures, RunStats, deploy_cf and NTFY. On every OPEN run it also launches the 4 _live watch tools (even after batch failures, so a watcher can do its own fetch and recover missed data).bash ~/fortress/scripts/evening_run.shFortress
Main analysis run03:00 (every day)15:00 ETThe full 4-lane IBKR pipeline: Lane A cc_scanner, Lane B fortress_rebuild, Lane C fortress_fight/stock_fight/fortress_repair, Lane D light jobs; then the Phase 2b readers (cc_check, cc_manager), a retry pass for transient IBKR failures, RunStats, deploy_cf and NTFY. On every OPEN run it also launches the 4 _live watch tools (even after batch failures, so a watcher can do its own fetch and recover missed data).bash ~/fortress/scripts/evening_run.shFortress
EOD close run (forced)03:15 (Tue, Wed, Thu, Fri, Sat)15:15 ETThe US-CLOSE analysis pass at 03:15 SGT. Same 4-lane pipeline as the open run, --force bypasses the daily marker. Does NOT launch the live tools (too near the close).rm -rf ~/fortress/runs/evening_run/.run.lock.d 2>/dev/null; bash ~/fortress/scripts/evening_run…Fortress
Stop live watchers (EOD backstop)03:29 (Tue, Wed, Thu, Fri, Sat)15:29 ET03:29 SGT BACKSTOP that stops ALL live watch tools so their IBKR market-data queues clear before the close. The 03:15 EOD run already stops them the moment it finishes; this only catches a run that hangs past 03:29. Watchers relaunch clean on the next 21:32 open run.bash ~/fortress/scripts/launch_live.sh --action stopFortress
Prune run artifacts08:00 (Sat)20:00 ETDeletes aged/oversized artifacts under runs/ (history >30d) so the tree does not creep. --apply actually removes; without it, dry-run.bash -lc 'cd ~/fortress/scripts && python3 purge_runs.py --apply'Maintenance
Calibration report08:30 (Sat)20:30 ETRuns the three predicted-vs-realised graders (cc_scanner --score-ledger, fortress_fight --score-calibration, fortress_rebuild --score-calibration) and publishes one combined dashboard to CF.bash ~/fortress/scripts/weekly_calibration.shFortress
This page09:00 (Sat)21:00 ETRegenerates this scheduled-jobs page from the live crontab / launchd / pmset state and republishes it. Self-documenting: if you add a job, it appears here.bash -lc 'cd ~/fortress/scripts && python3 schedule_docs.py --deploy'Maintenance

Launchd agents

JobWhenWhat it doesCommandType
Chain-grid census05:15 (Sat)17:15 ETRefreshes the shared per-expiry real-strike grid cache (runs/chain_grids.json) for the whole roster. OFF-BROKER since 2026-09-02 (module_chain_census: one HTTPS fetch per ticker from CBOE's listed-series file, ~1 min, zero TWS load): 05:00 SGT Tue-Sat after the close + 19:00 SGT Mon-Fri pre-open catch-up. The old TWS walk (wildcard reqContractDetails, ~5 s/grid, wedged TWS 25-40 min past its exit and killed 5 of 10 evening batches) is now --census-source tws only, behind the reference-walk gate. A Saturday 05:15 SGT parity audit (--census-audit 12) diffs 12 grids against TWS, report only./bin/bash -c exec /opt/homebrew/bin/python3 -u ~/fortress/scripts/fortress_rebuild.py --chain-c…Fortress
Chain-grid census05:00 (Tue)17:00 ETRefreshes the shared per-expiry real-strike grid cache (runs/chain_grids.json) for the whole roster. OFF-BROKER since 2026-09-02 (module_chain_census: one HTTPS fetch per ticker from CBOE's listed-series file, ~1 min, zero TWS load): 05:00 SGT Tue-Sat after the close + 19:00 SGT Mon-Fri pre-open catch-up. The old TWS walk (wildcard reqContractDetails, ~5 s/grid, wedged TWS 25-40 min past its exit and killed 5 of 10 evening batches) is now --census-source tws only, behind the reference-walk gate. A Saturday 05:15 SGT parity audit (--census-audit 12) diffs 12 grids against TWS, report only./bin/bash -c exec /opt/homebrew/bin/python3 -u ~/fortress/scripts/fortress_rebuild.py --chain-c…Fortress
Launchpad control panelalways on (KeepAlive)Local web control panel on :8788 for running any fortress tool with options. Always-on (RunAtLoad + KeepAlive), restarted automatically if it dies./opt/homebrew/bin/python3 ~/fortress/scripts/launchpad_server.pyAlways on
Sector rotation radarevery 5 minScans ~57 industry/theme groups (free Yahoo data, NOT IBKR) and deploys to CF. Its own ET-clock gate means it only really works during US RTH; off-hours ticks no-op. This is also what keeps the LIVE dashboard snapshots on CF refreshing./opt/homebrew/bin/python3 ~/fortress/scripts/sector_pulse.py --autoFortress
Remote trigger relayalways on (KeepAlive)Always-on listener that lets a browser button trigger a local script run./opt/homebrew/bin/python3 ~/fortress/scripts/trigger_server.pyAlways on
Encrypted weekly backup05:30 (Sun)17:30 ETEncrypted backup of the fortress tree to iCloud. Key is stored off-Mac; retention pruning is interactive-only (launchd/TCC cannot list iCloud)./bin/bash ~/fortress/scripts/weekly_backup.sh --applyMaintenance
Health workout tracker21:15 (every day)09:15 ETNot fortress, but yours: refreshes the workout progression tracker in ~/Health and deploys it to the health-protocol CF Pages site./bin/bash ~/Health/refresh_and_deploy.shHealth
X/Twitter digestevery 15 minRebuilds the X digest page and deploys it. Cheap, no IBKR./bin/bash -c cd ~/fortress/scripts && /usr/bin/env python3 x_digest_html.py --deployFortress
Google updater (third party)every 60 minNot ours. Google's own updater wake task.~/Library/Application Support/Google/GoogleUpdater/Current/GoogleUpdater.app/Contents/MacOS/Goo…Third party
Google Keystone (third party)on loadNot ours. Google software update agent.com.google.keystone.agentThird party
Google Keystone (third party)on loadNot ours. Google software update agent.com.google.keystone.xpcserviceThird party

Power schedule (pmset)

EventWhenWhy it matters
wakepoweron3:10AM every dayWakes the Mac so the overnight cron jobs actually fire on a sleeping machine.

Undocumented

These scheduled entries have no description in schedule_docs.py. Add them to DESCRIPTIONS so this page stays complete:
bash -lc 'cd ~/fortress/scripts && python3 cc_scanner.py --csv ~/fortress/scripts/active_fortre…
Fortress scheduled-jobs reference · regenerated weekly (Sat 09:00 SGT) by schedule_docs.py straight from crontab -l, ~/Library/LaunchAgents and pmset -g sched.
Add or change a job and it appears here on the next run. ET times are DST-correct as of generation.