@atollhq/skill-claude 0.4.37 → 0.4.39

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.
@@ -103,6 +103,19 @@ Mutation metadata is closed: `progress` accepts `preparing`,
103
103
  `finalizing`; `errorCode` accepts `runner_error`, `sdk_error`, `model_error`,
104
104
  `timeout`, `cancelled`, or `unknown`. Free-form runtime details are rejected.
105
105
 
106
+ For verified workflow resume, set GitHub verification mode to `resume` in
107
+ Workspace Settings. This mode is disabled by default, requires a current Codex
108
+ runner for the delivery agent, and adds `verificationEventId` to a verified
109
+ workflow `attention_resume` claim. The server binds the completed issue lease to the
110
+ repository ID, PR number, exact head SHA, source lease generation, runner
111
+ installation, runner host, and preserved thread.
112
+ Only a matching `verification.completed` item is routed to
113
+ `resume_agent_thread`; uncertain or mismatched identity remains review-only.
114
+ `RUNNER_LEASE_VERIFICATION_BINDING_MISMATCH` is a definite 409 claim
115
+ rejection; the local attempt closes while the notification remains unread for
116
+ the next review pass. There is no new-thread fallback. Terminal replay is
117
+ acknowledgement-only.
118
+
106
119
  ## Hosted runner fleet control
107
120
 
108
121
  `GET /api/orgs/{id}/runners` is human-session only. It returns one current or
@@ -242,6 +255,30 @@ Creation endpoints may return `402` when an org reaches its billing plan limit:
242
255
 
243
256
  `resource` is one of `humans`, `agents`, `activeProjects`, or `activeIssues`.
244
257
 
258
+ ## Member Directory Fields
259
+
260
+ `GET /api/orgs/{id}/members?shape=envelope` returns the bounded member
261
+ directory. Supplying `q`, `limit`, or `offset` also selects this directory
262
+ mode. It returns a list envelope with exact `total`, `limit`, `offset`,
263
+ `nextOffset`, `truncated`, and `hint` values.
264
+
265
+ Each `items[]` row contains only:
266
+
267
+ | Field | Description |
268
+ |-------|-------------|
269
+ | `id` | Stable organization member UUID. Use this in issue `assignee_id` or `assignee_ids` writes. |
270
+ | `display_name` | Safe display name; missing names use `Unknown member`. |
271
+ | `type` | `human` or `agent`. |
272
+ | `role` | Current organization role. |
273
+ | `avatar_url` | Avatar URL or `null`. |
274
+
275
+ Directory inputs are `projectId`, `type=human|agent`, case-insensitive
276
+ display-name `q`, `limit` (default 25, maximum 100), and `offset` (default 0).
277
+ Project results require caller access and follow existing collaborator
278
+ visibility rules. Unprojected directory results exclude guests. `includeEmail`
279
+ does not add email to this response. A request without `shape`, `q`, `limit`, or
280
+ `offset` keeps the legacy member response for web consumers.
281
+
245
282
  ## Agent Fields
246
283
 
247
284
  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.
@@ -366,6 +403,12 @@ attribution.
366
403
 
367
404
  V1 syncs are `GET` only, `https` only, JSON only, exact-host allowlisted, no redirects, no request bodies, no inline query strings, and no secret values. Machine actors can create drafts and validate configs only after the host is allowlisted. Human admins manage allowlists, secrets, dry-runs, publishing, disabling, and snapshot-writing run-now actions in Atoll.
368
405
 
406
+ Both MCP profiles expose `atoll_create_kpi_http_sync_draft` and
407
+ `atoll_validate_kpi_http_sync_config` for this draft-only workflow. The tools
408
+ reject inline secret values and return safe draft metadata rather than request
409
+ configuration. Public MCP does not expose secret entry, network dry runs,
410
+ publishing, disabling, or snapshot writes.
411
+
369
412
  ## Initiative Fields
370
413
 
371
414
  ```json
@@ -436,16 +479,42 @@ writes persist canonical resource UUIDs within the initiative's authorized
436
479
  scope; malformed, concealed, ambiguous, and resolver-failure outcomes are
437
480
  `400`, `404`, `409`, and `500` respectively.
438
481
 
439
- ## Public MCP planning fields
440
-
441
- The public plugin uses snake_case MCP fields and adds `profile_ref` to each
442
- actor-dependent call. `project_id` accepts a project UUID, exact slug, or exact
443
- name for initiative and milestone operations; the MCP server resolves it to a
444
- canonical UUID before writing. Issue references accept UUIDs, bare numbers,
445
- `#number`, `ATOLL-number`, `TSK-number`, and unambiguous project-derived
446
- prefixes. Initiative milestone-link creation also accepts an exact milestone
447
- name through the backing API resolver; unlink operations use the canonical
448
- milestone UUID.
482
+ ## Public MCP typed product fields
483
+
484
+ Public plugin calls use snake_case fields and accept the opaque per-call
485
+ `profile_ref` selector. Project references accept a UUID, exact slug, or exact
486
+ name. Issue references accept UUIDs, bare numbers, `#number`, `ATOLL-number`,
487
+ `TSK-number`, and unambiguous project-derived prefixes. Label references accept
488
+ a UUID or exact label name. Initiative milestone-link creation also accepts an
489
+ exact milestone name; unlink operations use the canonical milestone UUID.
490
+
491
+ Core typed tools include issue archive/unarchive and dependency-chain reads;
492
+ label and subtask list/create/update/delete; strategy audit; organization
493
+ activity; notification list/acknowledgement; project create/delete and board
494
+ column creation; and goal/KPI create/update. `atoll_get_strategy_audit` accepts
495
+ `severity: "critical" | "warning" | "info"`; the returned summary and type
496
+ counts match the filtered findings. `atoll_list_activity` accepts filter
497
+ `by_me` or `mine`, `limit: 1..100`, and non-negative `offset`.
498
+
499
+ Goal update accepts `goal_id` as a UUID or exact goal title. KPI create and
500
+ update accept `goal_id` as a UUID or exact goal title; KPI update accepts
501
+ `kpi_id` as a UUID or exact KPI name. These lookups are exact and scoped to
502
+ the selected organization. Missing names return `reference_not_found`, and
503
+ duplicate exact names return `ambiguous_reference`; neither writes a mutation.
504
+ Archive and unarchive emit the normal `issue.updated` webhook event. The
505
+ project, label, subtask, board-column, goal, and KPI writes listed in the API
506
+ endpoint reference can return `core_write_uncertain` with `retryable: false`
507
+ when transport failure, HTTP 5xx, or invalid success output leaves the outcome
508
+ unclear. Use the error's readback steps to reconcile state before a replay;
509
+ authoritative 4xx responses are preserved.
510
+
511
+ Subtask creation accepts `{ title }`; update accepts `title`, `completed`, or
512
+ both. Board-column creation accepts `project_id`, lowercase `key`, `label`,
513
+ optional inline `description`, and optional `color`; MCP has no file-input
514
+ field. Project deletion requires the exact `confirmation: "DELETE"` value and
515
+ owner/admin access. Linked Artifacts and active executions can still block
516
+ deletion. Goal writes remain owner/admin-only. KPI update changes configuration;
517
+ use `atoll_record_kpi_snapshot` to record `current_value` measurements.
449
518
 
450
519
  Examples:
451
520
 
@@ -460,6 +529,36 @@ Examples:
460
529
 
461
530
  Initiative creation accepts either a non-empty `title` or the legacy `name`
462
531
  alias; updates use `title` only. Initiative, target, and milestone due dates use `YYYY-MM-DD`.
532
+
533
+ ## Read-only repository context fields
534
+
535
+ `atoll_list_project_repositories` accepts `org_id` and `project_id`;
536
+ `project_id` supports a UUID, exact slug, or exact name. Its response contains
537
+ `project`, mapped `repositories`, and `truncated`. Each repository includes an
538
+ opaque `repo_ref`, safe repository and project identities, `default_ref`, and
539
+ `read_only_app.status: "connected"`.
540
+
541
+ The other four tools accept that `repo_ref`. Tree, file, search, and commit
542
+ results include `requested_ref` and `resolved_commit_sha`, which identifies the
543
+ exact commit used for the read. Tree entries contain `name`, `path`, `type`,
544
+ nullable `sha`, and nullable `size`; the response keeps `truncated`. File
545
+ results contain `path`, bounded `content`, `encoding: "utf-8"`, and `size`.
546
+ Search results contain `query`, nullable `path`, verified `hits`, `total_count`,
547
+ and `incomplete_results`; each hit includes `name`, `path`, `sha`, nullable
548
+ `html_url`, and `verified_at_commit_sha`. Commit results contain `sha`, nullable
549
+ `html_url`, bounded `message`, `message_truncated`, nullable `author` and
550
+ `committer` snapshots, valid `parents` with nullable `html_url`, and
551
+ `parents_truncated`. Public and full/private MCP output schemas reject
552
+ undeclared fields.
553
+
554
+ Repository errors preserve the REST `{ error, code, retryable }` fields. Codes
555
+ include `repository_not_connected`, `repository_access_denied`,
556
+ `github_installation_unavailable`, `github_permission_missing`,
557
+ `repository_ref_invalid`, `git_ref_not_found`, `repository_path_not_found`,
558
+ `repository_search_ref_unsupported`, `repository_file_too_large`,
559
+ `repository_file_encoding_unsupported`, and `repository_context_unavailable`.
560
+ Public plugin responses also wrap the same data in `result: { ok, data }` or
561
+ `result: { ok, error }`.
463
562
  Initiative target writes use the existing target fields above. Public milestone
464
563
  create and upsert accept `status: "active" | "closed"`; closed creation is
465
564
  persisted in the same downstream write. Public milestone upsert compares exact-name fields and returns `unchanged` for an identical
@@ -496,6 +595,10 @@ multiple exact-name milestones already exist, upsert returns a structured
496
595
  }
497
596
  ```
498
597
 
598
+ `issue.assigned` matches both assignment changes and issue creation with at
599
+ least one assignee. This includes recurring occurrences that inherit an
600
+ assignee from their recurrence root.
601
+
499
602
  Time-based rules use the same definition with `trigger_event:
500
603
  "schedule.issue_time"` and a required `schedule_config`:
501
604
 
@@ -624,8 +727,9 @@ return `400`. A project UUID requires both organization membership and caller
624
727
  read access to that project; cross-organization, inaccessible, or missing
625
728
  projects return `404`. Organization-wide and unfiltered requests retain existing
626
729
  organization-member access. Results remain newest first and include disabled
627
- or invalid rules with their validation diagnostics. This REST filter does not
628
- add CLI flags or public MCP tool parameters.
730
+ or invalid rules with their validation diagnostics. Both MCP profiles accept
731
+ the same optional `project_id` UUID or `none` filter; the CLI does not add
732
+ filter flags.
629
733
 
630
734
  GET/list rules can include `validation: { valid, issues: [{ path, code, message }] }`.
631
735
  Invalid saved rows remain readable. Runtime validation rejects the whole invalid
@@ -778,6 +882,11 @@ a new private destination version; pending deliveries retain their pinned versio
778
882
 
779
883
  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`.
780
884
 
885
+ `atoll_create_webhook` is available only in the full/private MCP profile because
886
+ normal MCP tool output may be retained in client conversation history. The
887
+ public plugin exposes redacted webhook listing and deletion but never the
888
+ one-time signing secret.
889
+
781
890
  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.
782
891
 
783
892
  ## Private Inbox Fields
@@ -825,7 +934,8 @@ Proposal JSON currently supports at most one item in each collection: `projects`
825
934
 
826
935
  `GET /api/orgs/{id}/heartbeat` returns compact delivery by default for REST
827
936
  and private CLI/MCP callers. Compact responses contain `mode: "compact"`,
828
- `agent`, `timestamp`, `attention_items`, `attention_summary`, grouped `signals`, `recommended_action`,
937
+ `agent`, `timestamp`, `attention_items`, `attention_summary`, private
938
+ `execution_attention` and `execution_attention_summary`, grouped `signals`, `recommended_action`,
829
939
  `counts`, `delta`, and `page`. Full legacy context is available only with
830
940
  `view=full` (or the CLI `--full` flag).
831
941
 
@@ -836,6 +946,8 @@ and private CLI/MCP callers. Compact responses contain `mode: "compact"`,
836
946
  | `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
947
  | `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
948
  | `attention_summary` | Counts for included direct attention items. |
949
+ | `execution_attention` | Private queues with `resolved_unread` answers and `open` requests. Resolved answers remain until explicit receipt acknowledgement or the exact requester `waiting -> running` transition. |
950
+ | `execution_attention_summary` | Private exact counts for `resolved_unread`, `open`, and `total`. |
839
951
  | `counts` | `actionable_groups`, severity counts, `direct_blocked`, `downstream_blocked`, `ready_if_released`, `unknown_readiness`, `restricted`, and `suppressed_expected_waits`. |
840
952
  | `delta` | `since`, `new_count`, `changed_count`, `escalated_count`, `ready_count`, suppression counts, and `reset_required`. |
841
953
  | `page` | Requested `max_bytes` (1,024-16,384) and `max_items` (1-25), returned counts/bytes, `has_more`, `next_cursor`, and terminal `ack_cursor`. |
@@ -1010,6 +1122,44 @@ Each finding carries whichever entity ids apply: `goal_id`, `kpi_id`, `initiativ
1010
1122
 
1011
1123
  ## Artifact Fields
1012
1124
 
1125
+ ### Revision source provenance
1126
+
1127
+ An Artifact revision can keep one optional source from an existing External
1128
+ Reference linked to the same issue or project. The source is an immutable
1129
+ pointer snapshot. Atoll does not fetch, copy, or synchronize provider content.
1130
+
1131
+ Create accepts optional `source_external_reference_link_id` (the Context link
1132
+ UUID). Revise uses three states: omit the field to inherit the current snapshot,
1133
+ supply a live link UUID to set or replace it, or send `null` to clear it on the
1134
+ new revision. A source-only change is valid and still requires the exact
1135
+ `expected_revision_id` or `expected_revision_number`. An unchanged title,
1136
+ content, and source is rejected. An unrelated or removed link cannot be selected.
1137
+
1138
+ Source selection returns `404 source_reference_unavailable` for a missing,
1139
+ concealed, or concurrently removed link; these cases are indistinguishable.
1140
+ A link on an unrelated Artifact target returns `400 source_target_mismatch`.
1141
+ Choose another source or clear the selection. A stale expected revision still
1142
+ returns `409 CONFLICT` and requires rereading the Artifact before retrying.
1143
+
1144
+ Add `?projection=source_provenance_v1` to Artifact create, revision create, or
1145
+ single-revision GET to receive `revision.source_reference`. Default responses
1146
+ and revision lists remain unchanged. Unknown or duplicate projections return
1147
+ `400`. The projection is `null` when no source exists or the caller cannot read
1148
+ the recorded source target. Otherwise it contains `external_reference_id`,
1149
+ `target_type`, `target_id`, `canonical_url`, `provider`, `object_type`,
1150
+ `provenance`, nullable `label`, and live `currently_linked`.
1151
+
1152
+ The URL is HTTP(S), has no credentials, and is limited to 2048 UTF-8 bytes;
1153
+ provider, object type, and provenance are each limited to 64 bytes, and the
1154
+ label to 240 characters (at most 960 UTF-8 bytes). All fields except `currently_linked` come from the saved
1155
+ snapshot. Removing the live Context link preserves history and permits
1156
+ inherit or clear. Later reference changes cannot rewrite a saved source.
1157
+ Linking the Artifact to another target does not grant access to its source.
1158
+
1159
+ The web editor and CLI support this workflow. Typed MCP source inputs and
1160
+ outputs are not yet available; their existing Artifact contract is unchanged.
1161
+
1162
+
1013
1163
  `atoll_list_artifacts` accepts optional `issue_id` for a compact issue manifest
1014
1164
  or `project_id` for direct project links; these selectors are mutually
1015
1165
  exclusive. All modes accept `limit` (1-100, default 50) and `offset`
@@ -1063,6 +1213,15 @@ returns state `assigned`. Transition requires `expected_state_version`,
1063
1213
  provenance; the server derives safe OAuth provenance. The generic transition
1064
1214
  enum excludes `needs_human`.
1065
1215
 
1216
+ The local runner uses `harness_kind: "atoll_local_runner"` and the lease UUID
1217
+ as `external_run_id`. Its private job record stores the exact execution state
1218
+ and version plus one bounded pending management operation. Canonical human
1219
+ attention adds private claim fields `attention_source: "human_attention"`,
1220
+ `execution_id`, `human_attention_item_id`, `expected_attention_version`, and
1221
+ `expected_execution_version`; those identities are separate from notification
1222
+ `attention_item_id`. The runner sends only canonical IDs and the closed
1223
+ resolution outcome enum to the retained thread.
1224
+
1066
1225
  ## Analytics Response
1067
1226
 
1068
1227
  ```json
@@ -1098,6 +1257,23 @@ bounded `resolution_summary`. Free-form text rejects secret-like values.
1098
1257
  Internal requester/actor provenance, hashes, response snapshots, and mutation
1099
1258
  metadata are never returned by the public API.
1100
1259
 
1260
+ Private heartbeat execution-attention items contain bounded execution, issue,
1261
+ project, kind, title, request summary, request time, status, attention version,
1262
+ execution state version, resolution outcome/summary when resolved, the close
1263
+ state version, and an `ack_endpoint`. The receipt ack body is
1264
+ `{ expected_attention_version, expected_execution_state_version_at_close,
1265
+ idempotency_key }`. It is requester-only, checks current project access, is
1266
+ idempotent for the same key and body, and never resumes work. Stale versions return `409`, including after consumption; current versions after another consumer return `already_consumed: true` without consuming again.
1267
+
1268
+ The full/private and public plugin MCP profiles expose typed execution tools
1269
+ for list, detail, assigned creation, version-fenced transition, evidence list,
1270
+ and existing-evidence link, plus requester attention list, detail, create,
1271
+ cancel, and receipt acknowledgement. These tools preserve the REST projections
1272
+ and require explicit lifecycle idempotency/version inputs on writes. Their
1273
+ schemas exclude local file content and do not expose human resolution,
1274
+ administrator recovery/retarget/cancel, or runner and harness controls. Public
1275
+ actor-dependent calls use the selected connection-scoped `profile_ref`.
1276
+
1101
1277
  ## Enums
1102
1278
 
1103
1279
  | Domain | Field | Values |
@@ -1228,6 +1404,11 @@ metadata-only Activity actions `external_reference.linked`,
1228
1404
 
1229
1405
  ### External operational delivery context
1230
1406
 
1407
+ Manual `workflow_dispatch` evidence requires one distinct current linked PR,
1408
+ canonical numeric PR and repository identity, and matching head SHA and branch.
1409
+ Several issue links to that same PR are allowed. Provider PR membership remains
1410
+ required for `pull_request` runs. Unresolved dispatch identity creates no signal.
1411
+
1231
1412
  `GET /api/orgs/{id}/issues/{issueId}/external-operational-signals` returns
1232
1413
  `{ deliveryContext }`. The value is `null` without a linked PR. With several
1233
1414
  links, selection prefers an open PR, then the latest `updated_at`, then the
@@ -1334,3 +1515,230 @@ not a hosted API or MCP surface. Its browser projection excludes credentials,
1334
1515
  raw configuration, prompts, and model output. Local bindings use `repo_ref` but
1335
1516
  do not grant project/repository access. Intake is read-only locally; hosted
1336
1517
  Workspace Settings → Runners owns pause/resume. See the CLI local-runner guide.
1518
+
1519
+ ## MCP Events subscription fields
1520
+
1521
+ The modern public OAuth MCP endpoint (`https://atollhq.com/mcp`, version `2026-07-28`) advertises `events` and supports `events/list`, `events/subscribe`, and `events/unsubscribe`. Legacy 2025 tool calls remain supported. No event subscriptions are available to API-key, private or stdio identities.
1522
+
1523
+ The authenticated adapter uses `POST /api/mcp-events/subscriptions` to create/refresh and `DELETE /api/mcp-events/subscriptions` to unsubscribe. Resolve the OAuth connection and optional `X-Atoll-Agent-Profile` through existing auth. Request fields are the protocol `name`, `arguments`, `delivery`, optional `ttlMs`, and optional `cursor: null`. Profile selection travels in the header, not business filters.
1524
+
1525
+ Events: `issue.status_changed` (`project_id`, optional `issue_id`, `from_status`, `to_status`); `attention.created` (`project_id`, optional `kind`); `execution.state_changed` (`project_id`, optional `issue_id`, `to_state`). Project and issue UUIDs must be readable in the selected profile; status keys must exist in the project's workflow.
1526
+
1527
+ Subscribe requires `{ mode: "webhook", url: "https://…", secret: "whsec_…" }` with a canonical Base64 key of 24–64 bytes. Unsubscribe uses the same name/arguments/callback identity and does not require a secret. The principal is the resolved OAuth connection plus profile grant. IDs use canonical JSON and callback URLs. POST returns `{ id, refreshBefore, cursor: null, truncated: false }`; DELETE returns `{}`. Secrets are never returned.
1528
+
1529
+ Every grant is bounded by validated OAuth access-token expiry and a shorter finite `ttlMs`, if requested. Even `ttlMs: null` receives a finite grant. Refresh rotates secrets with overlap through the previous grant's expiry. Callback verification is cached only through its granted expiry. Delivery rechecks connection/profile/project access and uses the existing SSRF-safe HTTPS boundary and 15-minute maintenance runner. One compact immutable occurrence is sent per request with stable event ID and Standard Webhooks headers; retries stop at the grant deadline active when the event occurred, even if fanout is delayed. Shorter refreshes clamp cached verification; reactivation requires a fresh challenge. Quiet expiry/revocation and expired rotation overlap clear signing material through bounded maintenance batches. No replay; 410/413 are terminal. Callback errors use `callback_endpoint_error` with a categorized `reason`, mapped to MCP `-32015`. Temporary service failures map to MCP `-32603`.
1530
+
1531
+ ## MCP App extension (not a REST endpoint)
1532
+
1533
+ Public plugin discovery adds the app-only `atoll.open` global entrypoint,
1534
+ input `{}`, initial result `{page:"home"}`, and resource
1535
+ `ui://atoll/command-center` with MIME `text/html;profile=mcp-app`.
1536
+ `_meta.ui.resourceUri`, app-only visibility, a monochrome tool icon and
1537
+ `_meta["openai/ui"].entrypoints:[{type:"global"}]` identify the UI.
1538
+ Existing business reads keep their `profile_ref` and authorization contract.
1539
+ No REST field, write endpoint or persistent profile preference is added.
1540
+
1541
+ ## Bounded collection search
1542
+
1543
+ Projects, goals, KPIs and initiatives accept `q` for case-insensitive literal
1544
+ substring matching of the display name/title, `q_exact=true` for the complete
1545
+ name, and `limit`/`offset` for server-side pagination. Defaults in bounded mode
1546
+ are 25 results, maximum 100, and offset 0. Filtering and authorization precede
1547
+ pagination; offsets beyond matching results return an empty page with the exact
1548
+ total. KPI pages include current calculated values. Use `shape=envelope`
1549
+ (or `response_shape=cli`) for `resource`, `items`, `total`, `limit`, `offset`,
1550
+ `nextOffset`, `truncated` and `hint`. Supplying a search or pagination parameter
1551
+ also selects bounded retrieval. Calls without these parameters retain their
1552
+ legacy resource-key response and full-list behavior.
1553
+
1554
+ Members add `member_id=<UUID>` and `q_exact=true` in bounded directory mode.
1555
+ Identity filtering uses the same collaborator visibility rules and safe fields
1556
+ as name search; it does not grant access or return credentials or account email.
1557
+ Members and initiatives also accept `scope=accessible_projects` for a bounded
1558
+ union under the current actor. The server derives project IDs; callers cannot
1559
+ supply ID arrays. Guests see only accessible project-linked initiatives and
1560
+ eligible collaborators. Existing member/admin projectless initiative rights
1561
+ remain. Empty project access gives guests an empty page. Unknown scope or scope
1562
+ combined with an explicit project returns `400`. Explicit project scope remains
1563
+ `project_id` for initiatives and `projectId` for members.
1564
+
1565
+ Full issue lists resolve authorized human identifiers such as `AH-123`,
1566
+ `ATOLL-123`, `#123` or a number before loose title/description matching. They also
1567
+ accept `q_exact=true` for the full title. The exact flag is rejected with `400`
1568
+ for compact `view=board`/`view=list`; existing compact search stays unchanged.
1569
+ The existing issue filters and actor/project authorization still apply.
1570
+
1571
+ CLI list commands for projects, goals, KPIs, initiatives and members use
1572
+ `--search`, `--exact`, `--limit` and `--offset`; issue list uses `--q` with
1573
+ `--exact`. Member list also supports `--member-id`. These filters are evaluated
1574
+ by the API. Existing public/private MCP list tools expose `q`, `q_exact`,
1575
+ `limit` and `offset`; `atoll_list_members` adds `member_id`. Member and initiative
1576
+ lists expose `--accessible-projects` in the CLI and `scope=accessible_projects`
1577
+ in MCP. The initiative flag suppresses a configured default project and cannot
1578
+ combine with `--project` or `--org-wide`. Normal MCP goal/KPI/initiative calls
1579
+ without query, exact, paging or scope options retain legacy full-list responses.
1580
+ Composer search uses a constant number of bounded list calls per profile and
1581
+ entity kind, independent of the number of accessible projects.
1582
+
1583
+ ### Interactive forms and create identity
1584
+
1585
+ `POST /api/orgs/{id}/issues` optionally accepts HTTP `Idempotency-Key: <UUID>`.
1586
+ The API scopes it to the authenticated member/org. One transaction consumes it;
1587
+ concurrent/later/changed-body replay returns 409 without another issue/effect,
1588
+ even after deletion. Invalid key returns 400; definite validation failure does
1589
+ not consume it. No header preserves independent create. Never retry an uncertain
1590
+ result automatically. The interactive tool generates this identity internally;
1591
+ ordinary CLI/MCP arguments do not expose it.
1592
+
1593
+ `atoll_create_issue_interactive` seeds: required profile_ref; optional title,
1594
+ description, project_id UUID, project_query, milestone_query, priority 0-3 (0 Urgent, 1 High, 2 Medium, 3 Low),
1595
+ assignee_query, assignee_ids (max 10), start_date and due_date. Explicit forms
1596
+ confirm basic then project-dependent fields; cancel/refusal/expiry/invalid data
1597
+ creates nothing. State expires after ten minutes and binds grant, actor, profile,
1598
+ tool and original arguments. Both standard form and OpenAI rich-form capabilities
1599
+ are required. Normal atoll_create_issue is unchanged.
1600
+
1601
+ Project milestone GET accepts optional q/q_exact/limit 1-100/offset>=0 and
1602
+ shape=envelope. Filter/paging happen before materialization; current calculated
1603
+ issueCount/completedCount/progress/statusCounts remain. Empty pages retain total
1604
+ and pagination. Default calls preserve the unpaged milestones alias.
1605
+
1606
+ Forms retain at most 25 choices per collection. A truncated project or milestone
1607
+ page returns `issue_create_refine_project` or `issue_create_refine_milestone`;
1608
+ restart with a narrower `project_query` or `milestone_query`. A known accessible
1609
+ `project_id` can be supplied directly. No-match or truncated assignee search
1610
+ returns `issue_create_refine_assignee`; revise `assignee_query` rather than
1611
+ silently dropping the assignment. Recovery includes confirmed basic field seeds.
1612
+ Refinement creates no issue.
1613
+
1614
+
1615
+ ## Vercel deployment context
1616
+
1617
+ Vercel deployment observations use `provider: "vercel"`, `object_type: "deployment"`,
1618
+ and `provenance: "vercel_api"` in existing scoped External Reference reads.
1619
+ Metadata contains only label, environment, state, optional exact revision, and
1620
+ provider effective time. A complete authenticated repository/SHA tuple proves
1621
+ identity. Later missing fields cannot erase that proof; contradictory known
1622
+ identity is rejected. Partial observations are never combined to invent proof.
1623
+ The mapped project always receives the reference. An issue receives it only
1624
+ when exactly one unarchived issue in that project has the same numeric GitHub
1625
+ repository ID and exact SHA. Preview/staging supersession is chronological;
1626
+ production supersession follows an authenticated project production target and
1627
+ supports rollback to an older build. Deployment evidence does not change issue
1628
+ status, authorize release, or prove acceptance. Generic list/get/unlink work;
1629
+ manual link remains GitHub-pull-request-only. Unlink does not suppress later
1630
+ verified ingestion. See https://docs.atollhq.com/integrations/vercel.
1631
+
1632
+ ### Vercel connection and recovery fields
1633
+
1634
+
1635
+ Vercel deployment `display_metadata` has only `label`, `environment`, `state`,
1636
+ optional `revision`, and `provider_effective_at`, within 2 KiB. Environment is
1637
+ `preview|staging|production`; state is
1638
+ `queued|building|ready|failed|cancelled|superseded`. Revision is lowercase
1639
+ 40-hex and is omitted when unavailable. Provider time is an RFC 3339 UTC
1640
+ string. Resolution errors also include `identity_unavailable`,
1641
+ `repository_mismatch`, and `provider_unavailable`. Unlink is association-only;
1642
+ a later verified observation can restore it.
1643
+
1644
+ The owner/admin human-session endpoint is
1645
+ `/api/orgs/{id}/integrations/vercel`. GET returns `{ connections }` with safe
1646
+ `id`, `team_id`, `state`, `health_status`, nullable `health_code`,
1647
+ `last_health_checked_at`, `disabled_at`, `created_at`, `updated_at`,
1648
+ `webhook_url`, and `mappings`. Mapping fields are `id`, `connection_id`,
1649
+ `vercel_project_id`, `project_id`, `github_app_repository_id`, and `updated_at`.
1650
+ No credential value or ciphertext is returned.
1651
+
1652
+ PUT requires all of these fields and rejects extras:
1653
+
1654
+ | Field | Contract |
1655
+ | --- | --- |
1656
+ | `connection_id` | Proposed UUID for a new connection; saved UUID for edits |
1657
+ | `expected_updated_at` | `null` for a new connection, exact saved timestamp for edits |
1658
+ | `team_id`, `vercel_project_id` | 1–200 letters, digits, underscores, or hyphens |
1659
+ | `project_id`, `github_app_repository_id` | Same-org UUIDs; repository must be enabled and verified |
1660
+ | `api_token`, `webhook_secret` | Write-only non-empty strings, at most 4,096 UTF-8 bytes each |
1661
+
1662
+ PUT validates the live Vercel project/repository and returns
1663
+ `{ connection_id, updated_at, webhook_url }`. Credentials must be supplied
1664
+ again on edit. Include every mapped Vercel project in the account webhook’s
1665
+ project scope, using the same callback URL and signing secret for the connection;
1666
+ Atoll does not change Vercel webhook settings. A mapping with history cannot change its Atoll project or
1667
+ repository. DELETE requires `{ connection_id, expected_updated_at }` and
1668
+ returns `{ disabled: true, updated_at }`. It clears credentials and revokes
1669
+ resolvability while preserving history.
1670
+
1671
+ An organization supports at most 50 team connections, including disabled
1672
+ connections. Existing connections can reconnect and update mappings at that
1673
+ limit; new teams return `409 connection_limit`.
1674
+
1675
+ POST `/api/orgs/{id}/integrations/vercel/reconcile` requires
1676
+ `{ connection_id }`; optional `vercel_project_id` selects one saved mapping.
1677
+ The response is `{ complete, results }`. Each result contains `mapping_id`,
1678
+ `environment`, `discovered`, `ingested`, `skipped`, `failed`, `truncated`, and
1679
+ `codes`. It reads one page of at most 50 per environment, plus the current
1680
+ production target when it is outside that page (at most 151 deployments per
1681
+ mapping). The extra target counts in `discovered`; history remains `truncated`
1682
+ when the provider has more pages. It stops new work after a bounded request budget. No raw provider response or credential is
1683
+ returned. Partial results use HTTP 200 with `complete=false`.
1684
+
1685
+ Setup errors use `{ error: <safe code> }`: 400 for invalid input/provider
1686
+ proof, 403 for a non-human/non-admin caller, 404 for a missing connection or mapping,
1687
+ 409 for `configuration_changed`, `mapping_has_history`, `mapping_limit`, or `connection_limit`,
1688
+ and 503 for transient provider, secret-key, or storage failure. Connection
1689
+ configuration uses an exact version fence; read the saved state before
1690
+ retrying an uncertain write.
1691
+
1692
+ ## Compact Context index
1693
+
1694
+ `GET /api/orgs/{id}/issues/{issueId}/context` and
1695
+ `GET /api/orgs/{id}/projects/{projectId}/context` return `{ context }` after
1696
+ normal target authorization. Inaccessible targets are concealed. Projectless
1697
+ issues retain their existing access rules; setup-only agents receive no Artifact
1698
+ items. Project reads include directly linked records only.
1699
+
1700
+ Use optional `group` (`development`, `design`, `discussion`, `documents`,
1701
+ `deployments`, or `production`) and `limit` (1–25, default 5 per group).
1702
+ Without `group`, all six groups are returned. Design and Discussion are reserved
1703
+ empty groups. `cursor` requires one group and the same target and limit as its
1704
+ previous page. Unknown or repeated query keys and invalid cursors return 400.
1705
+ Each group has its own `page.next_cursor` and `page.has_more`; these are live
1706
+ keyset pages, not a historical snapshot. Refresh to restart after evidence changes.
1707
+ Deduplicate continued items by `id`.
1708
+
1709
+ The version-1 response contains `target`, `groups`, and `partial`. Each group has
1710
+ `key`, `state` (`available`, `empty`, `partial`, or `unavailable`), `items`, `page`
1711
+ (`limit`, `returned_count`, `has_more`, `next_cursor`), and safe `errors`.
1712
+ Items contain a namespaced `id`, `kind`, `group`, `authority`, `availability`,
1713
+ `summary`, `freshness`, `current_identity`, `follow_up`, and action capabilities.
1714
+ Artifact identities carry the current revision; revision-bound delivery and
1715
+ provider evidence carry an available commit SHA. Null means unknown, not current.
1716
+ External evidence is stale after 24 hours. Partial evidence stays explicit.
1717
+
1718
+ Artifact summaries contain only title and type. Reference summaries contain a
1719
+ safe label/URL, provider/object type, environment, state, and provider time.
1720
+ Delivery summaries contain PR number/state, review, configured-workflow and
1721
+ required-check aggregates, and a fixed blocker code. Atoll records,
1722
+ provider references, and operational evidence have separate authority. A passed
1723
+ check, merged PR, ready deployment, current production target, and human
1724
+ acceptance are separate facts.
1725
+
1726
+ Follow-ups are `artifact_revision` (Artifact and optional revision UUID),
1727
+ `external_reference` (reference UUID), or `issue_delivery_context` (issue UUID).
1728
+ Use existing authorized detail reads only when needed. The index never returns
1729
+ Artifact bodies, digests, revision history, provider payloads, credentials, or
1730
+ unbounded signal/check collections. Mutation capabilities are display hints;
1731
+ every mutation rechecks access. Responses are capped below 64 KiB; a larger
1732
+ request returns 413 `context_response_too_large`, so retry with a smaller limit.
1733
+ An individual source failure affects its group; a total read failure returns
1734
+ 500 `context_unavailable`.
1735
+
1736
+ CLI: `atoll context list --issue ATOLL-42 --json` or
1737
+ `atoll context list --project project-slug --group documents --limit 5 --json`.
1738
+ Pass exactly one target. Continue with `--group`, `--limit`, and `--cursor`.
1739
+ JSON preserves the REST envelope; human output includes explicit follow-up
1740
+ commands. The full/private MCP tool is `atoll_list_context`, with exactly one
1741
+ `issue_id` or `project_id` UUID and the same optional group, limit, and cursor.
1742
+ Public MCP Context and delivery-detail tools are not available; AH-3067 owns
1743
+ post-freeze parity. Existing public Artifact and External Reference reads remain
1744
+ available. No existing issue, heartbeat, or public tool schema changes.
@@ -71,3 +71,40 @@ In a CLI environment, use `atoll issue get` for the compact manifest and
71
71
  [CLI operations](cli-operations.md). Use the required named profile.
72
72
  Exact REST routes and field limits are in [API endpoints](api-endpoints.md#artifacts)
73
73
  and [API fields](api-fields.md#artifact-fields).
74
+
75
+ ### Revision source provenance
76
+
77
+ An Artifact revision can keep one optional source from an existing External
78
+ Reference linked to the same issue or project. The source is an immutable
79
+ pointer snapshot. Atoll does not fetch, copy, or synchronize provider content.
80
+
81
+ Create accepts optional `source_external_reference_link_id` (the Context link
82
+ UUID). Revise uses three states: omit the field to inherit the current snapshot,
83
+ supply a live link UUID to set or replace it, or send `null` to clear it on the
84
+ new revision. A source-only change is valid and still requires the exact
85
+ `expected_revision_id` or `expected_revision_number`. An unchanged title,
86
+ content, and source is rejected. An unrelated or removed link cannot be selected.
87
+
88
+ Source selection returns `404 source_reference_unavailable` for a missing,
89
+ concealed, or concurrently removed link; these cases are indistinguishable.
90
+ A link on an unrelated Artifact target returns `400 source_target_mismatch`.
91
+ Choose another source or clear the selection. A stale expected revision still
92
+ returns `409 CONFLICT` and requires rereading the Artifact before retrying.
93
+
94
+ Add `?projection=source_provenance_v1` to Artifact create, revision create, or
95
+ single-revision GET to receive `revision.source_reference`. Default responses
96
+ and revision lists remain unchanged. Unknown or duplicate projections return
97
+ `400`. The projection is `null` when no source exists or the caller cannot read
98
+ the recorded source target. Otherwise it contains `external_reference_id`,
99
+ `target_type`, `target_id`, `canonical_url`, `provider`, `object_type`,
100
+ `provenance`, nullable `label`, and live `currently_linked`.
101
+
102
+ The URL is HTTP(S), has no credentials, and is limited to 2048 UTF-8 bytes;
103
+ provider, object type, and provenance are each limited to 64 bytes, and the
104
+ label to 240 characters (at most 960 UTF-8 bytes). All fields except `currently_linked` come from the saved
105
+ snapshot. Removing the live Context link preserves history and permits
106
+ inherit or clear. Later reference changes cannot rewrite a saved source.
107
+ Linking the Artifact to another target does not grant access to its source.
108
+
109
+ The web editor and CLI support this workflow. Typed MCP source inputs and
110
+ outputs are not yet available; their existing Artifact contract is unchanged.
@@ -7,7 +7,7 @@ Read this reference for routine Atoll CLI installation and resource operations.
7
7
  Install globally or use via npx:
8
8
 
9
9
  ```bash
10
- npm install -g @atollhq/cli # or: npx @atollhq/cli ...
10
+ npm install -g @atollhq/cli # or: npm exec --yes --ignore-scripts --package @atollhq/cli@latest -- atoll ...
11
11
  ```
12
12
 
13
13
  Configure once:
@@ -35,6 +35,21 @@ plus archived issues, while preserving every custom and other non-terminal
35
35
  status. It composes with other list filters, ordering, pagination, and JSON,
36
36
  and cannot be combined with `--include-archived`.
37
37
 
38
+ ## Discover members
39
+
40
+ Use one member directory for humans and agents. Resolve a project by UUID, exact
41
+ slug, or exact name, then filter by member type and display name:
42
+
43
+ ```bash
44
+ atoll member list --project project-slug --type human --search "Ada" --json
45
+ atoll member list --limit 25 --offset 25
46
+ ```
47
+
48
+ The result is bounded to 25 members by default and 100 maximum. It returns
49
+ stable member IDs that can be used with issue assignment commands. The matching
50
+ MCP tool is `atoll_list_members`; it lists collaborators, while
51
+ `atoll_list_agent_profiles` selects the caller identity.
52
+
38
53
  Full REST issue-list items include the canonical project-prefixed `identifier`
39
54
  and collision-free `projectSlug` for project issues, or `null` for projectless
40
55
  issues. Compact board/list views do not include these fields.
@@ -205,7 +220,7 @@ default. Use `--full` for the legacy full context; full mode cannot combine with
205
220
  - 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`.
206
221
  - `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.
207
222
  - 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.
208
- - 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.
223
+ - 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. Pull-request runs require provider PR membership. A completed `workflow_dispatch` run can have an empty PR list; Atoll requires exactly one distinct current linked PR and confirms its numeric repository IDs, PR identity, head SHA, and branch through GitHub. Several issues can link to that same PR. Ambiguous links, fork heads, changed heads, and newer runs do not produce verification. Signed nonterminal notifications are acknowledged without evidence. Manual dispatch does not emit the generic `ci.run.completed` automation trigger. 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.
209
224
  - 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.
210
225
  - Issue delivery context is read with `atoll issue delivery-context <identifier>`; `--json` preserves `{ deliveryContext }`, while TTY output includes the full head SHA, review, actual required checks, configured verification, freshness, blocker, and partial state. The endpoint selects an open PR first, then the latest updated link, then the highest PR number. Required checks union active rulesets and classic branch protection for the base branch and use exact-head check-run/status evidence. `pending` review/workflow state with null provenance means no current-head observation and does not by itself set `partial`. Required-check collection is disabled by default; with the reader disabled, state `disabled` and aggregate `none` do not set `partial`. The server-only `ATOLL_GITHUB_REQUIRED_CHECKS_READ_ENABLED=1` flag enables read-only provider GETs; when enabled, partial or unavailable collection or aggregate `unknown` sets `partial`. This result does not authorize merge, deployment, production testing, or human acceptance. Configured workflows report `required: false`.
211
226
  - Aggregate review state keeps each reviewer's latest exact-head opinion, ignores comments, and removes dismissed opinions. Change requests win. `approved` means at least one effective approval and no effective change request; it does not prove required-review counts or branch protection.
@@ -240,3 +255,18 @@ Rule writes, tests, and run history require owner/admin access; CLI does not byp
240
255
  rule, use separate `disable`, `update` while disabled, `test`, and `enable`
241
256
  operations. Human `get` output includes invalid state and validation paths;
242
257
  `--json` preserves the API response.
258
+
259
+ ### Select an Artifact source
260
+
261
+ Use `--source-reference-id <uuid>` on `artifact create` or `artifact update` to
262
+ select a canonical External Reference already in the issue's Context. The CLI
263
+ resolves its Context link ID before saving. On update, use `--clear-source` to
264
+ clear the new revision's source. The two flags cannot be combined. Omit both
265
+ to inherit the current snapshot. A source-only update still requires
266
+ `--expected-revision-id`.
267
+
268
+ `artifact get` and write readback request `source_provenance_v1`; text output
269
+ shows an authorized source link, and JSON includes `revision.source_reference`.
270
+ Historical snapshots survive removal of the live Context link. Atoll does not
271
+ import or synchronize the source content. Typed MCP source fields remain
272
+ unavailable.