Every document filename now mirrors its lifecycle state with a status suffix (e.g., .draft.md, .wip.md, .accepted.md). No more bare .md for tracked document types. Also renamed all from_str methods to parse to avoid FromStr trait confusion, introduced StagingDeploymentParams struct, and fixed all 19 clippy warnings across the codebase. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1655 lines
46 KiB
Markdown
1655 lines
46 KiB
Markdown
# Alignment Dialogue: Cross-Repo Realms Refinement
|
|
|
|
**Purpose:** Refine RFC 0001 proposal for cross-repo coordination
|
|
**Date:** 2026-01-24
|
|
**Experts:** 12
|
|
**Max Rounds:** 12
|
|
|
|
---
|
|
|
|
## Expert Panel
|
|
|
|
| ID | Expert | Domain | Perspective |
|
|
|----|--------|--------|-------------|
|
|
| A | **Alex Chen** | Distributed Systems | Consistency, failure modes, CAP tradeoffs |
|
|
| B | **Barbara Liskov** | Software Design | Abstractions, contracts, substitutability |
|
|
| C | **Carl Hewitt** | Actor Model | Message passing, coordination, concurrency |
|
|
| D | **Diana Rowan** | DevOps/GitOps | Workflow practicality, CI/CD integration |
|
|
| E | **Erik Meijer** | Type Systems | Schema evolution, versioning, compatibility |
|
|
| F | **Fiona Walsh** | Security | Trust boundaries, least privilege, audit |
|
|
| G | **Greg Wilson** | Developer Experience | Cognitive load, discoverability, errors |
|
|
| H | **Helen Garcia** | Graph Theory | Relationship modeling, traversal, cycles |
|
|
| I | **Ivan Petrov** | Database Systems | Transactions, consistency, durability |
|
|
| J | **Julia Santos** | API Design | Contracts, versioning, backwards compatibility |
|
|
| K | **Kevin Ng** | Build Systems | Dependencies, caching, incremental updates |
|
|
| L | **Laura Kim** | Organizational Design | Conway's Law, team boundaries, ownership |
|
|
|
|
---
|
|
|
|
## Round 1: Initial Reactions
|
|
|
|
**Facilitator:** We have RFC 0001 proposing a Realm → Domain → Repo hierarchy where domains are coordination contexts (edges) between repos (nodes). Each domain has contracts that repos export/import. Session coordination uses IPC sockets. Unified worktrees span repos. Initial reactions?
|
|
|
|
---
|
|
|
|
**Alex Chen (Distributed Systems):**
|
|
|
|
The IPC socket approach concerns me. What happens when:
|
|
1. A session crashes without cleanup - stale socket files
|
|
2. Network partition in a distributed team - socket on one machine, realm on another
|
|
3. Race conditions when two sessions modify the same contract
|
|
|
|
The `/tmp/blue/{realm}/sessions.json` is a single point of coordination. Who owns the lock? What's the conflict resolution?
|
|
|
|
**Question for the group:** Should we consider a more robust coordination mechanism, or is "good enough" acceptable for a developer tool?
|
|
|
|
---
|
|
|
|
**Barbara Liskov (Software Design):**
|
|
|
|
The abstraction layers feel right: Index → Realm → Domain → Repo. But I'm concerned about the contract model.
|
|
|
|
Looking at `domains/{domain}/contracts/{contract}.yaml` - the contract has both a `schema` and a `value`. This conflates the interface with the implementation. A contract should define *what* is promised, not the current state.
|
|
|
|
**Proposal:** Separate contract schema from contract instances:
|
|
```
|
|
domains/s3-access/
|
|
contracts/
|
|
s3-permissions.schema.yaml # The interface
|
|
instances/
|
|
s3-permissions.v1.3.0.yaml # Immutable snapshot
|
|
```
|
|
|
|
This enables true versioning and rollback.
|
|
|
|
---
|
|
|
|
**Carl Hewitt (Actor Model):**
|
|
|
|
The IPC model is too synchronous. Consider:
|
|
|
|
```
|
|
Aperture session: "I changed the contract"
|
|
→ broadcasts to fungal session
|
|
→ fungal session busy, message queued
|
|
→ aperture developer moves on
|
|
→ 10 minutes later, fungal session processes
|
|
```
|
|
|
|
This is the actor model working correctly! But the RFC assumes real-time awareness. The design should embrace asynchronous notification:
|
|
|
|
1. Messages are durable (not just socket writes)
|
|
2. Sessions process at their own pace
|
|
3. State is eventually consistent
|
|
|
|
---
|
|
|
|
**Diana Rowan (DevOps/GitOps):**
|
|
|
|
From a practical workflow perspective:
|
|
|
|
1. `blue realm worktree` creates worktrees in multiple repos - but what if one repo is on a locked branch? Partial failure?
|
|
|
|
2. `blue realm commit` with the same message everywhere - but repos have different commit message conventions. Some require ticket numbers.
|
|
|
|
3. `blue realm pr` assumes GitHub - what about GitLab, Bitbucket?
|
|
|
|
**Question:** How do we handle heterogeneous environments?
|
|
|
|
---
|
|
|
|
**Erik Meijer (Type Systems):**
|
|
|
|
The versioning story is incomplete. The RFC mentions semver for contracts, but:
|
|
|
|
1. Who decides what's a breaking change? The exporter? An automated check?
|
|
2. How do we handle diamond dependencies? Repo A exports v1.3, Repo B imports >=1.0, Repo C imports >=1.2 - what if they both import in the same domain?
|
|
3. Contract schemas can evolve - is `{read: string[], write: string[]}` compatible with `{read: string[], write: string[], delete: string[]}`?
|
|
|
|
**Proposal:** Explicit compatibility rules in the schema definition.
|
|
|
|
---
|
|
|
|
**Fiona Walsh (Security):**
|
|
|
|
Trust model needs more thought:
|
|
|
|
1. The realm repo is a shared resource. Who can commit? CODEOWNERS helps but isn't enforced locally.
|
|
2. A malicious repo could claim to export a contract it doesn't actually implement.
|
|
3. Session registration in `/tmp/blue/` - any local process can write there.
|
|
4. GitHub issue creation requires tokens - where are credentials stored?
|
|
|
|
**Minimum:** The RFC should explicitly state the threat model and trust assumptions.
|
|
|
|
---
|
|
|
|
## Scoreboard After Round 1
|
|
|
|
| Expert | Position | Key Concern |
|
|
|--------|----------|-------------|
|
|
| Alex | Skeptical | IPC robustness, race conditions |
|
|
| Barbara | Refinement | Separate schema from instance |
|
|
| Carl | Refinement | Embrace async, durable messages |
|
|
| Diana | Practical | Heterogeneous environments |
|
|
| Erik | Refinement | Versioning rules, compatibility |
|
|
| Fiona | Skeptical | Trust model gaps |
|
|
|
|
---
|
|
|
|
## Round 2: Deep Dives
|
|
|
|
**Greg Wilson (Developer Experience):**
|
|
|
|
Reading the RFC, I count 13 new `blue realm *` commands. That's a lot of surface area.
|
|
|
|
Current Blue has maybe 20 commands total? This doubles it. And the mental model required:
|
|
- Index contains Realms
|
|
- Realms contain Domains and Repos
|
|
- Domains contain Contracts and Bindings
|
|
- Repos export/import through Bindings
|
|
|
|
That's 5 levels of abstraction before you can sync a change.
|
|
|
|
**Counter-proposal:** Start with just 3 commands:
|
|
1. `blue realm join <realm>` - join a realm
|
|
2. `blue realm sync` - detect and sync changes
|
|
3. `blue realm status` - show what's happening
|
|
|
|
Let the tool infer domains/contracts from code patterns. Advanced users can use config files for overrides.
|
|
|
|
---
|
|
|
|
**Helen Garcia (Graph Theory):**
|
|
|
|
The domain-as-edge model is interesting but has implications:
|
|
|
|
1. **Hyperedges:** What if 3+ repos need to coordinate? A domain with 3 members is a hyperedge. The current model supports this, but visualization and reasoning get complex.
|
|
|
|
2. **Cycles:** Repo A exports to Domain X, imports from Domain Y. Repo B exports to Domain Y, imports from Domain X. This creates a cycle. Is this allowed? How do you order commits/PRs?
|
|
|
|
3. **Transitivity:** If A→B→C through two domains, does A need awareness of C? The current model says no, but in practice changes cascade.
|
|
|
|
**Suggestion:** Add a `blue realm graph` visualization that shows the full dependency network.
|
|
|
|
---
|
|
|
|
**Ivan Petrov (Database Systems):**
|
|
|
|
The realm repo is essentially a distributed database with git as the transport. But git doesn't provide:
|
|
|
|
1. **Transactions:** `blue realm sync` modifies the realm repo, but what if two repos sync simultaneously? Git merge conflicts.
|
|
|
|
2. **Atomicity:** A coordinated commit across 3 repos - if one fails, you have an inconsistent state.
|
|
|
|
3. **Isolation:** While I'm syncing, you're syncing - we might see each other's partial changes.
|
|
|
|
**Proposal:** Use git branches for coordination:
|
|
- Each sync operation creates a branch
|
|
- Merge to main requires all affected parties to approve
|
|
- Atomic merge via GitHub Actions or similar
|
|
|
|
---
|
|
|
|
**Julia Santos (API Design):**
|
|
|
|
The contract model needs more rigor:
|
|
|
|
```yaml
|
|
schema:
|
|
type: object
|
|
properties:
|
|
read:
|
|
type: array
|
|
items: { type: string }
|
|
```
|
|
|
|
This is JSON Schema, which is good. But:
|
|
|
|
1. How do consumers validate they're using the contract correctly?
|
|
2. The `binding` field points to a file - but that file might use the values differently than intended.
|
|
3. There's no runtime verification that the exporter actually provides what they claim.
|
|
|
|
**Proposal:** Contracts should include validation hooks:
|
|
```yaml
|
|
validation:
|
|
exporter: scripts/validate-s3-export.sh
|
|
importer: scripts/validate-iam-import.sh
|
|
```
|
|
|
|
---
|
|
|
|
**Kevin Ng (Build Systems):**
|
|
|
|
From a caching perspective:
|
|
|
|
1. `detect_exports()` scans code for patterns. This should be cached and invalidated by file changes.
|
|
|
|
2. Contract versions are content-addressed? Or sequential? If sequential, we need a coordination point.
|
|
|
|
3. Worktrees multiply build artifacts. If aperture and fungal both build in worktrees, we need 2x disk space.
|
|
|
|
**Question:** Is there a way to share build caches across worktrees within a realm?
|
|
|
|
---
|
|
|
|
**Laura Kim (Organizational Design):**
|
|
|
|
Conway's Law applies here. The realm structure will mirror - and influence - org structure.
|
|
|
|
1. Who "owns" a domain? The exporter? Both parties? A neutral third party?
|
|
2. Governance says `approvers: [email]` - but domains span orgs. Which org's approval process wins?
|
|
3. Breaking changes require approval - but from whom? All importers? Majority?
|
|
|
|
**Observation:** The RFC assumes collaborative orgs. What about adversarial relationships? A vendor/customer scenario?
|
|
|
|
---
|
|
|
|
## Scoreboard After Round 2
|
|
|
|
| Expert | Position | Key Concern |
|
|
|--------|----------|-------------|
|
|
| Alex | Skeptical | IPC robustness, race conditions |
|
|
| Barbara | Refinement | Separate schema from instance |
|
|
| Carl | Refinement | Embrace async, durable messages |
|
|
| Diana | Practical | Heterogeneous environments |
|
|
| Erik | Refinement | Versioning rules, compatibility |
|
|
| Fiona | Skeptical | Trust model gaps |
|
|
| Greg | Simplify | Too many commands, too much abstraction |
|
|
| Helen | Refinement | Graph visualization, cycle handling |
|
|
| Ivan | Refinement | Git-based transactions |
|
|
| Julia | Refinement | Validation hooks for contracts |
|
|
| Kevin | Practical | Caching, disk space |
|
|
| Laura | Skeptical | Governance across orgs |
|
|
|
|
---
|
|
|
|
## Round 3: Synthesis and Proposals
|
|
|
|
**Facilitator:** Several themes emerging:
|
|
1. Robustness (Alex, Ivan): coordination mechanism needs failure handling
|
|
2. Simplicity (Greg): too much surface area
|
|
3. Trust/Governance (Fiona, Laura): cross-org coordination is hard
|
|
4. Contract rigor (Barbara, Erik, Julia): schema vs instance, versioning, validation
|
|
|
|
Let's focus on concrete proposals.
|
|
|
|
---
|
|
|
|
**Alex Chen:**
|
|
|
|
Responding to Ivan's git-branch proposal - I like it. Here's a refined version:
|
|
|
|
**Sync Protocol:**
|
|
1. `blue realm sync` creates branch `sync/{repo}/{timestamp}`
|
|
2. Pushes changes to realm repo
|
|
3. Creates PR with affected parties as reviewers
|
|
4. Only merges when:
|
|
- All affected importers have acknowledged
|
|
- OR grace period expires (for non-breaking changes)
|
|
5. On merge, broadcast notification to active sessions
|
|
|
|
This replaces ephemeral IPC with durable git state. Sessions poll or webhook for updates.
|
|
|
|
**Trade-off:** Slower (PR-based) but more robust.
|
|
|
|
---
|
|
|
|
**Greg Wilson:**
|
|
|
|
Simplification proposal:
|
|
|
|
**MVP Command Set:**
|
|
```
|
|
blue realm status # What realm am I in? What domains? Any issues?
|
|
blue realm sync # Push my changes, pull others' changes
|
|
blue realm worktree <rfc> # Create linked worktrees for a change
|
|
```
|
|
|
|
That's 3 commands. Everything else is either:
|
|
- Automatic (domain/contract detection)
|
|
- Configuration (`.blue/realm.yaml`)
|
|
- Power-user (`blue realm admin ...`)
|
|
|
|
**Key insight:** Most developers just need sync and worktree. The domain/contract model is an implementation detail.
|
|
|
|
---
|
|
|
|
**Barbara Liskov + Erik Meijer (joint):**
|
|
|
|
**Contract Versioning Proposal:**
|
|
|
|
```yaml
|
|
# domains/s3-access/contracts/s3-permissions.yaml
|
|
name: s3-permissions
|
|
version: 1.3.0
|
|
|
|
compatibility:
|
|
backwards: true # New version can be read by old importers
|
|
forwards: true # Old version can be read by new importers
|
|
|
|
schema:
|
|
type: object
|
|
required: [read]
|
|
properties:
|
|
read:
|
|
type: array
|
|
items: { type: string }
|
|
write:
|
|
type: array
|
|
items: { type: string }
|
|
default: [] # Added in v1.1.0, backwards compatible
|
|
delete:
|
|
type: array
|
|
items: { type: string }
|
|
default: [] # Added in v1.3.0, backwards compatible
|
|
|
|
evolution:
|
|
- version: 1.0.0
|
|
changes: ["Initial schema with read array"]
|
|
- version: 1.1.0
|
|
changes: ["Added optional write array"]
|
|
compatible: true
|
|
- version: 1.3.0
|
|
changes: ["Added optional delete array"]
|
|
compatible: true
|
|
```
|
|
|
|
**Rule:** Adding optional fields with defaults = compatible. Removing or changing required fields = breaking.
|
|
|
|
Automated compatibility checking at sync time.
|
|
|
|
---
|
|
|
|
**Fiona Walsh:**
|
|
|
|
**Trust Model Proposal:**
|
|
|
|
```yaml
|
|
# realm.yaml
|
|
trust:
|
|
mode: collaborative # or: vendor-customer, federation
|
|
|
|
# Who can modify what
|
|
permissions:
|
|
repos/{repo}.yaml: [maintainers] # Repo maintainers edit their own
|
|
domains/{domain}/domain.yaml: [domain_owners]
|
|
domains/{domain}/contracts/*: [exporters] # Only exporters modify contracts
|
|
domains/{domain}/bindings/*: [binding_owner] # Each repo owns its binding
|
|
|
|
# Verification
|
|
verification:
|
|
require_signed_commits: true
|
|
require_pr_approval: true
|
|
allowed_signers: .allowed_signers
|
|
```
|
|
|
|
**Key principle:** Each party controls their own artifacts. Shared state (domain.yaml) requires consensus.
|
|
|
|
---
|
|
|
|
**Laura Kim:**
|
|
|
|
**Governance Across Orgs:**
|
|
|
|
The RFC assumes a single realm.yaml governance model. But cross-org scenarios need:
|
|
|
|
```yaml
|
|
# domains/s3-access/governance.yaml
|
|
ownership:
|
|
primary: aperture # The "product owner" of this coordination
|
|
stakeholders:
|
|
- fungal-image-analysis
|
|
|
|
decisions:
|
|
breaking_changes:
|
|
require: all_stakeholders
|
|
timeout_days: 14
|
|
escalation: primary_decides
|
|
|
|
new_versions:
|
|
require: primary_only
|
|
notify: all_stakeholders
|
|
|
|
meetings:
|
|
sync_cadence: weekly
|
|
channel: "#s3-access-coord"
|
|
```
|
|
|
|
**Observation:** Domain-level governance may differ from realm-level governance.
|
|
|
|
---
|
|
|
|
## Emerging Consensus
|
|
|
|
| Topic | Proposal | Support |
|
|
|-------|----------|---------|
|
|
| Coordination | Git PRs instead of IPC | Alex, Ivan, Fiona |
|
|
| Commands | 3-command MVP | Greg |
|
|
| Contracts | Schema + compatibility rules | Barbara, Erik, Julia |
|
|
| Trust | Explicit permissions model | Fiona |
|
|
| Governance | Domain-level overrides | Laura |
|
|
|
|
---
|
|
|
|
## Round 4: Contentions
|
|
|
|
**Carl Hewitt:**
|
|
|
|
I disagree with the PR-based coordination. It's too slow for local development.
|
|
|
|
**Counter-proposal:** Hybrid approach:
|
|
1. **Local sessions:** IPC for real-time awareness (best-effort)
|
|
2. **Durable state:** Git PRs for actual contract changes
|
|
|
|
The IPC layer says "hey, something changed" - it's a hint, not a commitment. The PR layer is the source of truth.
|
|
|
|
This gives you fast feedback during development, with robust durability for production changes.
|
|
|
|
---
|
|
|
|
**Diana Rowan:**
|
|
|
|
The 3-command MVP is too minimal. You need at least:
|
|
|
|
```
|
|
blue realm status # Read-only
|
|
blue realm sync # Push/pull changes
|
|
blue realm worktree # Cross-repo branches
|
|
blue realm pr # Cross-repo PRs (because this is non-trivial)
|
|
blue realm check # CI/CD hook - validates contracts
|
|
```
|
|
|
|
5 commands. Still manageable. The `check` command is critical for CI integration.
|
|
|
|
---
|
|
|
|
**Kevin Ng:**
|
|
|
|
On caching and performance - neither IPC nor PR-based helps with:
|
|
|
|
1. `detect_exports()` needs to parse code every time
|
|
2. Contract validation runs on every sync
|
|
3. Worktrees duplicate entire repos
|
|
|
|
**Proposal:** Add a local cache layer:
|
|
```
|
|
.blue/cache/
|
|
exports.json # Cached detected exports
|
|
contracts/ # Cached contract schemas
|
|
mtimes.json # File modification times for invalidation
|
|
```
|
|
|
|
This is orthogonal to the coordination mechanism debate.
|
|
|
|
---
|
|
|
|
**Helen Garcia:**
|
|
|
|
On cycles - the RFC doesn't address this. If domains form a cycle:
|
|
|
|
```
|
|
A exports to B (domain: d1)
|
|
B exports to C (domain: d2)
|
|
C exports to A (domain: d3)
|
|
```
|
|
|
|
Then `blue realm pr` cannot determine merge order.
|
|
|
|
**Solutions:**
|
|
1. Detect and forbid cycles at domain creation
|
|
2. Allow cycles but require manual ordering
|
|
3. Treat cycles as a "federation" requiring synchronized release
|
|
|
|
I prefer option 1 for MVP. Cycles add complexity that most teams don't need.
|
|
|
|
---
|
|
|
|
## Round 5: Convergence
|
|
|
|
**Facilitator:** Let's try to converge on key decisions.
|
|
|
|
---
|
|
|
|
**Decision 1: Coordination Mechanism**
|
|
|
|
| Option | Proponents | Trade-offs |
|
|
|--------|------------|------------|
|
|
| IPC only | Carl (partial) | Fast, fragile |
|
|
| PR only | Alex, Ivan | Slow, robust |
|
|
| Hybrid | Carl, Diana | Complex, flexible |
|
|
|
|
**Vote:** Hybrid wins (7-5)
|
|
|
|
**Resolution:**
|
|
- IPC for local session awareness (optional, best-effort)
|
|
- Git branches + PRs for durable contract changes
|
|
|
|
---
|
|
|
|
**Decision 2: Command Surface**
|
|
|
|
| Option | Proponents | Trade-offs |
|
|
|--------|------------|------------|
|
|
| 3 commands | Greg | Minimal, may be limiting |
|
|
| 5 commands | Diana | Practical, covers CI |
|
|
| 13 commands | (RFC) | Complete, overwhelming |
|
|
|
|
**Vote:** 5 commands wins (8-4)
|
|
|
|
**Resolution:**
|
|
```
|
|
blue realm status
|
|
blue realm sync
|
|
blue realm worktree
|
|
blue realm pr
|
|
blue realm check
|
|
```
|
|
|
|
Advanced commands under `blue realm admin ...`.
|
|
|
|
---
|
|
|
|
**Decision 3: Contract Model**
|
|
|
|
**Consensus:** Adopt Barbara/Erik's proposal with Julia's validation hooks.
|
|
|
|
```yaml
|
|
name: s3-permissions
|
|
version: 1.3.0
|
|
|
|
compatibility:
|
|
backwards: true
|
|
forwards: true
|
|
|
|
schema: { ... }
|
|
|
|
validation:
|
|
exporter: scripts/validate-export.sh
|
|
importer: scripts/validate-import.sh
|
|
|
|
evolution:
|
|
- version: 1.0.0
|
|
changes: [...]
|
|
```
|
|
|
|
---
|
|
|
|
**Decision 4: Trust Model**
|
|
|
|
**Consensus:** Adopt Fiona's proposal.
|
|
|
|
- Each party controls their own artifacts
|
|
- Shared state requires consensus
|
|
- Signed commits recommended for cross-org
|
|
|
|
---
|
|
|
|
**Decision 5: Governance**
|
|
|
|
**Consensus:** Domain-level governance (Laura's proposal) as optional extension.
|
|
|
|
MVP: Realm-level governance applies to all domains.
|
|
Extension: Domains can override with their own governance.yaml.
|
|
|
|
---
|
|
|
|
**Decision 6: Cycles**
|
|
|
|
**Consensus:** Forbid cycles for MVP (Helen's option 1).
|
|
|
|
Detect at domain creation time. Error message suggests restructuring.
|
|
|
|
---
|
|
|
|
## Round 6: Refined Proposal
|
|
|
|
**Facilitator:** Let's synthesize the decisions into a refined proposal.
|
|
|
|
---
|
|
|
|
### Refined Architecture
|
|
|
|
```
|
|
Index (~/.blue/index.yaml)
|
|
└── Realm (git repo)
|
|
├── repos/ # Participating repos
|
|
└── domains/ # Coordination contexts
|
|
├── domain.yaml
|
|
├── governance.yaml (optional)
|
|
├── contracts/
|
|
│ └── {name}.yaml # Schema + version + validation
|
|
└── bindings/
|
|
└── {repo}.yaml # Export/import declarations
|
|
```
|
|
|
|
### Coordination Model
|
|
|
|
1. **Local awareness (IPC):** Optional session registration for real-time hints
|
|
2. **Durable changes (Git):** Contract changes go through PR workflow
|
|
|
|
```
|
|
Developer changes export
|
|
→ blue realm sync (creates branch, opens PR)
|
|
→ Affected repos notified (GitHub, IPC)
|
|
→ Review and merge
|
|
→ Sessions detect merged change
|
|
```
|
|
|
|
### Command Surface (MVP)
|
|
|
|
| Command | Purpose |
|
|
|---------|---------|
|
|
| `blue realm status` | Show realm state, domains, any issues |
|
|
| `blue realm sync` | Push local changes, pull remote changes |
|
|
| `blue realm worktree` | Create linked worktrees across repos |
|
|
| `blue realm pr` | Create coordinated PRs with merge order |
|
|
| `blue realm check` | Validate contracts (for CI) |
|
|
|
|
### Contract Model
|
|
|
|
```yaml
|
|
name: s3-permissions
|
|
version: 1.3.0
|
|
|
|
compatibility:
|
|
backwards: true
|
|
|
|
schema:
|
|
type: object
|
|
required: [read]
|
|
properties:
|
|
read: { type: array, items: { type: string } }
|
|
write: { type: array, items: { type: string }, default: [] }
|
|
|
|
validation:
|
|
exporter: scripts/validate-s3-paths.sh
|
|
importer: scripts/validate-iam-policy.sh
|
|
|
|
evolution:
|
|
- version: 1.0.0
|
|
changes: ["Initial"]
|
|
- version: 1.3.0
|
|
changes: ["Added write"]
|
|
compatible: true
|
|
```
|
|
|
|
### Trust Model
|
|
|
|
```yaml
|
|
# realm.yaml
|
|
trust:
|
|
mode: collaborative
|
|
require_signed_commits: false # MVP default
|
|
permissions:
|
|
repos/*: [repo_maintainers]
|
|
domains/*/contracts/*: [exporters]
|
|
domains/*/bindings/{repo}.yaml: [repo_maintainers]
|
|
```
|
|
|
|
### Cycle Prevention
|
|
|
|
At domain creation:
|
|
1. Build dependency graph
|
|
2. Detect cycles using topological sort
|
|
3. Reject if cycle detected
|
|
|
|
```
|
|
$ blue realm 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
|
|
```
|
|
|
|
---
|
|
|
|
## Final Scoreboard
|
|
|
|
| Expert | Final Position | Satisfied? |
|
|
|--------|---------------|------------|
|
|
| Alex | Support | Yes - hybrid approach addresses robustness |
|
|
| Barbara | Support | Yes - contract model improved |
|
|
| Carl | Support | Yes - hybrid preserves real-time hints |
|
|
| Diana | Support | Yes - 5 commands is practical |
|
|
| Erik | Support | Yes - compatibility rules included |
|
|
| Fiona | Support | Yes - trust model explicit |
|
|
| Greg | Support | Yes - reduced to 5 commands |
|
|
| Helen | Support | Yes - cycles forbidden |
|
|
| Ivan | Support | Yes - git-based durability |
|
|
| Julia | Support | Yes - validation hooks included |
|
|
| Kevin | Neutral | Caching not fully addressed |
|
|
| Laura | Support | Yes - domain-level governance option |
|
|
|
|
**Consensus:** 11 support, 1 neutral
|
|
|
|
---
|
|
|
|
## Open Items for Future Rounds
|
|
|
|
1. **Caching strategy** (Kevin): How to avoid re-parsing on every sync?
|
|
2. **CI/CD integration details** (Diana): Exact `check` command behavior
|
|
3. **IPC implementation** (Carl): Socket vs file-based vs other
|
|
4. **Credential management** (Fiona): Where do GitHub tokens live?
|
|
5. **Multi-realm** (deferred): Repo in multiple realms
|
|
6. **Conflict resolution** (Ivan): What if two syncs conflict?
|
|
|
|
---
|
|
|
|
---
|
|
|
|
## Round 7: Caching Strategy
|
|
|
|
**Facilitator:** Kevin raised concerns about performance - parsing code on every sync, validating contracts repeatedly, worktree disk usage. Let's address caching.
|
|
|
|
---
|
|
|
|
**Kevin Ng (Build Systems):**
|
|
|
|
Here's my detailed proposal for the caching layer:
|
|
|
|
```
|
|
.blue/cache/
|
|
├── exports/
|
|
│ ├── manifest.json # {file_path: mtime, hash}
|
|
│ └── detected.json # Cached export detection results
|
|
├── contracts/
|
|
│ ├── s3-access/
|
|
│ │ └── s3-permissions.json # Parsed contract schema
|
|
│ └── checksums.json # {contract: sha256}
|
|
└── validation/
|
|
└── results.json # {contract_version: {valid: bool, at: timestamp}}
|
|
```
|
|
|
|
**Invalidation rules:**
|
|
1. **Exports:** Invalidate when source file mtime changes
|
|
2. **Contracts:** Invalidate when realm repo pulls new commits
|
|
3. **Validation:** Invalidate when contract version changes OR binding changes
|
|
|
|
**Disk usage for worktrees:**
|
|
- Use `git worktree` with shared object store (already does this)
|
|
- Build artifacts: Honor existing tool caches (cargo target/, node_modules/)
|
|
- Realm cache: Shared across worktrees (single `.blue/cache/` in main repo)
|
|
|
|
---
|
|
|
|
**Alex Chen:**
|
|
|
|
The cache needs to be safe for concurrent access. Two scenarios:
|
|
|
|
1. **Same machine, two terminals:** File locking on manifest.json
|
|
2. **Same repo, two worktrees:** Shared cache with worktree-specific overrides
|
|
|
|
**Proposal:** Use SQLite for cache instead of JSON files. It handles concurrent access properly.
|
|
|
|
```sql
|
|
CREATE TABLE export_cache (
|
|
file_path TEXT PRIMARY KEY,
|
|
mtime INTEGER,
|
|
hash TEXT,
|
|
exports JSON,
|
|
cached_at INTEGER
|
|
);
|
|
|
|
CREATE TABLE contract_cache (
|
|
domain TEXT,
|
|
contract TEXT,
|
|
version TEXT,
|
|
schema JSON,
|
|
cached_at INTEGER,
|
|
PRIMARY KEY (domain, contract, version)
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
**Ivan Petrov:**
|
|
|
|
I agree with Alex. SQLite also gives us:
|
|
|
|
1. **Atomic updates:** No partial writes
|
|
2. **Query capability:** Find all stale entries efficiently
|
|
3. **Vacuum:** Reclaim space from old entries
|
|
|
|
One cache database per repo: `.blue/cache.db`
|
|
|
|
For worktrees, the main repo's cache is authoritative. Worktrees can have a local overlay:
|
|
```
|
|
main/.blue/cache.db # Shared
|
|
worktree/.blue/cache.local.db # Worktree-specific overrides
|
|
```
|
|
|
|
---
|
|
|
|
**Greg Wilson:**
|
|
|
|
From a UX perspective, caching should be invisible. But we need escape hatches:
|
|
|
|
```bash
|
|
blue realm sync --no-cache # Force fresh detection
|
|
blue cache clear # Wipe cache
|
|
blue cache stats # Show cache hit rates
|
|
```
|
|
|
|
The `cache` subcommand is power-user only, not part of the 5-command MVP.
|
|
|
|
---
|
|
|
|
**Decision: Caching**
|
|
|
|
| Aspect | Resolution |
|
|
|--------|------------|
|
|
| Storage | SQLite `.blue/cache.db` |
|
|
| Concurrency | SQLite handles it |
|
|
| Worktrees | Shared cache + local overlay |
|
|
| Invalidation | mtime + hash for files, commit SHA for contracts |
|
|
| UX | Invisible by default, `--no-cache` escape hatch |
|
|
|
|
**Kevin:** Satisfied. SQLite is the right choice.
|
|
|
|
---
|
|
|
|
## Round 8: CI/CD Integration
|
|
|
|
**Facilitator:** Diana raised the need for CI/CD integration. Let's define the `blue realm check` command precisely.
|
|
|
|
---
|
|
|
|
**Diana Rowan (DevOps/GitOps):**
|
|
|
|
CI needs to answer these questions:
|
|
|
|
1. **On PR in repo:** Does this change break any contracts we export?
|
|
2. **On PR in realm repo:** Is the contract change compatible?
|
|
3. **On merge:** Are all importers updated for breaking changes?
|
|
|
|
**Proposed `blue realm check` modes:**
|
|
|
|
```bash
|
|
# In a repo's CI pipeline
|
|
blue realm check --mode=exporter
|
|
# Validates: exported contracts match code
|
|
# Fails if: code changed but contract not updated
|
|
|
|
blue realm check --mode=importer
|
|
# Validates: bindings satisfy imported contracts
|
|
# Fails if: contract updated but binding stale
|
|
|
|
# In realm repo's CI pipeline
|
|
blue realm check --mode=contract
|
|
# Validates: contract schema is valid, version bumped correctly
|
|
# Fails if: breaking change without major version bump
|
|
```
|
|
|
|
---
|
|
|
|
**Julia Santos:**
|
|
|
|
The validation hooks we defined earlier should run in CI:
|
|
|
|
```yaml
|
|
# Contract with validation
|
|
validation:
|
|
exporter: scripts/validate-s3-paths.sh
|
|
importer: scripts/validate-iam-policy.sh
|
|
ci_only:
|
|
- scripts/integration-test.sh # Only in CI, not local
|
|
```
|
|
|
|
**Exit codes:**
|
|
- 0: Valid
|
|
- 1: Invalid (hard fail)
|
|
- 2: Warning (soft fail, can be overridden)
|
|
|
|
---
|
|
|
|
**Erik Meijer:**
|
|
|
|
For compatibility checking, we need to define it precisely:
|
|
|
|
```bash
|
|
blue realm check --mode=compatibility --from=1.2.0 --to=1.3.0
|
|
```
|
|
|
|
**Algorithm:**
|
|
1. Parse both schemas
|
|
2. For each field in old schema:
|
|
- If required and missing in new: BREAKING
|
|
- If type changed: BREAKING
|
|
3. For each field in new schema:
|
|
- If required and not in old: BREAKING (unless has default)
|
|
- If optional with default: COMPATIBLE
|
|
|
|
**Output:**
|
|
```
|
|
Checking s3-permissions 1.2.0 → 1.3.0
|
|
✓ read: unchanged
|
|
✓ write: unchanged
|
|
+ delete: added (optional, default=[]) - COMPATIBLE
|
|
|
|
Result: COMPATIBLE (minor version bump OK)
|
|
```
|
|
|
|
---
|
|
|
|
**Fiona Walsh:**
|
|
|
|
CI pipelines need credentials. Where do they come from?
|
|
|
|
**Proposal:**
|
|
```yaml
|
|
# .github/workflows/realm-check.yml
|
|
env:
|
|
BLUE_REALM_TOKEN: ${{ secrets.BLUE_REALM_TOKEN }}
|
|
```
|
|
|
|
The token is a GitHub PAT (or equivalent) with:
|
|
- Read access to realm repo
|
|
- Write access for creating issues (optional)
|
|
|
|
Blue should work without the token but with reduced functionality:
|
|
- Without token: Can read public realm repos, no notifications
|
|
- With token: Full functionality
|
|
|
|
---
|
|
|
|
**Kevin Ng:**
|
|
|
|
CI caching is different from local caching. We should:
|
|
|
|
1. **Cache the cache:** Store `.blue/cache.db` in CI cache
|
|
2. **Warm cache:** First CI step pulls realm repo and warms cache
|
|
3. **Incremental:** Only re-validate changed contracts
|
|
|
|
```yaml
|
|
# GitHub Actions example
|
|
- uses: actions/cache@v3
|
|
with:
|
|
path: .blue/cache.db
|
|
key: blue-cache-${{ hashFiles('.blue/config.yaml') }}
|
|
```
|
|
|
|
---
|
|
|
|
**Decision: CI/CD Integration**
|
|
|
|
| Aspect | Resolution |
|
|
|--------|------------|
|
|
| Modes | `--mode=exporter\|importer\|contract\|compatibility` |
|
|
| Validation | Run hooks, respect exit codes |
|
|
| Compatibility | Automated schema diff with clear BREAKING/COMPATIBLE output |
|
|
| Credentials | Optional env var `BLUE_REALM_TOKEN` |
|
|
| Caching | CI can cache `.blue/cache.db` |
|
|
|
|
**Diana:** Satisfied. This covers my use cases.
|
|
|
|
---
|
|
|
|
## Round 9: IPC Implementation
|
|
|
|
**Facilitator:** Carl advocated for IPC as a real-time hint layer. Let's nail down the implementation.
|
|
|
|
---
|
|
|
|
**Carl Hewitt (Actor Model):**
|
|
|
|
Given that IPC is "best effort hints" and Git is source of truth, we can simplify:
|
|
|
|
**Option A: Unix Domain Sockets**
|
|
- Pro: Real-time, bidirectional
|
|
- Con: Platform-specific, requires cleanup
|
|
|
|
**Option B: File-based polling**
|
|
- Pro: Simple, cross-platform
|
|
- Con: Latency (polling interval)
|
|
|
|
**Option C: SQLite + inotify/fswatch**
|
|
- Pro: Durable, queryable, cross-platform
|
|
- Con: Slightly more complex
|
|
|
|
I now prefer **Option C**. Here's why:
|
|
|
|
```
|
|
/tmp/blue/sessions.db
|
|
|
|
CREATE TABLE sessions (
|
|
id TEXT PRIMARY KEY,
|
|
repo TEXT,
|
|
realm TEXT,
|
|
socket_path TEXT, -- Optional, for direct IPC
|
|
pid INTEGER,
|
|
started_at TEXT,
|
|
last_heartbeat TEXT,
|
|
active_domains JSON,
|
|
watching JSON
|
|
);
|
|
|
|
CREATE TABLE notifications (
|
|
id INTEGER PRIMARY KEY,
|
|
realm TEXT,
|
|
domain TEXT,
|
|
contract TEXT,
|
|
from_repo TEXT,
|
|
change_type TEXT, -- 'updated', 'breaking', 'new'
|
|
created_at TEXT,
|
|
acknowledged_by JSON DEFAULT '[]'
|
|
);
|
|
```
|
|
|
|
Sessions poll `notifications` table. Fast enough (sub-second) and robust.
|
|
|
|
---
|
|
|
|
**Alex Chen:**
|
|
|
|
I like SQLite for sessions too. It solves:
|
|
|
|
1. **Stale sessions:** Heartbeat timeout (30s) → auto-cleanup
|
|
2. **Crash recovery:** On startup, check if our session exists, clean if stale
|
|
3. **Race conditions:** SQLite transactions
|
|
|
|
**Heartbeat protocol:**
|
|
```rust
|
|
// Every 10 seconds
|
|
UPDATE sessions SET last_heartbeat = datetime('now') WHERE id = ?;
|
|
|
|
// Cleanup query (run periodically)
|
|
DELETE FROM sessions
|
|
WHERE last_heartbeat < datetime('now', '-30 seconds');
|
|
```
|
|
|
|
---
|
|
|
|
**Greg Wilson:**
|
|
|
|
From UX, the session layer should be completely invisible unless something goes wrong:
|
|
|
|
```bash
|
|
$ blue realm status
|
|
📊 aperture (in realm: letemcook)
|
|
|
|
Active sessions in realm:
|
|
• aperture (you) - working on training-metrics-v2
|
|
• fungal-image-analysis - idle
|
|
|
|
Recent notifications:
|
|
⚠️ 5 min ago: fungal updated s3-permissions to 1.4.0
|
|
Your import is stale. Run 'blue realm sync' to update.
|
|
```
|
|
|
|
No commands to manage sessions. They just exist.
|
|
|
|
---
|
|
|
|
**Fiona Walsh:**
|
|
|
|
Security consideration: `/tmp/blue/sessions.db` is world-readable by default.
|
|
|
|
**Mitigation:**
|
|
1. Create `/tmp/blue/` with mode 0700 (user only)
|
|
2. Or use `$XDG_RUNTIME_DIR/blue/` which is per-user
|
|
3. Sessions.db contains no secrets, just coordination state
|
|
|
|
I'm okay with this as long as we document the security model.
|
|
|
|
---
|
|
|
|
**Decision: IPC Implementation**
|
|
|
|
| Aspect | Resolution |
|
|
|--------|------------|
|
|
| Mechanism | SQLite in `$XDG_RUNTIME_DIR/blue/sessions.db` |
|
|
| Sessions | Table with heartbeat, auto-cleanup stale |
|
|
| Notifications | Table with ack tracking |
|
|
| Polling | Sub-second, triggered by SQLite change detection |
|
|
| Security | User-only directory, no secrets in DB |
|
|
| UX | Invisible, shown in `status` output |
|
|
|
|
**Carl:** Satisfied. SQLite is a better actor mailbox than sockets.
|
|
|
|
---
|
|
|
|
## Round 10: Credential Management
|
|
|
|
**Facilitator:** Fiona raised credential management. Where do tokens live? How are they scoped?
|
|
|
|
---
|
|
|
|
**Fiona Walsh (Security):**
|
|
|
|
**Credentials needed:**
|
|
|
|
1. **Realm repo access:** Read (always), Write (for sync)
|
|
2. **Participant repo access:** For creating issues/PRs
|
|
3. **Signing keys:** If we require signed commits
|
|
|
|
**Proposal: Layered credential sources**
|
|
|
|
```
|
|
Priority order (first found wins):
|
|
1. Environment: BLUE_REALM_TOKEN, BLUE_GITHUB_TOKEN
|
|
2. Git credential helper: git credential fill
|
|
3. Keychain: macOS Keychain, Linux secret-service
|
|
4. Config file: ~/.blue/credentials.yaml (discouraged)
|
|
```
|
|
|
|
**Scoping:**
|
|
```yaml
|
|
# ~/.blue/credentials.yaml (if used)
|
|
credentials:
|
|
- realm: letemcook
|
|
token: ghp_xxx # GitHub PAT
|
|
scope: [read, write, issues]
|
|
|
|
- realm: "*" # Default
|
|
token_env: GITHUB_TOKEN # Reference env var
|
|
```
|
|
|
|
---
|
|
|
|
**Diana Rowan:**
|
|
|
|
For CI, we should support GitHub App authentication, not just PATs:
|
|
|
|
```yaml
|
|
# CI environment
|
|
BLUE_GITHUB_APP_ID: 12345
|
|
BLUE_GITHUB_APP_PRIVATE_KEY: ${{ secrets.APP_KEY }}
|
|
BLUE_GITHUB_APP_INSTALLATION_ID: 67890
|
|
```
|
|
|
|
GitHub Apps have better permission scoping and don't expire like PATs.
|
|
|
|
---
|
|
|
|
**Laura Kim:**
|
|
|
|
Cross-org scenarios complicate this. If aperture is in Org A and fungal is in Org B:
|
|
|
|
1. Aperture dev has PAT for Org A
|
|
2. Fungal dev has PAT for Org B
|
|
3. Realm repo might be in Org A, B, or a neutral Org C
|
|
|
|
**Resolution:** The realm repo should be the only shared resource. Each dev only needs:
|
|
- Read access to realm repo
|
|
- Write access to their own repos
|
|
|
|
Creating issues in other repos requires either:
|
|
- Cross-org collaboration (GitHub org-to-org)
|
|
- Or: Notifications go to realm repo as issues/discussions instead
|
|
|
|
---
|
|
|
|
**Greg Wilson:**
|
|
|
|
Users shouldn't have to configure credentials for basic usage:
|
|
|
|
```bash
|
|
$ blue realm join ../realm-letemcook
|
|
# Uses existing git credentials (git credential helper)
|
|
# No additional setup needed
|
|
```
|
|
|
|
Only prompt for credentials when:
|
|
1. Git credential helper fails
|
|
2. Advanced features needed (cross-repo issues)
|
|
|
|
---
|
|
|
|
**Decision: Credential Management**
|
|
|
|
| Aspect | Resolution |
|
|
|--------|------------|
|
|
| Sources | Env → Git credential → Keychain → Config file |
|
|
| Scoping | Per-realm credentials supported |
|
|
| CI | Support GitHub App auth |
|
|
| Cross-org | Realm repo is shared, issues go there |
|
|
| UX | Use git credentials by default, no extra setup |
|
|
|
|
**Fiona:** Satisfied. Defense in depth with sensible defaults.
|
|
|
|
---
|
|
|
|
## Round 11: Conflict Resolution
|
|
|
|
**Facilitator:** Ivan raised the question of concurrent syncs. What if two repos sync simultaneously?
|
|
|
|
---
|
|
|
|
**Ivan Petrov (Database Systems):**
|
|
|
|
**Scenario:**
|
|
1. Alice in aperture: `blue realm sync` → creates branch `sync/aperture/t1`
|
|
2. Bob in fungal: `blue realm sync` → creates branch `sync/fungal/t2`
|
|
3. Both push to realm repo
|
|
4. Both open PRs
|
|
5. Alice's PR merges first
|
|
6. Bob's PR now has conflicts
|
|
|
|
**Git handles this naturally!** Bob's PR shows conflicts, he rebases.
|
|
|
|
But we can do better with tooling:
|
|
|
|
```bash
|
|
$ blue realm sync
|
|
⚠️ Conflict detected with recent merge (sync/aperture/t1)
|
|
Their change: s3-permissions 1.3.0 → 1.4.0
|
|
Your change: (no contract changes, just binding update)
|
|
|
|
Options:
|
|
1. Rebase and retry (recommended)
|
|
2. Force push (requires --force)
|
|
3. Abort
|
|
|
|
Choice [1]:
|
|
```
|
|
|
|
---
|
|
|
|
**Alex Chen:**
|
|
|
|
For the IPC layer, conflicts are even simpler:
|
|
|
|
```sql
|
|
-- Notification deduplication
|
|
INSERT OR IGNORE INTO notifications (...)
|
|
|
|
-- Sessions handle notifications idempotently
|
|
-- Seeing the same notification twice is fine
|
|
```
|
|
|
|
The real question is: what if two exports update the same contract simultaneously?
|
|
|
|
**Rule:** Contracts are owned by their exporter. Only one repo can export a given contract. Conflict resolved by ownership.
|
|
|
|
If we ever need multi-exporter contracts:
|
|
- Create separate contracts
|
|
- Or merge into one repo
|
|
- Or use a "meta-contract" that aggregates
|
|
|
|
---
|
|
|
|
**Barbara Liskov:**
|
|
|
|
The contract ownership rule is important. Let's make it explicit:
|
|
|
|
```yaml
|
|
# domains/s3-access/contracts/s3-permissions.yaml
|
|
name: s3-permissions
|
|
owner: aperture # Only this repo can modify
|
|
```
|
|
|
|
Enforced at:
|
|
1. `blue realm sync`: Reject if non-owner tries to modify
|
|
2. Realm repo CI: CODEOWNERS enforces
|
|
|
|
---
|
|
|
|
**Helen Garcia:**
|
|
|
|
What about binding conflicts? Two repos might update their own bindings simultaneously. That's fine - no conflict, they're different files.
|
|
|
|
But what if the contract changes and a binding update happens at the same time?
|
|
|
|
**Scenario:**
|
|
1. Alice updates contract to 1.4.0
|
|
2. Bob updates his binding (still referencing 1.3.0)
|
|
3. Both merge
|
|
4. Bob's binding is now stale
|
|
|
|
**Detection:**
|
|
```sql
|
|
-- In realm repo CI
|
|
SELECT * FROM bindings
|
|
WHERE contract_version < (SELECT version FROM contracts WHERE name = binding.contract)
|
|
```
|
|
|
|
**Resolution:** CI warns but doesn't block. Staleness is a soft error.
|
|
|
|
---
|
|
|
|
**Erik Meijer:**
|
|
|
|
Version constraints help here:
|
|
|
|
```yaml
|
|
# fungal's binding
|
|
imports:
|
|
- contract: s3-permissions
|
|
version: ">=1.0.0 <2.0.0" # Semver range
|
|
```
|
|
|
|
If Alice bumps to 1.4.0 (compatible), Bob's binding is still valid.
|
|
If Alice bumps to 2.0.0 (breaking), Bob's binding fails validation.
|
|
|
|
The conflict is surfaced as a type error, not a git conflict.
|
|
|
|
---
|
|
|
|
**Decision: Conflict Resolution**
|
|
|
|
| Scenario | Resolution |
|
|
|----------|------------|
|
|
| Concurrent syncs | Git merge/rebase, tooling helps |
|
|
| Same contract, two editors | Ownership rule: one exporter per contract |
|
|
| Binding + contract race | Staleness is soft error, CI warns |
|
|
| Version conflicts | Semver ranges in bindings |
|
|
| IPC conflicts | Idempotent handling, deduplication |
|
|
|
|
**Ivan:** Satisfied. Ownership + semver + git = robust enough.
|
|
|
|
---
|
|
|
|
## Round 12: Final Synthesis
|
|
|
|
**Facilitator:** Let's consolidate all decisions into the final refined proposal.
|
|
|
|
---
|
|
|
|
### Final Architecture
|
|
|
|
```
|
|
~/.blue/
|
|
├── index.yaml # Realms this user participates in
|
|
└── credentials.yaml # Optional, prefer git credentials
|
|
|
|
$XDG_RUNTIME_DIR/blue/
|
|
└── sessions.db # IPC coordination (SQLite)
|
|
|
|
realm-{name}/ # Git repository
|
|
├── 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, domains
|
|
└── cache.db # SQLite cache for exports, contracts
|
|
```
|
|
|
|
### Command Surface (MVP)
|
|
|
|
| Command | Purpose | Details |
|
|
|---------|---------|---------|
|
|
| `blue realm status` | Show state | Realm, domains, sessions, notifications |
|
|
| `blue realm sync` | Push/pull | Creates branch, opens PR, handles conflicts |
|
|
| `blue realm worktree` | Linked branches | Creates worktrees in all domain repos |
|
|
| `blue realm pr` | Coordinated PRs | Creates linked PRs with merge order |
|
|
| `blue realm check` | Validation | Modes: exporter, importer, contract, compatibility |
|
|
|
|
**Power-user commands** (under `blue realm admin`):
|
|
- `blue realm admin init` - Create realm
|
|
- `blue realm admin join` - Join realm
|
|
- `blue realm admin domain` - Manage domains
|
|
- `blue realm admin cache` - Cache management
|
|
|
|
### Contract Model
|
|
|
|
```yaml
|
|
name: s3-permissions
|
|
version: 1.4.0
|
|
owner: aperture
|
|
|
|
compatibility:
|
|
backwards: true
|
|
forwards: false
|
|
|
|
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: [] }
|
|
|
|
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"]
|
|
- version: 1.3.0
|
|
changes: ["Added write"]
|
|
compatible: true
|
|
- version: 1.4.0
|
|
changes: ["Added delete"]
|
|
compatible: true
|
|
```
|
|
|
|
### Binding Model
|
|
|
|
```yaml
|
|
# Export binding (aperture)
|
|
repo: aperture
|
|
role: provider
|
|
|
|
exports:
|
|
- contract: s3-permissions
|
|
source_files:
|
|
- models/training/s3_paths.py
|
|
```
|
|
|
|
```yaml
|
|
# Import binding (fungal)
|
|
repo: fungal-image-analysis
|
|
role: consumer
|
|
|
|
imports:
|
|
- contract: s3-permissions
|
|
version: ">=1.0.0 <2.0.0"
|
|
binding: cdk/training_tools_access_stack.py
|
|
status: current
|
|
resolved_version: 1.4.0
|
|
```
|
|
|
|
### Coordination Model
|
|
|
|
```
|
|
┌──────────────────────────────────────────────────────────────┐
|
|
│ Coordination Layers │
|
|
├──────────────────────────────────────────────────────────────┤
|
|
│ Real-time Hints (IPC) │
|
|
│ ┌─────────────┐ SQLite ┌─────────────┐ │
|
|
│ │ Session A │◄───sessions.db──►│ Session B │ │
|
|
│ │ (aperture) │ notifications │ (fungal) │ │
|
|
│ └─────────────┘ └─────────────┘ │
|
|
│ │
|
|
│ Best-effort, sub-second latency, auto-cleanup │
|
|
├──────────────────────────────────────────────────────────────┤
|
|
│ Durable Changes (Git) │
|
|
│ ┌─────────────┐ ┌─────────────┐ │
|
|
│ │ Repo A │───sync branch───►│ Realm Repo │ │
|
|
│ │ │◄──PR review──────│ │ │
|
|
│ └─────────────┘ └─────────────┘ │
|
|
│ │
|
|
│ Source of truth, PR-based, auditable │
|
|
└──────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### Trust Model
|
|
|
|
```yaml
|
|
# realm.yaml
|
|
name: letemcook
|
|
version: 1.0.0
|
|
|
|
governance:
|
|
admission: approval
|
|
approvers: [eric@example.com]
|
|
breaking_changes:
|
|
require_approval: true
|
|
grace_period_days: 14
|
|
|
|
trust:
|
|
mode: collaborative
|
|
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]
|
|
```
|
|
|
|
### Caching
|
|
|
|
```sql
|
|
-- .blue/cache.db
|
|
|
|
CREATE TABLE export_cache (
|
|
file_path TEXT PRIMARY KEY,
|
|
mtime INTEGER,
|
|
content_hash TEXT,
|
|
exports JSON,
|
|
cached_at INTEGER
|
|
);
|
|
|
|
CREATE TABLE contract_cache (
|
|
domain TEXT,
|
|
contract TEXT,
|
|
version TEXT,
|
|
schema JSON,
|
|
realm_commit TEXT,
|
|
PRIMARY KEY (domain, contract, version)
|
|
);
|
|
|
|
CREATE TABLE validation_cache (
|
|
contract TEXT,
|
|
version TEXT,
|
|
binding_hash TEXT,
|
|
valid INTEGER,
|
|
output TEXT,
|
|
validated_at INTEGER,
|
|
PRIMARY KEY (contract, version, binding_hash)
|
|
);
|
|
```
|
|
|
|
### CI/CD Integration
|
|
|
|
```yaml
|
|
# .github/workflows/realm-check.yml
|
|
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-${{ hashFiles('.blue/config.yaml') }}
|
|
|
|
- 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 }}
|
|
```
|
|
|
|
### 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 |
|
|
|
|
### Cycle Prevention
|
|
|
|
```python
|
|
# At domain creation
|
|
def check_cycles(realm, new_domain, new_members):
|
|
graph = build_dependency_graph(realm)
|
|
graph.add_edge(new_domain, new_members)
|
|
|
|
if has_cycle(graph):
|
|
cycle = find_cycle(graph)
|
|
raise CycleError(f"""
|
|
Adding domain '{new_domain}' creates a cycle:
|
|
{' → '.join(cycle)}
|
|
|
|
Consider:
|
|
- Merging related domains
|
|
- Reversing a dependency direction
|
|
- Using a hub-and-spoke pattern
|
|
""")
|
|
```
|
|
|
|
---
|
|
|
|
## Final Scoreboard
|
|
|
|
| Expert | Final Position | Concern Addressed? |
|
|
|--------|---------------|-------------------|
|
|
| Alex Chen | **Support** | ✓ SQLite coordination, conflict handling |
|
|
| Barbara Liskov | **Support** | ✓ Contract model with ownership |
|
|
| Carl Hewitt | **Support** | ✓ SQLite as actor mailbox |
|
|
| Diana Rowan | **Support** | ✓ CI/CD integration complete |
|
|
| Erik Meijer | **Support** | ✓ Semver + compatibility rules |
|
|
| Fiona Walsh | **Support** | ✓ Trust model + credentials |
|
|
| Greg Wilson | **Support** | ✓ 5 commands, invisible caching |
|
|
| Helen Garcia | **Support** | ✓ Cycle prevention |
|
|
| Ivan Petrov | **Support** | ✓ SQLite everywhere, transactions |
|
|
| Julia Santos | **Support** | ✓ Validation hooks + CI |
|
|
| Kevin Ng | **Support** | ✓ SQLite cache, CI caching |
|
|
| Laura Kim | **Support** | ✓ Domain-level governance |
|
|
|
|
**Consensus: 12/12 Support**
|
|
|
|
---
|
|
|
|
## Dialogue Complete
|
|
|
|
**Rounds completed:** 12 of 12
|
|
**Final consensus:** Unanimous support
|
|
**Open items:** None - all addressed
|
|
|
|
### Summary of Changes from Original RFC
|
|
|
|
1. **Coordination:** Hybrid IPC (SQLite) + Git PRs instead of socket-only
|
|
2. **Commands:** Reduced from 13 to 5 MVP commands
|
|
3. **Contracts:** Added owner field, compatibility rules, validation hooks
|
|
4. **Caching:** SQLite-based with proper invalidation
|
|
5. **CI/CD:** Defined check modes and GitHub Actions integration
|
|
6. **Credentials:** Layered sources, git-first approach
|
|
7. **Trust:** Explicit permissions model
|
|
8. **Conflicts:** Ownership + semver + git resolution
|
|
9. **Cycles:** Detection and prevention at domain creation
|
|
10. **Governance:** Domain-level overrides supported
|
|
|
|
### Ready for RFC Update
|
|
|
|
This dialogue provides the refined design for RFC 0001. Key artifacts to update:
|
|
|
|
1. Architecture diagram
|
|
2. Command reference (5 MVP + admin commands)
|
|
3. Contract schema (add owner, compatibility, validation)
|
|
4. Binding schema (add semver ranges)
|
|
5. Caching section (SQLite)
|
|
6. CI/CD section (check modes, GitHub Actions)
|
|
7. Trust/governance section
|
|
8. Conflict resolution section
|
|
9. Implementation phases (adjust for new scope)
|
|
|
|
---
|
|
|
|
*Dialogue concluded with full consensus.*
|