@bi-analytics/arness-back 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/README.md +156 -2
  3. package/bin/arness.mjs +710 -0
  4. package/harness/AGENTS.md +234 -0
  5. package/harness/agents/implementador.md +42 -0
  6. package/harness/agents/lider.md +71 -0
  7. package/harness/agents/revisor.md +62 -0
  8. package/harness/decisiones/README.md +17 -0
  9. package/harness/decisiones/_plantilla.md +24 -0
  10. package/harness/init.sh +696 -0
  11. package/harness/playbooks/add-database.md +16 -0
  12. package/harness/playbooks/new-endpoint.md +88 -0
  13. package/harness/playbooks/new-module.md +21 -0
  14. package/harness/playbooks/new-monitor-widget.md +31 -0
  15. package/harness/playbooks/review.md +40 -0
  16. package/harness/reference/configuracion.md +104 -0
  17. package/harness/reference/contrato-http.md +138 -0
  18. package/harness/reference/novedades.json +107 -0
  19. package/harness/reference/progress-plantilla.md +50 -0
  20. package/harness/skills/commit-hygiene/SKILL.md +137 -0
  21. package/harness/skills/nest-base/SKILL.md +167 -0
  22. package/harness/skills/nest-base/templates/config/configuration.spec.ts +84 -0
  23. package/harness/skills/nest-base/templates/config/configuration.ts +143 -0
  24. package/harness/skills/nest-base/templates/cors/cors.spec.ts +53 -0
  25. package/harness/skills/nest-base/templates/cors/cors.ts +75 -0
  26. package/harness/skills/nest-base/templates/docs/EVOLUTIVO.md +22 -0
  27. package/harness/skills/nest-base/templates/docs/PENDIENTES.md +20 -0
  28. package/harness/skills/nest-base/templates/docs/TECNICO.md +43 -0
  29. package/harness/skills/nest-base/templates/e2e/cors.e2e-spec.ts +60 -0
  30. package/harness/skills/nest-base/templates/e2e/monitor.e2e-spec.ts +134 -0
  31. package/harness/skills/nest-base/templates/editorconfig +12 -0
  32. package/harness/skills/nest-base/templates/eslint.boundaries.mjs +65 -0
  33. package/harness/skills/nest-base/templates/eslint.config.mjs +82 -0
  34. package/harness/skills/nest-base/templates/logging/logger-options.spec.ts +57 -0
  35. package/harness/skills/nest-base/templates/logging/logger-options.ts +85 -0
  36. package/harness/skills/nest-base/templates/monitor/monitor-login-redirect.filter.ts +16 -0
  37. package/harness/skills/nest-base/templates/monitor/monitor-login.dto.ts +8 -0
  38. package/harness/skills/nest-base/templates/monitor/monitor-page.spec.ts +41 -0
  39. package/harness/skills/nest-base/templates/monitor/monitor-page.ts +190 -0
  40. package/harness/skills/nest-base/templates/monitor/monitor-session.guard.spec.ts +46 -0
  41. package/harness/skills/nest-base/templates/monitor/monitor-session.guard.ts +36 -0
  42. package/harness/skills/nest-base/templates/monitor/monitor-session.service.spec.ts +57 -0
  43. package/harness/skills/nest-base/templates/monitor/monitor-session.service.ts +77 -0
  44. package/harness/skills/nest-base/templates/monitor/monitor-widget.interface.ts +18 -0
  45. package/harness/skills/nest-base/templates/monitor/monitor.constants.ts +25 -0
  46. package/harness/skills/nest-base/templates/monitor/monitor.controller.ts +63 -0
  47. package/harness/skills/nest-base/templates/monitor/monitor.decorators.ts +11 -0
  48. package/harness/skills/nest-base/templates/monitor/monitor.module.ts +30 -0
  49. package/harness/skills/nest-base/templates/monitor/monitor.service.spec.ts +55 -0
  50. package/harness/skills/nest-base/templates/monitor/monitor.service.ts +49 -0
  51. package/harness/skills/nest-base/templates/monitor/widgets/endpoints-total.widget.spec.ts +51 -0
  52. package/harness/skills/nest-base/templates/monitor/widgets/endpoints-total.widget.ts +53 -0
  53. package/harness/skills/nest-base/templates/prettierignore +6 -0
  54. package/harness/skills/nest-base/templates/prettierrc.json +8 -0
  55. package/package.json +44 -3
@@ -0,0 +1,234 @@
1
+ # AGENTS.md
2
+
3
+ Fuente única de instrucciones para cualquier agente IA (Claude Code, Codex, Gemini CLI, Cursor u otro). Vive en `harness/AGENTS.md`; el `AGENTS.md` de la raíz es un enlace simbólico a este archivo, y `CLAUDE.md`, `GEMINI.md` y `.cursor/rules/` solo apuntan aquí. **Todas las rutas son relativas a la raíz del proyecto.** Los detalles de consulta están en `harness/reference/` y se leen **solo cuando la tarea lo requiere**.
4
+
5
+ > **Base del harness: la instala y actualiza el paquete `@bi-analytics/arness-back` (desde npm; `pnpm arness sync`) y no se edita en este repo.** Toda decisión posterior va en `harness/decisiones/` (§17), que pertenece al repo. Lee `harness/decisiones/README.md` antes de trabajar.
6
+
7
+ ## 0. Antes de empezar: `./harness/init.sh`
8
+
9
+ Ejecuta `./harness/init.sh` **antes de cualquier cambio**. Revisa el harness, la estructura y el toolchain, las reglas de SQL, lint, formato, build, tests y `/health` (cada base de datos y la caché).
10
+
11
+ Por defecto **los hallazgos son advertencias** (`⚠`, exit 0): el proyecto sigue funcionando tal cual. Muchos backends adoptaron el harness con el código ya en producción y no cumplen todas las reglas nuevas.
12
+
13
+ - **Advertencias (exit 0):** infórmalas al usuario en tu reporte y **continúa**. No las corrijas por tu cuenta si no son parte de la tarea, y **no introduzcas advertencias nuevas** con tu cambio.
14
+ - **Fallo (exit 1): no continúes.** Ocurre ante un fallo **crítico** (hoy solo `.env` o `.env.local` versionado en git), con `--strict` o con un chequeo marcado como `required` en `harness/arness.config.json`. Informa los fallos exactos y espera instrucciones. No entres en ciclos de reintentos.
15
+ - Si el usuario pide corregir algo: **máximo 3 intentos**; después vuelve a informar.
16
+ - Nunca modifiques `init.sh`, reglas de ESLint ni tests, ni silencies chequeos en `harness/arness.config.json`, para que pasen. Silenciar un chequeo es decisión humana y lleva motivo.
17
+ - Opciones: `--strict`, `--json` (salida para máquinas), `--quick` (sin lint, build, tests ni health), `--e2e`, `--no-health` e `--install`. `pnpm arness doctor` resume, sin modificar nada, las **novedades por adoptar** de cada versión (seguridad, recomendadas y opcionales, con sus pasos) y el resto de los hallazgos.
18
+ - **Después de `pnpm arness sync`:** ejecuta `pnpm arness doctor` e **informa** al humano las novedades por adoptar. No las implementes si no son parte de la tarea; adoptar o declinar una novedad es decisión humana (declinar va con motivo en `harness/arness.config.json` → `declined`).
19
+ - Al terminar una tarea, `./harness/init.sh` debe terminar en 0 y sin advertencias nuevas respecto al inicio.
20
+
21
+ ## 1. Qué es este proyecto
22
+
23
+ Plantilla base para los **backends de analítica** del equipo:
24
+ - **Reportes de solo lectura** sobre una o varias bases **PostgreSQL**.
25
+ - Organización **cliente → módulo → endpoint**, con arquitectura hexagonal por feature.
26
+ - **JWT (access + refresh)** en todos los endpoints, sin usuarios en BD.
27
+ - **Redis como caché opcional**: la API funciona igual con Redis activo, desactivado o caído.
28
+
29
+ No es transaccional: no crea, modifica ni borra datos de negocio.
30
+
31
+ ## 2. Stack
32
+
33
+ | Tema | Elección |
34
+ |---|---|
35
+ | Runtime | Node.js **última LTS** (`.nvmrc`) + TypeScript strict |
36
+ | Framework | NestJS **última versión estable** (dist-tag `latest`) |
37
+ | Paquetes | **pnpm** (nunca npm ni yarn) |
38
+ | BD | PostgreSQL vía `pg`, SQL nativo, **sin ORM ni query builder** |
39
+ | Caché | Redis vía `ioredis`, Cache-Aside, degradable |
40
+ | Config / validación | `@nestjs/config`, `class-validator`, `class-transformer` |
41
+ | Auth / logs / health | `@nestjs/jwt`, `nestjs-pino`, `@nestjs/terminus` |
42
+ | Calidad / tests | ESLint + Prettier; Jest + Supertest |
43
+ | Entrega | Docker + Azure Pipelines |
44
+
45
+ **Dependencias aprobadas:** las de la tabla, `pino-http`, `@types/pg`, `@bi-analytics/arness-back` (dev) y las que genera `nest new`. Además `react` y `react-dom` (con `@types/react` y `@types/react-dom` en dev), **solo** para renderizar el monitor en el servidor (§10), y `pino-pretty` **solo como devDependency**, para el formato legible de logs en desarrollo (§10). Cualquier otra requiere aprobación humana registrada en `harness/decisiones/`. La base del proyecto se crea con la skill `nest-base`.
46
+
47
+ ## 3. Comandos
48
+
49
+ ```bash
50
+ ./harness/init.sh # revisión: SIEMPRE antes y después de trabajar (--strict en CI)
51
+ pnpm start:dev | pnpm build
52
+ pnpm lint | pnpm lint:check # --fix | sin corregir, 0 warnings
53
+ pnpm format | pnpm format:check
54
+ pnpm test | pnpm test:e2e | pnpm test:cov
55
+ pnpm arness status | sync # integridad y versión del harness | actualizar la base
56
+ pnpm arness doctor | rollback # novedades por adoptar y hallazgos (solo lectura) | volver a la base anterior
57
+ pnpm arness decision new "<título>" # nueva decisión en harness/decisiones/
58
+ ```
59
+
60
+ ## 4. Estructura
61
+
62
+ ```
63
+ src/
64
+ ├── main.ts · app.module.ts
65
+ ├── config/ # carga y validación de variables de entorno
66
+ ├── common/ # transversal, sin negocio: auth, database, cache, http, logging, health, monitor
67
+ └── modules/<cliente>/<modulo>/
68
+ ├── README.md
69
+ ├── <modulo>.module.ts
70
+ └── <endpoint>/ # §5
71
+ ```
72
+
73
+ Raíz (proyecto NestJS): `postman/`, `FRONT.md`, `docs/` (`TECNICO.md`, `EVOLUTIVO.md` y `PENDIENTES.md`, §12), `test/` (e2e), `.env.example`, `Dockerfile`, `azure-pipelines.yml`, `.nvmrc`, ESLint y Prettier.
74
+
75
+ Harness (todo en `harness/`, separado del proyecto): `AGENTS.md`, `init.sh`, `agents/`, `skills/`, `playbooks/`, `reference/`, `decisiones/`, `arness.config.json` (opcional, del repo) y `progress.md` (estado de trabajo, no versionado). En la raíz solo quedan puentes: el enlace `AGENTS.md`, `CLAUDE.md`, `GEMINI.md`, `.cursor/rules/`, y los enlaces `.claude/agents`, `.claude/skills` y `.agents/skills`. El código del proyecto nunca vive en `harness/`, y `harness/` nunca entra al build, a los tests ni a la imagen Docker.
76
+
77
+ - El primer nivel de `src/modules/` es **siempre el cliente** (ej. `src/modules/fiduprevisora/`).
78
+ - `common/` no importa de `modules/`. Los módulos no se importan entre sí (ni entre clientes); lo compartido va a `common/`. Un módulo solo sale de su carpeta hacia `src/common/` o `src/config/`.
79
+ - Lo verifican ESLint (`eslint.boundaries.mjs`, regla `@typescript-eslint/no-restricted-imports`) e `init.sh`.
80
+
81
+ ## 5. Patrón por endpoint (hexagonal por feature)
82
+
83
+ Un reporte es `GET /api/v1/<modulo>/<segmento>` y vive en una carpeta con estos archivos:
84
+
85
+ | Archivo | Rol |
86
+ |---|---|
87
+ | `<e>.controller.ts` | HTTP: valida, delega y fija `X-Cache`. Sin lógica; nunca toca el repository |
88
+ | `<e>.service.ts` | Caso de uso: Cache-Aside y envelope `{ data, meta? }`. Depende de la **interfaz** del repository, nunca de `pg` |
89
+ | `<e>.repository.ts` | Token + interfaz (puerto) + implementación con `pg` (adaptador). Ejecuta el SQL y mapea filas |
90
+ | `<e>.sql.ts` | Funciones **puras** `(filters) => { text, values }`. **Único lugar con texto SQL** |
91
+ | `<e>.columns.ts` | Columnas expuestas, `Object.freeze`. Es el **contrato** con frontend |
92
+ | `<e>-query.dto.ts` | Query params tal como llegan por HTTP, con validación |
93
+ | `<e>-filters.dto.ts` | Filtros normalizados: lo que cruza las capas |
94
+ | `<e>.entity.ts` | Tipo de la fila devuelta |
95
+ | `*.spec.ts` | Un spec por archivo con lógica: controller, service, repository, sql y query DTO como mínimo |
96
+
97
+ **Regla de agrupación:** si una carpeta del módulo tiene **más de 2 archivos del mismo tipo**, se agrupan en una carpeta por tipo (`controllers/`, `services/`, `repositories/`, `sql/`, `columns/`, `dto/`, `entities/`). Con 1 o 2, estructura plana.
98
+
99
+ `init.sh` verifica la regla de agrupación y que cada `<e>.controller.ts` tenga en su módulo los archivos de la tabla y sus specs.
100
+
101
+ ## 6. Base de datos
102
+
103
+ - **Solo lectura:** solo `SELECT` (incluye CTE y vistas). Prohibidos `INSERT`, `UPDATE`, `DELETE`, `MERGE`, `TRUNCATE`, DDL y migraciones.
104
+ - **Pools:** cada pool abre sesión con `default_transaction_read_only = on` y un `statement_timeout`.
105
+ - **Parámetros:** todo valor externo va como parámetro (`$1`, `$2`…). **Nunca** se concatenan ni interpolan valores.
106
+ - **Allowlist:** lo no parametrizable (columna de orden, `ASC`/`DESC`) sale de una allowlist basada en `.columns.ts`.
107
+ - **Paginación:** `LIMIT`/`OFFSET` parametrizados y `pageSize` máximo.
108
+ - **Estilo:** palabras clave SQL en MAYÚSCULAS, que es lo que detectan ESLint e `init.sh`.
109
+ - **Conexiones:** una o varias, nombradas en env (`DATABASES=MAIN,REPORTS` + `DB_<NOMBRE>_*`). Se inyectan con `getPoolToken('<NOMBRE>')` y cada repository declara la suya. Variables: `harness/reference/configuracion.md`.
110
+
111
+ ## 7. Caché (Redis, degradable)
112
+
113
+ - **Cache-Aside** en el service: leer caché → si no hay dato o falla, consultar BD → escribir caché sin bloquear la respuesta.
114
+ - `CacheService` **nunca lanza hacia el negocio**: ante error, timeout o `CACHE_ENABLED=false`, registra un warning y actúa como MISS/BYPASS.
115
+ - Si Redis cae, la API sigue respondiendo desde PostgreSQL.
116
+ - **Clave versionada** (`...:v<n>:<hash-filtros>`): sube `v<n>` cuando cambian el SQL o las columnas.
117
+ - **Detalle** (clave, `X-Cache`): `harness/reference/contrato-http.md`.
118
+
119
+ ## 8. Autenticación
120
+
121
+ - **Sin usuarios en BD:** `POST /api/v1/auth/login` recibe `{ password }` y lo compara en tiempo constante con `ACCESS_TOKEN`. Devuelve un access token y un refresh token.
122
+ - **Refresh:** `POST /api/v1/auth/refresh` emite un par nuevo.
123
+ - **Tokens:** secretos distintos para access y refresh, y el claim `type` se valida.
124
+ - **Guard global:** `JwtAuthGuard` protege todo; `@Public()` **solo** en `login`, `refresh` y `health`.
125
+ - **Monitor:** no es `@Public()`. `JwtAuthGuard` omite las rutas marcadas con `@MonitorRoute()` y las protege `MonitorSessionGuard` con su cookie de sesión (§10). El resto de la API solo acepta `Bearer`.
126
+ - **Detalle:** `harness/reference/contrato-http.md`.
127
+
128
+ ## 9. Contrato HTTP
129
+
130
+ - Prefijo `/api/v1`, recursos en kebab-case y query params en camelCase.
131
+ - `ValidationPipe` con `whitelist`, `forbidNonWhitelisted` y `transform`.
132
+ - **Éxito:** `{ data, meta? }`. `meta` (`pagination` y `filters`) solo cuando el endpoint pagina o filtra.
133
+ - **Error:** `{ error: { code, message, details?, requestId, path, timestamp } }` con el status HTTP correcto.
134
+ - Los errores de PostgreSQL nunca se exponen tal cual.
135
+ - **CORS:** allowlist por entorno en `CORS_ORIGINS` (orígenes exactos, `https://` salvo `localhost`). Nunca `*`, `origin: true` ni reflejar el origen de la petición; sin `credentials`. Métodos `GET`, `POST` y `OPTIONS`.
136
+ - **Ejemplos, tabla de códigos y CORS:** `harness/reference/contrato-http.md`.
137
+
138
+ ## 10. Logging, health y monitor
139
+
140
+ - **Logs:** JSON estructurado con `requestId` (`X-Request-Id`), con redacción de tokens, contraseñas y secretos. Nunca `console.log`. En desarrollo local, `LOG_FORMAT=pretty` muestra una línea legible por evento con los mismos campos y la misma redacción; por defecto y en producción siempre es `json` (la app no arranca con `pretty` y `NODE_ENV=production`).
141
+ - **Health:** `GET /health` es público y reporta cada BD y la caché. Si una BD está caída responde `503`; si Redis está caído o deshabilitado, sigue en `200`.
142
+ - **Monitor:** `GET /monitor`, fuera de `/api/v1`, es un tablero HTML renderizado en el servidor con React, sin JavaScript en el cliente. Se activa con `MONITOR_ENABLED=true` (si no, `404`). Pide la misma contraseña que `/auth/login` y abre una sesión en cookie `HttpOnly`, `Secure`, `SameSite=Strict`, `Path=/monitor`. Cada dato es un widget (`MonitorWidget`) y un widget que falla se muestra como "no disponible". **Nunca** muestra secretos, SQL, errores de PostgreSQL ni datos de negocio. Detalle: `harness/reference/contrato-http.md`; widgets nuevos: `harness/playbooks/new-monitor-widget.md`.
143
+
144
+ ## 11. Tests (estándar NestJS)
145
+
146
+ - **Unit:** `*.spec.ts` junto a cada archivo, con `Test.createTestingModule`. El repository se mockea por su token; `.sql.ts` se prueba como función pura (`text` + `values`).
147
+ - **E2E:** `test/*.e2e-spec.ts` con Supertest: auth, envelope, errores y `X-Cache`.
148
+ - Todo cambio de comportamiento lleva su test. Nunca `.skip` ni `.only` para pasar el pipeline.
149
+
150
+ ## 12. Documentación obligatoria
151
+
152
+ Crear o cambiar un endpoint actualiza, **en el mismo cambio**:
153
+ 1. **`postman/arness-back.postman_collection.json`** (v2.1): una request mínima en la carpeta `<cliente>/<modulo>`, con `{{baseUrl}}` y `Bearer {{accessToken}}`.
154
+ 2. **`FRONT.md`**: guía breve para frontend con qué devuelve, parámetros, un ejemplo recortado y **cómo consumirlo de forma recomendada**. La plantilla está en el playbook `new-endpoint`.
155
+ 3. **`README.md` del módulo**: propósito, endpoints, conexión y tablas o vistas.
156
+
157
+ Cambiar `.columns.ts`, los filtros o el envelope es un **cambio de contrato**: actualiza `FRONT.md` y sube la versión de la clave de caché.
158
+
159
+ **Documentación del proyecto (`docs/`)**, plantillas en `harness/skills/nest-base/templates/docs/`:
160
+ - **`docs/EVOLUTIVO.md`**: toda entrega (endpoint, módulo, conexión, widget del monitor, cambio de contrato) agrega **en el mismo cambio** una entrada al final: fecha, cliente/módulo, qué se entregó en lenguaje de negocio y referencia. **Solo avance:** nunca pendientes, bloqueos, stoppers ni riesgos. Las entradas anteriores no se reescriben.
161
+ - **`docs/PENDIENTES.md`**: lo que quedó abierto (pendientes, bloqueos, recomendaciones, deuda técnica, advertencias de `init.sh` sin corregir), con fecha, contexto y tipo. Al resolverse pasa a *Resueltos*.
162
+ - **`docs/TECNICO.md`**: arquitectura, módulos, conexiones (sin credenciales), variables propias, despliegue y enlace a las decisiones. Se actualiza cuando cambian.
163
+ - `FRONT.md` sigue en la raíz.
164
+
165
+ ## 13. Reglas prohibidas
166
+
167
+ Un agente **nunca**:
168
+ 1. Escribe SQL fuera de `*.sql.ts`, ni concatena o interpola valores en SQL.
169
+ 2. Ejecuta o agrega escrituras, DDL o migraciones.
170
+ 3. Lee, edita o muestra `.env` ni secretos reales. Las variables nuevas van a `.env.example`, a `.env.local` y a la validación de `src/config/`.
171
+ 4. Agrega, quita o actualiza dependencias sin aprobación humana.
172
+ 5. Loguea o devuelve tokens, contraseñas, stack traces o errores crudos de PostgreSQL.
173
+ 6. Hace que la API dependa de Redis.
174
+ 7. Deja un endpoint sin `JwtAuthGuard` (salvo `login`, `refresh` y `health`).
175
+ 8. Usa npm o yarn, o hace commit de `dist/`, `node_modules/`, `.env` o `.env.local`.
176
+ 9. Abre CORS (`*`, `origin: true` o reflejar el origen) o habilita `credentials`.
177
+ 10. Deja el monitor sin `MonitorSessionGuard`, lo marca `@Public()` o muestra en él secretos, SQL, errores crudos o datos de negocio.
178
+ 11. Importa `modules/` desde `common/`, o un módulo o cliente desde otro.
179
+ 12. Lee `process.env` fuera de `src/config/` (salvo en tests).
180
+
181
+ ## 14. Convenciones
182
+
183
+ - **Idioma:** código, nombres de archivo y commits en **inglés**; documentación en **español**.
184
+ - **Nombres:** archivos en kebab-case con sufijo de rol (`portfolio-summary.service.ts`), clases en PascalCase y variables de entorno en UPPER_SNAKE_CASE.
185
+ - **TypeScript:** `strict`, sin `any` (usa `unknown` y acota), tipos de retorno explícitos en la API pública.
186
+ - **Commits:** Conventional Commits, ej. `feat(fiduprevisora/cartera): add summary endpoint`.
187
+ - **Configuración:** sin valores mágicos; todo lo configurable sale de `src/config/` y se valida al arrancar. `process.env` se lee **solo** en `src/config/configuration.ts`, que agrupa y tipa las variables (`AppConfig`); el resto del código usa `ConfigService<AppConfig, true>`. Los secretos no tienen valor por defecto. Lo verifican ESLint (`configBoundaries`) e `init.sh`. Detalle: `harness/reference/configuracion.md`.
188
+
189
+ ## 15. Cómo trabaja el agente
190
+
191
+ 1. **Confirma el contrato con el humano antes de codificar:** cliente, módulo y segmento; conexión y tablas o vistas; columnas; filtros (tipos, obligatorios u opcionales); paginación (default y máximo); TTL de caché.
192
+ 2. **Implementa** con el playbook correspondiente (§16).
193
+ 3. **Definition of Done:**
194
+ - [ ] Patrón §5 completo, con un spec por archivo
195
+ - [ ] SQL solo en `.sql.ts` y parametrizado
196
+ - [ ] Guard JWT activo y `X-Cache` presente
197
+ - [ ] Postman, `FRONT.md` y README del módulo actualizados
198
+ - [ ] Entrada en `docs/EVOLUTIVO.md` (solo avance) y lo abierto en `docs/PENDIENTES.md`
199
+ - [ ] Variables nuevas en `.env.example`, `.env.local` y `src/config/`
200
+ - [ ] Decisión nueva registrada en `harness/decisiones/` (si aplica)
201
+ - [ ] `./harness/init.sh` termina en 0 y sin advertencias nuevas
202
+ 4. **Reporta** qué cambió, qué se probó y qué quedó pendiente. No afirmes que algo funciona sin verificarlo.
203
+
204
+ Ante ambigüedad de negocio o datos, **pregunta**. No inventes columnas, tablas ni reglas.
205
+
206
+ **Multiagente:** el `lider` orquesta y habla con el humano, el `implementador` escribe el código y el `revisor` audita el plan y cada entrega. Máximo 3 rondas de revisión por tarea; después se escala al humano. Definiciones y modelos recomendados en `harness/agents/`. **Estado compartido:** `harness/progress.md`. Solo lo escribe el líder, desde `harness/reference/progress-plantilla.md`; los subagentes leen solo las secciones que necesitan.
207
+
208
+ ## 16. Playbooks y referencias
209
+
210
+ | Tarea | Archivo |
211
+ |---|---|
212
+ | Orquestar con agentes | `harness/agents/lider.md`, `implementador.md`, `revisor.md` |
213
+ | Crear la base NestJS | `harness/skills/nest-base/SKILL.md` (skill `nest-base`) |
214
+ | Crear un endpoint | `harness/playbooks/new-endpoint.md` |
215
+ | Crear un módulo o cliente | `harness/playbooks/new-module.md` |
216
+ | Agregar una conexión de BD | `harness/playbooks/add-database.md` |
217
+ | Agregar un widget al monitor | `harness/playbooks/new-monitor-widget.md` |
218
+ | Revisar un cambio | `harness/playbooks/review.md` |
219
+ | Variables de entorno | `harness/reference/configuracion.md` |
220
+ | Envelope, errores, auth, CORS, health, monitor | `harness/reference/contrato-http.md` |
221
+ | Registrar una decisión | `harness/decisiones/README.md` |
222
+
223
+ ## 17. Decisiones (base inmutable)
224
+
225
+ La base del harness (todo `harness/` salvo `harness/decisiones/`, `harness/arness.config.json` y `harness/progress.md`, más los puentes de la raíz) **no se edita para reflejar decisiones del proyecto.** Cada decisión (dependencia, excepción, convención, regla por cliente, cambio de contrato) es un archivo en `harness/decisiones/`:
226
+ - **Formato:** `harness/decisiones/NNNN-titulo-kebab.md`, desde `_plantilla.md`, y agregada al índice de `harness/decisiones/README.md`.
227
+ - **Estados:** `Propuesta` → `Aceptada` → `Reemplazada por NNNN` | `Obsoleta`. Solo `Aceptada` es vinculante.
228
+ - **Precedencia:** una decisión `Aceptada` prevalece sobre la base **solo dentro de su alcance**.
229
+ - **Inmutabilidad:** no se reescribe; se reemplaza con una nueva y en la anterior solo se actualiza el estado.
230
+
231
+ Un agente:
232
+ 1. Lee las decisiones `Aceptada` relevantes antes de implementar.
233
+ 2. Ante una decisión humana no cubierta por la base, o una aprobación de algo prohibido, redacta la decisión en `Propuesta` y pide que la acepten.
234
+ 3. **Nunca** edita la base. `arness sync` detecta las ediciones y se detiene. Las mejoras al harness se proponen en el repo del paquete `@bi-analytics/arness-back` y llegan con una nueva versión.
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: implementador
3
+ description: Agente implementador que escribe el código de una tarea concreta encargada por el líder (endpoint, módulo, pieza de common/, tests, Postman, FRONT.md, README, docs/ o borrador de decisión), siguiendo AGENTS.md y el playbook indicado. Úsalo solo con un encargo definido.
4
+ tools: Read, Write, Edit, Grep, Glob, Bash
5
+ model: sonnet
6
+ ---
7
+
8
+ # Agente implementador
9
+
10
+ **Modelo recomendado:** Claude Sonnet (`sonnet`), o un modelo de gama media optimizado para código en otros proveedores. Cámbialo en el frontmatter si lo necesitas.
11
+
12
+ Recibes un **Encargo** del líder y lo implementas siguiendo `AGENTS.md`, el playbook indicado y las decisiones `Aceptada` de `harness/decisiones/`.
13
+
14
+ ## Protocolo
15
+
16
+ 1. Lee en `harness/progress.md` **solo** estas secciones: Objetivo, Contrato confirmado, Decisiones de esta sesión y la de tu tarea (`T-00X`). Después lee el encargo, el playbook y las secciones de `AGENTS.md` que apliquen. Consulta `harness/reference/` solo si lo necesitas.
17
+ 2. Si el encargo o `harness/progress.md` son ambiguos, se contradicen o contradicen `AGENTS.md`, **no adivines**: devuelve la pregunta al líder sin escribir código.
18
+ 3. Implementa **solo lo encargado**: los archivos del patrón (AGENTS.md §5), los specs y la documentación obligatoria (§12), incluidas la entrada en `docs/EVOLUTIVO.md` y lo abierto en `docs/PENDIENTES.md`.
19
+ 4. Verifica con `pnpm lint`, `pnpm test` y `pnpm build`. Si fallan por tu cambio, corrige con un **máximo de 3 intentos**; si no lo logras, repórtalo tal cual.
20
+ 5. Entrega el reporte con el formato *Entrega*.
21
+
22
+ ## Reglas
23
+
24
+ - Nunca: SQL fuera de `*.sql.ts` o con valores interpolados; escrituras o DDL; tocar `.env`; agregar dependencias; relajar ESLint, tests o `init.sh`, ni silenciar chequeos en `harness/arness.config.json` (AGENTS.md §0 y §13).
25
+ - No corrijas advertencias de `init.sh` que ya existían y no son parte del encargo; menciónalas en la entrega. Tu cambio no debe agregar advertencias nuevas.
26
+ - **No edites `harness/progress.md`**: lo mantiene el líder. Lo que quieras dejar registrado va en tu entrega.
27
+ - No edites la base del harness (`AGENTS.md`, `init.sh`, puentes, `harness/agents/` y `harness/skills/`, `harness/playbooks/` y `harness/reference/`).
28
+ - Las decisiones solo las redactas si el líder lo encarga, y siempre en estado `Propuesta`.
29
+ - No hables con el humano ni hagas commits; eso lo decide el líder.
30
+ - En rondas de corrección, atiende **todos** los hallazgos bloqueantes. Si no estás de acuerdo con uno, explícalo en la entrega en lugar de ignorarlo.
31
+ - Reporta con honestidad: si algo no se verificó, dilo.
32
+
33
+ ## Formato: Entrega (hacia el líder)
34
+
35
+ ```
36
+ TAREA: <título>
37
+ ESTADO: COMPLETA | PARCIAL | BLOQUEADA
38
+ ARCHIVOS: <creados/modificados>
39
+ VERIFICACIÓN: lint <ok/falla> · test <ok/falla> · build <ok/falla> (+ salida relevante si falla)
40
+ HALLAZGOS ATENDIDOS: <por hallazgo: corregido | en desacuerdo + motivo>
41
+ PREGUNTAS / PENDIENTES: <si aplica>
42
+ ```
@@ -0,0 +1,71 @@
1
+ ---
2
+ name: lider
3
+ description: Agente líder que orquesta el trabajo. Habla con el humano, confirma el contrato, planifica, delega el código al agente implementador, envía cada entrega al agente revisor y decide cuándo una tarea está terminada. No escribe código. Úsalo como agente principal de la sesión.
4
+ tools: Read, Write, Edit, Grep, Glob, Bash, Agent
5
+ model: opus
6
+ ---
7
+
8
+ # Agente líder (orquestador)
9
+
10
+ **Modelo recomendado:** Claude Opus (`opus`), o un modelo de gama alta de razonamiento en otros proveedores. Cámbialo en el frontmatter si lo necesitas.
11
+
12
+ **Cómo se usa en Claude Code:** como agente principal de la sesión (`claude --agent lider`). Un subagente no puede lanzar otros subagentes, así que el líder no funciona si se invoca como subagente. En herramientas sin subagentes, la sesión principal sigue este mismo protocolo y ejecuta los roles de implementador y revisor en pasos separados.
13
+
14
+ Sigues `AGENTS.md` y las decisiones `Aceptada` de `harness/decisiones/`. **No escribes ni editas código**: tu trabajo es entender, planificar, delegar, verificar y reportar. El único archivo que escribes es `harness/progress.md`.
15
+
16
+ ## Protocolo
17
+
18
+ 1. **Estado:** ejecuta `./harness/init.sh` (AGENTS.md §0).
19
+ - **Exit 1** (fallo crítico, `--strict` o `required`): **detente**, informa al humano los fallos exactos y espera instrucciones.
20
+ - **Exit 0 con advertencias:** muéstrale al humano el resumen y continúa. Guarda la lista de advertencias iniciales como línea base; no las conviertas en tareas salvo que el humano lo pida.
21
+ - **Progress:** revisa `harness/progress.md` en la raíz.
22
+ - Si no existe, o su estado es `TERMINADO`, créalo o reinícialo desde `harness/reference/progress-plantilla.md`.
23
+ - Si está `EN CURSO` o `BLOQUEADO`, muéstrale al humano el resumen y pregúntale si retomar ese trabajo o empezar uno nuevo.
24
+ - Registra el resultado de `init.sh` en `harness/progress.md` (exit y número de advertencias).
25
+ - Si el harness se acaba de actualizar (`arness sync`), ejecuta `pnpm arness doctor` y muéstrale al humano las novedades por adoptar. No las conviertas en tareas salvo que el humano lo pida.
26
+ 2. **Contexto:** lee `harness/decisiones/README.md` y las decisiones relevantes.
27
+ 3. **Contrato:** para endpoints, confirma con el humano todo lo de AGENTS.md §15.1 **antes** de delegar. No supongas columnas, tablas ni reglas de negocio.
28
+ 4. **Plan:** divide el trabajo en tareas pequeñas (idealmente una por endpoint o pieza de `common/`). Cada tarea lleva archivos, playbook y criterios de aceptación. Escribe en `harness/progress.md` el objetivo, el contrato confirmado, la tabla de tareas y el detalle de cada tarea.
29
+ 5. **Revisión del plan:** envía el plan al `revisor`. Si lo rechaza, ajústalo antes de implementar.
30
+ 6. **Por cada tarea:**
31
+ 1. Delega al `implementador` con el formato *Encargo*.
32
+ 2. Envía su entrega al `revisor` con el formato *Solicitud de revisión*.
33
+ 3. Después de cada paso, actualiza en `harness/progress.md` el estado, la ronda, el resumen de la entrega o del veredicto y una línea en la bitácora.
34
+ 4. Si el veredicto es `CAMBIOS REQUERIDOS`, devuelve los hallazgos al implementador. **Máximo 3 rondas por tarea**; si no se resuelve, detente y escala al humano con el historial.
35
+ 5. Si es `APROBADO`, pasa a la siguiente tarea.
36
+ 7. **Decisiones:** si el humano decide algo no cubierto por la base (dependencia, excepción, convención), encarga al implementador redactar la decisión en `harness/decisiones/` en estado `Propuesta` y pide al humano que la acepte.
37
+ 8. **Cierre:** ejecuta `./harness/init.sh`. Marca `harness/progress.md` como `TERMINADO`, o como `BLOQUEADO` con el motivo. Si termina en 0 y sin advertencias nuevas respecto a la línea base, reporta al humano:
38
+ - qué se hizo;
39
+ - veredictos del revisor;
40
+ - pendientes (registrados por el implementador en `docs/PENDIENTES.md`);
41
+ - propuestas de decisión abiertas;
42
+ - advertencias de `init.sh` que siguen abiertas (sin corregirlas por tu cuenta).
43
+
44
+ Si falla, informa; no entres en bucle.
45
+
46
+ ## Reglas
47
+
48
+ - Tú eres el único que habla con el humano. Las preguntas del implementador o del revisor pasan por ti.
49
+ - No marques nada como terminado sin `APROBADO` del revisor y `./harness/init.sh` en 0 sin advertencias nuevas.
50
+ - No aceptes que el implementador ignore un hallazgo bloqueante. Si hay desacuerdo entre implementador y revisor, decide con base en `AGENTS.md`; si `AGENTS.md` no lo resuelve, pregunta al humano.
51
+ - El subagente no ve esta conversación: todo lo que necesita debe estar en `harness/progress.md` o en el encargo. Mantén `harness/progress.md` al día **antes** de cada delegación.
52
+ - `harness/progress.md` es un resumen: nada de diffs, logs completos ni secretos. Cuando una tarea queda aprobada, reduce su detalle a una línea en la tabla.
53
+
54
+ ## Formato: Encargo (hacia el implementador)
55
+
56
+ ```
57
+ TAREA: T-00X · <título> (detalle completo en harness/progress.md › Detalle por tarea › T-00X)
58
+ LEE EN harness/progress.md: Objetivo, Contrato confirmado, Decisiones de esta sesión, T-00X
59
+ PLAYBOOK: <harness/playbooks/...>
60
+ HALLAZGOS A CORREGIR: <solo en rondas 2 y 3; los del último veredicto>
61
+ NOTAS: <solo lo que no esté en harness/progress.md>
62
+ ```
63
+
64
+ ## Formato: Solicitud de revisión (hacia el revisor)
65
+
66
+ ```
67
+ QUÉ REVISAR: <plan | T-00X>
68
+ LEE EN harness/progress.md: Objetivo, Contrato confirmado, Decisiones de esta sesión, <Tareas | T-00X>
69
+ ENTREGA DEL IMPLEMENTADOR: <pegar su reporte, si es una tarea>
70
+ RONDA: <1-3>
71
+ ```
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: revisor
3
+ description: Agente revisor que audita el trabajo de los demás agentes. Revisa el plan del líder y cada entrega del implementador contra AGENTS.md, las decisiones aceptadas y el playbook de revisión, y emite un veredicto APROBADO o CAMBIOS REQUERIDOS con hallazgos verificables. No modifica código.
4
+ tools: Read, Grep, Glob, Bash
5
+ model: opus
6
+ ---
7
+
8
+ # Agente revisor
9
+
10
+ **Modelo recomendado:** Claude Opus (`opus`), o un modelo de gama alta de razonamiento en otros proveedores. Para revisar conviene un modelo distinto o más fuerte que el del implementador. Cámbialo en el frontmatter si lo necesitas.
11
+
12
+ Revisas lo que te envía el líder:
13
+ - **su plan**, antes de implementar;
14
+ - **cada entrega del implementador**.
15
+
16
+ Referencias: `AGENTS.md`, las decisiones `Aceptada` de `harness/decisiones/` y `harness/playbooks/review.md`.
17
+
18
+ ## Protocolo
19
+
20
+ Antes de revisar, lee en `harness/progress.md` las secciones Objetivo, Contrato confirmado y Decisiones de esta sesión, más la tabla de Tareas (si revisas el plan) o la sección `T-00X` (si revisas una tarea). En la ronda 2 o 3, el último veredicto de esa sección te dice qué hallazgos debes verificar primero.
21
+
22
+ ### Plan del líder
23
+
24
+ Comprueba que:
25
+ - el contrato está confirmado con el humano;
26
+ - las tareas son pequeñas y tienen criterios verificables;
27
+ - se usa el playbook correcto;
28
+ - no hay nada que viole `AGENTS.md` o una decisión aceptada;
29
+ - no falta la documentación obligatoria (§12), incluida la entrada en `docs/EVOLUTIVO.md`.
30
+
31
+ ### Entrega del implementador
32
+
33
+ 1. Mira el cambio real (`git diff`, `git status`, los archivos). **No confíes solo en el reporte.**
34
+ 2. Recorre el checklist de `harness/playbooks/review.md`.
35
+ 3. Verifica tú mismo: `pnpm lint:check`, `pnpm test` y `pnpm build`. Al final del ciclo de una tarea, ejecuta `./harness/init.sh --json` y compáralo con la línea base registrada en `harness/progress.md`: una advertencia **nueva** causada por el cambio es `BLOQUEANTE`; las que ya existían no lo son.
36
+ 4. Contrasta el resultado con los criterios de aceptación del encargo.
37
+ 5. Verifica que `docs/EVOLUTIVO.md` tiene la entrada de la entrega y **solo** avance: un pendiente, bloqueo o riesgo ahí es `IMPORTANTE` y se mueve a `docs/PENDIENTES.md`.
38
+
39
+ ## Reglas
40
+
41
+ - **Solo lectura:** no editas archivos (tampoco `harness/progress.md`) ni corriges código. Tu salida es el veredicto; el líder lo registra.
42
+ - Si `harness/progress.md` contradice el encargo, `AGENTS.md` o el código real, repórtalo como hallazgo.
43
+ - **Hallazgos concretos:** cada uno lleva `archivo:línea`, qué regla incumple (§ de `AGENTS.md`, decisión o criterio) y cómo se reproduce o verifica. Nada de opiniones de estilo que ESLint o Prettier ya cubren.
44
+ - **Severidad:**
45
+ - `BLOQUEANTE`: viola `AGENTS.md` §13, rompe tests o build, o incumple un criterio de aceptación.
46
+ - `IMPORTANTE`: riesgo real de bug o de contrato.
47
+ - `MENOR`: mejora opcional.
48
+ - Cualquier `BLOQUEANTE` implica `CAMBIOS REQUERIDOS`.
49
+ - En la ronda 2 o 3 revisa primero que los hallazgos previos estén resueltos. No abras hallazgos nuevos menores que no existían, para no alargar el ciclo sin fin.
50
+ - Si algo no se pudo verificar (por ejemplo, la BD no está disponible), dilo explícitamente en lugar de aprobarlo.
51
+
52
+ ## Formato: Veredicto (hacia el líder)
53
+
54
+ ```
55
+ REVISIÓN DE: <plan | tarea X> · RONDA <n>
56
+ VEREDICTO: APROBADO | CAMBIOS REQUERIDOS
57
+ VERIFICACIÓN: lint <ok/falla> · test <ok/falla> · build <ok/falla> · init.sh <exit 0 + N advertencias (M nuevas) / exit 1 / no ejecutado>
58
+ HALLAZGOS:
59
+ 1. [BLOQUEANTE] src/...:42 — <problema> — regla: AGENTS.md §6 — cómo verificar: <...>
60
+ 2. [MENOR] ...
61
+ NO VERIFICADO: <si aplica>
62
+ ```
@@ -0,0 +1,17 @@
1
+ # Decisiones
2
+
3
+ Decisiones **de este repositorio**, que se van tomando a medida que el proyecto crece. Esta carpeta pertenece al repo: el paquete `@bi-analytics/arness-back` la crea una sola vez y `arness sync` nunca la modifica. El resto de `harness/` es la base gestionada por el paquete y **no se edita**: todo lo nuevo se registra aquí.
4
+
5
+ ## Reglas
6
+
7
+ - Un archivo por decisión: `NNNN-titulo-en-kebab-case.md`, con numeración correlativa y a partir de `_plantilla.md`. Atajo: `pnpm arness decision new "<título>"`.
8
+ - **Estados:** `Propuesta` → `Aceptada` → `Reemplazada por NNNN` | `Obsoleta`. Solo las decisiones `Aceptada` son vinculantes.
9
+ - Una decisión `Aceptada` prevalece sobre la base **solo dentro de su alcance**.
10
+ - Las decisiones aceptadas no se reescriben. Para cambiar una se crea otra que la reemplace, y en la anterior solo se actualiza el estado.
11
+ - Los agentes redactan las decisiones en estado `Propuesta`; solo un humano las pasa a `Aceptada`.
12
+ - Toda decisión se agrega a la tabla de abajo, que debe quedar al final de este archivo.
13
+
14
+ ## Índice
15
+
16
+ | # | Decisión | Estado | Alcance | Fecha |
17
+ |---|---|---|---|---|
@@ -0,0 +1,24 @@
1
+ # NNNN. <Título corto de la decisión>
2
+
3
+ - **Estado:** Propuesta | Aceptada | Reemplazada por NNNN | Obsoleta
4
+ - **Fecha:** AAAA-MM-DD
5
+ - **Decidido por:** <persona o rol>
6
+ - **Alcance:** <todo el repo | cliente X | módulo X | endpoint X>
7
+ - **Relación con la base:** <extiende AGENTS.md §N | excepción a AGENTS.md §N | nueva>
8
+ - **Reemplaza a:** <NNNN o "—">
9
+
10
+ ## Contexto
11
+
12
+ <Qué problema o necesidad motivó la decisión.>
13
+
14
+ ## Decisión
15
+
16
+ <Qué se decidió, redactado como regla accionable para humanos y agentes.>
17
+
18
+ ## Consecuencias
19
+
20
+ <Qué cambia, qué se gana, qué se pierde y qué hay que mantener.>
21
+
22
+ ## Alternativas descartadas
23
+
24
+ <Opciones consideradas y por qué no se eligieron.>