Skip to content

08_07 - Manifest Validation

Sistema completo de validación de manifiestos para plugins AudioLab (L4) y suites (L5).

📁 Estructura

08_07_manifest_validation/
├── 08_07_00_syntax_validation/        # FASE 1 ✅
│   ├── JSONSchemaValidator            # Validación JSON Schema Draft 7
│   ├── TypeChecker                    # Validación de tipos semánticos
│   ├── RequiredFieldsValidator        # Validación de campos requeridos
│   └── schemas/                       # Schemas JSON predefinidos
├── 08_07_01_dependency_validation/    # FASE 2 ✅
│   ├── ComponentAvailabilityChecker   # Disponibilidad de componentes
│   ├── VersionCompatibilityChecker    # Compatibilidad de versiones (semver)
│   └── CircularDependencyDetector     # Detección de ciclos (DFS)
├── 08_07_02_routing_validation/       # FASE 3 ✅
│   ├── SignalPathValidator            # Validación de rutas de señal
│   ├── ChannelCountValidator          # Validación de canales
│   └── UnconnectedPortDetector        # Detección de puertos desconectados
├── 08_07_03_completeness_audit/       # FASE 4 ✅
│   └── CompletenessAuditor            # Auditoría de completitud
└── 08_07_04_reporting/                # FASE 5 ✅
    ├── ValidationReporter             # Generación de reportes
    └── SuggestionEngine               # Motor de sugerencias

🎯 Características

FASE 1: Syntax Validation

  • ✅ Validación JSON Schema Draft 7 completa
  • ✅ Type checking con tipos semánticos (UUID, URL, semver, email)
  • ✅ Validación audio-específica (sample rates, buffer sizes, canales)
  • ✅ Validación de campos requeridos con paths anidados
  • ✅ Presets para L4 plugins y L5 suites
  • ✅ 30+ tests comprehensivos

FASE 2: Dependency Validation

  • ✅ Registry de componentes con disponibilidad
  • ✅ Semantic versioning con constraints (>=, <=, ~, ^, ranges)
  • ✅ Detección de ciclos con DFS
  • ✅ Análisis de grafo de dependencias
  • ✅ Topological sort para orden de procesamiento
  • ✅ 25+ tests de validación

FASE 3: Routing Validation

  • ✅ Validación de rutas de señal completas
  • ✅ Detección de puertos no conectados
  • ✅ Validación de referencias de conexiones
  • ✅ Análisis de alcanzabilidad (input → component → output)
  • ✅ Detección de feedback loops

FASE 4: Completeness Audit

  • ✅ Detección de parámetros faltantes
  • ✅ Validación de UI incompleta
  • ✅ Detección de features no implementadas

FASE 5: Reporting System

  • ✅ Formateo de errores/warnings claros
  • ✅ Generación de reportes HTML
  • ✅ Generación de reportes JSON/texto
  • ✅ Motor de sugerencias contextuales

🚀 Uso Rápido

Validación Completa de Manifest

#include <JSONSchemaValidator.hpp>
#include <ComponentAvailabilityChecker.hpp>
#include <SignalPathValidator.hpp>
#include <ValidationReporter.hpp>

using namespace audiolab::plugins::validation;

// 1. Validación de sintaxis
JSONSchemaValidator schemaValidator;
schemaValidator.loadSchema("schemas/plugin_manifest_v1.json");
auto syntaxResult = schemaValidator.validate("my_plugin.json");

// 2. Validación de dependencias
ComponentRegistry registry = ComponentAvailabilityChecker::createDefaultRegistry();
ComponentAvailabilityChecker depChecker(registry);
auto depResult = depChecker.checkManifest("my_plugin.json");

// 3. Validación de routing
SignalPathValidator routingValidator;
auto routingResult = routingValidator.validateManifest("my_plugin.json");

// 4. Generar reporte
ValidationReporter reporter;
if (!syntaxResult.isValid() || !depResult.isValid() || !routingResult.isValid()) {
    reporter.generateHTMLReport(syntaxResult, "validation_report.html");
}

Validación Específica

// Solo validar tipos semánticos
TypeChecker checker;
bool validUUID = TypeChecker::isValidUUID("550e8400-e29b-41d4-a716-446655440000");
bool validSemver = TypeChecker::isValidSemver("1.2.3-beta.1");
bool validSampleRate = TypeChecker::isValidSampleRate(48000.0);

// Solo validar versiones
VersionCompatibilityChecker::VersionRegistry registry;
registry.registerVersion("compressor", "1.5.0");

VersionCompatibilityChecker versionChecker(registry);
auto constraint = VersionConstraint::parse(">=1.0.0");
auto result = versionChecker.checkVersion("compressor", constraint);

// Solo detectar ciclos
DependencyGraph graph;
graph.addDependency("comp_a", "comp_b");
graph.addDependency("comp_b", "comp_c");

CircularDependencyDetector detector;
auto cycleResult = detector.detectCycles(graph);

📊 Schemas JSON

Plugin Manifest (L4)

schemas/plugin_manifest_v1.json

Incluye: - metadata - ID, nombre, versión, fabricante, categoría - audio - Canales entrada/salida, sample rates, latencia - components - Array de componentes DSP - parameters - Definiciones de parámetros - routing - Conexiones de señal - ui - Configuración de interfaz

Suite Manifest (L5)

schemas/suite_manifest_v1.json

Incluye: - suite - Información de suite - plugins - Lista de plugins incluidos - sharedResources - Recursos compartidos (presets, IRs, etc.) - installation - Configuración de instalación


🧪 Testing

# Compilar y ejecutar todos los tests
cd 08_07_00_syntax_validation/tests
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake
cmake --build .
./test_syntax_validation

# Similar para 08_07_01 y 08_07_02

📦 Dependencias

  • nlohmann/json (via vcpkg) - JSON parsing
  • Catch2 (via vcpkg) - Testing framework
  • C++20 - Standard features
vcpkg install nlohmann-json catch2

🔗 Integración

CMakeLists.txt

add_subdirectory(08_07_manifest_validation)

target_link_libraries(your_target
    PRIVATE
        syntax_validation
        dependency_validation
        routing_validation
)

En código

#include <JSONSchemaValidator.hpp>
#include <ComponentAvailabilityChecker.hpp>
#include <SignalPathValidator.hpp>
#include <ValidationReporter.hpp>

using namespace audiolab::plugins::validation;

📈 Ejemplos de Validation Issues

Syntax Errors

✗ metadata.version: Invalid semver format
  Expected: "1.0.0"
  Actual: "v1.0"

✗ audio.inputs: Value below minimum
  Expected: min 0
  Actual: -1

Dependency Errors

✗ components[2]: Component not found in registry: custom_filter

✗ components[0].dependencies[1]: Version conflict
  component_x 1.0.0 does not satisfy >=2.0.0

Routing Errors

✗ routing.connections[3].from: Reference to non-existent port: delay.output2

⚠ components: Component not reachable from input: unused_eq

🎓 Características Avanzadas

1. Custom Semantic Types

TypeChecker checker;

checker.registerSemanticType("even_number", [](const std::string& value) {
    int num = std::stoi(value);
    return num % 2 == 0;
});

auto result = checker.checkSemanticType("42", "even_number"); // ✓

2. Dependency Graph Analysis

DependencyGraph graph;
// ... build graph ...

// Topological sort
std::vector<std::string> sorted;
detector.getTopologicalSort(graph, sorted);

// Find shortest path
auto path = DependencyAnalysis::findShortestPath(graph, "comp_a", "comp_b");

// Transitive dependencies
auto deps = DependencyAnalysis::getTransitiveDependencies(graph, "comp_a");

3. Signal Path Analysis

SignalPathValidator validator;
validator.validateManifest("plugin.json");

// Get all signal paths
auto paths = validator.getAllPaths();

// Find critical path (longest chain)
auto critical = RoutingAnalysis::findCriticalPath(paths);

// Check reachability
bool reachable = validator.isReachableFromInput("my_comp");
bool canOutput = validator.canReachOutput("my_comp");

🐛 Troubleshooting

Error: "No schema loaded"

// Asegúrate de cargar el schema antes de validar
validator.loadSchema("schemas/plugin_manifest_v1.json");

Error: "Component not found"

// Registra componentes personalizados
ComponentRegistry registry;
registry.registerComponent(ComponentInfo("my_comp", "filter", "1.0.0"));

Warning: "Component not reachable"

// Verifica que el componente esté conectado en routing
{
  "routing": {
    "connections": [
      {"from": "input.main", "to": "my_comp.input"},
      {"from": "my_comp.output", "to": "output.main"}
    ]
  }
}

📝 Estado

Progreso: 100% ✅

  • ✅ FASE 1: Syntax Validation
  • ✅ FASE 2: Dependency Validation
  • ✅ FASE 3: Routing Validation
  • ✅ FASE 4: Completeness Audit
  • ✅ FASE 5: Reporting System

Total: ~5,000 líneas de código, 50+ tests, documentación completa


🤝 Contribución

Para extender el sistema de validación:

  1. Implementa interfaz ValidationResult
  2. Registra custom semantic types con TypeChecker
  3. Añade nuevos schemas JSON en schemas/
  4. Extiende SuggestionEngine para nuevos errores

📚 Referencias


Módulo 08_07 - Manifest Validation System Autor: AudioLab Framework Versión: 1.0.0 Dependencias: 08_01 (Composition Tools)