505 lines
14 KiB
YAML
505 lines
14 KiB
YAML
openapi: 3.0.3
|
|
info:
|
|
title: TenantPilot Tenant Dashboard Productization v1 (Conceptual)
|
|
version: 0.1.0
|
|
description: |
|
|
Conceptual contract for the tenant dashboard productization slice in Spec 266.
|
|
|
|
NOTE: These paths describe existing tenant and admin routes reused by the
|
|
implementation. The schemas document expected derived page and view behavior
|
|
for planning purposes only; they do not require a new public REST API.
|
|
servers:
|
|
- url: /
|
|
paths:
|
|
/admin/t/{tenant}:
|
|
get:
|
|
summary: View the productized tenant dashboard
|
|
description: |
|
|
Existing tenant-scoped dashboard route reused as the canonical tenant
|
|
landing page. The implementation stays read-mostly and reuses existing
|
|
findings, exception, review, evidence, review-pack, permissions,
|
|
recovery, and operation truth.
|
|
parameters:
|
|
- in: path
|
|
name: tenant
|
|
required: true
|
|
schema:
|
|
type: string
|
|
description: Tenant id or external id already accepted by the tenant panel.
|
|
responses:
|
|
'200':
|
|
description: Tenant dashboard rendered
|
|
content:
|
|
text/html:
|
|
schema:
|
|
type: string
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TenantDashboardPageModel'
|
|
'404':
|
|
description: Not found for non-members or out-of-scope tenant requests
|
|
|
|
/admin/governance/inbox:
|
|
get:
|
|
summary: Open the canonical governance inbox from the tenant dashboard
|
|
description: |
|
|
Existing admin-plane governance queue reused as a canonical follow-up
|
|
destination. The dashboard may launch it with a tenant prefilter and an
|
|
optional family filter.
|
|
parameters:
|
|
- in: query
|
|
name: tenant_id
|
|
required: false
|
|
schema:
|
|
type: string
|
|
- in: query
|
|
name: family
|
|
required: false
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Governance inbox rendered
|
|
content:
|
|
text/html:
|
|
schema:
|
|
type: string
|
|
'403':
|
|
description: Forbidden when the current workspace scope has no visible governance family
|
|
'404':
|
|
description: Not found for non-members or out-of-scope tenant filters
|
|
|
|
/admin/operations:
|
|
get:
|
|
summary: Open canonical operations from the tenant dashboard
|
|
description: |
|
|
Existing canonical operations surface reused for recent-operation and
|
|
operation follow-up links. The dashboard preserves tenant-prefilter
|
|
continuity with the current query-state contract.
|
|
parameters:
|
|
- in: query
|
|
name: tenant_id
|
|
required: false
|
|
schema:
|
|
type: string
|
|
- in: query
|
|
name: tenant_scope
|
|
required: false
|
|
schema:
|
|
type: string
|
|
- in: query
|
|
name: problemClass
|
|
required: false
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Operations page rendered
|
|
content:
|
|
text/html:
|
|
schema:
|
|
type: string
|
|
'404':
|
|
description: Not found for non-members or tenant filters outside entitled scope
|
|
|
|
/admin/t/{tenant}/findings:
|
|
get:
|
|
summary: Open tenant findings from the dashboard
|
|
description: Existing tenant findings list reused by KPI and recommended-action follow-up links.
|
|
parameters:
|
|
- in: path
|
|
name: tenant
|
|
required: true
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Findings list rendered
|
|
content:
|
|
text/html:
|
|
schema:
|
|
type: string
|
|
'403':
|
|
description: Forbidden for an in-scope actor missing findings capability
|
|
'404':
|
|
description: Not found for non-members or out-of-scope tenant requests
|
|
|
|
/admin/t/{tenant}/finding-exceptions:
|
|
get:
|
|
summary: Open tenant risk exceptions from the dashboard
|
|
description: Existing tenant exception list reused for risk and pending-decision follow-up.
|
|
parameters:
|
|
- in: path
|
|
name: tenant
|
|
required: true
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Finding exception list rendered
|
|
content:
|
|
text/html:
|
|
schema:
|
|
type: string
|
|
'403':
|
|
description: Forbidden for an in-scope actor missing exception capability
|
|
'404':
|
|
description: Not found for non-members or out-of-scope tenant requests
|
|
|
|
/admin/tenants/{tenant}/required-permissions:
|
|
get:
|
|
summary: Open required permissions from the dashboard
|
|
description: Existing required-permissions route reused for provider-health follow-up.
|
|
parameters:
|
|
- in: path
|
|
name: tenant
|
|
required: true
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Required permissions page rendered
|
|
content:
|
|
text/html:
|
|
schema:
|
|
type: string
|
|
'403':
|
|
description: Forbidden for an in-scope actor missing capability
|
|
'404':
|
|
description: Not found for non-members or out-of-scope tenant requests
|
|
|
|
/admin/reviews/workspace:
|
|
get:
|
|
summary: Open customer-safe review workspace from the tenant dashboard
|
|
description: Existing review workspace reused for output-readiness follow-up when the actor is entitled.
|
|
parameters:
|
|
- in: query
|
|
name: tenant
|
|
required: false
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Customer review workspace rendered
|
|
content:
|
|
text/html:
|
|
schema:
|
|
type: string
|
|
'404':
|
|
description: Not found for non-members or tenants outside current scope
|
|
|
|
/admin/t/{tenant}/reviews:
|
|
get:
|
|
summary: Open tenant reviews from the dashboard
|
|
description: Existing tenant review resource reused for review drill-through and current review continuity.
|
|
parameters:
|
|
- in: path
|
|
name: tenant
|
|
required: true
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Tenant reviews list or detail entry rendered
|
|
content:
|
|
text/html:
|
|
schema:
|
|
type: string
|
|
'403':
|
|
description: Forbidden for an in-scope actor missing review capability
|
|
'404':
|
|
description: Not found for non-members or out-of-scope tenant requests
|
|
|
|
/admin/t/{tenant}/review-packs:
|
|
get:
|
|
summary: Open tenant review packs from the dashboard
|
|
description: Existing review-pack resource reused for output-package continuity.
|
|
parameters:
|
|
- in: path
|
|
name: tenant
|
|
required: true
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Review packs list or detail entry rendered
|
|
content:
|
|
text/html:
|
|
schema:
|
|
type: string
|
|
'403':
|
|
description: Forbidden for an in-scope actor missing review-pack capability
|
|
'404':
|
|
description: Not found for non-members or out-of-scope tenant requests
|
|
|
|
/admin/t/{tenant}/evidence:
|
|
get:
|
|
summary: Open tenant evidence snapshots from the dashboard
|
|
description: Existing evidence resource reused for evidence-readiness follow-up.
|
|
parameters:
|
|
- in: path
|
|
name: tenant
|
|
required: true
|
|
schema:
|
|
type: string
|
|
responses:
|
|
'200':
|
|
description: Evidence snapshots list or detail entry rendered
|
|
content:
|
|
text/html:
|
|
schema:
|
|
type: string
|
|
'403':
|
|
description: Forbidden for an in-scope actor missing evidence capability
|
|
'404':
|
|
description: Not found for non-members or out-of-scope tenant requests
|
|
|
|
components:
|
|
schemas:
|
|
TenantDashboardPageModel:
|
|
type: object
|
|
required:
|
|
- workspace
|
|
- tenant
|
|
- header_actions
|
|
- kpis
|
|
- recommended_actions
|
|
- governance_status_rows
|
|
- recent_operations
|
|
properties:
|
|
workspace:
|
|
$ref: '#/components/schemas/ContextLabel'
|
|
tenant:
|
|
$ref: '#/components/schemas/ContextLabel'
|
|
context_chips:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/ContextChip'
|
|
arrival_context:
|
|
$ref: '#/components/schemas/ArrivalContext'
|
|
nullable: true
|
|
header_actions:
|
|
type: array
|
|
maxItems: 2
|
|
items:
|
|
$ref: '#/components/schemas/DashboardAction'
|
|
kpis:
|
|
type: array
|
|
maxItems: 4
|
|
items:
|
|
$ref: '#/components/schemas/KpiCard'
|
|
recommended_actions:
|
|
type: array
|
|
maxItems: 3
|
|
items:
|
|
$ref: '#/components/schemas/RecommendedAction'
|
|
governance_status_rows:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/GovernanceStatusRow'
|
|
recent_operations:
|
|
type: array
|
|
maxItems: 4
|
|
items:
|
|
$ref: '#/components/schemas/RecentOperationRow'
|
|
current_review:
|
|
$ref: '#/components/schemas/SummaryCard'
|
|
nullable: true
|
|
risk_exception_summary:
|
|
$ref: '#/components/schemas/SummaryCard'
|
|
nullable: true
|
|
provider_health_summary:
|
|
$ref: '#/components/schemas/SummaryCard'
|
|
nullable: true
|
|
output_readiness_summary:
|
|
$ref: '#/components/schemas/SummaryCard'
|
|
nullable: true
|
|
|
|
ContextLabel:
|
|
type: object
|
|
required:
|
|
- label
|
|
- value
|
|
properties:
|
|
label:
|
|
type: string
|
|
value:
|
|
type: string
|
|
|
|
ContextChip:
|
|
type: object
|
|
required:
|
|
- label
|
|
properties:
|
|
label:
|
|
type: string
|
|
value:
|
|
type: string
|
|
nullable: true
|
|
|
|
ArrivalContext:
|
|
type: object
|
|
properties:
|
|
title:
|
|
type: string
|
|
body:
|
|
type: string
|
|
action:
|
|
$ref: '#/components/schemas/DashboardAction'
|
|
nullable: true
|
|
|
|
DashboardAction:
|
|
type: object
|
|
required:
|
|
- label
|
|
- style
|
|
- availability_state
|
|
properties:
|
|
label:
|
|
type: string
|
|
style:
|
|
type: string
|
|
enum:
|
|
- primary
|
|
- secondary
|
|
availability_state:
|
|
type: string
|
|
enum:
|
|
- available
|
|
- unavailable
|
|
- absent
|
|
url:
|
|
type: string
|
|
nullable: true
|
|
helper_text:
|
|
type: string
|
|
nullable: true
|
|
|
|
KpiCard:
|
|
type: object
|
|
required:
|
|
- key
|
|
- label
|
|
- value
|
|
- status_label
|
|
properties:
|
|
key:
|
|
type: string
|
|
label:
|
|
type: string
|
|
value:
|
|
type: string
|
|
supporting_text:
|
|
type: string
|
|
nullable: true
|
|
status_label:
|
|
type: string
|
|
badge_state:
|
|
type: string
|
|
nullable: true
|
|
trend_label:
|
|
type: string
|
|
nullable: true
|
|
primary_link:
|
|
$ref: '#/components/schemas/DashboardAction'
|
|
nullable: true
|
|
|
|
RecommendedAction:
|
|
type: object
|
|
required:
|
|
- priority
|
|
- title
|
|
- reason
|
|
- impact
|
|
- cta
|
|
properties:
|
|
priority:
|
|
type: integer
|
|
category:
|
|
type: string
|
|
nullable: true
|
|
title:
|
|
type: string
|
|
reason:
|
|
type: string
|
|
impact:
|
|
type: string
|
|
cta:
|
|
$ref: '#/components/schemas/DashboardAction'
|
|
|
|
GovernanceStatusRow:
|
|
type: object
|
|
required:
|
|
- key
|
|
- label
|
|
- description
|
|
- status_label
|
|
properties:
|
|
key:
|
|
type: string
|
|
label:
|
|
type: string
|
|
description:
|
|
type: string
|
|
status_label:
|
|
type: string
|
|
badge_state:
|
|
type: string
|
|
nullable: true
|
|
support_link:
|
|
$ref: '#/components/schemas/DashboardAction'
|
|
nullable: true
|
|
|
|
RecentOperationRow:
|
|
type: object
|
|
required:
|
|
- operation_run_id
|
|
- label
|
|
- relative_time
|
|
properties:
|
|
operation_run_id:
|
|
type: integer
|
|
label:
|
|
type: string
|
|
status_label:
|
|
type: string
|
|
nullable: true
|
|
outcome_label:
|
|
type: string
|
|
nullable: true
|
|
relative_time:
|
|
type: string
|
|
summary_text:
|
|
type: string
|
|
nullable: true
|
|
detail_url:
|
|
type: string
|
|
nullable: true
|
|
|
|
SummaryCard:
|
|
type: object
|
|
required:
|
|
- title
|
|
- availability_state
|
|
properties:
|
|
title:
|
|
type: string
|
|
headline:
|
|
type: string
|
|
nullable: true
|
|
supporting_lines:
|
|
type: array
|
|
items:
|
|
type: string
|
|
availability_state:
|
|
type: string
|
|
enum:
|
|
- available
|
|
- unavailable
|
|
- absent
|
|
cta:
|
|
$ref: '#/components/schemas/DashboardAction'
|
|
nullable: true
|
|
helper_text:
|
|
type: string
|
|
nullable: true |