## 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
73 lines
1.8 KiB
PHP
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;
|
|
}
|
|
}
|