reflectt-node uses a YAML config file to define your team's agents, their roles, and routing rules. This drives automatic task assignment, WIP limits, and review routing.
# Copy the example config
cp defaults/TEAM-ROLES.yaml ~/.reflectt/TEAM-ROLES.yaml
# Edit with your team's agents
nano ~/.reflectt/TEAM-ROLES.yamlreflectt-node hot-reloads the config — changes take effect within 5 seconds, no restart needed.
Set REFLECTT_HOME to change where reflectt-node looks for config files:
export REFLECTT_HOME=/data/reflectt # Docker, managed hosts, etc.
# Config loaded from: /data/reflectt/TEAM-ROLES.yamlDefault: ~/.reflectt
Checked in order (all under REFLECTT_HOME):
$REFLECTT_HOME/TEAM-ROLES.yaml$REFLECTT_HOME/TEAM-ROLES.ymldefaults/TEAM-ROLES.yaml(shipped with repo)- Built-in fallback (3 generic placeholder agents)
agents:
- name: alice
role: builder
description: Full-stack developer
affinityTags: [backend, api, frontend, typescript]
wipCap: 2
- name: bob
role: designer
description: UI/UX designer
affinityTags: [design, ui, css, a11y]
routingMode: opt-in # Only gets tasks matching alwaysRoute
alwaysRoute: [design, ui, ux, css, visual]
wipCap: 1
- name: charlie
role: ops
description: DevOps and infrastructure
affinityTags: [ci, deploy, docker, monitoring]
protectedDomains: [deploy, ci] # Only charlie handles these
wipCap: 3| Field | Required | Description |
|---|---|---|
name |
✅ | Agent name (matches OpenClaw agent or task assignee) |
role |
✅ | Role label (builder, designer, ops, etc.) |
description |
Human-readable description | |
aliases |
Other names this agent goes by (for task lookup) | |
affinityTags |
Keywords that boost assignment score | |
wipCap |
Max concurrent "doing" tasks (default: 1) | |
routingMode |
default or opt-in. Opt-in agents only get tasks matching alwaysRoute |
|
alwaysRoute |
Soft routing preference — keywords that favor this agent | |
neverRoute |
Keywords that exclude this agent from assignment | |
protectedDomains |
Hard routing — only this agent handles matching tasks | |
neverRouteUnlessLane |
Ignore neverRoute when task lane matches this value |
Agent is a candidate for any task. affinityTags boost their score. neverRoute excludes specific topics.
Agent is excluded from all tasks UNLESS the task matches an alwaysRoute keyword. Use for agents that should only handle their specialty (e.g., a designer who shouldn't get backend tasks).
- name: designer
routingMode: opt-in
alwaysRoute: [design, ui, ux, css, visual, brand]Hard enforcement: only this agent can be assigned tasks matching the keyword. Other agents are excluded from the candidate set.
- name: ops-lead
protectedDomains: [deploy, ci, release]curl http://127.0.0.1:4445/team/rolesReturns all agents with their current WIP count, where the config was loaded from, and whether any agent is over their WIP cap.
curl -X POST http://127.0.0.1:4445/tasks/suggest-assignee \
-H "Content-Type: application/json" \
-d '{"title": "Fix login API timeout"}'Returns scored candidates showing why each agent was or wasn't suggested.
reflectt-node watches ~/.reflectt/TEAM-ROLES.yaml for changes (polling every 5 seconds). Edit the file and the new config is live immediately — no restart needed.
- Start simple. Two agents with different
affinityTagsis enough to start. - Use
routingMode: opt-infor agents that should only handle specific work. - Set
wipCapto prevent overloading any single agent. - Test with
/tasks/suggest-assigneebefore committing to a config change. - Check
/team/rolesto verify your config loaded correctly.