Skip to main content

Governance PDS

The Governance PDS is a dedicated Personal Data Server that stores all community-approved governance data. This makes Chive's governance ATProto-native and portable.

Overview

did:plc:chive-governance

The Governance PDS stores:

  • Authority records
  • Facet definitions
  • Field taxonomy
  • Organizational records
  • Approved proposals
  • Reconciliation history

Why a Governance PDS?

ATProto-native benefits

BenefitDescription
PortabilityGovernance data can move to different hosts
VerifiabilityAll records are cryptographically signed
InteroperabilityAny ATProto AppView can index the data
TransparencyPublic, auditable record of decisions

Comparison with traditional approaches

ApproachGovernance PDSCentral database
Data locationDecentralized PDSChive servers only
OwnershipCommunityPlatform
PortabilityFull export/importRequires migration
VerificationCryptographicTrust-based
FailoverAny compliant hostSingle point of failure

Record types

Authority records

// Collection: pub.chive.governance.authorityRecord
interface AuthorityRecordDocument {
$type: 'pub.chive.governance.authorityRecord';
id: string;
name: string;
type: 'field' | 'person' | 'organization' | 'concept';
aliases: string[];
description: string;
broaderTerms: string[];
narrowerTerms: string[];
relatedTerms: string[];
externalIds: Record<string, string>;
createdAt: string;
updatedAt: string;
}

Facet definitions

// Collection: pub.chive.governance.facet
interface FacetDocument {
$type: 'pub.chive.governance.facet';
id: string;
type: 'personality' | 'matter' | 'energy' | 'space' | 'time';
name: string;
description: string;
parentId?: string;
externalIds: Record<string, string>;
createdAt: string;
}

Approved proposals

// Collection: pub.chive.governance.approvedProposal
interface ApprovedProposalDocument {
$type: 'pub.chive.governance.approvedProposal';
id: string;
originalProposalUri: string;
type: ProposalType;
title: string;
changes: ProposalChanges;
votingSummary: VotingSummary;
approvedAt: string;
enactedAt: string;
}

Reconciliation records

// Collection: pub.chive.governance.reconciliation
interface ReconciliationDocument {
$type: 'pub.chive.governance.reconciliation';
authorityId: string;
externalSource: string;
externalId: string;
confidence: number;
evidenceType: string;
reconciler: string; // DID of person/automated
timestamp: string;
}

Architecture

┌─────────────────────────────────────────────────────────────────┐
│ Governance PDS │
│ (did:plc:chive-governance) │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Repository │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐│ │
│ │ │ Authority │ │ Facets │ │ Proposals ││ │
│ │ │ Records │ │ │ │ ││ │
│ │ └─────────────┘ └─────────────┘ └─────────────────────┘│ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ AT Protocol Firehose │
└─────────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────────┐
│ Chive AppView │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ L1 Cache │────►│ L2 Cache │────►│ PostgreSQL │ │
│ │ (Redis) │ │ (PDS) │ │ (indexed) │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────────────┘

Cache strategy

Multi-level caching

LevelStorageTTLPurpose
L1Redis5 minutesHot data, low latency
L2Governance PDSAuthoritativeSource of truth fallback
L3PostgreSQLUntil invalidationIndexed for queries

Cache invalidation

When governance data changes:

Proposal approved → Write to Governance PDS


Firehose event

┌───────────────┼───────────────┐
▼ ▼ ▼
Redis clear ES reindex Neo4j update

Security

Access control

OperationWho can perform
Read recordsAnyone
Create authority recordAuthority editors + governance committee
Update authority recordAuthority editors (via proposal)
Create facetGovernance committee
Update facetVia approved proposal
Sign recordsGovernance committee key

Key management

The Governance PDS uses a multi-signature scheme:

Committee member 1 key ─┐
Committee member 2 key ─┼──► 2-of-3 multisig ──► Record signature
Committee member 3 key ─┘

Threshold: 2 of 3 committee members must sign to commit changes.

Audit trail

All changes include provenance:

{
"record": { ... },
"sig": "z...",
"provenance": {
"proposal": "at://did:plc:.../pub.chive.graph.proposal/abc",
"approvedAt": "2025-01-15T10:30:00Z",
"signers": [
"did:plc:committee1...",
"did:plc:committee2..."
]
}
}

Operations

Backup and recovery

# Export full repository
atproto repo export did:plc:chive-governance --output backup.car

# Verify integrity
atproto repo verify backup.car

# Restore to new PDS (if needed)
atproto repo import backup.car --target new-pds.example.com

Monitoring

Metrics tracked:

  • Record count by type
  • Write latency
  • Firehose lag
  • Cache hit rates
  • Sync status with AppView

Failover

If the Governance PDS becomes unavailable:

  1. AppView continues operating from cached data
  2. Write operations queued
  3. Failover PDS activated from most recent backup
  4. DNS updated to point to failover
  5. Queued writes replayed

Migration path

Current state (pre-2026)

Authority records stored in PostgreSQL with Governance PDS as secondary.

Target state (2026+)

Governance PDS becomes authoritative source:

Phase 1 (Q1 2026): Dual-write to both PG and PDS
Phase 2 (Q2 2026): PDS becomes primary, PG becomes cache
Phase 3 (Q3 2026): Remove PG dependency for governance data

API access

Read from Governance PDS

GET https://pds.chive.pub/xrpc/com.atproto.repo.listRecords?
repo=did:plc:chive-governance&
collection=pub.chive.governance.authorityRecord&
limit=50
GET /xrpc/pub.chive.graph.getAuthority?id=authority-123

The AppView provides:

  • Faster response (cached)
  • Additional computed fields
  • Cross-references resolved
  • Search capability

Next steps