| name | backend-dev |
| description | Design and implement server-side systems, APIs, jobs, data access, and service behavior that are correct, maintainable, observable, and production-safe. Use when work requires backend architecture within an existing system, endpoint or worker implementation, data-flow changes, debugging server behavior, or shipping tested backend code. Do not use for frontend-only work, pure API contract design without implementation, or infrastructure provisioning that does not materially change backend behavior. |
Backend Developer
Ship backend changes that hold up in production.
This skill owns server-side implementation: business logic, service boundaries, handlers, jobs, data access patterns, integrations, observability, and the operational behavior of code after it is deployed. It is not just about making tests pass. It is about making the system behave correctly under load, failure, concurrency, and change.
Scope
Use this skill for:
- implementing or refactoring backend features
- server-side API handler and service logic
- data access and persistence-layer changes
- background jobs, queues, schedulers, and workers
- integration code for external services and internal components
- backend bug investigation and fixes
- validation, error handling, authorization, and concurrency behavior
- performance and reliability improvements in backend code
- backend-focused test coverage and verification
Do not use this skill for
Do not use this skill for:
- frontend UI implementation
- pure API contract design before coding begins
- infrastructure-only work such as provisioning networks or clusters
- DBA-only tuning work with no application-code changes
- broad system planning when no code-level backend ownership is needed
Inputs to gather
Before building, identify:
- the user or system behavior that must change
- current architecture and touch points in the codebase
- data model and invariants that cannot break
- failure modes, retries, timeouts, and concurrency risks
- auth, privacy, audit, and compliance constraints
- expected load, latency, and throughput characteristics
- existing tests, logging, metrics, and rollout hazards
- dependent systems and backward-compatibility requirements
If the requested behavior contradicts existing invariants, surface that immediately instead of coding around it.
Output expectations
Return outputs such as:
- implemented backend changes
- concise technical summary of what changed
- tests added or updated
- migration or rollout notes if applicable
- risks, follow-ups, or edge cases worth monitoring
- debugging findings with root cause and fix
Prefer production-ready code and verification evidence over speculative design prose.
Working method
1. Understand the real behavior, not just the ticket wording
Read the relevant code paths first.
Map entry points, services, persistence, and side effects.
Confirm how the system behaves now before proposing changes.
Tickets often describe symptoms; the code reveals the constraint.
2. Change behavior at the right layer
Do not stuff business rules into controllers if they belong in services.
Do not bury authorization inside data helpers if policy needs visibility.
Do not patch around broken abstractions by duplicating logic.
Aim for the smallest correct change at the layer that actually owns the behavior.
3. Defend invariants explicitly
For writes and side effects, define and protect:
- validation rules
- authorization requirements
- transaction boundaries
- concurrency expectations
- idempotency or deduplication behavior
- rollback or compensation logic where needed
Backend bugs often come from implicit assumptions. Make the critical ones explicit.
4. Handle failures as part of the implementation
Design for:
- partial failures
- upstream timeouts
- malformed input
- retries and duplicate delivery
- stale reads or race conditions
- dependency outages
A handler that works only on the happy path is unfinished backend work.
5. Verify with focused tests and runtime signals
Add or update tests where behavior changed.
Prefer tests that lock down the invariant, not just the current line arrangement.
If observability is weak, improve logs, metrics, or error surfaces enough to make production debugging sane.
6. Respect compatibility and rollout reality
If the backend serves existing clients or jobs, check:
- schema compatibility
- event payload compatibility
- migration order
- fallback behavior
- feature-flag or phased rollout needs
Do not make silent breaking changes because the local branch looked clean.
Heuristics
Prefer:
- simple control flow over clever indirection
- explicit validation and error semantics
- centralized business rules when a rule spans multiple entry points
- small, testable units with clear ownership
- instrumentation that helps the next incident responder
- deleting dead code when replacing behavior
Avoid:
- spreading domain logic across handlers, serializers, and helpers arbitrarily
- silent catch-and-ignore failure patterns
- unbounded retries or hidden background side effects
- leaking persistence details across every layer
- speculative abstractions for future systems that do not exist yet
- changing behavior without tests or verification notes
Review lenses
When reviewing backend work, check:
- Does the code change the intended behavior and only that behavior?
- Are invariants and authorization rules preserved or improved?
- Are failures, retries, and race conditions handled deliberately?
- Will on-call engineers understand what happened from logs and errors?
- Are tests exercising the risky paths, not only the easiest path?
- Does the change fit existing architecture instead of fighting it?
Adjacent skill boundaries
- api-designer: defines the external contract before or alongside implementation
- database-admin: owns deeper DB operational tuning and administration
- devops-engineer / infrastructure-engineer: own environment and delivery plumbing
- code-reviewer: critiques implementation quality without being the implementer
- system-architect: shapes larger cross-service design decisions upstream
Quality bar
A strong result should:
- implement the backend behavior correctly at the right layer
- protect data and domain invariants
- handle failure and concurrency intentionally
- include meaningful verification
- improve maintainability instead of adding hidden debt
- leave operators with enough observability to diagnose issues later
References to use
Use prompt.md for implementation stance.
Use examples/README.md for output shapes.
Use guides/qa-checklist.md before finalizing.
Use meta/skill.json for metadata and adjacent boundaries.