designing-squads
Skill3 starsChanged 18 days agoMITView on GitHub
Designs a new local squad or single bot as a squad.yaml. Use when no shipped squad covers the user's need.
In this repository11 other files it gives its agents.
- AGENTS.mdAGENTS.md
- llms.txtllms.txt
- assigning-modelsSkill
- authoring-skillsSkill
- changing-botsSkill
- contributing-upstreamSkill
- finding-capabilitiesSkill
- hermes-platformSkill
- installing-squadsSkill
- managing-projectsSkill
- tracking-updatesSkill
The file
We split this skill into the rules it gives an agent
5 rules. About 0 are common, 0 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 21
Never ask which model providers exist: skills/assigning-models detects them.
- Very specific: line 23
Check shipped squads first (squads/*/squad.yaml).
- Very specific: line 41
Write local/squads/<key>/souls/<bot>.md per bot, the squad skills in local/squads/<key>/skills/ (skills/authoring-skills) and cron scripts …
- Very specific: line 67
All bots are visible. squadctl files the manager under the Desktop section Managers and the workers under the squad's section.
- Very specific: line 104
Use a separate chain stage only when QA needs its own card (a deployed preview, a different workspace).
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Designing squads
When to Use
- The user asks for a squad or a single bot no shipped squad covers.
- A new permission boundary, market or workflow appears that existing bots cannot serve.
Procedure
- Read
skills/hermes-platform/references/:profiles-and-distributions.md,toolsets.md,kanban.md,cron-and-gates.md,delegation.md. - Interview in batches of at most 5 questions: goal, what reaches the user,
what the user decides, what is irreversible, which external APIs are called.
Never ask which model providers exist:
skills/assigning-modelsdetects them. - Check shipped squads first (
squads/*/squad.yaml). If one fits, install it (skills/installing-squads) and adapt it with an overlay (skills/changing-bots). - Pick the key: one short lowercase English word not used under
squads/orlocal/squads/. - Decide the bots and the board with Rules and Topology below. A single bot
is a squad whose only bot is the manager
<key>. - Lane per bot: a key of
scripts/data/model-roles.yaml->lanes. A bot that verifies truthfulness or judges quality takes the reasoning lane, never the cheap one, and so do its delegated children (delegation: {lane: ...}): a cheap model passes claims it cannot check. - Write
local/squads/<key>/squad.yamlagainstsquads/_schema/squad.schema.json:schema: 2,key,name,version,hermes_requires,board(only when Topology says so),section,manager,bots,chains. - Chains are stage lists (
stage,assignee, optionalskill,when,lane). A cron job hasscheduleandscript; addagent(lane,skill,reasoning) only when the script is a wake gate. - Write
local/squads/<key>/souls/<bot>.mdper bot, the squad skills inlocal/squads/<key>/skills/(skills/authoring-skills) and cron scripts inlocal/squads/<key>/scripts/. Capabilities from catalogs:skills/finding-capabilities. - Validate:
scripts/hpy squadctl.py plan <key> --json, thenscripts/hpy skill_lint.py local/squads/<key>. Install withskills/installing-squads.
Rules
squadctl and skill_lint.py enforce what they can check (toolsets, schema, skill shape); the rest is yours.
- A bot exists only for a permission boundary, independent judgment, a different reasoning effort, or context size. Everything else is a skill, subagent or script.
- One manager per squad: profile name
<key>,role: manager, title<Name> manager. It is the only bot the user talks to and the one that adds Projects. - Workers:
<key>-<role>,role: worker. Every bot gets the Hermes base toolsets (references/toolsets.mdin hermes-platform -> Squad usage);toolsets:adds,withhold:removes a base toolset from a worker only for a permission boundary. Never take tools from a manager. Memory is on by default (squadctl adds thememorytoolset); the SOUL has one line on what it stores: job pitfalls and fixes, never secrets.memory: falseonly for a bot that must keep nothing between cards. - Skills a bot writes with
skill_managearelearned:squadctl planlists them per bot andapplynever removes them. - All bots are visible. squadctl files the manager under the Desktop section
Managersand the workers under the squad'ssection. - At most 5 required bots; another bot sets
optional: trueand installs only withsquadctl apply <key> --with <name>. - Credentials: env names in
passthrough(never values), only on the bot that calls that API, never on a bot withweborbrowser. - An account a bot must not combine with browsing (mail, a personal feed)
gets its own worker bot.
withholdstrips a toolset from a worker only, and squadctl keepsclarify,vision,browserandcronjobon every manager, so moving the account up to the manager does not isolate it. - A bot with the
browsertoolset setsshared_browser: true(squadctl requires the toolset); no bot browses on a copy of the owner's profile. Give it no connector and no credentials yourself. The service already makes the Google mail, files and account hosts unresolvable; awebsite_blocklistonly catches URLs written literally in a call. The owner signs in once per site (scripts/hpy shared_browser.py login <url>); bots never take turns on a browser: each run gets its own tab. - CLIs a bot drives:
requires.apps.squadctl doctorreports each one installed and logged in (gh auth login,cf auth login,wrangler login, once, by the user) and never prints a probe's output. - Squad skills ship in
local/squads/<key>/skills/and need no quote; hub skills and community plugins followskills/finding-capabilitiessteps 3-5.
Topology
delegate_tasksubagents are ephemeral: the caller's model unlessdelegation.modelpins one, no board, no own credentials, gone when the turn ends.- Kanban workers are persistent profiles: own model, toolsets and credentials, asynchronous, each on a board.
- Single bot with only
delegate_taskwork: noboard; Projects only. - Single bot with async, long, cron or human-in-the-loop work, or per-card
models: its own
board(it files cards to itself). - Manager + workers: one
boardper squad; one Project per repo or folder (skills/managing-projects). - QA lane: the implementer ends with
kanban_request_review(reviewer=<key>-qa)on its own card; the reviewer approves withkanban_completeor returns it withkanban_request_changes. Use a separate chain stage only when QA needs its own card (a deployed preview, a different workspace). The reviewer keepsbundled:sdlc-review(the dispatcher force-loads it on review cards). Dispatcher keys:hermes-platform/references/kanban.md-> Dispatcher config. - Open-ended cards (no fixed end state):
goal_modewithgoal_max_turns; the goal judge gateskanban_completeandkanban_request_review.
Pitfalls
- A profile per specialist when only the model differs: use a per-card model override.
- A cron job that touches a resource the whole machine shares (the one browser,
a service, a log): give its script a lock and a
did it runstamp in the shared state dir, and make the losing fire exit 0 with a skip line. Managers firing at the same minute otherwise multiply the work and log errors the watcher escalates to the user. - A chain stage that acts without the user: irreversible steps (apply, send, publish, deploy) wait for the user's explicit OK, per action or once as a recorded standing consent with caps that a script enforces.
- A topology or key offered from memory (which toolset a bot can give up,
which config key takes a list): read
scripts/squadctl.pyconstants,squads/_schema/squad.schema.jsonorreferences/toolsets.mdfirst. A rule the user accepts and the script then refuses costs a whole design round. - Publishing a shipped squad's contract change (bots, skills, cron, chains)
without a
distribution.yamlbump and a CHANGELOG entry: the release gate fails. Before any publish a reviewer who did not write the change (another model or QA run) reads the result, and the user sees the status first. - Writing the squad under
squads/: that tree is distribution-owned. Local squads live inlocal/squads/<key>/; publishing one isskills/contributing-upstream.
Verification
scripts/hpy squadctl.py plan <key> --jsonexits 0 and its notes name every lane without a model.scripts/hpy skill_lint.py local/squads/<key>exits 0.- Each bot has one sentence saying why it is a separate profile.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

