Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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.
.claude/skills/evolution-foundation-create-heartbeat/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 13% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -11% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 45% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -40% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 45% | 0% |
> 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.
Use heartbeats when:
Don't use heartbeats for:
Ask the user:
.claude/agents/*.md. Suggest by domain:atlas-project — project tracking (Linear, GitHub)flux-finance — payments, billingzara-cs — support queuepulse-community — community sentimentpixel-social-media — scheduled postingdecision_prompt.goal_id for context injection. Skip if no goal fits.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)
Default: interval + manual. Optional:
new_task — wake when a ticket is assignedmention — wake when @<agent-slug> appears in a commentapproval_decision — wake when an approval affects this agent30s debounce prevents multiple triggers coalescing into multiple runs.
If the decision/work requires API keys (Stripe, Linear, etc.), list them as required_secrets. They'll be validated at startup (presence, not value).
Append the new heartbeat to config/heartbeats.yaml:
yamlheartbeats: - 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.
After writing:
make heartbeat-lint to validate/scheduler → Heartbeats tab → Run Now on this heartbeatworkspace/ADWs/logs/heartbeats/<id>-<date>.jsonlenabled: true and restart dashboard/scheduler → Heartbeats → Delete, or remove the entry from YAML and restart./costs once runs start generating heartbeat_runs rows.Related: .claude/rules/heartbeats.md, .claude/rules/tickets.md (inbox), .claude/rules/goals.md (context).
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 6,638 | 3,325 | -50% | 1 | 1 | 0% | 1,189 | 1,399 | +18% | 0 | 0 | — |
case-02 | fail→fail | 11,905 | 6,274 | -47% | 1 | 1 | 0% | 2,276 | 1,276 | -44% | 0 | 0 | — |
case-08 | fail→pass | 8,528 | 3,711 | -56% | 1 | 1 | 0% | 1,544 | 1,743 | +13% | 0 | 0 | — |
case-03 | fail→fail | 12,583 | 3,319 | -74% | 1 | 1 | 0% | 2,263 | 1,465 | -35% | 0 | 0 | — |
case-04 | pass→pass | 10,570 | 3,653 | -65% | 1 | 1 | 0% | 1,673 | 1,515 | -9% | 0 | 0 | — |
case-05 | fail→pass | 11,887 | 6,477 | -46% | 1 | 1 | 0% | 2,094 | 1,871 | -11% | 0 | 0 | — |
case-06 | fail→pass | 10,471 | 9,802 | -6% | 1 | 1 | 0% | 1,825 | 2,648 | +45% | 0 | 0 | — |
case-07 | pass→pass | 9,090 | 2,373 | -74% | 1 | 1 | 0% | 1,464 | 1,286 | -12% | 0 | 0 | — |
case-09 | pass→pass | 9,393 | 2,953 | -69% | 1 | 1 | 0% | 1,443 | 1,500 | +4% | 0 | 0 | — |
case-10 | fail→pass | 12,197 | 1,857 | -85% | 1 | 1 | 0% | 2,050 | 1,235 | -40% | 0 | 0 | — |
case-11 | fail→pass | 5,850 | 3,110 | -47% | 1 | 1 | 0% | 1,077 | 1,565 | +45% | 0 | 0 | — |
case-12 | pass→pass | 2,055 | 2,042 | -1% | 1 | 1 | 0% | 297 | 1,346 | +353% | 0 | 0 | — |
case-13 | pass→pass | 12,641 | 7,336 | -42% | 1 | 1 | 0% | 2,003 | 2,150 | +7% | 0 | 0 | — |
case-14 | fail→pass | 11,530 | 1,867 | -84% | 1 | 1 | 0% | 1,908 | 1,244 | -35% | 0 | 0 | — |
case-15 | fail→pass | 10,438 | 1,322 | -87% | 1 | 1 | 0% | 1,781 | 1,143 | -36% | 0 | 0 | — |
case-16 | pass→pass | 3,973 | 2,065 | -48% | 1 | 1 | 0% | 644 | 1,315 | +104% | 0 | 0 | — |
case-17 | fail→pass | 6,827 | 2,487 | -64% | 1 | 1 | 0% | 1,034 | 1,418 | +37% | 0 | 0 | — |
case-18 | fail→pass | 25,054 | 4,342 | -83% | 1 | 1 | 0% | 1,055 | 1,696 | +61% | 0 | 0 | — |
case-19 | fail→pass | 8,312 | 1,836 | -78% | 1 | 1 | 0% | 1,456 | 1,296 | -11% | 0 | 0 | — |
case-20 | pass→pass | 8,735 | 1,476 | -83% | 1 | 1 | 0% | 1,391 | 1,192 | -14% | 0 | 0 | — |
case-21 | fail→pass | 6,648 | 1,597 | -76% | 1 | 1 | 0% | 975 | 1,249 | +28% | 0 | 0 | — |
case-22 | pass→pass | 17,387 | 5,152 | -70% | 1 | 1 | 0% | 2,872 | 1,770 | -38% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +50 percentage points is the difference between those two pass rates over the 20 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.