Added `ProviderResourceBinding` model, migrations, policies, and supporting framework for canonical resource identity mapping as defined in Spec 381. This provides the structural capability to resolve baseline and posture discrepancies by binding logical entities across source providers to canonical identities. Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #452
4.8 KiB
Implementation Close-Out: Spec 381 - Provider Resource Identity and Binding Foundation v1
Date: 2026-06-15
Branch: 381-provider-resource-identity-binding
Base HEAD observed during close-out: d52b674f spec: record management report pdf staging validation gate (#451)
Scope
Implemented backend-only provider resource identity and managed-environment-scoped binding foundation.
No Filament Resource, page, route, Livewire component, Blade view, navigation item, Graph client, queued job, scheduler behavior, OperationRun type, or customer-facing output was added.
Repo-Truth Notes
provider_resource_bindingsis tenant-owned operational truth and remains scoped byworkspace_idandmanaged_environment_id.- Baseline snapshots are workspace-owned through baseline profiles, not directly tenant-owned. For
source_baseline_snapshot_id, managed-environment validity is enforced throughbaseline_tenant_assignmentsfor the snapshot'sbaseline_profile_id. - No workspace-level, baseline-profile-specific, or subject-only binding scope was introduced.
- No duplicate active-state truth was introduced;
binding_status = activeremains the active-binding truth.
Livewire / Filament Contract
- Livewire v4.0+ compliance: unchanged. No Livewire code changed.
- Provider registration location: unchanged. Laravel panel providers remain in
apps/platform/bootstrap/providers.php. - Global search: no Filament Resource was added;
ProviderResourceBindingis not globally searchable. - Destructive/high-impact actions: no Filament action was added. Backend supersede/revoke decisions require policy authorization and audit logging. Future UI confirmation belongs to Spec 384.
- Assets: no assets were registered. No Spec 381-specific
filament:assetsdeployment concern beyond normal Filament deploy procedure.
RBAC, Isolation, And Audit
- Reads and mutations use
ProviderResourceBindingPolicywith existing baseline capabilities:- view:
workspace_baselines.view - create/supersede/revoke:
workspace_baselines.manage
- view:
- Non-members are denied as not found through managed-environment entitlement checks.
- Entitled members without manage capability receive forbidden for mutations.
- Provider connections and source references are validated against the binding workspace and managed environment before persistence.
- Binding create/supersede/revoke actions write
AuditLogrecords with safe identifiers and hashed/length-only operator note metadata.
OperationRun Semantics
No OperationRun is created, queued, updated, or completed by Spec 381. Binding decisions are DB-only, security-relevant mutations that are audited directly.
Browser Smoke
Not applicable. Spec 381 has no UI, user-facing flow, route, navigation, Filament, Livewire, or asset surface impact.
Validation Commands
Executed during final review and finding fix loop:
cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Unit/Support/Resources/ResourceIdentityTest.php tests/Unit/Support/Resources/ProviderResourceDescriptorTest.php tests/Unit/Support/Baselines/BaselineSubjectKeyCanonicalIdentityTest.php
Result: passed, 5 tests / 45 assertions.
cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/ProviderResources/ProviderResourceBindingServiceTest.php tests/Feature/ProviderResources/ProviderResourceBindingAuthorizationTest.php
Result after finding fix: passed, 19 tests / 72 assertions.
cd apps/platform && ./vendor/bin/sail php vendor/bin/pest -c phpunit.pgsql.xml tests/Feature/ProviderResources/ProviderResourceBindingPostgresTest.php
Result: passed, 4 tests / 7 assertions.
cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Baselines/BaselineCompareProviderResourceBindingNoOpTest.php tests/Feature/Baselines/BaselineCompareGapClassificationTest.php tests/Feature/Evidence/BaselineDriftPostureSourceTest.php tests/Feature/ReviewPack/Spec349ReviewPackResolutionGuidanceTest.php
Result: passed, 11 tests / 83 assertions.
cd apps/platform && ./vendor/bin/sail bin pint --dirty --test --format agent
Result: passed.
git diff --check
Result: passed.
Deployment Impact
- Additive migration only:
provider_resource_bindings. - Staging must run the migration and the PostgreSQL lane before Production promotion.
- No environment variable, queue, scheduler, storage, reverse-proxy, or asset change is required.
- Rollback before follow-up specs consume the table is dropping the new table. After follow-up specs consume bindings, rollback must be redesigned.
Residual Risks / Follow-Up
No confirmed in-scope findings remain after the final fix loop.
Follow-up specs remain as planned:
- Spec 382: matching pipeline consumption.
- Spec 384: operator resolution UI and destructive/high-impact UI confirmations.
- Spec 385: evidence/review readiness consumption.