You are a senior backend engineer operating production-grade services under strict architectural and reliability constraints. Use when routes, controllers, services, repositories, express middleware, or prisma database access.
65%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./skills/backend-dev-guidelines/SKILL.md(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:
Use these patterns when they fit the target repository; its architecture, authorization model and dependency versions take precedence. This documentation does not ship a runnable service.
Before implementing or modifying a backend feature, assess feasibility.
| 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? |
BFRI = (Architectural Fit + Testability) − (Complexity + Data Risk + Operational Risk)Range: -13 → +7 (each input is 1–5). This is an informal discussion aid, not a validated risk model or merge gate.
| BFRI | Meaning | Action |
|---|---|---|
| 6–7 | Lower concern | Proceed |
| 3–5 | Moderate | Add tests + monitoring |
| 0–2 | Risky | Refactor or isolate |
| < 0 | Dangerous | Redesign before coding |
Automatically applies when working on:
Routes → Controllers → Services → Repositories → Database// ❌ 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.
Controllers:
Services:
BaseControllerexport 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.
catch (error) {
Sentry.captureException(error);
throw error;
}❌ console.log
❌ silent failures
❌ swallowed errors
// ❌ NEVER
process.env.JWT_SECRET;
// ✅ ALWAYS
import { config } from '@/config/unifiedConfig';
config.auth.jwtSecret;const schema = z.object({
email: z.string().email(),
});
const input = schema.parse(req.body);No validation = bug.
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| Layer | Convention |
|---|---|
| Controller | PascalCaseController.ts |
| Service | camelCaseService.ts |
| Repository | PascalCaseRepository.ts |
| Routes | camelCaseRoutes.ts |
| Validators | camelCase.schema.ts |
export class UserService {
constructor(
private readonly userRepository: UserRepository
) {}
}Prisma client never used directly in controllers
Repositories:
await userRepository.findActiveUsers();For Express 4, route promises need an error-forwarding wrapper. Express 5 forwards rejected returned promises; avoid duplicate handlers.
router.get(
'/users',
asyncErrorWrapper((req, res) =>
controller.list(req, res)
)
);Return or await the handler promise; a wrapper does not handle detached background work.
Every critical path must be observable.
describe('UserService', () => {
it('creates a user', async () => {
expect(user).toBeDefined();
});
});No tests → no merge.
❌ Business logic in routes ❌ Skipping service layer ❌ Direct Prisma in controllers ❌ Missing validation ❌ Unvalidated environment access outside configuration bootstrap ❌ Unredacted or unapproved telemetry ❌ Untested business logic
Read the relevant bundled resources before applying examples. Private project paths and @project-lifecycle-portal/database, SSOMiddleware, BaseController and configuration utilities are illustrative application components, not installed dependencies. Authenticate with access tokens, authorize every object/tenant action, allowlist public DTO fields, project response fields and protect cookie-authenticated mutations against CSRF.
Before finalizing backend work:
This skill is applicable to execute the workflow or actions described in the overview.
sickn33/agentic-awesome-skills
8aa4123
Also appears in
last in sync Apr 16, 2026
last in sync Apr 16, 2026
last in sync Apr 16, 2026
last in sync Apr 16, 2026
last in sync Mar 21, 2026
last in sync Mar 21, 2026
last in sync Mar 21, 2026
last in sync Mar 21, 2026
last in sync Jan 28, 2026
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.