TenantAtlas/app/Filament/Widgets/Workspace/WorkspaceRecentOperations.php
ahmido 1142d283eb feat: Spec 178 — Operations Lifecycle Alignment & Cross-Surface Truth Consistency (#209)
## Spec 178 — Operations Lifecycle Alignment & Cross-Surface Truth Consistency

Härtet die Run-Lifecycle-Wahrheit und Cross-Surface-Konsistenz über alle zentralen Operator-Flächen hinweg.

### Kern-Änderungen

**Lifecycle Truth Alignment**
- Einheitliche stale/stuck-Semantik zwischen Tenant-, Workspace-, Admin- und System-Surfaces
- `OperationRunFreshnessState` wird konsistent über alle Widgets und Seiten propagiert
- Gemeinsame Problem-Klassen-Trennung: `terminal_follow_up` vs. `active_stale_attention`

**BulkOperationProgress Freshness**
- Overlay zeigt nur noch `healthyActive()` Runs statt alle aktiven Runs
- Likely-stale Runs halten das Polling nicht mehr künstlich aktiv
- Terminal Runs verschwinden zeitnah aus dem Progress-Overlay

**Decision Zone im Run Detail**
- Stale/reconciled Attention in der primären Decision-Hierarchie
- Klare Antworten: aktiv? stale? reconciled? nächster Schritt?
- Artifact-reiche Runs behalten Lifecycle-Truth vor Deep-Diagnostics

**Cross-Surface Link-Continuity**
- Dashboard → Operations Hub → Run Detail erzählen dieselbe Geschichte
- Notifications referenzieren korrekte Problem-Klasse
- Workspace/Tenant-Attention verlinken problemklassengerecht

**System-Plane Fixes**
- `/system/ops/failures` 500-Error behoben (panel-sichere Artifact-URLs)
- System-Stuck/Failures zeigen reconciled stale lineage

### Weitere Fixes
- Inventory auth guard bereinigt (Gate statt ad-hoc Facades)
- Browser-Smoke-Tests stabilisiert (DOM-Assertions statt fragile Klicks)
- Test-Assertion-Drift für Verification/Lifecycle-Texte korrigiert

### Test-Ergebnis
Full Suite: **3269 passed**, 8 skipped, 0 failed

### Spec-Artefakte
- `specs/178-ops-truth-alignment/spec.md`
- `specs/178-ops-truth-alignment/plan.md`
- `specs/178-ops-truth-alignment/tasks.md`
- `specs/178-ops-truth-alignment/research.md`
- `specs/178-ops-truth-alignment/data-model.md`
- `specs/178-ops-truth-alignment/quickstart.md`
- `specs/178-ops-truth-alignment/contracts/operations-truth-alignment.openapi.yaml`

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #209
2026-04-05 22:42:24 +00:00

73 lines
1.8 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Filament\Widgets\Workspace;
use Filament\Widgets\Widget;
class WorkspaceRecentOperations extends Widget
{
protected static bool $isLazy = false;
protected int|string|array $columnSpan = 'full';
protected string $view = 'filament.widgets.workspace.workspace-recent-operations';
/**
* @var array<int, array{
* id: int,
* title: string,
* tenant_label: ?string,
* status_label: string,
* status_color: string,
* outcome_label: string,
* outcome_color: string,
* lifecycle_label: ?string,
* guidance: ?string,
* started_at: string,
* destination: array<string, mixed>,
* url: string
* }>
*/
public array $operations = [];
/**
* @var array{
* title: string,
* body: string,
* action_label: string,
* action_url: string
* }
*/
public array $emptyState = [];
/**
* @param array<int, array{
* id: int,
* title: string,
* tenant_label: ?string,
* status_label: string,
* status_color: string,
* outcome_label: string,
* outcome_color: string,
* lifecycle_label: ?string,
* guidance: ?string,
* started_at: string,
* destination: array<string, mixed>,
* url: string
* }> $operations
* @param array{
* title: string,
* body: string,
* action_label: string,
* action_url: string
* } $emptyState
*/
public function mount(array $operations = [], array $emptyState = []): void
{
$this->operations = $operations;
$this->emptyState = $emptyState;
}
}