🧱 Windsurf Skill — Backend & APIs (Columna vertebral)
Skill ID: SK-BE-API-001
Aplica a: Fintech, Legaltech, Edtech, Healthtech, Retailtech, Proptech, Foodtech, Medtech, Regtech
Objetivo: diseñar y construir backends y APIs modulares, auditables, resilientes y multi-tenant, con seguridad fuerte, modelado correcto (incl. ledger cuando aplique), datos y jobs/colas operables.
0) Backend Profile (output obligatorio)
Antes de diseñar/codificar, Windsurf debe fijar:
- API style: REST | GraphQL | híbrido
- Versioning: URL (
/v1) | header | schema version (GraphQL)
- Stack: NestJS | FastAPI | Go | Elixir | otro (definir)
- Architecture: DDD + Hexagonal (default) | otra (justificar)
- CQRS: off | on (por módulos) + justificación
- Eventing: none | async events (outbox) | full EDA
- Auth: OAuth2/OIDC + provider (Keycloak/Auth0/Cognito/otro)
- Multi-tenant: single-DB shared | schema-per-tenant | DB-per-tenant (definir)
- Data: Postgres/MySQL/TiDB + Redis + object storage (si aplica)
- Jobs/Queue: BullMQ | SQS | Rabbit | Kafka | otro
- Observability: OTel + logs + metrics + tracing
- Risk Tier: R0–R3 (según regla base)
Gate: sin Backend Profile explícito, Windsurf no avanza; declara supuestos “Hard” + impacto.
1) Principios (no negociables)
- API contract first: schema + errores + paginación + auth antes de implementar.
- Dominio puro: reglas core viven en
domain/, sin frameworks.
- Writes son sagrados: idempotencia, validaciones, auditoría y consistencia.
- Multi-tenant by design: toda consulta y comando está “scoped” por
tenantId.
- Operabilidad: logs estructurados + tracing + métricas + health checks desde MVP.
- Evolución segura: versionado de APIs, migraciones expand/contract, backward compatibility.
2) Diseño de APIs (REST/GraphQL)
2.1 Reglas generales
- Recursos y verbos: REST orientado a recursos; GraphQL para composición de lectura.
- Versionado obligatorio: no romper contratos sin versión nueva.
- Consistencia de responses:
data, meta, errors (estructura estándar)
- Errores tipados:
DOMAIN_*, VALIDATION_*, AUTH_*, RATE_LIMIT_*, INTEGRATION_*
2.2 Paginación y filtros
- Preferir cursor pagination para listas grandes; offset solo para admin pequeño.
- Filtros composables:
?status=&from=&to=&q=.
- Sorting explícito (
sort=createdAt:desc).
2.3 Idempotencia (obligatoria en writes críticos)
- Header
Idempotency-Key (y/o X-Request-Id)
- Persistir resultado por key (Redis o DB) con TTL + estado
- Retornar la misma respuesta para reintentos
Gate API (bloquea):
- Endpoint transaccional sin idempotencia (cuando aplica).
- Listas sin paginación.
- Errores no estandarizados o sin códigos.
3) Arquitectura (DDD/Hexagonal + modularidad)
3.1 Capas canónicas
domain/: entities, value objects, domain services, invariants, ports, domain events
application/: use cases / handlers (CQRS), DTOs, policies, orchestration
infrastructure/: adapters (db/http/queue), persistence, clients, config
interfaces/: controllers/resolvers/consumers
3.2 CQRS (cuando aplica)
Activar CQRS si:
- Lecturas complejas (reporting, dashboards) difieren del modelo de escritura
- Necesitas escalado independiente read/write
- Event-driven y proyecciones
Reglas CQRS:
- Commands no retornan vistas pesadas (solo IDs o resumen)
- Queries no mutan estado
- Proyecciones versionadas + rebuild strategy
Gate arquitectura (bloquea):
- Dominio depende de ORM/framework.
- Controllers contienen reglas core.
- CQRS activado sin necesidad (complejidad sin ROI).
4) AuthN/AuthZ (OIDC, MFA, RBAC/ABAC)
4.1 Autenticación (AuthN)
- OAuth2/OIDC obligatorio (tokens firmados, introspection si aplica)
- MFA opcional: requerido por
R2+ o acciones sensibles
- Sessions/refresh tokens con rotación
4.2 Autorización (AuthZ)
RBAC mínimo:
- Roles por tenant (Owner/Admin/Member/Viewer, etc.)
- Permisos por acción (CRUD + export + billing + settings)
ABAC (cuando aplique):
- Reglas por atributo:
tenantId, plan, resourceOwnerId, region, featureFlags
- Policy engine (simple) o middleware centralizado
Gate Auth (bloquea):
- Endpoints sin verificación de
tenantId y permisos.
- Token handling inseguro.
- Acciones sensibles sin MFA (si definido).
5) Multi-tenant (pymes): aislamiento, roles, límites, planes
5.1 Estrategias de aislamiento (declarar una)
- Shared DB + tenant_id (default MVP)
- Schema-per-tenant (aislamiento medio)
- DB-per-tenant (aislamiento fuerte / enterprise)
5.2 Reglas duras multi-tenant
- Todo request debe derivar
tenantId desde el token/contexto.
- Toda query y write deben filtrar por
tenantId (sin excepciones).
- Auditoría incluye
tenantId, actorId, role, resource, outcome.
5.3 Planes y límites
- Feature gates por plan (free/pro/enterprise)
- Rate limits por plan + cuotas (storage, exports, seats)
- Soft limits con warnings + hard limits con errores claros
Gate multi-tenant (bloquea):
- Cualquier endpoint accede datos sin scope de tenant.
- Falta de modelo de roles por tenant.
6) Modelado financiero / Ledger (cuando aplique)
Recomendado para PyMEs y dominios donde la contabilidad sea core.
6.1 Doble partida (ideal)
Account (chart of accounts)
JournalEntry (cabecera)
Posting/Line (debe balancear: sum(debits) = sum(credits))
Money VO (amount + currency) con reglas de redondeo
6.2 Invariantes (obligatorias si hay ledger)
- Toda entrada debe estar balanceada.
- No mutar entradas posteadas: usar reversal/adjustments.
- Idempotencia por
externalRef (imports, integraciones).
- Periodos de cierre (si aplica) + permisos.
6.3 Reconciliación
- Matching por
externalId, fecha, monto, contrapartida
- Estados:
unreconciled, matched, manual_adjusted
- Reportes reproducibles (misma query → mismo resultado)
Gate ledger (bloquea si ledger activo):
- No existe regla de balanceo.
- Se “edita” el pasado sin trazabilidad (sin reversal).
- No existe estrategia de reconciliación/import.
7) Bases de datos (Postgres/MySQL): índices, reporting, migraciones
7.1 Reglas de schema
- IDs estables (UUID/ULID) + timestamps +
tenantId
- Constraints: FK, unique, check constraints (cuando aplica)
- Índices en:
- (
tenantId, createdAt)
- campos de búsqueda/filtros
- claves naturales (external refs)
7.2 Reporting queries
- Separar queries de reporting del path transaccional si pesan.
- Materialized views / read models (si CQRS).
- Evitar N+1; usar joins y prefetch controlado.
7.3 Migraciones
- Expand/Contract (compatibilidad hacia atrás)
- Migraciones idempotentes
- Tests de migración en CI (cuando posible)
Gate DB (bloquea):
- Tablas sin
tenantId en sistemas multi-tenant.
- Migraciones sin strategy safe deploy.
- Índices ausentes en rutas de consulta críticas.
8) Jobs/Colas (recordatorios, cálculos, agregaciones)
8.1 Selección de tecnología (declarar una)
- BullMQ (Redis) para MVP rápido
- SQS/Rabbit para colas gestionadas / integración enterprise
- Kafka para EDA + streams y alto throughput
8.2 Reglas duras
- Jobs idempotentes (jobKey / dedupe)
- Retries con backoff + jitter
- Dead-letter queue (DLQ) o parking queue
- Observabilidad: métricas de lag, fail rate, processing time
- Rate limit / concurrency control
8.3 Tipos comunes
- Recordatorios/notifications
- Cálculos e insights (agregaciones periódicas)
- Sync/import de datos externos
- Rebuild de proyecciones (si CQRS)
Gate jobs/queues (bloquea):
- Jobs sin idempotencia o sin DLQ.
- Reintentos sin límite ni backoff.
- Sin métricas de cola/worker.
9) Event-driven (cuando se active)
9.1 Outbox pattern (mínimo)
- Insert event en outbox en la misma transacción del write
- Publicador asíncrono con retries + DLQ
- Eventos versionados (schema evolution)
9.2 Event catalog (obligatorio)
EventName + versión
- producer + consumer(s)
- payload schema + PII flags
- retry policy + idempotency rules
Gate EDA (bloquea):
- Publicar evento fuera de transacción sin outbox en flows críticos.
- Consumidores sin idempotencia.
10) Test Strategy (mínimos exigibles)
- Unit: dominio (VOs, invariantes) + reglas core
- Integration: casos de uso con DB (o repos) + idempotencia
- Contract: integraciones externas (mocks verificados)
- Security: tests básicos de authz (role/tenant)
- Migrations: smoke test + rollback plan
11) Formato obligatorio de salida (cuando se active este skill)
Windsurf debe responder con:
- Backend Profile
- API Contract (endpoints/queries, payloads, errores, paginación, versionado)
- Architecture Plan (bounded contexts, capas hexagonales, CQRS/EDA si aplica)
- AuthN/AuthZ Plan (OIDC, roles, policies, MFA opcional)
- Multi-tenant Plan (aislamiento, tenant scoping, límites, planes)
- Data Model Plan (DB schema + índices + migraciones)
- Ledger Plan (si aplica) + invariantes + reconciliación
- Jobs/Queue Plan (tipos, idempotencia, retries, DLQ, métricas)
- Observability Plan (OTel, logs, métricas, health checks)
- Next Steps (accionables)
12) Señales de deuda backend (Windsurf debe advertir)
- APIs sin versión, sin paginación o sin errores estándar.
- Writes sin idempotencia en flujos críticos.
- Multi-tenant “a medias” (queries sin scope).
- AuthZ débil (solo RBAC superficial, sin policies).
- Ledger “anémico” sin balanceo ni reversals.
- Migraciones peligrosas (sin expand/contract).
- Jobs sin DLQ ni idempotencia.
- Sin observabilidad (tracing/metrics/logs estructurados).
End of skill.
1---2name: backend-23description: Skill para diseñar y construir backends y APIs **modulares**, **auditables**, **resilientes** y **multi-tenant**, con seguridad fuerte, modelado correcto (incl. ledger cuando aplique), datos y jobs/colas operables.4---5
6# 🧱 Windsurf Skill — Backend & APIs (Columna vertebral)
7**Skill ID:** SK-BE-API-001
8**Aplica a:** Fintech, Legaltech, Edtech, Healthtech, Retailtech, Proptech, Foodtech, Medtech, Regtech
9**Objetivo:** diseñar y construir backends y APIs **modulares**, **auditables**, **resilientes** y **multi-tenant**, con seguridad fuerte, modelado correcto (incl. ledger cuando aplique), datos y jobs/colas operables.
10
11---
12
13## 0) Backend Profile (output obligatorio)
14Antes de diseñar/codificar, Windsurf debe fijar:
15
16- **API style:** REST | GraphQL | híbrido
17- **Versioning:** URL (`/v1`) | header | schema version (GraphQL)
18- **Stack:** NestJS | FastAPI | Go | Elixir | otro (definir)
19- **Architecture:** DDD + Hexagonal (default) | otra (justificar)
20- **CQRS:** off | on (por módulos) + justificación
21- **Eventing:** none | async events (outbox) | full EDA
22- **Auth:** OAuth2/OIDC + provider (Keycloak/Auth0/Cognito/otro)
23- **Multi-tenant:** single-DB shared | schema-per-tenant | DB-per-tenant (definir)
24- **Data:** Postgres/MySQL/TiDB + Redis + object storage (si aplica)
25- **Jobs/Queue:** BullMQ | SQS | Rabbit | Kafka | otro
26- **Observability:** OTel + logs + metrics + tracing
27- **Risk Tier:** R0–R3 (según regla base)
28
29> Gate: sin Backend Profile explícito, Windsurf **no avanza**; declara supuestos “Hard” + impacto.
30
31---
32
33## 1) Principios (no negociables)
341. **API contract first:** schema + errores + paginación + auth antes de implementar.
352. **Dominio puro:** reglas core viven en `domain/`, sin frameworks.
363. **Writes son sagrados:** idempotencia, validaciones, auditoría y consistencia.
374. **Multi-tenant by design:** toda consulta y comando está “scoped” por `tenantId`.
385. **Operabilidad:** logs estructurados + tracing + métricas + health checks desde MVP.
396. **Evolución segura:** versionado de APIs, migraciones expand/contract, backward compatibility.
40
41---
42
43## 2) Diseño de APIs (REST/GraphQL)
44### 2.1 Reglas generales
45- **Recursos y verbos:** REST orientado a recursos; GraphQL para composición de lectura.
46- **Versionado obligatorio:** no romper contratos sin versión nueva.
47- **Consistencia de responses:**
48 - `data`, `meta`, `errors` (estructura estándar)
49- **Errores tipados:**
50 - `DOMAIN_*`, `VALIDATION_*`, `AUTH_*`, `RATE_LIMIT_*`, `INTEGRATION_*`
51
52### 2.2 Paginación y filtros
53- Preferir **cursor pagination** para listas grandes; offset solo para admin pequeño.
54- Filtros composables: `?status=&from=&to=&q=`.
55- Sorting explícito (`sort=createdAt:desc`).
56
57### 2.3 Idempotencia (obligatoria en writes críticos)
58- Header `Idempotency-Key` (y/o `X-Request-Id`)
59- Persistir resultado por key (Redis o DB) con TTL + estado
60- Retornar la misma respuesta para reintentos
61
62**Gate API (bloquea):**
63- Endpoint transaccional sin idempotencia (cuando aplica).
64- Listas sin paginación.
65- Errores no estandarizados o sin códigos.
66
67---
68
69## 3) Arquitectura (DDD/Hexagonal + modularidad)
70### 3.1 Capas canónicas
71- `domain/`: entities, value objects, domain services, invariants, ports, domain events
72- `application/`: use cases / handlers (CQRS), DTOs, policies, orchestration
73- `infrastructure/`: adapters (db/http/queue), persistence, clients, config
74- `interfaces/`: controllers/resolvers/consumers
75
76### 3.2 CQRS (cuando aplica)
77**Activar CQRS si:**
78- Lecturas complejas (reporting, dashboards) difieren del modelo de escritura
79- Necesitas escalado independiente read/write
80- Event-driven y proyecciones
81
82**Reglas CQRS:**
83- Commands no retornan vistas pesadas (solo IDs o resumen)
84- Queries no mutan estado
85- Proyecciones versionadas + rebuild strategy
86
87**Gate arquitectura (bloquea):**
88- Dominio depende de ORM/framework.
89- Controllers contienen reglas core.
90- CQRS activado sin necesidad (complejidad sin ROI).
91
92---
93
94## 4) AuthN/AuthZ (OIDC, MFA, RBAC/ABAC)
95### 4.1 Autenticación (AuthN)
96- OAuth2/OIDC obligatorio (tokens firmados, introspection si aplica)
97- MFA opcional: requerido por `R2+` o acciones sensibles
98- Sessions/refresh tokens con rotación
99
100### 4.2 Autorización (AuthZ)
101**RBAC mínimo:**
102- Roles por tenant (Owner/Admin/Member/Viewer, etc.)
103- Permisos por acción (CRUD + export + billing + settings)
104
105**ABAC (cuando aplique):**
106- Reglas por atributo: `tenantId`, `plan`, `resourceOwnerId`, `region`, `featureFlags`
107- Policy engine (simple) o middleware centralizado
108
109**Gate Auth (bloquea):**
110- Endpoints sin verificación de `tenantId` y permisos.
111- Token handling inseguro.
112- Acciones sensibles sin MFA (si definido).
113
114---
115
116## 5) Multi-tenant (pymes): aislamiento, roles, límites, planes
117### 5.1 Estrategias de aislamiento (declarar una)
118- **Shared DB + tenant_id** (default MVP)
119- **Schema-per-tenant** (aislamiento medio)
120- **DB-per-tenant** (aislamiento fuerte / enterprise)
121
122### 5.2 Reglas duras multi-tenant
123- Todo request debe derivar `tenantId` desde el token/contexto.
124- Toda query y write deben filtrar por `tenantId` (sin excepciones).
125- Auditoría incluye `tenantId`, `actorId`, `role`, `resource`, `outcome`.
126
127### 5.3 Planes y límites
128- Feature gates por plan (free/pro/enterprise)
129- Rate limits por plan + cuotas (storage, exports, seats)
130- Soft limits con warnings + hard limits con errores claros
131
132**Gate multi-tenant (bloquea):**
133- Cualquier endpoint accede datos sin scope de tenant.
134- Falta de modelo de roles por tenant.
135
136---
137
138## 6) Modelado financiero / Ledger (cuando aplique)
139> Recomendado para PyMEs y dominios donde la contabilidad sea core.
140
141### 6.1 Doble partida (ideal)
142- `Account` (chart of accounts)
143- `JournalEntry` (cabecera)
144- `Posting/Line` (debe balancear: sum(debits) = sum(credits))
145- `Money` VO (amount + currency) con reglas de redondeo
146
147### 6.2 Invariantes (obligatorias si hay ledger)
148- Toda entrada debe estar balanceada.
149- No mutar entradas posteadas: usar reversal/adjustments.
150- Idempotencia por `externalRef` (imports, integraciones).
151- Periodos de cierre (si aplica) + permisos.
152
153### 6.3 Reconciliación
154- Matching por `externalId`, fecha, monto, contrapartida
155- Estados: `unreconciled`, `matched`, `manual_adjusted`
156- Reportes reproducibles (misma query → mismo resultado)
157
158**Gate ledger (bloquea si ledger activo):**
159- No existe regla de balanceo.
160- Se “edita” el pasado sin trazabilidad (sin reversal).
161- No existe estrategia de reconciliación/import.
162
163---
164
165## 7) Bases de datos (Postgres/MySQL): índices, reporting, migraciones
166### 7.1 Reglas de schema
167- IDs estables (UUID/ULID) + timestamps + `tenantId`
168- Constraints: FK, unique, check constraints (cuando aplica)
169- Índices en:
170 - (`tenantId`, `createdAt`)
171 - campos de búsqueda/filtros
172 - claves naturales (external refs)
173
174### 7.2 Reporting queries
175- Separar queries de reporting del path transaccional si pesan.
176- Materialized views / read models (si CQRS).
177- Evitar N+1; usar joins y prefetch controlado.
178
179### 7.3 Migraciones
180- **Expand/Contract** (compatibilidad hacia atrás)
181- Migraciones idempotentes
182- Tests de migración en CI (cuando posible)
183
184**Gate DB (bloquea):**
185- Tablas sin `tenantId` en sistemas multi-tenant.
186- Migraciones sin strategy safe deploy.
187- Índices ausentes en rutas de consulta críticas.
188
189---
190
191## 8) Jobs/Colas (recordatorios, cálculos, agregaciones)
192### 8.1 Selección de tecnología (declarar una)
193- BullMQ (Redis) para MVP rápido
194- SQS/Rabbit para colas gestionadas / integración enterprise
195- Kafka para EDA + streams y alto throughput
196
197### 8.2 Reglas duras
198- Jobs idempotentes (jobKey / dedupe)
199- Retries con backoff + jitter
200- Dead-letter queue (DLQ) o parking queue
201- Observabilidad: métricas de lag, fail rate, processing time
202- Rate limit / concurrency control
203
204### 8.3 Tipos comunes
205- Recordatorios/notifications
206- Cálculos e insights (agregaciones periódicas)
207- Sync/import de datos externos
208- Rebuild de proyecciones (si CQRS)
209
210**Gate jobs/queues (bloquea):**
211- Jobs sin idempotencia o sin DLQ.
212- Reintentos sin límite ni backoff.
213- Sin métricas de cola/worker.
214
215---
216
217## 9) Event-driven (cuando se active)
218### 9.1 Outbox pattern (mínimo)
219- Insert event en outbox en la misma transacción del write
220- Publicador asíncrono con retries + DLQ
221- Eventos versionados (schema evolution)
222
223### 9.2 Event catalog (obligatorio)
224- `EventName` + versión
225- producer + consumer(s)
226- payload schema + PII flags
227- retry policy + idempotency rules
228
229**Gate EDA (bloquea):**
230- Publicar evento fuera de transacción sin outbox en flows críticos.
231- Consumidores sin idempotencia.
232
233---
234
235## 10) Test Strategy (mínimos exigibles)
236- **Unit:** dominio (VOs, invariantes) + reglas core
237- **Integration:** casos de uso con DB (o repos) + idempotencia
238- **Contract:** integraciones externas (mocks verificados)
239- **Security:** tests básicos de authz (role/tenant)
240- **Migrations:** smoke test + rollback plan
241
242---
243
244## 11) Formato obligatorio de salida (cuando se active este skill)
245Windsurf debe responder con:
246
2471) **Backend Profile**
2482) **API Contract** (endpoints/queries, payloads, errores, paginación, versionado)
2493) **Architecture Plan** (bounded contexts, capas hexagonales, CQRS/EDA si aplica)
2504) **AuthN/AuthZ Plan** (OIDC, roles, policies, MFA opcional)
2515) **Multi-tenant Plan** (aislamiento, tenant scoping, límites, planes)
2526) **Data Model Plan** (DB schema + índices + migraciones)
2537) **Ledger Plan** (si aplica) + invariantes + reconciliación
2548) **Jobs/Queue Plan** (tipos, idempotencia, retries, DLQ, métricas)
2559) **Observability Plan** (OTel, logs, métricas, health checks)
25610) **Next Steps** (accionables)
257
258---
259
260## 12) Señales de deuda backend (Windsurf debe advertir)
261- APIs sin versión, sin paginación o sin errores estándar.
262- Writes sin idempotencia en flujos críticos.
263- Multi-tenant “a medias” (queries sin scope).
264- AuthZ débil (solo RBAC superficial, sin policies).
265- Ledger “anémico” sin balanceo ni reversals.
266- Migraciones peligrosas (sin expand/contract).
267- Jobs sin DLQ ni idempotencia.
268- Sin observabilidad (tracing/metrics/logs estructurados).
269
270---
271**End of skill.**