gemstack-ai 1.0.1 → 1.1.2

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 (46) hide show
  1. package/.agents/rules/01-gemstack-core.md +15 -0
  2. package/.agents/rules/02-gemstack-constitution.md +12 -1
  3. package/.agents/skills/gemstack-handoff/SKILL.md +2 -1
  4. package/.agents/skills/gemstack-plan/SKILL.md +2 -1
  5. package/.agents/skills/gemstack-review/SKILL.md +7 -5
  6. package/.agents/skills/gemstack-ship/SKILL.md +5 -0
  7. package/.agents/skills/gemstack-spec/SKILL.md +3 -2
  8. package/.agents/skills/gemstack-tasks/SKILL.md +4 -3
  9. package/.gemstack/state.json +20 -2
  10. package/CHANGELOG.md +52 -0
  11. package/MANUAL.md +4 -4
  12. package/README.md +36 -8
  13. package/RELEASE_NOTES.md +105 -0
  14. package/assets/logo.jpg +0 -0
  15. package/docs/architecture-consistency.md +144 -0
  16. package/gemstack-ai-1.1.2.tgz +0 -0
  17. package/handoff.md +27 -40
  18. package/package.json +3 -2
  19. package/scripts/ci/smoke-cli.js +1 -0
  20. package/specs/006-architecture-consistency-engine/.gemstack.json +9 -0
  21. package/specs/006-architecture-consistency-engine/plan.md +319 -0
  22. package/specs/006-architecture-consistency-engine/spec.md +179 -0
  23. package/specs/006-architecture-consistency-engine/tasks.md +532 -0
  24. package/specs/templates/plan.md +11 -0
  25. package/specs/templates/spec.md +17 -0
  26. package/specs/templates/tasks.md +1 -0
  27. package/src/cli.js +9 -4
  28. package/src/commands/verify.js +311 -0
  29. package/src/lib/contracts.js +388 -0
  30. package/src/lib/findings.js +227 -0
  31. package/src/lib/hasher.js +103 -0
  32. package/src/lib/state.js +143 -0
  33. package/src/mcp-server.js +1 -1
  34. package/template/.agents/rules/01-gemstack-core.md +15 -0
  35. package/template/.agents/rules/02-gemstack-constitution.md +12 -1
  36. package/template/.agents/skills/gemstack-handoff/SKILL.md +2 -1
  37. package/template/.agents/skills/gemstack-plan/SKILL.md +2 -1
  38. package/template/.agents/skills/gemstack-review/SKILL.md +7 -5
  39. package/template/.agents/skills/gemstack-ship/SKILL.md +5 -0
  40. package/template/.agents/skills/gemstack-spec/SKILL.md +3 -2
  41. package/template/.agents/skills/gemstack-tasks/SKILL.md +4 -3
  42. package/template/docs/architecture-consistency.md +144 -0
  43. package/template/specs/templates/plan.md +11 -0
  44. package/template/specs/templates/spec.md +17 -0
  45. package/template/specs/templates/tasks.md +1 -0
  46. package/gemstack-ai-1.0.1.tgz +0 -0
@@ -0,0 +1,532 @@
1
+ # Tareas de Implementación: Architecture Consistency Engine & Phase Freezing (Upgrade A)
2
+
3
+ **Feature Branch**: `006-architecture-consistency-engine`
4
+ **Spec**: [`specs/006-architecture-consistency-engine/spec.md`](file:///c:/CODES/Gemstack/specs/006-architecture-consistency-engine/spec.md)
5
+ **Plan**: [`specs/006-architecture-consistency-engine/plan.md`](file:///c:/CODES/Gemstack/specs/006-architecture-consistency-engine/plan.md)
6
+ **Lifecycle Status**: `TASKS_COMPLETE`
7
+ **Stop Reason**: `TASKS_COMPLETE_AWAITING_REVIEW`
8
+
9
+ ---
10
+
11
+ ## Contratos Congelados Heredados (Dogfooding)
12
+
13
+ ```gemstack-contracts
14
+ [
15
+ {
16
+ "id": "zero-dependency-core",
17
+ "type": "BOOLEAN_INVARIANT",
18
+ "value": true,
19
+ "description": "El runtime de Gemstack debe mantener cero dependencias externas de producción en Node.js."
20
+ },
21
+ {
22
+ "id": "upgrade-a-contract-types",
23
+ "type": "ENUM_SET",
24
+ "values": [
25
+ "ENUM_SET",
26
+ "IDENTITY_TUPLE",
27
+ "PROVENANCE_RULE",
28
+ "BOOLEAN_INVARIANT",
29
+ "BOUNDARY",
30
+ "ROADMAP_LIMIT"
31
+ ],
32
+ "description": "Tipos de contrato deterministas soportados canónicamente en Upgrade A."
33
+ },
34
+ {
35
+ "id": "verify-does-not-mutate-hashes",
36
+ "type": "BOOLEAN_INVARIANT",
37
+ "value": true,
38
+ "description": "El comando gemstack verify valida contra hashes congelados pero nunca actualiza ni sobreescribe los hashes de fase."
39
+ },
40
+ {
41
+ "id": "contract-amendment-requires-human-approval",
42
+ "type": "BOOLEAN_INVARIANT",
43
+ "value": true,
44
+ "description": "Cualquier enmienda a un contrato congelado o artefacto inmutable requiere aprobación humana explícita."
45
+ },
46
+ {
47
+ "id": "legacy-mode-supported",
48
+ "type": "BOOLEAN_INVARIANT",
49
+ "value": true,
50
+ "description": "Features sin bloques de contratos operan en modo legacy sin romper compatibilidad ni generar falsos bloqueos."
51
+ }
52
+ ]
53
+ ```
54
+
55
+ ---
56
+
57
+ ## Grafo de Dependencias de Tareas (6 Olas de Ejecución)
58
+
59
+ ```mermaid
60
+ graph TD
61
+ classDef testNode fill:#e1f5fe,stroke:#0288d1,stroke-width:2px;
62
+ classDef coreNode fill:#e8f5e9,stroke:#388e3c,stroke-width:2px;
63
+ classDef findingsNode fill:#fff3e0,stroke:#f57c00,stroke-width:2px;
64
+ classDef integNode fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px;
65
+ classDef docNode fill:#eceff1,stroke:#455a64,stroke-width:2px;
66
+ classDef sealNode fill:#ffebee,stroke:#d32f2f,stroke-width:2px;
67
+
68
+ T001[T001: Unit Tests Contratos]:::testNode --> T002[T002: Unit Tests Hasher]:::testNode
69
+ T002 --> T003[T003: Unit Tests Findings]:::testNode
70
+
71
+ T003 --> T004[T004: src/lib/hasher.js]:::coreNode
72
+ T004 --> T005[T005: src/lib/state.js]:::coreNode
73
+ T004 --> T006[T006: src/lib/contracts.js Parser]:::coreNode
74
+ T006 --> T007[T007: src/lib/contracts.js Validator]:::coreNode
75
+
76
+ T005 --> T008[T008: src/lib/findings.js Engine]:::findingsNode
77
+ T007 --> T008
78
+ T008 --> T009[T009: src/lib/findings.js Anti-Loop]:::findingsNode
79
+
80
+ T007 --> T010[T010: verify.js Integration]:::integNode
81
+ T009 --> T010
82
+ T010 --> T011[T011: verify.test.js Regresión]:::testNode
83
+
84
+ T010 --> T012[T012: Templates Actualizados]:::docNode
85
+ T012 --> T013[T013: Rules & Constitution]:::docNode
86
+ T013 --> T014[T014: Skills SDD Actualizados]:::docNode
87
+
88
+ T011 --> T015[T015: P1 Full Test Matrix]:::testNode
89
+ T014 --> T015
90
+ T015 --> T016[T016: Bootstrap Feature 006]:::sealNode
91
+ T016 --> T017[T017: Verificación Final CI/CD]:::sealNode
92
+ ```
93
+
94
+ ---
95
+
96
+ ## Ola 1 — TDD Pre-Requisitos: Redacción de Suites de Prueba P1 (Fase Roja)
97
+
98
+ ### [ ] T001 — Redacción de Pruebas Unitarias para Contratos (`tests/contracts.test.js`)
99
+ - **Objetivo**: Escribir los tests unitarios para parsing, ordenación, validación de los 6 tipos de contratos y resolución de herencia entre fases.
100
+ - **Archivos**: `tests/contracts.test.js`
101
+ - **Dependencias**: Ninguna.
102
+ - **Detalle de Pasos**:
103
+ 1. Crear archivo `tests/contracts.test.js` utilizando `node:test` y `node:assert/strict`.
104
+ 2. Implementar `TEST-CONSISTENCY-A01`: Parseo válido de array JSON en bloque ````gemstack-contracts.
105
+ 3. Implementar `TEST-CONSISTENCY-A02`: Rechazo con `CONTRACT_PARSE_ERROR` para JSON malformado o bloques múltiples.
106
+ 4. Implementar `TEST-CONSISTENCY-A03`: Emisión de `CONTRACT_DUPLICATE_ID` si dos contratos tienen id duplicado.
107
+ 5. Implementar `TEST-CONSISTENCY-B01`: `ENUM_SET` detecta miembro extra no aprobado ➔ `BLOCKED`.
108
+ 6. Implementar `TEST-CONSISTENCY-B02`: `ENUM_SET` ordenación canónica indiferente al orden (`[A,B]` == `[B,A]`) ➔ `PASS`.
109
+ 7. Implementar `TEST-CONSISTENCY-B03`: `IDENTITY_TUPLE` detecta dimensión omitida ➔ `BLOCKED`.
110
+ 8. Implementar `TEST-CONSISTENCY-B04`: `IDENTITY_TUPLE` permutación de dimensiones idénticas ➔ `PASS`.
111
+ 9. Implementar `TEST-CONSISTENCY-B05`: `PROVENANCE_RULE` detecta campo de procedencia eliminado ➔ `BLOCKED`.
112
+ 10. Implementar `TEST-CONSISTENCY-B06`: `BOOLEAN_INVARIANT` & `ROADMAP_LIMIT` contradicciones de valor ➔ `BLOCKED`.
113
+ 11. Implementar `TEST-CONSISTENCY-B07`: `BOUNDARY` estados estrictos `FORBIDDEN` vs `REQUIRED` (contradicción ➔ `BLOCKED`, equivalencia ➔ `PASS`).
114
+ 12. Implementar `TEST-CONSISTENCY-B08`: Herencia acumulativa (PLAN hereda SPEC y agrega compatibles sin requerir duplicación en TASKS) ➔ `PASS`.
115
+ - **Invariantes Congeladas**:
116
+ - Cero dependencias npm externas.
117
+ - Solo los 6 tipos de contrato canónicos.
118
+ - Bloque canónico único o modo `LEGACY`.
119
+ - **P1 Tests Cubiertos**: `TEST-CONSISTENCY-A01`, `TEST-CONSISTENCY-A02`, `TEST-CONSISTENCY-A03`, `TEST-CONSISTENCY-B01`, `TEST-CONSISTENCY-B02`, `TEST-CONSISTENCY-B03`, `TEST-CONSISTENCY-B04`, `TEST-CONSISTENCY-B05`, `TEST-CONSISTENCY-B06`, `TEST-CONSISTENCY-B07`, `TEST-CONSISTENCY-B08`.
120
+ - **Validación Local**: `node --test tests/contracts.test.js` (debe fallar por módulos ausentes - Fase Roja).
121
+ - **Condición de Parada**: Tests creados y fallando limpiamente sin excepciones de sintaxis de tests.
122
+
123
+ ---
124
+
125
+ ### [ ] T002 — Redacción de Pruebas Unitarias para Hasher y Normalización (`tests/hasher.test.js`)
126
+ - **Objetivo**: Escribir los tests unitarios para hashing determinista SHA-256, rechazo de UTF-8 BOM emitiendo `CONTRACT_PARSE_ERROR` y normalización CRLF a LF.
127
+ - **Archivos**: `tests/hasher.test.js`
128
+ - **Dependencias**: T001.
129
+ - **Detalle de Pasos**:
130
+ 1. Crear `tests/hasher.test.js` utilizando `node:test` y `node:assert/strict`.
131
+ 2. Implementar `TEST-CONSISTENCY-C01`: Cálculo de digest SHA-256 en minúsculas de 64 caracteres.
132
+ 3. Implementar `TEST-CONSISTENCY-C02`: Detección de mutación no autorizada de artefacto congelado (`FROZEN_ARTIFACT_CHANGED`).
133
+ 4. Implementar `TEST-CONSISTENCY-C04`: Normalización determinista: `\r\n` y `\r` transformados a `\n` producen idéntico digest SHA-256; detección de UTF-8 BOM emite código congelado `CONTRACT_PARSE_ERROR` con mensaje descriptivo ("UTF-8 BOM is forbidden in phase artifacts").
134
+ 5. Implementar `TEST-CONSISTENCY-G01`: Normalización de rutas Windows (`\` convertido a `/`) para cálculo de fingerprints y paths de artefactos.
135
+ - **Invariantes Congeladas**:
136
+ - SHA-256 completo de 64 caracteres en minúsculas.
137
+ - Rechazo explícito de UTF-8 BOM (`0xEF, 0xBB, 0xBF`) bajo código estándar `CONTRACT_PARSE_ERROR`.
138
+ - **P1 Tests Cubiertos**: `TEST-CONSISTENCY-C01`, `TEST-CONSISTENCY-C02`, `TEST-CONSISTENCY-C04`, `TEST-CONSISTENCY-G01`.
139
+ - **Validación Local**: `node --test tests/hasher.test.js` (Fase Roja).
140
+ - **Condición de Parada**: Tests fallando por ausencia de `src/lib/hasher.js`.
141
+
142
+ ---
143
+
144
+ ### [ ] T003 — Redacción de Pruebas Unitarias para Findings, Anti-Loop y State (`tests/findings.test.js`)
145
+ - **Objetivo**: Escribir los tests unitarios para fingerprints SHA-256 canónicos, ciclo de vida de hallazgos, anti-loop, excepciones con contextHash completo y persistencia atómica.
146
+ - **Archivos**: `tests/findings.test.js`
147
+ - **Dependencias**: T002.
148
+ - **Detalle de Pasos**:
149
+ 1. Crear `tests/findings.test.js` con `node:test` y `node:assert/strict`.
150
+ 2. Implementar `TEST-CONSISTENCY-D01`: Generación canónica de fingerprint de 64 caracteres hex (`code`, `contractId`, `phase`, `location` relativa `/`) y verificación de visual display (`slice(0, 12)`).
151
+ 3. Implementar `TEST-CONSISTENCY-D02`: Anti-loop determinista: si el defecto persiste, no se suprime como `RESOLVED`; reabre si vuelve a ocurrir; deduplicación de 1 hallazgo por `(contractId, phase, violationType)`.
152
+ 4. Implementar `TEST-CONSISTENCY-E01`: Supresión de bloqueo si existe `ACCEPTED_EXCEPTION` con `contextHash` idéntico (SHA-256 de `upstreamAcceptedPhaseHash + currentComparedPhaseHash + normalizedContractRepresentation`).
153
+ 5. Implementar `TEST-CONSISTENCY-E02`: Reactivación de bloqueo de excepción si cualquier componente relevante muta (cambio en upstream accepted hash, cambio en current phase hash, o cambio en semántica normalizada del contrato recalculan `contextHash`, invalidando la excepción y retornando a estado bloqueante).
154
+ 6. Implementar `TEST-CONSISTENCY-F02`: Compatibilidad retroactiva de `state.json` versión 0.1 sin campos de Upgrade A.
155
+ 7. Implementar `TEST-CONSISTENCY-G02`: Escritura atómica de `state.json` (archivo temporal + rename) inmune a escrituras corruptas en Windows.
156
+ - **Invariantes Congeladas**:
157
+ - Fingerprint canónico es un hash SHA-256 estricto de 64 caracteres (nunca truncado para indexación o persistencia).
158
+ - ContextHash de excepciones engloba upstream hash + current phase hash + representación normalizada del contrato (nunca el hash de un solo archivo).
159
+ - Escritura atómica vía `fs.writeFileSync` a archivo `.tmp` seguido de `fs.renameSync`.
160
+ - **P1 Tests Cubiertos**: `TEST-CONSISTENCY-D01`, `TEST-CONSISTENCY-D02`, `TEST-CONSISTENCY-E01`, `TEST-CONSISTENCY-E02`, `TEST-CONSISTENCY-F02`, `TEST-CONSISTENCY-G02`.
161
+ - **Validación Local**: `node --test tests/findings.test.js` (Fase Roja).
162
+ - **Condición de Parada**: Tests redactados y fallando limpiamente.
163
+
164
+ ---
165
+
166
+ ## Ola 2 — Core Libraries: Implementación de Módulos Base (Zero-Dependency)
167
+
168
+ ### [ ] T004 — Implementación del Módulo Hasher (`src/lib/hasher.js`)
169
+ - **Objetivo**: Construir el módulo de hashing determinista, normalización de finales de línea, validación de BOM y normalización de rutas.
170
+ - **Archivos**: `src/lib/hasher.js`
171
+ - **Dependencias**: T002.
172
+ - **Detalle de Pasos**:
173
+ 1. Crear `src/lib/hasher.js` usando únicamente módulos nativos `node:crypto` y `node:fs`.
174
+ 2. Implementar `normalizeContent(content)`: comprobar si inicia con BOM (`content.charCodeAt(0) === 0xFEFF`) y lanzar error congelado `CONTRACT_PARSE_ERROR` con mensaje descriptivo ("UTF-8 BOM is forbidden in phase artifacts"); reemplazar `\r\n` y `\r` por `\n`.
175
+ 3. Implementar `hashContent(content)`: invocar `normalizeContent` y generar `createHash('sha256').update(normalized, 'utf8').digest('hex')`.
176
+ 4. Implementar `hashFile(filePath)`: leer buffer/utf8, validar existencia, calcular hash determinista.
177
+ 5. Implementar `normalizePath(filePath)`: reemplazar backslashes `\` por `/` y resolver relative path al workspace root.
178
+ 6. Exportar `{ normalizeContent, hashContent, hashFile, normalizePath }`.
179
+ - **Invariantes Congeladas**:
180
+ - SHA-256 de 64 caracteres en minúsculas.
181
+ - Rechazo de UTF-8 BOM usando el código de error congelado `CONTRACT_PARSE_ERROR`.
182
+ - **P1 Tests Cubiertos**: Hace pasar `TEST-CONSISTENCY-C01`, `TEST-CONSISTENCY-C04`, `TEST-CONSISTENCY-G01`.
183
+ - **Validación Local**: `node --test tests/hasher.test.js`.
184
+ - **Condición de Parada**: Los tests de hashing y normalización pasan al 100%.
185
+
186
+ ---
187
+
188
+ ### [ ] T005 — Implementación del Manejador de Estado Atómico (`src/lib/state.js`)
189
+ - **Objetivo**: Proveer lectura robusta con compatibilidad legacy y escritura atómica a prueba de fallos de `.gemstack/state.json` y sidecar `.gemstack.json`.
190
+ - **Archivos**: `src/lib/state.js`
191
+ - **Dependencias**: T003.
192
+ - **Detalle de Pasos**:
193
+ 1. Crear `src/lib/state.js` usando `node:fs` y `node:path`.
194
+ 2. Implementar `readState(rootPath)`: leer `.gemstack/state.json`, devolver defaults seguros si faltan campos de Upgrade A (`phase_hashes: null`, `findings: []`, `accepted_exceptions: []`).
195
+ 3. Implementar `writeStateAtomic(rootPath, stateObj)`: serializar a JSON formateado (2 espacios), escribir en `${filePath}.tmp.${Date.now()}`, y ejecutar `fs.renameSync` hacia `state.json`.
196
+ 4. Implementar `readSidecar(specDir)` y `writeSidecarAtomic(specDir, sidecarObj)` para el almacenamiento histórico en `specs/<feature>/.gemstack.json`.
197
+ 5. Exportar `{ readState, writeStateAtomic, readSidecar, writeSidecarAtomic }`.
198
+ - **Invariantes Congeladas**:
199
+ - Cero corrupción de estado ante crash o en Windows.
200
+ - Retrocompatibilidad transparente de schema 0.1.
201
+ - **P1 Tests Cubiertos**: Hace pasar `TEST-CONSISTENCY-F02`, `TEST-CONSISTENCY-G02`.
202
+ - **Validación Local**: `node --test tests/findings.test.js`.
203
+ - **Condición de Parada**: Tests de persistencia atómica y legacy state pasando.
204
+
205
+ ---
206
+
207
+ ### [ ] T006 — Parser y Normalizador de Contratos (`src/lib/contracts.js` - Fase 1)
208
+ - **Objetivo**: Extraer y parsear bloques canónicos `gemstack-contracts`, validar JSON, rechazar duplicados y normalizar los 6 tipos.
209
+ - **Archivos**: `src/lib/contracts.js`
210
+ - **Dependencias**: T001.
211
+ - **Detalle de Pasos**:
212
+ 1. Crear `src/lib/contracts.js` usando módulos nativos de Node.js.
213
+ 2. Implementar `extractContractsBlock(markdownContent)`:
214
+ - Usar regex canónica `/```gemstack-contracts\s*\n([\s\S]*?)\n```/g`.
215
+ - Si matches === 0: retornar `{ contracts: [], isLegacy: true }`.
216
+ - Si matches > 1: lanzar `CONTRACT_PARSE_ERROR` ("Multiple gemstack-contracts blocks detected").
217
+ - Si matches === 1: parsear JSON. Si falla sintaxis JSON: lanzar `CONTRACT_PARSE_ERROR`.
218
+ 3. Implementar `validateContractSchemas(contractsArray)`:
219
+ - Validar que sea un array y cada elemento contenga `id`, `type`, `description`.
220
+ - Comprobar duplicados de `id`; si existen, lanzar `CONTRACT_DUPLICATE_ID`.
221
+ - Validar que `type` pertenezca exactamente a los 6 tipos canónicos (`ENUM_SET`, `IDENTITY_TUPLE`, `PROVENANCE_RULE`, `BOOLEAN_INVARIANT`, `BOUNDARY`, `ROADMAP_LIMIT`).
222
+ - Para `BOUNDARY`: forzar que `value` sea estrictamente `'FORBIDDEN'` o `'REQUIRED'`.
223
+ - Para `BOOLEAN_INVARIANT`: forzar que `value` sea booleano estricto (`typeof === 'boolean'`).
224
+ 4. Implementar `normalizeContract(contract)`:
225
+ - Para `ENUM_SET`: ordenar array `values` léxicamente con `.slice().sort()`.
226
+ - Para `IDENTITY_TUPLE`: ordenar array `dimensions` léxicamente con `.slice().sort()`.
227
+ - Para `PROVENANCE_RULE`: ordenar array `provenanceFields` léxicamente con `.slice().sort()`.
228
+ 5. Exportar `{ extractContractsBlock, validateContractSchemas, normalizeContract }`.
229
+ - **Invariantes Congeladas**:
230
+ - Exactamente un bloque canónico o modo `LEGACY`.
231
+ - Ordenación determinista e insensible al orden en arrays de valores.
232
+ - **P1 Tests Cubiertos**: Hace pasar `TEST-CONSISTENCY-A01`, `TEST-CONSISTENCY-A02`, `TEST-CONSISTENCY-A03`.
233
+ - **Validación Local**: `node --test tests/contracts.test.js`.
234
+ - **Condición de Parada**: Tests de parseo y validación estructural pasan al 100%.
235
+
236
+ ---
237
+
238
+ ### [ ] T007 — Validador Semántico y Comparador de Herencia (`src/lib/contracts.js` - Fase 2)
239
+ - **Objetivo**: Implementar comparadores semánticos entre contratos para detectar contradicciones, miembros adicionales, omisiones y resolver herencia acumulativa entre fases.
240
+ - **Archivos**: `src/lib/contracts.js`
241
+ - **Dependencias**: T006.
242
+ - **Detalle de Pasos**:
243
+ 1. Implementar comparadores específicos por tipo en `src/lib/contracts.js`:
244
+ - `compareEnumSet(base, derived)`: si `derived.values` contiene elementos no presentes en `base.values` (o viceversa si está cerrado), generar violación de contradicción.
245
+ - `compareIdentityTuple(base, derived)`: si las dimensiones de `derived` no coinciden exactamente con `base` (después de ordenar), generar violación.
246
+ - `compareProvenanceRule(base, derived)`: validar entidad y verificar que ningún campo de `base.provenanceFields` haya sido omitido en `derived`.
247
+ - `compareBooleanInvariant(base, derived)`: verificar igualdad estricta `base.value === derived.value`.
248
+ - `compareBoundary(base, derived)`: verificar si `derived.value !== base.value` (ej. `FORBIDDEN` vs `REQUIRED`) ➔ emitir violación.
249
+ - `compareRoadmapLimit(base, derived)`: verificar igualdad escalar exacta sin coerción de tipos.
250
+ 2. Implementar `resolvePhaseInheritance(specContracts, planContracts, tasksContracts)`:
251
+ - Consolidar contratos base de SPEC.
252
+ - Agregar contratos nuevos válidos declarados en PLAN.
253
+ - Resolver contratos heredados en TASKS. La omisión en TASKS de contratos ya declarados en SPEC/PLAN no constituye violación (herencia implícita segura).
254
+ 3. Implementar `comparePhaseContracts(sourceContracts, targetContracts, phase)`:
255
+ - Devolver lista estructurada de discrepancias detectadas con `{ contractId, type, sourceValue, targetValue, delta }`.
256
+ 4. Exportar funciones comparadoras y de herencia.
257
+ - **Invariantes Congeladas**:
258
+ - 1 hallazgo por `(contractId, phase, violationType)`.
259
+ - Herencia acumulativa segura y aditiva.
260
+ - **P1 Tests Cubiertos**: Hace pasar `TEST-CONSISTENCY-B01`, `TEST-CONSISTENCY-B02`, `TEST-CONSISTENCY-B03`, `TEST-CONSISTENCY-B04`, `TEST-CONSISTENCY-B05`, `TEST-CONSISTENCY-B06`, `TEST-CONSISTENCY-B07`, `TEST-CONSISTENCY-B08`.
261
+ - **Validación Local**: `node --test tests/contracts.test.js`.
262
+ - **Condición de Parada**: La suite completa `tests/contracts.test.js` pasa con 11/11 aserciones.
263
+
264
+ ---
265
+
266
+ ## Ola 3 — Findings & Anti-Loop: Ciclo de Vida y Detección de Desviaciones
267
+
268
+ ### [ ] T008 — Motor de Hallazgos y Fingerprints Canónicos (`src/lib/findings.js` - Fase 1)
269
+ - **Objetivo**: Generar fingerprints SHA-256 canónicos de 64 caracteres en minúsculas y construir el modelo unificado de hallazgo (`Finding`).
270
+ - **Archivos**: `src/lib/findings.js`
271
+ - **Dependencias**: T004, T007.
272
+ - **Detalle de Pasos**:
273
+ 1. Crear `src/lib/findings.js` usando `node:crypto` y `src/lib/hasher.js`.
274
+ 2. Implementar `computeFindingFingerprint({ code, contractId, phase, location })`:
275
+ - Normalizar `location` a formato POSIX relativo (`hasher.normalizePath`).
276
+ - Armar objeto canónico `{ code, contractId: contractId ?? null, phase, location }`.
277
+ - Serializar a JSON ordenado determinista.
278
+ - Calcular `createHash('sha256').update(serialized).digest('hex')` (64 caracteres hex).
279
+ 3. Implementar `formatDisplayFingerprint(fingerprint)`:
280
+ - Retornar `fingerprint.slice(0, 12)` para salida visual por consola/logs, manteniendo el digest de 64 caracteres como identificador interno e inmutable de persistencia.
281
+ 4. Implementar función constructora `createFinding({ code, contractId, phase, location, delta, details })`:
282
+ - Generar objeto `Finding` con `fingerprint`, `display_id`, `status: 'OPEN'`, `detected_at: new Date().toISOString()`, `delta`.
283
+ 5. Exportar `{ computeFindingFingerprint, formatDisplayFingerprint, createFinding }`.
284
+ - **Invariantes Congeladas**:
285
+ - Fingerprint de persistencia y anti-loop es 64 caracteres hex SHA-256.
286
+ - Display token es cosmético y de longitud fija (12 chars).
287
+ - **P1 Tests Cubiertos**: Hace pasar `TEST-CONSISTENCY-D01`.
288
+ - **Validación Local**: `node --test tests/findings.test.js`.
289
+ - **Condición de Parada**: Test de fingerprints pasa al 100%.
290
+
291
+ ---
292
+
293
+ ### [ ] T009 — Motor Anti-Loop, Excepciones Aceptadas y Ciclo de Vida (`src/lib/findings.js` - Fase 2)
294
+ - **Objetivo**: Gestionar transiciones de estado de hallazgos (`OPEN`, `RESOLVED`, `ACCEPTED_EXCEPTION`, `SUPERSEDED`), re-apertura automática y validación de contexto completo para excepciones aceptadas.
295
+ - **Archivos**: `src/lib/findings.js`
296
+ - **Dependencias**: T008.
297
+ - **Detalle de Pasos**:
298
+ 1. Implementar `reconcileFindings(existingFindings, currentViolations, currentArtifactHashes)`:
299
+ - Deduplicar violaciones actuales para generar como máximo 1 hallazgo por `(contractId, phase, violationType)`.
300
+ - Para cada hallazgo existente:
301
+ - Si la violación ya no existe en el análisis actual: marcar como `RESOLVED`, actualizando `resolved_at`.
302
+ - Si la violación persiste y estaba marcada como `RESOLVED`: reabrir como `OPEN` (anti-loop: previene auto-resolución falsa).
303
+ - Incorporar nuevas violaciones como `OPEN`.
304
+ 2. Implementar `computeContextHash({ upstreamAcceptedPhaseHash, currentComparedPhaseHash, normalizedContractRepresentation })`:
305
+ - Calcular SHA-256 canónico (64 caracteres hex) de la tupla determinista de contexto.
306
+ - Garantizar que la identidad del contexto de la excepción no dependa únicamente del hash de un único archivo.
307
+ 3. Implementar `evaluateAcceptedExceptions(findings, acceptedExceptions, currentContext)`:
308
+ - Para cada hallazgo con un registro en `acceptedExceptions`:
309
+ - Calcular el `contextHash` actual a partir del hash de fase aceptado aguas arriba (`upstreamAcceptedPhaseHash`), el hash de la fase actual comparada (`currentComparedPhaseHash`) y la representación normalizada del contrato (`normalizedContractRepresentation`).
310
+ - Si `exception.contextHash === currentContextHash`: marcar el hallazgo como `ACCEPTED_EXCEPTION` y suprimir el bloqueo (`is_blocking: false`).
311
+ - Si el hash no coincide (mutó el contrato upstream, mutó la fase comparada o cambió la semántica del contrato): invalidar excepción, reactivar hallazgo como `OPEN` bloqueante y emitir advertencia de re-evaluación necesaria.
312
+ 4. Implementar `markSupersededFindings(findings, amendedContracts)`:
313
+ - Marcar como `SUPERSEDED` aquellos hallazgos asociados a contratos que fueron formalmente enmendados o retirados por aprobación humana.
314
+ 5. Exportar `{ computeContextHash, reconcileFindings, evaluateAcceptedExceptions, markSupersededFindings }`.
315
+ - **Invariantes Congeladas**:
316
+ - Anti-loop: Cero supresión ciega si el defecto físico persiste.
317
+ - Excepción solo suprime si su `contextHash` completo coincide; cualquier cambio en upstream, fase actual o contrato normalizado invalida la supresión.
318
+ - **P1 Tests Cubiertos**: Hace pasar `TEST-CONSISTENCY-D02`, `TEST-CONSISTENCY-E01`, `TEST-CONSISTENCY-E02`.
319
+ - **Validación Local**: `node --test tests/findings.test.js`.
320
+ - **Condición de Parada**: La suite completa `tests/findings.test.js` pasa con 6/6 aserciones.
321
+
322
+ ---
323
+
324
+ ## Ola 4 — CLI & Integration: Integración en `gemstack verify` y Suite de Regresión
325
+
326
+ ### [ ] T010 — Integración de Consistencia y Hashes en `src/commands/verify.js`
327
+ - **Objetivo**: Extender el pipeline de verificación incorporando el Paso 4: Consistencia de Arquitectura y Congelamiento de Fases, respetando modo Legacy e inmutabilidad de hashes.
328
+ - **Archivos**: `src/commands/verify.js`
329
+ - **Dependencias**: T004, T005, T007, T009.
330
+ - **Detalle de Pasos**:
331
+ 1. Importar `hasher.js`, `contracts.js`, `findings.js`, y `state.js` en `src/commands/verify.js`.
332
+ 2. Implementar Paso 4 dentro de `verify(options)`:
333
+ - Leer `state.json` mediante `state.readState()`.
334
+ - Si no hay `active_spec` configurado o no existe el directorio: omitir paso con mensaje informativo.
335
+ - Determinar ruta de `spec.md`, `plan.md`, `tasks.md`.
336
+ - Extraer contratos de `spec.md`: si no contiene bloques ````gemstack-contracts, declarar modo `[LEGACY]` y continuar sin error.
337
+ - **Verificación de Congelamiento**: Si `state.phase_hashes?.spec` existe, calcular hash actual de `spec.md` con `hasher.hashFile`. Si difiere: emitir error bloqueante `FROZEN_ARTIFACT_CHANGED`.
338
+ - Si `plan.md` existe:
339
+ - Extraer contratos de `plan.md`.
340
+ - Validar consistencia contra `spec.md` mediante `contracts.comparePhaseContracts`.
341
+ - Si `state.phase_hashes?.plan` existe, verificar inmutabilidad del hash.
342
+ - Si `tasks.md` existe:
343
+ - Extraer contratos de `tasks.md`.
344
+ - Validar herencia acumulativa (`spec` + `plan`).
345
+ - Si `state.phase_hashes?.tasks` existe, verificar inmutabilidad del hash.
346
+ - Reconciliar hallazgos con `findings.reconcileFindings` y evaluar excepciones con `findings.evaluateAcceptedExceptions`.
347
+ - Contabilizar bloqueadores abiertos (`open_blockers`). Si `open_blockers > 0`: incrementar `totalErrors` y emitir resumen formateado con display fingerprints.
348
+ - **Garantía Inmutable**: Asegurar que `verify.js` NUNCA escriba ni actualice `phase_hashes` en `state.json` (solo el comando explícito o aprobación de fase puede hacerlo).
349
+ - **Invariantes Congeladas**:
350
+ - `VERIFY != FREEZE`: verificación estrictamente de solo lectura sobre hashes.
351
+ - Modo `LEGACY` garantizado para proyectos/specs existentes.
352
+ - **P1 Tests Cubiertos**: Hace pasar `TEST-CONSISTENCY-C03`, `TEST-CONSISTENCY-F01`.
353
+ - **Validación Local**: `node src/cli.js verify`.
354
+ - **Condición de Parada**: El comando `verify` ejecuta el nuevo Paso 4 limpiamente.
355
+
356
+ ---
357
+
358
+ ### [ ] T011 — Suite de Integración y Regresión (`tests/verify.test.js`)
359
+ - **Objetivo**: Extender `tests/verify.test.js` para probar la integración completa del comando `verify` con contratos, hashes, modo legacy e invariancia de no mutación.
360
+ - **Archivos**: `tests/verify.test.js`
361
+ - **Dependencias**: T010.
362
+ - **Detalle de Pasos**:
363
+ 1. Abrir `tests/verify.test.js`.
364
+ 2. Implementar `TEST-CONSISTENCY-C03`: Probar que invocar `verify` sobre un repositorio con hashes congelados no altera los hashes almacenados en `state.json`.
365
+ 3. Implementar `TEST-CONSISTENCY-F01`: Probar que un repositorio con feature activa sin bloques `gemstack-contracts` finaliza exitosamente en modo `LEGACY`.
366
+ 4. Implementar `TEST-CONSISTENCY-H01`: Probar que `verify` ejecuta todas las comprobaciones preexistentes (Constitution, Rules, Spec, Plan, CI/CD) sin degradación.
367
+ 5. Implementar `TEST-CONSISTENCY-H02`: Ejecutar la suite completa preexistente (`tests/init.test.js`, `tests/verify.test.js`) certificando 100% de éxito.
368
+ - **Invariantes Congeladas**:
369
+ - Cero regresión en funcionalidades existentes de Gemstack.
370
+ - **P1 Tests Cubiertos**: `TEST-CONSISTENCY-C03`, `TEST-CONSISTENCY-F01`, `TEST-CONSISTENCY-H01`, `TEST-CONSISTENCY-H02`.
371
+ - **Validación Local**: `node --test tests/verify.test.js`.
372
+ - **Condición de Parada**: Todos los tests de integración y regresión pasan al 100%.
373
+
374
+ ---
375
+
376
+ ## Ola 5 — Templates, Rules & Constitution: Estandarización de Contratos
377
+
378
+ ### [ ] T012 — Actualización de Plantillas Markdown (`specs/templates/`)
379
+ - **Objetivo**: Incorporar la sección canónica de contratos congelados (`gemstack-contracts`) en las plantillas oficiales del framework.
380
+ - **Archivos**:
381
+ - `specs/templates/spec.md`
382
+ - `specs/templates/plan.md`
383
+ - `specs/templates/tasks.md`
384
+ - **Dependencias**: T010.
385
+ - **Detalle de Pasos**:
386
+ 1. Actualizar `specs/templates/spec.md`:
387
+ - Agregar bloque ````gemstack-contracts ```` como obligatorio para nuevas specs con instrucciones de uso de los 6 tipos canónicos.
388
+ - Documentar los campos obligatorios: `id`, `type`, `description` y payloads por tipo (`values`, `dimensions`, `provenanceFields`, `value`, `limit`).
389
+ 2. Actualizar `specs/templates/plan.md`:
390
+ - Agregar sección para declarar contratos derivados o adicionales respetando la herencia estricta de la spec.
391
+ 3. Actualizar `specs/templates/tasks.md`:
392
+ - Agregar sección de contratos heredados y recordatorio de Test-First Imperative.
393
+ - **Invariantes Congeladas**:
394
+ - Bloque canónico único por artefacto.
395
+ - **Validación Local**: Revisión visual y lint de formato en archivos de plantilla.
396
+ - **Condición de Parada**: Plantillas documentadas y con sintaxis JSON canónica válida.
397
+
398
+ ---
399
+
400
+ ### [ ] T013 — Actualización de Documentación Constitucional y Reglas del Framework
401
+ - **Objetivo**: Consagrar el congelamiento de fases, la inmutabilidad de contratos y la prohibición de enmiendas silenciosas en las reglas base.
402
+ - **Archivos**:
403
+ - `.agents/rules/01-gemstack-core.md`
404
+ - `.agents/rules/02-gemstack-constitution.md`
405
+ - **Dependencias**: T012.
406
+ - **Detalle de Pasos**:
407
+ 1. En `01-gemstack-core.md`:
408
+ - Formalizar la regla de Phase Freezing: Al aprobar SPEC/PLAN/TASKS, el artefacto queda sellado criptográficamente vía SHA-256.
409
+ - Establecer que las enmiendas requieren aprobación humana explícita.
410
+ 2. En `02-gemstack-constitution.md`:
411
+ - Consagrar el "Article IX: Architecture Consistency & Immutability Gate".
412
+ - Sancionar formalmente el "Architecture Drift" como fallo crítico bloqueante de CI/CD.
413
+ - **Invariantes Congeladas**:
414
+ - Aprobación humana explícita requerida para modificar contratos congelados.
415
+ - **Validación Local**: `npm run gemstack:verify` para comprobar gates constitucionales.
416
+ - **Condición de Parada**: Reglas sincronizadas sin conflictos.
417
+
418
+ ---
419
+
420
+ ### [ ] T014 — Actualización de Skills de Gemstack (`.agents/skills/`)
421
+ - **Objetivo**: Entrenar y restringir los agentes de flujo para emitir, respetar y verificar contratos congelados.
422
+ - **Archivos**:
423
+ - `.agents/skills/gemstack-spec/SKILL.md`
424
+ - `.agents/skills/gemstack-plan/SKILL.md`
425
+ - `.agents/skills/gemstack-tasks/SKILL.md`
426
+ - `.agents/skills/gemstack-review/SKILL.md`
427
+ - **Dependencias**: T013.
428
+ - **Detalle de Pasos**:
429
+ 1. En `gemstack-spec`: Exigir la generación obligatoria del bloque `gemstack-contracts` con al menos los contratos arquitectónicos clave del feature.
430
+ 2. En `gemstack-plan`: Prohibir alteraciones no autorizadas a los contratos heredados de la spec y obligar a documentar extensiones compatibles.
431
+ 3. En `gemstack-tasks`: Recordar que TASKS debe traducir la validación de contratos en tareas de prueba explícitas previas a la implementación.
432
+ 4. En `gemstack-review`: Incorporar el chequeo mecánico de consistencia como paso mandatorio previo al veredicto de cierre.
433
+ - **Invariantes Congeladas**:
434
+ - Zero Assumptions y flujo SDD preservado.
435
+ - **Validación Local**: Inspección de skills y coherencia con el framework.
436
+ - **Condición de Parada**: Skills alineados con las capacidades de Upgrade A.
437
+
438
+ ---
439
+
440
+ ## Ola 6 — Bootstrap Dogfooding, Certificación P1 y Cierre de Implementación
441
+
442
+ ### [ ] T015 — Ejecución Integral de la Matriz P1 de 25 Tests
443
+ - **Objetivo**: Ejecutar la suite completa y certificar que los 25 tests P1 pasan con 100% de éxito de forma reproducible.
444
+ - **Archivos**:
445
+ - `tests/contracts.test.js`
446
+ - `tests/hasher.test.js`
447
+ - `tests/findings.test.js`
448
+ - `tests/verify.test.js`
449
+ - **Dependencias**: T001 a T014.
450
+ - **Detalle de Pasos**:
451
+ 1. Ejecutar `node --test tests/contracts.test.js` (11 tests: A01-A03, B01-B08).
452
+ 2. Ejecutar `node --test tests/hasher.test.js` (4 tests: C01, C02, C04, G01).
453
+ 3. Ejecutar `node --test tests/findings.test.js` (6 tests: D01, D02, E01, E02, F02, G02).
454
+ 4. Ejecutar `node --test tests/verify.test.js` (4 tests: C03, F01, H01, H02).
455
+ 5. Confirmar conteo total de aserciones: Exactamente 25/25 tests P1 aprobados.
456
+ - **Invariantes Congeladas**:
457
+ - Exact mechanical total = 25 tests. Cero tests salteados o con mocks artificiales.
458
+ - **Validación Local**: `npm test`.
459
+ - **Condición de Parada**: Todos los 25 tests P1 pasan en verde.
460
+
461
+ ---
462
+
463
+ ### [ ] T016 — Sellado Criptográfico Dogfooding (Bootstrap Feature 006)
464
+ - **Objetivo**: Calcular y sellar formalmente los hashes de fase de `specs/006-architecture-consistency-engine/` en `.gemstack/state.json`.
465
+ - **Archivos**: `.gemstack/state.json`
466
+ - **Dependencias**: T015.
467
+ - **Detalle de Pasos**:
468
+ 1. Utilizar `src/lib/hasher.js` para calcular el SHA-256 canónico de `specs/006-architecture-consistency-engine/spec.md`, `plan.md` y `tasks.md`.
469
+ 2. Actualizar `.gemstack/state.json` incorporando:
470
+ ```json
471
+ "phase_hashes": {
472
+ "spec": "<hash-sha256-spec>",
473
+ "plan": "<hash-sha256-plan>",
474
+ "tasks": "<hash-sha256-tasks>"
475
+ }
476
+ ```
477
+ 3. Ejecutar `writeStateAtomic` para persistir el estado actualizado de forma segura.
478
+ - **Invariantes Congeladas**:
479
+ - El sellado es una operación explícita de fase, nunca un efecto colateral de `verify`.
480
+ - **Validación Local**: Comprobar persistencia correcta y estructura JSON de `.gemstack/state.json`.
481
+ - **Condición de Parada**: Hashes formalmente registrados en el estado activo.
482
+
483
+ ---
484
+
485
+ ### [ ] T017 — Verificación Global del Sistema y CI/CD Gate
486
+ - **Objetivo**: Certificar la salud absoluta del repositorio ejecutando la verificación unificada de Gemstack.
487
+ - **Archivos**: Todo el repositorio.
488
+ - **Dependencias**: T016.
489
+ - **Detalle de Pasos**:
490
+ 1. Ejecutar `npm run gemstack:verify`.
491
+ 2. Comprobar que el Paso 4 (Consistencia y Hashes de Fase) reporte:
492
+ - Detección exitosa de `specs/006-architecture-consistency-engine/`.
493
+ - Validación de los 5 contratos dogfood sin contradicciones (`zero-dependency-core`, `upgrade-a-contract-types`, etc.).
494
+ - Verificación exitosa de los hashes congelados de `spec.md`, `plan.md` y `tasks.md`.
495
+ - Cero bloqueadores abiertos (`0 open blockers`).
496
+ 3. Comprobar que `npm test` pase al 100%.
497
+ - **Invariantes Congeladas**:
498
+ - Cero errores constitucionales, cero warnings bloqueantes.
499
+ - **Validación Local**: `npm run gemstack:verify && npm test`.
500
+ - **Condición de Parada**: CI/CD en estado VERDE absoluto.
501
+
502
+ ---
503
+
504
+ ## Matriz de Trazabilidad de Tests P1 por Tarea (Total = 25)
505
+
506
+ | Test ID | Categoría | Archivo de Prueba | Tarea TDD (Fase Roja) | Tarea de Implementación |
507
+ |---|---|---|---|---|
508
+ | `TEST-CONSISTENCY-A01` | Parsing | `tests/contracts.test.js` | T001 | T006 |
509
+ | `TEST-CONSISTENCY-A02` | Parsing | `tests/contracts.test.js` | T001 | T006 |
510
+ | `TEST-CONSISTENCY-A03` | Parsing | `tests/contracts.test.js` | T001 | T006 |
511
+ | `TEST-CONSISTENCY-B01` | Cross-Phase | `tests/contracts.test.js` | T001 | T007 |
512
+ | `TEST-CONSISTENCY-B02` | Cross-Phase | `tests/contracts.test.js` | T001 | T007 |
513
+ | `TEST-CONSISTENCY-B03` | Cross-Phase | `tests/contracts.test.js` | T001 | T007 |
514
+ | `TEST-CONSISTENCY-B04` | Cross-Phase | `tests/contracts.test.js` | T001 | T007 |
515
+ | `TEST-CONSISTENCY-B05` | Cross-Phase | `tests/contracts.test.js` | T001 | T007 |
516
+ | `TEST-CONSISTENCY-B06` | Cross-Phase | `tests/contracts.test.js` | T001 | T007 |
517
+ | `TEST-CONSISTENCY-B07` | Cross-Phase | `tests/contracts.test.js` | T001 | T007 |
518
+ | `TEST-CONSISTENCY-B08` | Cross-Phase | `tests/contracts.test.js` | T001 | T007 |
519
+ | `TEST-CONSISTENCY-C01` | Hashes | `tests/hasher.test.js` | T002 | T004 |
520
+ | `TEST-CONSISTENCY-C02` | Hashes | `tests/hasher.test.js` | T002 | T004 |
521
+ | `TEST-CONSISTENCY-C03` | Hashes | `tests/verify.test.js` | T011 | T010 |
522
+ | `TEST-CONSISTENCY-C04` | Hashes | `tests/hasher.test.js` | T002 | T004 |
523
+ | `TEST-CONSISTENCY-D01` | Fingerprints | `tests/findings.test.js` | T003 | T008 |
524
+ | `TEST-CONSISTENCY-D02` | Anti-Loop | `tests/findings.test.js` | T003 | T009 |
525
+ | `TEST-CONSISTENCY-E01` | Excepciones | `tests/findings.test.js` | T003 | T009 |
526
+ | `TEST-CONSISTENCY-E02` | Excepciones | `tests/findings.test.js` | T003 | T009 |
527
+ | `TEST-CONSISTENCY-F01` | Legacy | `tests/verify.test.js` | T011 | T010 |
528
+ | `TEST-CONSISTENCY-F02` | Legacy | `tests/findings.test.js` | T003 | T005 |
529
+ | `TEST-CONSISTENCY-G01` | Windows | `tests/hasher.test.js` | T002 | T004 |
530
+ | `TEST-CONSISTENCY-G02` | Windows | `tests/findings.test.js` | T003 | T005 |
531
+ | `TEST-CONSISTENCY-H01` | Regresión | `tests/verify.test.js` | T011 | T010 |
532
+ | `TEST-CONSISTENCY-H02` | Regresión | `tests/verify.test.js` | T011 | T011 |
@@ -36,3 +36,14 @@ ruta/archivo: [Razón]
36
36
  | Violación de Regla | Por qué es necesario | Alternativa simple rechazada por |
37
37
  |--------------------|----------------------|-----------------------------------|
38
38
  | [Ej. Wrapper] | [Razón] | [Razón] |
39
+
40
+ ## 6. Contratos Aditivos del Plan (Opcional - Upgrade A)
41
+ <!--
42
+ Hereda automáticamente los contratos de spec.md.
43
+ Si se requieren contratos técnicos adicionales compatibles, declararlos aquí en un bloque canónico.
44
+ No modifiques contratos de spec sin aprobación explícita de enmienda.
45
+ -->
46
+ ```gemstack-contracts
47
+ [
48
+ ]
49
+ ```
@@ -33,3 +33,20 @@
33
33
  ## 5. Entidades Clave (Data / Models)
34
34
  - **[Entidad 1]**: [Representación abstracta]
35
35
  - **[Entidad 2]**: [Relación]
36
+
37
+ ## 6. Contratos Arquitectónicos Congelados (Opcional - Upgrade A)
38
+ <!--
39
+ Declara decisiones arquitectónicas congeladas usando el bloque canónico.
40
+ Tipos soportados: ENUM_SET, IDENTITY_TUPLE, PROVENANCE_RULE, BOOLEAN_INVARIANT, BOUNDARY, ROADMAP_LIMIT.
41
+ Si no se incluye este bloque, la feature operará en modo LEGACY.
42
+ -->
43
+ ```gemstack-contracts
44
+ [
45
+ {
46
+ "id": "feature-invariants",
47
+ "type": "BOOLEAN_INVARIANT",
48
+ "value": true,
49
+ "description": "Invariante principal congelada para este feature"
50
+ }
51
+ ]
52
+ ```
@@ -4,6 +4,7 @@
4
4
  Instrucciones:
5
5
  - Marca con `[P]` las tareas que sean seguras de paralelizar (por ej. si usas múltiples subagentes).
6
6
  - Incluye la redacción y validación de TESTS ANTES de la implementación real.
7
+ - Hereda los contratos congelados de SPEC y PLAN por defecto (no se requiere bloque de contratos).
7
8
  -->
8
9
 
9
10
  ## Fase 1: Tests (Test-First Imperative)
package/src/cli.js CHANGED
@@ -8,6 +8,7 @@ const listCommand = require('./commands/list');
8
8
  const showCommand = require('./commands/show');
9
9
  const hooksCommand = require('./commands/hooks');
10
10
  const installCommand = require('./commands/install');
11
+ const verifyCommand = require('./commands/verify');
11
12
 
12
13
  async function main() {
13
14
  const { command, args, flags } = parser.parse(process.argv);
@@ -18,6 +19,7 @@ Commands:
18
19
  init Install Gemstack scaffolding
19
20
  update Update Gemstack-owned files
20
21
  doctor Check health of the installation
22
+ verify Run complete integrity, state, memory and security audit (alias: audit)
21
23
  list List available skills
22
24
  show Show content of a skill
23
25
  handoff Show content of handoff.md
@@ -25,10 +27,11 @@ Commands:
25
27
  install Install a remote skill via URL
26
28
  mcp Start the Gemstack MCP (Model Context Protocol) server over stdio
27
29
  Options:
28
- --dry-run Show changes without writing
29
- --yes Skip confirmations
30
- --force Force overwrite (update only)
31
- --target Specify target directory`);
30
+ --dry-run Show changes without writing
31
+ --yes Skip confirmations
32
+ --force Force overwrite (update only)
33
+ --target Specify target directory
34
+ --run-tests Run test suite during verify`);
32
35
  return;
33
36
  }
34
37
 
@@ -37,6 +40,8 @@ Options:
37
40
  case 'init': await initCommand(flags); break;
38
41
  case 'update': await updateCommand(flags); break;
39
42
  case 'doctor': await doctorCommand(flags); break;
43
+ case 'verify':
44
+ case 'audit': await verifyCommand(flags); break;
40
45
  case 'list': await listCommand(flags); break;
41
46
  case 'show': await showCommand(args[0], flags); break;
42
47
  case 'hooks': hooksCommand.installHooks(flags.target); break;