Skip to content

feat: add HEARTBEAT.md as the per-agent wake procedure#9

Merged
MarquisG merged 1 commit into
mainfrom
fdefitte/add-heartbeat-template
May 19, 2026
Merged

feat: add HEARTBEAT.md as the per-agent wake procedure#9
MarquisG merged 1 commit into
mainfrom
fdefitte/add-heartbeat-template

Conversation

@fdefitte
Copy link
Copy Markdown
Contributor

Summary

Add agents/<id>/HEARTBEAT.md to the bundle contract — the imperative wake procedure OpenClaw loads on every pulse — so authors stop burying it in SOUL.md's "Wake Protocol" section or in MEMORY.md pointers. The procedure now requires the agent to execute at least one task before closing the session (no orient-and-bail) and to write a digest to memory/YYYY-MM-DD.md before ending the turn. Updated template/, migrated geo-seo-squad/atlas (bumped to 1.1.0), refreshed bundle-reference.md / authoring-a-squad.md / how-squads-work.md / create-squad skill. Validator unchanged — HEARTBEAT.md is convention-based and optional, like MEMORY.md.

Checklist

  • `node scripts/validate.mjs` passes locally (CI runs it too).
  • If a squad was added: the `README.md` official squad table is updated.
  • If a squad was changed: its `manifest.json` `version` is bumped (semver).
  • No `` placeholders or template scaffolding left in a real squad bundle.

🤖 Generated with Claude Code

OpenClaw loads agents/<id>/HEARTBEAT.md on every wake. Previously the wake
procedure was tucked into SOUL.md's "Wake Protocol" section, conflating
behaviour with the step-by-step script. Pull it into its own file and
update the contract, template, docs, and create-squad skill.

The procedure now requires: execute at least one task before closing the
session (no orient-and-bail) and write a digest to memory/YYYY-MM-DD.md
before ending the turn. NO_REPLY is only acceptable when nothing is
actionable, with the reason logged first.

Bump geo-seo-squad to 1.1.0 since atlas migrated to the new layout.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
fdefitte pushed a commit that referenced this pull request May 19, 2026
Move the per-agent wake procedure out of SOUL.md / MEMORY.md and into a
dedicated HEARTBEAT.md for both geo-squad/atlas and reddit-squad/seren.
SOUL.md keeps the behavioural rules; MEMORY.md keeps pointers. The
contract change (template + docs + validator stance) is being landed
separately in PR #9.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
fdefitte pushed a commit that referenced this pull request May 19, 2026
Move the channel-aware wake procedure out of SOUL.md and into a dedicated
HEARTBEAT.md. SOUL.md now points at HEARTBEAT.md — SOUL defines who/how,
HEARTBEAT defines what to run on every wake. Template + validator changes
are handled by PR #9.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
MarquisG pushed a commit that referenced this pull request May 19, 2026
… (Reddit-agent) (#6)

* feat: split geo-seo-squad into geo-squad (Atlas) and reddit-squad (Seren)

geo-seo-squad combined two distinct agents with different tools, vault
secrets, and onboarding paths into one bundle. Splitting into focused
single-agent squads keeps each one self-contained and easier to deploy
independently.

geo-squad:
- Atlas only (GEO/SEO strategist)
- Daily citation audits, blog posts, llms.txt / JSON-LD engineering
- Requires: team.target_domain, team.target_keywords, github.com identity
- No cron jobs (Atlas is heartbeat-driven)

reddit-squad:
- Seren only (Reddit presence agent)
- Daily subreddit monitoring, comment drafts, multi-account karma strategy
- Requires: team.reddit_accounts, team.reddit_target_subreddits, team.target_keywords
- Weekly health check cron retained from geo-seo-squad

Both bundles pass validate.mjs.

* refactor(geo-squad): move geo-llmseo-playbook to agent-level skills

In a single-agent squad the squad-level vs agent-level distinction is
meaningless. Flattened: skills/geo-llmseo-playbook.md moved to
agents/atlas/skills/ and manifest updated accordingly.

* feat(geo-squad): add daily blog post date refresh to Atlas scope

* feat(squads): add HEARTBEAT.md for Atlas and Seren

Move the per-agent wake procedure out of SOUL.md / MEMORY.md and into a
dedicated HEARTBEAT.md for both geo-squad/atlas and reddit-squad/seren.
SOUL.md keeps the behavioural rules; MEMORY.md keeps pointers. The
contract change (template + docs + validator stance) is being landed
separately in PR #9.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* refactor(squads): rename Atlas to GEO-agent, Seren to Reddit-agent

Rename the two agents from proper names to descriptive ids. Agent dirs
move to agents/geo-agent and agents/reddit-agent; manifest ids, skill
paths, cron sessionTarget, task assigned_to, and all prose updated to
match. Gendered pronouns referring to Seren neutralized.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Pancake <pancake@getpancake.ai>
Co-authored-by: Francois de Fitte <francoisdefitte@MacBook-Air-8.local>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
@MarquisG MarquisG merged commit 5bdd7a3 into main May 19, 2026
2 checks passed
fdefitte pushed a commit that referenced this pull request May 20, 2026
… out of SOUL.md

Each of the three landing-page agents (Pixel, Canvas, Scout) now ships a
HEARTBEAT.md that OpenClaw loads on every wake — orient, decide, run the
recurring duty, execute, digest, close the loop. The wake-protocol section is
removed from each SOUL.md to keep wake instructions in one place.

PR #9 handles HEARTBEAT.md in the template, the other squad, and the docs/validator contract.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
MarquisG pushed a commit that referenced this pull request May 20, 2026
* feat: add outreach-squad

Daily outbound engine with one agent (Rex/outreach-agent).
- Simple mode by default (LinkedIn, 4 leads/week, 4-5 touchpoints)
- Auto-upgrades to Advanced mode (signal stacking, multichannel) when reply rate >8% sustained + tools available
- Daily heartbeat: find leads, advance sequences, handle replies, post digest
- Mandatory daily digest to configured channel (Slack/email/iMessage)
- 2 squad-wide skills: simple-outreach + advanced-outreach
- 5 task templates: find-leads, update-icp, new-message-variant, weekly-review, extract-post-engagers
- No cron (heartbeat-driven, timing doesn't matter to anyone outside the agent)
- Exa built-in; Heyreach/Lemlist/FullEnrich/Jungler/Crunchbase all optional vault secrets

Passes validate.mjs clean.

* fix: replace MEMORY.md pipeline tracking with Agent Tasks system

- SOUL.md: Wake Protocol now uses create_task/update_task/complete_task
  for lead state instead of MEMORY.md. Full task lifecycle documented
  (queued → in_progress → complete/closed).
- SOUL.md: Operating Principles updated to reference task system as
  single source of truth for pipeline state.
- MEMORY.md: Pipeline section now points to list_tasks instead of
  tracking leads inline.
- simple-outreach.md: Each sequence touch now includes the corresponding
  update_task call. Lead creation uses create_task. Sequence end and
  meeting booked use complete_task.

* fix: address PR review comments

- IDENTITY.md: renamed Rex -> Outreach agent; rebalanced LinkedIn vs
  email as co-equal channels; email now documented as free/fully-automated
  default, LinkedIn as higher-reply-rate option requiring paid tool for
  automation
- SOUL.md: same name fix; added Channel philosophy section; added
  Operating Principle #2 (self-populate task backlog after each digest);
  Wake Protocol step 2 now starts with list_tasks(todo) for pre-queued
  actions before scanning in-progress leads
- tasks-config/templates.json: added daily-digest, enrich-leads,
  send-linkedin-connection, send-linkedin-dm, send-email, handle-reply,
  advance-sequence templates covering all skill actions; expanded
  find-leads and existing templates with explicit task system calls

* fix: declare Exa as built-in tool in manifest and MEMORY.md

- manifest.json: added 'exa' to required_tool_permissions so the
  marketplace surface shows it as a used capability
- MEMORY.md: Exa entry now explicitly marked as pre-configured in
  Pancake — no key or vault secret needed. Other tool entries now
  include the vault key path for clarity.

Exa requires no required_vault_secret entry because it's part of
the Pancake stack, not a user-supplied credential.

* feat: extract outreach-agent wake protocol into HEARTBEAT.md

Move the channel-aware wake procedure out of SOUL.md and into a dedicated
HEARTBEAT.md. SOUL.md now points at HEARTBEAT.md — SOUL defines who/how,
HEARTBEAT defines what to run on every wake. Template + validator changes
are handled by PR #9.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* chore: drop the "Rex" nickname from outreach-agent

Agent is referred to as outreach-agent everywhere — remove the stale Rex
label from MEMORY.md's header.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix: address all PR review comments

- required_vault_secrets → optional_vault_secrets (all 5 keys were already labeled optional)
- Add crons block to manifest.json — daily heartbeat is a cron, not a task template
- Expand tasks-config/templates.json: add missing action tasks covering both skills
  (send-email, send-linkedin-voice-note, draft-cold-call-opener, handle-reply,
  advance-sequence, extract-post-engagers; enrich-lead → singular)
- daily-digest template kept as manual trigger; cron covers automated daily run
- daily-digest description now includes self-populate instruction for next-day backlog

Names (Rex → Outreach agent) and channel-neutral IDENTITY/SOUL were already
addressed in prior commits. Exa was already in required_tool_permissions.

* fix: remove redundant cron — agent already has daily heartbeat

* feat: expand HEARTBEAT.md to cover full workflow from both skills

- Full Simple mode sequence (all 5 touchpoints with copy examples)
- Full Advanced mode sequence (8-12 touchpoints, all channels)
- Enrichment step (FullEnrich → Hunter.io → Exa fallback)
- Lead finding: signal-based + ICP search, Simple and Advanced variants
- A/B test check with Advanced-mode additions
- Mode upgrade/downgrade logic inline
- Self-populate next-wake backlog
- Weekly learning with Advanced-mode metrics
- Task lifecycle reference table

HEARTBEAT.md is now the single source of truth — tasks/templates become optional.

* refactor: remove task system from outreach-squad, fold workflow into heartbeat

Drop tasks-config/ entirely and rewire pipeline state to live inline in
MEMORY.md as an Active leads / Closed leads ledger. The heartbeat now owns
the end-to-end loop and computes due work from Next due dates in the
ledger instead of from queued task templates.

Also drops required_identities (LinkedIn) and optional_vault_secrets from
the manifest — Pancake can't drive LinkedIn outreach for the user, and
optional_vault_secrets was never in the manifest schema.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Pancake <pancake@getpancake.ai>
Co-authored-by: Francois de Fitte <francoisdefitte@MacBook-Air-8.local>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants