# 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.*

- `PASS` Inventory-first / snapshots-second: the slice does not change inventory, snapshot, backup, or artifact truth.
- `PASS` Read/write separation: no new write path is introduced; existing queued/terminal notifications and viewer actions keep their current behavior and only change visible naming.
- `PASS` Graph contract path: no Microsoft Graph integration path is touched.
- `PASS` Deterministic capabilities: no capability registry or role mapping changes are introduced.
- `PASS` RBAC-UX plane separation: the feature reuses existing admin, tenant, workspace-context, and platform routes without widening access or changing 404/403 semantics.
- `PASS` Workspace and tenant isolation: shared links continue to resolve through the current scoped routes and existing membership/capability checks remain authoritative.
- `PASS` Destructive confirmation standard: no destructive action behavior changes; existing confirmation requirements remain unchanged.
- `PASS` Ops-UX 3-surface feedback: queued and terminal notifications remain the same surfaces; only visible action labels and helper copy change.
- `PASS` Ops lifecycle ownership and summary-count rules: no `OperationRun.status`, `OperationRun.outcome`, or `summary_counts` behavior changes are introduced.
- `PASS` Proportionality / bloat: the feature adds no persistence, abstraction, state family, or cross-domain taxonomy and instead reduces visible drift through existing helpers.
- `PASS` UI naming (`UI-NAMING-001`): this feature directly standardizes operator-facing `OperationRun` nomenclature outside Spec 170.
- `PASS` UI surface taxonomy and inspect model: no new surface type or competing inspect model is introduced; embedded reports and viewers retain their current interaction model.
- `PASS` Filament-native UI (`UI-FIL-001`): the slice stays inside existing Filament actions, widgets, pages, and shared Blade views with no new local UI framework.
- `PASS` Testing truth (`TEST-TRUTH-001`): the plan updates representative rendered-surface tests instead of introducing a blanket string-ban guard that would catch valid uses of `run`.

## Project Structure

### Documentation (this feature)

```text
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)

```text
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 `OperationRun` record is still presented as `run`, `operation run`, and `operation` depending 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 `run` terminology, 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

- `PASS` `UI-NAMING-001`: the design centralizes canonical `Operations` / `Operation` nouns in shared emitters and applies them consistently to links, identifiers, and helper copy.
- `PASS` `UI-CONST-001` / `UI-SURF-001` / `UI-HARD-001`: no surface classification, inspect model, or action-hierarchy change is introduced; only operator-visible naming changes.
- `PASS` `OPSURF-001`: verification and onboarding surfaces keep workflow verbs for starting work while naming the resulting historical record as an operation.
- `PASS` `RBAC-UX-001` through `RBAC-UX-005`: existing route, visibility, and confirmation semantics remain unchanged because only labels and helper copy move.
- `PASS` `TEST-TRUTH-001`: design coverage focuses on rendered links, identifiers, and plural summary copy across unit, feature, and browser tests.
- `PASS` `BLOAT-001`: no new persistence, abstraction, state, or taxonomy was introduced during design.
- `PASS` Filament v5 / Livewire v4 guardrails: the plan touches existing Filament and Livewire-compatible components only; no provider registration or asset strategy changes are required.