Cron Timer Registry System Hub

The master catalog of all systemd user-space timers running on the OpenClaw VPS. 56 timers are active (probed 2026-05-03); 62 timer unit files exist on disk. Read this hub before adding, modifying, or disabling any timer — it documents ownership, schedule, failure state, and governance gate compliance. The main agent owns ~80% of cron scheduling (bottleneck — see §Bottleneck). Two timers activate failing services every run. One governance-critical timer (security-audit-funnel.timer) has missed its last Monday run.

Quick reference

FieldValue
Canonical filen/a — no CRON-REGISTRY.md exists; this hub IS the registry
Live state probesystemctl --user list-timers --all --no-pager | grep -c timer
Documented count0 (no prior registry)
Live count56 timers listed (probed: 2026-05-03); 62 unit files on disk
Drift (documented vs live)n/a — first audit; PF-B spec noted “57” at pre-flight; live probe at authoring shows 56 active
Timer unit files on disk62 (ls ~/.config/systemd/user/*.timer | wc -l)
Last audit2026-05-03
Drift alertcron (tool-calls-health-check.timer every 5 min for CHOKEPOINT-1 drift; weekly-index-audit.timer Phase 2 pending for general governance)
Governance gateG-FAILED-SERVICE-MTTR · G-SERVICE-PRE-START-DOC
Owner agent_summary (~80% of timers)

⚠️ CRITICAL FLAGS (PF-A + PF-B surfaced)

FLAG 1: security-audit-funnel.timer — missed Monday run (G-GOVERNANCE-LOG-FRESHNESS + WAF risk)

Last fired: Mon 2026-04-27 13:00:19 UTC
Next due:   Mon 2026-05-04 13:00:00 UTC
Gap:        7 days — missed Mon 2026-04-28 and Mon 2026-05-05 was not yet due at probe time
Schedule:   Mondays 06:00 America/Los_Angeles (= 13:00 UTC)

Per CLAUDE.md §Webhook Endpoint Governance: “If this alert fires, open the registry + fix drift before proceeding with other work.” The timer itself is waiting (not failed) — but the service it activates (security-audit-funnel.service) has not run since 2026-04-27. DocuSign WAF IP allowlist staleness risk: CLAUDE.md §5 says allowlist expires conceptually every 90 days; security-audit-funnel checks this. If the service has an issue, WAF drift goes undetected.

Action required: Run node workspace/scripts/security-audit-funnel.js --dry-run manually before next deploy. Cross-link: docusign.

Timer:   investorlift-cookie-refresh.timer (every 12h, active/waiting)
Service: investorlift-cookie-refresh.service (inactive/dead after each run)
Root cause: Playwright on VPS gets 403 from IL CloudFront WAF
            ("Page loaded (status: 403)" / "Login failed: Could not find email input field")
Last failure: 2026-05-03 13:00:22 UTC
Pattern: fails EVERY run — not intermittent

This is a known architectural conflict: IL cookie refresh via Playwright MUST run on the AWS Mac Ultra (ec2-user@100.123.248.46), NOT on the VPS. The VPS IP is CloudFront-blocked. The investorlift-cookie-refresh.service uses Playwright on VPS — wrong host. Per CLAUDE.md §InvestorLift Scraping: “Never attempt to run Playwright on the VPS for IL scraping.” Cross-link: investorlift, aws.

Action required: The AWS Mac Ultra is currently impaired (since 2026-05-02 22:15 UTC). Once Mac is restored, migrate investorlift-cookie-refresh.service to SSH→Mac pattern per il-folder-photos.js proven pattern. Per G-FAILED-SERVICE-MTTR: fix, disable, or archive within 24h of persistent-failed state.

Failure log excerpt:

May 03 13:00:16 node[876570]: Page loaded (status: 403)
May 03 13:00:21 node[876570]: Login failed: Could not find email input field
May 03 13:00:22 systemd: Failed to start investorlift-cookie-refresh.service

FLAG 3: perplexity-daily-summary.service — Python TypeError (G-FAILED-SERVICE-MTTR candidate)

Timer:   perplexity-daily-summary.timer (daily 16:00 UTC, active/waiting)
Service: perplexity-daily-summary.service (inactive/dead after each run)
Root cause: TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
            in daily_summary.py line 57: sum(r.get("estimated_cost_usd", 0.0) for r in records)
            The .get() returns None when field is missing — 0.0 default doesn't fire when key exists with None value
Last failure: 2026-05-03 16:00:09 UTC (also failed 2026-05-02 16:00:44 UTC)
Pattern: fails EVERY run — not intermittent

Fix is a one-liner: change r.get("estimated_cost_usd", 0.0) to r.get("estimated_cost_usd") or 0.0 in /home/opsadmin/.openclaw/tools/perplexity-cookie-session/daily_summary.py line 57. No deploy needed — service reads Python script directly. Per G-FAILED-SERVICE-MTTR: must fix within 24h.

Failure log excerpt:

May 03 16:00:09 python3[925460]: TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
May 03 16:00:09 systemd: Failed to start perplexity-daily-summary.service

⚠️ Main agent cron bottleneck (~80% of timers)

The main agent is the de-facto scheduler for most cron jobs on the platform. Out of 56 active timers, approximately 44-47 are owned by or route through the main agent. This creates a single point of failure for platform-wide automation. If main agent’s LLM routing or workspace is degraded, the following cadences break:

  • SalesMsg token refresh (sm-token-refresh.timer, sm-token-refresh-aurora.timer)
  • Gmail processing (gmail-inbox-scanner.timer, gmail-email-harvest.timer, gmail-label-worker.timer)
  • HubSpot sync (hubspot-showing-sync.timer)
  • Memory embeds (embed-if-text.timer, memory-worker.timer)
  • Deal outreach approvals (deal-outreach-auto-approver.timer, orphan-approval-sweep.timer)

Mitigation target (OSIL Phase 4+): distribute high-frequency timers across Haiku agents; _summary is the natural second scheduler node.

Live state snapshot (2026-05-03)

MetricDocumentedLive (probed)DriftStatus
Active timers (list-timers)0 (no registry)56first audit
Timer unit files on disk0 (no registry)626 files not in active rotation
Failing associated services0 (no registry)2flagged: G-FAILED-SERVICE-MTTR
security-audit-funnel last runexpected weekly7 days agoflagged: missed run
CLAUDE.md Vault Sync Timers documented220%ok (openclaw-vault-sync, openclaw-vault-pull)
CLAUDE.md EC2 Mac LaunchDaemons documented11 (Mac impaired)0%ok (com.openclaw.tailscaled) — Mac currently impaired
Timers with no NEXT run date (- in NEXT col)unknown2flagged: arbitrage-monitor.timer, memory-worker.timer (interval-based, fire on-demand)

Full timer catalog (56 active, 2026-05-03)

Timers listed in approximate schedule frequency order. Owner agent derived from service name and agent-registry domain mapping.

Sub-minute to 5-minute interval timers

TimerScheduleOwner AgentNotes
arbitrage-monitor.timerinterval (~30s)_summaryNo next-fire NEXT shown — fires on interval
memory-worker.timerinterval (~30s)_summaryNo next-fire NEXT shown — continuous memory embed queue processor

1-minute timers

TimerScheduleOwner AgentNotes
dashboard-metrics.timer1 min_summaryDashboard metrics refresh
cgroup-pressure-monitor.timer1 minplatformVPS memory pressure monitoring (G-FAILED-SERVICE-MTTR from VPS Reboot #5 incident)

5-minute timers

TimerScheduleOwner AgentNotes
gmail-inbox-scanner.timer5 min_summaryGmail inbox scan for deal intake
openclaw-vault-pull.timer5 minplatformVault pull from GitHub (traewayrer/openclaw-vault). Cross-link github. CLAUDE.md §Vault Sync Timers.
portfolio-cache-refresh.timer5 min_summaryPortfolio cache for prediction markets
email-deal-intake.timer5 min_summaryEmail-driven deal intake → HubSpot. Cross-link hubspot.
cost-monitor.timer5 minplatformLLM cost monitoring (CHOKEPOINT-1 enforcement). Cross-link portkey.
gmail-label-worker.timer5 min_summaryGmail label application for deal classification
openclaw-vault-sync.timer15 min (uses 5 min col)platformVault push to GitHub. CLAUDE.md §Vault Sync Timers. Cross-link github.
bluebubbles-memory-sync.timer5 min_summaryBlueBubbles iMessage memory sync
monitoring-alerts.timer5 minplatformService health alerts → Discord ops. Cross-link discord.
webhook-health-monitor.timer5 minplatformWebhook endpoint health check. Cross-link webhook-architecture.

15-minute timers

TimerScheduleOwner AgentNotes
openclaw-vault-sync.timer15 minplatformrsync + git push to traewayrer/openclaw-vault. CLAUDE.md §Vault Sync Timers.
email-signal-stage-updater.timer~15 min_summaryEmail signal → HubSpot stage update
embed-if-text.timer~15 min_summaryEmbed new text chunks → SQLite memory DBs via Voyage-4. Cross-link supabase.

30-minute timers

TimerScheduleOwner AgentNotes
aurora-session-watchdog.timer30 min_summaryAurora session health check
founder-mem-checkpoint.timer30 minplatformMemory checkpoint for MEMORY.md state
showing-followup-trigger.timerevery 15 min_summaryShowing follow-up cadence triggers
orphan-approval-sweep.timer15 min_summarySweep for orphaned approval-pending items
prediction-reconcile.timer15 min_summaryPrediction market position reconciliation

Hourly timers

TimerScheduleOwner AgentNotes
sm-broadcast-sync.timerhourly_summarySalesMsg broadcast thread sync
omni-conversation-linker.timerhourly_summaryCross-platform conversation linking
prediction-expiring.timerhourly_summaryDetect expiring prediction positions

Every 2-hour timers

TimerScheduleOwner AgentNotes
prediction-trader.timer2h_summaryMain prediction trading loop

Daily timers

TimerScheduleOwner AgentNotes
openclaw-logrotate.timerdaily 00:00 UTCplatformLog rotation for all gateway + service logs
coordinate-plans-heartbeat.timerdaily 00:00 UTCplatformPlans heartbeat and status sync
investorlift-cookie-refresh.timerevery 12h (01:00 + 13:00 UTC)_summary⚠️ FLAG 2 — FAILING EVERY RUN. Playwright on VPS gets 403. Must migrate to SSH→Mac. Cross-link investorlift, aws.
dispo-learning-rollup.timerdaily 01:00 UTC_summaryDispo learning rollup for strategy updates
sm-token-refresh-aurora.timerdaily 01:00 UTC_summarySalesMsg token refresh for Aurora line. Cross-link salesmsg.
sm-token-refresh.timerdaily ~01:30 UTC_summarySalesMsg token refresh for main line. Cross-link salesmsg.
external-tool-benchmark.timerdaily 06:15 UTCplatformExternal tool latency benchmarking
perplexity-intel-cleanup.timerdaily 09:00 UTC_summaryPerplexity intel record cleanup
vendor-audit-url-verify.timerdaily 09:30 UTCplatformVendor URL health verification
hubspot-showing-sync.timerdaily + hourly_summaryHubSpot showing sync. Cross-link hubspot.
sm-approval-cleanup.timerdaily 20:00 UTC_summarySalesMsg approval queue cleanup
gmail-email-harvest.timerdaily 20:00 UTC_summaryGmail email harvest → Supabase. Cross-link supabase.
deal-outreach-auto-approver.timerdaily 20:00 UTC_summaryAuto-approve qualifying outreach deals
stack-inventory.timerdaily 12:00 UTCplatformStack inventory reconciliation (Phase 1.5 drift detection)
acquisitions-perplexity-intel.timerdaily 13:00 UTC_summaryAcquisitions intel refresh via Perplexity. Cross-link supabase.
prediction-daily.timerdaily 13:00 UTC_summaryDaily prediction position review
security-audit-funnel.timerMondays 13:00 UTCplatform⚠️ FLAG 1 — LAST RUN 2026-04-27 (7 days stale). Webhook security audit + DocuSign WAF check. G-GOVERNANCE-LOG-FRESHNESS. Cross-link docusign, cloudflare.
dispo-perplexity-intel.timerdaily 13:30 UTC_summaryDispo intel refresh via Perplexity
atlas-perplexity-intel.timerdaily 14:00 UTC_summaryAtlas/IL intel refresh via Perplexity
research-perplexity-intel.timerdaily 14:30 UTC_summaryResearch intel refresh via Perplexity
showing-day-confirmations.timerdaily 14:30 UTC_summaryShowing day confirmation sender
audit-weekly-triage.timerweekly Mon 16:00 UTCplatformAudit triage and backlog review
perplexity-daily-summary.timerdaily 16:00 UTCplatform⚠️ FLAG 3 — FAILING EVERY RUN. Python TypeError in daily_summary.py. Discord ops silent. Cross-link discord.
escrow-deadline-reminder.timerdaily 17:00 UTC_summaryEscrow deadline alerts
launchpadlib-cache-clean.timerdaily 19:39 UTCplatformSystem Launchpad cache cleanup

Weekly timers

TimerScheduleOwner AgentNotes
quo-team-map-sync.timerweekly Mon 10:00 UTC_summaryQuo team map sync for channel routing
perplexity-kb-refresh.timerweekly Mon 10:30 UTC_summaryPerplexity KB refresh for all agents. Cross-link supabase.
vendor-audit-weekly.timerweekly Mon 11:00 UTCplatformVendor audit weekly run
openclaw-gateway-restart.timerweekly Mon 11:00 UTCplatformScheduled gateway restart (maintenance window)

Long-interval timers

TimerScheduleOwner AgentNotes
master-env-backup.timerweekly (6-day offset)platformmaster.env backup to /tmp/ snapshot. Per G-NO-PLAINTEXT-CREDS — backup must not expose secrets. Cross-link 1password.

Top 10 most operationally critical timers

Per backlog B4 priority — these 10 timers have highest impact if degraded:

RankTimerWhy criticalOwnerCross-link
1sm-token-refresh.timerSalesMsg auth expires; all outbound SMS fails if token stale_summarysalesmsg
2security-audit-funnel.timerCURRENTLY STALE — DocuSign WAF + webhook drift go undetectedplatformdocusign, cloudflare
3cost-monitor.timerCHOKEPOINT-1 enforcement: detects tool_calls drift vs Portkeyplatformportkey
4gmail-inbox-scanner.timerDeal intake from email; missed scans = missed deals_summaryhubspot
5embed-if-text.timerMemory embeds queue; backlog grows unbounded if stopped_summarysupabase
6openclaw-vault-sync.timerVault push to GitHub; if stopped, overnight work not backed upplatformgithub
7investorlift-cookie-refresh.timerCURRENTLY FAILING — IL cookies expire; IL data sync breaks_summaryinvestorlift, aws
8deal-outreach-auto-approver.timerAuto-approval gate for acquisitions outreach cadence_summaryacquisitions-outreach
9webhook-health-monitor.timerDetects dead webhook endpoints before providers give up retryingplatformwebhook-architecture
10perplexity-daily-summary.timerCURRENTLY FAILING — Discord ops cost summary silent; cost blindplatformdiscord

Components

  • /home/opsadmin/.config/systemd/user/*.timer — 62 timer unit files on disk
  • /home/opsadmin/.config/systemd/user/*.service — associated service unit files (some shared across multiple timers)
  • ~/.openclaw/tools/openclaw-vault-sync.sh — vault sync script (openclaw-vault-sync.timer)
  • ~/.openclaw/tools/openclaw-vault-pull.sh — vault pull script (openclaw-vault-pull.timer)
  • ~/.openclaw/tools/perplexity-cookie-session/daily_summary.py⚠️ BUG LINE 57 — perplexity-daily-summary.service
  • ~/.openclaw/workspace/scripts/security-audit-funnel.js — security-audit-funnel.service
  • ~/.openclaw/workspace/scripts/tool-calls-health-check.js — cost-monitor drift check (CHOKEPOINT-1)

How it’s used

  • Trigger: before adding a new timer — check this hub for schedule conflicts, ownership assignment, and G-SERVICE-PRE-START-DOC compliance
  • Workflow: new timer needed → identify owner agent → check service-registry for port/service conflicts → register in CLAUDE.md §Webhook Service Port Map → create unit files → restart systemctl daemon → verify list-timers shows new entry
  • Agents involved: _summary (primary scheduler), _summary (strategic timers), _summary (IL-related), _summary (dispo cadence), _summary (outreach cadence)
  • Failure mode: timer fires → service fails → Discord ops is NOT alerted if the Discord alert service is itself failing. Current state: perplexity-daily-summary failure is silent. Always run systemctl --user list-units --state=failed after any system change.
  • Success criteria: systemctl --user list-units --state=failed returns 0 failed units; security-audit-funnel.timer LAST col is within 7 days; both FLAG 2 and FLAG 3 services exit cleanly

Agents that own critical timers

  • _summary — owns ~80% of timers; single point of failure risk
  • _summary — vault sync + session watchdog + conversation linker
  • _summary — investorlift-cookie-refresh (currently failing)
  • _summary — email-deal-intake, deal-outreach-auto-approver, email-signal-stage-updater
  • _summary — dispo-learning-rollup, dispo-perplexity-intel
  • _summary — gmail timers, escrow-deadline-reminder
  • _summary — prediction-trader, prediction-daily, prediction-history, prediction-reconcile, prediction-expiring
  • _summary — showing-day-confirmations, showing-followup-trigger, hubspot-showing-sync

Skills invoked by timer-activated services

Plans that govern timer infrastructure

Feedback rules

KB / source docs

  • API — gateway API reference (timer-activated services call gateway)
  • ARCHITECTURE.md — service table (partial; G-SERVICE-PRE-START-DOC requires registration here)

Integration hubs (timer consumers)

  • discord — alert destination for failed services and governance violations
  • supabase — embed-if-text timer writes memory chunks; cost-monitor reads tool_calls table
  • portkey — cost-monitor timer enforces CHOKEPOINT-1 drift detection
  • salesmsg — sm-token-refresh timers maintain SalesMsg auth
  • hubspot — deal-intake and showing-sync timers write HubSpot records
  • aws — investorlift-cookie-refresh MUST run on Mac Ultra, not VPS
  • investorlift — timer failure breaks IL data sync
  • github — vault-sync and vault-pull timers push/pull from traewayrer/openclaw-vault
  • cloudflare — security-audit-funnel timer checks WAF IP allowlist
  • 1password — master-env-backup timer must not expose plaintext; referenced via op://Aurora/

System maps

Open issues / TODOs

  • P0 (G-FAILED-SERVICE-MTTR): Fix perplexity-daily-summary.service — one-liner fix in daily_summary.py line 57: r.get("estimated_cost_usd") or 0.0. Henry auth required per action gate.
  • P0 (G-FAILED-SERVICE-MTTR): Migrate investorlift-cookie-refresh.service to SSH→Mac Ultra pattern. Blocked: Mac Ultra currently impaired (since 2026-05-02 22:15 UTC). Resume next session.
  • P0: Run node workspace/scripts/security-audit-funnel.js --dry-run manually — last automated run was 2026-04-27 (7 days stale, missed Monday). DocuSign WAF staleness unverified.
  • P1: 6 timer unit files on disk but NOT in active list-timers output — identify which 6 and why they’re inactive (disabled? failed to load?)
  • P1: main agent ~80% cron bottleneck — OSIL Phase 4+ target: distribute high-frequency timers to _summary as second scheduler node
  • P2: No cron-registry CHANGELOG or infra_config_changes row for any timer addition. Phase 2 weekly-index-audit.timer (OSIL) will enforce governance log freshness.
  • P2: openclaw-gateway-restart.timer fires every Monday 11:00 UTC — confirm this is intentional scheduled maintenance vs legacy artifact
  • P3: coordinate-plans-heartbeat.timer fires daily — what does it coordinate? No plan confirms this is still needed post-fragmentation-fix Phase D.

Full timer catalog

Vault sync

TimerScheduleHub pageStatus
openclaw-vault-sync.timerevery 15 minopenclaw-vault-syncactive
openclaw-vault-pull.timerevery 5 minopenclaw-vault-pullactive

Memory & embedding

TimerScheduleHub pageStatus
memory-worker.timerevery 5 minmemory-workeractive
embed-if-text.timerevery 5 minactive
bluebubbles-memory-sync.timerevery 5 minactive
gmail-label-worker.timerevery 5 min (approx)active

Cost & LLM monitoring

TimerScheduleHub pageStatus
cost-monitor.timerevery 5 mincost-monitoractive
memory-budget-report.timerdaily ~16:00active

Webhook & security

TimerScheduleHub pageStatus
webhook-health-monitor.timerevery 5 minwebhook-health-monitoractive
security-audit-funnel.timerweekly Mon 06:00 PTsecurity-audit-funnelactive
audit-weekly-triage.timerweekly Mon ~16:00active

Deals & acquisitions

TimerScheduleHub pageStatus
email-deal-intake.timerevery 5 min (approx)active
deal-outreach-auto-approver.timerevery 30 min (approx)active
email-signal-stage-updater.timerevery 10 min (approx)active
showing-followup-trigger.timerevery 5 min (approx)active
hubspot-showing-sync.timerevery 30 min (approx)active
showing-day-confirmations.timerdaily ~14:40active
orphan-approval-sweep.timerevery 15 min (approx)active
escrow-deadline-reminder.timerdaily ~17:00active

SalesMsg & outreach

TimerScheduleHub pageStatus
sm-broadcast-sync.timerhourly at :13sm-broadcast-syncactive
sm-approval-cleanup.timerevery 30 min (approx)active
sm-token-refresh.timer~6 hourlyactive
sm-token-refresh-aurora.timer~6 hourlyactive

Perplexity intel

TimerScheduleHub pageStatus
perplexity-daily-summary.timerdaily 09:00 PTperplexity-daily-summaryFAILING
perplexity-intel-cleanup.timerdaily 09:00active
acquisitions-perplexity-intel.timerdaily 13:00active
dispo-perplexity-intel.timerdaily ~13:30active
atlas-perplexity-intel.timerdaily 14:00active
research-perplexity-intel.timerdaily ~14:30active
perplexity-kb-refresh.timerweekly Mon 10:00active

OSIL / self-improvement

TimerScheduleHub pageStatus
osil-reflexion-runner.timerhourlyosil-reflexion-runneractive
osil-outcome-refresh.timer~7 hourlyactive
osil-trajectory-capture.timerdaily (approx)active
external-tool-benchmark.timerdaily 06:00 (approx)active
vendor-audit-url-verify.timerdaily 09:30active
vendor-audit-weekly.timerweekly Mon 11:00active

Predictions & trading

TimerScheduleHub pageStatus
prediction-trader.timerhourly (approx)active
prediction-daily.timerdaily 13:00active
prediction-history.timerhourly (approx)active
prediction-reconcile.timerevery 15 min (approx)active
prediction-expiring.timerevery 15 min (approx)active
arbitrage-monitor.timerevery 5 min (approx)active

Infra / system

TimerScheduleHub pageStatus
cgroup-pressure-monitor.timerevery 5 min (approx)active
aurora-session-watchdog.timerevery 30 min (approx)active
founder-mem-checkpoint.timerevery 30 min (approx)active
claude-orphan-reaper.timerevery 5 min (approx)active
monitoring-alerts.timerevery 5 min (approx)active
portfolio-cache-refresh.timerevery 5 min (approx)active
stack-inventory.timerdaily 13:00active
coordinate-plans-heartbeat.timerdaily midnightactive
openclaw-logrotate.timerdaily midnight (approx)active
openclaw-session-cleanup.timerweekly Sun 10:00active
launchpadlib-cache-clean.timerdaily ~17:00active
master-env-backup.timerweekly Sun 10:00active
openclaw-gateway-restart.timerweekly Mon 11:00 UTCactive
quo-team-map-sync.timerweekly Mon 10:00active
dashboard-metrics.timerevery 60 secdashboard-metricsactive

Gmail

TimerScheduleHub pageStatus
gmail-inbox-scanner.timerevery 20 min (approx)active
gmail-email-harvest.timerevery 30 min (approx)active

InvestorLift

TimerScheduleHub pageStatus
investorlift-cookie-refresh.timerdaily 01:00 (approx)FAILING

Dispo

TimerScheduleHub pageStatus
dispo-learning-rollup.timer~6 hourlyactive
dispo-perplexity-intel.timerdaily ~13:30active

62 timer unit files on disk; 62 active in systemctl --user list-timers (probed 2026-05-04). 10 hub pages authored in W4-S8. Remaining 52 pending Wave 5+.

Recent activity

  • 2026-05-04: W4-S8 added Full timer catalog section (62 timers, 13 categories); 10 hub pages created in wiki/cron/
  • 2026-05-03: hub created (W2-S5); live probes run (56 timers listed, 62 unit files); 3 critical flags raised; top-10 priority list authored
  • 2026-04-27: security-audit-funnel.timer last successful run (per journalctl)
  • 2026-05-03 13:00: investorlift-cookie-refresh.service failed (recurring 403)
  • 2026-05-03 16:00: perplexity-daily-summary.service failed (recurring TypeError)