Added ProviderResourceBinding model, migrations, policies, and supporting framework for canonical resource identity mapping as defined in Spec 381.
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.