## Summary - implement Spec 198 monitoring page-state contracts across Operations, Audit Log, Finding Exceptions Queue, Evidence Overview, Baseline Compare Landing, and Baseline Compare Matrix - align selected-record and draft/apply behavior with query/session restoration semantics, including canonical navigation and tenant-filter normalization helpers - add Spec 198 feature and browser coverage, update closure/spec artifacts, and refresh affected regression tests that asserted pre-contract behavior ## Verification - focused Spec 198 feature pack passed through Sail - Spec 198 browser smoke passed through Sail - existing Spec 190 and Spec 194 browser smokes passed through Sail - targeted fallout tests were updated and rerun during full-suite triage ## Notes - Livewire v4 / Filament v5 compliant only; no legacy API reintroduction - no provider registration changes; Laravel 11+ provider registration remains in `bootstrap/providers.php` - no global-search behavior changed for any resource - destructive queue decision actions remain confirmation-gated and authorization-backed - no new Filament assets were added; existing deploy step for `php artisan filament:assets` remains unchanged Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #238
7.8 KiB
Data Model: Monitoring Page-State Contract
Overview
This feature introduces no new persisted entity, table, enum, or long-lived artifact. It standardizes the derived page-state contract of existing Filament pages so the same operator questions have the same answers across the monitoring family.
Existing Source Truths Reused Without Change
The following truths remain authoritative and are not redefined by this feature:
- existing page routes and panel scope
- existing workspace and tenant entitlement checks
- existing page-local Livewire properties
- existing request query parameters and navigation-context payloads
- existing session-backed table filter, search, and sort persistence
- existing compare-builder and matrix-rendering truth
- existing approval, audit, and destructive-action safety behavior
This feature changes page-state semantics and documentation only.
New Derived Planning Models
MonitoringPageStateContract
Type: derived per-surface contract entry
Source: explicit Spec 198 contract plus page-local declarations on the affected pages
| Field | Type | Notes |
|---|---|---|
surfaceKey |
string | Stable identifier such as operations or baseline_compare_matrix |
pageClass |
string | Concrete Filament page class that owns the state |
surfaceType |
string | simple_monitoring, selected_record_monitoring, draft_apply_analysis, or launch_context_support |
usesContextualPrefilter |
boolean | Whether external launch or query context can seed the page |
usesDraftState |
boolean | True only when draft state is intentionally separate from active state |
usesInspectState |
boolean | Whether the page owns a selected-record or focused inspect contract |
shareableStateKeys |
array | State keys intentionally restorable by reload, back, or shared link |
localOnlyStateKeys |
array | State keys that never restore from shared or reopened entry |
invalidRequestedStateFallback |
string | Predictable fallback behavior when requested state is invalid or unauthorized |
StateFieldDescriptor
Type: derived state-slice descriptor
Source: explicit state-role mapping for a surface
| Field | Type | Notes |
|---|---|---|
surfaceKey |
string | Links back to the owning surface |
stateKey |
string | Stable field or semantic slice such as activeTab, selectedAuditLogId, or draftSelectedPolicyTypes |
stateClass |
string | contextual_prefilter, active, draft, inspect, or shareable_restorable |
carrier |
string | query_param, session, livewire_property, route_context, or derived_render_state |
queryRole |
string | initialization_only, durable_restorable, scoped_deeplink, or unsupported |
shareable |
boolean | Whether the state may appear in a shared or bookmarked URL |
restorableOnRefresh |
boolean | Whether refresh or reopen recreates the state |
tenantSensitive |
boolean | Whether tenant change must clear or recompute the state |
invalidFallback |
string | What happens if the requested value is invalid or inaccessible |
HydrationRule
Type: derived precedence rule
Source: page mount logic plus the standardized Spec 198 precedence model
| Field | Type | Notes |
|---|---|---|
surfaceKey |
string | The owning surface |
precedenceOrder |
array | Ordered sources such as query, session, default |
appliesOnInitialMountOnly |
boolean | Whether the rule applies only during initial hydration |
activeStateBecomesAuthoritativeAfterMount |
boolean | True for all in-scope surfaces |
clearsOnTenantSwitch |
array | State keys that must be reset when tenant context changes |
invalidRequestedStateFallback |
string | Surface-specific fallback behavior |
InspectStateContract
Type: derived selected-record or focus contract
Source: Audit Log, Finding Exceptions Queue, and Baseline Compare Matrix
| Field | Type | Notes |
|---|---|---|
surfaceKey |
string | The owning surface |
primaryModel |
string | selected_record_inline, selected_record_workbench, focused_subject, or none |
selectedStateKey |
string | Backing property such as selectedAuditLogId or focusedSubjectKey |
openedBy |
array | Supported entry modes such as query_param, inspect_action, or cell_focus |
inlinePresentation |
string | inline_detail, summary_panel, focused_matrix, or navigate_to_detail |
shareable |
boolean | Whether the selected state is intentionally bookmarkable or shareable |
invalidSelectionFallback |
string | Required clear-state or fallback behavior |
CompareMatrixStateSlice
Type: derived special-case state descriptor
Source: Baseline Compare Matrix page-local compare logic
| Field | Type | Notes |
|---|---|---|
appliedFilterKeys |
array | Filter and sort keys currently driving the rendered matrix |
draftFilterKeys |
array | Pending filter and sort keys that do not affect the rendered matrix until apply |
presentationModeKey |
string | The current matrix presentation mode if present |
focusKey |
string | Focused subject or cell key |
shareableSlices |
array | Applied filters, supported mode, and focus state only |
localOnlySlices |
array | Unapplied draft state |
Relationships
- One
MonitoringPageStateContractowns manyStateFieldDescriptorentries. - One
MonitoringPageStateContractowns exactly oneHydrationRule. - A surface that supports inspect state owns one
InspectStateContract. BaselineCompareMatrixowns oneCompareMatrixStateSlicein addition to the standard surface contract.BaselineCompareLandingparticipates aslaunch_context_supportand seeds a separate surface rather than owning the downstream applied state.
Resolution Rules
Shared rules
- Supported query or deeplink input hydrates first on initial mount.
- Session participates only for state the page already persists intentionally.
- Invalid or unauthorized requested state is discarded or cleared predictably.
- After mount, active local state becomes authoritative.
- Any state not explicitly declared shareable or restorable is treated as local-only.
Simple monitoring rules
operationsandevidence_overviewfollow the simple monitoring pattern: contextual prefilter plus active state, with no same-page selected-record inspect state.- Their shareable or restorable state is limited to explicitly supported filter, tab, and context fields.
Selected-record monitoring rules
audit_logandfinding_exceptions_queueeach have exactly one selected-record contract.- Inspect actions, selected summaries, and selected-record query parameters must all point to the same selected state.
- If selection becomes invalid or filtered out, the surface returns to the unselected state without stale action or summary state.
Compare matrix rules
baseline_compare_matrixis the only in-scope surface with draft state.- Draft state never becomes shareable or restorable.
- Applied compare state and supported focus state are the only durable slices.
baseline_compare_landingmay seed matrix launch context but never competes with the matrix for applied state ownership.
Safety Rules
- No derived contract may widen workspace or tenant visibility beyond existing route and policy semantics.
- No selected-record or focus state may survive refresh, reopen, or filter change if the record or subject is invalid or unauthorized.
- No surface may expose two competing primary inspect models for the same operator function.
- No draft state may silently leak into shared URLs or refresh restoration unless the contract explicitly allows it.
- No shell or global context concern may be solved inside this feature without an explicit handoff decision for Spec 199.