Multi-Party Quorum Authorization for High-Risk Agent Actions (EP-QUORUM)
draft-schrock-ep-quorum-04
This document is an Internet-Draft (I-D).
Anyone may submit an I-D to the IETF.
This I-D is not endorsed by the IETF and has no formal standing in the
IETF standards process.
| Document | Type | Active Internet-Draft (individual) | |
|---|---|---|---|
| Author | Iman Schrock | ||
| Last updated | 2026-09-06 | ||
| RFC stream | (None) | ||
| Intended RFC status | (None) | ||
| Formats | |||
| Additional resources |
GitHub Organization
ORCID Apache-2.0 reference implementation, conformance suite, and formal models EMILIA Quorum — multi-party two-person-rule for AI-agent actions EP-QUORUM-v1 cross-language conformance vectors — JS/Python/Go offline authorization-receipt + quorum verifier, npm where the EP work is discussed |
||
| Stream | Stream state | (No stream defined) | |
| Consensus boilerplate | Unknown | ||
| RFC Editor Note | (None) | ||
| IESG | IESG state | I-D Exists | |
| Telechat date | (None) | ||
| Responsible AD | (None) | ||
| Send notices to | (None) |
draft-schrock-ep-quorum-04
Network Working Group I. Schrock
Internet-Draft EMILIA Protocol, Inc.
Intended status: Informational 6 September 2026
Expires: 10 March 2027
Multi-Party Quorum Authorization for High-Risk Agent Actions (EP-QUORUM)
draft-schrock-ep-quorum-04
Abstract
This document defines a multi-party approval predicate over action-
bound human signoffs: valid signatures, admitted roles, distinct
approvers and keys, threshold, and an optional ordered trail. The
relying party pins the governing policy and approver directory
independently. Passing the predicate is approval evidence, not a
complete authorization decision, proof of execution, or proof of
unused authority.
This revision repairs the strong ordered profile. A successor signs
a digest of the completed predecessor signoff, including its
signature, rather than a precomputable context. The versioned
profile establishes causal dependence on a completed prior proof
under the cryptographic assumptions; it does not establish trusted
wall-clock time or human comprehension. Legacy context-only chains
cannot satisfy it. JavaScript, Python, and Go reference verifiers
share a corpus in one repository. Agreement is a same-team
consistency check, not independent interoperability evidence or a
formal proof of the new construction.
Status of This Memo
This Internet-Draft is submitted in full conformance with the
provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
This Internet-Draft will expire on 10 March 2027.
Schrock Expires 10 March 2027 [Page 1]
Internet-Draft EP Multi-Party Quorum September 2026
Copyright Notice
Copyright (c) 2026 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents (https://trustee.ietf.org/
license-info) in effect on the date of publication of this document.
Please review these documents carefully, as they describe your rights
and restrictions with respect to this document. Code Components
extracted from this document must include Revised BSD License text as
described in Section 4.e of the Trust Legal Provisions and are
provided without warranty as described in the Revised BSD License.
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1. Design Goals . . . . . . . . . . . . . . . . . . . . . . 3
2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4
3. The Quorum Policy . . . . . . . . . . . . . . . . . . . . . . 5
4. Approval Modes . . . . . . . . . . . . . . . . . . . . . . . 7
4.1. Migration from context-only links . . . . . . . . . . . . 8
5. The Quorum Gate (fail-closed predicate) . . . . . . . . . . . 8
6. Incremental Admission (canAccept) . . . . . . . . . . . . . . 10
7. Multi-Handshake Composition . . . . . . . . . . . . . . . . . 11
8. Member Representation in the Receipt . . . . . . . . . . . . 12
9. Conformance . . . . . . . . . . . . . . . . . . . . . . . . . 13
10. Security Considerations . . . . . . . . . . . . . . . . . . . 15
10.1. What multi-party authorization does and does not
prevent . . . . . . . . . . . . . . . . . . . . . . . . 15
10.2. Fail-closed is the only safe default . . . . . . . . . . 16
10.3. Partial trails confer no authority . . . . . . . . . . . 16
10.4. Window and replay . . . . . . . . . . . . . . . . . . . 16
10.5. Divide-and-misinform across members . . . . . . . . . . 16
10.6. Approver fatigue, at quorum scale . . . . . . . . . . . 17
10.7. Rubber-stamping and review-latency evidence . . . . . . 17
10.8. Human quorum is not threshold secret custody . . . . . . 17
11. Changes from -03 . . . . . . . . . . . . . . . . . . . . . . 18
12. Changes from -02 . . . . . . . . . . . . . . . . . . . . . . 18
13. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 18
14. Normative References . . . . . . . . . . . . . . . . . . . . 18
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 19
Schrock Expires 10 March 2027 [Page 2]
Internet-Draft EP Multi-Party Quorum September 2026
1. Introduction
The base EP authorization receipt closes the gap between "is this
actor authorized in general?" and "should this exact action happen,
and which accountable human said yes?" by binding one named
approver's device-held signature to one exact action (see
[EP-RECEIPTS]). For the highest-consequence actions, one approver is
not the right control. The discipline that governs nuclear release,
large-value treasury movement, and production-credential change is
the _two-person rule_: no single human -- however well-authenticated,
however senior -- can unilaterally cause the action. Two or more
distinct, accountable humans must each independently authorize, and
the action proceeds only when all of them have.
As autonomous agents acquire credentials sufficient for irreversible
operations, the two-person rule is exactly the control that lets an
organization grant an agent real authority without creating a single
point of failure: a compromised, misaligned, or prompt-injected agent
cannot act alone, and neither can a single compromised or coerced
approver. EP-QUORUM specifies how to express that control as a
cryptographic predicate over EP signoffs and how to enforce it both
at the moment each approver signs and at the moment the action would
execute.
The base draft already contemplates multi-approver policies
([EP-RECEIPTS]): each approver signs an individual Authorization
Context sharing the same action hash, and commitment occurs only when
k valid, distinct signoffs exist before expiry. This document makes
that sketch normative and testable. It adds: ordered approval trails
(Section 4); an explicit role roster and admission semantics
(Section 3); a bounded approval window with an asserted-time
consistency constraint for ordered mode (Section 4); an incremental
server-side admission rule that keeps a non-conforming signer out of
the trail in the first place (Section 6); the consolidated fail-
closed quorum predicate (Section 5); and an adversarial conformance
suite (Section 9).
1.1. Design Goals
EP-QUORUM inherits design goals G1-G7 of the base draft and adds:
* *Q1 -- Additivity.* A quorum is a set of native signoffs over the
same action hash. No new signature algorithm is introduced. The
completed-signoff chain is an explicit signed-context profile
extension; it does not silently extend a closed base receipt
schema. A single-approver policy is the one-member quorum.
Schrock Expires 10 March 2027 [Page 3]
Internet-Draft EP Multi-Party Quorum September 2026
* *Q2 -- Fail-closed.* The quorum predicate is not satisfied unless
_every_ element of the predicate holds. Absence of evidence, an
unparseable member, a malformed policy, or any single failed check
yields "not satisfied," never "satisfied."
* *Q3 -- Distinctness (separation of duties at the human level).* A
quorum of size k requires k pairwise-distinct human approvers,
each distinct from the initiator. One human MUST NOT fill two
slots.
* *Q4 -- Incremental enforcement.* The protocol enforces conformance
as each approver signs, not only at consume time, so that a wrong-
action, wrong-role, duplicate, out-of-order, stale, or invalid
signature never becomes part of the trail.
* *Q5 -- Offline-verifiable quorum.* The satisfied/not-satisfied
judgment is computable from the receipt's members and the policy
alone, under the same offline verification model as the base draft
([EP-RECEIPTS]).
2. Terminology
In addition to the terminology of [EP-RECEIPTS]:
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in BCP
14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here.
Quorum. The set of distinct approver signoffs required to satisfy
one human-authorization evidence requirement for an action under a
Quorum Policy.
Quorum Policy. A named, versioned rule set declaring the approval
mode, the required count, the roster of eligible (role, approver)
slots, the distinct-humans rule, and the approval window. Carried
in the policy that governs the action; see Section 3.
Member. One element of a candidate quorum: a (role, approver public
key, signoff) triple, where the native signoff uses the
verification machinery of [EP-RECEIPTS] over the Authorization
Context the approver signed.
Trail. The ordered sequence of members admitted so far for one
action -- the partial quorum under construction.
Quorum Gate. The fail-closed predicate (Section 5) that decides
Schrock Expires 10 March 2027 [Page 4]
Internet-Draft EP Multi-Party Quorum September 2026
whether a trail is a satisfied quorum. The Verifying Executor
([EP-RECEIPTS]) MUST consult it before performing the action.
3. The Quorum Policy
A Quorum Policy is a JSON object:
{
"mode": "ordered",
"required": 3,
"approvers": [
{
"role": "program_officer",
"approver": "ep:approver:po_rivera"
},
{
"role": "authorizing_official",
"approver": "ep:approver:ao_chen"
},
{
"role": "inspector_general",
"approver": "ep:approver:ig_okafor"
}
],
"distinct_humans": true,
"window_sec": 900
}
Members:
+=======================+===============+=======+===================+
| Field | Required |Type | Meaning |
+=======================+===============+=======+===================+
| mode | REQUIRED |string | threshold or |
| | |(enum) | ordered |
| | | | (Section 4). |
+-----------------------+---------------+-------+-------------------+
| required | REQUIRED |integer| The quorum size |
| | |>= 1 | k. |
+-----------------------+---------------+-------+-------------------+
| approvers | REQUIRED |array | The roster of |
| | | | eligible {role, |
| | | | approver} |
| | | | slots. MUST be |
| | | | non-empty. |
+-----------------------+---------------+-------+-------------------+
| distinct_humans | OPTIONAL |boolean| When true, no |
| | (default | | approver |
Schrock Expires 10 March 2027 [Page 5]
Internet-Draft EP Multi-Party Quorum September 2026
| | true) | | identifier may |
| | | | fill more than |
| | | | one slot. |
| | | | Device-key |
| | | | distinctness is |
| | | | unconditional |
| | | | (Section 5, |
| | | | checks 5 and |
| | | | 5a). |
| | | | Implementations |
| | | | MUST treat a |
| | | | missing value |
| | | | as true. |
+-----------------------+---------------+-------+-------------------+
| window_sec | OPTIONAL |integer| Maximum span, |
| | (default 900) |> 0 | in seconds, |
| | | | between the |
| | | | first and any |
| | | | later admitted |
| | | | signature. |
+-----------------------+---------------+-------+-------------------+
| ordered_chain | OPTIONAL |boolean| When true in |
| | (default | | ordered mode, |
| | false) | | requires the |
| | | | completed- |
| | | | signoff chain |
| | | | in Section 4. |
| | | | Context-only |
| | | | links do not |
| | | | satisfy this |
| | | | requirement. |
+-----------------------+---------------+-------+-------------------+
| ordered_chain_profile | Required when |string | Exactly EP- |
| | ordered_chain | | QUORUM-SIGNOFF- |
| | is true | | CHAIN-v1. A |
| | | | missing or |
| | | | unrecognized |
| | | | profile fails |
| | | | the strong- |
| | | | chain check. |
+-----------------------+---------------+-------+-------------------+
Table 1
Rules:
Schrock Expires 10 March 2027 [Page 6]
Internet-Draft EP Multi-Party Quorum September 2026
* An approver slot identifies an eligible approver in the Approver
Directory ([EP-RECEIPTS]). The role is the organizational role
under which that approver is admitted to this quorum; it is the
unit of role eligibility (Section 5, check 4).
* A member is admitted only if its (role, approver) pair is present
in the roster. A correct signature by a real, enrolled approver
who is not on the roster for this action MUST be rejected
(wrong_role).
* required MUST NOT exceed the number of distinct human approvers
the roster can supply under distinct_humans. A policy that cannot
be satisfied is a misconfiguration; verifiers treat an
unsatisfiable trail as not satisfied, as always.
* The Quorum Policy is part of the action's governing policy and is
therefore committed by the policy_hash of every member's
Authorization Context ([EP-RECEIPTS]). A signature collected
under one Quorum Policy version MUST NOT satisfy a requirement
evaluated under another. The relying party MUST obtain the
complete expected policy, including the chain profile, from an
authenticated source outside the supplied quorum. It MUST reject
a mismatching supplied policy before crediting the quorum; a
matching artifact-supplied policy is not itself an authority
source.
4. Approval Modes
*Threshold mode.* Any required distinct eligible approvers satisfy
the count requirement. Presentation order has no causal meaning.
*Plain ordered mode.* Each presented member matches the corresponding
roster slot in role and approver. The number presented is at least
required and no greater than the roster size. Thus ordered k-of-n
admits the first k slots, not automatically all n. Presented
issued_at values MUST strictly increase and their span MUST fit
window_sec. These are checks on asserted metadata, not proof of
actual signing order or trusted elapsed time.
*Completed-signoff chain.* A relying party requiring causal
dependence between approvals MUST pin mode: "ordered", ordered_chain:
true, and ordered_chain_profile: "EP-QUORUM-SIGNOFF-CHAIN-v1" in the
governing policy. It MUST NOT infer this requirement from whichever
fields the supplied artifact happens to retain.
Let S[i] be the complete predecessor signoff JSON object, including
its signed context and native proof fields, with the actual signature
encoded exactly as carried. Define:
Schrock Expires 10 March 2027 [Page 7]
Internet-Draft EP Multi-Party Quorum September 2026
D = UTF8("EP-QUORUM-SIGNOFF-CHAIN-v1") || 0x00
link(S) = lowercase_hex(SHA-256(D || UTF8(JCS(S))))
JCS is the JSON Canonicalization Scheme [RFC8785]. The separator is
one zero octet, not printable backslash and zero. Hash the complete
signoff, not the member wrapper, the predecessor context alone, or a
reconstructed proof that drops fields.
The first signed context MUST omit prev_signoff_hash. Each successor
signed context MUST carry prev_signoff_hash = link(S[i-1]). Every
context MUST omit the legacy prev_context_hash field; mixed links and
a null first predecessor are invalid. Every native signature and the
full quorum predicate MUST also verify. A digest match alone is
insufficient.
The successor challenge depends on a completed predecessor proof, not
merely its public context. Substituting a different valid
predecessor signature over the same context changes the link and
requires a new successor signature. This establishes a dependency
between proof artifacts under signature-unforgeability and hash
preimage/collision-resistance assumptions. It does not identify a
trusted signing time, establish that the human saw the prior proof,
or prove understanding or voluntary approval.
4.1. Migration from context-only links
Revisions through -03 used prev_context_hash. All such contexts can
be prepared before any predecessor signs, then signed in reverse
order and presented in roster order. They do not prove the causal
property previously claimed. Under this revision's strong
requirement a verifier MUST reject missing or unknown profiles and
every context-only chain, even when all member signatures verify.
An existing chain MUST NOT be upgraded by changing its policy label
or inserting unsigned hashes. Fresh contexts and signatures are
required. Historical evidence may be evaluated under an explicitly
permitted weaker threshold or plain ordered policy, but MUST NOT be
credited as a completed-signoff chain. This compatibility break does
not change the native signature algorithms or threshold checks.
5. The Quorum Gate (fail-closed predicate)
A trail is a *satisfied quorum* for an action with hash H under
policy P if and only if ALL of the following hold. A verifier MUST
return "satisfied" only when every check passes, and MUST return "not
satisfied" on the first failure, on a malformed policy or member, or
on any unrecognized condition (Q2):
Schrock Expires 10 March 2027 [Page 8]
Internet-Draft EP Multi-Party Quorum September 2026
1. *Well-formed policy.* P has a recognized mode, an integer
required >= 1, and a non-empty approvers roster. Otherwise: not
satisfied.
2. *All signatures valid.* For every member, the EP signoff
verifies under [EP-RECEIPTS] -- the WebAuthn [WEBAUTHN]
assertion (Class A) verifies against the member's
approver_public_key, with the assertion challenge equal to the
member's context hash and user verification asserted. One
invalid signature (one_bad_signature) fails the whole quorum.
3. *Action binding.* Every member's Authorization Context carries
action_hash == H (action_mismatch). A member bound to any other
action does not count.
4. *Role admission.* Every member's (role, approver) pair is
present in the roster (wrong_role).
5. *Distinct humans.* When distinct_humans is true (the default),
approvers are pairwise distinct and (per the base draft's
SelfApprovalImpossible) distinct from the initiator
(duplicate_human).
6. *Distinct keys (check 5a).* Regardless of distinct_humans, the
admitted members' canonically decoded approver_public_key values
are pairwise distinct (duplicate_key). This defends against a
single device key enrolled under two approver identifiers, which
would otherwise pass the distinct-humans check by name while
being one signer.
7. *Threshold.* At least required admitted members exist
(under_threshold).
8. *Order (ordered mode only).* The i-th admitted member matches
approvers[i-1]; signature times are strictly increasing
(out_of_order, non_increasing_time).
9. *Ordering chain (strong ordered mode only, check 7a).* When
ordered_chain is true, the exact pinned profile and every
completed-signoff link satisfy Section 4 (broken_chain). A
missing or unknown profile, a legacy link, a null first link, or
a substituted predecessor proof fails. When ordered_chain is
false this check supplies no causal claim.
10. *Window.* Every admitted member's issued_at is within window_sec
of the first member's issued_at (window_exceeded).
Schrock Expires 10 March 2027 [Page 9]
Internet-Draft EP Multi-Party Quorum September 2026
The predicate is the same whether computed by the orchestrating
operator before consumption or by an independent Verifying Executor
or auditor offline (Q5): it is a pure function of (P, H, members).
Organizational acceptance additionally requires that P, H, and the
approver directory are authenticated inputs, not arbitrary values
chosen by the artifact supplier. Check 2 invokes the appropriate
native signoff verifier per member; EP-QUORUM adds the set-level
checks. A successful standalone wrapper check does not substitute
for a carrier's own schema and signature requirements (Section 8).
6. Incremental Admission (canAccept)
To keep a non-conforming signer out of the trail rather than
discovering it only at consume time (Q4), an orchestrator MUST
evaluate an incremental admission rule before recording each new
signoff. Given the policy P, the action hash H, the already-admitted
trail, and one incoming candidate member, the rule ADMITS the
candidate only if all of the following hold, and otherwise REJECTS it
with the named reason:
1. P is well-formed and its roster is non-empty (else no_policy /
no_eligible_approvers).
2. The candidate's context carries action_hash == H (else
action_mismatch).
3. The candidate's (role, approver) is on the roster (else
ineligible_role).
4. When distinct_humans is true, no already-admitted member shares
the candidate's approver (else duplicate_human).
5. In ordered mode, the candidate matches the next unfilled roster
slot (approvers[len(trail)]) in both role and approver (else
out_of_order).
6. If the trail is non-empty, the candidate's issued_at is within
window_sec of the first member's issued_at (else
window_exceeded); and in ordered mode it is strictly greater than
the last admitted member's issued_at (else non_increasing_time).
7. When strong ordering is required, the exact chain profile is
recognized and the incoming signed predecessor link satisfies
Section 4 against the last admitted complete signoff (else
unsupported_chain_profile / broken_chain).
8. The candidate's signature verifies (else invalid_signature).
Schrock Expires 10 March 2027 [Page 10]
Internet-Draft EP Multi-Party Quorum September 2026
A rejected candidate MUST NOT be written into the trail. Incremental
admission is an enforcement convenience and an early-rejection UX; it
is not a substitute for the Quorum Gate. A conforming Verifying
Executor MUST re-evaluate the full Quorum Gate (Section 5) over the
assembled trail before performing the action, regardless of
incremental admission, because the executor does not trust the
orchestrator to have applied admission honestly (this mirrors the
base draft's execution-side enforcement, [EP-RECEIPTS]).
7. Multi-Handshake Composition
This section is informative. It describes, end to end, the process
by which the normative machinery of Section 3 through Section 6
composes individual signing ceremonies into one multi-party decision.
Every property named here is required elsewhere in this document or
in the base draft; this section introduces no new requirements.
*The handshake is the unit of approval.* Each quorum member is one
complete run of the base draft's single-approver signing ceremony
([EP-RECEIPTS]): a fresh, one-time challenge is issued for that
approver against a verified handshake, bound to the exact action
bytes through the action hash and binding hash it commits to, and
bounded by an explicit validity window; the approver answers it with
a user-verified, device-held signature whose WebAuthn assertion
challenge is the member's context hash (the per-member requirement is
check 2 of the Quorum Gate, Section 5). Nothing about the ceremony
is weakened or amortized when the action needs several approvers:
there is no batch signature and no shared signing session; k
approvals are k separate ceremonies, each independently verifiable
and each independently refusable.
*Admission rejects known-invalid candidates early.* Composition is
incremental and server-side. Each candidate member is evaluated
against the admission rule of Section 6 before it is recorded, so a
wrong-action, off-roster, duplicate, out-of-order, stale, or
invalidly signed member handshake is refused at the moment it is
presented and never enters the trail. The stored trail has passed
the listed admission checks. This does not establish every final
set-level check or the authenticity of the supplied policy and
enrollment data. The Verifying Executor still re-evaluates the full
Quorum Gate over the assembled trail, as Section 6 requires,
precisely because it does not trust the orchestrator to have admitted
honestly.
*The next proof depends on the completed prior proof.* In the
versioned strong profile, a successor signs the digest of the
predecessor's complete signoff, including its actual signature. The
chain transitively commits to prior proof artifacts. It does not
Schrock Expires 10 March 2027 [Page 11]
Internet-Draft EP Multi-Party Quorum September 2026
establish trusted wall-clock order, backdating resistance, rendered
pixels, or comprehension. Plain ordered mode checks only roster
position and asserted timestamp consistency.
*Denial is a first-class terminal outcome.* Any approver in the trail
can refuse, and a refusal is not the mere absence of an approval.
Under the base draft a denial is signed over the same context hash
with a decision of "denied" and is terminal: a denied authorization
can never later become approved ([EP-RECEIPTS]). At the composition
level, one dissenting approver leaves durable, attributable evidence
of the dissent, which a relying party can weigh as adverse evidence
rather than as a gap in the trail.
*The composed decision is accepted at most once.* A satisfied quorum
is authorization evidence for one exact action and is consumable at
most once within its atomic consumption domain; the relying party
separately decides AUTHORIZED. Each member's signoff individually
retains the base draft's one-time-consumption rule (Section 10.4),
and consumption of the composed decision is refused until the Quorum
Gate is satisfied; a partial trail confers no partial authority
(Section 10.3).
*The whole composition is verifiable offline.* Because the satisfied/
not-satisfied judgment is a pure function of the policy, the action
hash, and the members (Section 5, Q5), an auditor holding the members
and authenticated policy and enrollment material can recompute the
checks -- per-member signatures, action binding, distinctness of
humans and keys, roster admission, threshold, order and ordering
chain, and window -- without contacting the operator. As in the base
draft, such offline verification establishes integrity relative to
the pinned keys and policy, not a trusted signing time; it does not
by itself establish current validity, such as the present enrollment
or revocation status of the approvers involved.
8. Member Representation in the Receipt
The quorum computation uses native signoffs, an authenticated action
hash, an independently pinned policy, and enrolled approver keys.
The following is the repository's standalone member wrapper. It is
not an instruction to add an inline policy or other extension to the
closed Trust Receipt schema of [EP-RECEIPTS]. A carrier profile
using a base receipt MUST preserve that carrier's extension rules and
authenticate any external policy or member mapping. The completed-
signoff chain is an explicit signed context profile, not a claim that
this wrapper by itself conforms to every current base-receipt wire
requirement. Each member is the triple:
Schrock Expires 10 March 2027 [Page 12]
Internet-Draft EP Multi-Party Quorum September 2026
{
"role": "program_officer",
"approver_public_key": "<SPKI of the approver's enrolled key>",
"signoff": {
"@type": "ep.signoff",
"context": {
"context_type": "ep.signoff.v1",
"action_hash": "...",
"approver": "...",
"issued_at": "...",
"...": "..."
},
"webauthn": {
"authenticator_data": "...",
"client_data_json": "...",
"signature": "..."
}
}
}
The context and webauthn members are exactly as verified by the
native signoff verifier. The new chain adds a domain-separated hash
over the complete prior signoff without changing the native signature
algorithm. The role and approver_public_key are the join keys
against the Quorum Policy roster and the Approver Directory.
9. Conformance
An implementation conforms to EP-QUORUM if, for the published
adversarial conformance vectors, it returns the expected satisfied/
not-satisfied verdict for every vector and rejects every non-
conforming candidate at incremental admission with the expected
reason. The reference suite (EP-QUORUM-v1) comprises the following
vectors, each carrying real Class-A WebAuthn assertions:
Schrock Expires 10 March 2027 [Page 13]
Internet-Draft EP Multi-Party Quorum September 2026
+==========================+===========+========================+
| Vector | Expect | Exercises |
+==========================+===========+========================+
| accept_ordered_3of3 | satisfied | Ordered PO, AO, IG; |
| | | distinct; increasing |
| | | time; all action-bound |
+--------------------------+-----------+------------------------+
| accept_threshold_2of3 | satisfied | Any 2 distinct |
| | | approvers from a |
| | | 3-slot roster |
+--------------------------+-----------+------------------------+
| reject_under_threshold | not | Fewer than required |
| | satisfied | valid members |
+--------------------------+-----------+------------------------+
| reject_duplicate_human | not | One human filling two |
| | satisfied | slots |
+--------------------------+-----------+------------------------+
| reject_out_of_order | not | Ordered mode, members |
| | satisfied | out of roster order |
+--------------------------+-----------+------------------------+
| reject_action_mismatch | not | A member bound to a |
| | satisfied | different action hash |
+--------------------------+-----------+------------------------+
| reject_expired_window | not | A member outside |
| | satisfied | window_sec |
+--------------------------+-----------+------------------------+
| reject_one_bad_signature | not | One invalid member |
| | satisfied | signature |
+--------------------------+-----------+------------------------+
| reject_wrong_role | not | A correct signature by |
| | satisfied | an off-roster approver |
+--------------------------+-----------+------------------------+
| reject_duplicate_key | not | One device key signing |
| | satisfied | under two approver |
| | | identifiers (check 5a) |
+--------------------------+-----------+------------------------+
| reject_broken_chain | not | Strong ordered mode, a |
| | satisfied | member committing to |
| | | the wrong completed |
| | | predecessor signoff |
| | | hash (check 7a) |
+--------------------------+-----------+------------------------+
Table 2
The reference suite is maintained such that three cross-language
reference verifiers (JavaScript, Python, Go), which share one
repository and are therefore a consistency check rather than clean-
Schrock Expires 10 March 2027 [Page 14]
Internet-Draft EP Multi-Party Quorum September 2026
room independent implementations, MUST agree on every vector;
divergence is a conformance defect in at least one verifier.
Independent implementations remain future interoperability evidence.
The "accept" vectors guard against a verifier that is too strict
(denying valid quorums); the "reject" vectors guard against a
verifier that is too lenient (the security-critical direction).
The updated corpus additionally includes an ordered 2-of-3 positive,
reverse-signed context-only chains with and without the new profile
label, missing and unknown profiles, and a null first predecessor.
Unit tests separately exercise substitution of a different valid
predecessor signature, stripping or mutation of an expected policy,
and incremental admission. The corpus version is 1.1.0.
Earlier symbolic evidence over a fixed 2-of-2 instance does not
establish the new completed-signoff construction. No formal proof of
this revision's causal-chain profile is claimed. Neither old
symbolic results nor same-team cross-language tests prove general
k-of-n security, WebAuthn internals, directory correctness, parser
behavior, collusion resistance, human comprehension, or deployment
behavior.
10. Security Considerations
EP-QUORUM inherits all Security Considerations of [EP-RECEIPTS] and
adds the following. Several restate, honestly, what a quorum does
_not_ buy.
10.1. What multi-party authorization does and does not prevent
With authenticated enrollment and policy inputs, a satisfied
distinct-human quorum establishes valid, action-bound signatures
under k distinct enrolled keys and the declared quorum checks.
Timestamp checks apply to asserted values; only the completed-signoff
profile adds causal proof dependence. Under the signature
assumptions the orchestrator cannot forge an uncompromised approver's
signature ([EP-RECEIPTS]). It raises the cost of unilateral action:
a single compromised agent, a single stolen key, a single coerced or
malicious approver is insufficient. It does _not_ defeat collusion
among the required number of distinct humans, nor one human who
controls multiple enrolled identities (an enrollment control -- the
base draft's Approver Directory requirements), nor simultaneous
coercion of a full quorum. As in the base draft, EP-QUORUM makes
such events _attributable_ -- named, signed, and evidenced for every
member -- which is a deterrent and an audit primitive, not an
impossibility proof. Implementations MUST NOT claim a quorum is
collusion-proof.
Schrock Expires 10 March 2027 [Page 15]
Internet-Draft EP Multi-Party Quorum September 2026
10.2. Fail-closed is the only safe default
The dangerous error in a multi-party gate is to treat ambiguity as
approval. EP-QUORUM is specified so that a malformed policy, a
missing or unparseable member, a partial trail, or any single failed
check yields "not satisfied." A verifier MUST NOT default to
satisfied on any unrecognized condition. The "reject" conformance
vectors exist to catch a regression in this direction.
10.3. Partial trails confer no authority
A trail short of the threshold, or one in which incremental admission
has accepted some but not all required slots, authorizes nothing. A
Verifying Executor presented with a partial trail MUST refuse,
exactly as it refuses a missing single signoff. This is the multi-
party form of the base draft's NoBypassWrite invariant.
10.4. Window and replay
The approval window (window_sec) bounds how long a partial quorum
remains completable, limiting the value to an attacker of
compromising a _remaining_ approver after some approvals already
exist. Each member's signoff retains the base draft's one-time-
consumption nonce (G3); the window is an additional, quorum-level
constraint, not a substitute for per-signoff replay protection.
Comparing asserted timestamps does not prevent backdating or
establish freshness. The relying party separately enforces expiry, a
trusted current-time policy, and replay state. The completed-signoff
chain does not supply those properties.
10.5. Divide-and-misinform across members
Because each approver signs their own Authorization Context, a
malicious orchestrator can attempt to show different approvers
different renderings or different initiator attestations
([EP-RECEIPTS]) while each individual signature remains valid. EP-
QUORUM does not change the base draft's cross-context consistency
requirement; verifiers SHOULD surface per-member context differences,
and high-value ordered policies SHOULD render the prior approvers'
decisions to each subsequent approver so that the trail is a chain of
informed approvals rather than parallel ones. The presentation-
attack mitigations of the base draft's Security Considerations apply
per member.
Schrock Expires 10 March 2027 [Page 16]
Internet-Draft EP Multi-Party Quorum September 2026
10.6. Approver fatigue, at quorum scale
Requiring more humans does not help if each rubber-stamps; it can
hurt, by diffusing responsibility across a group in which no member
feels decisive (the base draft's Security Considerations). Quorum
policies MUST be scoped to genuinely high-consequence, low-frequency
actions, and deployments SHOULD monitor per-role time-to-sign and
deny rates rather than assume that more signers means more scrutiny.
10.7. Rubber-stamping and review-latency evidence
Signing-ceremony telemetry -- the times at which each member's
challenge was issued, first viewed, and approved -- SHOULD be
retained alongside the trail as evidence of how much review each
approval actually received. A relying party MAY apply a minimum-
review-latency policy when weighing an approval: an approval recorded
a very short interval after the challenge was first viewed is
evidence of rubber-stamping rather than review, and a relying party
may discount it or treat the bundle as containing conflicting
evidence accordingly. This raises the probability that rubber-
stamping is detected after the fact and makes it attributable to a
named approver; it does not prevent rubber-stamping, and it does not
defeat collusion or coercion, for which Section 10.1 applies.
Ceremony telemetry originates with the orchestrator, so a relying
party that depends on it should weigh unsigned telemetry with the
same skepticism as any other operator-supplied metadata; deployments
that need it to serve as evidence rather than log data can have the
operator sign the ceremony record so that its integrity is
independently checkable.
10.8. Human quorum is not threshold secret custody
EP-QUORUM verifies distinct enrolled approvers, action-bound
signatures, roles, order, and timing. Reconstructing a capability
holder secret from m-of-n shares proves only that enough shares were
combined. Unless each share holder separately performs the EP-QUORUM
ceremony, threshold reconstruction does not prove that distinct
humans reviewed or approved the action. Implementations and public
claims MUST NOT describe threshold secret custody as EP-QUORUM
authorization.
Schrock Expires 10 March 2027 [Page 17]
Internet-Draft EP Multi-Party Quorum September 2026
11. Changes from -03
Replaced the unsound context-only chronology claim with the versioned
EP-QUORUM-SIGNOFF-CHAIN-v1 completed-proof dependency profile.
Specified the domain-separated digest, first-member and mixed-link
rejection, authenticated policy pin, and explicit compatibility
break. Clarified ordered k-of-n, unconditional key distinctness,
asserted timestamp limits, carrier boundaries, and the absence of a
formal proof for the new chain.
12. Changes from -02
Clarified that EP-QUORUM's distinct-human, action-bound approval
ceremony is not interchangeable with m-of-n reconstruction of a
capability holder secret.
13. IANA Considerations
This document has no IANA actions.
14. Normative References
[EP-RECEIPTS]
Schrock, I., "Authorization Receipts for High-Risk Agent
Actions (EP)", Work in Progress, Internet-Draft, draft-
schrock-ep-authorization-receipts-12, 16 August 2026,
<https://datatracker.ietf.org/doc/html/draft-schrock-ep-
authorization-receipts-12>.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/info/rfc8174>.
[RFC8785] Rundgren, A., Jordan, B., and S. Erdtman, "JSON
Canonicalization Scheme (JCS)", RFC 8785,
DOI 10.17487/RFC8785, June 2020,
<https://www.rfc-editor.org/info/rfc8785>.
[WEBAUTHN] W3C, "Web Authentication: An API for accessing Public Key
Credentials, Level 2", April 2021,
<https://www.w3.org/TR/webauthn-2/>.
Schrock Expires 10 March 2027 [Page 18]
Internet-Draft EP Multi-Party Quorum September 2026
Author's Address
Iman Schrock
EMILIA Protocol, Inc.
United States of America
Email: team@emiliaprotocol.ai
Schrock Expires 10 March 2027 [Page 19]