## Summary - amend the operator UI constitution and related SpecKit templates for the new UI/UX governance rules - add Spec 168 artifacts plus the tenant governance aggregate implementation used by the tenant dashboard, banner, and baseline compare landing surfaces - normalize Filament action surfaces around clickable-row inspection, grouped secondary actions, and explicit action-surface declarations across enrolled resources and pages - fix post-suite regressions in membership cache priming, finding workflow state refresh, tenant review derived-state invalidation, and tenant-bound backup-set related navigation ## Commit Series - `docs: amend operator UI constitution` - `spec: add tenant governance aggregate contract` - `feat: add tenant governance aggregate contract` - `refactor: normalize filament action surfaces` - `fix: resolve post-suite state regressions` ## Testing - `vendor/bin/sail artisan test --compact` - Result: `3176 passed, 8 skipped (17384 assertions)` ## Notes - Livewire v4 / Filament v5 stack remains unchanged - no provider registration changes; `bootstrap/providers.php` remains the relevant location - no new global-search resources or asset-registration changes in this branch Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #199
4.5 KiB
4.5 KiB
Quickstart: Tenant Governance Aggregate Contract
Goal
Validate that one derived tenant-governance aggregate now drives the shared summary posture across the tenant dashboard, the tenant governance banner, and the Baseline Compare landing without adding persistence or reintroducing local findings-count ownership.
Prerequisites
- Start Sail.
- Ensure a tenant exists with an assigned baseline profile and a consumable snapshot.
- Seed compare-run scenarios for: no result yet, compare in progress, compare failed, trustworthy no-drift, stale no-drift, overdue findings without new drift, and lapsed governance without new drift.
- Ensure the current user is a tenant member with access to the tenant dashboard and Baseline Compare landing.
Implementation Validation Order
1. Run low-level compare and aggregate coverage
vendor/bin/sail artisan test --compact tests/Feature/Baselines/BaselineCompareStatsTest.php
vendor/bin/sail artisan test --compact tests/Feature/Baselines/BaselineCompareSummaryAssessmentTest.php
vendor/bin/sail artisan test --compact --filter=TenantGovernanceAggregate
Expected outcome:
- Existing compare truth still resolves the same availability and posture states.
- The new aggregate contract maps those states into one stable summary object without introducing a second query-backed truth path.
2. Run focused cross-surface parity coverage
vendor/bin/sail artisan test --compact tests/Feature/Filament/BaselineCompareSummaryConsistencyTest.php
vendor/bin/sail artisan test --compact tests/Feature/Filament/NeedsAttentionWidgetTest.php
vendor/bin/sail artisan test --compact tests/Feature/Filament/BaselineCompareNowWidgetTest.php
vendor/bin/sail artisan test --compact tests/Feature/Filament/BaselineCompareCoverageBannerTest.php
vendor/bin/sail artisan test --compact tests/Feature/Filament/BaselineCompareLandingAdminTenantParityTest.php
vendor/bin/sail artisan test --compact tests/Feature/Filament/BaselineCompareLandingDuplicateNamesBannerTest.php
vendor/bin/sail artisan test --compact tests/Feature/Filament/BaselineCompareLandingRbacLabelsTest.php
vendor/bin/sail artisan test --compact tests/Feature/Filament/BaselineCompareLandingStartSurfaceTest.php
vendor/bin/sail artisan test --compact tests/Feature/Filament/BaselineCompareLandingWhyNoFindingsTest.php
Expected outcome:
NeedsAttention,BaselineCompareNow,BaselineCompareCoverageBanner, and the landing summary agree on posture family, headline, and next-action intent for the same tenant state.- A tenant with zero visible drift but overdue or unhealthy governance still renders as action-needed on every covered surface.
- The landing keeps
Compare nowconfirmation and capability gating unchanged, and diagnostics remain clearly secondary to the shared summary posture.
3. Run request-local reuse and guard coverage
vendor/bin/sail artisan test --compact --filter=TenantGovernanceAggregateMemoization
vendor/bin/sail artisan test --compact tests/Feature/Guards/DerivedStateConsumerAdoptionGuardTest.php
Expected outcome:
- One request stores one governance aggregate per tenant scope.
- Covered surfaces do not fall back to widget-local ad hoc caches or repeated local findings queries.
4. Format touched implementation files
vendor/bin/sail bin pint --dirty --format agent
Expected outcome:
- All touched implementation files conform to the repo’s Pint rules.
Manual Smoke Check
- Open
/admin/t/{tenant}for a tenant with lapsed governance and no new drift findings. - Confirm the dashboard
Needs Attentionwidget andBaseline Governancecard both show action-needed posture. - Open
/admin/t/{tenant}/baseline-compare-landingand confirm the landing summary agrees with the dashboard posture while still showing deeper diagnostics below. - Use a tenant with a trustworthy no-drift result and confirm the banner hides, the dashboard falls back to healthy checks, and the landing summary presents the same all-clear posture.
- Use a tenant with a queued or running compare and confirm dashboard, banner, and landing all present progress-aware follow-up instead of stale “all clear” messaging.
- Switch from one tenant to another and confirm the second tenant does not reuse the first tenant’s summary posture.
Non-Goals For This Slice
- No database migration.
- No new Graph call or provider-contract work.
- No new assets or Filament panel registration change.
- No new mutation surface beyond the existing
Compare nowaction, which remains unchanged.