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).
| Job | When | What it does | Command | Type |
|---|
| Nightly refresh + publish | 04:30 (every day)16:30 ET | The 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.sh | Fortress |
| 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-window | Fortress |
| 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.sh | Fortress |
| 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.sh | Fortress |
| 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-window | Fortress |
| EOD close run (forced) | 03:48 (Tue, Wed, Thu, Fri, Sat)15:48 ET | The 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 ET | The 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 stop | 03: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.sh | Fortress |
| Stop live watchers (post-close sweep) | 05:05 (Tue, Wed, Thu, Fri, Sat)17:05 ET | 05: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 stop | Fortress |
| Prune run artifacts | 08:00 (Sat)20:00 ET | Deletes 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 report | 08:30 (Sat)20:30 ET | Runs 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.sh | Fortress |
| This page | 09:00 (Sat)21:00 ET | Regenerates 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 |
| Job | When | What it does | Command | Type |
|---|
| Chain-grid census | 05:15 (Sat)17:15 ET | Refreshes 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 census | 05:00 (Tue)17:00 ET | Refreshes 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 CoPilot | always 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 8924 | Always on |
| Launchpad control panel | always 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.py | Always on |
| Sector rotation radar | every 15 min | Scans ~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 --auto | Fortress |
| Remote trigger relay | always on (KeepAlive) | Always-on listener that lets a browser button trigger a local script run. | /opt/homebrew/bin/python3 ~/fortress/scripts/trigger_server.py | Always on |
| Encrypted weekly backup | 05:30 (Sun)17:30 ET | Encrypted 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 --apply | Maintenance |
| Health workout tracker | 21:15 (every day)09:15 ET | Not 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.sh | Health |
| X/Twitter digest | every 15 min | Rebuilds the X digest page and deploys it. Cheap, no IBKR. | /bin/bash -c cd ~/fortress/scripts && /usr/bin/env python3 x_digest_html.py --deploy | Fortress |
| Google updater (third party) | every 60 min | Not 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 load | Not ours. Google software update agent. | com.google.keystone.agent | Third party |
| Google Keystone (third party) | on load | Not ours. Google software update agent. | com.google.keystone.xpcservice | Third party |
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