Skip to content

Cut registry-consensus validation to ciris-canonical founder-quorum (retire single-steward-key root; end-state, no backward-compat) #69

Description

@emooreatx

Cut registry-consensus validation to the ciris-canonical founder-quorum — retire the single-steward-key root

Directive (maintainer): end-state cutover, NO backward-compat. "It is fine if it breaks, we need to get to the end state, just cut over." Do not build a dual-accept migration window.

The change

Today the single registry authority key is one secret vaulted + replicated US↔EU — the AV-14 single-point-of-compromise in HA clothing. It is being retired. Registry authority becomes the 2-of-3 founder-quorum of the three fabric occurrences' operational keys (lens + registry-us + registry-eu), the ciris-canonical governed infrastructure community (CEG 1.0-RC2 §5.6.8.10 / §8.1.13.3; CIRISRegistry/MISSION §2.1.1).

So the query type that validates registry consensus changes:

  • FROM — single-key verification (steward_key.rs, §10.2 response-auth): pin one steward fingerprint, verify signatures against that key.
  • TO — founder-quorum verification (infrastructure_community.rs): verify_founder_quorum over ciris-canonical — the machinery already shipped in v5.0.0 (Canonical encoding for M-of-N bootstrap key set + rotation ceremony tooling #31). This is wiring + re-rooting, not new crypto.

Concretely:

  1. Re-root the consumer pin: from a steward fingerprint → the community_key_id = "ciris-canonical" trust anchor.
  2. Resolve + quorum-verify (CEG 1.0-RC2 §8.1.13.1.1(a)): resolve_community("ciris-canonical", now) → founder-subset eval {m : m.role == founder} → require 2-of-3 signatures; comparator = quorum_weight DESC → signed_timestamp DESC → canonical_bytes_hash (the same one the resolver already pins).
  3. Retire steward_key.rs as the registry-consensus trust root. It does not vanish — each occurrence still exposes its own identity (now /v1/identity, the §5.6.8.8.2 six-key aggregate) — but it is no longer the root of registry-consensus trust. The quorum is. No fallback to the single-key path.

Why this is correct (CEG 1.0-RC2, grounded)

  • ciris-canonical is cohort_subkind: infrastructureplaintext Commons, no DEK (§8.1.13.3 Open-Q1 ruling): the trust root is world-auditable by design, so quorum verification reads cleartext member/founder data.
  • An infrastructure community's authority is the founder-quorum (§8.1.13.1.1(a) founder-subset eval), not any single key. Using the occurrences' operational keys as the quorum shares is conformant — a member key is just the occurrence's identity key; the quorum threshold supplies the privilege gate (so no separate offline authority key, and no §5.6.8.8.2/AV-17 reuse issue — same signing purpose).

Cross-repo dependency (not a blocker on starting the verifier wiring)

Registry must emit the ciris-canonical community Contribution naming the three occurrences as founders (role == founder). That gates on the three having distinct operational keys — i.e. splitting the shared vaulted key into registry-us / registry-eu operational keys (lens already has its own). That's the fabric-node key split; Verify's new query validates against the community once it's emitted. Verify-side wiring (route registry-consensus → verify_founder_quorum, re-root the pin) can land ahead of it against test fixtures.

Acceptance

  • Registry-consensus validation calls verify_founder_quorum over ciris-canonical; the single-steward-key path is no longer consulted for it.
  • Consumer pin is community_key_id, not a steward fingerprint.
  • 2-of-3 founder-quorum enforced via §8.1.13.1.1(a) resolution; no single-key fallback.
  • steward_key.rs retained only as per-occurrence identity surface, not the consensus root.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions