Mutantes generados (fase 1)
487
auth/ + contracts/ (Solidity)
Mutantes capturados
374
Tests detectaron la mutación ✓
Mutation score
76.8%
Objetivo: ≥85% antes del audit
Mutantes vivos (gaps)
113
Lógica sin cubrir por tests
Progreso de configuración · Workflow 5 fases
FASE 1
Init & Targets
✓ Completada
FASE 2
Scope & Mutants
✓ 487 mutantes
FASE 3
Optimización
✓ Opción B aplicada
FASE 4
Timeout Solidity
✓ Manual 13s
FASE 5
Validación final
→ Checklist activo
mewt.toml — Configuración final (Fase 1)
# CultivaChain — Campaña Fase 1 (auth + contracts) # Fase 2: traceability/ — programada fin de semana siguiente # Commit: a4f82c1 · 2026-06-14 db = "mewt.sqlite" [log] level = "info" [targets] # Scope reducido: auth crítico + contratos (pre-audit) # traceability/ diferido a Fase 2 include = [ "src/auth/**/*.rs", "src/contracts/**/*.rs", "contracts/**/*.sol" ] ignore = ["test", "mock", "generated"] [run] # Sin filtro de mutaciones — cubrir todos los tipos [test] # Comando base Rust cmd = "cargo test" # Auto-calculado (12s × 2 = 24s) # Solidity: timeout manual (touch → forge: 6.1s × 2 = 12.2 → 13) [[test.per_target]] glob = "contracts/**/*.sol" cmd = "forge test" timeout = 13
Distribución por severidad
Alta
181
Media
206
Baja
100
Alta+Media: 387 mutantes (79.5%) del total.
Solo alta+media para análisis prioritario.
Solo alta+media para análisis prioritario.
Mutation score por módulo
82%
src/auth/
148/180 mutantes capturados
32 gaps · crítico pre-audit
72%
contracts/ (Solidity)
163/225 mutantes capturados
62 gaps · BatchValidator crítico
Análisis de duración · Decisión de optimización (Fase 3)
Sin optimización (scope completo)
traceability/ estimado
~620 mutantes
Duración total (worst-case)
~38h
Baseline cargo test
12s
Cálculo: 1107 × 12s
No viable ✗
Con Opción B — Scope crítico (aplicada)
auth/ + contracts/
487 mutantes
Duración estimada (Rust)
~1.6h
Duración Solidity (forge)
~0.8h
Total campaña Fase 1
~2.4h ✓
Comandos ejecutados · Trazabilidad de la campaña
Sesión de configuración — 14 jun 2026
$ mewt init Created mewt.toml and mewt.sqlite in /cultivachain $ mewt print config targets.include = ["**/*.rs", "**/*.sol"] # demasiado amplio → editado # [Editar mewt.toml: scope reducido a auth/ + contracts/] $ mewt mutate src/auth/ src/contracts/ contracts/ Mutating src/auth/token.rs → 48 mutants (high:18 med:22 low:8) Mutating src/auth/permissions.rs → 61 mutants (high:24 med:28 low:9) Mutating src/auth/session.rs → 38 mutants (high:14 med:17 low:7) Mutating src/contracts/validator.rs → 53 mutants (high:20 med:24 low:9) Mutating contracts/BatchValidator.sol → 95 mutants (high:38 med:42 low:15) Mutating contracts/TraceRegistry.sol → 130 mutants (high:47 med:56 low:27) Mutating contracts/AccessControl.sol → 62 mutants (high:20 med:17 low:25) Total: 487 mutants generated $ mewt status 487 mutants across 7 files · High: 181 Med: 206 Low: 100 $ time cargo test real 0m11.8s · user 0m8.2s · sys 0m1.1s → baseline: 12s (auto-timeout: 24s) # Test Solidity: recompilación diferencial $ time forge test real 0m0.9s (warm cache) $ touch contracts/BatchValidator.sol && time forge test real 0m6.1s (recompilación completa) → timeout manual: 13s $ mewt run Caught (TestFail): 374 (76.8%) Uncaught (alive): 113 (23.2%) Timeout: 0 Skipped: 0 Campaign completed in 2h 18m
Top mutantes vivos · Gaps de cobertura prioritarios
Mutantes sin capturar — severidad alta
32 gaps en auth/ · 62 gaps en contracts/
| ID | Archivo | Tipo mutación | Línea | Descripción | Severidad | Estado |
|---|---|---|---|---|---|---|
| m-0041 | src/auth/token.rs | CR |
87 | Cambio expires_at > now → expires_at >= now |
Alta | Uncaught |
| m-0118 | src/auth/permissions.rs | IF |
134 | Negación condición can_write no detectada |
Alta | Uncaught |
| m-0203 | contracts/BatchValidator.sol | ER |
56 | require(batchSize > 0) eliminado silenciosamente |
Alta | Uncaught |
| m-0247 | contracts/BatchValidator.sol | IT |
89 | Inversión booleana en validación de origen de lote | Alta | Uncaught |
| m-0312 | contracts/TraceRegistry.sol | CR |
112 | block.timestamp < deadline → <= |
Alta | Uncaught |
| m-0089 | src/auth/session.rs | CR |
211 | Off-by-one en ventana de refresh token | Media | Uncaught |
| m-0156 | src/contracts/validator.rs | ER |
45 | Eliminación de guard null en firma digital | Alta | Caught |
| m-0401 | contracts/AccessControl.sol | IF |
33 | Modificador onlyOwner bypasseable |
Alta | Caught |
Recomendaciones · Plan de acción pre-audit
Prioridad 1 — Cubrir gaps en BatchValidator.sol (contratos)
- Añadir test que verifique
require(batchSize == 0)revierte correctamente (m-0203) - Test de inversión booleana en validación de origen: pasar batch de lote ajeno y verificar revert (m-0247)
- Verificar boundary
block.timestamp == deadlineen TraceRegistry (m-0312) - Estimación: 3 tests nuevos en Foundry · ~2h desarrollo
Prioridad 2 — Fortalecer tests de auth/ Rust
- Token expirado con
expires_at == nowexacto: ¿rechazado o aceptado? Test boundary (m-0041) - Test permisos write con usuario sin rol: verificar que
can_write=falsebloquea operación (m-0118) - Off-by-one refresh token window: test con token en el segundo exacto del límite (m-0089)
Fase 2 — traceability/ (620 mutantes pendientes)
Diferido por tiempo de campaña (~20.7h worst-case con cargo test 12s). Recomendado iniciar el próximo fin de semana con Opción D (Two-Phase) usando tests unitarios (~3s) para fase rápida. Objetivo: score ≥85% antes del audit del 5 jul.
Checklist de validación — Fase 5
- mewt print config — Sintaxis válida, sin errores
- mewt status — 487 mutantes (coincide con fase 2)
- mewt print targets — Solo auth/, contracts/ (sin tests ni mocks)
- cargo test validado en fase 2 (12s baseline)
- forge test timeout — Manual 13s (recompilación: 6.1s × 2)
- Duración aceptable — ~2.4h (dentro del slot de 20h)
- mewt.toml commiteado — commit a4f82c1 con comentarios
Próximos pasos
- Escribir 3 tests Foundry para BatchValidator.sol (gaps alta)
- Escribir 3 tests Rust para auth/ (token boundary + permisos)
- Re-run campaña Fase 1 tras añadir tests → objetivo 85%
- Fase 2: configurar muton para traceability/ (Two-Phase)
- Entrega informe mutation score al audit externo (5 jul)