TenantAtlas/specs/176-backup-quality-truth/contracts/backup-quality-truth.openapi.yaml
ahmido e840007127 feat: add backup quality truth surfaces (#211)
## Summary
- add a shared backup-quality resolver and summary model for backup sets, backup items, policy versions, and restore selection
- surface backup-quality truth across Filament backup-set, policy-version, and restore-wizard entry points
- add focused Pest coverage and the full Spec Kit artifact set for spec 176

## Testing
- focused backup-quality verification and integrated-browser smoke coverage were completed during implementation
- degraded browser smoke path was validated with temporary seeded records and then cleaned up again
- the workspace already has a prior `vendor/bin/sail artisan test --compact` run exiting non-zero; that full-suite failure was not reworked as part of this PR

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #211
2026-04-07 11:39:40 +00:00

498 lines
13 KiB
YAML

openapi: 3.1.0
info:
title: Backup Quality Truth Surface Contracts
version: 1.0.0
description: >-
Internal reference contract for backup-quality truth surfaces. The application
continues to return rendered HTML through Filament and Livewire. The vendor
media types below document the structured list, detail, and selection models
that must be derivable before rendering. This is not a public API commitment.
paths:
/admin/t/{tenant}/backup-sets:
get:
summary: Backup-set list surface
description: >-
Returns the rendered backup-set list page. The vendor media type documents
the quality summary model that each visible row must expose.
parameters:
- name: tenant
in: path
required: true
schema:
type: integer
responses:
'200':
description: Rendered backup-set list page
content:
text/html:
schema:
type: string
application/vnd.tenantpilot.backup-set-collection+json:
schema:
$ref: '#/components/schemas/BackupSetCollectionSurface'
'403':
description: Viewer is in scope but lacks backup or version viewing capability
'404':
description: Tenant scope is not visible because workspace or tenant membership is missing
/admin/t/{tenant}/backup-sets/{backupSet}:
get:
summary: Backup-set detail surface
description: >-
Returns the rendered backup-set detail page. The vendor media type documents
the summary-first quality model and the related per-item quality rows.
parameters:
- name: tenant
in: path
required: true
schema:
type: integer
- name: backupSet
in: path
required: true
schema:
type: integer
responses:
'200':
description: Rendered backup-set detail page
content:
text/html:
schema:
type: string
application/vnd.tenantpilot.backup-set-detail+json:
schema:
$ref: '#/components/schemas/BackupSetDetailSurface'
'403':
description: Viewer is in scope but lacks required capability for a linked maintenance action
'404':
description: Backup set is not visible because workspace or tenant membership is missing
/admin/t/{tenant}/policy-versions:
get:
summary: Policy-version list surface
description: >-
Returns the rendered policy-version list page. The vendor media type documents
the snapshot mode and backup-quality model that each row must expose.
parameters:
- name: tenant
in: path
required: true
schema:
type: integer
responses:
'200':
description: Rendered policy-version list page
content:
text/html:
schema:
type: string
application/vnd.tenantpilot.policy-version-collection+json:
schema:
$ref: '#/components/schemas/PolicyVersionCollectionSurface'
'403':
description: Viewer is in scope but lacks policy-version viewing capability
'404':
description: Tenant scope is not visible because workspace or tenant membership is missing
/admin/t/{tenant}/policy-versions/{policyVersion}:
get:
summary: Policy-version detail surface
description: >-
Returns the rendered policy-version detail page. The vendor media type documents
the explicit backup-quality model that must be available before rendering.
parameters:
- name: tenant
in: path
required: true
schema:
type: integer
- name: policyVersion
in: path
required: true
schema:
type: integer
responses:
'200':
description: Rendered policy-version detail page
content:
text/html:
schema:
type: string
application/vnd.tenantpilot.policy-version-detail+json:
schema:
$ref: '#/components/schemas/PolicyVersionDetailSurface'
'403':
description: Viewer is in scope but lacks capability for a linked mutation action
'404':
description: Policy version is not visible because workspace or tenant membership is missing
/admin/t/{tenant}/restore-runs/create:
get:
summary: Restore selection surface with backup-quality hints
description: >-
Returns the rendered restore wizard. The vendor media type documents the
selection-stage backup-quality hints that must appear before risk checks.
parameters:
- name: tenant
in: path
required: true
schema:
type: integer
- name: backup_set_id
in: query
required: false
schema:
type: integer
responses:
'200':
description: Rendered restore wizard page
content:
text/html:
schema:
type: string
application/vnd.tenantpilot.restore-selection-quality+json:
schema:
$ref: '#/components/schemas/RestoreSelectionSurface'
'403':
description: Viewer is in scope but lacks restore capability
'404':
description: Restore surface is not visible because workspace or tenant membership is missing
components:
schemas:
BackupSetCollectionSurface:
type: object
required:
- rows
properties:
rows:
type: array
items:
$ref: '#/components/schemas/BackupSetRow'
BackupSetRow:
type: object
required:
- id
- name
- lifecycleStatus
- itemCount
- qualitySummary
properties:
id:
type: integer
name:
type: string
lifecycleStatus:
$ref: '#/components/schemas/Fact'
itemCount:
type: integer
capturedAt:
type:
- string
- 'null'
format: date-time
completedAt:
type:
- string
- 'null'
format: date-time
qualitySummary:
$ref: '#/components/schemas/QualitySummary'
BackupSetDetailSurface:
type: object
required:
- header
- qualitySummary
- itemRows
properties:
header:
$ref: '#/components/schemas/BackupSetHeader'
qualitySummary:
$ref: '#/components/schemas/QualitySummary'
itemRows:
type: array
items:
$ref: '#/components/schemas/BackupItemQualityRow'
positiveClaimBoundary:
$ref: '#/components/schemas/Fact'
BackupSetHeader:
type: object
required:
- id
- name
- lifecycleStatus
properties:
id:
type: integer
name:
type: string
lifecycleStatus:
$ref: '#/components/schemas/Fact'
archived:
type: boolean
itemCount:
type: integer
BackupItemQualityRow:
type: object
required:
- id
- label
- policyType
- snapshotCompleteness
- assignmentCapture
- hasDegradations
- summaryMessage
properties:
id:
type: integer
label:
type: string
policyType:
type: string
platform:
type:
- string
- 'null'
versionNumber:
type:
- integer
- 'null'
snapshotCompleteness:
$ref: '#/components/schemas/SnapshotCompleteness'
assignmentCapture:
$ref: '#/components/schemas/AssignmentCapture'
integrityWarning:
type:
- string
- 'null'
hasDegradations:
type: boolean
degradationFamilies:
type: array
items:
type: string
summaryMessage:
type: string
nextAction:
$ref: '#/components/schemas/Fact'
PolicyVersionCollectionSurface:
type: object
required:
- rows
properties:
rows:
type: array
items:
$ref: '#/components/schemas/PolicyVersionRow'
PolicyVersionRow:
type: object
required:
- id
- label
- versionNumber
- snapshotCompleteness
- hasDegradations
- summaryMessage
properties:
id:
type: integer
label:
type: string
versionNumber:
type: integer
capturedAt:
type:
- string
- 'null'
format: date-time
snapshotCompleteness:
$ref: '#/components/schemas/SnapshotCompleteness'
assignmentCapture:
$ref: '#/components/schemas/AssignmentCapture'
integrityWarning:
type:
- string
- 'null'
hasDegradations:
type: boolean
degradationFamilies:
type: array
items:
type: string
summaryMessage:
type: string
PolicyVersionDetailSurface:
type: object
required:
- header
- qualityFact
- positiveClaimBoundary
properties:
header:
$ref: '#/components/schemas/PolicyVersionHeader'
qualityFact:
$ref: '#/components/schemas/QualityFact'
positiveClaimBoundary:
$ref: '#/components/schemas/Fact'
PolicyVersionHeader:
type: object
required:
- id
- label
- versionNumber
properties:
id:
type: integer
label:
type: string
versionNumber:
type: integer
capturedAt:
type:
- string
- 'null'
format: date-time
RestoreSelectionSurface:
type: object
required:
- backupSetOptions
- positiveClaimBoundary
properties:
backupSetOptions:
type: array
items:
$ref: '#/components/schemas/RestoreBackupSetOption'
itemOptions:
type: array
items:
$ref: '#/components/schemas/RestoreBackupItemOption'
positiveClaimBoundary:
$ref: '#/components/schemas/Fact'
RestoreBackupSetOption:
type: object
required:
- id
- label
- qualitySummary
properties:
id:
type: integer
label:
type: string
qualitySummary:
$ref: '#/components/schemas/QualitySummary'
RestoreBackupItemOption:
type: object
required:
- id
- label
- qualityFact
properties:
id:
type: integer
label:
type: string
qualityFact:
$ref: '#/components/schemas/QualityFact'
QualitySummary:
type: object
required:
- hasDegradations
- degradedItemCount
- metadataOnlyCount
- assignmentIssueCount
- orphanedAssignmentCount
- summaryLabel
properties:
hasDegradations:
type: boolean
degradedItemCount:
type: integer
metadataOnlyCount:
type: integer
assignmentIssueCount:
type: integer
orphanedAssignmentCount:
type: integer
integrityWarningCount:
type: integer
unknownQualityCount:
type: integer
degradationFamilies:
type: array
items:
type: string
summaryLabel:
type: string
nextAction:
$ref: '#/components/schemas/Fact'
QualityFact:
type: object
required:
- snapshotCompleteness
- assignmentCapture
- hasDegradations
- summaryMessage
properties:
snapshotCompleteness:
$ref: '#/components/schemas/SnapshotCompleteness'
assignmentCapture:
$ref: '#/components/schemas/AssignmentCapture'
integrityWarning:
type:
- string
- 'null'
hasDegradations:
type: boolean
degradationFamilies:
type: array
items:
type: string
summaryMessage:
type: string
nextAction:
$ref: '#/components/schemas/Fact'
SnapshotCompleteness:
type: object
required:
- mode
- badgeLabel
properties:
mode:
type: string
enum:
- full
- metadata_only
- unknown
badgeLabel:
type: string
sourceSignal:
type:
- string
- 'null'
AssignmentCapture:
type: object
required:
- issuePresent
- orphanedAssignments
properties:
issuePresent:
type: boolean
fetchFailed:
type: boolean
captureReason:
type:
- string
- 'null'
orphanedAssignments:
type: boolean
assignmentCount:
type:
- integer
- 'null'
Fact:
type: object
required:
- label
properties:
label:
type: string
description:
type:
- string
- 'null'