TenantAtlas/specs/192-record-header-discipline/contracts/record-header-discipline.logical.openapi.yaml
Ahmed Darrazi 72ddc18743 feat: implement spec 192 header discipline
- land the spec 192 resource, guard, browser smoke, and documentation changes
- add unhandled rejection request correlation for 419 diagnostics
- disable panel-wide database notification polling and cover it with focused tests
2026-04-11 23:09:42 +02:00

252 lines
7.6 KiB
YAML

openapi: 3.1.0
info:
title: Record Page Header Discipline Internal Surface Contract
version: 0.1.0
summary: Internal logical contract for Spec 192 record-page header discipline
description: |
This contract is an internal planning artifact for Spec 192. The affected
surfaces continue to render HTML through Filament and Livewire. The schemas
below define the bounded render contract and regression expectations for
standard record/detail/edit headers, grouped secondary actions, contextual
navigation outside the header, and the explicit workflow-heavy exception.
servers:
- url: /internal
x-record-header-discipline-consumers:
- surface: standard-record-pages
sourceFiles:
- apps/platform/app/Filament/Resources/BaselineProfileResource/Pages/ViewBaselineProfile.php
- apps/platform/app/Filament/Resources/EvidenceSnapshotResource/Pages/ViewEvidenceSnapshot.php
- apps/platform/app/Filament/Resources/FindingExceptionResource/Pages/ViewFindingException.php
- apps/platform/app/Filament/Resources/TenantReviewResource/Pages/ViewTenantReview.php
- apps/platform/app/Filament/Resources/TenantResource/Pages/EditTenant.php
mustRender:
- at_most_one_primary_header_action
- grouped_secondary_actions
- contextual_navigation_or_related_context_outside_header
- separated_danger_actions_when_present
mustNotRender:
- flat_navigation_mutation_strip
- multiple_competing_primary_actions
- empty_action_group_placeholders
- surface: workflow-heavy-special-type
sourceFiles:
- apps/platform/app/Filament/Resources/TenantResource/Pages/ViewTenant.php
mustRender:
- explicit_exception_reason
- grouped_and_ordered_actions
- optional_single_primary_only_when_dominant
mustNotRender:
- silent_exception
- flat_multi_button_primary_strip
- surface: regression-guards
sourceFiles:
- apps/platform/app/Support/Ui/ActionSurface/ActionSurfaceValidator.php
- apps/platform/app/Support/Ui/ActionSurface/ActionSurfaceExemptions.php
- apps/platform/tests/Feature/Guards/ActionSurfaceContractTest.php
- apps/platform/tests/Feature/Guards/ActionSurfaceValidatorTest.php
paths:
/internal/action-surfaces/record-pages/{surface}:
get:
summary: Return the logical header-discipline contract for an in-scope record page
operationId: getRecordPageHeaderDisciplineContract
parameters:
- name: surface
in: path
required: true
schema:
$ref: '#/components/schemas/SurfaceKey'
responses:
'200':
description: Logical render contract and regression expectations for the requested surface
content:
application/vnd.tenantpilot.record-header-discipline+json:
schema:
$ref: '#/components/schemas/RecordHeaderSurfaceContract'
'404':
description: Requested surface is not in the Spec 192 inventory
components:
schemas:
SurfaceKey:
type: string
enum:
- baseline_profile_view
- evidence_snapshot_view
- finding_exception_view
- tenant_review_view
- tenant_edit
- tenant_view
- provider_connection_view
- finding_view
- review_pack_view
- alert_destination_view
- policy_version_view
- workspace_view
- baseline_snapshot_view
- backup_set_view
SurfaceClassification:
type: string
enum:
- remediation_required
- minor_alignment_only
- compliant_reference
- workflow_heavy_special_type
ActionKind:
type: string
enum:
- navigation
- mutation
- external_link
- lifecycle
- danger
Placement:
type: string
enum:
- primary_visible
- secondary_grouped
- contextual
- danger_grouped
OperationScope:
type: string
enum:
- TenantPilot only
- Microsoft tenant
- simulation only
- read-only
HeaderActionDescriptor:
type: object
additionalProperties: false
required:
- actionKey
- label
- actionKind
- placement
- requiresConfirmation
- usesUiEnforcement
- operationScope
properties:
actionKey:
type: string
label:
type: string
actionKind:
$ref: '#/components/schemas/ActionKind'
placement:
$ref: '#/components/schemas/Placement'
requiresConfirmation:
type: boolean
usesUiEnforcement:
type: boolean
capabilityKey:
type:
- string
- 'null'
writesAuditLog:
type: boolean
operationScope:
$ref: '#/components/schemas/OperationScope'
ContextualNavigationEntry:
type: object
additionalProperties: false
required:
- label
- sourceSection
- isAvailable
properties:
label:
type: string
targetUrl:
type:
- string
- 'null'
sourceSection:
type: string
enum:
- summary
- related_context
- field_context
- status_context
isAvailable:
type: boolean
SecondaryActionGroup:
type: object
additionalProperties: false
required:
- label
- orderedBuckets
- actions
properties:
label:
type: string
orderedBuckets:
type: array
items:
type: string
actions:
type: array
items:
$ref: '#/components/schemas/HeaderActionDescriptor'
HeaderRegressionExpectation:
type: object
additionalProperties: false
required:
- maxVisiblePrimaryActions
- requiresGroupedSecondaryActions
- allowsPrimaryNavigation
- requiresExplicitExceptionReason
properties:
maxVisiblePrimaryActions:
type: integer
minimum: 0
maximum: 1
requiresGroupedSecondaryActions:
type: boolean
allowsPrimaryNavigation:
type: boolean
requiresDangerSeparation:
type: boolean
requiresExplicitExceptionReason:
type: boolean
browserSmokeRequired:
type: boolean
RecordHeaderSurfaceContract:
type: object
additionalProperties: false
required:
- surfaceKey
- classification
- canonicalNoun
- primaryQuestion
- actions
- contextualNavigation
- regressionExpectation
properties:
surfaceKey:
$ref: '#/components/schemas/SurfaceKey'
classification:
$ref: '#/components/schemas/SurfaceClassification'
canonicalNoun:
type: string
primaryQuestion:
type: string
primaryAction:
anyOf:
- $ref: '#/components/schemas/HeaderActionDescriptor'
- type: 'null'
secondaryActionGroup:
anyOf:
- $ref: '#/components/schemas/SecondaryActionGroup'
- type: 'null'
dangerActions:
type: array
items:
$ref: '#/components/schemas/HeaderActionDescriptor'
contextualNavigation:
type: array
items:
$ref: '#/components/schemas/ContextualNavigationEntry'
explicitExceptionReason:
type:
- string
- 'null'
regressionExpectation:
$ref: '#/components/schemas/HeaderRegressionExpectation'