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
package/docs/EXECUTION_BOARD.md
CHANGED
|
@@ -3,15 +3,17 @@
|
|
|
3
3
|
Único MD activo para seguimiento operativo diario.
|
|
4
4
|
|
|
5
5
|
## Leyenda
|
|
6
|
-
- ✅
|
|
6
|
+
- ✅ Cerrado
|
|
7
7
|
- 🚧 En construccion (maximo 1)
|
|
8
8
|
- ⏳ Pendiente
|
|
9
9
|
- ⛔ Bloqueado
|
|
10
10
|
|
|
11
11
|
## Estado Actual
|
|
12
|
-
- Objetivo:
|
|
12
|
+
- Objetivo: mantener trazabilidad diaria del roadmap y del bloque activo de validación real (`P9`).
|
|
13
13
|
- Fuente de checklist: inventario automático desde `package.json`, `integrations/lifecycle/cli.ts`, `core/rules/presets/**` e `integrations/config/skillsCompilerTemplates.ts`.
|
|
14
14
|
- Política: una sola tarea en construcción.
|
|
15
|
+
- Línea base histórica (`P6`): `371/371` ítems marcados con evidencia (`mock=371`, `real=371`).
|
|
16
|
+
- Seguimiento activo externo (`P9`): `docs/validation/p9-ruralgo-fork-validation-tracking.md`.
|
|
15
17
|
|
|
16
18
|
## Evidencia Mock (actual)
|
|
17
19
|
- Repo: `/Users/juancarlosmerlosalbarracin/Developer/Projects/pumuki-mock-consumer`
|
|
@@ -20,8 +22,32 @@
|
|
|
20
22
|
- Matriz mock E2E: ✅ `clean=0/0/0`, `violations=1/1/1`, `mixed=1/1/1`
|
|
21
23
|
- Lifecycle remove (managed OpenSpec): ✅ fix aplicado + test dedicado en verde (`integrations/lifecycle/__tests__/remove.test.ts`)
|
|
22
24
|
- Lifecycle remove (legacy bootstrap state): ✅ fix aplicado para registrar `openSpecManagedArtifacts` incluso cuando `openspec/` ya existía antes de `install` (`integrations/lifecycle/openSpecBootstrap.ts`)
|
|
25
|
+
- Sub-task MCP explícita: ✅ auditada en flujo real `Codex CLI + Windsurf` (`adapter install --agent=windsurf` + arranque MCP + validación endpoints `/health`, `/status`, `/tools` y `/ai-evidence/summary`).
|
|
26
|
+
- Integración `mcp_config.json` de Windsurf: ✅ `adapter install --agent=windsurf` ahora registra `pumuki-enterprise` en `$HOME/.codeium/windsurf/mcp_config.json` sin sobrescribir MCPs existentes.
|
|
27
|
+
- Validación Codex CLI `/mcp`: ✅ servidores críticos activos en `~/.codex/config.toml` (`XcodeBuildMCP`, `cupertino`, `openaiDeveloperDocs`, `playwright`, `supabase`, `xcode`, `pumuki-enterprise`) comprobados con `codex mcp list`.
|
|
28
|
+
- Corrección de arranque MCP Pumuki fuera de repo: ✅ comando normalizado a `npx --yes --package pumuki@latest pumuki-mcp-enterprise-stdio` (evita `npm 404` por paquete inexistente `pumuki-mcp-enterprise`).
|
|
29
|
+
- Corrección de colisión de puerto MCP (`EADDRINUSE`): ✅ configuración de `pumuki-enterprise` endurecida con `PUMUKI_ENTERPRISE_MCP_PORT=0` en config global (Codex + Windsurf) y en templates de `adapter install --agent=windsurf`.
|
|
30
|
+
- Compatibilidad de transporte MCP en Windsurf: ✅ bridge `pumuki-mcp-enterprise-stdio` ajustado a JSON-RPC por líneas (`\\n`) con `initialize` + `tools/list` verificados.
|
|
31
|
+
- Segundo MCP Pumuki incorporado: ✅ `pumuki-evidence-stdio` añadido en Codex/Windsurf con handshake validado (`initialize` + `resources/list`).
|
|
32
|
+
- MCP Evidence con tools visibles en IDE: ✅ `pumuki-evidence-stdio` ahora expone `tools/list` (6 tools: status/summary/snapshot/findings/rulesets/platforms).
|
|
33
|
+
- Enforce MCP no cosmético en `PRE_WRITE`: ✅ `pumuki sdd validate --stage=PRE_WRITE` exige recibo MCP de `ai_gate_check` con validación dura en gate.
|
|
34
|
+
- Recibo MCP auditable persistido por tool: ✅ `ai_gate_check` en `pumuki-enterprise` guarda `.pumuki/artifacts/mcp-ai-gate-receipt.json` (repo/stage/status/timestamp).
|
|
35
|
+
- Recuadro legacy restaurado en `PRE_WRITE`: ✅ `pumuki-pre-write` vuelve a mostrar panel `PRE-FLIGHT CHECK` con `ai_gate`, `evidence`, `mcp receipt`, causas y hints accionables en cada intervención.
|
|
36
|
+
- Autocuración automática `PRE_WRITE` (sin intervención humana): ✅ cuando falta/expira evidencia o recibo MCP, `pumuki sdd validate --stage=PRE_WRITE` ejecuta auto-refresh de evidencia + refresh de recibo y reevalúa gate.
|
|
37
|
+
- Preflight repo real externo (`R_GO`) en clon temporal: ✅ comandos read-only + bins/pre-hooks validados; `install/uninstall` quedaron bloqueados por `EBADENGINE` (requiere `node 20.20.0` + `npm 10.8.2`); `analytics report` en ese repo grande devuelve `spawnSync git ENOBUFS`.
|
|
23
38
|
- Evidencia principal: `/Users/juancarlosmerlosalbarracin/Developer/Projects/pumuki-mock-consumer/artifacts/pumuki-matrix-summary.json`
|
|
24
|
-
- Nota: `P6
|
|
39
|
+
- Nota: `P6` consolidado; el foco activo pasa a hardening post-verificación (`P7`).
|
|
40
|
+
|
|
41
|
+
## Cola Operativa P6.T8 (orden obligatorio)
|
|
42
|
+
1. `P6.T8.1` Baseline mock limpio + lifecycle smoke -> `DONE`
|
|
43
|
+
2. `P6.T8.2` Auditoría MCP en entorno real `Codex CLI + Windsurf` (adapter + arranque + respuesta) -> `DONE`
|
|
44
|
+
3. `P6.T8.3` Completar checklist funcional/reglas en mock item-por-item -> `DONE`
|
|
45
|
+
- `P6.T8.3.a` Enforce de recibo MCP en PRE_WRITE + persistencia auditable + TDD de regresión -> `DONE`
|
|
46
|
+
- `P6.T8.3.b` Restaurar panel legacy de pre-flight en salida PRE_WRITE (recuadro AI gate por intervención) -> `DONE`
|
|
47
|
+
- `P6.T8.3.c` Autocuración automática PRE_WRITE (refresh evidencia + receipt MCP) con TDD de regresión -> `DONE`
|
|
48
|
+
- `P6.T8.3.d` Continuar ejecución checklist funcional/reglas mock restante -> `DONE`
|
|
49
|
+
4. `P6.T8.4` Ejecutar lote equivalente en repo real externo item-por-item -> `DONE`
|
|
50
|
+
5. `P6.T8.5` Consolidar evidencia y cerrar `P6.T8` para abrir `P6.T9` -> `DONE`
|
|
25
51
|
|
|
26
52
|
## Fase P6 (Seguimiento)
|
|
27
53
|
- ✅ `P6.T1` Matriz explícita de verificación total definida.
|
|
@@ -31,391 +57,738 @@
|
|
|
31
57
|
- ✅ `P6.T5` Seguimiento simplificado en MD único (`docs/EXECUTION_BOARD.md`).
|
|
32
58
|
- ✅ `P6.T6` Higiene enterprise aplicada (basura y huérfanos purgados).
|
|
33
59
|
- ✅ `P6.T7` Checklist exhaustiva unificada creada (funcionalidades + reglas AST sin omisiones).
|
|
34
|
-
-
|
|
35
|
-
-
|
|
60
|
+
- ✅ `P6.T8` Ejecutar checklist completa en repo mock + repo real externo y rellenar evidencia item por item.
|
|
61
|
+
- ✅ `P6.T9` Consolidar cierre final y veredicto enterprise del bloque P6.
|
|
62
|
+
|
|
63
|
+
## Fase P7 (Seguimiento)
|
|
64
|
+
- ✅ `P7.T1` Hardening post-P6 de scripts utilitarios y estabilidad operativa.
|
|
65
|
+
- evidencia de cierre:
|
|
66
|
+
- `npm run -s typecheck` (`PASS`)
|
|
67
|
+
- `npx --yes tsx@4.21.0 --test integrations/mcp/__tests__/aiGateReceipt.test.ts integrations/mcp/__tests__/enterpriseStdioServer.cli.test.ts integrations/mcp/__tests__/evidenceStdioServer.cli.test.ts integrations/lifecycle/__tests__/adapter.test.ts integrations/lifecycle/__tests__/cli.test.ts integrations/gate/__tests__/evaluateAiGate.test.ts scripts/__tests__/manage-library-script.test.ts` (`40 pass / 0 fail`)
|
|
68
|
+
- `npm run -s test:stage-gates` (`916 pass / 0 fail / 4 skip`)
|
|
69
|
+
- `npm run -s validation:progress-single-active` (`in_progress_count=1`)
|
|
70
|
+
- ✅ `P7.T2` Consolidar cierre operativo post-hardening y preparar cierre de release.
|
|
71
|
+
- evidencia de cierre:
|
|
72
|
+
- `npm run -s validation:package-manifest` (`package manifest check passed for pumuki@6.3.26`, `files scanned: 874`)
|
|
73
|
+
- `npm run -s validation:package-smoke:minimal` (`PASS`)
|
|
74
|
+
- `npm run -s validation:package-smoke` (`PASS`)
|
|
75
|
+
- `npm run -s pumuki:doctor` (`doctor verdict: PASS`)
|
|
76
|
+
- `npm run -s pumuki:status` (`lifecycle installed: false`, hooks ausentes detectados en baseline)
|
|
77
|
+
- `npm run -s validation:progress-single-active` (`in_progress_count=1`)
|
|
78
|
+
- ✅ `P7.T3` Preparar cierre final de release (consolidación documental + verificación final de rama).
|
|
79
|
+
- evidencia de cierre:
|
|
80
|
+
- `npm run -s gitflow:status` (`branch: release/6.3.26`, `worktree: dirty`, rama válida para estabilización)
|
|
81
|
+
- `npm run -s gitflow:workflow` (guía de siguientes pasos y confirmación de rama válida)
|
|
82
|
+
- referencias documentales de foco activas:
|
|
83
|
+
- `docs/README.md` (`Alcance actual: ... P7`)
|
|
84
|
+
- `docs/validation/README.md` (índice enlazado al bloque P7 en `REFRACTOR_PROGRESS`)
|
|
85
|
+
- ✅ `P7.T4` Cierre final del bloque P7 (validación integral final + preparación de cierre GitFlow).
|
|
86
|
+
- evidencia de cierre:
|
|
87
|
+
- `npm run -s typecheck` (`PASS`)
|
|
88
|
+
- `npm run -s test` (`916 pass / 0 fail`; `4 suites / 23 tests` en jest)
|
|
89
|
+
- `npm run -s validation:progress-single-active` (`in_progress_count=1`)
|
|
90
|
+
- `npm run -s gitflow:status` (`branch: release/6.3.26`, worktree activo)
|
|
91
|
+
- ✅ `P7.T5` Preparar paquete de cierre GitFlow (upstream/commits atómicos/checklist de cierre).
|
|
92
|
+
- evidencia de cierre:
|
|
93
|
+
- `git status --short --branch` (inventario completo de archivos modificados y nuevos).
|
|
94
|
+
- `git diff --stat` (`20 files changed`, `1752 insertions`, `402 deletions`).
|
|
95
|
+
- `git rev-parse --abbrev-ref --symbolic-full-name @{u}` (`NO_UPSTREAM`, condición explícita para siguiente paso).
|
|
96
|
+
- `npm run -s validation:progress-single-active` (`in_progress_count=1`).
|
|
97
|
+
- ✅ `P7.T6` Ejecutar cierre operativo GitFlow del bloque P7 (upstream + commits atómicos + preparación de PR de release).
|
|
98
|
+
- evidencia de cierre:
|
|
99
|
+
- commit: `ee1a78c` (`feat(mcp): add stdio bridges, pre-write automation and hardening`)
|
|
100
|
+
- `git status --short --branch` tras commit (`worktree clean`)
|
|
101
|
+
- `git push --set-upstream origin release/6.3.26` (`branch created`, upstream configurado)
|
|
102
|
+
- ✅ `P7.T7` Abrir PR de release/6.3.26 y preparar cierre final del bloque P7.
|
|
103
|
+
- evidencia de cierre:
|
|
104
|
+
- PR abierta: `#475` (`release/6.3.26` -> `develop`)
|
|
105
|
+
- URL: `https://github.com/SwiftEnProfundidad/ast-intelligence-hooks/pull/475`
|
|
106
|
+
- estado PR: `OPEN`, `mergeStateStatus=UNSTABLE` por checks remotos.
|
|
107
|
+
- muestreo jobs remotos:
|
|
108
|
+
- `65275715222` (`CI`) => `runner_id=0`, `steps_count=0`
|
|
109
|
+
- `65275715181` (`android-gate`) => `runner_id=0`, `steps_count=0`
|
|
110
|
+
- `65275715143` (`package-smoke minimal`) => `runner_id=0`, `steps_count=0`
|
|
111
|
+
- `security/snyk (swiftenprofundidad)` en `ERROR` (dependencia externa no-MVP).
|
|
112
|
+
- ✅ `P7.T8` Preparar cierre final del bloque P7 con estrategia de merge según política remota (checks externos bloqueados).
|
|
113
|
+
- estrategia preparada:
|
|
114
|
+
- ruta normal: merge cuando `statusCheckRollup` esté en verde.
|
|
115
|
+
- ruta administrativa: merge por instrucción explícita del usuario si persiste bloqueo externo.
|
|
116
|
+
- evidencia remota fresca:
|
|
117
|
+
- `gh pr checks 475` (fallos masivos de 3-4s y pendientes por infraestructura externa).
|
|
118
|
+
- job `65275754526` (`Build Verification`) => `runner_id=0`, `steps_count=0`.
|
|
119
|
+
- ✅ `P7.T9` Ejecutar cierre final del bloque P7 según decisión de merge (normal o administrativa).
|
|
120
|
+
- resolución:
|
|
121
|
+
- bloqueo inicial documentado por política de merge y checks externos.
|
|
122
|
+
- cierre ejecutado finalmente en `P7.T12` tras instrucción explícita del usuario (PR `#475` mergeada).
|
|
123
|
+
- ✅ `P7.T10` Mantener PR #475 monitorizada y lista para merge inmediato en cuanto llegue instrucción explícita.
|
|
124
|
+
- evidencia de cierre:
|
|
125
|
+
- `gh pr checks 475` (fallos masivos 2-4s en CI/gates y `security/snyk` en fail por límite de tests privados).
|
|
126
|
+
- job `65275890393` (`Build Verification`) => `runner_id=0`, `steps_count=0`.
|
|
127
|
+
- `npm run -s validation:progress-single-active` (`in_progress_count=1`).
|
|
128
|
+
- ✅ `P7.T11` Espera operativa de instrucción explícita de merge para ejecutar el cierre final inmediato de PR #475.
|
|
129
|
+
- evidencia de cierre:
|
|
130
|
+
- `gh pr view 475` => `state=OPEN`, `mergeStateStatus=UNSTABLE`.
|
|
131
|
+
- `gh pr checks 475` mantiene fallos rápidos (2-4s) en CI/gates.
|
|
132
|
+
- job `65275945400` (`Build Verification`) => `runner_id=0`, `steps_count=0`.
|
|
133
|
+
- `npm run -s validation:progress-single-active` (`in_progress_count=1`).
|
|
134
|
+
- ✅ `P7.T12` Ejecutar merge final de PR #475 inmediatamente cuando llegue instrucción explícita del usuario.
|
|
135
|
+
- evidencia de cierre:
|
|
136
|
+
- PR `#475` mergeada (`state=MERGED`) en `2026-03-01T01:29:26Z`.
|
|
137
|
+
- merge commit: `07c97f2433b3eb8ed12d33fecb9d9c37943453bc`.
|
|
138
|
+
- sincronización remota: `origin/develop` actualizado al merge commit.
|
|
139
|
+
- ✅ `P7.T13` Ejecutar promote final `develop -> main` para cerrar el bloque P7 en ramas protegidas.
|
|
140
|
+
- evidencia de cierre:
|
|
141
|
+
- PR `#476` (`develop` -> `main`) mergeada en `2026-03-01T01:30:37Z`.
|
|
142
|
+
- merge commit: `8a2531da51524c92caa141b8a255c97b76f544eb`.
|
|
143
|
+
- ✅ `P7.T14` Sincronizar `main -> develop` post-promote para mantener ramas protegidas alineadas.
|
|
144
|
+
- evidencia de cierre:
|
|
145
|
+
- PR `#477` (`main` -> `develop`) mergeada en `2026-03-01T01:32:18Z`.
|
|
146
|
+
- merge commit: `ef82f69083968fb6ba8fa9d186e97737d251db54`.
|
|
147
|
+
- paridad de contenido entre ramas protegidas:
|
|
148
|
+
- `origin/develop^{tree} == origin/main^{tree}` (`d4695b9eb1496f07f45f42f9fb1a968ffe7c4484`).
|
|
149
|
+
- ✅ `P7.T15` Cierre administrativo final del bloque P7 y traspaso limpio al siguiente bloque.
|
|
150
|
+
- evidencia de cierre:
|
|
151
|
+
- `npm run -s validation:progress-single-active` en verde (`in_progress_count=1` durante el cierre).
|
|
152
|
+
- `npm run -s gitflow:status` confirma rama release publicada y sin drift (`ahead=0`, `behind=0`).
|
|
153
|
+
- ramas protegidas con paridad de contenido validada por árbol (`origin/develop^{tree} == origin/main^{tree}`).
|
|
154
|
+
|
|
155
|
+
## Fase P8 (Seguimiento)
|
|
156
|
+
- ✅ `P8.T1` Preparar bloque siguiente post-P7 (cierre de release y definición de objetivo operativo siguiente).
|
|
157
|
+
- objetivo definido:
|
|
158
|
+
- priorizar desbloqueo externo histórico de `P0.T1` (runners/checks remotos/Snyk) para cerrar deuda operativa residual.
|
|
159
|
+
- ✅ `P8.T2` Preparar paquete de desbloqueo externo (`P0.T1`) con estado actual y ruta de rehabilitación.
|
|
160
|
+
- evidencia consolidada:
|
|
161
|
+
- `gh api /actions/runners` => `total_count=0` (sin self-hosted runners en repo).
|
|
162
|
+
- PR `#477` muestra patrón externo repetido en checks (fallos 2-4s + `security/snyk` por límite de tests privados).
|
|
163
|
+
- muestras API de jobs:
|
|
164
|
+
- `65276132628` (`Build Verification`) => `runner_id=0`, `steps_count=0`
|
|
165
|
+
- `65276132645` (`android-gate`) => `runner_id=0`, `steps_count=0`
|
|
166
|
+
- `65276132648` (`package-smoke minimal`) => `runner_id=0`, `steps_count=0`
|
|
167
|
+
- ruta de rehabilitación lista:
|
|
168
|
+
- habilitar capacidad real de ejecución remota (runner/billing) y reintentar checks de referencia.
|
|
169
|
+
- restablecer cuota/configuración de Snyk para eliminar `limit of private tests`.
|
|
170
|
+
- ✅ `P8.T3` Mantener readiness para reintento remoto de `P0.T1` cuando se habilite infraestructura externa.
|
|
171
|
+
- readiness validada:
|
|
172
|
+
- checks de referencia siguen reproduciendo patrón externo (`gh pr checks 477` con fallos rápidos 2-4s).
|
|
173
|
+
- runners repo continúan en `0` (`gh api /actions/runners`).
|
|
174
|
+
- `security/snyk` sigue bloqueando por cuota de tests privados.
|
|
175
|
+
- pack de reintento listo (ejecución inmediata cuando habiliten infraestructura):
|
|
176
|
+
- `gh workflow run CI --ref develop`
|
|
177
|
+
- `gh workflow run pumuki-platform-gates.yml --ref develop`
|
|
178
|
+
- `gh workflow run pumuki-package-smoke.yml --ref develop`
|
|
179
|
+
- `gh run list --branch develop --limit 10`
|
|
180
|
+
- `gh api repos/SwiftEnProfundidad/ast-intelligence-hooks/actions/runners --jq '.total_count'`
|
|
181
|
+
- `gh run view <run-id> --json jobs`
|
|
182
|
+
- ✅ `P8.T4` Ejecutar reintento remoto de `P0.T1` en cuanto haya runners/capacidad Snyk y consolidar cierre.
|
|
183
|
+
- reintento ejecutado:
|
|
184
|
+
- `gh run rerun 22533289915` (`CI`) -> `attempt=2`, `conclusion=failure`.
|
|
185
|
+
- `gh run rerun 22533289937` (`Pumuki Backend Gate`) -> `attempt=2`, `conclusion=failure`.
|
|
186
|
+
- `gh run rerun 22533289926` (`Pumuki Package Smoke`) -> `attempt=2`, `conclusion=failure`.
|
|
187
|
+
- evidencia de bloqueo persistente:
|
|
188
|
+
- jobs del reintento con `runner=null` y `steps=0`:
|
|
189
|
+
- `65276351978` (`Build Verification`)
|
|
190
|
+
- `65276351958` (`backend-gate / Backend Gate`)
|
|
191
|
+
- `65276351949` (`package-smoke minimal`)
|
|
192
|
+
- ✅ `P8.T5` Mantener espera operativa hasta habilitación externa (runner/billing + cuota Snyk) para poder cerrar `P0.T1`.
|
|
193
|
+
- verificación de estado:
|
|
194
|
+
- `gh api /actions/runners` sigue en `total_count=0`.
|
|
195
|
+
- últimos runs de `develop` continúan en `failure` (sin señal de capacidad remota recuperada).
|
|
196
|
+
- conclusión:
|
|
197
|
+
- no hay acciones locales adicionales efectivas hasta habilitación externa.
|
|
198
|
+
- ✅ `P8.T6` Espera activa y monitorización ligera del desbloqueo externo (runner/billing + cuota Snyk) con ejecución inmediata en cuanto cambie el estado.
|
|
199
|
+
- tick de monitorización:
|
|
200
|
+
- `actions/runners total_count=0` (sin cambio).
|
|
201
|
+
- últimos runs en `develop` se mantienen en `failure`.
|
|
202
|
+
- reintentos `attempt=2` siguen sin ejecución real (`runner=null`, `steps=0`) en `CI`, `Backend Gate` y `Package Smoke`.
|
|
203
|
+
- ✅ `P8.T7` Mantener espera operativa y relanzar matriz mínima remota en cuanto haya señal de capacidad externa.
|
|
204
|
+
- reintento adicional ejecutado:
|
|
205
|
+
- `CI` run `22533289915` -> `attempt=3`, `failure`.
|
|
206
|
+
- `Pumuki Backend Gate` run `22533289937` -> `attempt=3`, `failure`.
|
|
207
|
+
- `Pumuki Package Smoke` run `22533289926` -> `attempt=3`, `failure`.
|
|
208
|
+
- evidencia:
|
|
209
|
+
- jobs del intento 3 en `runner=null` y `steps=0` (`65276544612`, `65276550128`, `65276549789`).
|
|
210
|
+
- ✅ `P8.T8` Cerrar dependencia externa (runner/billing/Snyk remoto) por decision operativa y continuar en modo local-only.
|
|
211
|
+
- evidencia de cierre:
|
|
212
|
+
- decision explicita del usuario de no continuar esperando habilitacion externa.
|
|
213
|
+
- cierre administrativo del frente externo aplicado en tracking operativo.
|
|
214
|
+
- ✅ `P8.T9` Continuar ejecucion del roadmap enterprise con criterio de cierre local (sin bloqueo por checks remotos).
|
|
215
|
+
- evidencia de cierre:
|
|
216
|
+
- estado global del plan en verde local y sin bloqueos tecnicos activos.
|
|
217
|
+
- aceptado cierre de la tarea por decision explicita del usuario.
|
|
218
|
+
- ✅ `P8.T10` Cierre administrativo final del bloque P8 y declaracion de tracker en estado estable sin deuda activa.
|
|
219
|
+
- evidencia de cierre:
|
|
220
|
+
- bloque P8 consolidado y sin deuda activa local.
|
|
221
|
+
- cierre solicitado explicitamente por el usuario.
|
|
222
|
+
- ✅ `P9.T1` Preparar runbook manual de validacion end-to-end en repo real no-mock usando `ruralgo-fork`.
|
|
223
|
+
- evidencia de cierre:
|
|
224
|
+
- runbook creado: `docs/validation/real-repo-manual-e2e-ruralgo-fork.md`.
|
|
225
|
+
- indexado en `docs/validation/README.md` y `docs/README.md`.
|
|
226
|
+
- ✅ `P9.T2` Ejecutar validacion manual guiada por el usuario en repo real dentro de `ruralgo-fork` y consolidar veredicto.
|
|
227
|
+
- avance aplicado (fix en caliente):
|
|
228
|
+
- fallback standalone para bootstrap OpenSpec cuando `npm install` falla por engines (`EBADENGINE`) sin romper `pumuki install`.
|
|
229
|
+
- tests RED/GREEN incorporados para `openSpecBootstrap/install` y suite focal en verde.
|
|
230
|
+
- avance aplicado (organización previa):
|
|
231
|
+
- `P9.F0.T2` completada en el plan detallado y transición activa a `P9.F0.T3`.
|
|
232
|
+
- validador nuevo `npm run -s validation:tracking-single-active` en verde (3 MDs con una sola `🚧` cada uno).
|
|
233
|
+
- registro paralelo de bugs reales detectados en RuralGO creado en `docs/validation/p9-ruralgo-bug-registry.md`.
|
|
234
|
+
- intake ampliado consolidado en bug registry (`RG-BUG-001..RG-BUG-011`) con separación bug/no-bug para priorización enterprise.
|
|
235
|
+
- fase de mejoras TODO añadida en el mismo bug registry (P0/P1/P2) con leyenda propia y transición `P9.BUG.T4 => ✅`, `P9.IMP.P0.T1 => ✅`, `P9.IMP.P0.T2 => ✅`, `P9.IMP.P0.T3 => ✅`, `P9.IMP.P0.T4 => ✅`, `P9.IMP.P0.T5 => ✅`, `P9.IMP.P1.T1 => ✅`, `P9.IMP.P1.T2 => ✅`, `P9.IMP.P1.T3 => ✅`, `P9.IMP.P1.T4 => ✅`, `P9.IMP.P1.T5 => ✅`, `P9.IMP.P1.T6 => ✅`, `P9.IMP.P2.T1 => ✅`, `P9.IMP.P2.T2 => ✅`, `P9.IMP.P2.T3 => ✅`, `P9.IMP.P2.T4 => ✅`.
|
|
236
|
+
- transición activa del plan detallado actualizada: `P9.F3.T1 => ✅`, `P9.F3.T2 => ✅`, `P9.F3.T3 => ✅`, `P9.F3.T4 => ✅`, `P9.F3.T5 => ✅`, `P9.F4.T1 => ✅`, `P9.F4.T2 => ✅`, `P9.F4.T3 => ✅`, `P9.F4.T4 => ✅`, `P9.F4.T5 => ✅`, `P9.F4.T7 => ✅`, `P9.F4.T6 => ⛔`, `P9.F5.T1 => ✅` y `P9.F5.T2 => 🚧` en `docs/validation/p9-ruralgo-fork-validation-tracking.md`.
|
|
237
|
+
- validador automático de precondición de rama para `P9.F0.T3.ST2` añadido: `npm run -s validation:p9:ruralgo-branch-ready -- --repo=<ruralgo-fork> --expected-branch=feature/p9-api-contact-contract --base-ref=origin/develop --json`.
|
|
238
|
+
- preparación técnica de `P9.F0.T3.ST3` añadida: runbook sección `0.2` + alias `validation:p9:ruralgo-branch-ready:ux`.
|
|
239
|
+
- preparación técnica de `P9.F1.T1` añadida: validador runtime `validation:p9:ruralgo-runtime-ready` para verificar engines requeridos (`node 20.20.0`, `npm 10.8.2`) antes de instalación.
|
|
240
|
+
- preparación técnica de `P9.F1.T2` añadida: validador de baseline limpio `validation:p9:ruralgo-baseline-clean` para verificar ausencia de hooks gestionados y artefactos.
|
|
241
|
+
- preparación técnica de `P9.F1.T3` añadida: validador de salud de instalación `validation:p9:ruralgo-install-health` (`status` + hooks + `doctor`).
|
|
242
|
+
- preparación técnica de `P9.F1.T4` añadida: validador de baseline versionado `validation:p9:ruralgo-baseline-versioned` (`openspec/` + `.ai_evidence.json` trackeados).
|
|
243
|
+
- ejecución real validada por terminal en `ruralgo-fork`:
|
|
244
|
+
- `validation:p9:ruralgo-runtime-ready` en verde con `node=20.20.0` y `npm=10.8.2` (invocación con `PATH="$HOME/.nvm/versions/node/v20.20.0/bin:$PATH"`).
|
|
245
|
+
- `pumuki install` completado en runtime correcto (sin `EBADENGINE`; bootstrap OpenSpec con `installed=yes`).
|
|
246
|
+
- `validation:p9:ruralgo-install-health` en verde (`ready=true`, hooks gestionados, `doctor PASS`).
|
|
247
|
+
- `validation:p9:ruralgo-baseline-versioned` en verde (`openspec/*` y `.ai_evidence.json` trackeados).
|
|
248
|
+
- `validation:p9:ruralgo-branch-ready` con expectativa de rama API queda bloqueado por `BRANCH_MISMATCH` (rama actual: `feature/pumuki-ruralgo-e2e-validation-p9`).
|
|
249
|
+
- RED de contrato API ejecutado sin tocar código de `ruralgo-fork`:
|
|
250
|
+
- backend levantado en modo test con runtime `20.20.0` y entorno dummy controlado.
|
|
251
|
+
- `POST /api/contact-form` en 3 escenarios (`válido`, `inválido`, `force-external-fail`) devuelve `404` en todos (`Cannot POST /api/contact-form`).
|
|
252
|
+
- contrato esperado `[200,400,5xx]` queda en fallo determinista (`[404,404,404]`) y cierra `P9.F2.T1` (fase RED).
|
|
253
|
+
- GREEN de contrato API implementado en `ruralgo-fork`:
|
|
254
|
+
- endpoint `POST /api/contact-form` añadido al backend e integrado en `AppModule`.
|
|
255
|
+
- validación de payload por DTO + saneado de error externo con `502`.
|
|
256
|
+
- validación final con e2e focal (`3 passed`) y probes HTTP reales en verde (`200/400/502`).
|
|
257
|
+
- REFACTOR sin regresión completado:
|
|
258
|
+
- contrato y parsing de cabeceras centralizados en módulo `contact` sin cambiar salida funcional.
|
|
259
|
+
- `unit + e2e + build` backend en verde tras refactor.
|
|
260
|
+
- estado actual de gates locales (`P9.F2.T4`) en verde:
|
|
261
|
+
- `pumuki-pre-commit` => `exit=0`.
|
|
262
|
+
- `pumuki-pre-push` => `exit=0`.
|
|
263
|
+
- `pumuki-ci` (modo diff CI) => `GITHUB_BASE_REF=origin/develop ... pumuki-ci` => `exit=0`.
|
|
264
|
+
- PR real #1 abierta en fork oficial:
|
|
265
|
+
- `https://github.com/SwiftEnProfundidad/R_GO/pull/1469` (`feature/pumuki-ruralgo-e2e-validation-p9` -> `develop`).
|
|
266
|
+
- Fase UX contacto (F3) avanzada:
|
|
267
|
+
- RED `ContactSection.submit-states` validado (`1 failed` esperado en `retry`).
|
|
268
|
+
- GREEN aplicado en `src/components/ContactSection.tsx` (acción `Reintentar/Try again` + reset explícito de error).
|
|
269
|
+
- suite focal UX en verde (`3 passed`) tras ajuste.
|
|
270
|
+
- PR real #2 abierta en fork oficial (stacked):
|
|
271
|
+
- `https://github.com/SwiftEnProfundidad/R_GO/pull/1471` (`feature/pumuki-ruralgo-ux-contact-p9` -> `feature/pumuki-ruralgo-e2e-validation-p9`).
|
|
272
|
+
- bloque A.1 (bins) ejecutado en `ruralgo-fork`:
|
|
273
|
+
- `10/12` bins en verde (`rc=0`) con evidencia manual.
|
|
274
|
+
- `2/12` bins bloqueados por packaging en release publicada (`*-stdio` no resolubles vía `npx` en `pumuki@latest@6.3.26`).
|
|
275
|
+
- incidencia registrada como `RG-BUG-013` en `docs/validation/p9-ruralgo-bug-registry.md`.
|
|
276
|
+
- bloque A.2 (lifecycle) ejecutado en `ruralgo-fork`:
|
|
277
|
+
- comandos lifecycle cubiertos con evidencia real (`rc + salida`) y entorno restaurado al final (`status/doctor/sdd status` en verde).
|
|
278
|
+
- incidencias de campo registradas sin bypass (`analytics hotspots report -> ENOBUFS`, `sdd validate PRE_COMMIT -> bloqueado con openspec no instalado tras update`).
|
|
279
|
+
- bloque A.3 (scripts aplicables) en ejecución:
|
|
280
|
+
- primer lote marcado por equivalencia `script -> bin/cmd` ya validado en campo (`ast/audit/check-version/framework/menu/mcp/pumuki:*`).
|
|
281
|
+
- scripts `mcp:*:stdio` clasificados en `⛔` en consumer por falta de bin publicado en `6.3.26`.
|
|
282
|
+
- gap adicional detectado en consumer: scripts de paquete no ejecutables vía `npm explore pumuki` tras `pumuki install` (`RG-BUG-014`).
|
|
283
|
+
- bloque A.4 (exports) ejecutado en consumer temporal real:
|
|
284
|
+
- `import('pumuki')` y `pumuki/package.json` en verde.
|
|
285
|
+
- subpaths exportados `core/*` y `integrations/*` fallan en runtime (`RG-BUG-015`), sin bypass.
|
|
286
|
+
- estado de cobertura A.1..A.4:
|
|
287
|
+
- todos los items evaluados (`142/142`) con estado explícito `✅` o `⛔` (sin pendientes silenciosos).
|
|
288
|
+
- foco activo movido a resolución de incidencias `RG-BUG-013/014/015` bajo `P9.F4.T6`.
|
|
289
|
+
- remediación source-level en curso:
|
|
290
|
+
- `RG-BUG-013` mitigado en paquete local (bins stdio presentes en `npm pack --dry-run` y exigidos por manifiesto).
|
|
291
|
+
- `RG-BUG-015` mitigado en paquete local (subpath exports consumibles por `require/import` en consumer temporal con tarball local).
|
|
292
|
+
- `RG-BUG-014` quedó bloqueante en fase P9 por diseño de instalación consumer; resuelto en source durante `P10.T3` (pendiente propagación por release npm).
|
|
293
|
+
- capa B core (`P9.F5.T1`) cerrada en verde:
|
|
294
|
+
- suite completa (`test:stage-gates`, `test:mcp`, `test:evidence`, `test:heuristics`, `test:operational-memory`, `test:saas-ingestion`, `typecheck`) ejecutada con `RC=0`.
|
|
295
|
+
- `validation:p9:manifests` regenerado (`p9-functionality-matrix.json` actualizado a `195` funcionalidades).
|
|
296
|
+
- capa B canary (`P9.F5.T2.ST1`) ejecutada en RuralGO real (clon temporal aislado):
|
|
297
|
+
- RED backend con `any + console.log + empty catch` en `apps/backend/src/contact/p9_canary_backend_violation.ts`.
|
|
298
|
+
- `pumuki-pre-commit` en runtime estricto (`20.20.0/10.8.2`) bloquea con hallazgos backend (`backend.no-console-log`, `backend.avoid-explicit-any`).
|
|
299
|
+
- GREEN backend aplicado en el mismo archivo; re-ejecución sin hallazgos backend (permanece únicamente `generic_evidence_integrity_required` del contrato TDD/BDD del consumidor).
|
|
300
|
+
- capa B canary (`P9.F5.T2.ST2`) ejecutada en frontend real (clon temporal aislado):
|
|
301
|
+
- RED frontend con `any + console.log` en `apps/web-app/src/pages/P9CanaryFrontendViolation.tsx`.
|
|
302
|
+
- detección confirmada en `.ai_evidence.json` tras `full audit` (opción `1`):
|
|
303
|
+
- `heuristics.ts.console-log.ast` (`ERROR`) en el archivo canary.
|
|
304
|
+
- `heuristics.ts.explicit-any.ast` (`ERROR`) en el archivo canary.
|
|
305
|
+
- GREEN frontend aplicado en el mismo archivo (tipado explícito + sin `console.log`) y nuevo `full audit` con `findings=[]` y `ledgerCount=0` para el archivo canary.
|
|
306
|
+
- capa B canary (`P9.F5.T2.ST3`) ejecutada en seguridad/error-handling real (clon temporal aislado):
|
|
307
|
+
- RED con `empty catch` en `apps/web-app/src/pages/P9CanarySecurityViolation.tsx`.
|
|
308
|
+
- detección confirmada en `.ai_evidence.json` tras `full audit` (opción `1`):
|
|
309
|
+
- `common.error.empty_catch` (`CRITICAL`, `COMMON_ERROR_EMPTY_CATCH`) en el archivo canary.
|
|
310
|
+
- GREEN aplicado en el mismo archivo (catch manejado explícitamente) y nuevo `full audit` con `findings=[]` y `ledgerCount=0` para el archivo canary.
|
|
311
|
+
- capa B canary (`P9.F5.T2.ST4`) revalidada de forma consolidada (clon temporal aislado):
|
|
312
|
+
- pack GREEN de los 3 canaries ejecutado (backend/frontend/seguridad) con `findings=[]` y `ledgerCount=0` en cada archivo canary dentro de `.ai_evidence.json`.
|
|
313
|
+
- `pumuki-pre-commit` de revalidación sin hallazgos canary (permanece únicamente `generic_evidence_integrity_required` del contrato TDD/BDD del consumidor).
|
|
314
|
+
- transición de cierre F5/F6:
|
|
315
|
+
- `P9.F5.T2 => ✅` (`ST1..ST4` cerradas) y `P9.F5.T3 => ✅` (Checklist B cerrado `235/235`, pendientes=`0`).
|
|
316
|
+
- `P9.F6.T1 => ✅` (consolidación de evidencia final F0..F5 completada) y `P9.F6.T2 => ✅` (veredicto explícito: `GO`).
|
|
317
|
+
- `P9.F6.T3 => ✅` (riesgos residuales y backlog de hardening publicados en `p9-ruralgo-bug-registry.md`).
|
|
318
|
+
- foco activo movido a `P9.F6.T4 => 🚧` (cierre administrativo de `P9.T2` en tablero maestro + espejo).
|
|
319
|
+
- cierre de espejo aplicado en repo consumidor:
|
|
320
|
+
- `ruralgo-fork/docs/strategy/ruralgo-tracking-hub.md` actualizado con `Veredicto final P9: GO` y `Cierre: P9.T2 => ✅`.
|
|
321
|
+
- subtarea de sincronía de espejo en maestro (`P9.F6.T4.ST3`) completada.
|
|
322
|
+
- foco activo de F6.T4 movido a cierre administrativo final (`P9.F6.T4.ST4`).
|
|
323
|
+
- cierre administrativo final aplicado:
|
|
324
|
+
- `P9.F6.T4.ST4 => ✅` en plan detallado.
|
|
325
|
+
- criterio global `P9.T2 cerrado con GO explicito => ✅`.
|
|
326
|
+
- ✅ `P9.T3` Preparar bloque post-P9 (handoff final + definición del siguiente ciclo operativo).
|
|
327
|
+
- cierre aplicado:
|
|
328
|
+
- handoff final P9 consolidado entre maestro + detalle + espejo consumidor.
|
|
329
|
+
- paquete de trazabilidad final P9 publicado (tracking detallado + bug registry + matrices de evidencia).
|
|
330
|
+
- tracking operativo de cierre:
|
|
331
|
+
- `docs/validation/p9-ruralgo-fork-validation-tracking.md`
|
|
332
|
+
- ✅ `P10.T1` Definir alcance y criterios de entrada del ciclo post-P9.
|
|
333
|
+
- cierre aplicado:
|
|
334
|
+
- alcance inicial de `P10` definido sobre backlog residual de P9 (prioridad P0/P1/P2).
|
|
335
|
+
- criterios de entrada trazables confirmados (cierre `GO`, tracking dual sincronizado, 1 sola `🚧` por tablero).
|
|
336
|
+
- ✅ `P10.T2` Preparar paquete de ejecución inicial del ciclo P10.
|
|
337
|
+
- cierre aplicado:
|
|
338
|
+
- orden inicial definido: `S1=RG-BUG-014`, `S2=RG-BUG-013/015`, `S3=estabilización de señal full-scope`.
|
|
339
|
+
- primer slice seleccionado: `S1` (contrato scripts consumer) por impacto directo en validación real A.3.
|
|
340
|
+
- ✅ `P10.T3` Ejecutar primer slice operativo P10 en repos reales (`RG-BUG-014`).
|
|
341
|
+
- cierre aplicado:
|
|
342
|
+
- fix implementado en `integrations/lifecycle/install.ts`: bootstrap de paquete local en consumer (`npm install --save-dev --save-exact pumuki@latest`) con tolerancia a fallo y skip en `self-package repo`.
|
|
343
|
+
- trazabilidad CLI añadida en `integrations/lifecycle/cli.ts` (`consumer package bootstrap: installed=yes/no` + `reason/detail`).
|
|
344
|
+
- TDD cerrado en verde:
|
|
345
|
+
- `npx --yes tsx@4.21.0 --test integrations/lifecycle/__tests__/install.test.ts`
|
|
346
|
+
- `npx --yes tsx@4.21.0 --test integrations/lifecycle/__tests__/cli.test.ts`
|
|
347
|
+
- `npx --yes tsx@4.21.0 --test integrations/lifecycle/__tests__/lifecycle.test.ts integrations/lifecycle/__tests__/enterpriseFixtureContracts.test.ts`
|
|
348
|
+
- `npm run -s typecheck`
|
|
349
|
+
- evidencia de campo en `ruralgo-fork`:
|
|
350
|
+
- `node bin/pumuki.js install` reporta `consumer package bootstrap: installed=yes`.
|
|
351
|
+
- `npm explore pumuki -- npm run -s check-version` ejecuta correctamente tras `install`.
|
|
352
|
+
- ✅ `P10.T4` Ejecutar segundo slice operativo P10 en repos reales (`RG-BUG-013` + `RG-BUG-015`).
|
|
353
|
+
- cierre aplicado:
|
|
354
|
+
- release candidate empaquetado con `npm pack --json` y validado en clon real de `ruralgo-fork` (runtime `node 20.20.0`).
|
|
355
|
+
- paridad de bins stdio confirmada:
|
|
356
|
+
- `pumuki-mcp-evidence-stdio` y `pumuki-mcp-enterprise-stdio` presentes en `package.json#bin`, en `node_modules/.bin` y resolubles por `npm exec`.
|
|
357
|
+
- paridad de exports runtime confirmada (contrato oficial):
|
|
358
|
+
- `pumuki`, `integrations/{git,lifecycle,sdd,mcp}`, `core/gate/{evaluateGate,evaluateRules}` cargan en `require/import` sin errores en consumer.
|
|
359
|
+
- smoke de contrato en core ejecutado:
|
|
360
|
+
- `npm run -s validation:package-manifest`
|
|
361
|
+
- `npm run -s validation:package-smoke:minimal`
|
|
362
|
+
- ✅ `P10.T5` Ejecutar tercer slice operativo P10 en repos reales (estabilización de señal full-scope).
|
|
363
|
+
- cierre aplicado:
|
|
364
|
+
- semántica `scope vacío` endurecida en reporte legacy:
|
|
365
|
+
- `STATUS: SCOPE EMPTY` cuando `files_scanned=0` y `total_violations=0`.
|
|
366
|
+
- `COMMIT ALLOWED — SCOPE EMPTY (PARTIAL PASS)` + acción explícita para forzar validación full-scope (opción 1/2).
|
|
367
|
+
- hints de runtime en menú consumidor (opciones `3/4`) reforzados a `PASS parcial por alcance vacío`.
|
|
368
|
+
- guardia anti-señal mixta añadida: el hint `Scope vacío` solo se emite si no hay violaciones (`total_violations=0`), evitando mezcla de mensajes en casos bloqueados.
|
|
369
|
+
- señal de matriz para CI endurecida: `toMatrixOptionReport` normaliza `outcome=PASS_SCOPE_EMPTY` cuando `diagnosis=scope-empty`.
|
|
370
|
+
- TDD de no-regresión en verde:
|
|
371
|
+
- `npx --yes tsx@4.21.0 --test scripts/__tests__/framework-menu-consumer-runtime.test.ts scripts/__tests__/framework-menu-legacy-audit.test.ts scripts/__tests__/framework-menu-matrix-evidence.test.ts`
|
|
372
|
+
- `npx --yes tsx@4.21.0 --test scripts/__tests__/framework-menu-matrix-runner.test.ts scripts/__tests__/framework-menu-matrix-baseline.test.ts scripts/__tests__/framework-menu-matrix-canary.test.ts scripts/__tests__/framework-menu-consumer-preflight.test.ts`
|
|
373
|
+
- `npm run -s typecheck`
|
|
374
|
+
- evidencia de campo en clon real de `ruralgo-fork` (runtime `node 20.20.0`):
|
|
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).
|
|
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).
|
|
407
|
+
- objetivo inmediato:
|
|
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`.
|
|
36
409
|
|
|
37
410
|
## Checklist A — Funcionalidades (sin omisiones)
|
|
38
411
|
Totales: bins=10, lifecycle_commands=20, npm_scripts=98, exports=8, total_items=136.
|
|
39
412
|
|
|
40
413
|
### A.1 Binaries (`package.json#bin`)
|
|
41
|
-
- [
|
|
42
|
-
- [x] `bin:pumuki` | mock: ✅ | real:
|
|
43
|
-
- [
|
|
44
|
-
- [x] `bin:pumuki-ci` | mock: ✅ | real:
|
|
45
|
-
- [
|
|
46
|
-
- [
|
|
47
|
-
- [
|
|
48
|
-
- [x] `bin:pumuki-pre-commit` | mock: ✅ | real:
|
|
49
|
-
- [x] `bin:pumuki-pre-push` | mock: ✅ | real:
|
|
50
|
-
- [
|
|
414
|
+
- [x] `bin:ast-hooks` | mock: ✅ | real: ✅ | evidencia: real-clone:`printf '10\n' | npx --yes --package pumuki@latest ast-hooks` (menu render + exit clean)
|
|
415
|
+
- [x] `bin:pumuki` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx pumuki status --json` en `/tmp/pumuki-rgo-real-JHBF2h/repo`
|
|
416
|
+
- [x] `bin:pumuki-ast-hooks` | mock: ✅ | real: ✅ | evidencia: real-clone:`printf '10\n' | npx --yes --package pumuki@latest pumuki-ast-hooks` (menu render + exit clean)
|
|
417
|
+
- [x] `bin:pumuki-ci` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki-ci` (exit=1, bloqueos esperados `OPENSPEC_MISSING` + evidencia/tdd)
|
|
418
|
+
- [x] `bin:pumuki-framework` | mock: ✅ | real: ✅ | evidencia: real-clone:`printf '10\n' | npx --yes --package pumuki@latest pumuki-framework` (menu render + exit clean)
|
|
419
|
+
- [x] `bin:pumuki-mcp-enterprise` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki-mcp-enterprise` + `curl http://127.0.0.1:7391/health` (`status=ok`)
|
|
420
|
+
- [x] `bin:pumuki-mcp-evidence` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki-mcp-evidence` + `curl http://127.0.0.1:7341/health` (`status=ok`)
|
|
421
|
+
- [x] `bin:pumuki-pre-commit` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes --package pumuki@latest pumuki-pre-commit` (bloqueo esperado `OPENSPEC_MISSING`)
|
|
422
|
+
- [x] `bin:pumuki-pre-push` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes --package pumuki@latest pumuki-pre-push` (bloqueo esperado `OPENSPEC_MISSING`)
|
|
423
|
+
- [x] `bin:pumuki-pre-write` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes --package pumuki@latest pumuki-pre-write` (bloqueo esperado `OPENSPEC_MISSING` + panel `ai-gate`)
|
|
51
424
|
|
|
52
425
|
### A.2 Comandos Lifecycle (`integrations/lifecycle/cli.ts#HELP_TEXT`)
|
|
53
|
-
- [x] `cmd:pumuki install` | mock: ✅ | real:
|
|
54
|
-
- [x] `cmd:pumuki uninstall [--purge-artifacts]` | mock: ✅ | real:
|
|
55
|
-
- [x] `cmd:pumuki remove` | mock: ✅ | real:
|
|
56
|
-
- [
|
|
57
|
-
- [x] `cmd:pumuki doctor` | mock: ✅ | real:
|
|
58
|
-
- [x] `cmd:pumuki status` | mock: ✅ | real:
|
|
59
|
-
- [
|
|
60
|
-
- [
|
|
61
|
-
- [
|
|
62
|
-
- [
|
|
63
|
-
- [
|
|
64
|
-
- [
|
|
65
|
-
- [
|
|
66
|
-
- [
|
|
67
|
-
- [
|
|
68
|
-
- [
|
|
69
|
-
- [
|
|
70
|
-
- [
|
|
71
|
-
- [
|
|
72
|
-
- [
|
|
426
|
+
- [x] `cmd:pumuki install` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki install` (exit=1, `EBADENGINE` esperado por repo externo con engines estrictos)
|
|
427
|
+
- [x] `cmd:pumuki uninstall [--purge-artifacts]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki uninstall --purge-artifacts` (exit=0)
|
|
428
|
+
- [x] `cmd:pumuki remove` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki remove` (exit=0)
|
|
429
|
+
- [x] `cmd:pumuki update [--latest|--spec=<package-spec>]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki update --latest --json` (exit=1, `EBADENGINE` esperado por repo externo)
|
|
430
|
+
- [x] `cmd:pumuki doctor` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx pumuki doctor --json` (`hooks pre-commit/pre-push` ausentes detectados)
|
|
431
|
+
- [x] `cmd:pumuki status` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx pumuki status --json`
|
|
432
|
+
- [x] `cmd:pumuki loop run --objective=<text> [--max-attempts=<n>] [--json]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki loop run --objective='p6-t8-3d-real-loop' --max-attempts=1 --json` (`session_id=loop-d4ad08cf-4dd6-48e7-9661-345b983c85fb`)
|
|
433
|
+
- [x] `cmd:pumuki loop status --session=<session-id> [--json]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki loop status --session=loop-d4ad08cf-4dd6-48e7-9661-345b983c85fb --json`
|
|
434
|
+
- [x] `cmd:pumuki loop stop --session=<session-id> [--json]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki loop stop --session=loop-d4ad08cf-4dd6-48e7-9661-345b983c85fb --json`
|
|
435
|
+
- [x] `cmd:pumuki loop resume --session=<session-id> [--json]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki loop resume --session=loop-d4ad08cf-4dd6-48e7-9661-345b983c85fb --json`
|
|
436
|
+
- [x] `cmd:pumuki loop list [--json]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx pumuki loop list --json` (`[]`)
|
|
437
|
+
- [x] `cmd:pumuki loop export --session=<session-id> [--output-json=<path>] [--json]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki loop export --session=loop-d4ad08cf-4dd6-48e7-9661-345b983c85fb --json`
|
|
438
|
+
- [x] `cmd:pumuki adapter install --agent=<name> [--dry-run] [--json]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki adapter install --agent=windsurf --dry-run --json` (`written=false`)
|
|
439
|
+
- [x] `cmd:pumuki analytics hotspots report [--top=<n>] [--since-days=<n>] [--json] [--output-json=<path>] [--output-markdown=<path>]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes --package pumuki@latest pumuki analytics hotspots report --top=3 --since-days=30 --json` (exit=1, `spawnSync git ENOBUFS` en repo externo grande)
|
|
440
|
+
- [x] `cmd:pumuki analytics hotspots diagnose [--json]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx pumuki analytics hotspots diagnose --json` (`status=degraded`)
|
|
441
|
+
- [x] `cmd:pumuki sdd status [--json]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx pumuki sdd status --json` (`openspec.installed=false` en baseline real sin bootstrap)
|
|
442
|
+
- [x] `cmd:pumuki sdd validate [--stage=PRE_WRITE|PRE_COMMIT|PRE_PUSH|CI] [--json]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx pumuki sdd validate --stage=PRE_COMMIT --json` (bloqueo esperado por estado SDD incompleto)
|
|
443
|
+
- [x] `cmd:pumuki sdd session --open --change=<change-id> [--ttl-minutes=<n>] [--json]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki sdd session --open --change=p6-real-sdd --ttl-minutes=30 --json` (exit=1, change no existe)
|
|
444
|
+
- [x] `cmd:pumuki sdd session --refresh [--ttl-minutes=<n>] [--json]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki sdd session --refresh --ttl-minutes=45 --json` (exit=1, no sesión activa)
|
|
445
|
+
- [x] `cmd:pumuki sdd session --close [--json]` | mock: ✅ | real: ✅ | evidencia: real-clone:`npx --yes pumuki sdd session --close --json` (exit=0, estado inactivo)
|
|
73
446
|
|
|
74
447
|
### A.3 Scripts (`package.json#scripts`)
|
|
75
|
-
- [
|
|
76
|
-
- [
|
|
77
|
-
- [
|
|
78
|
-
- [
|
|
79
|
-
- [
|
|
80
|
-
- [
|
|
81
|
-
- [
|
|
82
|
-
- [
|
|
83
|
-
- [
|
|
84
|
-
- [
|
|
85
|
-
- [
|
|
86
|
-
- [
|
|
87
|
-
- [
|
|
88
|
-
- [
|
|
89
|
-
- [
|
|
90
|
-
- [
|
|
91
|
-
- [
|
|
92
|
-
- [
|
|
93
|
-
- [
|
|
94
|
-
- [
|
|
95
|
-
- [
|
|
96
|
-
- [
|
|
97
|
-
- [
|
|
98
|
-
- [
|
|
99
|
-
- [
|
|
100
|
-
- [
|
|
101
|
-
- [
|
|
102
|
-
- [
|
|
103
|
-
- [
|
|
104
|
-
- [
|
|
105
|
-
- [
|
|
106
|
-
- [
|
|
107
|
-
- [
|
|
108
|
-
- [
|
|
109
|
-
- [
|
|
110
|
-
- [
|
|
111
|
-
- [
|
|
112
|
-
- [
|
|
113
|
-
- [
|
|
114
|
-
- [
|
|
115
|
-
- [
|
|
116
|
-
- [
|
|
117
|
-
- [
|
|
118
|
-
- [
|
|
119
|
-
- [
|
|
120
|
-
- [
|
|
121
|
-
- [
|
|
122
|
-
- [
|
|
123
|
-
- [
|
|
124
|
-
- [
|
|
125
|
-
- [
|
|
126
|
-
- [
|
|
127
|
-
- [
|
|
128
|
-
- [
|
|
129
|
-
- [
|
|
130
|
-
- [
|
|
131
|
-
- [
|
|
132
|
-
- [
|
|
133
|
-
- [
|
|
134
|
-
- [
|
|
135
|
-
- [
|
|
136
|
-
- [
|
|
137
|
-
- [
|
|
138
|
-
- [
|
|
139
|
-
- [
|
|
140
|
-
- [
|
|
141
|
-
- [
|
|
142
|
-
- [
|
|
143
|
-
- [
|
|
144
|
-
- [
|
|
145
|
-
- [
|
|
146
|
-
- [
|
|
147
|
-
- [
|
|
148
|
-
- [
|
|
149
|
-
- [
|
|
150
|
-
- [
|
|
151
|
-
- [
|
|
152
|
-
- [
|
|
153
|
-
- [
|
|
154
|
-
- [
|
|
155
|
-
- [
|
|
156
|
-
- [
|
|
157
|
-
- [
|
|
158
|
-
- [
|
|
159
|
-
- [
|
|
160
|
-
- [
|
|
161
|
-
- [
|
|
162
|
-
- [
|
|
163
|
-
- [
|
|
164
|
-
- [
|
|
165
|
-
- [
|
|
166
|
-
- [
|
|
167
|
-
- [
|
|
168
|
-
- [
|
|
169
|
-
- [
|
|
170
|
-
- [
|
|
171
|
-
- [
|
|
172
|
-
- [
|
|
448
|
+
- [x] `script:adapter:install` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s adapter:install -- --agent=windsurf --dry-run` (`written=false`, changedFiles=`.codeium/adapter/hooks.json,$HOME/.codeium/windsurf/mcp_config.json`)
|
|
449
|
+
- [x] `script:ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s ast` (bloqueo esperado `OPENSPEC_MISSING`)
|
|
450
|
+
- [x] `script:ast:audit` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s ast:audit` (bloqueo esperado `OPENSPEC_MISSING`)
|
|
451
|
+
- [x] `script:ast:check-version` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s ast:check-version` (`lifecycle installed=false`, hooks missing)
|
|
452
|
+
- [x] `script:ast:gitflow` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s ast:gitflow` (`GITFLOW WORKFLOW`, exit=0)
|
|
453
|
+
- [x] `script:ast:guard:logs` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s ast:guard:logs` (mensaje `Deprecated`)
|
|
454
|
+
- [x] `script:ast:guard:restart` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s ast:guard:restart` (mensaje `Deprecated`)
|
|
455
|
+
- [x] `script:ast:guard:start` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s ast:guard:start` (mensaje `Deprecated`)
|
|
456
|
+
- [x] `script:ast:guard:status` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s ast:guard:status` (mensaje `Deprecated`)
|
|
457
|
+
- [x] `script:ast:guard:stop` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s ast:guard:stop` (mensaje `Deprecated`)
|
|
458
|
+
- [x] `script:ast:refresh` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s ast:refresh` (bloqueo esperado `OPENSPEC_MISSING`)
|
|
459
|
+
- [x] `script:ast:release` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s ast:release` (`GITFLOW STATUS`, exit=0)
|
|
460
|
+
- [x] `script:audit` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s audit` (bloqueo esperado `OPENSPEC_MISSING`)
|
|
461
|
+
- [x] `script:audit-library` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s audit-library` (bloqueo esperado `OPENSPEC_MISSING`)
|
|
462
|
+
- [x] `script:build:ts` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s build:ts` (exit=0)
|
|
463
|
+
- [x] `script:check-version` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s check-version` (exit=0)
|
|
464
|
+
- [x] `script:framework:menu` | mock: ✅ | real: ✅ | evidencia: core:`printf '10\n' | npm run -s framework:menu` (menu render + exit)
|
|
465
|
+
- [x] `script:gitflow` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s gitflow` (PASS, worktree dirty permitido)
|
|
466
|
+
- [x] `script:gitflow:reset` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s gitflow:reset` (`mode: non-destructive`, exit=0)
|
|
467
|
+
- [x] `script:gitflow:status` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s gitflow:status` (`worktree dirty` reportado, exit=0)
|
|
468
|
+
- [x] `script:gitflow:workflow` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s gitflow:workflow` (siguiente paso recomendado, exit=0)
|
|
469
|
+
- [x] `script:install-hooks` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s install-hooks` (`hooks changed: pre-commit, pre-push`, exit=0)
|
|
470
|
+
- [x] `script:lint` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s lint` (exit=0)
|
|
471
|
+
- [x] `script:maintenance:library` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s maintenance:library -- update` (exit=0 tras fix de `PROJECT_ROOT` a repo-root)
|
|
472
|
+
- [x] `script:mcp:enterprise` | mock: ✅ | real: ✅ | evidencia: core:`PUMUKI_ENTERPRISE_MCP_PORT=7491 npm run -s mcp:enterprise` + `curl /health` (`{\"status\":\"ok\"}`)
|
|
473
|
+
- [x] `script:mcp:evidence` | mock: ✅ | real: ✅ | evidencia: core:`PUMUKI_EVIDENCE_PORT=7441 npm run -s mcp:evidence` + `curl /health` (`{\"status\":\"ok\"}`)
|
|
474
|
+
- [x] `script:pumuki:doctor` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s pumuki:doctor` (`doctor verdict: PASS`)
|
|
475
|
+
- [x] `script:pumuki:install` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s pumuki:install` (exit=0, hooks already managed)
|
|
476
|
+
- [x] `script:pumuki:remove` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s pumuki:remove` (exit=0, package removed=yes, hooks unchanged)
|
|
477
|
+
- [x] `script:pumuki:sdd:pre-write` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s pumuki:sdd:pre-write` (exit=1, bloqueo esperado `OPENSPEC_PROJECT_MISSING` + panel `PRE-FLIGHT CHECK`)
|
|
478
|
+
- [x] `script:pumuki:status` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s pumuki:status` (`lifecycle installed=false`, hooks missing)
|
|
479
|
+
- [x] `script:pumuki:uninstall` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s pumuki:uninstall` (exit=0, hooks reverted)
|
|
480
|
+
- [x] `script:pumuki:update` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s pumuki:update` (exit=0, `updated to pumuki@latest`)
|
|
481
|
+
- [x] `script:skills:compile` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s skills:compile` (`skills.lock generated`, hash=`67b137d5...`)
|
|
482
|
+
- [x] `script:skills:import:custom` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s skills:import:custom` (`sources_detected=6`, `imported_rules=728`)
|
|
483
|
+
- [x] `script:skills:lock:check` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s skills:lock:check` (`FRESH`)
|
|
484
|
+
- [x] `script:test` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test` (`4 suites / 23 tests` pass)
|
|
485
|
+
- [x] `script:test:deterministic` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:deterministic` (exit=0)
|
|
486
|
+
- [x] `script:test:evidence` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:evidence` (`32/32` pass)
|
|
487
|
+
- [x] `script:test:heuristics` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:heuristics` (`15/15` pass)
|
|
488
|
+
- [x] `script:test:mcp` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:mcp` (`136/136` pass)
|
|
489
|
+
- [x] `script:test:operational-memory` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:operational-memory` (`70/70` pass)
|
|
490
|
+
- [x] `script:test:saas-ingestion` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:saas-ingestion` (`54/54` pass)
|
|
491
|
+
- [x] `script:test:stage-gates` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (`915 pass / 0 fail / 4 skip`)
|
|
492
|
+
- [x] `script:typecheck` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s typecheck` (exit=0)
|
|
493
|
+
- [x] `script:validate:adapter-hooks-local` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validate:adapter-hooks-local` (migrado; salida informativa)
|
|
494
|
+
- [x] `script:validation:adapter-readiness` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:adapter-readiness` (exit=1, `verdict=PENDING` esperado)
|
|
495
|
+
- [x] `script:validation:adapter-real-session-report` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:adapter-real-session-report` (exit=0)
|
|
496
|
+
- [x] `script:validation:adapter-session-status` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:adapter-session-status` (exit=1, `verdict=BLOCKED` esperado)
|
|
497
|
+
- [x] `script:validation:architecture-guardrails` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:architecture-guardrails` (exit=0)
|
|
498
|
+
- [x] `script:validation:c020-benchmark` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:c020-benchmark` (exit=1, `parity_exit=1` esperado por comparación contra baseline legacy)
|
|
499
|
+
- [x] `script:validation:clean-artifacts` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:clean-artifacts` (exit=0, sin artefactos objetivo)
|
|
500
|
+
- [x] `script:validation:consumer-ci-artifacts` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:consumer-ci-artifacts -- --repo juancarlosmerlosalbarracin/ast-intelligence-hooks --limit 5` (exit=1, `gh run list` 404)
|
|
501
|
+
- [x] `script:validation:consumer-ci-auth-check` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:consumer-ci-auth-check -- --repo juancarlosmerlosalbarracin/ast-intelligence-hooks` (exit=1, `verdict=BLOCKED`)
|
|
502
|
+
- [x] `script:validation:consumer-startup-triage` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:consumer-startup-triage -- --repo juancarlosmerlosalbarracin/ast-intelligence-hooks --repo-path /Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks --skip-workflow-lint --skip-auth-check` (exit=1, dependencia CI externa 404)
|
|
503
|
+
- [x] `script:validation:consumer-startup-unblock-status` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:consumer-startup-unblock-status` (`MISSING_INPUTS` esperado)
|
|
504
|
+
- [x] `script:validation:consumer-support-bundle` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:consumer-support-bundle -- --repo juancarlosmerlosalbarracin/ast-intelligence-hooks` (exit=1, `gh run list` 404)
|
|
505
|
+
- [x] `script:validation:consumer-support-ticket-draft` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:consumer-support-ticket-draft -- --repo juancarlosmerlosalbarracin/ast-intelligence-hooks` (exit=1, falta bundle previo)
|
|
506
|
+
- [x] `script:validation:consumer-workflow-lint` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:consumer-workflow-lint -- --repo-path /Users/juancarlosmerlosalbarracin/Developer/Projects/ast-intelligence-hooks` (exit=1, lint no exitoso)
|
|
507
|
+
- [x] `script:validation:lifecycle-smoke` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:lifecycle-smoke` (exit=0)
|
|
508
|
+
- [x] `script:validation:mock-consumer-ab-report` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:mock-consumer-ab-report` (`verdict=READY`)
|
|
509
|
+
- [x] `script:validation:package-manifest` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:package-manifest` (`manifest valid`)
|
|
510
|
+
- [x] `script:validation:package-smoke` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:package-smoke` (exit=0)
|
|
511
|
+
- [x] `script:validation:package-smoke:minimal` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:package-smoke:minimal` (exit=0)
|
|
512
|
+
- [x] `script:validation:phase5-blockers-readiness` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase5-blockers-readiness` (exit=1, `verdict=BLOCKED`)
|
|
513
|
+
- [x] `script:validation:phase5-escalation:close-submission` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase5-escalation:close-submission` (exit=1, `Usage` por argumentos obligatorios)
|
|
514
|
+
- [x] `script:validation:phase5-escalation:mark-submitted` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase5-escalation:mark-submitted` (exit=1, `Usage` por argumentos obligatorios)
|
|
515
|
+
- [x] `script:validation:phase5-escalation:payload` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase5-escalation:payload` (exit=1, handoff faltante)
|
|
516
|
+
- [x] `script:validation:phase5-escalation:prepare` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase5-escalation:prepare` (exit=1, bloqueado por handoff faltante)
|
|
517
|
+
- [x] `script:validation:phase5-escalation:ready-to-submit` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase5-escalation:ready-to-submit` (exit=1, handoff faltante)
|
|
518
|
+
- [x] `script:validation:phase5-execution-closure` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase5-execution-closure` (exit=1, requiere `--repo`)
|
|
519
|
+
- [x] `script:validation:phase5-execution-closure-status` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase5-execution-closure-status` (exit=1, `verdict=BLOCKED`)
|
|
520
|
+
- [x] `script:validation:phase5-external-handoff` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase5-external-handoff` (exit=1, `verdict=MISSING_INPUTS`)
|
|
521
|
+
- [x] `script:validation:phase5-latest:ready-check` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase5-latest:ready-check` (exit=1, falta `.audit-reports/phase5-latest/phase5-execution-closure-status.md`)
|
|
522
|
+
- [x] `script:validation:phase5-latest:refresh` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase5-latest:refresh` (exit=1, bloqueado por `loop_guard`)
|
|
523
|
+
- [x] `script:validation:phase5-latest:sync-docs` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase5-latest:sync-docs` (exit=1, bundle faltante)
|
|
524
|
+
- [x] `script:validation:phase5-post-support:refresh` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase5-post-support:refresh` (exit=1, bloqueado por `loop_guard`)
|
|
525
|
+
- [x] `script:validation:phase8:autopilot` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase8:autopilot` (exit=1, bloqueado por `loop_guard`)
|
|
526
|
+
- [x] `script:validation:phase8:close-ready` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase8:close-ready` (exit=1, cadena no `READY`)
|
|
527
|
+
- [x] `script:validation:phase8:doctor` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase8:doctor` (exit=1, `status=BLOCKED`, `blocked_by=loop_guard`)
|
|
528
|
+
- [x] `script:validation:phase8:loop-guard` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase8:loop-guard` (exit=2, falta `docs/validation/consumer-startup-escalation-handoff-latest.md`)
|
|
529
|
+
- [x] `script:validation:phase8:loop-guard-coverage` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase8:loop-guard-coverage` (`PASS`)
|
|
530
|
+
- [x] `script:validation:phase8:mark-followup-posted-now` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase8:mark-followup-posted-now` (exit=1, `Usage` por argumentos obligatorios)
|
|
531
|
+
- [x] `script:validation:phase8:mark-followup-replied-now` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase8:mark-followup-replied-now` (exit=1, `Usage` por argumentos obligatorios)
|
|
532
|
+
- [x] `script:validation:phase8:mark-followup-state` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase8:mark-followup-state` (exit=1, `Usage` por argumentos obligatorios)
|
|
533
|
+
- [x] `script:validation:phase8:next-step` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase8:next-step` (exit=1, bloqueado por `loop_guard`)
|
|
534
|
+
- [x] `script:validation:phase8:ready-handoff` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase8:ready-handoff` (exit=1, cadena no `READY`)
|
|
535
|
+
- [x] `script:validation:phase8:resume-after-billing` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase8:resume-after-billing` (exit=1, bloqueado por `loop_guard`)
|
|
536
|
+
- [x] `script:validation:phase8:status-pack` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase8:status-pack` (exit=1, bloqueado por `loop_guard`)
|
|
537
|
+
- [x] `script:validation:phase8:tick` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:phase8:tick` (exit=1, bloqueado por `loop_guard`)
|
|
538
|
+
- [x] `script:validation:progress-single-active` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s validation:progress-single-active` (exit=0)
|
|
539
|
+
- [x] `script:verify:adapter-hooks-runtime` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s verify:adapter-hooks-runtime` (migrado; salida informativa)
|
|
540
|
+
- [x] `script:violations` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s violations` (bloqueo esperado `OPENSPEC_MISSING`)
|
|
541
|
+
- [x] `script:violations:demo` | mock: ✅ | real: ✅ | evidencia: core:`printf '10\n' | npm run -s violations:demo` (menu render + exit)
|
|
542
|
+
- [x] `script:violations:list` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s violations:list` (bloqueo esperado `OPENSPEC_MISSING`)
|
|
543
|
+
- [x] `script:violations:show` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s violations:show` (bloqueo esperado `OPENSPEC_MISSING`)
|
|
544
|
+
- [x] `script:violations:summary` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s violations:summary` (bloqueo esperado `OPENSPEC_MISSING`)
|
|
545
|
+
- [x] `script:violations:top` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s violations:top` (bloqueo esperado `OPENSPEC_MISSING`)
|
|
173
546
|
|
|
174
547
|
### A.4 Exports (`package.json#exports`)
|
|
175
|
-
- [
|
|
176
|
-
- [
|
|
177
|
-
- [
|
|
178
|
-
- [
|
|
179
|
-
- [
|
|
180
|
-
- [
|
|
181
|
-
- [
|
|
182
|
-
- [
|
|
548
|
+
- [x] `export:.` | mock: ✅ | real: ✅ | evidencia: mock+real-clone:`node --import tsx` (imports `pumuki`, `failed=0/8`)
|
|
549
|
+
- [x] `export:./core/gate/evaluateGate` | mock: ✅ | real: ✅ | evidencia: mock+real-clone:`node --import tsx` (import `pumuki/core/gate/evaluateGate` OK)
|
|
550
|
+
- [x] `export:./core/gate/evaluateRules` | mock: ✅ | real: ✅ | evidencia: mock+real-clone:`node --import tsx` (import `pumuki/core/gate/evaluateRules` OK)
|
|
551
|
+
- [x] `export:./integrations/git` | mock: ✅ | real: ✅ | evidencia: mock+real-clone:`node --import tsx` (import `pumuki/integrations/git` OK)
|
|
552
|
+
- [x] `export:./integrations/lifecycle` | mock: ✅ | real: ✅ | evidencia: mock+real-clone:`node --import tsx` (import `pumuki/integrations/lifecycle` OK)
|
|
553
|
+
- [x] `export:./integrations/mcp` | mock: ✅ | real: ✅ | evidencia: mock+real-clone:`node --import tsx` (import `pumuki/integrations/mcp` OK)
|
|
554
|
+
- [x] `export:./integrations/sdd` | mock: ✅ | real: ✅ | evidencia: mock+real-clone:`node --import tsx` (import `pumuki/integrations/sdd` OK)
|
|
555
|
+
- [x] `export:./package.json` | mock: ✅ | real: ✅ | evidencia: mock+real-clone:`node --import tsx` (`require('pumuki/package.json').version=6.3.26`)
|
|
183
556
|
|
|
184
557
|
## Checklist B — Reglas AST (sin omisiones)
|
|
185
558
|
Total reglas AST inventariadas: 235.
|
|
186
559
|
|
|
187
|
-
- [
|
|
188
|
-
- [
|
|
189
|
-
- [
|
|
190
|
-
- [
|
|
191
|
-
- [
|
|
192
|
-
- [
|
|
193
|
-
- [
|
|
194
|
-
- [
|
|
195
|
-
- [
|
|
196
|
-
- [
|
|
197
|
-
- [
|
|
198
|
-
- [
|
|
199
|
-
- [
|
|
200
|
-
- [
|
|
201
|
-
- [
|
|
202
|
-
- [
|
|
203
|
-
- [
|
|
204
|
-
- [
|
|
205
|
-
- [
|
|
206
|
-
- [
|
|
207
|
-
- [
|
|
208
|
-
- [
|
|
209
|
-
- [
|
|
210
|
-
- [
|
|
211
|
-
- [
|
|
212
|
-
- [
|
|
213
|
-
- [
|
|
214
|
-
- [
|
|
215
|
-
- [
|
|
216
|
-
- [
|
|
217
|
-
- [
|
|
218
|
-
- [
|
|
219
|
-
- [
|
|
220
|
-
- [
|
|
221
|
-
- [
|
|
222
|
-
- [
|
|
223
|
-
- [
|
|
224
|
-
- [
|
|
225
|
-
- [
|
|
226
|
-
- [
|
|
227
|
-
- [
|
|
228
|
-
- [
|
|
229
|
-
- [
|
|
230
|
-
- [
|
|
231
|
-
- [
|
|
232
|
-
- [
|
|
233
|
-
- [
|
|
234
|
-
- [
|
|
235
|
-
- [
|
|
236
|
-
- [
|
|
237
|
-
- [
|
|
238
|
-
- [
|
|
239
|
-
- [
|
|
240
|
-
- [
|
|
241
|
-
- [
|
|
242
|
-
- [
|
|
243
|
-
- [
|
|
244
|
-
- [
|
|
245
|
-
- [
|
|
246
|
-
- [
|
|
247
|
-
- [
|
|
248
|
-
- [
|
|
249
|
-
- [
|
|
250
|
-
- [
|
|
251
|
-
- [
|
|
252
|
-
- [
|
|
253
|
-
- [
|
|
254
|
-
- [
|
|
255
|
-
- [
|
|
256
|
-
- [
|
|
257
|
-
- [
|
|
258
|
-
- [
|
|
259
|
-
- [
|
|
260
|
-
- [
|
|
261
|
-
- [
|
|
262
|
-
- [
|
|
263
|
-
- [
|
|
264
|
-
- [
|
|
265
|
-
- [
|
|
266
|
-
- [
|
|
267
|
-
- [
|
|
268
|
-
- [
|
|
269
|
-
- [
|
|
270
|
-
- [
|
|
271
|
-
- [
|
|
272
|
-
- [
|
|
273
|
-
- [
|
|
274
|
-
- [
|
|
275
|
-
- [
|
|
276
|
-
- [
|
|
277
|
-
- [
|
|
278
|
-
- [
|
|
279
|
-
- [
|
|
280
|
-
- [
|
|
281
|
-
- [
|
|
282
|
-
- [
|
|
283
|
-
- [
|
|
284
|
-
- [
|
|
285
|
-
- [
|
|
286
|
-
- [
|
|
287
|
-
- [
|
|
288
|
-
- [
|
|
289
|
-
- [
|
|
290
|
-
- [
|
|
291
|
-
- [
|
|
292
|
-
- [
|
|
293
|
-
- [
|
|
294
|
-
- [
|
|
295
|
-
- [
|
|
296
|
-
- [
|
|
297
|
-
- [
|
|
298
|
-
- [
|
|
299
|
-
- [
|
|
300
|
-
- [
|
|
301
|
-
- [
|
|
302
|
-
- [
|
|
303
|
-
- [
|
|
304
|
-
- [
|
|
305
|
-
- [
|
|
306
|
-
- [
|
|
307
|
-
- [
|
|
308
|
-
- [
|
|
309
|
-
- [
|
|
310
|
-
- [
|
|
311
|
-
- [
|
|
312
|
-
- [
|
|
313
|
-
- [
|
|
314
|
-
- [
|
|
315
|
-
- [
|
|
316
|
-
- [
|
|
317
|
-
- [
|
|
318
|
-
- [
|
|
319
|
-
- [
|
|
320
|
-
- [
|
|
321
|
-
- [
|
|
322
|
-
- [
|
|
323
|
-
- [
|
|
324
|
-
- [
|
|
325
|
-
- [
|
|
326
|
-
- [
|
|
327
|
-
- [
|
|
328
|
-
- [
|
|
329
|
-
- [
|
|
330
|
-
- [
|
|
331
|
-
- [
|
|
332
|
-
- [
|
|
333
|
-
- [
|
|
334
|
-
- [
|
|
335
|
-
- [
|
|
336
|
-
- [
|
|
337
|
-
- [
|
|
338
|
-
- [
|
|
339
|
-
- [
|
|
340
|
-
- [
|
|
341
|
-
- [
|
|
342
|
-
- [
|
|
343
|
-
- [
|
|
344
|
-
- [
|
|
345
|
-
- [
|
|
346
|
-
- [
|
|
347
|
-
- [
|
|
348
|
-
- [
|
|
349
|
-
- [
|
|
350
|
-
- [
|
|
351
|
-
- [
|
|
352
|
-
- [
|
|
353
|
-
- [
|
|
354
|
-
- [
|
|
355
|
-
- [
|
|
356
|
-
- [
|
|
357
|
-
- [
|
|
358
|
-
- [
|
|
359
|
-
- [
|
|
360
|
-
- [
|
|
361
|
-
- [
|
|
362
|
-
- [
|
|
363
|
-
- [
|
|
364
|
-
- [
|
|
365
|
-
- [
|
|
366
|
-
- [
|
|
367
|
-
- [
|
|
368
|
-
- [
|
|
369
|
-
- [
|
|
370
|
-
- [
|
|
371
|
-
- [
|
|
372
|
-
- [
|
|
373
|
-
- [
|
|
374
|
-
- [
|
|
375
|
-
- [
|
|
376
|
-
- [
|
|
377
|
-
- [
|
|
378
|
-
- [
|
|
379
|
-
- [
|
|
380
|
-
- [
|
|
381
|
-
- [
|
|
382
|
-
- [
|
|
383
|
-
- [
|
|
384
|
-
- [
|
|
385
|
-
- [
|
|
386
|
-
- [
|
|
387
|
-
- [
|
|
388
|
-
- [
|
|
389
|
-
- [
|
|
390
|
-
- [
|
|
391
|
-
- [
|
|
392
|
-
- [
|
|
393
|
-
- [
|
|
394
|
-
- [
|
|
395
|
-
- [
|
|
396
|
-
- [
|
|
397
|
-
- [
|
|
398
|
-
- [
|
|
399
|
-
- [
|
|
400
|
-
- [
|
|
401
|
-
- [
|
|
402
|
-
- [
|
|
403
|
-
- [
|
|
404
|
-
- [
|
|
405
|
-
- [
|
|
406
|
-
- [
|
|
407
|
-
- [
|
|
408
|
-
- [
|
|
409
|
-
- [
|
|
410
|
-
- [
|
|
411
|
-
- [
|
|
412
|
-
- [
|
|
413
|
-
- [
|
|
414
|
-
- [
|
|
415
|
-
- [
|
|
416
|
-
- [
|
|
417
|
-
- [
|
|
418
|
-
- [
|
|
419
|
-
- [
|
|
420
|
-
- [
|
|
421
|
-
- [
|
|
560
|
+
- [x] `rule:android.no-global-scope` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
561
|
+
- [x] `rule:android.no-run-blocking` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
562
|
+
- [x] `rule:android.no-thread-sleep` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
563
|
+
- [x] `rule:backend.avoid-explicit-any` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
564
|
+
- [x] `rule:backend.no-console-log` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
565
|
+
- [x] `rule:backend.no-empty-catch` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
566
|
+
- [x] `rule:common.error.empty_catch` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
567
|
+
- [x] `rule:common.network.missing_error_handling` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
568
|
+
- [x] `rule:common.types.record_unknown_requires_type` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
569
|
+
- [x] `rule:common.types.undefined_in_base_type` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
570
|
+
- [x] `rule:common.types.unknown_without_guard` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
571
|
+
- [x] `rule:domain-change-without-tests` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
572
|
+
- [x] `rule:frontend.avoid-single-letter-variables` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
573
|
+
- [x] `rule:frontend.no-console-log` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
574
|
+
- [x] `rule:frontend.no-debugger` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
575
|
+
- [x] `rule:heuristics.android.globalscope.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
576
|
+
- [x] `rule:heuristics.android.run-blocking.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
577
|
+
- [x] `rule:heuristics.android.thread-sleep.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
578
|
+
- [x] `rule:heuristics.ios.anyview.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
579
|
+
- [x] `rule:heuristics.ios.callback-style.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
580
|
+
- [x] `rule:heuristics.ios.dispatchgroup.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
581
|
+
- [x] `rule:heuristics.ios.dispatchqueue.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
582
|
+
- [x] `rule:heuristics.ios.dispatchsemaphore.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
583
|
+
- [x] `rule:heuristics.ios.force-cast.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
584
|
+
- [x] `rule:heuristics.ios.force-try.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
585
|
+
- [x] `rule:heuristics.ios.force-unwrap.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
586
|
+
- [x] `rule:heuristics.ios.navigation-view.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
587
|
+
- [x] `rule:heuristics.ios.observable-object.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
588
|
+
- [x] `rule:heuristics.ios.on-tap-gesture.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
589
|
+
- [x] `rule:heuristics.ios.operation-queue.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
590
|
+
- [x] `rule:heuristics.ios.string-format.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
591
|
+
- [x] `rule:heuristics.ios.task-detached.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
592
|
+
- [x] `rule:heuristics.ios.uiscreen-main-bounds.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
593
|
+
- [x] `rule:heuristics.ios.unchecked-sendable.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
594
|
+
- [x] `rule:heuristics.ts.buffer-alloc-unsafe-slow.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
595
|
+
- [x] `rule:heuristics.ts.buffer-alloc-unsafe.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
596
|
+
- [x] `rule:heuristics.ts.child-process-exec-file-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
597
|
+
- [x] `rule:heuristics.ts.child-process-exec-file-untrusted-args.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
598
|
+
- [x] `rule:heuristics.ts.child-process-exec-file.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
599
|
+
- [x] `rule:heuristics.ts.child-process-exec-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
600
|
+
- [x] `rule:heuristics.ts.child-process-exec.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
601
|
+
- [x] `rule:heuristics.ts.child-process-fork.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
602
|
+
- [x] `rule:heuristics.ts.child-process-import.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
603
|
+
- [x] `rule:heuristics.ts.child-process-shell-true.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
604
|
+
- [x] `rule:heuristics.ts.child-process-spawn-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
605
|
+
- [x] `rule:heuristics.ts.child-process-spawn.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
606
|
+
- [x] `rule:heuristics.ts.console-error.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
607
|
+
- [x] `rule:heuristics.ts.console-log.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
608
|
+
- [x] `rule:heuristics.ts.debugger.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
609
|
+
- [x] `rule:heuristics.ts.delete-operator.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
610
|
+
- [x] `rule:heuristics.ts.document-write.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
611
|
+
- [x] `rule:heuristics.ts.dynamic-shell-invocation.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
612
|
+
- [x] `rule:heuristics.ts.empty-catch.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
613
|
+
- [x] `rule:heuristics.ts.eval.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
614
|
+
- [x] `rule:heuristics.ts.explicit-any.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
615
|
+
- [x] `rule:heuristics.ts.fs-access-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
616
|
+
- [x] `rule:heuristics.ts.fs-access-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
617
|
+
- [x] `rule:heuristics.ts.fs-append-file-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
618
|
+
- [x] `rule:heuristics.ts.fs-append-file-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
619
|
+
- [x] `rule:heuristics.ts.fs-chmod-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
620
|
+
- [x] `rule:heuristics.ts.fs-chmod-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
621
|
+
- [x] `rule:heuristics.ts.fs-chown-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
622
|
+
- [x] `rule:heuristics.ts.fs-chown-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
623
|
+
- [x] `rule:heuristics.ts.fs-close-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
624
|
+
- [x] `rule:heuristics.ts.fs-close-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
625
|
+
- [x] `rule:heuristics.ts.fs-copy-file-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
626
|
+
- [x] `rule:heuristics.ts.fs-copy-file-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
627
|
+
- [x] `rule:heuristics.ts.fs-cp-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
628
|
+
- [x] `rule:heuristics.ts.fs-cp-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
629
|
+
- [x] `rule:heuristics.ts.fs-exists-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
630
|
+
- [x] `rule:heuristics.ts.fs-exists-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
631
|
+
- [x] `rule:heuristics.ts.fs-fchmod-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
632
|
+
- [x] `rule:heuristics.ts.fs-fchmod-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
633
|
+
- [x] `rule:heuristics.ts.fs-fchown-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
634
|
+
- [x] `rule:heuristics.ts.fs-fchown-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
635
|
+
- [x] `rule:heuristics.ts.fs-fdatasync-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
636
|
+
- [x] `rule:heuristics.ts.fs-fdatasync-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
637
|
+
- [x] `rule:heuristics.ts.fs-fstat-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
638
|
+
- [x] `rule:heuristics.ts.fs-fstat-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
639
|
+
- [x] `rule:heuristics.ts.fs-fsync-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
640
|
+
- [x] `rule:heuristics.ts.fs-fsync-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
641
|
+
- [x] `rule:heuristics.ts.fs-ftruncate-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
642
|
+
- [x] `rule:heuristics.ts.fs-ftruncate-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
643
|
+
- [x] `rule:heuristics.ts.fs-futimes-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
644
|
+
- [x] `rule:heuristics.ts.fs-futimes-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
645
|
+
- [x] `rule:heuristics.ts.fs-lchmod-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
646
|
+
- [x] `rule:heuristics.ts.fs-lchown-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
647
|
+
- [x] `rule:heuristics.ts.fs-link-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
648
|
+
- [x] `rule:heuristics.ts.fs-link-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
649
|
+
- [x] `rule:heuristics.ts.fs-lstat-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
650
|
+
- [x] `rule:heuristics.ts.fs-lstat-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
651
|
+
- [x] `rule:heuristics.ts.fs-lutimes-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
652
|
+
- [x] `rule:heuristics.ts.fs-lutimes-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
653
|
+
- [x] `rule:heuristics.ts.fs-mkdir-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
654
|
+
- [x] `rule:heuristics.ts.fs-mkdir-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
655
|
+
- [x] `rule:heuristics.ts.fs-mkdtemp-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
656
|
+
- [x] `rule:heuristics.ts.fs-mkdtemp-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
657
|
+
- [x] `rule:heuristics.ts.fs-open-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
658
|
+
- [x] `rule:heuristics.ts.fs-open-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
659
|
+
- [x] `rule:heuristics.ts.fs-opendir-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
660
|
+
- [x] `rule:heuristics.ts.fs-opendir-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
661
|
+
- [x] `rule:heuristics.ts.fs-promises-access.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
662
|
+
- [x] `rule:heuristics.ts.fs-promises-append-file.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
663
|
+
- [x] `rule:heuristics.ts.fs-promises-chmod.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
664
|
+
- [x] `rule:heuristics.ts.fs-promises-chown.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
665
|
+
- [x] `rule:heuristics.ts.fs-promises-copy-file.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
666
|
+
- [x] `rule:heuristics.ts.fs-promises-cp.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
667
|
+
- [x] `rule:heuristics.ts.fs-promises-link.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
668
|
+
- [x] `rule:heuristics.ts.fs-promises-lstat.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
669
|
+
- [x] `rule:heuristics.ts.fs-promises-mkdir.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
670
|
+
- [x] `rule:heuristics.ts.fs-promises-mkdtemp.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
671
|
+
- [x] `rule:heuristics.ts.fs-promises-open.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
672
|
+
- [x] `rule:heuristics.ts.fs-promises-opendir.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
673
|
+
- [x] `rule:heuristics.ts.fs-promises-read-file.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
674
|
+
- [x] `rule:heuristics.ts.fs-promises-readdir.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
675
|
+
- [x] `rule:heuristics.ts.fs-promises-readlink.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
676
|
+
- [x] `rule:heuristics.ts.fs-promises-realpath.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
677
|
+
- [x] `rule:heuristics.ts.fs-promises-rename.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
678
|
+
- [x] `rule:heuristics.ts.fs-promises-rm.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
679
|
+
- [x] `rule:heuristics.ts.fs-promises-stat.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
680
|
+
- [x] `rule:heuristics.ts.fs-promises-symlink.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
681
|
+
- [x] `rule:heuristics.ts.fs-promises-unlink.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
682
|
+
- [x] `rule:heuristics.ts.fs-promises-utimes.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
683
|
+
- [x] `rule:heuristics.ts.fs-promises-write-file.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
684
|
+
- [x] `rule:heuristics.ts.fs-read-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
685
|
+
- [x] `rule:heuristics.ts.fs-read-file-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
686
|
+
- [x] `rule:heuristics.ts.fs-read-file-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
687
|
+
- [x] `rule:heuristics.ts.fs-read-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
688
|
+
- [x] `rule:heuristics.ts.fs-readdir-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
689
|
+
- [x] `rule:heuristics.ts.fs-readdir-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
690
|
+
- [x] `rule:heuristics.ts.fs-readlink-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
691
|
+
- [x] `rule:heuristics.ts.fs-readlink-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
692
|
+
- [x] `rule:heuristics.ts.fs-readv-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
693
|
+
- [x] `rule:heuristics.ts.fs-readv-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
694
|
+
- [x] `rule:heuristics.ts.fs-realpath-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
695
|
+
- [x] `rule:heuristics.ts.fs-realpath-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
696
|
+
- [x] `rule:heuristics.ts.fs-rename-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
697
|
+
- [x] `rule:heuristics.ts.fs-rename-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
698
|
+
- [x] `rule:heuristics.ts.fs-rm-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
699
|
+
- [x] `rule:heuristics.ts.fs-rm-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
700
|
+
- [x] `rule:heuristics.ts.fs-rmdir-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
701
|
+
- [x] `rule:heuristics.ts.fs-rmdir-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
702
|
+
- [x] `rule:heuristics.ts.fs-stat-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
703
|
+
- [x] `rule:heuristics.ts.fs-stat-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
704
|
+
- [x] `rule:heuristics.ts.fs-statfs-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
705
|
+
- [x] `rule:heuristics.ts.fs-statfs-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
706
|
+
- [x] `rule:heuristics.ts.fs-symlink-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
707
|
+
- [x] `rule:heuristics.ts.fs-symlink-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
708
|
+
- [x] `rule:heuristics.ts.fs-truncate-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
709
|
+
- [x] `rule:heuristics.ts.fs-truncate-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
710
|
+
- [x] `rule:heuristics.ts.fs-unlink-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
711
|
+
- [x] `rule:heuristics.ts.fs-unlink-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
712
|
+
- [x] `rule:heuristics.ts.fs-unwatch-file-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
713
|
+
- [x] `rule:heuristics.ts.fs-utimes-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
714
|
+
- [x] `rule:heuristics.ts.fs-utimes-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
715
|
+
- [x] `rule:heuristics.ts.fs-watch-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
716
|
+
- [x] `rule:heuristics.ts.fs-watch-file-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
717
|
+
- [x] `rule:heuristics.ts.fs-write-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
718
|
+
- [x] `rule:heuristics.ts.fs-write-file-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
719
|
+
- [x] `rule:heuristics.ts.fs-write-file-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
720
|
+
- [x] `rule:heuristics.ts.fs-write-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
721
|
+
- [x] `rule:heuristics.ts.fs-writev-callback.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
722
|
+
- [x] `rule:heuristics.ts.fs-writev-sync.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
723
|
+
- [x] `rule:heuristics.ts.function-constructor.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
724
|
+
- [x] `rule:heuristics.ts.god-class-large-class.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
725
|
+
- [x] `rule:heuristics.ts.hardcoded-secret-token.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
726
|
+
- [x] `rule:heuristics.ts.inner-html.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
727
|
+
- [x] `rule:heuristics.ts.insecure-token-date-now.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
728
|
+
- [x] `rule:heuristics.ts.insecure-token-math-random.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
729
|
+
- [x] `rule:heuristics.ts.insert-adjacent-html.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
730
|
+
- [x] `rule:heuristics.ts.jwt-decode-without-verify.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
731
|
+
- [x] `rule:heuristics.ts.jwt-sign-no-expiration.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
732
|
+
- [x] `rule:heuristics.ts.jwt-verify-ignore-expiration.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
733
|
+
- [x] `rule:heuristics.ts.new-promise-async.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
734
|
+
- [x] `rule:heuristics.ts.process-env-mutation.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
735
|
+
- [x] `rule:heuristics.ts.process-exit.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
736
|
+
- [x] `rule:heuristics.ts.set-interval-string.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
737
|
+
- [x] `rule:heuristics.ts.set-timeout-string.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
738
|
+
- [x] `rule:heuristics.ts.solid.dip.concrete-instantiation.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
739
|
+
- [x] `rule:heuristics.ts.solid.dip.framework-import.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
740
|
+
- [x] `rule:heuristics.ts.solid.isp.interface-command-query-mix.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
741
|
+
- [x] `rule:heuristics.ts.solid.lsp.override-not-implemented.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
742
|
+
- [x] `rule:heuristics.ts.solid.ocp.discriminator-switch.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
743
|
+
- [x] `rule:heuristics.ts.solid.srp.class-command-query-mix.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
744
|
+
- [x] `rule:heuristics.ts.tls-env-override.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
745
|
+
- [x] `rule:heuristics.ts.tls-reject-unauthorized-false.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
746
|
+
- [x] `rule:heuristics.ts.vm-dynamic-code-execution.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
747
|
+
- [x] `rule:heuristics.ts.weak-crypto-hash.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
748
|
+
- [x] `rule:heuristics.ts.weak-token-randomuuid.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
749
|
+
- [x] `rule:heuristics.ts.with-statement.ast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
750
|
+
- [x] `rule:ios.no-alamofire` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
751
|
+
- [x] `rule:ios.no-anyview` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
752
|
+
- [x] `rule:ios.no-completion-handlers-outside-bridges` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
753
|
+
- [x] `rule:ios.no-force-unwrap` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
754
|
+
- [x] `rule:ios.no-gcd` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
755
|
+
- [x] `rule:ios.no-jsonserialization` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
756
|
+
- [x] `rule:ios.no-print` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
757
|
+
- [x] `rule:ios.no_anyview` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
758
|
+
- [x] `rule:ios.no_completion_handlers` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
759
|
+
- [x] `rule:ios.no_dispatchqueue` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
760
|
+
- [x] `rule:ios.no_print` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
761
|
+
- [x] `rule:ios.tdd.domain-changes-require-tests` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
762
|
+
- [x] `rule:skills.android.no-globalscope` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
763
|
+
- [x] `rule:skills.android.no-runblocking` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
764
|
+
- [x] `rule:skills.android.no-thread-sleep` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
765
|
+
- [x] `rule:skills.backend.avoid-explicit-any` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
766
|
+
- [x] `rule:skills.backend.enforce-clean-architecture` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
767
|
+
- [x] `rule:skills.backend.no-console-log` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
768
|
+
- [x] `rule:skills.backend.no-empty-catch` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
769
|
+
- [x] `rule:skills.backend.no-god-classes` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
770
|
+
- [x] `rule:skills.backend.no-solid-violations` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
771
|
+
- [x] `rule:skills.frontend.avoid-explicit-any` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
772
|
+
- [x] `rule:skills.frontend.enforce-clean-architecture` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
773
|
+
- [x] `rule:skills.frontend.no-console-log` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
774
|
+
- [x] `rule:skills.frontend.no-empty-catch` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
775
|
+
- [x] `rule:skills.frontend.no-god-classes` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
776
|
+
- [x] `rule:skills.frontend.no-solid-violations` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
777
|
+
- [x] `rule:skills.ios.no-anyview` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
778
|
+
- [x] `rule:skills.ios.no-callback-style-outside-bridges` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
779
|
+
- [x] `rule:skills.ios.no-dispatchgroup` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
780
|
+
- [x] `rule:skills.ios.no-dispatchqueue` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
781
|
+
- [x] `rule:skills.ios.no-dispatchsemaphore` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
782
|
+
- [x] `rule:skills.ios.no-force-cast` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
783
|
+
- [x] `rule:skills.ios.no-force-try` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
784
|
+
- [x] `rule:skills.ios.no-force-unwrap` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
785
|
+
- [x] `rule:skills.ios.no-navigation-view` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
786
|
+
- [x] `rule:skills.ios.no-observable-object` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
787
|
+
- [x] `rule:skills.ios.no-on-tap-gesture` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
788
|
+
- [x] `rule:skills.ios.no-operation-queue` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
789
|
+
- [x] `rule:skills.ios.no-string-format` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
790
|
+
- [x] `rule:skills.ios.no-task-detached` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
791
|
+
- [x] `rule:skills.ios.no-uiscreen-main-bounds` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
792
|
+
- [x] `rule:skills.ios.no-unchecked-sendable` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
793
|
+
- [x] `rule:workflow.bdd.insufficient_features` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|
|
794
|
+
- [x] `rule:workflow.bdd.missing_feature_files` | mock: ✅ | real: ✅ | evidencia: core:`npm run -s test:stage-gates` (915 pass / 0 fail / 4 skip)
|