project_context for projects they can access. A project-scoped guest receives board context for each explicitly accessible project even before work is assigned or linked into the strategy graph. Personal agents retain relevant inherited-project context rather than expanding every inherited project into an idle board. Non-guest members can also see unprojected org-level strategy. Shared initiatives can appear with issue counts, blocked/stalled health, and signals computed from accessible work only.
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.
attention_items and its summary counts.
CLI equivalent:
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.

