## Summary - enforce the canonical workspace/environment scope contract for workspace hubs and environment-owned surfaces - replace first-party Operations deep links that leaked Filament `tableFilters[...]` internals with stable product-level query behavior - add the sidebar scope indicator and split environment-page navigation into explicit `Workspace-wide` and `Workspace admin` groups - remove redundant tenantless `All environments` scope badges from workspace-wide pages while preserving explicit environment filter affordances - include the Spec 338 artifacts, guard tests, and browser smoke coverage for the new contract ## Validation - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Navigation/Spec338EnvironmentSidebarSeparationTest.php tests/Feature/Navigation/Spec338OperationRunLinksQueryContractTest.php tests/Feature/Navigation/Spec338SidebarScopeIndicatorTest.php tests/Feature/Filament/PanelNavigationSegregationTest.php` - `cd apps/platform && ./vendor/bin/sail php vendor/bin/pest tests/Browser/Spec338ScopeContractSmokeTest.php --compact` ## Notes - Livewire v4 compliance unchanged - Filament provider registration remains in `bootstrap/providers.php` - no destructive action behavior changed - no migrations, env var changes, or new Filament asset registration Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #409
122 lines
7.7 KiB
Markdown
122 lines
7.7 KiB
Markdown
# Tasks: Spec 338 - Workspace / Environment Resource Scope Contract
|
|
|
|
- Input: `specs/338-workspace-environment-resource-scope-contract/spec.md`, `specs/338-workspace-environment-resource-scope-contract/plan.md`
|
|
- Preparation status: implemented + validated.
|
|
|
|
**Tests**: Required. This spec changes canonical link/query contract semantics for operator-facing hubs.
|
|
|
|
## Test Governance Checklist
|
|
|
|
- [x] Lane assignment remains explicit and narrowest sufficient (Feature + optional Browser smoke).
|
|
- [x] No new default-heavy helpers/factories/seeds are introduced.
|
|
- [x] Contract changes are guarded by deterministic tests before refactors.
|
|
- [x] Any exception resolves as `document-in-feature`, `follow-up-spec`, or `reject-or-split`.
|
|
|
|
## Phase 1: Preparation And Repo Truth (blocks runtime changes)
|
|
|
|
**Purpose**: Confirm repo truth and lock the current contract seams before changing runtime behavior.
|
|
|
|
- [x] T001 Re-read `spec.md` + `plan.md` + this `tasks.md`.
|
|
- [x] T002 Confirm working tree intent and record baseline commit (`git status`, `git log -1`).
|
|
- [x] T003 Re-verify dependency specs as context only (do not reopen them):
|
|
- `specs/311-workspace-environment-surface-scope-contract/` (implemented)
|
|
- `specs/320-workspace-owned-analysis-surface-registration-shell-cutover/` (completed)
|
|
- `specs/322-browser-no-drift-regression-guard/` (guard posture)
|
|
- [x] T004 Inspect the confirmed helper seams:
|
|
- `apps/platform/app/Support/OperationRunLinks.php` (currently emits `tableFilters[type][value]` for `operationType`)
|
|
- `apps/platform/app/Support/Navigation/CanonicalNavigationContext.php` (`toQuery()` behavior)
|
|
- `apps/platform/app/Support/Navigation/RelatedNavigationResolver.php` (filter payload injection)
|
|
- `apps/platform/app/Filament/Pages/Monitoring/Operations.php` (query parsing + filter handling)
|
|
- `apps/platform/app/Http/Controllers/ClearEnvironmentContextController.php` (`/admin/evidence/*` special casing)
|
|
- `apps/platform/app/Support/Navigation/AdminSurfaceScope.php` (evidence path classification)
|
|
- `apps/platform/routes/web.php` (`/admin/evidence/overview`, operations routes)
|
|
- [x] T005 Inspect existing guard tests that already encode parts of the contract:
|
|
- `apps/platform/tests/Feature/Navigation/Spec322LegacyQueryAliasGuardTest.php`
|
|
- `apps/platform/tests/Feature/Navigation/WorkspaceHubEnvironmentFilterContractTest.php`
|
|
- `apps/platform/tests/Unit/Tenants/AdminSurfaceScopeTest.php`
|
|
|
|
## Phase 2: Add failing contract tests first
|
|
|
|
**Purpose**: Make contract changes reviewable and regression-proof.
|
|
|
|
- [x] T006 Add a new Spec 338 contract test for `OperationRunLinks::index(..., operationType: ...)`:
|
|
- asserts the generated URL does not contain `tableFilters`
|
|
- asserts operation type deep-linking uses `operation_type` **or** is intentionally not supported
|
|
- [x] T007 Add/extend tests ensuring environment filtering remains canonical:
|
|
- `environment_id` works for Operations hub filtering
|
|
- legacy aliases remain ignored (no regression vs Spec 322)
|
|
- [x] T008 Add/extend Evidence scope tests:
|
|
- Evidence Overview is workspace hub (`/admin/evidence/overview`)
|
|
- `/admin/evidence/*` special casing is either removed as stale or explicitly covered by a route-inventory-backed test
|
|
|
|
## Phase 3: Implement OperationRunLinks query contract
|
|
|
|
**Purpose**: Remove Filament internals from first-party helper outputs.
|
|
|
|
- [x] T009 Update `apps/platform/app/Support/OperationRunLinks.php` so `operationType` does not emit `tableFilters[type][value]`.
|
|
- [x] T010 Decide and implement one of:
|
|
- Map `operation_type` query to internal table state in `apps/platform/app/Filament/Pages/Monitoring/Operations.php`, or
|
|
- Remove operation type deep-linking and keep only environment filtering + tabs/problem classes.
|
|
- [x] T011 Update any call sites that depended on helper-emitted `tableFilters` and make them use the new canonical key (or drop the feature).
|
|
|
|
## Phase 4: Navigation context payload hygiene
|
|
|
|
**Purpose**: Stop emitting legacy alias filters in navigation contexts.
|
|
|
|
- [x] T012 Audit `CanonicalNavigationContext` usage where `filterPayload` includes `tableFilters[managed_environment_id]` and confirm whether it is still needed.
|
|
- [x] T013 Update call sites (e.g. `RelatedNavigationResolver`) to avoid injecting legacy alias filters when linking to workspace hubs; use `environment_id` where filter intent exists.
|
|
- [x] T014 Ensure no first-party helper emits legacy query aliases for hub filtering (`tenant`, `tenant_id`, `managed_environment_id`, `tenant_scope`, `tableFilters`) as canonical contract.
|
|
|
|
## Phase 5: Evidence scope special casing cleanup
|
|
|
|
**Purpose**: Reduce ambiguity and stale branching.
|
|
|
|
- [x] T015 Confirm whether any `/admin/evidence/*` non-overview route family is real and reachable on current branch:
|
|
- if not real: remove/neutralize stale handling in `ClearEnvironmentContextController` and `AdminSurfaceScope`
|
|
- if real: document intent in Spec 338 and add explicit tests proving the contract
|
|
- [x] T016 Ensure Evidence Overview remains a workspace hub and accepts only explicit `environment_id` filtering.
|
|
|
|
## Phase 6: Regression posture (baseline ownership)
|
|
|
|
**Purpose**: Ensure Spec 320 baseline ownership/navigation remains stable.
|
|
|
|
- [x] T017 Confirm existing baseline ownership tests remain green (no new baseline work unless regression is proven):
|
|
- `apps/platform/tests/Feature/Baselines/BaselineProfileWorkspaceOwnershipTest.php`
|
|
- any Spec 320/322 smoke coverage already in repo
|
|
|
|
## Phase 7: Optional browser smoke (only if navigation presentation changes)
|
|
|
|
- [x] T018 Add a minimal browser smoke test `apps/platform/tests/Browser/Spec338ScopeContractSmokeTest.php` covering:
|
|
- environment → operations filtered link uses `environment_id`
|
|
- clearing environment context from an evidence page returns to Evidence Overview hub without ambiguous redirects
|
|
|
|
## Phase 8: Validation
|
|
|
|
- [x] T021 Add the sidebar scope identity indicator requested during browser review:
|
|
- workspace-owned pages show Workspace scope + active workspace without a negative “no environment selected” topbar or picker status
|
|
- environment-owned pages show Environment scope + active environment + containing workspace
|
|
- use Filament render hooks rather than publishing internal sidebar views
|
|
- [x] T022 Split environment sidebar IA for workspace-owned links:
|
|
- workspace-wide hub entries move into a separate `Workspace-wide` group on environment pages
|
|
- workspace configuration/admin entries move into `Workspace admin`
|
|
- supported hub links carry explicit `environment_id`; clean workspace/admin links remain unfiltered
|
|
- [x] T023 Remove the redundant “Choose environment” CTA from the Managed Environments registry:
|
|
- environment cards remain the entry/open affordance
|
|
- supporting actions stay limited to Add Environment and Switch Workspace
|
|
- `/admin/choose-environment` remains the dedicated fast context-switch surface
|
|
- [x] T024 Remove generic tenantless “All environments” badges from workspace-wide pages:
|
|
- header scope actions are omitted when no concrete environment context exists
|
|
- explicit `environment_id` filters remain visible through filter banners/table chips
|
|
- [x] T019 Run narrow tests first:
|
|
- `cd apps/platform && ./vendor/bin/sail artisan test --compact <new/updated Spec 338 tests>`
|
|
- [x] T020 Run formatting and patch checks:
|
|
- `cd apps/platform && ./vendor/bin/sail pint --dirty --format agent`
|
|
- `git diff --check`
|
|
|
|
## Explicit Non-Goals
|
|
|
|
- [x] NT001 Do not add migrations, new tables, or persisted truth.
|
|
- [x] NT002 Do not restructure route families; keep canonical workspace/environment routes.
|
|
- [x] NT003 Do not introduce a new navigation taxonomy framework; reuse existing `AdminSurfaceScope` / hub registry seams.
|
|
- [x] NT004 Do not change destructive action behavior (confirmation/authorization/audit).
|