Kurzbeschreibung Implementiert Feature 055 — Ops‑UX Constitution Rollout v1.3.0. Behebt: globales BulkOperationProgress-Widget benötigt keinen manuellen Refresh mehr; ETA/Elapsed aktualisieren korrekt; Widget verschwindet automatisch. Verbesserungen: zuverlässiges polling (Alpine factory + Livewire fallback), sofortiger Enqueue‑Signal-Dispatch, Failure‑Message‑Sanitization, neue Guard‑ und Regressionstests, Specs/Tasks aktualisiert. Was geändert wurde (Auszug) InventoryLanding.php bulk-operation-progress.blade.php OperationUxPresenter.php SyncRestoreRunToOperationRun.php PolicyResource.php PolicyVersionResource.php RestoreRunResource.php tests/Feature/OpsUx/* (PollerRegistration, TerminalNotificationFailureMessageTest, CanonicalViewRunLinksTest, OperationCatalogCoverageTest, UnknownOperationTypeLabelTest) InventorySyncButtonTest.php tasks.md Tests Neue Tests hinzugefügt; php artisan test --group=ops-ux lokal grün (alle relevanten Tests laufen). How to verify manually Auf Branch wechseln: 055-ops-ux-rollout In Filament: Inventory → Sync (oder relevante Bulk‑Aktion) auslösen. Beobachten: Progress‑Widget erscheint sofort, ETA/Elapsed aktualisiert, Widget verschwindet nach Fertigstellung ohne Browser‑Refresh. Optional: ./vendor/bin/sail exec app php artisan test --filter=OpsUx oder php artisan test --group=ops-ux Besonderheiten / Hinweise Einzelne, synchrone Policy‑Actions (ignore/restore/PolicyVersion single archive/restore/forceDelete) sind absichtlich inline und erzeugen kein OperationRun. Bulk‑Aktionen und restore.execute werden als Runs modelliert. Wenn gewünscht, kann ich die inline‑Actions auf OperationRunService umstellen, damit sie in Monitoring → Operations sichtbar werden. Remote: Branch ist bereits gepusht (origin/055-ops-ux-rollout). PR kann in Gitea erstellt werden. Links Specs & tasks: tasks.md Monitoring page: Operations.php Co-authored-by: Ahmed Darrazi <ahmeddarrazi@adsmac.local> Reviewed-on: #64
111 lines
3.9 KiB
Markdown
111 lines
3.9 KiB
Markdown
# Implementation Plan: Ops-UX Constitution Rollout (v1.3.0 Alignment) (055)
|
|
|
|
**Branch**: `055-ops-ux-rollout` | **Date**: 2026-01-18 | **Spec**: `specs/055-ops-ux-rollout/spec.md`
|
|
**Input**: Feature specification from `specs/055-ops-ux-rollout/spec.md`
|
|
|
|
**Note**: This template is filled in by the `/speckit.plan` command. See `.specify/scripts/` for helper scripts.
|
|
|
|
## Summary
|
|
|
|
Standardize all operation feedback across the app to the Operations UX Constitution (v1.3.0):
|
|
|
|
- Three surfaces only (queued toast, progress widget for active runs, terminal DB notification for initiator).
|
|
- Centralized operation labels via an OperationCatalog.
|
|
- Canonical “View run” navigation to Monitoring → Operations → Run Detail.
|
|
- Safe, structured summaries sourced only from `operation_runs.summary_counts` (JSONB), using a single whitelist and numeric-only values.
|
|
|
|
Primary deliverables are shared presenters/normalizers + regression guards (Pest) that prevent drift.
|
|
|
|
## Technical Context
|
|
|
|
**Language/Version**: PHP 8.4.15 (Laravel 12)
|
|
**Primary Dependencies**: Filament v4, Livewire v3
|
|
**Storage**: PostgreSQL (JSONB for `operation_runs.summary_counts`)
|
|
**Testing**: Pest v4 (Laravel test runner), PHPUnit 12 (via Pest)
|
|
**Target Platform**: Docker/Sail for local dev, container-based deploy (Dokploy)
|
|
**Project Type**: Laravel web application (monolith)
|
|
**Performance Goals**: Not performance-driven; UX consistency and guardrails are primary
|
|
**Constraints**:
|
|
- Calm polling rules (no modal polling; pause when tab hidden; stop on terminal)
|
|
- No new Graph calls introduced by this feature
|
|
- No schema refactor required for rollout; normalize for presentation
|
|
**Scale/Scope**: Repo-wide UX migration impacting multiple producers and Monitoring UI
|
|
|
|
## Constitution Check
|
|
|
|
*GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.*
|
|
|
|
- Inventory-first: N/A (this feature is a UX standardization on existing run records)
|
|
- Read/write separation: No new writes; changes are UX/presentation + safe sanitization + tests
|
|
- Graph contract path: No Graph calls introduced
|
|
- Deterministic capabilities: N/A
|
|
- Tenant isolation: All queried runs are tenant-scoped; notifications are initiator-only
|
|
- Operations UX (unified system): This feature enforces the three-surface model and canonical navigation
|
|
- Automation: N/A (no new scheduling/locks added)
|
|
- Data minimization: Summary and failure messages are sanitized; summaries are numeric-only
|
|
|
|
**Gate status**: PASS (no violations required)
|
|
|
|
**Post-design re-check**: PASS (design artifacts align with Ops-UX three-surface model, DB source-of-truth, canonical navigation, and safe summaries)
|
|
|
|
## Project Structure
|
|
|
|
### Documentation (this feature)
|
|
|
|
```text
|
|
specs/055-ops-ux-rollout/
|
|
├── plan.md
|
|
├── research.md
|
|
├── data-model.md
|
|
├── quickstart.md
|
|
├── contracts/
|
|
│ └── ux-contracts.md
|
|
└── tasks.md
|
|
```
|
|
|
|
### Source Code (repository root)
|
|
|
|
```text
|
|
app/
|
|
├── Filament/
|
|
├── Livewire/
|
|
├── Models/
|
|
├── Notifications/
|
|
├── Providers/
|
|
├── Services/
|
|
└── Support/
|
|
|
|
resources/
|
|
└── views/
|
|
|
|
routes/
|
|
└── web.php
|
|
|
|
tests/
|
|
├── Feature/
|
|
└── Unit/
|
|
```
|
|
|
|
**Structure Decision**: Laravel web application (monolith) with Filament admin UI in `app/Filament/` and Pest tests in `tests/`.
|
|
|
|
## Phase Outputs
|
|
|
|
### Phase 0 — Research
|
|
|
|
- `specs/055-ops-ux-rollout/research.md`
|
|
|
|
### Phase 1 — Design & Contracts
|
|
|
|
- `specs/055-ops-ux-rollout/data-model.md`
|
|
- `specs/055-ops-ux-rollout/contracts/ux-contracts.md`
|
|
- `specs/055-ops-ux-rollout/quickstart.md`
|
|
|
|
## Complexity Tracking
|
|
|
|
> **Fill ONLY if Constitution Check has violations that must be justified**
|
|
|
|
| Violation | Why Needed | Simpler Alternative Rejected Because |
|
|
|-----------|------------|-------------------------------------|
|
|
| [e.g., 4th project] | [current need] | [why 3 projects insufficient] |
|
|
| [e.g., Repository pattern] | [specific problem] | [why direct DB access insufficient] |
|