| name | c11 |
| description | c11 is a native macOS terminal multiplexer. Load this skill anytime any of the following attributes are hit: (1) session is inside c11 (`C11_SHELL_INTEGRATION=1`), (2) working with panes, surfaces, workspaces, splits, or tabs, (3) sending text or commands to another surface, (4) launching or orchestrating sub-agents, (5) declaring agent identity, setting title/description, or reporting sidebar status, (6) using the embedded browser or markdown surfaces, (7) any c11-specific command or troubleshooting question. When in doubt, load it. |
c11
c11 is a native macOS terminal multiplexer for the operator:agent pair. One operator runs many agents in parallel; c11 gives every terminal, browser, and markdown surface a handle so the whole field stays legible. Hierarchy: window → workspace (a sidebar tab) → pane (a split region) → surface (a terminal, browser, or markdown viewer).
This card is deliberately short. It covers orientation — the one thing every agent does on launch — and a map of everything else. Load the named reference when you reach for a capability; don't pull in depth you don't need.
Detect c11
C11_SHELL_INTEGRATION=1 means you're inside c11 — prefer native workflows (splits, the embedded browser, c11 set-metadata) over Chrome MCP or plain open. Other env vars available to child processes: C11_WORKSPACE_ID, C11_SURFACE_ID, C11_TAB_ID, C11_SOCKET_PATH. The spawn path may also pre-seed C11_AGENT_TYPE, C11_AGENT_MODEL, C11_AGENT_TASK.
Refs accept UUIDs, short refs, or indexes: workspace:1, pane:2, surface:3, tab:1.
Where new work goes: a new pane when the work wants its own spatial slot (a sub-agent, a log tail, a browser for validation); a new surface when a pane just wants another tab; a new workspace when the operator names a different project or mission. Default to one workspace per project unless the operator's setup says otherwise.
Boot fast, orient lazily
c11 stamps your launch identity itself: the sidebar chip (agent type from process detection, plus the pinned model) and a placeholder "Awaiting first task" title are set the moment you launch, with no action from you. There is nothing you must run just to be identified — don't spend the operator's time on a mechanical identity ritual.
You'll usually load this skill because a task arrived that touches the workspace (a split, a status report, a browser check). When that happens, orient in place and keep moving — at minimal effort, no per-command deliberation:
- Refine the placeholder into your real role:
c11 rename-tab --surface "$C11_SURFACE_ID" "<2–4 word role>". The sidebar is the operator's only view into a room of parallel agents, so a working agent must not sit under "Awaiting first task".
- Say why it's open right now:
c11 set-description --surface "$C11_SURFACE_ID" "<current context>".
- If your model chip is blank (an unpinned launch c11 couldn't label), set it:
c11 set-agent --surface "$C11_SURFACE_ID" --type "$C11_AGENT_TYPE" --model "$C11_AGENT_MODEL" — substitute your own known type/model if those vars are empty.
- Reach for
c11 tree / c11 identify --json only when you actually need layout or your refs (footgun below).
- Read a reference (map below) only for the capability you're using — not preemptively.
- Declare a stable mailbox address if peers will reach you:
c11 set-metadata --surface "$C11_SURFACE_ID" --key mailbox.address --value "<stable-handle>" --type string. Titles are mutable and renames silently re-partition the bus; a declared address survives them. (Depth → docs/c11-mailbox-guide.md.)
Launched with only a hydrate message and no task yet? An operator can configure a "load the skill" launch prompt, so your first turn may carry no real task. Don't invent a title — leave the placeholder, reply in one line that you're ready, and set your real title/description from the next real message, as your first action that turn.
Pass --surface explicitly on surface- or tab-scoped writes. Every surface exports $C11_SURFACE_ID (inherited by subprocesses), so --surface "$C11_SURFACE_ID" targets you correctly. As of C11-165 a surface-scoped write with a missing or empty ref no longer silently falls back to the operator-focused surface — it is rejected with a clear error (missing_ref / empty_ref), so an omitted or empty flag fails loudly instead of stomping a peer agent's tab. You must therefore still pass a valid ref: if $C11_SURFACE_ID reads empty, capture your refs once from c11 identify --json and pass the literal surface:<n> (robust on any build). Applies to every surface/tab write (set-metadata, set-agent, set-title, set-description, rename-tab, clear-metadata, trigger-flash) and to the tab-scoped sidebar writes (set-status, set-progress, log), which require --workspace/--tab (auto-supplied from $C11_WORKSPACE_ID inside a pane; a ref-less call from a bare shell or cron is now rejected rather than routed to the selected tab). Verify the first write with c11 get-titlebar-state --surface <surface> against the surface marked ◀ here in c11 tree --no-layout.
Title vs description, and lineage
- Title = what the surface is — generic, reusable. A filename for file-backed surfaces (
PHILOSOPHY.md); a role for terminals (Phase 2 agent, Log tail).
- Description = why it's open right now — one or two sentences of current context the operator can read without opening the surface.
- Refresh both when scope shifts (plan → impl, ticket → ticket, file → file) — at the pivot, not at session end.
- Lineage for downstream panes: chain parent → child with
:: in the title (Login Button :: MA Review :: Claude) and lead the description with a Lineage: breadcrumb. Sibling workers the operator drives directly are not downstream — use plain anchors (Feature Left, Lattice Manager), no chain. Before renaming, check c11 get-titlebar-state; if a chain exists, preserve the prefix and refine only the trailing segment.
What c11 can do — load the reference when you need it
| You want to… | Load |
|---|
split / create / resize panes & surfaces, tree, send, read-screen, targeting, --cwd | references/api.md |
| launch sub-agents, the tab-naming convention, layout patterns, write c11-aware prompts | references/orchestration.md |
| send/receive inter-agent messages (the mailbox) | docs/c11-mailbox-guide.md |
surface-manifest depth, sidebar reporting (set-status / set-progress / log), flash, precedence & sources | references/metadata.md |
tail the file-first events stream (c11 events tail), envelope schema, v1 taxonomy | references/events.md |
| workspace persistence, snapshots, the conversation store & resume | references/conversation.md |
| the Claude session-resume hook | references/claude-resume.md |
| drive the embedded browser (validate UI without leaving c11) | c11-browser skill |
| open markdown surfaces with live reload | c11-markdown skill |
A few cross-cutting rules worth knowing before you reach for those:
send / set-status / log take their text as a trailing positional, not --text. c11 send --surface <s> "npm test". Writing --text "…" types the literal string --text into the terminal.
send / send-key require explicit targeting. Pass --workspace and --surface together when the target isn't your own surface; --window alone is not enough. An empty or stale ref (--surface "", a dead surface:99) is an error, not a quiet fallback to whatever pane is focused.
- A multi-line
send arrives whole and becomes one turn, in a background workspace as reliably as in the focused one. Brief a sibling agent directly; you don't need to stage the text in a file and send a pointer.
- Socket/CLI commands never steal macOS focus, and telemetry commands run off-main — don't expect a
send to raise a window.
send reaches PTYs only. It cannot drive AppKit/SwiftUI controls (the text box, settings, sidebar, find overlay). For those, ask the operator or use accessibility automation.
Editing this skill
It installs as a one-time copy under ~/.claude/skills/c11/; the app does not track the repo source after install. After any source edit, run scripts/sync-installed-skills.sh c11 or the live copy agents load stays stale. This is the skill-editing equivalent of reload.sh after a code change.
Troubleshooting
If c11 on PATH isn't the active bundle's CLI, run c11 doctor (--json for machine-readable). It reports the bundled CLI path, how c11 resolves on PATH, and a status of ok | mismatch | missing | no_bundle.
Working Lattice tickets inside c11? Also load the lattice skill for the integration patterns.