@atollhq/skill-claude 0.4.38 → 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.
- package/package.json +1 -1
- package/skill/SKILL.md +187 -0
- package/skill/references/api-endpoints.md +113 -0
- package/skill/references/api-fields.md +270 -0
- package/skill/references/artifact-workflow.md +37 -0
- package/skill/references/cli-operations.md +17 -2
- package/skill/references/platform-rules.md +1 -1
package/package.json
CHANGED
package/skill/SKILL.md
CHANGED
|
@@ -73,6 +73,9 @@ Read only the references required for the current task:
|
|
|
73
73
|
resume contracts remain separate.
|
|
74
74
|
- Remote MCP setup, GitHub repository and External Reference tools, AI-assisted setup, KPI HTTP sync, or advanced REST access:
|
|
75
75
|
[integrations-and-api.md](references/integrations-and-api.md)
|
|
76
|
+
- Completed manual GitHub workflow dispatches require one current linked PR and
|
|
77
|
+
canonical same-repository head and branch proof. Nonterminal notifications
|
|
78
|
+
create no evidence; manual dispatch does not trigger generic CI automation.
|
|
76
79
|
- GitHub pull-request delivery context, required checks, and exact-head evidence:
|
|
77
80
|
[api-fields.md](references/api-fields.md#external-operational-delivery-context)
|
|
78
81
|
A `plan_restricted` required-check error is actionable plan-unavailable
|
|
@@ -237,3 +240,187 @@ explicit. Do not add project-specific workflow keys as universal instructions.
|
|
|
237
240
|
private paths, prompts, logs, or raw sensitive payloads.
|
|
238
241
|
- Publication, deployment, production mutation, destructive deletion, and
|
|
239
242
|
external communication require the authority applicable to the current task.
|
|
243
|
+
|
|
244
|
+
### MCP project events
|
|
245
|
+
|
|
246
|
+
Modern public OAuth MCP clients can monitor `issue.status_changed`, `attention.created`, and `execution.state_changed`. Each subscription requires an accessible project UUID; discover the live workflow before choosing status filters. Resolve `profile_ref` as for tools. ChatGPT manages callback verification, finite grants, refresh, and unsubscribe through `events/*` protocol methods. API-key/private/stdio clients use tools and Heartbeat. Payloads are compact immutable snapshots; fetch full current state with read tools. No replay is provided.
|
|
247
|
+
|
|
248
|
+
### Atoll Command Center MCP App
|
|
249
|
+
|
|
250
|
+
The public plugin offers an app-only global `atoll.open` entrypoint with empty
|
|
251
|
+
arguments. A supporting host opens a read-only Command Center for attention,
|
|
252
|
+
Heartbeat, executions, projects and issues. Select an authorized profile in the
|
|
253
|
+
app; selection is local to that app instance and every business read carries its
|
|
254
|
+
opaque `profile_ref`. Browsing does not write. The 110 model-facing business
|
|
255
|
+
tools and modern MCP Events remain available. Full/private and stdio omit the
|
|
256
|
+
UI entrypoint.
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
Explicit project/issue selection uses official model context in supporting hosts.
|
|
260
|
+
Selection/deselection/clear and profile changes update context. Navigation and
|
|
261
|
+
hydration never add or promote context. Authorization cleanup removes known
|
|
262
|
+
stale or inaccessible Atoll references and their owned summary, preserves other
|
|
263
|
+
valid selections and foreign content, and offers retry if removal fails.
|
|
264
|
+
A stale pending update is reconciled to the latest external host snapshot;
|
|
265
|
+
failed preservation warns and offers explicit retry without an update loop. `structuredContent.atoll` contains `source: "atoll"`, `version:
|
|
266
|
+
1`, opaque `profile_ref`, and compact project/issue `entities` with stable UUIDs,
|
|
267
|
+
display identity and already-loaded workflow labels. Read current details with
|
|
268
|
+
existing tools under that profile before acting. Saved labels are not authority.
|
|
269
|
+
Restoration loads identity first; detail reads are lazy and authorized. Unknown
|
|
270
|
+
or malformed Atoll context and foreign host content remain intact. Unsupported
|
|
271
|
+
hosts label selection local. No prompt, message, draft or Atoll write is sent.
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
OpenAI deep links use the same canonical app routes: `/`,
|
|
275
|
+
`/projects/<uuid>`, `/issues/<uuid>`, `/attention/<uuid>`,
|
|
276
|
+
`/executions/<uuid>`. Resolve with the explicitly selected authorized
|
|
277
|
+
`profile_ref`; a link is identity, not permission. Invalid shapes/UUIDs are
|
|
278
|
+
rejected before reads; unavailable entities never trigger a silent profile
|
|
279
|
+
search. Navigation does not add Model-App Context. Atoll issue/project web
|
|
280
|
+
surfaces show Open in ChatGPT only when the deployment has the explicit public
|
|
281
|
+
build-time `NEXT_PUBLIC_ATOLL_PLUGIN_ID`. Never guess this published ID or
|
|
282
|
+
confuse it with OAuth/marketplace configuration. Web URLs target global
|
|
283
|
+
`atoll.open` and encode the complete canonical path once. Keep normal Atoll
|
|
284
|
+
URLs for unsupported hosts (including Android). Local synthetic-ID tests do
|
|
285
|
+
not prove published-plugin setup or authenticated provider acceptance.
|
|
286
|
+
|
|
287
|
+
## Composer mentions (desktop)
|
|
288
|
+
|
|
289
|
+
In supported ChatGPT desktop Composer surfaces, use `@` to find authorized
|
|
290
|
+
issues, projects, human and agent members, goals, KPIs and initiatives. Search
|
|
291
|
+
uses currently authorized OAuth connection profiles, not a global or default
|
|
292
|
+
actor. Exact display names and authorized human issue identifiers such as
|
|
293
|
+
`AH-123` precede loose name matches. Empty queries return a bounded first page;
|
|
294
|
+
search does not download a full directory.
|
|
295
|
+
|
|
296
|
+
The app-only, read-only `search_mentions` extension accepts `{ "query": "text" }`
|
|
297
|
+
and returns `{ "items": [...] }` with standard MCP ResourceLinks. Results show
|
|
298
|
+
type, organization, profile and available project context. Identical entities
|
|
299
|
+
under different profiles keep separate links so the follow-up actor stays clear.
|
|
300
|
+
It is separate from the 110 ordinary business tools and `atoll.open`.
|
|
301
|
+
|
|
302
|
+
Resources use `atoll://profiles/<opaque-profile-ref>/<entity-kind>/<UUID>`, where
|
|
303
|
+
entity kind is `issues`, `projects`, `members`, `goals`, `kpis` or `initiatives`.
|
|
304
|
+
Reads validate the current grant and entity permission under that exact profile.
|
|
305
|
+
Malformed routes, revoked profiles and inaccessible records fail without trying
|
|
306
|
+
another actor. Resource text contains concise identity and current state,
|
|
307
|
+
including `profile_ref`; it excludes long descriptions, histories and secrets.
|
|
308
|
+
Fetch current details with the same profile before acting. Mention discovery and
|
|
309
|
+
resource reads do not write Atoll records or alter sidebar Model-App Context.
|
|
310
|
+
|
|
311
|
+
The full/private MCP profile omits this host-specific extension. Normal typed
|
|
312
|
+
list tools remain available in both profiles. Provider publication and signed-in
|
|
313
|
+
desktop `@` selection are separate acceptance steps; local protocol tests do not
|
|
314
|
+
prove that provider flow. No mobile workaround is included.
|
|
315
|
+
|
|
316
|
+
## Bounded collection search
|
|
317
|
+
|
|
318
|
+
Projects, goals, KPIs and initiatives accept `q` for case-insensitive literal
|
|
319
|
+
substring matching of the display name/title, `q_exact=true` for the complete
|
|
320
|
+
name, and `limit`/`offset` for server-side pagination. Defaults in bounded mode
|
|
321
|
+
are 25 results, maximum 100, and offset 0. Filtering and authorization precede
|
|
322
|
+
pagination; offsets beyond matching results return an empty page with the exact
|
|
323
|
+
total. KPI pages include current calculated values. Use `shape=envelope`
|
|
324
|
+
(or `response_shape=cli`) for `resource`, `items`, `total`, `limit`, `offset`,
|
|
325
|
+
`nextOffset`, `truncated` and `hint`. Supplying a search or pagination parameter
|
|
326
|
+
also selects bounded retrieval. Calls without these parameters retain their
|
|
327
|
+
legacy resource-key response and full-list behavior.
|
|
328
|
+
|
|
329
|
+
Members add `member_id=<UUID>` and `q_exact=true` in bounded directory mode.
|
|
330
|
+
Identity filtering uses the same collaborator visibility rules and safe fields
|
|
331
|
+
as name search; it does not grant access or return credentials or account email.
|
|
332
|
+
Members and initiatives also accept `scope=accessible_projects` for a bounded
|
|
333
|
+
union under the current actor. The server derives project IDs; callers cannot
|
|
334
|
+
supply ID arrays. Guests see only accessible project-linked initiatives and
|
|
335
|
+
eligible collaborators. Existing member/admin projectless initiative rights
|
|
336
|
+
remain. Empty project access gives guests an empty page. Unknown scope or scope
|
|
337
|
+
combined with an explicit project returns `400`. Explicit project scope remains
|
|
338
|
+
`project_id` for initiatives and `projectId` for members.
|
|
339
|
+
|
|
340
|
+
Full issue lists resolve authorized human identifiers such as `AH-123`,
|
|
341
|
+
`ATOLL-123`, `#123` or a number before loose title/description matching. They also
|
|
342
|
+
accept `q_exact=true` for the full title. The exact flag is rejected with `400`
|
|
343
|
+
for compact `view=board`/`view=list`; existing compact search stays unchanged.
|
|
344
|
+
The existing issue filters and actor/project authorization still apply.
|
|
345
|
+
|
|
346
|
+
CLI list commands for projects, goals, KPIs, initiatives and members use
|
|
347
|
+
`--search`, `--exact`, `--limit` and `--offset`; issue list uses `--q` with
|
|
348
|
+
`--exact`. Member list also supports `--member-id`. These filters are evaluated
|
|
349
|
+
by the API. Existing public/private MCP list tools expose `q`, `q_exact`,
|
|
350
|
+
`limit` and `offset`; `atoll_list_members` adds `member_id`. Member and initiative
|
|
351
|
+
lists expose `--accessible-projects` in the CLI and `scope=accessible_projects`
|
|
352
|
+
in MCP. The initiative flag suppresses a configured default project and cannot
|
|
353
|
+
combine with `--project` or `--org-wide`. Normal MCP goal/KPI/initiative calls
|
|
354
|
+
without query, exact, paging or scope options retain legacy full-list responses.
|
|
355
|
+
Composer search uses a constant number of bounded list calls per profile and
|
|
356
|
+
entity kind, independent of the number of accessible projects.
|
|
357
|
+
|
|
358
|
+
## Native interactive issue creation
|
|
359
|
+
|
|
360
|
+
Use plugin-only `atoll_create_issue_interactive` only when the user asks to choose
|
|
361
|
+
or confirm fields in native forms. Pass explicit `profile_ref`. Supporting
|
|
362
|
+
registered desktop hosts require protocol 2026-07-28 MRTR, standard form
|
|
363
|
+
elicitation and the OpenAI rich-form extension. Unsupported hosts use ordinary
|
|
364
|
+
`atoll_create_issue` with complete values. Cancel/decline/invalid/expired state
|
|
365
|
+
creates nothing. Final confirmation rechecks profile, project, live workflow,
|
|
366
|
+
milestone and searched assignees, then sends one canonical create. Do not retry
|
|
367
|
+
an uncertain outcome; reconcile the original issue first. Deterministic creation
|
|
368
|
+
keeps its existing required title and behavior. No mobile workaround or client
|
|
369
|
+
deployment secret is needed.
|
|
370
|
+
|
|
371
|
+
Milestone lists accept optional `q`, `q_exact`, `limit`, `offset` and envelope
|
|
372
|
+
shape under the existing project endpoint. They filter/page in the database and
|
|
373
|
+
preserve progress/status counts. Old absent-option REST/MCP calls stay unpaged;
|
|
374
|
+
CLI keeps its old request when no new options are supplied.
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
### Conversation Working Set
|
|
378
|
+
|
|
379
|
+
Open the app-only `atoll.working_set` thread entrypoint with `{}` in a supported
|
|
380
|
+
host. Search authorized issues/projects and add local pins. Add/remove is local;
|
|
381
|
+
explicit selection shares one active canonical Atoll reference through the
|
|
382
|
+
existing context controller. Active requires accepted shared context; unsupported
|
|
383
|
+
or failed sharing stays local. Removing a pin does not deselect shared context;
|
|
384
|
+
unpinned references retain explicit Deselect/Clear selection controls.
|
|
385
|
+
Status/priority/assignees refresh through existing reads; dependencies/activity
|
|
386
|
+
are lazy. In-panel **Open details** preserves same-instance pins. Profile changes
|
|
387
|
+
clear pins and fence old reads. Recreated panels rebuild from current authorized
|
|
388
|
+
context only; unshared pins are ephemeral. No thread ID, persistent record,
|
|
389
|
+
transcript request, automatic message or Atoll write is added. Native provider
|
|
390
|
+
acceptance remains separate from controlled-host evidence.
|
|
391
|
+
|
|
392
|
+
Artifact source provenance is available through web, REST, and private CLI.
|
|
393
|
+
Create/revise accepts `source_external_reference_link_id`; revise omission
|
|
394
|
+
inherits and null clears. Add `projection=source_provenance_v1` on Artifact
|
|
395
|
+
create/revise or single-revision GET to read an authorized immutable source.
|
|
396
|
+
Default REST and typed MCP Artifact output remain unchanged. See the Artifact
|
|
397
|
+
field reference for target authorization and unlink semantics.
|
|
398
|
+
|
|
399
|
+
## Vercel deployment context
|
|
400
|
+
|
|
401
|
+
Vercel deployment observations use `provider: "vercel"`, `object_type: "deployment"`,
|
|
402
|
+
and `provenance: "vercel_api"` in existing scoped External Reference reads.
|
|
403
|
+
Metadata contains only label, environment, state, optional exact revision, and
|
|
404
|
+
provider effective time. A complete authenticated repository/SHA tuple proves
|
|
405
|
+
identity. Later missing fields cannot erase that proof; contradictory known
|
|
406
|
+
identity is rejected. Partial observations are never combined to invent proof.
|
|
407
|
+
The mapped project always receives the reference. An issue receives it only
|
|
408
|
+
when exactly one unarchived issue in that project has the same numeric GitHub
|
|
409
|
+
repository ID and exact SHA. Preview/staging supersession is chronological;
|
|
410
|
+
production supersession follows an authenticated project production target and
|
|
411
|
+
supports rollback to an older build. Deployment evidence does not change issue
|
|
412
|
+
status, authorize release, or prove acceptance. Generic list/get/unlink work;
|
|
413
|
+
manual link remains GitHub-pull-request-only. Unlink does not suppress later
|
|
414
|
+
verified ingestion. See https://docs.atollhq.com/integrations/vercel.
|
|
415
|
+
|
|
416
|
+
## Compact Context discovery
|
|
417
|
+
|
|
418
|
+
Use `atoll context list --issue ATOLL-42 --json` or `--project project-slug`
|
|
419
|
+
before loading detail. Full/private MCP exposes `atoll_list_context` with exactly
|
|
420
|
+
one issue/project UUID. Inspect authority, freshness, current revision/SHA, and
|
|
421
|
+
safe summaries; follow each group cursor with the same target/limit and deduplicate
|
|
422
|
+
by item ID. Load only the needed existing Artifact, reference, or delivery detail.
|
|
423
|
+
See [Context fields](references/api-fields.md#compact-context-index).
|
|
424
|
+
The public index and delivery-detail tools remain unavailable pending AH-3067
|
|
425
|
+
and release of the public tool freeze. Existing public Artifact and reference
|
|
426
|
+
reads are unchanged. Evidence never implies a later delivery or acceptance gate.
|
|
@@ -1052,6 +1052,11 @@ The default new-agent local path (without `setupAgentMemberId`) atomically creat
|
|
|
1052
1052
|
|
|
1053
1053
|
## GitHub Integration
|
|
1054
1054
|
|
|
1055
|
+
The signed workflow receiver acknowledges nonterminal notifications without
|
|
1056
|
+
evidence. Completed manual dispatches require one current linked PR and
|
|
1057
|
+
canonical repository, PR, head, and branch proof; they do not emit generic
|
|
1058
|
+
`ci.run.completed` automation events.
|
|
1059
|
+
|
|
1055
1060
|
| Method | Endpoint | Description |
|
|
1056
1061
|
|--------|----------|-------------|
|
|
1057
1062
|
| GET | `/api/orgs/{id}/github-connections` | List GitHub connections (owner/admin) |
|
|
@@ -1162,3 +1167,111 @@ do not grant project/repository access. Intake is read-only locally; hosted
|
|
|
1162
1167
|
Workspace Settings → Runners owns pause/resume. See the CLI local-runner guide.
|
|
1163
1168
|
|
|
1164
1169
|
Automation rule create/update accepts the core action set including one `create_issue` per rule. See [Automation Rule Fields](api-fields.md#automation-rule-fields) for required fields, original-issue targets, replay results, and external-event limits.
|
|
1170
|
+
|
|
1171
|
+
### MCP Events adapter (OAuth plugin only)
|
|
1172
|
+
|
|
1173
|
+
| Method | Endpoint | Purpose |
|
|
1174
|
+
| --- | --- | --- |
|
|
1175
|
+
| POST | `/api/mcp-events/subscriptions` | Create or refresh a verified project-scoped MCP webhook subscription |
|
|
1176
|
+
| DELETE | `/api/mcp-events/subscriptions` | Idempotently unsubscribe the resolved OAuth connection/profile and callback identity |
|
|
1177
|
+
|
|
1178
|
+
These endpoints support MCP `events/*` methods and have no CLI or ordinary tool equivalent. API-key credentials are rejected.
|
|
1179
|
+
|
|
1180
|
+
## MCP App extension (not a REST endpoint)
|
|
1181
|
+
|
|
1182
|
+
Public plugin discovery adds the app-only `atoll.open` global entrypoint,
|
|
1183
|
+
input `{}`, initial result `{page:"home"}`, and resource
|
|
1184
|
+
`ui://atoll/command-center` with MIME `text/html;profile=mcp-app`.
|
|
1185
|
+
`_meta.ui.resourceUri`, app-only visibility, a monochrome tool icon and
|
|
1186
|
+
`_meta["openai/ui"].entrypoints:[{type:"global"}]` identify the UI.
|
|
1187
|
+
Existing business reads keep their `profile_ref` and authorization contract.
|
|
1188
|
+
No REST field, write endpoint or persistent profile preference is added.
|
|
1189
|
+
|
|
1190
|
+
## Bounded collection search
|
|
1191
|
+
|
|
1192
|
+
Projects, goals, KPIs and initiatives accept `q` for case-insensitive literal
|
|
1193
|
+
substring matching of the display name/title, `q_exact=true` for the complete
|
|
1194
|
+
name, and `limit`/`offset` for server-side pagination. Defaults in bounded mode
|
|
1195
|
+
are 25 results, maximum 100, and offset 0. Filtering and authorization precede
|
|
1196
|
+
pagination; offsets beyond matching results return an empty page with the exact
|
|
1197
|
+
total. KPI pages include current calculated values. Use `shape=envelope`
|
|
1198
|
+
(or `response_shape=cli`) for `resource`, `items`, `total`, `limit`, `offset`,
|
|
1199
|
+
`nextOffset`, `truncated` and `hint`. Supplying a search or pagination parameter
|
|
1200
|
+
also selects bounded retrieval. Calls without these parameters retain their
|
|
1201
|
+
legacy resource-key response and full-list behavior.
|
|
1202
|
+
|
|
1203
|
+
Members add `member_id=<UUID>` and `q_exact=true` in bounded directory mode.
|
|
1204
|
+
Identity filtering uses the same collaborator visibility rules and safe fields
|
|
1205
|
+
as name search; it does not grant access or return credentials or account email.
|
|
1206
|
+
Members and initiatives also accept `scope=accessible_projects` for a bounded
|
|
1207
|
+
union under the current actor. The server derives project IDs; callers cannot
|
|
1208
|
+
supply ID arrays. Guests see only accessible project-linked initiatives and
|
|
1209
|
+
eligible collaborators. Existing member/admin projectless initiative rights
|
|
1210
|
+
remain. Empty project access gives guests an empty page. Unknown scope or scope
|
|
1211
|
+
combined with an explicit project returns `400`. Explicit project scope remains
|
|
1212
|
+
`project_id` for initiatives and `projectId` for members.
|
|
1213
|
+
|
|
1214
|
+
Full issue lists resolve authorized human identifiers such as `AH-123`,
|
|
1215
|
+
`ATOLL-123`, `#123` or a number before loose title/description matching. They also
|
|
1216
|
+
accept `q_exact=true` for the full title. The exact flag is rejected with `400`
|
|
1217
|
+
for compact `view=board`/`view=list`; existing compact search stays unchanged.
|
|
1218
|
+
The existing issue filters and actor/project authorization still apply.
|
|
1219
|
+
|
|
1220
|
+
CLI list commands for projects, goals, KPIs, initiatives and members use
|
|
1221
|
+
`--search`, `--exact`, `--limit` and `--offset`; issue list uses `--q` with
|
|
1222
|
+
`--exact`. Member list also supports `--member-id`. These filters are evaluated
|
|
1223
|
+
by the API. Existing public/private MCP list tools expose `q`, `q_exact`,
|
|
1224
|
+
`limit` and `offset`; `atoll_list_members` adds `member_id`. Member and initiative
|
|
1225
|
+
lists expose `--accessible-projects` in the CLI and `scope=accessible_projects`
|
|
1226
|
+
in MCP. The initiative flag suppresses a configured default project and cannot
|
|
1227
|
+
combine with `--project` or `--org-wide`. Normal MCP goal/KPI/initiative calls
|
|
1228
|
+
without query, exact, paging or scope options retain legacy full-list responses.
|
|
1229
|
+
Composer search uses a constant number of bounded list calls per profile and
|
|
1230
|
+
entity kind, independent of the number of accessible projects.
|
|
1231
|
+
|
|
1232
|
+
### Native forms and bounded milestone reads
|
|
1233
|
+
|
|
1234
|
+
- Plugin `atoll_create_issue_interactive`: standard elicitation/create MRTR with
|
|
1235
|
+
official OpenAI rich schema, explicit profile and final create confirmation;
|
|
1236
|
+
normal deterministic tool remains available. No separate REST mutation route.
|
|
1237
|
+
- POST `/api/orgs/{id}/issues`: optional canonical UUID Idempotency-Key header;
|
|
1238
|
+
consumed identity409, invalid header400, ordinary absent-header calls unchanged.
|
|
1239
|
+
- GET `/api/orgs/{id}/projects/{projectId}/milestones`: optional q/q_exact/limit/offset
|
|
1240
|
+
and envelope; database-filtered page with calculated progress/status counts.
|
|
1241
|
+
Old calls keep the unpaged milestones alias. Project read permission applies.
|
|
1242
|
+
|
|
1243
|
+
Artifact source provenance is available through web, REST, and private CLI.
|
|
1244
|
+
Create/revise accepts `source_external_reference_link_id`; revise omission
|
|
1245
|
+
inherits and null clears. Add `projection=source_provenance_v1` on Artifact
|
|
1246
|
+
create/revise or single-revision GET to read an authorized immutable source.
|
|
1247
|
+
Default REST and typed MCP Artifact output remain unchanged. See the Artifact
|
|
1248
|
+
field reference for target authorization and unlink semantics.
|
|
1249
|
+
|
|
1250
|
+
### Vercel deployment observations
|
|
1251
|
+
|
|
1252
|
+
| Method | Endpoint | Purpose |
|
|
1253
|
+
| --- | --- | --- |
|
|
1254
|
+
| GET | `/api/orgs/{id}/integrations/vercel` | Human owner/admin safe connection and mapping list |
|
|
1255
|
+
| PUT | `/api/orgs/{id}/integrations/vercel` | Validate and save team credentials and a mapping with version fencing |
|
|
1256
|
+
| DELETE | `/api/orgs/{id}/integrations/vercel` | Disable, erase credentials, preserve observation history |
|
|
1257
|
+
| POST | `/api/orgs/{id}/integrations/vercel/reconcile` | Bounded recovery of one page per mapping/environment |
|
|
1258
|
+
| POST | `/api/webhooks/vercel/{connectionId}` | Raw-body HMAC-SHA1 verified Vercel callback; no bearer authentication |
|
|
1259
|
+
|
|
1260
|
+
Management requires a signed-in human owner/admin; API keys cannot use it.
|
|
1261
|
+
Callback verification uses `x-vercel-signature`. Invalid signatures return 401;
|
|
1262
|
+
unsupported events return 200 skipped; replay/identity/snapshot conflicts return
|
|
1263
|
+
409; provider or storage failure returns a safe 503 code. No secrets or raw
|
|
1264
|
+
provider payloads are returned. Provider access is authenticated GET-only.
|
|
1265
|
+
Safe management CLI/MCP parity is deferred under the current public tool freeze;
|
|
1266
|
+
it is tracked separately from generic External Reference reads.
|
|
1267
|
+
|
|
1268
|
+
## Compact Context
|
|
1269
|
+
|
|
1270
|
+
| Method | Endpoint | Purpose |
|
|
1271
|
+
| --- | --- | --- |
|
|
1272
|
+
| GET | `/api/orgs/{id}/issues/{issueId}/context` | Authorized bounded issue Context |
|
|
1273
|
+
| GET | `/api/orgs/{id}/projects/{projectId}/context` | Authorized bounded directly linked project Context |
|
|
1274
|
+
|
|
1275
|
+
Optional group, limit (1–25, default 5), and group-bound cursor. Details stay lazy.
|
|
1276
|
+
See the Compact Context index field reference. Full/private `atoll_list_context`
|
|
1277
|
+
only; public parity remains freeze-gated under AH-3067.
|
|
@@ -1122,6 +1122,44 @@ Each finding carries whichever entity ids apply: `goal_id`, `kpi_id`, `initiativ
|
|
|
1122
1122
|
|
|
1123
1123
|
## Artifact Fields
|
|
1124
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
|
+
|
|
1125
1163
|
`atoll_list_artifacts` accepts optional `issue_id` for a compact issue manifest
|
|
1126
1164
|
or `project_id` for direct project links; these selectors are mutually
|
|
1127
1165
|
exclusive. All modes accept `limit` (1-100, default 50) and `offset`
|
|
@@ -1366,6 +1404,11 @@ metadata-only Activity actions `external_reference.linked`,
|
|
|
1366
1404
|
|
|
1367
1405
|
### External operational delivery context
|
|
1368
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
|
+
|
|
1369
1412
|
`GET /api/orgs/{id}/issues/{issueId}/external-operational-signals` returns
|
|
1370
1413
|
`{ deliveryContext }`. The value is `null` without a linked PR. With several
|
|
1371
1414
|
links, selection prefers an open PR, then the latest `updated_at`, then the
|
|
@@ -1472,3 +1515,230 @@ not a hosted API or MCP surface. Its browser projection excludes credentials,
|
|
|
1472
1515
|
raw configuration, prompts, and model output. Local bindings use `repo_ref` but
|
|
1473
1516
|
do not grant project/repository access. Intake is read-only locally; hosted
|
|
1474
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:
|
|
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:
|
|
@@ -220,7 +220,7 @@ default. Use `--full` for the legacy full context; full mode cannot combine with
|
|
|
220
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`.
|
|
221
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.
|
|
222
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.
|
|
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. 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.
|
|
224
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.
|
|
225
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`.
|
|
226
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.
|
|
@@ -255,3 +255,18 @@ Rule writes, tests, and run history require owner/admin access; CLI does not byp
|
|
|
255
255
|
rule, use separate `disable`, `update` while disabled, `test`, and `enable`
|
|
256
256
|
operations. Human `get` output includes invalid state and validation paths;
|
|
257
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.
|
|
@@ -59,7 +59,7 @@ Full endpoint tables and field schemas:
|
|
|
59
59
|
| Tasks | POST `.../issues` | GET `.../issues` | PATCH `.../issues/{id}` | DELETE `.../issues/{id}` † |
|
|
60
60
|
| Goals | POST `.../goals` | GET `.../goals` | PATCH `.../goals/{id}` | DELETE `.../goals/{id}` |
|
|
61
61
|
| KPIs | POST `.../kpis` | GET `.../kpis` | PATCH `.../kpis/{id}` | DELETE `.../kpis/{id}` |
|
|
62
|
-
| Initiatives | POST `.../initiatives` (`project_id`/`projectId` optional; required for guests) | GET `.../initiatives` (`project_id`
|
|
62
|
+
| Initiatives | POST `.../initiatives` (`project_id`/`projectId` optional; required for guests) | GET `.../initiatives` (`project_id` required for guests unless `scope=accessible_projects`; scope cannot combine with project) | PATCH `.../initiatives/{id}` | DELETE `.../initiatives/{id}` |
|
|
63
63
|
| Milestones | POST `.../milestones` | GET `.../milestones` | PATCH `.../milestones/{id}` | DELETE `.../milestones/{id}` |
|
|
64
64
|
| Artifacts | POST `.../artifacts` | GET `.../artifacts` or `.../artifacts/{id}/revisions/{revisionId}` | POST `.../artifacts/{id}/revisions` or `.../links` | DELETE `.../artifacts/{id}/links/{linkId}` |
|
|
65
65
|
| Comments | POST `.../comments` with `{ body, mentions?, reply_to_comment_id?, source_metadata? }` | GET `.../comments` or `.../comments/{id}` | PATCH `.../comments/{id}` | DELETE `.../comments/{id}` |
|