## 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
46 lines
1.3 KiB
PHP
46 lines
1.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Support\Baselines\Compare;
|
|
|
|
use InvalidArgumentException;
|
|
|
|
final class CompareFindingCandidate
|
|
{
|
|
/**
|
|
* @param array<string, mixed> $fingerprintBasis
|
|
* @param array<string, mixed> $evidencePayload
|
|
*/
|
|
public function __construct(
|
|
public readonly string $changeType,
|
|
public readonly string $severity,
|
|
public readonly array $fingerprintBasis,
|
|
public readonly array $evidencePayload,
|
|
public readonly bool $autoCloseEligible = true,
|
|
) {
|
|
if (trim($this->changeType) === '' || trim($this->severity) === '') {
|
|
throw new InvalidArgumentException('Compare finding candidates require non-empty change type and severity values.');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return array{
|
|
* change_type: string,
|
|
* severity: string,
|
|
* fingerprint_basis: array<string, mixed>,
|
|
* evidence_payload: array<string, mixed>,
|
|
* auto_close_eligible: bool
|
|
* }
|
|
*/
|
|
public function toArray(): array
|
|
{
|
|
return [
|
|
'change_type' => $this->changeType,
|
|
'severity' => $this->severity,
|
|
'fingerprint_basis' => $this->fingerprintBasis,
|
|
'evidence_payload' => $this->evidencePayload,
|
|
'auto_close_eligible' => $this->autoCloseEligible,
|
|
];
|
|
}
|
|
} |