← Back to Proposals

The Unbreakable Governance Model PROPOSAL v2

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

One-paragraph elevator pitch: Two Realms DAOs — one on DevNet, one on MainNet — hold the authority to admit new infrastructure operators to the ShardKeep network. Every Warden and every Bastion passes through a 5-gate pipeline alternating between council oversight and peer vote. Each admission produces a soulbound cNFT on DevNet, another on MainNet, cryptographically cross-bound to immovable PDA-owned node wallets. Slashing rules live in the program, not in council votes. Operators protect each other via a dual-signature Security Council pause. The protocol graduates from trusting ShardKeep-the-company to trusting on-chain governance enforced by code.
Why this matters. Today, wallets and nodes trust ShardKeep servers because a domain name is hardcoded in their software. If that trust ever broke — via DNS hijack, a convincing lookalike domain, a compromised extension update — users would have no second line of defense. Our goal isn't "pretty secure." It's unbreakable. Every decision below prioritizes security posture over operational convenience, and we document the tradeoffs explicitly so nothing happens by accident.

Contents

  1. What this replaces and what it keeps
  2. Governance architecture
  3. The three-tier wallet model
  4. The 5-gate pipeline
  5. Cross-chain cNFT binding
  6. Voting mechanics in detail
  7. Slashing and the permanent record
  8. Security Council and emergency response
  9. DNS and infrastructure management
  10. Program authority and upgrade path
  11. Rollout sequence
  12. Grandfather clause
  13. Explicit non-goals
  14. Decision ledger

1. What this replaces and what it keeps

This proposal finalizes governance decisions across two prior proposals and the Q1–I3 decision walkthrough conducted 2026-04-21.

Prior workDisposition
proposal-role-separation-v1Augmented. 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-v1Superseded. This proposal absorbs and resolves all 9 gaps raised in that draft.
proposal-onchain-shard-map-v3Parallel track. That document governs user vault mechanics. This proposal governs operator network admission. They compose cleanly; neither replaces the other.
proposal-tokenomics-v3.2Referenced. Bond amounts and slashing severity tiers are defined there. This proposal encodes how those rules are enforced, not what the numbers are.

2. Governance architecture

Two Realms DAOs, one for each network

ShardKeep operates on two Solana networks. Each gets its own DAO via realms.today:

DAONetworkToken(s)Council sizePurpose
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

Two authority tiers within each DAO

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.

TierWhoMechanismExamples
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
Why the split: Onboarding an operator after a Discord conversation is a normal admin task that should take a day, not a week. Slashing someone is structural and deserves deliberation. Mixing these into one authority tier either makes routine work unbearably slow or makes structural work unacceptably fast.

Starting composition

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.

3. The three-tier wallet model

Every node has three wallets associated with it, at different temperatures and with sharply different privileges.

WalletWho holds the keysTemperatureSigns
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.
Think of it like this: The operator wallet is your safe deposit box key — almost never touched. The manager wallet is your debit card — used every day. The node wallet is the bank's own record of your account — you can't "take" it because it isn't yours to take; it belongs to the protocol and records your node's existence.

Why the node_wallet is a PDA

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.

Wallet lifecycle and rotation

4. The 5-gate pipeline

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.

Overall flow (both Warden and Bastion tracks follow this same shape):

Gate 1   DevNet Entry   (single admin)
  Tenure: 2 epochs operational + 1 epoch bonded = 42 days minimum
Gate 2   Peer Vouching   (DevNet operators, bond-weighted vote)

Gate 3   DevNet Graduation   (DevNet council vote)
  Operator starts MainNet node; program derives MainNet PDA
  Probation: 1 epoch bonded + operating current+1 epoch on MainNet
DevNet cNFT minted to MainNet node_wallet PDA with MainNet binding baked in

Gate 4   MainNet Community   (MainNet operators, bond-weighted vote)

Gate 5   MainNet Council   (MainNet council vote)

MainNet cNFT minted to DevNet node_wallet PDA with DevNet binding baked in
Registry entry activated — clients begin routing to the new operator

Gate details

1DevNet Entry — Admin Airdrop

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):

  1. DevNet-SHRD transferred from treasury directly to bond escrow PDA (never touches operator's spendable balance)
  2. node_wallet PDA initialized on-chain
  3. Entry created in WardenRegistry or BastionRegistry with status = Active
  4. tenure_start_at = <slot of this transaction>
  5. Admin signer wallet recorded in audit log

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.

2Peer Vouching — DevNet Operator Vote

Authority: DevNet operator community.

Eligibility to open a vouching proposal:

  • Proposer must be a different DevNet operator (candidate cannot self-propose)
  • Proposer must be in good standing (not suspended, not duress-flagged, no active slash proceeding)
  • Proposer must have ≥ 2 epochs of tenure themselves
  • One co-proposer required — a second DevNet operator seconding the 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:

  • Threshold: > 50% yes (simple majority — DevNet is a test network)
  • Floor: ≥ 50% of total eligible weighted vote must be cast
  • Window: 7 days

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.

3DevNet Graduation — Council Vote

Authority: DevNet council (3-of-5 multisig via Realms).

What council reviews:

  • Operational record (uptime, heartbeats, challenge response success, any slashing events)
  • Bond status (must be continuously bonded ≥ 1 full epoch)
  • Gate 2 outcome and vouching history
  • Any duress flags, unresolved concerns, or pending Security Council actions
  • slash_history — permanent, even if tenure was rebuilt

On 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.

4MainNet Community — Operator Vote

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:

  • MainNet node process live and reachable
  • TLS cert valid; SPKI pinned with --reuse-key renewals
  • Bonded ≥ 1 full epoch in SHRD (not DevNet-SHRD)
  • Probation period cleared: operating continuously for current epoch + 1 epoch
  • Live connectivity challenge passed (signed message, latency probe)
  • Zero active Security Council flags against the operator

Eligibility 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:

  • Threshold: ≥ 66% yes (supermajority — real dollars at stake)
  • Floor: ≥ 50% of total eligible weighted vote must be cast
  • Window: 7 days

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.

5MainNet Council — Final Approval

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:

  1. MainNet cNFT minted to the DevNet node_wallet PDA with DevNet binding baked in
  2. Registry entry activated — clients begin routing to this node for user traffic
  3. Bidirectional cross-chain credential binding now complete

Warden track vs. Bastion track — same shape, different criteria

Both node types follow the identical 5-gate pipeline. What differs is the specific thresholds applied at each gate.

DimensionWarden trackBastion track
Bond amountHigh (per tokenomics-v3.2)Lower (per tokenomics-v3.2)
Gate 1 application requirementsDomain, TLS posture, DDoS plan, geographic region declarationStorage capacity declared, parent Warden region identified
Tenure metrics measuredWallet-serving uptime, JWT signing success, challenge response, regional latencyShard retention rate, Warden-WSS uptime, retrieval success, storage-proof challenges
MainNet probation emphasisPublic-facing reachability, cert validity, rate-limit resilienceShard retention under Warden assignment, latency to parent Warden
Slashing triggersConflicting JWTs, wallet-facing misbehavior, duress breachShard loss, failed retrieval, failed storage proof, Warden-denial
Same governance pipeline, separate registries. 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.

5. Cross-chain cNFT binding

What the cNFT does

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).

Bidirectional binding

The critical security property is that both chains point at each other. Neither credential stands alone — they attest to each other.

DevNet cNFT metadata

{
  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

MainNet cNFT metadata

{
  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

Verification (anyone with a block explorer can do this in seconds)

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.

Lazy mint timing (locked)

The DevNet cNFT is not minted the moment Gate 3 passes. It's minted only after the operator has:

  1. Physically started their MainNet node
  2. Triggered MainNet PDA initialization
  3. Completed the MainNet probation period (1 epoch bonded + current+1 epoch operating)

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.

Immutability and revocation

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.

The "criminal record" aspect: If an operator is slashed and re-admitted later, the original credentials remain in 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.

6. Voting mechanics in detail

The core formula

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)

Why each term

TermWhy
node_bond_iSkin 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.
SummationMulti-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.

What the sqrt curve produces

Node tenureMultiplierVote weight (example: 10k bond)
1 epoch (14d)1.0010,000
4 epochs (~2mo)2.0020,000
10 epochs (~5mo)3.1631,623
26 epochs (1yr)5.1050,990
52 epochs (2yr)7.2172,111
104 epochs (4yr)10.20101,980

What bonds do NOT count

You have to be bonded and running to have a voice. Passive token holding doesn't grant governance power in v1. This is intentional — it keeps governance operator-led and prevents token speculators from capturing admission decisions. Future versions may introduce bicameral governance with SHRD-holder voting as a secondary chamber; v1 is purely operator-weighted.

Per-gate thresholds summary

GateNetworkBodyThresholdFloorWindow
2 — Peer VouchingDevNetDevNet operators> 50% yes≥ 50% weighted participation7 days
3 — DevNet GraduationDevNetDevNet council (3-of-5)3 yes votesN/APer Realms default
4 — MainNet CommunityMainNetMainNet operators≥ 66% yes≥ 50% weighted participation7 days
5 — MainNet CouncilMainNetMainNet council (3-of-5)3 yes votesN/APer Realms default

Recusal

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.

7. Slashing and the permanent record

Slashing is program-enforced, not DAO-voted

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.

Why: Slashing destroys operator bond. If it were a council vote, it would become political — "we don't like operator X" could become an attack vector. By encoding rules and amounts in the program, slashing stays objective. Every operator knows exactly what they will lose, for exactly which actions, before they act.

How slashing actually happens

Slash severity → tenure impact

SeverityBond impactTenure impact on affected node
Small — minor downtime, first-offense soft infractionsPer tokenomics-v3.2None
Medium — pattern misbehavior, repeated failures, missed challengesPer tokenomics-v3.2Halved — tenure_start_at pushed forward by half the elapsed period
Large — duress breach, double-signing, provable malicePer tokenomics-v3.2Reset to current slot — operator rebuilds tenure from zero on that node

The permanent criminal record

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
}
Your jail/release analogy: A "large" slash is serving time, being released, and starting fresh — but the conviction stays on your record forever. You can work to rebuild trust, but anyone considering you for a new position can see what happened. Which is exactly how consequences should behave in an unbreakable security system.

What slashing does NOT do

8. Security Council and emergency response

The two-operator pause mechanism

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.

Step 1. Any council/admin/Warden operator with stake files a concern flag:
    flag_concern(target_node, reason_code, evidence_uri)
    Flag is public, visible to all operators.
    Target node is NOT paused yet.

Step 2. A different operator reviews and can confirm:
    confirm_concern(flag_id)
    Confirmer must be distinct from flagger.
    Confirmer must not have an active unresolved flag of their own.

On confirmation: target node status → Paused.
    Clients immediately route around it.
    72-hour countdown begins.

Within 72 hours, council reviews and can:
     Extend pause for further investigation (council vote)
     Lift pause (exonerate target) — triggers false-flag slashing per tokenomics-v3.2
     Let 72h expire naturally — pause lifts automatically

If program detects cryptographic evidence of target misbehavior
    during the pause window, automatic slashing applies
    per tokenomics-v3.2 — no additional council action required.

Anti-abuse provisions

The core principle: Operators protect each other by flagging real issues; they do not attack each other with frivolous flags. The false-flag penalty is what enforces this culture. Every flag is a real commitment, not a light-touch concern.

9. DNS and infrastructure management

DNS is ShardKeep-administered, not operator-controlled

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:

What operators DO change: their server IP

StepActorAction
1OperatorFiles request_ip_change(target_epoch, new_ip, reason) signed by operator wallet. target_epoch must be ≥ current + 1 (next epoch minimum).
2AdminHas a conversation with the operator (the "social" step — confirms identity, understands the move). Acknowledges on-chain.
3AdminUpdates DNS A record to point the Warden's name at the new IP. DNS propagation begins.
4Program, at target_epoch boundaryAdmin executes on-chain tx updating the registry's ip_address field. DNS propagation should be complete by now.
5Warden continues operating, now from the new IP. No downtime. public_url unchanged throughout.

Emergency IP changes

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:

  1. Any operator files a Security Council flag (Step 1 of §8)
  2. A second operator confirms, pausing the node
  3. During the 72h pause window, admins coordinate with the operator and update DNS to the new IP
  4. Council reviews and lifts the pause once infrastructure is verified
  5. Node resumes service on the new IP

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.

10. Program authority and upgrade path

The real root of trust

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.

Three-phase authority transfer

PhaseNetworkUpgrade authority held byRationale
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.

What it takes to upgrade after transfer

  1. Developer writes the new program version
  2. Community proposal opened on MainNet DAO with the new program buffer hash
  3. Community vote (bond-weighted per §6) with supermajority threshold
  4. Council confirmation vote
  5. On passage, program upgrade executes; timelock of 72 hours before new program becomes active
  6. During the 72h timelock, anyone can spot a malicious upgrade and raise an alarm
Network rugs become structurally hard. A malicious actor wanting to inject a rogue Warden into the registry via program upgrade would need to: (a) compromise council majority, (b) pass a community vote, (c) survive 72 hours of public scrutiny before the change activates. Each stacks on top of the previous.

Program upgrade as a Tier-4 operation

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.

11. Rollout sequence

Why sequencing matters

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.

Phased deployment

PhaseWindowActions
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.

Graceful degradation — the signed cache

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.

Think of it like this: Your phone's contact list works offline. If you go offline for a day, no problem. If you go offline for a month, your phone warns you the list might be stale. Extension behaves similarly — a bad program upgrade, RPC problems, or Solana downtime don't lock users out, as long as the cache is reasonably fresh.

Extension-side hardening

12. Grandfather clause

Who's grandfathered

CountNode typeIdentifierpublic_url (if applicable)
1Wardensk-93e237643104d3f2master.shardkeep.io
12BastionsCurrent 12 sk-* bastion node IDsWSS-only; no public URL (they connect to the Warden)
0SentriesN/ASentries are browser-extension based; out of governance scope

Grandfather terms

Operator #2 and beyond go through the full pipeline

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.

13. Explicit non-goals

This proposal deliberately does not address:

14. Decision ledger

Every design decision resolved during the Q1–I3 walkthrough on 2026-04-21, with the final disposition.

IDQuestionResolution
Q1Graduation credential mechanismBidirectional soulbound cNFT binding via PDA node wallets. Lazy mint. No dedicated binding keys (operational node_wallet PDA doubles as identity).
Q2What "tenure" meansCurrent epoch + 1 epoch operational correctness AND 1 full epoch bonded. Total minimum 42 days. tenure_start_at = Gate 1 execution slot, cryptographically anchored.
Q3Grandfather clause1 Warden (sk-93e237643104d3f2, master.shardkeep.io) + 12 Bastions. Sentries excluded. Tenure honored from first_seen.
Gate 1Gate 1 mechanicsSingle admin action, not a DAO vote. Atomic airdrop + stake + PDA init + registry entry + tenure clock start. Admin signer logged.
Pre-Gate 1Shadow-running periodNode can run in the ShardKeep system before Gate 1. PDA address known (deterministic). Zero on-chain footprint, zero tenure, unbounded duration.
V1Gate 2 proposer eligibilityDifferent DevNet operator, in good standing, ≥ 2 epochs tenure. Candidate cannot self-propose.
V2Gate 2 co-proposerOne required.
V3Gate 2 threshold> 50% yes (simple majority — DevNet).
V4Gate 2 cooldown on failure14 days. 3 consecutive failures = 6 months ineligibility.
V5Gate 2 voucher liabilitySoft for v1 — reputation only. No staking liability in v1.
V6Council visibility of Gate 2 resultInformational. Council can override with public memo but should rarely need to.
Q4/D1Emergency pause authorityTwo-operator Security Council. 72h auto-expiry. Rate-limited per operator. False-flag slashing per tokenomics-v3.2.
Q4/D2Slashing authorityProgram-enforced. Not a DAO vote. Rules in tokenomics-v3.2.
Q4/D3URL changesRemoved from operator workflow. DNS is admin-controlled. Operators change IP via future-epoch announcement.
Q5/5.1-5.5Gate 4 voter weightBond-weighted with sqrt tenure multiplier. Warden and Bastion operators all vote. No operator-type weighting beyond natural bond ratios.
Q5/5.2Gate 4 threshold≥ 66% yes (supermajority — MainNet).
Q5/5.3Participation floor≥ 50% of eligible weighted vote must be cast.
Q5/5.4RecusalNone enforced. Voluntary self-recusal available.
Q5/5.6Voting window7 days. 14-day cooldown on failure. 3 consecutive failures = 6 months ineligibility.
I1Which bonds countActive and Probation status only. Dormant, paused, slashed, and exited don't count.
I2Minimum tenure for voting1 epoch (14 days) bonded before weight activates.
I3Tenure multiplier formulasqrt(epochs_bonded) applied per node.
I3-slashSlash severity → tenureSeverity-tiered: small=no impact, medium=halved, large=reset. Permanent slash_history record regardless of severity.
Gap #1Program upgrade authorityDAO treasury PDA on each network. 72h timelock on MainNet. DevNet keeps single-wallet until stabilization.
Gap #2TLS cert pinningSPKI pinning with certbot --reuse-key. Renewals become silent.
Gap #5iframe policyRefuse all framed contexts entirely.
Gap #7Program ID supply-chain defenseCross-check hardcoded ID against signed Warden response. RPC quorum (3 RPCs).
Gap #8Heartbeat-to-slashing policyNo auto-slash on uptime alone. Progressive status degradation per §10 of role-separation-v1.
Gap #9Client fallback for program bugsSigned 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