Stability: stable. Version: acop-orchestration/1.0. This extension is
versioned independently from ACOP core; it follows the same additive-versus-
breaking rules as core. See
acop.md § Versioning policy.
This document is normative for the orchestration extension. Adopting it is
OPTIONAL: an ACOP core implementation that does not orchestrate staged work
is fully conformant without it. An implementation that declares support for
acop-orchestration/1.0 MUST satisfy
§ Conformance.
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.
This document defines a reusable orchestration extension for ACOP.
Core ACOP defines work coordination semantics:
The orchestration extension adds a higher-order execution flow that can be loaded by a lead agent or orchestration middleware and used to control multi-agent development work across phases, lanes, gates, and acceptance transitions.
This is intended for projects that need stronger flow control than “here is a queue of work items,” especially when:
The schema is intentionally project-agnostic: it describes flow structure, not any particular delivery methodology.
The orchestration extension is layered on top of:
It does not replace ACOP core work items.
Instead:
In complex multi-agent development, the missing contract is often not “what a work item looks like” but “what order and gate structure should govern those work items.”
Examples:
2.x must not start until phase 1.3 is acceptedThese are orchestration semantics, not just work-item semantics.
OrchestrationFlowThe top-level reusable execution definition.
Required fields:
flow_idprotocol_versionorchestration_profile_versiontitletarget_repo_idRecommended fields:
summaryversionproducerdefault_release_policyStageA major bounded segment of work.
Examples:
Required fields:
stage_idtitlestage_kindLaneA parallelizable stream of work within a stage.
Examples:
Required fields:
lane_idstage_idtitleGateA stop/check/release checkpoint.
Required fields:
gate_idgate_kindtitlerelease_policyExamples:
integration_gatereview_gateschema_gatecompliance_gaterelease_gateReleaseConditionDeclares what must become true before a stage, lane, or gate can release downstream work.
Examples:
AcceptanceRecordRepresents accepted completion of a unit in the orchestration flow.
This is especially important for graph-backed orchestration because acceptance state should be queryable independently from raw work-item completion.
Examples:
FlowEdgeDeclares the orchestration dependency graph.
Examples:
lane -> gategate -> stagegate -> lanestage -> stageAn implementation MUST load the orchestration flow before creating or claiming work governed by that flow. A work item that declares a governing flow unit whose flow is not loaded MUST NOT be treated as actionable.
This is the central guarantee of the extension. A downstream ACOP work item
governed by a release condition MUST NOT be presented as actionable — that
is, MUST NOT enter ready — until that release condition is satisfied as
defined in § Release evaluation.
An implementation that enqueues downstream work and relies on workers to refrain from claiming it does NOT conform. The restriction MUST be enforced by the coordination owner, because a worker cannot be assumed to be cooperative.
A work item reaching core status completed MUST NOT by itself satisfy a
release condition. Orchestration progress is carried by AcceptanceRecord
objects, whose lifecycle is defined in
§ AcceptanceRecord.acceptance_status.
This separation is deliberate: completed is a worker’s assertion about its
own output, while accepted is a decision made by the party that owns the
gate. Collapsing the two lets a worker release its own downstream work.
Every Gate SHOULD declare an owner_role. A gate whose release_policy
is explicit_owner_approval MUST declare an owner_role, and an
implementation MUST reject an acceptance record targeting such a gate unless
the recording identity holds that role.
Blackboard entries and ACOP compliance records MAY be linked to stages,
lanes, gates, and acceptance records. Such links are informational: a
blackboard entry MUST NOT satisfy a release condition on its own. Where a
gate’s release_policy is all_required_compliance_satisfied, the
authority is the compliance extension’s requirement matrix, not the
blackboard. See acop-compliance.md.
A release condition is evaluated against its release_policy. An
implementation MUST evaluate the policies below as specified, and MUST treat
a condition as unsatisfied whenever the required state cannot be determined.
“Fail open” is non-conforming: an undeterminable gate MUST block.
release_policy |
Satisfied when |
|---|---|
all_upstream_accepted |
Every target named in required_gate_ids, required_lane_ids, and required_stage_ids has a current acceptance status of accepted or released. |
all_required_artifacts_present |
Every artifact in the gate’s required_artifact_ids is present and resolvable. |
all_required_validation_passed |
Every validation in the gate’s required_validation_ids has passed. |
all_required_compliance_satisfied |
Every requirement in the gate’s required_requirement_ids has a matrix entry whose completeness_status is satisfied, not_applicable, or excepted under a currently approved exception. |
explicit_owner_approval |
An acceptance record with status accepted exists for the gate, recorded by an identity holding the gate’s owner_role. |
custom |
Implementation-defined. An implementation MUST document its evaluation rule and MUST NOT treat custom as automatically satisfied. |
A release condition naming no targets and no required artifacts, validations, or requirements is vacuous. An implementation MUST reject such a condition at load time rather than treating it as satisfied — a gate that silently permits everything is the failure this extension exists to prevent.
The state machine below is 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.
AcceptanceRecord.acceptance_statusGates, lanes, and stages do not carry a status field of their own. The
current status of a flow unit is the acceptance_status of the most
recently recorded non-superseded AcceptanceRecord whose target_id
names that unit. A unit with no acceptance record is pending.
Implementations MUST NOT introduce a parallel status field on the unit
itself; two sources of truth for release state is precisely how downstream
work escapes its gate.
+---------+
| (start) |
+----+----+
|
v
+-----------+
| pending |
+-----+-----+
|
(underlying work completes)
|
v
+-------------------------+
+---->| completed_not_accepted |<----+
| +-----------+-------------+ |
| | |
| (reviewer examines) | (rework submitted)
| v |
| +-----------+ |
| | reviewed +-------------+
| +-----+-----+ (rejected)
| | |
| | (owner v
| | accepts) +-----------+
| | | rejected |
| v +-----+-----+
| +-----------+ |
+-----------+ accepted | |
(rejected +-----+-----+ |
after | |
acceptance) (release conditions |
satisfied) |
v |
+-----------+ |
| released | |
+-----------+ |
|
Terminal escape (allowed from any non-terminal state, including rejected):
any non-terminal --(replaced by a newer record)--> superseded
Required transitions (MUST be supported):
| From | To | Trigger |
|---|---|---|
| (start) | pending |
acceptance record created for a flow unit |
pending |
completed_not_accepted |
underlying work reaches core status completed |
completed_not_accepted |
reviewed |
reviewer examines the unit |
reviewed |
accepted |
gate owner accepts |
reviewed |
rejected |
reviewer or owner rejects |
accepted |
released |
release conditions satisfied; downstream released |
rejected |
completed_not_accepted |
rework submitted for re-review |
| any non-terminal | superseded |
replaced by a newer acceptance record |
Optional transitions (MAY be supported):
| From | To | Trigger |
|---|---|---|
completed_not_accepted |
accepted |
flows with no distinct review step; acceptance is the review |
completed_not_accepted |
rejected |
rejected before review, e.g. missing required artifacts |
accepted |
rejected |
acceptance withdrawn before release |
Forbidden transitions (MUST NOT be permitted):
released or superseded. These are terminal.
Re-opening released work requires a new acceptance record, which
supersedes the prior one.pending → accepted, pending → reviewed, or pending → released.
A unit MUST pass through completed_not_accepted; accepting work that has
not completed defeats the extension’s purpose.accepted → released while any release condition governing the target
is unsatisfied.rejected → accepted directly. Rework MUST re-enter through
completed_not_accepted so the rejection and its remedy are both on the
record.An implementation that declares support for acop-orchestration/1.0 MUST:
orchestration_profile_version equal to acop-orchestration/1.0
in every orchestration document, and reject documents whose profile
version it does not accept.acceptance_status state machine.
Forbidden transitions MUST be rejected.ready from any work item whose governing release condition is
unsatisfied, enforced by the coordination owner rather than by worker
cooperation.release_policy as specified in
§ Release evaluation, treating undeterminable
state as unsatisfied.from_id and to_id in flow_edges, and every
target_id in release conditions and acceptance records, to a declared
flow unit. Dangling references MUST be rejected at load time.Implementations SHOULD execute the orchestration conformance fixtures in fixtures/ as part of their CI.
Conformance with this extension does not imply conformance with
acop-compliance.md. A gate whose release_policy is
all_required_compliance_satisfied requires both.
This extension is designed to project cleanly into the graph projection layer.
Recommended node types:
OrchestrationFlowOrchestrationStageOrchestrationLaneOrchestrationGateReleaseConditionAcceptanceRecordRecommended edges:
(:OrchestrationFlow)-[:HAS_STAGE]->(:OrchestrationStage)(:OrchestrationStage)-[:HAS_LANE]->(:OrchestrationLane)(:OrchestrationStage)-[:HAS_GATE]->(:OrchestrationGate)(:OrchestrationLane)-[:FLOWS_TO]->(:OrchestrationGate)(:OrchestrationGate)-[:RELEASES]->(:OrchestrationStage|:OrchestrationLane)(:AcceptanceRecord)-[:ACCEPTS]->(:OrchestrationGate|:OrchestrationLane|:OrchestrationStage)(:WorkItem)-[:IMPLEMENTS_FLOW_UNIT]->(:OrchestrationLane|:OrchestrationGate)(:ReleaseCondition)-[:GOVERNS]->(:OrchestrationGate|:OrchestrationStage|:OrchestrationLane)Projection is OPTIONAL — an implementation that does not project into a graph is still conformant. An implementation that does project MUST relay acceptance status, since the graph is otherwise unable to answer the questions the projection exists for:
A staged delivery program can express:
The same schema applies to:
Worked documents are in acop_examples.md.