## Summary - replace the remaining workspace overview tenant-first copy with environment-first wording in the builder, Blade view, and focused feature assertions - add the Spec 299 workspace overview browser smoke and the final cutover audit documenting fixed copy, clean runtime scans, and allowed internal/provider/regression-guard `Tenant` references - add the Spec 299 spec package (`spec.md`, `plan.md`, `tasks.md`, checklist, audit) to close the managed-environment cutover with an explicit final seal decision ## Validation - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Filament/WorkspaceOverviewContentTest.php tests/Feature/Filament/AdminHomeRedirectsToChooseTenantWhenWorkspaceSelectedTest.php tests/Feature/Filament/WorkspaceOverviewEmptyStatesTest.php` - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Guards/NoLegacyTenantPanelRuntimeTest.php tests/Feature/Guards/NoActiveTenantResourceRoutesTest.php tests/Feature/Guards/ManagedEnvironmentCanonicalRouteContractTest.php tests/Feature/Filament/PanelNavigationSegregationTest.php tests/Feature/Workspaces/WorkspaceIntendedUrlLegacyRejectionTest.php tests/Feature/ProviderConnections/LegacyRedirectTest.php tests/Feature/ManagedEnvironment/LegacyTenantCoreGuardTest.php tests/Feature/Spec080WorkspaceManagedTenantAdminMigrationTest.php tests/Feature/Filament/ManagedEnvironmentAccessScopeManagementTest.php tests/Feature/Rbac/ProviderConnectionWorkspaceFirstPolicyTest.php` - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Guards` - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Workspaces` - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/ProviderConnections` - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/RequiredPermissions` - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Filament` - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Browser/Spec299WorkspaceOverviewCutoverSealSmokeTest.php` - `cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent` - `git diff --check` ## Notes - Filament remains on Livewire v4. - Provider registration remains in `apps/platform/bootstrap/providers.php`. - No new panel provider or asset-strategy changes are included. - Remaining technical `Tenant` references are documented in `specs/299-managed-environment-cutover-final-seal/final-cutover-audit.md`. Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #354
129 lines
16 KiB
Markdown
129 lines
16 KiB
Markdown
# Final Cutover Audit: Managed Environment Cutover Final Seal & Regression Guard Pack
|
|
|
|
**Feature**: `299-managed-environment-cutover-final-seal`
|
|
**Created**: 2026-05-13
|
|
**Status**: Final implementation complete. Decision: `merge-ready with documented allowed internal Tenant references`.
|
|
|
|
## Categories
|
|
|
|
| Category | Meaning |
|
|
|---|---|
|
|
| `clean-baseline` | Prep-time scans found no active runtime legacy hit in the named surface. |
|
|
| `fixed` | The implementation replaced or removed the old cutover drift. |
|
|
| `allowed-provider-term` | The wording describes external Microsoft/Entra provider truth and may remain. |
|
|
| `allowed-internal-model` | The term is an internal model/class/table/column/resource name; structural rename is out of scope. |
|
|
| `allowed-historical` | The term appears in historical specs/docs/audit history that this spec does not rewrite. |
|
|
| `allowed-regression-guard` | The term is kept only as a forbidden legacy pattern or negative assertion inside a guard test. |
|
|
| `needs-follow-up` | The prep baseline found a real seam that 299 must classify or fix during implementation. |
|
|
| `blocked-runtime-finding` | The final implementation found an active runtime legacy seam that blocks merge. |
|
|
|
|
## Preparation Baseline Evidence
|
|
|
|
These entries reflect the repo evidence gathered during Spec 299 preparation before application code was edited.
|
|
|
|
| Evidence | Result | Decision |
|
|
|---|---|---|
|
|
| Focused runtime legacy scan over `apps/platform/{app,resources,routes}/**` for `TenantPanelProvider`, retired tenant panel IDs, `/admin/t`, `/admin/tenants`, retired runtime URL generators, and `setTenantPanelContext` | No matches found in the runtime app/resources/routes tree. | Runtime baseline is clean; re-prove with route list and final scans during implementation. |
|
|
| File search for `apps/platform/**/TenantPanelProvider.php` | No file found. | Keep tenant panel provider absent. |
|
|
| Focused provider/copy scan for `tenant scope`, `Microsoft tenant`, `Entra tenant`, `Accessible tenants`, `No accessible tenants`, and `affected tenants` | 13 matches found across workspace overview, provider capability/identity wording, support diagnostics, onboarding technical details, and operations viewer copy. | Separate active product copy from allowed provider or support/raw wording. |
|
|
| Focused test scan for `TenantResource::getUrl`, `TenantDashboard::getUrl`, `TenantRequiredPermissions::getUrl`, `setTenantPanelContext`, `/admin/t/`, and `/admin/tenants` under `apps/platform/tests/**` | More than 100 matches found across auth, RBAC, workspaces, guards, provider-connections, and browser tests. | 299 must classify test references instead of trying to erase all technical legacy terms blindly. |
|
|
| Targeted file reads of canonical owners | `ManagedEnvironmentLinks`, `WorkspaceIntendedUrl`, `WorkspaceRedirectResolver`, `AdminPanelProvider`, `PanelNavigationSegregationTest`, and `WorkspaceOverviewBuilder` are the current repo-real owners. | Reuse these owners; do not invent a new cutover framework. |
|
|
|
|
## Active Runtime Legacy Findings
|
|
|
|
| Pattern | File / Surface | Category | Decision | Reason |
|
|
|---|---|---|---|---|
|
|
| Retired tenant runtime patterns: `TenantPanelProvider`, retired panel IDs, `/admin/t/...`, `/admin/tenants/...`, retired runtime URL generators, `setTenantPanelContext()` | `apps/platform/app/**`, `apps/platform/resources/**`, `apps/platform/routes/**` | clean-baseline | keep clean and revalidate | The prep runtime scan found no direct matches in the runtime tree. |
|
|
| Retired tenant panel provider file | `apps/platform/**/TenantPanelProvider.php` | clean-baseline | keep absent | File search returned no `TenantPanelProvider.php`. |
|
|
| Canonical environment link ownership | `apps/platform/app/Support/ManagedEnvironmentLinks.php` | clean-baseline | re-prove | The repo already has a canonical environment link helper; 299 must ensure no live seam bypasses it. |
|
|
| Retired intended-URL rejection and workspace-operations normalization | `apps/platform/app/Support/Workspaces/WorkspaceIntendedUrl.php`, `apps/platform/app/Support/Workspaces/WorkspaceRedirectResolver.php` | clean-baseline | re-prove | Current code already rejects retired tenant paths and normalizes workspace operations; the final seal must keep that contract explicit. |
|
|
| Workspace-vs-environment navigation ownership | `apps/platform/app/Providers/Filament/AdminPanelProvider.php`, affected `apps/platform/app/Filament/**`, `apps/platform/tests/Feature/Filament/PanelNavigationSegregationTest.php` | clean-baseline | proved | `PanelNavigationSegregationTest.php` passed as part of the focused proof pack and the full Filament lane; no navigation leak was reproduced. |
|
|
|
|
## Test Legacy Findings
|
|
|
|
| Pattern | File / Surface | Category | Decision | Reason |
|
|
|---|---|---|---|---|
|
|
| `setTenantPanelContext` forbidden-pattern literals | `apps/platform/tests/Feature/Guards/Spec288NoLegacyRouteAndHelperGuardTest.php` | allowed-regression-guard | keep | These strings are allowed only as explicit guard literals preventing reintroduction of the retired helper. |
|
|
| Retired-path negative assertions such as `/admin/t/...` and `/admin/tenants/...` | `apps/platform/tests/Feature/078/**`, `apps/platform/tests/Feature/ProviderConnections/LegacyRedirectTest.php`, `apps/platform/tests/Feature/Workspaces/WorkspaceIntendedUrlLegacyRejectionTest.php`, `apps/platform/tests/Browser/Spec282GovernanceArtifactRetargetingSmokeTest.php` | allowed-regression-guard | keep | These assertions are part of the negative regression contract and must remain explicit. |
|
|
| Broad `TenantDashboard::getUrl(...)` usage | Representative files include `apps/platform/tests/Feature/Auth/AdminLocalSmokeLoginTest.php`, `apps/platform/tests/Feature/Workspaces/ManagedTenantsWorkspaceRoutingTest.php`, `apps/platform/tests/Feature/Rbac/TenantDashboardArrivalContextVisibilityTest.php`, `apps/platform/tests/Feature/Filament/WorkspaceOverviewPermissionVisibilityTest.php` | allowed-internal-model | keep | These remain test references to the current technical page owner for canonical environment routes. Focused route scans and guard tests prove they do not revive `/admin/t...` or `/admin/tenants...`. |
|
|
| Broad `TenantResource::getUrl(...)` usage | Representative files include `apps/platform/tests/Feature/Rbac/TenantResourceAuthorizationTest.php`, `apps/platform/tests/Feature/RequiredPermissions/RequiredPermissionsLinksTest.php`, `apps/platform/tests/Feature/Filament/WorkspaceOnlySurfaceTenantIndependenceTest.php`, `apps/platform/tests/Browser/Spec192RecordPageHeaderDisciplineSmokeTest.php`, `apps/platform/tests/Feature/Guards/ManagedEnvironmentCanonicalRouteContractTest.php` | allowed-internal-model | keep | These remain test references to the current technical resource owner and route-generation contract. `ManagedEnvironmentCanonicalRouteContractTest.php` and the runtime scan prove generated URLs stay canonical. |
|
|
|
|
## Copy Findings
|
|
|
|
| Pattern | File | Category | Decision | Reason |
|
|
|---|---|---|---|---|
|
|
| `Accessible tenants` | `apps/platform/app/Support/Workspaces/WorkspaceOverviewBuilder.php` | fixed | replaced with `Accessible environments` | This active workspace-overview product copy is now environment-first and covered by Feature and Browser assertions. |
|
|
| `No accessible tenants in this workspace` | `apps/platform/app/Support/Workspaces/WorkspaceOverviewBuilder.php` | fixed | replaced with `No accessible environments in this workspace` | This active workspace empty-state title is now environment-first and covered by Feature and Browser assertions. |
|
|
| `Governance risk counts affected tenants` | `apps/platform/resources/views/filament/pages/workspace-overview.blade.php` | fixed | replaced with `Governance risk counts affected environments` | This active workspace-overview helper copy is now environment-first and covered by Feature and Browser assertions. |
|
|
| Other workspace-overview tenant-first helper copy (`entitled tenants`, `visible tenants`, `tenant dashboard`, `for this tenant`, `working in a tenant`) | `apps/platform/app/Support/Workspaces/WorkspaceOverviewBuilder.php`, `apps/platform/resources/views/filament/pages/workspace-overview.blade.php` | fixed | replaced with environment-first wording | These strings were in the same touched active workspace-overview surface, so they were fixed in scope rather than merely classified. |
|
|
| `Provider connection is missing target tenant scope.`, `Microsoft tenant ID`, `The selected provider connection points to a different Microsoft tenant than the current scope.`, provider-owned Microsoft tenant detail helper text | `apps/platform/app/Services/Providers/PlatformProviderIdentityResolver.php`, `apps/platform/app/Support/Providers/TargetScope/ProviderIdentityContextMetadata.php`, `apps/platform/app/Support/Providers/ProviderReasonTranslator.php`, `apps/platform/app/Filament/Pages/Workspaces/ManagedTenantOnboardingWizard.php`, `apps/platform/app/Filament/Resources/ProviderConnectionResource.php` | allowed-provider-term | keep | These strings describe external provider truth and are not generic workspace/environment product labels. |
|
|
| `Provider capability could not be evaluated because the tenant scope is unavailable.`, `Workspace and tenant scope resolved before support diagnostics were composed.`, `The current workspace or tenant scope remains visible without behaving like a primary task action.` | `apps/platform/app/Support/Providers/Capabilities/ProviderCapabilityEvaluator.php`, `apps/platform/app/Support/SupportDiagnostics/SupportDiagnosticBundleBuilder.php`, `apps/platform/app/Filament/Pages/Operations/TenantlessOperationRunViewer.php` | allowed-provider-term / allowed-internal-model | keep | These are provider capability, support diagnostics, or scope-debug explanatory strings, not primary workspace-overview product copy. |
|
|
| `Scope (Entra tenant)` | `apps/platform/resources/views/filament/modals/onboarding-verification-technical-details.blade.php` | allowed-provider-term | keep | This is provider-specific onboarding technical detail, not generic platform terminology. |
|
|
|
|
## Allowed References
|
|
|
|
| Reference Family | Example Files | Category | Why Allowed |
|
|
|---|---|---|---|
|
|
| Microsoft/Entra tenant identity and target-scope wording | `apps/platform/app/Support/Providers/TargetScope/ProviderIdentityContextMetadata.php`, `apps/platform/app/Filament/Resources/ProviderConnectionResource.php`, `apps/platform/app/Filament/Pages/Workspaces/ManagedTenantOnboardingWizard.php` | allowed-provider-term | The external provider is the subject. |
|
|
| Technical `Tenant*` model/class/resource names and DB columns | `apps/platform/app/**`, `apps/platform/tests/**` where structural owners remain | allowed-internal-model | DB/model/resource rename is out of scope for Spec 299. |
|
|
| Historical spec names and archived decisions | `specs/**`, `.specify/**`, historical docs | allowed-historical | 299 is a final seal package, not a history rewrite. |
|
|
| Explicit forbidden-pattern literals and negative-path assertions | `apps/platform/tests/Feature/Guards/**`, `apps/platform/tests/Feature/Workspaces/WorkspaceIntendedUrlLegacyRejectionTest.php`, `apps/platform/tests/Feature/ProviderConnections/LegacyRedirectTest.php`, `apps/platform/tests/Browser/Spec282GovernanceArtifactRetargetingSmokeTest.php` | allowed-regression-guard | These references exist specifically to keep retired tenant behavior dead. |
|
|
|
|
## Final Route / Source Scan Results
|
|
|
|
Final implementation results must be recorded here before close-out.
|
|
|
|
| Command | Result | Decision |
|
|
|---|---|---|
|
|
| `cd apps/platform && ./vendor/bin/sail artisan route:list | rg "admin/t|admin/tenants|workspaces/.*/environments|operations|provider-connections|required-permissions"` | Returned canonical `admin/workspaces/{workspace}/environments...`, provider-connections, required-permissions, and workspace operations routes; no active `/admin/t...` or `/admin/tenants...` route was returned. | clean |
|
|
| `cd apps/platform && rg "TenantPanelProvider|panel:\s*'tenant'|panel:\s*\"tenant\"|/admin/t/|/admin/tenants|filament\.admin\.resources\.tenants|TenantResource::getUrl|TenantDashboard::getUrl|TenantRequiredPermissions::getUrl|setTenantPanelContext" app resources routes --glob '!vendor' --glob '!node_modules'` | No matches. | clean |
|
|
| `cd apps/platform && rg "TenantResource::getUrl|TenantDashboard::getUrl|TenantRequiredPermissions::getUrl|setTenantPanelContext|/admin/t/|/admin/tenants" tests --glob '!vendor' --glob '!node_modules'` | Matches remain in technical tests, browser smokes, and guard/negative-route assertions only. | allowed-internal-model / allowed-regression-guard |
|
|
| `cd apps/platform && rg "tenant scope|Microsoft tenant|Entra tenant|Accessible tenants|No accessible tenants|affected tenants" app resources lang tests --glob '!vendor' --glob '!node_modules'` | Active workspace-overview copy was fixed; old workspace-overview phrases now appear only in negative assertions. Provider/support/test scope terms remain allowlisted. | fixed + allowlisted |
|
|
|
|
## Actual Validation Results
|
|
|
|
| Command | Result |
|
|
|---|---|
|
|
| `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Filament/WorkspaceOverviewContentTest.php tests/Feature/Filament/AdminHomeRedirectsToChooseTenantWhenWorkspaceSelectedTest.php tests/Feature/Filament/WorkspaceOverviewEmptyStatesTest.php` | passed: 9 tests, 59 assertions |
|
|
| `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Guards/NoLegacyTenantPanelRuntimeTest.php tests/Feature/Guards/NoActiveTenantResourceRoutesTest.php tests/Feature/Guards/ManagedEnvironmentCanonicalRouteContractTest.php tests/Feature/Filament/PanelNavigationSegregationTest.php tests/Feature/Workspaces/WorkspaceIntendedUrlLegacyRejectionTest.php tests/Feature/ProviderConnections/LegacyRedirectTest.php tests/Feature/ManagedEnvironment/LegacyTenantCoreGuardTest.php tests/Feature/Spec080WorkspaceManagedTenantAdminMigrationTest.php tests/Feature/Filament/ManagedEnvironmentAccessScopeManagementTest.php tests/Feature/Rbac/ProviderConnectionWorkspaceFirstPolicyTest.php` | passed: 72 tests, 232 assertions |
|
|
| `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Guards` | passed: 265 tests, 4,705 assertions |
|
|
| `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Workspaces` | passed: 96 tests, 276 assertions |
|
|
| `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/ProviderConnections` | passed: 78 tests, 588 assertions |
|
|
| `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/RequiredPermissions` | passed: 21 tests, 82 assertions |
|
|
| `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Filament` | passed: 773 tests, 5 skipped, 5,017 assertions |
|
|
| `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Browser/Spec299WorkspaceOverviewCutoverSealSmokeTest.php` | passed: 1 browser smoke test, 9 assertions |
|
|
| `cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent` | passed |
|
|
| `git diff --check` | passed |
|
|
|
|
## Planned Validation Commands
|
|
|
|
```bash
|
|
cd apps/platform
|
|
|
|
./vendor/bin/sail artisan test --compact \
|
|
tests/Feature/Guards/NoLegacyTenantPanelRuntimeTest.php \
|
|
tests/Feature/Guards/ManagedEnvironmentCanonicalRouteContractTest.php \
|
|
tests/Feature/Guards/NoActiveTenantResourceRoutesTest.php \
|
|
tests/Feature/Filament/PanelNavigationSegregationTest.php \
|
|
tests/Feature/Workspaces/WorkspaceIntendedUrlLegacyRejectionTest.php
|
|
|
|
./vendor/bin/sail artisan test --compact tests/Feature/Guards
|
|
./vendor/bin/sail artisan test --compact tests/Feature/Workspaces
|
|
./vendor/bin/sail artisan test --compact tests/Feature/ProviderConnections
|
|
./vendor/bin/sail artisan test --compact tests/Feature/RequiredPermissions
|
|
./vendor/bin/sail artisan test --compact tests/Feature/Filament
|
|
|
|
./vendor/bin/sail artisan test --compact \
|
|
tests/Browser/Spec281ProviderConnectionScopeSmokeTest.php \
|
|
tests/Browser/Spec285WorkspaceRbacEnvironmentAccessSmokeTest.php \
|
|
tests/Browser/Dashboard/TenantDashboardProductizationSmokeTest.php \
|
|
tests/Browser/Spec192RecordPageHeaderDisciplineSmokeTest.php
|
|
|
|
./vendor/bin/sail bin pint --dirty --format agent
|
|
git diff --check
|
|
```
|
|
|
|
## Final Decision
|
|
|
|
`merge-ready with documented allowed internal Tenant references`
|