TenantAtlas/specs/233-stale-run-visibility/contracts/operation-run-active-state-visibility.logical.openapi.yaml
ahmido 6fdd45fb02
Some checks failed
Main Confidence / confidence (push) Failing after 53s
feat: surface stale active operation runs (#269)
## Summary
- keep stale active operation runs visible in the tenant progress overlay and polling state
- align tenant and canonical operation surfaces around the shared stale-active presentation contract
- add Spec 233 artifacts and clean the promoted-candidate backlog entries

## Validation
- browser smoke: `/admin/t/18000000-0000-4000-8000-000000000180` -> stale dashboard CTA -> `/admin/operations?tenant_id=7&activeTab=active_stale_attention&problemClass=active_stale_attention` -> `/admin/operations/15`
- verified healthy vs likely-stale tenant cards, canonical stale list row, and canonical run detail consistency

## Notes
- local smoke fixture seeded with one fresh and one stale running `baseline_compare` operation for browser validation
- Pest suite was not re-run in this session before opening this PR

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #269
2026-04-23 15:10:06 +00:00

318 lines
9.4 KiB
YAML

openapi: 3.1.0
info:
title: Operation Run Active-State Visibility Logical Contract
version: 1.0.0
description: |
Internal logical contract for Spec 233. This does not introduce a new public API.
It documents the operator-visible active-state payload semantics that existing
Filament and Livewire surfaces derive from current OperationRun lifecycle truth.
servers:
- url: https://logical.tenantpilot.internal
description: Logical contract namespace only
tags:
- name: TenantActivity
- name: WorkspaceMonitoring
- name: CanonicalRunDetail
paths:
/admin/t/{tenant}/dashboard:
get:
tags: [TenantActivity]
summary: Logical tenant activity summary contract
description: |
Represents the active-state payload that tenant dashboard activity and attention
surfaces must expose. Actual implementation is HTML/Filament, not JSON.
operationId: getTenantDashboardOperationActivitySummary
x-logical-contract: true
parameters:
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: Active-state summary for tenant-visible runs
content:
application/json:
schema:
$ref: '#/components/schemas/TenantActivityOperationsSummary'
'404':
description: Tenant not visible to the current operator
/admin/t/{tenant}/operations/progress:
get:
tags: [TenantActivity]
summary: Logical tenant active-progress overlay contract
description: |
Represents the visible-active payload used by the tenant-local progress overlay.
Stale-active runs remain active for visibility and polling purposes, and
their compact elevation is rendered through the shared badge and Ops UX presenter path.
operationId: getTenantOperationProgressOverlay
x-logical-contract: true
parameters:
- $ref: '#/components/parameters/TenantId'
responses:
'200':
description: Active progress payload for tenant-scoped runs
content:
application/json:
schema:
$ref: '#/components/schemas/TenantOperationProgressOverlay'
'403':
description: Operator is a member but lacks capability to view operation runs
'404':
description: Tenant not visible to the current operator
/admin/operations:
get:
tags: [WorkspaceMonitoring]
summary: Logical canonical operations list contract
description: |
Represents the row-level semantics required by the canonical operations list.
Existing tenant prefilter continuity may be preserved, but active-state meaning
must match the unfiltered list.
operationId: listWorkspaceOperationsWithActiveStateMeaning
x-logical-contract: true
parameters:
- $ref: '#/components/parameters/TenantFilter'
- $ref: '#/components/parameters/ActiveTab'
- $ref: '#/components/parameters/ProblemClass'
responses:
'200':
description: Workspace operations list row contract
content:
application/json:
schema:
$ref: '#/components/schemas/OperationRunCollectionContract'
'404':
description: Workspace scope not visible to the current operator
/admin/operations/{run}:
get:
tags: [CanonicalRunDetail]
summary: Logical canonical run-detail contract
description: |
Represents the top-level summary semantics for a canonical operation-run detail page.
The page remains diagnostic-first while preserving the same active-state meaning seen
on compact tenant and workspace surfaces.
operationId: getCanonicalOperationRunDetailActiveStateSummary
x-logical-contract: true
parameters:
- $ref: '#/components/parameters/RunId'
responses:
'200':
description: Canonical operation-run detail summary contract
content:
application/json:
schema:
$ref: '#/components/schemas/OperationRunDetailContract'
'403':
description: Operator is a member of scope but lacks required capability
'404':
description: Run not visible to the current operator or tenant scope
components:
parameters:
TenantId:
name: tenant
in: path
required: true
schema:
type: integer
minimum: 1
RunId:
name: run
in: path
required: true
schema:
type: integer
minimum: 1
TenantFilter:
name: tenant
in: query
required: false
schema:
type: integer
minimum: 1
description: Optional tenant prefilter preserved from tenant-context navigation
ActiveTab:
name: activeTab
in: query
required: false
schema:
type: string
description: Existing canonical monitoring tab selection
ProblemClass:
name: problemClass
in: query
required: false
schema:
type: string
enum:
- none
- active_stale_attention
- terminal_follow_up
schemas:
OperationRunActiveStateProjection:
type: object
additionalProperties: false
required:
- freshness_state
- problem_class
- surface_category
- is_currently_active
- is_reconciled
- show_in_active_progress
- keep_active_polling
properties:
freshness_state:
type: string
enum:
- fresh_active
- likely_stale
- reconciled_failed
- terminal_normal
- unknown
problem_class:
type: string
enum:
- none
- active_stale_attention
- terminal_follow_up
surface_category:
type: string
enum:
- healthy_active
- past_expected_lifecycle
- likely_stale
- no_longer_active
- unknown
description: |
Derived operator-facing category. Compact surfaces may use
`past_expected_lifecycle` where canonical detail uses `likely_stale`
over the same stale truth.
compact_label:
type: string
nullable: true
diagnostic_label:
type: string
nullable: true
lifecycle_label:
type: string
nullable: true
guidance:
type: string
nullable: true
stale_lineage_note:
type: string
nullable: true
is_currently_active:
type: boolean
is_reconciled:
type: boolean
show_in_active_progress:
type: boolean
keep_active_polling:
type: boolean
OperationRunSurfaceItem:
type: object
additionalProperties: false
required:
- run_id
- operation_label
- active_state
properties:
run_id:
type: integer
minimum: 1
tenant_id:
type: integer
minimum: 1
nullable: true
tenant_label:
type: string
nullable: true
operation_label:
type: string
status_label:
type: string
nullable: true
outcome_label:
type: string
nullable: true
active_state:
$ref: '#/components/schemas/OperationRunActiveStateProjection'
detail_url:
type: string
nullable: true
TenantActivityOperationsSummary:
type: object
additionalProperties: false
required:
- tenant_id
- items
properties:
tenant_id:
type: integer
minimum: 1
items:
type: array
items:
$ref: '#/components/schemas/OperationRunSurfaceItem'
TenantOperationProgressOverlay:
type: object
additionalProperties: false
required:
- tenant_id
- has_visible_active_runs
- poll_interval
- items
properties:
tenant_id:
type: integer
minimum: 1
has_visible_active_runs:
type: boolean
poll_interval:
type: string
nullable: true
enum:
- 10s
items:
type: array
items:
$ref: '#/components/schemas/OperationRunSurfaceItem'
OperationRunCollectionContract:
type: object
additionalProperties: false
required:
- items
properties:
tenant_filter:
type: integer
minimum: 1
nullable: true
active_tab:
type: string
nullable: true
problem_class:
type: string
nullable: true
items:
type: array
items:
$ref: '#/components/schemas/OperationRunSurfaceItem'
OperationRunDetailContract:
type: object
additionalProperties: false
required:
- run_id
- operation_label
- active_state
properties:
run_id:
type: integer
minimum: 1
operation_label:
type: string
active_state:
$ref: '#/components/schemas/OperationRunActiveStateProjection'
top_summary:
type: string
nullable: true
diagnostics_visible_after_summary:
type: boolean
const: true