| name | fleet |
| description | Interactive agent fleet designer - configure your multi-agent workspace. Triggers: "configure fleet", "setup agents", "multi-agent workspace", "fleet layout". |
| version | 3 |
| tier | lightweight |
Interactive agent fleet designer - configure your multi-agent workspace.
Fleet Protocol (The Workspace Architect)
Interactive agent fleet designer. Helps users configure their multi-agent workspace based on their workflow, not generic categories.
Core Concepts
Workgroups
High-level themes that organize your work. Not everyone has all of these:
| Workgroup | Description | Examples |
|---|
| project | Active codebase work | Viewer, Layout, API, Extraction |
| company | Company-specific agents | MCP tools, internal systems |
| domain | Domain research & expertise | Insurance, Financials, Legal |
| meta | Engine & session work | Sessions analysis, reports, engine |
| personal | Personal productivity | Notes, learning, experiments |
Subprojects
Actual features/areas you work on โ discovered through interview, not picked from a menu.
- Bad: "Frontend: Components" (generic)
- Good: "Viewer", "Layout", "Extraction UI" (your actual work)
Placeholders
Slots for areas you don't know yet. Create "Future" agents to reserve space.
Subcommands
| Command | Action |
|---|
/fleet | Full interview (new or update) |
/fleet update | Quick changes |
/fleet rearrange | Reorder agents/tabs |
/fleet launch | Start the fleet |
/fleet launch {workgroup} | Start specific workgroup |
/fleet status | Show current state |
/fleet add {workgroup} | Add agents to workgroup |
/fleet placeholder {workgroup} | Add future slot |
0. Setup Phase
-
Auto-detect identity (per ยถINV_INFER_USER_FROM_GDRIVE):
USERNAME=$(engine user-info username)
EMAIL=$(engine user-info email)
Announce: "Detected identity: {USERNAME} ({EMAIL})"
-
Check for existing config: Use engine fleet to detect existing configs:
engine fleet status
This outputs the fleet directory path and any running sessions.
Then check for yml files:
engine fleet list
- If configs found: "Found existing fleet config. Update it, or start fresh?"
- If no configs: "No existing fleet configuration found โ let's design one from scratch!"
-
Detect pane context (if running inside a fleet pane):
TMUX_SOCKET=$(echo "$TMUX" | cut -d, -f1 | xargs basename 2>/dev/null || echo "")
if [ "$TMUX_SOCKET" = "fleet" ]; then
CURRENT_PANE_ID="${TMUX_PANE_TITLE:-}"
CURRENT_LABEL=$(tmux -L fleet display-message -p '#{@pane_label}' 2>/dev/null || echo "")
CURRENT_WINDOW=$(tmux -L fleet display-message -p '#W' 2>/dev/null || echo "")
fi
If running in a fleet pane, offer: "You're in pane {CURRENT_LABEL} ({CURRENT_PANE_ID}). Update this pane, or configure the whole fleet?"
Phase 0 always proceeds to Phase 1 โ no transition question needed.
1. Interview Phase (Discovery-Based)
The goal is to discover what the user actually works on, not force them into categories.
Round 1: Workgroups
Execute AskUserQuestion (multiSelect: true):
"What levels of work do you do?"
- "Project work" โ Building features in your codebase
- "Company work" โ Company-specific tools, MCPs, internal systems
- "Domain research" โ Industry expertise (insurance, finance, legal, etc.)
- "Meta work" โ Sessions, reports, engine improvements, documentation
(Personal/experiments/learning โ user types in "Other")
Round 2: Subproject Discovery (per workgroup)
For each selected workgroup, execute an AskUserQuestion to discover subprojects. Use hardcoded examples as options โ the user names their actual subprojects via "Other".
If Project selected:
Execute AskUserQuestion (multiSelect: true):
"What features or areas of your app do you actively work on?"
- "Viewer" โ Frontend viewing/display components
- "Layout" โ Page layout and structure analysis
- "API" โ Backend API and services
- "Extraction" โ Data extraction and parsing
Then execute AskUserQuestion (multiSelect: false):
"Any areas you might work on soon but haven't started?"
- "Yes, I'll list them" โ Creates placeholder agents (type in "Other")
- "No placeholders needed" โ Skip placeholder creation
If Company selected:
Execute AskUserQuestion (multiSelect: true):
"What company-specific tools or systems do you work with?"
- "MCP tools" โ Model Context Protocol integrations
- "Internal dashboards" โ Company-internal admin tools
- "Company docs" โ Internal documentation and knowledge bases
If Domain selected:
Execute AskUserQuestion (multiSelect: true):
"What domains do you research or need expertise in?"
- "Insurance claims" โ Claims processing, Xactimate, adjusting
- "Financials" โ Financial analysis and reporting
- "Legal compliance" โ Regulatory and legal requirements
If Meta selected:
Execute AskUserQuestion (multiSelect: true):
"What meta-level work do you do?"
- "Sessions analysis" โ Reviewing and analyzing agent sessions
- "Reports" โ Generating progress and status reports
- "Engine work" โ Workflow engine improvements and maintenance
- "Documentation" โ Docs, standards, and knowledge management
Key principle: Let the user name their subprojects via "Other". The hardcoded options are starting points, not an exhaustive list.
Round 3: Hardware & Layout
Execute AskUserQuestion (multiSelect: false):
"How many monitors?"
- "1" โ Single monitor setup
- "2" โ Dual monitor setup
- "3+" โ Three or more monitors
Execute AskUserQuestion (multiSelect: false):
"Agents visible per screen?"
- "4 (2x2)" โ Compact grid, 4 agents per monitor
- "6 (2x3)" โ Medium grid, 6 agents per monitor
- "9 (3x3)" โ Large grid, 9 agents per monitor
- "12 (3x4)" โ Maximum density, 12 agents per monitor
Round 4: Organization
Execute AskUserQuestion (multiSelect: false):
"How should workgroups be organized?"
- "Separate tabs per workgroup" โ One tab per workgroup (Project tab, Domain tab, Meta tab)
- "Combined" โ All in fewer tabs, grouped by relatedness
- "Separate tmux sessions" โ Independent tmux sessions per workgroup (launch separately)
Execute AskUserQuestion (multiSelect: false):
"Add an Intakes tab for per-project inbox grooming (/intake)?"
- "Yes โ one pane per project" โ An Intakes tab with one agent pane per Linear project (you name them); invoke
/intake in a pane to groom that project's feedback inbox
- "Yes โ projects + a spare" โ Same, plus one
Future placeholder pane to activate for a new project later
- "No" โ No Intakes tab
2. Generate Layout Phase
Workgroup โ Tab Mapping
Based on organization preference:
- Separate: One tab per workgroup, subprojects as agents within
- Combined: Merge related workgroups (e.g., Project + Meta)
- Separate sessions: Generate multiple tmuxinator configs
YAML String Safety
[!!!] QUOTE ALL STRING VALUES IN YML. YAML silently converts unquoted values into non-string types. This causes runtime bugs that are invisible until the config is parsed.
Dangerous unquoted values (YAML interprets these as non-strings):
| Written | Parsed As | Type | Fix |
|---|
no | false | boolean | "no" |
yes | true | boolean | "yes" |
on / off | true / false | boolean | "on" / "off" |
null | null | null | "null" |
1.0 | 1 (integer) | number | "1.0" |
3:00 | 180 (seconds) | sexagesimal | "3:00" |
value: with colon | nested object | mapping | "value: with colon" |
- starts with dash | array item | sequence | "- starts with dash" |
{curly} | flow mapping | object | "{curly}" |
[bracket] | flow sequence | array | "[bracket]" |
Rule: Always double-quote ALL string values in generated yml โ descriptions, labels, env var values, command arguments. The only safe unquoted values are simple single-word identifiers with no special characters.
Examples:
- export AGENT_DESCRIPTION=Deep research: web and docs
- export AGENT_FOCUS=no specific focus
- export AGENT_DESCRIPTION="Deep research: web and docs"
- export AGENT_FOCUS="no specific focus"
- tmux set-option -p -t $TMUX_PANE @pane_label "Research"
Agent Generation
For each subproject discovered, gather three things during the interview:
- Agent type โ the persona from
~/.claude/agents/
- Description โ 1-3 sentence topic description (what this agent works on)
- Delegation tags โ which
#needs-* tags this agent handles
Generate a yml pane block with all three:
- {workgroup}-{subproject}:
- export TMUX_PANE_TITLE="{workgroup}-{subproject}"
- export AGENT_DESCRIPTION="{topic description}"
- tmux set-option -p -t $TMUX_PANE @pane_label "{Subproject}"
- clear && engine run --agent {agent_type} --description "$AGENT_DESCRIPTION"
Agent type is chosen based on the subproject's primary function:
- operator โ General-purpose work (API, schema, engine, etc.)
- refiner โ Extraction, parsing, prompt iteration
- reviewer โ Visual QA, review workflows
- researcher โ Domain research, deep dives
- analyzer โ Code/doc analysis, pattern identification
- writer โ Documentation, reports
- tester โ Test fixtures, coverage
- builder โ TDD implementation
- debugger โ Bug investigation
- critiquer โ Design critique, code review
Description is a concise topic summary that gets injected into Claude's system prompt via --description. It tells the agent what area of the codebase/domain it specializes in. Write it as if briefing a new team member.
Delegation tags map subprojects to #needs-* tags for dispatch routing. Each active agent should have 1-2 tags:
- Viewer โ
#needs-viewer, #needs-frontend
- Layout โ
#needs-layout, #needs-frontend
- Parsing โ
#needs-parsing, #needs-extraction
- Insurance โ
#needs-insurance, #needs-domain
- Sessions โ
#needs-sessions, #needs-meta
Delegation tags are used by the dispatch daemon to route work to the right agent. They are NOT passed to run.sh โ they are stored in the worker registration files created at startup by persistent agents (future feature) or in pool worker --accepts flags.
Placeholder Agents
For areas mentioned as "might work on soon" โ no agent, no description, just engine fleet wait:
- {workgroup}-future-1:
- export TMUX_PANE_TITLE="{workgroup}-future-1"
- tmux set-option -p -t $TMUX_PANE @pane_label "Future"
- engine fleet wait
Intake Panes
Intake panes are ordinary interactive agent panes โ one per Linear project โ where the user invokes /intake to run an inbox-grooming wave for that project. They use run.sh --agent operator (the operator runs the /intake protocol); no daemon, no --monitor-tags.
- intakes-{project-slug}:
- export TMUX_PANE_TITLE="intakes-{project-slug}"
- export AGENT_DESCRIPTION="Intake grooming for the '{Project}' Linear project. Drain the inbox, organize + consolidate feedback, triage each signal toward an outcome, graduate ripe items to tickets. Run /intake to start a wave."
- tmux set-option -p -t $TMUX_PANE @pane_label "{Short Label}"
- clear && ~/.claude/scripts/run.sh --agent operator --description "$AGENT_DESCRIPTION"
Generate one such pane per project the user names, and (if they chose "projects + a spare") a trailing intakes-future-1 placeholder that runs ~/.claude/scripts/fleet.sh wait. See /intake for what a grooming wave does.
Legacy โ Delegation Pool: earlier fleets had a pool tab of worker.sh --accepts daemon workers that auto-picked up #delegated-* work. That feature is deprecated; new fleets use the Intakes tab instead. If a user explicitly wants background daemon workers, the old worker.sh --pane-id โฆ --accepts "#needs-delegation,#needs-implementation" --agent operator form still works.
Activating or Updating a Pane
This flow handles both:
- Placeholder activation: Converting a "Future" slot to a real agent
- Self-update: Modifying an existing pane's configuration
When /fleet activate is invoked (or user presses 'a' in a placeholder):
Step 1: Gather Context
CURRENT_PANE_ID="${TMUX_PANE_TITLE:-unknown}"
CURRENT_LABEL=$(tmux -L fleet display-message -p '#{@pane_label}' 2>/dev/null || echo "Future")
CURRENT_WINDOW=$(tmux -L fleet display-message -p '#W' 2>/dev/null || echo "unknown")
Step 2: Ask Configuration Questions
Use AskUserQuestion to gather:
-
Name/Label: "What should this agent be called?"
- Suggest based on workgroup (e.g., domain โ research-related names)
-
Agent Type: "What type of agent?"
- Options:
researcher, builder, operator, analyzer, reviewer, writer, tester, prompter
-
Description: "Describe what this agent does (1-2 sentences)"
- Example: "Deep research agent for web, docs, and codebase exploration"
-
Focus Areas: "What topics does this agent specialize in? (comma-separated)"
- Example: "Insurance claims, Xactimate codes, PDF extraction"
Step 3: Apply Immediately
tmux -L fleet set-option -p @pane_label "{NEW_LABEL}"
Step 4: Prompt for Permanent Update
ALWAYS ask after setting the label:
Execute AskUserQuestion (multiSelect: false):
"Make this permanent in fleet.yml?"
- "Yes โ persist across fleet restarts" โ Update yml config so this survives
engine fleet start
- "No โ temporary until restart" โ Keep as runtime-only change (reverts on next fleet launch)
Step 5: Update Yml (if user said Yes)
-
Get yml path (use engine fleet config-path for dynamic resolution):
YML_PATH=$(engine fleet config-path)
YML_PATH=$(engine fleet config-path project)
-
Read the yml and find the pane entry by TMUX_PANE_TITLE:
- Search for line containing
export TMUX_PANE_TITLE="{CURRENT_PANE_ID}"
- This identifies the pane block to update
-
Update the pane block:
- Change the pane key (e.g.,
domain-future-2 โ domain-research)
- Update
@pane_label value
- Replace
engine fleet wait with engine run --agent {TYPE} --description "{DESC}" --focus "{FOCUS}"
- Add env var exports for description/focus
Before (placeholder):
- domain-future-2:
- export TMUX_PANE_TITLE="domain-future-2"
- tmux set-option -p -t $TMUX_PANE @pane_label "Future"
- engine fleet wait
After (activated):
- domain-research:
- export TMUX_PANE_TITLE="domain-research"
- export AGENT_DESCRIPTION="Deep research agent
3. Present & Confirm Phase
Show the proposed layout with workgroup organization:
## Your Fleet Layout
**Person**: yarik (yarik@finchclaims.com)
**Setup**: 2 monitors, 6 agents per view
### Workgroup: Project
**Tab: Project** (2x3 grid)
โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
โ Viewer โ Layout โ Extraction โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโผโโโโโโโโโโโโโโค
โ API โ Schema โ Future โ
โโโโโโโโโโโโโโโดโโโโโโโโโโโโโโดโโโโโโโโโโโโโโ
### Workgroup: Domain
**Tab: Domain** (2x2 grid)
โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
โ Insurance โ Financials โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโค
โ Future โ Future โ
โโโโโโโโโโโโโโโดโโโโโโโโโโโโโโ
### Workgroup: Meta
**Tab: Meta** (2x2 grid)
โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
โ Sessions โ Reports โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโค
โ Engine โ Future โ
โโโโโโโโโโโโโโโดโโโโโโโโโโโโโโ
### Intakes
**Tab: Intakes** (2x3 grid) โ one pane per Linear project, invoke `/intake` per pane
โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
โ Intake Sys โ Differ โ Email Class โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโผโโโโโโโโโโโโโโค
โ Doc Extract โ Claims & Polโ Future โ
โโโโโโโโโโโโโโโดโโโโโโโโโโโโโโดโโโโโโโโโโโโโโ
Adjust anything? (Add/remove/rename/reorder)
4. Save & Generate Phase
-
Create directories:
mkdir -p ~/.claude/fleet/workers
-
Generate tmuxinator config:
- Location: Resolve via
engine fleet config-path [workgroup]
- Default fleet:
tmux_command: tmux -L fleet -f ~/.claude/engine/skills/fleet/assets/tmux.conf
- Workgroup fleet:
tmux_command: tmux -L fleet-{workgroup} -f ~/.claude/engine/skills/fleet/assets/tmux.conf
- Each active pane exports
AGENT_DESCRIPTION and calls run.sh --agent {type} --description "$AGENT_DESCRIPTION"
- Placeholder panes call
engine fleet wait (no agent, no description)
- Intake panes use
run.sh --agent operator โ one per Linear project, invoke /intake to groom that project's inbox
-
Report:
Fleet configured!
To start default: engine fleet start
To start workgroup: engine fleet start {workgroup}
To update: /fleet update
To rearrange: /fleet rearrange
5. Update Mode
Quick operations without full interview.
Execute AskUserQuestion (multiSelect: false):
"What do you want to change?"
- "Add agents to a workgroup" โ Create new agent panes in an existing workgroup
- "Remove agents" โ Delete agent panes from the fleet config
- "Rename agents/tabs" โ Change labels or tab names
- "Rearrange layout" โ Reorder tabs, move agents between tabs
(Add/remove workgroups, convert placeholder โ type in "Other")
6. Rearrange Mode
For easy reordering:
-
Show current layout as numbered list:
1. [Project] Viewer
2. [Project] Layout
3. [Project] Extraction
4. [Domain] Insurance
5. [Meta] Sessions
-
Ask: "Enter new order (e.g., '3,1,2,5,4') or move commands ('move 5 to Project')"
-
Apply changes, regenerate config
The Intakes Tab
The Intakes tab holds one interactive agent pane per Linear project. Each pane runs an operator agent; the user invokes /intake in it to run an inbox-grooming wave for that project (drain new feedback โ organize + consolidate โ triage each signal โ graduate ripe items to tickets โ debrief). Panes are ordinary run.sh --agent operator panes โ no daemon, no tag monitoring. Add a trailing intakes-future-1 placeholder (fleet.sh wait) as a cheap slot for a new project.
Legacy โ Daemon Mode: earlier fleets ran a pool tab of daemon workers (worker.sh --accepts / run.sh --monitor-tags) that scanned sessions/ for #delegated-* tags and auto-spawned the resolving skill per ยงTAG_DISPATCH. Deprecated in favor of the Intakes tab. Still available on request for background delegation workloads.
Invariants
- ยถINV_YML_IS_SOURCE_OF_TRUTH: The fleet yml config is the single source of truth. No separate metadata files.
- ยถINV_INTAKES_TAB_LAST: The Intakes tab (formerly the pool tab) is always last.
- ยถINV_UNIQUE_AGENT_IDS: Agent IDs must be unique across all tabs.
- ยถINV_DISCOVER_DONT_PRESCRIBE: Interview discovers subprojects; don't force generic categories.
- ยถINV_PLACEHOLDERS_ARE_CHEAP: Encourage "Future" slots โ easy to convert later.
- ยถINV_INTAKE_PANE_PER_PROJECT: An Intakes tab has one interactive
/intake pane per Linear project (plus an optional spare) โ not daemon workers.