Gas city factory board
1. Architectural Alignment: Gas City Primitives¶
The Factory Board maps 1:1 to canonical Gas City primitives:
| Concept | Gas City Primitive | Ground Truth | | :---
Gas City Doctrine Enforcement (v2.0) - Sessions perform work. (Sessions are disposable). - Beads remember work. (Durable universal substrate). - Convoys group work. - Mail coordinates work. - Formulas remember how. (Reusable methods). - Agents execute. - Packs configure. - Rigs scope. - Orders trigger. - Events prove what happened. - Work is not complete until verified and promoted (Capability, Skill, Formula, Pack, Order, Policy). (No parallel "learning lifecycles" or "agent memory" outside this machinery).
| :--- | :--- |
| Work Objective / Grouping | CONVOY | Bead of type convoy; membership via non-blocking tracks edges |
| Atomic Work Unit | BEAD | Persistent work record in Dolt hq (tasks, features, bugs, epics) |
| Execution Surface | RIG | Project registered with city (BluCity/rigs/*) |
| Worker Identity | AGENT | Autonomous principal running in a managed session |
| Execution Method | FORMULA | Reusable task workflow that materializes as child beads |
| Observation | EVENT | Immutable, append-only log of lifecycle transitions |
| Delivery State | GITLAB MR / CI | Operational truth for merged code and container artifacts |
2. Convoy Lifecycle & Mechanics¶
Convoys answer batch questions — "are all five of these tasks done yet?" — without blocking dependencies.
stateDiagram-v2
[*] --> Open: gc convoy create / gc sling
Open --> Tracking: gc convoy add convoy bead
Tracking --> AutoClosed: on_close hook — all member beads closed
Tracking --> Landed: gc convoy land — owned flag skips auto-close
AutoClosed --> [*]
Landed --> [*]
Core Commands & Rules¶
Creation & Grouping:
- Ad-hoc sprint / objective: gc convoy create "Objective Name" bead-1 bead-2 ...
- Single task dispatch: gc sling <target> <bead> automatically wraps in convoy
- Membership via tracks edges (grouping, NOT blocking)
Completion Semantics:
- Auto-Close (default): on_close hook fires when all tracked beads close — no polling
- Manual / Governed (--owned): For release gates or deployment convoys. Requires explicit: gc convoy land <convoy-id>
- Reconciliation: gc convoy check resolves misfired auto-close hooks
Stranded Work Detection:
- gc convoy stranded → open beads in convoys with no assignee or routing target
- This IS the READY_BEADS>0 AND IDLE_AGENTS>0 = FAILURE detection mechanism
Convoy Metadata:
| Field | Purpose | Example |
|---|---|---|
convoy.owner |
Managing coordinator agent | BLU, MAYOR, REFINERY |
convoy.notify |
Recipient notified on completion | @channel-factory |
convoy.merge |
Merge protocol for PRs | direct, mr, local |
target |
Branch inherited by member beads | release/v0.1.x |
Set at creation: gc convoy create "Deploy v2" --owner mayor --merge mr --target main
Update later: gc convoy target <id> <branch>
3. Pull-Based Agent Discovery Protocol¶
Agents do NOT have work pushed. They query ready beads via the canonical claim protocol:
flowchart LR
A["Work Created<br/>(bd create / gc sling / formula cook)"] --> B["Routed to Agent<br/>(assignee / gc.routed_to)"]
B --> C["Session Startup<br/>(gc hook --claim)"]
C --> D["Atomic Claim<br/>(one ready bead + continuation siblings)"]
D --> E["Agent Executes"]
E --> F["bd close → convoy auto-closes"]
Readiness rules:
- Blocked beads (is_blocked = true) are invisible to bd ready
- Pool query: bd ready --metadata-field gc.routed_to=drupal/worker --unassigned --limit=1
- When a blocker closes, downstream bead becomes ready automatically via EVENT
WIP Constraints:
- Per-convoy: convoy ready beads > 0 AND idle agents > 0 ⇒ dispatch
- Per-agent: max_active_sessions in Gas City config (mechanical, not prose)
- No agent claims multiple beads concurrently unless explicitly linked as continuation siblings
4. Factory Board Visual Model¶
Global Navigation¶
[ Overview ] [ Convoys ] [ Beads ] [ Agents ] [ Rigs ] [ Formulas ] [ Orders ] [ Events ] [ GitLab ] [ Releases ]
Executive Metric Strip¶
┌─────────────────┬─────────────┬─────────────┬──────────────┬───────────────┬────────────┐
│ ACTIVE CONVOYS │ READY BEADS │ ACTIVE BEAD │ BLOCKED BEAD │ ACTIVE AGENTS │ OPEN MRS │
│ 6 │ 17 │ 6 │ 4 │ 8 │ 6 │
└─────────────────┴─────────────┴─────────────┴──────────────┴───────────────┴────────────┘
[!IMPORTANT]
READY BEADS > 0withACTIVE AGENTShaving capacity = dispatch failure. This is the primary factory health signal.
Active Convoys Table¶
| Convoy ID | Title / Objective | Owner | Target | Progress | Ready | Active | Blocked | Stranded | Assigned Agents | Delivery |
|---|---|---|---|---|---|---|---|---|---|---|
hq-cv-243 |
Drupal Recipe Factory | BLU |
release/v0.1.x |
6/11 | 3 | 1 | 1 | 0 | agent-drupal |
!243 ✅ |
hq-cv-221 |
Agent Identity Chain | BLU |
release/v0.1.x |
4/7 | 1 | 1 | 1 | 0 | agent-drupal, agent-contract |
!221 🔄 |
hq-cv-104 |
City Authority Recovery | MAYOR |
main |
8/12 | 2 | 1 | 1 | 0 | agent-mayor |
— |
hq-cv-247 |
Release v0.1.x Convergence | REFINERY |
main |
14/18 | 2 | 1 | 1 | 0 | agent-refinery |
!126, !247 |
hq-cv-099 |
OpenClaw Runtime Adapter | RUNTIME |
develop |
9/10 | 0 | 1 | 0 | 0 | agent-openclaw |
!10 ✅ |
Data sources:
- Convoy list: gc convoy list --json
- Progress: gc convoy status <id> --json
- Stranded: gc convoy stranded --json
- Delivery: glab mr list --json cross-referenced with bead metadata branch
Convoy Drilldown (Bead Graph)¶
Clicking a convoy row expands to the full bead graph with dependency edges:
CONVOY: hq-cv-221 (Agent Identity Chain)
OWNER: BLU │ TARGET: release/v0.1.x │ MERGE: mr │ NOTIFY: @channel-factory
PROGRESS: 4 / 7 closed ████████░░░░░ 57%
┌────────────────────────────────────────────────────────────────────────┐
│ ✅ CLOSED (4) │
│ ✓ bl-711: Define OSSA identity specification │
│ ✓ bl-712: Register DUADP identity token provider │
│ ✓ bl-715: Provision GitLab machine principal (@bluefly) │
│ ✓ bl-719: Verify DRUPAL commit provenance signing │
├────────────────────────────────────────────────────────────────────────┤
│ 🔵 ACTIVE (1) │
│ ● bl-722: ContractPlane authorization gate integration │
│ Assignee: agent-contract · Rig: contractplane-ai · MR: !221 │
├────────────────────────────────────────────────────────────────────────┤
│ 🔴 BLOCKED (1) │
│ ! bl-725: ContextControl production provenance audit │
│ Blocked by: bl-1402 (root: hq-cv-104 City Authority Recovery) │
├────────────────────────────────────────────────────────────────────────┤
│ ⚪ READY (1) │
│ ○ bl-728: Propagate verified machine identity to secondary roles │
│ Eligible: unassigned · Pool: drupal/worker │
└────────────────────────────────────────────────────────────────────────┘
Global Work Feeds¶
Ready Across All Convoys (Pull Queue)¶
[!TIP] This is the view an idle agent's
gc hook --claimqueries. If this table has rows and agents are idle, the factory has a dispatch failure.
| Bead ID | Convoy | Rig | Routed To | Priority | Title |
|---|---|---|---|---|---|
bl-1234 |
hq-cv-243 |
recipe_amcs |
drupal/worker |
P1 | Hook recipe validation runner |
bl-728 |
hq-cv-221 |
duadp |
drupal/worker |
P2 | Propagate verified machine identity |
bl-1402 |
hq-cv-104 |
blucity |
mayor/worker |
P0 | Reconcile Dolt manifest sync locks |
Data source: bd ready --flat --json across all scopes
Blocked Work Analysis¶
| Bead ID | Convoy | Direct Blocker | Root Cause | Remediation Owner |
|---|---|---|---|---|
bl-725 |
hq-cv-221 |
bl-1402 |
City authority Dolt lock prevents schema write | MAYOR |
bl-1109 |
hq-cv-243 |
bl-1234 |
Recipe test fixtures depend on validator runner | BLU |
Data source: bd list --status open --blocked --json + dependency graph traversal
Stranded Work Warning¶
⚠ gc convoy stranded
CONVOY ISSUE TITLE
hq-cv-247 bl-1501 Update release notes template
[!WARNING] Stranded work = open bead inside a convoy with no assignee AND no
gc.routed_to. It will never be claimed. Route it:gc sling <target> bl-1501
5. Agent Status Panel¶
| Agent | Provider | Rig | Session | Status | Current Bead | Convoy | WIP |
|---|---|---|---|---|---|---|---|
gascity.mayor |
claude | — (city) | gc-mayor-1 |
active | bl-1402 |
hq-cv-104 |
1/1 |
backend/gascity.polecat |
codex | blucity |
gc-pol-3 |
active | bl-722 |
hq-cv-221 |
1/3 |
backend/gascity.polecat |
codex | blucity |
gc-pol-4 |
idle | — | — | 0/3 |
gascity.refinery |
claude | — (city) | gc-ref-1 |
active | bl-247 |
hq-cv-247 |
1/1 |
gascity.witness |
claude | blucity-docs |
gc-wit-1 |
idle | — | — | 0/1 |
Data source: gc session list --json + gc status --json
[!IMPORTANT]
max_active_sessionsis the native Gas City WIP limit. This replaces prose instructions about "don't over-parallelize."
6. BLU Operating Contract for Convoys¶
Portfolio Governance¶
- BLU monitors convoy distribution, detects stalled objectives, ensures WIP limits are respected
- BLU creates and manipulates convoys strictly through
gc convoy create,gc convoy add,gc sling - BLU does NOT invent synthetic groupings outside Gas City primitives
Dispatch Rules¶
- When dependencies clear, the resulting
EVENTautomatically makes child beads ready - Autonomous agents claim via
gc hook --claim— pull model, not push gc convoy strandedis the canary — if it returns rows, route them immediately
Completion Verification¶
- Convoy auto-closes when all tracked beads close (unless
--owned) - BLU verifies convoy completion means effect is proven, not just bead status
- For
--ownedconvoys (release gates): BLU or designated owner must explicitly land
Cross-Convoy Dependencies¶
- A bead in convoy A can be
blocked_bya bead in convoy B - The blocked bead remains invisible to
bd readyuntil the blocker closes - The board shows cross-convoy blockers in the Blocked Work Analysis feed
- BLU routes the blocker resolution, not the blocked bead
7. Data Collection Contract¶
Every board view is populated from Gas City JSON output — no scraped prose, no cached state files:
| Board Section | Data Source | Command |
|---|---|---|
| Executive Metrics | City status | gc status --json |
| Active Convoys | Convoy list | gc convoy list --json (when available) or bd list --type convoy --status open --json |
| Convoy Progress | Convoy status | gc convoy status <id> --json |
| Ready Queue | Ready beads | bd ready --flat --json |
| Blocked Analysis | Blocked beads | bd list --status open --blocked --json |
| Stranded Warning | Stranded beads | gc convoy stranded --json |
| Agent Status | Session list | gc session list --json |
| GitLab Delivery | MR state | glab mr list --json |
| Events Feed | Event stream | gc events --json --follow |
[!NOTE]
gc --jsonis the automation contract. Usegc --json-schema=resultto discover the exact schema for each command. Validate at command boundaries, not inline.
8. Implementation Notes¶
What This Replaces¶
| Old | New |
|---|---|
| "Execution Lanes" (invented) | Convoys (native Gas City primitive) |
| Manual dispatch lists | gc convoy stranded + bd ready |
| Prose WIP limits | max_active_sessions in agent config |
| Push-based task assignment | Pull via gc hook --claim |
| Status polling | EVENT-driven readiness |
What This Does NOT Implement¶
- No new Bluefly abstractions
- No dashboard service (board is a data model, not a running process)
- No replacement for Beads/Gas City (this IS Beads/Gas City)
- No convoy creation until authority recovery (Phase 6) completes
Prerequisites¶
- Oracle City authority recovery must complete (single authoritative Dolt)
- Gas City
gcmust be operational on the target host gc convoycommands must be available (verifygc --version)- Board data scripts use
gc --jsonwhich requires sufficiently recentgc