A 5-gate DAO-governed pipeline for admitting Wardens and Bastions to the ShardKeep network, with program-enforced slashing, cross-chain cNFT credential binding, and a two-operator Security Council. The goal: make ShardKeep the most secure password vault in history. · April 2026
This proposal finalizes governance decisions across two prior proposals and the Q1–I3 decision walkthrough conducted 2026-04-21.
| Prior work | Disposition |
|---|---|
| proposal-role-separation-v1 | Augmented. Role concepts (user / operator / manager wallets) kept. Governance mechanism (bespoke AdminRegistry + WardenRegistry PDAs) superseded by Realms DAOs. Admin-airdrop gate concept kept and refined. |
| proposal-warden-registry-v1 | Superseded. This proposal absorbs and resolves all 9 gaps raised in that draft. |
| proposal-onchain-shard-map-v3 | Parallel track. That document governs user vault mechanics. This proposal governs operator network admission. They compose cleanly; neither replaces the other. |
| proposal-tokenomics-v3.2 | Referenced. Bond amounts and slashing severity tiers are defined there. This proposal encodes how those rules are enforced, not what the numbers are. |
ShardKeep operates on two Solana networks. Each gets its own DAO via realms.today:
| DAO | Network | Token(s) | Council size | Purpose |
|---|---|---|---|---|
shardkeep-devnet |
Solana DevNet | Council token (NFT or capped SPL); DevNet-SHRD for operator bonds | 3-of-5 | Training ground; admission pipeline for eventual MainNet operators; zero-risk iteration |
shardkeep-mainnet |
Solana MainNet | Council token; SHRD for operator bonds and (future) community voting | 3-of-5 | Production; authoritative WardenRegistry and BastionRegistry; holds program upgrade authority once stabilized |
Operations are split between individual admin actions (fast, logged) and DAO-wide council votes (slow, deliberative). This prevents both bottlenecking routine ops on council availability and letting single individuals make structural decisions.
| Tier | Who | Mechanism | Examples |
|---|---|---|---|
| Admin | Individual admin wallets, membership controlled by DAO council | One wallet signs; logged on-chain with signer wallet recorded | Gate 1 airdrop; duress self-flag; operator IP change enactment; conversation memos |
| Council | Council token holders (3-of-5 threshold) | Realms proposal + vote + execution | Gate 3, Gate 5; add/remove admin; mint/revoke cNFT; pause extension; parameter changes |
At DAO genesis, the DevNet council is seeded with three human members. A 3-of-5 threshold (with 5 council seats, 3 required) accommodates losing one member without paralysis and makes seat-by-seat compromise economically infeasible.
Every node has three wallets associated with it, at different temperatures and with sharply different privileges.
| Wallet | Who holds the keys | Temperature | Signs |
|---|---|---|---|
operator_wallet |
Human operator | Cold — hardware wallet, offline storage | Gate 1 application acknowledgement, exit initiation, manager rotation, IP change requests, governance votes |
manager_wallet |
Human operator | Hot — on the operator's laptop or in a browser extension | On-chain heartbeat summaries (rate-limited ~1/hr), routine operational acknowledgements |
node_wallet |
Nobody. Program PDA with no private key. | N/A | Receives cNFTs, holds node identity on-chain. Authorized only through invoke_signed within the shardkeep_authority program. |
A Program-Derived Address has no private key. There is nothing to steal, nothing to lose, nothing to transfer. The PDA's address is deterministic — computable from seeds like ["warden", operator_wallet, node_id] — so it's knowable the moment a node is registered in the ShardKeep system, before any on-chain transaction. The account is initialized on-chain at Gate 1 execution.
Once the node_wallet holds a soulbound cNFT, that credential is physically impossible to move without going through program logic. Program logic gates all such movements behind DAO proposals. An attacker who compromises the operator or manager wallets still cannot touch the cNFT. An attacker who compromises the program's upgrade authority cannot redirect a cNFT without going through a full upgrade proposal with timelock.
Adding a new Warden or Bastion to MainNet requires passing through five gates across both networks. Council and operator community alternate as the voting body, so no single group makes all admission decisions.
Authority: Single admin wallet. NOT a DAO vote.
Process: After an out-of-band conversation (Discord, email, signed introduction), any admin clicks the "Airdrop" button in the ShardKeep admin UI. That admin's wallet signs one on-chain transaction to the shardkeep_authority program:
admin_airdrop_and_activate( operator_wallet, node_type, // Warden or Bastion node_id, airdrop_amount, // differs per node_type; Warden bond >> Bastion bond reason_uri // link to the conversation that justifies this )
Effects (all atomic):
node_wallet PDA initialized on-chainWardenRegistry or BastionRegistry with status = Activetenure_start_at = <slot of this transaction>Before this transaction: the operator may have their node software installed and running in "shadow mode" for days or weeks — node appears in the Node list with its known PDA address, but has zero on-chain footprint beyond that address. Heartbeats flow to the off-chain DB. No tenure accrues. No bond exists.
Why single-admin and not council vote: DevNet-SHRD has no real-world value; admins can mint more from treasury as needed; reversal via council vote is cheap if an admin errs. Requiring full governance for every onboarding would slow the network to a crawl while buying negligible additional security.
Authority: DevNet operator community.
Eligibility to open a vouching proposal:
Eligibility to vote: Any DevNet operator with ≥ 1 epoch of bonded tenure on at least one Active or Probation node.
Voting mechanics:
vote_weight = Σ ( node_bond × sqrt(node_epochs) ) for each Active or Probation node owned by the voter on DevNet where node_epochs ≥ 1
Passage requirements:
Failure handling: 14-day cooldown before a new vouching proposal can be opened for the same candidate. Three consecutive failures trigger a 6-month ineligibility period — forces reflection, not retry-until-success.
What this gate filters: Candidates who meet operational criteria but lack peer recognition. Quiet, isolated operators who haven't engaged with the community cannot reach Gate 3 — the community-of-trust must know you before the council graduates you.
Authority: DevNet council (3-of-5 multisig via Realms).
What council reviews:
slash_history — permanent, even if tenure was rebuiltOn passage: Operator gains the right to start their MainNet node. They don't yet have a DevNet cNFT — that's lazy-minted only after MainNet infrastructure is live.
The Gate 2 → Gate 3 split is load-bearing: community speaks at Gate 2, council decides at Gate 3. Council sees the Gate 2 result as one input, but Gate 2 doesn't bind council — a strong peer vote doesn't automatically graduate a candidate, and council can (rarely) veto a passed vouching result with a public rationale.
Authority: MainNet operator community (Wardens + Bastions).
Proposer: MainNet council opens the proposal (not the candidate). Council does so only after verifying MainNet requirements are met:
--reuse-key renewalsEligibility to vote: Any MainNet operator with ≥ 1 epoch of bonded tenure.
Voting mechanics: Same sqrt-weighted bond formula as Gate 2, calculated against MainNet bonds.
Passage requirements:
Failure handling: 14-day cooldown. Three consecutive failures = 6-month ineligibility.
Why bond-weighted and not 1-wallet-1-vote: An operator running five nodes has five times the skin in the game of an operator running one. Wardens put up larger bonds than Bastions by the tokenomics schedule, and therefore weigh more when admitting new peers. Tenure sqrt multiplier rewards longevity without letting incumbents fully ossify. Voice in governance scales with invested commitment.
Authority: MainNet council (3-of-5 multisig via Realms).
Role: Final safety net. Council cannot unilaterally admit a candidate — Gate 4 community vote must have passed first. Council can, however, decline to confirm a passed Gate 4 if they've observed red flags the community missed.
Vetoes require on-chain rationale. A council member voting no on Gate 5 after Gate 4 passed must include a memo URI. These memos form a public accountability record for council judgments.
On passage:
Both node types follow the identical 5-gate pipeline. What differs is the specific thresholds applied at each gate.
| Dimension | Warden track | Bastion track |
|---|---|---|
| Bond amount | High (per tokenomics-v3.2) | Lower (per tokenomics-v3.2) |
| Gate 1 application requirements | Domain, TLS posture, DDoS plan, geographic region declaration | Storage capacity declared, parent Warden region identified |
| Tenure metrics measured | Wallet-serving uptime, JWT signing success, challenge response, regional latency | Shard retention rate, Warden-WSS uptime, retrieval success, storage-proof challenges |
| MainNet probation emphasis | Public-facing reachability, cert validity, rate-limit resilience | Shard retention under Warden assignment, latency to parent Warden |
| Slashing triggers | Conflicting JWTs, wallet-facing misbehavior, duress breach | Shard loss, failed retrieval, failed storage proof, Warden-denial |
WardenRegistry and BastionRegistry are distinct on-chain account trees, so a Bastion cannot accidentally be queried as a Warden and vice versa. Type-scoped instructions (register_warden, register_bastion, update_warden_url, …) keep the program surface clean.
At Gate 3 passage (plus MainNet probation clearance) and at Gate 5 passage, compressed NFTs are minted as soulbound credentials — non-transferable tokens tied to a specific PDA wallet. These credentials are the public, visible proof of a graduation decision.
ShardKeep already runs a Bubblegum + Helius DAS stack (shipped in v1.1.0 for shard maps). The governance cNFTs use the same infrastructure: compressed for cost, soulbound via program policy, and updateable by the tree authority (held by the DAO treasury PDA on each network).
The critical security property is that both chains point at each other. Neither credential stands alone — they attest to each other.
{
node_type: "warden" | "bastion",
devnet_node_id: "sk-abc123...",
mainnet_wallet: <MainNet PDA address>,
graduated_at: <slot>,
graduation_proposal_url: "..."
}
Minted to: MainNet node_wallet PDA
{
node_type: "warden" | "bastion",
mainnet_node_id: "sk-xyz789...",
devnet_wallet: <DevNet PDA address>,
devnet_cnft_mint: <tree leaf address>,
activated_at: <slot>,
gate3_proposal_url: "...",
gate5_proposal_url: "..."
}
Minted to: DevNet node_wallet PDA
1. Read DevNet cNFT metadata → mainnet_wallet = MW 2. Read MainNet.WardenRegistry[node] → node_wallet = MW ✓ 3. Read MainNet cNFT metadata → devnet_wallet = DW 4. Read DevNet.WardenRegistry[node] → node_wallet = DW ✓ 5. If all four match, the operator's credential is cryptographically legitimate.
The DevNet cNFT is not minted the moment Gate 3 passes. It's minted only after the operator has:
This way the cNFT always points at a MainNet PDA that already exists — no ghost addresses, no pre-minted credentials that might never correspond to real infrastructure.
Soulbound cNFTs cannot be transferred by any wallet, including the PDA that holds them. Only the tree authority (DAO treasury PDA on each network) can revoke them, and doing so requires a passed governance proposal on that network.
This means: an attacker who compromises an operator's wallets cannot touch the credential. An attacker who compromises the program's upgrade authority cannot instantly revoke credentials — upgrades require a proposal with timelock. The upper bound on attacker power is "compromise a council majority" — below that, the credential is effectively immortal.
slash_history even though the tenure was reset. Credentials can't be "cleared" — they can only be created and revoked. Revocation is itself permanent and visible.
operator_vote_weight = Σ ( node_bond_i × sqrt(node_epochs_i) )
for each node_i owned by operator_wallet where:
- node status is Active or Probation
- node has been bonded for ≥ 1 full epoch (node_epochs_i ≥ 1)
| Term | Why |
|---|---|
node_bond_i | Skin in the game. More bond = more real-world commitment = louder voice. Warden and Bastion bond ratios (per tokenomics-v3.2) naturally weight node types. |
sqrt(node_epochs_i) | Tenure multiplier. Longevity matters but shouldn't dominate. A 2-year operator has ~7× the voice of a 1-epoch operator (same bond); a 4-year operator has only ~1.4× the 2-year operator. Square-root prevents incumbent ossification. |
| Summation | Multi-node operators sum across their nodes. An operator with 10 Bastions carries more weight than one with 1. Each node contributes based on its own age, not an average. |
| Node tenure | Multiplier | Vote weight (example: 10k bond) |
|---|---|---|
| 1 epoch (14d) | 1.00 | 10,000 |
| 4 epochs (~2mo) | 2.00 | 20,000 |
| 10 epochs (~5mo) | 3.16 | 31,623 |
| 26 epochs (1yr) | 5.10 | 50,990 |
| 52 epochs (2yr) | 7.21 | 72,111 |
| 104 epochs (4yr) | 10.20 | 101,980 |
Pending, Dormant, Paused, Slashed, Exited — zero weight| Gate | Network | Body | Threshold | Floor | Window |
|---|---|---|---|---|---|
| 2 — Peer Vouching | DevNet | DevNet operators | > 50% yes | ≥ 50% weighted participation | 7 days |
| 3 — DevNet Graduation | DevNet | DevNet council (3-of-5) | 3 yes votes | N/A | Per Realms default |
| 4 — MainNet Community | MainNet | MainNet operators | ≥ 66% yes | ≥ 50% weighted participation | 7 days |
| 5 — MainNet Council | MainNet | MainNet council (3-of-5) | 3 yes votes | N/A | Per Realms default |
No enforced recusal at the program level. Bastion-to-Warden pairing is proximity-driven (Bastions select their nearest Warden automatically) rather than politically negotiated, so there is no built-in conflict of interest between a Warden and "its" Bastions. Operators who believe they have a conflict may voluntarily mark themselves recused; their weight is subtracted from the participation floor denominator.
Public vote visibility on a small operator set means conflicts are observable and reputationally costly.
Slashing rules are defined in tokenomics-v3.2. The shardkeep_authority program enforces them automatically based on cryptographic or observable evidence. Council does not vote on individual slashing decisions.
report_misbehavior(node_id, evidence). Program verifies cryptographically; if valid, program executes slash atomically. No vote.record_duress_ack produces on-chain evidence that can trigger slashing of the compromised wallet.| Severity | Bond impact | Tenure impact on affected node |
|---|---|---|
| Small — minor downtime, first-offense soft infractions | Per tokenomics-v3.2 | None |
| Medium — pattern misbehavior, repeated failures, missed challenges | Per tokenomics-v3.2 | Halved — tenure_start_at pushed forward by half the elapsed period |
| Large — duress breach, double-signing, provable malice | Per tokenomics-v3.2 | Reset to current slot — operator rebuilds tenure from zero on that node |
Every slashing event, regardless of severity, creates a permanent entry in the node's on-chain slash_history: Vec<SlashEvent>. This history is:
SlashEvent {
timestamp: i64,
severity: enum { Small, Medium, Large },
reason_code: u16, // maps to tokenomics-v3.2 schedule
amount: u64,
tenure_impact: enum { None, Halved, Reset },
evidence_uri: String, // on-chain tx hash or off-chain memo
}
The Security Council is not a body of named individuals — it's a mechanism. Any two operators in good standing can, acting independently, pause another operator's node when they observe concerning behavior. Pauses are time-limited and require council review if they exceed 72 hours.
flag_concern(target_node, reason_code, evidence_uri)confirm_concern(flag_id)Paused.DNS records for Warden domains (master.shardkeep.io, and future regional names like tokyo.shardkeep.io, frankfurt.shardkeep.io) are controlled by ShardKeep admins. This is a deliberate choice:
| Step | Actor | Action |
|---|---|---|
| 1 | Operator | Files request_ip_change(target_epoch, new_ip, reason) signed by operator wallet. target_epoch must be ≥ current + 1 (next epoch minimum). |
| 2 | Admin | Has a conversation with the operator (the "social" step — confirms identity, understands the move). Acknowledges on-chain. |
| 3 | Admin | Updates DNS A record to point the Warden's name at the new IP. DNS propagation begins. |
| 4 | Program, at target_epoch boundary | Admin executes on-chain tx updating the registry's ip_address field. DNS propagation should be complete by now. |
| 5 | — | Warden continues operating, now from the new IP. No downtime. public_url unchanged throughout. |
If an operator's hosting provider pulls the plug or their server is compromised, the normal "future epoch" announcement isn't fast enough. In those cases:
This way, emergencies route through the same oversight mechanism that handles security concerns — no unilateral admin action to enable an IP change during a suspected compromise.
Whoever holds the upgrade_authority on the shardkeep_authority program can replace the program with any new version — including a version that redefines "valid Warden" to mean whatever they choose. This is more powerful than the council multisig itself.
| Phase | Network | Upgrade authority held by | Rationale |
|---|---|---|---|
| Development | DevNet | Single admin wallet (ShardKeep team) | Fast iteration. DevNet is a test network; no real funds at risk. Bug fixes ship in minutes, not days. |
| DevNet stabilization | DevNet | DevNet DAO treasury PDA | After 4-6 weeks of stable operation, upgrade authority transfers to the DevNet DAO. This is the rehearsal for the MainNet ceremony. |
| MainNet genesis | MainNet | MainNet DAO treasury PDA | The moment MainNet operations begin, upgrade authority lives in the MainNet DAO. ShardKeep-the-company no longer controls the program. Upgrades require a community proposal + council approval. |
Per §11 (operation tiering), program upgrades are community + council (Tier 4), matching MainNet economic parameter changes. Routine state transitions (registry reads, heartbeat records, reward distributions) never touch upgrade authority at all.
If the ShardKeep extension shipped with "enforce on-chain registry" enabled before the WardenRegistry had any entries, every user would be instantly locked out. Today's heartbeat outage on a single URL change hints at the scale of that risk if applied network-wide. The rollout plan below avoids that class of failure.
| Phase | Window | Actions |
|---|---|---|
| 0.1 | Week 1 | Create DevNet Realms DAO at realms.today. Seed 3-of-5 council (admin #1, #2, #3). Mint council token (NFT or capped SPL). Document graduation criteria publicly. |
| 0.2 | Week 2 | Draft shardkeep_authority Anchor program. Begin unit tests. |
| 1 | Week 3-4 | Deploy shardkeep_authority to DevNet under single-wallet upgrade authority. Seed WardenRegistry and BastionRegistry with the 1 grandfathered Warden + 12 grandfathered Bastions. |
| 2 | Week 5 | Extension v2.0 shipped with registry query in shadow mode: extension reads the registry on every login, compares to the site URL, and logs discrepancies to an audit endpoint. Does not block. |
| 3 | Weeks 5-7 | Shadow-mode audit period. Every false positive investigated. Signed-cache fallback implemented. Reproducible-build and code-signing plumbing for the agent update channel. |
| 4 | Week 8 | Transfer DevNet program upgrade authority to DevNet DAO treasury PDA. Rehearsal for MainNet genesis. |
| 5 | Week 9 | Server-side enforcement flag (held as signed JSON by a registered Warden) flipped to ON for 10% of users. Monitor. |
| 6 | Week 10 | Flip to 100%. Observe. Issue emerges? Flip back in seconds — no extension release needed. |
| 7 | Week 11 | Extension v2.1 bakes enforcement in. Server flag demoted to kill-switch (can disable enforcement in emergency, cannot enable). |
| MainNet Genesis | Target TBD | Create MainNet Realms DAO. Seed council (same or overlapping 3-of-5). Deploy shardkeep_authority to MainNet under single-wallet. Smoke-test with dummy entries. |
| MainNet Phase 2 | +2 weeks | Transfer MainNet program upgrade authority to MainNet DAO treasury PDA. The ceremonial moment where ShardKeep becomes network-governed. |
| First MainNet Warden admission | +6 weeks after Phase 2 | First operator #2 (beyond grandfather) completes the full 5-gate pipeline and joins the authoritative MainNet WardenRegistry. |
Every successful registry read by the extension produces a locally-cached, signed snapshot. The signature is from any registered Warden's node key, covering (registry_snapshot, timestamp). If the live registry read fails (program bug, RPC outage, Solana outage), the extension falls back to the cache — as long as the cache is < 7 days old.
Beyond 7 days without a successful live read, the extension surfaces an error to the user with a "proceed with manual risk acknowledgement" button. Fail-closed on the default, but provide a recovery path for prolonged outages.
window !== window.top, refuse to sign. Prevents iframe-based phishing.version-check.php. Mismatch → refuse + alert user.--reuse-key. All Wardens run certbot renew --reuse-key so TLS cert renewals don't change the SPKI fingerprint. Extension pins SPKI, not cert; renewals become silent; real MITM still trips the alarm.| Count | Node type | Identifier | public_url (if applicable) |
|---|---|---|---|
| 1 | Warden | sk-93e237643104d3f2 | master.shardkeep.io |
| 12 | Bastions | Current 12 sk-* bastion node IDs | WSS-only; no public URL (they connect to the Warden) |
| 0 | Sentries | N/A | Sentries are browser-extension based; out of governance scope |
first_seen in the existing shardkeep_nodes table. Early operators are not punished for pre-DAO service — their real operational history counts.Any Warden operator beyond the grandfathered one, and any Bastion operator beyond the grandfathered twelve, passes through all 5 gates. No exceptions. The grandfather clause is a one-time genesis provision.
This proposal deliberately does not address:
Every design decision resolved during the Q1–I3 walkthrough on 2026-04-21, with the final disposition.
| ID | Question | Resolution |
|---|---|---|
| Q1 | Graduation credential mechanism | Bidirectional soulbound cNFT binding via PDA node wallets. Lazy mint. No dedicated binding keys (operational node_wallet PDA doubles as identity). |
| Q2 | What "tenure" means | Current epoch + 1 epoch operational correctness AND 1 full epoch bonded. Total minimum 42 days. tenure_start_at = Gate 1 execution slot, cryptographically anchored. |
| Q3 | Grandfather clause | 1 Warden (sk-93e237643104d3f2, master.shardkeep.io) + 12 Bastions. Sentries excluded. Tenure honored from first_seen. |
| Gate 1 | Gate 1 mechanics | Single admin action, not a DAO vote. Atomic airdrop + stake + PDA init + registry entry + tenure clock start. Admin signer logged. |
| Pre-Gate 1 | Shadow-running period | Node can run in the ShardKeep system before Gate 1. PDA address known (deterministic). Zero on-chain footprint, zero tenure, unbounded duration. |
| V1 | Gate 2 proposer eligibility | Different DevNet operator, in good standing, ≥ 2 epochs tenure. Candidate cannot self-propose. |
| V2 | Gate 2 co-proposer | One required. |
| V3 | Gate 2 threshold | > 50% yes (simple majority — DevNet). |
| V4 | Gate 2 cooldown on failure | 14 days. 3 consecutive failures = 6 months ineligibility. |
| V5 | Gate 2 voucher liability | Soft for v1 — reputation only. No staking liability in v1. |
| V6 | Council visibility of Gate 2 result | Informational. Council can override with public memo but should rarely need to. |
| Q4/D1 | Emergency pause authority | Two-operator Security Council. 72h auto-expiry. Rate-limited per operator. False-flag slashing per tokenomics-v3.2. |
| Q4/D2 | Slashing authority | Program-enforced. Not a DAO vote. Rules in tokenomics-v3.2. |
| Q4/D3 | URL changes | Removed from operator workflow. DNS is admin-controlled. Operators change IP via future-epoch announcement. |
| Q5/5.1-5.5 | Gate 4 voter weight | Bond-weighted with sqrt tenure multiplier. Warden and Bastion operators all vote. No operator-type weighting beyond natural bond ratios. |
| Q5/5.2 | Gate 4 threshold | ≥ 66% yes (supermajority — MainNet). |
| Q5/5.3 | Participation floor | ≥ 50% of eligible weighted vote must be cast. |
| Q5/5.4 | Recusal | None enforced. Voluntary self-recusal available. |
| Q5/5.6 | Voting window | 7 days. 14-day cooldown on failure. 3 consecutive failures = 6 months ineligibility. |
| I1 | Which bonds count | Active and Probation status only. Dormant, paused, slashed, and exited don't count. |
| I2 | Minimum tenure for voting | 1 epoch (14 days) bonded before weight activates. |
| I3 | Tenure multiplier formula | sqrt(epochs_bonded) applied per node. |
| I3-slash | Slash severity → tenure | Severity-tiered: small=no impact, medium=halved, large=reset. Permanent slash_history record regardless of severity. |
| Gap #1 | Program upgrade authority | DAO treasury PDA on each network. 72h timelock on MainNet. DevNet keeps single-wallet until stabilization. |
| Gap #2 | TLS cert pinning | SPKI pinning with certbot --reuse-key. Renewals become silent. |
| Gap #5 | iframe policy | Refuse all framed contexts entirely. |
| Gap #7 | Program ID supply-chain defense | Cross-check hardcoded ID against signed Warden response. RPC quorum (3 RPCs). |
| Gap #8 | Heartbeat-to-slashing policy | No auto-slash on uptime alone. Progressive status degradation per §10 of role-separation-v1. |
| Gap #9 | Client fallback for program bugs | Signed local cache, 7-day TTL. Fail-closed beyond TTL with manual override. |
Prior context: role-separation-v1 (governance primitives), warden-registry-v1 (superseded by this document), tokenomics-v3.2 (bond and slash schedules), on-chain-shard-map-v3 (user vault mechanics, parallel track).
Progress log: /shardkeep/proposals/logs/v2.0.0-governance.log