UmweltDocs
Reference/Commands/proposal.review
proposal.reviewcommandsince 0.1

Accepts or rejects operations of a pending proposal, each with a rationale.

Request
umwelt call story.umw proposal.review '{
  "proposalId": "01a1cbd8-63fc-7ec1-aac1-c0b733797443",
  "reviews": [
    {
      "operationIndex": 0,
      "decision": "accepted",
      "rationale": "Bob confesses on the page."
    },
    {
      "operationIndex": 1,
      "decision": "accepted",
      "rationale": "Her belief gives way to what he told her."
    }
  ]
}'
Request
const result = await client.proposalReview({
  proposalId: '01a1cbd8-63fc-7ec1-aac1-c0b733797443',
  reviews: [
    {
      operationIndex: 0,
      decision: 'accepted',
      rationale: 'Bob confesses on the page.',
    },
    {
      operationIndex: 1,
      decision: 'accepted',
      rationale: 'Her belief gives way to what he told her.',
    },
  ],
});
Request
var result = engine.ProposalReview(new ReviewPayload
{
    ProposalId = "01a1cbd8-63fc-7ec1-aac1-c0b733797443",
    Reviews = new()
    {
        new ReviewInput
        {
            OperationIndex = 0,
            Decision = ReviewDecision.Accepted,
            Rationale = "Bob confesses on the page.",
        },
        new ReviewInput
        {
            OperationIndex = 1,
            Decision = ReviewDecision.Accepted,
            Rationale = "Her belief gives way to what he told her.",
        },
    },
});
Response
{
  "id": "01a1cbd8-63fc-7ec1-aac1-c0b733797443",
  "status": "pending",
  "input": {
    "projectId": "ball",
    "event": {
      "id": "confession",
      "title": "The confession",
      "position": { "tick": 10 },
      "evidence": [],
      "participants": ["bob", "duchess"],
      "provenance": { "origin": { "kind": "human" } },
      "type": "scene"
    },
    "records": [
      {
        "kind": "holding",
        "id": "duchess-knows",
        "holder": "duchess",
        "claim": {
          "subject": "bob",
          "predicate": "stole",
          "object": { "kind": "entity", "id": "necklace" },
          "polarity": true,
          "qualifiers": {}
        },
        "attitude": "knows",
        "confidence": 1.0,
        "accessibility": "available",
        "acquisition": {
          "kind": "told-by",
          "intent": "honest",
          "sourceHolderId": "bob",
          "sourceRecordId": "bob-did"
        },
        "position": { "tick": 10 },
        "provenance": { "origin": { "kind": "human" } }
      }
    ],
    "transitions": [
      {
        "status": "superseded",
        "position": { "tick": 10 },
        "provenance": { "origin": { "kind": "human" } },
        "supersededBy": "duchess-knows",
        "targetRecordId": "duchess-told"
      }
    ]
  },
  "reviews": [
    {
      "id": "01a1cbd8-6401-7913-bf8f-3f6dfd9c4b8b",
      "createdAt": "2026-11-11T18:21:58.6570787Z",
      "decision": "accepted",
      "operationIndex": 0,
      "rationale": "Bob confesses on the page."
    },
    {
      "id": "01a1cbd8-6401-7913-bf8f-3f77754a1c82",
      "createdAt": "2026-11-11T18:21:58.6570954Z",
      "decision": "accepted",
      "operationIndex": 1,
      "rationale": "Her belief gives way to what he told her."
    }
  ]
}

Payload

FieldTypeDescription
proposalIdrequiredstringThe proposal, by the id propose returned.
reviewsrequiredReviewInput[]One per decision: operationIndex, decision (accepted or rejected) and rationale.

Result

FieldTypeDescription
idalwaysstringThe proposal’s id.
inputalwaysProposeInputThe commit it holds: the event, records and transitions, as proposed.
statusalways"pending" | "applied" | "partially-applied" | "rejected"pending until it is applied (applied, or partially-applied when some operations were rejected) or rejected.
reviewsProposalReview[]Every review so far, oldest first. The latest one for an operation decides it.
rejectionRationalestringWhy it was rejected, when it was.

Rules

The latest review decides. An operation can be reviewed again; the newest review for it is the one that counts.

Unreviewed means not applied. Only accepted operations are applied by proposal.apply.

Errors

VALIDATION_FAILEDAn operation index is out of range.
NOT_FOUNDThe proposal does not exist.
INVALID_STATEThe proposal is no longer pending.
HANDSHAKE_REQUIREDOver the protocol, hello was not sent first.

Every code is listed in Errors.

See also

Was this page helpful?