# Quickstart: Operations Tenantless Canonical Migration **Feature**: 078-operations-tenantless-canonical **Branch**: `078-operations-tenantless-canonical` --- ## Prerequisites - Laravel Sail running (`vendor/bin/sail up -d`) - Database migrated (`vendor/bin/sail artisan migrate`) - At least one workspace with a user member - At least one `OperationRun` record (with and without `tenant_id`) ## Verification Steps ### 1. Canonical detail renders ```bash # Visit as authenticated workspace member # URL: /admin/operations/{run_id} # Expected: Full infolist renders (summary, target scope, verification report, counts, context JSON) ``` ### 2. Auto-generated tenant routes are gone ```bash vendor/bin/sail artisan route:list --name=filament.admin.resources.operations # Expected: No routes listed (empty output) ``` ### 3. Canonical list still works ```bash # Visit: /admin/operations # Expected: Workspace-scoped table with status tabs, filters ``` ### 4. Run tests ```bash # Run the focused test pack for this spec: vendor/bin/sail artisan test --compact \ tests/Feature/Operations/TenantlessOperationRunViewerTest.php \ tests/Feature/Monitoring/OperationsCanonicalUrlsTest.php \ tests/Feature/Monitoring/OperationsTenantScopeTest.php \ tests/Feature/Verification/VerificationAuthorizationTest.php \ tests/Feature/OpsUx/FailureSanitizationTest.php \ tests/Feature/OpsUx/CanonicalViewRunLinksTest.php \ tests/Feature/Verification/VerificationDbOnlyTest.php \ tests/Feature/Verification/VerificationReportRenderingTest.php # Expected: All pass ``` ### 5. Pint formatting ```bash vendor/bin/sail bin pint --dirty ``` ## Key Files to Inspect | File | What to check | |------|---------------| | `app/Filament/Resources/OperationRunResource.php` | `getPages()` returns `[]` | | `app/Filament/Pages/Operations/TenantlessOperationRunViewer.php` | Uses schema-based infolist, has related links header | | `app/Filament/Widgets/Operations/OperationsKpiHeader.php` | Returns empty stats when no tenant context | | `app/Filament/Pages/Monitoring/Operations.php` | Unchanged — still reuses `OperationRunResource::table()` | ## What Was Deleted | File | Why | |------|-----| | `app/Filament/Resources/OperationRunResource/Pages/ViewOperationRun.php` | Replaced by TenantlessOperationRunViewer | | `app/Filament/Resources/OperationRunResource/Pages/ListOperationRuns.php` | Replaced by Operations.php | | `app/Livewire/Monitoring/OperationsDetail.php` | Dead code | | `resources/views/livewire/monitoring/operations-detail.blade.php` | Dead code |