TenantAtlas/specs/198-monitoring-page-state/contracts/monitoring-page-state.logical.openapi.yaml
ahmido e02799b383 feat: implement spec 198 monitoring page state contract (#238)
## 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
2026-04-15 21:59:42 +00:00

284 lines
8.2 KiB
YAML

openapi: 3.1.0
info:
title: Monitoring Page-State Internal Contract
version: 0.1.0
summary: Internal logical contract for Spec 198 monitoring page-state behavior
description: |
This contract is an internal planning artifact for Spec 198. The affected
surfaces continue to render HTML through Filament and Livewire. The schemas
below define the bounded contract for contextual prefilter state, active
state, draft state, inspect state, shareable/restorable state, and
deterministic hydration rules across the in-scope monitoring family.
servers:
- url: /internal
x-monitoring-page-state-consumers:
- surface: operations
sourceFiles:
- apps/platform/app/Filament/Pages/Monitoring/Operations.php
- apps/platform/resources/views/filament/pages/monitoring/operations.blade.php
mustDeclare:
- contextual_prefilter
- active
- shareable_restorable
mustNotDeclare:
- draft
- competing_same_page_inspect_model
- surface: audit_log
sourceFiles:
- apps/platform/app/Filament/Pages/Monitoring/AuditLog.php
- apps/platform/resources/views/filament/pages/monitoring/audit-log.blade.php
- apps/platform/resources/views/filament/pages/monitoring/partials/audit-log-inspect-event.blade.php
mustDeclare:
- contextual_prefilter
- active
- inspect
- shareable_restorable
mustNotDeclare:
- draft
- parallel_inspect_world
- surface: finding_exceptions_queue
sourceFiles:
- apps/platform/app/Filament/Pages/Monitoring/FindingExceptionsQueue.php
- apps/platform/resources/views/filament/pages/monitoring/finding-exceptions-queue.blade.php
mustDeclare:
- contextual_prefilter
- active
- inspect
- shareable_restorable
mustNotDeclare:
- draft
- parallel_inspect_world
- surface: evidence_overview
sourceFiles:
- apps/platform/app/Filament/Pages/Monitoring/EvidenceOverview.php
- apps/platform/resources/views/filament/pages/monitoring/evidence-overview.blade.php
mustDeclare:
- contextual_prefilter
- active
- shareable_restorable
mustNotDeclare:
- draft
- same_page_selected_record_state
- surface: baseline_compare_matrix
sourceFiles:
- apps/platform/app/Filament/Pages/BaselineCompareMatrix.php
- apps/platform/resources/views/filament/pages/baseline-compare-matrix.blade.php
mustDeclare:
- contextual_prefilter
- active
- draft
- inspect
- shareable_restorable
mustNotDeclare:
- forced_direct_active_filter_model
- surface: baseline_compare_landing
sourceFiles:
- apps/platform/app/Filament/Pages/BaselineCompareLanding.php
- apps/platform/resources/views/filament/pages/baseline-compare-landing.blade.php
mustDeclare:
- contextual_prefilter
- active
mustNotDeclare:
- competing_applied_compare_owner
paths:
/internal/page-state/{surface}:
get:
summary: Return the logical page-state contract for an in-scope monitoring surface
operationId: getMonitoringPageStateContract
parameters:
- name: surface
in: path
required: true
schema:
$ref: '#/components/schemas/SurfaceKey'
responses:
'200':
description: Logical state contract and hydration rules for the requested surface
content:
application/vnd.tenantpilot.monitoring-page-state+json:
schema:
$ref: '#/components/schemas/SurfaceContract'
'404':
description: Requested surface is not in the Spec 198 inventory
components:
schemas:
SurfaceKey:
type: string
enum:
- operations
- audit_log
- finding_exceptions_queue
- evidence_overview
- baseline_compare_matrix
- baseline_compare_landing
SurfaceType:
type: string
enum:
- simple_monitoring
- selected_record_monitoring
- draft_apply_analysis
- launch_context_support
StateClass:
type: string
enum:
- contextual_prefilter
- active
- draft
- inspect
- shareable_restorable
QueryRole:
type: string
enum:
- initialization_only
- durable_restorable
- scoped_deeplink
- unsupported
StateCarrier:
type: string
enum:
- query_param
- session
- livewire_property
- route_context
- derived_render_state
InvalidFallback:
type: string
enum:
- discard_and_continue
- clear_selection_and_continue
- reset_to_default_scope
- ignore_unapplied_draft
- deny_not_found
InspectPresentation:
type: string
enum:
- none
- inline_detail
- queue_summary
- focused_matrix
- navigate_to_canonical_detail
StateFieldDescriptor:
type: object
additionalProperties: false
required:
- stateKey
- stateClass
- carrier
- queryRole
- shareable
- restorableOnRefresh
- invalidFallback
properties:
stateKey:
type: string
stateClass:
$ref: '#/components/schemas/StateClass'
carrier:
$ref: '#/components/schemas/StateCarrier'
queryRole:
$ref: '#/components/schemas/QueryRole'
shareable:
type: boolean
restorableOnRefresh:
type: boolean
tenantSensitive:
type: boolean
invalidFallback:
$ref: '#/components/schemas/InvalidFallback'
HydrationRule:
type: object
additionalProperties: false
required:
- precedenceOrder
- appliesOnInitialMountOnly
- activeStateBecomesAuthoritativeAfterMount
- invalidRequestedStateFallback
properties:
precedenceOrder:
type: array
items:
type: string
enum:
- query
- session
- default
appliesOnInitialMountOnly:
type: boolean
activeStateBecomesAuthoritativeAfterMount:
type: boolean
clearsOnTenantSwitch:
type: array
items:
type: string
invalidRequestedStateFallback:
$ref: '#/components/schemas/InvalidFallback'
InspectContract:
type: object
additionalProperties: false
required:
- primaryModel
- selectedStateKey
- openedBy
- presentation
- shareable
- invalidSelectionFallback
properties:
primaryModel:
type: string
enum:
- none
- selected_record_inline
- selected_record_workbench
- focused_subject
selectedStateKey:
type:
- string
- 'null'
openedBy:
type: array
items:
type: string
enum:
- query_param
- inspect_action
- row_selection
- cell_focus
- landing_context
presentation:
$ref: '#/components/schemas/InspectPresentation'
shareable:
type: boolean
invalidSelectionFallback:
$ref: '#/components/schemas/InvalidFallback'
SurfaceContract:
type: object
additionalProperties: false
required:
- surfaceKey
- surfaceType
- stateFields
- hydrationRule
- inspectContract
- shareableStateKeys
- localOnlyStateKeys
properties:
surfaceKey:
$ref: '#/components/schemas/SurfaceKey'
surfaceType:
$ref: '#/components/schemas/SurfaceType'
stateFields:
type: array
items:
$ref: '#/components/schemas/StateFieldDescriptor'
hydrationRule:
$ref: '#/components/schemas/HydrationRule'
inspectContract:
$ref: '#/components/schemas/InspectContract'
shareableStateKeys:
type: array
items:
type: string
localOnlyStateKeys:
type: array
items:
type: string