342 lines
9.9 KiB
YAML
342 lines
9.9 KiB
YAML
openapi: 3.1.0
|
|
info:
|
|
title: Tenant Review Layer Internal Contract
|
|
version: 0.1.0
|
|
description: |
|
|
Internal admin-plane contract for tenant review library, review lifecycle actions,
|
|
and executive-pack export based on the Tenant Review Layer spec.
|
|
servers:
|
|
- url: /admin
|
|
paths:
|
|
/t/{tenant}/reviews:
|
|
get:
|
|
summary: List tenant reviews
|
|
operationId: listTenantReviews
|
|
parameters:
|
|
- $ref: '#/components/parameters/TenantPath'
|
|
- $ref: '#/components/parameters/ReviewStatusFilter'
|
|
- $ref: '#/components/parameters/PublicationStateFilter'
|
|
responses:
|
|
'200':
|
|
description: Tenant review library
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/TenantReviewSummary'
|
|
'403':
|
|
$ref: '#/components/responses/Forbidden'
|
|
'404':
|
|
$ref: '#/components/responses/NotFound'
|
|
post:
|
|
summary: Create tenant review from evidence basis
|
|
operationId: createTenantReview
|
|
parameters:
|
|
- $ref: '#/components/parameters/TenantPath'
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required: [evidence_snapshot_id]
|
|
properties:
|
|
evidence_snapshot_id:
|
|
type: integer
|
|
include_operations_summary:
|
|
type: boolean
|
|
default: true
|
|
responses:
|
|
'202':
|
|
description: Review composition accepted or queued
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TenantReviewMutationResult'
|
|
'403':
|
|
$ref: '#/components/responses/Forbidden'
|
|
'404':
|
|
$ref: '#/components/responses/NotFound'
|
|
'422':
|
|
$ref: '#/components/responses/ValidationError'
|
|
/t/{tenant}/reviews/{review}:
|
|
get:
|
|
summary: View tenant review detail
|
|
operationId: viewTenantReview
|
|
parameters:
|
|
- $ref: '#/components/parameters/TenantPath'
|
|
- $ref: '#/components/parameters/ReviewPath'
|
|
responses:
|
|
'200':
|
|
description: Tenant review detail
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TenantReviewDetail'
|
|
'403':
|
|
$ref: '#/components/responses/Forbidden'
|
|
'404':
|
|
$ref: '#/components/responses/NotFound'
|
|
/t/{tenant}/reviews/{review}/refresh:
|
|
post:
|
|
summary: Refresh review into a successor draft
|
|
operationId: refreshTenantReview
|
|
parameters:
|
|
- $ref: '#/components/parameters/TenantPath'
|
|
- $ref: '#/components/parameters/ReviewPath'
|
|
responses:
|
|
'202':
|
|
description: Review refresh accepted or queued
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TenantReviewMutationResult'
|
|
'403':
|
|
$ref: '#/components/responses/Forbidden'
|
|
'404':
|
|
$ref: '#/components/responses/NotFound'
|
|
'409':
|
|
description: Review cannot be refreshed in current state
|
|
/t/{tenant}/reviews/{review}/publish:
|
|
post:
|
|
summary: Publish review
|
|
operationId: publishTenantReview
|
|
parameters:
|
|
- $ref: '#/components/parameters/TenantPath'
|
|
- $ref: '#/components/parameters/ReviewPath'
|
|
responses:
|
|
'200':
|
|
description: Review published
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TenantReviewMutationResult'
|
|
'403':
|
|
$ref: '#/components/responses/Forbidden'
|
|
'404':
|
|
$ref: '#/components/responses/NotFound'
|
|
'409':
|
|
description: Review not publication-ready
|
|
/t/{tenant}/reviews/{review}/archive:
|
|
post:
|
|
summary: Archive review
|
|
operationId: archiveTenantReview
|
|
parameters:
|
|
- $ref: '#/components/parameters/TenantPath'
|
|
- $ref: '#/components/parameters/ReviewPath'
|
|
responses:
|
|
'200':
|
|
description: Review archived
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/TenantReviewMutationResult'
|
|
'403':
|
|
$ref: '#/components/responses/Forbidden'
|
|
'404':
|
|
$ref: '#/components/responses/NotFound'
|
|
'409':
|
|
description: Review cannot be archived in current state
|
|
/t/{tenant}/reviews/{review}/export:
|
|
post:
|
|
summary: Generate executive review pack
|
|
operationId: exportExecutiveReviewPack
|
|
parameters:
|
|
- $ref: '#/components/parameters/TenantPath'
|
|
- $ref: '#/components/parameters/ReviewPath'
|
|
requestBody:
|
|
required: false
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
include_pii:
|
|
type: boolean
|
|
default: true
|
|
responses:
|
|
'202':
|
|
description: Executive pack generation accepted or queued
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ReviewPackMutationResult'
|
|
'403':
|
|
$ref: '#/components/responses/Forbidden'
|
|
'404':
|
|
$ref: '#/components/responses/NotFound'
|
|
'409':
|
|
description: Review export blocked by readiness rules
|
|
/reviews:
|
|
get:
|
|
summary: List canonical workspace review register
|
|
operationId: listWorkspaceReviews
|
|
parameters:
|
|
- $ref: '#/components/parameters/TenantFilter'
|
|
- $ref: '#/components/parameters/ReviewStatusFilter'
|
|
- $ref: '#/components/parameters/PublicationStateFilter'
|
|
responses:
|
|
'200':
|
|
description: Canonical workspace review register
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/TenantReviewRegisterRow'
|
|
'403':
|
|
$ref: '#/components/responses/Forbidden'
|
|
'404':
|
|
$ref: '#/components/responses/NotFound'
|
|
components:
|
|
parameters:
|
|
TenantPath:
|
|
name: tenant
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
ReviewPath:
|
|
name: review
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: integer
|
|
TenantFilter:
|
|
name: tenant_id
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: integer
|
|
ReviewStatusFilter:
|
|
name: status
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
enum: [draft, ready, published, archived, superseded, failed]
|
|
PublicationStateFilter:
|
|
name: publication_state
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
enum: [unpublished, published]
|
|
responses:
|
|
Forbidden:
|
|
description: Member lacks required capability
|
|
NotFound:
|
|
description: Workspace or tenant scope not visible to caller
|
|
ValidationError:
|
|
description: Request validation failed
|
|
schemas:
|
|
TenantReviewSummary:
|
|
type: object
|
|
required: [id, tenant_id, status, completeness_state]
|
|
properties:
|
|
id:
|
|
type: integer
|
|
tenant_id:
|
|
type: integer
|
|
evidence_snapshot_id:
|
|
type: integer
|
|
status:
|
|
type: string
|
|
completeness_state:
|
|
type: string
|
|
generated_at:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
published_at:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
TenantReviewRegisterRow:
|
|
allOf:
|
|
- $ref: '#/components/schemas/TenantReviewSummary'
|
|
- type: object
|
|
properties:
|
|
tenant_name:
|
|
type: string
|
|
has_ready_export:
|
|
type: boolean
|
|
publish_blockers_count:
|
|
type: integer
|
|
TenantReviewDetail:
|
|
allOf:
|
|
- $ref: '#/components/schemas/TenantReviewSummary'
|
|
- type: object
|
|
properties:
|
|
executive_summary:
|
|
type: object
|
|
additionalProperties: true
|
|
sections:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/TenantReviewSection'
|
|
latest_export:
|
|
$ref: '#/components/schemas/ReviewPackSummary'
|
|
TenantReviewSection:
|
|
type: object
|
|
required: [section_key, title, sort_order, completeness_state]
|
|
properties:
|
|
section_key:
|
|
type: string
|
|
title:
|
|
type: string
|
|
sort_order:
|
|
type: integer
|
|
completeness_state:
|
|
type: string
|
|
summary_payload:
|
|
type: object
|
|
additionalProperties: true
|
|
ReviewPackSummary:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: integer
|
|
status:
|
|
type: string
|
|
generated_at:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
expires_at:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
TenantReviewMutationResult:
|
|
type: object
|
|
required: [review_id, status]
|
|
properties:
|
|
review_id:
|
|
type: integer
|
|
status:
|
|
type: string
|
|
operation_run_id:
|
|
type: integer
|
|
nullable: true
|
|
message:
|
|
type: string
|
|
ReviewPackMutationResult:
|
|
type: object
|
|
required: [review_pack_id, status]
|
|
properties:
|
|
review_pack_id:
|
|
type: integer
|
|
status:
|
|
type: string
|
|
operation_run_id:
|
|
type: integer
|
|
nullable: true
|
|
message:
|
|
type: string |