@atollhq/skill-claude 0.4.33 → 0.4.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/skill/SKILL.md +21 -0
- package/skill/references/api-endpoints.md +77 -7
- package/skill/references/api-fields.md +83 -8
- package/skill/references/cli-operations.md +20 -1
- package/skill/references/integrations-and-api.md +65 -4
- package/skill/references/strategy-and-heartbeat.md +66 -0
package/package.json
CHANGED
package/skill/SKILL.md
CHANGED
|
@@ -12,6 +12,15 @@ clients, use the connected Atoll tools; do not assume a shell, installed CLI,
|
|
|
12
12
|
local profile, or API key. In CLI environments, prefer the typed Atoll CLI.
|
|
13
13
|
Live tool schemas, CLI help, and linked references define the contract.
|
|
14
14
|
|
|
15
|
+
Heartbeat is compact by default for REST and private CLI/MCP calls. Read the
|
|
16
|
+
strategy and heartbeat reference for bounded pages, terminal acknowledgement,
|
|
17
|
+
delta cursors, grouped dependency blockers, and the explicit `--full`/`view=full`
|
|
18
|
+
legacy response. The public plugin MCP heartbeat remains legacy full mode. If a
|
|
19
|
+
requested `max_bytes` cannot fit the mandatory actionable record and compact
|
|
20
|
+
envelope, REST returns `413 heartbeat_budget_too_small` without advancing a page
|
|
21
|
+
cursor or terminal receipt; retry with a larger budget or the 16 KiB default.
|
|
22
|
+
Dependency-chain cursors are signed and revision-bound; graph drift returns `409 Stale dependency chain cursor`, so restart without the cursor.
|
|
23
|
+
|
|
15
24
|
## Route to the relevant reference
|
|
16
25
|
|
|
17
26
|
Read only the references required for the current task:
|
|
@@ -44,6 +53,18 @@ Read only the references required for the current task:
|
|
|
44
53
|
- Request and response fields, enums, and validation:
|
|
45
54
|
[api-fields.md](references/api-fields.md)
|
|
46
55
|
|
|
56
|
+
Outbound webhooks support optional Standard Webhooks signing with a receiver
|
|
57
|
+
supplied canonical `whsec_` secret. Read the webhook references before creating
|
|
58
|
+
or updating a destination; signing secrets are write-only and automatic retry
|
|
59
|
+
delivery ids remain stable. Grok Automations and Hermes support this receiver
|
|
60
|
+
contract; see the integration reference for their setup and event caveats.
|
|
61
|
+
|
|
62
|
+
Agent creation can select an allowlisted built-in icon with `avatarPreset`.
|
|
63
|
+
Manage an existing guest agent icon through the member avatar endpoint: upload
|
|
64
|
+
a custom image with `POST`, select a built-in preset with `PATCH`, or remove it
|
|
65
|
+
with `DELETE`. Read [api-endpoints.md](references/api-endpoints.md) and
|
|
66
|
+
[api-fields.md](references/api-fields.md) for the exact contract and limits.
|
|
67
|
+
|
|
47
68
|
For automation rule V1 actions (including create issue and send webhook), explicit project or
|
|
48
69
|
organization scope, CI create-or-webhook rules, scheduled `schedule.issue_time`
|
|
49
70
|
rules, event conditions, validation, safe
|
|
@@ -213,6 +213,7 @@ bodies, projects only declared public issue fields, preserves nullable
|
|
|
213
213
|
| Method | Endpoint | Description |
|
|
214
214
|
|--------|----------|-------------|
|
|
215
215
|
| GET | `/api/orgs/{id}/issues/{issueId}/dependencies` | List dependencies (`{ blocking, blockedBy }`) |
|
|
216
|
+
| GET | `/api/orgs/{id}/issues/{issueId}/dependencies?view=chain` | Read a bounded normalized dependency chain |
|
|
216
217
|
| POST | `/api/orgs/{id}/issues/{issueId}/dependencies` | Add dependency |
|
|
217
218
|
| PATCH | `/api/orgs/{id}/issues/{issueId}/dependencies/{depId}` | Change dependency release point |
|
|
218
219
|
| DELETE | `/api/orgs/{id}/issues/{issueId}/dependencies/{depId}` | Remove dependency |
|
|
@@ -226,6 +227,19 @@ blocking project's `done` column. During a rolling deployment, compatibility
|
|
|
226
227
|
reads may omit release fields from older rows; treat missing release metadata as
|
|
227
228
|
the legacy open-blocker behavior until the migration is applied.
|
|
228
229
|
|
|
230
|
+
For `view=chain`, use `direction=upstream|downstream|both` (default
|
|
231
|
+
`both`), `depth` (default `2`, maximum `5`), `limit` (default `50`), and
|
|
232
|
+
the opaque `cursor`. The response normalizes readable nodes and edges, includes
|
|
233
|
+
release-condition satisfaction and permission flags, and returns readable node
|
|
234
|
+
`assignee_id`, nullable `due_date`, nullable `ready_if_released`, and readiness.
|
|
235
|
+
It returns opaque restricted node tokens with `readiness: "unknown"` when an
|
|
236
|
+
issue is not readable. The top-level `partial` is true when the depth bound, restricted nodes, or unknown readiness
|
|
237
|
+
prevent a complete graph. The response is read-only and can
|
|
238
|
+
be truncated; follow `page.next_cursor` only when present. Chain cursors are
|
|
239
|
+
signed and bound to the current graph revision and caller scope. Graph changes
|
|
240
|
+
while paging return `409 Stale dependency chain cursor`; restart without the
|
|
241
|
+
cursor.
|
|
242
|
+
|
|
229
243
|
## Comments
|
|
230
244
|
|
|
231
245
|
| Method | Endpoint | Description |
|
|
@@ -467,13 +481,46 @@ The create body is strict and requires `execution_id`, `expected_state_version`,
|
|
|
467
481
|
|
|
468
482
|
| Method | Endpoint | Description |
|
|
469
483
|
|--------|----------|-------------|
|
|
470
|
-
| GET | `/api/orgs/{id}/heartbeat` | Get heartbeat context for the
|
|
484
|
+
| GET | `/api/orgs/{id}/heartbeat` | Get compact heartbeat context by default; use `?view=full` for the legacy full response |
|
|
485
|
+
| POST | `/api/orgs/{id}/heartbeat/ack` | Acknowledge a terminal compact heartbeat page with `{ "ack_cursor": "..." }` |
|
|
471
486
|
| GET | `/api/orgs/{id}/agents/{agentId}/heartbeat-policy` | Human-only manageable-agent policy, selectable scope, and stale selections |
|
|
472
487
|
| PUT | `/api/orgs/{id}/agents/{agentId}/heartbeat-policy` | Human-only complete atomic policy replacement |
|
|
473
488
|
| DELETE | `/api/orgs/{id}/agents/{agentId}/heartbeat-policy` | Human-only reset to default heartbeat behavior |
|
|
474
489
|
| POST | `/api/orgs/{id}/agents/{agentId}/heartbeat-preview` | Human-only saved/draft preview composed as the target agent without persistence |
|
|
475
490
|
|
|
476
|
-
|
|
491
|
+
REST and private CLI/MCP calls return compact delivery by default: grouped
|
|
492
|
+
actionable signals, bounded attention, counts, delta, and a page descriptor.
|
|
493
|
+
The page is limited to 25 groups and 16,384 UTF-8 bytes. A page with
|
|
494
|
+
`has_more: true` returns `next_cursor`; only the terminal page returns an
|
|
495
|
+
`ack_cursor`. Acknowledge that cursor with the POST endpoint before using it as
|
|
496
|
+
`since`. Cursor or baseline conflicts return `409`; an expired acknowledged
|
|
497
|
+
baseline sets `delta.reset_required: true`. If the requested `max_bytes` cannot fit the
|
|
498
|
+
mandatory actionable record and compact response envelope, the server returns
|
|
499
|
+
`413` with `code: "heartbeat_budget_too_small"` and does not advance a page
|
|
500
|
+
cursor or terminal receipt. Retry with a larger `max_bytes` or omit it for the
|
|
501
|
+
16,384-byte default. Use `?view=full` for the full
|
|
502
|
+
briefing with goals, KPI pace/trend, initiatives, assigned work, project
|
|
503
|
+
context, attention, signals, and recommendation. Full mode cannot use
|
|
504
|
+
`since` or cursor pagination.
|
|
505
|
+
|
|
506
|
+
Cursors are opaque, server-issued, and single-use in sequence. Pass the exact
|
|
507
|
+
`next_cursor` from the immediately previous page. Do not manufacture, skip, or
|
|
508
|
+
replay a page cursor.
|
|
509
|
+
|
|
510
|
+
Expected waits are suppressed for an unsatisfied dependency when the readable
|
|
511
|
+
blocker is before its release column and there is no active stall, threatened or
|
|
512
|
+
overdue commitment, or explicit deadline, gate, permission, or stale anomaly.
|
|
513
|
+
An unowned backlog or Todo blocker by itself is an ordinary wait and never
|
|
514
|
+
alerts. Actionable groups surface active stalls, threatened or overdue
|
|
515
|
+
commitments, and explicit anomalies; escalation metadata alone does not surface
|
|
516
|
+
an expected wait. When every dependency fact behind an initiative-target or
|
|
517
|
+
stalled aggregate is an expected wait, that aggregate is suppressed too. Dependency blockers are grouped
|
|
518
|
+
by root blocker and release condition, with bounded normalized-chain facts and
|
|
519
|
+
`suggested_read` calls when additional read-only evidence is needed. The endpoint is org-scoped, but all
|
|
520
|
+
project-bound details remain filtered by caller project access. Public plugin
|
|
521
|
+
MCP heartbeat remains legacy full mode and does not expose compact ack or chain
|
|
522
|
+
tools; private MCP exposes compact heartbeat, `atoll_ack_heartbeat`, and
|
|
523
|
+
`atoll_get_dependency_chain`.
|
|
477
524
|
|
|
478
525
|
An authorized human may save a per-agent attention policy for context sections, semantic signal categories, accessible projects, visible initiatives, and stable per-project board-column IDs. The API applies it before CLI/MCP severity or signals-only narrowing. Policies never broaden project access; assigned work and direct attention remain independent of generated-signal focus.
|
|
479
526
|
|
|
@@ -634,10 +681,12 @@ deferred; parent deletion returns after durable queueing.
|
|
|
634
681
|
| Method | Endpoint | Description |
|
|
635
682
|
|--------|----------|-------------|
|
|
636
683
|
| POST | `/api/orgs/{id}/members/{memberId}/avatar` | Upload avatar to public `avatars` bucket (multipart, max 2MB, JPEG/PNG/WebP/GIF) |
|
|
684
|
+
| PATCH | `/api/orgs/{id}/members/{memberId}/avatar` | Select an allowlisted built-in agent icon preset (`{ preset }`) |
|
|
637
685
|
| DELETE | `/api/orgs/{id}/members/{memberId}/avatar` | Remove avatar |
|
|
638
686
|
|
|
639
687
|
Members may manage their own avatar; organization owners/admins may manage
|
|
640
|
-
another member only inside the same path organization.
|
|
688
|
+
another member only inside the same path organization. A human may also manage
|
|
689
|
+
a guest agent avatar when they created the agent or own the personal agent. Cross-organization
|
|
641
690
|
caller or target IDs return `404`. Upload returns
|
|
642
691
|
`{ "member": { "id": "...", "avatar_url": "..." } }` with no other member
|
|
643
692
|
metadata. Avatar updates use compare-and-set semantics: concurrent changes
|
|
@@ -849,9 +898,30 @@ failed without executing its actions.
|
|
|
849
898
|
| POST | `/api/webhooks/{id}/redeliver/{deliveryId}` | Redeliver a past payload (owner/admin) |
|
|
850
899
|
| POST | `/api/webhooks/{id}/test` | Send ping test event (owner/admin) |
|
|
851
900
|
|
|
852
|
-
URL must be an HTTPS DNS hostname. IP literals, `localhost`, and `.local` hosts are rejected at creation; delivery refuses non-public DNS results and does not follow redirects. Returns webhook record plus `secret` for HMAC verification. Store the secret immediately; it is shown only once. Later lists expose only `destination_display` such as `https://example.com
|
|
853
|
-
|
|
854
|
-
|
|
901
|
+
URL must be an HTTPS DNS hostname. IP literals, `localhost`, and `.local` hosts are rejected at creation; delivery refuses non-public DNS results and does not follow redirects. Returns webhook record plus `secret` for HMAC verification. Store the secret immediately; it is shown only once. Later lists expose only `destination_display` such as `https://example.com/…`; Standard Webhooks exposes only its configured boolean.
|
|
902
|
+
|
|
903
|
+
Automation action deliveries use payload schema version `3` with current
|
|
904
|
+
tenant-scoped issue and project fields. Subscription broadcasts and `ping`
|
|
905
|
+
remain schema version `2`; existing queued payloads retain their stored schema
|
|
906
|
+
and content. V3 includes safe sorted `trigger.changedFields`, optional
|
|
907
|
+
privacy-safe artifact counts, and `project: null` for projectless issues. An
|
|
908
|
+
artifact summary is omitted when its lookup fails, returns an invalid type, or
|
|
909
|
+
cannot complete within the bounded 1,000-row pagination limit. CI
|
|
910
|
+
actions set `issue: null`, `changedFields: []`, and retain only useful CI fields.
|
|
911
|
+
Both versions omit descriptions, comment bodies, and raw change values. Delivery
|
|
912
|
+
requests include `X-Atoll-Signature`, `X-Atoll-Signature-Version`, versioned
|
|
913
|
+
`X-Atoll-Signatures`, `X-Atoll-Delivery-Id`, and `Idempotency-Key`. Standard
|
|
914
|
+
Webhooks adds `webhook-id`, `webhook-timestamp`, and
|
|
915
|
+
`webhook-signature: v1,<base64>`; the signature covers
|
|
916
|
+
`deliveryId.timestamp.rawBody` with the decoded receiver key. Automatic retries
|
|
917
|
+
preserve delivery id/key with fresh timestamps/signatures; manual redelivery
|
|
918
|
+
uses new values, preserves v3 body content, and rewrites only legacy v2 automation bodies that contain
|
|
919
|
+
`data.deliveryId`. Delivery history returns safe status, `error_code`, and retry
|
|
920
|
+
timing only—not payloads, receiver response bodies, or raw errors. Atoll makes
|
|
921
|
+
one 30-second request attempt per invocation. Network failures and 5xx
|
|
922
|
+
responses are recorded as `status: retry_pending` with `next_retry_at`; an
|
|
923
|
+
internal cron drains due retries every 15 minutes. A 2xx response proves
|
|
924
|
+
acceptance only.
|
|
855
925
|
|
|
856
926
|
## Private Inbound Email Inbox
|
|
857
927
|
|
|
@@ -905,7 +975,7 @@ Google Chat mention cards include the task title, a safely formatted plain-text
|
|
|
905
975
|
| GET | `/api/orgs/{id}/agents` | List agents (owner/admin) |
|
|
906
976
|
| GET | `/api/orgs/{id}/agents/workforce` | Read a bounded workforce projection; org owners/admins may list all agents, project admins must pass `?projectId=...`, and individual owners may read their own agents |
|
|
907
977
|
| GET | `/api/orgs/{id}/agents/manageable` | List manageable agents with visible project IDs, named accessible projects, heartbeat policy status/focus summary, API-key usage metadata, and aggregate active-key/OAuth activity |
|
|
908
|
-
| POST | `/api/orgs/{id}/agents` | Create org
|
|
978
|
+
| POST | `/api/orgs/{id}/agents` | Create org, project-scoped, or personal agent; optional `avatarPreset` accepts only a built-in agent icon ID, and key-minting responses include one-time `apiKey` and stable `apiKeyId` (`oauthOnly` omits both) |
|
|
909
979
|
| DELETE | `/api/orgs/{id}/agents/{agentId}` | Revoke manageable agent |
|
|
910
980
|
| PATCH | `/api/orgs/{id}/agents/{agentId}/projects` | Replace project access for a manageable non-personal agent |
|
|
911
981
|
| POST | `/api/orgs/{id}/projects/{projectId}/agents` | Grant selected manageable agents access to a project |
|
|
@@ -153,7 +153,7 @@ Request bodies accept **camelCase** (`assigneeId`, `projectId`). Snake_case also
|
|
|
153
153
|
|
|
154
154
|
## Avatar Upload Response
|
|
155
155
|
|
|
156
|
-
Successful `POST
|
|
156
|
+
Successful `POST` uploads and `PATCH` preset selections at `/api/orgs/{id}/members/{memberId}/avatar` return
|
|
157
157
|
`200` with exactly:
|
|
158
158
|
|
|
159
159
|
```json
|
|
@@ -244,7 +244,7 @@ Creation endpoints may return `402` when an org reaches its billing plan limit:
|
|
|
244
244
|
|
|
245
245
|
## Agent Fields
|
|
246
246
|
|
|
247
|
-
Create org-wide agents with `{ "name": "...", "role": "member", "setupScoped": false }`; org-wide creation is owner/admin-only. Create project-scoped agents with non-empty `projectIds`, for example `{ "name": "...", "projectIds": ["project-uuid"] }`; `projectId` remains accepted as a legacy/default-project alias and is merged with `projectIds`. Project-scoped agents are created as guests, and human members may only scope them to projects they can access. Create personal agents with `{ "name": "...", "personal": true }`; personal agents inherit their human owner's project access and reject explicit `projectId`/`projectIds`.
|
|
247
|
+
Create org-wide agents with `{ "name": "...", "role": "member", "setupScoped": false }`; org-wide creation is owner/admin-only. Create project-scoped agents with non-empty `projectIds`, for example `{ "name": "...", "projectIds": ["project-uuid"] }`; `projectId` remains accepted as a legacy/default-project alias and is merged with `projectIds`. Project-scoped agents are created as guests, and human members may only scope them to projects they can access. Create personal agents with `{ "name": "...", "personal": true }`; personal agents inherit their human owner's project access and reject explicit `projectId`/`projectIds`. Any create form may include an allowlisted `avatarPreset` ID. Arbitrary URLs are rejected. Existing agent presets are changed with `{ "preset": "codex" }` on the avatar PATCH endpoint.
|
|
248
248
|
|
|
249
249
|
Key-minting agent creation responses contain the one-time raw `apiKey` and its stable `apiKeyId`. Creation with `oauthOnly: true` omits both fields.
|
|
250
250
|
|
|
@@ -539,7 +539,11 @@ characters), and legacy `close_issue` (omit `value`, targets the valid `done` ke
|
|
|
539
539
|
The destination must be enabled, same-org, and purpose `automation` or `both`.
|
|
540
540
|
Queued transport retries do not re-run the automation action. Activity exposes
|
|
541
541
|
`webhook_delivery_id` plus safe latest-attempt `webhook_delivery` state.
|
|
542
|
-
|
|
542
|
+
Automation payloads use schema v3 with current tenant-scoped project and issue
|
|
543
|
+
fields, safe sorted `trigger.changedFields`, and optional artifact counts; CI
|
|
544
|
+
uses `issue: null` and `changedFields: []`. Subscription broadcasts and `ping`
|
|
545
|
+
remain schema v2. Manual redelivery uses a new header and rewrites a payload
|
|
546
|
+
delivery ID only for legacy v2 automation bodies that contain that field.
|
|
543
547
|
Already satisfied assignments, priorities, statuses, and label relationships
|
|
544
548
|
succeed without duplicate mutation events. Invalid references still fail.
|
|
545
549
|
Unsupported action types or malformed values return `400` and are not saved.
|
|
@@ -752,10 +756,10 @@ reject `position`.
|
|
|
752
756
|
|
|
753
757
|
## Webhook Fields
|
|
754
758
|
|
|
755
|
-
Bearer secrets must contain only printable ASCII characters. Switching from none to Bearer requires a token and returns HTTP 400 if it is missing.
|
|
759
|
+
Bearer secrets must contain only printable ASCII characters. Switching from none to Bearer requires a token and returns HTTP 400 if it is missing. The optional `standard_webhooks` setting accepts a receiver-supplied `whsec_` secret; it is write-only and must be canonical standard Base64 after the prefix, decoding to 24-64 bytes. Lists expose only `standard_webhooks.configured`.
|
|
756
760
|
|
|
757
761
|
`PATCH /api/webhooks/{id}` preserves omitted fields. A blank or omitted Bearer
|
|
758
|
-
secret preserves the token; `auth.type: none` clears it. URL/auth changes create
|
|
762
|
+
secret preserves the token; `auth.type: none` clears it. URL/auth/Standard signing changes create
|
|
759
763
|
a new private destination version; pending deliveries retain their pinned version.
|
|
760
764
|
|
|
761
765
|
```json
|
|
@@ -764,13 +768,17 @@ a new private destination version; pending deliveries retain their pinned versio
|
|
|
764
768
|
"events": ["issue.created", "issue.updated"],
|
|
765
769
|
"enabled": true,
|
|
766
770
|
"purpose": "subscription",
|
|
767
|
-
"auth": { "type": "none" }
|
|
771
|
+
"auth": { "type": "none" },
|
|
772
|
+
"standard_webhooks": {
|
|
773
|
+
"enabled": true,
|
|
774
|
+
"secret": "whsec_<canonical-standard-base64>"
|
|
775
|
+
}
|
|
768
776
|
}
|
|
769
777
|
```
|
|
770
778
|
|
|
771
|
-
URL must be an HTTPS DNS hostname. IP literals, `localhost`, and `.local` hosts are rejected at creation; delivery refuses non-public DNS results and does not follow redirects. The create response includes
|
|
779
|
+
URL must be an HTTPS DNS hostname. IP literals, `localhost`, and `.local` hosts are rejected at creation; delivery refuses non-public DNS results and does not follow redirects. The create response includes an Atoll-generated `secret` for HMAC signature verification. Store it immediately; it is shown only once. This is distinct from the receiver-supplied Standard Webhooks `whsec_` secret. Use purpose `automation` or `both` with `auth: { "type": "bearer", "secret": "..." }` for automation destinations; responses expose only `auth.type` and `auth.configured`.
|
|
772
780
|
|
|
773
|
-
List responses include `destination_display` and a deprecated `url` compatibility field containing only the origin plus `/…`.
|
|
781
|
+
List responses include `destination_display` and a deprecated `url` compatibility field containing only the origin plus `/…`. Automation action payloads use schema version `3` with current tenant-scoped project and issue fields; subscription broadcasts and `ping` remain schema version `2`. Delivery requests include `X-Atoll-Signature`, `X-Atoll-Signature-Version`, versioned `X-Atoll-Signatures`, `X-Atoll-Delivery-Id`, and `Idempotency-Key`. When Standard Webhooks is enabled, they also include `webhook-id`, `webhook-timestamp`, and `webhook-signature`. Delivery history includes `delivery_id`, `status`, `status_code`, `error_code`, `delivered_at`, and `next_retry_at`, never payloads, receiver response bodies, or raw errors.
|
|
774
782
|
|
|
775
783
|
## Private Inbox Fields
|
|
776
784
|
|
|
@@ -815,6 +823,53 @@ Proposal JSON currently supports at most one item in each collection: `projects`
|
|
|
815
823
|
|
|
816
824
|
## Heartbeat Response
|
|
817
825
|
|
|
826
|
+
`GET /api/orgs/{id}/heartbeat` returns compact delivery by default for REST
|
|
827
|
+
and private CLI/MCP callers. Compact responses contain `mode: "compact"`,
|
|
828
|
+
`agent`, `timestamp`, `attention_items`, `attention_summary`, grouped `signals`, `recommended_action`,
|
|
829
|
+
`counts`, `delta`, and `page`. Full legacy context is available only with
|
|
830
|
+
`view=full` (or the CLI `--full` flag).
|
|
831
|
+
|
|
832
|
+
### Compact heartbeat fields
|
|
833
|
+
|
|
834
|
+
| Field | Notes |
|
|
835
|
+
|---|---|
|
|
836
|
+
| `signals[]` | Grouped actionable signal or dependency-blocker groups. Each group has `key`, `revision`, `severity`, `kind`, `action_reason`, root and impact counts, readiness, bounded `evidence`, and optional `suggested_read`. |
|
|
837
|
+
| `attention_items` | Bounded direct attention projections with required `id`, `event_type`, `severity`, `title`, `resource_type`, and `ack_endpoint`; optional `resource_id` is included when present. |
|
|
838
|
+
| `attention_summary` | Counts for included direct attention items. |
|
|
839
|
+
| `counts` | `actionable_groups`, severity counts, `direct_blocked`, `downstream_blocked`, `ready_if_released`, `unknown_readiness`, `restricted`, and `suppressed_expected_waits`. |
|
|
840
|
+
| `delta` | `since`, `new_count`, `changed_count`, `escalated_count`, `ready_count`, suppression counts, and `reset_required`. |
|
|
841
|
+
| `page` | Requested `max_bytes` (1,024-16,384) and `max_items` (1-25), returned counts/bytes, `has_more`, `next_cursor`, and terminal `ack_cursor`. |
|
|
842
|
+
|
|
843
|
+
Compact pages are deterministic and use opaque, server-issued cursors. Request
|
|
844
|
+
the next page with the exact `next_cursor` from the immediately previous page;
|
|
845
|
+
do not manufacture, skip, or replay a page cursor. Cursors are single-use in sequence. Acknowledge only the terminal `ack_cursor` using
|
|
846
|
+
`POST /api/orgs/{id}/heartbeat/ack`, then use that acknowledged cursor as
|
|
847
|
+
`since` on a later request. Invalid cursors return `400`; stale pages or an
|
|
848
|
+
unacknowledged `since` return `409`. An expired acknowledged baseline returns a
|
|
849
|
+
fresh compact response with `delta.reset_required: true`. If the requested
|
|
850
|
+
`max_bytes` cannot fit the mandatory actionable record and compact response
|
|
851
|
+
envelope, the route returns `413` with `code: "heartbeat_budget_too_small"`;
|
|
852
|
+
no page cursor or terminal receipt advances. Retry with a larger `max_bytes` or
|
|
853
|
+
omit it for the 16,384-byte default. Policy, authorization, or candidate
|
|
854
|
+
changes while paging invalidate the cursor.
|
|
855
|
+
|
|
856
|
+
Expected waits are suppressed for an unsatisfied dependency when the readable
|
|
857
|
+
blocker is before its release column and there is no active stall, threatened or
|
|
858
|
+
overdue commitment, or explicit deadline, gate, permission, or stale anomaly.
|
|
859
|
+
An unowned backlog or Todo blocker by itself is an ordinary wait and never
|
|
860
|
+
alerts. Actionable groups surface active stalls, threatened or overdue
|
|
861
|
+
commitments, and explicit anomalies; escalation metadata alone does not surface
|
|
862
|
+
an expected wait. Initiative-target and stalled aggregates are also suppressed
|
|
863
|
+
when every underlying dependency is an expected wait. Dependency blockers are grouped by
|
|
864
|
+
root and release condition. A dependency chain may
|
|
865
|
+
include readable nodes and edges, opaque restricted node tokens, readiness,
|
|
866
|
+
release-condition satisfaction, and explicit permission flags; unknown
|
|
867
|
+
readiness remains unknown. Suggested reads are safe GET/CLI/private-MCP calls.
|
|
868
|
+
|
|
869
|
+
The public plugin MCP heartbeat keeps its legacy full response and does not
|
|
870
|
+
expose compact acknowledgement or dependency-chain tools. Private MCP supports
|
|
871
|
+
compact heartbeat, `atoll_ack_heartbeat`, and `atoll_get_dependency_chain`.
|
|
872
|
+
|
|
818
873
|
```json
|
|
819
874
|
{
|
|
820
875
|
"agent": { "id": "...", "display_name": "Growth Agent" },
|
|
@@ -1136,6 +1191,26 @@ blocking project's `done` column. During a rolling deployment, compatibility
|
|
|
1136
1191
|
reads may omit release fields from older rows; treat missing release metadata as
|
|
1137
1192
|
the legacy open-blocker behavior until the migration is applied.
|
|
1138
1193
|
|
|
1194
|
+
### Dependency chain fields
|
|
1195
|
+
|
|
1196
|
+
`GET /api/orgs/{id}/issues/{issueId}/dependencies?view=chain` returns a bounded
|
|
1197
|
+
normalized graph:
|
|
1198
|
+
|
|
1199
|
+
| Field | Notes |
|
|
1200
|
+
|---|---|
|
|
1201
|
+
| `root_issue_id` | Authorized root issue UUID. |
|
|
1202
|
+
| `direction` | `upstream`, `downstream`, or `both`; default `both`. |
|
|
1203
|
+
| `depth` | Traversal depth, default `2`, capped at `5`. |
|
|
1204
|
+
| `nodes[]` | Readable issue projections with readiness and dependency counts, or opaque restricted tokens with `readiness: "unknown"` and `permissions.read: false`. |
|
|
1205
|
+
| `edges[]` | Upstream/downstream node IDs, permission flags, optional `release_condition`, `satisfied`, and reason (`release_reached`, `release_not_reached`, or `readiness_unknown`). |
|
|
1206
|
+
| `counts` | Returned/known nodes and edges, direction counts, readiness counts, restricted nodes, and unsatisfied release conditions. |
|
|
1207
|
+
| `page` | `limit`, `truncated`, and opaque `next_cursor`. |
|
|
1208
|
+
|
|
1209
|
+
The chain is read-only. Use `limit` and `cursor` for bounded traversal; do not
|
|
1210
|
+
infer restricted issue identity from the token. Chain cursors are signed,
|
|
1211
|
+
opaque, and bound to the current graph revision, root, direction, depth, limit,
|
|
1212
|
+
and caller scope. If the graph changes while paging, the route returns `409 Stale dependency chain cursor`; restart without `cursor`.
|
|
1213
|
+
|
|
1139
1214
|
## External References
|
|
1140
1215
|
|
|
1141
1216
|
External-reference response items contain `link_id`, `id`, `org_id`,
|
|
@@ -47,6 +47,10 @@ atoll heartbeat
|
|
|
47
47
|
atoll heartbeat --signals-only
|
|
48
48
|
atoll heartbeat --severity critical
|
|
49
49
|
atoll heartbeat --json
|
|
50
|
+
atoll heartbeat --full --json
|
|
51
|
+
atoll heartbeat --since <ack-cursor> --json
|
|
52
|
+
atoll heartbeat --cursor <page-cursor> --json
|
|
53
|
+
atoll heartbeat --ack <terminal-ack-cursor> --json
|
|
50
54
|
atoll agent-context
|
|
51
55
|
|
|
52
56
|
# List tasks
|
|
@@ -117,6 +121,7 @@ atoll api get /api/orgs/$ATOLL_ORG_ID/labels --json
|
|
|
117
121
|
|
|
118
122
|
# Dependencies
|
|
119
123
|
atoll dependency bulk-add --file ./dependencies.json --continue-on-error
|
|
124
|
+
atoll dependency chain ATOLL-42 --direction downstream --depth 2 --json
|
|
120
125
|
|
|
121
126
|
Dependency reads include a target issue `identifier` and `projectSlug` when the target belongs to a project. Inaccessible targets remain `issue: null`; projectless targets have both fields set to `null`.
|
|
122
127
|
Dependencies persist a release point in the blocking project's ordered board columns. Add `releaseColumnId` when creating an edge, or omit it to default to that project's `done` column. Use the dependency API PATCH route to change the release point; reads include `releaseColumnId`, `releaseColumn`, and `satisfied`.
|
|
@@ -132,6 +137,14 @@ snake_case consumers need it; POST and PATCH accept either `releaseColumnId` or
|
|
|
132
137
|
`release_column_id`. When deleting a board column, migrate issue
|
|
133
138
|
statuses and dependency release references with separate explicit targets.
|
|
134
139
|
|
|
140
|
+
`atoll dependency chain <identifier>` reads a bounded normalized dependency
|
|
141
|
+
graph. Use `--direction upstream|downstream|both` (default `both`),
|
|
142
|
+
`--depth` (default `2`, maximum `5`), `--limit`, and `--cursor`. Readable nodes
|
|
143
|
+
include readiness and release-condition state. Restricted nodes use opaque
|
|
144
|
+
tokens and `readiness: "unknown"`; never infer their issue identity. The cursor
|
|
145
|
+
is signed and revision-bound; graph changes while paging return `409 Stale
|
|
146
|
+
dependency chain cursor`, so restart without the cursor.
|
|
147
|
+
|
|
135
148
|
# Graph plans
|
|
136
149
|
atoll plan validate --file ./plan.json
|
|
137
150
|
atoll plan apply --file ./plan.json --dry-run
|
|
@@ -183,7 +196,13 @@ CLI JSON conventions:
|
|
|
183
196
|
- Interactive CLI update notices also go to stderr and are suppressed for JSON/non-TTY/CI/completion flows.
|
|
184
197
|
- `atoll agent-context` returns a versioned command/flag manifest, available profile context, and structured `cli.update_available` metadata.
|
|
185
198
|
- Weekly issue recurrence accepts unique selected weekdays with `--recurrence weekly --recurrence-days mon,wed,fri --recurrence-mode schedule --recurrence-time 09:00 --recurrence-timezone Asia/Singapore`. Read JSON exposes normalized `recurrence_days` and `recurrence_schedule`; unrelated updates preserve the schedule. Scheduled recurrence intervals are limited to `10000`. Use `--recurrence-mode schedule` with `--recurrence-time HH:MM` and `--recurrence-timezone IANA/Zone` to create the next task from the maintenance sweep while the current task remains open; `completion` remains the default and can retain larger positive intervals.
|
|
186
|
-
- `atoll heartbeat
|
|
199
|
+
- `atoll heartbeat` uses compact delivery by default. Compact JSON is bounded to 25 signal groups and 16,384 UTF-8 bytes, with `counts`, `delta`, and `page`. Follow `page.next_cursor` until the terminal page, then acknowledge its `page.ack_cursor` with `atoll heartbeat --ack <cursor> --json`. Use an acknowledged cursor with `--since`; invalid or stale cursors return an error, and an expired baseline sets `delta.reset_required: true`. If a requested REST
|
|
200
|
+
`max_bytes` cannot fit the mandatory actionable record and compact response
|
|
201
|
+
envelope, the API returns `413 heartbeat_budget_too_small` without advancing a
|
|
202
|
+
page cursor or terminal receipt; retry with a larger budget or the 16 KiB
|
|
203
|
+
default. Use `--full` for the legacy full context; full mode cannot combine with `--since` or `--cursor`.
|
|
204
|
+
- Compact signal groups include dependency blockers grouped by root 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. Initiative-target and stalled aggregates are also suppressed when every underlying dependency is an expected wait. Groups can include a bounded `suggested_read` REST, CLI, or private-MCP call. Public plugin MCP keeps legacy full heartbeat behavior; private MCP supports compact heartbeat, `atoll_ack_heartbeat`, and `atoll_get_dependency_chain`.
|
|
205
|
+
- `atoll heartbeat --json` includes the structured `cli` update metadata for agents, plus direct `attention`/`attention_items` and `recommended_action` when Atoll can propose one concrete strategy-backed next action. Handle direct attention items first, then call each handled item's `ack_endpoint`. Follow `recommended_action.usage_guidance`: prefer `suggested_write.operation` when it still matches the board, preserve KPI/initiative/initiative_target/why-now/expected-impact/first-step/success-criteria evidence, and avoid copying deferred busywork into issue or comment payloads. If a `start_work` recommendation uses `issue.update` with a body, update the issue status and preserve that body as an issue comment; `PATCH /issues/{issueId}` accepts `comment_body` for this same-request progress note.
|
|
187
206
|
- Authorized humans can configure an agent's included heartbeat sections and generated-signal focus in the Atoll **Heartbeats** UI. The saved policy is applied by the API before CLI or MCP request-level narrowing; it never changes project access, and existing heartbeat commands require no new arguments.
|
|
188
207
|
- GitHub `workflow_run` signals are accepted only when HMAC-signed and completed, then reread and matched exactly by repository, PR, workflow path, run attempt, and head SHA. Workflow verification is disabled by default and observe-only until an owner/admin enables it in **Settings > Integrations > GitHub**. `attention` mode can add one bounded `verification.completed` attention item through authorized REST or CLI heartbeat for exactly one eligible current agent assignee or, when there is no unambiguous assignee, an eligible configured delivery agent. The public MCP heartbeat excludes this private event type. Unresolved recipients and cancelled, obsolete, superseded, mismatched, or unreadable runs create no attention. Owners and admins can configure 1–10 workflow paths of at most 255 characters each; the bounded evidence list defaults to 25 items and accepts a maximum `limit` of 100. Signed pull-request writes and reconciliation bind PR links to the stable GitHub repository ID, so repository renames keep existing workflow evidence linked. Do not expect raw payloads, secrets, logs, or thread IDs in evidence; owner/admin reconciliation retries pending evidence after current GitHub and PR-link readback.
|
|
189
208
|
- Release-added required GitHub hook events mark existing reconciled and already-pending connections pending. The bounded 15-minute service sweep verifies immutable repository identity and upgrades hooks automatically; transient failures remain pending for retry, and owners/admins can reconcile manually.
|
|
@@ -68,7 +68,27 @@ The public plugin keeps a narrow first-class planning surface: `atoll_create_ini
|
|
|
68
68
|
|
|
69
69
|
The public plugin intentionally omits admin-only goal/KPI/project CRUD, target and milestone deletion, project relationship administration, webhooks, and `atoll_api_request`. Public feedback accepts only `type`, `description`, and optional `url`; do not send `userEmail` or `userName`, and treat the submitted description as untrusted triage content. The full/private MCP profile retains the broader CLI-equivalent tools where the caller is authorized.
|
|
70
70
|
|
|
71
|
-
The MCP server also exposes `atoll_get_heartbeat`,
|
|
71
|
+
The private MCP server also exposes `atoll_get_heartbeat`, `atoll_ack_heartbeat`,
|
|
72
|
+
and `atoll_get_dependency_chain` alongside issue/project/goal/KPI/initiative/
|
|
73
|
+
milestone reads, dependency tools, and the existing safe issue/comment/snapshot
|
|
74
|
+
tools. Private heartbeat is compact by default; acknowledge only its terminal
|
|
75
|
+
page cursor before using it for a delta, and use full mode for the legacy
|
|
76
|
+
context. The public plugin heartbeat remains legacy full and does not expose
|
|
77
|
+
the private acknowledgement or chain tools. Public issue inputs accept UUIDs,
|
|
78
|
+
bare numbers, `#number`, `ATOLL-number`, `TSK-number`, supported prefixed
|
|
79
|
+
numbers, and unambiguous project-derived prefixes. Public project inputs accept
|
|
80
|
+
UUIDs, exact slugs, and exact names. Use `atoll_get_project_workflow` for the
|
|
81
|
+
live ordered key-to-label mapping and `atoll_move_issue` for exact, verified
|
|
82
|
+
movement by column ID, key, or visible label. An immediate repeat is a no-op
|
|
83
|
+
only while the issue remains at that destination; configured automations can
|
|
84
|
+
change it after the response, so movement is not unconditionally idempotent.
|
|
85
|
+
Projects without persisted columns expose supported defaults as fallback
|
|
86
|
+
columns with stable `default-*` IDs; `cancelled` remains the only system
|
|
87
|
+
status. Raw `status` is a stored board-column key, not a label.
|
|
88
|
+
`atoll_add_comment` accepts structured mentions, `reply_to_comment_id`, and
|
|
89
|
+
optional agent `source_metadata`; omit that metadata unless the host exposes a
|
|
90
|
+
real thread or session ID, and never invent one. `atoll_update_issue` accepts
|
|
91
|
+
`comment_body` for durable progress comments.
|
|
72
92
|
|
|
73
93
|
Snapshot list/create outputs keep their strict legacy fields. Use the separate
|
|
74
94
|
read-only MCP tool `atoll_list_kpi_snapshots_with_provenance` only when the
|
|
@@ -207,14 +227,55 @@ Config sessions and unused manual connect tokens expire after 10 minutes. Sessio
|
|
|
207
227
|
|
|
208
228
|
`POST /api/webhooks` creates outbound webhooks. Receiver URLs must be HTTPS DNS hostnames; Atoll rejects IP literals, `localhost`, `.local` hosts, URL credentials, and fragments at creation. Delivery also resolves DNS and refuses private, loopback, link-local, documentation, multicast, and other non-public addresses; redirects are not followed.
|
|
209
229
|
|
|
210
|
-
Webhook creation returns
|
|
230
|
+
Webhook creation returns an Atoll-generated signing `secret` once. Store it
|
|
231
|
+
immediately; it is distinct from the receiver-supplied Standard Webhooks
|
|
232
|
+
`whsec_` secret. Delivery requests include:
|
|
211
233
|
|
|
212
234
|
- `X-Atoll-Signature`: `sha256=` plus an HMAC-SHA256 over the raw body, keyed by the SHA-256 hex digest of the raw secret.
|
|
213
235
|
- `X-Atoll-Signature-Version`: the primary signing-key version.
|
|
214
236
|
- `X-Atoll-Signatures`: versioned signatures during a bounded key-overlap window.
|
|
215
237
|
- `X-Atoll-Delivery-Id`: stable delivery id for receiver-side deduplication.
|
|
216
|
-
|
|
217
|
-
|
|
238
|
+
- `Idempotency-Key`: present on every outbound delivery; it is the same logical delivery id across automatic retries, while manual redelivery uses a new id and key.
|
|
239
|
+
- Optional Standard Webhooks signing adds `webhook-id`, `webhook-timestamp`, and `webhook-signature: v1,<base64>` using the receiver's canonical `whsec_` secret (24-64 decoded bytes). The signature covers `deliveryId.timestamp.rawBody`. A 2xx response proves acceptance only.
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
### Receiver setup
|
|
244
|
+
|
|
245
|
+
Grok Automations supports this Standard Webhooks option. Configure an
|
|
246
|
+
`automation` destination with the receiver-supplied `whsec_` value from Grok.
|
|
247
|
+
Grok validates `webhook-id`, `webhook-timestamp`, and
|
|
248
|
+
`webhook-signature: v1,<base64>` within a five-minute timestamp window; HTTP
|
|
249
|
+
202 means accepted for processing, not completed.
|
|
250
|
+
|
|
251
|
+
Hermes supports the same Standard Webhooks `whsec_` verification on a public
|
|
252
|
+
HTTPS `/webhooks/<route>` endpoint. Configure the Hermes receiver route/filter
|
|
253
|
+
with `events: ["automation.action"]`; this is a receiver setting. In Atoll, set
|
|
254
|
+
the destination `purpose` to `automation` (or `both`) and trigger it with an
|
|
255
|
+
explicit `send_webhook` action; the Atoll destination `events` field does not
|
|
256
|
+
select automation actions. Hermes should allowlist and render these v3 fields
|
|
257
|
+
when present: `data.project`, `data.issue`, `data.automation.ruleId`,
|
|
258
|
+
`data.automation.ruleName`, `data.trigger.eventType`, and
|
|
259
|
+
`data.trigger.changedFields`. Issue payloads also include the current persisted
|
|
260
|
+
`id`, optional `identifier` and `url`, `title`, `status`, `priority`, `assigneeId`,
|
|
261
|
+
`updatedAt`, and an optional privacy-safe `artifacts` count. CI payloads set
|
|
262
|
+
`data.issue` to null and retain only the useful `ci` fields, so handle CI events
|
|
263
|
+
separately. Hermes can use `webhook-id` for one-hour deduplication. A 2xx
|
|
264
|
+
response is receiver acceptance, not agent completion. No live Hermes receiver
|
|
265
|
+
test was run; this setup guidance is based on source compatibility.
|
|
266
|
+
|
|
267
|
+
Webhook administration is owner/admin only. Lists return an origin-only
|
|
268
|
+
`destination_display`; paths, queries, and signing material are never returned.
|
|
269
|
+
Automation action payloads use schema version `3`; subscription broadcasts and
|
|
270
|
+
`ping` remain schema version `2`. Existing queued payloads retain their stored
|
|
271
|
+
schema and content. Artifact summaries are omitted when lookup fails, data is
|
|
272
|
+
invalid, or counting cannot complete within the bounded 1,000-row pagination
|
|
273
|
+
limit. Both versions omit descriptions, comment bodies, and raw change values.
|
|
274
|
+
Delivery rows expose safe `delivery_id`, `status`, `status_code`,
|
|
275
|
+
`error_code`, and retry timing, but not payloads, receiver response bodies, or
|
|
276
|
+
raw errors. Each invocation makes one 30-second request attempt. Network
|
|
277
|
+
failures and 5xx responses persist `status: retry_pending` with
|
|
278
|
+
`next_retry_at`; an internal drain retries due deliveries every 15 minutes.
|
|
218
279
|
|
|
219
280
|
### GitHub delivery context
|
|
220
281
|
|
|
@@ -2,6 +2,67 @@
|
|
|
2
2
|
|
|
3
3
|
Read this reference for goals, KPIs, initiatives, targets, heartbeat signals, autonomous prioritization, and strategy-linked execution workflows.
|
|
4
4
|
|
|
5
|
+
## Compact heartbeat delivery
|
|
6
|
+
|
|
7
|
+
`GET /api/orgs/{id}/heartbeat` returns a compact response by default for REST
|
|
8
|
+
callers and private CLI/MCP callers. The compact response keeps direct
|
|
9
|
+
`attention_items`, grouped actionable `signals`, `recommended_action`,
|
|
10
|
+
`counts`, `delta`, and `page` metadata. It does not include the full goals,
|
|
11
|
+
KPI, initiative, assigned-issue, or board-context collections.
|
|
12
|
+
|
|
13
|
+
Compact responses are bounded to 16,384 UTF-8 bytes and 25 signal groups by
|
|
14
|
+
default. A response can contain a `next_cursor` when more groups remain. Read
|
|
15
|
+
that cursor with `cursor=<value>` and continue until `page.has_more` is false.
|
|
16
|
+
Only the terminal page contains `page.ack_cursor`.
|
|
17
|
+
|
|
18
|
+
Process every returned page before acknowledging it:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
page=$(atoll heartbeat --json)
|
|
22
|
+
# If .page.has_more is true, repeat with --cursor .page.next_cursor.
|
|
23
|
+
atoll heartbeat --ack <terminal-ack-cursor>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
`POST /api/orgs/{id}/heartbeat/ack` accepts `{ "ack_cursor": "..." }`. The
|
|
27
|
+
cursor must be the terminal cursor from the final page. A page cursor cannot
|
|
28
|
+
be acknowledged. Acknowledgement is idempotent. Use an acknowledged terminal
|
|
29
|
+
cursor with `since=<cursor>` to receive only new, changed, or escalated groups.
|
|
30
|
+
Unchanged groups and expected waits are reported in compact counts and are
|
|
31
|
+
suppressed from the signal list. An invalid cursor returns `400`; a stale page
|
|
32
|
+
cursor or an unacknowledged `since` cursor returns `409`. If an acknowledged
|
|
33
|
+
baseline has expired, Atoll returns a fresh compact response with
|
|
34
|
+
`delta.reset_required: true`.
|
|
35
|
+
|
|
36
|
+
If the requested `max_bytes` cannot fit the mandatory actionable record and
|
|
37
|
+
compact response envelope, the server returns `413` with
|
|
38
|
+
`code: "heartbeat_budget_too_small"`. It does not advance a page cursor or
|
|
39
|
+
terminal receipt. Retry with a larger `max_bytes` (up to `16,384`) or omit the
|
|
40
|
+
parameter to use the default.
|
|
41
|
+
|
|
42
|
+
If policy, authorization, or the candidate set changes while a page is being
|
|
43
|
+
read, restart without the cursor after `409 heartbeat_cursor_stale`. Compact
|
|
44
|
+
dependency groups use an actionable upstream blocker and release condition as
|
|
45
|
+
their root. Expected waits are suppressed for an unsatisfied dependency when the readable
|
|
46
|
+
blocker is before its release column and there is no active stall, threatened or
|
|
47
|
+
overdue commitment, or explicit deadline, gate, permission, or stale anomaly.
|
|
48
|
+
An unowned backlog or Todo blocker by itself is an ordinary wait and never
|
|
49
|
+
alerts. Actionable groups surface active stalls, threatened or overdue
|
|
50
|
+
commitments, and explicit anomalies; escalation metadata alone does not surface
|
|
51
|
+
an expected wait. Initiative-target and stalled aggregates are also suppressed
|
|
52
|
+
when every underlying dependency is an expected wait. Actionable groups can include a
|
|
53
|
+
`suggested_read` with an executable REST path, CLI command, or private MCP tool
|
|
54
|
+
call. Dependency-chain cursors are signed and revision-bound. If the graph
|
|
55
|
+
changes while paging, the chain request returns `409 Stale dependency chain
|
|
56
|
+
cursor`; restart without the cursor.
|
|
57
|
+
|
|
58
|
+
Use `atoll heartbeat --full` or `?view=full` for the legacy full context. Full
|
|
59
|
+
requests cannot include `since` or `cursor`.
|
|
60
|
+
|
|
61
|
+
The public ChatGPT/Codex plugin MCP profile keeps the legacy full heartbeat
|
|
62
|
+
shape and does not expose compact heartbeat acknowledgement or dependency-chain
|
|
63
|
+
tools. The private MCP profile supports compact heartbeat paging and
|
|
64
|
+
`atoll_ack_heartbeat`, plus `atoll_get_dependency_chain`.
|
|
65
|
+
|
|
5
66
|
## The Heartbeat Loop
|
|
6
67
|
|
|
7
68
|
The primary pattern for autonomous agents. Prefer `atoll heartbeat --json` when the CLI is available; it wraps `GET /api/orgs/{id}/heartbeat` and returns the same computed briefing:
|
|
@@ -30,6 +91,11 @@ atoll heartbeat
|
|
|
30
91
|
atoll heartbeat --signals-only
|
|
31
92
|
atoll heartbeat --severity critical
|
|
32
93
|
atoll heartbeat --json
|
|
94
|
+
atoll heartbeat --full --json
|
|
95
|
+
atoll heartbeat --since <ack-cursor> --json
|
|
96
|
+
atoll heartbeat --cursor <page-cursor> --json
|
|
97
|
+
atoll heartbeat --ack <terminal-ack-cursor>
|
|
98
|
+
atoll dependency chain <issue> --direction upstream --depth 2 --limit 50 --json
|
|
33
99
|
```
|
|
34
100
|
|
|
35
101
|
**The agent loop:**
|