Cron jobs16
Launchd agents43
Fortress jobs17
Power events1
Generated31 Oct 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 1 min later so the opening auction and IBKR's busiest moment pass first.
21:31 (09:31 ET)
evening_run open run (open + 1 min); retries every 5 min until TWS answers. It launches all five live watchers at once, Rebuild first; tabs go live in ~2 to ~13 min. A wedged TWS gets one ntfy: restart it.
21:31-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 / 04:00 (15:00 ET)
Ledger run (--ledger-window), Tue-Sat: the batch producers write the calibration ledgers while the watchers keep streaming. The ET gate keeps the tick at 15:00 ET (03:00 in EDT, 04:00 in EST).
03:43
pmset wakes the Mac, so a sleeping machine still makes the 03:48 close-window tick and the 04:30 nightly.
03:48 / 04:48 (15:48 ET)
EOD close-window run (--force --skip-live-covered --close-window), Tue-Sat. The ET gate lets through only the tick inside 15:45-15:59 ET (03:48 in EDT, 04:48 in EST); the other exits at once. SKIPS any batch job whose live watcher is still streaming (CF already fresher), so ~7 min. Leaves the watchers running.
03:59:45 / 04:59:45 (15:59:45 ET)
close_snapshot.sh, Tue-Sat: the LAST live snapshot. Force-pushes every watcher's page to CF, then stops the watchers, then refreshes the NLV History tab. The ET gate keeps the tick in the 15:59 ET minute (03:59 in EDT, 04:59 in EST).
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.
05:05
Post-close straggler sweep of the live watchers (launch_live.sh --action stop), Tue-Sat, after the close in both DST regimes. close_snapshot.sh stops them at 15:59:45 ET; this only catches one that dodged it. Relaunch on the next 21:31 open.
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
Open run (09:31 ET)21:15, 22:15 (Mon, Tue, Wed, Thu, Fri)Starts the five _live watchers AT THE BELL, all together (Rebuild first, 10 s apart), after sheet_to_pf --export, cc_timing and one TWS handshake probe (refused = ntfy 'TWS wedged, restart', no launch). Then only what no watcher covers: Lane D light jobs, stock_fight -> fortress_repair (after Rebuild's first live cycle), RunStats, deploy_cf, NTFY. The batch producers moved to the 15:00 ET ledger run (2026-10-14).bash ~/fortress/scripts/evening_run.sh --preopen-windowFortress
Open run (09:31 ET)21:31, 22:31 (every day)Starts the five _live watchers AT THE BELL, all together (Rebuild first, 10 s apart), after sheet_to_pf --export, cc_timing and one TWS handshake probe (refused = ntfy 'TWS wedged, restart', no launch). Then only what no watcher covers: Lane D light jobs, stock_fight -> fortress_repair (after Rebuild's first live cycle), RunStats, deploy_cf, NTFY. The batch producers moved to the 15:00 ET ledger run (2026-10-14).bash ~/fortress/scripts/evening_run.shFortress
Open run (09:31 ET)every 5 min, 00,01,02,21,22,23 (every day)Starts the five _live watchers AT THE BELL, all together (Rebuild first, 10 s apart), after sheet_to_pf --export, cc_timing and one TWS handshake probe (refused = ntfy 'TWS wedged, restart', no launch). Then only what no watcher covers: Lane D light jobs, stock_fight -> fortress_repair (after Rebuild's first live cycle), RunStats, deploy_cf, NTFY. The batch producers moved to the 15:00 ET ledger run (2026-10-14).bash ~/fortress/scripts/evening_run.shFortress
Ledger run (15:00 ET)03:00, 04:00 (Tue, Wed, Thu, Fri, Sat)The ONLY writer of the calibration ledgers (owner 2026-10-14). ET-gated to Mon-Fri 15:00-15:14 ET on NYSE trading days; SGT ticks at 03:00 and 04:00 so exactly one lands in-window across EDT/EST. sheet_to_pf --export, cc_timing, fortress_rebuild first (TWS to itself for its grand fetch), then cc_scanner + fortress_fight --all, then cc_check + cc_manager, deploy_cf. 30-min budget, done by ~15:31 ET. The watchers keep streaming.bash ~/fortress/scripts/evening_run.sh --ledger-windowFortress
EOD close run (forced)03:48 (Tue, Wed, Thu, Fri, Sat)15:48 ETThe US-CLOSE analysis pass, ET-gated (--close-window) to Mon-Fri 15:45-15:59 ET and fired by SGT ticks at 03:48 and 04:48 so exactly one lands in-window across EDT/EST (~15:48 ET). Producers only where a watcher is unhealthy (--skip-live-covered; cc_scanner with --no-ledger, the 15:00 ledger run already wrote today), plus Lane D, stock_fight, fortress_repair; --force bypasses the daily marker. Does NOT launch or stop the live tools (close_snapshot.sh stops them at 15:59:45 ET after the final snapshot push), so the SGT morning shows near-close state on everything.rm -rf ~/fortress/runs/evening_run/.run.lock.d 2>/dev/null; bash ~/fortress/scripts/evening_run…Fortress
EOD close run (forced)04:48 (Tue, Wed, Thu, Fri, Sat)16:48 ETThe US-CLOSE analysis pass, ET-gated (--close-window) to Mon-Fri 15:45-15:59 ET and fired by SGT ticks at 03:48 and 04:48 so exactly one lands in-window across EDT/EST (~15:48 ET). Producers only where a watcher is unhealthy (--skip-live-covered; cc_scanner with --no-ledger, the 15:00 ledger run already wrote today), plus Lane D, stock_fight, fortress_repair; --force bypasses the daily marker. Does NOT launch or stop the live tools (close_snapshot.sh stops them at 15:59:45 ET after the final snapshot push), so the SGT morning shows near-close state on everything.rm -rf ~/fortress/runs/evening_run/.run.lock.d 2>/dev/null; bash ~/fortress/scripts/evening_run…Fortress
Final live snapshot + watcher stop03:59, 04:59 (Tue, Wed, Thu, Fri, Sat)At 15:59:45 ET, fired by SGT ticks at 03:59 and 04:59 (the ET gate keeps the one inside the 15:59 ET minute, so DST is handled): force-pushes every live watcher's page to CF (bypassing the per-tool cadence, so nothing is up to 5 min stale at the bell), THEN stops all watchers (stop writes .stopped, which would drop their pages from the push), THEN refreshes the NLV History tab from cc_manager_live's final reading. Zero TWS.bash ~/fortress/scripts/close_snapshot.shFortress
Stop live watchers (post-close sweep)05:05 (Tue, Wed, Thu, Fri, Sat)17:05 ET05:05 SGT straggler sweep, after the close in both DST regimes (04:00 SGT in EDT, 05:00 in EST). close_snapshot.sh stops the watchers at 15:59:45 ET; this only catches one that dodged it. Watchers relaunch clean on the next 21:31 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
Fortress CoPilotalways on (KeepAlive)The decision surface on :8924 (zero IBKR, zero orders: it relays the owner's PLACE ORDER click to order_exec.py). Always-on under launchd since 2026-10-08 (RunAtLoad + KeepAlive, AbandonProcessGroup so a restart never touches a working order's worker); launch_live.sh no longer starts it. Restart: launchctl kickstart -k gui/$(id -u)/com.abhi.fortress.copilot./opt/homebrew/bin/python3 ~/fortress/scripts/fortress_copilot_live.py --watch --port 8924Always on
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 15 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 and ~/performance (Performance Log, with its git history and raw data archive) 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:43AM 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…
cd ~/fortress/scripts && python3 open_reliability.py sample --cron
cd ~/fortress/scripts && python3 open_reliability.py grade --cron --no-ntfy
cd ~/fortress/scripts && python3 ~/fortress/_md_files/data_fetch/2026-10-16_goal_b/goal_b_captu…
/opt/homebrew/bin/python3 ~/fortress/scripts/chrome_reaper.py
/opt/homebrew/bin/python3 ~/fortress/scripts/coverage_overnight.py
/opt/homebrew/bin/python3 ~/fortress/scripts/cc_timing.py --earnings-refresh
/opt/homebrew/bin/python3 ~/fortress/scripts/fortress_list_live.py
/opt/homebrew/bin/python3 ~/fortress/scripts/fortress_hub.py --port 8930
/opt/homebrew/bin/python3 ~/fortress/scripts/mobile_live.py
/opt/homebrew/bin/python3 ~/fortress/scripts/mobile_bundle.py --push
/opt/homebrew/bin/python3 ~/fortress/mobile/ios/reinstall.py
/opt/homebrew/bin/python3 ~/fortress/scripts/sheet_to_pf.py --intraday
/opt/homebrew/bin/python3 ~/fortress/scripts/sim_contest.py --tick
/opt/homebrew/bin/python3 ~/fortress/scripts/spot_stream_live.py
/opt/homebrew/bin/python3 ~/fortress/scripts/ta_extremes.py
/opt/homebrew/bin/python3 ~/fortress/scripts/tesla_dash.py --deploy
/opt/homebrew/bin/python3 ~/fortress/scripts/tesla_dash.py --charge-watch
/opt/homebrew/bin/python3 ~/fortress/scripts/trade_log_sync.py --baseline
/opt/homebrew/bin/python3 ~/fortress/scripts/trade_log_sync.py --agent
/opt/homebrew/bin/python3 ~/fortress/scripts/trade_log_sync.py --eod-verify
/opt/homebrew/bin/python3 -u ~/fortress/scripts/trade_log_sync.py --watch-fills
/opt/homebrew/bin/python3 ~/fortress/scripts/trade_log_sync.py --morning-push
/opt/homebrew/bin/python3 ~/fortress/scripts/trade_log_sync.py --rollover
/opt/homebrew/bin/python3 ~/fortress/scripts/tws_portfolio_live.py
/opt/homebrew/bin/python3 ~/fortress/scripts/watcher_guard.py
/opt/homebrew/bin/python3 ~/nili-performance/worker.py
/usr/bin/caffeinate -i /opt/homebrew/bin/python3 ~/performance/coach.py --auto
/opt/homebrew/bin/python3 ~/performance/data_insights.py
/opt/homebrew/bin/python3 ~/performance/ios/reinstall.py
/opt/homebrew/bin/python3 ~/performance/meal_logger.py
/bin/bash ~/performance/hourly.sh
/opt/homebrew/bin/python3 ~/performance/workout_sync.py
/opt/homebrew/bin/python3 ~/personal_dash/ios/reinstall.py
/bin/bash ~/personal_dash/nightly_commit.sh
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.