Skip to content

governance: Blackboard architecture — local, spoke, and hub coordination layers #80

@mellanon

Description

@mellanon

Problem Statement

The hub can't see what spokes are doing. The flow is one-way:

  • Hub → Spoke: governance, issues, review comments (works — GitHub primitives)
  • Spoke → Hub: nothing automated. Contributors push PRs manually, write journal entries manually, update status manually.

There's no contract for what a spoke exposes, and no tooling to read it.

v1 Scope: Spoke Contract + CLI

Two deliverables:

1. Spoke Contract Schemas

What a spoke project exposes so the hub can read it. Two files in .collab/ at the spoke repo root:

File Maintained by Purpose
.collab/manifest.yaml Human (contributor) Spoke identity — who am I, what hub do I report to, how to query me
.collab/status.yaml Auto-generated (CLI) Execution snapshot — phase, test results, git state

Full schema proposal: see comment below.

2. CLI Tooling ("blackboard")

The tool is called blackboard — it operates on blackboards at any level (spoke, hub). Generic, not tied to pai-collab.

Spoke-side commands:

Command What it does
blackboard init Create .collab/ directory with manifest.yaml template
blackboard status Generate/update status.yaml from current repo state

Hub-side commands:

Command What it does
blackboard pull Aggregate status from registered spokes
blackboard registry Show all spokes and their health

Design Principles

  1. Lightweight protocol between layers — only define what crosses each boundary
  2. Free-flowing internals — how you organize work within each layer is your choice
  3. The hub doesn't prescribe project structure — no mandated TASKLIST format, TELOS schema, or SOP conventions
  4. The tool is generic — "blackboard" operates on any blackboard, not just pai-collab
  5. Convention over invention — reuse Git, GitHub, YAML, existing PAI tooling

Design informed by PAI Founding Principles

This scope was arrived at by analyzing the original local blackboard proposal (#78) against PAI's 16 Founding Principles. Key principles that shaped the v1:

  • Principle 6 (Code Before Prompts) — If you can solve it with a CLI, don't build a coordination protocol
  • Principle 8 (UNIX Philosophy) — Do one thing well. Composable tools, not interdependent systems
  • Principle 15 (Science as Meta-Loop) — Prove the spoke contract works before building agent coordination on top

Future Vision (explicitly parked)

These are valuable architectural ideas from #78 and earlier discussions. They are parked — not rejected — until v1 proves the need:

Concept Source Why parked
Local agent coordination (agents.yaml, tasks.yaml) #78 Solves a future problem (multi-agent contention). Build when contention is empirically observed.
Token quota tracking #78 Belongs in PAI runtime, not the coordination layer (Council unanimous).
Task claiming protocol #78 Overengineered for 2-3 concurrent agents (Council unanimous, PAI Principle 15).
Progress broadcasting between agents #78 YAGNI until local blackboard exists.
Change awareness / diffable status #77 (closed) Additive feature after v1 — --since flag on status queries.
Federation (multi-hub) hub-spoke-protocol.md Design for it (manifest.yaml uses singular hub:), build later.

What This Consolidates

Issue Status Disposition
#76 (formal schema) Closed Absorbed — schema work was overscoped
#77 (change awareness) Closed Absorbed — additive feature after v1
#78 (local blackboard) Open Valuable future architecture. Parked with PAI Principles analysis and Council debate.
#54 (CLI tooling) Open Implementation vehicle — feature list revised for "blackboard" tool

Incorporating Review Feedback

From @jcfischer's review on #54:

  • Add schemaVersion to manifest.yaml — included in schema proposal
  • Add license field (SPDX identifier, per CONTRIBUTING.md) — included
  • Consider dropping exports in favor of convention-based discovery
  • Ensure CLI validation matches CI gate logic
  • Add journal read, contributor list, how commands to CLI feature list (post-v1)

Open Questions

  1. exports field — Jens suggested convention-based discovery instead of explicit exports. Do we need exports in manifest.yaml, or is convention sufficient? (e.g., always look for .specflow/features.db, always look for README.md)
  2. .collab/ vs .blackboard/ — Directory name should match the tool name. If the CLI is blackboard, should the directory be .blackboard/?
  3. CI integration — Should blackboard status be runnable in GitHub Actions without PAI? (Current design: yes — the protocol is execution-context agnostic.)

Reference

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2-mediumDo this soongovernanceRepo-level policy, trust model, and processtype/taskActionable work itemworkstream/hub-spoke-infraWorkstream: Hub-spoke infrastructure and coordination layer

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions