Compact response
The default response is a compact envelope. It containsattention_items, attention_summary, grouped actionable signals, a
deterministic recommended_action when available, counts, delta, and
page. It omits full goals, standalone_kpis, standalone_initiatives,
assigned_issues, and project_context collections.
The serialized JSON response is bounded to 16,384 UTF-8 bytes and 25 signal
groups. The page object reports max_bytes, max_items,
returned_count, returned_bytes, has_more, next_cursor, and a terminal
ack_cursor. Continue with cursor=<next_cursor> until has_more is false.
Only the terminal page includes ack_cursor; after all pages are processed,
send it to:
next_cursor from the immediately
previous page; do not manufacture, skip, or replay a page cursor. Pass an acknowledged terminal cursor as
since=<ack-cursor> on a later compact read to receive only new, changed, or
escalated groups. Invalid cursors return 400. Stale page cursors and
unacknowledged since cursors return 409. If policy, authorization, or the
candidate set changes while paging, restart without the cursor after
409 heartbeat_cursor_stale. An expired acknowledged baseline returns a
fresh compact response with delta.reset_required: true.
If the requested max_bytes cannot fit the mandatory actionable record and
compact response envelope, the endpoint returns 413 with
code: "heartbeat_budget_too_small". It does not advance a page cursor or
terminal receipt. Retry with a larger max_bytes (up to 16,384) or omit the
parameter to use the default. Compact attention_items are bounded projections
with id, event_type, severity, title, resource_type, and
ack_endpoint; resource_id is included when present. Full mode retains the
richer attention fields.
Compact dependency signals group affected downstream issues under an
actionable upstream blocker and release condition. Expected waits are suppressed
for an unsatisfied dependency when the readable blocker is before its release
column and there is no active stall, threatened or overdue commitment, or
explicit deadline, gate, permission, or stale anomaly. An unowned backlog or
Todo blocker by itself is an ordinary wait and never alerts. Actionable groups
surface active stalls, threatened or overdue commitments, and explicit
anomalies; escalation metadata alone does not surface an expected wait. When
every dependency fact behind an initiative-target or stalled aggregate is an
expected wait, that aggregate is suppressed too. Groups can include a suggested_read with an
executable REST path, CLI command, or private MCP tool call.
Use ?view=full for the legacy full response. Full requests cannot combine
with since or cursor.
The public plugin MCP profile keeps the legacy full heartbeat shape and does
not expose compact paging or acknowledgement. Private MCP supports compact
heartbeat inputs and the atoll_ack_heartbeat tool.
Execution attention
Private REST, CLI, and MCP compact responses also include the separateexecution_attention projection:
resolved_unread until the requesting agent
acknowledges the receipt or completes the exact version-fenced
waiting -> running transition. Open requests remain in open. The existing
25-item and 16 KiB page limits apply across execution attention, notification
attention, and signals; resolved answers are ordered before open requests.
Heartbeat page acknowledgement only acknowledges the delivery snapshot and
does not consume an execution-attention receipt.
An agent acknowledges a resolved answer with:
409 for stale versions or key reuse with a different body, and never
resumes an execution. Public plugin MCP heartbeat output remains unchanged.
Per-agent policy management
The web app exposes these settings under Heartbeats. The management APIs require an authenticated human who can manage the target agent:GET returns the saved and effective policy, selectable projects, initiatives, and per-project board columns, plus stale selections. PUT atomically replaces the complete policy. DELETE removes the saved policy and restores default behavior. Preview accepts { "policy": ... } for an unsaved draft or {} for the saved policy and composes the heartbeat as the target agent without persisting changes.
When access or entities change, saved_policy retains stale IDs so the real heartbeat and a {} saved preview fail closed instead of treating that dimension as All. effective_policy is the sanitized, editable form and stale_selections identifies what was removed from it. Saving that sanitized form explicitly removes the stale restrictions.
Heartbeat focus narrows proactive signals only. It cannot grant project access, create initiative permissions, or create task-column permissions.
verification.completed item for an exact matched
repository, pull request, workflow run attempt, and head SHA. Its validated
verification object contains only bounded identifiers, the conclusion, a
canonical GitHub run URL, and next_action; it never contains raw payloads,
secrets, logs, or thread identifiers. The integration is disabled by default
and workflow processing remains observe-only unless an owner or admin enables
attention mode.
The public MCP heartbeat excludes verification.completed. Use the authorized
REST endpoint or atoll heartbeat --json for this private integration evidence.
An empty project, initiative, or column selection means All. Every signal has one stable category: task, initiative, KPI, or project. Disabled sections retain the response shape with empty collections; disabling attention empties both attention_items and its summary counts.
CLI equivalent:
Legacy full response shape
project_context includes ordered board columns for accessible projects relevant to the heartbeat, including optional column descriptions that teams use as stage criteria or agent guidance.
attention_items contains direct notifications that require the current member’s attention, including mentions, assignments, assignee comments, direct replies, and creator-visible status changes. Each item includes the notification id, event_type, severity, action_kind, related resource fields, target_path, and ack_endpoint. Comment items can include comment_id; a direct reply can additionally include reply_to_comment_id and the parent agent comment’s validated routing metadata (harness, thread/session ID, and optional host ID). If routing is absent, fetch the new reply through GET /comments/{comment_id} (or list the issue comments) and inspect its shallow reply_to_comment.source_metadata; this remains available when the parent was later soft-deleted. After handling the referenced item, call ack_endpoint to acknowledge the notification and remove it from later heartbeat attention results. attention_summary aggregates unread attention counts by type. Project-bound notification items are filtered by the caller’s project access.
When a KPI is stale or off pace, the matching heartbeat signal keeps one canonical KPI status. Its metadata.linked_initiatives lists initiatives expected to move that KPI, and metadata.recent_attributed_snapshots lists recent snapshots attributed to an initiative, issue, or note. The CLI --explain-kpi flag returns the same movement context under kpi_explanation.
recommended_action is a deterministic strategy-backed next action built from the heartbeat summary. Action types are create_work, start_work, escalate_blocker, refresh_metric, and investigate. The suggested_write object can prefill a new issue, issue status update, blocker comment, or KPI refresh request; an investigation can use operation: "none" when heartbeat lacks enough detail for a safe write. Issue-create bodies are HTML for Atoll’s rich-text issue description; blocker/comment, start-work progress notes, and metric-refresh bodies are plain text.
Recommendation ordering keeps blockers and urgent initiative targets first, followed by executable work for off-pace KPIs and in-progress work linked to stale KPIs. Signal-backed assigned work (an issue_stale signal on the issue or a milestone_overdue signal on its milestone) is compared with critical standalone overdue milestones by urgency; the stronger execution or recovery case wins. When a critical milestone wins without assigned work, Atoll recommends investigation before stale-metric maintenance. A stale KPI refresh still precedes creating a new bet, beginning initiative work whose only trigger is KPI staleness and that is not yet underway, or unrelated assigned work.
Agents should follow usage_guidance: prefer suggested_write.operation when it still matches the current board, preserve KPI/initiative/initiative-target/why-now/expected-impact/first-step/success-criteria evidence in any write, and avoid copying deferred busywork or unrelated assigned tasks into issue or comment payloads. When a start_work action uses suggested_write.operation: "issue.update" with a body, apply the status change and preserve that body as an issue comment. PATCH /issues/{issueId} accepts comment_body for this same-request progress note.
Paused and cancelled strategy records are filtered out of operational signals. KPIs attached to paused or cancelled goals do not emit stale or off-pace heartbeat signals, and paused, completed, or cancelled initiatives do not emit stalled initiative signals.
Signals
Severity values are
critical, warning, and info.
Gate target signals are stateful and do not use KPI pace language. For example, a retailer launch gate should read like Gate target "Get 5 retailers live" is due in 6 days: 0/5 retailers complete, not as fractional daily pace.
Agent guidance
Agents should:- Call heartbeat at the start of a run.
- Handle direct
attention_itemsfirst when they require a reply, task update, or blocker follow-up. - Call each handled item’s
ack_endpoint. - Sort remaining signals by severity and business leverage.
- Inspect the relevant issues, KPI, initiative, or milestone.
- Act through CLI or API.
- Comment and update records.
- Stop when the current unit is complete.

