@cat-factory/server 0.259.0 → 0.259.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/modules/publicApi/openapiDocument.generated.d.ts +1 -1
- package/dist/modules/publicApi/openapiDocument.generated.d.ts.map +1 -1
- package/dist/modules/publicApi/openapiDocument.generated.js +1 -1
- package/dist/modules/publicApi/openapiDocument.generated.js.map +1 -1
- package/package.json +7 -7
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const OPENAPI_JSON = "{\n \"components\": {\n \"schemas\": {\n \"AcceptanceCriterion\": {\n \"properties\": {\n \"given\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"id\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"outcome\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"when\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"given\",\n \"when\",\n \"outcome\"\n ],\n \"type\": \"object\"\n },\n \"CreateHeadlessPublicApiKey\": {\n \"properties\": {\n \"externalIdentity\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"pattern\": \"^[^\\\\x00-\\\\x1f\\\\x7f\\\\x80-\\\\x9f]+$\",\n \"type\": \"string\"\n },\n \"label\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"scope\": {\n \"enum\": [\n \"read\",\n \"write\",\n \"decide\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"label\"\n ],\n \"type\": \"object\"\n },\n \"CreatePublicJob\": {\n \"properties\": {\n \"input\": {\n \"maxLength\": 50000,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"pipelineId\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"title\": {\n \"maxLength\": 200,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"pipelineId\",\n \"input\"\n ],\n \"type\": \"object\"\n },\n \"CreatePublicTask\": {\n \"properties\": {\n \"description\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"documents\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicTaskDocument\"\n },\n \"maxItems\": 10,\n \"type\": \"array\"\n },\n \"fields\": {\n \"additionalProperties\": {\n \"anyOf\": [\n {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n {\n \"items\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"maxItems\": 50,\n \"type\": \"array\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"propertyNames\": {\n \"maxLength\": 80,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"type\": \"object\"\n },\n \"taskType\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"feature\",\n \"bug\",\n \"document\",\n \"spike\",\n \"review\",\n \"ralph\"\n ],\n \"type\": \"string\"\n },\n {\n \"pattern\": \"^[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*$\",\n \"type\": \"string\"\n }\n ]\n },\n \"ticket\": {\n \"$ref\": \"#/components/schemas/PublicTaskTicket\"\n },\n \"title\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"title\"\n ],\n \"type\": \"object\"\n },\n \"CreatedPublicApiKey\": {\n \"properties\": {\n \"key\": {\n \"$ref\": \"#/components/schemas/PublicApiKey\"\n },\n \"secret\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"key\",\n \"secret\"\n ],\n \"type\": \"object\"\n },\n \"DocumentFreshness\": {\n \"oneOf\": [\n {\n \"properties\": {\n \"change\": {\n \"enum\": [\n \"unchanged\",\n \"reimported\",\n \"revision_only\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"confirmed\"\n },\n \"version\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\",\n \"version\",\n \"change\"\n ],\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"status\": {\n \"const\": \"not-applicable\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"reason\": {\n \"enum\": [\n \"not_connected\",\n \"credentials_unreadable\",\n \"unversioned\",\n \"source_unreachable\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"unconfirmed\"\n }\n },\n \"required\": [\n \"status\",\n \"reason\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"DomainRule\": {\n \"properties\": {\n \"id\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"rationale\": {\n \"default\": \"\",\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"rule\": {\n \"maxLength\": 4000,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"sourceBlockIds\": {\n \"default\": [],\n \"items\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"id\",\n \"rule\"\n ],\n \"type\": \"object\"\n },\n \"ErrorResponse\": {\n \"properties\": {\n \"error\": {\n \"properties\": {\n \"code\": {\n \"type\": \"string\"\n },\n \"details\": {},\n \"issues\": {\n \"items\": {\n \"properties\": {\n \"message\": {\n \"type\": \"string\"\n },\n \"path\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"message\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"message\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"code\",\n \"message\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"error\"\n ],\n \"type\": \"object\"\n },\n \"Notification\": {\n \"properties\": {\n \"blockId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"body\": {\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"executionId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"payload\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"assessment\": {\n \"properties\": {\n \"complexity\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"impact\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"rationale\": {\n \"type\": \"string\"\n },\n \"risk\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"complexity\",\n \"risk\",\n \"impact\",\n \"rationale\"\n ],\n \"type\": \"object\"\n },\n \"budgetAlerts\": {\n \"items\": {\n \"properties\": {\n \"projectedOverrun\": {\n \"type\": \"boolean\"\n },\n \"threshold\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"tier\": {\n \"enum\": [\n \"workspace\",\n \"account\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"tier\",\n \"threshold\",\n \"projectedOverrun\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"budgetPeriodStart\": {\n \"type\": \"number\"\n },\n \"changeClass\": {\n \"enum\": [\n \"docs\",\n \"test\",\n \"dependency\",\n \"config\",\n \"source\",\n \"schema\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"driftAffected\": {\n \"items\": {\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"reason\": {\n \"enum\": [\n \"key-mismatch\",\n \"corrupt\"\n ],\n \"type\": \"string\"\n },\n \"sealedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"source\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"source\",\n \"id\",\n \"label\",\n \"reason\",\n \"sealedAt\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"findingCount\": {\n \"type\": \"number\"\n },\n \"forkCount\": {\n \"type\": \"number\"\n },\n \"initiativeReason\": {\n \"enum\": [\n \"item_blocked\",\n \"complete\",\n \"checkpoint\"\n ],\n \"type\": \"string\"\n },\n \"mergeTrackRecordId\": {\n \"type\": \"string\"\n },\n \"mergedRepos\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"onCallAssessment\": {\n \"properties\": {\n \"culpritConfidence\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"evidence\": {\n \"default\": [],\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"rationale\": {\n \"type\": \"string\"\n },\n \"recommendation\": {\n \"enum\": [\n \"revert\",\n \"hold\",\n \"monitor\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"culpritConfidence\",\n \"recommendation\",\n \"rationale\"\n ],\n \"type\": \"object\"\n },\n \"pipelineName\": {\n \"type\": \"string\"\n },\n \"platformAlertFailureKinds\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"platformAlertTransition\": {\n \"type\": \"number\"\n },\n \"platformAlerts\": {\n \"items\": {\n \"enum\": [\n \"failure_rate_high\",\n \"duration_p99_high\",\n \"backlog_high\",\n \"throughput_stalled\",\n \"failure_kind_dominant\",\n \"failure_kind_rate_high\",\n \"sweep_degraded\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"platformFailedTotal\": {\n \"type\": \"number\"\n },\n \"platformFailingRuns\": {\n \"items\": {\n \"properties\": {\n \"blockId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"executionId\": {\n \"type\": \"string\"\n },\n \"failureKind\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"executionId\",\n \"blockId\",\n \"failureKind\",\n \"createdAt\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"platformWindow\": {\n \"enum\": [\n \"1h\",\n \"24h\",\n \"7d\"\n ],\n \"type\": \"string\"\n },\n \"prUrl\": {\n \"type\": \"string\"\n },\n \"releaseSignals\": {\n \"items\": {\n \"properties\": {\n \"detail\": {\n \"type\": \"string\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"kind\": {\n \"enum\": [\n \"monitor\",\n \"slo\"\n ],\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"state\": {\n \"enum\": [\n \"ok\",\n \"warn\",\n \"alert\",\n \"no_data\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"id\",\n \"name\",\n \"state\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"revertUrl\": {\n \"type\": \"string\"\n },\n \"sliceCount\": {\n \"type\": \"number\"\n },\n \"targetUserId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"unmergedRepos\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"unreachableAreas\": {\n \"items\": {\n \"enum\": [\n \"ephemeralEnvironments\",\n \"agentExecutor\",\n \"binaryStorage\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"resolvedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"severity\": {\n \"enum\": [\n \"normal\",\n \"urgent\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"open\",\n \"acted\",\n \"dismissed\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"enum\": [\n \"merge_review\",\n \"pipeline_complete\",\n \"ci_failed\",\n \"test_failed\",\n \"requirement_review\",\n \"clarity_review\",\n \"release_regression\",\n \"decision_required\",\n \"human_test_ready\",\n \"visual_confirmation_ready\",\n \"human_review\",\n \"followup_pending\",\n \"fork_decision_pending\",\n \"judge_review\",\n \"pr_review_ready\",\n \"initiative\",\n \"platform_health\",\n \"infra_unreachable\",\n \"budget_paused\",\n \"budget_threshold\",\n \"key_drift\",\n \"merge_tag_request\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"type\",\n \"status\",\n \"blockId\",\n \"executionId\",\n \"title\",\n \"body\",\n \"createdAt\",\n \"resolvedAt\"\n ],\n \"type\": \"object\"\n },\n \"NotificationWebhook\": {\n \"properties\": {\n \"alertEvents\": {\n \"items\": {\n \"enum\": [\n \"platform_health.firing\",\n \"platform_health.resolved\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"enabled\": {\n \"type\": \"boolean\"\n },\n \"hasSecret\": {\n \"type\": \"boolean\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"runEvents\": {\n \"items\": {\n \"enum\": [\n \"run.started\",\n \"run.completed\",\n \"run.failed\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"types\": {\n \"items\": {\n \"enum\": [\n \"merge_review\",\n \"pipeline_complete\",\n \"ci_failed\",\n \"test_failed\",\n \"requirement_review\",\n \"clarity_review\",\n \"release_regression\",\n \"decision_required\",\n \"human_test_ready\",\n \"visual_confirmation_ready\",\n \"human_review\",\n \"followup_pending\",\n \"fork_decision_pending\",\n \"judge_review\",\n \"pr_review_ready\",\n \"initiative\",\n \"platform_health\",\n \"infra_unreachable\",\n \"budget_paused\",\n \"budget_threshold\",\n \"key_drift\",\n \"merge_tag_request\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"updatedAt\": {\n \"type\": \"number\"\n },\n \"url\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"name\",\n \"url\",\n \"types\",\n \"runEvents\",\n \"alertEvents\",\n \"enabled\",\n \"hasSecret\",\n \"updatedAt\"\n ],\n \"type\": \"object\"\n },\n \"PrReportCheck\": {\n \"properties\": {\n \"conclusion\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"repo\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"name\",\n \"conclusion\"\n ],\n \"type\": \"object\"\n },\n \"PrReportCi\": {\n \"properties\": {\n \"failingChecks\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportCheck\"\n },\n \"type\": \"array\"\n },\n \"fixerAttempts\": {\n \"type\": \"number\"\n },\n \"headSha\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"maxFixerAttempts\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"verdict\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"pass\",\n \"pending\",\n \"fail\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"status\",\n \"failingChecks\",\n \"fixerAttempts\"\n ],\n \"type\": \"object\"\n },\n \"PrReportContext\": {\n \"properties\": {\n \"documents\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportContextDocument\"\n },\n \"type\": \"array\"\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\",\n \"documents\"\n ],\n \"type\": \"object\"\n },\n \"PrReportContextDocument\": {\n \"properties\": {\n \"freshness\": {\n \"$ref\": \"#/components/schemas/DocumentFreshness\"\n },\n \"movedDuringRun\": {\n \"type\": \"boolean\"\n },\n \"origin\": {\n \"enum\": [\n \"confluence\",\n \"notion\",\n \"github\",\n \"figma\",\n \"zeplin\",\n \"linear\",\n \"upload\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"title\",\n \"url\",\n \"origin\",\n \"movedDuringRun\"\n ],\n \"type\": \"object\"\n },\n \"PrReportEnvironments\": {\n \"properties\": {\n \"entries\": {\n \"items\": {\n \"properties\": {\n \"error\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"frameId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"ready\",\n \"failed\",\n \"skipped\"\n ],\n \"type\": \"string\"\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"frameId\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"evidence\": {\n \"properties\": {\n \"capturedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outcomes\": {\n \"type\": \"number\"\n },\n \"ranAgainst\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"local\",\n \"ephemeral\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"requirementVerdicts\": {\n \"type\": \"number\"\n },\n \"screenshots\": {\n \"items\": {\n \"properties\": {\n \"artifactId\": {\n \"type\": \"string\"\n },\n \"hasReference\": {\n \"type\": \"boolean\"\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"view\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"view\",\n \"artifactId\",\n \"hasReference\",\n \"url\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"status\": {\n \"enum\": [\n \"captured\",\n \"local\",\n \"undeclared\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"status\",\n \"ranAgainst\",\n \"capturedAt\",\n \"outcomes\",\n \"requirementVerdicts\",\n \"screenshots\",\n \"url\"\n ],\n \"type\": \"object\"\n },\n \"gaps\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"proof\": {\n \"enum\": [\n \"complete\",\n \"incomplete\",\n \"not_applicable\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"teardown\": {\n \"enum\": [\n \"confirmed\",\n \"unconfirmed\",\n \"pending\",\n \"failed\",\n \"not_applicable\"\n ],\n \"type\": \"string\"\n },\n \"timeline\": {\n \"properties\": {\n \"gap\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"unwired\",\n \"unreadable\",\n \"truncated\",\n \"not_provisioned\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"provisionFailures\": {\n \"type\": \"number\"\n },\n \"provisionedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"teardownFailures\": {\n \"type\": \"number\"\n },\n \"teardownsUnconfirmed\": {\n \"type\": \"number\"\n },\n \"tornDownAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"gap\",\n \"provisionedAt\",\n \"tornDownAt\",\n \"provisionFailures\",\n \"teardownFailures\",\n \"teardownsUnconfirmed\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"status\",\n \"entries\",\n \"teardown\",\n \"timeline\",\n \"evidence\",\n \"proof\",\n \"gaps\"\n ],\n \"type\": \"object\"\n },\n \"PrReportIssue\": {\n \"properties\": {\n \"externalId\": {\n \"type\": \"string\"\n },\n \"source\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"source\",\n \"externalId\",\n \"title\",\n \"url\"\n ],\n \"type\": \"object\"\n },\n \"PrReportJudge\": {\n \"properties\": {\n \"bounces\": {\n \"type\": \"number\"\n },\n \"disposition\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"pass\",\n \"park\",\n \"bounce\",\n \"fail\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"findings\": {\n \"items\": {\n \"properties\": {\n \"detail\": {\n \"type\": \"string\"\n },\n \"severity\": {\n \"enum\": [\n \"low\",\n \"medium\",\n \"high\",\n \"critical\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"where\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"title\",\n \"severity\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"maxBounces\": {\n \"type\": \"number\"\n },\n \"model\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"modelPin\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"requested\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"applied\",\n \"overridden\",\n \"unavailable\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"requested\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rubricName\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rubricOverridden\": {\n \"type\": \"boolean\"\n },\n \"score\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"stepKind\": {\n \"type\": \"string\"\n },\n \"summary\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"threshold\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"stepKind\",\n \"rubricName\",\n \"rubricOverridden\",\n \"score\",\n \"threshold\",\n \"disposition\",\n \"summary\",\n \"findings\",\n \"bounces\",\n \"maxBounces\",\n \"model\"\n ],\n \"type\": \"object\"\n },\n \"PrReportJudges\": {\n \"properties\": {\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"verdicts\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportJudge\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"status\",\n \"verdicts\"\n ],\n \"type\": \"object\"\n },\n \"PrReportMerge\": {\n \"properties\": {\n \"assessment\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"complexity\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"impact\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"rationale\": {\n \"type\": \"string\"\n },\n \"risk\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"complexity\",\n \"risk\",\n \"impact\",\n \"rationale\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outcome\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"presetName\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"reason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"PrReportObservability\": {\n \"properties\": {\n \"reportUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"trajectoryUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"runUrl\",\n \"trajectoryUrl\",\n \"reportUrl\"\n ],\n \"type\": \"object\"\n },\n \"PrReportReproduction\": {\n \"properties\": {\n \"alternativeVerification\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"at\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"attempts\": {\n \"type\": \"number\"\n },\n \"base\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"durationMs\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"exitCode\": {\n \"type\": \"number\"\n },\n \"outputTail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"passed\": {\n \"type\": \"boolean\"\n },\n \"setupFailed\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"timedOut\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"exitCode\",\n \"passed\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"command\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"final\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"durationMs\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"exitCode\": {\n \"type\": \"number\"\n },\n \"outputTail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"passed\": {\n \"type\": \"boolean\"\n },\n \"setupFailed\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"timedOut\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"exitCode\",\n \"passed\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"maxAttempts\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"observation\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"omittedTestPaths\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"reason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"testPaths\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"verdict\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"reproduced\",\n \"inconclusive\",\n \"declared_infeasible\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"status\",\n \"testPaths\",\n \"attempts\"\n ],\n \"type\": \"object\"\n },\n \"PrReportRequirements\": {\n \"properties\": {\n \"entries\": {\n \"items\": {\n \"properties\": {\n \"criteriaCount\": {\n \"type\": \"number\"\n },\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"group\": {\n \"type\": \"string\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"module\": {\n \"type\": \"string\"\n },\n \"priority\": {\n \"enum\": [\n \"must\",\n \"should\",\n \"could\"\n ],\n \"type\": \"string\"\n },\n \"state\": {\n \"enum\": [\n \"aspirational\",\n \"established\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"verdict\": {\n \"enum\": [\n \"met\",\n \"not_met\",\n \"not_covered\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"title\",\n \"module\",\n \"group\",\n \"priority\",\n \"state\",\n \"verdict\",\n \"detail\",\n \"criteriaCount\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"met\": {\n \"type\": \"number\"\n },\n \"notCovered\": {\n \"type\": \"number\"\n },\n \"notMet\": {\n \"type\": \"number\"\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"regressions\": {\n \"type\": \"number\"\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"total\": {\n \"type\": \"number\"\n },\n \"unmatchedVerdicts\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"status\",\n \"entries\",\n \"met\",\n \"notMet\",\n \"notCovered\",\n \"regressions\",\n \"total\"\n ],\n \"type\": \"object\"\n },\n \"PrReportRun\": {\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"blockTitle\": {\n \"type\": \"string\"\n },\n \"executionId\": {\n \"type\": \"string\"\n },\n \"issues\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportIssue\"\n },\n \"type\": \"array\"\n },\n \"pipelineId\": {\n \"type\": \"string\"\n },\n \"pipelineName\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"github\",\n \"gitlab\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"repo\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"startedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"steps\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportStep\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"executionId\",\n \"blockId\",\n \"blockTitle\",\n \"pipelineId\",\n \"pipelineName\",\n \"steps\",\n \"issues\"\n ],\n \"type\": \"object\"\n },\n \"PrReportStep\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"index\": {\n \"type\": \"number\"\n },\n \"model\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"state\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"index\",\n \"agentKind\",\n \"state\"\n ],\n \"type\": \"object\"\n },\n \"PrReportTestConcern\": {\n \"properties\": {\n \"severity\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"title\",\n \"severity\"\n ],\n \"type\": \"object\"\n },\n \"PrReportTestOutcome\": {\n \"properties\": {\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"PrReportTests\": {\n \"properties\": {\n \"concerns\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportTestConcern\"\n },\n \"type\": \"array\"\n },\n \"environment\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fixerAttempts\": {\n \"type\": \"number\"\n },\n \"greenlight\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"maxFixerAttempts\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outcomes\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportTestOutcome\"\n },\n \"type\": \"array\"\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"summary\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"tested\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"status\",\n \"tested\",\n \"outcomes\",\n \"concerns\",\n \"fixerAttempts\"\n ],\n \"type\": \"object\"\n },\n \"PrReportValidation\": {\n \"properties\": {\n \"at\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"attempts\": {\n \"type\": \"number\"\n },\n \"commands\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportValidationCommand\"\n },\n \"type\": \"array\"\n },\n \"configUnreadable\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"maxAttempts\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"passed\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"stepKind\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"status\",\n \"attempts\",\n \"commands\"\n ],\n \"type\": \"object\"\n },\n \"PrReportValidationCommand\": {\n \"properties\": {\n \"command\": {\n \"type\": \"string\"\n },\n \"durationMs\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"exitCode\": {\n \"type\": \"number\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"outputTail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"passed\": {\n \"type\": \"boolean\"\n },\n \"timedOut\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"label\",\n \"command\",\n \"exitCode\",\n \"passed\"\n ],\n \"type\": \"object\"\n },\n \"PrVerificationReport\": {\n \"properties\": {\n \"ci\": {\n \"$ref\": \"#/components/schemas/PrReportCi\"\n },\n \"context\": {\n \"$ref\": \"#/components/schemas/PrReportContext\"\n },\n \"environments\": {\n \"$ref\": \"#/components/schemas/PrReportEnvironments\"\n },\n \"generatedAt\": {\n \"type\": \"number\"\n },\n \"judges\": {\n \"$ref\": \"#/components/schemas/PrReportJudges\"\n },\n \"merge\": {\n \"$ref\": \"#/components/schemas/PrReportMerge\"\n },\n \"observability\": {\n \"$ref\": \"#/components/schemas/PrReportObservability\"\n },\n \"reproduction\": {\n \"$ref\": \"#/components/schemas/PrReportReproduction\"\n },\n \"requirements\": {\n \"$ref\": \"#/components/schemas/PrReportRequirements\"\n },\n \"run\": {\n \"$ref\": \"#/components/schemas/PrReportRun\"\n },\n \"scope\": {\n \"properties\": {\n \"frameId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"ownPullRequest\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"number\": {\n \"type\": \"number\"\n },\n \"repo\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"repo\",\n \"number\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"role\": {\n \"enum\": [\n \"own\",\n \"peer\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"role\"\n ],\n \"type\": \"object\"\n },\n \"tests\": {\n \"$ref\": \"#/components/schemas/PrReportTests\"\n },\n \"truncations\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"validation\": {\n \"$ref\": \"#/components/schemas/PrReportValidation\"\n },\n \"version\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"version\",\n \"generatedAt\",\n \"run\",\n \"context\",\n \"ci\",\n \"validation\",\n \"reproduction\",\n \"tests\",\n \"requirements\",\n \"environments\",\n \"merge\",\n \"judges\",\n \"observability\",\n \"truncations\"\n ],\n \"type\": \"object\"\n },\n \"PublicAgentDecision\": {\n \"properties\": {\n \"decisionId\": {\n \"type\": \"string\"\n },\n \"kind\": {\n \"const\": \"agent-decision\"\n },\n \"options\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"question\": {\n \"type\": \"string\"\n },\n \"stepKind\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"decisionId\",\n \"stepKind\",\n \"question\",\n \"options\"\n ],\n \"type\": \"object\"\n },\n \"PublicAnswerFollowUp\": {\n \"properties\": {\n \"answer\": {\n \"maxLength\": 4000,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"answer\"\n ],\n \"type\": \"object\"\n },\n \"PublicAnswerInterview\": {\n \"properties\": {\n \"answer\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"questionId\": {\n \"maxLength\": 80,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"questionId\",\n \"answer\"\n ],\n \"type\": \"object\"\n },\n \"PublicApiKey\": {\n \"properties\": {\n \"accountId\": {\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"createdByKeyId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"createdByUserId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"externalIdentity\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"lastUsedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"revokedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"scope\": {\n \"enum\": [\n \"read\",\n \"write\",\n \"decide\",\n \"admin\"\n ],\n \"type\": \"string\"\n },\n \"workspaceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"accountId\",\n \"workspaceId\",\n \"label\",\n \"scope\",\n \"createdByUserId\",\n \"createdByKeyId\",\n \"externalIdentity\",\n \"createdAt\",\n \"lastUsedAt\",\n \"revokedAt\"\n ],\n \"type\": \"object\"\n },\n \"PublicApiKeyList\": {\n \"properties\": {\n \"keys\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicApiKey\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"keys\"\n ],\n \"type\": \"object\"\n },\n \"PublicApprovalGateDecision\": {\n \"properties\": {\n \"approvalId\": {\n \"type\": \"string\"\n },\n \"exceeded\": {\n \"type\": \"boolean\"\n },\n \"feedback\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"kind\": {\n \"const\": \"approval-gate\"\n },\n \"proposal\": {\n \"type\": \"string\"\n },\n \"recordedApprovals\": {\n \"type\": \"number\"\n },\n \"requiredApprovals\": {\n \"type\": \"number\"\n },\n \"status\": {\n \"enum\": [\n \"pending\",\n \"approved\",\n \"changes_requested\",\n \"rejected\"\n ],\n \"type\": \"string\"\n },\n \"stepIndex\": {\n \"type\": \"number\"\n },\n \"stepKind\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"approvalId\",\n \"stepKind\",\n \"stepIndex\",\n \"status\",\n \"proposal\",\n \"feedback\",\n \"requiredApprovals\",\n \"recordedApprovals\",\n \"exceeded\"\n ],\n \"type\": \"object\"\n },\n \"PublicApproveStep\": {\n \"properties\": {\n \"proposal\": {\n \"maxLength\": 50000,\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"PublicBrainstormDecision\": {\n \"properties\": {\n \"convergedDirection\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"iteration\": {\n \"type\": \"number\"\n },\n \"kind\": {\n \"const\": \"brainstorm\"\n },\n \"maxIterations\": {\n \"type\": \"number\"\n },\n \"options\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicReviewFinding\"\n },\n \"type\": \"array\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"stage\": {\n \"enum\": [\n \"requirements\",\n \"architecture\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"ready\",\n \"incorporating\",\n \"reviewing\",\n \"merged\",\n \"exceeded\",\n \"incorporated\"\n ],\n \"type\": \"string\"\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sessionId\",\n \"stage\",\n \"taskId\",\n \"status\",\n \"iteration\",\n \"maxIterations\",\n \"options\",\n \"convergedDirection\"\n ],\n \"type\": \"object\"\n },\n \"PublicChallengePrReviewFinding\": {\n \"properties\": {\n \"question\": {\n \"maxLength\": 4000,\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"PublicChooseFork\": {\n \"properties\": {\n \"custom\": {\n \"anyOf\": [\n {\n \"maxLength\": 8000,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"forkId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"maxLength\": 4000,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"PublicClarityDecision\": {\n \"properties\": {\n \"clarifiedReport\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"findings\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicReviewFinding\"\n },\n \"type\": \"array\"\n },\n \"iteration\": {\n \"type\": \"number\"\n },\n \"kind\": {\n \"const\": \"clarity-review\"\n },\n \"maxIterations\": {\n \"type\": \"number\"\n },\n \"reviewId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"ready\",\n \"incorporating\",\n \"reviewing\",\n \"merged\",\n \"exceeded\",\n \"incorporated\"\n ],\n \"type\": \"string\"\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"reviewId\",\n \"taskId\",\n \"status\",\n \"iteration\",\n \"maxIterations\",\n \"findings\",\n \"clarifiedReport\"\n ],\n \"type\": \"object\"\n },\n \"PublicDecision\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/PublicRequirementsDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicForkDecision\"\n },\n {\n \"properties\": {\n \"bounces\": {\n \"type\": \"number\"\n },\n \"kind\": {\n \"const\": \"judge\"\n },\n \"maxBounces\": {\n \"type\": \"number\"\n },\n \"rubricId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rubricName\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"evaluating\",\n \"awaiting_decision\",\n \"bouncing\",\n \"passed\",\n \"failed\",\n \"skipped\"\n ],\n \"type\": \"string\"\n },\n \"stepKind\": {\n \"type\": \"string\"\n },\n \"threshold\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"verdict\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"findings\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"detail\": {\n \"type\": \"string\"\n },\n \"severity\": {\n \"enum\": [\n \"low\",\n \"medium\",\n \"high\",\n \"critical\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"where\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"title\",\n \"severity\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"score\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"summary\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"score\",\n \"summary\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"stepKind\",\n \"status\",\n \"rubricId\",\n \"rubricName\",\n \"threshold\",\n \"verdict\",\n \"bounces\",\n \"maxBounces\"\n ],\n \"type\": \"object\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicInputGateDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicApprovalGateDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicAgentDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicClarityDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicBrainstormDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicPrReviewDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicHumanTestDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicVisualConfirmDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicFollowUpsDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicInterviewDecision\"\n }\n ]\n },\n \"PublicDecisionList\": {\n \"properties\": {\n \"decisions\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicDecision\"\n },\n \"type\": \"array\"\n },\n \"parked\": {\n \"type\": \"boolean\"\n },\n \"runId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"running\",\n \"blocked\",\n \"paused\",\n \"done\",\n \"failed\"\n ],\n \"type\": \"string\"\n },\n \"taskId\": {\n \"type\": \"string\"\n },\n \"unanswerable\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicUnanswerableWait\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"runId\",\n \"taskId\",\n \"status\",\n \"parked\",\n \"decisions\",\n \"unanswerable\"\n ],\n \"type\": \"object\"\n },\n \"PublicFollowUpItem\": {\n \"properties\": {\n \"answer\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"detail\": {\n \"type\": \"string\"\n },\n \"itemId\": {\n \"type\": \"string\"\n },\n \"kind\": {\n \"enum\": [\n \"follow_up\",\n \"question\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"pending\",\n \"filed\",\n \"queued\",\n \"answered\",\n \"dismissed\"\n ],\n \"type\": \"string\"\n },\n \"suggestedAction\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"ticketExternalId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"ticketUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"itemId\",\n \"kind\",\n \"title\",\n \"detail\",\n \"suggestedAction\",\n \"status\",\n \"answer\",\n \"ticketExternalId\",\n \"ticketUrl\"\n ],\n \"type\": \"object\"\n },\n \"PublicFollowUpsDecision\": {\n \"properties\": {\n \"items\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicFollowUpItem\"\n },\n \"type\": \"array\"\n },\n \"kind\": {\n \"const\": \"follow-ups\"\n },\n \"loops\": {\n \"type\": \"number\"\n },\n \"maxLoops\": {\n \"type\": \"number\"\n },\n \"stepIndex\": {\n \"type\": \"number\"\n },\n \"stepKind\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"stepKind\",\n \"stepIndex\",\n \"items\",\n \"loops\",\n \"maxLoops\"\n ],\n \"type\": \"object\"\n },\n \"PublicForkDecision\": {\n \"properties\": {\n \"forks\": {\n \"items\": {\n \"properties\": {\n \"approach\": {\n \"type\": \"string\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"recommended\": {\n \"type\": \"boolean\"\n },\n \"riskNotes\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"summary\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"tradeoffs\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"id\",\n \"title\",\n \"summary\",\n \"approach\",\n \"tradeoffs\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"kind\": {\n \"const\": \"fork\"\n },\n \"seamSummary\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"proposing\",\n \"awaiting_choice\",\n \"answering\",\n \"chosen\",\n \"single_path\",\n \"skipped\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"status\",\n \"seamSummary\",\n \"forks\"\n ],\n \"type\": \"object\"\n },\n \"PublicHumanTestDecision\": {\n \"properties\": {\n \"attempts\": {\n \"type\": \"number\"\n },\n \"degradedReason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"environment\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/PublicHumanTestEnvironment\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"kind\": {\n \"const\": \"human-test\"\n },\n \"maxAttempts\": {\n \"type\": \"number\"\n },\n \"phase\": {\n \"enum\": [\n \"provisioning\",\n \"awaiting_human\",\n \"fixing\",\n \"resolving_conflicts\",\n \"passed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"phase\",\n \"environment\",\n \"degradedReason\",\n \"attempts\",\n \"maxAttempts\"\n ],\n \"type\": \"object\"\n },\n \"PublicHumanTestEnvironment\": {\n \"properties\": {\n \"expiresAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"provisioning\",\n \"ready\",\n \"failed\",\n \"expired\",\n \"tearing_down\",\n \"torn_down\"\n ],\n \"type\": \"string\"\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"url\",\n \"status\",\n \"expiresAt\"\n ],\n \"type\": \"object\"\n },\n \"PublicIdentity\": {\n \"properties\": {\n \"accountId\": {\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"externalIdentity\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"keyId\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"scope\": {\n \"enum\": [\n \"read\",\n \"write\",\n \"decide\",\n \"admin\"\n ],\n \"type\": \"string\"\n },\n \"workspaceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"keyId\",\n \"accountId\",\n \"workspaceId\",\n \"scope\",\n \"label\",\n \"externalIdentity\",\n \"createdAt\"\n ],\n \"type\": \"object\"\n },\n \"PublicIncorporate\": {\n \"properties\": {\n \"feedback\": {\n \"maxLength\": 4000,\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"PublicInputGateDecision\": {\n \"properties\": {\n \"checkedAt\": {\n \"type\": \"number\"\n },\n \"issues\": {\n \"items\": {\n \"properties\": {\n \"code\": {\n \"enum\": [\n \"description_missing\",\n \"description_placeholder\",\n \"description_thin\",\n \"reproduction_missing\",\n \"review_target_missing\",\n \"success_criteria_missing\",\n \"required_field_missing\"\n ],\n \"type\": \"string\"\n },\n \"field\": {\n \"properties\": {\n \"key\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"label\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"key\",\n \"label\"\n ],\n \"type\": \"object\"\n },\n \"severity\": {\n \"enum\": [\n \"blocking\",\n \"advisory\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"code\",\n \"severity\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"kind\": {\n \"const\": \"input-gate\"\n },\n \"mode\": {\n \"enum\": [\n \"standard\",\n \"advisory\",\n \"off\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"off\",\n \"not_applicable\",\n \"passed\",\n \"blocked\",\n \"overridden\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"status\",\n \"mode\",\n \"issues\",\n \"checkedAt\"\n ],\n \"type\": \"object\"\n },\n \"PublicInterviewDecision\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"interview\"\n },\n \"maxRounds\": {\n \"type\": \"number\"\n },\n \"questions\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicInterviewQuestion\"\n },\n \"type\": \"array\"\n },\n \"round\": {\n \"type\": \"number\"\n },\n \"stepKind\": {\n \"type\": \"string\"\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"stepKind\",\n \"taskId\",\n \"round\",\n \"maxRounds\",\n \"questions\"\n ],\n \"type\": \"object\"\n },\n \"PublicInterviewQuestion\": {\n \"properties\": {\n \"answer\": {\n \"type\": \"string\"\n },\n \"question\": {\n \"type\": \"string\"\n },\n \"questionId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"open\",\n \"answered\",\n \"dismissed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"questionId\",\n \"question\",\n \"answer\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"PublicJob\": {\n \"properties\": {\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"error\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"code\": {\n \"type\": \"string\"\n },\n \"message\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"code\",\n \"message\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"externalIdentity\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"externalIdentityWithheld\": {\n \"type\": \"boolean\"\n },\n \"jobId\": {\n \"type\": \"string\"\n },\n \"pipelineId\": {\n \"type\": \"string\"\n },\n \"result\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"data\": {\n \"anyOf\": [\n {},\n {\n \"type\": \"null\"\n }\n ]\n },\n \"output\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"output\",\n \"data\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"running\",\n \"succeeded\",\n \"failed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"jobId\",\n \"status\",\n \"pipelineId\",\n \"createdAt\",\n \"externalIdentity\",\n \"externalIdentityWithheld\",\n \"result\",\n \"error\"\n ],\n \"type\": \"object\"\n },\n \"PublicJobAccepted\": {\n \"properties\": {\n \"jobId\": {\n \"type\": \"string\"\n },\n \"links\": {\n \"properties\": {\n \"events\": {\n \"type\": \"string\"\n },\n \"self\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"self\",\n \"events\"\n ],\n \"type\": \"object\"\n },\n \"status\": {\n \"enum\": [\n \"running\",\n \"succeeded\",\n \"failed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"jobId\",\n \"status\",\n \"links\"\n ],\n \"type\": \"object\"\n },\n \"PublicNotificationList\": {\n \"properties\": {\n \"notifications\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/Notification\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"notifications\"\n ],\n \"type\": \"object\"\n },\n \"PublicNotificationWebhook\": {\n \"properties\": {\n \"webhook\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/NotificationWebhook\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"webhook\"\n ],\n \"type\": \"object\"\n },\n \"PublicNotificationWebhookList\": {\n \"properties\": {\n \"webhooks\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/NotificationWebhook\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"webhooks\"\n ],\n \"type\": \"object\"\n },\n \"PublicPipeline\": {\n \"properties\": {\n \"headlessStartable\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"pipelineId\": {\n \"type\": \"string\"\n },\n \"public\": {\n \"type\": \"boolean\"\n },\n \"steps\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"pipelineId\",\n \"name\",\n \"steps\",\n \"public\",\n \"headlessStartable\"\n ],\n \"type\": \"object\"\n },\n \"PublicPipelineList\": {\n \"properties\": {\n \"pipelines\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicPipeline\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"pipelines\"\n ],\n \"type\": \"object\"\n },\n \"PublicPrReviewDecision\": {\n \"properties\": {\n \"findings\": {\n \"items\": {\n \"properties\": {\n \"category\": {\n \"enum\": [\n \"correctness\",\n \"security\",\n \"performance\",\n \"maintainability\",\n \"style\",\n \"test\",\n \"other\"\n ],\n \"type\": \"string\"\n },\n \"challenge\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"justification\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"question\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"investigating\",\n \"upheld\",\n \"amended\",\n \"retracted\",\n \"failed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\",\n \"question\",\n \"justification\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"detail\": {\n \"type\": \"string\"\n },\n \"findingId\": {\n \"type\": \"string\"\n },\n \"line\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"path\": {\n \"type\": \"string\"\n },\n \"severity\": {\n \"enum\": [\n \"blocker\",\n \"high\",\n \"medium\",\n \"low\",\n \"nit\"\n ],\n \"type\": \"string\"\n },\n \"side\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"LEFT\",\n \"RIGHT\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"sliceId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"suggestedFix\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"findingId\",\n \"sliceId\",\n \"path\",\n \"line\",\n \"side\",\n \"severity\",\n \"category\",\n \"title\",\n \"detail\",\n \"suggestedFix\",\n \"challenge\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"kind\": {\n \"const\": \"pr-review\"\n },\n \"prUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"selectedFindingIds\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"slices\": {\n \"items\": {\n \"properties\": {\n \"paths\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"rationale\": {\n \"type\": \"string\"\n },\n \"sliceId\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"sliceId\",\n \"title\",\n \"rationale\",\n \"paths\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"status\": {\n \"enum\": [\n \"reviewing\",\n \"awaiting_selection\",\n \"challenging\",\n \"fixing\",\n \"posting\",\n \"done\",\n \"skipped\"\n ],\n \"type\": \"string\"\n },\n \"summary\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"status\",\n \"summary\",\n \"prUrl\",\n \"slices\",\n \"findings\",\n \"selectedFindingIds\"\n ],\n \"type\": \"object\"\n },\n \"PublicRejectStep\": {\n \"properties\": {\n \"reason\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"PublicReplyFinding\": {\n \"properties\": {\n \"reply\": {\n \"maxLength\": 4000,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"reply\"\n ],\n \"type\": \"object\"\n },\n \"PublicRequestGateFix\": {\n \"properties\": {\n \"findings\": {\n \"maxLength\": 10000,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"findings\"\n ],\n \"type\": \"object\"\n },\n \"PublicRequestStepChanges\": {\n \"properties\": {\n \"feedback\": {\n \"maxLength\": 10000,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"feedback\"\n ],\n \"type\": \"object\"\n },\n \"PublicRequirementsDecision\": {\n \"properties\": {\n \"findings\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicReviewFinding\"\n },\n \"type\": \"array\"\n },\n \"incorporatedRequirements\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"iteration\": {\n \"type\": \"number\"\n },\n \"kind\": {\n \"const\": \"requirements-review\"\n },\n \"maxIterations\": {\n \"type\": \"number\"\n },\n \"reviewId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"ready\",\n \"incorporating\",\n \"reviewing\",\n \"merged\",\n \"exceeded\",\n \"incorporated\"\n ],\n \"type\": \"string\"\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"reviewId\",\n \"taskId\",\n \"status\",\n \"iteration\",\n \"maxIterations\",\n \"findings\",\n \"incorporatedRequirements\"\n ],\n \"type\": \"object\"\n },\n \"PublicResolveAgentDecision\": {\n \"properties\": {\n \"choice\": {\n \"maxLength\": 4000,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"choice\"\n ],\n \"type\": \"object\"\n },\n \"PublicResolveExceeded\": {\n \"properties\": {\n \"choice\": {\n \"enum\": [\n \"extra-round\",\n \"proceed\",\n \"stop-reset\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"choice\"\n ],\n \"type\": \"object\"\n },\n \"PublicResolveInputGate\": {\n \"properties\": {\n \"choice\": {\n \"enum\": [\n \"recheck\",\n \"proceed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"choice\"\n ],\n \"type\": \"object\"\n },\n \"PublicResolvePrReview\": {\n \"properties\": {\n \"action\": {\n \"enum\": [\n \"finish\",\n \"fix\",\n \"post\"\n ],\n \"type\": \"string\"\n },\n \"findingIds\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"PublicReviewFinding\": {\n \"properties\": {\n \"category\": {\n \"enum\": [\n \"gap\",\n \"clarification\",\n \"assumption\",\n \"risk\",\n \"question\"\n ],\n \"type\": \"string\"\n },\n \"detail\": {\n \"type\": \"string\"\n },\n \"itemId\": {\n \"type\": \"string\"\n },\n \"reply\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"severity\": {\n \"enum\": [\n \"low\",\n \"medium\",\n \"high\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"open\",\n \"answered\",\n \"resolved\",\n \"dismissed\",\n \"recommend_requested\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"itemId\",\n \"category\",\n \"severity\",\n \"title\",\n \"detail\",\n \"status\",\n \"reply\"\n ],\n \"type\": \"object\"\n },\n \"PublicRun\": {\n \"properties\": {\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"currentStep\": {\n \"type\": \"number\"\n },\n \"error\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"code\": {\n \"type\": \"string\"\n },\n \"message\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"code\",\n \"message\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"externalIdentity\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"externalIdentityWithheld\": {\n \"type\": \"boolean\"\n },\n \"pullRequest\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"branch\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"url\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"url\",\n \"branch\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"running\",\n \"blocked\",\n \"paused\",\n \"done\",\n \"failed\"\n ],\n \"type\": \"string\"\n },\n \"steps\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"data\": {\n \"anyOf\": [\n {},\n {\n \"type\": \"null\"\n }\n ]\n },\n \"output\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"progress\": {\n \"type\": \"number\"\n },\n \"state\": {\n \"enum\": [\n \"pending\",\n \"working\",\n \"waiting_decision\",\n \"done\"\n ],\n \"type\": \"string\"\n },\n \"subtasks\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"completed\": {\n \"type\": \"number\"\n },\n \"inProgress\": {\n \"type\": \"number\"\n },\n \"total\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"completed\",\n \"inProgress\",\n \"total\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"agentKind\",\n \"state\",\n \"progress\",\n \"subtasks\",\n \"output\",\n \"data\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"runId\",\n \"taskId\",\n \"status\",\n \"createdAt\",\n \"currentStep\",\n \"steps\",\n \"externalIdentity\",\n \"externalIdentityWithheld\",\n \"pullRequest\",\n \"error\"\n ],\n \"type\": \"object\"\n },\n \"PublicRunArtifact\": {\n \"properties\": {\n \"artifactId\": {\n \"type\": \"string\"\n },\n \"byteSize\": {\n \"type\": \"number\"\n },\n \"contentType\": {\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"hash\": {\n \"type\": \"string\"\n },\n \"kind\": {\n \"enum\": [\n \"screenshot\",\n \"reference\"\n ],\n \"type\": \"string\"\n },\n \"scope\": {\n \"enum\": [\n \"run\",\n \"task\"\n ],\n \"type\": \"string\"\n },\n \"view\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"artifactId\",\n \"kind\",\n \"scope\",\n \"view\",\n \"contentType\",\n \"byteSize\",\n \"hash\",\n \"createdAt\"\n ],\n \"type\": \"object\"\n },\n \"PublicRunArtifactList\": {\n \"properties\": {\n \"artifacts\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicRunArtifact\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"artifacts\"\n ],\n \"type\": \"object\"\n },\n \"PublicService\": {\n \"properties\": {\n \"description\": {\n \"type\": \"string\"\n },\n \"serviceId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"planned\",\n \"ready\",\n \"in_progress\",\n \"blocked\",\n \"pr_ready\",\n \"done\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"enum\": [\n \"frontend\",\n \"service\",\n \"library\",\n \"document\",\n \"api\",\n \"database\",\n \"queue\",\n \"integration\",\n \"external\",\n \"environment\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"serviceId\",\n \"title\",\n \"description\",\n \"type\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"PublicServiceList\": {\n \"properties\": {\n \"services\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicService\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"services\"\n ],\n \"type\": \"object\"\n },\n \"PublicServiceSpec\": {\n \"properties\": {\n \"anchor\": {\n \"enum\": [\n \"present\",\n \"absent\",\n \"unparsed\"\n ],\n \"type\": \"string\"\n },\n \"features\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicSpecFeatureFile\"\n },\n \"type\": \"array\"\n },\n \"issues\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/SpecReadIssue\"\n },\n \"type\": \"array\"\n },\n \"provenance\": {\n \"$ref\": \"#/components/schemas/PublicSpecProvenance\"\n },\n \"serviceId\": {\n \"type\": \"string\"\n },\n \"spec\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/SpecDoc\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"truncations\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicSpecTruncation\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"serviceId\",\n \"anchor\",\n \"spec\",\n \"features\",\n \"provenance\",\n \"issues\",\n \"truncations\"\n ],\n \"type\": \"object\"\n },\n \"PublicSetFindingStatus\": {\n \"properties\": {\n \"status\": {\n \"enum\": [\n \"dismissed\",\n \"open\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"PublicSpecFeatureFile\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"content\": {\n \"type\": \"string\"\n },\n \"group\": {\n \"type\": \"string\"\n },\n \"module\": {\n \"type\": \"string\"\n },\n \"path\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"module\",\n \"group\",\n \"path\",\n \"content\",\n \"chars\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"PublicSpecProvenance\": {\n \"properties\": {\n \"commit\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"owner\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"enum\": [\n \"github\",\n \"gitlab\"\n ],\n \"type\": \"string\"\n },\n \"ref\": {\n \"type\": \"string\"\n },\n \"repo\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"provider\",\n \"owner\",\n \"repo\",\n \"ref\",\n \"commit\"\n ],\n \"type\": \"object\"\n },\n \"PublicSpecTruncation\": {\n \"properties\": {\n \"section\": {\n \"enum\": [\n \"requirements\",\n \"rules\",\n \"acceptance\",\n \"features\",\n \"issues\"\n ],\n \"type\": \"string\"\n },\n \"shown\": {\n \"type\": \"number\"\n },\n \"total\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"section\",\n \"shown\",\n \"total\"\n ],\n \"type\": \"object\"\n },\n \"PublicSpend\": {\n \"properties\": {\n \"currency\": {\n \"type\": \"string\"\n },\n \"dimension\": {\n \"enum\": [\n \"model\",\n \"agentKind\",\n \"service\",\n \"repo\",\n \"taskType\",\n \"ticket\",\n \"run\"\n ],\n \"type\": \"string\"\n },\n \"generatedAt\": {\n \"type\": \"number\"\n },\n \"rolledUpThrough\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rows\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicSpendRow\"\n },\n \"type\": \"array\"\n },\n \"since\": {\n \"type\": \"number\"\n },\n \"source\": {\n \"enum\": [\n \"ledger\",\n \"daily-rollup\"\n ],\n \"type\": \"string\"\n },\n \"totals\": {\n \"$ref\": \"#/components/schemas/PublicSpendTotals\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n },\n \"window\": {\n \"enum\": [\n \"24h\",\n \"7d\",\n \"30d\",\n \"90d\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"dimension\",\n \"window\",\n \"generatedAt\",\n \"since\",\n \"currency\",\n \"source\",\n \"rolledUpThrough\",\n \"totals\",\n \"truncated\",\n \"rows\"\n ],\n \"type\": \"object\"\n },\n \"PublicSpendRow\": {\n \"properties\": {\n \"calls\": {\n \"type\": \"number\"\n },\n \"inputTokens\": {\n \"type\": \"number\"\n },\n \"key\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"meteredCost\": {\n \"type\": \"number\"\n },\n \"outputTokens\": {\n \"type\": \"number\"\n },\n \"subscriptionCost\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"key\",\n \"label\",\n \"inputTokens\",\n \"outputTokens\",\n \"calls\",\n \"meteredCost\",\n \"subscriptionCost\"\n ],\n \"type\": \"object\"\n },\n \"PublicSpendTotals\": {\n \"properties\": {\n \"calls\": {\n \"type\": \"number\"\n },\n \"inputTokens\": {\n \"type\": \"number\"\n },\n \"meteredCost\": {\n \"type\": \"number\"\n },\n \"outputTokens\": {\n \"type\": \"number\"\n },\n \"subscriptionCost\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"inputTokens\",\n \"outputTokens\",\n \"calls\",\n \"meteredCost\",\n \"subscriptionCost\"\n ],\n \"type\": \"object\"\n },\n \"PublicTask\": {\n \"properties\": {\n \"autoStartDependents\": {\n \"type\": \"boolean\"\n },\n \"dependsOn\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"progress\": {\n \"type\": \"number\"\n },\n \"pullRequestUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"serviceId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"planned\",\n \"ready\",\n \"in_progress\",\n \"blocked\",\n \"pr_ready\",\n \"done\"\n ],\n \"type\": \"string\"\n },\n \"taskId\": {\n \"type\": \"string\"\n },\n \"taskType\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"feature\",\n \"bug\",\n \"document\",\n \"spike\",\n \"review\",\n \"ralph\",\n \"recurring\"\n ],\n \"type\": \"string\"\n },\n {\n \"pattern\": \"^[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*$\",\n \"type\": \"string\"\n }\n ]\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"taskId\",\n \"serviceId\",\n \"title\",\n \"description\",\n \"taskType\",\n \"status\",\n \"progress\",\n \"runId\",\n \"pullRequestUrl\",\n \"dependsOn\",\n \"autoStartDependents\"\n ],\n \"type\": \"object\"\n },\n \"PublicTaskDocument\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/PublicTaskSourceDocument\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicTaskUploadedDocument\"\n }\n ]\n },\n \"PublicTaskList\": {\n \"properties\": {\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"tasks\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"tasks\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n },\n \"PublicTaskSourceDocument\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"source\"\n },\n \"ref\": {\n \"maxLength\": 500,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"source\": {\n \"enum\": [\n \"confluence\",\n \"notion\",\n \"github\",\n \"figma\",\n \"zeplin\",\n \"linear\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"source\",\n \"ref\"\n ],\n \"type\": \"object\"\n },\n \"PublicTaskTicket\": {\n \"properties\": {\n \"ref\": {\n \"maxLength\": 500,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"source\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"jira\",\n \"github\",\n \"linear\",\n \"gitlab\"\n ],\n \"type\": \"string\"\n },\n {\n \"pattern\": \"^[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*$\",\n \"type\": \"string\"\n }\n ]\n }\n },\n \"required\": [\n \"source\",\n \"ref\"\n ],\n \"type\": \"object\"\n },\n \"PublicTaskUploadedDocument\": {\n \"properties\": {\n \"content\": {\n \"maxLength\": 100000,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"kind\": {\n \"const\": \"upload\"\n },\n \"title\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"title\",\n \"content\"\n ],\n \"type\": \"object\"\n },\n \"PublicUnanswerableWait\": {\n \"properties\": {\n \"detail\": {\n \"type\": \"string\"\n },\n \"reason\": {\n \"enum\": [\n \"human_wait_gate\",\n \"unclassified_gate\",\n \"unwired_interview_gate\"\n ],\n \"type\": \"string\"\n },\n \"stepIndex\": {\n \"type\": \"number\"\n },\n \"stepKind\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"reason\",\n \"stepKind\",\n \"stepIndex\",\n \"detail\"\n ],\n \"type\": \"object\"\n },\n \"PublicUsage\": {\n \"properties\": {\n \"budget\": {\n \"$ref\": \"#/components/schemas/PublicUsageBudget\"\n },\n \"currency\": {\n \"type\": \"string\"\n },\n \"periodStart\": {\n \"type\": \"number\"\n },\n \"rows\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicUsageRow\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"periodStart\",\n \"currency\",\n \"budget\",\n \"rows\"\n ],\n \"type\": \"object\"\n },\n \"PublicUsageBudget\": {\n \"properties\": {\n \"costLimit\": {\n \"type\": \"number\"\n },\n \"costSpent\": {\n \"type\": \"number\"\n },\n \"exceeded\": {\n \"type\": \"boolean\"\n },\n \"inputTokens\": {\n \"type\": \"number\"\n },\n \"outputTokens\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"inputTokens\",\n \"outputTokens\",\n \"costSpent\",\n \"costLimit\",\n \"exceeded\"\n ],\n \"type\": \"object\"\n },\n \"PublicUsageRow\": {\n \"properties\": {\n \"billing\": {\n \"enum\": [\n \"metered\",\n \"subscription\"\n ],\n \"type\": \"string\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"costEstimate\": {\n \"type\": \"number\"\n },\n \"inputTokens\": {\n \"type\": \"number\"\n },\n \"model\": {\n \"type\": \"string\"\n },\n \"outputTokens\": {\n \"type\": \"number\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"vendor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"billing\",\n \"vendor\",\n \"provider\",\n \"model\",\n \"inputTokens\",\n \"outputTokens\",\n \"costEstimate\",\n \"calls\"\n ],\n \"type\": \"object\"\n },\n \"PublicVisualConfirmDecision\": {\n \"properties\": {\n \"attempts\": {\n \"type\": \"number\"\n },\n \"degradedReason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"kind\": {\n \"const\": \"visual-confirmation\"\n },\n \"maxAttempts\": {\n \"type\": \"number\"\n },\n \"pairs\": {\n \"items\": {\n \"properties\": {\n \"actualArtifactId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"referenceArtifactId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"view\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"view\",\n \"actualArtifactId\",\n \"referenceArtifactId\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"phase\": {\n \"enum\": [\n \"awaiting_human\",\n \"fixing\",\n \"approved\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"phase\",\n \"pairs\",\n \"degradedReason\",\n \"attempts\",\n \"maxAttempts\"\n ],\n \"type\": \"object\"\n },\n \"PutNotificationWebhook\": {\n \"properties\": {\n \"alertEvents\": {\n \"items\": {\n \"enum\": [\n \"platform_health.firing\",\n \"platform_health.resolved\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"enabled\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"maxLength\": 100,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"runEvents\": {\n \"items\": {\n \"enum\": [\n \"run.started\",\n \"run.completed\",\n \"run.failed\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"secret\": {\n \"maxLength\": 200,\n \"minLength\": 16,\n \"type\": \"string\"\n },\n \"types\": {\n \"items\": {\n \"enum\": [\n \"merge_review\",\n \"pipeline_complete\",\n \"ci_failed\",\n \"test_failed\",\n \"requirement_review\",\n \"clarity_review\",\n \"release_regression\",\n \"decision_required\",\n \"human_test_ready\",\n \"visual_confirmation_ready\",\n \"human_review\",\n \"followup_pending\",\n \"fork_decision_pending\",\n \"judge_review\",\n \"pr_review_ready\",\n \"initiative\",\n \"platform_health\",\n \"infra_unreachable\",\n \"budget_paused\",\n \"budget_threshold\",\n \"key_drift\",\n \"merge_tag_request\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"url\": {\n \"format\": \"uri\",\n \"maxLength\": 2000,\n \"pattern\": \"^https://\",\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"RequirementGroup\": {\n \"properties\": {\n \"name\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"requirements\": {\n \"default\": [],\n \"items\": {\n \"$ref\": \"#/components/schemas/RequirementItem\"\n },\n \"type\": \"array\"\n },\n \"rules\": {\n \"default\": [],\n \"items\": {\n \"$ref\": \"#/components/schemas/DomainRule\"\n },\n \"type\": \"array\"\n },\n \"summary\": {\n \"default\": \"\",\n \"maxLength\": 2000,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"RequirementItem\": {\n \"properties\": {\n \"acceptance\": {\n \"default\": [],\n \"items\": {\n \"$ref\": \"#/components/schemas/AcceptanceCriterion\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"kind\": {\n \"enum\": [\n \"functional\",\n \"nonfunctional\",\n \"constraint\"\n ],\n \"type\": \"string\"\n },\n \"priority\": {\n \"enum\": [\n \"must\",\n \"should\",\n \"could\"\n ],\n \"type\": \"string\"\n },\n \"sourceBlockIds\": {\n \"default\": [],\n \"items\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"state\": {\n \"default\": \"aspirational\",\n \"enum\": [\n \"aspirational\",\n \"established\"\n ],\n \"type\": \"string\"\n },\n \"statement\": {\n \"maxLength\": 4000,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"title\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"title\",\n \"statement\",\n \"kind\",\n \"priority\"\n ],\n \"type\": \"object\"\n },\n \"SpecDoc\": {\n \"properties\": {\n \"modules\": {\n \"default\": [],\n \"items\": {\n \"$ref\": \"#/components/schemas/SpecModule\"\n },\n \"type\": \"array\"\n },\n \"service\": {\n \"default\": \"\",\n \"maxLength\": 120,\n \"type\": \"string\"\n },\n \"summary\": {\n \"default\": \"\",\n \"maxLength\": 2000,\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"SpecModule\": {\n \"properties\": {\n \"groups\": {\n \"default\": [],\n \"items\": {\n \"$ref\": \"#/components/schemas/RequirementGroup\"\n },\n \"type\": \"array\"\n },\n \"name\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"summary\": {\n \"default\": \"\",\n \"maxLength\": 2000,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"SpecReadIssue\": {\n \"properties\": {\n \"dropped\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": 0\n },\n \"kind\": {\n \"enum\": [\n \"read_failed\",\n \"unparsed\",\n \"partial\",\n \"unread\"\n ],\n \"type\": \"string\"\n },\n \"path\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"path\",\n \"kind\"\n ],\n \"type\": \"object\"\n },\n \"StartPublicTask\": {\n \"properties\": {\n \"pipelineId\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"UpdatePublicTask\": {\n \"properties\": {\n \"autoStartDependents\": {\n \"type\": \"boolean\"\n },\n \"description\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"fields\": {\n \"additionalProperties\": {\n \"anyOf\": [\n {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n {\n \"items\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"maxItems\": 50,\n \"type\": \"array\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"propertyNames\": {\n \"maxLength\": 80,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"type\": \"object\"\n },\n \"title\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n }\n },\n \"securitySchemes\": {\n \"bearerAuth\": {\n \"description\": \"A public-API key of the form `cf_live_<keyId>.<secret>`.\",\n \"scheme\": \"bearer\",\n \"type\": \"http\"\n }\n }\n },\n \"info\": {\n \"description\": \"The external, key-authenticated API (`/api/v1`). Authenticate every request with a public-API key: `Authorization: Bearer cf_live_<keyId>.<secret>`. Every call is scoped to the key\u2019s workspace.\",\n \"license\": {\n \"identifier\": \"MIT\",\n \"name\": \"MIT\"\n },\n \"title\": \"cat-factory Public API\",\n \"version\": \"1.34.0\"\n },\n \"openapi\": \"3.1.0\",\n \"paths\": {\n \"/api/v1/artifacts/{artifactId}/blob\": {\n \"get\": {\n \"description\": \"The stored bytes of one artifact listed by the run-artifacts endpoint, served with the recorded image content type (`nosniff`, never inline active content). Authenticated like every other call: the bytes are workspace-scoped, so a report that links here on a public repository leaks nothing to a reader without a key. 404 when the id is unknown to the key\u2019s workspace, and separately when the metadata row survives but its bytes are gone from the blob backend.\",\n \"operationId\": \"getPublicArtifactBlob\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"artifactId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/octet-stream\": {\n \"schema\": {\n \"format\": \"binary\",\n \"type\": \"string\"\n }\n },\n \"image/gif\": {\n \"schema\": {\n \"format\": \"binary\",\n \"type\": \"string\"\n }\n },\n \"image/jpeg\": {\n \"schema\": {\n \"format\": \"binary\",\n \"type\": \"string\"\n }\n },\n \"image/png\": {\n \"schema\": {\n \"format\": \"binary\",\n \"type\": \"string\"\n }\n },\n \"image/webp\": {\n \"schema\": {\n \"format\": \"binary\",\n \"type\": \"string\"\n }\n }\n },\n \"description\": \"The artifact bytes\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n }\n },\n \"summary\": \"Download an artifact's bytes\",\n \"tags\": [\n \"Evidence\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/agent-context/{snapshotId}\": {\n \"get\": {\n \"description\": \"The complete context one dispatch was PROVIDED: system and user prompts, the folded standards fragments, and the injected `.cat-context/*` files an agent reads through tools (which therefore appear in no proxy telemetry). Windowed by `bodyOffset`/`bodyChars`.\",\n \"operationId\": \"getDebugAgentContext\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"snapshotId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"bodyChars\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 200000,\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"bodyOffset\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 2000000,\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"contextFiles\": {\n \"items\": {\n \"properties\": {\n \"content\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"path\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"path\",\n \"title\",\n \"url\",\n \"content\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"extras\": {\n \"additionalProperties\": {},\n \"propertyNames\": {\n \"type\": \"string\"\n },\n \"type\": \"object\"\n },\n \"fragments\": {\n \"items\": {\n \"properties\": {\n \"body\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"id\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"body\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"harness\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"model\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runId\": {\n \"type\": \"string\"\n },\n \"snapshotId\": {\n \"type\": \"string\"\n },\n \"stepIndex\": {\n \"type\": \"number\"\n },\n \"systemPrompt\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"userPrompt\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"snapshotId\",\n \"runId\",\n \"agentKind\",\n \"stepIndex\",\n \"createdAt\",\n \"model\",\n \"harness\",\n \"systemPrompt\",\n \"userPrompt\",\n \"fragments\",\n \"contextFiles\",\n \"extras\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get one agent-context snapshot\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/llm-calls/{callId}\": {\n \"get\": {\n \"description\": \"One recorded model call with its budgeted prompt delta, response and reasoning. `bodyOffset`/`bodyChars` window the bodies, so an arbitrarily long transcript is readable in bounded pages.\",\n \"operationId\": \"getDebugLlmCall\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"callId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"bodyChars\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 200000,\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"bodyOffset\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 2000000,\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"view\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"raw\",\n \"messages\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"callId\": {\n \"type\": \"string\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"elidedLeadingMessages\": {\n \"type\": \"number\"\n },\n \"errorMessage\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"finishReason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"httpStatus\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"messageCount\": {\n \"type\": \"number\"\n },\n \"model\": {\n \"type\": \"string\"\n },\n \"ok\": {\n \"type\": \"boolean\"\n },\n \"outcome\": {\n \"enum\": [\n \"ok\",\n \"warning\",\n \"error\"\n ],\n \"type\": \"string\"\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"phase\": {\n \"type\": \"string\"\n },\n \"prompt\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"promptMessages\": {\n \"anyOf\": [\n {\n \"items\": {\n \"properties\": {\n \"content\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"index\": {\n \"type\": \"number\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"role\": {\n \"type\": \"string\"\n },\n \"toolCallId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"toolCalls\": {\n \"items\": {\n \"properties\": {\n \"args\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"args\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"index\",\n \"role\",\n \"name\",\n \"toolCallId\",\n \"toolCalls\",\n \"content\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"reasoning\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"requestMaxTokens\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"response\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"runId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"streaming\": {\n \"type\": \"boolean\"\n },\n \"toolCount\": {\n \"type\": \"number\"\n },\n \"totalMs\": {\n \"type\": \"number\"\n },\n \"totalTokens\": {\n \"type\": \"number\"\n },\n \"turnIndex\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"callId\",\n \"runId\",\n \"agentKind\",\n \"provider\",\n \"model\",\n \"createdAt\",\n \"outcome\",\n \"ok\",\n \"httpStatus\",\n \"errorMessage\",\n \"finishReason\",\n \"streaming\",\n \"phase\",\n \"turnIndex\",\n \"messageCount\",\n \"toolCount\",\n \"requestMaxTokens\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"completionTokens\",\n \"totalTokens\",\n \"upstreamMs\",\n \"overheadMs\",\n \"totalMs\",\n \"elidedLeadingMessages\",\n \"prompt\",\n \"response\",\n \"reasoning\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get one LLM call\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs\": {\n \"get\": {\n \"description\": \"The triage entry point: the workspace\u2019s runs, newest first and keyset-paginated, with an optional status and `since` filter.\",\n \"operationId\": \"listDebugRuns\",\n \"parameters\": [\n {\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"running\",\n \"blocked\",\n \"done\",\n \"paused\",\n \"failed\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"since\",\n \"required\": false,\n \"schema\": {\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runs\": {\n \"items\": {\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"currentStep\": {\n \"type\": \"number\"\n },\n \"failure\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hint\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"kind\": {\n \"enum\": [\n \"preflight\",\n \"dispatch\",\n \"environment\",\n \"evicted\",\n \"timeout\",\n \"agent\",\n \"job_failed\",\n \"rejected\",\n \"companion_rejected\",\n \"stalled\",\n \"cancelled\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"lastSubtasks\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"completed\": {\n \"type\": \"number\"\n },\n \"inProgress\": {\n \"type\": \"number\"\n },\n \"items\": {\n \"items\": {\n \"properties\": {\n \"label\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"pending\",\n \"in_progress\",\n \"completed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"label\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"total\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"completed\",\n \"inProgress\",\n \"total\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"occurredAt\": {\n \"type\": \"number\"\n },\n \"reason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"stepIndex\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"kind\",\n \"message\",\n \"detail\",\n \"hint\",\n \"occurredAt\",\n \"lastSubtasks\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"pipelineId\": {\n \"type\": \"string\"\n },\n \"pipelineName\": {\n \"type\": \"string\"\n },\n \"runId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"running\",\n \"blocked\",\n \"done\",\n \"paused\",\n \"failed\"\n ],\n \"type\": \"string\"\n },\n \"stepCount\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"runId\",\n \"blockId\",\n \"pipelineId\",\n \"pipelineName\",\n \"status\",\n \"createdAt\",\n \"currentStep\",\n \"stepCount\",\n \"failure\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"runs\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the workspace's runs\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs/{runId}\": {\n \"get\": {\n \"description\": \"One run\u2019s diagnostic overview: its steps, which telemetry sinks this deployment retains (and how much each holds), the LLM cost/latency rollups, and the derived signals worth looking at first.\",\n \"operationId\": \"getDebugRun\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"diagnostics\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"host\": {\n \"properties\": {\n \"platform\": {\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"lastDispatch\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"at\": {\n \"type\": \"number\"\n },\n \"executionBackend\": {\n \"type\": \"string\"\n },\n \"failure\": {\n \"properties\": {\n \"at\": {\n \"type\": \"number\"\n },\n \"kind\": {\n \"type\": \"string\"\n },\n \"reason\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"at\"\n ],\n \"type\": \"object\"\n },\n \"model\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"repo\": {\n \"properties\": {\n \"baseBranch\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"owner\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"owner\",\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"stepIndex\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"stepIndex\",\n \"agentKind\",\n \"at\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"generatedAt\": {\n \"type\": \"number\"\n },\n \"kind\": {\n \"const\": \"cat-factory.run-debug-overview\"\n },\n \"llm\": {\n \"properties\": {\n \"byAgentKind\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"cacheHitRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"costEstimate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"errors\": {\n \"type\": \"number\"\n },\n \"maxOutputTokens\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outputHeadroomRatio\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"peakCompletionTokens\": {\n \"type\": \"number\"\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"transportOverheadRatio\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"truncatedCalls\": {\n \"type\": \"number\"\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n },\n \"warnings\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"agentKind\",\n \"calls\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"cacheHitRate\",\n \"completionTokens\",\n \"peakCompletionTokens\",\n \"maxOutputTokens\",\n \"outputHeadroomRatio\",\n \"truncatedCalls\",\n \"upstreamMs\",\n \"overheadMs\",\n \"transportOverheadRatio\",\n \"errors\",\n \"warnings\",\n \"costEstimate\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"byPhase\": {\n \"items\": {\n \"properties\": {\n \"cacheHitRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"carryCostShare\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"carryCostTokens\": {\n \"type\": \"number\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"costEstimate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"errors\": {\n \"type\": \"number\"\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"phase\": {\n \"type\": \"string\"\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"truncatedCalls\": {\n \"type\": \"number\"\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n },\n \"warnings\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"phase\",\n \"calls\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"cacheHitRate\",\n \"completionTokens\",\n \"carryCostTokens\",\n \"carryCostShare\",\n \"upstreamMs\",\n \"overheadMs\",\n \"errors\",\n \"warnings\",\n \"truncatedCalls\",\n \"costEstimate\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"costCurrency\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"totals\": {\n \"properties\": {\n \"cacheHitRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"costEstimate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"errors\": {\n \"type\": \"number\"\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"transportOverheadRatio\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"truncatedCalls\": {\n \"type\": \"number\"\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n },\n \"warnings\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"calls\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"cacheHitRate\",\n \"completionTokens\",\n \"upstreamMs\",\n \"overheadMs\",\n \"transportOverheadRatio\",\n \"errors\",\n \"warnings\",\n \"truncatedCalls\",\n \"costEstimate\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"totals\",\n \"byAgentKind\",\n \"byPhase\",\n \"costCurrency\"\n ],\n \"type\": \"object\"\n },\n \"run\": {\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"currentStep\": {\n \"type\": \"number\"\n },\n \"failure\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hint\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"kind\": {\n \"enum\": [\n \"preflight\",\n \"dispatch\",\n \"environment\",\n \"evicted\",\n \"timeout\",\n \"agent\",\n \"job_failed\",\n \"rejected\",\n \"companion_rejected\",\n \"stalled\",\n \"cancelled\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"lastSubtasks\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"completed\": {\n \"type\": \"number\"\n },\n \"inProgress\": {\n \"type\": \"number\"\n },\n \"items\": {\n \"items\": {\n \"properties\": {\n \"label\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"pending\",\n \"in_progress\",\n \"completed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"label\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"total\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"completed\",\n \"inProgress\",\n \"total\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"occurredAt\": {\n \"type\": \"number\"\n },\n \"reason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"stepIndex\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"kind\",\n \"message\",\n \"detail\",\n \"hint\",\n \"occurredAt\",\n \"lastSubtasks\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"pipelineId\": {\n \"type\": \"string\"\n },\n \"pipelineName\": {\n \"type\": \"string\"\n },\n \"runId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"running\",\n \"blocked\",\n \"done\",\n \"paused\",\n \"failed\"\n ],\n \"type\": \"string\"\n },\n \"stepCount\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"runId\",\n \"blockId\",\n \"pipelineId\",\n \"pipelineName\",\n \"status\",\n \"createdAt\",\n \"currentStep\",\n \"stepCount\",\n \"failure\"\n ],\n \"type\": \"object\"\n },\n \"signals\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"code\": {\n \"type\": \"string\"\n },\n \"count\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"severity\": {\n \"enum\": [\n \"info\",\n \"warning\",\n \"error\"\n ],\n \"type\": \"string\"\n },\n \"stepIndex\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"code\",\n \"severity\",\n \"message\",\n \"count\",\n \"agentKind\",\n \"stepIndex\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"sinks\": {\n \"properties\": {\n \"agentContext\": {\n \"properties\": {\n \"available\": {\n \"type\": \"boolean\"\n },\n \"count\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"available\",\n \"count\"\n ],\n \"type\": \"object\"\n },\n \"llmCalls\": {\n \"properties\": {\n \"available\": {\n \"type\": \"boolean\"\n },\n \"count\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"available\",\n \"count\"\n ],\n \"type\": \"object\"\n },\n \"provisioningLog\": {\n \"properties\": {\n \"available\": {\n \"type\": \"boolean\"\n },\n \"count\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"available\",\n \"count\"\n ],\n \"type\": \"object\"\n },\n \"searchQueries\": {\n \"properties\": {\n \"available\": {\n \"type\": \"boolean\"\n },\n \"count\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"available\",\n \"count\"\n ],\n \"type\": \"object\"\n },\n \"toolCalls\": {\n \"properties\": {\n \"available\": {\n \"type\": \"boolean\"\n },\n \"count\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"available\",\n \"count\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"llmCalls\",\n \"agentContext\",\n \"searchQueries\",\n \"toolCalls\",\n \"provisioningLog\"\n ],\n \"type\": \"object\"\n },\n \"steps\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"evictionRecoveries\": {\n \"type\": \"number\"\n },\n \"finishedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"firstEvictionDetail\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hasStructuredResult\": {\n \"type\": \"boolean\"\n },\n \"index\": {\n \"type\": \"number\"\n },\n \"lastActivityAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"model\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outputChars\": {\n \"type\": \"number\"\n },\n \"progress\": {\n \"type\": \"number\"\n },\n \"skipped\": {\n \"type\": \"boolean\"\n },\n \"startedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"state\": {\n \"type\": \"string\"\n },\n \"subtasks\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"completed\": {\n \"type\": \"number\"\n },\n \"inProgress\": {\n \"type\": \"number\"\n },\n \"total\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"completed\",\n \"inProgress\",\n \"total\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"toolServers\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"observed\": {\n \"items\": {\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"ready\",\n \"failed\",\n \"needs_auth\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"toolCount\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"id\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"unavailable\": {\n \"items\": {\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"reason\": {\n \"enum\": [\n \"harness_unsupported\",\n \"transport_unsupported\",\n \"missing_secret\",\n \"reserved_secret\",\n \"oauth_not_connected\",\n \"oauth_token_failed\",\n \"over_budget\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"label\",\n \"reason\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"wired\": {\n \"items\": {\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"tools\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"transport\": {\n \"enum\": [\n \"stdio\",\n \"http\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"label\",\n \"transport\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"wired\",\n \"unavailable\",\n \"agentKind\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"index\",\n \"agentKind\",\n \"state\",\n \"progress\",\n \"model\",\n \"skipped\",\n \"startedAt\",\n \"finishedAt\",\n \"lastActivityAt\",\n \"subtasks\",\n \"outputChars\",\n \"hasStructuredResult\",\n \"evictionRecoveries\",\n \"firstEvictionDetail\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"toolCalls\": {\n \"properties\": {\n \"byAgentKind\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"failureRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"failures\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"agentKind\",\n \"calls\",\n \"failures\",\n \"failureRate\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"byTool\": {\n \"items\": {\n \"properties\": {\n \"calls\": {\n \"type\": \"number\"\n },\n \"failureRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"failures\": {\n \"type\": \"number\"\n },\n \"tool\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"tool\",\n \"calls\",\n \"failures\",\n \"failureRate\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"totals\": {\n \"properties\": {\n \"calls\": {\n \"type\": \"number\"\n },\n \"failureRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"failures\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"calls\",\n \"failures\",\n \"failureRate\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"totals\",\n \"byTool\",\n \"byAgentKind\"\n ],\n \"type\": \"object\"\n },\n \"version\": {\n \"const\": 1\n }\n },\n \"required\": [\n \"kind\",\n \"version\",\n \"generatedAt\",\n \"run\",\n \"steps\",\n \"diagnostics\",\n \"sinks\",\n \"llm\",\n \"toolCalls\",\n \"signals\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get a run's diagnostic map\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs/{runId}/agent-context\": {\n \"get\": {\n \"description\": \"Every dispatch whose provided context was captured, with SIZES only (no bodies) so the list stays bounded. Read one in full through the snapshot endpoint.\",\n \"operationId\": \"listDebugAgentContext\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"stepIndex\",\n \"required\": false,\n \"schema\": {\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"snapshots\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"contextFilesChars\": {\n \"type\": \"number\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"fragmentsChars\": {\n \"type\": \"number\"\n },\n \"harness\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"model\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"snapshotId\": {\n \"type\": \"string\"\n },\n \"stepIndex\": {\n \"type\": \"number\"\n },\n \"systemPromptChars\": {\n \"type\": \"number\"\n },\n \"userPromptChars\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"snapshotId\",\n \"agentKind\",\n \"stepIndex\",\n \"createdAt\",\n \"model\",\n \"harness\",\n \"systemPromptChars\",\n \"userPromptChars\",\n \"fragmentsChars\",\n \"contextFilesChars\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"snapshots\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a run's agent-context dispatches\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs/{runId}/llm-calls\": {\n \"get\": {\n \"description\": \"The model calls a run made, keyset-paginated and filterable by agent kind, phase, outcome or a substring of the bodies. Bodies are returned only when `bodyChars` asks for them.\",\n \"operationId\": \"listDebugLlmCalls\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"agentKind\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"phase\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 120,\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"outcome\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"ok\",\n \"warning\",\n \"error\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"contains\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 256,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"order\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"newest\",\n \"oldest\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"bodyChars\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 4000,\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"calls\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"callId\": {\n \"type\": \"string\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"elidedLeadingMessages\": {\n \"type\": \"number\"\n },\n \"errorMessage\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"finishReason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"httpStatus\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"messageCount\": {\n \"type\": \"number\"\n },\n \"model\": {\n \"type\": \"string\"\n },\n \"ok\": {\n \"type\": \"boolean\"\n },\n \"outcome\": {\n \"enum\": [\n \"ok\",\n \"warning\",\n \"error\"\n ],\n \"type\": \"string\"\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"phase\": {\n \"type\": \"string\"\n },\n \"prompt\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"promptMessages\": {\n \"anyOf\": [\n {\n \"items\": {\n \"properties\": {\n \"content\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"index\": {\n \"type\": \"number\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"role\": {\n \"type\": \"string\"\n },\n \"toolCallId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"toolCalls\": {\n \"items\": {\n \"properties\": {\n \"args\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"args\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"index\",\n \"role\",\n \"name\",\n \"toolCallId\",\n \"toolCalls\",\n \"content\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"reasoning\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"requestMaxTokens\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"response\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"runId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"streaming\": {\n \"type\": \"boolean\"\n },\n \"toolCount\": {\n \"type\": \"number\"\n },\n \"totalMs\": {\n \"type\": \"number\"\n },\n \"totalTokens\": {\n \"type\": \"number\"\n },\n \"turnIndex\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"callId\",\n \"runId\",\n \"agentKind\",\n \"provider\",\n \"model\",\n \"createdAt\",\n \"outcome\",\n \"ok\",\n \"httpStatus\",\n \"errorMessage\",\n \"finishReason\",\n \"streaming\",\n \"phase\",\n \"turnIndex\",\n \"messageCount\",\n \"toolCount\",\n \"requestMaxTokens\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"completionTokens\",\n \"totalTokens\",\n \"upstreamMs\",\n \"overheadMs\",\n \"totalMs\",\n \"elidedLeadingMessages\",\n \"prompt\",\n \"response\",\n \"reasoning\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"calls\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a run's LLM calls\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs/{runId}/llm-export\": {\n \"get\": {\n \"description\": \"The whole of a run\u2019s model activity as one self-describing document, for handing straight to a model asked why the run truncated, spent or stalled: the SQL rollups (run totals, per agent kind, per phase, with the carry cost that says which slice burdened everything after it) plus a bounded window of the individual calls behind them. The rollups cover EVERY recorded call and do not move with `limit`, so a windowed bundle still reports what the run actually cost; `truncated` says the calls are a window and `order` says which end was kept. Bodies are omitted unless `bodyChars` asks, and the resumable call list is the way to walk a long run whole.\",\n \"operationId\": \"getDebugLlmExport\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"order\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"oldest\",\n \"newest\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"bodyChars\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 4000,\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"available\": {\n \"type\": \"boolean\"\n },\n \"calls\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"callId\": {\n \"type\": \"string\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"elidedLeadingMessages\": {\n \"type\": \"number\"\n },\n \"errorMessage\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"finishReason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"httpStatus\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"messageCount\": {\n \"type\": \"number\"\n },\n \"model\": {\n \"type\": \"string\"\n },\n \"ok\": {\n \"type\": \"boolean\"\n },\n \"outcome\": {\n \"enum\": [\n \"ok\",\n \"warning\",\n \"error\"\n ],\n \"type\": \"string\"\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"phase\": {\n \"type\": \"string\"\n },\n \"prompt\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"promptMessages\": {\n \"anyOf\": [\n {\n \"items\": {\n \"properties\": {\n \"content\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"index\": {\n \"type\": \"number\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"role\": {\n \"type\": \"string\"\n },\n \"toolCallId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"toolCalls\": {\n \"items\": {\n \"properties\": {\n \"args\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"args\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"index\",\n \"role\",\n \"name\",\n \"toolCallId\",\n \"toolCalls\",\n \"content\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"reasoning\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"requestMaxTokens\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"response\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"runId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"streaming\": {\n \"type\": \"boolean\"\n },\n \"toolCount\": {\n \"type\": \"number\"\n },\n \"totalMs\": {\n \"type\": \"number\"\n },\n \"totalTokens\": {\n \"type\": \"number\"\n },\n \"turnIndex\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"callId\",\n \"runId\",\n \"agentKind\",\n \"provider\",\n \"model\",\n \"createdAt\",\n \"outcome\",\n \"ok\",\n \"httpStatus\",\n \"errorMessage\",\n \"finishReason\",\n \"streaming\",\n \"phase\",\n \"turnIndex\",\n \"messageCount\",\n \"toolCount\",\n \"requestMaxTokens\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"completionTokens\",\n \"totalTokens\",\n \"upstreamMs\",\n \"overheadMs\",\n \"totalMs\",\n \"elidedLeadingMessages\",\n \"prompt\",\n \"response\",\n \"reasoning\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"generatedAt\": {\n \"type\": \"number\"\n },\n \"kind\": {\n \"const\": \"cat-factory.run-llm-export\"\n },\n \"llm\": {\n \"properties\": {\n \"byAgentKind\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"cacheHitRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"costEstimate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"errors\": {\n \"type\": \"number\"\n },\n \"maxOutputTokens\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outputHeadroomRatio\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"peakCompletionTokens\": {\n \"type\": \"number\"\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"transportOverheadRatio\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"truncatedCalls\": {\n \"type\": \"number\"\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n },\n \"warnings\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"agentKind\",\n \"calls\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"cacheHitRate\",\n \"completionTokens\",\n \"peakCompletionTokens\",\n \"maxOutputTokens\",\n \"outputHeadroomRatio\",\n \"truncatedCalls\",\n \"upstreamMs\",\n \"overheadMs\",\n \"transportOverheadRatio\",\n \"errors\",\n \"warnings\",\n \"costEstimate\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"byPhase\": {\n \"items\": {\n \"properties\": {\n \"cacheHitRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"carryCostShare\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"carryCostTokens\": {\n \"type\": \"number\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"costEstimate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"errors\": {\n \"type\": \"number\"\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"phase\": {\n \"type\": \"string\"\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"truncatedCalls\": {\n \"type\": \"number\"\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n },\n \"warnings\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"phase\",\n \"calls\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"cacheHitRate\",\n \"completionTokens\",\n \"carryCostTokens\",\n \"carryCostShare\",\n \"upstreamMs\",\n \"overheadMs\",\n \"errors\",\n \"warnings\",\n \"truncatedCalls\",\n \"costEstimate\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"costCurrency\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"totals\": {\n \"properties\": {\n \"cacheHitRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"costEstimate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"errors\": {\n \"type\": \"number\"\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"transportOverheadRatio\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"truncatedCalls\": {\n \"type\": \"number\"\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n },\n \"warnings\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"calls\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"cacheHitRate\",\n \"completionTokens\",\n \"upstreamMs\",\n \"overheadMs\",\n \"transportOverheadRatio\",\n \"errors\",\n \"warnings\",\n \"truncatedCalls\",\n \"costEstimate\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"totals\",\n \"byAgentKind\",\n \"byPhase\",\n \"costCurrency\"\n ],\n \"type\": \"object\"\n },\n \"order\": {\n \"enum\": [\n \"oldest\",\n \"newest\"\n ],\n \"type\": \"string\"\n },\n \"runId\": {\n \"type\": \"string\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n },\n \"version\": {\n \"const\": 1\n }\n },\n \"required\": [\n \"kind\",\n \"version\",\n \"runId\",\n \"generatedAt\",\n \"available\",\n \"llm\",\n \"order\",\n \"truncated\",\n \"calls\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Export a run's model activity as one bundle\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs/{runId}/logs\": {\n \"get\": {\n \"description\": \"The run\u2019s provisioning event log \u2014 how its environment, runner pool and containers came up, or why they did not.\",\n \"operationId\": \"listDebugLogs\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"entries\": {\n \"items\": {\n \"properties\": {\n \"blockId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"error\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"executionId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"operation\": {\n \"enum\": [\n \"provision\",\n \"teardown\",\n \"teardown-verify\",\n \"status\",\n \"dispatch\",\n \"release\",\n \"poll-failure\"\n ],\n \"type\": \"string\"\n },\n \"outcome\": {\n \"enum\": [\n \"success\",\n \"failure\"\n ],\n \"type\": \"string\"\n },\n \"providerId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"subsystem\": {\n \"enum\": [\n \"environment\",\n \"runner-pool\",\n \"container\"\n ],\n \"type\": \"string\"\n },\n \"targetId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"workspaceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"workspaceId\",\n \"subsystem\",\n \"operation\",\n \"targetId\",\n \"providerId\",\n \"blockId\",\n \"executionId\",\n \"outcome\",\n \"error\",\n \"detail\",\n \"createdAt\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"entries\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a run's infrastructure log\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs/{runId}/search-queries\": {\n \"get\": {\n \"description\": \"The web searches the run\u2019s agents actually performed, keyset-paginated. Retained only when the deployment records agent context.\",\n \"operationId\": \"listDebugSearchQueries\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"queries\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"executionId\": {\n \"type\": \"string\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"brave\",\n \"searxng\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"query\": {\n \"type\": \"string\"\n },\n \"resultCount\": {\n \"type\": \"number\"\n },\n \"workspaceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"workspaceId\",\n \"executionId\",\n \"agentKind\",\n \"provider\",\n \"query\",\n \"resultCount\",\n \"createdAt\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"queries\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a run's web searches\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs/{runId}/tool-calls\": {\n \"get\": {\n \"description\": \"The tool calls the run\u2019s agents made, in the order they made them \u2014 which command, against what, and what came back. The half of \u201Chow did this diff come about\u201D that neither the diff nor a prompt body answers. Arguments and results are retained only when the deployment records agent context AND the workspace has not opted out; `bodies` says which, so an empty `args` is never mistaken for a call that took none.\",\n \"operationId\": \"listDebugToolCalls\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"jobId\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"order\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"recent\",\n \"trajectory\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"outcome\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"ok\",\n \"error\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"toolCalls\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"args\": {\n \"type\": \"string\"\n },\n \"argsDropped\": {\n \"type\": \"number\"\n },\n \"bodies\": {\n \"enum\": [\n \"stored\",\n \"withheld\"\n ],\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"endedAt\": {\n \"type\": \"number\"\n },\n \"executionId\": {\n \"type\": \"string\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"jobId\": {\n \"type\": \"string\"\n },\n \"ok\": {\n \"type\": \"boolean\"\n },\n \"result\": {\n \"type\": \"string\"\n },\n \"resultDropped\": {\n \"type\": \"number\"\n },\n \"seq\": {\n \"type\": \"number\"\n },\n \"startedAt\": {\n \"type\": \"number\"\n },\n \"tool\": {\n \"type\": \"string\"\n },\n \"workspaceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"workspaceId\",\n \"executionId\",\n \"agentKind\",\n \"jobId\",\n \"seq\",\n \"tool\",\n \"startedAt\",\n \"endedAt\",\n \"ok\",\n \"bodies\",\n \"args\",\n \"result\",\n \"argsDropped\",\n \"resultDropped\",\n \"createdAt\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"toolCalls\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a run's tool calls\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/jobs\": {\n \"get\": {\n \"description\": \"List the headless runs THIS surface created, newest first and keyset-paginated. Scoped to internal-anchored runs exactly like the single-job read, so an external key can never enumerate the workspace\u2019s ordinary board runs.\",\n \"operationId\": \"listPublicJobs\",\n \"parameters\": [\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"running\",\n \"succeeded\",\n \"failed\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"since\",\n \"required\": false,\n \"schema\": {\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"jobs\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicJob\"\n },\n \"type\": \"array\"\n },\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"jobs\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the workspace's jobs\",\n \"tags\": [\n \"Jobs\"\n ],\n \"x-min-scope\": \"read\"\n },\n \"post\": {\n \"description\": \"Start a public, inline pipeline headlessly against a supplied brief. Returns a job id to poll or stream. Nothing is pushed to GitHub.\",\n \"operationId\": \"createPublicJob\",\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreatePublicJob\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"202\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicJobAccepted\"\n }\n }\n },\n \"description\": \"Accepted \u2014 the run has started\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Start a headless job\",\n \"tags\": [\n \"Jobs\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/jobs/{id}\": {\n \"get\": {\n \"description\": \"Poll a headless job started through this surface: its status and, once finished, its result.\",\n \"operationId\": \"getPublicJob\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicJob\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get a job\",\n \"tags\": [\n \"Jobs\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/jobs/{id}/cancel\": {\n \"post\": {\n \"description\": \"Stop a headless job run, freeing its concurrency slot. Idempotent \u2014 an already-finished job is returned as-is. Use this to abandon a run parked on a decision you do not intend to answer.\",\n \"operationId\": \"cancelPublicJob\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicJob\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Cancel a job\",\n \"tags\": [\n \"Jobs\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/jobs/{id}/events\": {\n \"get\": {\n \"description\": \"Server-sent events for a headless job run: `progress` frames until a terminal `done`/`error`/`stopped`/`timeout` event. Authenticated by the API key header.\",\n \"operationId\": \"streamPublicJobEvents\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"type\": \"string\"\n }\n }\n },\n \"description\": \"An event stream of job updates\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n }\n },\n \"summary\": \"Stream a job (SSE)\",\n \"tags\": [\n \"Jobs\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/keys\": {\n \"get\": {\n \"description\": \"The live (non-revoked) keys for the calling key\u2019s workspace, metadata only; a secret is never readable back. `createdByKeyId` names the key that provisioned a key headlessly; `createdByUserId` names the person who minted one in the app.\",\n \"operationId\": \"listPublicKeys\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicApiKeyList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the workspace's API keys\",\n \"tags\": [\n \"Keys\"\n ],\n \"x-min-scope\": \"admin\"\n },\n \"post\": {\n \"description\": \"Mint a key for the calling key\u2019s own workspace and return its raw secret EXACTLY ONCE, so store it now: it is not recoverable. Omitting `scope` mints a `write` key. `admin` cannot be minted here: a key provisioned over the API can never itself provision, which keeps the chain one link long. Requires an `admin`-scope key.\",\n \"operationId\": \"createPublicKey\",\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreateHeadlessPublicApiKey\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"201\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreatedPublicApiKey\"\n }\n }\n },\n \"description\": \"Created\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Provision an API key\",\n \"tags\": [\n \"Keys\"\n ],\n \"x-min-scope\": \"admin\"\n }\n },\n \"/api/v1/keys/{keyId}\": {\n \"delete\": {\n \"description\": \"Revoke a key AND every key it minted, so a leaked provisioning key cannot outlive its own revocation through the credentials it left behind. Idempotent, and it may name the calling key. Requires an `admin`-scope key.\",\n \"operationId\": \"revokePublicKey\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"keyId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"204\": {\n \"description\": \"No content\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Revoke an API key\",\n \"tags\": [\n \"Keys\"\n ],\n \"x-min-scope\": \"admin\"\n }\n },\n \"/api/v1/me\": {\n \"get\": {\n \"description\": \"Report what the key on this request is and what it may do: its id, its account, the ONE workspace every call under it acts within, its scope, and the label it was minted with. `read` scope, the floor of the ladder, because an integration\u2019s startup self-check has to work whatever rung it holds. The scope ladder is INCLUSIVE (`read` \u2282 `write` \u2282 `decide` \u2282 `admin`), so compare against the rung an action needs rather than for equality.\",\n \"operationId\": \"getPublicIdentity\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicIdentity\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Describe the calling key\",\n \"tags\": [\n \"Identity\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/merge-records/rollups\": {\n \"get\": {\n \"description\": \"Every change class\u2019s accumulated track record for the workspace, as one aggregate: how many records it holds, how many landed and by which route (auto-merged, merged through the app, merged directly on the provider), how many were rejected or are still awaiting review, and the distribution of reviewer-effort tags. This is the evidence that justifies widening a per-class auto-merge rule; nothing widens one automatically. A class with no records is present as zeros rather than absent, so \\\"nothing has landed here yet\\\" never reads as a class the response left out. `unknown` is a real class (no changed-file list was available) and never matches a per-class rule.\",\n \"operationId\": \"listPublicMergeClassRollups\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"rollups\": {\n \"items\": {\n \"properties\": {\n \"autoMerged\": {\n \"type\": \"number\"\n },\n \"changeClass\": {\n \"enum\": [\n \"docs\",\n \"test\",\n \"dependency\",\n \"config\",\n \"source\",\n \"schema\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"effort\": {\n \"properties\": {\n \"major\": {\n \"type\": \"number\"\n },\n \"minor\": {\n \"type\": \"number\"\n },\n \"none\": {\n \"type\": \"number\"\n },\n \"untagged\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"none\",\n \"minor\",\n \"major\",\n \"untagged\"\n ],\n \"type\": \"object\"\n },\n \"externalMerged\": {\n \"type\": \"number\"\n },\n \"humanMerged\": {\n \"type\": \"number\"\n },\n \"merged\": {\n \"type\": \"number\"\n },\n \"pendingReview\": {\n \"type\": \"number\"\n },\n \"rejected\": {\n \"type\": \"number\"\n },\n \"total\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"changeClass\",\n \"total\",\n \"merged\",\n \"autoMerged\",\n \"humanMerged\",\n \"externalMerged\",\n \"rejected\",\n \"pendingReview\",\n \"effort\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"rollups\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the per-change-class merge rollups\",\n \"tags\": [\n \"Merge records\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/merge-records/{recordId}\": {\n \"get\": {\n \"description\": \"The same record addressed by its own id, for a caller that holds one without the run: the id a `merge_tag_request` notification carries on its payload, for instance. Scoped to the calling key\u2019s workspace.\",\n \"operationId\": \"getPublicMergeRecord\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"recordId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"changeClass\": {\n \"enum\": [\n \"docs\",\n \"test\",\n \"dependency\",\n \"config\",\n \"source\",\n \"schema\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"changedFileCount\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"complexity\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"decision\": {\n \"enum\": [\n \"pending_review\",\n \"auto_merged\",\n \"human_merged\",\n \"external_merged\",\n \"rejected\"\n ],\n \"type\": \"string\"\n },\n \"impact\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"mergePresetId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"mergePresetName\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"prNumber\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"prUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"provider\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"github\",\n \"gitlab\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"recordId\": {\n \"type\": \"string\"\n },\n \"repoId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"resolvedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"reviewEffort\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"none\",\n \"minor\",\n \"major\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"risk\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"taggedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"recordId\",\n \"taskId\",\n \"runId\",\n \"changeClass\",\n \"changedFileCount\",\n \"complexity\",\n \"risk\",\n \"impact\",\n \"mergePresetId\",\n \"mergePresetName\",\n \"decision\",\n \"reviewEffort\",\n \"prNumber\",\n \"prUrl\",\n \"repoId\",\n \"provider\",\n \"createdAt\",\n \"resolvedAt\",\n \"taggedAt\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get one merge record\",\n \"tags\": [\n \"Merge records\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/merge-records/{recordId}/effort\": {\n \"post\": {\n \"description\": \"Record how much review a landed pull request actually needed (`none` for zero blocking comments, `minor` for a nit pass, `major` for real rework), or `null` to clear the tag. This is the ground truth the auto-merge score thresholds are trying to approximate, and it is never mandatory: an untagged merge records a null tag and nothing downstream breaks. A `write` key, not an `admin` one: the pull request already landed, so tagging it merges nothing. Idempotent, and orthogonal to the decision, so a record can be tagged whenever the effort becomes known, before or after the `act` that merged it.\",\n \"operationId\": \"tagPublicMergeReviewEffort\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"recordId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"reviewEffort\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"none\",\n \"minor\",\n \"major\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"reviewEffort\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"changeClass\": {\n \"enum\": [\n \"docs\",\n \"test\",\n \"dependency\",\n \"config\",\n \"source\",\n \"schema\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"changedFileCount\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"complexity\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"decision\": {\n \"enum\": [\n \"pending_review\",\n \"auto_merged\",\n \"human_merged\",\n \"external_merged\",\n \"rejected\"\n ],\n \"type\": \"string\"\n },\n \"impact\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"mergePresetId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"mergePresetName\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"prNumber\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"prUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"provider\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"github\",\n \"gitlab\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"recordId\": {\n \"type\": \"string\"\n },\n \"repoId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"resolvedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"reviewEffort\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"none\",\n \"minor\",\n \"major\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"risk\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"taggedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"recordId\",\n \"taskId\",\n \"runId\",\n \"changeClass\",\n \"changedFileCount\",\n \"complexity\",\n \"risk\",\n \"impact\",\n \"mergePresetId\",\n \"mergePresetName\",\n \"decision\",\n \"reviewEffort\",\n \"prNumber\",\n \"prUrl\",\n \"repoId\",\n \"provider\",\n \"createdAt\",\n \"resolvedAt\",\n \"taggedAt\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Tag the reviewer effort a merge took\",\n \"tags\": [\n \"Merge records\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/notification-webhook\": {\n \"delete\": {\n \"description\": \"Deregister the endpoint; deliveries stop. Idempotent.\",\n \"operationId\": \"deletePublicNotificationWebhook\",\n \"responses\": {\n \"204\": {\n \"description\": \"No content\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Remove the outbound webhook\",\n \"tags\": [\n \"Webhook\"\n ],\n \"x-min-scope\": \"admin\"\n },\n \"get\": {\n \"description\": \"The endpoint this workspace delivers notifications, run-lifecycle events and platform-health alerts to, or `{ \\\"webhook\\\": null }` when none is registered. The signing secret is never returned; `hasSecret` reports only whether one is set.\",\n \"operationId\": \"getPublicNotificationWebhook\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicNotificationWebhook\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Read the workspace's outbound webhook\",\n \"tags\": [\n \"Webhook\"\n ],\n \"x-min-scope\": \"admin\"\n },\n \"put\": {\n \"description\": \"Register the HTTPS endpoint deliveries are POSTed to, or update the one already registered. Every omitted field keeps its stored value, so subscribing to run events is a one-field call that re-sends neither the URL nor the secret. `url` is required only on the first call, when there is nothing registered to keep; omitting it otherwise leaves the endpoint alone. Supplying `secret` rotates the signing secret; omitting it keeps the current one. The endpoint must be `https:` and publicly routable unless the deployment widened its allow-list.\",\n \"operationId\": \"putPublicNotificationWebhook\",\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PutNotificationWebhook\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/NotificationWebhook\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Register or update the outbound webhook\",\n \"tags\": [\n \"Webhook\"\n ],\n \"x-min-scope\": \"admin\"\n }\n },\n \"/api/v1/notification-webhooks\": {\n \"get\": {\n \"description\": \"Every endpoint this workspace delivers to, ordered by id. The endpoint the unnamed routes address appears here under the id `default`. Not paginated: the number of endpoints a workspace may register is capped, so the whole set fits in one response. No signing secret is returned for any of them.\",\n \"operationId\": \"listPublicNotificationWebhooks\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicNotificationWebhookList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the workspace's outbound webhooks\",\n \"tags\": [\n \"Webhook\"\n ],\n \"x-min-scope\": \"admin\"\n }\n },\n \"/api/v1/notification-webhooks/{webhookId}\": {\n \"delete\": {\n \"description\": \"Deregister this endpoint; its deliveries stop and the workspace's other endpoints are untouched. Idempotent.\",\n \"operationId\": \"deletePublicNamedNotificationWebhook\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"webhookId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"204\": {\n \"description\": \"No content\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Remove one named outbound webhook\",\n \"tags\": [\n \"Webhook\"\n ],\n \"x-min-scope\": \"admin\"\n },\n \"get\": {\n \"description\": \"The endpoint registered under this id, or `{ \\\"webhook\\\": null }` when there is none \u2014 the same shape the unnamed read answers, so an integration's startup self-check does not branch on a status code. The signing secret is never returned.\",\n \"operationId\": \"getPublicNamedNotificationWebhook\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"webhookId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicNotificationWebhook\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Read one named outbound webhook\",\n \"tags\": [\n \"Webhook\"\n ],\n \"x-min-scope\": \"admin\"\n },\n \"put\": {\n \"description\": \"Register an endpoint under an id YOU choose (1-63 characters of lowercase letters, digits, `-` or `_`), or update the one already there. Idempotent by id, so an integration can enroll its own receiver on every cold start without tracking whether it has enrolled before, and without displacing anything else the workspace registered. Every field follows the same keep-on-omit rule as the unnamed route, `url` being required only when there is nothing under this id to keep, and a supplied `secret` rotating this endpoint's own signing secret. Refused with `reason: \\\"invalid_webhook_id\\\"` for an id that is not a slug, and `reason: \\\"webhook_limit_reached\\\"` (409) when registering a NEW id would exceed the per-workspace cap; editing an existing one is admitted either way.\",\n \"operationId\": \"putPublicNamedNotificationWebhook\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"webhookId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PutNotificationWebhook\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/NotificationWebhook\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Register or update one named outbound webhook\",\n \"tags\": [\n \"Webhook\"\n ],\n \"x-min-scope\": \"admin\"\n }\n },\n \"/api/v1/notifications\": {\n \"get\": {\n \"description\": \"List the open, human-actionable notifications in the key\u2019s workspace (merge reviews, pipeline-complete confirmations, CI/test failures, and informational cards).\",\n \"operationId\": \"listPublicNotifications\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicNotificationList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the workspace's open notifications\",\n \"tags\": [\n \"Notifications\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/notifications/{id}/act\": {\n \"post\": {\n \"description\": \"Run a notification\u2019s typed side-effect and resolve it: merge the PR (merge_review / pipeline_complete) or retry the run (ci_failed / test_failed). Performs a real GitHub merge, so it requires an admin-scoped key. Only these automated-action types are actionable through the API \u2014 a notification that parks a run on an interactive human decision cannot be acted on headlessly (dismiss it instead). A card that would retry a run on an individual-usage model likewise cannot be acted on through the API. To record how much review a merged pull request needed, call `POST /api/v1/merge-records/{recordId}/effort` (a `write` key) before or after this; a `merge_tag_request` card carries its record id on the payload and is resolved by tagging that record and dismissing the card.\",\n \"operationId\": \"actPublicNotification\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"reviewEffort\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"none\",\n \"minor\",\n \"major\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Notification\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Act on a notification\",\n \"tags\": [\n \"Notifications\"\n ],\n \"x-min-scope\": \"admin\"\n }\n },\n \"/api/v1/notifications/{id}/dismiss\": {\n \"post\": {\n \"description\": \"Dismiss a notification without acting on it.\",\n \"operationId\": \"dismissPublicNotification\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Notification\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Dismiss a notification\",\n \"tags\": [\n \"Notifications\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/pipelines\": {\n \"get\": {\n \"description\": \"List the pipelines in the key\u2019s workspace \u2014 id/name/steps plus whether each is public and safe to run headlessly \u2014 so a caller can pick a pipelineId to start a task with.\",\n \"operationId\": \"listPublicPipelines\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicPipelineList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the workspace's pipelines\",\n \"tags\": [\n \"Pipelines\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/repos\": {\n \"get\": {\n \"description\": \"List the repositories the key\u2019s workspace has connected, each with the service that already backs it (null when nothing does, and always null for a monorepo, which can back several). The discovery half of service creation: the create takes a repoId, and this is where one comes from.\",\n \"operationId\": \"listPublicRepos\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"repos\": {\n \"items\": {\n \"properties\": {\n \"defaultBranch\": {\n \"type\": \"string\"\n },\n \"linkedElsewhere\": {\n \"type\": \"boolean\"\n },\n \"monorepo\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"owner\": {\n \"type\": \"string\"\n },\n \"private\": {\n \"type\": \"boolean\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"repoId\": {\n \"type\": \"number\"\n },\n \"serviceId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"repoId\",\n \"provider\",\n \"owner\",\n \"name\",\n \"defaultBranch\",\n \"private\",\n \"monorepo\",\n \"serviceId\",\n \"linkedElsewhere\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"repos\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the repositories a service can be created against\",\n \"tags\": [\n \"Repos\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/runs/{runId}/artifacts\": {\n \"get\": {\n \"description\": \"The binary artifacts the run captured (UI screenshots) plus the reference images they were reviewed against: id, kind, view, content type, exact byte size and content hash. Unpaged: the capture path caps how many one run may store, so the response size is bounded before the request. Fetch the bytes with the blob endpoint.\",\n \"operationId\": \"listPublicRunArtifacts\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicRunArtifactList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a run's captured artifacts\",\n \"tags\": [\n \"Evidence\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/runs/{runId}/decisions\": {\n \"get\": {\n \"description\": \"Read what a run is currently asking a human. Each entry names its `kind`, and every kind this surface can answer is listed: `requirements-review`, `clarity-review`, `brainstorm`, `interview`, `input-gate`, `approval-gate`, `judge`, `fork`, `agent-decision`, `pr-review`, `human-test`, `visual-confirmation`, `follow-ups`. Each carries the stable ids (item, approval, decision, finding) that its answering route addresses. `parked` reports only whether the run has STOPPED (`status` is `blocked`); it is not a precondition for `decisions` being non-empty, since a `follow-ups` entry is answerable while the run is still working, so poll this regardless of `parked`. An empty `decisions` beside a non-empty `unanswerable` means a wait no route here can settle (a person reviewing the pull request, a deployment-registered gate), each named with its reason and step.\",\n \"operationId\": \"listPublicRunDecisions\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a run's parked decisions\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/approvals/{approvalId}/approve\": {\n \"post\": {\n \"description\": \"Approve the proposal a gated step is holding up, optionally replacing it with an edited one (the edit is what flows to every downstream step), and advance the run. The `approvalId` comes from the run's decision list; passing it back is what makes a racing app user and a racing integration resolve the same gate. Requires a `decide`-scope key.\",\n \"operationId\": \"approvePublicRunStep\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"approvalId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicApproveStep\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Approve a parked step\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/approvals/{approvalId}/reject\": {\n \"post\": {\n \"description\": \"Reject the gated proposal: the run stops entirely, recording a terminal `rejected` failure the board can retry. Requires a `decide`-scope key.\",\n \"operationId\": \"rejectPublicRunStep\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"approvalId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicRejectStep\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Reject a parked step\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/approvals/{approvalId}/request-changes\": {\n \"post\": {\n \"description\": \"Send the gated step back to re-run with your guidance folded in. Unlike the in-app twin this takes freeform feedback only: anchored per-block comments address source line ranges of a rendered proposal, which a headless caller never rendered. Requires a `decide`-scope key.\",\n \"operationId\": \"requestPublicRunStepChanges\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"approvalId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicRequestStepChanges\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Request changes on a parked step\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/approvals/{approvalId}/resolve-exceeded\": {\n \"post\": {\n \"description\": \"Pick how a quality companion that spent its automatic rework budget proceeds: one more round, proceed with the output as it stands, or stop and reset the task. A gate in this state reports `exceeded: true` and refuses the plain approve. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunStepExceeded\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"approvalId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicResolveExceeded\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Resolve a companion gate at its rework cap\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/brainstorm/{stage}/incorporate\": {\n \"post\": {\n \"description\": \"Fold the picks into one converged direction. ASYNCHRONOUS: the response shows the session `incorporating` while the durable driver folds and re-runs in the background. Requires a `decide`-scope key.\",\n \"operationId\": \"incorporatePublicRunBrainstorm\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"stage\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicIncorporate\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Incorporate brainstorm picks\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/brainstorm/{stage}/options/{itemId}\": {\n \"patch\": {\n \"description\": \"Dismiss a proposed option, or reopen one dismissed by mistake. Only `open` options block incorporation. Requires a `decide`-scope key.\",\n \"operationId\": \"setPublicRunBrainstormOptionStatus\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"stage\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicSetFindingStatus\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Dismiss or reopen a brainstorm option\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/brainstorm/{stage}/options/{itemId}/reply\": {\n \"post\": {\n \"description\": \"Pick or steer one of the options the brainstorm agent proposed, for the named stage (`requirements` or `architecture`). A task may hold one live session per stage at once. Requires a `decide`-scope key.\",\n \"operationId\": \"replyPublicRunBrainstormOption\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"stage\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicReplyFinding\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Respond to a brainstorm option\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/brainstorm/{stage}/proceed\": {\n \"post\": {\n \"description\": \"Settle the brainstorm with the last converged direction and advance the parked run. Requires a `decide`-scope key.\",\n \"operationId\": \"proceedPublicRunBrainstorm\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"stage\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Proceed past a brainstorm\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/brainstorm/{stage}/re-review\": {\n \"post\": {\n \"description\": \"Run one more brainstorm pass against the converged direction. Requires a `decide`-scope key.\",\n \"operationId\": \"reReviewPublicRunBrainstorm\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"stage\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Re-run a brainstorm pass\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/brainstorm/{stage}/resolve-exceeded\": {\n \"post\": {\n \"description\": \"Pick how a brainstorm that exhausted its pass budget proceeds: one more round, proceed with the last converged direction, or stop and reset the task. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunBrainstormExceeded\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"stage\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicResolveExceeded\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Resolve a brainstorm at its iteration cap\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/clarity/findings/{itemId}\": {\n \"patch\": {\n \"description\": \"Dismiss a clarity finding as not applicable, or reopen one dismissed by mistake. Only `open` findings block incorporation. Requires a `decide`-scope key.\",\n \"operationId\": \"setPublicRunClarityFindingStatus\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicSetFindingStatus\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Dismiss or reopen a clarity finding\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/clarity/findings/{itemId}/reply\": {\n \"post\": {\n \"description\": \"Record an answer to one clarity-review finding \u2014 the bug-report twin of the requirements loop. Returns the run's updated decision list. Requires a `decide`-scope key.\",\n \"operationId\": \"replyPublicRunClarityFinding\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicReplyFinding\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Answer a clarity (bug-triage) finding\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/clarity/incorporate\": {\n \"post\": {\n \"description\": \"Fold the recorded answers into one standardized bug report. ASYNCHRONOUS: the response shows the review `incorporating` while the durable driver folds and re-reviews in the background. Requires a `decide`-scope key.\",\n \"operationId\": \"incorporatePublicRunClarity\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicIncorporate\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Incorporate clarity answers\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/clarity/proceed\": {\n \"post\": {\n \"description\": \"Settle the clarity phase with the last clarified report and advance the parked run. Requires a `decide`-scope key.\",\n \"operationId\": \"proceedPublicRunClarity\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Proceed past the clarity review\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/clarity/re-review\": {\n \"post\": {\n \"description\": \"Run one more triage pass over the incorporated bug report. On convergence the parked run advances. Requires a `decide`-scope key.\",\n \"operationId\": \"reReviewPublicRunClarity\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Re-triage the clarified report\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/clarity/resolve-exceeded\": {\n \"post\": {\n \"description\": \"Pick how a clarity review that exhausted its pass budget proceeds: one more round, proceed with the last clarified report, or stop and reset the task. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunClarityExceeded\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicResolveExceeded\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Resolve a clarity review at its iteration cap\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/follow-ups/items/{itemId}/answer\": {\n \"post\": {\n \"description\": \"Answer one `question` item the Coder raised mid-run; the answer steers its next pass. Refused for a `follow_up` item, which is filed, sent back or dismissed instead. Requires a `decide`-scope key.\",\n \"operationId\": \"answerPublicRunFollowUp\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicAnswerFollowUp\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Answer a follow-up question\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/follow-ups/items/{itemId}/dismiss\": {\n \"post\": {\n \"description\": \"Wave one item off without acting on it. Valid for either item kind, and (like every other verb here) releases the park once it is the last undecided item. Requires a `decide`-scope key.\",\n \"operationId\": \"dismissPublicRunFollowUp\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Dismiss a follow-up item\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/follow-ups/items/{itemId}/file\": {\n \"post\": {\n \"description\": \"File one `follow_up` item on the workspace's issue tracker, recording the ticket ref on the item. Refused for a `question` item, and for a workspace with no tracker connected. Creating the issue is not idempotent, so a retry after a partial failure files a second one. Requires a `decide`-scope key.\",\n \"operationId\": \"filePublicRunFollowUp\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"File a follow-up item as an issue\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/follow-ups/items/{itemId}/send-back\": {\n \"post\": {\n \"description\": \"Fold one `follow_up` item into another Coder pass (the item records as `queued`). Once every item is decided the run loops the Coder for the ones sent back, within the `maxLoops` budget the decision reports. Requires a `decide`-scope key.\",\n \"operationId\": \"sendBackPublicRunFollowUp\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Send a follow-up item back to the Coder\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/fork/choose\": {\n \"post\": {\n \"description\": \"Pick one of the proposed implementation forks (by id) or submit your own approach. The Coder then runs with the choice folded in as a binding directive. Requires a `decide`-scope key.\",\n \"operationId\": \"choosePublicRunFork\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicChooseFork\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Choose an implementation approach\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/human-test/confirm\": {\n \"post\": {\n \"description\": \"Confirm the change works in the ephemeral environment: it is torn down and the run advances. The decision carries the environment URL to exercise; confirming without exercising it approves untested work. Requires a `decide`-scope key.\",\n \"operationId\": \"confirmPublicRunHumanTest\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Confirm a human-test gate\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/human-test/request-fix\": {\n \"post\": {\n \"description\": \"Submit findings against the tested environment and dispatch a fixer, which commits onto the PR branch before the environment is rebuilt. The findings ARE the fixer prompt, so they cannot be blank. Requires a `decide`-scope key.\",\n \"operationId\": \"requestPublicRunHumanTestFix\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicRequestGateFix\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Request a fix from a human-test gate\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/input-gate/resolve\": {\n \"post\": {\n \"description\": \"Settle a run the pre-dispatch input gate parked before its first agent step because the task states nothing an agent could act on. `recheck` re-evaluates the task as it now stands (edit it over `PATCH /api/v1/tasks/{taskId}` first: the fix is verified, not taken on trust) and releases the run only if the blocking findings are gone; a still-blocked verdict comes back as an ordinary 200 with refreshed findings. `proceed` waives the findings, which stay on the run as an `overridden` record. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunInputGate\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicResolveInputGate\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Resolve a run parked on the task's input check\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/interview/answer\": {\n \"post\": {\n \"description\": \"Record an answer to one question the parked interviewer asked. Does NOT resume the run: answer the batch, then `continue` or `proceed`. Requires a `decide`-scope key.\",\n \"operationId\": \"answerPublicRunInterview\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicAnswerInterview\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Answer an interview question\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/interview/continue\": {\n \"post\": {\n \"description\": \"Submit the recorded answers and resume: the interviewer runs again and may ask follow-up questions. ASYNCHRONOUS: the pass runs in the durable driver, so the next round arrives on a later read of the decision list. Requires a `decide`-scope key.\",\n \"operationId\": \"continuePublicRunInterview\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Continue a parked interview\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/interview/proceed\": {\n \"post\": {\n \"description\": \"Stop the questions: the interviewer converges on the answers so far and the run advances. Also asynchronous, since converging is itself an interviewer pass. Requires a `decide`-scope key.\",\n \"operationId\": \"proceedPublicRunInterview\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Proceed past a parked interview\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/judge/resolve\": {\n \"post\": {\n \"description\": \"Settle a run parked on a judge verdict: proceed anyway, bounce the producing step for rework, or stop the run. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunJudge\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"choice\": {\n \"enum\": [\n \"proceed\",\n \"bounce\",\n \"stop\"\n ],\n \"type\": \"string\"\n },\n \"feedback\": {\n \"anyOf\": [\n {\n \"maxLength\": 4000,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"choice\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Resolve a parked judge verdict\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/pr-review/findings/{findingId}/challenge\": {\n \"post\": {\n \"description\": \"Dispatch a read-only investigator to re-examine one finding against the full source, optionally with a specific concern. It upholds, strengthens or retracts the finding, and the review re-parks carrying the verdict. Requires a `decide`-scope key.\",\n \"operationId\": \"challengePublicRunPrReviewFinding\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"findingId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicChallengePrReviewFinding\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Challenge a PR review finding\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/pr-review/findings/{findingId}/dismiss\": {\n \"post\": {\n \"description\": \"Drop one finding from the parked review entirely. Curation rather than a resolution: the run stays parked. Requires a `decide`-scope key.\",\n \"operationId\": \"dismissPublicRunPrReviewFinding\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"findingId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Dismiss a PR review finding\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/pr-review/resolve\": {\n \"post\": {\n \"description\": \"Record the curated finding selection and say what to do with it: `finish` completes the read-only review, `fix` hands the selected findings to a fixer that commits onto the reviewed PR branch, `post` publishes them as inline PR review comments. `fix` and `post` need at least one selected finding and act on the real pull request. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunPrReview\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicResolvePrReview\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Resolve a parked PR deep review\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/questions/{decisionId}/answer\": {\n \"post\": {\n \"description\": \"Answer a question an agent raised mid-work. Resolving RE-RUNS the asking step with the choice folded in, rather than advancing past it. The choice is taken verbatim, so it may be one of the offered options or a steer of your own. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunAgentDecision\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"decisionId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicResolveAgentDecision\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Answer an agent-raised decision\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/requirements/findings/{itemId}\": {\n \"patch\": {\n \"description\": \"Dismiss a finding as not applicable, or reopen one dismissed by mistake. Requires a `decide`-scope key.\",\n \"operationId\": \"setPublicRunFindingStatus\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicSetFindingStatus\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Dismiss or reopen a finding\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/requirements/findings/{itemId}/reply\": {\n \"post\": {\n \"description\": \"Record an answer to one reviewer finding. Returns the run's updated decision list. Requires a `decide`-scope key.\",\n \"operationId\": \"replyPublicRunFinding\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicReplyFinding\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Answer a review finding\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/requirements/incorporate\": {\n \"post\": {\n \"description\": \"Fold the recorded answers into one standardized requirements document. Asynchronous \u2014 the run re-reviews in the background, so the response shows the review `incorporating`. Requires a `decide`-scope key.\",\n \"operationId\": \"incorporatePublicRunRequirements\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicIncorporate\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Incorporate the answers\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/requirements/proceed\": {\n \"post\": {\n \"description\": \"Settle the requirements phase and advance the parked run (used when nothing is outstanding). Requires a `decide`-scope key.\",\n \"operationId\": \"proceedPublicRunRequirements\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Proceed with the current requirements\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/requirements/re-review\": {\n \"post\": {\n \"description\": \"Run one more reviewer pass over the incorporated document. On convergence the parked run advances. Requires a `decide`-scope key.\",\n \"operationId\": \"reReviewPublicRunRequirements\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Re-review the incorporated document\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/requirements/resolve-exceeded\": {\n \"post\": {\n \"description\": \"Pick how a review that exhausted its reviewer-pass budget proceeds: one more round, proceed with the last incorporated document, or stop and reset the task. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunRequirementsExceeded\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicResolveExceeded\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Resolve a review at its iteration cap\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/visual-confirmation/approve\": {\n \"post\": {\n \"description\": \"Approve the captured screenshots against the reference designs and advance the run. The images themselves are not readable over this API \u2014 the decision carries only artifact ids \u2014 so approving on the projection alone approves screenshots you have not seen. Requires a `decide`-scope key.\",\n \"operationId\": \"approvePublicRunVisualConfirm\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Approve a visual-confirmation gate\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/visual-confirmation/request-fix\": {\n \"post\": {\n \"description\": \"Submit findings against the captured screenshots and dispatch a fixer. The findings ARE the fixer prompt, so they cannot be blank. Requires a `decide`-scope key.\",\n \"operationId\": \"requestPublicRunVisualConfirmFix\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicRequestGateFix\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Request a fix from a visual-confirmation gate\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/merge-record\": {\n \"get\": {\n \"description\": \"What kind of change the run\u2019s pull request made (a change class derived on the backend from the changed-file list, never from an agent\u2019s opinion), what the merger scored it, which merge-threshold preset the decision was compared against, what ultimately happened to the pull request, and how much review a human spent if anybody has tagged it. The entry point of the merge-evidence loop for a caller holding a run id: it also hands back the `recordId` the effort-tag route takes. A run whose pipeline had no `merger` step made no merge decision and answers `404` with `details.reason: \\\"no_merge_record\\\"`, distinct from the `\\\"run_not_found\\\"` a run this key cannot read gets.\",\n \"operationId\": \"getPublicRunMergeRecord\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"changeClass\": {\n \"enum\": [\n \"docs\",\n \"test\",\n \"dependency\",\n \"config\",\n \"source\",\n \"schema\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"changedFileCount\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"complexity\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"decision\": {\n \"enum\": [\n \"pending_review\",\n \"auto_merged\",\n \"human_merged\",\n \"external_merged\",\n \"rejected\"\n ],\n \"type\": \"string\"\n },\n \"impact\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"mergePresetId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"mergePresetName\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"prNumber\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"prUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"provider\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"github\",\n \"gitlab\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"recordId\": {\n \"type\": \"string\"\n },\n \"repoId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"resolvedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"reviewEffort\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"none\",\n \"minor\",\n \"major\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"risk\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"taggedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"recordId\",\n \"taskId\",\n \"runId\",\n \"changeClass\",\n \"changedFileCount\",\n \"complexity\",\n \"risk\",\n \"impact\",\n \"mergePresetId\",\n \"mergePresetName\",\n \"decision\",\n \"reviewEffort\",\n \"prNumber\",\n \"prUrl\",\n \"repoId\",\n \"provider\",\n \"createdAt\",\n \"resolvedAt\",\n \"taggedAt\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get the merge decision a run left behind\",\n \"tags\": [\n \"Merge records\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/runs/{runId}/outcome\": {\n \"get\": {\n \"description\": \"What the run changed and what backs that up, in product language, for a reader who will not open the diff: the run\u2019s disposition, the pull requests it opened, requirement coverage joined to the service\u2019s `spec/`, the tester\u2019s verdict and concerns, the views it captured, and the machine checks that ran. The same reduction the app\u2019s outcome card renders, over the same evidence the verification report is built from, so the two cannot state different totals for one run. Nothing here is asserted by a model: every count is derived from recorded verdicts. Prefer the verification report when you need a reviewer\u2019s full bundle; prefer this when you need to say what shipped. Sections state `reported` or `absent` with a machine-readable gap code, and `truncations` names any list the response had to bound.\",\n \"operationId\": \"getPublicRunOutcome\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"ask\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"checks\": {\n \"items\": {\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"ci\",\n \"validation\",\n \"reproduction\"\n ],\n \"type\": \"string\"\n },\n \"reproduction\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"reproduced\",\n \"inconclusive\",\n \"declared_infeasible\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"state\": {\n \"enum\": [\n \"pass\",\n \"fail\",\n \"pending\",\n \"inconclusive\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"state\",\n \"reproduction\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"disposition\": {\n \"enum\": [\n \"merged\",\n \"awaiting_merge\",\n \"in_flight\",\n \"needs_attention\",\n \"not_run\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"pullRequests\": {\n \"items\": {\n \"properties\": {\n \"branch\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"number\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"repo\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"url\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"url\",\n \"number\",\n \"branch\",\n \"repo\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"requirements\": {\n \"oneOf\": [\n {\n \"properties\": {\n \"gap\": {\n \"enum\": [\n \"run_unavailable\",\n \"no_tester_step\",\n \"tester_not_reported\",\n \"no_verdicts\",\n \"no_requirements\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"absent\"\n }\n },\n \"required\": [\n \"status\",\n \"gap\"\n ],\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"entries\": {\n \"items\": {\n \"properties\": {\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"regression\": {\n \"type\": \"boolean\"\n },\n \"state\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"aspirational\",\n \"established\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"title\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"verdict\": {\n \"enum\": [\n \"met\",\n \"not_met\",\n \"not_covered\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"title\",\n \"verdict\",\n \"detail\",\n \"state\",\n \"regression\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"met\": {\n \"type\": \"number\"\n },\n \"notCovered\": {\n \"type\": \"number\"\n },\n \"notMet\": {\n \"type\": \"number\"\n },\n \"regressions\": {\n \"type\": \"number\"\n },\n \"spec\": {\n \"enum\": [\n \"joined\",\n \"not_read\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"reported\"\n },\n \"total\": {\n \"type\": \"number\"\n },\n \"unmatchedVerdicts\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"status\",\n \"spec\",\n \"met\",\n \"notMet\",\n \"notCovered\",\n \"regressions\",\n \"total\",\n \"unmatchedVerdicts\",\n \"entries\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"sources\": {\n \"oneOf\": [\n {\n \"properties\": {\n \"gap\": {\n \"enum\": [\n \"run_unavailable\",\n \"none_linked\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"absent\"\n }\n },\n \"required\": [\n \"status\",\n \"gap\"\n ],\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"sources\": {\n \"items\": {\n \"properties\": {\n \"freshness\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/DocumentFreshness\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"movedDuringRun\": {\n \"type\": \"boolean\"\n },\n \"origin\": {\n \"enum\": [\n \"confluence\",\n \"notion\",\n \"github\",\n \"figma\",\n \"zeplin\",\n \"linear\",\n \"upload\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"title\",\n \"url\",\n \"origin\",\n \"freshness\",\n \"movedDuringRun\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"status\": {\n \"const\": \"reported\"\n }\n },\n \"required\": [\n \"status\",\n \"sources\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"tests\": {\n \"oneOf\": [\n {\n \"properties\": {\n \"gap\": {\n \"enum\": [\n \"run_unavailable\",\n \"no_tester_step\",\n \"tester_not_reported\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"absent\"\n }\n },\n \"required\": [\n \"status\",\n \"gap\"\n ],\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"abortReason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"areas\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"concerns\": {\n \"items\": {\n \"properties\": {\n \"severity\": {\n \"enum\": [\n \"low\",\n \"medium\",\n \"high\",\n \"critical\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"title\",\n \"severity\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"environment\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"local\",\n \"ephemeral\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"failed\": {\n \"type\": \"number\"\n },\n \"passed\": {\n \"type\": \"number\"\n },\n \"skipped\": {\n \"type\": \"number\"\n },\n \"status\": {\n \"const\": \"reported\"\n },\n \"summary\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"verdict\": {\n \"enum\": [\n \"greenlit\",\n \"concerns\",\n \"could_not_run\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\",\n \"verdict\",\n \"summary\",\n \"abortReason\",\n \"areas\",\n \"passed\",\n \"failed\",\n \"skipped\",\n \"concerns\",\n \"environment\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"truncations\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"version\": {\n \"type\": \"number\"\n },\n \"visuals\": {\n \"oneOf\": [\n {\n \"properties\": {\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"gap\": {\n \"enum\": [\n \"run_unavailable\",\n \"no_visual_step\",\n \"none_captured\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"absent\"\n }\n },\n \"required\": [\n \"status\",\n \"gap\",\n \"detail\"\n ],\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"phase\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"awaiting_human\",\n \"fixing\",\n \"approved\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"source\": {\n \"enum\": [\n \"visual_confirm\",\n \"tester\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"reported\"\n },\n \"views\": {\n \"items\": {\n \"properties\": {\n \"artifactId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"referenceArtifactId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"view\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"view\",\n \"artifactId\",\n \"referenceArtifactId\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"status\",\n \"source\",\n \"phase\",\n \"views\"\n ],\n \"type\": \"object\"\n }\n ]\n }\n },\n \"required\": [\n \"version\",\n \"disposition\",\n \"title\",\n \"ask\",\n \"pullRequests\",\n \"requirements\",\n \"tests\",\n \"visuals\",\n \"sources\",\n \"checks\",\n \"truncations\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get a run's outcome summary\",\n \"tags\": [\n \"Evidence\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/runs/{runId}/report\": {\n \"get\": {\n \"description\": \"The engine\u2019s bundle of CAPTURED FACTS about a run: the CI gate\u2019s verdict and failing checks, the platform\u2019s own run of the service\u2019s lint/test/build commands (with the failing output), the red-then-green reproduction proof for a bugfix, the tester\u2019s structured report, requirement coverage, the throwaway-environment lifecycle, judge verdicts and the merge decision. Byte-for-byte the JSON block the pull-request body carries, composed on read, so it also answers for a run that never opened a pull request. Each section states `reported` or `absent` with a note, so a step that did not run never looks like a step that found nothing.\",\n \"operationId\": \"getPublicRunReport\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PrVerificationReport\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get a run's verification report\",\n \"tags\": [\n \"Evidence\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/services\": {\n \"get\": {\n \"description\": \"List the board service frames in the key\u2019s workspace, so a caller can discover the serviceId to create/list tasks under.\",\n \"operationId\": \"listPublicServices\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicServiceList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the workspace's services\",\n \"tags\": [\n \"Services\"\n ],\n \"x-min-scope\": \"read\"\n },\n \"post\": {\n \"description\": \"Create a board service, optionally backed by a repository from `GET /api/v1/repos`. The repository link is what makes the service runnable: execution resolves a task\u2019s repository by walking up to its enclosing service frame, so a service with none holds tasks and can start none of them. A whole-repo repository that already backs a service in this account is MOUNTED rather than duplicated; a monorepo service must name its subdirectory. The board lays the service out itself: this surface publishes no coordinates. Requires an `admin` key.\",\n \"operationId\": \"createPublicService\",\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"description\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"repo\": {\n \"properties\": {\n \"directory\": {\n \"maxLength\": 400,\n \"type\": \"string\"\n },\n \"monorepo\": {\n \"type\": \"boolean\"\n },\n \"repoId\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"repoId\"\n ],\n \"type\": \"object\"\n },\n \"title\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"type\": {\n \"enum\": [\n \"service\",\n \"frontend\",\n \"library\",\n \"document\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"201\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicService\"\n }\n }\n },\n \"description\": \"Created\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Create a service\",\n \"tags\": [\n \"Services\"\n ],\n \"x-min-scope\": \"admin\"\n }\n },\n \"/api/v1/services/{serviceId}/spec\": {\n \"get\": {\n \"description\": \"The prescriptive specification stored in the service\u2019s own repository under `spec/`: modules \u2192 feature groups \u2192 requirement items, each with its MoSCoW priority, its `aspirational`/`established` implementation state and its Given/When/Then acceptance criteria, plus the domain rules scoped to each group and the Gherkin `.feature` files rendered from the same tree. `provenance` names the branch and commit the read describes, because the default branch is not what a run with an open pull request is working against. The requirement ids here are the join key onto `requirements` on a run\u2019s report and outcome, so criterion \u2192 evidence is a map lookup. Four outcomes are kept apart rather than folded: `present: false` means the default branch holds no spec, a `503` with `reason: \\\"spec_read_failed\\\"` means the repository could not be read, a `503` with `reason: \\\"vcs_not_configured\\\"` means the deployment or workspace wired no version control, and a partially readable spec is SERVED with `issues` naming each file that did not survive. Read-only: the spec\u2019s write path is a reviewed commit.\",\n \"operationId\": \"getPublicServiceSpec\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"serviceId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicServiceSpec\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get a service's in-repo specification\",\n \"tags\": [\n \"Spec\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/services/{serviceId}/tasks\": {\n \"get\": {\n \"description\": \"List every task under a service (the whole subtree \u2014 tasks directly under the frame and under its modules).\",\n \"operationId\": \"listPublicServiceTasks\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"serviceId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"planned\",\n \"ready\",\n \"in_progress\",\n \"blocked\",\n \"pr_ready\",\n \"done\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTaskList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a service's tasks\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"read\"\n },\n \"post\": {\n \"description\": \"Create a task inside a service frame the key\u2019s workspace owns. The task starts in the `planned` state; start it with the start endpoint. Optionally file it FROM a tracker ticket, and/or attach the requirements documents it is to be built against (named in a connected document source, or uploaded inline): the only way to get spec-sized input onto a repository-touching run.\",\n \"operationId\": \"createPublicTask\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"serviceId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreatePublicTask\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"201\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Created\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Create a task under a service\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/task-types\": {\n \"get\": {\n \"description\": \"List the task types a task can be created as in the key\u2019s workspace (the built-in ones plus any the deployment registered), each with the fields it accepts. Fill those fields through `fields` on task creation; the descriptors here are what that call validates against, so a caller reads the form rather than guessing it. A type a workspace admin has hidden is absent.\",\n \"operationId\": \"listPublicTaskTypes\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"taskTypes\": {\n \"items\": {\n \"properties\": {\n \"builtin\": {\n \"type\": \"boolean\"\n },\n \"category\": {\n \"type\": \"string\"\n },\n \"defaultPipelineId\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"fields\": {\n \"items\": {\n \"properties\": {\n \"default\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"defaultValues\": {\n \"items\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"maxItems\": 50,\n \"type\": \"array\"\n },\n \"help\": {\n \"maxLength\": 300,\n \"type\": \"string\"\n },\n \"key\": {\n \"maxLength\": 80,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"label\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"max\": {\n \"type\": \"number\"\n },\n \"maxLength\": {\n \"maximum\": 2000,\n \"minimum\": 1,\n \"type\": \"integer\"\n },\n \"min\": {\n \"type\": \"number\"\n },\n \"options\": {\n \"items\": {\n \"properties\": {\n \"label\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"value\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"value\",\n \"label\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"placeholder\": {\n \"maxLength\": 200,\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"section\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"showWhen\": {\n \"properties\": {\n \"equals\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"includes\": {\n \"type\": \"string\"\n },\n \"key\": {\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"key\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"text\",\n \"password\",\n \"select\",\n \"number\",\n \"checkbox\",\n \"textarea\",\n \"checkbox-group\",\n \"path\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"key\",\n \"label\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"taskType\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"taskType\",\n \"builtin\",\n \"label\",\n \"fields\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"taskTypes\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the task types this workspace may create\",\n \"tags\": [\n \"Task types\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/tasks/{taskId}\": {\n \"delete\": {\n \"description\": \"Delete a task and its run history. Destructive, so it sits at the top of the scope ladder: requires an `admin`-scoped key.\",\n \"operationId\": \"deletePublicTask\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"204\": {\n \"description\": \"No content\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Delete a task\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"admin\"\n },\n \"get\": {\n \"description\": \"Read a task\u2019s current lifecycle status, run progress, run id, and PR URL (once one exists).\",\n \"operationId\": \"getPublicTask\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get a task's status\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"read\"\n },\n \"patch\": {\n \"description\": \"Edit a task\u2019s human-authored inputs before it runs: its title, its description, and `fields`, the per-case values for its own task type (checked against the descriptors `GET /api/v1/task-types` serves). All are optional. `fields` is MERGED over what the task already carries \u2014 a key you send is written, a key you omit keeps its stored value \u2014 because this API does not serve the bag back. This is what makes an input the pre-dispatch gate refused repairable: supply the value it named, then recheck the parked run.\",\n \"operationId\": \"updatePublicTask\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/UpdatePublicTask\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Edit a task's inputs\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/tasks/{taskId}/dependencies\": {\n \"post\": {\n \"description\": \"Record that this task cannot start until `dependsOnTaskId` is done. Both ends must be tasks in this workspace, and an edge that would close a cycle is refused. Idempotent: an edge that already exists is returned as-is rather than toggled off, so a provisioning integration re-running its own setup converges. Pair it with `autoStartDependents` on the BLOCKER (the task patch) to have the chain run itself.\",\n \"operationId\": \"addPublicTaskDependency\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"dependsOnTaskId\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"dependsOnTaskId\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Declare that a task waits for another\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/tasks/{taskId}/dependencies/remove\": {\n \"post\": {\n \"description\": \"Remove the ordering between this task and `dependsOnTaskId`. Idempotent: an edge that is not there is a no-op.\",\n \"operationId\": \"removePublicTaskDependency\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"dependsOnTaskId\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"dependsOnTaskId\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Drop a dependency edge\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/tasks/{taskId}/documents\": {\n \"get\": {\n \"description\": \"The requirements documents attached to the task, in the order the agents read them. Each is identified by the `(source, externalId)` pair the attach and detach calls take.\",\n \"operationId\": \"listPublicTaskDocuments\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"documents\": {\n \"items\": {\n \"properties\": {\n \"excerpt\": {\n \"type\": \"string\"\n },\n \"externalId\": {\n \"type\": \"string\"\n },\n \"source\": {\n \"enum\": [\n \"confluence\",\n \"notion\",\n \"github\",\n \"figma\",\n \"zeplin\",\n \"linear\",\n \"upload\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"source\",\n \"externalId\",\n \"title\",\n \"url\",\n \"excerpt\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"documents\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a task's attached documents\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"read\"\n },\n \"post\": {\n \"description\": \"Attach a requirements document to a task that already exists, in either of the two forms creation takes: NAME a page in a connected document source, or CARRY the text inline. A task\u2019s spec routinely arrives after the task does, and before this the only way to attach one was to delete the task and file it again, losing the id every stored reference points at, its ticket claim and the documents it already carried. A document a different live task already holds is refused rather than moved.\",\n \"operationId\": \"attachPublicTaskDocument\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"document\": {\n \"$ref\": \"#/components/schemas/PublicTaskDocument\"\n }\n },\n \"required\": [\n \"document\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"201\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"excerpt\": {\n \"type\": \"string\"\n },\n \"externalId\": {\n \"type\": \"string\"\n },\n \"source\": {\n \"enum\": [\n \"confluence\",\n \"notion\",\n \"github\",\n \"figma\",\n \"zeplin\",\n \"linear\",\n \"upload\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"source\",\n \"externalId\",\n \"title\",\n \"url\",\n \"excerpt\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Created\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Attach a document to a task\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/tasks/{taskId}/documents/detach\": {\n \"post\": {\n \"description\": \"Detach a document, naming it by the `(source, externalId)` pair the list serves. The document itself survives in the workspace, so re-attaching it later costs no re-import. Idempotent: detaching one the task does not hold is a no-op.\",\n \"operationId\": \"detachPublicTaskDocument\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"externalId\": {\n \"maxLength\": 500,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"source\": {\n \"enum\": [\n \"confluence\",\n \"notion\",\n \"github\",\n \"figma\",\n \"zeplin\",\n \"linear\",\n \"upload\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"source\",\n \"externalId\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"204\": {\n \"description\": \"No content\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Detach a document from a task\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/tasks/{taskId}/events\": {\n \"get\": {\n \"description\": \"Server-sent events for a board task run: `progress` frames (the rich run projection) until a terminal `done`/`error` event, or a `timeout` when the connection cap is reached. Authenticated by the API key header.\",\n \"operationId\": \"streamPublicTaskRun\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"type\": \"string\"\n }\n }\n },\n \"description\": \"An event stream of run updates\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n }\n },\n \"summary\": \"Stream a task run (SSE)\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/tasks/{taskId}/retry\": {\n \"post\": {\n \"description\": \"Retry a task\u2019s failed run. A task on an individual-usage model cannot be retried through the API (no headless personal-credential unlock).\",\n \"operationId\": \"retryPublicTask\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"202\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Accepted \u2014 the run has started\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Retry a task's failed run\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/tasks/{taskId}/run\": {\n \"get\": {\n \"description\": \"Read a task\u2019s run in detail: per-step status/progress/subtasks, the failure kind and message, and the PR (url + branch).\",\n \"operationId\": \"getPublicRun\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicRun\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get a task's run (rich projection)\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/tasks/{taskId}/start\": {\n \"post\": {\n \"description\": \"Start a task\u2019s pipeline. Uses the request\u2019s pipelineId, else the task\u2019s pinned pipeline. A pipeline that can park on a human decision requires a `decide`-scope key. A task on an individual-usage model cannot be started through the API (no headless personal-credential unlock).\",\n \"operationId\": \"startPublicTask\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/StartPublicTask\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"202\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Accepted \u2014 the run has started\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Start (run) a task\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/tasks/{taskId}/stop\": {\n \"post\": {\n \"description\": \"Stop a task\u2019s in-flight run. Records a `cancelled` terminal state, leaving the run retryable.\",\n \"operationId\": \"stopPublicTask\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Stop a task's run\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/usage\": {\n \"get\": {\n \"description\": \"Read this billing period\u2019s METERED spend against the workspace budget (including whether it is exceeded, which pauses runs) plus the per-(billing, vendor, provider, model) token breakdown behind it. Costs on `subscription` rows are illustrative \u2014 a flat-rate plan bills nothing per token \u2014 so branch on `billing` before summing. Workspace-scoped: the account- and user-tier budgets are not reachable through this surface.\",\n \"operationId\": \"getPublicUsage\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicUsage\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Read the workspace's usage for the current period\",\n \"tags\": [\n \"Usage\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/usage/spend\": {\n \"get\": {\n \"description\": \"Group the board\u2019s spend over a window (`24h`, `7d`, `30d`, `90d`) by ONE dimension: `repo`, `ticket` and `run` are the cost-attribution axes an organisation budgets against, and `model` / `agentKind` / `service` / `taskType` slice the same money the other ways. `meteredCost` is real money and `subscriptionCost` is the illustrative equivalent-API cost of flat-rate quota usage, so never sum them. The EMPTY `key` is the unattributed bucket, a real slice rather than a dropped row, never dropped from the breakdown. `rows` is the heaviest `limit` slices (default 100, max 500) and `truncated` says when there was a tail, while `totals` aggregates the WHOLE window either way, so a capped answer still reports what the board spent. `source` says which store answered: the short windows scan the live ledger, which resolves a repository or a ticket through today\u2019s links, while the long ones read the durable daily rollup, which froze that attribution while the money was spent and is never pruned. Read `rolledUpThrough` before reporting a quiet quarter, since a rollup that has never run and a board that spent nothing look identical. Workspace-scoped: the account-wide view is not reachable through this surface.\",\n \"operationId\": \"getPublicSpend\",\n \"parameters\": [\n {\n \"in\": \"query\",\n \"name\": \"dimension\",\n \"required\": true,\n \"schema\": {\n \"enum\": [\n \"model\",\n \"agentKind\",\n \"service\",\n \"repo\",\n \"taskType\",\n \"ticket\",\n \"run\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"window\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"24h\",\n \"7d\",\n \"30d\",\n \"90d\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 500,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicSpend\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Break the workspace's spend down by repository, ticket, run or step kind\",\n \"tags\": [\n \"Usage\"\n ],\n \"x-min-scope\": \"read\"\n }\n }\n },\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"servers\": [\n {\n \"description\": \"The deployment base URL\",\n \"url\": \"/\"\n }\n ],\n \"tags\": [\n {\n \"description\": \"A run\u2019s recorded telemetry, for diagnosing one that went wrong: the model calls it made, the context each agent was provided, the searches it ran, the tools it invoked and how its infrastructure came up. Read-only (`read` scope), and every response\u2019s size is bounded before the request is made.\",\n \"name\": \"Debug\"\n },\n {\n \"description\": \"A run\u2019s human decisions, from requirement-review and clarity findings through approval gates, judge verdicts, interviews and follow-ups, so a headless caller can drive the clarification loop instead of the run hanging. Answering requires a `decide`-scope key.\",\n \"name\": \"Decisions\"\n },\n {\n \"description\": \"What a run PROVED: the engine\u2019s own verification report (the same bundle it writes onto the pull request) and the binary artifacts the run captured, bytes included. The surface for a consumer that has to judge a run (accept the change, score the fleet) rather than debug one. Read-only (`read` scope).\",\n \"name\": \"Evidence\"\n },\n {\n \"description\": \"What the calling key is and what it may do \u2014 the self-check an integration runs at startup, so \u201Ccan I do this?\u201D does not have to be answered by attempting it and reading the 403. `read` scope.\",\n \"name\": \"Identity\"\n },\n {\n \"description\": \"Headless runs of a public, inline pipeline (start, poll, stream).\",\n \"name\": \"Jobs\"\n },\n {\n \"description\": \"The workspace\u2019s public-API keys, provisioned headlessly. Requires an `admin`-scope key; a key minted here can never reach `admin` itself, and revoking a key revokes everything it minted.\",\n \"name\": \"Keys\"\n },\n {\n \"name\": \"Merge records\"\n },\n {\n \"description\": \"The workspace\u2019s human-actionable notifications (list, act on, or dismiss the run tails).\",\n \"name\": \"Notifications\"\n },\n {\n \"description\": \"The workspace\u2019s pipelines (discover a pipelineId to start a task with).\",\n \"name\": \"Pipelines\"\n },\n {\n \"name\": \"Repos\"\n },\n {\n \"description\": \"The workspace\u2019s board services.\",\n \"name\": \"Services\"\n },\n {\n \"name\": \"Spec\"\n },\n {\n \"name\": \"Task types\"\n },\n {\n \"description\": \"Board tasks under a service (create, list, read, edit, start, stop, retry, stream).\",\n \"name\": \"Tasks\"\n },\n {\n \"name\": \"Usage\"\n },\n {\n \"description\": \"The workspace\u2019s one outbound endpoint: register it to receive notifications, run-lifecycle events and platform-health alerts by push instead of polling. Requires an `admin`-scope key; the signing secret is write-only.\",\n \"name\": \"Webhook\"\n }\n ],\n \"x-public-api-scopes\": [\n \"read\",\n \"write\",\n \"decide\",\n \"admin\"\n ]\n}\n";
|
|
1
|
+
export declare const OPENAPI_JSON = "{\n \"components\": {\n \"schemas\": {\n \"AcceptanceCriterion\": {\n \"properties\": {\n \"given\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"id\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"outcome\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"when\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"given\",\n \"when\",\n \"outcome\"\n ],\n \"type\": \"object\"\n },\n \"CreateHeadlessPublicApiKey\": {\n \"properties\": {\n \"externalIdentity\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"pattern\": \"^[^\\\\x00-\\\\x1f\\\\x7f\\\\x80-\\\\x9f]+$\",\n \"type\": \"string\"\n },\n \"label\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"scope\": {\n \"enum\": [\n \"read\",\n \"write\",\n \"decide\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"label\"\n ],\n \"type\": \"object\"\n },\n \"CreatePublicJob\": {\n \"properties\": {\n \"input\": {\n \"maxLength\": 50000,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"pipelineId\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"title\": {\n \"maxLength\": 200,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"pipelineId\",\n \"input\"\n ],\n \"type\": \"object\"\n },\n \"CreatePublicTask\": {\n \"properties\": {\n \"description\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"documents\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicTaskDocument\"\n },\n \"maxItems\": 10,\n \"type\": \"array\"\n },\n \"fields\": {\n \"additionalProperties\": {\n \"anyOf\": [\n {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n {\n \"items\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"maxItems\": 50,\n \"type\": \"array\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"propertyNames\": {\n \"maxLength\": 80,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"type\": \"object\"\n },\n \"taskType\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"feature\",\n \"bug\",\n \"document\",\n \"spike\",\n \"review\",\n \"ralph\"\n ],\n \"type\": \"string\"\n },\n {\n \"pattern\": \"^[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*$\",\n \"type\": \"string\"\n }\n ]\n },\n \"ticket\": {\n \"$ref\": \"#/components/schemas/PublicTaskTicket\"\n },\n \"title\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"title\"\n ],\n \"type\": \"object\"\n },\n \"CreatedPublicApiKey\": {\n \"properties\": {\n \"key\": {\n \"$ref\": \"#/components/schemas/PublicApiKey\"\n },\n \"secret\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"key\",\n \"secret\"\n ],\n \"type\": \"object\"\n },\n \"DocumentFreshness\": {\n \"oneOf\": [\n {\n \"properties\": {\n \"change\": {\n \"enum\": [\n \"unchanged\",\n \"reimported\",\n \"revision_only\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"confirmed\"\n },\n \"version\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\",\n \"version\",\n \"change\"\n ],\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"status\": {\n \"const\": \"not-applicable\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"reason\": {\n \"enum\": [\n \"not_connected\",\n \"credentials_unreadable\",\n \"unversioned\",\n \"source_unreachable\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"unconfirmed\"\n }\n },\n \"required\": [\n \"status\",\n \"reason\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"DomainRule\": {\n \"properties\": {\n \"id\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"rationale\": {\n \"default\": \"\",\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"rule\": {\n \"maxLength\": 4000,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"sourceBlockIds\": {\n \"default\": [],\n \"items\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"id\",\n \"rule\"\n ],\n \"type\": \"object\"\n },\n \"ErrorResponse\": {\n \"properties\": {\n \"error\": {\n \"properties\": {\n \"code\": {\n \"type\": \"string\"\n },\n \"details\": {},\n \"issues\": {\n \"items\": {\n \"properties\": {\n \"message\": {\n \"type\": \"string\"\n },\n \"path\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"message\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"message\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"code\",\n \"message\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"error\"\n ],\n \"type\": \"object\"\n },\n \"Notification\": {\n \"properties\": {\n \"blockId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"body\": {\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"executionId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"payload\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"assessment\": {\n \"properties\": {\n \"complexity\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"impact\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"rationale\": {\n \"type\": \"string\"\n },\n \"risk\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"complexity\",\n \"risk\",\n \"impact\",\n \"rationale\"\n ],\n \"type\": \"object\"\n },\n \"budgetAlerts\": {\n \"items\": {\n \"properties\": {\n \"projectedOverrun\": {\n \"type\": \"boolean\"\n },\n \"threshold\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"tier\": {\n \"enum\": [\n \"workspace\",\n \"account\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"tier\",\n \"threshold\",\n \"projectedOverrun\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"budgetPeriodStart\": {\n \"type\": \"number\"\n },\n \"changeClass\": {\n \"enum\": [\n \"docs\",\n \"test\",\n \"dependency\",\n \"config\",\n \"source\",\n \"schema\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"driftAffected\": {\n \"items\": {\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"reason\": {\n \"enum\": [\n \"key-mismatch\",\n \"corrupt\"\n ],\n \"type\": \"string\"\n },\n \"sealedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"source\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"source\",\n \"id\",\n \"label\",\n \"reason\",\n \"sealedAt\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"findingCount\": {\n \"type\": \"number\"\n },\n \"forkCount\": {\n \"type\": \"number\"\n },\n \"initiativeReason\": {\n \"enum\": [\n \"item_blocked\",\n \"complete\",\n \"checkpoint\"\n ],\n \"type\": \"string\"\n },\n \"mergeTrackRecordId\": {\n \"type\": \"string\"\n },\n \"mergedRepos\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"onCallAssessment\": {\n \"properties\": {\n \"culpritConfidence\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"evidence\": {\n \"default\": [],\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"rationale\": {\n \"type\": \"string\"\n },\n \"recommendation\": {\n \"enum\": [\n \"revert\",\n \"hold\",\n \"monitor\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"culpritConfidence\",\n \"recommendation\",\n \"rationale\"\n ],\n \"type\": \"object\"\n },\n \"pipelineName\": {\n \"type\": \"string\"\n },\n \"platformAlertFailureKinds\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"platformAlertTransition\": {\n \"type\": \"number\"\n },\n \"platformAlerts\": {\n \"items\": {\n \"enum\": [\n \"failure_rate_high\",\n \"duration_p99_high\",\n \"backlog_high\",\n \"throughput_stalled\",\n \"failure_kind_dominant\",\n \"failure_kind_rate_high\",\n \"sweep_degraded\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"platformFailedTotal\": {\n \"type\": \"number\"\n },\n \"platformFailingRuns\": {\n \"items\": {\n \"properties\": {\n \"blockId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"executionId\": {\n \"type\": \"string\"\n },\n \"failureKind\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"executionId\",\n \"blockId\",\n \"failureKind\",\n \"createdAt\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"platformWindow\": {\n \"enum\": [\n \"1h\",\n \"24h\",\n \"7d\"\n ],\n \"type\": \"string\"\n },\n \"prUrl\": {\n \"type\": \"string\"\n },\n \"releaseSignals\": {\n \"items\": {\n \"properties\": {\n \"detail\": {\n \"type\": \"string\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"kind\": {\n \"enum\": [\n \"monitor\",\n \"slo\"\n ],\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"state\": {\n \"enum\": [\n \"ok\",\n \"warn\",\n \"alert\",\n \"no_data\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"id\",\n \"name\",\n \"state\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"revertUrl\": {\n \"type\": \"string\"\n },\n \"sliceCount\": {\n \"type\": \"number\"\n },\n \"targetUserId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"unmergedRepos\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"unreachableAreas\": {\n \"items\": {\n \"enum\": [\n \"ephemeralEnvironments\",\n \"agentExecutor\",\n \"binaryStorage\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"resolvedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"severity\": {\n \"enum\": [\n \"normal\",\n \"urgent\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"open\",\n \"acted\",\n \"dismissed\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"enum\": [\n \"merge_review\",\n \"pipeline_complete\",\n \"ci_failed\",\n \"test_failed\",\n \"requirement_review\",\n \"clarity_review\",\n \"release_regression\",\n \"decision_required\",\n \"human_test_ready\",\n \"visual_confirmation_ready\",\n \"human_review\",\n \"followup_pending\",\n \"fork_decision_pending\",\n \"judge_review\",\n \"pr_review_ready\",\n \"initiative\",\n \"platform_health\",\n \"infra_unreachable\",\n \"budget_paused\",\n \"budget_threshold\",\n \"key_drift\",\n \"merge_tag_request\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"type\",\n \"status\",\n \"blockId\",\n \"executionId\",\n \"title\",\n \"body\",\n \"createdAt\",\n \"resolvedAt\"\n ],\n \"type\": \"object\"\n },\n \"NotificationWebhook\": {\n \"properties\": {\n \"alertEvents\": {\n \"items\": {\n \"enum\": [\n \"platform_health.firing\",\n \"platform_health.resolved\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"enabled\": {\n \"type\": \"boolean\"\n },\n \"hasSecret\": {\n \"type\": \"boolean\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"runEvents\": {\n \"items\": {\n \"enum\": [\n \"run.started\",\n \"run.completed\",\n \"run.failed\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"types\": {\n \"items\": {\n \"enum\": [\n \"merge_review\",\n \"pipeline_complete\",\n \"ci_failed\",\n \"test_failed\",\n \"requirement_review\",\n \"clarity_review\",\n \"release_regression\",\n \"decision_required\",\n \"human_test_ready\",\n \"visual_confirmation_ready\",\n \"human_review\",\n \"followup_pending\",\n \"fork_decision_pending\",\n \"judge_review\",\n \"pr_review_ready\",\n \"initiative\",\n \"platform_health\",\n \"infra_unreachable\",\n \"budget_paused\",\n \"budget_threshold\",\n \"key_drift\",\n \"merge_tag_request\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"updatedAt\": {\n \"type\": \"number\"\n },\n \"url\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"name\",\n \"url\",\n \"types\",\n \"runEvents\",\n \"alertEvents\",\n \"enabled\",\n \"hasSecret\",\n \"updatedAt\"\n ],\n \"type\": \"object\"\n },\n \"PrReportCheck\": {\n \"properties\": {\n \"conclusion\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"repo\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"name\",\n \"conclusion\"\n ],\n \"type\": \"object\"\n },\n \"PrReportCi\": {\n \"properties\": {\n \"failingChecks\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportCheck\"\n },\n \"type\": \"array\"\n },\n \"fixerAttempts\": {\n \"type\": \"number\"\n },\n \"headSha\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"maxFixerAttempts\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"verdict\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"pass\",\n \"pending\",\n \"fail\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"status\",\n \"failingChecks\",\n \"fixerAttempts\"\n ],\n \"type\": \"object\"\n },\n \"PrReportContext\": {\n \"properties\": {\n \"documents\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportContextDocument\"\n },\n \"type\": \"array\"\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\",\n \"documents\"\n ],\n \"type\": \"object\"\n },\n \"PrReportContextDocument\": {\n \"properties\": {\n \"freshness\": {\n \"$ref\": \"#/components/schemas/DocumentFreshness\"\n },\n \"movedDuringRun\": {\n \"type\": \"boolean\"\n },\n \"origin\": {\n \"enum\": [\n \"confluence\",\n \"notion\",\n \"github\",\n \"figma\",\n \"zeplin\",\n \"linear\",\n \"upload\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"title\",\n \"url\",\n \"origin\",\n \"movedDuringRun\"\n ],\n \"type\": \"object\"\n },\n \"PrReportEnvironments\": {\n \"properties\": {\n \"entries\": {\n \"items\": {\n \"properties\": {\n \"error\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"frameId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"ready\",\n \"failed\",\n \"skipped\"\n ],\n \"type\": \"string\"\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"frameId\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"evidence\": {\n \"properties\": {\n \"capturedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outcomes\": {\n \"type\": \"number\"\n },\n \"ranAgainst\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"local\",\n \"ephemeral\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"requirementVerdicts\": {\n \"type\": \"number\"\n },\n \"screenshots\": {\n \"items\": {\n \"properties\": {\n \"artifactId\": {\n \"type\": \"string\"\n },\n \"hasReference\": {\n \"type\": \"boolean\"\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"view\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"view\",\n \"artifactId\",\n \"hasReference\",\n \"url\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"status\": {\n \"enum\": [\n \"captured\",\n \"local\",\n \"undeclared\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"status\",\n \"ranAgainst\",\n \"capturedAt\",\n \"outcomes\",\n \"requirementVerdicts\",\n \"screenshots\",\n \"url\"\n ],\n \"type\": \"object\"\n },\n \"gaps\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"proof\": {\n \"enum\": [\n \"complete\",\n \"incomplete\",\n \"not_applicable\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"teardown\": {\n \"enum\": [\n \"confirmed\",\n \"unconfirmed\",\n \"pending\",\n \"retained\",\n \"failed\",\n \"not_applicable\"\n ],\n \"type\": \"string\"\n },\n \"timeline\": {\n \"properties\": {\n \"gap\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"unwired\",\n \"unreadable\",\n \"truncated\",\n \"not_provisioned\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"provisionFailures\": {\n \"type\": \"number\"\n },\n \"provisionedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"teardownFailures\": {\n \"type\": \"number\"\n },\n \"teardownsUnconfirmed\": {\n \"type\": \"number\"\n },\n \"tornDownAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"gap\",\n \"provisionedAt\",\n \"tornDownAt\",\n \"provisionFailures\",\n \"teardownFailures\",\n \"teardownsUnconfirmed\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"status\",\n \"entries\",\n \"teardown\",\n \"timeline\",\n \"evidence\",\n \"proof\",\n \"gaps\"\n ],\n \"type\": \"object\"\n },\n \"PrReportIssue\": {\n \"properties\": {\n \"externalId\": {\n \"type\": \"string\"\n },\n \"source\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"source\",\n \"externalId\",\n \"title\",\n \"url\"\n ],\n \"type\": \"object\"\n },\n \"PrReportJudge\": {\n \"properties\": {\n \"bounces\": {\n \"type\": \"number\"\n },\n \"disposition\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"pass\",\n \"park\",\n \"bounce\",\n \"fail\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"findings\": {\n \"items\": {\n \"properties\": {\n \"detail\": {\n \"type\": \"string\"\n },\n \"severity\": {\n \"enum\": [\n \"low\",\n \"medium\",\n \"high\",\n \"critical\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"where\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"title\",\n \"severity\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"maxBounces\": {\n \"type\": \"number\"\n },\n \"model\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"modelPin\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"requested\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"applied\",\n \"overridden\",\n \"unavailable\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"requested\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rubricName\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rubricOverridden\": {\n \"type\": \"boolean\"\n },\n \"score\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"stepKind\": {\n \"type\": \"string\"\n },\n \"summary\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"threshold\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"stepKind\",\n \"rubricName\",\n \"rubricOverridden\",\n \"score\",\n \"threshold\",\n \"disposition\",\n \"summary\",\n \"findings\",\n \"bounces\",\n \"maxBounces\",\n \"model\"\n ],\n \"type\": \"object\"\n },\n \"PrReportJudges\": {\n \"properties\": {\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"verdicts\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportJudge\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"status\",\n \"verdicts\"\n ],\n \"type\": \"object\"\n },\n \"PrReportMerge\": {\n \"properties\": {\n \"assessment\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"complexity\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"impact\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"rationale\": {\n \"type\": \"string\"\n },\n \"risk\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"complexity\",\n \"risk\",\n \"impact\",\n \"rationale\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outcome\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"presetName\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"reason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"PrReportObservability\": {\n \"properties\": {\n \"reportUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"trajectoryUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"runUrl\",\n \"trajectoryUrl\",\n \"reportUrl\"\n ],\n \"type\": \"object\"\n },\n \"PrReportReproduction\": {\n \"properties\": {\n \"alternativeVerification\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"at\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"attempts\": {\n \"type\": \"number\"\n },\n \"base\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"durationMs\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"exitCode\": {\n \"type\": \"number\"\n },\n \"outputTail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"passed\": {\n \"type\": \"boolean\"\n },\n \"setupFailed\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"timedOut\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"exitCode\",\n \"passed\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"command\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"final\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"durationMs\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"exitCode\": {\n \"type\": \"number\"\n },\n \"outputTail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"passed\": {\n \"type\": \"boolean\"\n },\n \"setupFailed\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"timedOut\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"exitCode\",\n \"passed\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"maxAttempts\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"observation\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"omittedTestPaths\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"reason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"testPaths\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"verdict\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"reproduced\",\n \"inconclusive\",\n \"declared_infeasible\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"status\",\n \"testPaths\",\n \"attempts\"\n ],\n \"type\": \"object\"\n },\n \"PrReportRequirements\": {\n \"properties\": {\n \"entries\": {\n \"items\": {\n \"properties\": {\n \"criteriaCount\": {\n \"type\": \"number\"\n },\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"group\": {\n \"type\": \"string\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"module\": {\n \"type\": \"string\"\n },\n \"priority\": {\n \"enum\": [\n \"must\",\n \"should\",\n \"could\"\n ],\n \"type\": \"string\"\n },\n \"state\": {\n \"enum\": [\n \"aspirational\",\n \"established\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"verdict\": {\n \"enum\": [\n \"met\",\n \"not_met\",\n \"not_covered\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"title\",\n \"module\",\n \"group\",\n \"priority\",\n \"state\",\n \"verdict\",\n \"detail\",\n \"criteriaCount\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"met\": {\n \"type\": \"number\"\n },\n \"notCovered\": {\n \"type\": \"number\"\n },\n \"notMet\": {\n \"type\": \"number\"\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"regressions\": {\n \"type\": \"number\"\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"total\": {\n \"type\": \"number\"\n },\n \"unmatchedVerdicts\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"status\",\n \"entries\",\n \"met\",\n \"notMet\",\n \"notCovered\",\n \"regressions\",\n \"total\"\n ],\n \"type\": \"object\"\n },\n \"PrReportRun\": {\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"blockTitle\": {\n \"type\": \"string\"\n },\n \"executionId\": {\n \"type\": \"string\"\n },\n \"issues\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportIssue\"\n },\n \"type\": \"array\"\n },\n \"pipelineId\": {\n \"type\": \"string\"\n },\n \"pipelineName\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"github\",\n \"gitlab\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"repo\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"startedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"steps\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportStep\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"executionId\",\n \"blockId\",\n \"blockTitle\",\n \"pipelineId\",\n \"pipelineName\",\n \"steps\",\n \"issues\"\n ],\n \"type\": \"object\"\n },\n \"PrReportStep\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"index\": {\n \"type\": \"number\"\n },\n \"model\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"state\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"index\",\n \"agentKind\",\n \"state\"\n ],\n \"type\": \"object\"\n },\n \"PrReportTestConcern\": {\n \"properties\": {\n \"severity\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"title\",\n \"severity\"\n ],\n \"type\": \"object\"\n },\n \"PrReportTestOutcome\": {\n \"properties\": {\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"PrReportTests\": {\n \"properties\": {\n \"concerns\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportTestConcern\"\n },\n \"type\": \"array\"\n },\n \"environment\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"fixerAttempts\": {\n \"type\": \"number\"\n },\n \"greenlight\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"maxFixerAttempts\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outcomes\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportTestOutcome\"\n },\n \"type\": \"array\"\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"summary\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"tested\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"status\",\n \"tested\",\n \"outcomes\",\n \"concerns\",\n \"fixerAttempts\"\n ],\n \"type\": \"object\"\n },\n \"PrReportValidation\": {\n \"properties\": {\n \"at\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"attempts\": {\n \"type\": \"number\"\n },\n \"commands\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PrReportValidationCommand\"\n },\n \"type\": \"array\"\n },\n \"configUnreadable\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"maxAttempts\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"passed\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"reported\",\n \"absent\"\n ],\n \"type\": \"string\"\n },\n \"stepKind\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"status\",\n \"attempts\",\n \"commands\"\n ],\n \"type\": \"object\"\n },\n \"PrReportValidationCommand\": {\n \"properties\": {\n \"command\": {\n \"type\": \"string\"\n },\n \"durationMs\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"exitCode\": {\n \"type\": \"number\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"outputTail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"passed\": {\n \"type\": \"boolean\"\n },\n \"timedOut\": {\n \"anyOf\": [\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"label\",\n \"command\",\n \"exitCode\",\n \"passed\"\n ],\n \"type\": \"object\"\n },\n \"PrVerificationReport\": {\n \"properties\": {\n \"ci\": {\n \"$ref\": \"#/components/schemas/PrReportCi\"\n },\n \"context\": {\n \"$ref\": \"#/components/schemas/PrReportContext\"\n },\n \"environments\": {\n \"$ref\": \"#/components/schemas/PrReportEnvironments\"\n },\n \"generatedAt\": {\n \"type\": \"number\"\n },\n \"judges\": {\n \"$ref\": \"#/components/schemas/PrReportJudges\"\n },\n \"merge\": {\n \"$ref\": \"#/components/schemas/PrReportMerge\"\n },\n \"observability\": {\n \"$ref\": \"#/components/schemas/PrReportObservability\"\n },\n \"reproduction\": {\n \"$ref\": \"#/components/schemas/PrReportReproduction\"\n },\n \"requirements\": {\n \"$ref\": \"#/components/schemas/PrReportRequirements\"\n },\n \"run\": {\n \"$ref\": \"#/components/schemas/PrReportRun\"\n },\n \"scope\": {\n \"properties\": {\n \"frameId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"ownPullRequest\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"number\": {\n \"type\": \"number\"\n },\n \"repo\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"repo\",\n \"number\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"role\": {\n \"enum\": [\n \"own\",\n \"peer\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"role\"\n ],\n \"type\": \"object\"\n },\n \"tests\": {\n \"$ref\": \"#/components/schemas/PrReportTests\"\n },\n \"truncations\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"validation\": {\n \"$ref\": \"#/components/schemas/PrReportValidation\"\n },\n \"version\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"version\",\n \"generatedAt\",\n \"run\",\n \"context\",\n \"ci\",\n \"validation\",\n \"reproduction\",\n \"tests\",\n \"requirements\",\n \"environments\",\n \"merge\",\n \"judges\",\n \"observability\",\n \"truncations\"\n ],\n \"type\": \"object\"\n },\n \"PublicAgentDecision\": {\n \"properties\": {\n \"decisionId\": {\n \"type\": \"string\"\n },\n \"kind\": {\n \"const\": \"agent-decision\"\n },\n \"options\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"question\": {\n \"type\": \"string\"\n },\n \"stepKind\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"decisionId\",\n \"stepKind\",\n \"question\",\n \"options\"\n ],\n \"type\": \"object\"\n },\n \"PublicAnswerFollowUp\": {\n \"properties\": {\n \"answer\": {\n \"maxLength\": 4000,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"answer\"\n ],\n \"type\": \"object\"\n },\n \"PublicAnswerInterview\": {\n \"properties\": {\n \"answer\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"questionId\": {\n \"maxLength\": 80,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"questionId\",\n \"answer\"\n ],\n \"type\": \"object\"\n },\n \"PublicApiKey\": {\n \"properties\": {\n \"accountId\": {\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"createdByKeyId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"createdByUserId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"externalIdentity\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"lastUsedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"revokedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"scope\": {\n \"enum\": [\n \"read\",\n \"write\",\n \"decide\",\n \"admin\"\n ],\n \"type\": \"string\"\n },\n \"workspaceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"accountId\",\n \"workspaceId\",\n \"label\",\n \"scope\",\n \"createdByUserId\",\n \"createdByKeyId\",\n \"externalIdentity\",\n \"createdAt\",\n \"lastUsedAt\",\n \"revokedAt\"\n ],\n \"type\": \"object\"\n },\n \"PublicApiKeyList\": {\n \"properties\": {\n \"keys\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicApiKey\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"keys\"\n ],\n \"type\": \"object\"\n },\n \"PublicApprovalGateDecision\": {\n \"properties\": {\n \"approvalId\": {\n \"type\": \"string\"\n },\n \"exceeded\": {\n \"type\": \"boolean\"\n },\n \"feedback\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"kind\": {\n \"const\": \"approval-gate\"\n },\n \"proposal\": {\n \"type\": \"string\"\n },\n \"recordedApprovals\": {\n \"type\": \"number\"\n },\n \"requiredApprovals\": {\n \"type\": \"number\"\n },\n \"status\": {\n \"enum\": [\n \"pending\",\n \"approved\",\n \"changes_requested\",\n \"rejected\"\n ],\n \"type\": \"string\"\n },\n \"stepIndex\": {\n \"type\": \"number\"\n },\n \"stepKind\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"approvalId\",\n \"stepKind\",\n \"stepIndex\",\n \"status\",\n \"proposal\",\n \"feedback\",\n \"requiredApprovals\",\n \"recordedApprovals\",\n \"exceeded\"\n ],\n \"type\": \"object\"\n },\n \"PublicApproveStep\": {\n \"properties\": {\n \"proposal\": {\n \"maxLength\": 50000,\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"PublicBrainstormDecision\": {\n \"properties\": {\n \"convergedDirection\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"iteration\": {\n \"type\": \"number\"\n },\n \"kind\": {\n \"const\": \"brainstorm\"\n },\n \"maxIterations\": {\n \"type\": \"number\"\n },\n \"options\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicReviewFinding\"\n },\n \"type\": \"array\"\n },\n \"sessionId\": {\n \"type\": \"string\"\n },\n \"stage\": {\n \"enum\": [\n \"requirements\",\n \"architecture\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"ready\",\n \"incorporating\",\n \"reviewing\",\n \"merged\",\n \"exceeded\",\n \"incorporated\"\n ],\n \"type\": \"string\"\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"sessionId\",\n \"stage\",\n \"taskId\",\n \"status\",\n \"iteration\",\n \"maxIterations\",\n \"options\",\n \"convergedDirection\"\n ],\n \"type\": \"object\"\n },\n \"PublicChallengePrReviewFinding\": {\n \"properties\": {\n \"question\": {\n \"maxLength\": 4000,\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"PublicChooseFork\": {\n \"properties\": {\n \"custom\": {\n \"anyOf\": [\n {\n \"maxLength\": 8000,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"forkId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"note\": {\n \"anyOf\": [\n {\n \"maxLength\": 4000,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"PublicClarityDecision\": {\n \"properties\": {\n \"clarifiedReport\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"findings\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicReviewFinding\"\n },\n \"type\": \"array\"\n },\n \"iteration\": {\n \"type\": \"number\"\n },\n \"kind\": {\n \"const\": \"clarity-review\"\n },\n \"maxIterations\": {\n \"type\": \"number\"\n },\n \"reviewId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"ready\",\n \"incorporating\",\n \"reviewing\",\n \"merged\",\n \"exceeded\",\n \"incorporated\"\n ],\n \"type\": \"string\"\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"reviewId\",\n \"taskId\",\n \"status\",\n \"iteration\",\n \"maxIterations\",\n \"findings\",\n \"clarifiedReport\"\n ],\n \"type\": \"object\"\n },\n \"PublicDecision\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/PublicRequirementsDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicForkDecision\"\n },\n {\n \"properties\": {\n \"bounces\": {\n \"type\": \"number\"\n },\n \"kind\": {\n \"const\": \"judge\"\n },\n \"maxBounces\": {\n \"type\": \"number\"\n },\n \"rubricId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rubricName\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"evaluating\",\n \"awaiting_decision\",\n \"bouncing\",\n \"passed\",\n \"failed\",\n \"skipped\"\n ],\n \"type\": \"string\"\n },\n \"stepKind\": {\n \"type\": \"string\"\n },\n \"threshold\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"verdict\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"findings\": {\n \"default\": [],\n \"items\": {\n \"properties\": {\n \"detail\": {\n \"type\": \"string\"\n },\n \"severity\": {\n \"enum\": [\n \"low\",\n \"medium\",\n \"high\",\n \"critical\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"where\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"title\",\n \"severity\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"score\": {\n \"maximum\": 1,\n \"minimum\": 0,\n \"type\": \"number\"\n },\n \"summary\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"score\",\n \"summary\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"stepKind\",\n \"status\",\n \"rubricId\",\n \"rubricName\",\n \"threshold\",\n \"verdict\",\n \"bounces\",\n \"maxBounces\"\n ],\n \"type\": \"object\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicInputGateDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicApprovalGateDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicAgentDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicClarityDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicBrainstormDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicPrReviewDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicHumanTestDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicVisualConfirmDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicFollowUpsDecision\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicInterviewDecision\"\n }\n ]\n },\n \"PublicDecisionList\": {\n \"properties\": {\n \"decisions\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicDecision\"\n },\n \"type\": \"array\"\n },\n \"parked\": {\n \"type\": \"boolean\"\n },\n \"runId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"running\",\n \"blocked\",\n \"paused\",\n \"done\",\n \"failed\"\n ],\n \"type\": \"string\"\n },\n \"taskId\": {\n \"type\": \"string\"\n },\n \"unanswerable\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicUnanswerableWait\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"runId\",\n \"taskId\",\n \"status\",\n \"parked\",\n \"decisions\",\n \"unanswerable\"\n ],\n \"type\": \"object\"\n },\n \"PublicFollowUpItem\": {\n \"properties\": {\n \"answer\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"detail\": {\n \"type\": \"string\"\n },\n \"itemId\": {\n \"type\": \"string\"\n },\n \"kind\": {\n \"enum\": [\n \"follow_up\",\n \"question\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"pending\",\n \"filed\",\n \"queued\",\n \"answered\",\n \"dismissed\"\n ],\n \"type\": \"string\"\n },\n \"suggestedAction\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"ticketExternalId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"ticketUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"itemId\",\n \"kind\",\n \"title\",\n \"detail\",\n \"suggestedAction\",\n \"status\",\n \"answer\",\n \"ticketExternalId\",\n \"ticketUrl\"\n ],\n \"type\": \"object\"\n },\n \"PublicFollowUpsDecision\": {\n \"properties\": {\n \"items\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicFollowUpItem\"\n },\n \"type\": \"array\"\n },\n \"kind\": {\n \"const\": \"follow-ups\"\n },\n \"loops\": {\n \"type\": \"number\"\n },\n \"maxLoops\": {\n \"type\": \"number\"\n },\n \"stepIndex\": {\n \"type\": \"number\"\n },\n \"stepKind\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"stepKind\",\n \"stepIndex\",\n \"items\",\n \"loops\",\n \"maxLoops\"\n ],\n \"type\": \"object\"\n },\n \"PublicForkDecision\": {\n \"properties\": {\n \"forks\": {\n \"items\": {\n \"properties\": {\n \"approach\": {\n \"type\": \"string\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"recommended\": {\n \"type\": \"boolean\"\n },\n \"riskNotes\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"summary\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"tradeoffs\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"id\",\n \"title\",\n \"summary\",\n \"approach\",\n \"tradeoffs\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"kind\": {\n \"const\": \"fork\"\n },\n \"seamSummary\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"proposing\",\n \"awaiting_choice\",\n \"answering\",\n \"chosen\",\n \"single_path\",\n \"skipped\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"status\",\n \"seamSummary\",\n \"forks\"\n ],\n \"type\": \"object\"\n },\n \"PublicHumanTestDecision\": {\n \"properties\": {\n \"attempts\": {\n \"type\": \"number\"\n },\n \"degradedReason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"environment\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/PublicHumanTestEnvironment\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"kind\": {\n \"const\": \"human-test\"\n },\n \"maxAttempts\": {\n \"type\": \"number\"\n },\n \"phase\": {\n \"enum\": [\n \"provisioning\",\n \"awaiting_human\",\n \"fixing\",\n \"resolving_conflicts\",\n \"passed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"phase\",\n \"environment\",\n \"degradedReason\",\n \"attempts\",\n \"maxAttempts\"\n ],\n \"type\": \"object\"\n },\n \"PublicHumanTestEnvironment\": {\n \"properties\": {\n \"expiresAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"provisioning\",\n \"ready\",\n \"failed\",\n \"expired\",\n \"tearing_down\",\n \"torn_down\"\n ],\n \"type\": \"string\"\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"url\",\n \"status\",\n \"expiresAt\"\n ],\n \"type\": \"object\"\n },\n \"PublicIdentity\": {\n \"properties\": {\n \"accountId\": {\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"externalIdentity\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"keyId\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"scope\": {\n \"enum\": [\n \"read\",\n \"write\",\n \"decide\",\n \"admin\"\n ],\n \"type\": \"string\"\n },\n \"workspaceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"keyId\",\n \"accountId\",\n \"workspaceId\",\n \"scope\",\n \"label\",\n \"externalIdentity\",\n \"createdAt\"\n ],\n \"type\": \"object\"\n },\n \"PublicIncorporate\": {\n \"properties\": {\n \"feedback\": {\n \"maxLength\": 4000,\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"PublicInputGateDecision\": {\n \"properties\": {\n \"checkedAt\": {\n \"type\": \"number\"\n },\n \"issues\": {\n \"items\": {\n \"properties\": {\n \"code\": {\n \"enum\": [\n \"description_missing\",\n \"description_placeholder\",\n \"description_thin\",\n \"reproduction_missing\",\n \"review_target_missing\",\n \"success_criteria_missing\",\n \"required_field_missing\"\n ],\n \"type\": \"string\"\n },\n \"field\": {\n \"properties\": {\n \"key\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"label\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"key\",\n \"label\"\n ],\n \"type\": \"object\"\n },\n \"severity\": {\n \"enum\": [\n \"blocking\",\n \"advisory\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"code\",\n \"severity\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"kind\": {\n \"const\": \"input-gate\"\n },\n \"mode\": {\n \"enum\": [\n \"standard\",\n \"advisory\",\n \"off\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"off\",\n \"not_applicable\",\n \"passed\",\n \"blocked\",\n \"overridden\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"status\",\n \"mode\",\n \"issues\",\n \"checkedAt\"\n ],\n \"type\": \"object\"\n },\n \"PublicInterviewDecision\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"interview\"\n },\n \"maxRounds\": {\n \"type\": \"number\"\n },\n \"questions\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicInterviewQuestion\"\n },\n \"type\": \"array\"\n },\n \"round\": {\n \"type\": \"number\"\n },\n \"stepKind\": {\n \"type\": \"string\"\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"stepKind\",\n \"taskId\",\n \"round\",\n \"maxRounds\",\n \"questions\"\n ],\n \"type\": \"object\"\n },\n \"PublicInterviewQuestion\": {\n \"properties\": {\n \"answer\": {\n \"type\": \"string\"\n },\n \"question\": {\n \"type\": \"string\"\n },\n \"questionId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"open\",\n \"answered\",\n \"dismissed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"questionId\",\n \"question\",\n \"answer\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"PublicJob\": {\n \"properties\": {\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"error\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"code\": {\n \"type\": \"string\"\n },\n \"message\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"code\",\n \"message\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"externalIdentity\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"externalIdentityWithheld\": {\n \"type\": \"boolean\"\n },\n \"jobId\": {\n \"type\": \"string\"\n },\n \"pipelineId\": {\n \"type\": \"string\"\n },\n \"result\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"data\": {\n \"anyOf\": [\n {},\n {\n \"type\": \"null\"\n }\n ]\n },\n \"output\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"output\",\n \"data\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"running\",\n \"succeeded\",\n \"failed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"jobId\",\n \"status\",\n \"pipelineId\",\n \"createdAt\",\n \"externalIdentity\",\n \"externalIdentityWithheld\",\n \"result\",\n \"error\"\n ],\n \"type\": \"object\"\n },\n \"PublicJobAccepted\": {\n \"properties\": {\n \"jobId\": {\n \"type\": \"string\"\n },\n \"links\": {\n \"properties\": {\n \"events\": {\n \"type\": \"string\"\n },\n \"self\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"self\",\n \"events\"\n ],\n \"type\": \"object\"\n },\n \"status\": {\n \"enum\": [\n \"running\",\n \"succeeded\",\n \"failed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"jobId\",\n \"status\",\n \"links\"\n ],\n \"type\": \"object\"\n },\n \"PublicNotificationList\": {\n \"properties\": {\n \"notifications\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/Notification\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"notifications\"\n ],\n \"type\": \"object\"\n },\n \"PublicNotificationWebhook\": {\n \"properties\": {\n \"webhook\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/NotificationWebhook\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"webhook\"\n ],\n \"type\": \"object\"\n },\n \"PublicNotificationWebhookList\": {\n \"properties\": {\n \"webhooks\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/NotificationWebhook\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"webhooks\"\n ],\n \"type\": \"object\"\n },\n \"PublicPipeline\": {\n \"properties\": {\n \"headlessStartable\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"pipelineId\": {\n \"type\": \"string\"\n },\n \"public\": {\n \"type\": \"boolean\"\n },\n \"steps\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"pipelineId\",\n \"name\",\n \"steps\",\n \"public\",\n \"headlessStartable\"\n ],\n \"type\": \"object\"\n },\n \"PublicPipelineList\": {\n \"properties\": {\n \"pipelines\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicPipeline\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"pipelines\"\n ],\n \"type\": \"object\"\n },\n \"PublicPrReviewDecision\": {\n \"properties\": {\n \"findings\": {\n \"items\": {\n \"properties\": {\n \"category\": {\n \"enum\": [\n \"correctness\",\n \"security\",\n \"performance\",\n \"maintainability\",\n \"style\",\n \"test\",\n \"other\"\n ],\n \"type\": \"string\"\n },\n \"challenge\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"justification\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"question\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"status\": {\n \"enum\": [\n \"investigating\",\n \"upheld\",\n \"amended\",\n \"retracted\",\n \"failed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\",\n \"question\",\n \"justification\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"detail\": {\n \"type\": \"string\"\n },\n \"findingId\": {\n \"type\": \"string\"\n },\n \"line\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"path\": {\n \"type\": \"string\"\n },\n \"severity\": {\n \"enum\": [\n \"blocker\",\n \"high\",\n \"medium\",\n \"low\",\n \"nit\"\n ],\n \"type\": \"string\"\n },\n \"side\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"LEFT\",\n \"RIGHT\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"sliceId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"suggestedFix\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"findingId\",\n \"sliceId\",\n \"path\",\n \"line\",\n \"side\",\n \"severity\",\n \"category\",\n \"title\",\n \"detail\",\n \"suggestedFix\",\n \"challenge\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"kind\": {\n \"const\": \"pr-review\"\n },\n \"prUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"selectedFindingIds\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"slices\": {\n \"items\": {\n \"properties\": {\n \"paths\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"rationale\": {\n \"type\": \"string\"\n },\n \"sliceId\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"sliceId\",\n \"title\",\n \"rationale\",\n \"paths\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"status\": {\n \"enum\": [\n \"reviewing\",\n \"awaiting_selection\",\n \"challenging\",\n \"fixing\",\n \"posting\",\n \"done\",\n \"skipped\"\n ],\n \"type\": \"string\"\n },\n \"summary\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"kind\",\n \"status\",\n \"summary\",\n \"prUrl\",\n \"slices\",\n \"findings\",\n \"selectedFindingIds\"\n ],\n \"type\": \"object\"\n },\n \"PublicRejectStep\": {\n \"properties\": {\n \"reason\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"PublicReplyFinding\": {\n \"properties\": {\n \"reply\": {\n \"maxLength\": 4000,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"reply\"\n ],\n \"type\": \"object\"\n },\n \"PublicRequestGateFix\": {\n \"properties\": {\n \"findings\": {\n \"maxLength\": 10000,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"findings\"\n ],\n \"type\": \"object\"\n },\n \"PublicRequestStepChanges\": {\n \"properties\": {\n \"feedback\": {\n \"maxLength\": 10000,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"feedback\"\n ],\n \"type\": \"object\"\n },\n \"PublicRequirementsDecision\": {\n \"properties\": {\n \"findings\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicReviewFinding\"\n },\n \"type\": \"array\"\n },\n \"incorporatedRequirements\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"iteration\": {\n \"type\": \"number\"\n },\n \"kind\": {\n \"const\": \"requirements-review\"\n },\n \"maxIterations\": {\n \"type\": \"number\"\n },\n \"reviewId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"ready\",\n \"incorporating\",\n \"reviewing\",\n \"merged\",\n \"exceeded\",\n \"incorporated\"\n ],\n \"type\": \"string\"\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"reviewId\",\n \"taskId\",\n \"status\",\n \"iteration\",\n \"maxIterations\",\n \"findings\",\n \"incorporatedRequirements\"\n ],\n \"type\": \"object\"\n },\n \"PublicResolveAgentDecision\": {\n \"properties\": {\n \"choice\": {\n \"maxLength\": 4000,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"choice\"\n ],\n \"type\": \"object\"\n },\n \"PublicResolveExceeded\": {\n \"properties\": {\n \"choice\": {\n \"enum\": [\n \"extra-round\",\n \"proceed\",\n \"stop-reset\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"choice\"\n ],\n \"type\": \"object\"\n },\n \"PublicResolveInputGate\": {\n \"properties\": {\n \"choice\": {\n \"enum\": [\n \"recheck\",\n \"proceed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"choice\"\n ],\n \"type\": \"object\"\n },\n \"PublicResolvePrReview\": {\n \"properties\": {\n \"action\": {\n \"enum\": [\n \"finish\",\n \"fix\",\n \"post\"\n ],\n \"type\": \"string\"\n },\n \"findingIds\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"PublicReviewFinding\": {\n \"properties\": {\n \"category\": {\n \"enum\": [\n \"gap\",\n \"clarification\",\n \"assumption\",\n \"risk\",\n \"question\"\n ],\n \"type\": \"string\"\n },\n \"detail\": {\n \"type\": \"string\"\n },\n \"itemId\": {\n \"type\": \"string\"\n },\n \"reply\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"severity\": {\n \"enum\": [\n \"low\",\n \"medium\",\n \"high\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"open\",\n \"answered\",\n \"resolved\",\n \"dismissed\",\n \"recommend_requested\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"itemId\",\n \"category\",\n \"severity\",\n \"title\",\n \"detail\",\n \"status\",\n \"reply\"\n ],\n \"type\": \"object\"\n },\n \"PublicRun\": {\n \"properties\": {\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"currentStep\": {\n \"type\": \"number\"\n },\n \"error\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"code\": {\n \"type\": \"string\"\n },\n \"message\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"code\",\n \"message\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"externalIdentity\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"externalIdentityWithheld\": {\n \"type\": \"boolean\"\n },\n \"pullRequest\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"branch\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"url\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"url\",\n \"branch\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"running\",\n \"blocked\",\n \"paused\",\n \"done\",\n \"failed\"\n ],\n \"type\": \"string\"\n },\n \"steps\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"data\": {\n \"anyOf\": [\n {},\n {\n \"type\": \"null\"\n }\n ]\n },\n \"output\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"progress\": {\n \"type\": \"number\"\n },\n \"state\": {\n \"enum\": [\n \"pending\",\n \"working\",\n \"waiting_decision\",\n \"done\"\n ],\n \"type\": \"string\"\n },\n \"subtasks\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"completed\": {\n \"type\": \"number\"\n },\n \"inProgress\": {\n \"type\": \"number\"\n },\n \"total\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"completed\",\n \"inProgress\",\n \"total\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"agentKind\",\n \"state\",\n \"progress\",\n \"subtasks\",\n \"output\",\n \"data\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"runId\",\n \"taskId\",\n \"status\",\n \"createdAt\",\n \"currentStep\",\n \"steps\",\n \"externalIdentity\",\n \"externalIdentityWithheld\",\n \"pullRequest\",\n \"error\"\n ],\n \"type\": \"object\"\n },\n \"PublicRunArtifact\": {\n \"properties\": {\n \"artifactId\": {\n \"type\": \"string\"\n },\n \"byteSize\": {\n \"type\": \"number\"\n },\n \"contentType\": {\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"hash\": {\n \"type\": \"string\"\n },\n \"kind\": {\n \"enum\": [\n \"screenshot\",\n \"reference\"\n ],\n \"type\": \"string\"\n },\n \"scope\": {\n \"enum\": [\n \"run\",\n \"task\"\n ],\n \"type\": \"string\"\n },\n \"view\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"artifactId\",\n \"kind\",\n \"scope\",\n \"view\",\n \"contentType\",\n \"byteSize\",\n \"hash\",\n \"createdAt\"\n ],\n \"type\": \"object\"\n },\n \"PublicRunArtifactList\": {\n \"properties\": {\n \"artifacts\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicRunArtifact\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"artifacts\"\n ],\n \"type\": \"object\"\n },\n \"PublicService\": {\n \"properties\": {\n \"description\": {\n \"type\": \"string\"\n },\n \"serviceId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"planned\",\n \"ready\",\n \"in_progress\",\n \"blocked\",\n \"pr_ready\",\n \"done\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"enum\": [\n \"frontend\",\n \"service\",\n \"library\",\n \"document\",\n \"api\",\n \"database\",\n \"queue\",\n \"integration\",\n \"external\",\n \"environment\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"serviceId\",\n \"title\",\n \"description\",\n \"type\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"PublicServiceList\": {\n \"properties\": {\n \"services\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicService\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"services\"\n ],\n \"type\": \"object\"\n },\n \"PublicServiceSpec\": {\n \"properties\": {\n \"anchor\": {\n \"enum\": [\n \"present\",\n \"absent\",\n \"unparsed\"\n ],\n \"type\": \"string\"\n },\n \"features\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicSpecFeatureFile\"\n },\n \"type\": \"array\"\n },\n \"issues\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/SpecReadIssue\"\n },\n \"type\": \"array\"\n },\n \"provenance\": {\n \"$ref\": \"#/components/schemas/PublicSpecProvenance\"\n },\n \"serviceId\": {\n \"type\": \"string\"\n },\n \"spec\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/SpecDoc\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"truncations\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicSpecTruncation\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"serviceId\",\n \"anchor\",\n \"spec\",\n \"features\",\n \"provenance\",\n \"issues\",\n \"truncations\"\n ],\n \"type\": \"object\"\n },\n \"PublicSetFindingStatus\": {\n \"properties\": {\n \"status\": {\n \"enum\": [\n \"dismissed\",\n \"open\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"PublicSpecFeatureFile\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"content\": {\n \"type\": \"string\"\n },\n \"group\": {\n \"type\": \"string\"\n },\n \"module\": {\n \"type\": \"string\"\n },\n \"path\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"module\",\n \"group\",\n \"path\",\n \"content\",\n \"chars\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"PublicSpecProvenance\": {\n \"properties\": {\n \"commit\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"owner\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"enum\": [\n \"github\",\n \"gitlab\"\n ],\n \"type\": \"string\"\n },\n \"ref\": {\n \"type\": \"string\"\n },\n \"repo\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"provider\",\n \"owner\",\n \"repo\",\n \"ref\",\n \"commit\"\n ],\n \"type\": \"object\"\n },\n \"PublicSpecTruncation\": {\n \"properties\": {\n \"section\": {\n \"enum\": [\n \"requirements\",\n \"rules\",\n \"acceptance\",\n \"features\",\n \"issues\"\n ],\n \"type\": \"string\"\n },\n \"shown\": {\n \"type\": \"number\"\n },\n \"total\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"section\",\n \"shown\",\n \"total\"\n ],\n \"type\": \"object\"\n },\n \"PublicSpend\": {\n \"properties\": {\n \"currency\": {\n \"type\": \"string\"\n },\n \"dimension\": {\n \"enum\": [\n \"model\",\n \"agentKind\",\n \"service\",\n \"repo\",\n \"taskType\",\n \"ticket\",\n \"run\"\n ],\n \"type\": \"string\"\n },\n \"generatedAt\": {\n \"type\": \"number\"\n },\n \"rolledUpThrough\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"rows\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicSpendRow\"\n },\n \"type\": \"array\"\n },\n \"since\": {\n \"type\": \"number\"\n },\n \"source\": {\n \"enum\": [\n \"ledger\",\n \"daily-rollup\"\n ],\n \"type\": \"string\"\n },\n \"totals\": {\n \"$ref\": \"#/components/schemas/PublicSpendTotals\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n },\n \"window\": {\n \"enum\": [\n \"24h\",\n \"7d\",\n \"30d\",\n \"90d\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"dimension\",\n \"window\",\n \"generatedAt\",\n \"since\",\n \"currency\",\n \"source\",\n \"rolledUpThrough\",\n \"totals\",\n \"truncated\",\n \"rows\"\n ],\n \"type\": \"object\"\n },\n \"PublicSpendRow\": {\n \"properties\": {\n \"calls\": {\n \"type\": \"number\"\n },\n \"inputTokens\": {\n \"type\": \"number\"\n },\n \"key\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"meteredCost\": {\n \"type\": \"number\"\n },\n \"outputTokens\": {\n \"type\": \"number\"\n },\n \"subscriptionCost\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"key\",\n \"label\",\n \"inputTokens\",\n \"outputTokens\",\n \"calls\",\n \"meteredCost\",\n \"subscriptionCost\"\n ],\n \"type\": \"object\"\n },\n \"PublicSpendTotals\": {\n \"properties\": {\n \"calls\": {\n \"type\": \"number\"\n },\n \"inputTokens\": {\n \"type\": \"number\"\n },\n \"meteredCost\": {\n \"type\": \"number\"\n },\n \"outputTokens\": {\n \"type\": \"number\"\n },\n \"subscriptionCost\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"inputTokens\",\n \"outputTokens\",\n \"calls\",\n \"meteredCost\",\n \"subscriptionCost\"\n ],\n \"type\": \"object\"\n },\n \"PublicTask\": {\n \"properties\": {\n \"autoStartDependents\": {\n \"type\": \"boolean\"\n },\n \"dependsOn\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"progress\": {\n \"type\": \"number\"\n },\n \"pullRequestUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"serviceId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"planned\",\n \"ready\",\n \"in_progress\",\n \"blocked\",\n \"pr_ready\",\n \"done\"\n ],\n \"type\": \"string\"\n },\n \"taskId\": {\n \"type\": \"string\"\n },\n \"taskType\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"feature\",\n \"bug\",\n \"document\",\n \"spike\",\n \"review\",\n \"ralph\",\n \"recurring\"\n ],\n \"type\": \"string\"\n },\n {\n \"pattern\": \"^[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*$\",\n \"type\": \"string\"\n }\n ]\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"taskId\",\n \"serviceId\",\n \"title\",\n \"description\",\n \"taskType\",\n \"status\",\n \"progress\",\n \"runId\",\n \"pullRequestUrl\",\n \"dependsOn\",\n \"autoStartDependents\"\n ],\n \"type\": \"object\"\n },\n \"PublicTaskDocument\": {\n \"oneOf\": [\n {\n \"$ref\": \"#/components/schemas/PublicTaskSourceDocument\"\n },\n {\n \"$ref\": \"#/components/schemas/PublicTaskUploadedDocument\"\n }\n ]\n },\n \"PublicTaskList\": {\n \"properties\": {\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"tasks\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"tasks\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n },\n \"PublicTaskSourceDocument\": {\n \"properties\": {\n \"kind\": {\n \"const\": \"source\"\n },\n \"ref\": {\n \"maxLength\": 500,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"source\": {\n \"enum\": [\n \"confluence\",\n \"notion\",\n \"github\",\n \"figma\",\n \"zeplin\",\n \"linear\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"source\",\n \"ref\"\n ],\n \"type\": \"object\"\n },\n \"PublicTaskTicket\": {\n \"properties\": {\n \"ref\": {\n \"maxLength\": 500,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"source\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"jira\",\n \"github\",\n \"linear\",\n \"gitlab\"\n ],\n \"type\": \"string\"\n },\n {\n \"pattern\": \"^[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*$\",\n \"type\": \"string\"\n }\n ]\n }\n },\n \"required\": [\n \"source\",\n \"ref\"\n ],\n \"type\": \"object\"\n },\n \"PublicTaskUploadedDocument\": {\n \"properties\": {\n \"content\": {\n \"maxLength\": 100000,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"kind\": {\n \"const\": \"upload\"\n },\n \"title\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"title\",\n \"content\"\n ],\n \"type\": \"object\"\n },\n \"PublicUnanswerableWait\": {\n \"properties\": {\n \"detail\": {\n \"type\": \"string\"\n },\n \"reason\": {\n \"enum\": [\n \"human_wait_gate\",\n \"unclassified_gate\",\n \"unwired_interview_gate\"\n ],\n \"type\": \"string\"\n },\n \"stepIndex\": {\n \"type\": \"number\"\n },\n \"stepKind\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"reason\",\n \"stepKind\",\n \"stepIndex\",\n \"detail\"\n ],\n \"type\": \"object\"\n },\n \"PublicUsage\": {\n \"properties\": {\n \"budget\": {\n \"$ref\": \"#/components/schemas/PublicUsageBudget\"\n },\n \"currency\": {\n \"type\": \"string\"\n },\n \"periodStart\": {\n \"type\": \"number\"\n },\n \"rows\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicUsageRow\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"periodStart\",\n \"currency\",\n \"budget\",\n \"rows\"\n ],\n \"type\": \"object\"\n },\n \"PublicUsageBudget\": {\n \"properties\": {\n \"costLimit\": {\n \"type\": \"number\"\n },\n \"costSpent\": {\n \"type\": \"number\"\n },\n \"exceeded\": {\n \"type\": \"boolean\"\n },\n \"inputTokens\": {\n \"type\": \"number\"\n },\n \"outputTokens\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"inputTokens\",\n \"outputTokens\",\n \"costSpent\",\n \"costLimit\",\n \"exceeded\"\n ],\n \"type\": \"object\"\n },\n \"PublicUsageRow\": {\n \"properties\": {\n \"billing\": {\n \"enum\": [\n \"metered\",\n \"subscription\"\n ],\n \"type\": \"string\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"costEstimate\": {\n \"type\": \"number\"\n },\n \"inputTokens\": {\n \"type\": \"number\"\n },\n \"model\": {\n \"type\": \"string\"\n },\n \"outputTokens\": {\n \"type\": \"number\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"vendor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"billing\",\n \"vendor\",\n \"provider\",\n \"model\",\n \"inputTokens\",\n \"outputTokens\",\n \"costEstimate\",\n \"calls\"\n ],\n \"type\": \"object\"\n },\n \"PublicVisualConfirmDecision\": {\n \"properties\": {\n \"attempts\": {\n \"type\": \"number\"\n },\n \"degradedReason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"kind\": {\n \"const\": \"visual-confirmation\"\n },\n \"maxAttempts\": {\n \"type\": \"number\"\n },\n \"pairs\": {\n \"items\": {\n \"properties\": {\n \"actualArtifactId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"referenceArtifactId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"view\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"view\",\n \"actualArtifactId\",\n \"referenceArtifactId\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"phase\": {\n \"enum\": [\n \"awaiting_human\",\n \"fixing\",\n \"approved\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"phase\",\n \"pairs\",\n \"degradedReason\",\n \"attempts\",\n \"maxAttempts\"\n ],\n \"type\": \"object\"\n },\n \"PutNotificationWebhook\": {\n \"properties\": {\n \"alertEvents\": {\n \"items\": {\n \"enum\": [\n \"platform_health.firing\",\n \"platform_health.resolved\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"enabled\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"maxLength\": 100,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"runEvents\": {\n \"items\": {\n \"enum\": [\n \"run.started\",\n \"run.completed\",\n \"run.failed\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"secret\": {\n \"maxLength\": 200,\n \"minLength\": 16,\n \"type\": \"string\"\n },\n \"types\": {\n \"items\": {\n \"enum\": [\n \"merge_review\",\n \"pipeline_complete\",\n \"ci_failed\",\n \"test_failed\",\n \"requirement_review\",\n \"clarity_review\",\n \"release_regression\",\n \"decision_required\",\n \"human_test_ready\",\n \"visual_confirmation_ready\",\n \"human_review\",\n \"followup_pending\",\n \"fork_decision_pending\",\n \"judge_review\",\n \"pr_review_ready\",\n \"initiative\",\n \"platform_health\",\n \"infra_unreachable\",\n \"budget_paused\",\n \"budget_threshold\",\n \"key_drift\",\n \"merge_tag_request\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"url\": {\n \"format\": \"uri\",\n \"maxLength\": 2000,\n \"pattern\": \"^https://\",\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"RequirementGroup\": {\n \"properties\": {\n \"name\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"requirements\": {\n \"default\": [],\n \"items\": {\n \"$ref\": \"#/components/schemas/RequirementItem\"\n },\n \"type\": \"array\"\n },\n \"rules\": {\n \"default\": [],\n \"items\": {\n \"$ref\": \"#/components/schemas/DomainRule\"\n },\n \"type\": \"array\"\n },\n \"summary\": {\n \"default\": \"\",\n \"maxLength\": 2000,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"RequirementItem\": {\n \"properties\": {\n \"acceptance\": {\n \"default\": [],\n \"items\": {\n \"$ref\": \"#/components/schemas/AcceptanceCriterion\"\n },\n \"type\": \"array\"\n },\n \"id\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"kind\": {\n \"enum\": [\n \"functional\",\n \"nonfunctional\",\n \"constraint\"\n ],\n \"type\": \"string\"\n },\n \"priority\": {\n \"enum\": [\n \"must\",\n \"should\",\n \"could\"\n ],\n \"type\": \"string\"\n },\n \"sourceBlockIds\": {\n \"default\": [],\n \"items\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"state\": {\n \"default\": \"aspirational\",\n \"enum\": [\n \"aspirational\",\n \"established\"\n ],\n \"type\": \"string\"\n },\n \"statement\": {\n \"maxLength\": 4000,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"title\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"title\",\n \"statement\",\n \"kind\",\n \"priority\"\n ],\n \"type\": \"object\"\n },\n \"SpecDoc\": {\n \"properties\": {\n \"modules\": {\n \"default\": [],\n \"items\": {\n \"$ref\": \"#/components/schemas/SpecModule\"\n },\n \"type\": \"array\"\n },\n \"service\": {\n \"default\": \"\",\n \"maxLength\": 120,\n \"type\": \"string\"\n },\n \"summary\": {\n \"default\": \"\",\n \"maxLength\": 2000,\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"SpecModule\": {\n \"properties\": {\n \"groups\": {\n \"default\": [],\n \"items\": {\n \"$ref\": \"#/components/schemas/RequirementGroup\"\n },\n \"type\": \"array\"\n },\n \"name\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"summary\": {\n \"default\": \"\",\n \"maxLength\": 2000,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"SpecReadIssue\": {\n \"properties\": {\n \"dropped\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ],\n \"default\": 0\n },\n \"kind\": {\n \"enum\": [\n \"read_failed\",\n \"unparsed\",\n \"partial\",\n \"unread\"\n ],\n \"type\": \"string\"\n },\n \"path\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"path\",\n \"kind\"\n ],\n \"type\": \"object\"\n },\n \"StartPublicTask\": {\n \"properties\": {\n \"pipelineId\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"UpdatePublicTask\": {\n \"properties\": {\n \"autoStartDependents\": {\n \"type\": \"boolean\"\n },\n \"description\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"fields\": {\n \"additionalProperties\": {\n \"anyOf\": [\n {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n {\n \"items\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"maxItems\": 50,\n \"type\": \"array\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"propertyNames\": {\n \"maxLength\": 80,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"type\": \"object\"\n },\n \"title\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n }\n },\n \"securitySchemes\": {\n \"bearerAuth\": {\n \"description\": \"A public-API key of the form `cf_live_<keyId>.<secret>`.\",\n \"scheme\": \"bearer\",\n \"type\": \"http\"\n }\n }\n },\n \"info\": {\n \"description\": \"The external, key-authenticated API (`/api/v1`). Authenticate every request with a public-API key: `Authorization: Bearer cf_live_<keyId>.<secret>`. Every call is scoped to the key\u2019s workspace.\",\n \"license\": {\n \"identifier\": \"MIT\",\n \"name\": \"MIT\"\n },\n \"title\": \"cat-factory Public API\",\n \"version\": \"1.35.0\"\n },\n \"openapi\": \"3.1.0\",\n \"paths\": {\n \"/api/v1/artifacts/{artifactId}/blob\": {\n \"get\": {\n \"description\": \"The stored bytes of one artifact listed by the run-artifacts endpoint, served with the recorded image content type (`nosniff`, never inline active content). Authenticated like every other call: the bytes are workspace-scoped, so a report that links here on a public repository leaks nothing to a reader without a key. 404 when the id is unknown to the key\u2019s workspace, and separately when the metadata row survives but its bytes are gone from the blob backend.\",\n \"operationId\": \"getPublicArtifactBlob\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"artifactId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/octet-stream\": {\n \"schema\": {\n \"format\": \"binary\",\n \"type\": \"string\"\n }\n },\n \"image/gif\": {\n \"schema\": {\n \"format\": \"binary\",\n \"type\": \"string\"\n }\n },\n \"image/jpeg\": {\n \"schema\": {\n \"format\": \"binary\",\n \"type\": \"string\"\n }\n },\n \"image/png\": {\n \"schema\": {\n \"format\": \"binary\",\n \"type\": \"string\"\n }\n },\n \"image/webp\": {\n \"schema\": {\n \"format\": \"binary\",\n \"type\": \"string\"\n }\n }\n },\n \"description\": \"The artifact bytes\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n }\n },\n \"summary\": \"Download an artifact's bytes\",\n \"tags\": [\n \"Evidence\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/agent-context/{snapshotId}\": {\n \"get\": {\n \"description\": \"The complete context one dispatch was PROVIDED: system and user prompts, the folded standards fragments, and the injected `.cat-context/*` files an agent reads through tools (which therefore appear in no proxy telemetry). Windowed by `bodyOffset`/`bodyChars`.\",\n \"operationId\": \"getDebugAgentContext\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"snapshotId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"bodyChars\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 200000,\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"bodyOffset\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 2000000,\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"contextFiles\": {\n \"items\": {\n \"properties\": {\n \"content\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"path\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"path\",\n \"title\",\n \"url\",\n \"content\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"extras\": {\n \"additionalProperties\": {},\n \"propertyNames\": {\n \"type\": \"string\"\n },\n \"type\": \"object\"\n },\n \"fragments\": {\n \"items\": {\n \"properties\": {\n \"body\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"id\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"body\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"harness\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"model\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runId\": {\n \"type\": \"string\"\n },\n \"snapshotId\": {\n \"type\": \"string\"\n },\n \"stepIndex\": {\n \"type\": \"number\"\n },\n \"systemPrompt\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"userPrompt\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"snapshotId\",\n \"runId\",\n \"agentKind\",\n \"stepIndex\",\n \"createdAt\",\n \"model\",\n \"harness\",\n \"systemPrompt\",\n \"userPrompt\",\n \"fragments\",\n \"contextFiles\",\n \"extras\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get one agent-context snapshot\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/llm-calls/{callId}\": {\n \"get\": {\n \"description\": \"One recorded model call with its budgeted prompt delta, response and reasoning. `bodyOffset`/`bodyChars` window the bodies, so an arbitrarily long transcript is readable in bounded pages.\",\n \"operationId\": \"getDebugLlmCall\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"callId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"bodyChars\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 200000,\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"bodyOffset\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 2000000,\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"view\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"raw\",\n \"messages\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"callId\": {\n \"type\": \"string\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"elidedLeadingMessages\": {\n \"type\": \"number\"\n },\n \"errorMessage\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"finishReason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"httpStatus\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"messageCount\": {\n \"type\": \"number\"\n },\n \"model\": {\n \"type\": \"string\"\n },\n \"ok\": {\n \"type\": \"boolean\"\n },\n \"outcome\": {\n \"enum\": [\n \"ok\",\n \"warning\",\n \"error\"\n ],\n \"type\": \"string\"\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"phase\": {\n \"type\": \"string\"\n },\n \"prompt\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"promptMessages\": {\n \"anyOf\": [\n {\n \"items\": {\n \"properties\": {\n \"content\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"index\": {\n \"type\": \"number\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"role\": {\n \"type\": \"string\"\n },\n \"toolCallId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"toolCalls\": {\n \"items\": {\n \"properties\": {\n \"args\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"args\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"index\",\n \"role\",\n \"name\",\n \"toolCallId\",\n \"toolCalls\",\n \"content\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"reasoning\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"requestMaxTokens\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"response\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"runId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"streaming\": {\n \"type\": \"boolean\"\n },\n \"toolCount\": {\n \"type\": \"number\"\n },\n \"totalMs\": {\n \"type\": \"number\"\n },\n \"totalTokens\": {\n \"type\": \"number\"\n },\n \"turnIndex\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"callId\",\n \"runId\",\n \"agentKind\",\n \"provider\",\n \"model\",\n \"createdAt\",\n \"outcome\",\n \"ok\",\n \"httpStatus\",\n \"errorMessage\",\n \"finishReason\",\n \"streaming\",\n \"phase\",\n \"turnIndex\",\n \"messageCount\",\n \"toolCount\",\n \"requestMaxTokens\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"completionTokens\",\n \"totalTokens\",\n \"upstreamMs\",\n \"overheadMs\",\n \"totalMs\",\n \"elidedLeadingMessages\",\n \"prompt\",\n \"response\",\n \"reasoning\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get one LLM call\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs\": {\n \"get\": {\n \"description\": \"The triage entry point: the workspace\u2019s runs, newest first and keyset-paginated, with an optional status and `since` filter.\",\n \"operationId\": \"listDebugRuns\",\n \"parameters\": [\n {\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"running\",\n \"blocked\",\n \"done\",\n \"paused\",\n \"failed\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"since\",\n \"required\": false,\n \"schema\": {\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runs\": {\n \"items\": {\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"currentStep\": {\n \"type\": \"number\"\n },\n \"failure\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hint\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"kind\": {\n \"enum\": [\n \"preflight\",\n \"dispatch\",\n \"environment\",\n \"evicted\",\n \"timeout\",\n \"agent\",\n \"job_failed\",\n \"rejected\",\n \"companion_rejected\",\n \"stalled\",\n \"cancelled\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"lastSubtasks\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"completed\": {\n \"type\": \"number\"\n },\n \"inProgress\": {\n \"type\": \"number\"\n },\n \"items\": {\n \"items\": {\n \"properties\": {\n \"label\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"pending\",\n \"in_progress\",\n \"completed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"label\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"total\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"completed\",\n \"inProgress\",\n \"total\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"occurredAt\": {\n \"type\": \"number\"\n },\n \"reason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"stepIndex\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"kind\",\n \"message\",\n \"detail\",\n \"hint\",\n \"occurredAt\",\n \"lastSubtasks\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"pipelineId\": {\n \"type\": \"string\"\n },\n \"pipelineName\": {\n \"type\": \"string\"\n },\n \"runId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"running\",\n \"blocked\",\n \"done\",\n \"paused\",\n \"failed\"\n ],\n \"type\": \"string\"\n },\n \"stepCount\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"runId\",\n \"blockId\",\n \"pipelineId\",\n \"pipelineName\",\n \"status\",\n \"createdAt\",\n \"currentStep\",\n \"stepCount\",\n \"failure\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"runs\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the workspace's runs\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs/{runId}\": {\n \"get\": {\n \"description\": \"One run\u2019s diagnostic overview: its steps, which telemetry sinks this deployment retains (and how much each holds), the LLM cost/latency rollups, and the derived signals worth looking at first.\",\n \"operationId\": \"getDebugRun\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"diagnostics\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"host\": {\n \"properties\": {\n \"platform\": {\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n \"lastDispatch\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"at\": {\n \"type\": \"number\"\n },\n \"executionBackend\": {\n \"type\": \"string\"\n },\n \"failure\": {\n \"properties\": {\n \"at\": {\n \"type\": \"number\"\n },\n \"kind\": {\n \"type\": \"string\"\n },\n \"reason\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"at\"\n ],\n \"type\": \"object\"\n },\n \"model\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"repo\": {\n \"properties\": {\n \"baseBranch\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"owner\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"owner\",\n \"name\"\n ],\n \"type\": \"object\"\n },\n \"stepIndex\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"stepIndex\",\n \"agentKind\",\n \"at\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"generatedAt\": {\n \"type\": \"number\"\n },\n \"kind\": {\n \"const\": \"cat-factory.run-debug-overview\"\n },\n \"llm\": {\n \"properties\": {\n \"byAgentKind\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"cacheHitRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"costEstimate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"errors\": {\n \"type\": \"number\"\n },\n \"maxOutputTokens\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outputHeadroomRatio\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"peakCompletionTokens\": {\n \"type\": \"number\"\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"transportOverheadRatio\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"truncatedCalls\": {\n \"type\": \"number\"\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n },\n \"warnings\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"agentKind\",\n \"calls\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"cacheHitRate\",\n \"completionTokens\",\n \"peakCompletionTokens\",\n \"maxOutputTokens\",\n \"outputHeadroomRatio\",\n \"truncatedCalls\",\n \"upstreamMs\",\n \"overheadMs\",\n \"transportOverheadRatio\",\n \"errors\",\n \"warnings\",\n \"costEstimate\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"byPhase\": {\n \"items\": {\n \"properties\": {\n \"cacheHitRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"carryCostShare\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"carryCostTokens\": {\n \"type\": \"number\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"costEstimate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"errors\": {\n \"type\": \"number\"\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"phase\": {\n \"type\": \"string\"\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"truncatedCalls\": {\n \"type\": \"number\"\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n },\n \"warnings\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"phase\",\n \"calls\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"cacheHitRate\",\n \"completionTokens\",\n \"carryCostTokens\",\n \"carryCostShare\",\n \"upstreamMs\",\n \"overheadMs\",\n \"errors\",\n \"warnings\",\n \"truncatedCalls\",\n \"costEstimate\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"costCurrency\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"totals\": {\n \"properties\": {\n \"cacheHitRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"costEstimate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"errors\": {\n \"type\": \"number\"\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"transportOverheadRatio\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"truncatedCalls\": {\n \"type\": \"number\"\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n },\n \"warnings\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"calls\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"cacheHitRate\",\n \"completionTokens\",\n \"upstreamMs\",\n \"overheadMs\",\n \"transportOverheadRatio\",\n \"errors\",\n \"warnings\",\n \"truncatedCalls\",\n \"costEstimate\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"totals\",\n \"byAgentKind\",\n \"byPhase\",\n \"costCurrency\"\n ],\n \"type\": \"object\"\n },\n \"run\": {\n \"properties\": {\n \"blockId\": {\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"currentStep\": {\n \"type\": \"number\"\n },\n \"failure\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hint\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"kind\": {\n \"enum\": [\n \"preflight\",\n \"dispatch\",\n \"environment\",\n \"evicted\",\n \"timeout\",\n \"agent\",\n \"job_failed\",\n \"rejected\",\n \"companion_rejected\",\n \"stalled\",\n \"cancelled\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"lastSubtasks\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"completed\": {\n \"type\": \"number\"\n },\n \"inProgress\": {\n \"type\": \"number\"\n },\n \"items\": {\n \"items\": {\n \"properties\": {\n \"label\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"pending\",\n \"in_progress\",\n \"completed\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"label\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"total\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"completed\",\n \"inProgress\",\n \"total\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"occurredAt\": {\n \"type\": \"number\"\n },\n \"reason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"stepIndex\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"kind\",\n \"message\",\n \"detail\",\n \"hint\",\n \"occurredAt\",\n \"lastSubtasks\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"pipelineId\": {\n \"type\": \"string\"\n },\n \"pipelineName\": {\n \"type\": \"string\"\n },\n \"runId\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"running\",\n \"blocked\",\n \"done\",\n \"paused\",\n \"failed\"\n ],\n \"type\": \"string\"\n },\n \"stepCount\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"runId\",\n \"blockId\",\n \"pipelineId\",\n \"pipelineName\",\n \"status\",\n \"createdAt\",\n \"currentStep\",\n \"stepCount\",\n \"failure\"\n ],\n \"type\": \"object\"\n },\n \"signals\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"code\": {\n \"type\": \"string\"\n },\n \"count\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"severity\": {\n \"enum\": [\n \"info\",\n \"warning\",\n \"error\"\n ],\n \"type\": \"string\"\n },\n \"stepIndex\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"code\",\n \"severity\",\n \"message\",\n \"count\",\n \"agentKind\",\n \"stepIndex\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"sinks\": {\n \"properties\": {\n \"agentContext\": {\n \"properties\": {\n \"available\": {\n \"type\": \"boolean\"\n },\n \"count\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"available\",\n \"count\"\n ],\n \"type\": \"object\"\n },\n \"llmCalls\": {\n \"properties\": {\n \"available\": {\n \"type\": \"boolean\"\n },\n \"count\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"available\",\n \"count\"\n ],\n \"type\": \"object\"\n },\n \"provisioningLog\": {\n \"properties\": {\n \"available\": {\n \"type\": \"boolean\"\n },\n \"count\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"available\",\n \"count\"\n ],\n \"type\": \"object\"\n },\n \"searchQueries\": {\n \"properties\": {\n \"available\": {\n \"type\": \"boolean\"\n },\n \"count\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"available\",\n \"count\"\n ],\n \"type\": \"object\"\n },\n \"toolCalls\": {\n \"properties\": {\n \"available\": {\n \"type\": \"boolean\"\n },\n \"count\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"available\",\n \"count\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"llmCalls\",\n \"agentContext\",\n \"searchQueries\",\n \"toolCalls\",\n \"provisioningLog\"\n ],\n \"type\": \"object\"\n },\n \"steps\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"evictionRecoveries\": {\n \"type\": \"number\"\n },\n \"finishedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"firstEvictionDetail\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"hasStructuredResult\": {\n \"type\": \"boolean\"\n },\n \"index\": {\n \"type\": \"number\"\n },\n \"lastActivityAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"model\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outputChars\": {\n \"type\": \"number\"\n },\n \"progress\": {\n \"type\": \"number\"\n },\n \"skipped\": {\n \"type\": \"boolean\"\n },\n \"startedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"state\": {\n \"type\": \"string\"\n },\n \"subtasks\": {\n \"anyOf\": [\n {\n \"properties\": {\n \"completed\": {\n \"type\": \"number\"\n },\n \"inProgress\": {\n \"type\": \"number\"\n },\n \"total\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"completed\",\n \"inProgress\",\n \"total\"\n ],\n \"type\": \"object\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"toolServers\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"observed\": {\n \"items\": {\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"status\": {\n \"enum\": [\n \"ready\",\n \"failed\",\n \"needs_auth\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"toolCount\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"id\",\n \"status\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"unavailable\": {\n \"items\": {\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"reason\": {\n \"enum\": [\n \"harness_unsupported\",\n \"transport_unsupported\",\n \"missing_secret\",\n \"reserved_secret\",\n \"oauth_not_connected\",\n \"oauth_token_failed\",\n \"over_budget\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"label\",\n \"reason\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"wired\": {\n \"items\": {\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"tools\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"transport\": {\n \"enum\": [\n \"stdio\",\n \"http\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"label\",\n \"transport\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"wired\",\n \"unavailable\",\n \"agentKind\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"index\",\n \"agentKind\",\n \"state\",\n \"progress\",\n \"model\",\n \"skipped\",\n \"startedAt\",\n \"finishedAt\",\n \"lastActivityAt\",\n \"subtasks\",\n \"outputChars\",\n \"hasStructuredResult\",\n \"evictionRecoveries\",\n \"firstEvictionDetail\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"toolCalls\": {\n \"properties\": {\n \"byAgentKind\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"failureRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"failures\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"agentKind\",\n \"calls\",\n \"failures\",\n \"failureRate\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"byTool\": {\n \"items\": {\n \"properties\": {\n \"calls\": {\n \"type\": \"number\"\n },\n \"failureRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"failures\": {\n \"type\": \"number\"\n },\n \"tool\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"tool\",\n \"calls\",\n \"failures\",\n \"failureRate\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"totals\": {\n \"properties\": {\n \"calls\": {\n \"type\": \"number\"\n },\n \"failureRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"failures\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"calls\",\n \"failures\",\n \"failureRate\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"totals\",\n \"byTool\",\n \"byAgentKind\"\n ],\n \"type\": \"object\"\n },\n \"version\": {\n \"const\": 1\n }\n },\n \"required\": [\n \"kind\",\n \"version\",\n \"generatedAt\",\n \"run\",\n \"steps\",\n \"diagnostics\",\n \"sinks\",\n \"llm\",\n \"toolCalls\",\n \"signals\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get a run's diagnostic map\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs/{runId}/agent-context\": {\n \"get\": {\n \"description\": \"Every dispatch whose provided context was captured, with SIZES only (no bodies) so the list stays bounded. Read one in full through the snapshot endpoint.\",\n \"operationId\": \"listDebugAgentContext\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"stepIndex\",\n \"required\": false,\n \"schema\": {\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"snapshots\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"contextFilesChars\": {\n \"type\": \"number\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"fragmentsChars\": {\n \"type\": \"number\"\n },\n \"harness\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"model\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"snapshotId\": {\n \"type\": \"string\"\n },\n \"stepIndex\": {\n \"type\": \"number\"\n },\n \"systemPromptChars\": {\n \"type\": \"number\"\n },\n \"userPromptChars\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"snapshotId\",\n \"agentKind\",\n \"stepIndex\",\n \"createdAt\",\n \"model\",\n \"harness\",\n \"systemPromptChars\",\n \"userPromptChars\",\n \"fragmentsChars\",\n \"contextFilesChars\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"snapshots\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a run's agent-context dispatches\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs/{runId}/llm-calls\": {\n \"get\": {\n \"description\": \"The model calls a run made, keyset-paginated and filterable by agent kind, phase, outcome or a substring of the bodies. Bodies are returned only when `bodyChars` asks for them.\",\n \"operationId\": \"listDebugLlmCalls\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"agentKind\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"phase\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 120,\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"outcome\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"ok\",\n \"warning\",\n \"error\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"contains\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 256,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"order\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"newest\",\n \"oldest\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"bodyChars\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 4000,\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"calls\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"callId\": {\n \"type\": \"string\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"elidedLeadingMessages\": {\n \"type\": \"number\"\n },\n \"errorMessage\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"finishReason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"httpStatus\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"messageCount\": {\n \"type\": \"number\"\n },\n \"model\": {\n \"type\": \"string\"\n },\n \"ok\": {\n \"type\": \"boolean\"\n },\n \"outcome\": {\n \"enum\": [\n \"ok\",\n \"warning\",\n \"error\"\n ],\n \"type\": \"string\"\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"phase\": {\n \"type\": \"string\"\n },\n \"prompt\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"promptMessages\": {\n \"anyOf\": [\n {\n \"items\": {\n \"properties\": {\n \"content\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"index\": {\n \"type\": \"number\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"role\": {\n \"type\": \"string\"\n },\n \"toolCallId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"toolCalls\": {\n \"items\": {\n \"properties\": {\n \"args\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"args\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"index\",\n \"role\",\n \"name\",\n \"toolCallId\",\n \"toolCalls\",\n \"content\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"reasoning\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"requestMaxTokens\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"response\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"runId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"streaming\": {\n \"type\": \"boolean\"\n },\n \"toolCount\": {\n \"type\": \"number\"\n },\n \"totalMs\": {\n \"type\": \"number\"\n },\n \"totalTokens\": {\n \"type\": \"number\"\n },\n \"turnIndex\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"callId\",\n \"runId\",\n \"agentKind\",\n \"provider\",\n \"model\",\n \"createdAt\",\n \"outcome\",\n \"ok\",\n \"httpStatus\",\n \"errorMessage\",\n \"finishReason\",\n \"streaming\",\n \"phase\",\n \"turnIndex\",\n \"messageCount\",\n \"toolCount\",\n \"requestMaxTokens\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"completionTokens\",\n \"totalTokens\",\n \"upstreamMs\",\n \"overheadMs\",\n \"totalMs\",\n \"elidedLeadingMessages\",\n \"prompt\",\n \"response\",\n \"reasoning\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"calls\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a run's LLM calls\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs/{runId}/llm-export\": {\n \"get\": {\n \"description\": \"The whole of a run\u2019s model activity as one self-describing document, for handing straight to a model asked why the run truncated, spent or stalled: the SQL rollups (run totals, per agent kind, per phase, with the carry cost that says which slice burdened everything after it) plus a bounded window of the individual calls behind them. The rollups cover EVERY recorded call and do not move with `limit`, so a windowed bundle still reports what the run actually cost; `truncated` says the calls are a window and `order` says which end was kept. Bodies are omitted unless `bodyChars` asks, and the resumable call list is the way to walk a long run whole.\",\n \"operationId\": \"getDebugLlmExport\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"order\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"oldest\",\n \"newest\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"bodyChars\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 4000,\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"available\": {\n \"type\": \"boolean\"\n },\n \"calls\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"callId\": {\n \"type\": \"string\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"elidedLeadingMessages\": {\n \"type\": \"number\"\n },\n \"errorMessage\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"finishReason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"httpStatus\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"messageCount\": {\n \"type\": \"number\"\n },\n \"model\": {\n \"type\": \"string\"\n },\n \"ok\": {\n \"type\": \"boolean\"\n },\n \"outcome\": {\n \"enum\": [\n \"ok\",\n \"warning\",\n \"error\"\n ],\n \"type\": \"string\"\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"phase\": {\n \"type\": \"string\"\n },\n \"prompt\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"promptMessages\": {\n \"anyOf\": [\n {\n \"items\": {\n \"properties\": {\n \"content\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"index\": {\n \"type\": \"number\"\n },\n \"name\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"role\": {\n \"type\": \"string\"\n },\n \"toolCallId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"toolCalls\": {\n \"items\": {\n \"properties\": {\n \"args\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"name\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"name\",\n \"args\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"index\",\n \"role\",\n \"name\",\n \"toolCallId\",\n \"toolCalls\",\n \"content\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"reasoning\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"requestMaxTokens\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"response\": {\n \"properties\": {\n \"chars\": {\n \"type\": \"number\"\n },\n \"matchOffset\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"offset\": {\n \"type\": \"number\"\n },\n \"text\": {\n \"type\": \"string\"\n },\n \"totalChars\": {\n \"type\": \"number\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\n \"text\",\n \"chars\",\n \"offset\",\n \"totalChars\",\n \"truncated\"\n ],\n \"type\": \"object\"\n },\n \"runId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"streaming\": {\n \"type\": \"boolean\"\n },\n \"toolCount\": {\n \"type\": \"number\"\n },\n \"totalMs\": {\n \"type\": \"number\"\n },\n \"totalTokens\": {\n \"type\": \"number\"\n },\n \"turnIndex\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"callId\",\n \"runId\",\n \"agentKind\",\n \"provider\",\n \"model\",\n \"createdAt\",\n \"outcome\",\n \"ok\",\n \"httpStatus\",\n \"errorMessage\",\n \"finishReason\",\n \"streaming\",\n \"phase\",\n \"turnIndex\",\n \"messageCount\",\n \"toolCount\",\n \"requestMaxTokens\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"completionTokens\",\n \"totalTokens\",\n \"upstreamMs\",\n \"overheadMs\",\n \"totalMs\",\n \"elidedLeadingMessages\",\n \"prompt\",\n \"response\",\n \"reasoning\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"generatedAt\": {\n \"type\": \"number\"\n },\n \"kind\": {\n \"const\": \"cat-factory.run-llm-export\"\n },\n \"llm\": {\n \"properties\": {\n \"byAgentKind\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"cacheHitRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"costEstimate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"errors\": {\n \"type\": \"number\"\n },\n \"maxOutputTokens\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"outputHeadroomRatio\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"peakCompletionTokens\": {\n \"type\": \"number\"\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"transportOverheadRatio\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"truncatedCalls\": {\n \"type\": \"number\"\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n },\n \"warnings\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"agentKind\",\n \"calls\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"cacheHitRate\",\n \"completionTokens\",\n \"peakCompletionTokens\",\n \"maxOutputTokens\",\n \"outputHeadroomRatio\",\n \"truncatedCalls\",\n \"upstreamMs\",\n \"overheadMs\",\n \"transportOverheadRatio\",\n \"errors\",\n \"warnings\",\n \"costEstimate\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"byPhase\": {\n \"items\": {\n \"properties\": {\n \"cacheHitRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"carryCostShare\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"carryCostTokens\": {\n \"type\": \"number\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"costEstimate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"errors\": {\n \"type\": \"number\"\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"phase\": {\n \"type\": \"string\"\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"truncatedCalls\": {\n \"type\": \"number\"\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n },\n \"warnings\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"phase\",\n \"calls\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"cacheHitRate\",\n \"completionTokens\",\n \"carryCostTokens\",\n \"carryCostShare\",\n \"upstreamMs\",\n \"overheadMs\",\n \"errors\",\n \"warnings\",\n \"truncatedCalls\",\n \"costEstimate\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"costCurrency\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"totals\": {\n \"properties\": {\n \"cacheHitRate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"cacheReadTokens\": {\n \"type\": \"number\"\n },\n \"cacheWriteTokens\": {\n \"type\": \"number\"\n },\n \"calls\": {\n \"type\": \"number\"\n },\n \"completionTokens\": {\n \"type\": \"number\"\n },\n \"costEstimate\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"errors\": {\n \"type\": \"number\"\n },\n \"overheadMs\": {\n \"type\": \"number\"\n },\n \"promptTokens\": {\n \"type\": \"number\"\n },\n \"transportOverheadRatio\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"truncatedCalls\": {\n \"type\": \"number\"\n },\n \"upstreamMs\": {\n \"type\": \"number\"\n },\n \"warnings\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"calls\",\n \"promptTokens\",\n \"cacheReadTokens\",\n \"cacheWriteTokens\",\n \"cacheHitRate\",\n \"completionTokens\",\n \"upstreamMs\",\n \"overheadMs\",\n \"transportOverheadRatio\",\n \"errors\",\n \"warnings\",\n \"truncatedCalls\",\n \"costEstimate\"\n ],\n \"type\": \"object\"\n }\n },\n \"required\": [\n \"totals\",\n \"byAgentKind\",\n \"byPhase\",\n \"costCurrency\"\n ],\n \"type\": \"object\"\n },\n \"order\": {\n \"enum\": [\n \"oldest\",\n \"newest\"\n ],\n \"type\": \"string\"\n },\n \"runId\": {\n \"type\": \"string\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n },\n \"version\": {\n \"const\": 1\n }\n },\n \"required\": [\n \"kind\",\n \"version\",\n \"runId\",\n \"generatedAt\",\n \"available\",\n \"llm\",\n \"order\",\n \"truncated\",\n \"calls\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Export a run's model activity as one bundle\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs/{runId}/logs\": {\n \"get\": {\n \"description\": \"The run\u2019s provisioning event log \u2014 how its environment, runner pool and containers came up, or why they did not.\",\n \"operationId\": \"listDebugLogs\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"entries\": {\n \"items\": {\n \"properties\": {\n \"blockId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"error\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"executionId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"operation\": {\n \"enum\": [\n \"provision\",\n \"teardown\",\n \"teardown-verify\",\n \"status\",\n \"dispatch\",\n \"release\",\n \"poll-failure\"\n ],\n \"type\": \"string\"\n },\n \"outcome\": {\n \"enum\": [\n \"success\",\n \"failure\"\n ],\n \"type\": \"string\"\n },\n \"providerId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"subsystem\": {\n \"enum\": [\n \"environment\",\n \"runner-pool\",\n \"container\"\n ],\n \"type\": \"string\"\n },\n \"targetId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"workspaceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"workspaceId\",\n \"subsystem\",\n \"operation\",\n \"targetId\",\n \"providerId\",\n \"blockId\",\n \"executionId\",\n \"outcome\",\n \"error\",\n \"detail\",\n \"createdAt\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"entries\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a run's infrastructure log\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs/{runId}/search-queries\": {\n \"get\": {\n \"description\": \"The web searches the run\u2019s agents actually performed, keyset-paginated. Retained only when the deployment records agent context.\",\n \"operationId\": \"listDebugSearchQueries\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"queries\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"executionId\": {\n \"type\": \"string\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"provider\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"brave\",\n \"searxng\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"query\": {\n \"type\": \"string\"\n },\n \"resultCount\": {\n \"type\": \"number\"\n },\n \"workspaceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"workspaceId\",\n \"executionId\",\n \"agentKind\",\n \"provider\",\n \"query\",\n \"resultCount\",\n \"createdAt\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"queries\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a run's web searches\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/debug/runs/{runId}/tool-calls\": {\n \"get\": {\n \"description\": \"The tool calls the run\u2019s agents made, in the order they made them \u2014 which command, against what, and what came back. The half of \u201Chow did this diff come about\u201D that neither the diff nor a prompt body answers. Arguments and results are retained only when the deployment records agent context AND the workspace has not opted out; `bodies` says which, so an empty `args` is never mistaken for a call that took none.\",\n \"operationId\": \"listDebugToolCalls\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"jobId\",\n \"required\": false,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"order\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"recent\",\n \"trajectory\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"outcome\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"ok\",\n \"error\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"toolCalls\": {\n \"items\": {\n \"properties\": {\n \"agentKind\": {\n \"type\": \"string\"\n },\n \"args\": {\n \"type\": \"string\"\n },\n \"argsDropped\": {\n \"type\": \"number\"\n },\n \"bodies\": {\n \"enum\": [\n \"stored\",\n \"withheld\"\n ],\n \"type\": \"string\"\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"endedAt\": {\n \"type\": \"number\"\n },\n \"executionId\": {\n \"type\": \"string\"\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"jobId\": {\n \"type\": \"string\"\n },\n \"ok\": {\n \"type\": \"boolean\"\n },\n \"result\": {\n \"type\": \"string\"\n },\n \"resultDropped\": {\n \"type\": \"number\"\n },\n \"seq\": {\n \"type\": \"number\"\n },\n \"startedAt\": {\n \"type\": \"number\"\n },\n \"tool\": {\n \"type\": \"string\"\n },\n \"workspaceId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"workspaceId\",\n \"executionId\",\n \"agentKind\",\n \"jobId\",\n \"seq\",\n \"tool\",\n \"startedAt\",\n \"endedAt\",\n \"ok\",\n \"bodies\",\n \"args\",\n \"result\",\n \"argsDropped\",\n \"resultDropped\",\n \"createdAt\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"toolCalls\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a run's tool calls\",\n \"tags\": [\n \"Debug\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/jobs\": {\n \"get\": {\n \"description\": \"List the headless runs THIS surface created, newest first and keyset-paginated. Scoped to internal-anchored runs exactly like the single-job read, so an external key can never enumerate the workspace\u2019s ordinary board runs.\",\n \"operationId\": \"listPublicJobs\",\n \"parameters\": [\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"running\",\n \"succeeded\",\n \"failed\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"since\",\n \"required\": false,\n \"schema\": {\n \"minimum\": 0,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"jobs\": {\n \"items\": {\n \"$ref\": \"#/components/schemas/PublicJob\"\n },\n \"type\": \"array\"\n },\n \"nextCursor\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"jobs\",\n \"nextCursor\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the workspace's jobs\",\n \"tags\": [\n \"Jobs\"\n ],\n \"x-min-scope\": \"read\"\n },\n \"post\": {\n \"description\": \"Start a public, inline pipeline headlessly against a supplied brief. Returns a job id to poll or stream. Nothing is pushed to GitHub.\",\n \"operationId\": \"createPublicJob\",\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreatePublicJob\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"202\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicJobAccepted\"\n }\n }\n },\n \"description\": \"Accepted \u2014 the run has started\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Start a headless job\",\n \"tags\": [\n \"Jobs\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/jobs/{id}\": {\n \"get\": {\n \"description\": \"Poll a headless job started through this surface: its status and, once finished, its result.\",\n \"operationId\": \"getPublicJob\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicJob\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get a job\",\n \"tags\": [\n \"Jobs\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/jobs/{id}/cancel\": {\n \"post\": {\n \"description\": \"Stop a headless job run, freeing its concurrency slot. Idempotent \u2014 an already-finished job is returned as-is. Use this to abandon a run parked on a decision you do not intend to answer.\",\n \"operationId\": \"cancelPublicJob\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicJob\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Cancel a job\",\n \"tags\": [\n \"Jobs\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/jobs/{id}/events\": {\n \"get\": {\n \"description\": \"Server-sent events for a headless job run: `progress` frames until a terminal `done`/`error`/`stopped`/`timeout` event. Authenticated by the API key header.\",\n \"operationId\": \"streamPublicJobEvents\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"type\": \"string\"\n }\n }\n },\n \"description\": \"An event stream of job updates\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n }\n },\n \"summary\": \"Stream a job (SSE)\",\n \"tags\": [\n \"Jobs\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/keys\": {\n \"get\": {\n \"description\": \"The live (non-revoked) keys for the calling key\u2019s workspace, metadata only; a secret is never readable back. `createdByKeyId` names the key that provisioned a key headlessly; `createdByUserId` names the person who minted one in the app.\",\n \"operationId\": \"listPublicKeys\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicApiKeyList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the workspace's API keys\",\n \"tags\": [\n \"Keys\"\n ],\n \"x-min-scope\": \"admin\"\n },\n \"post\": {\n \"description\": \"Mint a key for the calling key\u2019s own workspace and return its raw secret EXACTLY ONCE, so store it now: it is not recoverable. Omitting `scope` mints a `write` key. `admin` cannot be minted here: a key provisioned over the API can never itself provision, which keeps the chain one link long. Requires an `admin`-scope key.\",\n \"operationId\": \"createPublicKey\",\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreateHeadlessPublicApiKey\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"201\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreatedPublicApiKey\"\n }\n }\n },\n \"description\": \"Created\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Provision an API key\",\n \"tags\": [\n \"Keys\"\n ],\n \"x-min-scope\": \"admin\"\n }\n },\n \"/api/v1/keys/{keyId}\": {\n \"delete\": {\n \"description\": \"Revoke a key AND every key it minted, so a leaked provisioning key cannot outlive its own revocation through the credentials it left behind. Idempotent, and it may name the calling key. Requires an `admin`-scope key.\",\n \"operationId\": \"revokePublicKey\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"keyId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"204\": {\n \"description\": \"No content\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Revoke an API key\",\n \"tags\": [\n \"Keys\"\n ],\n \"x-min-scope\": \"admin\"\n }\n },\n \"/api/v1/me\": {\n \"get\": {\n \"description\": \"Report what the key on this request is and what it may do: its id, its account, the ONE workspace every call under it acts within, its scope, and the label it was minted with. `read` scope, the floor of the ladder, because an integration\u2019s startup self-check has to work whatever rung it holds. The scope ladder is INCLUSIVE (`read` \u2282 `write` \u2282 `decide` \u2282 `admin`), so compare against the rung an action needs rather than for equality.\",\n \"operationId\": \"getPublicIdentity\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicIdentity\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Describe the calling key\",\n \"tags\": [\n \"Identity\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/merge-records/rollups\": {\n \"get\": {\n \"description\": \"Every change class\u2019s accumulated track record for the workspace, as one aggregate: how many records it holds, how many landed and by which route (auto-merged, merged through the app, merged directly on the provider), how many were rejected or are still awaiting review, and the distribution of reviewer-effort tags. This is the evidence that justifies widening a per-class auto-merge rule; nothing widens one automatically. A class with no records is present as zeros rather than absent, so \\\"nothing has landed here yet\\\" never reads as a class the response left out. `unknown` is a real class (no changed-file list was available) and never matches a per-class rule.\",\n \"operationId\": \"listPublicMergeClassRollups\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"rollups\": {\n \"items\": {\n \"properties\": {\n \"autoMerged\": {\n \"type\": \"number\"\n },\n \"changeClass\": {\n \"enum\": [\n \"docs\",\n \"test\",\n \"dependency\",\n \"config\",\n \"source\",\n \"schema\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"effort\": {\n \"properties\": {\n \"major\": {\n \"type\": \"number\"\n },\n \"minor\": {\n \"type\": \"number\"\n },\n \"none\": {\n \"type\": \"number\"\n },\n \"untagged\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"none\",\n \"minor\",\n \"major\",\n \"untagged\"\n ],\n \"type\": \"object\"\n },\n \"externalMerged\": {\n \"type\": \"number\"\n },\n \"humanMerged\": {\n \"type\": \"number\"\n },\n \"merged\": {\n \"type\": \"number\"\n },\n \"pendingReview\": {\n \"type\": \"number\"\n },\n \"rejected\": {\n \"type\": \"number\"\n },\n \"total\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"changeClass\",\n \"total\",\n \"merged\",\n \"autoMerged\",\n \"humanMerged\",\n \"externalMerged\",\n \"rejected\",\n \"pendingReview\",\n \"effort\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"rollups\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the per-change-class merge rollups\",\n \"tags\": [\n \"Merge records\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/merge-records/{recordId}\": {\n \"get\": {\n \"description\": \"The same record addressed by its own id, for a caller that holds one without the run: the id a `merge_tag_request` notification carries on its payload, for instance. Scoped to the calling key\u2019s workspace.\",\n \"operationId\": \"getPublicMergeRecord\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"recordId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"changeClass\": {\n \"enum\": [\n \"docs\",\n \"test\",\n \"dependency\",\n \"config\",\n \"source\",\n \"schema\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"changedFileCount\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"complexity\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"decision\": {\n \"enum\": [\n \"pending_review\",\n \"auto_merged\",\n \"human_merged\",\n \"external_merged\",\n \"rejected\"\n ],\n \"type\": \"string\"\n },\n \"impact\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"mergePresetId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"mergePresetName\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"prNumber\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"prUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"provider\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"github\",\n \"gitlab\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"recordId\": {\n \"type\": \"string\"\n },\n \"repoId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"resolvedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"reviewEffort\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"none\",\n \"minor\",\n \"major\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"risk\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"taggedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"recordId\",\n \"taskId\",\n \"runId\",\n \"changeClass\",\n \"changedFileCount\",\n \"complexity\",\n \"risk\",\n \"impact\",\n \"mergePresetId\",\n \"mergePresetName\",\n \"decision\",\n \"reviewEffort\",\n \"prNumber\",\n \"prUrl\",\n \"repoId\",\n \"provider\",\n \"createdAt\",\n \"resolvedAt\",\n \"taggedAt\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get one merge record\",\n \"tags\": [\n \"Merge records\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/merge-records/{recordId}/effort\": {\n \"post\": {\n \"description\": \"Record how much review a landed pull request actually needed (`none` for zero blocking comments, `minor` for a nit pass, `major` for real rework), or `null` to clear the tag. This is the ground truth the auto-merge score thresholds are trying to approximate, and it is never mandatory: an untagged merge records a null tag and nothing downstream breaks. A `write` key, not an `admin` one: the pull request already landed, so tagging it merges nothing. Idempotent, and orthogonal to the decision, so a record can be tagged whenever the effort becomes known, before or after the `act` that merged it.\",\n \"operationId\": \"tagPublicMergeReviewEffort\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"recordId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"reviewEffort\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"none\",\n \"minor\",\n \"major\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"reviewEffort\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"changeClass\": {\n \"enum\": [\n \"docs\",\n \"test\",\n \"dependency\",\n \"config\",\n \"source\",\n \"schema\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"changedFileCount\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"complexity\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"decision\": {\n \"enum\": [\n \"pending_review\",\n \"auto_merged\",\n \"human_merged\",\n \"external_merged\",\n \"rejected\"\n ],\n \"type\": \"string\"\n },\n \"impact\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"mergePresetId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"mergePresetName\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"prNumber\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"prUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"provider\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"github\",\n \"gitlab\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"recordId\": {\n \"type\": \"string\"\n },\n \"repoId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"resolvedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"reviewEffort\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"none\",\n \"minor\",\n \"major\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"risk\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"taggedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"recordId\",\n \"taskId\",\n \"runId\",\n \"changeClass\",\n \"changedFileCount\",\n \"complexity\",\n \"risk\",\n \"impact\",\n \"mergePresetId\",\n \"mergePresetName\",\n \"decision\",\n \"reviewEffort\",\n \"prNumber\",\n \"prUrl\",\n \"repoId\",\n \"provider\",\n \"createdAt\",\n \"resolvedAt\",\n \"taggedAt\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Tag the reviewer effort a merge took\",\n \"tags\": [\n \"Merge records\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/notification-webhook\": {\n \"delete\": {\n \"description\": \"Deregister the endpoint; deliveries stop. Idempotent.\",\n \"operationId\": \"deletePublicNotificationWebhook\",\n \"responses\": {\n \"204\": {\n \"description\": \"No content\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Remove the outbound webhook\",\n \"tags\": [\n \"Webhook\"\n ],\n \"x-min-scope\": \"admin\"\n },\n \"get\": {\n \"description\": \"The endpoint this workspace delivers notifications, run-lifecycle events and platform-health alerts to, or `{ \\\"webhook\\\": null }` when none is registered. The signing secret is never returned; `hasSecret` reports only whether one is set.\",\n \"operationId\": \"getPublicNotificationWebhook\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicNotificationWebhook\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Read the workspace's outbound webhook\",\n \"tags\": [\n \"Webhook\"\n ],\n \"x-min-scope\": \"admin\"\n },\n \"put\": {\n \"description\": \"Register the HTTPS endpoint deliveries are POSTed to, or update the one already registered. Every omitted field keeps its stored value, so subscribing to run events is a one-field call that re-sends neither the URL nor the secret. `url` is required only on the first call, when there is nothing registered to keep; omitting it otherwise leaves the endpoint alone. Supplying `secret` rotates the signing secret; omitting it keeps the current one. The endpoint must be `https:` and publicly routable unless the deployment widened its allow-list.\",\n \"operationId\": \"putPublicNotificationWebhook\",\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PutNotificationWebhook\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/NotificationWebhook\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Register or update the outbound webhook\",\n \"tags\": [\n \"Webhook\"\n ],\n \"x-min-scope\": \"admin\"\n }\n },\n \"/api/v1/notification-webhooks\": {\n \"get\": {\n \"description\": \"Every endpoint this workspace delivers to, ordered by id. The endpoint the unnamed routes address appears here under the id `default`. Not paginated: the number of endpoints a workspace may register is capped, so the whole set fits in one response. No signing secret is returned for any of them.\",\n \"operationId\": \"listPublicNotificationWebhooks\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicNotificationWebhookList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the workspace's outbound webhooks\",\n \"tags\": [\n \"Webhook\"\n ],\n \"x-min-scope\": \"admin\"\n }\n },\n \"/api/v1/notification-webhooks/{webhookId}\": {\n \"delete\": {\n \"description\": \"Deregister this endpoint; its deliveries stop and the workspace's other endpoints are untouched. Idempotent.\",\n \"operationId\": \"deletePublicNamedNotificationWebhook\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"webhookId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"204\": {\n \"description\": \"No content\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Remove one named outbound webhook\",\n \"tags\": [\n \"Webhook\"\n ],\n \"x-min-scope\": \"admin\"\n },\n \"get\": {\n \"description\": \"The endpoint registered under this id, or `{ \\\"webhook\\\": null }` when there is none \u2014 the same shape the unnamed read answers, so an integration's startup self-check does not branch on a status code. The signing secret is never returned.\",\n \"operationId\": \"getPublicNamedNotificationWebhook\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"webhookId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicNotificationWebhook\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Read one named outbound webhook\",\n \"tags\": [\n \"Webhook\"\n ],\n \"x-min-scope\": \"admin\"\n },\n \"put\": {\n \"description\": \"Register an endpoint under an id YOU choose (1-63 characters of lowercase letters, digits, `-` or `_`), or update the one already there. Idempotent by id, so an integration can enroll its own receiver on every cold start without tracking whether it has enrolled before, and without displacing anything else the workspace registered. Every field follows the same keep-on-omit rule as the unnamed route, `url` being required only when there is nothing under this id to keep, and a supplied `secret` rotating this endpoint's own signing secret. Refused with `reason: \\\"invalid_webhook_id\\\"` for an id that is not a slug, and `reason: \\\"webhook_limit_reached\\\"` (409) when registering a NEW id would exceed the per-workspace cap; editing an existing one is admitted either way.\",\n \"operationId\": \"putPublicNamedNotificationWebhook\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"webhookId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PutNotificationWebhook\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/NotificationWebhook\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Register or update one named outbound webhook\",\n \"tags\": [\n \"Webhook\"\n ],\n \"x-min-scope\": \"admin\"\n }\n },\n \"/api/v1/notifications\": {\n \"get\": {\n \"description\": \"List the open, human-actionable notifications in the key\u2019s workspace (merge reviews, pipeline-complete confirmations, CI/test failures, and informational cards).\",\n \"operationId\": \"listPublicNotifications\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicNotificationList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the workspace's open notifications\",\n \"tags\": [\n \"Notifications\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/notifications/{id}/act\": {\n \"post\": {\n \"description\": \"Run a notification\u2019s typed side-effect and resolve it: merge the PR (merge_review / pipeline_complete) or retry the run (ci_failed / test_failed). Performs a real GitHub merge, so it requires an admin-scoped key. Only these automated-action types are actionable through the API \u2014 a notification that parks a run on an interactive human decision cannot be acted on headlessly (dismiss it instead). A card that would retry a run on an individual-usage model likewise cannot be acted on through the API. To record how much review a merged pull request needed, call `POST /api/v1/merge-records/{recordId}/effort` (a `write` key) before or after this; a `merge_tag_request` card carries its record id on the payload and is resolved by tagging that record and dismissing the card.\",\n \"operationId\": \"actPublicNotification\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"reviewEffort\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"none\",\n \"minor\",\n \"major\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Notification\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Act on a notification\",\n \"tags\": [\n \"Notifications\"\n ],\n \"x-min-scope\": \"admin\"\n }\n },\n \"/api/v1/notifications/{id}/dismiss\": {\n \"post\": {\n \"description\": \"Dismiss a notification without acting on it.\",\n \"operationId\": \"dismissPublicNotification\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"id\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/Notification\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Dismiss a notification\",\n \"tags\": [\n \"Notifications\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/pipelines\": {\n \"get\": {\n \"description\": \"List the pipelines in the key\u2019s workspace \u2014 id/name/steps plus whether each is public and safe to run headlessly \u2014 so a caller can pick a pipelineId to start a task with.\",\n \"operationId\": \"listPublicPipelines\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicPipelineList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the workspace's pipelines\",\n \"tags\": [\n \"Pipelines\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/repos\": {\n \"get\": {\n \"description\": \"List the repositories the key\u2019s workspace has connected, each with the service that already backs it (null when nothing does, and always null for a monorepo, which can back several). The discovery half of service creation: the create takes a repoId, and this is where one comes from.\",\n \"operationId\": \"listPublicRepos\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"repos\": {\n \"items\": {\n \"properties\": {\n \"defaultBranch\": {\n \"type\": \"string\"\n },\n \"linkedElsewhere\": {\n \"type\": \"boolean\"\n },\n \"monorepo\": {\n \"type\": \"boolean\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"owner\": {\n \"type\": \"string\"\n },\n \"private\": {\n \"type\": \"boolean\"\n },\n \"provider\": {\n \"type\": \"string\"\n },\n \"repoId\": {\n \"type\": \"number\"\n },\n \"serviceId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"repoId\",\n \"provider\",\n \"owner\",\n \"name\",\n \"defaultBranch\",\n \"private\",\n \"monorepo\",\n \"serviceId\",\n \"linkedElsewhere\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"repos\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the repositories a service can be created against\",\n \"tags\": [\n \"Repos\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/runs/{runId}/artifacts\": {\n \"get\": {\n \"description\": \"The binary artifacts the run captured (UI screenshots) plus the reference images they were reviewed against: id, kind, view, content type, exact byte size and content hash. Unpaged: the capture path caps how many one run may store, so the response size is bounded before the request. Fetch the bytes with the blob endpoint.\",\n \"operationId\": \"listPublicRunArtifacts\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicRunArtifactList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a run's captured artifacts\",\n \"tags\": [\n \"Evidence\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/runs/{runId}/decisions\": {\n \"get\": {\n \"description\": \"Read what a run is currently asking a human. Each entry names its `kind`, and every kind this surface can answer is listed: `requirements-review`, `clarity-review`, `brainstorm`, `interview`, `input-gate`, `approval-gate`, `judge`, `fork`, `agent-decision`, `pr-review`, `human-test`, `visual-confirmation`, `follow-ups`. Each carries the stable ids (item, approval, decision, finding) that its answering route addresses. `parked` reports only whether the run has STOPPED (`status` is `blocked`); it is not a precondition for `decisions` being non-empty, since a `follow-ups` entry is answerable while the run is still working, so poll this regardless of `parked`. An empty `decisions` beside a non-empty `unanswerable` means a wait no route here can settle (a person reviewing the pull request, a deployment-registered gate), each named with its reason and step.\",\n \"operationId\": \"listPublicRunDecisions\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a run's parked decisions\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/approvals/{approvalId}/approve\": {\n \"post\": {\n \"description\": \"Approve the proposal a gated step is holding up, optionally replacing it with an edited one (the edit is what flows to every downstream step), and advance the run. The `approvalId` comes from the run's decision list; passing it back is what makes a racing app user and a racing integration resolve the same gate. Requires a `decide`-scope key.\",\n \"operationId\": \"approvePublicRunStep\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"approvalId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicApproveStep\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Approve a parked step\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/approvals/{approvalId}/reject\": {\n \"post\": {\n \"description\": \"Reject the gated proposal: the run stops entirely, recording a terminal `rejected` failure the board can retry. Requires a `decide`-scope key.\",\n \"operationId\": \"rejectPublicRunStep\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"approvalId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicRejectStep\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Reject a parked step\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/approvals/{approvalId}/request-changes\": {\n \"post\": {\n \"description\": \"Send the gated step back to re-run with your guidance folded in. Unlike the in-app twin this takes freeform feedback only: anchored per-block comments address source line ranges of a rendered proposal, which a headless caller never rendered. Requires a `decide`-scope key.\",\n \"operationId\": \"requestPublicRunStepChanges\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"approvalId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicRequestStepChanges\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Request changes on a parked step\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/approvals/{approvalId}/resolve-exceeded\": {\n \"post\": {\n \"description\": \"Pick how a quality companion that spent its automatic rework budget proceeds: one more round, proceed with the output as it stands, or stop and reset the task. A gate in this state reports `exceeded: true` and refuses the plain approve. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunStepExceeded\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"approvalId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicResolveExceeded\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Resolve a companion gate at its rework cap\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/brainstorm/{stage}/incorporate\": {\n \"post\": {\n \"description\": \"Fold the picks into one converged direction. ASYNCHRONOUS: the response shows the session `incorporating` while the durable driver folds and re-runs in the background. Requires a `decide`-scope key.\",\n \"operationId\": \"incorporatePublicRunBrainstorm\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"stage\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicIncorporate\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Incorporate brainstorm picks\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/brainstorm/{stage}/options/{itemId}\": {\n \"patch\": {\n \"description\": \"Dismiss a proposed option, or reopen one dismissed by mistake. Only `open` options block incorporation. Requires a `decide`-scope key.\",\n \"operationId\": \"setPublicRunBrainstormOptionStatus\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"stage\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicSetFindingStatus\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Dismiss or reopen a brainstorm option\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/brainstorm/{stage}/options/{itemId}/reply\": {\n \"post\": {\n \"description\": \"Pick or steer one of the options the brainstorm agent proposed, for the named stage (`requirements` or `architecture`). A task may hold one live session per stage at once. Requires a `decide`-scope key.\",\n \"operationId\": \"replyPublicRunBrainstormOption\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"stage\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicReplyFinding\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Respond to a brainstorm option\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/brainstorm/{stage}/proceed\": {\n \"post\": {\n \"description\": \"Settle the brainstorm with the last converged direction and advance the parked run. Requires a `decide`-scope key.\",\n \"operationId\": \"proceedPublicRunBrainstorm\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"stage\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Proceed past a brainstorm\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/brainstorm/{stage}/re-review\": {\n \"post\": {\n \"description\": \"Run one more brainstorm pass against the converged direction. Requires a `decide`-scope key.\",\n \"operationId\": \"reReviewPublicRunBrainstorm\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"stage\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Re-run a brainstorm pass\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/brainstorm/{stage}/resolve-exceeded\": {\n \"post\": {\n \"description\": \"Pick how a brainstorm that exhausted its pass budget proceeds: one more round, proceed with the last converged direction, or stop and reset the task. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunBrainstormExceeded\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"stage\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicResolveExceeded\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Resolve a brainstorm at its iteration cap\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/clarity/findings/{itemId}\": {\n \"patch\": {\n \"description\": \"Dismiss a clarity finding as not applicable, or reopen one dismissed by mistake. Only `open` findings block incorporation. Requires a `decide`-scope key.\",\n \"operationId\": \"setPublicRunClarityFindingStatus\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicSetFindingStatus\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Dismiss or reopen a clarity finding\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/clarity/findings/{itemId}/reply\": {\n \"post\": {\n \"description\": \"Record an answer to one clarity-review finding \u2014 the bug-report twin of the requirements loop. Returns the run's updated decision list. Requires a `decide`-scope key.\",\n \"operationId\": \"replyPublicRunClarityFinding\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicReplyFinding\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Answer a clarity (bug-triage) finding\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/clarity/incorporate\": {\n \"post\": {\n \"description\": \"Fold the recorded answers into one standardized bug report. ASYNCHRONOUS: the response shows the review `incorporating` while the durable driver folds and re-reviews in the background. Requires a `decide`-scope key.\",\n \"operationId\": \"incorporatePublicRunClarity\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicIncorporate\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Incorporate clarity answers\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/clarity/proceed\": {\n \"post\": {\n \"description\": \"Settle the clarity phase with the last clarified report and advance the parked run. Requires a `decide`-scope key.\",\n \"operationId\": \"proceedPublicRunClarity\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Proceed past the clarity review\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/clarity/re-review\": {\n \"post\": {\n \"description\": \"Run one more triage pass over the incorporated bug report. On convergence the parked run advances. Requires a `decide`-scope key.\",\n \"operationId\": \"reReviewPublicRunClarity\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Re-triage the clarified report\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/clarity/resolve-exceeded\": {\n \"post\": {\n \"description\": \"Pick how a clarity review that exhausted its pass budget proceeds: one more round, proceed with the last clarified report, or stop and reset the task. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunClarityExceeded\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicResolveExceeded\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Resolve a clarity review at its iteration cap\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/follow-ups/items/{itemId}/answer\": {\n \"post\": {\n \"description\": \"Answer one `question` item the Coder raised mid-run; the answer steers its next pass. Refused for a `follow_up` item, which is filed, sent back or dismissed instead. Requires a `decide`-scope key.\",\n \"operationId\": \"answerPublicRunFollowUp\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicAnswerFollowUp\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Answer a follow-up question\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/follow-ups/items/{itemId}/dismiss\": {\n \"post\": {\n \"description\": \"Wave one item off without acting on it. Valid for either item kind, and (like every other verb here) releases the park once it is the last undecided item. Requires a `decide`-scope key.\",\n \"operationId\": \"dismissPublicRunFollowUp\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Dismiss a follow-up item\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/follow-ups/items/{itemId}/file\": {\n \"post\": {\n \"description\": \"File one `follow_up` item on the workspace's issue tracker, recording the ticket ref on the item. Refused for a `question` item, and for a workspace with no tracker connected. Creating the issue is not idempotent, so a retry after a partial failure files a second one. Requires a `decide`-scope key.\",\n \"operationId\": \"filePublicRunFollowUp\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"File a follow-up item as an issue\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/follow-ups/items/{itemId}/send-back\": {\n \"post\": {\n \"description\": \"Fold one `follow_up` item into another Coder pass (the item records as `queued`). Once every item is decided the run loops the Coder for the ones sent back, within the `maxLoops` budget the decision reports. Requires a `decide`-scope key.\",\n \"operationId\": \"sendBackPublicRunFollowUp\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Send a follow-up item back to the Coder\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/fork/choose\": {\n \"post\": {\n \"description\": \"Pick one of the proposed implementation forks (by id) or submit your own approach. The Coder then runs with the choice folded in as a binding directive. Requires a `decide`-scope key.\",\n \"operationId\": \"choosePublicRunFork\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicChooseFork\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Choose an implementation approach\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/human-test/confirm\": {\n \"post\": {\n \"description\": \"Confirm the change works in the ephemeral environment: it is torn down and the run advances. The decision carries the environment URL to exercise; confirming without exercising it approves untested work. Requires a `decide`-scope key.\",\n \"operationId\": \"confirmPublicRunHumanTest\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Confirm a human-test gate\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/human-test/request-fix\": {\n \"post\": {\n \"description\": \"Submit findings against the tested environment and dispatch a fixer, which commits onto the PR branch before the environment is rebuilt. The findings ARE the fixer prompt, so they cannot be blank. Requires a `decide`-scope key.\",\n \"operationId\": \"requestPublicRunHumanTestFix\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicRequestGateFix\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Request a fix from a human-test gate\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/input-gate/resolve\": {\n \"post\": {\n \"description\": \"Settle a run the pre-dispatch input gate parked before its first agent step because the task states nothing an agent could act on. `recheck` re-evaluates the task as it now stands (edit it over `PATCH /api/v1/tasks/{taskId}` first: the fix is verified, not taken on trust) and releases the run only if the blocking findings are gone; a still-blocked verdict comes back as an ordinary 200 with refreshed findings. `proceed` waives the findings, which stay on the run as an `overridden` record. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunInputGate\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicResolveInputGate\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Resolve a run parked on the task's input check\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/interview/answer\": {\n \"post\": {\n \"description\": \"Record an answer to one question the parked interviewer asked. Does NOT resume the run: answer the batch, then `continue` or `proceed`. Requires a `decide`-scope key.\",\n \"operationId\": \"answerPublicRunInterview\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicAnswerInterview\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Answer an interview question\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/interview/continue\": {\n \"post\": {\n \"description\": \"Submit the recorded answers and resume: the interviewer runs again and may ask follow-up questions. ASYNCHRONOUS: the pass runs in the durable driver, so the next round arrives on a later read of the decision list. Requires a `decide`-scope key.\",\n \"operationId\": \"continuePublicRunInterview\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Continue a parked interview\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/interview/proceed\": {\n \"post\": {\n \"description\": \"Stop the questions: the interviewer converges on the answers so far and the run advances. Also asynchronous, since converging is itself an interviewer pass. Requires a `decide`-scope key.\",\n \"operationId\": \"proceedPublicRunInterview\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Proceed past a parked interview\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/judge/resolve\": {\n \"post\": {\n \"description\": \"Settle a run parked on a judge verdict: proceed anyway, bounce the producing step for rework, or stop the run. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunJudge\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"choice\": {\n \"enum\": [\n \"proceed\",\n \"bounce\",\n \"stop\"\n ],\n \"type\": \"string\"\n },\n \"feedback\": {\n \"anyOf\": [\n {\n \"maxLength\": 4000,\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"choice\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Resolve a parked judge verdict\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/pr-review/findings/{findingId}/challenge\": {\n \"post\": {\n \"description\": \"Dispatch a read-only investigator to re-examine one finding against the full source, optionally with a specific concern. It upholds, strengthens or retracts the finding, and the review re-parks carrying the verdict. Requires a `decide`-scope key.\",\n \"operationId\": \"challengePublicRunPrReviewFinding\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"findingId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicChallengePrReviewFinding\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Challenge a PR review finding\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/pr-review/findings/{findingId}/dismiss\": {\n \"post\": {\n \"description\": \"Drop one finding from the parked review entirely. Curation rather than a resolution: the run stays parked. Requires a `decide`-scope key.\",\n \"operationId\": \"dismissPublicRunPrReviewFinding\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"findingId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Dismiss a PR review finding\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/pr-review/resolve\": {\n \"post\": {\n \"description\": \"Record the curated finding selection and say what to do with it: `finish` completes the read-only review, `fix` hands the selected findings to a fixer that commits onto the reviewed PR branch, `post` publishes them as inline PR review comments. `fix` and `post` need at least one selected finding and act on the real pull request. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunPrReview\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicResolvePrReview\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Resolve a parked PR deep review\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/questions/{decisionId}/answer\": {\n \"post\": {\n \"description\": \"Answer a question an agent raised mid-work. Resolving RE-RUNS the asking step with the choice folded in, rather than advancing past it. The choice is taken verbatim, so it may be one of the offered options or a steer of your own. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunAgentDecision\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"decisionId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicResolveAgentDecision\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Answer an agent-raised decision\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/requirements/findings/{itemId}\": {\n \"patch\": {\n \"description\": \"Dismiss a finding as not applicable, or reopen one dismissed by mistake. Requires a `decide`-scope key.\",\n \"operationId\": \"setPublicRunFindingStatus\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicSetFindingStatus\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Dismiss or reopen a finding\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/requirements/findings/{itemId}/reply\": {\n \"post\": {\n \"description\": \"Record an answer to one reviewer finding. Returns the run's updated decision list. Requires a `decide`-scope key.\",\n \"operationId\": \"replyPublicRunFinding\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"path\",\n \"name\": \"itemId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicReplyFinding\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Answer a review finding\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/requirements/incorporate\": {\n \"post\": {\n \"description\": \"Fold the recorded answers into one standardized requirements document. Asynchronous \u2014 the run re-reviews in the background, so the response shows the review `incorporating`. Requires a `decide`-scope key.\",\n \"operationId\": \"incorporatePublicRunRequirements\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicIncorporate\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Incorporate the answers\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/requirements/proceed\": {\n \"post\": {\n \"description\": \"Settle the requirements phase and advance the parked run (used when nothing is outstanding). Requires a `decide`-scope key.\",\n \"operationId\": \"proceedPublicRunRequirements\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Proceed with the current requirements\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/requirements/re-review\": {\n \"post\": {\n \"description\": \"Run one more reviewer pass over the incorporated document. On convergence the parked run advances. Requires a `decide`-scope key.\",\n \"operationId\": \"reReviewPublicRunRequirements\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Re-review the incorporated document\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/requirements/resolve-exceeded\": {\n \"post\": {\n \"description\": \"Pick how a review that exhausted its reviewer-pass budget proceeds: one more round, proceed with the last incorporated document, or stop and reset the task. Requires a `decide`-scope key.\",\n \"operationId\": \"resolvePublicRunRequirementsExceeded\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicResolveExceeded\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Resolve a review at its iteration cap\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/visual-confirmation/approve\": {\n \"post\": {\n \"description\": \"Approve the captured screenshots against the reference designs and advance the run. The images themselves are not readable over this API \u2014 the decision carries only artifact ids \u2014 so approving on the projection alone approves screenshots you have not seen. Requires a `decide`-scope key.\",\n \"operationId\": \"approvePublicRunVisualConfirm\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Approve a visual-confirmation gate\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/decisions/visual-confirmation/request-fix\": {\n \"post\": {\n \"description\": \"Submit findings against the captured screenshots and dispatch a fixer. The findings ARE the fixer prompt, so they cannot be blank. Requires a `decide`-scope key.\",\n \"operationId\": \"requestPublicRunVisualConfirmFix\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicRequestGateFix\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicDecisionList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Request a fix from a visual-confirmation gate\",\n \"tags\": [\n \"Decisions\"\n ],\n \"x-min-scope\": \"decide\"\n }\n },\n \"/api/v1/runs/{runId}/merge-record\": {\n \"get\": {\n \"description\": \"What kind of change the run\u2019s pull request made (a change class derived on the backend from the changed-file list, never from an agent\u2019s opinion), what the merger scored it, which merge-threshold preset the decision was compared against, what ultimately happened to the pull request, and how much review a human spent if anybody has tagged it. The entry point of the merge-evidence loop for a caller holding a run id: it also hands back the `recordId` the effort-tag route takes. A run whose pipeline had no `merger` step made no merge decision and answers `404` with `details.reason: \\\"no_merge_record\\\"`, distinct from the `\\\"run_not_found\\\"` a run this key cannot read gets.\",\n \"operationId\": \"getPublicRunMergeRecord\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"changeClass\": {\n \"enum\": [\n \"docs\",\n \"test\",\n \"dependency\",\n \"config\",\n \"source\",\n \"schema\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"changedFileCount\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"complexity\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"createdAt\": {\n \"type\": \"number\"\n },\n \"decision\": {\n \"enum\": [\n \"pending_review\",\n \"auto_merged\",\n \"human_merged\",\n \"external_merged\",\n \"rejected\"\n ],\n \"type\": \"string\"\n },\n \"impact\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"mergePresetId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"mergePresetName\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"prNumber\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"prUrl\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"provider\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"github\",\n \"gitlab\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"recordId\": {\n \"type\": \"string\"\n },\n \"repoId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"resolvedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"reviewEffort\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"none\",\n \"minor\",\n \"major\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"risk\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"runId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"taggedAt\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"taskId\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"recordId\",\n \"taskId\",\n \"runId\",\n \"changeClass\",\n \"changedFileCount\",\n \"complexity\",\n \"risk\",\n \"impact\",\n \"mergePresetId\",\n \"mergePresetName\",\n \"decision\",\n \"reviewEffort\",\n \"prNumber\",\n \"prUrl\",\n \"repoId\",\n \"provider\",\n \"createdAt\",\n \"resolvedAt\",\n \"taggedAt\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get the merge decision a run left behind\",\n \"tags\": [\n \"Merge records\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/runs/{runId}/outcome\": {\n \"get\": {\n \"description\": \"What the run changed and what backs that up, in product language, for a reader who will not open the diff: the run\u2019s disposition, the pull requests it opened, requirement coverage joined to the service\u2019s `spec/`, the tester\u2019s verdict and concerns, the views it captured, and the machine checks that ran. The same reduction the app\u2019s outcome card renders, over the same evidence the verification report is built from, so the two cannot state different totals for one run. Nothing here is asserted by a model: every count is derived from recorded verdicts. Prefer the verification report when you need a reviewer\u2019s full bundle; prefer this when you need to say what shipped. Sections state `reported` or `absent` with a machine-readable gap code, and `truncations` names any list the response had to bound.\",\n \"operationId\": \"getPublicRunOutcome\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"ask\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"checks\": {\n \"items\": {\n \"properties\": {\n \"kind\": {\n \"enum\": [\n \"ci\",\n \"validation\",\n \"reproduction\"\n ],\n \"type\": \"string\"\n },\n \"reproduction\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"reproduced\",\n \"inconclusive\",\n \"declared_infeasible\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"state\": {\n \"enum\": [\n \"pass\",\n \"fail\",\n \"pending\",\n \"inconclusive\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"kind\",\n \"state\",\n \"reproduction\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"disposition\": {\n \"enum\": [\n \"merged\",\n \"awaiting_merge\",\n \"in_flight\",\n \"needs_attention\",\n \"not_run\",\n \"unknown\"\n ],\n \"type\": \"string\"\n },\n \"pullRequests\": {\n \"items\": {\n \"properties\": {\n \"branch\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"number\": {\n \"anyOf\": [\n {\n \"type\": \"number\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"repo\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"url\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"url\",\n \"number\",\n \"branch\",\n \"repo\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"requirements\": {\n \"oneOf\": [\n {\n \"properties\": {\n \"gap\": {\n \"enum\": [\n \"run_unavailable\",\n \"no_tester_step\",\n \"tester_not_reported\",\n \"no_verdicts\",\n \"no_requirements\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"absent\"\n }\n },\n \"required\": [\n \"status\",\n \"gap\"\n ],\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"entries\": {\n \"items\": {\n \"properties\": {\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"id\": {\n \"type\": \"string\"\n },\n \"regression\": {\n \"type\": \"boolean\"\n },\n \"state\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"aspirational\",\n \"established\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"title\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"verdict\": {\n \"enum\": [\n \"met\",\n \"not_met\",\n \"not_covered\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"title\",\n \"verdict\",\n \"detail\",\n \"state\",\n \"regression\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"met\": {\n \"type\": \"number\"\n },\n \"notCovered\": {\n \"type\": \"number\"\n },\n \"notMet\": {\n \"type\": \"number\"\n },\n \"regressions\": {\n \"type\": \"number\"\n },\n \"spec\": {\n \"enum\": [\n \"joined\",\n \"not_read\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"reported\"\n },\n \"total\": {\n \"type\": \"number\"\n },\n \"unmatchedVerdicts\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"status\",\n \"spec\",\n \"met\",\n \"notMet\",\n \"notCovered\",\n \"regressions\",\n \"total\",\n \"unmatchedVerdicts\",\n \"entries\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"sources\": {\n \"oneOf\": [\n {\n \"properties\": {\n \"gap\": {\n \"enum\": [\n \"run_unavailable\",\n \"none_linked\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"absent\"\n }\n },\n \"required\": [\n \"status\",\n \"gap\"\n ],\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"sources\": {\n \"items\": {\n \"properties\": {\n \"freshness\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/components/schemas/DocumentFreshness\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"movedDuringRun\": {\n \"type\": \"boolean\"\n },\n \"origin\": {\n \"enum\": [\n \"confluence\",\n \"notion\",\n \"github\",\n \"figma\",\n \"zeplin\",\n \"linear\",\n \"upload\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"title\",\n \"url\",\n \"origin\",\n \"freshness\",\n \"movedDuringRun\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"status\": {\n \"const\": \"reported\"\n }\n },\n \"required\": [\n \"status\",\n \"sources\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"tests\": {\n \"oneOf\": [\n {\n \"properties\": {\n \"gap\": {\n \"enum\": [\n \"run_unavailable\",\n \"no_tester_step\",\n \"tester_not_reported\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"absent\"\n }\n },\n \"required\": [\n \"status\",\n \"gap\"\n ],\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"abortReason\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"areas\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"concerns\": {\n \"items\": {\n \"properties\": {\n \"severity\": {\n \"enum\": [\n \"low\",\n \"medium\",\n \"high\",\n \"critical\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"title\",\n \"severity\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"environment\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"local\",\n \"ephemeral\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"failed\": {\n \"type\": \"number\"\n },\n \"passed\": {\n \"type\": \"number\"\n },\n \"skipped\": {\n \"type\": \"number\"\n },\n \"status\": {\n \"const\": \"reported\"\n },\n \"summary\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"verdict\": {\n \"enum\": [\n \"greenlit\",\n \"concerns\",\n \"could_not_run\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"status\",\n \"verdict\",\n \"summary\",\n \"abortReason\",\n \"areas\",\n \"passed\",\n \"failed\",\n \"skipped\",\n \"concerns\",\n \"environment\"\n ],\n \"type\": \"object\"\n }\n ]\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"truncations\": {\n \"items\": {\n \"type\": \"string\"\n },\n \"type\": \"array\"\n },\n \"version\": {\n \"type\": \"number\"\n },\n \"visuals\": {\n \"oneOf\": [\n {\n \"properties\": {\n \"detail\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"gap\": {\n \"enum\": [\n \"run_unavailable\",\n \"no_visual_step\",\n \"none_captured\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"absent\"\n }\n },\n \"required\": [\n \"status\",\n \"gap\",\n \"detail\"\n ],\n \"type\": \"object\"\n },\n {\n \"properties\": {\n \"phase\": {\n \"anyOf\": [\n {\n \"enum\": [\n \"awaiting_human\",\n \"fixing\",\n \"approved\"\n ],\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"source\": {\n \"enum\": [\n \"visual_confirm\",\n \"tester\"\n ],\n \"type\": \"string\"\n },\n \"status\": {\n \"const\": \"reported\"\n },\n \"views\": {\n \"items\": {\n \"properties\": {\n \"artifactId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"referenceArtifactId\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n },\n \"view\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"view\",\n \"artifactId\",\n \"referenceArtifactId\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"status\",\n \"source\",\n \"phase\",\n \"views\"\n ],\n \"type\": \"object\"\n }\n ]\n }\n },\n \"required\": [\n \"version\",\n \"disposition\",\n \"title\",\n \"ask\",\n \"pullRequests\",\n \"requirements\",\n \"tests\",\n \"visuals\",\n \"sources\",\n \"checks\",\n \"truncations\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get a run's outcome summary\",\n \"tags\": [\n \"Evidence\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/runs/{runId}/report\": {\n \"get\": {\n \"description\": \"The engine\u2019s bundle of CAPTURED FACTS about a run: the CI gate\u2019s verdict and failing checks, the platform\u2019s own run of the service\u2019s lint/test/build commands (with the failing output), the red-then-green reproduction proof for a bugfix, the tester\u2019s structured report, requirement coverage, the throwaway-environment lifecycle, judge verdicts and the merge decision. Byte-for-byte the JSON block the pull-request body carries, composed on read, so it also answers for a run that never opened a pull request. Each section states `reported` or `absent` with a note, so a step that did not run never looks like a step that found nothing.\",\n \"operationId\": \"getPublicRunReport\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"runId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PrVerificationReport\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get a run's verification report\",\n \"tags\": [\n \"Evidence\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/services\": {\n \"get\": {\n \"description\": \"List the board service frames in the key\u2019s workspace, so a caller can discover the serviceId to create/list tasks under.\",\n \"operationId\": \"listPublicServices\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicServiceList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the workspace's services\",\n \"tags\": [\n \"Services\"\n ],\n \"x-min-scope\": \"read\"\n },\n \"post\": {\n \"description\": \"Create a board service, optionally backed by a repository from `GET /api/v1/repos`. The repository link is what makes the service runnable: execution resolves a task\u2019s repository by walking up to its enclosing service frame, so a service with none holds tasks and can start none of them. A whole-repo repository that already backs a service in this account is MOUNTED rather than duplicated; a monorepo service must name its subdirectory. The board lays the service out itself: this surface publishes no coordinates. Requires an `admin` key.\",\n \"operationId\": \"createPublicService\",\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"description\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"repo\": {\n \"properties\": {\n \"directory\": {\n \"maxLength\": 400,\n \"type\": \"string\"\n },\n \"monorepo\": {\n \"type\": \"boolean\"\n },\n \"repoId\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"repoId\"\n ],\n \"type\": \"object\"\n },\n \"title\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"type\": {\n \"enum\": [\n \"service\",\n \"frontend\",\n \"library\",\n \"document\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"201\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicService\"\n }\n }\n },\n \"description\": \"Created\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Create a service\",\n \"tags\": [\n \"Services\"\n ],\n \"x-min-scope\": \"admin\"\n }\n },\n \"/api/v1/services/{serviceId}/spec\": {\n \"get\": {\n \"description\": \"The prescriptive specification stored in the service\u2019s own repository under `spec/`: modules \u2192 feature groups \u2192 requirement items, each with its MoSCoW priority, its `aspirational`/`established` implementation state and its Given/When/Then acceptance criteria, plus the domain rules scoped to each group and the Gherkin `.feature` files rendered from the same tree. `provenance` names the branch and commit the read describes, because the default branch is not what a run with an open pull request is working against. The requirement ids here are the join key onto `requirements` on a run\u2019s report and outcome, so criterion \u2192 evidence is a map lookup. Four outcomes are kept apart rather than folded: `present: false` means the default branch holds no spec, a `503` with `reason: \\\"spec_read_failed\\\"` means the repository could not be read, a `503` with `reason: \\\"vcs_not_configured\\\"` means the deployment or workspace wired no version control, and a partially readable spec is SERVED with `issues` naming each file that did not survive. Read-only: the spec\u2019s write path is a reviewed commit.\",\n \"operationId\": \"getPublicServiceSpec\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"serviceId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicServiceSpec\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get a service's in-repo specification\",\n \"tags\": [\n \"Spec\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/services/{serviceId}/tasks\": {\n \"get\": {\n \"description\": \"List every task under a service (the whole subtree \u2014 tasks directly under the frame and under its modules).\",\n \"operationId\": \"listPublicServiceTasks\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"serviceId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 100,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"cursor\",\n \"required\": false,\n \"schema\": {\n \"maxLength\": 200,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"status\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"planned\",\n \"ready\",\n \"in_progress\",\n \"blocked\",\n \"pr_ready\",\n \"done\"\n ],\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTaskList\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a service's tasks\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"read\"\n },\n \"post\": {\n \"description\": \"Create a task inside a service frame the key\u2019s workspace owns. The task starts in the `planned` state; start it with the start endpoint. Optionally file it FROM a tracker ticket, and/or attach the requirements documents it is to be built against (named in a connected document source, or uploaded inline): the only way to get spec-sized input onto a repository-touching run.\",\n \"operationId\": \"createPublicTask\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"serviceId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/CreatePublicTask\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"201\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Created\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Create a task under a service\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/task-types\": {\n \"get\": {\n \"description\": \"List the task types a task can be created as in the key\u2019s workspace (the built-in ones plus any the deployment registered), each with the fields it accepts. Fill those fields through `fields` on task creation; the descriptors here are what that call validates against, so a caller reads the form rather than guessing it. A type a workspace admin has hidden is absent.\",\n \"operationId\": \"listPublicTaskTypes\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"taskTypes\": {\n \"items\": {\n \"properties\": {\n \"builtin\": {\n \"type\": \"boolean\"\n },\n \"category\": {\n \"type\": \"string\"\n },\n \"defaultPipelineId\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"fields\": {\n \"items\": {\n \"properties\": {\n \"default\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"defaultValues\": {\n \"items\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\n },\n \"maxItems\": 50,\n \"type\": \"array\"\n },\n \"help\": {\n \"maxLength\": 300,\n \"type\": \"string\"\n },\n \"key\": {\n \"maxLength\": 80,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"label\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"max\": {\n \"type\": \"number\"\n },\n \"maxLength\": {\n \"maximum\": 2000,\n \"minimum\": 1,\n \"type\": \"integer\"\n },\n \"min\": {\n \"type\": \"number\"\n },\n \"options\": {\n \"items\": {\n \"properties\": {\n \"label\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"value\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"value\",\n \"label\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"placeholder\": {\n \"maxLength\": 200,\n \"type\": \"string\"\n },\n \"required\": {\n \"type\": \"boolean\"\n },\n \"section\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"showWhen\": {\n \"properties\": {\n \"equals\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"boolean\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"includes\": {\n \"type\": \"string\"\n },\n \"key\": {\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"key\"\n ],\n \"type\": \"object\"\n },\n \"type\": {\n \"enum\": [\n \"text\",\n \"password\",\n \"select\",\n \"number\",\n \"checkbox\",\n \"textarea\",\n \"checkbox-group\",\n \"path\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"key\",\n \"label\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"taskType\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"taskType\",\n \"builtin\",\n \"label\",\n \"fields\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"taskTypes\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List the task types this workspace may create\",\n \"tags\": [\n \"Task types\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/tasks/{taskId}\": {\n \"delete\": {\n \"description\": \"Delete a task and its run history. Destructive, so it sits at the top of the scope ladder: requires an `admin`-scoped key.\",\n \"operationId\": \"deletePublicTask\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"204\": {\n \"description\": \"No content\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Delete a task\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"admin\"\n },\n \"get\": {\n \"description\": \"Read a task\u2019s current lifecycle status, run progress, run id, and PR URL (once one exists).\",\n \"operationId\": \"getPublicTask\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get a task's status\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"read\"\n },\n \"patch\": {\n \"description\": \"Edit a task\u2019s human-authored inputs before it runs: its title, its description, and `fields`, the per-case values for its own task type (checked against the descriptors `GET /api/v1/task-types` serves). All are optional. `fields` is MERGED over what the task already carries \u2014 a key you send is written, a key you omit keeps its stored value \u2014 because this API does not serve the bag back. This is what makes an input the pre-dispatch gate refused repairable: supply the value it named, then recheck the parked run.\",\n \"operationId\": \"updatePublicTask\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/UpdatePublicTask\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Edit a task's inputs\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/tasks/{taskId}/dependencies\": {\n \"post\": {\n \"description\": \"Record that this task cannot start until `dependsOnTaskId` is done. Both ends must be tasks in this workspace, and an edge that would close a cycle is refused. Idempotent: an edge that already exists is returned as-is rather than toggled off, so a provisioning integration re-running its own setup converges. Pair it with `autoStartDependents` on the BLOCKER (the task patch) to have the chain run itself.\",\n \"operationId\": \"addPublicTaskDependency\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"dependsOnTaskId\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"dependsOnTaskId\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Declare that a task waits for another\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/tasks/{taskId}/dependencies/remove\": {\n \"post\": {\n \"description\": \"Remove the ordering between this task and `dependsOnTaskId`. Idempotent: an edge that is not there is a no-op.\",\n \"operationId\": \"removePublicTaskDependency\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"dependsOnTaskId\": {\n \"maxLength\": 120,\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"dependsOnTaskId\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Drop a dependency edge\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/tasks/{taskId}/documents\": {\n \"get\": {\n \"description\": \"The requirements documents attached to the task, in the order the agents read them. Each is identified by the `(source, externalId)` pair the attach and detach calls take.\",\n \"operationId\": \"listPublicTaskDocuments\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"documents\": {\n \"items\": {\n \"properties\": {\n \"excerpt\": {\n \"type\": \"string\"\n },\n \"externalId\": {\n \"type\": \"string\"\n },\n \"source\": {\n \"enum\": [\n \"confluence\",\n \"notion\",\n \"github\",\n \"figma\",\n \"zeplin\",\n \"linear\",\n \"upload\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"source\",\n \"externalId\",\n \"title\",\n \"url\",\n \"excerpt\"\n ],\n \"type\": \"object\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"documents\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"List a task's attached documents\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"read\"\n },\n \"post\": {\n \"description\": \"Attach a requirements document to a task that already exists, in either of the two forms creation takes: NAME a page in a connected document source, or CARRY the text inline. A task\u2019s spec routinely arrives after the task does, and before this the only way to attach one was to delete the task and file it again, losing the id every stored reference points at, its ticket claim and the documents it already carried. A document a different live task already holds is refused rather than moved.\",\n \"operationId\": \"attachPublicTaskDocument\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"document\": {\n \"$ref\": \"#/components/schemas/PublicTaskDocument\"\n }\n },\n \"required\": [\n \"document\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"201\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"excerpt\": {\n \"type\": \"string\"\n },\n \"externalId\": {\n \"type\": \"string\"\n },\n \"source\": {\n \"enum\": [\n \"confluence\",\n \"notion\",\n \"github\",\n \"figma\",\n \"zeplin\",\n \"linear\",\n \"upload\"\n ],\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"url\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"source\",\n \"externalId\",\n \"title\",\n \"url\",\n \"excerpt\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"description\": \"Created\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Attach a document to a task\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/tasks/{taskId}/documents/detach\": {\n \"post\": {\n \"description\": \"Detach a document, naming it by the `(source, externalId)` pair the list serves. The document itself survives in the workspace, so re-attaching it later costs no re-import. Idempotent: detaching one the task does not hold is a no-op.\",\n \"operationId\": \"detachPublicTaskDocument\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"properties\": {\n \"externalId\": {\n \"maxLength\": 500,\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"source\": {\n \"enum\": [\n \"confluence\",\n \"notion\",\n \"github\",\n \"figma\",\n \"zeplin\",\n \"linear\",\n \"upload\"\n ],\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"source\",\n \"externalId\"\n ],\n \"type\": \"object\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"204\": {\n \"description\": \"No content\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Detach a document from a task\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/tasks/{taskId}/events\": {\n \"get\": {\n \"description\": \"Server-sent events for a board task run: `progress` frames (the rich run projection) until a terminal `done`/`error` event, or a `timeout` when the connection cap is reached. Authenticated by the API key header.\",\n \"operationId\": \"streamPublicTaskRun\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"text/event-stream\": {\n \"schema\": {\n \"type\": \"string\"\n }\n }\n },\n \"description\": \"An event stream of run updates\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n }\n },\n \"summary\": \"Stream a task run (SSE)\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/tasks/{taskId}/retry\": {\n \"post\": {\n \"description\": \"Retry a task\u2019s failed run. A task on an individual-usage model cannot be retried through the API (no headless personal-credential unlock).\",\n \"operationId\": \"retryPublicTask\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"202\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Accepted \u2014 the run has started\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Retry a task's failed run\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/tasks/{taskId}/run\": {\n \"get\": {\n \"description\": \"Read a task\u2019s run in detail: per-step status/progress/subtasks, the failure kind and message, and the PR (url + branch).\",\n \"operationId\": \"getPublicRun\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicRun\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Get a task's run (rich projection)\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/tasks/{taskId}/start\": {\n \"post\": {\n \"description\": \"Start a task\u2019s pipeline. Uses the request\u2019s pipelineId, else the task\u2019s pinned pipeline. A pipeline that can park on a human decision requires a `decide`-scope key. A task on an individual-usage model cannot be started through the API (no headless personal-credential unlock).\",\n \"operationId\": \"startPublicTask\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"requestBody\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/StartPublicTask\"\n }\n }\n },\n \"required\": true\n },\n \"responses\": {\n \"202\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Accepted \u2014 the run has started\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Start (run) a task\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/tasks/{taskId}/stop\": {\n \"post\": {\n \"description\": \"Stop a task\u2019s in-flight run. Records a `cancelled` terminal state, leaving the run retryable.\",\n \"operationId\": \"stopPublicTask\",\n \"parameters\": [\n {\n \"in\": \"path\",\n \"name\": \"taskId\",\n \"required\": true,\n \"schema\": {\n \"type\": \"string\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicTask\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Stop a task's run\",\n \"tags\": [\n \"Tasks\"\n ],\n \"x-min-scope\": \"write\"\n }\n },\n \"/api/v1/usage\": {\n \"get\": {\n \"description\": \"Read this billing period\u2019s METERED spend against the workspace budget (including whether it is exceeded, which pauses runs) plus the per-(billing, vendor, provider, model) token breakdown behind it. Costs on `subscription` rows are illustrative \u2014 a flat-rate plan bills nothing per token \u2014 so branch on `billing` before summing. Workspace-scoped: the account- and user-tier budgets are not reachable through this surface.\",\n \"operationId\": \"getPublicUsage\",\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicUsage\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Read the workspace's usage for the current period\",\n \"tags\": [\n \"Usage\"\n ],\n \"x-min-scope\": \"read\"\n }\n },\n \"/api/v1/usage/spend\": {\n \"get\": {\n \"description\": \"Group the board\u2019s spend over a window (`24h`, `7d`, `30d`, `90d`) by ONE dimension: `repo`, `ticket` and `run` are the cost-attribution axes an organisation budgets against, and `model` / `agentKind` / `service` / `taskType` slice the same money the other ways. `meteredCost` is real money and `subscriptionCost` is the illustrative equivalent-API cost of flat-rate quota usage, so never sum them. The EMPTY `key` is the unattributed bucket, a real slice rather than a dropped row, never dropped from the breakdown. `rows` is the heaviest `limit` slices (default 100, max 500) and `truncated` says when there was a tail, while `totals` aggregates the WHOLE window either way, so a capped answer still reports what the board spent. `source` says which store answered: the short windows scan the live ledger, which resolves a repository or a ticket through today\u2019s links, while the long ones read the durable daily rollup, which froze that attribution while the money was spent and is never pruned. Read `rolledUpThrough` before reporting a quiet quarter, since a rollup that has never run and a board that spent nothing look identical. Workspace-scoped: the account-wide view is not reachable through this surface.\",\n \"operationId\": \"getPublicSpend\",\n \"parameters\": [\n {\n \"in\": \"query\",\n \"name\": \"dimension\",\n \"required\": true,\n \"schema\": {\n \"enum\": [\n \"model\",\n \"agentKind\",\n \"service\",\n \"repo\",\n \"taskType\",\n \"ticket\",\n \"run\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"window\",\n \"required\": false,\n \"schema\": {\n \"enum\": [\n \"24h\",\n \"7d\",\n \"30d\",\n \"90d\"\n ],\n \"type\": \"string\"\n }\n },\n {\n \"in\": \"query\",\n \"name\": \"limit\",\n \"required\": false,\n \"schema\": {\n \"maximum\": 500,\n \"minimum\": 1,\n \"pattern\": \"^\\\\d+$\",\n \"type\": \"integer\"\n }\n }\n ],\n \"responses\": {\n \"200\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/PublicSpend\"\n }\n }\n },\n \"description\": \"Success\"\n },\n \"4XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Client error (validation, unauthorized, not found, conflict, rate limit)\"\n },\n \"5XX\": {\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/ErrorResponse\"\n }\n }\n },\n \"description\": \"Server error\"\n }\n },\n \"summary\": \"Break the workspace's spend down by repository, ticket, run or step kind\",\n \"tags\": [\n \"Usage\"\n ],\n \"x-min-scope\": \"read\"\n }\n }\n },\n \"security\": [\n {\n \"bearerAuth\": []\n }\n ],\n \"servers\": [\n {\n \"description\": \"The deployment base URL\",\n \"url\": \"/\"\n }\n ],\n \"tags\": [\n {\n \"description\": \"A run\u2019s recorded telemetry, for diagnosing one that went wrong: the model calls it made, the context each agent was provided, the searches it ran, the tools it invoked and how its infrastructure came up. Read-only (`read` scope), and every response\u2019s size is bounded before the request is made.\",\n \"name\": \"Debug\"\n },\n {\n \"description\": \"A run\u2019s human decisions, from requirement-review and clarity findings through approval gates, judge verdicts, interviews and follow-ups, so a headless caller can drive the clarification loop instead of the run hanging. Answering requires a `decide`-scope key.\",\n \"name\": \"Decisions\"\n },\n {\n \"description\": \"What a run PROVED: the engine\u2019s own verification report (the same bundle it writes onto the pull request) and the binary artifacts the run captured, bytes included. The surface for a consumer that has to judge a run (accept the change, score the fleet) rather than debug one. Read-only (`read` scope).\",\n \"name\": \"Evidence\"\n },\n {\n \"description\": \"What the calling key is and what it may do \u2014 the self-check an integration runs at startup, so \u201Ccan I do this?\u201D does not have to be answered by attempting it and reading the 403. `read` scope.\",\n \"name\": \"Identity\"\n },\n {\n \"description\": \"Headless runs of a public, inline pipeline (start, poll, stream).\",\n \"name\": \"Jobs\"\n },\n {\n \"description\": \"The workspace\u2019s public-API keys, provisioned headlessly. Requires an `admin`-scope key; a key minted here can never reach `admin` itself, and revoking a key revokes everything it minted.\",\n \"name\": \"Keys\"\n },\n {\n \"name\": \"Merge records\"\n },\n {\n \"description\": \"The workspace\u2019s human-actionable notifications (list, act on, or dismiss the run tails).\",\n \"name\": \"Notifications\"\n },\n {\n \"description\": \"The workspace\u2019s pipelines (discover a pipelineId to start a task with).\",\n \"name\": \"Pipelines\"\n },\n {\n \"name\": \"Repos\"\n },\n {\n \"description\": \"The workspace\u2019s board services.\",\n \"name\": \"Services\"\n },\n {\n \"name\": \"Spec\"\n },\n {\n \"name\": \"Task types\"\n },\n {\n \"description\": \"Board tasks under a service (create, list, read, edit, start, stop, retry, stream).\",\n \"name\": \"Tasks\"\n },\n {\n \"name\": \"Usage\"\n },\n {\n \"description\": \"The workspace\u2019s one outbound endpoint: register it to receive notifications, run-lifecycle events and platform-health alerts by push instead of polling. Requires an `admin`-scope key; the signing secret is write-only.\",\n \"name\": \"Webhook\"\n }\n ],\n \"x-public-api-scopes\": [\n \"read\",\n \"write\",\n \"decide\",\n \"admin\"\n ]\n}\n";
|
|
2
2
|
//# sourceMappingURL=openapiDocument.generated.d.ts.map
|