Stability: stable.
ACOP stands for Agentic Code Orchestration Protocol. This document is
normative for the ACOP core contract. Extensions (orchestration,
compliance) are versioned and labeled independently.
The key words MUST, MUST NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY, and OPTIONAL in this document are to be interpreted as described in RFC 2119 and RFC 8174 when, and only when, they appear in all capitals. Lowercase appearances of these words carry their ordinary English meaning and are not normative.
Where the prose says “the spec” or “this protocol,” it refers to ACOP core as defined by this document and acop.schema.json.
ACOP defines the coordination semantics needed for multi-agent software development work that are not fully covered by:
MCP, which standardizes model-to-tool/context accessA2A, which standardizes agent-to-agent interoperability and message
exchangeACOP is not intended to replace either of those.
The intended stack is:
MCP for tools, resources, and contextA2A for inter-agent communication and delegationACOP for code-work coordination semantics layered on topAgentic code generation needs stronger coordination than “send another agent a message” and stronger structure than “call a tool.”
The missing layer is responsible for:
Without that layer, agents step on each other during cross-agent development work.
ACOP does not define:
ACOP defines the coordination contract, not the full runtime.
A planning producer (for example, a refactor planner or work-decomposition service) emits:
A read-side MCP server projects coordination state and exposes:
An orchestration middleware layer owns:
Coding agents, review agents, and validation agents consume ACOP work items and act on them.
WorkItemThe top-level unit of coordinated code work.
Required fields (a conforming WorkItem MUST carry all of these):
work_item_idprotocol_versionwork_kindcreated_at_utcproducerstatuspriorityactionability_scoreRecommended fields (a conforming producer SHOULD emit these when the information is available):
titlesummarytarget_repo_idtarget_workspace_roottarget_branchtarget_worktreesource_handoff_idcorrelation_idwork_item_id MUST be stable across re-publishes of the same logical
work item; producers MUST NOT reuse a work_item_id for different work.
Implementations MUST treat work_item_id as opaque.
WorkKindThe work_kind field MUST be one of the values defined in
acop.schema.json:
implementrefactorreviewvalidaterepairhandoff_followupmerge_prepareImplementations MAY accept additional vendor-prefixed kinds (e.g.
acmecorp.deploy_prepare) but MUST NOT redefine the core values.
StatusThe status field MUST be one of:
ready — immediately pickablerequires_attention — human or lead-agent decision likely needed, but
still relevantblocked — not pickable until blocker resolutionclaimed — reserved by one worker under a live claimin_progress — actively being executedcompleted — worker asserts doneaccepted — downstream accepted the workreleased — claim released without completion (work is back on the
market)consumed — downstream system accepted output and no further pickup
should occurcancelled — abandoned intentionallysuperseded — replaced by a newer work itemThe allowed transitions between these states are normative and are defined in state machines.
BlockerRepresents why work is not directly actionable.
Required fields:
blocker_codeseveritysummaryRecommended fields:
artifact_idoperation_iddepends_on_work_item_iddepends_on_external_decisionsuggested_resolutionblocker_code SHOULD come from one of the
reserved namespaces.
OperationA planned step in a work item.
Required fields:
operation_idkinddescriptionRecommended fields:
depends_on_operation_idsoutcome_targetartifact_idsvalidation_focusCommon kind values (non-exhaustive):
extract_seammaterialize_contractmaterialize_coreapply_patchrun_testsrequest_reviewArtifactA stable object the work item refers to.
Required fields:
artifact_idartifact_kindartifact_roleRecommended fields:
resource_urirepo_relative_pathnamespace_hintsymbol_hintreadinessCommon artifact kinds: source file, patch preview, contract interface, generated scaffold, registration preview, review report.
ValidationRequirementDescribes the evidence required before a work item can complete.
Required fields:
requirement_idkindsummaryA server MUST reject a complete transition for a work item whose
declared ValidationRequirements lack matching evidence in the request
body with the validation_required error code.
BlackboardEntryRepresents a shared coordination note or intermediate artifact in a multi-agent development flow.
Blackboard coordination belongs in ACOP core because it is a general collaboration primitive rather than a domain-specific extension.
Required fields:
entry_idwork_item_identry_kindauthor_agent_uidcreated_at_utcstatusRecommended fields:
summarydetailsartifact_idsoperation_idsconfidencesupersedes_entry_idsentry_kind MUST be one of finding, hypothesis, partial_result,
risk, decision, constraint, review_request, or integration_note.
Blackboard entries MUST be treated as append-only. Implementations MUST
NOT mutate a stored entry; logical revision MUST be expressed by posting
a new entry with supersedes_entry_ids populated.
Design intent:
ACOP defines claim / lease semantics so that cross-agent code work can detect and resolve collisions. The lease authority itself MUST live in orchestration middleware; producers MUST NOT silently become the lease owner.
ClaimIntentRepresents an attempt by a worker to take ownership of a work item.
Required fields:
claim_intent_idwork_item_idworker_agent_uidrequested_at_utcrequested_ttl_secondsscopeClaimRepresents granted temporary ownership.
Required fields:
claim_idwork_item_idworker_agent_uidgranted_at_utcexpires_at_utcclaim_statusclaim_status MUST be one of active, released, expired, or
revoked. The allowed transitions between these states are normative
and are defined in state machines.
LeaseHeartbeatOptional liveness updates from the worker or middleware. Implementations
MAY use heartbeats to inform stale-work recovery; receipt of a heartbeat
MUST NOT by itself extend expires_at_utc — use the renew verb for that.
Required fields:
claim_idobserved_at_utcRecommended fields:
progress_statusprogress_summaryThe state machines below are normative. A conforming implementation MUST implement every transition labeled MUST, MAY implement every transition labeled MAY, and MUST NOT permit any transition that is neither.
WorkItem.status +---------+
| (start) |
+----+----+
|
v
+--------------+
+----------> | ready | <--+
| +------+-------+ |
| | |
| (blocker resolved)| | (release)
| v |
+----+-------+ +---------+ |
| blocked |<-----+ claimed +-------+
+-----^------+ +----+----+
| |
| (new blocker) | (work starts)
| v
| +-------------+
+-------------+ in_progress |
+------+------+
|
(worker asserts |
done & evidence)
v
+-------------+
| completed |
+------+------+
|
(downstream |
accept handoff)
v
+-------------+
| accepted |
+------+------+
|
v
+-------------+
| consumed |
+-------------+
Terminal escapes (allowed from any non-terminal state):
any non-terminal --(producer/lead cancels)--> cancelled
any non-terminal --(replaced by new work)----> superseded
Required transitions (MUST be supported):
| From | To | Trigger |
|---|---|---|
| (start) | ready |
producer emits an actionable work item |
| (start) | blocked |
producer emits with one or more blockers |
| (start) | requires_attention |
producer signals human/lead decision |
ready |
claimed |
claim granted |
claimed |
in_progress |
worker reports first heartbeat or work |
claimed |
ready |
claim released without completion |
claimed |
released |
claim released without completion |
in_progress |
completed |
worker completes with evidence |
in_progress |
ready |
claim released or expired |
in_progress |
released |
claim released without completion |
completed |
accepted |
downstream consumer accepts handoff |
accepted |
consumed |
downstream consumes the output |
ready |
blocked |
new blocker raised |
blocked |
ready |
blocker resolved |
| any non-terminal | cancelled |
producer or lead cancels |
| any non-terminal | superseded |
replaced by a newer work item |
Optional transitions (MAY be supported):
| From | To | Trigger |
|---|---|---|
requires_attention |
ready |
decision made |
requires_attention |
blocked |
decision deferred behind a blocker |
completed |
consumed |
implementations that skip the accepted step (acceptance is implicit) |
released |
ready |
re-enqueue after release |
Forbidden transitions (MUST NOT be permitted):
consumed, cancelled, or superseded. These
are terminal.completed → in_progress (re-opening a completed work item requires
a new work item via superseded).blocked → claimed directly (a work item MUST pass through ready
before claim).Claim.claim_status (claim granted)
|
v
+---------+
| active +---------------+
+----+----+ |
| | (worker calls release)
| (TTL passes v
| with no renew) +-----------+
| | released |
v +-----------+
+----------+
| expired |
+----------+
+---------+
| active +--(orchestration revokes)--+
+---------+ v
+----------+
| revoked |
+----------+
Required transitions (MUST be supported):
| From | To | Trigger |
|---|---|---|
| (start) | active |
claim granted |
active |
released |
worker explicitly releases |
active |
expired |
expires_at_utc passes without renew |
active |
revoked |
orchestration middleware revokes |
Forbidden transitions (MUST NOT be permitted):
released → active (re-claim requires a new ClaimIntent and a new
claim_id).expired → active (same as above).revoked → active (same as above).active claim other than to inspect it.The main query shape an ACOP-backed system MUST support is:
Secondary useful shapes that implementations SHOULD support:
This is why ACOP requires explicit status, blocker_codes,
actionability_score, and target_agent_uid.
Producers SHOULD scope work items to a concrete code surface using the recommended fields:
repo_idworkspace_rootbranch_nameworktree_idbase_commitexpected_head_commitowned_pathsowned_symbolsThese are important for avoiding collisions during cross-agent code
generation. An implementation MAY use owned_paths and owned_symbols
to detect cross-claim collision at finer granularity than work_item_id,
but the v1.0 spec does not require it.
Code work is not done when edits exist; it is done when the required validation and review state is satisfied.
Recommended fields:
review_requiredreview_scopereview_artifact_idsvalidation_requirementscompletion_evidenceACOP defines these semantic message families:
work_offerwork_updateclaim_intentclaim_grantclaim_releaseblocker_updateartifact_updatevalidation_updatecompletion_noticesupersession_noticeThese MAY travel over A2A messages or be represented in indexed artifacts/resources. The normative wire mapping for HTTP+JSON is defined in acop-http-binding.md.
ACOP reserves the following namespace prefixes for blocker_code values:
| Prefix | Owned by | Stability |
|---|---|---|
| (no prefix) | ACOP core (this document) | stable |
orchestration. |
ACOP orchestration extension | stable |
compliance. |
ACOP compliance extension | stable |
x.<vendor>. |
implementation-defined extensions | n/a |
Core ACOP reserves these unprefixed blocker_code values for the meanings
described:
| Code | Meaning |
|---|---|
seam_extraction_required |
A code seam must be extracted before work can proceed. |
host_contract_unresolved |
The host/consumer contract is not yet stable. |
branch_conflict_risk |
Concurrent branch state would conflict with this work. |
validation_environment_missing |
A required validation environment is unavailable. |
review_required |
Review must be obtained before transition. |
dependency_work_item_pending |
Another work item must complete first. |
external_decision_pending |
An external (often human) decision is outstanding. |
artifact_unavailable |
A referenced artifact is missing or not yet readable. |
Implementations MUST NOT use these unprefixed codes for meanings other
than the ones above. Implementations MAY add codes under the x.<vendor>.
prefix without coordination.
protocol_version semanticsEvery ACOP document (request body, persisted record, message) MUST carry a
protocol_version field of the form acop/<major>.<minor> (e.g.
acop/1.0). Servers MUST reject requests whose protocol_version they
do not accept with the unsupported_protocol_version error code.
This document defines acop/1.0. Future versions follow these rules:
Additive (minor version bump, e.g. acop/1.0 → acop/1.1):
status, work_kind, claim_status,
and blackboard_entry_kind are NOT extensible — adding a value to any
of them is a major bump).Breaking (major version bump, e.g. acop/1.0 → acop/2.0):
Within a single major version, the highest minor version supported by both client and server MUST be used:
protocol_version it supports in
every request.unsupported_protocol_version and include the highest
version it supports in the error details.max_supported_version.Across major versions, no negotiation is required: a server MAY refuse all requests of a non-matching major version.
Each ACOP extension declares its own stability label independently from core. v1.0 labels:
| Component | Stability | Versioning |
|---|---|---|
| ACOP core (this document) | stable | acop/1.0 |
| HTTP+JSON transport binding | stable | tied to core |
| Orchestration extension | stable | acop-orchestration/1.0 |
| Compliance extension | stable | acop-compliance/1.0 |
| Read-side MCP recommendations | stable | tied to orchestration 1.0 |
“Stable” means the surface follows the additive-versus-breaking rules above: it MUST NOT change incompatibly without a major version bump.
“Experimental” — retained here for future extensions — means the surface MAY change in a backwards-incompatible way at any time before its own 1.0 release. Implementations that adopt experimental extensions SHOULD pin to an exact version. No component currently carries this label.
Each extension is versioned independently of core and of the other extensions. Adopting an extension is OPTIONAL; a core implementation that declares support for neither is fully conformant. An implementation that declares support for an extension MUST satisfy that extension’s own conformance section.
A conforming ACOP implementation MUST:
additionalProperties:
false enforced at the object level.WorkItem.status
and Claim.claim_status. Forbidden transitions MUST be rejected.protocol_version it does not accept with
unsupported_protocol_version.A conforming HTTP+JSON implementation MUST additionally satisfy acop-http-binding.md § Conformance.
Implementations SHOULD execute the conformance test fixtures in fixtures/ as part of their CI.
ACOP v1.0 covers:
It deliberately avoids:
The machine-readable core contract lives at:
That schema is intentionally narrow. It covers:
WorkItemBlockerOperationArtifactValidationRequirementBlackboardEntryClaimIntentClaimLeaseHeartbeatIt does not encode orchestration policy. Reusable orchestration flow semantics such as stages, lanes, gates, release conditions, and acceptance state live in the orchestration extension.
Producers (planners, refactor engines, decomposition services) align with ACOP by:
ACOP core remains useful without compliance-heavy deployment assumptions.
Compliance-specific coordination lives in an extension/profile rather than in core. See acop-compliance.md.
The MCP read surface SHOULD:
These are explicitly out of scope for v1.0 and are tracked for a future version:
actionability_score should be producer-supplied,
middleware-supplied, or bothreview as a first-class object rather than as an
artifact reference