09 · Docs — queue, board & memory

The prompt never locks.

Send while the boss is mid-turn and the line lands in a backlog the office manages — not a tunnel, not a lost keystroke. Flushes go out as one batch, completions sweep the board behind them, and everything the office finishes lands in a ledger the next boss reads.

Free-send

The backlog is a queue the office manages.

Hit enter while the boss works and the prompt free-sends into the backlog — the status line reads busy · N queued and you keep typing. Queued items are not invisible: each one gets a board row, so the office and its telemetry agree on what is waiting.

When the backlog drains it goes out as a single [BATCH DISPATCH] — one composed message the boss decomposes into parallel sub-agents, instead of N separate turns replayed in order./route forces that flush early, and /queue shows the backlog (/queue clear drops it). A dead boss respawns a fresh session and resends the batch — the queue is not hostage to one process.

enterfree-send into the backlog/queueshow the backlog/queue cleardrop the backlog/routeforce-dispatch now
theboringfloor chat tab: three queued prompts flushing out as one [BATCH DISPATCH] message
chat — a three-item backlog flushing as one [BATCH DISPATCH]
Board sync

Every completion sweeps the board behind it.

A worker return — or a flushed queue item — flips stranded DOING rows to DONE so the office board stays honest without you policing it. Only office-owned DOING rows are in play: agentmemory-mirrored rows own their own lifecycle and are never touched.

The matching is conservative by design. The completion's own exact row is excluded — the caller already closed it, and the sweep never double-flips it. Then the same worker's oldest in-progress row flips, one per completion. Then a normalized title-prefix match (≥8 characters, case- and whitespace-insensitive) catches twins. A row flips only when exactly one rule claims it — ambiguity across workers flips nothing, and nothing about it is printed or fudged.

When anything did move you get exactly one dim note: [office] board sync: flipped N rows to done. No sweep, no banner — and that note stays on the status bar and the activity log, never in the transcript.

The current project board with tickets, priorities, owners, and work moving through five columns
project board — illustrative tickets across the workflow
Memory

The ledger is the office's completed-work memory.

Every completed dispatch lands in <dir>/.opencode/office-ledger.md — newest first, capped at 50 — as one ### date · title — worker (role) · `verdict` block carrying the summary line, the touched files, the verify digest, a proof one-liner and a ledgerId. The charter wires that file into the boss's instructions, so the next session's boss reads what this project already finished before re-dispatching it. No more "I don't have any memory of a prior task."

The same record also rides to agentmemory as an office_dispatch_done observation when that server is up — file-only when it is not. The boot splash's memory: ledger armed versus memory: file-only (agentmemory :3111 refused) line, and the status line's memory: note, tell you which lane got it.

In-app, /memory reads the ledger newest-first: the header counts the records and names the memory state (agentmemory OK or file-only), a missing ledger shows an honest empty state, and /memory fix narrows rows case-folded over title and files. Each completed dispatch also stamps a [memory] recorded: <title> → ledger line into the activity tab.

/memorycompleted dispatches, newest first/memory fixfilter over title/files
Unwinding

/stop aborts. The watchdog names a wedge.

/stop aborts current work — boss and workers — on the spot, and free-send keeps taking prompts the whole time. If a busy turn goes silent for two minutes, the wedge watchdog notes it once: the office calls that a wedge, and it reads on the status bar and in the activity log — never in the transcript.

A wedge is a suspicion, not a lock. The office itself keeps answering: keys, panels, scrolling and /stop all still work while the note is up, so a silent turn never takes the floor down with it.

The inverse is an idle floor. After workers finish and the last real chat was yours — not the boss, not the office concierge — two quiet minutes asks the boss to write a recap in chat. The fallback office note only appears if that send misses the wire. A late boss or concierge wrap cancels the recap.

/stopabort boss + workers2minof silence = wedged, noted once2min idleboss writes a recap
theboringfloor: /stop aborting in-flight work with the wedge watchdog note on the status bar
chat — /stop unwinds the turn; the wedge note rides the status bar
Ceilings

What this doesn't do yet.

  • Stuck rows stay stuck. Board sync never flips a row it can't prove — a cross-worker doubt means no flip and no drama, so a stray DOING row is yours to close by hand.
  • The ledger is not recall. It records completed dispatches for the next boss, newest 50. The boss's scrollback is transcript history; agentmemory's semantic search is agentmemory's. /memory only reads the ledger.
  • /stop is not a rollback. It aborts the turn — whatever the turn already changed on disk stays changed.
  • /queue clear has no undo. Dropped backlog items are gone, not parked.