EvoNexus

April 9, 2026 · View on GitHub

Routines are automated workflows that run on a schedule via the ADW Runner.

Core vs Custom

TypeLocationTrackedDescription
CoreADWs/routines/YesEssential system routines shipped with the repo
CustomADWs/routines/custom/No (gitignored)User-created, workspace-specific routines

Core Routines

RoutineScriptAgentSchedule
Good Morninggood_morning.py@clawdiaDaily 07:00
End of Dayend_of_day.py@clawdiaDaily 21:00
Memory Syncmemory_sync.py@clawdiaDaily 21:15
Weekly Reviewweekly_review.py@clawdiaFriday 08:00
Memory Lintmemory_lint.py@clawdiaSunday 09:00
Daily Backupbackup.pysystematicDaily 21:00

Memory Sync follows the LLM Wiki pattern: extracts knowledge from daily logs, meetings, and git changes, then propagates updates across related memory files (e.g., a role change updates people/, glossary.md, and CLAUDE.md). Updates memory/index.md (catalog) and memory/log.md (operation log) after each run.

Custom Routines

Custom routines live in ADWs/routines/custom/ (gitignored) and are scheduled via config/routines.yaml (also gitignored).

To create a custom routine, say "create a routine" and the create-routine skill will guide you.

config/routines.yaml

daily:
  - name: "My Routine"
    script: my_routine.py
    time: "19:00"
    enabled: true

weekly:
  - name: "Weekly Report"
    script: weekly_report.py
    day: friday
    time: "09:00"
    enabled: true

monthly:
  - name: "Monthly Close"
    script: monthly_close.py
    day: 1
    time: "08:00"
    enabled: true

Scheduled Tasks (One-Off)

Scheduled tasks are non-recurrent actions that execute once at a specified date/time. Unlike routines (which repeat on cron), a scheduled task runs once and is done.

Use cases:

  • "Post no LinkedIn sexta 10h"
  • "Roda o financial pulse amanha 8h"
  • "Envia resumo pro Telegram as 14h"

Creating Scheduled Tasks

Via CLI: Say "schedule this for" or use the schedule-task skill.

Via Dashboard: Go to /tasks → click "New Task" → fill the form.

Via API:

POST /api/tasks
{
  "name": "Post LinkedIn — Summit",
  "type": "skill",           # skill | prompt | script
  "payload": "social-post-writer LinkedIn post about Summit",
  "agent": "pixel-social-media",
  "scheduled_at": "2026-04-11T16:00:00Z"
}

Task Lifecycle

pending → running → completed
                  → failed (can retry)
pending → cancelled

The scheduler checks for pending tasks every 30 seconds and executes them in background threads.

Dashboard

Tasks are managed at /tasks in the dashboard with:

  • Filter by status (pending, running, completed, failed)
  • Create/edit/cancel/delete actions
  • "Run Now" for immediate execution
  • View result/error output

Triggers (Reactive)

Triggers are event-driven actions that execute in response to external events — unlike routines (cron-based) and tasks (one-off scheduled).

Types

TypeDescription
WebhookReceives HTTP POST from external services, validates HMAC signature, executes action
EventReacts to integration events (configured in YAML or Dashboard UI)

Supported Sources

SourceSignatureExample Events
GitHubX-Hub-Signature-256push, pull_request, issues, release
StripeStripe-Signaturecharge.succeeded, subscription.created, invoice.paid
LinearX-Linear-SignatureIssue (create/update), Comment
TelegramToken-basedmessage, callback_query
DiscordEd25519message_create
CustomX-Webhook-SignatureAny user-defined

Configuration

Triggers are defined in config/triggers.yaml (synced to DB on startup) or created via Dashboard UI / Skill CLI.

webhooks:
  - name: "Deploy Notification"
    source: github
    event_filter:
      event: push
      branch: main
      repo: "EvolutionAPI/evolution-api"
    action_type: skill
    action_payload: "discord-send-message Deploy da evolution-api na main"
    agent: pulse-community
    enabled: true

API Endpoints

MethodEndpointAction
GET/api/triggersList triggers
POST/api/triggersCreate trigger
PUT/api/triggers/<id>Update trigger
DELETE/api/triggers/<id>Delete trigger
POST/api/triggers/<id>/testTest trigger
POST/api/triggers/webhook/<id>Webhook receiver (public, HMAC-validated)

Webhook URL Format

After creating a webhook trigger, configure the external service to POST to:

https://your-dashboard.example.com/api/triggers/webhook/<trigger_id>

Use the secret (shown on creation) to configure HMAC signing in the source service.

Dashboard

Triggers are managed at /triggers in the dashboard with:

  • Filter by type (webhook/event), source, enabled/disabled
  • Create/edit/delete/test actions
  • Toggle enable/disable
  • View execution history
  • Copy webhook URL
  • Regenerate webhook secret

Dynamic Routine Discovery

Routines are discovered dynamically from script files. The system:

  1. Scans ADWs/routines/*.py (core) and ADWs/routines/custom/*.py (custom)
  2. Extracts agent from docstring (via AgentName pattern)
  3. Builds make-IDs automatically (e.g. financial_pulse.pyfin-pulse)

No hardcoded mappings needed — add a new script and it's automatically available.

How It Works

  1. Scheduler runs embedded in the dashboard (make dashboard-app)
  2. Core routines are hardcoded in scheduler.py
  3. Custom routines are loaded from config/routines.yaml
  4. Scheduled tasks are stored in SQLite and checked every 30 seconds
  5. Each routine/task invokes Claude Code CLI via the ADW Runner (ADWs/runner.py)
  6. Runner logs to ADWs/logs/ (JSONL + metrics)
  7. Reports saved to workspace folders

Manual Execution

# Core routines (dedicated targets)
make morning      # Good Morning
make eod          # End of Day
make memory       # Memory Sync
make memory-lint  # Memory Lint
make weekly       # Weekly Review
make backup-daily # Daily Backup

# Any routine (core or custom) via dynamic runner
make run R=fin-pulse        # Financial Pulse
make run R=community-week   # Community Weekly
make run R=licensing        # Licensing Daily

# List all available routines
make list-routines

# All commands
make help

Agent Teams (Experimental, Opt-in)

Parallel multi-agent versions of consolidation routines. Instead of one agent collecting data sequentially, Agent Teams spawn domain-specific teammates that work in parallel.

Trade-off: ~3-5x higher token cost, but faster execution and each agent uses its own domain expertise.

TargetNormal equivalentLeadTeammates
make team-strategymake run R=strategy-digest@sage@atlas, @flux, @pulse, @pixel
make team-dashboardmake run R=dashboard@clawdia@atlas, @flux, @pulse, @dex
make team-weeklymake run R=weekly-review@clawdia@atlas, @flux, @pulse

Scripts live in ADWs/routines/teams/. These are never scheduled — run manually when you want speed or richer cross-domain analysis.

Requires Claude Code v2.1.32+ and the experimental flag (already enabled in .claude/settings.json):

{ "env": { "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1" } }