## Summary - extract baseline compare orchestration behind an explicit strategy contract and registry - preserve the current Intune compare path through a dedicated `IntuneCompareStrategy` - harden compare launch and review surfaces for mixed, unsupported, incomplete, and strategy-failure truth - add Spec 203 artifacts, focused regression coverage, and future-domain strategy proof tests ## Testing - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Unit/Baselines/CompareStrategyRegistryTest.php tests/Unit/Baselines/CompareSubjectResultContractTest.php tests/Feature/Baselines/BaselineCompareStrategySelectionTest.php tests/Feature/Baselines/BaselineComparePreconditionsTest.php tests/Feature/Baselines/BaselineCompareExecutionGuardTest.php tests/Feature/Baselines/BaselineCompareMatrixCompareAllActionTest.php tests/Feature/Filament/BaselineProfileCompareStartSurfaceTest.php tests/Feature/Filament/BaselineCompareLandingStartSurfaceTest.php tests/Feature/Filament/BaselineCompareLandingWhyNoFindingsTest.php tests/Feature/Filament/BaselineCompareMatrixPageTest.php tests/Feature/Filament/OperationRunBaselineTruthSurfaceTest.php` - `cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent` ## Notes - no new Filament panel/provider registration changes - no global-search resource changes - no new asset registration or deployment step changes Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #233
44 lines
1023 B
PHP
44 lines
1023 B
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Support\Baselines\Compare;
|
|
|
|
use InvalidArgumentException;
|
|
use Stringable;
|
|
|
|
final class CompareStrategyKey implements Stringable
|
|
{
|
|
public readonly string $value;
|
|
|
|
public function __construct(string $value)
|
|
{
|
|
$normalized = trim(mb_strtolower($value));
|
|
|
|
if ($normalized === '' || ! preg_match('/^[a-z0-9_]+$/', $normalized)) {
|
|
throw new InvalidArgumentException('Compare strategy keys must be non-empty lowercase snake_case strings.');
|
|
}
|
|
|
|
$this->value = $normalized;
|
|
}
|
|
|
|
public static function from(self|string $value): self
|
|
{
|
|
return $value instanceof self ? $value : new self($value);
|
|
}
|
|
|
|
public static function intunePolicy(): self
|
|
{
|
|
return new self('intune_policy');
|
|
}
|
|
|
|
public function equals(self|string $other): bool
|
|
{
|
|
return $this->value === self::from($other)->value;
|
|
}
|
|
|
|
public function __toString(): string
|
|
{
|
|
return $this->value;
|
|
}
|
|
} |