skills/creating-orchestration-packs/SKILL.md
Creates agent orchestration packs: cooperating `.agent.md` files with an orchestrator, subagents, matched handoffs, minimal tool grants, and a shared handoff packet contract. Use when one agent role is too broad for a job, when a workflow needs explore, plan, implement, review, and verify as separate roles, or when a pack fails the orchestration lint because a handoff target does not resolve.
npx skillsauth add jaktestowac/awesome-copilot-for-testers creating-orchestration-packsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill when a job is too big for one custom agent and splitting it into cooperating roles would produce better work rather than just more files.
A pack is a folder of .agent.md files plus a README, living under agent-orchestration/. One agent orchestrates and delegates; the rest do the work and return a structured handoff packet. The orchestrator synthesizes.
The value comes from the same place it comes from in human teams: an agent with a narrow scope and a clear output contract does better work than one asked to do everything. The cost is coordination, and a pack that costs more coordination than it saves is worse than a single good agent.
npm run lint because a handoff target does not resolvehandoffs[].agent and agents[] entries must exactly match a name: in the same pack. CI enforces this.A pack is justified when at least two of these hold:
When only one holds, write a single custom agent instead and hand off to creating-custom-agents. A three-agent pack for a two-step job is coordination overhead with no return.
Split by what the role needs and what it produces, not by topic.
The pattern that works, from the packs already in this repository:
| Role | Scope | Tools |
| --- | --- | --- |
| Orchestrator | Delegates, synthesizes, never implements | read, agent, search, edit |
| Explorer | Gathers facts, returns findings, writes no product code | read, search, web, edit |
| Planner | Turns findings into a prioritized plan | read, search, edit |
| Implementer | Writes and runs code within the plan | vscode, execute, read, edit, search |
| Reviewer | Judges the output, did not write it | read, search, edit |
| Runner and verifier | Executes, diagnoses, reports status | vscode, execute, read, edit, search |
Two rules that decide the cut:
executeUse the canonical grouped vocabulary: 'vscode', 'execute', 'read', 'edit', 'search', 'web', 'agent', 'todo', plus 'playwright/*' for Playwright MCP.
The lint applies heuristic checks and warns when:
'execute''edit'Note that 'edit' is needed by nearly every agent in practice, because agents write their handoff artifacts to disk. An explorer that returns a summary file needs 'edit' even though it writes no product code.
Only the orchestrator gets 'agent'. A subagent that can spawn subagents produces a tree nobody can follow.
Declare a Playwright MCP dependency in the README. An agent with 'playwright/*' and no configured MCP server fails in a way that looks like a pack defect.
The orchestrator declares both lists:
agents:
- OpenAPI Explorer
- Test Planner
handoffs:
- label: Explore OpenAPI
agent: OpenAPI Explorer
prompt: Analyze the OpenAPI spec and return a Handoff Packet.
send: false
The rule CI enforces, in scripts/lint-orchestration.js: every handoffs[].agent and every agents[] entry must exactly match a name: declared by an agent in the same pack. Exact match, including spaces, capitalization, and punctuation. FE Explorer (Playwright MCP) and FE Explorer are different agents, and the second one does not exist.
Subagents declare agents: [] and user-invocable: false. Only the orchestrator is entered directly.
Every subagent returns the same shape. Without this, the orchestrator is synthesizing across incompatible outputs and its summary becomes guesswork.
The house contract is the Handoff Packet:
Gaps is the one that carries weight. Without it, a subagent that could not determine something produces a confident summary and the orchestrator propagates the confidence.
Artifacts go to .ai-outputs/, per the repository convention.
Every pack needs one, with frontmatter carrying a description for the README generator. It contains:
*.agent.md files into the user prompts directory or .github/agents/npm run lint # frontmatter, orchestration, plugin sync
npm run generate # regenerate the README tables
npm run check # verify the README is in sync
Then run the pack against a real task. The failures that only appear in a live run:
Gaps section is always empty, which means the agents are not using itUse ./resources/orchestration-quality-checklist.md before shipping.
.ai-outputs/./resources/orchestration-pack.template.md - a complete minimal pack: orchestrator plus two subagents plus README, ready to copy./resources/handoff-packet.md - the output contract, section by section, with a worked example and the common ways it degrades./resources/orchestration-quality-checklist.md - pre-ship checks covering naming, tools, handoffs, contract, and the live-run failurescreating-custom-agents - when one agent is the right answer, or for writing each agent file in the packcreating-skills - when the expertise belongs in a skill the agents reference rather than in an agent bodycreating-prompts - when the entry point should be a prompt that routes to the orchestratorcreating-plugins - when the pack should ship as an installable plugincreating-instructions - for conventions that should apply to every agent rather than oneThis skill is complete when:
'agent'handoffs[].agent and agents[] entry exactly matches a name: in the same pack'execute'Gaps section.ai-outputs/npm run lint, npm run generate, and npm run check passtesting
Tests the customization assets themselves - skills, prompts, custom agents, instructions - the way a product is tested: activation cases that check an asset fires when it should and stays quiet when it should not, output-contract cases, safety cases, collision cases between assets competing for the same trigger, a weighted rubric scored blind, and a baseline-versus-candidate gate before an edit ships. Use when a skill is edited and nobody knows whether behaviour changed, when two skills fight over the same request, when a description is being tuned for discoverability, when a collection has grown past manual spot-checking, or when the request mentions skill evals, prompt regression, or "does this skill actually work".
development
Shapes QA output for the person who has to act on it: result and blocker in the first two lines, one decision per report, findings ordered by what they cost, the long artifact in a file and the decisions in the message, and magnitude stated in units the reader can count. Use when a report is accurate but nobody acts on it, when a finding set is too long to read under time pressure, when the same findings must be retold for a developer, a release manager, and an on-call engineer, or when the request mentions "too long", "make this readable", "just tell me what to do", "so what", or "summarize this for stakeholders". Pairs with unslop-answers, which makes the same report honest.
testing
Verifies that the lines and branches a change actually touched are executed by tests, using LCOV or Cobertura diff coverage instead of whole-repo percentages, and escalates uncovered high-risk changes into a blocking finding. Use when a pull request needs a coverage gate that unrelated tests cannot satisfy, when total coverage looks healthy but the diff is untested, when wiring diff coverage into CI, or when someone claims a change is covered because the suite is green.
development
Cuts AI tells from test code: tests that pass without proving anything, tautological assertions, mock-only tests, hardcoded waits, coverage theater, vague names, swallowed errors, retries used as fixes. Use whenever test code is written, changed, or reviewed, including tests produced as a side effect of a feature task, and when the request mentions "review these tests", "are these tests any good", "this test always passes", "this suite is flaky", or "clean up these tests". Must always apply to test code.