gemstack-ai 1.0.1 → 1.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.
- package/.agents/rules/01-gemstack-core.md +15 -0
- package/.agents/rules/02-gemstack-constitution.md +12 -1
- package/.agents/skills/gemstack-handoff/SKILL.md +2 -1
- package/.agents/skills/gemstack-plan/SKILL.md +3 -1
- package/.agents/skills/gemstack-qa/SKILL.md +3 -0
- package/.agents/skills/gemstack-review/SKILL.md +7 -5
- package/.agents/skills/gemstack-ship/SKILL.md +10 -1
- package/.agents/skills/gemstack-spec/SKILL.md +4 -2
- package/.agents/skills/gemstack-tasks/SKILL.md +5 -3
- package/.gemstack/state.json +18 -2
- package/CHANGELOG.md +84 -0
- package/MANUAL.md +4 -4
- package/README.md +49 -8
- package/RELEASE_NOTES.md +129 -0
- package/assets/logo.jpg +0 -0
- package/docs/architecture-consistency.md +156 -0
- package/docs/spec-driven-development.md +26 -0
- package/gemstack-ai-1.2.0.tgz +0 -0
- package/handoff.md +40 -40
- package/package.json +3 -2
- package/scripts/ci/smoke-cli.js +1 -0
- package/specs/006-architecture-consistency-engine/.gemstack.json +9 -0
- package/specs/006-architecture-consistency-engine/plan.md +319 -0
- package/specs/006-architecture-consistency-engine/spec.md +179 -0
- package/specs/006-architecture-consistency-engine/tasks.md +532 -0
- package/specs/007-mechanical-test-matrix-closure-evidence/.gemstack.json +5 -0
- package/specs/007-mechanical-test-matrix-closure-evidence/closure.json +59 -0
- package/specs/007-mechanical-test-matrix-closure-evidence/plan.md +484 -0
- package/specs/007-mechanical-test-matrix-closure-evidence/spec.md +597 -0
- package/specs/007-mechanical-test-matrix-closure-evidence/tasks.md +536 -0
- package/specs/templates/plan.md +41 -0
- package/specs/templates/spec.md +35 -0
- package/specs/templates/tasks.md +10 -0
- package/src/cli.js +15 -4
- package/src/commands/collect.js +340 -0
- package/src/commands/ship.js +79 -0
- package/src/commands/verify.js +433 -0
- package/src/lib/closure-context.js +444 -0
- package/src/lib/contracts.js +388 -0
- package/src/lib/findings.js +227 -0
- package/src/lib/hasher.js +103 -0
- package/src/lib/runner-adapters.js +347 -0
- package/src/lib/state.js +143 -0
- package/src/lib/test-matrix.js +187 -0
- package/src/mcp-server.js +1 -1
- package/template/.agents/rules/01-gemstack-core.md +15 -0
- package/template/.agents/rules/02-gemstack-constitution.md +12 -1
- package/template/.agents/skills/gemstack-handoff/SKILL.md +2 -1
- package/template/.agents/skills/gemstack-plan/SKILL.md +2 -1
- package/template/.agents/skills/gemstack-review/SKILL.md +7 -5
- package/template/.agents/skills/gemstack-ship/SKILL.md +5 -0
- package/template/.agents/skills/gemstack-spec/SKILL.md +3 -2
- package/template/.agents/skills/gemstack-tasks/SKILL.md +4 -3
- package/template/docs/architecture-consistency.md +144 -0
- package/template/specs/templates/plan.md +11 -0
- package/template/specs/templates/spec.md +17 -0
- package/template/specs/templates/tasks.md +1 -0
- package/gemstack-ai-1.0.1.tgz +0 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# Especificación de Funcionalidad: Architecture Consistency Engine & Phase Freezing (Upgrade A)
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `006-architecture-consistency-engine`
|
|
4
|
+
**Feature Slug**: `specs/006-architecture-consistency-engine/`
|
|
5
|
+
**Lifecycle Status**: `SPEC_COMPLETE`
|
|
6
|
+
**Stop Reason**: `SPEC_COMPLETE_AWAITING_REVIEW`
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. Contexto y Objetivos (Upgrade A)
|
|
11
|
+
|
|
12
|
+
El framework Gemstack opera como un motor de disciplina para desarrollo con IA basado en Spec-Driven Development (SDD):
|
|
13
|
+
`SPEC → PLAN → TASKS → IMPLEMENT → QA / REVIEW → SHIP → HANDOFF`.
|
|
14
|
+
|
|
15
|
+
El objetivo de **Upgrade A** es incorporar una capa determinista de **detección de desviaciones arquitectónicas (Architecture Drift)** y **congelamiento de fases (Phase Freezing)** sin alterar el flujo existente, sin rediseñar el core y sin agregar dependencias externas (preservando el principio Zero-Dependency Node.js).
|
|
16
|
+
|
|
17
|
+
### Dogfooding & Bootstrap Contracts
|
|
18
|
+
Esta especificación define formalmente sus propios contratos congelados (`gemstack-contracts`), los cuales operan en modo auto-hospedado (*bootstrap mode*) y serán validados por el propio motor una vez implementado:
|
|
19
|
+
|
|
20
|
+
```gemstack-contracts
|
|
21
|
+
[
|
|
22
|
+
{
|
|
23
|
+
"id": "zero-dependency-core",
|
|
24
|
+
"type": "BOOLEAN_INVARIANT",
|
|
25
|
+
"value": true,
|
|
26
|
+
"description": "El runtime de Gemstack debe mantener cero dependencias externas de producción en Node.js."
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "upgrade-a-contract-types",
|
|
30
|
+
"type": "ENUM_SET",
|
|
31
|
+
"values": [
|
|
32
|
+
"ENUM_SET",
|
|
33
|
+
"IDENTITY_TUPLE",
|
|
34
|
+
"PROVENANCE_RULE",
|
|
35
|
+
"BOOLEAN_INVARIANT",
|
|
36
|
+
"BOUNDARY",
|
|
37
|
+
"ROADMAP_LIMIT"
|
|
38
|
+
],
|
|
39
|
+
"description": "Tipos de contrato deterministas soportados canónicamente en Upgrade A."
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "verify-does-not-mutate-hashes",
|
|
43
|
+
"type": "BOOLEAN_INVARIANT",
|
|
44
|
+
"value": true,
|
|
45
|
+
"description": "El comando gemstack verify valida contra hashes congelados pero nunca actualiza ni sobreescribe los hashes de fase."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": "contract-amendment-requires-human-approval",
|
|
49
|
+
"type": "BOOLEAN_INVARIANT",
|
|
50
|
+
"value": true,
|
|
51
|
+
"description": "Cualquier enmienda a un contrato congelado o artefacto inmutable requiere aprobación humana explícita."
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"id": "legacy-mode-supported",
|
|
55
|
+
"type": "BOOLEAN_INVARIANT",
|
|
56
|
+
"value": true,
|
|
57
|
+
"description": "Features sin bloques de contratos operan en modo legacy sin romper compatibilidad ni generar falsos bloqueos."
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 2. User Scenarios & Testing (MVP)
|
|
65
|
+
|
|
66
|
+
### User Story 1 — Detección Determinista de Contradicciones Arquitectónicas (P1)
|
|
67
|
+
Como desarrollador o revisor técnico, quiero que Gemstack bloquee el avance de fase si un PLAN o TASKS introduce valores en enums no aprobados, altera tuplas de identidad o descarta campos de procedencia definidos en SPEC.
|
|
68
|
+
**Test Independiente**: `TEST-CONSISTENCY-B01`, `TEST-CONSISTENCY-B02`, `TEST-CONSISTENCY-B03`.
|
|
69
|
+
|
|
70
|
+
### User Story 2 — Congelamiento y Detección de Mutación de Artefactos (P1)
|
|
71
|
+
Como arquitecto de software, quiero que cada artefacto aprobado (`spec.md`, `plan.md`, `tasks.md`) quede sellado con un hash criptográfico SHA-256 en `.gemstack/state.json`, de modo que cualquier mutación posterior sin enmienda formal detenga el avance con `FROZEN_ARTIFACT_CHANGED`.
|
|
72
|
+
**Test Independiente**: `TEST-CONSISTENCY-C01`, `TEST-CONSISTENCY-C02`, `TEST-CONSISTENCY-C03`.
|
|
73
|
+
|
|
74
|
+
### User Story 3 — Anti-Loop y Huella Digital de Hallazgos (P1)
|
|
75
|
+
Como agente de IA y usuario humano, quiero que los hallazgos tengan una huella determinista (*fingerprint*) y que las observaciones resueltas o aceptadas como excepción no se reabran indefinidamente si el artefacto no ha mutado.
|
|
76
|
+
**Test Independiente**: `TEST-CONSISTENCY-D01`, `TEST-CONSISTENCY-E01`.
|
|
77
|
+
|
|
78
|
+
### User Story 4 — Compatibilidad Transparente con Proyectos Legados (P1)
|
|
79
|
+
Como usuario con especificaciones existentes (001 a 005), quiero que `gemstack verify` y el flujo SDD sigan funcionando con total normalidad sin requerir migración obligatoria.
|
|
80
|
+
**Test Independiente**: `TEST-CONSISTENCY-F01`.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 3. Requerimientos Funcionales
|
|
85
|
+
|
|
86
|
+
### RF-001: Sintaxis Canónica de Declaración (`gemstack-contracts`)
|
|
87
|
+
- Los contratos congelados se declaran exclusivamente dentro de bloques delimitados ````gemstack-contracts ... ```` en formato JSON en el artefacto de fase (`spec.md` o `plan.md`).
|
|
88
|
+
- La prosa libre fuera del bloque NO se convierte implícitamente en contrato determinista.
|
|
89
|
+
|
|
90
|
+
### RF-002: Tipos de Contrato Soportados en Upgrade A
|
|
91
|
+
1. **`ENUM_SET`**: Conjunto de valores discretos. La comparación es insensible al orden (`normalizeSort`). Los duplicados son inválidos. Bloquea si aparecen miembros nuevos o faltan miembros aprobados.
|
|
92
|
+
2. **`IDENTITY_TUPLE`**: Conjunto semántico de dimensiones de identidad (*semantic set of identity dimensions*). La comparación es insensible al orden (*order-insensitive*), sensible a duplicados (*duplicate-sensitive*) y sensible a miembros exactos (*exact-member-sensitive*). Por ejemplo, `[w, r, l, k]` vs `[k, l, r, w]` ➔ `PASS`; `[w, r, l, k]` vs `[w, r, l]` ➔ `BLOCKED`; `[w, r, l, k]` vs `[w, r, l, k, x]` ➔ `BLOCKED`. El orden original de declaración se preserva exclusivamente para renderizado, visualización de diffs y legibilidad humana, no como semántica arquitectónica de orden en Upgrade A.
|
|
93
|
+
3. **`PROVENANCE_RULE`**: Lista de campos obligatorios para trazabilidad/linaje entre entidades. Bloquea si una entidad posterior omite un campo de procedencia congelado.
|
|
94
|
+
4. **`BOOLEAN_INVARIANT`**: Invariante booleano estricto (`true`/`false`). Bloquea cualquier contradicción directa.
|
|
95
|
+
5. **`BOUNDARY`**: Límites de aislamiento o dependencias arquitectónicas explícitas (ej. `FORBIDDEN` vs `REQUIRED`). Bloquea deterministamente contradicciones explícitas (ej. SPEC declara `FORBIDDEN` y PLAN declara `REQUIRED` ➔ `FROZEN_CONTRACT_VIOLATION`), mientras que declaraciones equivalentes resultan en `PASS`.
|
|
96
|
+
6. **`ROADMAP_LIMIT`**: Límite numérico o escalar inmutable (ej. `FINAL_PLANNED_MVP = 18`).
|
|
97
|
+
|
|
98
|
+
### RF-003: Modelo de Herencia de Contratos y Extensión Aditiva
|
|
99
|
+
- `spec.md` es la raíz y declara los contratos base.
|
|
100
|
+
- `plan.md` hereda automáticamente todos los contratos de `spec.md` y puede añadir nuevos contratos aditivos y compatibles específicos de arquitectura técnica sin requerir duplicar los bloques de contratos heredados.
|
|
101
|
+
- `tasks.md` hereda el registro consolidado (`spec.md` + `plan.md`).
|
|
102
|
+
- El validador distingue extensiones **aditivas no conflictivas** (`PASS`) de **contradicciones o mutaciones no aprobadas** (`BLOCKED`).
|
|
103
|
+
|
|
104
|
+
### RF-004: Hashing Determinista y Normalización CRLF/LF
|
|
105
|
+
- El hash de fase (`specHash`, `planHash`, `tasksHash`) se calcula usando SHA-256 sobre el contenido del archivo con saltos de línea normalizados a LF (`\r\n` ➔ `\n`) y codificación UTF-8.
|
|
106
|
+
- Esto garantiza idéntico hash en Windows, macOS y Linux.
|
|
107
|
+
- `gemstack verify` NUNCA actualiza los hashes de fase; solo la acción formal de freeze/aprobación lo hace.
|
|
108
|
+
|
|
109
|
+
### RF-005: Enmienda Formal de Contratos (`ContractAmendment`)
|
|
110
|
+
- Si la arquitectura cambia legítimamente, se requiere aprobación humana explícita.
|
|
111
|
+
- Al aprobar una enmienda en `spec.md`, el hash de `spec.md` se actualiza y las fases subsiguientes (`plan.md`, `tasks.md`) se marcan como `REQUIRES_REVIEW`.
|
|
112
|
+
|
|
113
|
+
### RF-006: Huellas Digitales (*Fingerprints*), Granularidad y Anti-Loop
|
|
114
|
+
- **Regla de granularidad de hallazgos:** Para una comparación de contratos se genera un único hallazgo consolidado por `contractId + phase + violationType`, conteniendo el delta normalizado completo (ej. miembros faltantes y agregados consolidados en un único hallazgo).
|
|
115
|
+
- **Huella determinista (*fingerprint*):** Cada hallazgo genera un hash: `SHA256(violationType + contractId + phase + normalizedLocation)`. No incluye texto volátil ni timestamps.
|
|
116
|
+
- **Anti-Loop:** Si un hallazgo tiene estado `RESOLVED` o `ACCEPTED_EXCEPTION` y el hash del artefacto no ha cambiado, no se vuelve a generar el bloqueo.
|
|
117
|
+
|
|
118
|
+
### RF-007: Extensiones Aditivas a `.gemstack/state.json`
|
|
119
|
+
- Se preservan todos los campos existentes de `state.json`.
|
|
120
|
+
- Se añade opcionalmente la sección de hashes y consistencia:
|
|
121
|
+
```json
|
|
122
|
+
{
|
|
123
|
+
"phase_hashes": {
|
|
124
|
+
"spec": "<sha256-or-null>",
|
|
125
|
+
"plan": "<sha256-or-null>",
|
|
126
|
+
"tasks": "<sha256-or-null>"
|
|
127
|
+
},
|
|
128
|
+
"consistency": {
|
|
129
|
+
"status": "PASS | BLOCKED | LEGACY",
|
|
130
|
+
"open_blockers": 0
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 4. Criterios de Éxito y Matriz de Aceptación P1 (Exact Mechanical Count = 25)
|
|
138
|
+
|
|
139
|
+
| ID de Prueba | Categoría | Capa de Ejecución | Aserción de Aceptación |
|
|
140
|
+
|---|---|---|---|
|
|
141
|
+
| `TEST-CONSISTENCY-A01` | A — Parsing | Unit (Node) | Parsea correctamente bloques válidos `gemstack-contracts` en JSON. |
|
|
142
|
+
| `TEST-CONSISTENCY-A02` | A — Parsing | Unit (Node) | Emite `CONTRACT_PARSE_ERROR` si el bloque JSON es sintácticamente inválido. |
|
|
143
|
+
| `TEST-CONSISTENCY-A03` | A — Parsing | Unit (Node) | Bloquea con `CONTRACT_DUPLICATE_ID` si dos contratos comparten el mismo `id`. |
|
|
144
|
+
| `TEST-CONSISTENCY-B01` | B — Cross-Phase | Unit (Node) | `ENUM_SET`: detecta adición no aprobada (ej. `PURGED`) y emite `BLOCKED`. |
|
|
145
|
+
| `TEST-CONSISTENCY-B02` | B — Cross-Phase | Unit (Node) | `ENUM_SET`: valida ordenación normalizada (`[A,B,C]` == `[C,B,A]`) como `PASS`. |
|
|
146
|
+
| `TEST-CONSISTENCY-B03` | B — Cross-Phase | Unit (Node) | `IDENTITY_TUPLE`: detecta dimensión faltante (omisión de `kind`) y emite `BLOCKED`. |
|
|
147
|
+
| `TEST-CONSISTENCY-B04` | B — Cross-Phase | Unit (Node) | `IDENTITY_TUPLE`: valida tupla equivalente en orden permutado como `PASS`. |
|
|
148
|
+
| `TEST-CONSISTENCY-B05` | B — Cross-Phase | Unit (Node) | `PROVENANCE_RULE`: bloquea si entidad posterior omite campo de procedencia requerido. |
|
|
149
|
+
| `TEST-CONSISTENCY-B06` | B — Cross-Phase | Unit (Node) | `BOOLEAN_INVARIANT` & `ROADMAP_LIMIT`: bloquea contradicción directa (`true` vs `false`, `18` vs `20`). |
|
|
150
|
+
| `TEST-CONSISTENCY-B07` | B — Cross-Phase | Unit (Node) | `BOUNDARY`: valores estrictos `FORBIDDEN` y `REQUIRED`; detecta contradicción explícita (`FORBIDDEN` vs `REQUIRED` ➔ `BLOCKED`) y valida equivalencia como `PASS`. |
|
|
151
|
+
| `TEST-CONSISTENCY-B08` | B — Cross-Phase | Unit (Node) | Herencia y extensión aditiva: PLAN hereda contratos de SPEC y agrega compatibles sin duplicación; TASKS hereda SPEC + PLAN como `PASS`. |
|
|
152
|
+
| `TEST-CONSISTENCY-C01` | C — Freeze & Hashes | Unit (Node) | Almacena `specHash` SHA-256 al congelar la fase SPEC. |
|
|
153
|
+
| `TEST-CONSISTENCY-C02` | C — Freeze & Hashes | Unit (Node) | Detecta mutación no autorizada de `spec.md` con `FROZEN_ARTIFACT_CHANGED`. |
|
|
154
|
+
| `TEST-CONSISTENCY-C03` | C — Freeze & Hashes | Unit (Node) | `verify` valida contra hashes almacenados y NO los reescribe silenciosamente. |
|
|
155
|
+
| `TEST-CONSISTENCY-C04` | C — Freeze & Hashes | Unit (Node) | Normalización CRLF/LF produce idéntico hash en Windows y POSIX. |
|
|
156
|
+
| `TEST-CONSISTENCY-D01` | D — Fingerprints | Unit (Node) | Genera fingerprint determinista canónico de 64 caracteres hex SHA-256 con location relativa (/) inmune a colisiones; valida formato de display separado. |
|
|
157
|
+
| `TEST-CONSISTENCY-D02` | D — Anti-Loop | Unit (Node) | Hallazgo en estado `RESOLVED` con hash de artefacto sin cambios no se reabre. |
|
|
158
|
+
| `TEST-CONSISTENCY-E01` | E — Excepciones | Unit (Node) | `ACCEPTED_EXCEPTION` aprobado por humano suprime el bloqueo en `verify`. |
|
|
159
|
+
| `TEST-CONSISTENCY-E02` | E — Excepciones | Unit (Node) | Modificación del artefacto relevante reabre la excepción para nueva revisión. |
|
|
160
|
+
| `TEST-CONSISTENCY-F01` | F — Legacy | Unit (Node) | Feature sin bloque `gemstack-contracts` opera en modo `LEGACY` sin error. |
|
|
161
|
+
| `TEST-CONSISTENCY-F02` | F — Legacy | Unit (Node) | Proyecto con `state.json` versión previa inicializa campos faltantes de forma segura. |
|
|
162
|
+
| `TEST-CONSISTENCY-G01` | G — Windows | Unit (Node) | Manejo de rutas con barras invertidas (`\`) normalizadas de forma segura en Windows. |
|
|
163
|
+
| `TEST-CONSISTENCY-G02` | G — Windows | Unit (Node) | Operaciones de lectura y hashing atómicas sin colisión de descriptores de archivo. |
|
|
164
|
+
| `TEST-CONSISTENCY-H01` | H — Regression | Integration | `npm run gemstack:verify` mantiene todas las validaciones estructurales existentes intactas. |
|
|
165
|
+
| `TEST-CONSISTENCY-H02` | H — Regression | Integration | Las suites previas (`tests/init.test.js`, `tests/verify.test.js`) continúan pasando al 100%. |
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 5. Non-Goals Explícitos (Fuera de Alcance en Upgrade A)
|
|
170
|
+
|
|
171
|
+
- **NO** cálculo mecánico de matrices de prueba P1 ni conteo aritmético de tests (Upgrade B).
|
|
172
|
+
- **NO** trazabilidad tarea ↔ test (Upgrade B).
|
|
173
|
+
- **NO** manifiesto `closure.json` ni puertas de comandos canónicos (Upgrade B).
|
|
174
|
+
- **NO** `BillableActionGate` ni libro de costos de proveedores (Upgrade C).
|
|
175
|
+
- **NO** `ProviderCapabilityGate` ni adaptadores fail-closed (Upgrade C).
|
|
176
|
+
- **NO** generador de cápsulas de contexto (`context-capsule.json`) (Upgrade D).
|
|
177
|
+
- **NO** ejecutores de bases de datos o runners de migraciones.
|
|
178
|
+
- **NO** frameworks de AST o paquetes npm externos (Zero-Dependency estricto).
|
|
179
|
+
- **NO** herramientas de gestión de proyectos genéricos (Kanban, time tracking).
|