Skip to content

Rulings and the Agreements ledger

A Ruling is a dated, citable record of an operator agreement. It preserves the operator's words exactly; it is not a setting, a Ticket, or a Request.

Why it exists

Teams need to point at the exact agreement that governed a later choice. Editing a note destroys what was actually agreed. Ctower therefore gives each Ruling a stable UUID, server timestamp, project-seat attribution, exact UTF-8 bytes, and digest.

Correction means append

A Ruling is never edited or deleted. If an agreement changes, append a new Ruling with --supersedes set to the old Ruling ID. Reads then show the predecessor on the new fact and the successor on the old fact. Both wordings remain citable.

old Ruling ──superseded by──> new Ruling
    │                              │
 exact words remain          new exact words

Only an existing active project seat can append. Tenant, Project, principal, and seat are derived from the authenticated credential; the payload cannot claim them. An identity that is not a project seat receives ruling-seat-not-found, and ctower creates no identity for it.

Reading honestly

Only off-host-accepted Rulings appear in ruling list or ruling get. The list names requested, answered, and unanswered Projects and carries the Record watermark. It sorts newest first by server date and then by stable ID. A pending append is not silently treated as an agreement.

Answering a Request decision

A Ruling may answer a Request that currently needs an operator decision. Pass the Request UUID with --request-id; ctower verifies the same tenant and Project and stores the relation as part of the immutable Ruling. Internally, the root is bound to the exact latest accepted active decision blocker fact, so a later decision marker opens a new answerable occurrence instead of reusing stale judgment. The Request brief then cites that Ruling, and Ruling reads show both request_id and the permanent R<number> reference.

Do not combine --request-id with --supersedes. A correction names only its predecessor and inherits that predecessor's Request and decision-occurrence relation. A pending Ruling does not answer the accepted Request read.

Use the CLI reference for exact commands and the HTTP API reference for generated operations.