Agent: - lifecycle: run tracking, middleware hardening, langgraph setup - tests: agent lifecycle + langgraph setup coverage Backend: - async_job_runner: resilience hardening, tests - agent_conversations: run lifecycle integration - translate: scheduler + orchestrator SQL adjustments - schemas/services: agent_lifecycle model extensions Frontend: - TaskDrawer: UX improvements - TaskLogPanel/Viewer: safety hardening, i18n (en/ru) - FilterBar: report filters contract + tests - Reports page: layout adjustments Specs: - 036-agent-test-stabilization: runs contract, modules, events - 037-superset-baseline-engine: catalog schema, testing API, modules - 038-dashboard-scenario-model: scenario schema, capture profile, modules - 039-dashboard-scenario-ui: screen models, release verification UX, modules - dashboard-verification-usecases: new cross-cutting spec
177 lines
7.2 KiB
YAML
177 lines
7.2 KiB
YAML
openapi: 3.1.0
|
|
info:
|
|
title: Dashboard Scenario Compiler API
|
|
version: 0.1.0
|
|
servers:
|
|
- url: /api/dashboard-testing
|
|
paths:
|
|
/scenarios/compile:
|
|
post:
|
|
operationId: compileDashboardScenario
|
|
security: [{ bearerAuth: [] }]
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema: { $ref: '#/components/schemas/CompileRequest' }
|
|
responses:
|
|
'200':
|
|
description: Deterministic scenario plus validation
|
|
content: { application/json: { schema: { $ref: '#/components/schemas/ScenarioResponse' } } }
|
|
'422': { description: Invalid canonical inputs }
|
|
/scenarios/validate:
|
|
post:
|
|
operationId: validateDashboardScenario
|
|
security: [{ bearerAuth: [] }]
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: './dashboard-test-scenario.schema.json'
|
|
responses:
|
|
'200':
|
|
description: Complete validation findings
|
|
content: { application/json: { schema: { $ref: '#/components/schemas/ValidationResult' } } }
|
|
/scenarios/{scenarioId}/resolve:
|
|
post:
|
|
operationId: resolveDashboardScenario
|
|
security: [{ bearerAuth: [] }]
|
|
parameters:
|
|
- { name: scenarioId, in: path, required: true, schema: { type: string } }
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema: { $ref: '#/components/schemas/ResolveRequest' }
|
|
responses:
|
|
'200':
|
|
description: New immutable revision
|
|
content: { application/json: { schema: { $ref: '#/components/schemas/ScenarioResponse' } } }
|
|
'409': { description: Stale base revision }
|
|
'422': { description: Invalid resolution }
|
|
/scenarios/{scenarioId}/draft-pack:
|
|
post:
|
|
operationId: compileScenarioDraftPack
|
|
security: [{ bearerAuth: [] }]
|
|
parameters:
|
|
- { name: scenarioId, in: path, required: true, schema: { type: string } }
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: false
|
|
required: [agent_run_id, revision_hash]
|
|
properties:
|
|
agent_run_id: { type: string, format: uuid }
|
|
revision_hash: { type: string, pattern: '^[a-f0-9]{64}$' }
|
|
responses:
|
|
'201':
|
|
description: Draft pack registered via feature 036
|
|
content: { application/json: { schema: { $ref: '#/components/schemas/DraftPack' } } }
|
|
'409': { description: Revision changed }
|
|
'422': { description: Template, validation, or path failure }
|
|
components:
|
|
securitySchemes:
|
|
bearerAuth: { type: http, scheme: bearer, bearerFormat: JWT }
|
|
schemas:
|
|
CompileRequest:
|
|
type: object
|
|
additionalProperties: false
|
|
required: [agent_run_id, objective, query_model, checklist_catalog_version, baseline_version, capabilities, parameters]
|
|
properties:
|
|
agent_run_id: { type: string, format: uuid }
|
|
objective:
|
|
type: object
|
|
required: [goal, selected_case_ids]
|
|
properties:
|
|
goal: { type: string, maxLength: 2000 }
|
|
selected_case_ids: { type: array, items: { type: string } }
|
|
rationale: { type: [string, 'null'], maxLength: 4000 }
|
|
query_model: { type: object }
|
|
checklist_catalog_version: { const: 1 }
|
|
baseline_version: { type: string }
|
|
capabilities: { type: object }
|
|
parameters: { type: object }
|
|
ValidationResult:
|
|
type: object
|
|
required: [valid, errors, warnings, blockers, coverage, topological_order, graph_hash]
|
|
properties:
|
|
valid: { type: boolean }
|
|
errors: { type: array, items: { type: object } }
|
|
warnings: { type: array, items: { type: object } }
|
|
blockers: { type: array, items: { type: object } }
|
|
coverage: { type: array, items: { type: object } }
|
|
topological_order: { type: array, items: { type: string } }
|
|
unresolved_parameters: { type: array, items: { type: string } }
|
|
unresolved_selectors: { type: array, items: { type: string } }
|
|
unresolved_baselines: { type: array, items: { type: string } }
|
|
graph_hash: { type: string }
|
|
ScenarioResponse:
|
|
type: object
|
|
required: [scenario, validation]
|
|
properties:
|
|
scenario: { $ref: './dashboard-test-scenario.schema.json' }
|
|
validation: { $ref: '#/components/schemas/ValidationResult' }
|
|
ResolveRequest:
|
|
type: object
|
|
additionalProperties: false
|
|
required: [base_revision_hash, changes]
|
|
properties:
|
|
base_revision_hash: { type: string, pattern: '^[a-f0-9]{64}$' }
|
|
changes:
|
|
type: array
|
|
items:
|
|
type: object
|
|
required: [kind, target, value]
|
|
properties:
|
|
kind: { enum: [parameter, selector, manual_conversion, remove_step] }
|
|
target: { type: string }
|
|
value: {}
|
|
reason: { type: [string, 'null'] }
|
|
DraftPack:
|
|
type: object
|
|
required: [scenario_revision_hash, template_version, status, manifest, artifacts, validation_summary, warnings]
|
|
properties:
|
|
scenario_revision_hash: { type: string }
|
|
template_version: { type: string }
|
|
status: { enum: [preview_only, save_eligible] }
|
|
manifest: { type: object }
|
|
artifacts: { type: array, items: { type: object } }
|
|
validation_summary: { $ref: '#/components/schemas/ValidationResult' }
|
|
warnings: { type: array, items: { type: object } }
|
|
CaptureSpec:
|
|
type: object
|
|
required: [target, viewport, readiness, method]
|
|
properties:
|
|
target: { type: string, enum: [tab, viewport] }
|
|
tab_identifier: { type: [string, 'null'] }
|
|
viewport: { type: object, required: [width, height], properties: { width: { type: integer }, height: { type: integer } } }
|
|
readiness: { type: string, enum: [canvas_stabilized, network_idle, fixed_wait] }
|
|
readiness_timeout_ms: { type: integer, default: 15000 }
|
|
mask_selectors: { type: array, items: { type: string } }
|
|
method: { type: string, enum: [cdp, full_page, region] }
|
|
VlmFinding:
|
|
type: object
|
|
required: [finding_id, source_artifact_id, severity, code, confidence, description, disposition, model_provenance]
|
|
properties:
|
|
finding_id: { type: string }
|
|
source_artifact_id: { type: string, format: uuid }
|
|
severity: { type: string, enum: [info, warning, error] }
|
|
code: { type: string }
|
|
region: { type: object }
|
|
confidence: { type: number, minimum: 0, maximum: 1 }
|
|
description: { type: string, maxLength: 1000 }
|
|
disposition: { type: string, enum: [unresolved, confirmed, dismissed, inconclusive] }
|
|
disposition_comment: { type: [string, 'null'], maxLength: 2000 }
|
|
model_provenance:
|
|
type: object
|
|
required: [model_id, prompt_version, prompt_template_hash, analyzed_at]
|
|
properties:
|
|
model_id: { type: string }
|
|
prompt_version: { type: string }
|
|
prompt_template_hash: { type: string, pattern: '^[a-f0-9]{64}$' }
|
|
analyzed_at: { type: string, format: date-time }
|