Skip to content

Event Schema Reference

The Event object is the body of every DcpMessage. It records exactly one state change in a project. An Event MUST contain at least one of: entity, delta, or refs.

Schema: https://schemas.devcopro.org/v1/event.schema.json

Type: string — MUST be present.

A unique identifier for this event. Recommended format: evt_ prefix followed by a ULID or UUID. Used for deduplication and correlation.

Type: string (enum) — MUST be present.

The kind of project entity this event concerns. One of eight values:

ValueDescription
projectA project-level record
taskA unit of work
dependencyA declared dependency between tasks or entities
architecture_impactAn architectural change or risk
decisionA recorded decision
review_requestA request for human or agent review
findingAn observation, issue, or discovery
milestoneA significant project checkpoint

Type: string — MUST be present.

Describes what happened to the entity. The verb vocabulary is controlled. Universal verbs apply to all entity types; some entity types define additional verbs:

Universal: created, updated, status_changed, snapshot, deleted

Task-specific: completed, blocked, unblocked, assigned

Decision-specific: recorded, accepted, rejected, superseded

ReviewRequest-specific: requested, approved, changes_requested, rejected

Finding-specific: raised, acknowledged, resolved

Milestone-specific: reached, missed

ArchitectureImpact-specific: assessed

Dependency-specific: created, removed

See the verb vocabulary reference for the complete table. Verbs are open tokens: consumers MUST tolerate unknown verbs and pass them through.

Type: string — MUST be present.

The stable identifier of the entity this event describes. Must remain consistent across multiple events concerning the same entity (e.g. a task’s ID does not change when its status changes).

Type: string — MAY be present.

Scopes the event to a specific project. Useful when a single DCP stream carries events from multiple projects.

Type: string (ISO 8601 datetime) — MAY be present.

When the state change actually occurred, as distinct from issued_at in the envelope (when the message was emitted). Use this when there is a lag between the event and the message.

Type: string — MAY be present.

The agent, user, or system associated with causing this change, in project terms. This is descriptive metadata only — it carries no authenticated identity. See Carries No Trust.

Type: object — MAY be present. Required if neither delta nor refs is present.

A full snapshot of the entity’s state at the time of the event. Shape varies by entity_type. Use for created events or any event where a full snapshot is warranted.

Type: object — MAY be present. Required if neither entity nor refs is present.

A map from field name to a change record. Maximum 64 entries.

Each entry has the shape:

{ "from": <previous value>, "to": <new value> }
  • to is REQUIRED — the new value after the change.
  • from is OPTIONAL — the previous value. Omit when the previous state is unknown or not meaningful (e.g. on creation).

Example:

"delta": {
"status": { "from": "in_progress", "to": "completed" },
"assignee": { "to": "agent-builder" }
}

Type: array of ref objects — MAY be present. Required if neither entity nor delta is present.

Semantic links from this event to other entities. Each ref has:

  • rel — the relationship type. Drawn from a closed vocabulary: relates_to, part_of, references, caused_by, derived_from, supersedes, concerns, blocks
  • ref — the target entity identifier (string).

The vocabulary intentionally excludes routing and permission relations. See Carries No Trust.

Type: object — MAY be present.

A free-form map for implementor-specific fields. DCP processors that do not recognise an extension key MUST ignore it. Extension keys SHOULD be namespaced (e.g. "acme:priority": 1) to avoid future conflicts with the core spec.