## Summary - add the Spec 204 platform vocabulary foundation, including canonical glossary terms, registry ownership descriptors, canonical operation type and alias resolution, and explicit reason ownership and platform reason-family metadata - harden platform-facing compare, snapshot, evidence, monitoring, review, and reporting surfaces so they prefer governed-subject and canonical operation semantics while preserving intentional Intune-owned terminology - extend Spec 204 unit, feature, Filament, and architecture coverage and add the full spec artifacts, checklist, and completed task ledger ## Verification - ran the focused recent-change Sail verification pack for the new glossary and reason-semantics work - ran the full Spec 204 quickstart verification pack under Sail - ran `cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent` - ran an integrated-browser smoke pass covering tenant dashboard, operations, operation detail, baseline compare, evidence, reviews, review packs, provider connections, inventory items, backup schedules, onboarding, and the system dashboard/operations/failures/run-detail surfaces ## Notes - provider registration is unchanged and remains in `bootstrap/providers.php` - no new destructive actions or asset-registration changes are introduced by this branch Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #234
53 lines
2.9 KiB
PHP
53 lines
2.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Support\Governance\GovernanceDomainKey;
|
|
use App\Support\Governance\GovernanceSubjectClass;
|
|
use App\Support\Governance\GovernanceSubjectTaxonomyRegistry;
|
|
|
|
it('composes active governance subject types from current policy and foundation metadata', function (): void {
|
|
$registry = app(GovernanceSubjectTaxonomyRegistry::class);
|
|
|
|
$subjectTypes = collect($registry->active())
|
|
->keyBy(static fn ($subjectType): string => $subjectType->subjectTypeKey)
|
|
->all();
|
|
|
|
expect($subjectTypes['deviceConfiguration']->domainKey)->toBe(GovernanceDomainKey::Intune)
|
|
->and($subjectTypes['deviceConfiguration']->subjectClass)->toBe(GovernanceSubjectClass::Policy)
|
|
->and($subjectTypes['deviceConfiguration']->captureSupported)->toBeTrue()
|
|
->and($subjectTypes['deviceConfiguration']->compareSupported)->toBeTrue()
|
|
->and($subjectTypes['deviceConfiguration']->legacyBucket)->toBe('policy_types')
|
|
->and($subjectTypes['assignmentFilter']->domainKey)->toBe(GovernanceDomainKey::PlatformFoundation)
|
|
->and($subjectTypes['assignmentFilter']->subjectClass)->toBe(GovernanceSubjectClass::ConfigurationResource)
|
|
->and($subjectTypes['assignmentFilter']->legacyBucket)->toBe('foundation_types')
|
|
->and(array_key_exists('intuneRoleAssignment', $subjectTypes))->toBeFalse();
|
|
});
|
|
|
|
it('keeps unsupported foundation mappings addressable but inactive in the complete registry', function (): void {
|
|
$registry = app(GovernanceSubjectTaxonomyRegistry::class);
|
|
$subjectType = $registry->find('platform_foundation', 'intuneRoleAssignment');
|
|
|
|
expect($subjectType)->not->toBeNull()
|
|
->and($subjectType?->active)->toBeFalse()
|
|
->and($subjectType?->captureSupported)->toBeFalse()
|
|
->and($subjectType?->compareSupported)->toBeFalse();
|
|
});
|
|
|
|
it('reserves future-domain vocabulary without exposing future domains as active operator selections', function (): void {
|
|
$registry = app(GovernanceSubjectTaxonomyRegistry::class);
|
|
|
|
expect($registry->isKnownDomain('entra'))->toBeTrue()
|
|
->and($registry->allowsSubjectClass('entra', 'control'))->toBeTrue()
|
|
->and(collect($registry->active())->contains(
|
|
static fn ($subjectType): bool => $subjectType->domainKey === GovernanceDomainKey::Entra,
|
|
))->toBeFalse();
|
|
});
|
|
|
|
it('finds subject types by subject key across legacy buckets and exposes contributor ownership metadata', function (): void {
|
|
$registry = app(GovernanceSubjectTaxonomyRegistry::class);
|
|
|
|
expect($registry->findBySubjectTypeKey('deviceConfiguration')?->domainKey)->toBe(GovernanceDomainKey::Intune)
|
|
->and($registry->findBySubjectTypeKey('assignmentFilter', 'foundation_types')?->subjectClass)->toBe(GovernanceSubjectClass::ConfigurationResource)
|
|
->and($registry->ownershipDescriptor()->canonicalNouns)->toBe(['domain_key', 'subject_class', 'subject_type_key', 'subject_type_label']);
|
|
}); |