Automation Catalog¶
Last audited: 2026-05-23
This catalog inventories the automation surfaces currently present on Aegis. It includes active schedulers, dormant-but-enabled queues, restart-managed services, trigger-based agents, and third-party wrappers that can run work without a human sitting at an interactive shell.
Use this page with Current Automation. That page is the short operational snapshot; this page is the detailed registry.
Legend¶
| Field | Meaning |
|---|---|
| Status | active, enabled, dormant, stale, or system as observed during the audit. |
| Trigger | Cron, interval, systemd, Docker restart, webhook/event, daemon loop, or manual/service start. |
| Side effects | Writes, external calls, messages, spending, or operational changes. |
| Billing risk | Whether this can spend money or consume the Claude programmatic credit pool. |
| Disable posture | Whether it looks safe to stop, pause, or needs review first. |
Executive Inventory¶
| Surface | Count | Status | Primary risk |
|---|---|---|---|
| User crontab | 13 executable entries | active | Duplicate market/memory work, plaintext Discord token, noisy profile poll log. |
| User systemd services | 3 custom units | mixed | claude-gateway is active and Agent SDK-backed; aegis-market is enabled but inactive while manual market processes run. |
| System timers | 15 OS timers | system | Mostly package/log maintenance; low Aegis-specific risk. |
| Docker services | 10 running containers | active | Restart-managed services can hide inner schedulers; Hermes and Aegis scheduler contain their own automation. |
| Aegis APScheduler jobs | 45 active job IDs in code path | active | Revenue/acquisition/proactive jobs can create external actions; anomaly/monitoring can create alert noise. |
| Market scheduler module | 7 jobs | running via old manual processes, not main scheduler | Duplicate with cron and inactive systemd unit. |
| Hermes cron jobs | 4 enabled jobs | active | Daily external messages and browser/product checks. |
Database scheduled_tasks |
562 rows, 561 enabled overdue | stale/dormant | No active worker found; stale enabled backlog could stampede if a worker is introduced. |
| Claude Agent SDK surfaces | 5+ code paths | mostly dormant | Will draw from Anthropic programmatic credit after 2026-06-15 if invoked. |
| Happy-Coder daemon | 1 daemon plus many old child sessions | active/stale | Third-party Claude wrapper; large growing logs; possible programmatic billing surface if it starts/resumes work. |
Host Crontab¶
These entries run as the agent user. Secrets are redacted.
| ID | Schedule | Command / path | Side effects | Logs | Risk | Disable posture |
|---|---|---|---|---|---|---|
| cron-market-news | 0 21 * * * |
scripts/market_collect_news.py --days 3 |
Pulls market news/sentiment data. | market-news.log |
API/data-provider usage. | Keep if market stack is still desired. |
| cron-memory-consolidation | 0 2 * * * |
aegis.memory.consolidation.run_maintenance_consolidation() |
Processes memory/consolidation data in PostgreSQL/FalkorDB. | memory-consolidation.log |
Possible LLM use if extraction paths activate; duplicates scheduler memory consolidation. | Review ownership; likely keep only one memory consolidation path. |
| cron-market-weekly | 0 3 * * 0 |
scripts/market_weekly_fundamentals.py |
Weekly fundamentals refresh. | market-weekly.log |
Market API usage. | Keep if market stack is active. |
| cron-feed-health | 0 */4 * * * |
scripts/check_feed_health.py --no-alert |
Checks feed health without alerting. | feed-health.log |
Low. | Safe to keep; no-alert mode. |
| cron-market-sat | 0 6 * * 6 |
scripts/market_daily_update.py |
Saturday market update. | market-daily.log |
Market API usage. | Check overlap with weekday update and market scheduler. |
| cron-balance-check | 0 * * * * |
scripts/check_balances.py |
Checks balances hourly. | balance-check.log |
Financial/account API reads. | Keep if wallet monitoring matters. |
| cron-profile-channel | */10 * * * * |
scripts/poll_profile_channel.py with DISCORD_BOT_TOKEN=<redacted> |
Polls Discord for profile analysis requests; invokes Claude Agent SDK only when profiles are queued. | profile-channel.log |
High when triggered: Claude programmatic credit/API, Twitter MCP, Discord webhook. Token stored in crontab. | Move token to env/secret store; add budget guard; consider pausing if unused. |
| cron-market-screening | 30 0,6,12,18 * * * |
scripts/market_daily_update.py --screening-only |
Four-times-daily screening. | market-screening.log |
Market API usage. | Check overlap with market module market_screening. |
| cron-market-weekday-close | 30 22 * * 1-5 |
scripts/market_daily_update.py |
Weekday evening market update. | market-daily.log |
Market API usage. | Keep or fold into one market owner. |
| cron-clawk-feed | */5 * * * * |
/home/agent/scripts/poll_clawk_feed.py |
Polls/cross-posts Clawk feed. | clawk-crosspost.log |
External posting/read risk. | Keep only if Clawk bridge is still used. |
| cron-ideas-channel | */5 * * * * |
scripts/poll_ideas_channel.py |
Polls ideas channel. | ideas-channel.log |
External message ingestion/action risk. | Review recent usefulness. |
| cron-clawk-crawl | 0 * * * * |
/home/agent/scripts/crawl_clawk_graph.py |
Hourly Clawk graph crawl. | clawk-crawl.log |
External crawl/storage. | Keep if graph is useful. |
| cron-transcript-digestion | 30 3 * * * |
scripts/ingest_transcripts.py --after <3 days ago> |
Ingests transcripts into knowledge graph/memory. | transcript-digestion.log |
FalkorDB/Postgres writes; possible LLM/transcript processing depending code path. | Keep, but watch runtime and duplicate ingestion. |
User Systemd Units¶
No user-level systemd timers were present.
| Unit | Status | Trigger | Command | Side effects | Billing risk | Disable posture |
|---|---|---|---|---|---|---|
claude-gateway.service |
active/running, enabled | systemd service | /home/agent/services/claude-gateway/run.sh serving FastAPI on 127.0.0.1:8787 |
Runs Claude Agent SDK jobs/queries, writes ~/.claude-gateway/requests and ~/.claude-gateway/jobs. |
High if called after 2026-06-15: Agent SDK programmatic usage. Last recorded gateway jobs were January 2026. | Safe to stop if unused; otherwise require budget/turn limits and request retention cleanup. |
claude-session-worker.service |
disabled/dead | systemd service if enabled | scripts/claude_session_worker.py |
Executes queued WhatsApp/Discord Claude sessions, can use bypassPermissions. |
High if re-enabled: Agent SDK programmatic usage. | Leave disabled unless deliberately reactivated with guardrails. |
aegis-market.service |
enabled but inactive/dead | systemd service if started | python -m aegis.market |
Market data scheduler process. | Market API usage; no direct Claude billing found. | Clean up: either make systemd own market automation or disable the unit. |
System Timers¶
These are OS/package maintenance timers, not Aegis product automations.
| Timer | Purpose | Aegis concern |
|---|---|---|
sysstat-collect.timer, sysstat-summary.timer |
System activity collection and summary. | Low; useful diagnostics. |
dpkg-db-backup.timer |
Package database backup. | Low. |
logrotate.timer |
Rotates logs. | Keep; especially useful given Happy/profile log growth. |
apt-daily.timer, apt-daily-upgrade.timer |
Package update checks/upgrades. | Low/medium; can contend for apt locks. |
man-db.timer, motd-news.timer, e2scrub_all.timer, systemd-tmpfiles-clean.timer |
Standard maintenance. | Low. |
| Disabled/no-next-run timers | fstrim, snapd.snap-repair, systemd-sysupdate*, ua-timer. |
Low. |
Docker Services¶
All listed containers were running during the audit.
| Container | Restart policy | Role / command | Automation inside | Risk |
|---|---|---|---|---|
aegis-scheduler |
unless-stopped |
python -c 'from aegis.scheduler import scheduler; scheduler.start(); ...' |
Main APScheduler automation catalogued below. | High operational impact. |
aegis-dashboard |
unless-stopped |
Aegis FastAPI dashboard. | Webhook/event handlers, async task routes, task UI. | Trigger-based actions; review exposed routes separately. |
aegis-docs |
unless-stopped |
MkDocs Material dev server. | Hot-reloads docs from repo bind mount. | Low. |
aegis-playwright |
unless-stopped |
Screenshot API. | Used by monitor/visual health jobs. | Browser automation and screenshots. |
falkordb |
unless-stopped |
Graph database. | Persistence service, no scheduler observed. | Data store. |
traefik |
unless-stopped |
Reverse proxy and ACME. | Watches Docker/file config; renews certs. | Public routing/TLS. |
hermes-agent |
unless-stopped |
Hermes agent gateway. | Contains Hermes cron jobs listed below. | External messaging and model usage depending Hermes config. |
hermes-webui |
unless-stopped |
Hermes UI. | UI/service surface. | Trigger-based. |
open-notebook |
always |
Supervisord single-container notebook stack. | Internal supervisor-managed services. | Product/service surface, not audited deeply here. |
serene_wright |
no |
nousresearch/hermes-agent:latest setup |
Setup container still running. | Suspicious/stale; review whether it should be removed. |
Aegis Scheduler Jobs¶
Active in aegis-scheduler via aegis/scheduler.py and module setup functions.
| Job ID | Cadence | Module/path | Side effects | Risk / notes |
|---|---|---|---|---|
health_check |
every 5 minutes | aegis.scheduler |
PostgreSQL health state. | Low. |
docker_health_check |
every 5 minutes | aegis.infra.docker_monitor |
Container health checks, remediation policy. | Medium; can restart containers if policy triggers. |
email_check |
every 30 minutes | aegis.email.scheduled |
Email check records/status. | Medium; actual fetch depends MCP/tool availability. |
monitor_check_due |
every 15 minutes | aegis.monitor.scheduler |
Runs due website monitors. | Medium; browser/network work. |
monitor_check_scheduled |
every 6 hours at :05 |
aegis.monitor.scheduler |
Scheduled website monitor sweep. | Medium. |
visual_health_check |
every 4 hours at :30 |
aegis.monitor.scheduler |
Screenshots/vision dashboard checks. | Medium; may use vision/model path. |
anomaly_metrics_collection |
every 1 minute | aegis.infra.anomaly.scheduler |
Container metric collection. | Low after tuning. |
anomaly_detection |
every 5 minutes | aegis.infra.anomaly.scheduler |
Alert creation on significant anomalies. | Medium; tuned 2026-05-23 to reduce spam. |
anomaly_baseline_update |
every 6 hours | aegis.infra.anomaly.scheduler |
Refreshes baselines. | Low. |
anomaly_metrics_cleanup |
daily 03:00 | aegis.infra.anomaly.scheduler |
Deletes old metrics. | Low. |
discord_task_poll |
every 60 seconds | aegis.discord.scheduler |
Polls Discord task channel. | Medium/high if commands can trigger actions. |
discord_command_poll |
every 30 seconds | aegis.discord.scheduler |
Polls command-center. | Medium/high. |
proactive_pattern_learning |
every 6 hours | aegis.proactive.scheduler |
Learns patterns. | Medium; possible LLM/db writes. |
proactive_opportunity_detection |
every 30 minutes | aegis.proactive.scheduler |
Detects opportunities. | Medium. |
proactive_suggestion_delivery |
every 15 minutes | aegis.proactive.scheduler |
Delivers queued suggestions. | External messaging risk. |
proactive_feedback_processing |
daily 03:00 | aegis.proactive.scheduler |
Processes feedback. | Low/medium. |
proactive_queue_cleanup |
every 4 hours | aegis.proactive.scheduler |
Queue cleanup. | Low. |
proactive_meeting_prep |
every 30 minutes | aegis.proactive.scheduler |
Auto-generates meeting prep. | Calendar/email/LLM risk. |
proactive_email_drafts |
every 30 minutes | aegis.proactive.scheduler |
Draft response automation. | Email/LLM risk; review before broad use. |
proactive_calendar_cleanup |
daily 04:00 | aegis.proactive.scheduler |
Clears old calendar events. | Data deletion risk. |
orchestration_health_check |
every 2 minutes | aegis.orchestration.scheduler |
Agent health checks. | Low/medium. |
orchestration_resource_rebalance |
every 5 minutes | aegis.orchestration.scheduler |
Rebalance orchestration resources. | Medium. |
orchestration_stale_cleanup |
hourly | aegis.orchestration.scheduler |
Cleans stale orchestration records. | Low/medium. |
orchestration_metrics_collection |
every 15 minutes | aegis.orchestration.scheduler |
Metrics collection. | Low. |
revenue_demand_cycle |
every 30 minutes | aegis.revenue.scheduler |
Demand detection. | Medium/high; prior audit found suspicious demand-signal volume. |
revenue_generation_cycle |
every 2 hours | aegis.revenue.scheduler |
Product generation. | High if it creates/listings/content. |
revenue_listing_cycle |
hourly | aegis.revenue.scheduler |
Listing update. | High if connected to public product surfaces. |
revenue_fulfillment_cycle |
every 15 minutes | aegis.revenue.scheduler |
Order fulfillment. | High; customer-facing. |
revenue_support_cycle |
every 15 minutes | aegis.revenue.scheduler |
Support processing. | High; customer-facing. |
knowledge_sync |
every 4 hours | aegis.memory.scheduler |
Knowledge graph sync. | DB/FalkorDB writes. |
knowledge_sync_critical |
every 30 minutes | aegis.memory.scheduler |
Critical memory sync. | DB/FalkorDB writes. |
knowledge_sync_daily |
daily 04:00 | aegis.memory.scheduler |
Full daily sync. | DB/FalkorDB writes. |
memory_consolidation |
daily 02:00 | aegis.memory.scheduler |
Memory consolidation. | Duplicates host cron memory consolidation. |
scout_full_scan |
00:15, 06:15, 12:15, 18:15 | aegis.scout.scheduler |
Full opportunity scan. | External scan/network/model risk. |
scout_trends_scan |
every 2 hours 06:30-22:30 | aegis.scout.scheduler |
Quick trend scan. | Medium. |
news_breaking |
every 30 minutes | aegis.news.scheduler |
Breaking news ingestion. | Network/API usage. |
news_full_aggregation |
every 4 hours at :10 |
aegis.news.scheduler |
Full news aggregation. | Network/API/model risk. |
news_regional_digest |
08:00 and 18:00 | aegis.news.scheduler |
Regional digest. | Messaging/model risk. |
acquisition_reply_check |
every 15 minutes | aegis.acquisition.scheduler |
Checks acquisition replies. | High; customer/public interaction. |
acquisition_closing |
hourly at :45 |
aegis.acquisition.scheduler |
Attempts closing conversations. | High; can post payment-link style replies. Review safeguards. |
acquisition_learning |
every 6 hours at :30 |
aegis.acquisition.scheduler |
Learning pipeline. | Medium. |
acquisition_cleanup |
daily 05:00 | aegis.acquisition.scheduler |
Queue cleanup. | Low/medium. |
morning_status |
daily 06:00 | aegis.scheduler |
Records morning status. | Low. |
evening_summary |
daily 22:00 | aegis.scheduler |
Generates daily digest. | Medium if model-backed. |
memory_cleanup |
daily 00:30 | aegis.scheduler |
Deletes old low-importance memory. | Data deletion risk. |
Market Scheduler Module¶
aegis/market/scheduler.py defines these jobs, but current main aegis/scheduler.py does not register them. During the audit, python -m aegis.market was running from old Claude shell snapshots, while aegis-market.service was enabled but inactive.
| Job ID | Cadence | Side effects | Notes |
|---|---|---|---|
market_priority_quotes |
every minute during Mon-Fri 14:00-21:59 UTC | Priority quotes. | Potentially high data-provider churn. |
market_core_equity_quotes |
every 5 minutes during Mon-Fri 14:00-21:59 UTC | Equity quotes. | Duplicates some cron market work. |
market_core_crypto_quotes |
every 5 minutes | Crypto quotes. | Always-on market data. |
market_screening |
00:30, 06:30, 12:30, 18:30 | Market screening. | Overlaps cron-market-screening. |
market_morning_digest |
daily 07:00 | Market digest. | Messaging/model risk depends implementation. |
market_evening_digest |
daily 21:00 | Market digest. | Overlaps cron-market-news. |
market_alert_checks |
every 5 minutes | Alert checks. | External alerting risk. |
Recommendation: make one owner authoritative: cron, systemd service, or Aegis scheduler. Right now ownership is muddy.
Hermes Cron Jobs¶
Stored inside hermes-agent at /opt/data/cron/jobs.json.
| Job | Schedule | Delivery | Last status | Side effects | Risk |
|---|---|---|---|---|---|
| Morning Email Check | 0 8 * * * |
Telegram | ok on 2026-05-23 | Reads email via himalaya, posts digest. |
Email/privacy + external messaging. |
| Daily Product Health Check | 30 8 * * * |
Discord | ok on 2026-05-23 | Browser checks of product sites, screenshots, Discord report. | Browser/model usage depending Hermes implementation. |
| Daily Status Sync | 45 8 * * * |
Discord | ok on 2026-05-23 | Posts daily status summary. | External messaging. |
| Weekly Tokscale Cost Report | 0 9 * * 1 |
Telegram | ok on 2026-05-18 | Runs tokscale-report.sh, posts cost report. |
Low/medium; useful billing visibility. |
Database Scheduled Tasks¶
The scheduled_tasks table is a product/API scheduling table, not an observed running scheduler.
| Metric | Value |
|---|---|
| Total rows | 562 |
| Enabled rows | 561 |
| Enabled future rows | 0 |
| Enabled overdue rows | 561 |
| Disabled rows | 1 |
Breakdown:
| Enabled | Recurrence | Task type | Count | Next-run range |
|---|---|---|---|---|
| true | daily | custom | 253 | 2026-01-13 to 2026-01-31 |
| true | once | custom | 120 | 2025-12-30 to 2026-01-30 |
| true | once | email_digest | 101 | 2025-12-30 to 2026-01-30 |
| true | hourly | custom | 84 | 2025-12-30 to 2026-01-31 |
| true | daily | webhook | 3 | 2025-12-31 |
| false | once | custom | 1 | 2025-12-30 |
No active worker was found that processes scheduled_tasks. The risk is a future worker suddenly discovering 561 enabled overdue tasks. Treat this as stale data until proven otherwise.
Recommendation: disable or archive all overdue test rows before any task-runner is introduced.
Claude / Anthropic Programmatic Surfaces¶
These are the surfaces affected by Anthropic's 2026-06-15 programmatic usage credit split if they run through Claude subscription/OAuth rather than a separate API account.
| Surface | Status | Trigger | Code path | Billing risk | Notes |
|---|---|---|---|---|---|
| Claude gateway | active service, idle by records | HTTP /v1/query, /v1/jobs on localhost |
/home/agent/services/claude-gateway |
High when called. | Last recorded jobs were January 2026; keep stopped unless needed. |
| Profile channel poller | active cron, mostly idle | Discord profile queue | /home/agent/scripts/poll_profile_channel.py |
High when a profile is queued. | Asks SDK to analyze up to 500 tweets. |
| Claude session worker | disabled | systemd if enabled | scripts/claude_session_worker.py |
High. | Uses Agent SDK and can use bypassPermissions. |
| Aegis Haiku client | installed code path | Any query_haiku or prefer_haiku=True call |
aegis/llm/haiku.py, aegis/llm/__init__.py |
Medium/high if active. | Current May metering showed no llm_tokens; historical Jan/Apr usage was real. |
| Dashboard profile analyzer | trigger route | Dashboard/Discord profile analysis route | aegis/dashboard/routes/discord_profile_analyzer.py |
High if route invoked. | Agent SDK model sonnet. |
| GLM Agent client | installed code path | GLM with use_agent=True |
aegis/llm/glm.py |
Anthropic subscriber-credit risk is lower if Z.ai env/base URL is used; still Agent SDK machinery. | Prefer direct GLM HTTP for production automation. |
Historical Claude session-token logs suggest programmatic-equivalent cost would have been roughly: January $196, February $6, April $87, May near $0 observed. This is enough to exceed Pro credits and sometimes Max 5x credits if old workloads resume.
Happy-Coder / Claude Code Wrapper¶
| Surface | Status | Trigger | Side effects | Risk | Disable posture |
|---|---|---|---|---|---|
| Happy daemon | active since 2026-01-25 | happy-coder daemon start-sync |
Maintains remote/mobile Claude sessions; open local daemon state. | Third-party Claude Code wrapper; could create programmatic/agentic Claude usage if sessions resume. | Stop if not actively used. |
| Happy Claude sessions | many old happy-coder ... claude --started-by daemon processes plus Claude child processes |
daemon/session resume | Claude Code sessions; logs under ~/.happy/logs. |
Billing and operational risk if active; significant memory/log usage. | Strong cleanup candidate. |
| Large Happy log | active log file around 870 MB | stuck scanner loop | Repeatedly checks missing Claude session JSONL. | Disk/log noise; maybe no token spend, but daemon still live. | Stop daemon and rotate/delete after review. |
claude --claude-in-chrome-mcp |
active process | Chrome/MCP integration | Browser/Claude bridge. | Unknown; likely interactive/tooling surface. | Stop if no current browser session depends on it. |
Trigger-Based Aegis Surfaces¶
These are not time schedulers, but they are automation entrypoints that can trigger work.
| Surface | Trigger | Risk |
|---|---|---|
| Discord task and command pollers | Scheduler polls every 60s/30s. | Can dispatch commands/actions from Discord. |
| Telegram command handlers | Incoming Telegram messages. | Can read calendars, memory, services, etc. depending command. |
| WhatsApp/Vonage routes | Incoming messages/webhooks. | Can create Claude sessions if worker is enabled. |
| Dashboard async tasks/routes | HTTP routes. | Can queue background work from web UI/API. |
| Revenue/acquisition routes and schedulers | Scheduler plus API/event state. | Public/customer-facing automation; review safeguards. |
| Monitor visual/browser checks | Scheduler. | Browser automation and screenshots; possible model use. |
| Open Notebook/Hermes product checks | Hermes cron and web UI. | Product monitoring, screenshots, external messages. |
Current Cleanup Priorities¶
| Priority | Item | Why |
|---|---|---|
| P0 | Stop or explicitly bless Happy-Coder daemon/sessions. | It is active, stale, log-heavy, and a third-party Claude wrapper. |
| P0 | Add a hard budget/turn guard to claude-gateway and profile analysis. |
These are the clearest Anthropic programmatic billing surfaces. |
| P0 | Archive/disable stale scheduled_tasks rows. |
561 enabled overdue tasks could stampede if a worker appears. |
| P1 | Choose one market automation owner. | Cron, stale manual processes, and inactive systemd all overlap. |
| P1 | Remove plaintext Discord token from crontab. | Secret hygiene. |
| P1 | Decide whether cron or Aegis scheduler owns memory consolidation. | Duplicate daily work at 02:00. |
| P2 | Add per-surface owner labels. | Makes future audits faster: owner, purpose, last-known-good, disable command. |
| P2 | Add log rotation for profile-channel and Happy logs. | Existing logs are noisy and one Happy log is very large. |
Suggested Disable Commands¶
Do not run these blindly; they are listed here so cleanup is deliberate.
# Stop Claude gateway if unused
systemctl --user stop claude-gateway.service
systemctl --user disable claude-gateway.service
# Keep Claude session worker disabled
systemctl --user disable --now claude-session-worker.service
# Stop stale market service if deciding cron owns market automation
systemctl --user disable --now aegis-market.service
# Inspect then stop Happy-Coder daemon/sessions
ps -eo pid,ppid,stat,lstart,cmd | grep -Ei 'happy-coder| claude$'
# Then stop through happy CLI if available, or terminate selected stale PIDs deliberately.
# Disable stale database scheduled tasks after backup/review
# UPDATE scheduled_tasks SET enabled = false WHERE enabled = true AND next_run < NOW();