Repository navigation
Description
Ruling: Session B close-out §3 question 5 (docs/sessions/2026-10-session-b.md), ruled 5 October 2026 in two parts:
- "Revocation is the remedy. A validly revoked acceptance raises no
L011,L012orA006of its own." - Widened the same day: "a valid revocation by the genesis holder may retire any landed entity that fails
L011orA006, not only an acceptance."
Both are recorded in docs/signing-rulings-2026-10.md, "Session B close-out (ruled 2026-10-05)".
Spec: docs/ledger-format-v1.md §3.9.2 (the two revocation shapes), §3.10.4 (signable entities), §3.10.5 (bindings, D7), §3.10.6 ("Closed keys") and §3.10.7 (A006, landed entities immutable). Size: L. It was M before the widening; the acceptance part alone stays M. Depends on: #92 (merged); #82 for anything that signs a grant's revocation. Must land: before R1, at least the acceptance part.
Why
A landed entity cannot be edited or removed (L007, §3.10.7). So an entity that fails L011 or A006 fails for good, unless something later retires it.
#92's inbox lists acceptances that fail L011 against the base as fails-on-base, and offers no remedy. Re-accepting does not help, because the failing acceptance stays in the log.
What "valid" means
The revocation (or the retiring act, where a revocation is not enough):
- passes its own checks: its signature where the policy in force requires one (
L011), and its role check as of its position (A006); - lands no earlier than the entity it retires.
A retiring act that fails its own checks retires nothing.
Today an invalid revocation still takes effect. verify::view::View puts every revocation's acceptance in revoked, whatever the revocation's own findings. The PR states whether "retires nothing" also means "revokes nothing", which changes current behaviour.
Per kind: what retiring means, and whether a revocation is enough
| Kind | Can fail | What retiring means | Is a revocation enough today? |
|---|---|---|---|
| Acceptance | L011, L012, A006 |
It stops counting: the decision's version is awaiting acceptance again unless another valid acceptance signs it, and its own L011/L012/A006 stand down. The record stays, as history. |
Yes, by its actor. rev: with revokes: acc:… exists, and Author::revoke files and signs it. By the genesis holder on someone else's acceptance: not today. revoke is checked as Act::RevokeAcceptance under the policy's accept_role (acceptance_ops.rs, decision_authority), and policy set refuses the genesis role as accept_role. So the genesis holder qualifies only by also holding an accept_role grant. Question A. |
Revocation, rev: entity shape (format 6+, revokes an acceptance or a grant) |
L011 (of an acceptance's revocation), A006 |
Its own finding stands down. Whether what it revoked comes back is Question B. | No. Revocable (authority/revocation.rs) has only Grant and Acceptance, so a revocation cannot name a revocation. Adding rev: as a target is a format change (§3.9.2, ledger.revocation.v1's revokes). Question B. |
Revocation, legacy shape (formats 1–5, {acceptance, at, by, reason}, no id) |
Neither, as built. It has no ULID, so it cannot carry a sidecar, and signing::subject::subjects skips it (is_entity()). A006 covers only acceptances and rev: revocations. |
Nothing to retire under this ruling. | Not applicable. Even if the need arose, a revocation could not name one: it has no id, and is keyed by the acceptance it revokes (landed::revocation_key). Question C asks whether a legacy-shape revocation filed after its namespace's first policy should be a fault. |
| Key binding | L011 (its required signature); D7 filing faults are schema faults |
It is not trusted, and does not reach allowed_signers (already true of a failing binding). Its own L011 stands down. |
No rev: revocation exists for a binding. The binding-level close is identity revoke, which D7 already lets the genesis holder file (authority/filing.rs: act == BindingAct::Revoke && by_genesis). Whether that close counts as retiring, and clears the closed binding's own L011, is Question D. |
Policy change (replaces present) |
L011 (signed under the policy it replaces, D1) |
Its own L011 stands down. Whether it stays in force is Question E. |
No. A policy cannot be removed (opting in is one-way, L007), and Revocable cannot name pol:. The existing mechanism is a later policy change that replaces it. Question E. |
Questions for the principal
- A. The genesis holder revoking another actor's acceptance. Options: (a) a new act (for example
RetireEntity) authorised by the genesis grant; (b) grant the genesis holder the accept role in every governed namespace; (c) only the acceptance's actor may retire it. - B. Retiring a
rev:revocation. Shouldrevokesacceptrev:…(a format change)? If so, does the revoked acceptance or grant come back, or does retiring only silence the failing revocation's own finding? Bringing it back would make a revocation reversible, which the format's "a reversal is a revocation" never allowed. - C. A legacy-shape revocation filed after its namespace's first policy. It cannot be signed, and nothing checks it. Should it be a schema fault from the policy's position on?
- D. Key bindings. Is the genesis holder's
identity revokeof a failing binding the retiring act, and does it clear that binding's ownL011? Or is arev:overkey:…wanted (a format change)? - E. Policy changes. Does a policy change that fails
L011stay in force? Today its ownL011is reported, and the PR must establish whetherAuthority::policystill reads it. Is a later validreplacesthe retiring act, and does it clear the failing change'sL011? Or is arev:overpol:…wanted (a format change)?
Proposed direction, not ruled
From the principal, 5 October 2026. This is a direction for the questions above, not a ruling.
- An act that fails its own checks takes no effect. An invalid revocation revokes nothing. This changes current behaviour: today
verify::view::Viewmarks the acceptance revoked whatever the revocation's own findings (see "What valid means"). - Retiring is one act, made only by the genesis holder and signed. It names one failing landed entity, of any kind (acceptance, either revocation shape, key binding, policy change), and silences that entity's findings. It cannot target an entity that passes its checks. This would answer A–E with one mechanism instead of a revocation per kind.
- This is a format addition and needs a ruling. It adds a new entity (or a new
revokestarget) with its own payload and prefix, its signer (the genesis holder) and its role check. That goes in the format document §3.9–§3.10, with a migration note. No class is added. - The legacy revocation shape has no id. Naming one for retirement would need the key
landed::revocation_keyalready uses (the acceptance it revokes).
- This is a format addition and needs a ruling. It adds a new entity (or a new
- Revoking a valid acceptance stays with the policy's
accept_role, as today (Act::RevokeAcceptance). The genesis holder's act in (2) only retires what fails.
What to build once the questions are ruled
- The rule in
verify: a retired entity raises noL011,L012orA006of its own. The retiring act is judged by its own checks. - The inbox offers revoke and re-accept for
fails-on-baseitems, in one sitting, at a terminal. The PR chooses and states one of:- (a) the batch file gains an act per row (
accept|revoke). That changesledger.acceptance-batch.v1(§3.10.9), needs a format note, and the manifest must cover the act; - (b) the inbox runs
ledger revokeper item before the batch, each with its own terminal-gated confirmation.
- (a) the batch file gains an act per row (
- Format document and migration note in the same PR. The conditions under which
L011/L012/A006fire change, but no class is added. State whether any committed store's verdict moves.
Tests (per kind ruled in)
- Acceptance: an acceptance failing
L011on the base, validly revoked by its actor, givesverify --basegreen, and the re-acceptance verifies. The same holds forL012past the deadline, and forA006. The genesis holder's revocation behaves as Question A rules. - An invalid retiring act (unsigned where required, or by an actor who fails
A006) leaves the original finding standing, and its own finding is reported. rev:revocation, key binding, policy change: as ruled under B, D and E.- The inbox: a
fails-on-baseitem is revoked and re-accepted in one sitting, and the branch is green.
Metadata
Metadata
Assignees
Labels
Type
Fields
Priority
Effort
Progress
Activity
[-]A valid revocation clears the findings of the acceptance it revokes; the inbox offers revoke and re-accept[/-][+]Retiring a landed entity that fails `L011` or `A006`, by a valid revocation; the inbox offers revoke and re-accept[/+]ledger inbox: push when signing introduced no finding
Hafeok commentedon Nov 3, 2026
Closed as not carried under D1.24`` and the definition's chapter 8:``` the Rust tool is frozen at
rust-finaland its tree left `main` in #166 (`53bd547`). This concerns the Rust ledger (its keys, namespaces or authority), which is Writ's authority graph now. The rewrite holds no key and no grant, and `writ import` reads `.decisions/` once, at the tag. Disposition approved on #165.Generated by Claude Code