TenantAtlas/specs/160-operation-lifecycle-guarantees/contracts/operation-run-lifecycle.openapi.yaml
ahmido 845d21db6d feat: harden operation lifecycle monitoring (#190)
## Summary
- harden operation-run lifecycle handling with explicit reconciliation policy, stale-run healing, failed-job bridging, and monitoring visibility
- refactor audit log event inspection into a Filament slide-over and remove the stale inline detail/header-action coupling
- align panel theme asset resolution and supporting Filament UI updates, including the rounded 2xl theme token regression fix

## Testing
- ran focused Pest coverage for the affected audit-log inspection flow and related visibility tests
- ran formatting with `vendor/bin/sail bin pint --dirty --format agent`
- manually verified the updated audit-log slide-over flow in the integrated browser

## Notes
- branch includes the Spec 160 artifacts under `specs/160-operation-lifecycle-guarantees/`
- the full test suite was not rerun as part of this final commit/PR step

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #190
2026-03-23 21:53:19 +00:00

171 lines
4.8 KiB
YAML

openapi: 3.1.0
info:
title: Operation Run Lifecycle Monitoring Contract
version: 0.1.0
summary: Canonical Monitoring data contract for lifecycle freshness and reconciliation semantics on covered OperationRun records.
servers:
- url: https://tenantpilot.local
paths:
/api/admin/operations:
get:
summary: List operation runs with lifecycle freshness semantics
operationId: listOperationRuns
parameters:
- in: query
name: status
schema:
type: string
enum: [queued, running, completed]
- in: query
name: outcome
schema:
type: string
enum: [pending, succeeded, partially_succeeded, blocked, failed]
- in: query
name: type
schema:
type: string
- in: query
name: tenant_id
schema:
type: integer
- in: query
name: freshness_state
schema:
type: string
enum: [fresh_active, likely_stale, reconciled_failed, terminal_normal]
- in: query
name: reconciled
schema:
type: boolean
responses:
'200':
description: Paginated collection of operation runs
content:
application/json:
schema:
type: object
required: [data]
properties:
data:
type: array
items:
$ref: '#/components/schemas/OperationRunListItem'
/api/admin/operations/{operationRun}:
get:
summary: Get one operation run with lifecycle reconciliation detail
operationId: getOperationRun
parameters:
- in: path
name: operationRun
required: true
schema:
type: integer
responses:
'200':
description: Operation run detail
content:
application/json:
schema:
$ref: '#/components/schemas/OperationRunDetail'
'404':
description: Run not found or caller not entitled to the run scope
components:
schemas:
OperationRunListItem:
type: object
required:
- id
- type
- status
- outcome
- freshness_state
- reconciled
- created_at
properties:
id:
type: integer
type:
type: string
type_label:
type: string
status:
type: string
enum: [queued, running, completed]
outcome:
type: string
enum: [pending, succeeded, partially_succeeded, blocked, failed]
freshness_state:
type: string
enum: [fresh_active, likely_stale, reconciled_failed, terminal_normal]
reconciled:
type: boolean
tenant_id:
type: integer
nullable: true
initiator_name:
type: string
nullable: true
operator_message:
type: string
description: Operator-safe summary line shown by default on Monitoring surfaces.
created_at:
type: string
format: date-time
started_at:
type: string
format: date-time
nullable: true
completed_at:
type: string
format: date-time
nullable: true
OperationRunDetail:
allOf:
- $ref: '#/components/schemas/OperationRunListItem'
- type: object
properties:
summary_counts:
type: object
additionalProperties:
type: number
failure_summary:
type: array
items:
$ref: '#/components/schemas/FailureSummaryItem'
reconciliation:
$ref: '#/components/schemas/ReconciliationRecord'
diagnostics:
type: object
description: Secondary lifecycle evidence shown only when diagnostics are revealed.
properties:
threshold_seconds:
type: integer
evidence:
type: object
additionalProperties: true
FailureSummaryItem:
type: object
required: [code, message]
properties:
code:
type: string
message:
type: string
ReconciliationRecord:
type: object
nullable: true
properties:
reconciled_at:
type: string
format: date-time
source:
type: string
enum: [failed_callback, scheduled_reconciler, adapter_reconciler]
reason_code:
type: string
reason_message:
type: string
evidence:
type: object
additionalProperties: true