#+#+#+#+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 TenantPilot’s 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.
