Skip to content

Coordination board (Needs-you cockpit) — ideation - #494

Draft
juliarvalenti wants to merge 5 commits into
mainfrom
feat/coordination-board
Draft

Coordination board (Needs-you cockpit) — ideation#494
juliarvalenti wants to merge 5 commits into
mainfrom
feat/coordination-board

Conversation

@juliarvalenti

Copy link
Copy Markdown
Contributor

Summary

Adds a coordination board — a live projection over the room's event ledger — across the backend, CLI, and GUI. It replaces the flat plan/tasks.md surface (the Plan tab) with a lens-based board of concern/action rows (issue #493).

This is an exploratory / ideation branch (draft). It is wired end-to-end and verified live, but the design is still moving — see the pinned framing comment below for where this is headed.

What's here

Backend (fastapi-backend)

CLI (mycelium-cli)

  • mycelium board — default "Needs you" lens, --all, --watch; the five verbs + capture; short-id prefixes resolve to the full item. 7 tests.

Frontend (mycelium-frontend)

  • RoomBoard replaces the Plan tab: three lenses (Needs you / In flight / Resolved), rows rendered as stateful objects with expand-on-demand detail, one-gesture triage, ⌘K capture. board_updated SSE nudges a live refresh; dev:mock has a board fixture.

Status / honesty

Not for merge

Draft. The point of this branch is to think, not to ship. Framing/vision is tracked in a comment below rather than in the issue.

Related: #493, #446, #450, #301, #476

Replace the Plan tab with a live board projection (issue #493): lens
tabs (Needs you / In flight / Resolved / All), rich rows with owner +
presence + work-links + GitHub back-refs, one-gesture triage, capture
bar. Data comes from projectBoard() over the compiled plan, agent
roster, and episodes, topped up with sample archetypes. Verbs are
optimistic local stubs; GitHub/herdr wiring is display-only.
Backend: a /rooms/{room}/board projection (app/services/board.py +
routes/board.py) over three sources — the stateful action/concern
event ledger (#392), the compiled plan checklist, and the live
episode — with the shared triage verbs (claim/block/resolve/promote/
dismiss) and NL capture. Richer board state + display fields (owner,
work-links, GitHub back-ref, choices) ride in the event payload so the
#392 primitive is untouched. Verbs are the same vocabulary agents drive
over the ledger, so human and agent triage share one surface. 10 tests.

Frontend: RoomBoard now fetches the real endpoint and drives real verbs
(optimistic + reload), board_updated SSE nudges a refresh, and dev:mock
gains a board fixture. board.ts is now a thin lens helper over the API
types.
A Rich terminal client over the board endpoints: `mycelium board`
(default 'needs you' lens, --all, --watch) plus the shared verbs
(claim/resolve/block/promote/dismiss) and `capture`. Short-id prefixes
resolve to the full item so callers don't type UUIDs. Verified live
against a real room end-to-end (capture → claim → block → resolve).

Also: claiming an item now clears needs_you, so claimed work moves from
the 'Needs you' lens to 'In flight' where it belongs.
Address the 'looks like chat' feel: rows now read as objects, not
messages — a leading chevron + state anchor, a kind pill, a dominant
title, and quiet right-aligned meta (owner/presence · CI · PR · age).
No avatars, no timestamp column. Clicking a row (or the chevron) expands
it in place to reveal detail-on-demand: id, source, provenance, opened-
at, dependencies (waiting-on/blocks), work links, GitHub back-ref, and
reply/open-PR affordances. Accordion as progressive disclosure, not
navigation; one-gesture triage stays on the collapsed row.
@juliarvalenti

Copy link
Copy Markdown
Contributor Author

Framing / vision (tracked here, deliberately not in the issue)

This branch started as "replace the plan surface with a board" and drifted into a longer conversation about what this thing actually is. Capturing that here so it doesn't evaporate. This is the north star; the code above is only partway to it.

The axis

It's a coordination layer for teams with more agents in flight than any one person can track. GitHub stays the source of truth for what needs doing — we don't replace or mirror it. What we add is the layer where agents pick up that work and coordinate with each other to get it done, over a shared message bus (the SLIM await/respond + L9 spine already exists). The shift for the human is the whole point: you go from dispatching tasks and reviewing everything yourself to steering the exceptions the agents can't resolve on their own.

Day to day it's a live board of work in progress, except the cooks are agents. You watch them claim tickets, hand off, hit blockers against real GitHub issues. When one does something that needs a human — changes an authz model it isn't sure about, hits a call above its pay grade — it raises that through the fabric and the exception lands in front of the right person. You're not digging through diffs or sitting in a review queue guessing; the coordination routes the judgment calls to you.

What it is deliberately not

  • Not a memory engine. Memory is underneath, feeding agents context — but we don't compete on retrieval (we'll lose that benchmark race and shouldn't play). Memory is fuel, not the product.
  • Not a wiki / Jira / board you curate. The failure mode we've watched happen to a sibling project: the moment you show people a curated-looking store, they curate it; the moment they curate it, hallucination stops being "a summary" and becomes "a bug." Intent doesn't survive org gravity — only structure does.

The anti-rot rules (structural, not aspirational)

  1. Nothing durable lives here without a hard-source backing (a real GitHub issue/PR) or a TTL. The substrate physically can't accumulate into a backlog to groom.
  2. Read-through, never edit-through. You can't mutate authoritative state from the board — no second master to clobber on sync.
  3. Provenance is visible. If a row is soft, it looks soft. You can't accidentally present off a pointer.
  4. Self-populating. It fills from reality (events, PRs, CI, agents); the human steers exceptions, never fills an empty box.

Prior art: this is "Delta, for coordination"

Zed's Delta / DeltaDB does exactly this for code: Git stays authoritative, DeltaDB captures what happens between commits (edits + conversation) anchored so it can't rot, and you steer by asking the agent instead of reconstructing intent from a diff. We're one altitude up: capture what happens between issues, across teams and agents, over a shared fabric instead of one worktree. Same discipline, coordination granularity. (https://zed.dev/blog/introducing-delta)

The three organs (keep them separate)

  • GitHub — authoritative work orders. Never usurped.
  • TOME / the wiki — curated structural + cultural knowledge (how we deploy, OpenFGA conventions, gotchas). A different organ; the board reaches into it but does not become it.
  • Mycelium — the connective tissue: the derived cognition that accretes while work happens (decisions, deploy plans, episodes) + the fabric where agents coordinate. This is what we own and what nobody else has.

The drift we're trying to close

What's built is closer to a human-driven triage board (Trello-ish). The vision wants:

  • "Needs you" = what agents escalated to you, not human to-dos.
  • GitHub-backed rows are first-class (down-link: an actively-worked issue projects its live execution state); bespoke items are visibly transient.
  • Agent coordination is visible on the board (handoffs, who's addressing whom), not invisible plumbing.
  • Anti-rot enforced, not just intended (backing-or-TTL as a real property).

The commits after this comment are a first pass at pulling the board toward that axis.

…-rot TTL

First pass pulling the board from human-triage toward the target model
(PR #494 framing): agents coordinate the doing and *escalate* what needs
human judgment; the human steers exceptions.

- Escalations are a first-class board input: POST /board/escalate (any
  awake agent can call it), an 'escalation' kind that always needs-you and
  floats to the top of the lens. Names the agent and its ask (sign-off /
  decision / review / unblock).
- Anti-rot made structural, not aspirational: bespoke captures/escalations
  carry a default TTL and self-expire; only a GitHub-backed item is durable.
  Rows expose ephemeral + expires_in so a decaying pointer never reads as a
  durable record.
- Wired through all three surfaces: backend projection + route (+3 tests),
  'mycelium board escalate' CLI, GUI escalation rows + transience hints,
  dev:mock fixture.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant