@atollhq/skill-codex 0.4.24 → 0.4.25

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-codex",
3
- "version": "0.4.24",
3
+ "version": "0.4.25",
4
4
  "description": "Install the Atoll project management integration for Codex CLI",
5
5
  "bin": {
6
6
  "skill-codex": "bin/install.mjs"
package/skill/SKILL.md CHANGED
@@ -364,6 +364,7 @@ atoll dependency bulk-add --file ./dependencies.json --continue-on-error
364
364
 
365
365
  Dependency reads include a target issue `identifier` and `projectSlug` when the target belongs to a project. Inaccessible targets remain `issue: null`; projectless targets have both fields set to `null`.
366
366
  Dependencies persist a release point in the blocking project's ordered board columns. Add `releaseColumnId` when creating an edge, or omit it to default to that project's `done` column. Use the dependency API PATCH route to change the release point; reads include `releaseColumnId`, `releaseColumn`, and `satisfied`.
367
+ Archiving a blocker preserves the dependency edge and configured release column while satisfying the dependency. Restoring it re-evaluates the same release point and can block the dependent again. Configurable release-point and cancelled-blocker behavior are unchanged.
367
368
  The blocking issue must belong to a project because its release point is a board
368
369
  column there; a projectless issue may be the blocked target.
369
370
  The dependency-release migration backfills existing dependencies to the
@@ -429,6 +430,9 @@ CLI JSON conventions:
429
430
  - `atoll heartbeat --json` includes the same structured `cli` update metadata for agents, plus `attention_items`, `attention_summary`, and `recommended_action` when Atoll can propose one concrete strategy-backed next action. `atoll heartbeat --signals-only --json` preserves filtered `signals`, `attention_items`, `attention_summary`, and `recommended_action` for short polling. 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.
430
431
  - 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.
431
432
  - 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.
433
+ - 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.
434
+ - Issue delivery context selects an open PR first, then the latest updated link, then the highest PR number. `pending` review/workflow state with null provenance means no current-head observation and does not by itself set `partial`. Disabled GitHub verification stops new projections. Workflow conclusions map success/neutral to passed, cancelled/stale/skipped to cancelled, and other supported terminal conclusions to failed.
435
+ - 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.
432
436
  - `atoll plan validate/apply` consumes `schemaVersion: "atoll.plan.v1"` files with `milestones`, `issues`, `dependencies`, `initiativeLinks`, and `milestoneLinks`; local `key` values can be referenced by `milestoneKey`, `issueKey`, `dependsOn`, `blockedBy`, or `blocks`.
433
437
 
434
438
  ## KPI HTTP Sync Drafts
@@ -620,6 +624,64 @@ atoll() {
620
624
  atoll "/api/orgs/$ATOLL_ORG_ID/issues?status=todo"
621
625
  ```
622
626
 
627
+ ## Execution and attention CLI workflow
628
+
629
+ Use `atoll execution list|get|create|transition`, `execution evidence list|add`,
630
+ and `atoll attention create|list|get|cancel` with the selected profile and `--json`.
631
+ Creation requires `--issue`, `--agent <member-id|self>`, and an explicit
632
+ `--idempotency-key`; it returns `assigned` at state version 1. Start with a
633
+ separate `execution transition <id> --to running --expected-state-version 1
634
+ --idempotency-key <start-key>`. Atoll records state; it does not start a harness.
635
+
636
+ Generic transition targets are `running|waiting|succeeded|failed|cancelled`.
637
+ For `succeeded`, supply `--outcome-summary` unless the execution already has
638
+ linked evidence. The server validates this requirement.
639
+ Use `attention create` to move `running|waiting` to `needs_human`; generic
640
+ transitions cannot enter or leave `needs_human`. Attention kinds are exactly
641
+ `approval|clarification|access|decision|destructive_action|other`. Supply the
642
+ execution's expected state version, title, request summary, why needed, resume
643
+ condition, exactly one member/team/project-admin target, and an idempotency key.
644
+ Never put credentials, access tokens, private paths, prompts, logs, or other
645
+ secrets in attention text. Server permissions and concealed 404 responses remain
646
+ authoritative; do not try another identity to bypass them.
647
+
648
+ Read `attention get <id>` for the human's resolution and current attention and
649
+ execution versions. Human resolution returns the execution to `waiting`; it
650
+ does not resume a model or harness. Requester `attention cancel` also returns it
651
+ to `waiting` and requires `--expected-attention-version`,
652
+ `--expected-state-version`, and `--idempotency-key`. Human resolve, administrator
653
+ retarget/cancel, and recovery discovery are REST/UI operations, not CLI commands.
654
+ Harness acceptance and the later explicitly fenced `waiting -> running` resume
655
+ remain the separate AH-2122 integration.
656
+
657
+ Every write uses the caller's explicit idempotency key; transitions and attention
658
+ writes use the caller's expected versions. Never silently fetch a new version
659
+ and write against it. After a POST timeout, network failure, or HTTP 5xx, the
660
+ outcome is uncertain and the CLI does not retry. Read `execution get <id>`,
661
+ `attention get <id>` (or `attention list --execution <id>` when create returned no
662
+ attention ID), or `execution evidence list <id>`. Stop if the result is visible.
663
+ For execution create without an ID, replay the identical create command with
664
+ the same key, then read the returned ID. If replay is needed for another write,
665
+ keep the exact body and key. Stop for operator reconciliation if changed state
666
+ or versions make the outcome ambiguous; never use a new key to force progress.
667
+
668
+ Evidence add links only an existing authorized issue object using
669
+ `--type <comment|activity_event|issue_pr_link|attachment> --target-id <uuid>
670
+ --idempotency-key <key>`. It does not upload files, URLs, text, or raw logs.
671
+
672
+ ## Human attention
673
+
674
+ When an execution needs a human, use the attention contract. `POST
675
+ /api/orgs/{id}/attention` records a bounded request and atomically moves the
676
+ execution to `needs_human`; generic execution transitions cannot perform this
677
+ edge. Poll `GET /api/orgs/{id}/attention` or use the exact item endpoint.
678
+ Resolve, cancel, or retarget with both expected versions and an idempotency
679
+ key. Reuse the same key only with the same input. Use `mode=recovery` only as
680
+ an authorized human administrator when the original target is no longer
681
+ eligible. Keep request text concise and never include secrets, credentials,
682
+ logs, prompts, or local paths. The public projection provides current and
683
+ snapshot actor/target fields, execution state, issue, and project context.
684
+
623
685
  ## The Heartbeat Loop
624
686
 
625
687
  The primary pattern for autonomous agents. Prefer `atoll heartbeat --json` when the CLI is available; it wraps `GET /api/orgs/{id}/heartbeat` and returns the same computed briefing:
@@ -791,6 +853,20 @@ Owners/admins can read billing state with `GET /api/orgs/{id}/billing` and start
791
853
 
792
854
  Creation endpoints can return `402` with `code: "PLAN_LIMIT_REACHED"` when an org reaches limits for humans, agents/integrations, active projects, or active issues.
793
855
 
856
+ ## Agent execution REST API
857
+
858
+ Use the canonical org-scoped execution routes for lifecycle management:
859
+ `GET|POST /api/orgs/{id}/executions`, `GET
860
+ /api/orgs/{id}/executions/{executionId}`, `POST
861
+ /api/orgs/{id}/executions/{executionId}/transitions`, and `GET|POST` on the
862
+ matching `/evidence` route. Create starts in `assigned`; transition writes
863
+ require `expected_state_version` and an idempotency key. Generic transitions
864
+ cannot enter or leave `needs_human`; use the attention contract. Reads follow
865
+ the issue's current project access. Non-guest organization members may also read
866
+ projectless executions; setup-scoped agents and guest members cannot. Creation-
867
+ project metadata does not grant access, and unreadable records are concealed.
868
+ Responses are bounded management projections, not logs or harness controls.
869
+
794
870
  ## API Reference
795
871
 
796
872
  Full endpoint tables and field schemas:
@@ -827,6 +903,12 @@ default 50) and `offset`, and returns `hasMore`; removing the final link
827
903
  requires owner or admin access. Linked issues and projects cannot be deleted
828
904
  until the Artifact is unlinked or reassigned.
829
905
 
906
+ Artifact list and detail responses include `can_edit`, which is true when the
907
+ current member can create a revision, and `can_unlink`, which is true when the
908
+ current member can remove a visible link. Members with write access can remove
909
+ a link when another link remains; removing a final link requires owner or admin
910
+ access.
911
+
830
912
  Private CLI issue reads request the opt-in metadata-only manifest. Inspect
831
913
  `.artifacts`, then use `atoll artifact get <id> --issue <issue>` only when the
832
914
  full current body is required. Create and update accept `--body-file -` for
@@ -861,6 +943,17 @@ otherwise the API returns `422` with `code: "github_identity_unavailable"`.
861
943
  Reads return bounded display metadata, provenance, observation timestamps, and
862
944
  resolvability. Reads require project visibility; writes require project
863
945
  `edit`/`admin`, with eligible non-guests allowed for projectless issues.
946
+ For compact implementation evidence, the private REST endpoint
947
+ `GET /api/orgs/{id}/issues/{issueId}/external-operational-signals` returns the
948
+ selected PR, stable repository identity, exact current head SHA, current-head
949
+ review and configured workflow states, bounded provenance, freshness, and a
950
+ safe strongest blocker. Older-head evidence is historical. Configured
951
+ workflows are not GitHub branch-protection required checks. This namespace is
952
+ separate from heartbeat `signals[]` and never changes tasks or dispatches
953
+ agents.
954
+ The selected PR-link state is authoritative. If a same-head PR observation
955
+ disagrees, Atoll clears its observation/provider provenance, falls back to the
956
+ link URL, excludes it from freshness, and sets `partial`.
864
957
  Organization-wide templates are readable by non-guests and manageable only by
865
958
  organization owners/admins; guest/project-scoped agents never receive them.
866
959
  Avatar mutations require both caller and target to belong to the organization
@@ -220,6 +220,7 @@ bodies, projects only declared public issue fields, preserves nullable
220
220
  Add with `{ "blockedByIssueId": "uuid" }` or `{ "blockingIssueId": "uuid" }`; snake_case aliases `{ "blocked_by_issue_id": "uuid" }` and `{ "blocking_issue_id": "uuid" }` are also accepted. The blocking issue must belong to a project; a projectless issue may be the blocked target. Optionally include `releaseColumnId` from the blocking project's board columns. Omit it to use the blocking project's `done` column. PATCH the dependency with `{ "releaseColumnId": "uuid" }`. Circular dependencies rejected (400). Duplicates return 409.
221
221
 
222
222
  Dependency reads include each authorized target issue's canonical `identifier` and `projectSlug` when it belongs to a project. Projectless targets have both fields `null`; inaccessible targets remain `issue: null`. Release fields include `releaseColumnId` and the compatibility alias `release_column_id`; POST and PATCH accept either camelCase or snake_case release-column input. Release metadata is present when the blocking issue is authorized; a `blocking` target projection may still be `issue: null` independently.
223
+ Archiving a blocker preserves the dependency edge and configured release column while satisfying the dependency. Restoring it re-evaluates the same release point and can block the dependent again. Configurable release-point and cancelled-blocker behavior are unchanged.
223
224
  The dependency-release migration backfills existing dependencies to the
224
225
  blocking project's `done` column. During a rolling deployment, compatibility
225
226
  reads may omit release fields from older rows; treat missing release metadata as
@@ -296,10 +297,10 @@ Artifacts.
296
297
 
297
298
  | Method | Endpoint | Description |
298
299
  | --- | --- | --- |
299
- | `GET` | `/api/orgs/{id}/artifacts` | List readable artifact metadata and visible links; revision content is omitted; supports `limit` (1-100, default 50) and `offset` (0-10000), and returns `hasMore` |
300
+ | `GET` | `/api/orgs/{id}/artifacts` | List readable artifact metadata and visible links; revision content is omitted; includes `can_edit` and `can_unlink` capabilities; supports `limit` (1-100, default 50) and `offset` (0-10000), and returns `hasMore` |
300
301
  | `POST` | `/api/orgs/{id}/artifacts` | Create artifact and immutable revision 1 atomically |
301
- | `GET` | `/api/orgs/{id}/artifacts/{artifactId}` | Read artifact metadata and visible links |
302
- | `GET` | `/api/orgs/{id}/artifacts/{artifactId}/revisions` | List immutable revision summaries without content; supports `limit` (1-100, default 50) and `offset`, and returns `hasMore` |
302
+ | `GET` | `/api/orgs/{id}/artifacts/{artifactId}` | Read artifact metadata and visible links, including `can_edit` and `can_unlink` capabilities |
303
+ | `GET` | `/api/orgs/{id}/artifacts/{artifactId}/revisions` | List immutable revision summaries without content; supports `limit` (1-100, default 50) and `offset` (0-10000), and returns `hasMore` |
303
304
  | `POST` | `/api/orgs/{id}/artifacts/{artifactId}/revisions` | Create a content revision or title-aware full snapshot with an expected current revision |
304
305
  | `GET` | `/api/orgs/{id}/artifacts/{artifactId}/revisions/{revisionId}` | Read one sanitized revision including content |
305
306
  | `POST` | `/api/orgs/{id}/artifacts/{artifactId}/links` | Link to an authorized issue or project |
@@ -425,6 +426,20 @@ references return `409`, and resolver failures return `500`.
425
426
 
426
427
  Returns findings only (not the full graph). Use it for a high-level review — orphaned initiatives/KPIs (no goal), goals with no KPI or no initiative, dangling initiative execution links, KPIs missing targets/stale/off-pace, initiatives missing impact/execution or stalled, blocked/overdue work — then remediate with the goal/KPI/initiative write endpoints above. Owners/admins receive organization-wide execution evidence. Other non-guests receive project-bound issues, milestones, target links, and target findings only for readable projects. A restricted member with no readable projects receives no issue or target execution evidence. Forbidden for guests. CLI: `atoll strategy audit [--severity critical|warning|info] [--json]`.
427
428
 
429
+ ## Human attention
430
+
431
+ | Method | Endpoint | Description |
432
+ | --- | --- | --- |
433
+ | `GET` | `/api/orgs/{id}/attention` | List relevant open or closed attention items; supports status, execution, kind, recovery mode, target filters, bounded pagination, and envelope/CLI shape |
434
+ | `POST` | `/api/orgs/{id}/attention` | Request human attention and atomically pause the execution in `needs_human` |
435
+ | `GET` | `/api/orgs/{id}/attention/{attentionId}` | Read one safe attention detail projection |
436
+ | `POST` | `/api/orgs/{id}/attention/{attentionId}/resolve` | Resolve an open item for its eligible human target and leave the execution in `waiting`; a trusted harness performs any later resume |
437
+ | `POST` | `/api/orgs/{id}/attention/{attentionId}/cancel` | Cancel an item as its requesting agent and leave the execution in `waiting`; a trusted harness performs any later resume |
438
+ | `POST` | `/api/orgs/{id}/attention/{attentionId}/admin-cancel` | Cancel an item as an authorized human administrator and leave the execution in `waiting`; a trusted harness performs any later resume |
439
+ | `POST` | `/api/orgs/{id}/attention/{attentionId}/retarget` | Retarget an open item as an authorized human administrator |
440
+
441
+ The create body is strict and requires `execution_id`, `expected_state_version`, `kind`, `title`, `request_summary`, `why_needed`, `resume_condition`, one exact target shape, and `idempotency_key`. Close and retarget bodies require both expected versions. Mutations are idempotent and return `409` for stale versions, invalid lifecycle edges, conflicting keys, or ineligible targets. `mode=recovery` is restricted to authorized human administrators. Text is bounded and secret-safe; public projections omit provenance, hashes, prompts, logs, credentials, and paths.
442
+
428
443
  ## Heartbeat
429
444
 
430
445
  | Method | Endpoint | Description |
@@ -455,6 +470,25 @@ atoll heartbeat --severity critical
455
470
  `atoll heartbeat --signals-only --json` returns filtered `signals`, direct `attention_items`, `attention_summary`, and `recommended_action` for polling agents.
456
471
  KPI stale/off-pace signal metadata includes `linked_initiatives` and `recent_attributed_snapshots`; `--explain-kpi` returns that movement context under `kpi_explanation`.
457
472
 
473
+ ## Agent executions
474
+
475
+ | Method | Endpoint | Description |
476
+ | --- | --- | --- |
477
+ | GET | `/api/orgs/{id}/executions` | List executions in the caller's current issue-project scope; non-guest members may also read projectless executions, except setup agents and guests; filters: `issue_id`, `agent_member_id`, `state`, `active`, `harness_kind`, `updated_after`, `limit`, `offset` (maximum 10,000), `shape` |
478
+ | POST | `/api/orgs/{id}/executions` | Create an execution. Strict body; required `idempotency_key`; starts in `assigned` |
479
+ | GET | `/api/orgs/{id}/executions/{executionId}` | Read safe detail, transitions, and evidence projections |
480
+ | POST | `/api/orgs/{id}/executions/{executionId}/transitions` | Version-fenced transition through the shipped lifecycle RPC |
481
+ | GET/POST | `/api/orgs/{id}/executions/{executionId}/evidence` | List or link existing authorized issue evidence |
482
+
483
+ Use `expected_state_version` for follow-up transitions. Generic transitions cannot enter
484
+ or leave `needs_human`; those edges return `ATTENTION_CONTRACT_REQUIRED` and
485
+ belong to the attention contract. Reads use the issue's current project access;
486
+ non-guest members may also read projectless executions, except setup agents and
487
+ guests. Creation-project metadata does not grant access. Unreadable records are
488
+ concealed as `404`; public projections omit hashes, provenance, logs,
489
+ prompts, credentials, and paths. This API records state and does not start or
490
+ resume an underlying harness. There is no issue-specific execution route.
491
+
458
492
  ## Activity
459
493
 
460
494
  | Method | Endpoint | Description |
@@ -600,6 +634,10 @@ requests also sweep a small due batch. Uploads over 2MB return `413`.
600
634
 
601
635
  Attach PRs manually with a canonical GitHub pull request URL such as `https://github.com/owner/repo/pull/123`; malformed or non-PR URLs return `400`. On attach, Atoll refreshes GitHub metadata when available so title/status/head SHA reflect the PR instead of only the submitted URL. PR links can also be created or refreshed automatically via the GitHub webhook integration.
602
636
 
637
+ GET returns `id`, `pr_number`, `github_repo`, nullable
638
+ `github_repository_id`, nullable `external_reference_id`, `pr_url`, `pr_title`,
639
+ `pr_status`, nullable `head_sha`, and `updated_at` for each link.
640
+
603
641
  For project-bound issues, listing requires project access and attaching requires
604
642
  `edit` or `admin` access. Eligible non-guests may list and attach links for
605
643
  projectless issues. Authorization is bound to the issue's current parent before
@@ -613,12 +651,35 @@ child reads or writes and occurs before URL parsing or GitHub metadata lookup.
613
651
  | POST | `/api/orgs/{id}/issues/{issueId}/external-references` | Resolve and link a GitHub PR |
614
652
  | GET | `/api/orgs/{id}/issues/{issueId}/external-references/{referenceId}` | Inspect a linked reference |
615
653
  | DELETE | `/api/orgs/{id}/issues/{issueId}/external-references/{referenceId}` | Unlink a reference |
654
+ | GET | `/api/orgs/{id}/issues/{issueId}/external-operational-signals` | Read current exact-head GitHub delivery context |
616
655
  | GET | `/api/orgs/{id}/projects/{projectId}/external-references` | List project external references |
617
656
  | POST | `/api/orgs/{id}/projects/{projectId}/external-references` | Resolve and link a GitHub PR |
618
657
  | GET | `/api/orgs/{id}/projects/{projectId}/external-references/{referenceId}` | Inspect a linked reference |
619
658
  | DELETE | `/api/orgs/{id}/projects/{projectId}/external-references/{referenceId}` | Unlink a reference |
620
659
 
621
- External Reference POST requests accept `{ "url": "https://github.com/owner/repo/pull/123" }`. They require an authorized GitHub connection and store a reference only when the live response proves numeric immutable repository and pull-request IDs. Missing proof returns `422` with `code: "github_identity_unavailable"`. URLs and caller owner/repo fields are not identity or authorization inputs. Existing PR-link operations remain independent; CLI/MCP tools are deferred to a later slice.
660
+ External Reference POST requests accept `{ "url": "https://github.com/owner/repo/pull/123" }`. They require an authorized GitHub connection and store a reference only when the live response proves numeric immutable repository and pull-request IDs. Missing proof returns `422` with `code: "github_identity_unavailable"`. URLs and caller owner/repo fields are not identity or authorization inputs. Manual PR-link operations remain available without an External Reference; verified delivery projection creates and binds the immutable PR reference. CLI/MCP tools are deferred to a later slice.
661
+
662
+ The external-operational-signals GET returns `{ deliveryContext }` for the
663
+ selected current PR or `null` when there is no PR link. Selection prefers an
664
+ open link, then the latest `updated_at`, then the highest PR number. It contains stable
665
+ repository identity, exact head SHA, current PR/review/configured-workflow
666
+ state, bounded source and provider-event provenance, freshness, a safe strongest
667
+ blocker, and `partial`. Older-head signals are historical. Configured workflows
668
+ are not GitHub branch-protection required checks and report `required: false`.
669
+ Missing current-head review or configured-workflow evidence appears as
670
+ `pending` with null provenance and does not by itself set `partial`. Disabled
671
+ verification stops new projections. Workflow conclusions map `success` or
672
+ `neutral` to `passed`; `cancelled`, `stale`, or `skipped` to `cancelled`; and
673
+ other supported terminal conclusions to `failed`.
674
+ The selected PR-link state is authoritative. If a same-head PR observation
675
+ disagrees, Atoll clears its observation/provider provenance, uses the link URL
676
+ as `source_url`, excludes it from freshness, and sets `partial`.
677
+ Review aggregation keeps each reviewer's latest exact-head opinion, ignores
678
+ comments, and removes dismissed opinions. Change requests win; `approved`
679
+ means at least one effective approval and no effective change request. It does
680
+ not prove required-review counts or branch protection.
681
+ This read-only namespace is separate from heartbeat `signals[]` and does not
682
+ dispatch agents or change tasks.
622
683
 
623
684
  ## Project Status Updates
624
685
 
@@ -798,6 +859,11 @@ The default new-agent local path (without `setupAgentMemberId`) atomically creat
798
859
  | POST | `/api/integrations/github/connect` | Connect a repo |
799
860
  | POST | `/api/integrations/github/disconnect` | Disconnect a repo |
800
861
 
862
+ Release-added required hook events mark existing reconciled and already-pending connections pending. A bounded
863
+ 15-minute service sweep verifies immutable repository identity and upgrades the
864
+ hooks automatically. Transient failures remain pending for retry; owners and
865
+ admins can also use the reconciliation endpoint.
866
+
801
867
  ## Platform Feedback
802
868
 
803
869
  ### Feedback error contract
@@ -782,6 +782,30 @@ The opt-in issue manifest contains only `id`, `type`, `title`,
782
782
  Implementation Plan links are limited to one slot per issue, and each such
783
783
  Artifact can be authoritative for only one issue.
784
784
 
785
+ Artifact list and detail responses also include `can_edit` and `can_unlink`.
786
+ `can_edit` is true when the current member can create a revision. `can_unlink`
787
+ is true when the current member can remove a visible link; removing a final link
788
+ requires owner or admin access, while a member with write access can remove a
789
+ link when another link remains.
790
+
791
+ ## Agent execution fields
792
+
793
+ Execution projections contain `id`, `issue_id`, `current_project_id`,
794
+ `project_id_at_creation` (provenance only), normalized `state`, `state_version`,
795
+ bounded lifecycle summaries, safe harness/external-run metadata, timestamps,
796
+ and actor objects `{ id, display_name, type, deleted }`. `harness_kind` and
797
+ `external_run_id` reject credentials, tokens, and local filesystem paths;
798
+ legacy unsafe values are redacted as `null` in projections. Deleted agent or actor
799
+ rows use immutable AH-2095 snapshots. Detail adds ordered `transitions` and
800
+ existing `evidence` references `{ id, issue_id, link_type, target_id,
801
+ created_by, created_at }`.
802
+
803
+ Create requires `issue_id`, `agent_member_id`, and `idempotency_key`; it always
804
+ returns state `assigned`. Transition requires `expected_state_version`,
805
+ `to_state`, and `idempotency_key`. HTTP bodies are strict and omit actor
806
+ provenance; the server derives safe OAuth provenance. The generic transition
807
+ enum excludes `needs_human`.
808
+
785
809
  ## Analytics Response
786
810
 
787
811
  ```json
@@ -795,6 +819,28 @@ Artifact can be authoritative for only one issue.
795
819
 
796
820
  ---
797
821
 
822
+ ## Human attention fields
823
+
824
+ Attention list/detail projections contain `id`, `status` (`open`, `resolved`, or
825
+ `cancelled`), `kind` (`approval`, `clarification`, `access`, `decision`,
826
+ `destructive_action`, or `other`), bounded `title`, `request_summary`,
827
+ `why_needed`, `resume_condition`, `requested_at`, `closed_at`,
828
+ `resolution_outcome`, `resolution_summary`, `attention_version`, and the
829
+ execution, issue, and project projections. `target` contains the exact target
830
+ type plus a live member/team projection when it still exists and immutable
831
+ snapshot fields. `requester` and `closed_by` contain `{ id, display_name,
832
+ type, deleted }` snapshots. Detail adds
833
+ `execution_state_version_at_request` and `execution_state_version_at_close`.
834
+
835
+ Create targets are one of `{ target_type: "member", target_member_id }`,
836
+ `{ target_type: "team", target_team_id }`, or
837
+ `{ target_type: "project_admins" }`. Mutation requests use
838
+ `expected_attention_version`, `expected_state_version`, and
839
+ `idempotency_key`; resolve also accepts `resolution_outcome` and an optional
840
+ bounded `resolution_summary`. Free-form text rejects secret-like values.
841
+ Internal requester/actor provenance, hashes, response snapshots, and mutation
842
+ metadata are never returned by the public API.
843
+
798
844
  ## Enums
799
845
 
800
846
  | Domain | Field | Values |
@@ -876,7 +922,9 @@ be the blocked target when the caller has permission to use it.
876
922
  | `releaseColumnId` | UUID | Persistent release column in the blocking issue's project; present when the blocking issue is authorized |
877
923
  | `release_column_id` | UUID | Compatibility alias for `releaseColumnId`; present with the canonical field |
878
924
  | `releaseColumn` | object or null | `{ id, key, label, position, projectId }` release column projection |
879
- | `satisfied` | boolean or null | Whether the blocker reached the release column position, or is cancelled |
925
+ | `satisfied` | boolean or null | Whether the blocker is archived or cancelled, or reached the release column position |
926
+
927
+ Archiving a blocker preserves the dependency edge and configured release column while satisfying the dependency. Restoring it re-evaluates that same release point and can block the dependent again. Configurable release-point and cancelled-blocker behavior are unchanged.
880
928
 
881
929
  The dependency-release migration backfills existing dependencies to the
882
930
  blocking project's `done` column. During a rolling deployment, compatibility
@@ -898,6 +946,35 @@ provider response or return `422` with
898
946
  metadata-only Activity actions `external_reference.linked`,
899
947
  `external_reference.updated`, or `external_reference.unlinked`.
900
948
 
949
+ ### External operational delivery context
950
+
951
+ `GET /api/orgs/{id}/issues/{issueId}/external-operational-signals` returns
952
+ `{ deliveryContext }`. The value is `null` without a linked PR. With several
953
+ links, selection prefers an open PR, then the latest `updated_at`, then the
954
+ highest PR number. Otherwise it
955
+ contains `repository`, `pull_request`, nullable `review`, `workflows`,
956
+ `freshness`, nullable `strongest_blocker`, and `partial`. PR, review, and
957
+ workflow evidence includes nullable `observed_at`, `provider_updated_at`,
958
+ `provider_event_id`, and `source_url`. The PR includes the exact `head_sha`.
959
+ Review state is `pending`, `approved`, or `changes_requested`; workflow state is
960
+ `pending`, `passed`, `failed`, or `cancelled`. Older-head evidence is not
961
+ current. Workflow `required` is always `false` because configured workflow
962
+ paths do not prove GitHub branch protection. Raw payloads, review bodies,
963
+ actors, logs, and credentials are excluded. A `pending` review or workflow with
964
+ null provenance has no current-head observation; this absence does not by
965
+ itself set `partial`. Disabled verification stops new projections. Workflow
966
+ conclusions map `success`/`neutral` to `passed`,
967
+ `cancelled`/`stale`/`skipped` to `cancelled`, and other supported terminal
968
+ conclusions to `failed`.
969
+ The selected PR-link state is authoritative. If a same-head PR observation
970
+ disagrees, its `observed_at`, `provider_updated_at`, and `provider_event_id` are
971
+ null, `source_url` uses the link URL, the observation is excluded from
972
+ `freshness`, and `partial` is true.
973
+ Review aggregation keeps each reviewer's latest exact-head opinion, ignores
974
+ comments, and removes dismissed opinions. Change requests win; `approved`
975
+ means at least one effective approval and no effective change request. It does
976
+ not prove required-review counts or branch protection.
977
+
901
978
  ## Task Activity
902
979
 
903
980
  `GET /api/orgs/{id}/activity` returns `{ data, currentMemberId, limit, offset,