A named collection of agents that share a team_id and can address each
other via the inter-agent tools.
Teams can be hydrated from a directory on disk (static) or constructed
in-memory by an orchestrator using spawn_agent (dynamic). Both paths
produce the same struct.
Directory layout
.planck/teams/
elixir-dev-workflow/
TEAM.json # required — member list and metadata
members/
orchestrator.md # system prompt for the orchestrator
planner.md
builder.mdEach member's system prompt lives in members/<name>.md by convention, where
<name> is the member's name (which defaults to type when not set).
TEAM.json format
{
"name": "elixir-dev-workflow",
"description": "Plan, build, and test Elixir changes.",
"members": [
{
"type": "orchestrator",
"provider": "anthropic",
"model_id": "claude-sonnet-4-6",
"system_prompt": "members/orchestrator.md"
},
{
"type": "builder",
"provider": "anthropic",
"model_id": "claude-sonnet-4-6",
"system_prompt": "members/builder.md",
"tools": ["read", "write", "edit", "bash"],
"skills": ["refactor"]
}
]
}Member entries follow the schema documented on Planck.Agent.AgentSpec.
Exactly one member must have "type": "orchestrator"; the rest are workers.
All system_prompt file paths are resolved relative to the team directory.
Tools and skills are global (loaded by planck_headless from
~/.planck/tools and ~/.planck/skills). Each member declares which of
them it should see via the "tools" and "skills" arrays; names are
resolved against the global pool at agent-start time.
Summary
Functions
Build a dynamic team from a single orchestrator spec.
Load a team from a directory containing a TEAM.json file.
Types
@type t() :: %Planck.Agent.Team{ alias: String.t() | nil, description: String.t() | nil, dir: Path.t() | nil, id: String.t() | nil, members: [Planck.Agent.AgentSpec.t()], name: String.t() | nil, source: :filesystem | :dynamic }
A team definition.
:id— team_id generated at materialization;nilbeforestart_session.:alias— folder name for static teams;nilfor dynamic teams.:source—:filesystemor:dynamic.:name— informational label from TEAM.json.:description— one-line purpose shown in team listings.:dir— absolute path to the team directory,nilfor dynamic teams.:members— agent specs; exactly one hastype: "orchestrator".
Functions
@spec dynamic(Planck.Agent.AgentSpec.t()) :: t()
Build a dynamic team from a single orchestrator spec.
Dynamic teams have no filesystem footprint. Workers may be added later via
the orchestrator's spawn_agent tool. Used both when start_session/1
runs with no template: (team of one) and when the orchestrator grows
the team at runtime.
Load a team from a directory containing a TEAM.json file.
Resolves member system_prompt paths relative to the team directory.
Returns {:ok, team} or {:error, reason}.