## 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
498 lines
13 KiB
YAML
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' |