RFP-005: Multisig and Coordination - #113
Conversation
- Fresh code and architecture: drop 'hardens the sample app' framing; the PoC stays as prior art in Resources only - Add value-in-custody figures (Safe US$60B+, Squads US$15B+, 2026-08-03) - Remove unassigned references (A-multisig, LD-private-dao, SA-public-multisig, RD-chat); keep LP-0002 only - Execution requirement specifies the what: run any arbitrary program in the given LEZ - RFP is self-contained: no references to the appendix - Settle decisions: private-by-default with auditability/transparency options (public posture, view-key selective disclosure, zk proof-of-holding soft req); approvals flow through the E2EE room - Revisit quorum-model decision per LEZ shared-private-account (GMS) properties: N-of-N key semantics, no revocation, program/PDA vs group-account vs threshold-crypto vault options - Appendix: cite original sources instead of the research vault; add custody figures, LEZ shared-private-account properties and treasury auditability configurations
Strip implementation detail from the requirements, keeping them to what is needed rather than how to achieve it. F.3 restored to "any arbitrary program", F.7 and F.8 to the bare requirement, and the mechanism prose removed from F.2, F.4, F.6, R.2 and P.2. Express auditability per use case: a corporate treasury needs a narrow audience, a DAO a wider one, and members joining later need current evidence rather than a setup-time claim. Added ongoing assurance as a requirement and left the disclosure mechanism to the implementer. U.2 is a QML mini-app without forcing a C++ backend. Removed the marclawclaw research reference; it is a data dump rather than a citable source. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Add the Multisig and Coordination RFP and its ecosystem-behaviour appendix, and register RFP-005 in the README index. The appendix (facts and observations only, product angle) leads with a data inventory: the ten distinct data/metadata items a multisig involves, whether each could be private on LEZ, and what existing multisigs (Safe, Squads, ERC-4337, Bitcoin script, FROST) do with it. It then covers the LEE public/private account model, the quorum-privacy spectrum, coordination channels and what each leaks, roles/policies, composition, and hardware support. Sourced from the research-multisig-sovereign vault. The RFP hardens the existing public multisig sample app (logos-co/lez-multisig) into production, adds an end-to-end-encrypted per-multisig coordination room via the Logos chat module, and ends with three A/B/C decisions for review: privacy posture, coordination channel, and quorum-model baseline. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Fresh code and architecture: drop 'hardens the sample app' framing; the PoC stays as prior art in Resources only - Add value-in-custody figures (Safe US$60B+, Squads US$15B+, 2026-08-03) - Remove unassigned references (A-multisig, LD-private-dao, SA-public-multisig, RD-chat); keep LP-0002 only - Execution requirement specifies the what: run any arbitrary program in the given LEZ - RFP is self-contained: no references to the appendix - Settle decisions: private-by-default with auditability/transparency options (public posture, view-key selective disclosure, zk proof-of-holding soft req); approvals flow through the E2EE room - Revisit quorum-model decision per LEZ shared-private-account (GMS) properties: N-of-N key semantics, no revocation, program/PDA vs group-account vs threshold-crypto vault options - Appendix: cite original sources instead of the research vault; add custody figures, LEZ shared-private-account properties and treasury auditability configurations
Verified every platform claim against the LEZ codebase and corrected the document where it diverged from reality. Vault architecture: the settled baseline claimed k-of-N enforcement lives at the program layer over a GMS-derived shared account. It does not. A regular GMS-derived account carries no program binding, so any single holder can spend it without the multisig program being invoked; such a multisig would be advisory, not enforcing. The baseline is now a private PDA derived under the multisig program's ID, where the one-way program_owner latch means only that program's verified execution can decrease the balance. What was Option A is now the baseline; the GMS is demoted to coordination and viewing. Corrected against source: - Private throughput is ~4 tx/block, not one; ~220 KiB receipts make block size the binding constraint, and proving costs minutes per transaction client-side. - No clock is readable from the private path. F.2, F.7 and F.8 must be built on timestamp validity windows. - Proof of holding needs a second purpose-built circuit that does not exist; demoted to a soft requirement. - The account nonce is an nsk-keyed hash chain, so R.2 replay binding must live in program account data. - Added the private-account padding ceiling, the pre-initialisation window, and the third PDA binding path needed for vault funding. - F.3 constrained to statically declared call graphs. Resolved the custody contradiction: neither model is unambiguously better, so both now state what they cost. All-members custody forfeits F.6 execute separability; operator custody forfeits the no-trusted-coordinator property. LP-0002 is an open, unclaimed prize to build a private M-of-N multisig, not a delivered capability, and its anonymous-approval design differs from R.1's attributed approvals. Corrected the dependency reason and added it to Resources as design-space reading. Also flagged that the lez-multisig prior art is incompatible with private accounts. Retier to XL to match the sixteen deliverables across five disciplines, and drop the unfilled funding placeholder. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Strip implementation detail from the requirements, keeping them to what is needed rather than how to achieve it. F.3 restored to "any arbitrary program", F.7 and F.8 to the bare requirement, and the mechanism prose removed from F.2, F.4, F.6, R.2 and P.2. Express auditability per use case: a corporate treasury needs a narrow audience, a DAO a wider one, and members joining later need current evidence rather than a setup-time claim. Added ongoing assurance as a requirement and left the disclosure mechanism to the implementer. U.2 is a QML mini-app without forcing a C++ backend. Removed the marclawclaw research reference; it is a data dump rather than a citable source. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
U.6 claimed to be the primary mitigation for the signing-layer attack surface, contradicting the Risks section, which correctly names the Logos module model: the UI is installed and verified once rather than fetched from a remote server on every use. U.6 is a complement to that, not a replacement. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The section had grown into a description of how LEZ works internally, which does not belong in an RFP. Reduced from 256 lines to a short list of the platform components a proposer must build on. State the components rather than their mechanics: LEZ private accounts, shared private accounts, the Logos chat module, and testnet compatibility. Using the chat module for the coordination room is now explicitly mandatory, and compatibility with Logos testnet 0.3 and 0.4 is stated here and in Supportability. Highlight the shared private account feature as something proposers must study and account for, noting only that it distributes custody rather than dividing it, without describing the derivation. Removed the corresponding internals from Decisions and Resources so the document no longer refers to mechanisms it no longer explains. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The requirement to use LEZ, the Logos chat module, and to be compatible with Logos testnet 0.3 and 0.4 belongs in FURPS as testable supportability requirements, not in a prose section. Added as S.1 to S.3 and renumbered the rest. Platform Dependencies now carries only what is not a requirement: that no end-to-end multi-party authorisation flow exists on LEZ yet, and that shared private accounts are a feature proposers should study. Removed the Signing-layer trust risk. Its content is already covered by U.6 and the Overview. Also removed references orphaned by the deletion of Decisions for Review: the custody-model qualifier in Why This Matters, the pointer in Timeline Expectations, and the custody wording in F.6. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Also drop references to platform constraints the RFP no longer describes from the phased-proposal note. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Every other RFP gained this note on master. RFP-005 is new on this branch so the rebase did not bring it in; copied verbatim from a sibling RFP. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
071b7a0 to
c46ea9f
Compare
The appendix was never run through mdformat, so CI failed on every push to this branch. Reformatting only: table column padding and link reflowing to the 80-column wrap. No content changes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Related: logos-co/ecosystem#121 |
| invoke, without relying on a single trusted source. Note that Usability | ||
| requirement U.6 (decode the action before signing) can only be as complete | ||
| as this registry's coverage; proposers must state what a client displays | ||
| when a target program is not registered. |
There was a problem hiding this comment.
Not on this - we need to consider how to reliably and verifiably update the registry - IDL (needed for decoding) has no provable tie to the program (i.e. I can upload fake IDL to the program which will decode as something safe, but on actual execution the program instruction decoding will do something completely different). I do not have solution, but wanted to point it out
There was a problem hiding this comment.
Will add mention. But I expect code to be provided, so that one can verify bytecode and IDL.
| action reaching quorum and becoming executable, enforced by the program. A | ||
| time lock of zero means immediate execution. | ||
| 08. Support an optional spending-limit policy: a member or sub-quorum may | ||
| execute transfers up to a configured limit without the full M-of-N approval. |
There was a problem hiding this comment.
Transfers of a native token or any token? Because if it is any token then it would have to be bound to the token program Id, but there could be other token program implementations (or updated version). And if it is "any token program" then the question is how to limit this only for tokens and disallow execution of other instructions on other programs:)
| human deliberation and machine coordination: proposals are published to the | ||
| room, member approvals are collected through it, and the resulting approval | ||
| package is presented to the program at execution. See the Coordination | ||
| Architecture section. |
There was a problem hiding this comment.
AFAIU we do not have any global "Logos Identity" and Logos chat identities/keys have not relation to LEZ accounts, so not sure if it is reasonably possible to automatically create a chat room for multi-sig members
There was a problem hiding this comment.
so not sure if it is reasonably possible to automatically create a chat room for multi-sig members
"automatically" can be interpreted here and may mean some "invite/accept" action if needed. @jazzz wdyt?
There was a problem hiding this comment.
"Automatically" is the potentially scary word here - I'm assuming thats aligning closer with "Given a multisig, a chat room can be created mechanically".
@vpavlin is right to point out the Identity binding issue between λ-Accounts and LEZ-Accounts. It's currently not defined. Thats largely depends on the logos-co/anoncomms-pm#71 - which is in progress and will result in more information.
This is a good use-case for λ-Accounts to work around, as it brings in an indexing requirement (LEZ-Accounts -> λAccountLogs) and the FURPS need updating
| room, member approvals are collected through it, and the resulting approval | ||
| package is presented to the program at execution. See the Coordination | ||
| Architecture section. | ||
| 10. Run the multisig private by default: the program runs over LEZ private |
There was a problem hiding this comment.
do we have a devinition of what a private multisig means? WHen I explored this there is kind of a matrix of things:
- Private membership
- Private actions
- Private funds
And then combination of these
|
|
||
| #### Usability | ||
|
|
||
| 1. Provide an SDK that can be used to build Logos modules for interacting with |
There was a problem hiding this comment.
What do we mean by SDK here? In theory SDK is an FFI generated by SPEL from the LEZ program...or something else?
| on-chain and which are not), so a multisig operator understands exactly what | ||
| an observer can see, including what becomes visible to an audience under each | ||
| disclosure mechanism. | ||
| 6. Before a member signs an approval, the mini-app must display the exact action |
There was a problem hiding this comment.
I do not understand this - the UI will still display a decoded instruction - the key is UI will do that, so what are we trying to emphasize here?
| - **Human deliberation**: the discussion among signers about whether to approve. | ||
| - **Machine coordination**: proposals are published to the room, and members' | ||
| approvals (signatures over the proposal) are collected through it. Once M | ||
| approvals are gathered, the approval package is submitted for execution; the |
There was a problem hiding this comment.
I think this is the first time where "off-chain approval collection" is explicitly mentioned - are we saying we only collect approvals off-chain? Should it (or generally any notion of this) defined and required somewhere earlier?
jazzz
left a comment
There was a problem hiding this comment.
Overall reads easy, and defines the problem well.
I appreciated that the terms were clearly defined. Most of my questions could be answered with a simple `Ctrl-F'
Some open questions about the interdependence between LEZ and λChat, and a few suggestions on how to improve room requirements so that viability could be properly evuated
| social graph is not readable from chain state. Where identity is concerned, the | ||
| property in question is unlinkability between a user's account and its role in a | ||
| multisig, not concealment of the user. |
There was a problem hiding this comment.
This seems like a hard requirement that spans both the LEZ and Chat domain.
[Sand] Consider adding some +Privacy requirements to the FURPS to make Unlinkability explicit and defined.
"Role separation" unlinkability does not compose. LEZ, and λChat could achieve unlinkability over roles independently but be vulnerable to an intersection attack.
| - **Machine coordination**: proposals are published to the room, and members' | ||
| approvals (signatures over the proposal) are collected through it. Once M |
There was a problem hiding this comment.
[?] Is there a data binding requirement here?
It seems like the coordination channel is a party of the the MultiSig process, and may need to have functional requirements. Human deliberation requires Confidentiality+data Integrity which is defined by λChat::GroupV*. However I'm curious if Machine coordination relies on any trust assumptions or a 'data veracity' property.
| change, and what a removed member can still observe in the room until that | ||
| reconciliation completes. |
There was a problem hiding this comment.
... what a removed member can still observe ...
[Sand] This requirement could be expressed clearer. Currently I'm uncertain what specifically needs to be defined and how that set could be bounded.
As worded I understand this to be "You MUST list/document all information a removed program::member can see in room, until it is removed from the room"
λChat state synchronization between members itself is eventually consistent. A Removed chat::member can see all the messages sent by Chat::members who have not seen the state update.
This requirement reads to me as a Tautology of sorts: If everyone knew it the program::member was removed from the program, it would also be removed from the room and they would be synchronized. If a member doesn't know how the change has occured, and operate as normal.
Applies the comments left on the "RFP Program - Drafting measures and spec reviews" doc: - Replace "production-ready" with an explicit audit deliverable and state that deployment/operation beyond devnet/testnet is out of scope, so the RFP does not imply a production deployment obligation. - Add Supportability #13, an audit programme requirement, matching the pattern already used in RFP-008 and RFP-012. - Neutralise procurement-flavoured wording: "this RFP is the vehicle for delivering that" and the three uses of "commissions" become invitations for proposals. - Drop "will be viewed more favourably", which reads as a selection commitment, in favour of a direct instruction to proposers. - Clarify that the module UI's developer signature is verified at install time, rather than the vaguer "installed and verified once". - Clarify that teams publish modules through their own catalog built from the template repo, not into a Logos-maintained catalog. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Match the established pattern used by the other RFPs that carry an audit programme requirement: name the example tier-1 firms, enumerate the components in scope, and tie the audit timeline and report publication to any mainnet recommendation. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The review doc carried Google Docs suggestions in addition to comments. These are tracked changes rather than comment threads, so they were missed in the first pass. All three, from Noelle Laguea: - Fix the disclaimer's verb agreement after "does not": "provides any advice or assumes any responsibility" becomes "provide any advice or assume any responsibility". The same wording appears in the other RFPs and the template, left for a separate pass. - Reword the admin-authority sentence in Why This Matters to name who shares control. - Replace "A proposal that omits it entirely is not penalised" with "Proposals may omit this soft requirement", removing wording that reads as a selection commitment. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adds RFP-005 — Multisig and Coordination and its ecosystem-behaviour appendix.
What's here
RFPs/RFP-005-multisig-and-coordination.md— the RFP (tier L). Commissions afresh M-of-N multisig program for LEZ, private by default, with an
end-to-end-encrypted per-multisig coordination room built on the Logos chat
module. Deliverables also include an SDK, a QML mini-app, a CLI on the Logos
core headless framework, a SPEL IDL, and a registry for proposal code and
target programs.
appendix/multisig-coordination-ecosystem.md— facts-and-observationsappendix surveying Bitcoin, Ethereum, and Solana multisig behaviour. Leads
with a data inventory: the ten distinct data and metadata items a multisig
involves, whether each could be private on LEZ, and what Safe, Squads,
ERC-4337, Bitcoin script, FROST, and MuSig2 do with each. Supporting context
for reviewers; the RFP is self-contained and does not reference it.
README.md— RFP-005 registered in the index.Design posture
operator-selectable public posture, selective disclosure to a defined
audience, and ongoing assurance for parties joining later. Auditability needs
are framed per use case: a corporate treasury typically needs a narrow
audience, a DAO a wider one.
the collected approvals at execution rather than writing each approval
on-chain.
using private accounts, coordination room on the Logos chat module, and
compatibility with Logos testnet 0.3 and 0.4.
Notes
deliberately avoids describing LEZ internals, so applicants verify current
platform behaviour themselves rather than scoping against claims in this
document that could be wrong or go stale.
logos-co/lez-multisigis referenced as prior art only. Its architecture isincompatible with private accounts, so it is a reference for the public path
and does not drive design decisions here.
LP-0002only. That prize is open and unclaimed,and its anonymous-approval design differs from this RFP's attributed
approvals (R.1), so it is adjacent work rather than a foundation.
appendix as ecosystem context.
🤖 Generated with Claude Code