lock family docs GitHub

lea · Teams of agents

Control tower

lea brings its own Claude Code plugin, lea, loaded in every agent (from the image, for the session only: nothing is installed in your ~/.claude). Its skill /lea:control-tower turns a lead into your control tower: you talk to it only, it splits your requests into tasks, starts dev and reviewer agents with self-contained briefs, answers their questions when it can, and follows them with board_read, and briefs you in one line per agent. Between your requests an agent's report wakes it, as it wakes every agent whose turn is over:

fix-login · done · PR #42, 18 tests pass
dark-mode · blocked · which palette: Catppuccin or Nord?
Needs you: palette for dark-mode

Ask it for the board, the detail of an agent, or to stop one, in your own words.

It replies in the language of your latest message, and switches as soon as you do; its agents' messages, mostly in English, never change it. In tower mode lea reminds it on every prompt.

It asks you one question at a time, whatever the number of agents with a question for you: its user_ask tool opens a question when none is open and queues the others (an incident first, then what blocks an agent, then the rest, in order); the agents keep working meanwhile. Your next prompt, or your answer to its AskUserQuestion, answers the open question, and the tower relays the answer to the agent it came from, then asks the next one. While you have a question, lea denies the tower a second AskUserQuestion. A question left unanswered LEA_QUESTION_REMIND minutes (120) is asked once more, prefixed with reminder:. The deck shows the tower as ❓ 1 · 3 queued; lea questions lists the questions, lea questions drop ID drops a queued one; in the deck, Q (or the tower's right-click menu, Questions…) lists them and drops a queued one. The tower's status line shows the same count.

To answer in peace, pause the tower's inbox: H in the deck (or Hold messages in its menu), or lea hold (lea hold --off releases it). The messages its agents send it wait, and the row shows ⏸ N; your own notes and the replies to what the tower sends during the pause still arrive, and an agent's ask to it fails at once (the agent sends instead and keeps working). On release the tower gets them all and briefs you once. lea releases a pause on its own after LEA_HOLD_MAX minutes (30; 0: never). Only you can pause or release an inbox, never an agent.

When lea opens the deck on a container with no agent running (the very first launch, or every agent ended), the agent it starts is a Control Tower: a lead on Claude, labelled Control Tower, whose first prompt runs /lea:control-tower (lea deck-open --no-default starts nothing). In the deck, N starts another one (Control Tower 2…). A Control Tower always runs on the claude provider, whatever the default one, since the skill and its hook ship in the Claude plugin. Only you start one: agents cannot.

The tower never does the work itself, not even a git push: every request goes to an agent. The plugin enforces it with a hook: once /lea:control-tower runs, the session may only use lea's team tools (agents_*, msg_*, board_read, task_update), ask you questions and run lea inbox --agent --wait; any other tool (Bash, Edit, Read, git, gh, the web…) is denied with a reminder to delegate. /lea:control-tower off gives the session its tools back.

Type /lea:check (or ask for a status, a "point", a "topo") for the state of the work in progress, in at most 10 lines: done since the last check, in progress, left, and what is blocked or yours to decide. A tower builds it from the board and the agents' reports, without doing any work; any other agent from its own task. Nothing new since the last check: one line.

✅ Done
dev-1: login fix merged, CI green
🔄 In progress
dev-2: dark mode, tests being written
⚠️ Blocked / to decide
dev-2: palette, Catppuccin or Nord?