pumuki 6.3.26 → 6.3.28
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/README.md +3 -1
- package/bin/pumuki-mcp-enterprise-stdio.js +5 -0
- package/bin/pumuki-mcp-evidence-stdio.js +5 -0
- package/core/gate/conditionMatches.ts +1 -21
- package/core/gate/evaluateGate.js +5 -0
- package/core/gate/evaluateRules.js +5 -0
- package/core/gate/evaluateRules.ts +1 -24
- package/core/gate/scopeMatcher.ts +84 -0
- package/docs/EXECUTION_BOARD.md +749 -376
- package/docs/MCP_SERVERS.md +41 -2
- package/docs/README.md +6 -2
- package/docs/REFRACTOR_PROGRESS.md +374 -6
- package/docs/validation/README.md +11 -1
- package/docs/validation/p9-ruralgo-bug-registry.md +607 -0
- package/docs/validation/p9-ruralgo-fork-validation-tracking.md +904 -0
- package/docs/validation/real-repo-manual-e2e-ruralgo-fork.md +372 -0
- package/integrations/config/skillsCompliance.ts +212 -0
- package/integrations/evidence/integrity.ts +352 -0
- package/integrations/evidence/rulesCoverage.ts +94 -0
- package/integrations/evidence/schema.test.ts +16 -0
- package/integrations/evidence/schema.ts +41 -0
- package/integrations/evidence/writeEvidence.test.ts +68 -0
- package/integrations/evidence/writeEvidence.ts +23 -2
- package/integrations/gate/evaluateAiGate.ts +382 -15
- package/integrations/gate/stagePolicies.ts +70 -15
- package/integrations/gate/waivers.ts +209 -0
- package/integrations/git/findingTraceability.ts +3 -23
- package/integrations/git/index.js +5 -0
- package/integrations/git/runCliCommand.ts +16 -0
- package/integrations/git/runPlatformGate.ts +53 -1
- package/integrations/git/runPlatformGateEvaluation.ts +13 -0
- package/integrations/git/stageRunners.ts +168 -5
- package/integrations/lifecycle/adapter.templates.json +72 -5
- package/integrations/lifecycle/adapter.ts +78 -4
- package/integrations/lifecycle/cli.ts +384 -14
- package/integrations/lifecycle/doctor.ts +534 -0
- package/integrations/lifecycle/hookBlock.ts +2 -1
- package/integrations/lifecycle/index.js +5 -0
- package/integrations/lifecycle/install.ts +115 -3
- package/integrations/lifecycle/openSpecBootstrap.ts +68 -8
- package/integrations/lifecycle/preWriteAutomation.ts +142 -0
- package/integrations/mcp/aiGateCheck.ts +6 -0
- package/integrations/mcp/aiGateReceipt.ts +188 -0
- package/integrations/mcp/enterpriseServer.ts +14 -1
- package/integrations/mcp/enterpriseStdioServer.cli.ts +315 -0
- package/integrations/mcp/evidenceStdioServer.cli.ts +342 -0
- package/integrations/mcp/index.js +5 -0
- package/integrations/sdd/index.js +5 -0
- package/integrations/sdd/index.ts +2 -0
- package/integrations/sdd/policy.ts +191 -2
- package/integrations/sdd/sessionStore.ts +139 -19
- package/integrations/sdd/syncDocs.ts +180 -0
- package/integrations/sdd/types.ts +4 -1
- package/integrations/telemetry/structuredTelemetry.ts +197 -0
- package/package.json +27 -8
- package/scripts/build-p9-validation-manifests.ts +53 -0
- package/scripts/check-p9-ruralgo-baseline-clean.ts +200 -0
- package/scripts/check-p9-ruralgo-baseline-versioned.ts +198 -0
- package/scripts/check-p9-ruralgo-branch-ready.ts +215 -0
- package/scripts/check-p9-ruralgo-install-health.ts +288 -0
- package/scripts/check-p9-ruralgo-runtime-ready.ts +188 -0
- package/scripts/check-package-manifest.ts +49 -0
- package/scripts/check-tracking-single-active.sh +40 -0
- package/scripts/framework-menu-consumer-preflight-lib.ts +31 -0
- package/scripts/framework-menu-consumer-runtime-lib.ts +3 -3
- package/scripts/framework-menu-legacy-audit-lib.ts +35 -7
- package/scripts/framework-menu-matrix-evidence-lib.ts +6 -2
- package/scripts/manage-library.sh +1 -1
- package/scripts/p9-ruralgo-baseline-clean-lib.ts +117 -0
- package/scripts/p9-ruralgo-baseline-versioned-lib.ts +119 -0
- package/scripts/p9-ruralgo-branch-ready-lib.ts +128 -0
- package/scripts/p9-ruralgo-install-health-lib.ts +121 -0
- package/scripts/p9-ruralgo-runtime-ready-lib.ts +149 -0
- package/scripts/p9-validation-manifests-lib.ts +366 -0
- package/scripts/package-manifest-lib.ts +9 -0
- package/skills.lock.json +1 -1
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
# P9 — Registro Paralelo de Bugs (RuralGO)
|
|
2
|
+
|
|
3
|
+
Registro oficial de bugs detectados durante la validación de Pumuki en `R_GO`/`ruralgo-fork`.
|
|
4
|
+
Ámbito de este documento: solo Pumuki (no mezcla incidencias de Xcode).
|
|
5
|
+
|
|
6
|
+
## Leyenda
|
|
7
|
+
|
|
8
|
+
- ✅ Cerrado
|
|
9
|
+
- 🚧 En construccion (maximo 1)
|
|
10
|
+
- ⏳ Pendiente
|
|
11
|
+
- ⛔ Bloqueado
|
|
12
|
+
|
|
13
|
+
## Objetivo
|
|
14
|
+
|
|
15
|
+
- Mantener trazabilidad de hallazgos reales sin mezclar backlog de producto (bugs Pumuki) con el plan operativo de ejecución (`p9-ruralgo-fork-validation-tracking.md`).
|
|
16
|
+
- Priorizar y resolver en paralelo los bugs que distorsionan la señal de calidad (falsos positivos, scope de reglas, incompatibilidades de instalación).
|
|
17
|
+
|
|
18
|
+
## Cola Operativa
|
|
19
|
+
|
|
20
|
+
- ✅ `P9.BUG.T1` Consolidar intake inicial y clasificación de bugs detectados en la auditoría de RuralGO.
|
|
21
|
+
- ✅ `P9.BUG.T2` Definir plan de remediación por prioridad (`P1/P2/P3`) y riesgo de regresión.
|
|
22
|
+
- ✅ `P9.BUG.T3` Implementar fixes en Pumuki con TDD y validar en `R_GO` + `ruralgo-fork`.
|
|
23
|
+
- ✅ `P9.BUG.T4` Cerrar bugs confirmados y consolidar evidencia final en este registro.
|
|
24
|
+
- ✅ `P9.IMP.P0.T1` Blindar `install` + hooks resolubles en fresh repo (E2E install->hook execution).
|
|
25
|
+
- ✅ `P9.IMP.P0.T2` Normalizar RC de `--help` y comandos informativos a `0`.
|
|
26
|
+
- ✅ `P9.IMP.P0.T3` Forzar salida mínima de gate en hooks (`stage`, `policy`, `decision`, `evidence age`) con `--quiet` opcional.
|
|
27
|
+
- ✅ `P9.IMP.P0.T4` Añadir `strict mode` fail-closed por defecto en enterprise para bloquear `green vacío` (`items=0`) y evidencia no determinista.
|
|
28
|
+
- ✅ `P9.IMP.P0.T5` Exponer fuente real de evidencia (`source`, `path`, `digest`, `generated_at`).
|
|
29
|
+
|
|
30
|
+
## Informe Único Consolidado (macheo completo)
|
|
31
|
+
|
|
32
|
+
### 1) Resumen ejecutivo
|
|
33
|
+
|
|
34
|
+
- Base funcional confirmada: `status/doctor/sdd status/sdd validate/hooks` operativos.
|
|
35
|
+
- Bloqueos base confirmados: sesión SDD ausente y rama sin upstream en `pre-push`.
|
|
36
|
+
- Riesgos críticos consolidados: instalación/hooks y consistencia gate/evidencia.
|
|
37
|
+
- Madurez actual: media, con hardening pendiente para nivel enterprise alto.
|
|
38
|
+
- Recomendación: cerrar `P0/P1` antes de considerar robustez enterprise.
|
|
39
|
+
|
|
40
|
+
### 2) Lo que funciona bien (confirmado)
|
|
41
|
+
|
|
42
|
+
- `pumuki doctor` y `pumuki status` devuelven estado útil y coherente.
|
|
43
|
+
- `pumuki sdd session --open --change=<id>` funciona con trazabilidad de cambio.
|
|
44
|
+
- `pumuki sdd validate --stage=PRE_WRITE` reporta `ai_gate` con `policy/evidence`.
|
|
45
|
+
- `pumuki-pre-commit` y `pumuki-pre-push` bloquean con `SDD_SESSION_MISSING` cuando no hay sesión activa.
|
|
46
|
+
- `pre-push` bloquea correctamente cuando falta upstream.
|
|
47
|
+
|
|
48
|
+
### 3) Hallazgos consolidados por severidad (mapeados)
|
|
49
|
+
|
|
50
|
+
- Crítico:
|
|
51
|
+
- Instalación/hook resoluble (`Issue 1`) -> `RG-BUG-010` + `P9.IMP.P0.T1`.
|
|
52
|
+
- Alta:
|
|
53
|
+
- `--help` con `RC=1` -> `RG-BUG-005` + `P9.IMP.P0.T2`.
|
|
54
|
+
- `validate` con `items=0` -> `RG-BUG-007` + `P9.IMP.P0.T4`.
|
|
55
|
+
- evidencia AI no determinista/explicable -> `RG-BUG-008` + `P9.IMP.P0.T5`.
|
|
56
|
+
- Media:
|
|
57
|
+
- hooks en verde sin resumen operativo -> `RG-BUG-006` + `P9.IMP.P0.T3`.
|
|
58
|
+
- casing inconsistente de `changeId` -> `RG-BUG-009` + `P9.IMP.P1.T5`.
|
|
59
|
+
- sin auto-sync documental SDD observable -> `RG-BUG-011` + `P9.IMP.P1.T3`.
|
|
60
|
+
|
|
61
|
+
### 4) Respuesta directa a hipótesis (punto por punto)
|
|
62
|
+
|
|
63
|
+
- MCP obligatorio: parcial; hay cadena `pumuki->mcp->ai_gate->ai_evidence`, pero sin hard-block observado por adapter MCP ausente.
|
|
64
|
+
- Bloqueos en `PRE_WRITE/PRE_COMMIT/PRE_PUSH`: sí para sesión SDD ausente; además `pre-push` bloquea por upstream faltante.
|
|
65
|
+
- Resumen de `ai_gate` por iteración: no obligatorio hoy en hooks exitosos.
|
|
66
|
+
- Evidencia siempre fresca/estricta: parcial/inconsistente en local, falta mayor transparencia de fuente.
|
|
67
|
+
- Skills en cada iteración: no hay enforcement hard nativo observado; depende del proceso/AGENTS.
|
|
68
|
+
- SDD completo + auto-doc en MD: sesión sí se fuerza; auto-sync documental no está evidenciado.
|
|
69
|
+
|
|
70
|
+
### 5) Criterio técnico para nivel enterprise fiable
|
|
71
|
+
|
|
72
|
+
- `fail-closed` estricto por defecto en entornos enterprise.
|
|
73
|
+
- `policy-as-code` versionada/firmada con hash visible en gate.
|
|
74
|
+
- cadena de evidencia verificable y explicable (`source/path/digest/timestamp`).
|
|
75
|
+
- enforcement real de skills por ámbito y tipo de cambio.
|
|
76
|
+
- `DoD` de SDD automático (no solo sesión abierta).
|
|
77
|
+
- salida mínima operativa obligatoria en hooks.
|
|
78
|
+
- waivers formales (`TTL/owner/motivo`).
|
|
79
|
+
- `doctor --deep` + contract tests sobre fixtures enterprise.
|
|
80
|
+
|
|
81
|
+
## Matriz de Bugs (actualizada con informe ampliado)
|
|
82
|
+
|
|
83
|
+
| ID | Prioridad | Tipo | Estado | Bug | Evidencia | Impacto | Próximo paso |
|
|
84
|
+
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
85
|
+
| `RG-BUG-001` | `P1` | Falso positivo | ✅ | Regla `ios.no-force-unwrap` reportada en archivo TypeScript (`apps/admin-dashboard/middleware.ts:8`) por uso de `!token` (negación lógica). | Corregido en matcher de `scope` con soporte de glob real para `**/*.swift`; test de no-regresión añadido en `core/gate/__tests__/evaluateRules.spec.ts` y `core/gate/__tests__/conditionMatches.spec.ts`. | Distorsionaba severidad y priorización de remediación. | Cerrado también en campo: en `R_GO` y `ruralgo-fork` ya no aparece `middleware.ts` en findings iOS tras ejecutar menú local completo. |
|
|
86
|
+
| `RG-BUG-002` | `P1` | Scope ruleset | ✅ | Fuga de reglas de plataforma: reglas iOS aplicadas sobre código frontend/backend TypeScript (`ios.no-print`, `ios.no-force-unwrap`, etc). | Causa raíz confirmada: matcher de `scope` interpretaba `**/*.swift` como prefijo vacío y evaluaba cualquier archivo; corregido en `core/gate/scopeMatcher.ts` + adopción en `evaluateRules` y `conditionMatches`; además unificado matcher de `scope` en `integrations/git/findingTraceability.ts` para evitar anclaje erróneo de fichero/línea en trazabilidad. | Generaba falsos bloqueos y pérdida de confianza en el gate. | Cerrado operativo con smoke real en `R_GO` y `ruralgo-fork` (finding iOS queda anclado en `.swift`, no en `.ts`). |
|
|
87
|
+
| `RG-BUG-003` | `P2` | Compatibilidad instalación | ✅ | `pumuki install` podía fallar en repos con `engine-strict` al intentar bootstrap OpenSpec/consumer package fuera de runtime requerido. | Revalidación real en `R_GO` con runtime no alineado (`node v25.6.1/npm 11.10.1`): `npx --yes --package pumuki@latest pumuki install` ya no falla; ejecuta modo tolerante (`npm-install-skipped:engine-mismatch`) y mantiene hooks instalados (`exit=0`). | Se elimina bloqueo operativo de instalación en entornos con runtime no alineado; el comportamiento queda explícito y fail-soft. | Cerrado. Mantener recomendación de runtime `20.20.0/10.8.2` para bootstrap completo (`openspec` + consumer package). |
|
|
88
|
+
| `RG-BUG-004` | `P2` | Trazabilidad ruleset | ✅ | `unknown-ruleset` aparecía en cobertura sin clasificación clara. | Fix aplicado en source (`scripts/framework-menu-legacy-audit-lib.ts`): mapeo determinista para `common.*` -> `commonRuleSet (inferred)` y `workflow.*/sdd.*/generic_*` -> bundle de policy (`gate-policy.default.*` o `policyRuleSet (inferred)`), con test de no-regresión añadido (`scripts/__tests__/framework-menu-legacy-audit.test.ts`); validación de campo con bin local en `R_GO`: `printf '1\\n10\\n' | node .../bin/pumuki-framework.js` muestra `commonRuleSet (inferred): 75` y `gate-policy.default.PRE_COMMIT: 3`, sin `unknown-ruleset`. | Se normaliza trazabilidad de ruleset coverage y desaparece la etiqueta opaca en ejecución corregida. | Cerrado en source; siguiente paso operativo: propagar release npm para que `@latest` herede la normalización en consumer. |
|
|
89
|
+
| `RG-BUG-005` | `P1` | CLI | ✅ | `pumuki --help` y `pumuki sdd --help` retornaban código de salida `1`. | Fix aplicado en parser/catch de CLI con salida explícita para `help`; tests de regresión añadidos en `integrations/lifecycle/__tests__/cli.test.ts`; verificación manual: `root_help_rc=0`, `sdd_help_rc=0`, `bad_rc=1`. | Se elimina rotura de scripts/automatizaciones para comandos informativos. | Cerrado; siguiente foco operativo en `strict mode` y “green vacío” (`RG-BUG-007`). |
|
|
90
|
+
| `RG-BUG-006` | `P1` | Observabilidad gate | ✅ | `pumuki-pre-commit`/`pumuki-pre-push` en éxito no imprimían resumen mínimo de gate. | Fix aplicado en `stageRunners` con línea estable `[pumuki][hook-gate]` y campos `stage/policy_bundle/policy_hash/decision/evidence_age_seconds`; soporte `--quiet` implementado en `runCliCommand`; tests de regresión en `stageRunners.test.ts` y `runCliCommand.test.ts`. | Se recupera auditabilidad operativa de hooks sin perder salida silenciosa opcional. | Cerrado; siguiente foco operativo en `strict mode` (`RG-BUG-007`). |
|
|
91
|
+
| `RG-BUG-007` | `P1` | Validación SDD | ✅ | `pumuki sdd validate` podía devolver `allowed=true` con `items=0`. | Fix aplicado en `integrations/sdd/policy.ts` con bloqueo explícito `SDD_VALIDATION_EMPTY` cuando `validation.ok=true` e `items<=0`; test de no-regresión en `integrations/sdd/__tests__/policy.test.ts`. | Se elimina el “green vacío” y se fuerza fail-closed para validación sin ítems. | Cerrado; siguiente foco operativo en trazabilidad estricta de evidencia (`RG-BUG-008`). |
|
|
92
|
+
| `RG-BUG-008` | `P1` | Evidencia/consistencia | ✅ | La evidencia se reportaba con `kind` y `age`, pero sin trazabilidad explícita de origen. | Fix aplicado en `integrations/gate/evaluateAiGate.ts` y paneles (`integrations/lifecycle/cli.ts`, `scripts/framework-menu-consumer-preflight-lib.ts`) para exponer `evidence.source/path/digest/generated_at`; tests de no-regresión añadidos/actualizados. | Se elimina la opacidad operativa: ahora el gate expone fuente, ruta, huella y timestamp de generación de evidencia. | Cerrado; siguiente foco operativo en gobernanza de skills (`P9.IMP.P1.T1`). |
|
|
93
|
+
| `RG-BUG-009` | `P2` | Canonicalización | ✅ | `changeId` de sesión SDD preservaba casing de entrada en lugar de resolver al identificador canónico del cambio OpenSpec. | Fix aplicado en `integrations/sdd/sessionStore.ts`: resolución case-insensitive con persistencia canónica + `changeAlias`; salida CLI actualizada en `integrations/lifecycle/cli.ts`; tests nuevos en `integrations/sdd/__tests__/sessionStore.test.ts` y `integrations/lifecycle/__tests__/cli.test.ts`. | Se evita fragmentación de trazabilidad/reporting por casing y queda visible el alias resuelto para auditoría. | Cerrado; siguiente foco operativo en `P9.IMP.P2.T1` (integridad criptográfica de evidencia). |
|
|
94
|
+
| `RG-BUG-010` | `P1` | Lifecycle hooks | ✅ | Reporte histórico de hooks 404 (`npx --yes pumuki-pre-*`) tras `install` en iteraciones previas. | Fix aplicado en generación de bloque de hooks para ejecutar `npx --yes --package pumuki@latest pumuki-pre-*` + test E2E `install -> hook execution` con `npx` stub en verde. | Potencial regresión crítica mitigada con cobertura automatizada. | Cerrado; mantener vigilancia de regresión en `test:stage-gates`. |
|
|
95
|
+
| `RG-BUG-011` | `P2` | Gap funcional SDD/docs | ✅ | No existía mecanismo oficial claro de auto-sync documental SDD (`sync-docs`) en flujo observado. | Revalidación en `R_GO` y `ruralgo-fork` con `pumuki@6.3.27`: `npx --yes --package pumuki@latest pumuki sdd sync-docs --dry-run --json` responde con contrato estable (`targetPath`, `stageChecks`, `diffPreview`, `changed`, `created`). | Se elimina el gap funcional de sincronización documental: ya existe comando oficial y machine-readable para pipelines. | Cerrado. Seguimiento futuro en mejoras DX (calidad del contenido sincronizado por stage). |
|
|
96
|
+
| `RG-BUG-012` | `P1` | Falso positivo CI (`npm latest`) | ✅ | `pumuki-ci` de `pumuki@latest@6.3.26` llegó a bloquear `ruralgo-fork` con `ios.no-force-unwrap` en archivo TypeScript (`apps/admin-dashboard/playwright/e2e/critical-errors-verification.spec.ts:7`). | Repro CI controlada en clon temporal de `R_GO` con precondiciones conformes: OpenSpec instalado (`@fission-ai/openspec@1.2.0`), sesión SDD válida y cambio completo (`rgo-1200-03`), `sdd validate --stage=CI` en `ALLOWED` (`items=17`, `passed=17`, `failed=0`), y `GITHUB_BASE_REF=origin/develop npx --yes --package pumuki@latest pumuki-ci` => `decision=ALLOW outcome=PASS`; verificación de evidencia CI: `hits=[]` para `ios.no-force-unwrap` y para `apps/admin-dashboard/playwright/e2e/critical-errors-verification.spec.ts`. | Bajo condiciones CI conformes no se reproduce falso positivo iOS sobre `.ts`. | Cerrado; mantener monitorización de no-regresión en validación real post-release. |
|
|
97
|
+
| `RG-BUG-013` | `P1` | Packaging/bin parity | ✅ | Los bins `pumuki-mcp-evidence-stdio` y `pumuki-mcp-enterprise-stdio` no existían en `pumuki@latest@6.3.26` publicado aunque sí estaban declarados en `package.json` local del repo. | Cierre E2E propagado: release npm `6.3.27` publicada y validada en `ruralgo-fork`; ambos bins presentes en `node_modules/.bin` (`ls -1 node_modules/.bin | rg '^pumuki-mcp-(enterprise|evidence)-stdio$'`). | Paridad de bins restablecida en `@latest` para consumidor real. | Cerrado end-to-end con propagación npm + validación de campo en consumer real. |
|
|
98
|
+
| `RG-BUG-014` | `P2` | Gap consumer scripts | ✅ | Los scripts de `package.json` de `pumuki` no eran ejecutables de forma directa desde consumidor real tras `pumuki install`, porque el paquete no quedaba instalado como dependencia en `node_modules`. | Cierre E2E propagado: `pumuki@6.3.27` en `latest` + validación real en `ruralgo-fork` (`validation:p9:ruralgo-install-health` => `ready=true`); nota de contrato confirmada: si `pumuki` ya está declarado en consumer, `install` no fuerza upgrade y se usa `pumuki update --latest` para actualizar versión efectiva. | Ejecución de scripts internos y contrato lifecycle operativos en consumidor real con flujo explícito `install/update`. | Cerrado end-to-end con propagación npm + runbook real actualizado (`install` + `update --latest` cuando aplique). |
|
|
99
|
+
| `RG-BUG-015` | `P1` | Packaging/exports runtime | ✅ | En consumidor real con `pumuki@latest@6.3.26`, los subpaths exportados (`core/*`, `integrations/*`) no eran importables en runtime aunque figuraban en `exports`. | Cierre E2E propagado: `pumuki@6.3.27` publicado con exports `.js`; validación en `ruralgo-fork` con `require/import` en verde para exports oficiales (`pumuki`, `pumuki/integrations/{git,lifecycle,sdd,mcp}`, `pumuki/core/gate/{evaluateGate,evaluateRules}`). | API pública de subpaths consumible en runtime desde `@latest`. | Cerrado end-to-end con propagación npm + validación real en consumer. |
|
|
100
|
+
|
|
101
|
+
## Observaciones No-Bug (comportamiento esperado)
|
|
102
|
+
|
|
103
|
+
- Opción `3` (Strict STAGING) y opción `4` (STAGED+UNSTAGED) retornan `PASS` con alcance vacío y muestran hint explícito:
|
|
104
|
+
- `Scope vacío (...) usa 1 o 2 para validar repo completo.`
|
|
105
|
+
- Clasificado como UX esperable, no bug.
|
|
106
|
+
|
|
107
|
+
## Fase de Mejoras Enterprise (TODO)
|
|
108
|
+
|
|
109
|
+
Aplica la leyenda canónica del documento:
|
|
110
|
+
- ✅ Cerrado
|
|
111
|
+
- 🚧 En construccion (maximo 1)
|
|
112
|
+
- ⏳ Pendiente
|
|
113
|
+
- ⛔ Bloqueado
|
|
114
|
+
|
|
115
|
+
### P0 (0-30 días, bloqueo de riesgo)
|
|
116
|
+
|
|
117
|
+
- ✅ `P9.IMP.P0.T1` Blindar `install` + hooks resolubles en fresh repo (E2E install->hook execution).
|
|
118
|
+
- ✅ `P9.IMP.P0.T2` Normalizar RC de `--help` y comandos informativos a `0`.
|
|
119
|
+
- ✅ `P9.IMP.P0.T3` Forzar salida mínima de gate en hooks (`stage`, `policy`, `decision`, `evidence age`) con `--quiet` opcional.
|
|
120
|
+
- ✅ `P9.IMP.P0.T4` Añadir `strict mode` fail-closed por defecto en enterprise para bloquear `green vacío` (`items=0`) y evidencia no determinista.
|
|
121
|
+
- ✅ `P9.IMP.P0.T5` Exponer fuente real de evidencia (`source`, `path`, `digest`, `generated_at`).
|
|
122
|
+
|
|
123
|
+
### P1 (31-60 días, gobernanza y trazabilidad)
|
|
124
|
+
|
|
125
|
+
- ✅ `P9.IMP.P1.T1` Implementar skill compliance engine por ámbito/archivo (`required -> applied -> evidence`).
|
|
126
|
+
- ✅ `P9.IMP.P1.T2` Añadir gate de completitud SDD por cambio.
|
|
127
|
+
- ✅ `P9.IMP.P1.T3` Crear comando oficial de sync documental (`pumuki sdd sync-docs`) con `dry-run` y diff preview.
|
|
128
|
+
- ✅ `P9.IMP.P1.T4` Implementar `pumuki doctor --deep` con checks enterprise (hooks/upstream/adapters/policy/evidence drift).
|
|
129
|
+
- ✅ `P9.IMP.P1.T5` Canonicalizar `changeId` de sesión SDD y exponer alias resuelto en salida.
|
|
130
|
+
- ✅ `P9.IMP.P1.T6` Añadir `policy-as-code` versionada/firmada y hash de policy visible en ejecución de gate.
|
|
131
|
+
|
|
132
|
+
### P2 (61-90 días, hardening enterprise)
|
|
133
|
+
|
|
134
|
+
- ✅ `P9.IMP.P2.T1` Integridad criptográfica de evidencia (hash chain + firma opcional).
|
|
135
|
+
- ✅ `P9.IMP.P2.T2` Sistema formal de waivers con TTL/owner/motivo/expiración.
|
|
136
|
+
- ✅ `P9.IMP.P2.T3` Telemetría estructurada exportable (`JSONL`/`OpenTelemetry`).
|
|
137
|
+
- ✅ `P9.IMP.P2.T4` Suite de contract tests sobre repos fixture enterprise.
|
|
138
|
+
|
|
139
|
+
## Evidencia Operativa de Campo (RuralGO, sesión inicial)
|
|
140
|
+
|
|
141
|
+
- Repositorio: `/Users/juancarlosmerlosalbarracin/Developer/Projects/R_GO`
|
|
142
|
+
- Rama observada: `feature/rgo-1190-01-sdd-bootstrap`
|
|
143
|
+
- Estado lifecycle reportado:
|
|
144
|
+
- `installed=true`, `version=6.3.26`
|
|
145
|
+
- hooks gestionados: `pre-commit`, `pre-push`
|
|
146
|
+
- `openSpecManagedArtifacts` presentes
|
|
147
|
+
- Estado doctor:
|
|
148
|
+
- `doctor verdict: PASS`
|
|
149
|
+
- Estado SDD:
|
|
150
|
+
- OpenSpec: `installed=true`, `projectInitialized=true`, `compatible=true`
|
|
151
|
+
- sesión inicial en reporte: `active=false`, `valid=false`
|
|
152
|
+
- Estado loop:
|
|
153
|
+
- `loop list --json => []`
|
|
154
|
+
- Evidencia JSON reportada por el usuario:
|
|
155
|
+
- `/Users/juancarlosmerlosalbarracin/Developer/Projects/R_GO/.ai_evidence.json`
|
|
156
|
+
|
|
157
|
+
### Matriz de ejecución `pumenu` (captura de campo)
|
|
158
|
+
|
|
159
|
+
| Opción | Contexto reportado | Resultado reportado | Observaciones |
|
|
160
|
+
| --- | --- | --- | --- |
|
|
161
|
+
| `2` Strict REPO+STAGING (PRE_PUSH) | `staged=1`, `unstaged=3`, upstream `none` | `Gate: ALLOWED (0 preflight)`, luego auditoría completa con `297` violaciones (`45` C / `223` H) y `BLOCK` | Comportamiento esperado: preflight y auditoría final pueden diferir por alcance/política. |
|
|
162
|
+
| `3` Strict STAGING only (PRE_COMMIT) | alcance `staged` | `files scanned: 0`, `PASS`, mensaje `Scope vacío (staged)` | Clasificado como no-bug (UX esperable con hint explícito). |
|
|
163
|
+
| `4` STAGED+UNSTAGED (PRE_PUSH policy) | alcance `working tree` | `files scanned: 0`, `PASS`, mensaje `Scope vacío (working tree)` | Clasificado como no-bug (UX esperable con hint explícito). |
|
|
164
|
+
| `1` Full audit (repo analysis PRE_COMMIT) | repo completo | `297` violaciones (`45` C / `223` H), `BLOCK` | Señal consistente con opción `2` al evaluar repositorio completo. |
|
|
165
|
+
|
|
166
|
+
## Roadmap 30/60/90 (trazado a tareas TODO)
|
|
167
|
+
|
|
168
|
+
- `0-30 días` => `P9.IMP.P0.T1..T5`
|
|
169
|
+
- `31-60 días` => `P9.IMP.P1.T1..T6`
|
|
170
|
+
- `61-90 días` => `P9.IMP.P2.T1..T4`
|
|
171
|
+
|
|
172
|
+
## Issue Pack Único (mapeado a este MD)
|
|
173
|
+
|
|
174
|
+
| Issue pack consolidado | Cobertura en este registro |
|
|
175
|
+
| --- | --- |
|
|
176
|
+
| `Issue 1 [P0][BUG] install deja hooks no resolubles` | `RG-BUG-010` + `P9.IMP.P0.T1` |
|
|
177
|
+
| `Issue 2 [P0][BUG] help retorna RC=1` | `RG-BUG-005` + `P9.IMP.P0.T2` |
|
|
178
|
+
| `Issue 3 [P0][RULE] validate no debe pasar con items=0` | `RG-BUG-007` + `P9.IMP.P0.T4` |
|
|
179
|
+
| `Issue 4 [P0][OBS] evidencia AI no determinista/explicable` | `RG-BUG-008` + `P9.IMP.P0.T5` |
|
|
180
|
+
| `Issue 5 [P1][DX] hooks exitosos sin resumen operativo` | `RG-BUG-006` + `P9.IMP.P0.T3` |
|
|
181
|
+
| `Issue 6 [P1][GOV] enforcement real de skills por ámbito` | `P9.IMP.P1.T1` |
|
|
182
|
+
| `Issue 7 [P1][SDD] completitud SDD + sync documental` | `RG-BUG-011` + `P9.IMP.P1.T2` + `P9.IMP.P1.T3` |
|
|
183
|
+
| `Issue 8 [P1][CONSISTENCY] normalización canónica changeId` | `RG-BUG-009` + `P9.IMP.P1.T5` |
|
|
184
|
+
| `Issue 9 [P2][SEC] evidencia firmada y cadena de integridad` | `P9.IMP.P2.T1` |
|
|
185
|
+
| `Issue 10 [P2][OPS] doctor --deep + suite contratos enterprise` | `P9.IMP.P1.T4` + `P9.IMP.P2.T4` |
|
|
186
|
+
|
|
187
|
+
## Criterios de Cierre de Cada Bug
|
|
188
|
+
|
|
189
|
+
- Reproducible con comando exacto.
|
|
190
|
+
- Causa raíz documentada.
|
|
191
|
+
- Fix con test de no-regresión en verde.
|
|
192
|
+
- Revalidación en `R_GO` y `ruralgo-fork`.
|
|
193
|
+
- Estado actualizado en esta tabla (`✅`).
|
|
194
|
+
|
|
195
|
+
## Evidencia de esta ejecución (`P9.BUG.T3`)
|
|
196
|
+
|
|
197
|
+
- Fix aplicado en:
|
|
198
|
+
- `core/gate/scopeMatcher.ts`
|
|
199
|
+
- `core/gate/evaluateRules.ts`
|
|
200
|
+
- `core/gate/conditionMatches.ts`
|
|
201
|
+
- `integrations/git/findingTraceability.ts`
|
|
202
|
+
- RED reproducido:
|
|
203
|
+
- `npx jest --runInBand core/gate/__tests__/conditionMatches.spec.ts core/gate/__tests__/evaluateRules.spec.ts`
|
|
204
|
+
- fallo esperado: regla iOS también reportada sobre `apps/admin-dashboard/middleware.ts`.
|
|
205
|
+
- GREEN validado:
|
|
206
|
+
- `npx jest --runInBand --coverage=false core/gate/__tests__/conditionMatches.spec.ts core/gate/__tests__/evaluateRules.spec.ts`
|
|
207
|
+
- `17 passed, 17 total`.
|
|
208
|
+
- Regresión amplia:
|
|
209
|
+
- `npm run -s test:stage-gates` -> `PASS`.
|
|
210
|
+
- `npm run -s typecheck` -> `PASS`.
|
|
211
|
+
- No-regresión adicional de trazabilidad:
|
|
212
|
+
- `npx --yes tsx@4.21.0 --test integrations/git/__tests__/findingTraceability.test.ts` -> `PASS`.
|
|
213
|
+
- Test nuevo: `attachFindingTraceability respeta scope glob y no ancla reglas iOS sobre TypeScript`.
|
|
214
|
+
- Validación de campo con menú local:
|
|
215
|
+
- `R_GO`: `printf '1\\n10\\n' | node .../bin/pumuki-framework.js`
|
|
216
|
+
- `.ai_evidence.json`: sin findings para `apps/admin-dashboard/middleware.ts`.
|
|
217
|
+
- `ios.no-force-unwrap` queda anclado en `apps/ios/Application/SessionRefreshingAPIClient.swift:23`.
|
|
218
|
+
- `ruralgo-fork`: mismo comando y mismo resultado esperado (sin anclaje iOS en `.ts`).
|
|
219
|
+
|
|
220
|
+
## Evidencia de cierre (`P9.BUG.T4`)
|
|
221
|
+
|
|
222
|
+
- Estado de bugs confirmados:
|
|
223
|
+
- `RG-BUG-001` y `RG-BUG-002` cerrados con fix + no-regresión + validación de campo en `R_GO` y `ruralgo-fork`.
|
|
224
|
+
- Criterios de cierre cumplidos para bugs confirmados:
|
|
225
|
+
- reproducibilidad documentada,
|
|
226
|
+
- causa raíz documentada,
|
|
227
|
+
- fix con tests en verde,
|
|
228
|
+
- revalidación en repos reales.
|
|
229
|
+
- Consolidación final aplicada en este registro:
|
|
230
|
+
- matriz de bugs actualizada con estado y próximo paso por bug,
|
|
231
|
+
- issue pack único mapeado 1:1,
|
|
232
|
+
- roadmap 30/60/90 trazado a tareas `P9.IMP.*`.
|
|
233
|
+
- Transición operativa aplicada:
|
|
234
|
+
- `P9.BUG.T4 => ✅`
|
|
235
|
+
- transición histórica: `P9.IMP.P0.T4 => ✅`.
|
|
236
|
+
|
|
237
|
+
## Evidencia de ejecución (`P9.IMP.P0.T1`)
|
|
238
|
+
|
|
239
|
+
- RED (esperado):
|
|
240
|
+
- `npx --yes tsx@4.21.0 --test integrations/lifecycle/__tests__/hookBlock.test.ts integrations/lifecycle/__tests__/install.test.ts`
|
|
241
|
+
- fallos por contrato antiguo sin `--package` en hooks gestionados.
|
|
242
|
+
- GREEN tras fix:
|
|
243
|
+
- `npx --yes tsx@4.21.0 --test integrations/lifecycle/__tests__/hookBlock.test.ts integrations/lifecycle/__tests__/install.test.ts` -> `17/17 PASS`.
|
|
244
|
+
- No-regresión:
|
|
245
|
+
- `npm run -s typecheck` -> PASS.
|
|
246
|
+
- `npm run -s test:stage-gates` -> PASS (`925` pass, `0` fail, `4` skipped).
|
|
247
|
+
- Cambios técnicos aplicados:
|
|
248
|
+
- `integrations/lifecycle/hookBlock.ts`: hooks gestionados ahora usan `npx --yes --package pumuki@latest pumuki-pre-*`.
|
|
249
|
+
- `integrations/lifecycle/__tests__/hookBlock.test.ts`: aserciones de contrato actualizado.
|
|
250
|
+
- `integrations/lifecycle/__tests__/install.test.ts`: test E2E nuevo de ejecución real del hook con `npx` stub y captura de argumentos.
|
|
251
|
+
- Transición operativa:
|
|
252
|
+
- `P9.IMP.P0.T1 => ✅`
|
|
253
|
+
- transición histórica: `P9.IMP.P0.T4 => ✅`.
|
|
254
|
+
|
|
255
|
+
## Evidencia de ejecución (`P9.IMP.P0.T2`)
|
|
256
|
+
|
|
257
|
+
- RED (repro inicial):
|
|
258
|
+
- `node bin/pumuki.js --help` -> `RC=1`.
|
|
259
|
+
- `node bin/pumuki.js sdd --help` -> `RC=1`.
|
|
260
|
+
- GREEN tras fix:
|
|
261
|
+
- `npx --yes tsx@4.21.0 --test integrations/lifecycle/__tests__/cli.test.ts` -> `19/19 PASS`.
|
|
262
|
+
- Test nuevo: `runLifecycleCli retorna 0 para comandos help explícitos`.
|
|
263
|
+
- Verificación manual de contrato CLI:
|
|
264
|
+
- `node bin/pumuki.js --help` -> `root_help_rc=0`.
|
|
265
|
+
- `node bin/pumuki.js sdd --help` -> `sdd_help_rc=0`.
|
|
266
|
+
- `node bin/pumuki.js --bad` -> `bad_rc=1` (sin regresión de errores reales).
|
|
267
|
+
- No-regresión:
|
|
268
|
+
- `npm run -s typecheck` -> PASS.
|
|
269
|
+
- Cambios técnicos aplicados:
|
|
270
|
+
- `integrations/lifecycle/cli.ts`: nuevo flujo de salida tipada para `help` explícito (`RC=0`) sin degradar errores (`RC=1`).
|
|
271
|
+
- `integrations/lifecycle/__tests__/cli.test.ts`: cobertura adicional para `--help` global y `sdd --help`.
|
|
272
|
+
- Transición operativa:
|
|
273
|
+
- `P9.IMP.P0.T2 => ✅`
|
|
274
|
+
- transición histórica: `P9.IMP.P0.T4 => ✅`.
|
|
275
|
+
|
|
276
|
+
## Evidencia de ejecución (`P9.IMP.P0.T3`)
|
|
277
|
+
|
|
278
|
+
- GREEN:
|
|
279
|
+
- `npx --yes tsx@4.21.0 --test integrations/git/__tests__/runCliCommand.test.ts integrations/git/__tests__/stageRunners.test.ts` -> `20/20 PASS`.
|
|
280
|
+
- No-regresión:
|
|
281
|
+
- `npm run -s typecheck` -> PASS.
|
|
282
|
+
- Cobertura funcional añadida:
|
|
283
|
+
- `runPreCommitStage imprime resumen mínimo del gate con stage/policy/decision/evidence age`.
|
|
284
|
+
- `runPreCommitStage no imprime resumen cuando quiet mode está habilitado`.
|
|
285
|
+
- `runCliCommand activa quiet mode para hooks cuando recibe --quiet y restaura env`.
|
|
286
|
+
- Cambios técnicos aplicados:
|
|
287
|
+
- `integrations/git/stageRunners.ts`: emisión del resumen mínimo `[pumuki][hook-gate]` en `PRE_COMMIT`/`PRE_PUSH` con `stage`, `policy_bundle`, `policy_hash`, `decision`, `outcome`, `evidence_kind`, `evidence_age_seconds`.
|
|
288
|
+
- `integrations/git/runCliCommand.ts`: soporte `--quiet` mediante `PUMUKI_HOOK_SUMMARY_QUIET=1` durante la ejecución del hook y restauración del entorno al finalizar.
|
|
289
|
+
- `integrations/git/__tests__/stageRunners.test.ts`: tests de resumen y supresión por quiet mode.
|
|
290
|
+
- `integrations/git/__tests__/runCliCommand.test.ts`: test de activación/restauración de quiet mode.
|
|
291
|
+
- Transición operativa:
|
|
292
|
+
- `P9.IMP.P0.T3 => ✅`
|
|
293
|
+
- transición histórica: `P9.IMP.P0.T4 => ✅`.
|
|
294
|
+
|
|
295
|
+
## Evidencia de ejecución (`P9.IMP.P0.T4`)
|
|
296
|
+
|
|
297
|
+
- RED (repro inicial):
|
|
298
|
+
- `pumuki sdd validate --stage=PRE_COMMIT --json` podía quedar `allowed=true` con `validation.totals.items=0`.
|
|
299
|
+
- GREEN tras fix:
|
|
300
|
+
- `npx --yes tsx@4.21.0 --test integrations/sdd/__tests__/policy.test.ts` -> `13/13 PASS`.
|
|
301
|
+
- Test nuevo: `evaluateSddPolicy bloquea con SDD_VALIDATION_EMPTY cuando OpenSpec devuelve ok pero items=0`.
|
|
302
|
+
- No-regresión:
|
|
303
|
+
- `npm run -s typecheck` -> PASS.
|
|
304
|
+
- Cambios técnicos aplicados:
|
|
305
|
+
- `integrations/sdd/types.ts`: nuevo código de decisión `SDD_VALIDATION_EMPTY`.
|
|
306
|
+
- `integrations/sdd/policy.ts`: bloqueo fail-closed cuando `validation.ok=true` y `validation.totals.items<=0`.
|
|
307
|
+
- `integrations/lifecycle/cli.ts`: `resolveSddDecisionLocation` reconoce `SDD_VALIDATION_EMPTY`.
|
|
308
|
+
- `integrations/sdd/__tests__/policy.test.ts`: cobertura de no-regresión para `items=0`.
|
|
309
|
+
- Transición operativa:
|
|
310
|
+
- `P9.IMP.P0.T4 => ✅`
|
|
311
|
+
- transición histórica: `P9.IMP.P0.T5 => ✅`.
|
|
312
|
+
|
|
313
|
+
## Evidencia de ejecución (`P9.IMP.P0.T5`)
|
|
314
|
+
|
|
315
|
+
- RED (repro inicial):
|
|
316
|
+
- el pre-flight exponía `kind/age/max`, pero no publicaba fuente/ruta/huella/timestamp de evidencia.
|
|
317
|
+
- GREEN tras fix:
|
|
318
|
+
- `npx --yes tsx@4.21.0 --test integrations/gate/__tests__/evaluateAiGate.test.ts integrations/lifecycle/__tests__/cli.test.ts scripts/__tests__/framework-menu-consumer-preflight.test.ts` -> `32/32 PASS`.
|
|
319
|
+
- No-regresión:
|
|
320
|
+
- `npm run -s typecheck` -> PASS.
|
|
321
|
+
- Cambios técnicos aplicados:
|
|
322
|
+
- `integrations/gate/evaluateAiGate.ts`: añadido contrato de evidencia con `source`, `path`, `digest`, `generated_at` y cálculo de digest `sha256` sobre `.ai_evidence.json` cuando existe.
|
|
323
|
+
- `integrations/lifecycle/cli.ts`: panel `PRE-FLIGHT CHECK` ahora imprime `Evidence source` y `Evidence digest/generated_at`.
|
|
324
|
+
- `scripts/framework-menu-consumer-preflight-lib.ts`: panel de menú consumidor actualizado con las nuevas líneas de trazabilidad.
|
|
325
|
+
- `integrations/gate/__tests__/evaluateAiGate.test.ts`: aserciones nuevas para metadata de evidencia en casos `missing` y `valid`.
|
|
326
|
+
- `integrations/lifecycle/__tests__/cli.test.ts`: cobertura de render para `Evidence source` y `Evidence digest/generated_at`.
|
|
327
|
+
- `scripts/__tests__/framework-menu-consumer-preflight.test.ts`: contratos de stubs y render adaptados a la nueva metadata.
|
|
328
|
+
- Transición operativa:
|
|
329
|
+
- `P9.IMP.P0.T5 => ✅`
|
|
330
|
+
- transición histórica: `P9.IMP.P1.T1 => ✅`.
|
|
331
|
+
|
|
332
|
+
## Evidencia de ejecución (`P9.IMP.P1.T1`)
|
|
333
|
+
|
|
334
|
+
- Implementación aplicada:
|
|
335
|
+
- motor de cumplimiento skills por ámbito/archivo en `integrations/config/skillsCompliance.ts` con salida explícita `required_rule_ids -> applied_rule_ids -> evidence_rule_ids` y `missing_rule_ids`.
|
|
336
|
+
- integración en evaluación de gate (`integrations/git/runPlatformGateEvaluation.ts`) para calcular `coverage.skillsCompliance` desde archivos observados + reglas skills activas.
|
|
337
|
+
- bloqueo hard en `PRE_COMMIT/PRE_PUSH/CI` cuando `skills_compliance.missing_rule_ids` no está vacío (`governance.skills.compliance.incomplete`, `SKILLS_COMPLIANCE_INCOMPLETE_HIGH`) en `integrations/git/runPlatformGate.ts`.
|
|
338
|
+
- persistencia en evidencia: `snapshot.rules_coverage.skills_compliance` en `integrations/evidence/schema.ts` + normalización en `integrations/evidence/rulesCoverage.ts`.
|
|
339
|
+
- Cobertura de tests añadida/actualizada:
|
|
340
|
+
- nuevo: `integrations/config/__tests__/skillsCompliance.test.ts`.
|
|
341
|
+
- nuevo caso integración: `integrations/git/__tests__/runPlatformGateEvaluation.test.ts` (compliance por archivo).
|
|
342
|
+
- nuevo caso bloqueo: `integrations/git/__tests__/runPlatformGate.test.ts` (gate bloquea por `missing_rule_ids`).
|
|
343
|
+
- normalización evidencia: `integrations/evidence/__tests__/rulesCoverage.test.ts`.
|
|
344
|
+
- persistencia evidencia: `integrations/evidence/__tests__/buildEvidence.test.ts`.
|
|
345
|
+
- GREEN:
|
|
346
|
+
- `npx --yes tsx@4.21.0 --test integrations/config/__tests__/skillsCompliance.test.ts integrations/git/__tests__/runPlatformGateEvaluation.test.ts integrations/git/__tests__/runPlatformGate.test.ts integrations/evidence/__tests__/rulesCoverage.test.ts integrations/evidence/__tests__/buildEvidence.test.ts` -> `56/56 PASS`.
|
|
347
|
+
- `npm run -s typecheck` -> PASS.
|
|
348
|
+
- `npm run -s validation:tracking-single-active` -> PASS (`in_progress_count=1` en tracking activos).
|
|
349
|
+
- Transición operativa:
|
|
350
|
+
- `P9.IMP.P1.T1 => ✅`
|
|
351
|
+
- transición histórica: `P9.IMP.P1.T2 => ✅`.
|
|
352
|
+
|
|
353
|
+
## Evidencia de ejecución (`P9.IMP.P1.T2`)
|
|
354
|
+
|
|
355
|
+
- Implementación aplicada:
|
|
356
|
+
- nuevo gate de completitud SDD por cambio activo en `integrations/sdd/policy.ts` con evaluación por perfil:
|
|
357
|
+
- `spec-driven`: requiere `.openspec.yaml` + al menos un `.feature` con `Feature:` y `Scenario:`.
|
|
358
|
+
- `markdown`: requiere `proposal.md` y evidencia mínima de especificación (`Scenario` o checklist de tareas).
|
|
359
|
+
- enforcement por etapa: bloqueo en `PRE_PUSH`/`CI` cuando el cambio activo no está completo (`SDD_CHANGE_INCOMPLETE`).
|
|
360
|
+
- codepath de ubicación en CLI actualizado para el nuevo código en `integrations/lifecycle/cli.ts`.
|
|
361
|
+
- contrato tipado actualizado con el nuevo código en `integrations/sdd/types.ts`.
|
|
362
|
+
- Cobertura de tests añadida/actualizada:
|
|
363
|
+
- `integrations/sdd/__tests__/policy.test.ts`:
|
|
364
|
+
- bloquea `SDD_CHANGE_INCOMPLETE` en `PRE_PUSH` para cambio incompleto.
|
|
365
|
+
- permite `PRE_PUSH` para cambio completo en perfil `spec-driven`.
|
|
366
|
+
- `CI` en verde ajustado para cambio completo.
|
|
367
|
+
- GREEN:
|
|
368
|
+
- `npx --yes tsx@4.21.0 --test integrations/sdd/__tests__/policy.test.ts integrations/sdd/__tests__/types.test.ts integrations/lifecycle/__tests__/cli.test.ts` -> `36/36 PASS`.
|
|
369
|
+
- `npm run -s typecheck` -> PASS.
|
|
370
|
+
- Transición operativa:
|
|
371
|
+
- `P9.IMP.P1.T2 => ✅`
|
|
372
|
+
- transición histórica: `P9.IMP.P1.T3 => ✅`.
|
|
373
|
+
|
|
374
|
+
## Evidencia de ejecución (`P9.IMP.P1.T3`)
|
|
375
|
+
|
|
376
|
+
- Implementación aplicada:
|
|
377
|
+
- comando oficial `pumuki sdd sync-docs` integrado en `integrations/lifecycle/cli.ts` con soporte `--dry-run` y `--json`.
|
|
378
|
+
- nuevo módulo `integrations/sdd/syncDocs.ts` con:
|
|
379
|
+
- resolución de sesión/cambio activo,
|
|
380
|
+
- generación de documento sincronizado en `openspec/changes/<change-id>/pumuki-sdd-status.md`,
|
|
381
|
+
- cálculo de diff preview,
|
|
382
|
+
- comportamiento idempotente cuando no hay cambios.
|
|
383
|
+
- exports públicos actualizados en `integrations/sdd/index.ts`.
|
|
384
|
+
- Cobertura de tests añadida/actualizada:
|
|
385
|
+
- nuevo test unitario: `integrations/sdd/__tests__/syncDocs.test.ts`.
|
|
386
|
+
- `integrations/lifecycle/__tests__/cli.test.ts` ampliado para parse + ejecución `sync-docs --dry-run --json`.
|
|
387
|
+
- GREEN:
|
|
388
|
+
- `npx --yes tsx@4.21.0 --test integrations/sdd/__tests__/syncDocs.test.ts integrations/lifecycle/__tests__/cli.test.ts integrations/sdd/__tests__/policy.test.ts integrations/sdd/__tests__/types.test.ts` -> `39/39 PASS`.
|
|
389
|
+
- `npm run -s typecheck` -> PASS.
|
|
390
|
+
- Transición operativa:
|
|
391
|
+
- `P9.IMP.P1.T3 => ✅`
|
|
392
|
+
- transición histórica: `P9.IMP.P1.T4 => ✅`.
|
|
393
|
+
|
|
394
|
+
## Evidencia de ejecución (`P9.IMP.P1.T4`)
|
|
395
|
+
|
|
396
|
+
- Implementación aplicada:
|
|
397
|
+
- `runLifecycleDoctor` soporta modo profundo (`deep`) con reporte estructurado de checks enterprise en `integrations/lifecycle/doctor.ts`.
|
|
398
|
+
- checks incorporados en `doctor --deep`:
|
|
399
|
+
- `hooks`: presencia de bloque gestionado + ejecutable real del hook.
|
|
400
|
+
- `upstream`: rama actual, upstream y drift `ahead/behind`.
|
|
401
|
+
- `adapters`: detección/validez JSON y señal de bindings Pumuki.
|
|
402
|
+
- `policy_drift`: trazas de policy por stage y validación de `skills.policy.json`.
|
|
403
|
+
- `evidence_drift`: frescura/validez de `.ai_evidence.json` para baseline PRE_COMMIT.
|
|
404
|
+
- integración CLI en `integrations/lifecycle/cli.ts`:
|
|
405
|
+
- `pumuki doctor [--deep] [--json]` documentado en help.
|
|
406
|
+
- parse de `--deep` restringido al comando `doctor`.
|
|
407
|
+
- salida JSON soportada para `doctor`.
|
|
408
|
+
- suite de tests ampliada:
|
|
409
|
+
- `integrations/lifecycle/__tests__/doctor.test.ts` con cobertura de `--deep` (warnings + bloqueo por drift crítico en adapter inválido).
|
|
410
|
+
- `integrations/lifecycle/__tests__/cli.test.ts` con parse de `doctor --deep --json` y ejecución JSON con checks esperados.
|
|
411
|
+
- GREEN:
|
|
412
|
+
- `npx --yes tsx@4.21.0 --test integrations/lifecycle/__tests__/doctor.test.ts integrations/lifecycle/__tests__/cli.test.ts` -> `29/29 PASS`.
|
|
413
|
+
- `npm run -s typecheck` -> PASS.
|
|
414
|
+
- `npm run -s validation:tracking-single-active` -> PASS.
|
|
415
|
+
- Transición operativa:
|
|
416
|
+
- `P9.IMP.P1.T4 => ✅`
|
|
417
|
+
- siguiente en curso: `P9.IMP.P1.T5`.
|
|
418
|
+
|
|
419
|
+
## Evidencia de ejecución (`P9.IMP.P1.T5`)
|
|
420
|
+
|
|
421
|
+
- RED (TDD inicial):
|
|
422
|
+
- `npx --yes tsx@4.21.0 --test integrations/sdd/__tests__/sessionStore.test.ts integrations/lifecycle/__tests__/cli.test.ts` -> `2` fallos esperados:
|
|
423
|
+
- sesión SDD mantenía `changeId` en casing de entrada.
|
|
424
|
+
- `sdd session --open --json` no exponía `changeAlias` con canonicalización.
|
|
425
|
+
- Implementación aplicada:
|
|
426
|
+
- `integrations/sdd/types.ts`: nuevo campo `changeAlias` en `SddSessionState`.
|
|
427
|
+
- `integrations/sdd/sessionStore.ts`:
|
|
428
|
+
- resolución case-insensitive de `changeId` contra `openspec/changes` y `openspec/changes/archive`,
|
|
429
|
+
- persistencia de `changeId` canónico en git config,
|
|
430
|
+
- persistencia opcional de `changeAlias` cuando la entrada difiere del canónico,
|
|
431
|
+
- lectura de sesión compatible con estado legacy (normaliza en runtime si detecta casing previo),
|
|
432
|
+
- limpieza de `changeAlias` al cerrar sesión.
|
|
433
|
+
- `integrations/lifecycle/cli.ts`:
|
|
434
|
+
- render unificado de descriptor de cambio SDD (`change=<canonical> alias=<input>` cuando aplica),
|
|
435
|
+
- salida actualizada en `sdd status`, `sdd session --open` y `sdd session --refresh`.
|
|
436
|
+
- tests nuevos:
|
|
437
|
+
- `integrations/sdd/__tests__/sessionStore.test.ts`: `openSddSession canonicaliza changeId y conserva alias cuando se abre con casing distinto`.
|
|
438
|
+
- `integrations/lifecycle/__tests__/cli.test.ts`: `runLifecycleCli sdd session --open expone change canonical y alias resuelto en json`.
|
|
439
|
+
- GREEN:
|
|
440
|
+
- `npx --yes tsx@4.21.0 --test integrations/sdd/__tests__/sessionStore.test.ts integrations/lifecycle/__tests__/cli.test.ts` -> `29/29 PASS`.
|
|
441
|
+
- `npm run -s typecheck` -> PASS.
|
|
442
|
+
- `npm run -s validation:tracking-single-active` -> PASS.
|
|
443
|
+
- Transición operativa:
|
|
444
|
+
- `P9.IMP.P1.T5 => ✅`
|
|
445
|
+
- siguiente en curso: `P9.IMP.P1.T6`.
|
|
446
|
+
|
|
447
|
+
## Evidencia de ejecución (`P9.IMP.P1.T6`)
|
|
448
|
+
|
|
449
|
+
- Implementación aplicada:
|
|
450
|
+
- `integrations/gate/stagePolicies.ts`:
|
|
451
|
+
- policy trace extendido con metadatos de policy-as-code firmada/versionada (`version`, `signature`) para fuentes `default`, `skills.policy` y `hard-mode`.
|
|
452
|
+
- firma determinista `sha256` construida sobre `version/source/bundle/hash/sourcePolicyHash` para trazabilidad reproducible.
|
|
453
|
+
- `integrations/git/stageRunners.ts`:
|
|
454
|
+
- resumen de hooks enriquecido con `policy_version` y `policy_signature` además de `policy_bundle/policy_hash`.
|
|
455
|
+
- `integrations/lifecycle/cli.ts`:
|
|
456
|
+
- panel `PRE-FLIGHT CHECK` ahora muestra política activa con `source/bundle/hash` y su bloque de firma/versionado.
|
|
457
|
+
- `scripts/framework-menu-consumer-preflight-lib.ts`:
|
|
458
|
+
- panel de preflight en menú consumidor alineado con la nueva trazabilidad de policy-as-code.
|
|
459
|
+
- `integrations/lifecycle/doctor.ts`:
|
|
460
|
+
- check `policy_drift` endurecido para validar `trace.signature` y `trace.version` por stage.
|
|
461
|
+
- `integrations/gate/evaluateAiGate.ts`:
|
|
462
|
+
- contrato de salida enlazado al tipo de `policy.trace` del resolver de políticas.
|
|
463
|
+
- Cobertura de tests:
|
|
464
|
+
- `integrations/gate/__tests__/stagePolicies.test.ts`.
|
|
465
|
+
- `integrations/gate/__tests__/stagePolicies-config-and-severity.test.ts`.
|
|
466
|
+
- `integrations/git/__tests__/stageRunners.test.ts`.
|
|
467
|
+
- `integrations/lifecycle/__tests__/cli.test.ts`.
|
|
468
|
+
- `scripts/__tests__/framework-menu-consumer-preflight.test.ts`.
|
|
469
|
+
- GREEN:
|
|
470
|
+
- `npx --yes tsx@4.21.0 --test integrations/gate/__tests__/stagePolicies.test.ts integrations/gate/__tests__/stagePolicies-config-and-severity.test.ts integrations/git/__tests__/stageRunners.test.ts integrations/lifecycle/__tests__/cli.test.ts scripts/__tests__/framework-menu-consumer-preflight.test.ts` -> `57/57 PASS`.
|
|
471
|
+
- `npm run -s typecheck` -> PASS.
|
|
472
|
+
- `npm run -s validation:tracking-single-active` -> PASS.
|
|
473
|
+
- Transición operativa:
|
|
474
|
+
- `P9.IMP.P1.T6 => ✅`
|
|
475
|
+
- siguiente en curso: `P9.IMP.P2.T1`.
|
|
476
|
+
|
|
477
|
+
## Evidencia de ejecución (`P9.IMP.P2.T1`)
|
|
478
|
+
|
|
479
|
+
- Implementación aplicada:
|
|
480
|
+
- `integrations/evidence/integrity.ts`:
|
|
481
|
+
- módulo nuevo para integridad criptográfica de evidencia con:
|
|
482
|
+
- canonicalización determinista (`json-stable-v1`),
|
|
483
|
+
- `payload_hash` (`sha256`),
|
|
484
|
+
- `chain_hash` enlazado con `previous_chain_hash`,
|
|
485
|
+
- firma opcional `HMAC-SHA256` (`PUMUKI_EVIDENCE_SIGNING_KEY` / `PUMUKI_EVIDENCE_SIGNING_KEY_ID`),
|
|
486
|
+
- verificación estructural y criptográfica con códigos de error explícitos (`EVIDENCE_INTEGRITY_*`).
|
|
487
|
+
- `integrations/evidence/schema.ts`:
|
|
488
|
+
- nuevo bloque `integrity` en contrato `AiEvidenceV2_1`.
|
|
489
|
+
- `integrations/evidence/writeEvidence.ts`:
|
|
490
|
+
- escritura automática de `integrity`,
|
|
491
|
+
- encadenado con evidencia previa válida (`previous_chain_hash`),
|
|
492
|
+
- firma opcional por entorno.
|
|
493
|
+
- `integrations/gate/evaluateAiGate.ts`:
|
|
494
|
+
- verificación de integridad integrada en evaluación de gate,
|
|
495
|
+
- bloqueo fail-closed ante integridad ausente/inválida,
|
|
496
|
+
- salida enriquecida con resumen `evidence.integrity`.
|
|
497
|
+
- `integrations/lifecycle/doctor.ts`:
|
|
498
|
+
- `doctor --deep` ahora marca `error` en `evidence_drift` si falla integridad.
|
|
499
|
+
- `integrations/lifecycle/cli.ts` y `scripts/framework-menu-consumer-preflight-lib.ts`:
|
|
500
|
+
- paneles de pre-flight muestran estado de integridad (`status`, `chain_hash`, `prev`, firma).
|
|
501
|
+
- `integrations/git/stageRunners.ts`:
|
|
502
|
+
- resumen de hooks incluye `evidence_integrity` y `evidence_chain_hash`.
|
|
503
|
+
- Cobertura de tests:
|
|
504
|
+
- nuevo: `integrations/evidence/__tests__/integrity.test.ts`.
|
|
505
|
+
- actualizado: `integrations/evidence/writeEvidence.test.ts`.
|
|
506
|
+
- actualizado: `integrations/gate/__tests__/evaluateAiGate.test.ts`.
|
|
507
|
+
- actualizado: `integrations/lifecycle/__tests__/doctor.test.ts`.
|
|
508
|
+
- actualizado: `integrations/lifecycle/__tests__/cli.test.ts`.
|
|
509
|
+
- actualizado: `integrations/git/__tests__/stageRunners.test.ts`.
|
|
510
|
+
- actualizado: `scripts/__tests__/framework-menu-consumer-preflight.test.ts`.
|
|
511
|
+
- GREEN:
|
|
512
|
+
- `npx --yes tsx@4.21.0 --test integrations/evidence/__tests__/integrity.test.ts integrations/evidence/writeEvidence.test.ts integrations/gate/__tests__/evaluateAiGate.test.ts integrations/lifecycle/__tests__/doctor.test.ts integrations/lifecycle/__tests__/cli.test.ts integrations/git/__tests__/stageRunners.test.ts scripts/__tests__/framework-menu-consumer-preflight.test.ts` -> `75/75 PASS`.
|
|
513
|
+
- `npm run -s typecheck` -> PASS.
|
|
514
|
+
- `npm run -s validation:tracking-single-active` -> PASS.
|
|
515
|
+
- Transición operativa:
|
|
516
|
+
- `P9.IMP.P2.T1 => ✅`
|
|
517
|
+
- siguiente en curso: `P9.IMP.P2.T3`.
|
|
518
|
+
|
|
519
|
+
## Evidencia de ejecución (`P9.IMP.P2.T2`)
|
|
520
|
+
|
|
521
|
+
- Implementación aplicada:
|
|
522
|
+
- `integrations/gate/waivers.ts`:
|
|
523
|
+
- módulo nuevo de waivers formales para `ai_gate` con contrato `version=1`.
|
|
524
|
+
- schema validado con `zod`: `id`, `code`, `owner`, `reason`, `created_at`, `expires_at`, `stage?`, `branch?`.
|
|
525
|
+
- matching por `code` exacto o wildcard (`*`), con filtros por `stage` y `branch`.
|
|
526
|
+
- enforcement de expiración (`ttl_seconds`) y salida normalizada de waivers aplicados.
|
|
527
|
+
- `integrations/gate/evaluateAiGate.ts`:
|
|
528
|
+
- integración de waivers sobre violaciones base (`evidence + gitflow + mcp`).
|
|
529
|
+
- bloqueo fail-closed cuando el archivo de waivers es inválido con `WAIVER_POLICY_INVALID`.
|
|
530
|
+
- contrato de salida enriquecido con bloque `waivers` (`path/status/invalid_reason/applied`).
|
|
531
|
+
- `integrations/mcp/aiGateCheck.ts`:
|
|
532
|
+
- `result` del check enterprise ahora propaga también `waivers`.
|
|
533
|
+
- `integrations/lifecycle/cli.ts` y `scripts/framework-menu-consumer-preflight-lib.ts`:
|
|
534
|
+
- paneles de preflight muestran estado de waivers (`status/applied/path`).
|
|
535
|
+
- hint operativo añadido para `WAIVER_POLICY_INVALID`.
|
|
536
|
+
- `scripts/__tests__/framework-menu-consumer-preflight.test.ts`:
|
|
537
|
+
- contratos de test actualizados para el nuevo bloque `waivers`.
|
|
538
|
+
- Cobertura de tests:
|
|
539
|
+
- actualizado: `integrations/gate/__tests__/evaluateAiGate.test.ts`.
|
|
540
|
+
- actualizado: `scripts/__tests__/framework-menu-consumer-preflight.test.ts`.
|
|
541
|
+
- actualizado: `integrations/lifecycle/__tests__/cli.test.ts`.
|
|
542
|
+
- GREEN:
|
|
543
|
+
- `npx --yes tsx@4.21.0 --test integrations/gate/__tests__/evaluateAiGate.test.ts integrations/lifecycle/__tests__/cli.test.ts scripts/__tests__/framework-menu-consumer-preflight.test.ts` -> `39/39 PASS`.
|
|
544
|
+
- `npm run -s typecheck` -> PASS.
|
|
545
|
+
- `npm run -s validation:tracking-single-active` -> PASS.
|
|
546
|
+
- Transición operativa:
|
|
547
|
+
- `P9.IMP.P2.T2 => ✅`
|
|
548
|
+
- siguiente en curso: `P9.IMP.P2.T3`.
|
|
549
|
+
|
|
550
|
+
## Evidencia de ejecución (`P9.IMP.P2.T3`)
|
|
551
|
+
|
|
552
|
+
- Implementación aplicada:
|
|
553
|
+
- `integrations/telemetry/structuredTelemetry.ts`:
|
|
554
|
+
- exportador estructurado en `JSONL` con contrato estable `schema_version=1`.
|
|
555
|
+
- salida compatible OTel (`JSONL`) opcional, activable por entorno.
|
|
556
|
+
- rutas configurables por entorno:
|
|
557
|
+
- `PUMUKI_TELEMETRY_JSONL_PATH`
|
|
558
|
+
- `PUMUKI_TELEMETRY_OTEL_JSONL_PATH`
|
|
559
|
+
- toggles operativos:
|
|
560
|
+
- `PUMUKI_TELEMETRY_EXPORT`
|
|
561
|
+
- `PUMUKI_TELEMETRY_EXPORT_OTEL`
|
|
562
|
+
- `integrations/gate/evaluateAiGate.ts`:
|
|
563
|
+
- emisión de evento `ai_gate.evaluated` en cada evaluación (status/decision/policy/evidence/métricas/mcp/waivers).
|
|
564
|
+
- `integrations/git/stageRunners.ts`:
|
|
565
|
+
- emisión de evento `hook_gate.evaluated` para `PRE_COMMIT`, `PRE_PUSH` y `CI`.
|
|
566
|
+
- telemetría activa incluso con `PUMUKI_HOOK_SUMMARY_QUIET` para no perder trazabilidad.
|
|
567
|
+
- `package.json`:
|
|
568
|
+
- inclusión de `integrations/telemetry/*.ts` en `files` para distribución del paquete.
|
|
569
|
+
- Cobertura de tests:
|
|
570
|
+
- nuevo: `integrations/telemetry/__tests__/structuredTelemetry.test.ts`.
|
|
571
|
+
- actualizado: `integrations/gate/__tests__/evaluateAiGate.test.ts`.
|
|
572
|
+
- actualizado: `integrations/git/__tests__/stageRunners.test.ts`.
|
|
573
|
+
- regresión cruzada: `integrations/lifecycle/__tests__/cli.test.ts`.
|
|
574
|
+
- regresión cruzada: `scripts/__tests__/framework-menu-consumer-preflight.test.ts`.
|
|
575
|
+
- GREEN:
|
|
576
|
+
- `npx --yes tsx@4.21.0 --test integrations/telemetry/__tests__/structuredTelemetry.test.ts integrations/gate/__tests__/evaluateAiGate.test.ts integrations/git/__tests__/stageRunners.test.ts integrations/lifecycle/__tests__/cli.test.ts scripts/__tests__/framework-menu-consumer-preflight.test.ts` -> `60/60 PASS`.
|
|
577
|
+
- `npm run -s typecheck` -> PASS.
|
|
578
|
+
- `npm run -s validation:tracking-single-active` -> PASS.
|
|
579
|
+
- Transición operativa:
|
|
580
|
+
- `P9.IMP.P2.T3 => ✅`
|
|
581
|
+
- siguiente en curso: `P9.IMP.P2.T4`.
|
|
582
|
+
|
|
583
|
+
## Evidencia de ejecución (`P9.IMP.P2.T4`)
|
|
584
|
+
|
|
585
|
+
- Implementación aplicada:
|
|
586
|
+
- `integrations/lifecycle/__tests__/enterpriseFixtureContracts.test.ts` (nuevo):
|
|
587
|
+
- suite contractual multi-fixture para validar comportamiento enterprise sobre repos reales temporales.
|
|
588
|
+
- cobertura de contratos:
|
|
589
|
+
- fixture limpio: `install + PRE_COMMIT` con emisión de telemetría `hook_gate`.
|
|
590
|
+
- fixture con `engines` estrictos incompatibles: `install` en modo standalone (`ENGINE_MISMATCH`) sin `npm install`.
|
|
591
|
+
- fixture inseguro (`node_modules` trackeado): bloqueo hard de `install` por baseline safety.
|
|
592
|
+
- fixture con waiver inválido: bloqueo `PRE_WRITE` con `WAIVER_POLICY_INVALID` y telemetría `ai_gate`.
|
|
593
|
+
- Cobertura de tests:
|
|
594
|
+
- nuevo: `integrations/lifecycle/__tests__/enterpriseFixtureContracts.test.ts`.
|
|
595
|
+
- regresión cruzada: `integrations/telemetry/__tests__/structuredTelemetry.test.ts`.
|
|
596
|
+
- regresión cruzada: `integrations/gate/__tests__/evaluateAiGate.test.ts`.
|
|
597
|
+
- regresión cruzada: `integrations/git/__tests__/stageRunners.test.ts`.
|
|
598
|
+
- regresión cruzada: `integrations/lifecycle/__tests__/cli.test.ts`.
|
|
599
|
+
- regresión cruzada: `scripts/__tests__/framework-menu-consumer-preflight.test.ts`.
|
|
600
|
+
- GREEN:
|
|
601
|
+
- `npx --yes tsx@4.21.0 --test integrations/lifecycle/__tests__/enterpriseFixtureContracts.test.ts` -> `4/4 PASS`.
|
|
602
|
+
- `npx --yes tsx@4.21.0 --test integrations/lifecycle/__tests__/enterpriseFixtureContracts.test.ts integrations/telemetry/__tests__/structuredTelemetry.test.ts integrations/gate/__tests__/evaluateAiGate.test.ts integrations/git/__tests__/stageRunners.test.ts integrations/lifecycle/__tests__/cli.test.ts scripts/__tests__/framework-menu-consumer-preflight.test.ts` -> `64/64 PASS`.
|
|
603
|
+
- `npm run -s typecheck` -> PASS.
|
|
604
|
+
- `npm run -s validation:tracking-single-active` -> PASS.
|
|
605
|
+
- Transición operativa:
|
|
606
|
+
- `P9.IMP.P2.T4 => ✅`
|
|
607
|
+
- siguiente en curso: `P9.F0.T3` (siguiente subtarea objetivo: `P9.F0.T3.ST2`) en `p9-ruralgo-fork-validation-tracking.md`.
|