team.yaml (Legacy)
File location: ~/.disclaw-team/team.yaml
Two modes:
- Legacy format — Hand-authored single file that contains all config (bots, roles, Discord, protocol)
- Derived format — Auto-generated from
bots.yaml+assignment.yamlbefore eachstart
If you’re using the new format (bots.yaml + assignment.yaml), you don’t need to edit team.yaml directly. It’s regenerated automatically.
Minimal valid legacy example:
version: 1name: My Teamdiscord: guild_id: "123456789012345678" channels: general: "987654321098765432"
bots: bot-1: name: Orchestrator token_env: BOT_1_TOKEN role: orchestrator dm_policy: allowlist channels: - "987654321098765432"Field reference (legacy format):
| Field | Type | Required | Description |
|---|---|---|---|
version | number | No | Config version (currently 1) |
name | string | No | Team display name |
discord.guild_id | string | Yes | Discord server ID |
discord.channels.general | string | Yes | General channel ID |
defaults.workspace | string | No | Working directory for bots |
defaults.model | string | No | Default model: opus, sonnet, haiku |
bots | object | Yes | Bot definitions (key = bot-id) |
bots.<id>.name | string | Yes | Bot display name |
bots.<id>.token_env | string | Yes | Environment variable name for Discord token |
bots.<id>.role | string | Yes | Role type or role-id |
bots.<id>.dm_policy | string | No | allowlist or pairing (see gotcha below) |
bots.<id>.channels | array | No | Channel IDs this bot listens to |
humans | object | No | Human team members (key = slug) |
humans.<id>.name | string | Yes | Human display name |
humans.<id>.discord_id | string | Yes | Human Discord user ID |
humans.<id>.role | string | No | Human role (default: owner) |
protocol.communication.* | object | No | Communication rules (see Protocol) |
protocol.validation.* | object | No | Validation chain rules |
protocol.escalation.* | object | No | Human approval rules |
Related: bots.yaml, assignment.yaml, CLI: switch