Conflict
Conflict
A Conflict represents a detected contradiction between two memory units. The protocol treats conflicts as expected events, not errors. Conflicts are declared explicitly by agents at every level (via a contradicts relation), and detected automatically at every level — mechanically (key-value disagreement, no embeddings) starting at Level 1, semantically at Level 2+.
A conflict's shape also depends on level. At Level 1, a conflict is a stateless fact: two unit IDs and the fields they disagree on — useful because there is nothing yet to do with it except surface it. At Level 2+, once MERGE exists to act on it, a conflict becomes a stateful, ID-addressable resource with a resolution lifecycle.
Schema
{
"id": "<string | null>",
"type": "factual | interpretive | strategic | priority | null",
"status": "detected | resolving | resolved | escalated | null",
"unit_a": "<string>",
"unit_b": "<string>",
"conflicting_fields": ["<string>"],
"description": "<string>",
"detected_by": "explicit | mechanical | semantic | logical | temporal",
"resolution": {
"strategy": "<ConflictStrategy>",
"winner_id": "<string | null>",
"rationale": "<string>",
"resolved_by": "<string>",
"epoch_resolved": "<number>"
}
}
Field Reference
| Field | Type | Required | Description |
|---|---|---|---|
id | string or null | Level 2+ | Unique conflict identifier, auto-assigned by the Field. null at Level 1 — a stateless conflict has no identity to reference later. |
type | string or null | Level 2+ | factual, interpretive, strategic, or priority. Unset at Level 1. |
status | string or null | Level 2+ | Current state of the conflict. Unset at Level 1. |
unit_a | string | ✓ | ID of the first conflicting memory unit. |
unit_b | string | ✓ | ID of the second conflicting memory unit. |
conflicting_fields | string | For mechanical detection | The shared fields the two units disagree on. |
description | string | Level 2+ | Human-readable description of the contradiction. |
detected_by | string | ✓ | How the conflict was discovered. |
resolution | object | Populated once the conflict is resolved (Level 2+ only — there is no resolution lifecycle at Level 1). |
Required Fields by Level
| Field | Level 1 | Level 2+ |
|---|---|---|
unit_a, unit_b | REQUIRED | REQUIRED |
detected_by | REQUIRED | REQUIRED |
conflicting_fields | REQUIRED for mechanical detection | REQUIRED for mechanical detection |
description | OPTIONAL | REQUIRED |
id | — | REQUIRED |
type | — | REQUIRED |
status | — | REQUIRED |
resolution | — | REQUIRED once resolved |
At Level 1, a Conflict is a stateless fact recomputed on demand — it has no identity to reference later and no lifecycle, because MERGE, the only operation that would advance it through one, doesn't exist yet.
Conflict Types
| Type | Description |
|---|---|
factual | Two units make opposing factual claims (e.g., conflicting market size figures) |
interpretive | Two units interpret the same evidence differently |
strategic | Two units recommend conflicting courses of action |
priority | Two units assign different priority to the same goal or task |
Detection Methods
| Method | Description | Required Level |
|---|---|---|
explicit | An agent included a contradicts relation in a RECORD request | 1+ |
mechanical | Two committed units share a scoping key and disagree on the value of another shared primitive field. No embeddings or configuration required. | 1+ |
semantic | Embedding similarity detected opposing claims | 2+ |
logical | A finding's assumptions contradict another finding's content | 2+ |
temporal | A newer finding contradicts an established, higher-confidence finding | 2+ |
Status Lifecycle
Applies from Level 2+, once MERGE exists to drive it. At Level 1, a Conflict has no status to transition.

detected → resolving → resolved
detected → escalated → resolved (human operator resolves)
resolving → escalated (strategy fails or times out)
| Status | Description |
|---|---|
detected | Conflict found; no resolution initiated yet. |
resolving | An agent or the Field has initiated resolution with a chosen strategy. |
resolved | Successfully resolved. Both original units updated to superseded or one is superseded. |
escalated | Automatic resolution not possible; flagged for human review. |
Conflict Resolution Strategies
| Strategy | Description | Required Level |
|---|---|---|
last_write_wins | Most recent memory unit prevails | 2+ |
confidence_weighted | Higher confidence score prevails | 2+ |
human_escalation | Flag for human review | 2+ |
authority | Specified agent/role has final say | 3 |
evidence_count | Unit with more supporting evidence prevails | 3 |
synthesis | Create a new unit reconciling both | 3 |
vote | Multiple agents vote (requires quorum) | 3 |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://akashikprotocol.com/schema/0.1.0/conflict.json",
"type": "object",
"required": ["unit_a", "unit_b", "detected_by"],
"properties": {
"id": { "type": ["string", "null"], "minLength": 1 },
"type": { "type": ["string", "null"], "enum": ["factual", "interpretive", "strategic", "priority", null] },
"status": { "type": ["string", "null"], "enum": ["detected", "resolving", "resolved", "escalated", null] },
"unit_a": { "type": "string" },
"unit_b": { "type": "string" },
"conflicting_fields": { "type": "array", "items": { "type": "string" } },
"description": { "type": "string" },
"detected_by": { "type": "string", "enum": ["explicit", "mechanical", "semantic", "logical", "temporal"] },
"resolution": {
"type": "object",
"properties": {
"strategy": {
"type": "string",
"enum": ["last_write_wins", "confidence_weighted", "authority", "evidence_count", "synthesis", "human_escalation", "vote"]
},
"winner_id": { "type": ["string", "null"] },
"rationale": { "type": "string" },
"resolved_by": { "type": "string" },
"epoch_resolved": { "type": "integer" }
}
}
}
}