pattern-engineer-backend-standard
Skill0 starsChanged 5 months agoMITView on GitHub
Backend implementation bullets — what the contract doesn't say. Follow the contract verbatim (paths, verbs, status codes, body, envelope, idempotency, rate-limit policy). Covers input-validation mechanics, atomic mutations, RequestId middleware position, `/healthz` + `/readyz` shape, log redaction, SSRF safety, webhook HMAC verify, `.env.example` lockstep, locked deps, SIGTERM, migrations as compose service. Activate on backend code.
- Reads credentials
In this repository74 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- create-bug-issueSkill
- create-enhancement-issueSkill
- create-feature-issuesSkill
- dream-summary-memorySkill
- memory-conventionSkill
- operation-gitSkill
- pattern-architect-api-endpointSkill
- pattern-architect-data-modelSkill
- pattern-architect-deep-moduleSkill
- pattern-e2e-coding-standardSkill
- pattern-engineer-apiSkill
- pattern-engineer-coding-standardSkill
- pattern-engineer-containerSkill
- pattern-engineer-databaseSkill
- pattern-engineer-fastapiSkill
- pattern-engineer-frontend-standardSkill
- pattern-engineer-goSkill
- pattern-engineer-javaSkill
- pattern-engineer-kotlinSkill
- pattern-engineer-nodeSkill
- pattern-engineer-non-functionalSkill
- pattern-engineer-observabilitySkill
- pattern-engineer-pythonSkill
- pattern-engineer-rustSkill
- pattern-engineer-securitySkill
- pattern-engineer-ssrSkill
- pattern-engineer-swiftSkill
- pattern-engineer-typescriptSkill
- pattern-engineer-viteSkill
- pattern-exploratory-testingSkill
- pattern-reviewer-apiSkill
- pattern-reviewer-backend-standardSkill
- pattern-reviewer-coding-standardSkill
- pattern-reviewer-containerSkill
- pattern-reviewer-contractSkill
- pattern-reviewer-databaseSkill
- pattern-reviewer-fastapiSkill
- pattern-reviewer-frontend-standardSkill
- pattern-reviewer-goSkill
- pattern-reviewer-javaSkill
- pattern-reviewer-kotlinSkill
- pattern-reviewer-nodeSkill
- pattern-reviewer-non-functionalSkill
- pattern-reviewer-observabilitySkill
- pattern-reviewer-pythonSkill
- pattern-reviewer-rustSkill
- pattern-reviewer-securitySkill
- pattern-reviewer-ssrSkill
- pattern-reviewer-swiftSkill
- pattern-reviewer-test-coverageSkill
- pattern-reviewer-typescriptSkill
- pattern-reviewer-viteSkill
- pattern-test-coverageSkill
- principle-engineer-tddSkill
- scaffold-projectSkill
- workflow-architect-interviewSkill
- workflow-designer-sample-pagesSkill
- workflow-design-interviewSkill
- workflow-e2e-authorSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
8 rules. About 0 are common, 3 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 14
After loading this skill, also check $MAIN_ROOT/.claude/memory/patterns/pattern-engineer-backend-standard.md in the consuming project …
- Distinctive: line 39
Every state-changing handler checks identity AND ownership/role server-side.
- Very specific: line 49
When the contract declares Idempotency-Key for an endpoint, implement the store: persist (key, response) for the contracted TTL, replay the …
- Very specific: line 53
When the contract declares a per-route rate-limit budget, wire the limiter (e.g., slowapi / Express middleware / token-bucket lib) at the …
- Very specific: line 82
Read secrets from env vars (or a typed settings object that does).
- Very specific: line 83
Keep .env.example in lockstep with the code: every os.environ / process.env / getenv / Settings(...) read has a row in .env.example.
- Distinctive: line 121
Read path: check cache → miss → fetch from source → populate cache with TTL → return.
- Distinctive: line 122
Every write that changes a cached value invalidates the cache for that key in the same transaction (or immediately after commit).
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
pattern-engineer-backend-standard
When to activate
Activate whenever you write or edit backend code: HTTP routes/handlers, service modules, middleware, database queries, background workers, queue consumers, auth flows, webhook receivers, container entrypoints, env-var loading, logging bootstrap.
Project memory overlay
After loading this skill, also check $MAIN_ROOT/.claude/memory/patterns/pattern-engineer-backend-standard.md in the consuming project (resolve MAIN_ROOT="$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")"). If present, load it as an additive overlay to the rules below; if absent, skip silently. See memory-convention for the full contract (additivity, severity floor, conflict surfacing).
Follow the contract — don't redecide
Before implementing any endpoint, open the api contract at docs/api-contract/<entity>.yaml. Take from the contract — never invent — the path (including trailing-slash spelling), HTTP verb, request body schema, response body schema, status codes per outcome, error envelope shape + code values, Idempotency-Key policy, rate-limit budget, and versioning notes. If the contract is missing or ambiguous for an endpoint the task touches, halt and surface "no api contract for <endpoint>".
Same rule for the data model: docs/data-model/<entity>.yaml is the source of truth for table names, column types, constraints, indexes. The migration / ORM model implements the contract verbatim.
Implementation patterns (not in the contract)
Input validation mechanics
- Validate every external input with a schema at the boundary (Pydantic / Zod / equivalent) — the shape comes from the contract; the mechanism is yours.
- Bound string lengths, numeric ranges, enum values exactly as the contract declares.
- File uploads: size + MIME + extension whitelist; magic-byte check for high-trust uploads.
- Validation errors return field-level messages; no internal types, table names, or stack traces.
Output mechanics
- Serialize to the contract's response schema; strip sensitive fields (
passwordHash,resetToken,mfaSecret, …) at the serializer, not at every call site. - Map every internal exception class to the contracted error envelope at a single layer (e.g., a project-level exception handler), not inline in each route.
- 5xx response body carries the generic message + correlation id only. No stack traces, no internal exception messages, no schema / table / column names — those go to the server log keyed by the same
request_id.
AuthN + AuthZ implementation
- Every state-changing handler checks identity AND ownership/role server-side; multi-tenant tables get RLS where the DB supports it.
- Cookie attributes, constant-time auth paths, reset-flow rules, and the rest of the auth surface are owned by
pattern-engineer-security— it loads on any auth/endpoint work; follow its catalogue rather than this skill restating it.
Atomic mutations
- Balance / quota / inventory / token-redemption mutations are atomic — either
UPDATE … WHERE balance >= :a(check rowcount) orSELECT … FOR UPDATEinside a transaction. - Token redemption (reset, MFA, OTP, magic-link) marks-then-checks atomically; second attempt returns rowcount=0.
Idempotency wiring
- When the contract declares
Idempotency-Keyfor an endpoint, implement the store: persist(key, response)for the contracted TTL, replay the response on retry, treat missing-key on a required endpoint as 400.
Rate-limit wiring
- When the contract declares a per-route rate-limit budget, wire the limiter (e.g.,
slowapi/ Express middleware / token-bucket lib) at the route boundary. The budget + identity key come from the contract; the implementation choice (slowapi, custom Redis token bucket, gateway-level) is yours. - Emit the contracted rate-limit headers (
RateLimit-Limit,RateLimit-Remaining,RateLimit-Reset) on both success AND 429 responses.
CSRF wiring
- Cookie-authenticated state-changing requests carry a CSRF token; pair with
SameSitecookies as defense-in-depth.
Logging mechanics
- One structured logger per service. Bridge into OTel logs.
- Log identifiers (user_id, request_id), never secrets.
- Log a sensitive value at exactly one layer — never the same value at service AND router.
- Redaction allow-list key names match the keys the code emits exactly (case-sensitive).
- Request-id middleware runs first on the rejection path so every 4xx / 5xx body carries a non-null
request_id(FastAPI ordering mechanics:pattern-engineer-fastapi).
Health endpoint mechanics
/healthz: 200 on normal boot; no auth; no DB or external-dep call; <100ms./readyz(separate path) may check DB and dependencies; used by readiness probes.- Path names (
/healthz,/readyz) follow the contract or the project's ADR — don't pick a third spelling.
Migrations
- Models are the source of truth; generate migrations from the model, never hand-write DDL first.
- Migrations run in a dedicated
migratecompose service before the backend starts — not inside the backend image's entrypoint.
Deployment + ops
- Graceful shutdown on SIGTERM: drain in-flight requests, close DB pools, flush log buffers before exit.
- Read secrets from env vars (or a typed settings object that does).
.env*in.gitignore; only.env.example(placeholders) committed. - Keep
.env.examplein lockstep with the code: everyos.environ/process.env/getenv/Settings(...)read has a row in.env.example. - Lock dependencies; commit lock files; CI uses reproducible install (
uv sync --locked,npm ci,poetry install --no-update). - Container builds vetted via
docker scout/ Trivy: zero CRITICAL/HIGH CVEs before ship.
Outbound calls (SSRF)
- Server-side
fetch(userProvidedUrl)goes through a host allowlist + scheme allowlist (https:) + private-range block (resolve hostname; don't trust the literal). redirect: "manual"(or follow with re-validation) + timeouts on every outbound call.
Webhooks + OAuth
- Webhook receivers verify HMAC signature before parsing the body; constant-time compare; dedupe by event-id or timestamp window.
- OAuth callbacks validate
state; public clients use PKCE.
Layering — repository / service / route
- Routes parse input, call a service, format the response. No DB calls, no business logic inside a route handler.
- Services own business logic and orchestrate repositories; repositories own the SQL / ORM.
- A handler that opens a DB session and writes queries inline = bypassed layer; extract into a service module before merging.
Retries on transient failures
- Outbound calls to flaky dependencies (third-party HTTP, queue publish, email send) retry with exponential backoff + jitter on connection errors and 5xx — never on 4xx (the client is the problem).
- Cap total retries (≤3) and total elapsed time (≤a few seconds for synchronous request paths; longer for background workers).
- Idempotency: retry only when the operation is idempotent (or carries an
Idempotency-Keyhonored by the callee).
External-integration discipline
For any external service integrated (email/message delivery, payment gateways, object storage, brokers, webhook senders, IdPs). Service-specific quirks belong in the project's .claude/memory/patterns/ overlay, never inline here.
- Emitted artifacts conform to the consuming contract, not the emitter's intent — a link/callback URL, webhook payload, signed URL, or queue message matches what the consumer requires; fix and test all emitters of one artifact together (test substance:
pattern-test-coverage§6). - Async delivery through an external sink is an inherent race. Provide a synchronous, delivery-confirmed path, or document that observers must poll the sink — never tune
sleepvalues in production code to win the race. - External-client connection strings match the runtime's required scheme/protocol at every entrypoint that builds the client (a driver-prefix rewrite present in the worker but missing in the web server only fails once a real connection opens).
- Knobs that gate external calls are env-configurable — rate limits, retry/backoff, poll/tick intervals, timeouts. Never hard-code.
- Verify the artifact survives the external service's encoding round-trip (line-folding, charset, JSON escaping) — assert the consumer receives exactly what was emitted.
Caching — cache-aside
- Read path: check cache → miss → fetch from source → populate cache with TTL → return. Single helper per cache key family.
- Every write that changes a cached value invalidates the cache for that key in the same transaction (or immediately after commit). Write-through-only is a stale-read trap.
- TTL is the safety net, not the strategy.
- Cache layer is shared (Redis / Memcached / platform cache), never a per-process map.
Authorization — table-driven RBAC
- Permission checks resolve through one helper (
has_permission(user, action, resource)), backed by a permission table — not scattered inlineif user.role == "admin"branches. - Adding a new action means adding a row to the permission table, not editing every route.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

