Some checks failed
Main Confidence / confidence (push) Failing after 53s
## 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
318 lines
9.4 KiB
YAML
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
|