ACGP-1006: Certified Source Registry Specification

Status: Draft
Last Updated: 2026-01-08
Spec ID: ACGP-1006
Normative Keywords: MUST, SHOULD, MAY (per RFC 2119)

Abstract

This document specifies the Certified Source Registry, a curated, cryptographically signed catalog of authoritative data sources used for knowledge grounding validation in ACGP. The registry ensures that AI agents base their reasoning on reliable, verifiable, and contextually appropriate information sources. This specification defines the registry structure, source metadata schema, trust scoring mechanisms, Multi-Party Authorization (MPA) requirements, API interfaces, and cryptographic integrity requirements. The registry serves as a critical component in preventing hallucination, misinformation, and unauthorized information usage.

Table of Contents

  1. Introduction
  2. Registry Architecture
  3. Source Metadata Schema
  4. Trust and Authority Scoring
  5. Multi-Party Authorization (MPA)
  6. Registry Operations
  7. Query and Validation API
  8. Cryptographic Requirements
  9. Synchronization and Distribution
  10. Performance and Scaling
  11. Federation Model
  12. Conformance Requirements
  13. References

1. Introduction

AI agents must ground their reasoning in reliable sources to maintain accuracy and trustworthiness. The Certified Source Registry provides a standardized mechanism for validating information sources, ensuring that agents operate on verified, authoritative data appropriate for their domain and risk level.

1.1 Registry Objectives

  • Prevent Hallucination: Ensure agents reference real, verified sources
  • Establish Authority: Rank sources by expertise and reliability
  • Enforce Compliance: Meet regulatory requirements for data sourcing
  • Enable Auditability: Trace all decisions to authoritative sources
  • Maintain Currency: Track source updates and deprecation

1.2 Requirements Language

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.


2. Registry Architecture

2.1 System Components

graph TB
    subgraph "Registry Core"
        RS[(Registry Store)]
        VI[Validation Engine]
        TS[Trust Scorer]
        MPA[MPA Controller]
    end

    subgraph "Data Sources"
        REG[Regulatory<br/>Documents]
        PEER[Peer-Reviewed<br/>Publications]
        NEWS[News Outlets]
        CORP[Corporate<br/>Data]
        TECH[Technical<br/>Documentation]
    end

    subgraph "Consumers"
        GS[Governance Stewards]
        PA[Operating Agents]
        AUDIT[Audit Systems]
    end

    subgraph "Management"
        ADMIN[Registry Admins]
        REVIEW[Review Board]
        API[Management API]
    end

    REG --> VI
    PEER --> VI
    NEWS --> VI
    CORP --> VI
    TECH --> VI

    VI --> TS
    TS --> RS
    MPA --> RS

    RS --> GS
    RS --> PA
    RS --> AUDIT

    ADMIN --> API
    REVIEW --> MPA
    API --> MPA

    style RS fill:#e8f5e9
    style MPA fill:#fff3e0
    style VI fill:#e3f2fd

2.2 Registry Layers

Layer Function Components
Storage Layer Persistent source metadata Distributed database, IPFS, CDN
Validation Layer Source verification URL validator, content hasher, schema checker
Trust Layer Authority scoring ML models, heuristics, human review
Governance Layer Change control MPA system, audit log, versioning
API Layer External access REST/GraphQL, streaming, webhooks

2.3 Registry States

stateDiagram-v2
    [*] --> Submitted: New Source
    Submitted --> UnderReview: Validation Started
    UnderReview --> Rejected: Validation Failed
    UnderReview --> PendingApproval: Validation Passed

    PendingApproval --> Rejected: MPA Denied
    PendingApproval --> Active: MPA Approved

    Active --> Suspended: Issue Detected
    Active --> Deprecated: Source Outdated
    Active --> Updated: New Version

    Suspended --> Active: Issue Resolved
    Suspended --> Revoked: Permanent Removal

    Updated --> Active: Auto-transition
    Deprecated --> Archived: After Grace Period

    Rejected --> [*]
    Revoked --> [*]
    Archived --> [*]

3. Source Metadata Schema

3.1 Core Metadata Fields

{
  "source_id": "uuid-v4",
  "source_type": "regulatory|peer_reviewed|news|corporate|technical|reference",
  "identifiers": {
    "doi": "10.1234/example",
    "isbn": "978-0-123456-78-9",
    "url": "https://example.com/document",
    "hash": "sha256:abcd1234...",
    "custom": {}
  },
  "metadata": {
    "title": "Source Title",
    "authors": ["Author Name"],
    "publisher": "Publisher Name",
    "publication_date": "2024-01-15",
    "last_updated": "2025-01-15T10:00:00Z",
    "language": "en",
    "jurisdiction": ["US", "EU"],
    "domain": ["finance", "healthcare"],
    "tags": ["regulation", "compliance"]
  },
  "authority": {
    "trust_score": 0.95,
    "expertise_domains": ["financial_regulation"],
    "verification_level": "cryptographic|institutional|community|automated",
    "endorsements": [
      {
        "endorser": "regulatory_body_id",
        "timestamp": "2025-01-15T10:00:00Z",
        "signature": "ES256:..."
      }
    ]
  },
  "access": {
    "availability": "public|restricted|licensed",
    "license": "CC-BY-4.0",
    "cost": 0.00,
    "authentication_required": false,
    "rate_limits": {
      "requests_per_minute": 100
    }
  },
  "validity": {
    "effective_date": "2024-01-01",
    "expiration_date": "2026-12-31",
    "supersedes": ["old-source-id"],
    "superseded_by": null,
    "revision": 3
  },
  "governance": {
    "submitted_by": "user-uuid",
    "approved_by": ["approver1-uuid", "approver2-uuid"],
    "approval_date": "2024-01-20T10:00:00Z",
    "mpa_requirement": 2,
    "review_frequency": "quarterly"
  }
}

3.2 Source Type Specifications

Type Description Authority Weight Examples
Regulatory Government/regulatory documents 1.0 SEC filings, FDA guidance
Peer Reviewed Academic publications 0.9 Journal articles, research papers
Corporate Official company sources 0.7 Annual reports, press releases
Technical Technical documentation 0.8 API docs, specifications
News Journalistic sources 0.6 Reuters, Bloomberg
Reference Reference materials 0.5 Wikipedia, encyclopedias

3.3 Verification Levels

Level Requirements Trust Multiplier
Cryptographic Digital signature (ES256) from issuer 1.0
Institutional Verified institutional source 0.9
Community Community consensus (3+ endorsements) 0.7
Automated Algorithmic verification only 0.5

4. Trust and Authority Scoring

4.1 Trust Score Calculation

Trust scores align with ACGP governance thresholds and are calculated to support intervention decisions.

def calculate_trust_score(source: SourceMetadata) -> float:
    """
    Calculate trust score for a source.

    Trust scores range from 0.0 to 1.0, where:
    - 1.0 = Perfect trust (no risk)
    - 0.0 = No trust (maximum risk)

    This aligns with CTQ scores (higher is better) and opposes Risk Scores.
    """
    # Base score from source type
    base_score = SOURCE_TYPE_WEIGHTS[source.source_type]

    # Apply verification level multiplier
    verification_mult = VERIFICATION_MULTIPLIERS[source.verification_level]

    # Factor in age and updates
    age_factor = calculate_age_decay(source.publication_date)
    update_factor = calculate_update_bonus(source.last_updated)

    # Consider endorsements
    endorsement_score = sum([
        validate_endorsement_es256(e) * ENDORSER_WEIGHTS.get(e.endorser, 0.1)
        for e in source.endorsements
    ])

    # Apply domain expertise alignment
    domain_alignment = calculate_domain_match(
        source.expertise_domains,
        query_context.required_domains
    )

    # Composite score
    trust_score = (
        base_score * verification_mult * age_factor * 
        update_factor * (1 + endorsement_score) * domain_alignment
    )

    return min(1.0, max(0.0, trust_score))

4.2 Authority Ranking

Sources are ranked by composite authority:

Authority_Rank = Trust_Score × Relevance × Recency × Accessibility

where:
  - Trust_Score ∈ [0, 1]
  - Relevance ∈ [0, 1] based on domain/tag match
  - Recency ∈ [0, 1] with exponential decay
  - Accessibility ∈ [0.5, 1] based on availability

4.3 Trust Score Integration with Governance

Trust scores integrate with ACGP governance decisions:

trust_score_integration:
  # Map trust scores to risk assessment
  high_trust: # Trust Score >= 0.8
    - Reduces CTQ risk penalties
    - Allows lower verification requirements
    - Supports higher ACL tiers

  medium_trust: # Trust Score 0.5-0.8
    - Standard CTQ evaluation
    - Normal verification requirements
    - Standard ACL tier support

  low_trust: # Trust Score < 0.5
    - Increases CTQ risk penalties
    - Requires additional verification
    - May trigger escalation for high ACL tiers

4.4 Domain-Specific Weights

domain_weights:
  finance:
    regulatory: 1.0
    peer_reviewed: 0.8
    corporate: 0.7
    news: 0.6

  healthcare:
    peer_reviewed: 1.0
    regulatory: 0.9
    technical: 0.7
    corporate: 0.5

  technology:
    technical: 1.0
    peer_reviewed: 0.8
    corporate: 0.7
    news: 0.5

5. Multi-Party Authorization (MPA)

5.1 MPA Requirements by Operation

Operation Min Approvers Approver Roles Time Window
Add Source (Low Risk) 1 Any admin 24 hours
Add Source (High Risk) 2 Admin + Domain expert 48 hours
Modify Authority Score 2 Admin + Security 24 hours
Deprecate Source 1 Any admin 12 hours
Revoke Source 3 Admin + Security + Legal 6 hours
Emergency Revoke 2 Security + Any Immediate

5.2 MPA Workflow

sequenceDiagram
    participant Req as Requestor
    participant MPA as MPA Controller
    participant A1 as Approver 1
    participant A2 as Approver 2
    participant REG as Registry
    participant LOG as Audit Log

    Req->>MPA: Submit Change Request
    MPA->>MPA: Validate Request
    MPA->>MPA: Determine Required Approvers

    MPA->>A1: Request Approval
    MPA->>A2: Request Approval

    A1->>MPA: Approve + Sign (ES256)
    A2->>MPA: Approve + Sign (ES256)

    MPA->>MPA: Verify ES256 Signatures
    MPA->>MPA: Check Quorum

    alt Approved
        MPA->>REG: Apply Change
        REG->>LOG: Log Change
        MPA->>Req: Change Applied
    else Denied
        MPA->>LOG: Log Denial
        MPA->>Req: Change Denied
    end

5.3 Approval Record

{
  "approval_id": "uuid-v4",
  "request": {
    "type": "add_source|modify|revoke",
    "source_id": "uuid-v4",
    "changes": {},
    "requestor": "user-uuid",
    "timestamp": "2025-01-15T10:00:00Z",
    "justification": "Reason for change"
  },
  "approvals": [
    {
      "approver_id": "approver1-uuid",
      "role": "admin",
      "decision": "approve|deny",
      "timestamp": "2025-01-15T11:00:00Z",
      "signature": {
        "algorithm": "ES256",
        "value": "base64_encoded_signature"
      },
      "comments": "Optional feedback"
    }
  ],
  "result": {
    "status": "approved|denied|timeout",
    "applied_at": "2025-01-15T12:00:00Z",
    "applied_by": "system",
    "rollback_available": true
  }
}

6. Registry Operations

6.1 Source Lifecycle Operations

6.1.1 Source Submission

def submit_source(source_data: dict, submitter: User) -> SourceSubmission:
    # Validate schema
    if not validate_schema(source_data, SOURCE_SCHEMA):
        raise ValidationError("Invalid source schema")

    # Check for duplicates
    if find_duplicate(source_data):
        raise DuplicateError("Source already exists")

    # Assess risk level
    risk_level = assess_source_risk(source_data)

    # Create submission
    submission = SourceSubmission(
        source_data=source_data,
        submitter=submitter,
        risk_level=risk_level,
        status="submitted",
        mpa_requirement=determine_mpa_requirement(risk_level)
    )

    # Start validation workflow
    start_validation_workflow(submission)

    return submission

6.1.2 Source Validation

async def validate_source(submission: SourceSubmission) -> ValidationResult:
    results = []

    # URL validation
    if submission.source_data.get("url"):
        results.append(await validate_url(submission.source_data["url"]))

    # Content verification
    content_hash = await fetch_and_hash(submission.source_data)
    results.append(verify_content_hash(content_hash, submission.source_data))

    # Metadata validation
    results.append(validate_metadata(submission.source_data))

    # Authority verification
    if submission.source_data.get("endorsements"):
        for endorsement in submission.source_data["endorsements"]:
            results.append(await verify_endorsement_es256(endorsement))

    return ValidationResult(
        passed=all(r.passed for r in results),
        details=results,
        trust_score=calculate_initial_trust(results)
    )

6.1.3 Source Updates

def update_source(source_id: str, updates: dict, requestor: User) -> UpdateResult:
    source = get_source(source_id)

    # Check if update requires MPA
    if requires_mpa(source, updates):
        return initiate_mpa_workflow(source, updates, requestor)

    # Apply updates
    updated_source = apply_updates(source, updates)

    # Re-calculate trust score
    updated_source.trust_score = calculate_trust_score(updated_source)

    # Version the change
    updated_source.revision += 1
    updated_source.last_updated = datetime.utcnow()

    # Store and propagate
    store_source(updated_source)
    propagate_update(updated_source)

    return UpdateResult(success=True, new_revision=updated_source.revision)

6.2 Bulk Operations

6.2.1 Batch Import

batch_import:
  format: jsonl | csv | xml
  validation: parallel
  max_batch_size: 1000
  error_handling: 
    strategy: continue_on_error
    error_threshold: 10%
  mpa_requirement:
    bulk_add: 3 approvers
    review_window: 72 hours

6.2.2 Periodic Review

async def periodic_review():
    # Review sources by age
    old_sources = query_sources(
        last_updated_before=datetime.utcnow() - timedelta(days=90)
    )

    for source in old_sources:
        # Check if still valid
        if not await check_source_validity(source):
            await mark_for_review(source)

        # Check for newer versions
        if newer_version := await find_newer_version(source):
            await suggest_upgrade(source, newer_version)

    # Review trust scores
    await recalculate_all_trust_scores()

    # Generate review report
    return generate_review_report()

7. Query and Validation API

7.1 Query Interface

7.1.1 REST API Endpoints

endpoints:
  # Query sources
  GET /sources:
    parameters:
      - domain: string[]
      - type: string[]
      - min_trust: float
      - jurisdiction: string[]
      - tags: string[]
      - limit: integer
      - offset: integer
    response: SourceList

  # Get specific source
  GET /sources/{source_id}:
    response: SourceMetadata

  # Validate source reference
  POST /validate:
    body:
      source_ref: string
      context: object
      min_trust_required: float  # Based on ACL tier
    response: ValidationResult

  # Batch validation
  POST /validate/batch:
    body:
      source_refs: string[]
      context: object
    response: ValidationResult[]

7.1.2 GraphQL Schema

type Source {
  id: ID!
  type: SourceType!
  title: String!
  trustScore: Float!
  metadata: SourceMetadata!
  authority: AuthorityInfo!
  validity: ValidityInfo!
}

type Query {
  sources(
    filter: SourceFilter
    sort: SourceSort
    pagination: Pagination
  ): SourceConnection!

  source(id: ID!): Source

  validateSource(
    ref: String!
    context: ValidationContext
    minTrustRequired: Float
  ): ValidationResult!
}

input SourceFilter {
  domain: [String!]
  type: [SourceType!]
  minTrust: Float
  maxAge: Int
  jurisdiction: [String!]
}

7.2 Validation API

7.2.1 Real-time Validation

class RegistryValidator:
    async def validate_source_reference(
        self,
        reference: str,
        context: dict
    ) -> ValidationResult:
        # Parse reference
        source_id = self.parse_reference(reference)

        # Fetch source metadata
        source = await self.registry.get_source(source_id)

        if not source:
            return ValidationResult(
                valid=False,
                reason="Source not found in registry"
            )

        # Check validity period
        if not self.is_valid_period(source):
            return ValidationResult(
                valid=False,
                reason="Source outside validity period"
            )

        # Check domain match
        if not self.matches_domain(source, context.get("domain")):
            return ValidationResult(
                valid=False,
                reason="Source not valid for domain"
            )

        # Check trust threshold (aligned with ACGP-1005)
        required_trust = self.get_required_trust_by_acl(context.get("acl_tier", "ACL-2"))
        if source.trust_score < required_trust:
            return ValidationResult(
                valid=False,
                reason=f"Trust score {source.trust_score} below required {required_trust}"
            )

        # Check ACL tier requirements
        if not self.meets_acl_requirements(source, context.get("acl_tier")):
            return ValidationResult(
                valid=False,
                reason="Source not permitted for ACL tier"
            )

        return ValidationResult(
            valid=True,
            source=source,
            trust_score=source.trust_score,
            warnings=self.check_warnings(source)
        )

    def get_required_trust_by_acl(self, acl_tier: str) -> float:
        """
        Map ACL tiers to minimum trust score requirements.

        Trust scores align with CTQ quality (higher is better).
        These thresholds ensure sources are appropriate for agent risk level.
        """
        return {
            'ACL-0': 0.5,   # Minimal risk - moderate trust required
            'ACL-1': 0.6,   # Low risk - good trust required
            'ACL-2': 0.7,   # Medium risk - high trust required
            'ACL-3': 0.8,   # High risk - very high trust required
            'ACL-4': 0.85,  # Very high risk - excellent trust required
            'ACL-5': 0.9    # Critical risk - near-perfect trust required
        }.get(acl_tier, 0.7)

7.2.2 Batch Validation

async def validate_batch(
    references: List[str],
    context: dict
) -> BatchValidationResult:
    results = await asyncio.gather(*[
        validate_source_reference(ref, context)
        for ref in references
    ])

    return BatchValidationResult(
        total=len(references),
        valid=sum(1 for r in results if r.valid),
        invalid=sum(1 for r in results if not r.valid),
        average_trust=mean([r.trust_score for r in results if r.valid]),
        results=results
    )

8. Cryptographic Requirements

8.1 Registry Integrity

8.1.1 Merkle Tree Structure

class RegistryMerkleTree:
    def __init__(self):
        self.root = None
        self.leaves = []

    def add_source(self, source: SourceMetadata):
        # Create leaf hash (SHA-256)
        leaf = self.hash_source_sha256(source)
        self.leaves.append(leaf)

        # Rebuild tree
        self.rebuild_tree()

    def hash_source_sha256(self, source: SourceMetadata) -> str:
        # Canonical JSON serialization
        canonical = json.dumps(source, sort_keys=True, separators=(',', ':'))

        # SHA-256 hash
        return hashlib.sha256(canonical.encode()).hexdigest()

    def get_proof(self, source_id: str) -> MerkleProof:
        # Generate inclusion proof
        leaf_index = self.find_leaf_index(source_id)
        return self.generate_proof_path(leaf_index)

    def verify_proof(self, source: SourceMetadata, proof: MerkleProof) -> bool:
        # Verify source is in registry
        leaf = self.hash_source_sha256(source)
        computed_root = self.compute_root_from_proof(leaf, proof)
        return computed_root == self.root

8.1.2 Digital Signatures

signature_requirements:
  algorithm: ES256  # ECDSA with P-256 and SHA-256 (standardized)
  key_size: 256 bits

  signing_operations:
    - source_submission
    - source_approval
    - trust_score_update
    - source_revocation
    - endorsements

  signature_format:
    header:
      alg: ES256
      typ: JWT
      kid: key_identifier
    payload:
      operation: string
      data_hash: sha256_hash
      timestamp: unix_timestamp
      nonce: random_string
    signature: base64url_encoded

8.2 Source Content Verification

class ContentVerifier:
    def verify_source_content(
        self,
        source: SourceMetadata,
        content: bytes
    ) -> VerificationResult:
        # Calculate content hash (SHA-256)
        content_hash = hashlib.sha256(content).hexdigest()

        # Compare with registered hash
        if content_hash != source.identifiers.get("hash"):
            return VerificationResult(
                verified=False,
                reason="Content hash mismatch"
            )

        # Verify ES256 digital signature if present
        if signature := source.metadata.get("signature"):
            if not self.verify_signature_es256(content, signature):
                return VerificationResult(
                    verified=False,
                    reason="Invalid ES256 signature"
                )

        return VerificationResult(
            verified=True,
            content_hash=content_hash,
            timestamp=datetime.utcnow()
        )

9. Synchronization and Distribution

9.1 Registry Replication

graph TB
    subgraph "Primary Registry"
        PR[(Primary Node)]
        PW[Write Endpoint]
    end

    subgraph "Regional Replicas"
        R1[(US-East)]
        R2[(EU-West)]
        R3[(AP-South)]
    end

    subgraph "Edge Caches"
        E1[CDN 1]
        E2[CDN 2]
        E3[CDN 3]
    end

    PW --> PR
    PR -->|Sync| R1
    PR -->|Sync| R2
    PR -->|Sync| R3

    R1 --> E1
    R2 --> E2
    R3 --> E3

    style PR fill:#4caf50
    style R1 fill:#81c784
    style R2 fill:#81c784
    style R3 fill:#81c784

9.2 Synchronization Protocol

class RegistrySync:
    async def sync_with_primary(self):
        # Get local state
        local_version = self.get_local_version()
        local_root = self.get_merkle_root()

        # Query primary for updates
        updates = await self.primary.get_updates_since(
            version=local_version,
            root=local_root
        )

        # Validate updates (ES256 signatures)
        for update in updates:
            if not self.validate_update_es256(update):
                raise SyncError(f"Invalid update signature: {update.id}")

        # Apply updates in order
        for update in updates:
            await self.apply_update(update)

        # Verify final state
        if not await self.verify_consistency():
            await self.trigger_full_resync()

9.3 Distribution Strategy

Component Update Frequency Propagation Time Cache TTL
Source Metadata On change <60 seconds 1 hour
Trust Scores Hourly <5 minutes 30 minutes
Merkle Root Every update <30 seconds 5 minutes
Revocations Immediate <10 seconds No cache

10. Performance and Scaling

10.1 Performance Requirements

Operation P50 P95 P99 SLA
Single Query 10ms 50ms 100ms 99.9%
Batch Query (100) 50ms 200ms 500ms 99.5%
Validation 5ms 25ms 50ms 99.99%
Update Propagation 1s 30s 60s 99%
MPA Approval 1min 1hr 24hr 95%

10.2 Scaling Architecture

scaling_strategy:
  storage:
    primary_db: PostgreSQL
    sharding: by_domain
    replicas: 3 per region

  caching:
    l1_cache:
      type: in-memory
      size: 1GB
      ttl: 60s
    l2_cache:
      type: Redis
      size: 10GB
      ttl: 300s
    l3_cache:
      type: CDN
      ttl: 3600s

  query_optimization:
    indexes:
      - domain
      - trust_score
      - publication_date
      - source_type
    materialized_views:
      - high_trust_sources
      - recent_sources
      - domain_authorities

10.3 Capacity Planning

def estimate_capacity(config: RegistryConfig) -> CapacityEstimate:
    # Storage requirements
    avg_source_size = 10_000  # bytes
    total_sources = config.expected_sources
    metadata_storage = total_sources * avg_source_size

    # Index overhead (30% of data)
    index_storage = metadata_storage * 0.3

    # Audit log (10x metadata over time)
    audit_storage = metadata_storage * 10

    # Query load
    qps = config.expected_qps
    cache_hit_ratio = 0.8
    db_qps = qps * (1 - cache_hit_ratio)

    return CapacityEstimate(
        storage_required=metadata_storage + index_storage + audit_storage,
        cache_size_required=metadata_storage * 0.1,
        db_connections=db_qps / 10,  # 10 queries per connection
        bandwidth_required=qps * avg_source_size * 0.1  # 10% return full source
    )

11. Federation Model

11.1 Federation Overview

Registry federation enables multiple independent registries to interoperate while maintaining autonomy and trust boundaries.

┌─────────────────────────────────────────────────────────────────┐
│                    FEDERATED REGISTRY MODEL                      │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  ┌─────────────┐    trust    ┌─────────────┐                    │
│  │  Primary    │◄───────────►│  Partner    │                    │
│  │  Registry   │             │  Registry   │                    │
│  │  (org A)    │             │  (org B)    │                    │
│  └──────┬──────┘             └──────┬──────┘                    │
│         │                           │                           │
│    ┌────┴────┐                 ┌────┴────┐                     │
│    │ Sources │                 │ Sources │                     │
│    │ A1, A2  │                 │ B1, B2  │                     │
│    └─────────┘                 └─────────┘                     │
│                                                                  │
│  ┌─────────────────────────────────────────────────────────┐    │
│  │                  FEDERATION PROTOCOL                     │    │
│  │                                                          │    │
│  │  1. Trust establishment (mutual TLS + certificate)       │    │
│  │  2. Capability negotiation (supported source types)      │    │
│  │  3. Query forwarding (cross-registry lookups)            │    │
│  │  4. Trust score translation (normalize between systems)  │    │
│  │  5. Audit trail synchronization (cross-registry refs)    │    │
│  │                                                          │    │
│  └─────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────┘

11.2 Trust Bootstrapping

Establishing trust between registries:

federation:
  trust_bootstrapping:
    # Step 1: Certificate exchange
    method: mutual_tls
    certificate_requirements:
      issuer: approved_ca_list
      validity_min_days: 30
      key_algorithm: ECDSA-P256

    # Step 2: Capability declaration
    capabilities:
      - source_types: [regulatory, peer_reviewed, technical]
      - trust_model: acgp_standard
      - api_version: "1.0"

    # Step 3: Trust level assignment
    initial_trust_level: provisional
    graduation_criteria:
      - successful_validations: 100
      - time_in_provisional: 30_days
      - audit_passed: true

    # Trust levels
    trust_levels:
      provisional: 0.5    # Limited trust, queries verified
      standard: 0.8       # Normal operations
      trusted: 1.0        # Full trust, no verification

11.3 Cross-Registry Queries

class FederatedRegistry:
    """Federated registry query handler."""

    def __init__(self):
        self.local_registry = LocalRegistry()
        self.federation_peers = []

    async def query(self, source_ref: str) -> SourceRecord:
        """
        Query source across federation.

        1. Check local registry first
        2. If not found, query federation peers
        3. Apply trust translation for foreign sources
        """
        # Try local first
        local_result = self.local_registry.query(source_ref)
        if local_result:
            return local_result

        # Query federation peers
        for peer in self.federation_peers:
            if not peer.supports_source_type(source_ref):
                continue

            try:
                remote_result = await peer.query(source_ref)
                if remote_result:
                    # Translate trust score based on peer trust level
                    translated = self.translate_trust(
                        remote_result,
                        peer.trust_level
                    )
                    return translated
            except FederationError as e:
                self.log_federation_failure(peer, e)
                continue

        return None

    def translate_trust(self, record: SourceRecord, peer_trust: float) -> SourceRecord:
        """
        Adjust trust score based on peer trust level.

        Formula: effective_trust = source_trust * peer_trust * 0.9
        The 0.9 factor accounts for federation overhead.
        """
        record.trust_score = record.trust_score * peer_trust * 0.9
        record.provenance = f"federated:{record.provenance}"
        return record

11.4 Federation Governance

federation_governance:
  admission:
    requirements:
      - signed_participation_agreement
      - security_audit_passed
      - operational_capacity_verified
    approval: majority_vote  # Existing federation members

  operations:
    audit_frequency: quarterly
    sync_interval: 1_hour
    failure_threshold: 5  # Consecutive failures before suspension

  dispute_resolution:
    process: binding_arbitration
    neutral_party: acgp_foundation

  exit:
    notice_period: 90_days
    data_handling: source_references_preserved

11.5 Anti-Patterns

Registry Capture - One organization controlling majority of sources - Mitigation: Diversity requirements for trusted registries

Trust Score Inflation - Registries artificially inflating scores for partners - Mitigation: Cross-validation requirements, audit trails

Circular References - Registry A trusts B, B trusts C, C trusts A with amplification - Mitigation: Trust decay per hop, cycle detection

Single Point of Failure - All queries routing through one registry - Mitigation: Peer-to-peer queries, no hub dependency


12. Conformance Requirements

12.1 Registry Implementation Requirements

A conformant Certified Source Registry MUST:

12.1.1 Core Functionality

  • Implement the complete source metadata schema
  • Support all source lifecycle states
  • Calculate trust scores using the defined algorithm
  • Enforce MPA requirements for changes
  • Maintain cryptographic integrity with Merkle trees

12.1.2 API Requirements

  • Provide REST or GraphQL query interface
  • Support single and batch validation
  • Implement rate limiting and authentication
  • Return results within performance SLAs
  • Support pagination for large result sets

12.1.3 Security Requirements

  • Sign all source records with ES256 (standardized)
  • Verify ES256 signatures on submission
  • Maintain audit log of all changes
  • Support TLS 1.3 for all connections
  • Implement role-based access control

12.1.4 Operational Requirements

  • Achieve 99.9% availability for queries
  • Propagate updates within 60 seconds
  • Support at least 1000 sources
  • Handle 100 QPS minimum
  • Retain audit logs for 7 years

12.1.5 Integration Requirements

  • Provide trust scores aligned with ACGP-1005 thresholds
  • Support ACL-tier based trust requirements
  • Integrate with governance decision flow
  • Support trust score to risk score mapping

12.2 Client Integration Requirements

Clients using the registry MUST: - Cache query results respecting TTL - Validate source references before use - Handle validation failures gracefully - Report invalid sources to registry - Implement exponential backoff for retries - Apply ACL-tier appropriate trust thresholds

12.3 Testing Requirements

Implementations MUST pass: - Schema validation test suite - Trust score calculation tests - MPA workflow tests - Performance benchmark suite - Security penetration tests - ES256 signature verification tests


13. References

Normative References

  • ACGP-1000: Core Protocol Specification
  • ACGP-1001: Terminology and Definitions
  • ACGP-1002: Architecture Specification
  • ACGP-1003: Message Formats & Wire Protocol
  • ACGP-1005: ARS-CTQ-ACL Integration Framework
  • ACGP-1007: Security Considerations
  • RFC 2119: Key words for use in RFCs
  • RFC 7515: JSON Web Signature (JWS)

Informative References

  • DOI Specification: Digital Object Identifier System
  • ISBN Standard: International Standard Book Number
  • Dublin Core: Metadata standards
  • IPFS: InterPlanetary File System for distributed storage
  • Merkle Trees: R.C. Merkle, "A Digital Signature Based on a Conventional Encryption Function"

Cryptographic Standards

  • FIPS 186-4: Digital Signature Standard
  • NIST SP 800-56A: Pair-Wise Key Establishment Schemes
  • RFC 7518: JSON Web Algorithms (JWA)

End of ACGP-1006