TenantAtlas/specs/168-tenant-governance-aggregate-contract/quickstart.md
ahmido 807d574d31 feat: add tenant governance aggregate contract and action surface follow-ups (#199)
## 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
2026-03-29 21:14:17 +00:00

4.5 KiB
Raw Blame History

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

  1. Start Sail.
  2. Ensure a tenant exists with an assigned baseline profile and a consumable snapshot.
  3. 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.
  4. 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 now confirmation 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 repos Pint rules.

Manual Smoke Check

  1. Open /admin/t/{tenant} for a tenant with lapsed governance and no new drift findings.
  2. Confirm the dashboard Needs Attention widget and Baseline Governance card both show action-needed posture.
  3. Open /admin/t/{tenant}/baseline-compare-landing and confirm the landing summary agrees with the dashboard posture while still showing deeper diagnostics below.
  4. 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.
  5. 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.
  6. Switch from one tenant to another and confirm the second tenant does not reuse the first tenants 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 now action, which remains unchanged.