# Research: Admin UI Stack Upgrade (Filament v5 + Livewire v4)

This document resolves planning unknowns for `057-filament-v5-upgrade`.

## Version Compatibility

### Decision: Upgrade to Filament v5 and Livewire v4

- Decision: Upgrade `filament/filament` to `^5` and let Composer resolve `livewire/livewire:^4` as required.
- Rationale:
  - Filament v5 is the next major and current supported release.
  - Livewire v4 supports Laravel 12 and PHP >= 8.1 (project is PHP 8.4.15).
  - Keeps the admin UI stack aligned with upstream support/security.
- Alternatives considered:
  - Stay on Filament v4: rejected (explicit goal is v5 upgrade).
  - Attempt mixed-version pinning (Filament v4 plugins + Filament v5 core): rejected by spec (no mixed-version pinning).

### Evidence (Packagist)

- `filament/filament v5.0.0` requires `php:^8.2`.
- `livewire/livewire v4.x` requires `laravel/framework:^10.15|^11|^12` (Laravel 12 compatible).

## Third-Party Package Compatibility

### Decision: Remove Filament v4-only plugins and replace functionality in-app

Two Composer requirements are currently hard-pinned to Filament v4:

- `pepperfm/filament-json:^4` -> requires `filament/filament:^4.0`
- `lara-zeus/torch-filament:^2` -> requires `filament/filament:^4.0`

Because Filament v5 cannot satisfy these constraints, we must remove/replace them.

#### `pepperfm/filament-json`

- Observed in-app usage:
  - `resources/views/filament/infolists/entries/snapshot-json.blade.php` includes `filament-json::json` and sets helper closures expected by the package.
- Decision:
  - Replace the JSON viewer infolist entry with a first-party Blade renderer.
- Rationale:
  - The app already normalizes the JSON payload and provides a "Copy JSON" action.
  - A first-party renderer avoids blocking Filament v5.
  - We can reuse Torchlight Engine for syntax-highlighted JSON rendering if desired.
- Alternatives considered:
  - Wait for upstream Filament v5 support: rejected (would block the upgrade).
  - Find another third-party Filament v5 JSON plugin: possible fallback, but first-party renderer is lowest-risk/no dependency.

#### `lara-zeus/torch-filament`

- Observed in-app usage:
  - No direct usage found in `app/**` or `resources/**`.
  - Torchlight rendering is implemented directly using `torchlight/engine` in Blade views (e.g. `normalized-diff` entry).
- Decision:
  - Remove the package and keep `torchlight/engine` usage directly.
- Rationale:
  - Removes a Filament v4-only dependency.
  - Keeps the "code highlighting" feature via the engine the app already uses.

## Livewire v4 Migration Risk Areas

### Decision: Treat Livewire navigation/polling widget behavior as a primary regression surface

Observed hotspots:

- `resources/views/livewire/bulk-operation-progress.blade.php`
  - Uses `wire:poll.5s="refreshRuns"`.
  - Uses a JS poller that listens for `livewire:navigated` and calls `$wire.refreshRuns()`.
- `resources/views/livewire/backup-set-policy-picker-table.blade.php`
  - Uses `wire:model.live`.

Rationale:

- Livewire major upgrades commonly change lifecycle events and JS hook APIs.
- Ops UX widget is global and runs across navigation; breakage would be highly visible.

Alternatives considered:

- "Upgrade and hope": rejected; we should plan explicit regression checks.

## Monitoring DB-only Guardrail Implications

### Decision: Monitoring -> Operations must remain DB-only across all Livewire requests

- Definition: "remote call" means any outbound HTTP request.
- Applies to:
  - Initial render
  - Background Livewire requests (polling/auto-refresh/hydration)
- Implementation implication:
  - Any Livewire component used under Monitoring -> Operations must not call Graph/HTTP in lifecycle hooks.
  - Remote work must remain "enqueue-only" behind explicit user actions and `OperationRun` tracking.

Alternatives considered:

- Allowing background remote calls for freshness: rejected by spec/constitution.

## Proposed Implementation Sequencing

1. Upgrade core dependencies (Filament v5 -> Livewire v4).
2. Remove/replace Filament v4-only plugins:
   - Replace snapshot JSON view
   - Remove torch-filament (retain torchlight/engine)
3. Run Filament upgrade command(s) and fix panel/provider issues.
4. Fix Livewire v4 regressions in polling + navigation event handling.
5. Add/adjust targeted tests and verify Monitoring DB-only behavior.

## Implementation Outcome (Final)

### Dependency decisions (as implemented)

- Filament upgraded to v5; Livewire upgraded to v4 (resolved transitively).
- Removed Filament v4-only dependencies:
  - `pepperfm/filament-json`
  - `lara-zeus/torch-filament`
- Kept code highlighting by explicitly requiring `torchlight/engine` (and its syntax highlighter dependency `phiki/phiki`).

### Guardrails validated

- Monitoring -> Operations remains DB-only during initial render and during background Livewire requests (no outbound HTTP).
- Monitoring -> Operations remains tenant-scoped; cross-tenant access is forbidden.
- Monitoring render does not enqueue background work; enqueue remains behind explicit user actions.

### Validation notes

- Full suite gate `php artisan test` run after upgrade.
