specatlas 0.1.0 → 0.1.1

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.
package/dist/bin.js CHANGED
@@ -8768,6 +8768,30 @@ function highlightCode(code, language, enabled) {
8768
8768
  function splitRow(line) {
8769
8769
  return line.trim().replace(/^\|/, "").replace(/\|$/, "").split("|").map((cell) => cell.trim());
8770
8770
  }
8771
+ function tableOfContents(markdown2, maxLevel = 2) {
8772
+ const entries = [];
8773
+ let inFence = false;
8774
+ for (const line of markdown2.replace(/\r\n?/g, "\n").split("\n")) {
8775
+ if (/^```/.test(line)) {
8776
+ inFence = !inFence;
8777
+ continue;
8778
+ }
8779
+ if (inFence) continue;
8780
+ const match = /^(#{1,4})\s+(.*)$/.exec(line);
8781
+ if (!match) continue;
8782
+ const level = (match[1] ?? "").length;
8783
+ if (level > maxLevel) continue;
8784
+ const text = match[2] ?? "";
8785
+ entries.push({ level, text, id: slugify(text) });
8786
+ }
8787
+ return entries;
8788
+ }
8789
+ function renderToc(entries, title) {
8790
+ if (entries.length === 0) return "";
8791
+ const items = entries.map((entry) => `<li class="toc-h${entry.level}"><a href="#${entry.id}">${inlineMarkdown(entry.text)}</a></li>`).join("");
8792
+ return `<nav class="atlas-toc"><h2>${escapeHtml(title)}</h2><ul>${items}</ul></nav>
8793
+ `;
8794
+ }
8771
8795
  function renderMarkdown(markdown2, opts = {}) {
8772
8796
  const highlight = opts.highlight !== false;
8773
8797
  const mermaidMode = opts.mermaid ?? "code";
@@ -8900,7 +8924,11 @@ function renderMarkdown(markdown2, opts = {}) {
8900
8924
  i += 1;
8901
8925
  }
8902
8926
  flush();
8903
- return out.join("\n");
8927
+ const html = out.join("\n");
8928
+ if (opts.toc) {
8929
+ return renderToc(tableOfContents(markdown2), opts.tocTitle ?? "\xCDndice") + html;
8930
+ }
8931
+ return html;
8904
8932
  }
8905
8933
 
8906
8934
  // ../core/dist/index.js
@@ -13757,7 +13785,14 @@ async function runInit(ctx) {
13757
13785
  });
13758
13786
  const compiled = [];
13759
13787
  const workflowDir = await resolveWorkflowDir();
13760
- if (workflowDir && !result.diagnostics.some((d) => d.severity === "error")) {
13788
+ if (!workflowDir) {
13789
+ result.diagnostics.push({
13790
+ code: "ATLAS-ADAPTERS-003",
13791
+ severity: "error",
13792
+ message: "No se encontr\xF3 la carpeta workflow/phases con las fuentes de prompts: no se compilaron los adaptadores",
13793
+ suggestion: "Verifica la instalaci\xF3n del CLI o define SPECATLAS_WORKFLOW_DIR apuntando a la carpeta workflow del paquete"
13794
+ });
13795
+ } else if (!result.diagnostics.some((d) => d.severity === "error")) {
13761
13796
  const loaded = await loadConfig(result.sddDir);
13762
13797
  const agentsFlag = flagString(ctx.flags, "agents");
13763
13798
  const requested = agentsFlag ? agentsFlag.split(",").map((t) => t.trim()).filter((t) => t.length > 0) : loaded.config.adapters.targets;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specatlas",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "SpecAtlas: kernel determinista de Spec-Driven Development (CLI)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -10,7 +10,9 @@
10
10
  },
11
11
  "main": "dist/bin.js",
12
12
  "files": [
13
- "dist"
13
+ "dist",
14
+ "workflow",
15
+ "profiles"
14
16
  ],
15
17
  "engines": {
16
18
  "node": ">=20"
@@ -0,0 +1,36 @@
1
+ name: dotnet-sqlserver
2
+ display_name: .NET + SQL Server
3
+ detection:
4
+ files:
5
+ - '**/*.cs'
6
+ - '**/*.csproj'
7
+ - '**/*.sln'
8
+ manifests:
9
+ - file: '*.sln'
10
+ contains: []
11
+ - file: '*.csproj'
12
+ contains: []
13
+ priority: 20
14
+ domains:
15
+ - backend
16
+ - database
17
+ commands:
18
+ build: dotnet build
19
+ test: dotnet test
20
+ lint: dotnet format --verify-no-changes
21
+ format: dotnet format
22
+ verify:
23
+ executable:
24
+ - dotnet test
25
+ automatic:
26
+ - dotnet build
27
+ manual:
28
+ - Ejecución del flujo contra la base de datos de desarrollo
29
+ rollback: Script SQL de rollback por objeto afectado + revertir el commit.
30
+ antipatterns:
31
+ - DML directo sobre tablas históricas
32
+ - Endpoints sin autenticación
33
+ - Cambios de base de datos sin script de rollback
34
+ assumptions:
35
+ - .NET LTS
36
+ - SQL Server accesible en desarrollo
@@ -0,0 +1,19 @@
1
+ name: generic
2
+ display_name: Genérico (cualquier stack)
3
+ detection:
4
+ files: []
5
+ manifests: []
6
+ priority: 0
7
+ domains:
8
+ - other
9
+ commands: {}
10
+ verify:
11
+ executable: []
12
+ automatic: []
13
+ manual:
14
+ - Confirmación humana explícita del resultado observado
15
+ rollback: Revierte los archivos tocados al estado anterior (git revert o restaurar backup).
16
+ antipatterns:
17
+ - Inventar comandos de build/test que el proyecto no tiene
18
+ assumptions:
19
+ - El stack no está cubierto por un perfil específico
@@ -0,0 +1,38 @@
1
+ name: node-ts
2
+ display_name: Node + TypeScript
3
+ detection:
4
+ files:
5
+ - '**/*.ts'
6
+ - '**/*.tsx'
7
+ - package.json
8
+ manifests:
9
+ - file: package.json
10
+ contains:
11
+ - typescript
12
+ priority: 10
13
+ domains:
14
+ - backend
15
+ - frontend
16
+ - fullstack
17
+ - testing
18
+ commands:
19
+ build: npm run build
20
+ lint: npm run lint
21
+ test: npm test
22
+ format: npm run format
23
+ verify:
24
+ executable:
25
+ - npm test
26
+ - npm run lint
27
+ automatic:
28
+ - Búsqueda de efectos colaterales con grep
29
+ manual:
30
+ - Prueba manual del flujo principal en desarrollo
31
+ rollback: Revierte el commit y deshaz migraciones si el cambio las incluye.
32
+ antipatterns:
33
+ - SQL concatenado en lugar de consultas parametrizadas
34
+ - Secretos versionados o logueados
35
+ - console.log olvidados en producción
36
+ assumptions:
37
+ - Node LTS
38
+ - El proyecto declara sus scripts en package.json
@@ -0,0 +1,36 @@
1
+ name: python
2
+ display_name: Python
3
+ detection:
4
+ files:
5
+ - '**/*.py'
6
+ - pyproject.toml
7
+ - requirements.txt
8
+ manifests:
9
+ - file: pyproject.toml
10
+ contains: []
11
+ - file: requirements.txt
12
+ contains: []
13
+ priority: 10
14
+ domains:
15
+ - backend
16
+ - other
17
+ commands:
18
+ build: ''
19
+ lint: ruff check .
20
+ test: pytest
21
+ format: ruff format .
22
+ verify:
23
+ executable:
24
+ - pytest
25
+ - ruff check .
26
+ automatic:
27
+ - Revisión de imports y efectos colaterales
28
+ manual:
29
+ - Ejecución manual del flujo principal
30
+ rollback: Revierte el commit; si hay migraciones, aplica el downgrade correspondiente.
31
+ antipatterns:
32
+ - Excepciones silenciadas sin log
33
+ - Credenciales en el código
34
+ assumptions:
35
+ - Python 3.11+
36
+ - El proyecto declara dependencias (pyproject o requirements)
@@ -0,0 +1,51 @@
1
+ ---
2
+ id: adopt
3
+ title: Adoptar (brownfield)
4
+ description: >-
5
+ Recupera las specs de un proyecto existente: lee el inventario y las anclas, entrevista al usuario y redacta requisitos AS-IS.
6
+ Usar cuando el usuario pide adoptar, documentar o recuperar las specs de un proyecto que ya existe.
7
+ requires: []
8
+ produces:
9
+ - specs/<dominio>/spec.md
10
+ - changes/adopt-<dominio>/spec.md
11
+ arguments: true
12
+ agent:
13
+ mode: primary
14
+ ---
15
+
16
+ # Fase: Adoptar (brownfield)
17
+
18
+ El contenido se escribe en **{{LANGUAGE_NAME}}**.
19
+
20
+ ## Pasos
21
+
22
+ 1. Genera el inventario y las specs baseline:
23
+
24
+ ```
25
+ satlas adopt
26
+ ```
27
+
28
+ 2. Lee `.sdd/adopt-report.md`, las anclas de cada `specs/<dominio>/spec.md` y el código real que esas anclas señalan.
29
+ 3. Por cada dominio, **entrevista al usuario** (máximo 5 preguntas) para confirmar el comportamiento actual antes de escribirlo. No inventes reglas: si el código no lo aclara, pregunta.
30
+ 4. Crea el cambio de adopción y redacta el delta con el comportamiento **actual** (AS-IS):
31
+
32
+ ```
33
+ satlas new adopt-<dominio> --domain <dominio>
34
+ ```
35
+
36
+ - Requisitos `REQ-<DOMINIO>-NNN` con actor, prosa de negocio y reglas `BR-*`.
37
+ - Escenarios `CUANDO/ENTONCES` que describan lo que el sistema hace hoy, incluyendo errores y límites visibles.
38
+ - `## Anclas de implementación` con los archivos/símbolos que respaldan cada requisito (permite detectar drift después).
39
+ 5. Valida y pliega (la adopción documenta lo existente: no requiere tareas ni verificación):
40
+
41
+ ```
42
+ satlas validate --change adopt-<dominio>
43
+ satlas archive adopt-<dominio> --yes
44
+ ```
45
+
46
+ 6. Repite por dominio y reporta la cobertura: dominios adoptados, requisitos recuperados y zonas del código sin requisito (deuda de documentación).
47
+
48
+ ## Prohibido
49
+
50
+ - Escribir requisitos de comportamiento que no exista hoy (eso es un cambio: usa `satlas new`).
51
+ - Copiar nombres técnicos a la spec: la spec es de negocio aunque documente lo existente.
@@ -0,0 +1,43 @@
1
+ ---
2
+ id: archive
3
+ title: Archivar
4
+ description: >-
5
+ Cierra el cambio: pliega los deltas en la spec viva y mueve el cambio al histórico.
6
+ Usar cuando el usuario pide archivar, cerrar o dar por terminado un cambio.
7
+ requires:
8
+ - changes/<slug>/verify.md
9
+ produces:
10
+ - specs/<dominio>/spec.md
11
+ arguments: true
12
+ agent:
13
+ mode: primary
14
+ ---
15
+
16
+ # Fase: Archivar
17
+
18
+ ## Precondición
19
+
20
+ - Sin tareas pendientes y con evidencia `pass` por escenario (`satlas trace --change {{SLUG}}`).
21
+ - Sin hallazgos críticos abiertos en `review.md` (si el carril lo exige).
22
+
23
+ ## Pasos
24
+
25
+ 1. Revisa el plan (seco) antes de tocar nada:
26
+
27
+ ```
28
+ satlas archive {{SLUG}} --dry-run
29
+ ```
30
+
31
+ 2. Si el plegado es correcto (agregados/modificados/eliminados/renombrados esperados), archiva:
32
+
33
+ ```
34
+ satlas archive {{SLUG}} --yes
35
+ ```
36
+
37
+ 3. Verifica el resultado: `specs/<dominio>/spec.md` versionado y `changes/archive/AAAA-MM-{{SLUG}}/` con la historia; `INDEX.md` regenerado.
38
+ 4. Reporta: requisitos plegados, versión de la spec viva y ubicación del archivo.
39
+
40
+ ## Prohibido
41
+
42
+ - Editar la spec viva a mano: el plegado lo hace el CLI de forma determinista.
43
+ - Archivar con evidencia fallida o tareas pendientes.
@@ -0,0 +1,52 @@
1
+ ---
2
+ id: build
3
+ title: Construir
4
+ description: >-
5
+ Implementa las tareas del cambio por olas paralelas, con evidencia y sin tocar los artefactos aprobados.
6
+ Usar cuando el usuario pide construir, implementar o codificar las tareas.
7
+ requires:
8
+ - changes/<slug>/tasks.md
9
+ produces:
10
+ - código y pruebas del cambio
11
+ arguments: true
12
+ agent:
13
+ mode: primary
14
+ ---
15
+
16
+ # Fase: Construir
17
+
18
+ ## Precondición
19
+
20
+ - `satlas trace --change {{SLUG}}` sin errores y `satlas status` en "construyendo" (o "aprobado/planificado").
21
+ - Si hay tareas pendientes y la spec cambió sin re-aprobar, detente.
22
+
23
+ ## Pasos
24
+
25
+ 1. Lee `tasks.md`. Calcula olas:
26
+
27
+ ```
28
+ satlas waves --change {{SLUG}}
29
+ ```
30
+
31
+ 2. Ejecuta **bloque por bloque** y **ola por ola**:
32
+ - Confirma con el usuario el bloque y su mapa de olas antes de empezar.
33
+ - Dentro de una ola, ejecuta las tareas en paralelo solo si no comparten archivos; si comparten, secuéncialas.
34
+ - Cada tarea: implementa exactamente su `Archivos:`, respeta `Cubre:` y deja el código funcionando.
35
+ - Al cerrar cada tarea, marca `- [x]` en `tasks.md` (una sola edición por bloque).
36
+ 3. Tras cada bloque:
37
+ - Ejecuta la validación del perfil (build/lint/test) y captura el resultado.
38
+ - Commitea solo el código (nunca `.sdd/` en commits de build).
39
+ 4. Si una tarea falla: reintenta (máx. 3), si sigue fallando detén el bloque y reporta con el log.
40
+ 5. Al terminar todas las tareas, cierra con:
41
+
42
+ ```
43
+ satlas trace --change {{SLUG}}
44
+ satlas status
45
+ ```
46
+
47
+ ## Prohibido
48
+
49
+ - Modificar `spec.md`, `plan.md` o `meta.yaml` (los artefactos aprobados son inmutables).
50
+ - Ejecutar `git` dentro de subagentes.
51
+ - Marcar tareas sin haber ejecutado la validación correspondiente.
52
+ - Dar por terminado sin evidencia (esa es la fase de verificación).
@@ -0,0 +1,31 @@
1
+ ---
2
+ id: fix
3
+ title: Fix express
4
+ description: >-
5
+ Carril express para incidentes (bug, hotfix, configuración): un solo artefacto, con causa raíz, cambio mínimo y evidencia.
6
+ Usar cuando el usuario pide arreglar un bug, un hotfix o un cambio pequeño sin ceremonia completa.
7
+ requires: []
8
+ produces:
9
+ - changes/<slug>/fix.md
10
+ arguments: true
11
+ agent:
12
+ mode: primary
13
+ ---
14
+
15
+ # Fase: Fix express (incidente)
16
+
17
+ Un solo artefacto: `.sdd/changes/{{SLUG}}/fix.md`. El contenido se escribe en **{{LANGUAGE_NAME}}**.
18
+
19
+ ## Pasos
20
+
21
+ 1. Reproduce el problema o reúne la evidencia de que ocurre (log, pantalla, datos).
22
+ 2. Investiga la causa raíz en el código real; cita `archivo:línea`.
23
+ 3. Aplica el **cambio mínimo** que corrige la causa (no aproveches para refactorizar).
24
+ 4. Escribe `fix.md` con: `## Síntoma`, `## Causa raíz`, `## Cambio`, `## Rollback` y un bloque `evidence`.
25
+ 5. Verifica que el síntoma ya no ocurre y que no rompiste nada alrededor (validación del perfil).
26
+ 6. Si el arreglo revela alcance de feature (no de incidente), **promuévelo**: crea un cambio normal con `satlas new` y pásalo a especificación.
27
+
28
+ ## Prohibido
29
+
30
+ - Tocar la spec viva o los artefactos de otros cambios.
31
+ - Mezclar en el mismo fix varios problemas no relacionados.
@@ -0,0 +1,54 @@
1
+ ---
2
+ id: mockup
3
+ title: Mockups
4
+ description: >-
5
+ Genera mockups profesionales (web/mobile) como contrato visual de la propuesta: alta fidelidad, estados, responsive y accesibles.
6
+ Usar cuando el usuario pide mockups, prototipos visuales o la propuesta visual del cambio.
7
+ requires:
8
+ - changes/<slug>/spec.md
9
+ produces:
10
+ - changes/<slug>/mockups/*.html
11
+ arguments: true
12
+ agent:
13
+ mode: primary
14
+ ---
15
+
16
+ # Fase: Mockups (contrato visual)
17
+
18
+ El contenido se escribe en **{{LANGUAGE_NAME}}**.
19
+
20
+ ## Pasos
21
+
22
+ 1. Prepara el plan y el manifiesto:
23
+
24
+ ```
25
+ satlas mockup {{SLUG}}
26
+ ```
27
+
28
+ 2. Lee el plan (`changes/{{SLUG}}/mockups/plan.yaml`), la spec, el glosario y, si existen, `design/tokens.json` o `DESIGN.md` (sistema de diseño del proyecto).
29
+ 3. Genera **un HTML autocontenido por pantalla** (`changes/{{SLUG}}/mockups/<id>.html`) con calidad de producto:
30
+ - banner fijo visible: `MOCKUP · NO FUNCIONAL · vX · fecha`;
31
+ - datos reales del dominio (prohibido Lorem ipsum, "Item 1" o textos de relleno);
32
+ - estados completos conmutables (`data-state`): default, loading, vacío, error; en mobile también offline;
33
+ - responsive real (390 / 768 / 1440) y tema claro/oscuro si el proyecto lo define;
34
+ - accesibilidad: contraste AA, foco visible, áreas táctiles ≥ 44 px, jerarquía semántica;
35
+ - navegación entre pantallas con enlaces relativos entre archivos;
36
+ - sin recursos externos: sin CDN, sin fuentes remotas, sin `http(s)://`; embebe lo necesario.
37
+ 4. Valida y corrige hasta que no haya errores:
38
+
39
+ ```
40
+ satlas mockup {{SLUG}} --check
41
+ ```
42
+
43
+ 5. Opcional (si hay Playwright instalado): captura de pantallas por breakpoint.
44
+
45
+ ```
46
+ satlas mockup {{SLUG}} --capture
47
+ ```
48
+
49
+ 6. Reporta las pantallas generadas, los escenarios que ilustra cada una y el resultado de la validación.
50
+
51
+ ## Prohibido
52
+
53
+ - Aprobar mockups sin estados ni responsive, o que no sigan los tokens del proyecto cuando existen.
54
+ - Añadir lógica real o datos personales reales en el mockup.
@@ -0,0 +1,48 @@
1
+ ---
2
+ id: plan
3
+ title: Planificar
4
+ description: >-
5
+ Crea el plan técnico y las tareas trazadas de un cambio ya aprobado.
6
+ Usar cuando el usuario pide planificar, diseñar la solución o desglosar tareas.
7
+ requires:
8
+ - changes/<slug>/spec.md
9
+ produces:
10
+ - changes/<slug>/plan.md
11
+ - changes/<slug>/tasks.md
12
+ arguments: true
13
+ agent:
14
+ mode: primary
15
+ ---
16
+
17
+ # Fase: Planificar (técnico)
18
+
19
+ El contenido se escribe en **{{LANGUAGE_NAME}}**. El plan es interno: puede (y debe) hablar de tecnología; la spec no se toca.
20
+
21
+ ## Precondición
22
+
23
+ - La spec del cambio debe estar aprobada (`satlas status` no debe decir "esperando aprobación").
24
+ - Si no lo está, detente y pide la aprobación.
25
+
26
+ ## Pasos
27
+
28
+ 1. Lee `.sdd/changes/{{SLUG}}/spec.md`, `.sdd/constitution.md`, `.sdd/profiles/detected.yaml`, `.sdd/profiles/custom/*` y el código real que vayas a tocar (anclas AS-IS: existe / no existe / blast radius).
29
+ 2. Escribe `plan.md` con las secciones canónicas:
30
+ 1. Contexto AS-IS · 2. Enfoque técnico (con alternativas descartadas) · 3. **Diagramas** · 4. Diseño por capa/módulos · 5. Matriz de trazabilidad (REQ → tareas) · 6. Matriz de paridad AS-IS → TO-BE (solo refactors sustitutivos) · 7. Tareas (referencia) · 8. Riesgos y mitigaciones · 9. Rollback · 10. Dependencias y supuestos.
31
+ 3. En `## 3. Diagramas` incluye los diagramas mermaid que el cambio necesite: `erDiagram` si toca datos, `sequenceDiagram` si hay integración/API/jobs, `flowchart` si hay proceso o validaciones, `stateDiagram-v2` si hay estados, `classDiagram` si el dominio no es trivial, diagrama de arquitectura si hay módulos nuevos.
32
+ 4. Escribe `tasks.md` con la gramática canónica (separador ` · `):
33
+ - `## Bloque N — Título` y `- [ ] T<N>.<seq> Acción · Archivos: ruta · Cubre: REQ-…-S1 · Depende de: T<N>.<seq> · Reversión: cómo revertir`
34
+ - Tareas atómicas (una acción por tarea). Trabajo de infraestructura sin requisito: `· Infra`.
35
+ 5. Valida y planifica olas:
36
+
37
+ ```
38
+ satlas trace --change {{SLUG}}
39
+ satlas waves --change {{SLUG}}
40
+ ```
41
+
42
+ 6. Reporta: bloques, tareas, olas, riesgos y cualquier hueco de trazabilidad (debe quedar en 0 errores).
43
+
44
+ ## Prohibido
45
+
46
+ - Tareas sin archivo concreto o sin requisito (salvo `· Infra`).
47
+ - Modificar la spec aprobada (si falta algo, vuelve a especificar y re-aprueba).
48
+ - Prometer horas: estima talla y confianza, con supuestos.
@@ -0,0 +1,28 @@
1
+ ---
2
+ id: review
3
+ title: Revisar
4
+ description: >-
5
+ Revisión de código con lentes por tamaño del diff y verificación adversarial de hallazgos.
6
+ Usar cuando el usuario pide revisar el código antes del PR.
7
+ requires:
8
+ - changes/<slug>/tasks.md
9
+ produces:
10
+ - changes/<slug>/review.md
11
+ arguments: true
12
+ agent:
13
+ mode: primary
14
+ ---
15
+
16
+ # Fase: Revisar (código)
17
+
18
+ ## Pasos
19
+
20
+ 1. Obtén el diff completo del cambio (`git diff` contra la rama base).
21
+ 2. Elige el nivel:
22
+ - Diff pequeño: una pasada con dos lentes: **corrección** (¿hace lo que dice la spec?) y **estándares** (perfil + constitución).
23
+ - Diff grande (> 400 líneas) o ruta sensible: tres lentes (corrección, seguridad, mantenibilidad) y un verificador adversarial.
24
+ 3. **Verificación adversarial**: cada hallazgo se intenta refutar contra el código real. Etiquetas:
25
+ - `CONFIRMADO` (evidencia `archivo:línea`), `RENUNCIADO` (no se pudo refutar: mantener severidad), `REFUTADO` (con evidencia).
26
+ - Nunca marcar `REFUTADO` sin `archivo:línea`.
27
+ 4. Escribe `.sdd/changes/{{SLUG}}/review.md`: hallazgos con severidad, evidencia, decisión y estado.
28
+ 5. Crítico confirmado = bloquea el PR hasta corregirlo o registrar un override con motivo, autor y fecha.
@@ -0,0 +1,51 @@
1
+ ---
2
+ id: specify
3
+ title: Especificar
4
+ description: >-
5
+ Escribe o refina la especificación funcional de un cambio (delta) en lenguaje de negocio.
6
+ Usar cuando el usuario pide especificar, definir requisitos, redactar la spec o crear un cambio.
7
+ requires: []
8
+ produces:
9
+ - changes/<slug>/spec.md
10
+ arguments: true
11
+ agent:
12
+ mode: primary
13
+ ---
14
+
15
+ # Fase: Especificar (spec funcional y de negocio)
16
+
17
+ {{>reglas-negocio}}
18
+
19
+ ## Objetivo
20
+
21
+ Escribir el delta de especificación del cambio `{{SLUG}}` en `.sdd/changes/{{SLUG}}/spec.md`.
22
+ El contenido se escribe en **{{LANGUAGE_NAME}}**.
23
+
24
+ ## Pasos
25
+
26
+ 1. Lee `.sdd/constitution.md`, `.sdd/glossary.md` y las specs vivas de `.sdd/specs/**/spec.md` que toquen el dominio.
27
+ 2. Si hay código existente relacionado, inspecciónalo solo para entender el comportamiento actual (AS-IS); no lo describas con tecnología en la spec.
28
+ 3. Si falta información de negocio, **pregunta** (máximo 5 preguntas concretas) antes de escribir. No inventes reglas.
29
+ 4. Redacta el delta con las secciones canónicas:
30
+ - `## Requisitos agregados` (`ADDED`), `## Requisitos modificados` (`MODIFIED`), `## Requisitos eliminados` (`REMOVED`), `## Requisitos renombrados` (`RENAMED`).
31
+ - Cada requisito: `### Requisito: REQ-<DOMINIO>-NNN — Título` (ids inmutables), prosa de negocio, reglas `- Regla BR-<DOMINIO>-NNN: ...` y escenarios `#### Escenario: REQ-<DOMINIO>-NNN-S1 — Título` con `- **CUANDO** ...` / `- **ENTONCES** ...`.
32
+ - Incluye siempre escenarios de error, vacío, sin permiso y límites.
33
+ - `MODIFIED` copia el bloque **completo** del requisito tal como está en la spec viva y lo edita.
34
+ - `REMOVED` declara `- Motivo:` y `- Migración:`.
35
+ 5. Verifica con el CLI y corrige hasta que no haya errores:
36
+
37
+ ```
38
+ satlas validate --change {{SLUG}}
39
+ ```
40
+
41
+ 6. Reporta: número de requisitos y escenarios, supuestos, y las preguntas que quedaron abiertas.
42
+
43
+ ## Prohibido
44
+
45
+ - Nombres de tablas, campos, endpoints, clases, archivos, frameworks o librerías.
46
+ - Adjetivos vagos ("rápido", "fácil", "varios", "robusto") sin un valor medible.
47
+ - Renumerar ids existentes o reescribir un requisito aprobado sin pasar por `MODIFIED`/`REMOVED`.
48
+
49
+ ## Salida
50
+
51
+ `changes/{{SLUG}}/spec.md` validado, más un resumen para el usuario y la indicación de que la spec debe aprobarse (`satlas approve`) antes de planificar.
@@ -0,0 +1,41 @@
1
+ ---
2
+ id: verify
3
+ title: Verificar
4
+ description: >-
5
+ Registra evidencia real por escenario (comando y resultado) en verify.md.
6
+ Usar cuando el usuario pide verificar, probar o demostrar que el cambio funciona.
7
+ requires:
8
+ - changes/<slug>/tasks.md
9
+ produces:
10
+ - changes/<slug>/verify.md
11
+ arguments: true
12
+ agent:
13
+ mode: primary
14
+ ---
15
+
16
+ # Fase: Verificar (evidencia por escenario)
17
+
18
+ {{>evidencia}}
19
+
20
+ ## Pasos
21
+
22
+ 1. Lee el delta y lista **todos** los escenarios (`### Escenario: REQ-…-S1`).
23
+ 2. Para cada escenario elige el método más fuerte posible:
24
+ - `executable`: prueba automatizada, petición HTTP, script SQL, Playwright, emulador.
25
+ - `automatic`: comprobación mecánica (grep/inspección) sobre el resultado.
26
+ - `semi`: verificación asistida con revisión humana.
27
+ - `manual`: último recurso, con justificación.
28
+ 3. Ejecuta realmente el comando y captura la salida. Hash de la salida:
29
+
30
+ ```
31
+ satlas hash "<salida o archivo>" # (F1: satlas verify --record lo hará por ti)
32
+ ```
33
+
34
+ 4. Escribe en `.sdd/changes/{{SLUG}}/verify.md` un bloque `evidence` por escenario con el formato exacto.
35
+ 5. Comprueba que no queden huecos:
36
+
37
+ ```
38
+ satlas trace --change {{SLUG}} --require-evidence
39
+ ```
40
+
41
+ 6. Reporta la tabla escenario → método → resultado y cualquier fallo encontrado (un fallo se corrige y se vuelve a verificar; no se marca como pasado).
@@ -0,0 +1,21 @@
1
+ ## Formato de evidencia (bloques `evidence`)
2
+
3
+ Un bloque por escenario en `verify.md`, con YAML válido:
4
+
5
+ ````markdown
6
+ ### REQ-DOMINIO-001-S1 — Título del escenario
7
+
8
+ ```evidence
9
+ method: executable # executable | automatic | semi | manual
10
+ command: npm test -- modulo
11
+ result: pass # pass | fail | skipped
12
+ output_hash: sha256:… # hash de la salida (satlas hash)
13
+ date: 2026-01-01T00:00:00Z
14
+ by: tu-nombre
15
+ notes: 12/12 casos
16
+ ```
17
+ ````
18
+
19
+ - `executable` exige `command` y que el comando se haya ejecutado de verdad.
20
+ - Un resultado `fail` bloquea el PR; se corrige y se registra de nuevo (nuevo bloque con la fecha nueva).
21
+ - No hay evidencia sin comando cuando el método es `executable`, ni "terminado" sin evidencia.
@@ -0,0 +1,10 @@
1
+ ## Reglas de la especificación de negocio
2
+
3
+ - Se escribe para el usuario del sistema, no para programadores.
4
+ - Cada requisito declara **qué** y **por qué**, nunca **cómo**.
5
+ - Vocabulario: el del glosario (`.sdd/glossary.md`). Si un término no existe, agrégalo al glosario o pregunta.
6
+ - Prohibido: nombres de tablas, campos, endpoints, clases, archivos, frameworks, librerías, SQL, diagramas técnicos y estimaciones.
7
+ - Prohibido: adjetivos no medibles ("rápido", "fácil", "varios", "óptimo", "robusto", "adecuado", "simple").
8
+ - Cada escenario tiene un resultado observable y verificable (`ENTONCES` medible).
9
+ - Todo requisito incluye escenarios de error, caso vacío, falta de permiso y límites.
10
+ - Los ids `REQ-*` y `BR-*` son inmutables: no se renumeran ni se reutilizan.