/create-heartbeat
Create a new heartbeat (proactive agent scheduled with a decision prompt) for EvoNexus. Guides the user through picking an agent, setting interval, wake triggers, and the decision prompt that governs when the agent acts. Writes to config/heartbeats.yaml with pydantic validation.
$ npx -y skills add evolution-foundation/evo-nexus --skill create-heartbeat --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/create-heartbeat
Context preview
The summary Claude sees to decide when to auto-load this skill.
Create a new heartbeat (proactive agent scheduled with a decision prompt) for EvoNexus. Guides the user through picking an agent, setting interval, wake triggers, and the decision prompt that governs when the agent acts. Writes to config/heartbeats.yaml with pydantic validation.
SKILL.md
create-heartbeat.SKILL.mdname: create-heartbeat
description: "Create a new heartbeat (proactive agent scheduled with a decision prompt) for EvoNexus. Guides the user through picking an agent, setting interval, wake triggers, and the decision prompt that governs when the agent acts. Writes to config/heartbeats.yaml with pydantic validation. Use when the user says 'create a heartbeat', 'make X agent proactive', 'wake Y every 4h', 'automate X to check state and act', or wants to turn a manual state check into a scheduled protocol-run."
Create Heartbeat
> **Auth note:** For any API calls use `from dashboard.backend.sdk_client import evo` — auto-handles URL + auth, no Bearer token needed in code.
Create a new heartbeat — a proactive agent that wakes on a schedule, runs the 9-step protocol, and decides whether to act.
When to use
Use heartbeats when:
- The agent should **check state and conditionally act** (e.g., Atlas checks Linear for blockers)
- You want **no work when state is calm** (vs routines which always run)
- The same topic is **picked from an inbox** of tickets (heartbeats query tickets in step 3)
Don't use heartbeats for:
- Deterministic scheduled jobs (use a routine)
- One-off actions (use a skill or ticket)
Step 1: Understand the trigger
Ask the user: 1. **Which agent?** List agents from `.claude/agents/*.md`. Suggest by domain:
- `atlas-project` — project tracking (Linear, GitHub)
- `flux-finance` — payments, billing
- `zara-cs` — support queue
- `pulse-community` — community sentiment
- `pixel-social-media` — scheduled posting
2. **How often?** Interval in minutes / hours. Min 60s. Typical: 2h, 4h, 6h. 3. **What state to check?** This becomes the `decision_prompt`. 4. **Link to a goal?** Optional `goal_id` for context injection. Skip if no goal fits.
Step 2: Compose the decision prompt
The decision_prompt is injected into the agent's context and asks the agent:
> "Given the current state of [X], should you act? If yes, do the work and report. If no, explain briefly and skip."
Good decision prompts are specific:
✅ "Check Linear for issues in `In Progress` assigned to an unresponsive person (> 48h inactive) or blocked > 24h. If any, create action items and notify Davidson. Otherwise skip."
❌ "Check stuff" (too vague — will always act or always skip randomly)
Step 3: Pick wake triggers
Default: `interval` + `manual`. Optional:
- `new_task` — wake when a ticket is assigned
- `mention` — wake when `@<agent-slug>` appears in a comment
- `approval_decision` — wake when an approval affects this agent
30s debounce prevents multiple triggers coalescing into multiple runs.
Step 4: Required secrets (optional)
If the decision/work requires API keys (Stripe, Linear, etc.), list them as `required_secrets`. They'll be validated at startup (presence, not value).
Step 5: Write to YAML
Append the new heartbeat to `config/heartbeats.yaml`:
heartbeats:
- id: <agent-slug>-<interval>h
agent: <agent-slug>
interval_seconds: <N>
max_turns: 10
timeout_seconds: 600
lock_timeout_seconds: 1800
wake_triggers: [interval, manual]
enabled: false # opt-in — user enables after testing
goal_id: null
required_secrets: []
decision_prompt: |
<the prompt from step 2>Validate with `make heartbeat-lint` before suggesting the user enables.
Step 6: Guide the user
After writing:
1. Run `make heartbeat-lint` to validate 2. Test manually: UI `/scheduler` → Heartbeats tab → Run Now on this heartbeat 3. Review the run in `workspace/ADWs/logs/heartbeats/<id>-<date>.jsonl` 4. If the decision quality is right, flip `enabled: true` and restart dashboard
Notes
- Source of truth is the YAML. UI CRUD rewrites it atomically (temp file + rename).
- Delete a heartbeat via `/scheduler` → Heartbeats → Delete, or remove the entry from YAML and restart.
- Heartbeat cost appears in `/costs` once runs start generating `heartbeat_runs` rows.
Related: `.claude/rules/heartbeats.md`, `.claude/rules/tickets.md` (inbox), `.claude/rules/goals.md` (context).
Read more
name: create-heartbeat description: "Create a new heartbeat (proactive agent scheduled with a decision prompt) for EvoNexus. Guides the user through picking an agent, setting interval, wake triggers, and the decision prompt that governs when the agent acts. Writes to config/heartbeats.yaml with pydantic validation. Use when the user says 'create a heartbeat', 'make X agent proactive', 'wake Y every 4h', 'automate X to check state and act', or wants to turn a manual state check into a scheduled protocol-run."
Create Heartbeat
> **Auth note:** For any API calls use `from dashboard.backend.sdk_client import evo` — auto-handles URL + auth, no Bearer token needed in code.
Create a new heartbeat — a proactive agent that wakes on a schedule, runs the 9-step protocol, and decides whether to act.
When to use
Use heartbeats when:
- The agent should **check state and conditionally act** (e.g., Atlas checks Linear for blockers)
- You want **no work when state is calm** (vs routines which always run)
- The same topic is **picked from an inbox** of tickets (heartbeats query tickets in step 3)
Don't use heartbeats for:
- Deterministic scheduled jobs (use a routine)
- One-off actions (use a skill or ticket)
Step 1: Understand the trigger
Ask the user: 1. **Which agent?** List agents from `.claude/agents/*.md`. Suggest by domain:
- `atlas-project` — project tracking (Linear, GitHub)
- `flux-finance` — payments, billing
- `zara-cs` — support queue
- `pulse-community` — community sentiment
- `pixel-social-media` — scheduled posting
2. **How often?** Interval in minutes / hours. Min 60s. Typical: 2h, 4h, 6h. 3. **What state to check?** This becomes the `decision_prompt`. 4. **Link to a goal?** Optional `goal_id` for context injection. Skip if no goal fits.
Step 2: Compose the decision prompt
The decision_prompt is injected into the agent's context and asks the agent:
> "Given the current state of [X], should you act? If yes, do the work and report. If no, explain briefly and skip."
Good decision prompts are specific:
✅ "Check Linear for issues in `In Progress` assigned to an unresponsive person (> 48h inactive) or blocked > 24h. If any, create action items and notify Davidson. Otherwise skip."
❌ "Check stuff" (too vague — will always act or always skip randomly)
Step 3: Pick wake triggers
Default: `interval` + `manual`. Optional:
- `new_task` — wake when a ticket is assigned
- `mention` — wake when `@<agent-slug>` appears in a comment
- `approval_decision` — wake when an approval affects this agent
30s debounce prevents multiple triggers coalescing into multiple runs.
Step 4: Required secrets (optional)
If the decision/work requires API keys (Stripe, Linear, etc.), list them as `required_secrets`. They'll be validated at startup (presence, not value).
Step 5: Write to YAML
Append the new heartbeat to `config/heartbeats.yaml`:
heartbeats:
- id: <agent-slug>-<interval>h
agent: <agent-slug>
interval_seconds: <N>
max_turns: 10
timeout_seconds: 600
lock_timeout_seconds: 1800
wake_triggers: [interval, manual]
enabled: false # opt-in — user enables after testing
goal_id: null
required_secrets: []
decision_prompt: |
<the prompt from step 2>Validate with `make heartbeat-lint` before suggesting the user enables.
Step 6: Guide the user
After writing:
1. Run `make heartbeat-lint` to validate 2. Test manually: UI `/scheduler` → Heartbeats tab → Run Now on this heartbeat 3. Review the run in `workspace/ADWs/logs/heartbeats/<id>-<date>.jsonl` 4. If the decision quality is right, flip `enabled: true` and restart dashboard
Notes
- Source of truth is the YAML. UI CRUD rewrites it atomically (temp file + rename).
- Delete a heartbeat via `/scheduler` → Heartbeats → Delete, or remove the entry from YAML and restart.
- Heartbeat cost appears in `/costs` once runs start generating `heartbeat_runs` rows.
Related: `.claude/rules/heartbeats.md`, `.claude/rules/tickets.md` (inbox), `.claude/rules/goals.md` (context).
Other skills on evo-nexus.
- /ai-image-creator
Generate PNG images using AI (multiple models via OpenRouter including Gemini, FLUX.2, Riverflow, SeedDream, GPT-5 Image, proxied through Cloudflare AI Gateway BYOK). Also analyze/describe existing images using multimodal AI vision. Use when user asks to "generate an image",
Open skill - /create-agent
Create a new custom agent for the workspace. Guides the user through defining agent name, domain, personality, skills, model, and memory folder. Use when the user says 'create an agent', 'new agent', 'add an agent', 'I need a custom agent', or wants to create a specialized agent
Open skill - /create-command
Create a new slash command for Claude Code. Guides the user through defining the command name, what it does, and generates the markdown file in .claude/commands/. Use when the user says 'create a command', 'new command', 'add a slash command', 'I want a shortcut for', or wants
Open skill - /create-goal
Create a Mission, Project, or Goal (Mission → Project → Goal → Task hierarchy) in EvoNexus. Guides the user through picking a mission, choosing or creating a project, defining a measurable goal with metric_type and target_value. Writes to the SQLite goals tables via POST
Open skill - /create-integration
Create a new custom integration (API/service wrapper) for the workspace. Guides the user through defining the integration's slug, display name, description, category, and required env keys. Writes .claude/skills/custom-int-{slug}/SKILL.md via POST /api/integrations/custom. Use
Open skill - /create-routine
Create a new automated routine (ADW) for the scheduler. Guides the user through defining what the routine does, the type (AI or systematic), the schedule, and generates the Python script + Makefile target. Use when the user says 'create a routine', 'add a routine', 'automate
Open skill

