Proposals (Öneri)

The consent mechanism for agent work (ADR 0027 §2). An Ajan token's live mutations are never executed — each is dry-run previewed and recorded as an item of the token's one open proposal, answered with HTTP 202 {proposed: true, auditId: null}. "No audit row ⇔ nothing applied" stays literally true: a proposal stores envelopes and previews only — never data snapshots, no storefront bump, nothing visible until apply.

Proposal statuses

statusmeaning
openthe token's working set — every recorded mutation appends an item (one open proposal per token; idle proposals expire after 7 days)
submittedproposal.submit with a title + summary; the owner is mailed a review link; expires unreviewed after 14 days
applyingthe owner approved — proposal.approve is the audited consent event (owner sessions only; tokens structurally cannot approve)
pauseda stale or failed item stopped the run; the owner skips, re-approves, or rejects
appliedevery item ran (or was skipped)
rejectedowner refused (proposal.reject)
withdrawnthe agent (or owner) dropped it (proposal.withdraw)
expiredthe open-idle or submitted window lapsed

Item statuses: pending → applied, or stale (preview drift), failed (execution error), skipped (owner's proposal.item.skip). A proposal holds at most 500 items (proposalMaxItems).

Preview-hash drift

At record time the item stores its dry-run preview and sha256(canonicalJson(preview)). At apply, each item is re-previewed against the current world and the hashes must match; design items additionally require the workspace hash unchanged and liveSeq === baseSeq. A mismatch means the world moved under the proposal (a price edited, an order shipped, the live design advanced): the item goes stale with the current preview attached, the proposal paused. The owner skips the item or re-approves to accept the new preview; POST /v1/proposals/{prp}/devam resumes.

Apply semantics

Generated from the live platform registries at build time — reference pages cannot go stale. Markdown variant: /reference/proposals.md