TenantAtlas/specs/057-filament-v5-upgrade/plan.md
2026-01-20 19:17:54 +01:00

126 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#+#+#+#+markdown
# Implementation Plan: Admin UI Stack Upgrade (Filament v5 + Livewire v4)
**Branch**: `057-filament-v5-upgrade` | **Date**: 2026-01-20 | **Spec**: `specs/057-filament-v5-upgrade/spec.md`
**Input**: Feature specification from `specs/057-filament-v5-upgrade/spec.md`
## Summary
Upgrade the admin UI stack from Filament v4 to Filament v5 (and Livewire v4 as a required dependency), while preserving TenantPilots constitution guardrails:
- Monitoring → Operations pages (including widgets/partials/tabs) remain DB-only during render and during background Livewire requests (polling/auto-refresh/hydration): **no outbound HTTP**.
- Tenant isolation remains mandatory across all UI interactions.
- No new Microsoft Graph behavior is introduced.
Key compatibility decision: two Composer dependencies are Filament v4-only and will block the upgrade:
- `pepperfm/filament-json:^4` (requires `filament/filament:^4.0`)
- `lara-zeus/torch-filament:^2` (requires `filament/filament:^4.0`)
The plan replaces their in-app usage with first-party Blade-based renderers (Torchlight Engine already present) so we can move the stack forward without mixed-version pinning.
## Technical Context
**Language/Version**: PHP 8.4.15 (project requires `php:^8.2`)
**Framework**: Laravel 12
**Admin UI**: Filament v4 → v5
**Reactive UI**: Livewire v3 → v4 (required by Filament v5)
**Frontend Tooling**: Vite 7, Tailwind CSS v4 (already in use), `@tailwindcss/vite`
**Storage**: PostgreSQL (operations tracked via `operation_runs` and JSONB columns per repo history)
**Testing**: Pest (Feature + Unit), PHPUnit 12 runner via `php artisan test`
**Target Platform**: Docker/Sail-first locally; Dokploy for staging/prod
**Constraints**:
- Monitoring → Operations: DB-only render and background Livewire requests; no outbound HTTP.
- All Graph calls stay behind `GraphClientInterface` + `config/graph_contracts.php`.
- No new Graph endpoints/behavior introduced by this upgrade.
## Constitution Check
*GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.*
- Inventory-first / Snapshots-second: unaffected by UI framework upgrade.
- Read/write separation: unchanged; no new writes introduced.
- Graph contract path: unchanged; the upgrade must not add new Graph calls.
- Deterministic capabilities: unchanged.
- Tenant isolation: must be preserved; audit all Filament/Livewire touchpoints that depend on tenant context.
- Run observability: unchanged; ensure Monitoring pages remain DB-only at render time.
- Automation / idempotency: unchanged.
- Data minimization / safe logging: unchanged.
**Gate status (pre-research)**: PASS (no justified violations required).
## Project Structure
### Documentation (this feature)
```text
specs/057-filament-v5-upgrade/
├── plan.md # This file
├── research.md # Phase 0 output
├── data-model.md # Phase 1 output
├── quickstart.md # Phase 1 output
├── contracts/ # Phase 1 output
└── tasks.md # Phase 2 output (/speckit.tasks) - NOT created here
```
### Source Code (repository root)
```text
app/
├── Filament/
│ ├── Pages/
│ │ └── Monitoring/Operations.php
│ └── Resources/
├── Livewire/
│ └── BulkOperationProgress.php
├── Models/
│ └── OperationRun.php
└── Providers/
└── Filament/AdminPanelProvider.php
resources/
├── views/
│ ├── filament/
│ │ ├── pages/monitoring/operations.blade.php
│ │ ├── infolists/entries/snapshot-json.blade.php
│ │ └── infolists/entries/normalized-diff.blade.php
│ └── livewire/bulk-operation-progress.blade.php
└── css/filament/admin/theme.css
```
**Structure Decision**: single Laravel web application; no new top-level folders required.
## Phase 0 — Research (output: research.md)
See `specs/057-filament-v5-upgrade/research.md` for:
- Version compatibility matrix (Filament v5 requires PHP ^8.2; Livewire v4 supports Laravel 12).
- Third-party blockers and the replacement approach (drop Filament-v4-only plugins; keep Torchlight Engine for code rendering; implement a small in-app JSON renderer).
- Livewire v4 migration hotspots in this repo (polling + `livewire:navigated` behavior, `wire:model.live` usage).
## Phase 1 — Design (outputs: data-model.md, contracts/*, quickstart.md)
- Data model: no intended schema changes; validate no new migrations are required by Filament/Livewire upgrades.
- Contracts: no new HTTP/API contracts; explicitly confirm “no Graph changes”.
- Quickstart: Sail-first local validation plus minimal smoke checks for Monitoring DB-only behavior.
**Gate status (post-design)**: PASS (no new Graph calls; Monitoring remains DB-only by design).
## Phase 2 — Implementation Outline (NOT executed by /speckit.plan)
1. Dependency upgrade
- Update Composer constraints: `filament/filament:^5`, ensure Livewire resolves to `^4`.
- Remove/replace Filament v4-only plugins (`pepperfm/filament-json`, `lara-zeus/torch-filament`) and update in-app rendering.
2. UI migration + compatibility
- Run Filament upgrade commands as required by Filament v5.
- Fix breakages in custom panel/provider config (`app/Providers/Filament/AdminPanelProvider.php`).
- Validate Livewire event and polling behavior (global Ops UX widget).
3. Guardrail verification
- Monitoring → Operations pages: verify no outbound HTTP happens during render/poll requests.
- Tenant switching: verify UI state and Livewire component data remains tenant-scoped.
4. Tests
- Add/update targeted Pest tests for:
- Monitoring pages render without HTTP calls (use HTTP fake + assertions).
- Ops UX progress widget remains DB-only and tenant-scoped.
- Run minimal suite locally (Sail-first), then broaden as needed.