pumuki 6.3.27 → 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.
@@ -373,9 +373,39 @@
373
373
  - `npm run -s typecheck`
374
374
  - evidencia de campo en clon real de `ruralgo-fork` (runtime `node 20.20.0`):
375
375
  - menú `pumuki-framework` opción `3` y `4` imprime `Resultado PASS parcial por alcance vacío`.
376
- - 🚧 `P10.T6` Ejecutar cuarto slice operativo P10 en repos reales (propagación release + revalidación @latest).
376
+ - `P10.T6` Ejecutar cuarto slice operativo P10 en repos reales (propagación release + revalidación @latest).
377
+ - cierre aplicado:
378
+ - release propagada en npm: `pumuki@6.3.27` publicado y etiquetado como `latest` (`npm view pumuki version dist-tags --json`).
379
+ - revalidación en consumidor real (`ruralgo-fork`) con runtime `node 20.20.0`:
380
+ - `npx --yes --package pumuki@latest pumuki install` ejecutado sin cambios de hooks y con bootstrap OpenSpec en verde.
381
+ - matiz de campo resuelto: cuando `pumuki` ya estaba declarado en consumer (`6.3.26`), `install` no forzó upgrade (`consumer package bootstrap: installed=no reason=already_declared`); se cerró con `npx --yes --package pumuki@latest pumuki update --latest --json`.
382
+ - versión efectiva verificada en consumer: `node -p \"require('pumuki/package.json').version\" => 6.3.27`.
383
+ - salud lifecycle validada: `npm run -s validation:p9:ruralgo-install-health -- --repo=/Users/juancarlosmerlosalbarracin/Developer/Projects/ruralgo-fork --json` => `ready=true`, hooks gestionados y `doctor PASS`.
384
+ - paridad runtime confirmada en consumer:
385
+ - bins stdio presentes: `pumuki-mcp-enterprise-stdio`, `pumuki-mcp-evidence-stdio`.
386
+ - exports oficiales cargan en `require/import`: `pumuki`, `pumuki/integrations/{git,lifecycle,sdd,mcp}`, `pumuki/core/gate/{evaluateGate,evaluateRules}`.
387
+ - ✅ `P10.T7` Ejecutar quinto slice operativo P10 en repos reales (cierre post-propagación + backlog residual).
388
+ - cierre aplicado:
389
+ - baseline real en `R_GO` consolidada con `status/doctor/sdd status` tras propagación `6.3.27`.
390
+ - consumidor oficial `R_GO` actualizado a `pumuki@6.3.27` (`pumuki update --latest`) con lifecycle en verde (`installed=true`, `version=6.3.27`, hooks gestionados).
391
+ - backlog residual revalidado y actualizado en `p9-ruralgo-bug-registry`:
392
+ - `RG-BUG-003 => ✅` (instalación fail-soft en runtime no alineado, sin bloqueo `EBADENGINE`).
393
+ - `RG-BUG-011 => ✅` (comando oficial `pumuki sdd sync-docs --dry-run --json` operativo y machine-readable en `R_GO` y `ruralgo-fork`).
394
+ - `RG-BUG-004 => ⏳` (persistencia de `unknown-ruleset` en `RULESET COVERAGE` de full-audit).
395
+ - `RG-BUG-012 => ⏳` (sin falso positivo iOS en `.ts` en full-audit, pero camino `pumuki-ci` aún bloqueado por precondiciones SDD/evidence).
396
+ - ✅ `P10.T8` Ejecutar sexto slice operativo P10 en repos reales (reducción de backlog residual activo).
397
+ - cierre aplicado:
398
+ - `RG-BUG-004` corregido en source:
399
+ - normalización de `RULESET COVERAGE` en `scripts/framework-menu-legacy-audit-lib.ts` (`common.*` y `workflow/sdd/generic` dejan de caer en `unknown-ruleset`).
400
+ - test de no-regresión añadido y en verde: `scripts/__tests__/framework-menu-legacy-audit.test.ts` (`clasifica common/workflow/sdd sin usar unknown-ruleset`).
401
+ - validación de campo con bin local en `R_GO`: `commonRuleSet (inferred): 75` + `gate-policy.default.PRE_COMMIT: 3`, sin `unknown-ruleset`.
402
+ - `RG-BUG-012` cerrado con repro CI controlada:
403
+ - clon temporal de `R_GO` con OpenSpec instalado + sesión SDD válida + cambio completo (`rgo-1200-03`).
404
+ - `sdd validate --stage=CI` en `ALLOWED` (`items=17`, `passed=17`, `failed=0`).
405
+ - `pumuki-ci` en `ALLOW/PASS` y evidencia CI sin hits de `ios.no-force-unwrap` en `.ts` objetivo.
406
+ - 🚧 `P10.T9` Ejecutar séptimo slice operativo P10 en repos reales (propagación final de fixes residuales).
377
407
  - objetivo inmediato:
378
- - publicar fixes acumulados de `P10` y revalidar en consumidor real con `pumuki@latest` (sin tarball local) para cerrar backlog residual de paridad post-P9.
408
+ - propagar a npm los fixes de `P10.T8` y revalidar en consumidores reales (`ruralgo-fork`/`R_GO`) que `@latest` ya no muestra `unknown-ruleset` en `RULESET COVERAGE`.
379
409
 
380
410
  ## Checklist A — Funcionalidades (sin omisiones)
381
411
  Totales: bins=10, lifecycle_commands=20, npm_scripts=98, exports=8, total_items=136.
@@ -670,9 +670,34 @@ Fuente unica de seguimiento operativo. No se abren nuevos MDs temporales de trac
670
670
  - `framework-menu-consumer-runtime`, `framework-menu-legacy-audit`, `framework-menu-matrix-evidence`.
671
671
  - `framework-menu-matrix-runner`, `framework-menu-matrix-baseline`, `framework-menu-matrix-canary`, `framework-menu-consumer-preflight`.
672
672
  - `npm run -s typecheck`.
673
- - 🚧 `P10.T6` Ejecutar cuarto slice operativo P10 en repos reales (propagación release + revalidación @latest).
673
+ - `P10.T6` Ejecutar cuarto slice operativo P10 en repos reales (propagación release + revalidación @latest).
674
+ - cierre aplicado:
675
+ - publicación npm completada: `pumuki@6.3.27` en `dist-tag latest`.
676
+ - revalidación en `ruralgo-fork` (runtime `20.20.0`):
677
+ - `pumuki install` ejecuta correctamente en consumidor real con hooks gestionados.
678
+ - matiz de upgrade resuelto: cuando el consumer tenía `pumuki@6.3.26` declarado, `install` no actualiza versión por diseño (`already_declared`); cierre con `pumuki update --latest`.
679
+ - versión efectiva en `node_modules/pumuki`: `6.3.27`.
680
+ - `validation:p9:ruralgo-install-health` en verde (`ready=true`, `doctor PASS`).
681
+ - paridad runtime confirmada:
682
+ - bins stdio presentes en `node_modules/.bin`.
683
+ - exports oficiales (`pumuki`, `integrations/*`, `core/gate/*`) cargan en `require/import` sin errores.
684
+ - ✅ `P10.T7` Ejecutar quinto slice operativo P10 en repos reales (cierre post-propagación + backlog residual).
685
+ - cierre aplicado:
686
+ - baseline ejecutada en `R_GO` con `pumuki status --json`, `pumuki doctor --json`, `pumuki sdd status --json`.
687
+ - `R_GO` actualizado a `pumuki@6.3.27` vía `pumuki update --latest`; lifecycle reporta `installed=true`, `version=6.3.27`, hooks gestionados.
688
+ - backlog residual actualizado con repro de campo:
689
+ - `RG-BUG-003 => ✅` (instalación no bloquea en runtime no alineado; modo standalone/skip engine mismatch).
690
+ - `RG-BUG-011 => ✅` (`pumuki sdd sync-docs --dry-run --json` operativo en `R_GO` y `ruralgo-fork`).
691
+ - `RG-BUG-004 => ⏳` (`unknown-ruleset` persiste en `RULESET COVERAGE`).
692
+ - `RG-BUG-012 => ⏳` (full-audit sin falso positivo iOS sobre `.ts`; camino CI bloqueado antes por SDD/evidence).
693
+ - ✅ `P10.T8` Ejecutar sexto slice operativo P10 en repos reales (reducción de backlog residual activo).
694
+ - cierre aplicado:
695
+ - `RG-BUG-004` corregido en source con normalización de rulesets (`common/workflow/sdd/generic`) y test de no-regresión en verde.
696
+ - validación de campo en `R_GO` con bin local: `RULESET COVERAGE` sin `unknown-ruleset`.
697
+ - `RG-BUG-012` cerrado mediante repro CI controlada en clon temporal de `R_GO` con precondiciones SDD conformes (`validate CI ALLOWED`, `pumuki-ci PASS`, sin hits de `ios.no-force-unwrap` sobre `.ts` objetivo).
698
+ - 🚧 `P10.T9` Ejecutar séptimo slice operativo P10 en repos reales (propagación final de fixes residuales).
674
699
  - foco:
675
- - publicar y revalidar en consumidor real usando `pumuki@latest` para cerrar paridad post-P10 sin dependencia de tarball local.
700
+ - publicar en npm los fixes de `P10.T8` y revalidar en consumidores reales (`ruralgo-fork`/`R_GO`) la desaparición de `unknown-ruleset` en `RULESET COVERAGE`.
676
701
 
677
702
  ## Plan Por Fases (Ciclo 014)
678
703
  Plan base visible para seguimiento previo y durante la implementacion.
@@ -84,19 +84,19 @@ Registro oficial de bugs detectados durante la validación de Pumuki en `R_GO`/`
84
84
  | --- | --- | --- | --- | --- | --- | --- | --- |
85
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
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` falla bajo `engine-strict` del monorepo (`EBADENGINE`) durante bootstrap OpenSpec. | Ejecución real en `R_GO` con runtime no alineado (`node v25/npm v11`) y engine requerido `20.20.0/10.8.2`. | Instalación no determinista en repos enterprise con engines estrictos. | Mantener fallback standalone + documentar modo recomendado y añadir test de no-regresión. |
88
- | `RG-BUG-004` | `P2` | Trazabilidad ruleset | | `unknown-ruleset` aparece en cobertura sin clasificación clara. | `RULESET COVERAGE` en RuralGO: `unknown-ruleset: 78 findings`. | Dificulta remediación orientada por dominio/ruleset. | Nombrado determinista de origen + metadatos de procedencia mínimos. |
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
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
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
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
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
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
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 existe mecanismo oficial claro de auto-sync documental SDD (`sync-docs`) en flujo observado. | No se observa comando dedicado en ciclo ejecutado; docs de tracking se mantienen manualmente. | Drift documental y carga operativa manual. | Evaluar `pumuki sdd sync-docs` o salida machine-readable estable para pipelines de docs. |
96
- | `RG-BUG-012` | `P1` | Falso positivo CI (`npm latest`) | | `pumuki-ci` de `pumuki@latest@6.3.26` bloquea `ruralgo-fork` con `ios.no-force-unwrap` en archivo TypeScript (`apps/admin-dashboard/playwright/e2e/critical-errors-verification.spec.ts:7`). | Repro real con runtime `node 20.20.0`: `PATH="$HOME/.nvm/versions/node/v20.20.0/bin:$PATH" npx --yes --package pumuki@latest pumuki-ci` => `[CRITICAL] ios.no-force-unwrap ...spec.ts:7` incluso tras eliminar `!` del literal de password. | Bloquea cierre de `P9.F2.T4.ST3` (CI verde) y evita apertura limpia de PR #1 bajo el criterio acordado. | Publicar release de `pumuki` que incluya fix de scope iOS en runtime de CLI o definir temporalmente policy CI de baseline para repos legacy sin bypass. |
97
- | `RG-BUG-013` | `P1` | Packaging/bin parity | ✅ | Los bins `pumuki-mcp-evidence-stdio` y `pumuki-mcp-enterprise-stdio` no existen en `pumuki@latest@6.3.26` publicado aunque sí están declarados en `package.json` local del repo. | Mitigación validada en release candidate: `npm pack --json` + instalación en clon real de `ruralgo-fork`; ambos bins presentes en `package.json#bin`, en `node_modules/.bin` y resolubles por `npm exec` (spawn operativo). | El bloqueo queda acotado a publicación npm de la versión corregida, no al código fuente actual. | Mantener cierre técnico y ejecutar publicación npm para que `@latest` refleje el fix. |
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`. | Fix aplicado en source: `runLifecycleInstall` ahora bootstrappea `pumuki@latest` en consumer cuando no está declarado, con trazabilidad en CLI (`consumer package bootstrap`). Validación de campo: `PATH=\"$HOME/.nvm/versions/node/v20.20.0/bin:$PATH\" node .../bin/pumuki.js install` + `npm explore pumuki -- npm run -s check-version` => `rc=0` en `ruralgo-fork`. | Se desbloquea la ejecución directa de scripts internos en consumidor bajo el contrato nuevo de `install` (pendiente de publicación npm para propagar a `@latest`). | Mantener cierre técnico y publicar release npm para propagar el fix a consumidores que usan `pumuki@latest` sin bin local. |
99
- | `RG-BUG-015` | `P1` | Packaging/exports runtime | ✅ | En consumidor real con `pumuki@latest@6.3.26`, los subpaths exportados (`core/*`, `integrations/*`) no son importables en runtime aunque figuran en `exports`. | Fix aplicado en source: wrappers JS runtime (`tsx/cjs`) para subpaths exportados + `exports` apuntando a `.js`; validación en clon real de `ruralgo-fork` con tarball RC: `require/import` en verde para exports oficiales (`pumuki`, `integrations/{git,lifecycle,sdd,mcp}`, `core/gate/{evaluateGate,evaluateRules}`). | Se restaura consumibilidad de API pública en el paquete generado localmente. | Pendiente publicar npm release para propagar fix a `pumuki@latest`. |
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
100
 
101
101
  ## Observaciones No-Bug (comportamiento esperado)
102
102
 
@@ -379,9 +379,46 @@ Criterio de salida F5:
379
379
  - `npm run -s typecheck`
380
380
  - evidencia de campo en consumidor real (clon temporal de `ruralgo-fork`, runtime `node 20.20.0`):
381
381
  - `pumuki-framework` opción `3` y `4` muestran `Resultado PASS parcial por alcance vacío`.
382
- - 🚧 `P10.F1.T4` Ejecutar slice S4: propagación release y revalidación @latest en consumidor real.
382
+ - `P10.F1.T4` Ejecutar slice S4: propagación release y revalidación @latest en consumidor real.
383
+ - cierre aplicado:
384
+ - release npm publicada: `pumuki@6.3.27` en `latest` (verificado con `npm view pumuki version dist-tags --json`).
385
+ - revalidación en `ruralgo-fork` (runtime `node 20.20.0`, sin tarball local):
386
+ - `PATH=\"$HOME/.nvm/versions/node/v20.20.0/bin:$PATH\" npx --yes --package pumuki@latest pumuki install` -> `installed 6.3.27` + hooks gestionados + OpenSpec bootstrap OK.
387
+ - matiz real detectado y resuelto: si el consumer ya declara `pumuki` (`6.3.26`), `install` no sube versión (`consumer package bootstrap: installed=no reason=already_declared`); se cerró con `PATH=\"$HOME/.nvm/versions/node/v20.20.0/bin:$PATH\" npx --yes --package pumuki@latest pumuki update --latest --json`.
388
+ - versión efectiva confirmada en consumer: `node -p \"require('pumuki/package.json').version\" => 6.3.27`.
389
+ - salud install/doctor en verde: `npm run -s validation:p9:ruralgo-install-health -- --repo=/Users/juancarlosmerlosalbarracin/Developer/Projects/ruralgo-fork --json` => `ready=true`, `issues=[]`.
390
+ - paridad runtime confirmada:
391
+ - bins stdio presentes en consumer: `pumuki-mcp-enterprise-stdio`, `pumuki-mcp-evidence-stdio`.
392
+ - exports oficiales cargan en `require/import`:
393
+ - `pumuki`
394
+ - `pumuki/integrations/{git,lifecycle,sdd,mcp}`
395
+ - `pumuki/core/gate/{evaluateGate,evaluateRules}`.
396
+ - ✅ `P10.F1.T5` Ejecutar slice S5: cierre post-propagación y backlog residual.
397
+ - cierre aplicado:
398
+ - cierre documental del bloque S1..S4 consolidado en tracking maestro/detallado.
399
+ - repro real en `R_GO` actualizada tras propagación de release:
400
+ - `status/doctor/sdd status` ejecutados con `pumuki@latest`.
401
+ - `R_GO` actualizado a `pumuki@6.3.27` (`pumuki update --latest`) con lifecycle alineado (`installed=true`, `version=6.3.27`, hooks gestionados).
402
+ - backlog residual actualizado en bug registry:
403
+ - `RG-BUG-003 => ✅`
404
+ - `RG-BUG-011 => ✅`
405
+ - `RG-BUG-004 => ⏳`
406
+ - `RG-BUG-012 => ⏳`
407
+ - ✅ `P10.F1.T6` Ejecutar slice S6: reducción de backlog residual activo.
408
+ - cierre aplicado:
409
+ - `RG-BUG-004`:
410
+ - fix en source (`scripts/framework-menu-legacy-audit-lib.ts`) para mapear `common.*` a `commonRuleSet (inferred)` y `workflow/sdd/generic` a bundle de policy.
411
+ - test de no-regresión en verde (`scripts/__tests__/framework-menu-legacy-audit.test.ts`).
412
+ - validación de campo con bin local en `R_GO`: `RULESET COVERAGE` sin `unknown-ruleset`.
413
+ - `RG-BUG-012`:
414
+ - repro CI controlada en clon temporal de `R_GO` con precondiciones conformes:
415
+ - OpenSpec instalado (`@fission-ai/openspec@1.2.0`), sesión válida y cambio completo (`rgo-1200-03`).
416
+ - `pumuki sdd validate --stage=CI --json` => `ALLOWED`, `items=17`, `passed=17`, `failed=0`.
417
+ - `pumuki-ci` => `decision=ALLOW outcome=PASS`.
418
+ - evidencia CI sin hits para `ios.no-force-unwrap` en `apps/admin-dashboard/playwright/e2e/critical-errors-verification.spec.ts`.
419
+ - 🚧 `P10.F1.T7` Ejecutar slice S7: propagación final de fixes residuales.
383
420
  - objetivo inmediato:
384
- - publicar fixes de P10 y revalidar paridad en `ruralgo-fork` usando `pumuki@latest` (sin tarball local) para cerrar backlog residual post-P9.
421
+ - publicar release npm con fixes de `S6` y revalidar en `ruralgo-fork`/`R_GO` que `@latest` refleja la normalización de `RULESET COVERAGE` (sin `unknown-ruleset`).
385
422
 
386
423
  Criterio de salida F6:
387
424
  - veredicto final trazable y cierre administrativo completo.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pumuki",
3
- "version": "6.3.27",
3
+ "version": "6.3.28",
4
4
  "description": "Enterprise-grade AST Intelligence System with multi-platform support (iOS, Android, Backend, Frontend) and Feature-First + DDD + Clean Architecture enforcement. Includes dynamic violations API for intelligent querying.",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -417,6 +417,11 @@ const inferRulesetBundle = (
417
417
  };
418
418
 
419
419
  const normalized = ruleId.toLowerCase();
420
+ const inferPolicyBundle = (): string =>
421
+ findBundle((bundle) => bundle.startsWith('gate-policy.default.'))
422
+ ?? findBundle((bundle) => bundle.startsWith('policyRuleSet@'))
423
+ ?? findBundle((bundle) => bundle === 'project-rules')
424
+ ?? 'policyRuleSet (inferred)';
420
425
  if (normalized.startsWith('heuristics.')) {
421
426
  return findBundle((bundle) => bundle.startsWith('astHeuristicsRuleSet@'))
422
427
  ?? 'astHeuristicsRuleSet (inferred)';
@@ -437,6 +442,10 @@ const inferRulesetBundle = (
437
442
  return findBundle((bundle) => bundle.startsWith('frontendRuleSet@'))
438
443
  ?? 'frontendRuleSet (inferred)';
439
444
  }
445
+ if (normalized.startsWith('common.')) {
446
+ return findBundle((bundle) => bundle.startsWith('commonRuleSet@'))
447
+ ?? 'commonRuleSet (inferred)';
448
+ }
440
449
  if (normalized.startsWith('skills.ios.')) {
441
450
  return findBundle((bundle) => bundle.startsWith('ios-') && bundle.includes('guidelines@'))
442
451
  ?? 'ios-guidelines (inferred)';
@@ -454,7 +463,14 @@ const inferRulesetBundle = (
454
463
  ?? 'frontend-guidelines (inferred)';
455
464
  }
456
465
  if (normalized.startsWith('methodology.') || normalized.startsWith('project.')) {
457
- return findBundle((bundle) => bundle === 'project-rules') ?? 'project-rules (inferred)';
466
+ return inferPolicyBundle();
467
+ }
468
+ if (
469
+ normalized.startsWith('workflow.')
470
+ || normalized.startsWith('sdd.')
471
+ || normalized.startsWith('generic_')
472
+ ) {
473
+ return inferPolicyBundle();
458
474
  }
459
475
  return 'unknown-ruleset';
460
476
  };