Disputes API

listOpenDisputes and resolveDispute for app-layer conflict resolution.

Types

type Dispute = {
  id: string;
  claimAId: string;       // incoming (usually disputed)
  claimBId: string;       // incumbent (usually active)
  entity: string;
  resolutionStrategy: string | null;
  resolvedOp: string | null;
  resolvedAt: Date | null;
  createdAt: Date;
};

type OpenDispute = Dispute & {
  claimA: Claim;
  claimB: Claim;
};

listOpenDisputes(db, opts?)

Returns unresolved disputes (resolved_at IS NULL) with both claims hydrated.

import { listOpenDisputes } from "vault-memory";

const open = await listOpenDisputes(db);
const filtered = await listOpenDisputes(db, { entity: "user.timezone" });

resolveDispute(db, vectorStore, disputeId, winningClaimId)

Promotes the chosen claim and closes the dispute.

import { resolveDispute } from "vault-memory";

const result = await resolveDispute(db, vectorStore, disputeId, winningClaimId);
// result.winner, result.loser, result.dispute

Errors

ConditionError
Unknown dispute idDispute not found
Already resolvedDispute already resolved
Invalid winner idwinningClaimId must be claim_a or claim_b

Schema: disputes table

ColumnPurpose
claim_a_idIncoming (disputed) claim
claim_b_idIncumbent (active) claim
entitySubject of conflict
resolution_strategyStrategy that produced the dispute
resolved_opWinning claim id after resolution
resolved_atTimestamp when resolved