## Summary - align operator-visible OperationRun terminology to canonical `Operations` / `Operation` labels across shared links, notifications, verification/onboarding surfaces, summary widgets, and monitoring/detail pages - add the Spec 171 planning artifacts under `specs/171-operations-naming-consolidation/` - close the remaining tenant dashboard and admin copy drift found during browser smoke validation ## Validation - `export PATH="/bin:/usr/bin:/usr/local/bin:$PATH" && vendor/bin/sail artisan test --compact tests/Unit/Support/RelatedNavigationResolverTest.php tests/Unit/Support/References/RelatedContextReferenceAdapterTest.php tests/Feature/OpsUx/NotificationViewRunLinkTest.php tests/Feature/Guards/ActionSurfaceContractTest.php tests/Feature/Operations/TenantlessOperationRunViewerTest.php tests/Feature/Filament/BackupSetResolvedReferencePresentationTest.php tests/Feature/Filament/TenantVerificationReportWidgetTest.php tests/Feature/Onboarding/OnboardingVerificationTest.php tests/Feature/Onboarding/OnboardingVerificationClustersTest.php tests/Feature/Onboarding/OnboardingVerificationV1_5UxTest.php tests/Feature/Filament/BaselineCompareSummaryConsistencyTest.php tests/Feature/Filament/WorkspaceOverviewContentTest.php tests/Feature/Filament/RecentOperationsSummaryWidgetTest.php tests/Feature/Monitoring/OperationLifecycleAggregateVisibilityTest.php tests/Feature/System/Spec114/OpsTriageActionsTest.php tests/Feature/System/Spec114/OpsFailuresViewTest.php tests/Feature/System/Spec114/OpsStuckViewTest.php` - `export PATH="/bin:/usr/bin:/usr/local/bin:$PATH" && vendor/bin/sail artisan test --compact tests/Browser/OnboardingDraftRefreshTest.php` - `export PATH="/bin:/usr/bin:/usr/local/bin:$PATH" && vendor/bin/sail bin pint --dirty --format agent` ## Notes - no schema or route renames - Filament / Livewire surface behavior stays within the existing admin and tenant panels - OperationRunResource remains excluded from global search Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #202
12 KiB
Implementation Plan: Operations Naming Consolidation
Branch: 171-operations-naming-consolidation | Date: 2026-03-30 | Spec: /Users/ahmeddarrazi/Documents/projects/TenantAtlas/specs/171-operations-naming-consolidation/spec.md
Input: Feature specification from /Users/ahmeddarrazi/Documents/projects/TenantAtlas/specs/171-operations-naming-consolidation/spec.md
Note: This template is filled in by the /speckit.plan command. See .specify/scripts/ for helper scripts.
Consolidate non-system operator-visible references to existing OperationRun records so shared links, notifications, embedded verification/onboarding reports, tenantless admin viewers, and summary/helper copy consistently use Operations / Operation while preserving existing route targets, capability checks, and operation lifecycle behavior. The implementation stays narrow: no schema, route, capability, or internal class renames; only shared label emitters, representative Filament/Blade surfaces, and focused Pest/Browser coverage are updated.
Technical Context
Language/Version: PHP 8.4, Laravel 12, Livewire v4, Filament v5, Tailwind CSS v4
Primary Dependencies: laravel/framework, filament/filament, livewire/livewire, pestphp/pest
Storage: PostgreSQL with existing operation_runs, notification payloads, workspace records, and tenant records; no schema changes
Testing: Pest unit, feature, Livewire, and browser tests executed through Laravel Sail
Target Platform: Laravel web application running in Sail locally and containerized Linux environments for staging/production
Project Type: Laravel monolith with admin and system Filament panels plus shared Blade partials
Performance Goals: Preserve existing DB-only render paths and current route/navigation behavior; add no remote calls, no new queued work, and no broader query fan-out than the current eager-loaded surfaces
Constraints: Spec 170 remains authoritative for /system/ops/* interaction semantics; no internal class, route, enum, or persistence renames; workflow verbs such as Start verification remain where they describe new work; authorization, notification timing, and OperationRun lifecycle behavior stay unchanged
Scale/Scope: One naming-only slice spanning shared navigation/presentation helpers, representative admin/tenant/workspace/platform-embedded surfaces, and focused unit/feature/browser regression coverage
Constitution Check
GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.
PASSInventory-first / snapshots-second: the slice does not change inventory, snapshot, backup, or artifact truth.PASSRead/write separation: no new write path is introduced; existing queued/terminal notifications and viewer actions keep their current behavior and only change visible naming.PASSGraph contract path: no Microsoft Graph integration path is touched.PASSDeterministic capabilities: no capability registry or role mapping changes are introduced.PASSRBAC-UX plane separation: the feature reuses existing admin, tenant, workspace-context, and platform routes without widening access or changing 404/403 semantics.PASSWorkspace and tenant isolation: shared links continue to resolve through the current scoped routes and existing membership/capability checks remain authoritative.PASSDestructive confirmation standard: no destructive action behavior changes; existing confirmation requirements remain unchanged.PASSOps-UX 3-surface feedback: queued and terminal notifications remain the same surfaces; only visible action labels and helper copy change.PASSOps lifecycle ownership and summary-count rules: noOperationRun.status,OperationRun.outcome, orsummary_countsbehavior changes are introduced.PASSProportionality / bloat: the feature adds no persistence, abstraction, state family, or cross-domain taxonomy and instead reduces visible drift through existing helpers.PASSUI naming (UI-NAMING-001): this feature directly standardizes operator-facingOperationRunnomenclature outside Spec 170.PASSUI surface taxonomy and inspect model: no new surface type or competing inspect model is introduced; embedded reports and viewers retain their current interaction model.PASSFilament-native UI (UI-FIL-001): the slice stays inside existing Filament actions, widgets, pages, and shared Blade views with no new local UI framework.PASSTesting truth (TEST-TRUTH-001): the plan updates representative rendered-surface tests instead of introducing a blanket string-ban guard that would catch valid uses ofrun.
Project Structure
Documentation (this feature)
specs/171-operations-naming-consolidation/
├── plan.md
├── research.md
├── data-model.md
├── quickstart.md
├── contracts/
│ └── operation-naming-surface-contract.yaml
└── tasks.md
Source Code (repository root)
app/
├── Filament/
│ ├── Pages/
│ │ ├── Operations/
│ │ │ └── TenantlessOperationRunViewer.php
│ │ └── Workspaces/
│ │ └── ManagedTenantOnboardingWizard.php
│ ├── Resources/
│ │ ├── BackupScheduleResource.php
│ │ ├── BackupSetResource.php
│ │ ├── EvidenceSnapshotResource.php
│ │ └── EvidenceSnapshotResource/
│ │ └── Pages/
│ │ └── ViewEvidenceSnapshot.php
│ └── Widgets/
│ └── Tenant/
│ └── TenantVerificationReport.php
├── Notifications/
│ ├── OperationRunCompleted.php
│ └── OperationRunQueued.php
└── Support/
├── Baselines/
│ └── BaselineCompareSummaryAssessor.php
├── Navigation/
│ ├── RelatedActionLabelCatalog.php
│ └── RelatedNavigationResolver.php
├── OpsUx/
│ └── OperationUxPresenter.php
├── References/
│ ├── ReferenceTypeLabelCatalog.php
│ └── Resolvers/
│ └── OperationRunReferenceResolver.php
├── Workspaces/
│ └── WorkspaceOverviewBuilder.php
└── OperationRunLinks.php
resources/
└── views/
└── filament/
├── components/
│ └── verification-report-viewer.blade.php
├── forms/
│ └── components/
│ └── managed-tenant-onboarding-verification-report.blade.php
├── modals/
│ └── onboarding-verification-technical-details.blade.php
├── pages/
│ └── monitoring/
│ └── operations.blade.php
└── widgets/
└── tenant/
├── recent-operations-summary.blade.php
└── tenant-verification-report.blade.php
tests/
├── Browser/
│ └── OnboardingDraftRefreshTest.php
├── Feature/
│ ├── Filament/
│ │ ├── BackupSetResolvedReferencePresentationTest.php
│ │ └── BaselineCompareSummaryConsistencyTest.php
│ ├── Guards/
│ │ └── ActionSurfaceContractTest.php
│ ├── Monitoring/
│ │ └── OperationLifecycleAggregateVisibilityTest.php
│ ├── Operations/
│ │ └── TenantlessOperationRunViewerTest.php
│ └── OpsUx/
│ └── NotificationViewRunLinkTest.php
└── Unit/
└── Support/
├── References/
│ └── RelatedContextReferenceAdapterTest.php
└── RelatedNavigationResolverTest.php
Structure Decision: This is a single Laravel application. The implementation stays inside existing shared support classes, existing Filament/Blade surfaces, and the existing Pest/Browser test suite. No new application layer or directory is needed.
Focused test inventory (authoritative): The tree above is representative, not exhaustive. The additional focused coverage for this feature is tests/Feature/Filament/TenantVerificationReportWidgetTest.php, tests/Feature/Onboarding/OnboardingVerificationTest.php, tests/Feature/Onboarding/OnboardingVerificationClustersTest.php, tests/Feature/Onboarding/OnboardingVerificationV1_5UxTest.php, tests/Feature/Filament/WorkspaceOverviewContentTest.php, tests/Feature/Filament/RecentOperationsSummaryWidgetTest.php, and the Spec 170/shared-helper regression guard tests/Feature/System/Spec114/OpsTriageActionsTest.php, tests/Feature/System/Spec114/OpsFailuresViewTest.php, and tests/Feature/System/Spec114/OpsStuckViewTest.php.
Complexity Tracking
No constitution waiver is expected. This slice narrows existing visible language drift instead of adding structure.
| Violation | Why Needed | Simpler Alternative Rejected Because |
|---|---|---|
| None | Not applicable | Not applicable |
Proportionality Review
- Current operator problem: outside the already-aligned system-panel surfaces from Spec 170, the same
OperationRunrecord is still presented asrun,operation run, andoperationdepending on the page, widget, notification, or embedded report, which makes historical records feel like different domain objects. - Existing structure is insufficient because: shared label catalogs, navigation resolvers, reference presenters, notifications, and embedded report partials each emit their own visible copy, so one-off local fixes would leave cross-surface drift in place and invite regression.
- Narrowest correct implementation: update the existing shared label emitters first, then patch only the representative non-system surfaces that still render local
runterminology, while leaving routes, classes, enums, and lifecycle behavior intact. - Ownership cost created: low. The feature requires targeted wording updates and representative unit/feature/browser assertions for rendered copy, but adds no new runtime abstraction or persistence burden.
- Alternative intentionally rejected: renaming internal PHP classes, route slugs, or operation-type identifiers was rejected because the feature scope is operator-visible naming consistency, not internal refactoring.
- Release truth: current-release truth. The naming drift already exists across the shipped workspace, tenant, and embedded operation-related surfaces.
Post-Design Constitution Re-check
PASSUI-NAMING-001: the design centralizes canonicalOperations/Operationnouns in shared emitters and applies them consistently to links, identifiers, and helper copy.PASSUI-CONST-001/UI-SURF-001/UI-HARD-001: no surface classification, inspect model, or action-hierarchy change is introduced; only operator-visible naming changes.PASSOPSURF-001: verification and onboarding surfaces keep workflow verbs for starting work while naming the resulting historical record as an operation.PASSRBAC-UX-001throughRBAC-UX-005: existing route, visibility, and confirmation semantics remain unchanged because only labels and helper copy move.PASSTEST-TRUTH-001: design coverage focuses on rendered links, identifiers, and plural summary copy across unit, feature, and browser tests.PASSBLOAT-001: no new persistence, abstraction, state, or taxonomy was introduced during design.PASSFilament v5 / Livewire v4 guardrails: the plan touches existing Filament and Livewire-compatible components only; no provider registration or asset strategy changes are required.