@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atollhq/skill-claude",
3
- "version": "0.4.38",
3
+ "version": "0.4.39",
4
4
  "description": "Install the Atoll project management skill for Claude Code",
5
5
  "bin": {
6
6
  "skill-claude": "bin/install.mjs"
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: 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:
@@ -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` optional; required for guests) | PATCH `.../initiatives/{id}` | DELETE `.../initiatives/{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}` |