RFC 0001 - Cross-Repo Coordination with Realms: - Daemon architecture with HTTP server on localhost:7865 - SQLite persistence for sessions, realms, notifications - Realm service with git-based storage and caching - CLI commands: realm status/sync/check/worktree/pr/admin - Session coordination for multi-repo work RFC 0002 Phase 1 - Realm MCP Integration: - realm_status: Get realm overview (repos, domains, contracts) - realm_check: Validate contracts/bindings with errors/warnings - contract_get: Get contract details with bindings - Context detection from .blue/config.yaml - 98% expert panel alignment via 12-expert dialogue Also includes: - CLI documentation in docs/cli/ - Spike for Forgejo tunnelless access - 86 tests passing Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
31 KiB
RFC 0001: Cross-Repo Coordination with Realms
| Status | Accepted |
| Created | 2026-01-24 |
| Implemented | 2026-01-24 |
| CLI Docs | docs/cli/realm.md |
| Source | Spike: cross-repo-coordination |
| Dialogue | cross-repo-realms.dialogue.md |
| Refinement | cross-repo-realms-refinement.dialogue.md |
Problem
We have repositories under different ownership that depend on each other:
aperture(training-tools webapp) needs S3 access to data in another AWS accountfungal-image-analysisgrants that access via IAM policies
When aperture adds a new S3 path, fungal's IAM policy must update. Currently:
- No awareness - Blue in aperture doesn't know fungal exists
- No coordination - Changes require manual cross-repo communication
- No tracking - No record of cross-repo dependencies
Goals
- Awareness - Blue sessions know about related repos and their dependencies
- Coordination - Changes in one repo trigger notifications in dependent repos
- Trust boundaries - Different orgs can coordinate without shared write access
- Auditability - All cross-repo coordination is version-controlled
Non-Goals
- Automatic code changes across repos (manual review required)
- Public realm discovery (future scope)
- Monorepo support (for MVP, each repo is a distinct participant)
- Cyclic dependencies between domains
Proposal
Hierarchy
Daemon (per-machine)
└── Realm (git repo in Forgejo)
└── Domain (coordination context)
├── Repo A (participant)
└── Repo B (participant)
| Level | Purpose | Storage |
|---|---|---|
| Daemon | Manages realms, sessions, notifications | ~/.blue/daemon.db |
| Realm | Groups related coordination domains | Git repo in Forgejo, cloned to ~/.blue/realms/ |
| Domain | Coordination context between repos | Directory in realm repo |
| Repo | Actual code repository (can participate in multiple domains) | .blue/config.yaml declares membership |
Key insight: A domain is the relationship (edge), not the thing (node). Repos are nodes; domains are edges connecting them.
┌─────────────────────────────────────────┐
│ Realm: letemcook │
│ │
│ ┌─────────────────────────────────┐ │
│ │ Domain: s3-access │ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────┐ │ │
│ │ │ aperture │◄─►│ fungal │ │ │
│ │ │ (export) │ │ (import) │ │ │
│ │ └──────────┘ └──────────┘ │ │
│ │ │ │
│ └─────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────┐ │
│ │ Domain: training-pipeline │ │
│ │ │ │
│ │ ┌──────────┐ ┌──────────┐ │ │
│ │ │ fungal │◄─►│ ml-infra │ │ │
│ │ │ (export) │ │ (import) │ │ │
│ │ └──────────┘ └──────────┘ │ │
│ │ │ │
│ └─────────────────────────────────┘ │
│ │
└─────────────────────────────────────────┘
Note: fungal participates in both domains with different roles.
Architecture
Daemon
Blue runs as a per-machine daemon that manages realm state, git operations, and session coordination.
┌─────────────────────────────────────────────────────────────┐
│ Blue Daemon │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ HTTP Server │ │ Git Manager │ │ Session Mgr │ │
│ │ localhost: │ │ (git2 crate) │ │ │ │
│ │ 7865 │ │ │ │ │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │ │
│ └─────────────────┼─────────────────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ daemon.db │ │
│ │ (SQLite) │ │
│ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
▲ ▲
│ HTTP │ HTTP
│ │
┌─────┴─────┐ ┌──────┴──────┐
│ blue CLI │ │ Blue GUI │
│ │ │ (future) │
└───────────┘ └─────────────┘
Key properties:
- Runs as system service (launchd/systemd)
- Auto-starts on first CLI invocation
- HTTP API on
localhost:7865(GUI-friendly) - All git operations via
git2crate (no subprocess) - Single-user assumption (multi-user is future work)
Directory Structure
~/.blue/
├── daemon.db # Daemon state (realms, sessions, notifications)
├── realms/ # Managed realm repo clones
│ └── {realm-name}/ # Cloned from Forgejo
└── credentials.yaml # Optional, prefer git credentials
/var/run/blue/ # Or $XDG_RUNTIME_DIR/blue/ on Linux
└── blue.pid # Daemon PID file
realm-{name}/ # Git repository (in Forgejo)
├── realm.yaml # Metadata, governance, trust
├── repos/
│ └── {repo}.yaml # Registered repos
└── domains/
└── {domain}/
├── domain.yaml # Coordination context
├── governance.yaml # Optional domain-level governance
├── contracts/
│ └── {name}.yaml # Schema, version, validation, owner
└── bindings/
└── {repo}.yaml # Export/import declarations
{repo}/.blue/
├── config.yaml # Realm membership (name + Forgejo URL)
└── cache.db # SQLite cache for exports, contracts
realm.yaml
name: letemcook
version: "1.0.0"
created_at: 2026-01-24T10:00:00Z
governance:
admission: approval # open | approval | invite-only
approvers:
- eric@example.com
breaking_changes:
require_approval: true
grace_period_days: 14
trust:
mode: collaborative # collaborative | vendor-customer | federation
require_signed_commits: false
permissions:
repos/{repo}.yaml: [repo_maintainers]
domains/{domain}/domain.yaml: [domain_owners]
domains/{domain}/contracts/{name}.yaml: [contract_owner]
domains/{domain}/bindings/{repo}.yaml: [repo_maintainers]
repos/{repo}.yaml
name: aperture
org: cultivarium # Optional org prefix
path: /Users/ericg/letemcook/aperture
# Or remote:
# url: git@github.com:cultivarium/aperture.git
maintainers:
- eric@example.com
joined_at: 2026-01-24T10:00:00Z
domains/{domain}/domain.yaml
name: s3-access
description: Coordinates S3 bucket access between aperture and fungal
created_at: 2026-01-24T10:00:00Z
members:
- aperture
- fungal-image-analysis
domains/{domain}/contracts/{contract}.yaml
name: s3-permissions
version: "1.4.0"
owner: aperture # Only this repo can modify the contract
compatibility:
backwards: true # New version readable by old importers
forwards: false # Old version NOT readable by new importers
schema:
type: object
required: [read]
properties:
read:
type: array
items: { type: string }
write:
type: array
items: { type: string }
default: []
delete:
type: array
items: { type: string }
default: []
value:
read:
- "jobs/*/masks/*"
- "jobs/*/*/config.json"
- "training-runs/*"
- "training-metrics/*"
write:
- "jobs/*/*/manifest.json"
- "training-metrics/*"
delete: []
validation:
exporter: scripts/validate-s3-paths.sh
importer: scripts/validate-iam-policy.sh
ci_only:
- scripts/integration-test.sh
evolution:
- version: "1.0.0"
changes: ["Initial with read array"]
compatible: true
- version: "1.3.0"
changes: ["Added write array"]
compatible: true
- version: "1.4.0"
changes: ["Added delete array"]
compatible: true
domains/{domain}/bindings/{repo}.yaml
Export binding:
repo: aperture
role: provider
exports:
- contract: s3-permissions
source_files:
- models/training/s3_paths.py
- models/shared/data/parquet_export.py
Import binding:
repo: fungal-image-analysis
role: consumer
imports:
- contract: s3-permissions
version: ">=1.0.0, <2.0.0" # Semver range
binding: cdk/training_tools_access_stack.py
status: current
resolved_version: "1.4.0"
resolved_at: 2026-01-24T12:00:00Z
Local Configuration
# aperture/.blue/config.yaml
realm:
name: letemcook
url: https://git.example.com/realms/letemcook.git
repo: aperture
# Domains and contracts are defined in the realm repo (single source of truth).
# This config just declares membership. The daemon resolves the rest.
The realm repo is authoritative for what repos exist and their roles. Local config only declares "I belong to realm X at URL Y." The daemon clones and manages the realm repo automatically.
Coordination Model
Blue uses a hybrid coordination model:
- Real-time awareness (Daemon): Fast session tracking and notifications
- Durable changes (Git PRs): Source of truth, auditable, PR-based
┌──────────────────────────────────────────────────────────────┐
│ Coordination Layers │
├──────────────────────────────────────────────────────────────┤
│ Real-time Awareness (Daemon) │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ CLI/GUI A │◄───────────────────►│ CLI/GUI B │ │
│ │ (aperture) │ Blue Daemon │ (fungal) │ │
│ └─────────────┘ localhost:7865 └─────────────┘ │
│ │
│ Instant notifications, session tracking, auto-cleanup │
├──────────────────────────────────────────────────────────────┤
│ Durable Changes (Git via Forgejo) │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Repo │────sync branch─────►│ Realm Repo │ │
│ │ │◄───PR review────────│ (Forgejo) │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ Source of truth, PR-based, auditable │
└──────────────────────────────────────────────────────────────┘
Session Coordination (Daemon-Managed)
The daemon manages sessions and notifications in ~/.blue/daemon.db:
-- ~/.blue/daemon.db
CREATE TABLE realms (
name TEXT PRIMARY KEY,
forgejo_url TEXT NOT NULL,
local_path TEXT NOT NULL,
last_sync TEXT,
status TEXT DEFAULT 'active'
);
CREATE TABLE sessions (
id TEXT PRIMARY KEY,
repo TEXT NOT NULL,
realm TEXT NOT NULL,
client_id TEXT, -- CLI instance or GUI window
started_at TEXT,
last_activity TEXT,
active_rfc TEXT,
active_domains JSON DEFAULT '[]',
exports_modified JSON DEFAULT '[]',
imports_watching JSON DEFAULT '[]'
);
CREATE TABLE notifications (
id INTEGER PRIMARY KEY AUTOINCREMENT,
realm TEXT NOT NULL,
domain TEXT NOT NULL,
contract TEXT NOT NULL,
from_repo TEXT NOT NULL,
change_type TEXT NOT NULL, -- 'updated', 'breaking', 'new'
changes JSON,
created_at TEXT,
acknowledged_by JSON DEFAULT '[]'
);
Session lifecycle:
- CLI registers session on command start, deregisters on exit
- Daemon tracks activity via API calls (no heartbeat polling needed)
- Orphaned sessions cleaned on daemon restart
- GUI clients maintain persistent sessions
Daemon API
The daemon exposes an HTTP API on localhost:7865:
| Endpoint | Method | Purpose |
|---|---|---|
/health |
GET | Daemon health check |
/realms |
GET | List tracked realms |
/realms/{name} |
GET | Realm details, domains, repos |
/realms/{name}/sync |
POST | Trigger sync for realm |
/sessions |
GET | List active sessions |
/sessions |
POST | Register new session |
/sessions/{id} |
DELETE | Deregister session |
/notifications |
GET | List pending notifications |
/notifications/{id}/ack |
POST | Acknowledge notification |
Auto-start: If CLI calls daemon and it's not running, CLI spawns daemon as background process before proceeding.
Sync Protocol (Git PRs)
Contract changes go through a PR workflow for durability:
blue realm synccreates branchsync/{repo}/{timestamp}- Pushes changes to realm repo
- Creates PR with affected parties as reviewers
- Merges when:
- All affected importers acknowledge, OR
- Grace period expires (for non-breaking changes)
- On merge, notification broadcast to active sessions
Commands
MVP Commands (5)
| Command | Purpose |
|---|---|
blue realm status |
Show realm state, domains, sessions, notifications |
blue realm sync |
Push local changes, pull remote changes via PR |
blue realm worktree |
Create linked worktrees across repos in domain |
blue realm pr |
Create coordinated PRs with merge order |
blue realm check |
Validate contracts (for CI) |
Admin Commands
Under blue realm admin:
| Command | Purpose |
|---|---|
blue realm admin init |
Create a new realm |
blue realm admin join |
Register repo in realm |
blue realm admin domain |
Create/manage domains |
blue realm admin leave |
Remove repo from realm |
blue realm admin cache |
Cache management |
Command Details
blue realm status
$ blue realm status
📊 aperture (in realm: letemcook)
Domains:
s3-access (provider)
Contract: s3-permissions v1.4.0
Active sessions:
• aperture (you) - working on training-metrics-v2
• fungal-image-analysis - idle
Notifications:
⚠️ 5 min ago: fungal acknowledged s3-permissions 1.4.0
blue realm sync
$ blue realm sync
📤 Syncing with realm 'letemcook'...
Creating sync branch: sync/aperture/20260124-103000
Contract changes detected:
s3-permissions: 1.4.0 → 1.5.0
+ training-metrics/experiments/*
Opening PR for review...
✓ PR #12: "aperture: s3-permissions 1.5.0"
Reviewers: fungal-image-analysis maintainers
Notifying active sessions...
✓ fungal-image-analysis notified
Waiting for acknowledgment or grace period (14 days for non-breaking).
blue realm check
# Validate exports match code
$ blue realm check --mode=exporter
✓ s3-permissions: code matches contract
# Validate imports are current
$ blue realm check --mode=importer
✓ s3-permissions: binding at 1.4.0 (current)
# Validate contract schema
$ blue realm check --mode=contract
✓ s3-permissions: valid schema, version bump correct
# Check compatibility between versions
$ blue realm check --mode=compatibility --from=1.4.0 --to=1.5.0
Checking s3-permissions 1.4.0 → 1.5.0
✓ read: unchanged
✓ write: unchanged
✓ delete: unchanged
+ experiments: added (optional, default=[]) - COMPATIBLE
Result: COMPATIBLE (minor version bump OK)
Caching
Blue uses SQLite for caching to handle concurrent access properly:
-- .blue/cache.db
CREATE TABLE export_cache (
file_path TEXT PRIMARY KEY,
mtime INTEGER NOT NULL,
content_hash TEXT NOT NULL,
exports JSON,
cached_at INTEGER NOT NULL
);
CREATE TABLE contract_cache (
domain TEXT NOT NULL,
contract TEXT NOT NULL,
version TEXT NOT NULL,
schema JSON,
realm_commit TEXT,
cached_at INTEGER NOT NULL,
PRIMARY KEY (domain, contract, version)
);
CREATE TABLE validation_cache (
contract TEXT NOT NULL,
version TEXT NOT NULL,
binding_hash TEXT NOT NULL,
valid INTEGER NOT NULL,
output TEXT,
validated_at INTEGER NOT NULL,
PRIMARY KEY (contract, version, binding_hash)
);
Invalidation rules:
- Exports: Invalidate when source file mtime changes
- Contracts: Invalidate when realm repo pulls new commits
- Validation: Invalidate when contract version or binding changes
Escape hatches:
blue realm sync --no-cache # Force fresh detection
blue realm admin cache clear # Wipe cache
blue realm admin cache stats # Show cache hit rates
CI/CD Integration
Forgejo Actions Example
name: Realm Contract Check
on: [push, pull_request]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v3
with:
path: .blue/cache.db
key: blue-cache-${{ hashFiles('.blue/config.yaml') }}
- name: Install Blue
run: cargo install blue-cli
- name: Check exports
run: blue realm check --mode=exporter
- name: Check imports
run: blue realm check --mode=importer
env:
BLUE_REALM_TOKEN: ${{ secrets.REALM_TOKEN }}
- name: Check compatibility
if: gitea.event_name == 'pull_request'
run: blue realm check --mode=compatibility
Note: Forgejo Actions uses gitea.* context variables. The workflow syntax is otherwise compatible with GitHub Actions.
Validation Hooks
Contracts can define validation scripts:
validation:
exporter: scripts/validate-s3-paths.sh # Run on export
importer: scripts/validate-iam-policy.sh # Run on import
ci_only:
- scripts/integration-test.sh # Only in CI
Exit codes:
- 0: Valid
- 1: Invalid (hard fail)
- 2: Warning (soft fail, can be overridden)
Credentials
Blue uses a layered credential approach:
Priority order (first found wins):
1. Environment: BLUE_REALM_TOKEN, BLUE_FORGEJO_TOKEN
2. Git credential helper: git credential fill
3. Keychain: macOS Keychain, Linux secret-service
4. Config file: ~/.blue/credentials.yaml (discouraged)
For CI with Forgejo:
env:
BLUE_FORGEJO_URL: https://git.example.com
BLUE_FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }}
Default behavior: Uses existing git credentials. No additional setup for basic usage.
Note: GitHub/GitLab support is future work. MVP targets Forgejo only.
Conflict Resolution
| Conflict Type | Detection | Resolution |
|---|---|---|
| Concurrent sync | Git merge conflict | Rebase and retry |
| Same contract, two editors | Ownership check | Reject non-owner |
| Stale binding | Version mismatch | Soft warning, CI flag |
| Version incompatibility | Semver check | Hard error |
| Session collision | Unique ID + heartbeat | Auto-cleanup stale |
Contract Ownership
Each contract has an owner field. Only the owner repo can modify the contract:
name: s3-permissions
owner: aperture # Only aperture can update this contract
Enforced at:
blue realm sync: Rejects if non-owner tries to modify- Realm repo CI: CODEOWNERS enforces in PRs
Cycle Prevention
Cycles between domains are detected and prevented at domain creation:
$ blue realm admin domain create feedback-loop --repos a,b
Error: Adding this domain creates a cycle:
a → (s3-access) → b → (feedback-loop) → a
Consider:
- Merging domains into a single coordination context
- Restructuring the dependency direction
- Using a hub-and-spoke pattern
Detection uses topological sort on the domain dependency graph.
Workflow
Initial Setup
# 1. Create realm (one-time, creates repo in Forgejo)
$ blue realm admin init --name letemcook --forgejo https://git.example.com
Starting daemon...
✓ Daemon running on localhost:7865
✓ Created realm repo in Forgejo: git.example.com/realms/letemcook
✓ Cloned to ~/.blue/realms/letemcook/
✓ Created realm.yaml
# 2. Register aperture in realm
$ cd aperture
$ blue realm admin join letemcook
✓ Created repos/aperture.yaml in realm
✓ Created .blue/config.yaml locally
✓ Pushed to Forgejo
# 3. Create the s3-access domain
$ blue realm admin domain create s3-access \
--repos aperture,fungal-image-analysis \
--contract s3-permissions
✓ Created domains/s3-access/domain.yaml
✓ Created domains/s3-access/contracts/s3-permissions.yaml
✓ Created domains/s3-access/bindings/aperture.yaml (provider)
✓ Created domains/s3-access/bindings/fungal-image-analysis.yaml (consumer)
✓ Pushed to Forgejo
# 4. Register fungal in realm
$ cd ../fungal-image-analysis
$ blue realm admin join letemcook
✓ Created repos/fungal-image-analysis.yaml in realm
✓ Detected import: s3-permissions in domain s3-access
✓ Created .blue/config.yaml locally
✓ Pushed to Forgejo
Daily Development
# Developer in aperture adds new S3 path
$ cd aperture
$ vim models/training/metrics_exporter.py
# Added: s3://bucket/training-metrics/experiments/*
# Check status
$ blue realm status
📊 aperture (in realm: letemcook)
⚠️ Contract change detected:
s3-permissions has local changes:
+ training-metrics/experiments/*
Affected repos:
- fungal-image-analysis (imports >=1.0.0 <2.0.0)
Run 'blue realm sync' to update realm
# Sync changes
$ blue realm sync
📤 Syncing with realm 'letemcook'...
Creating branch: sync/aperture/20260124-150000
Contract update: s3-permissions 1.4.0 → 1.5.0 (compatible)
✓ PR #15 created for review
✓ fungal-image-analysis session notified
Consumer Response
# Maintainer in fungal sees notification
$ blue realm status
📊 fungal-image-analysis (in realm: letemcook)
🔔 Notification from aperture (5 min ago):
Contract 's3-permissions' updated to 1.5.0
+ training-metrics/experiments/*
Your import (>=1.0.0 <2.0.0) is still satisfied.
Update binding when ready.
# Update binding
$ vim cdk/training_tools_access_stack.py
# Add new path to IAM policy
# Sync to acknowledge
$ blue realm sync
📤 Syncing with realm 'letemcook'...
Binding updated:
s3-permissions: resolved_version 1.4.0 → 1.5.0
✓ Acknowledged PR #15
✓ Realm synced
Coordinated Changes (Unified Worktrees)
# Start cross-repo change
$ blue realm worktree --rfc training-metrics-v2
Creating unified worktree 'feat/training-metrics-v2':
✓ aperture: .worktrees/feat-training-metrics-v2/
✓ fungal-image-analysis: .worktrees/feat-training-metrics-v2/
Branch 'feat/training-metrics-v2' created in both repos.
# Make changes in both worktrees...
# Create coordinated PRs
$ blue realm pr --title "feat: training metrics v2"
Creating coordinated PRs:
✓ aperture PR #45 (merge first - exports)
✓ fungal PR #23 (merge second - imports)
Blocked by: aperture#45
Merge order: aperture#45 → fungal#23
Implementation
Phase Overview
| Phase | Scope |
|---|---|
| 0 | Daemon infrastructure (HTTP server, auto-start, git2 integration) |
| 1 | Data model + SQLite schemas |
| 2 | blue realm admin init/join (creates realm in Forgejo, manages clones) |
| 3 | blue realm status with realm info |
| 4 | blue realm sync with PR workflow |
| 5 | blue realm check for CI |
| 6 | Session coordination (daemon-managed) |
| 7 | blue realm worktree |
| 8 | blue realm pr |
| 9 | Caching layer |
| 10 | Polish + docs |
Dependencies
- git2 crate for all git operations
- axum or actix-web for daemon HTTP server
- rusqlite for daemon.db and cache.db
- reqwest for Forgejo API calls
Phase 0: Data Model
// blue-core/src/realm.rs
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RealmConfig {
pub name: String,
pub version: String,
pub governance: Governance,
pub trust: TrustConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TrustConfig {
pub mode: TrustMode,
pub require_signed_commits: bool,
pub permissions: HashMap<String, Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Contract {
pub name: String,
pub version: String,
pub owner: String,
pub compatibility: Compatibility,
pub schema: serde_json::Value,
pub value: serde_json::Value,
pub validation: Option<ValidationConfig>,
pub evolution: Vec<EvolutionEntry>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Compatibility {
pub backwards: bool,
pub forwards: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ValidationConfig {
pub exporter: Option<String>,
pub importer: Option<String>,
pub ci_only: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Binding {
pub repo: String,
pub role: BindingRole,
pub exports: Vec<ExportBinding>,
pub imports: Vec<ImportBinding>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ImportBinding {
pub contract: String,
pub version: String, // Semver range
pub binding: String,
pub status: ImportStatus,
pub resolved_version: Option<String>,
}
Test Plan
Core Operations
blue realm admin initcreates valid realm structureblue realm admin joinregisters repo correctlyblue realm admin domain createcreates domain with contractsblue realm admin domain createrejects cyclesblue realm statusshows realm state, domains, notificationsblue realm synccreates PR for contract changesblue realm syncrejects non-owner contract modificationsblue realm sync --dry-runshows changes without committing
Validation
blue realm check --mode=exportervalidates exports match codeblue realm check --mode=importervalidates bindingsblue realm check --mode=contractvalidates schemablue realm check --mode=compatibilitydetects breaking changes- Validation hooks run with correct exit codes
Daemon
- Daemon starts on first CLI invocation if not running
- Daemon responds on
localhost:7865 - Daemon creates
~/.blue/daemon.dbon first start - Daemon clones realm repos to
~/.blue/realms/ - Daemon PID file created in
/var/run/blue/or$XDG_RUNTIME_DIR/blue/ - Daemon graceful shutdown cleans up resources
- CLI commands fail gracefully if daemon unreachable
Session Coordination
- Session registered on CLI command start
- Session deregistered on CLI command exit
- Orphaned sessions cleaned on daemon restart
- Contract changes create notifications
- Notifications visible in
blue realm status
Caching
- Export cache invalidates on file mtime change
- Contract cache invalidates on realm commit
--no-cacheforces fresh detection- Cache survives concurrent access
Unified Worktrees
blue realm worktreecreates worktrees in all domain reposblue realm prcreates linked PRs with merge order- Exporters ordered before importers
Conflict Resolution
- Concurrent syncs handled via git rebase
- Ownership violations rejected
- Semver incompatibility flagged as error
- Stale bindings flagged as warning
Future Work
- Desktop GUI - Native app for realm management and notifications
- Sophisticated contract detection - Parse Python/TypeScript/etc. to auto-detect exports (tree-sitter)
- Signature verification - Repos sign their exports
- Multiple realms - One repo participates in multiple realms
- Cross-realm imports - Import from domain in different realm
- Public registry - Discover realms and contracts
- Infrastructure verification - Check actual AWS state matches contracts
- Domain-level governance - Override realm governance per domain
- GitHub/GitLab support - Alternative to Forgejo for external users
- Multi-user daemon - Support multiple users on shared machines