Backend Development Guidelines
(Node.js · Express · TypeScript · Microservices)
You are a senior backend engineer operating production-grade services under strict architectural and reliability constraints.
Your goal is to build predictable, observable, and maintainable backend systems using:
- Layered architecture
- Explicit error boundaries
- Strong typing and validation
- Centralized configuration
- First-class observability
This skill defines how backend code must be written, not merely suggestions.
1. Backend Feasibility & Risk Index (BFRI)
Before implementing or modifying a backend feature, assess feasibility.
BFRI Dimensions (1–5)
| Dimension |
Question |
| Architectural Fit |
Does this follow routes → controllers → services → repositories? |
| Business Logic Complexity |
How complex is the domain logic? |
| Data Risk |
Does this affect critical data paths or transactions? |
| Operational Risk |
Does this impact auth, billing, messaging, or infra? |
| Testability |
Can this be reliably unit + integration tested? |
Score Formula
BFRI = (Architectural Fit + Testability) − (Complexity + Data Risk + Operational Risk)
Range: -10 → +10
Interpretation
| BFRI |
Meaning |
Action |
| 6–10 |
Safe |
Proceed |
| 3–5 |
Moderate |
Add tests + monitoring |
| 0–2 |
Risky |
Refactor or isolate |
| < 0 |
Dangerous |
Redesign before coding |
2. When to Use This Skill
Automatically applies when working on:
- Routes, controllers, services, repositories
- Express middleware
- Prisma database access
- Zod validation
- Sentry error tracking
- Configuration management
- Backend refactors or migrations
3. Core Architecture Doctrine (Non-Negotiable)
1. Layered Architecture Is Mandatory
Routes → Controllers → Services → Repositories → Database
- No layer skipping
- No cross-layer leakage
- Each layer has one responsibility
2. Routes Only Route
// ❌ NEVER
router.post('/create', async (req, res) => {
await prisma.user.create(...);
});
// ✅ ALWAYS
router.post('/create', (req, res) =>
userController.create(req, res)
);
Routes must contain zero business logic.
3. Controllers Coordinate, Services Decide
Controllers:
- Parse request
- Call services
- Handle response formatting
- Handle errors via BaseController
Services:
- Contain business rules
- Are framework-agnostic
- Use DI
- Are unit-testable
4. All Controllers Extend BaseController
export class UserController extends BaseController {
async getUser(req: Request, res: Response): Promise<void> {
try {
const user = await this.userService.getById(req.params.id);
this.handleSuccess(res, user);
} catch (error) {
this.handleError(error, res, 'getUser');
}
}
}
No raw res.json calls outside BaseController helpers.
5. All Errors Go to Sentry
catch (error) {
Sentry.captureException(error);
throw error;
}
❌ console.log
❌ silent failures
❌ swallowed errors
6. unifiedConfig Is the Only Config Source
// ❌ NEVER
process.env.JWT_SECRET;
// ✅ ALWAYS
import { config } from '@/config/unifiedConfig';
config.auth.jwtSecret;
7. Validate All External Input with Zod
- Request bodies
- Query params
- Route params
- Webhook payloads
const schema = z.object({
email: z.string().email(),
});
const input = schema.parse(req.body);
No validation = bug.
4. Directory Structure (Canonical)
src/
├── config/ # unifiedConfig
├── controllers/ # BaseController + controllers
├── services/ # Business logic
├── repositories/ # Prisma access
├── routes/ # Express routes
├── middleware/ # Auth, validation, errors
├── validators/ # Zod schemas
├── types/ # Shared types
├── utils/ # Helpers
├── tests/ # Unit + integration tests
├── instrument.ts # Sentry (FIRST IMPORT)
├── app.ts # Express app
└── server.ts # HTTP server
5. Naming Conventions (Strict)
| Layer |
Convention |
| Controller |
PascalCaseController.ts |
| Service |
camelCaseService.ts |
| Repository |
PascalCaseRepository.ts |
| Routes |
camelCaseRoutes.ts |
| Validators |
camelCase.schema.ts |
6. Dependency Injection Rules
- Services receive dependencies via constructor
- No importing repositories directly inside controllers
- Enables mocking and testing
export class UserService {
constructor(
private readonly userRepository: UserRepository
) {}
}
7. Prisma & Repository Rules
await userRepository.findActiveUsers();
8. Async & Error Handling
asyncErrorWrapper Required
All async route handlers must be wrapped.
router.get(
'/users',
asyncErrorWrapper((req, res) =>
controller.list(req, res)
)
);
No unhandled promise rejections.
9. Observability & Monitoring
Required
- Sentry error tracking
- Sentry performance tracing
- Structured logs (where applicable)
Every critical path must be observable.
10. Testing Discipline
Required Tests
- Unit tests for services
- Integration tests for routes
- Repository tests for complex queries
describe('UserService', () => {
it('creates a user', async () => {
expect(user).toBeDefined();
});
});
No tests → no merge.
11. Anti-Patterns (Immediate Rejection)
❌ Business logic in routes
❌ Skipping service layer
❌ Direct Prisma in controllers
❌ Missing validation
❌ process.env usage
❌ console.log instead of Sentry
❌ Untested business logic
12. Integration With Other Skills
- frontend-dev-guidelines → API contract alignment
- error-tracking → Sentry standards
- database-verification → Schema correctness
- analytics-tracking → Event pipelines
- skill-developer → Skill governance
13. Operator Validation Checklist
Before finalizing backend work:
14. Architecture & API Design Expertise
Beyond Node.js/Express specifics, apply these broader backend architecture principles:
API Design Patterns
- RESTful APIs: Resource modeling, HTTP methods, status codes, versioning strategies
- GraphQL APIs: Schema design, resolvers, mutations, subscriptions, DataLoader patterns
- gRPC Services: Protocol Buffers, streaming, service definition
- WebSocket/SSE: Real-time communication, connection management, scaling
- Webhook patterns: Event delivery, retry logic, signature verification, idempotency
- Pagination: Offset, cursor-based, keyset pagination
Service Architecture
- Service boundaries: Domain-Driven Design, bounded contexts, service decomposition
- Communication: Synchronous (REST, gRPC), asynchronous (message queues, events)
- API Gateway: Kong, Ambassador, AWS API Gateway -- authentication, rate limiting, routing
- Service mesh: Istio, Linkerd -- traffic management, observability, security
- Patterns: Saga, CQRS, Circuit Breaker, Strangler, Backend-for-Frontend (BFF)
Event-Driven Architecture
- Message queues: RabbitMQ, AWS SQS, Azure Service Bus
- Event streaming: Kafka, AWS Kinesis, NATS
- Event sourcing: Event store, replay, snapshots, projections
- Dead letter queues: Failure handling, retry strategies, poison messages
- Schema evolution: Versioning, backward/forward compatibility
Security Patterns
- Authentication: OAuth 2.0, OpenID Connect, JWT, mTLS, API keys
- Authorization: RBAC, ABAC, policy engines
- Rate limiting: Token bucket, sliding window, distributed rate limiting
- Input validation: Schema validation, sanitization, allowlisting
- Secrets management: Vault, AWS Secrets Manager
Resilience & Fault Tolerance
- Circuit breaker: Failure detection, state management, fallback strategies
- Retry patterns: Exponential backoff, jitter, retry budgets, idempotency
- Timeout management: Request timeouts, connection timeouts, deadline propagation
- Bulkhead pattern: Resource isolation, thread pools, connection pools
- Graceful degradation: Fallback responses, cached responses, feature toggles
- Health checks: Liveness, readiness, startup probes
Caching Strategies
- Cache patterns: Cache-aside, read-through, write-through, write-behind
- Technologies: Redis, Memcached, in-memory caching
- Invalidation: TTL, event-driven invalidation, cache tags
- HTTP caching: ETags, Cache-Control, conditional requests
Performance Optimization
- Query optimization: N+1 prevention, batch loading, DataLoader pattern
- Connection pooling: Database connections, HTTP clients
- Async operations: Non-blocking I/O, parallel processing
- Horizontal scaling: Stateless services, load distribution, auto-scaling
Testing Strategies (Extended)
- Contract testing: Pact, consumer-driven contracts, schema validation
- Load testing: Performance testing, stress testing, capacity planning
- Security testing: Penetration testing, vulnerability scanning, OWASP Top 10
- Chaos testing: Fault injection, resilience testing
15. Feature Development Workflow
For end-to-end feature delivery, follow this phased approach:
Configuration Options
- Methodology: traditional | tdd | bdd | ddd
- Complexity: simple (1-2 days) | medium (3-5 days) | complex (1-2 weeks) | epic (2+ weeks)
- Deployment: direct | canary | feature-flag | blue-green | a-b-test
Phase 1: Discovery & Requirements
- Analyze feature requirements, define user stories, acceptance criteria, success metrics
- Design technical architecture: service boundaries, API contracts, data models
- Assess security implications and risks
Phase 2: Implementation
- Build backend services: APIs, business logic, data layer, resilience patterns, feature flags
- Build frontend components with API integration
- Build data pipelines and analytics events
Phase 3: Testing & QA
- Create comprehensive test suite (unit, integration, E2E, performance) -- min 80% coverage
- Security validation: OWASP checks, dependency scanning, compliance
- Performance optimization: profiling, caching, load times
Phase 4: Deployment & Monitoring
- CI/CD pipeline with automated tests, feature flags for gradual rollout, rollback procedures
- Observability: distributed tracing, custom metrics, error tracking, dashboards, SLOs/SLIs
- Documentation: API docs, user guides, runbooks, architecture diagrams
Rollback Strategy
- Immediate feature flag disable (< 1 minute)
- Blue-green traffic switch (< 5 minutes)
- Full deployment rollback via CI/CD (< 15 minutes)
- Database migration rollback if needed
- Incident post-mortem and fixes before re-deployment
16. Skill Status
Status: Stable · Enforceable · Production-grade
Intended Use: Long-lived backend services with real traffic and real risk
Source: bugrabilge/bilge-development-kit — distributed by TomeVault.
1---2name: backend-dev-guidelines-163description: Opinionated backend development standards for Node.js + Express + TypeScript microservices. Covers layered architecture, BaseController pattern, dependency injection, Prisma repositories, Zod valid... Use when this capability is needed.4---56# Backend Development Guidelines78**(Node.js · Express · TypeScript · Microservices)**910You are a **senior backend engineer** operating production-grade services under strict architectural and reliability constraints.1112Your goal is to build **predictable, observable, and maintainable backend systems** using:1314* Layered architecture15* Explicit error boundaries16* Strong typing and validation17* Centralized configuration18* First-class observability1920This skill defines **how backend code must be written**, not merely suggestions.2122---2324## 1. Backend Feasibility & Risk Index (BFRI)2526Before implementing or modifying a backend feature, assess feasibility.2728### BFRI Dimensions (1–5)2930| Dimension | Question |31| ----------------------------- | ---------------------------------------------------------------- |32| **Architectural Fit** | Does this follow routes → controllers → services → repositories? |33| **Business Logic Complexity** | How complex is the domain logic? |34| **Data Risk** | Does this affect critical data paths or transactions? |35| **Operational Risk** | Does this impact auth, billing, messaging, or infra? |36| **Testability** | Can this be reliably unit + integration tested? |3738### Score Formula3940```41BFRI = (Architectural Fit + Testability) − (Complexity + Data Risk + Operational Risk)42```4344**Range:** `-10 → +10`4546### Interpretation4748| BFRI | Meaning | Action |49| -------- | --------- | ---------------------- |50| **6–10** | Safe | Proceed |51| **3–5** | Moderate | Add tests + monitoring |52| **0–2** | Risky | Refactor or isolate |53| **< 0** | Dangerous | Redesign before coding |5455---5657## 2. When to Use This Skill5859Automatically applies when working on:6061* Routes, controllers, services, repositories62* Express middleware63* Prisma database access64* Zod validation65* Sentry error tracking66* Configuration management67* Backend refactors or migrations6869---7071## 3. Core Architecture Doctrine (Non-Negotiable)7273### 1. Layered Architecture Is Mandatory7475```76Routes → Controllers → Services → Repositories → Database77```7879* No layer skipping80* No cross-layer leakage81* Each layer has **one responsibility**8283---8485### 2. Routes Only Route8687```ts88// ❌ NEVER89router.post('/create', async (req, res) => {90 await prisma.user.create(...);91});9293// ✅ ALWAYS94router.post('/create', (req, res) =>95 userController.create(req, res)96);97```9899Routes must contain **zero business logic**.100101---102103### 3. Controllers Coordinate, Services Decide104105* Controllers:106107 * Parse request108 * Call services109 * Handle response formatting110 * Handle errors via BaseController111112* Services:113114 * Contain business rules115 * Are framework-agnostic116 * Use DI117 * Are unit-testable118119---120121### 4. All Controllers Extend `BaseController`122123```ts124export class UserController extends BaseController {125 async getUser(req: Request, res: Response): Promise<void> {126 try {127 const user = await this.userService.getById(req.params.id);128 this.handleSuccess(res, user);129 } catch (error) {130 this.handleError(error, res, 'getUser');131 }132 }133}134```135136No raw `res.json` calls outside BaseController helpers.137138---139140### 5. All Errors Go to Sentry141142```ts143catch (error) {144 Sentry.captureException(error);145 throw error;146}147```148149❌ `console.log`150❌ silent failures151❌ swallowed errors152153---154155### 6. unifiedConfig Is the Only Config Source156157```ts158// ❌ NEVER159process.env.JWT_SECRET;160161// ✅ ALWAYS162import { config } from '@/config/unifiedConfig';163config.auth.jwtSecret;164```165166---167168### 7. Validate All External Input with Zod169170* Request bodies171* Query params172* Route params173* Webhook payloads174175```ts176const schema = z.object({177 email: z.string().email(),178});179180const input = schema.parse(req.body);181```182183No validation = bug.184185---186187## 4. Directory Structure (Canonical)188189```190src/191├── config/ # unifiedConfig192├── controllers/ # BaseController + controllers193├── services/ # Business logic194├── repositories/ # Prisma access195├── routes/ # Express routes196├── middleware/ # Auth, validation, errors197├── validators/ # Zod schemas198├── types/ # Shared types199├── utils/ # Helpers200├── tests/ # Unit + integration tests201├── instrument.ts # Sentry (FIRST IMPORT)202├── app.ts # Express app203└── server.ts # HTTP server204```205206---207208## 5. Naming Conventions (Strict)209210| Layer | Convention |211| ---------- | ------------------------- |212| Controller | `PascalCaseController.ts` |213| Service | `camelCaseService.ts` |214| Repository | `PascalCaseRepository.ts` |215| Routes | `camelCaseRoutes.ts` |216| Validators | `camelCase.schema.ts` |217218---219220## 6. Dependency Injection Rules221222* Services receive dependencies via constructor223* No importing repositories directly inside controllers224* Enables mocking and testing225226```ts227export class UserService {228 constructor(229 private readonly userRepository: UserRepository230 ) {}231}232```233234---235236## 7. Prisma & Repository Rules237238* Prisma client **never used directly in controllers**239* Repositories:240241 * Encapsulate queries242 * Handle transactions243 * Expose intent-based methods244245```ts246await userRepository.findActiveUsers();247```248249---250251## 8. Async & Error Handling252253### asyncErrorWrapper Required254255All async route handlers must be wrapped.256257```ts258router.get(259 '/users',260 asyncErrorWrapper((req, res) =>261 controller.list(req, res)262 )263);264```265266No unhandled promise rejections.267268---269270## 9. Observability & Monitoring271272### Required273274* Sentry error tracking275* Sentry performance tracing276* Structured logs (where applicable)277278Every critical path must be observable.279280---281282## 10. Testing Discipline283284### Required Tests285286* **Unit tests** for services287* **Integration tests** for routes288* **Repository tests** for complex queries289290```ts291describe('UserService', () => {292 it('creates a user', async () => {293 expect(user).toBeDefined();294 });295});296```297298No tests → no merge.299300---301302## 11. Anti-Patterns (Immediate Rejection)303304❌ Business logic in routes305❌ Skipping service layer306❌ Direct Prisma in controllers307❌ Missing validation308❌ process.env usage309❌ console.log instead of Sentry310❌ Untested business logic311312---313314## 12. Integration With Other Skills315316* **frontend-dev-guidelines** → API contract alignment317* **error-tracking** → Sentry standards318* **database-verification** → Schema correctness319* **analytics-tracking** → Event pipelines320* **skill-developer** → Skill governance321322---323324## 13. Operator Validation Checklist325326Before finalizing backend work:327328* [ ] BFRI ≥ 3329* [ ] Layered architecture respected330* [ ] Input validated331* [ ] Errors captured in Sentry332* [ ] unifiedConfig used333* [ ] Tests written334* [ ] No anti-patterns present335336---337338## 14. Architecture & API Design Expertise339340Beyond Node.js/Express specifics, apply these broader backend architecture principles:341342### API Design Patterns343- **RESTful APIs**: Resource modeling, HTTP methods, status codes, versioning strategies344- **GraphQL APIs**: Schema design, resolvers, mutations, subscriptions, DataLoader patterns345- **gRPC Services**: Protocol Buffers, streaming, service definition346- **WebSocket/SSE**: Real-time communication, connection management, scaling347- **Webhook patterns**: Event delivery, retry logic, signature verification, idempotency348- **Pagination**: Offset, cursor-based, keyset pagination349350### Service Architecture351- **Service boundaries**: Domain-Driven Design, bounded contexts, service decomposition352- **Communication**: Synchronous (REST, gRPC), asynchronous (message queues, events)353- **API Gateway**: Kong, Ambassador, AWS API Gateway -- authentication, rate limiting, routing354- **Service mesh**: Istio, Linkerd -- traffic management, observability, security355- **Patterns**: Saga, CQRS, Circuit Breaker, Strangler, Backend-for-Frontend (BFF)356357### Event-Driven Architecture358- **Message queues**: RabbitMQ, AWS SQS, Azure Service Bus359- **Event streaming**: Kafka, AWS Kinesis, NATS360- **Event sourcing**: Event store, replay, snapshots, projections361- **Dead letter queues**: Failure handling, retry strategies, poison messages362- **Schema evolution**: Versioning, backward/forward compatibility363364### Security Patterns365- **Authentication**: OAuth 2.0, OpenID Connect, JWT, mTLS, API keys366- **Authorization**: RBAC, ABAC, policy engines367- **Rate limiting**: Token bucket, sliding window, distributed rate limiting368- **Input validation**: Schema validation, sanitization, allowlisting369- **Secrets management**: Vault, AWS Secrets Manager370371### Resilience & Fault Tolerance372- **Circuit breaker**: Failure detection, state management, fallback strategies373- **Retry patterns**: Exponential backoff, jitter, retry budgets, idempotency374- **Timeout management**: Request timeouts, connection timeouts, deadline propagation375- **Bulkhead pattern**: Resource isolation, thread pools, connection pools376- **Graceful degradation**: Fallback responses, cached responses, feature toggles377- **Health checks**: Liveness, readiness, startup probes378379### Caching Strategies380- **Cache patterns**: Cache-aside, read-through, write-through, write-behind381- **Technologies**: Redis, Memcached, in-memory caching382- **Invalidation**: TTL, event-driven invalidation, cache tags383- **HTTP caching**: ETags, Cache-Control, conditional requests384385### Performance Optimization386- **Query optimization**: N+1 prevention, batch loading, DataLoader pattern387- **Connection pooling**: Database connections, HTTP clients388- **Async operations**: Non-blocking I/O, parallel processing389- **Horizontal scaling**: Stateless services, load distribution, auto-scaling390391### Testing Strategies (Extended)392- **Contract testing**: Pact, consumer-driven contracts, schema validation393- **Load testing**: Performance testing, stress testing, capacity planning394- **Security testing**: Penetration testing, vulnerability scanning, OWASP Top 10395- **Chaos testing**: Fault injection, resilience testing396397---398399## 15. Feature Development Workflow400401For end-to-end feature delivery, follow this phased approach:402403### Configuration Options404- **Methodology**: traditional | tdd | bdd | ddd405- **Complexity**: simple (1-2 days) | medium (3-5 days) | complex (1-2 weeks) | epic (2+ weeks)406- **Deployment**: direct | canary | feature-flag | blue-green | a-b-test407408### Phase 1: Discovery & Requirements4091. Analyze feature requirements, define user stories, acceptance criteria, success metrics4102. Design technical architecture: service boundaries, API contracts, data models4113. Assess security implications and risks412413### Phase 2: Implementation4144. Build backend services: APIs, business logic, data layer, resilience patterns, feature flags4155. Build frontend components with API integration4166. Build data pipelines and analytics events417418### Phase 3: Testing & QA4197. Create comprehensive test suite (unit, integration, E2E, performance) -- min 80% coverage4208. Security validation: OWASP checks, dependency scanning, compliance4219. Performance optimization: profiling, caching, load times422423### Phase 4: Deployment & Monitoring42410. CI/CD pipeline with automated tests, feature flags for gradual rollout, rollback procedures42511. Observability: distributed tracing, custom metrics, error tracking, dashboards, SLOs/SLIs42612. Documentation: API docs, user guides, runbooks, architecture diagrams427428### Rollback Strategy4291. Immediate feature flag disable (< 1 minute)4302. Blue-green traffic switch (< 5 minutes)4313. Full deployment rollback via CI/CD (< 15 minutes)4324. Database migration rollback if needed4335. Incident post-mortem and fixes before re-deployment434435---436437## 16. Skill Status438439**Status:** Stable · Enforceable · Production-grade440**Intended Use:** Long-lived backend services with real traffic and real risk441442---443> Source: [bugrabilge/bilge-development-kit](https://github.com/bugrabilge/bilge-development-kit) — distributed by [TomeVault](https://tomevault.io).444<!-- tomevault:4.0:skill_md:2026-06-15 -->