Source code for cursus.validation.alignment.core.level3_validation_config
"""
Level 3 Validation Configuration
Configuration class for Level 3 (Specification ↔ Dependencies) alignment validation
with configurable compatibility score thresholds.
"""
from typing import Dict, Any
from enum import Enum
[docs]
class ValidationMode(Enum):
"""Validation modes with different threshold requirements."""
STRICT = "strict" # Current behavior (exact resolution required)
RELAXED = "relaxed" # Allow dependencies with reasonable compatibility
PERMISSIVE = "permissive" # Allow dependencies with minimal compatibility
[docs]
class Level3ValidationConfig:
"""Configuration for Level 3 validation thresholds and behavior."""
def __init__(self, mode: ValidationMode = ValidationMode.RELAXED):
"""
Initialize validation configuration.
Args:
mode: Validation mode determining threshold strictness
"""
self.mode = mode
# Set thresholds based on mode
if mode == ValidationMode.STRICT:
self.PASS_THRESHOLD = 0.8 # ≥ 0.8: PASS
self.WARNING_THRESHOLD = 0.7 # 0.7-0.79: WARNING
self.ERROR_THRESHOLD = 0.5 # 0.5-0.69: ERROR
# < 0.5: CRITICAL
elif mode == ValidationMode.RELAXED:
self.PASS_THRESHOLD = 0.6 # ≥ 0.6: PASS
self.WARNING_THRESHOLD = 0.4 # 0.4-0.59: WARNING
self.ERROR_THRESHOLD = 0.2 # 0.2-0.39: ERROR
# < 0.2: CRITICAL
elif mode == ValidationMode.PERMISSIVE:
self.PASS_THRESHOLD = 0.3 # ≥ 0.3: PASS
self.WARNING_THRESHOLD = 0.2 # 0.2-0.29: WARNING
self.ERROR_THRESHOLD = 0.1 # 0.1-0.19: ERROR
# < 0.1: CRITICAL
else:
# Default to relaxed mode
self.PASS_THRESHOLD = 0.6
self.WARNING_THRESHOLD = 0.4
self.ERROR_THRESHOLD = 0.2
# Resolution threshold for dependency resolver (should match or be lower than PASS_THRESHOLD)
self.RESOLUTION_THRESHOLD = min(0.5, self.PASS_THRESHOLD)
# Enable detailed scoring in reports
self.INCLUDE_SCORE_BREAKDOWN = True
self.INCLUDE_ALTERNATIVE_CANDIDATES = True
self.MAX_ALTERNATIVE_CANDIDATES = 3
# Logging configuration
self.LOG_SUCCESSFUL_RESOLUTIONS = True
self.LOG_FAILED_RESOLUTIONS = True
self.LOG_SCORE_DETAILS = False # Set to True for debugging
[docs]
def determine_severity_from_score(self, score: float, is_required: bool) -> str:
"""
Determine issue severity based on compatibility score and requirement.
Args:
score: Compatibility score (0.0 to 1.0)
is_required: Whether the dependency is required
Returns:
Severity level string
"""
if score >= self.PASS_THRESHOLD:
return "INFO" # Should not happen in failed deps, but just in case
elif score >= self.WARNING_THRESHOLD:
return "WARNING" if not is_required else "ERROR"
elif score >= self.ERROR_THRESHOLD:
return "ERROR"
else:
return "CRITICAL"
[docs]
def should_pass_validation(self, score: float) -> bool:
"""
Determine if a compatibility score should pass validation.
Args:
score: Compatibility score (0.0 to 1.0)
Returns:
True if score meets pass threshold
"""
return score >= self.PASS_THRESHOLD
[docs]
def get_threshold_description(self) -> Dict[str, Any]:
"""
Get human-readable description of current thresholds.
Returns:
Dictionary with threshold descriptions
"""
return {
"mode": self.mode.value,
"thresholds": {
"pass": f"≥ {self.PASS_THRESHOLD:.1f}",
"warning": f"{self.WARNING_THRESHOLD:.1f} - {self.PASS_THRESHOLD - 0.01:.2f}",
"error": f"{self.ERROR_THRESHOLD:.1f} - {self.WARNING_THRESHOLD - 0.01:.2f}",
"critical": f"< {self.ERROR_THRESHOLD:.1f}",
},
"resolution_threshold": self.RESOLUTION_THRESHOLD,
"description": self._get_mode_description(),
}
def _get_mode_description(self) -> str:
"""Get description of the current validation mode."""
descriptions = {
ValidationMode.STRICT: "Strict validation requiring high compatibility scores for all dependencies",
ValidationMode.RELAXED: "Relaxed validation allowing reasonable compatibility matches",
ValidationMode.PERMISSIVE: "Permissive validation for exploration and development phases",
}
return descriptions.get(self.mode, "Unknown validation mode")
[docs]
@classmethod
def create_strict_config(cls) -> "Level3ValidationConfig":
"""Create a strict validation configuration."""
return cls(ValidationMode.STRICT)
[docs]
@classmethod
def create_relaxed_config(cls) -> "Level3ValidationConfig":
"""Create a relaxed validation configuration."""
return cls(ValidationMode.RELAXED)
[docs]
@classmethod
def create_permissive_config(cls) -> "Level3ValidationConfig":
"""Create a permissive validation configuration."""
return cls(ValidationMode.PERMISSIVE)
[docs]
@classmethod
def create_custom_config(
cls, pass_threshold: float, warning_threshold: float, error_threshold: float
) -> "Level3ValidationConfig":
"""
Create a custom validation configuration with specific thresholds.
Args:
pass_threshold: Minimum score for passing validation
warning_threshold: Minimum score for warning level
error_threshold: Minimum score for error level
Returns:
Custom Level3ValidationConfig instance
"""
config = cls(ValidationMode.RELAXED) # Start with relaxed as base
config.PASS_THRESHOLD = pass_threshold
config.WARNING_THRESHOLD = warning_threshold
config.ERROR_THRESHOLD = error_threshold
config.RESOLUTION_THRESHOLD = min(0.5, pass_threshold)
return config
__all__ = ["Level3ValidationConfig", "ValidationMode"]