Building a Complete AI Engineering Team with DSH Agent Presets
Build a multi-agent AI engineering workflow with DSH agent presets.
Software engineering is increasingly moving toward AI-assisted development, but there is a difference between having an AI that can write code and having an AI engineering team.
A good engineering workflow is not just:
"Build this feature."
It is also:
- Is the architecture sound?
- Is the API well designed?
- Is the database efficient?
- Is the code maintainable?
- Is the project secure?
- Is it performant?
- Are failures handled correctly?
- Is it observable?
- Is it properly tested?
- Can it be deployed reproducibly?
- Can it be released safely?
That is the idea behind my new collection of DSH Agent Presets: a set of specialized engineering agents that can be used independently, or as a complete engineering workflow.
One AI agent is useful. A team of specialized agents is better.
The collection is built around a simple principle:
Each agent should have a clearly defined engineering responsibility.
Instead of creating one enormous prompt containing every possible software engineering rule, each preset specializes in a particular discipline.
The result is a collection of agents such as:
Project Architect & Generator
Architecture Engineer
Backend Engineer
Frontend Engineer
API Engineer
Database Engineer
Code Review Engineer
Refactoring Engineer
Testing Engineer
Security Engineer
Performance Engineer
Reliability Engineer
Observability Engineer
Dependency Engineer
DevOps Engineer
Migration Engineer
Documentation Engineer
Release EngineerEach one can be used independently depending on the task.
Project Architect & Generator
The central preset of the collection is the Project Architect & Generator.
It started as a simple fullstack project generator, but quickly became clear that "fullstack" was too restrictive.
A real project can contain:
0..N frontends
0..N backends
0..N shared packages
0..N generated clientsSo instead of assuming:
frontend + backendthe agent builds a project manifest and a component graph.
For example:
Project
│
├── apps/
│ ├── web/
│ └── admin/
│
├── services/
│ ├── api/
│ └── auth/
│
└── packages/
└── contracts/The topology is then used to derive the rest of the repository.
This is important because Docker, CI/CD and the Makefile should not be copied blindly from a template.
They depend on the actual project structure.
For example:
2 frontends
+
2 backends
↓
4 application build targets
4 container definitions
appropriate CI jobs
appropriate test jobs
appropriate documentationrather than generating infrastructure for applications that don't exist.
Python and TypeScript backends
The generator supports both Python and Node.js/TypeScript backends.
For Node.js/TypeScript services, the convention is:
services/
├── api/
├── auth/
└── worker/while frontend applications can live under:
apps/
├── web/
└── admin/The project generator also treats full type safety as an architectural requirement.
For Python, that means strict static typing and typed boundaries.
For TypeScript, that means strict compiler settings and avoiding any as an escape hatch.
The same principle applies across API contracts, configuration, external data, generated clients and shared packages.
Architecture Engineer
The Architecture Engineer is designed to answer a different question:
"Is this system structured correctly?"
It analyzes:
- module boundaries;
- service boundaries;
- dependency direction;
- coupling;
- cohesion;
- data ownership;
- API boundaries;
- shared packages;
- infrastructure boundaries;
- circular dependencies;
- technical debt;
- scalability constraints.
It can also work before implementation.
For example:
We need two APIs,
three frontends,
a shared authentication service
and several external integrations.The agent can turn that requirement into an architectural model before implementation begins.
The objective isn't to introduce architecture for architecture's sake.
The rule is simple:
Prefer explicit, understandable boundaries over unnecessary abstractions.
Backend Engineer
The Backend Engineer focuses on backend implementation and architecture.
For Python projects, it is particularly suited to stacks such as:
Python
FastAPI
Pydantic
uv
Ruff
mypy
pytestIt focuses on:
- API design;
- configuration;
- dependency boundaries;
- domain logic;
- async I/O;
- persistence;
- external integrations;
- background work;
- error handling;
- observability;
- typing;
- testing.
A key principle is avoiding unnecessary layers.
A project shouldn't automatically receive:
repository
service
manager
factory
provider
adapterjust because those patterns exist.
The architecture should follow the actual domain.
Frontend Engineer
The Frontend Engineer specializes in modern React/Next.js applications.
It focuses on:
- Next.js architecture;
- server/client boundaries;
- React composition;
- state ownership;
- hooks;
- data fetching;
- caching;
- forms;
- validation;
- accessibility;
- loading and error states;
- API clients;
- frontend testing.
It also pays attention to the boundary between browser code and server-side code.
The goal is not to turn every component into a generic abstraction.
The goal is to keep the frontend understandable as it grows.
API Engineer
APIs are contracts, not just HTTP endpoints.
The API Engineer focuses on:
- resource modeling;
- HTTP semantics;
- validation;
- error schemas;
- pagination;
- filtering;
- idempotency;
- authentication;
- authorization;
- versioning;
- backwards compatibility;
- WebSockets;
- OpenAPI;
- generated clients.
One important principle is that generated API clients should have a clear source of truth.
For example:
Backend
│
▼
OpenAPI
│
▼
Generated TypeScript client
│
├── Web
└── AdminThe generated client is not manually edited.
Database Engineer
The Database Engineer focuses on the part of applications that often becomes a bottleneck or reliability problem as systems grow.
It analyzes:
- schema design;
- constraints;
- indexes;
- query plans;
- N+1 queries;
- joins;
- pagination;
- transactions;
- locks;
- connection pools;
- migrations;
- data integrity;
- caching.
A particularly important rule is:
Don't add an index simply because a column is frequently queried.
The agent should look at the actual workload and query plan when possible.
Code Review Engineer
The Code Review Engineer is designed for pull requests, diffs and changes.
It focuses on:
- correctness;
- regressions;
- edge cases;
- error handling;
- backwards compatibility;
- maintainability;
- repository conventions;
- missing tests.
It deliberately avoids turning code review into a style contest.
A review should identify a real engineering problem, not simply:
"I would personally write this differently."
Findings should contain concrete locations, evidence and remediation.
Refactoring Engineer
Refactoring deserves its own specialist because refactoring and feature development are different activities.
The Refactoring Engineer follows:
Existing behavior
↓
Characterization tests
↓
Small structural change
↓
Tests
↓
Next changeIts job is to improve:
- coupling;
- duplication;
- complexity;
- responsibilities;
- dead code;
- boundaries.
without silently changing application behavior.
It also avoids mixing unrelated feature development into refactoring work.
Testing Engineer
The Testing Engineer focuses on an important question:
What actually needs to be tested?
Rather than blindly pursuing 100% coverage, it identifies:
Business logic
Critical paths
Failure modes
Security boundaries
API contracts
Integration points
Regression risksIt can work across:
- unit tests;
- integration tests;
- API tests;
- contract tests;
- E2E tests;
- security regression tests;
- performance regression tests.
The principle is:
Coverage is a measurement, not the objective.
The objective is confidence in important behavior.
Security Engineer
The Security Engineer is dedicated to security auditing and hardening.
It covers:
Authentication
Authorization
IDOR / BOLA
Input validation
Injection
SSRF
XSS
CSRF
CORS
Secrets
Docker
CI/CD
Dependencies
Supply chain
LoggingIt can operate in several modes:
audit
review
threat-model
harden
pentestAn audit starts by understanding the architecture and trust boundaries rather than blindly running a checklist.
For example:
Internet
│
▼
Reverse Proxy
│
├── Frontend
│
└── API
│
├── Database
├── Redis
└── External APIsFrom there, the agent can reason about actual attack surfaces.
Security findings also distinguish:
severity
exploitability
confidencerather than collapsing everything into a single arbitrary score.
And secrets discovered during an audit are always treated as sensitive data and redacted.
Performance Engineer
The Performance Engineer follows one particularly important rule:
Measure first. Optimize second.
Its workflow is:
Discover
↓
Define workload
↓
Baseline
↓
Profile
↓
Identify bottleneck
↓
Optimize
↓
Benchmark
↓
Regression testIt covers:
- latency;
- throughput;
- CPU;
- memory;
- I/O;
- databases;
- async behavior;
- concurrency;
- algorithms;
- frontend rendering;
- bundle size;
- startup time;
- Docker;
- infrastructure.
Instead of saying:
"This code could be faster."
the agent should ideally be able to explain:
Baseline:
p95 = 420 ms
Dominant cost:
database query
Change:
add appropriate index and eliminate N+1 access
Result:
p95 = 190 msThe workload and measurement methodology matter just as much as the number.
Reliability Engineer
Performance isn't reliability.
A system can be extremely fast and still fail badly when a dependency becomes unavailable.
The Reliability Engineer focuses on:
timeouts
retries
backoff
jitter
idempotency
circuit breakers
partial failures
graceful degradation
startup/shutdown
health checks
queue failures
race conditions
concurrency limitsFor example:
What happens if PostgreSQL becomes unavailable for 30 seconds?
Or:
What happens if an external API takes 20 seconds to respond?
These are reliability questions rather than performance questions.
One important invariant:
Never add retries to a non-idempotent operation without an explicit idempotency strategy.
Observability Engineer
The Observability Engineer deals with what happens after the application is deployed.
It focuses on:
- structured logging;
- metrics;
- traces;
- request IDs;
- correlation;
- health checks;
- readiness;
- latency/error/saturation metrics;
- dashboards;
- alerts;
- sampling;
- cardinality.
It also treats logging as a security boundary.
Credentials, cookies, authorization headers, tokens and private keys should never accidentally appear in logs.
The goal isn't simply:
"Add more logs."
It is:
Make important system behavior measurable and diagnosable.
Dependency Engineer
Modern applications are built on thousands of direct and transitive dependencies.
The Dependency Engineer handles:
- dependency discovery;
- upgrades;
- lockfiles;
- transitive dependencies;
- compatibility;
- deprecated packages;
- package-manager configuration;
- reproducibility;
- supply-chain risks.
It also avoids the classic:
dependency problem
↓
delete lockfile
↓
run install
↓
hopeInstead, dependency changes are treated as controlled engineering changes.
DevOps Engineer
The DevOps Engineer focuses on the path from source code to deployable software.
It handles:
Docker
Compose
CI/CD
builds
artifacts
releases
environments
secrets
health checks
multi-architecture images
rollbackAn important principle is that local development and CI should use the same authoritative commands whenever practical.
If:
make testis the canonical local test command, CI shouldn't quietly implement a completely different test process.
Migration Engineer
Migrations are one of the easiest places to accidentally create large amounts of technical debt.
The Migration Engineer handles migrations between:
- framework versions;
- runtimes;
- dependencies;
- architectures;
- infrastructure;
- project structures.
Its workflow is incremental:
Current state
↓
Compatibility analysis
↓
Target state
↓
Incremental migration
↓
Validation
↓
Next stepIt separates mechanical migration work from behavioral changes wherever possible.
Documentation Engineer
Documentation should describe the software that actually exists.
The Documentation Engineer therefore inspects:
- source code;
- configuration;
- scripts;
- CI;
- Docker;
- APIs;
- deployment.
before writing documentation.
It can maintain:
README.md
ARCHITECTURE.md
DOCUMENTATION.md
CONTRIBUTING.md
SECURITY.md
AGENTS.mdThe important rule is:
Never document planned behavior as implemented behavior.
Release Engineer
Finally, the Release Engineer handles the last step:
version
↓
changelog
↓
build
↓
artifacts
↓
container images
↓
validation
↓
releaseIt focuses on:
- versioning;
- changelogs;
- release notes;
- artifacts;
- container tags;
- provenance;
- CI release jobs;
- migrations;
- smoke tests;
- rollback.
The objective is reproducible and traceable releases rather than a collection of manual commands.
The interesting part: they form an engineering system
The presets aren't intended to be just a random collection of prompts.
They can form a larger engineering workflow:
Project Architect
│
▼
Architecture
│
┌─────────────┴─────────────┐
▼ ▼
Backend Frontend
│ │
└─────────────┬─────────────┘
▼
API
│
▼
Database
│
▼
Tests
│
┌─────────────┼─────────────┐
▼ ▼ ▼
Security Performance Reliability
│ │ │
└─────────────┼─────────────┘
▼
Observability
│
▼
DevOps
│
▼
ReleaseAnd the Code Review, Dependency, Refactoring, Migration and Documentation agents can be used throughout the lifecycle.
The presets are deliberately independent
One of the design decisions I made was not to turn everything into one gigantic agent.
You might only need:
Security Engineerfor an existing project.
Or:
Performance Engineerfor a specific performance investigation.
Or:
Database Engineerfor a migration.
You don't need to involve the entire engineering suite.
At the same time, the Project Architect & Generator can serve as the starting point for a new project.
A different way to use AI for software engineering
The larger idea behind these presets is that AI-assisted development doesn't have to mean:
Human
↓
"Write code"
↓
AIIt can look more like:
Human requirements
↓
Architecture
↓
Implementation
↓
Testing
↓
Security
↓
Performance
↓
Reliability
↓
Observability
↓
Deployment
↓
Releasewith specialized AI agents responsible for different engineering concerns.
The goal isn't to replace engineering judgment.
It's to give the developer a collection of specialized tools that can apply consistent engineering practices repeatedly.
What's next?
The most interesting next step is orchestration.
Instead of manually switching between:
Architecture Engineer
Security Engineer
Performance Engineer
Testing Engineer
...a future DSH Engineering Orchestrator could coordinate a complete project lifecycle:
Requirement
│
▼
Project Architect
│
▼
Implementation
│
┌──────────┴──────────┐
▼ ▼
Code Review Testing
│ │
└──────────┬──────────┘
▼
┌──────────┼──────────┐
▼ ▼ ▼
Security Performance Reliability
│ │ │
└──────────┼──────────┘
▼
Observability
│
▼
DevOps
│
▼
ReleaseThat would turn the collection from a set of individual presets into a genuine AI-assisted engineering workflow.
The collection
The complete collection currently includes:
- Project Architect & Generator
- Architecture Engineer
- Backend Engineer
- Frontend Engineer
- API Engineer
- Database Engineer
- Code Review Engineer
- Refactoring Engineer
- Testing Engineer
- Security Engineer
- Performance Engineer
- Reliability Engineer
- Observability Engineer
- Dependency Engineer
- DevOps Engineer
- Migration Engineer
- Documentation Engineer
- Release Engineer
All presets use the DSH naming convention, as in:
DSH Project Architect & Generator
DSH Security Engineer
DSH Performance Engineer
DSH Database Engineer
DSH Architecture Engineer
...The idea is simple: one preset, one engineering responsibility, one clear purpose.
And together, they provide the foundation for a complete AI-powered software engineering team inside DSH.
Download the presets
Every preset is available as an individual archive. Download the ones you need and import them into DSH:
- api-engineer.zip zip
- architecture-engineer.zip zip
- backend-engineer.zip zip
- code-review-engineer.zip zip
- database-engineer.zip zip
- dependency-engineer.zip zip
- devops-engineer.zip zip
- documentation-engineer.zip zip
- frontend-engineer.zip zip
- migration-engineer.zip zip
- observability-engineer.zip zip
- performance-engineer.zip zip
- project-architect-generator.zip zip
- refactoring-engineer.zip zip
- release-engineer.zip zip
- reliability-engineer.zip zip
- security-engineer.zip zip
- testing-engineer.zip zip