TenantAtlas/specs/171-operations-naming-consolidation/plan.md
ahmido 1b88d28739 feat: consolidate operation naming surfaces (#202)
## 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
2026-03-30 22:51:06 +00:00

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.

  • 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)

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