Claude Code is turning into a team of specialists: when agent skills speed delivery and when they add chaos
I’m Denis Shokhirev, an Agentic AI Systems Architect based in Freiburg im Breisgau, Germany, and at DennisCraft AI Studio I ship production AI systems for DACH B2B clients on Claude, Supabase, n8n, Doppler, and self-hosted Postgres. The painful moment is not when Claude Code writes a bad function; it’s when 4 “specialist” agents all touch the same change, each leaves a reasonable-looking diff, and nobody can explain who actually owns the final behavior.
That is the real question behind agent skills in Claude Code. A specialist for SQL, another for tests, another for security, another for refactoring sounds efficient. Sometimes it is. But in production, speed comes from constrained execution, explicit ownership, and narrow interfaces. Without that, agent skills do not create a team. They create layered ambiguity.
Where agent skills actually help
I see real value in skills in 3 specific cases.
1. The task is narrow and repeatable
Skills work well when the input and output are predictable: write a migration, add test fixtures, scan for secrets, normalize error handling, update a typed API client. In those cases, a skill behaves more like a bounded operator than a freeform collaborator.
2. The split is based on risk, not on org chart roles
A lot of teams model agent skills after people: backend engineer, security engineer, architect, reviewer. That usually maps poorly to code generation. A better split is by permission and failure mode: may read only, may patch app code, may modify schema files, may propose but not apply, may run scanners but not install dependencies.
3. The skill is downstream from verification, not a replacement for it
OWASP Top 10 2021 still lists broken access control as the most common class of web application risk (OWASP, 2021). That matters here because many teams quietly expect a “security skill” to notice risky patterns on its own. That is the wrong dependency. In production, the model should be inside the control system, not acting as the control system.
Where skills start adding chaos
I keep seeing the same 4 failure modes across agent-enabled delivery workflows.
Too much inherited context
When every skill sees the full repo history, long discussion threads, and previous patches, it stops acting like a specialist and starts improvising. The output may look smart, but the reasoning trail gets harder to audit.
Multiple skills can modify the same layer
If your SQL can be changed by a feature skill, a database skill, and a bugfix skill, you have already created a conflict domain. The problem is not whether they are individually good. The problem is overlapping authority.
No artifact-level contract
Good skills emit a patch, a report, a migration file, or a test file. Bad skills emit guidance. Guidance sounds helpful, but the next agent interprets it differently, and now your pipeline depends on ambiguous prose instead of verifiable artifacts.
Orchestration is weaker than the model
The Anthropic SDK is useful because it gives you control over messages, tools, and execution order. The practical bottleneck is rarely “the model was not specialized enough.” It is usually that the pipeline has no enforced completion criteria, no restricted write scope, and no stable handoff rules.
A production pattern that holds up
The pattern I trust is simpler than most multi-agent demos. One primary agent owns task completion. Skills are invoked as bounded stages, not as independent coworkers. Every code-producing stage is followed by external checks.
| Stage | Purpose | Not allowed | Output |
|---|---|---|---|
| Plan | Break work into steps | Edit files | Short task plan |
| Implement | Patch a limited file set | Edit DB schema without approval | Diff |
| Verify | Run tests and scanners | Rewrite business logic | Report |
| Secure | Check for risky patterns and secrets | Add dependencies | Findings |
This is where boring tooling beats agent theater. Semgrep, Bandit, and Gitleaks give you deterministic pressure against common mistakes.
#!/usr/bin/env bash
set -euo pipefail
python -m pytest -q
semgrep --config auto .
bandit -r app -q
gitleaks detect --no-banner --source .
if git diff --name-only | grep -E 'schema|migration'; then
echo "Database-related change detected"
fi
echo "Verification finished"For reference, Semgrep and Gitleaks are widely used open tools for static pattern checks and secret detection, and Bandit remains a practical baseline for Python security linting. None of them is enough alone. Together they are much more useful than asking another agent to “double-check everything.”
What actually creates speed
On real client work, speed does not come from agent autonomy. It comes from lowering the cost of repeated change. Claude Code is very good at propagating a consistent update across 10 files, adding the same audit fields to multiple models, bringing DB access code into a single pattern, or preparing regression tests around an already-decided implementation.
It is much worse when the task is still architecturally open. If the agent has to decide schema shape, authorization boundaries, external API failure handling, and retry logic all at once, a “team of specialists” often writes too early. The output expands, but certainty does not.
This aligns with another useful external reference: the OpenAI Cookbook consistently frames tool use around explicit control loops, validation, and bounded execution rather than vague autonomy (OpenAI Cookbook). Different vendor, same operational lesson.
Questions to ask before adding another skill
Before I add a new skill, I ask 5 blunt questions.
- What single measurable output does this skill produce?
- Which files or resources may it modify?
- What happens if it fails silently?
- Could this be handled by static analysis or a template instead?
- Who owns the final decision: the skill or the primary agent?
If those answers are vague, the skill is not ready. Most teams do not need more agent specialization. They need fewer permissions and clearer stage boundaries.
from pathlib import Path
import subprocess
ALLOWED_PATHS = {"app/", "tests/"}
def changed_files():
out = subprocess.check_output(
["git", "diff", "--name-only", "HEAD~1"]
).decode().splitlines()
return out
for file_path in changed_files():
if not any(file_path.startswith(p) for p in ALLOWED_PATHS):
raise SystemExit(f"blocked change: {file_path}")
print("change scope accepted")That small gate has prevented more damage in my workflows than adding one more reviewer agent ever did.
FAQ
Should every team create a dedicated security skill?
No. Create one only if it emits findings against a fixed scope and sits alongside external scanners. It should assist review, not replace it.
Are skills worth it for a small engineering team?
Only if your process is already repeatable. If your delivery workflow is unstable, skills will amplify inconsistency faster.
Can a skill be allowed to edit migrations?
Yes, but only as a separate stage with visible diff review. Database changes should never be hidden inside a generic feature-writing step.
How do I know skills are hurting more than helping?
Watch for repeated edits on the same files, growing diffs with weak reasoning, and cases where nobody can explain why a final implementation exists in its current form. That usually means ownership collapsed.
What matters more in production: model quality or orchestration?
Orchestration. A stronger model inside a weak control loop just makes expensive mistakes faster.
Which stage in your LLM delivery pipeline creates the most trouble in production right now: planning, handoff between specialized agents, or post-merge verification when nobody owns the final diff? I’d genuinely like to know.
I run a free 30-min stack audit for DACH founders building AI in regulated markets. DM me on LinkedIn or write to @ger_dennis_ai.