@cat-factory/server 0.239.0 → 0.239.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/config/types.d.ts +3 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/github/runInitiatorContext.d.ts.map +1 -1
- package/dist/github/runInitiatorContext.js.map +1 -1
- package/dist/modules/publicApi/PublicDecisionController.js +1 -1
- package/dist/modules/publicApi/PublicDecisionController.js.map +1 -1
- package/dist/modules/publicApi/PublicEvidenceController.d.ts.map +1 -1
- package/dist/modules/publicApi/PublicEvidenceController.js +4 -3
- package/dist/modules/publicApi/PublicEvidenceController.js.map +1 -1
- package/dist/modules/publicApi/PublicKeyController.d.ts.map +1 -1
- package/dist/modules/publicApi/PublicKeyController.js +3 -2
- package/dist/modules/publicApi/PublicKeyController.js.map +1 -1
- 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/dist/modules/publicApi/publicApiAdmission.d.ts +6 -5
- package/dist/modules/publicApi/publicApiAdmission.d.ts.map +1 -1
- package/dist/modules/publicApi/publicApiAdmission.js +6 -5
- package/dist/modules/publicApi/publicApiAdmission.js.map +1 -1
- package/package.json +8 -8
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
// `GET /api/v1/openapi.json` can hand it back on a facade with no filesystem. A single string
|
|
5
5
|
// rather than an object: the endpoint serves bytes, so nothing re-serialises it, and a 360 KB
|
|
6
6
|
// object literal would cost every typecheck its structural check for nothing.
|
|
7
|
-
export const OPENAPI_JSON = "{\n \"components\": {\n \"schemas\": {\n \"CreateHeadlessPublicApiKey\": {\n \"properties\": {\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 \"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 \"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 \"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 \"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 },\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 \"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 \"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 \"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 \"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 \"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 \"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 \"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 \"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 \"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 \"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 \"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 },\n \"required\": [\n \"agentKind\",\n \"state\",\n \"progress\",\n \"subtasks\"\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 \"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 \"view\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"artifactId\",\n \"kind\",\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 \"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 \"PublicTask\": {\n \"properties\": {\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 ],\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 ],\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 \"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 \"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 \"description\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\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’s workspace.\",\n \"license\": {\n \"identifier\": \"MIT\",\n \"name\": \"MIT\"\n },\n \"title\": \"cat-factory Public API\",\n \"version\": \"1.21.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’s 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 }\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 }\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 }\n },\n \"/api/v1/debug/runs\": {\n \"get\": {\n \"description\": \"The triage entry point: the workspace’s 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 }\n },\n \"/api/v1/debug/runs/{runId}\": {\n \"get\": {\n \"description\": \"One run’s 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 \"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 \"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 }\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 }\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 }\n },\n \"/api/v1/debug/runs/{runId}/logs\": {\n \"get\": {\n \"description\": \"The run’s provisioning event log — 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 }\n },\n \"/api/v1/debug/runs/{runId}/search-queries\": {\n \"get\": {\n \"description\": \"The web searches the run’s 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 }\n },\n \"/api/v1/debug/runs/{runId}/tool-calls\": {\n \"get\": {\n \"description\": \"The tool calls the run’s agents made, in the order they made them — which command, against what, and what came back. The half of “how did this diff come about” 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 }\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’s 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 },\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 — 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 }\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 }\n },\n \"/api/v1/jobs/{id}/cancel\": {\n \"post\": {\n \"description\": \"Stop a headless job run, freeing its concurrency slot. Idempotent — 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 }\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 }\n },\n \"/api/v1/keys\": {\n \"get\": {\n \"description\": \"The live (non-revoked) keys for the calling key’s 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 },\n \"post\": {\n \"description\": \"Mint a key for the calling key’s 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 }\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 }\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’s startup self-check has to work whatever rung it holds. The scope ladder is INCLUSIVE (`read` ⊂ `write` ⊂ `decide` ⊂ `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 }\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 },\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 },\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 }\n },\n \"/api/v1/notifications\": {\n \"get\": {\n \"description\": \"List the open, human-actionable notifications in the key’s 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 }\n },\n \"/api/v1/notifications/{id}/act\": {\n \"post\": {\n \"description\": \"Run a notification’s 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 — 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.\",\n \"operationId\": \"actPublicNotification\",\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\": \"Act on a notification\",\n \"tags\": [\n \"Notifications\"\n ]\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 }\n },\n \"/api/v1/pipelines\": {\n \"get\": {\n \"description\": \"List the pipelines in the key’s workspace — id/name/steps plus whether each is public and safe to run headlessly — 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 }\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 }\n },\n \"/api/v1/runs/{runId}/decisions\": {\n \"get\": {\n \"description\": \"Read what a run is currently asking a human: requirement-review findings (with the stable item ids a reply addresses) and any implementation-fork choice. `parked` is true while the run is blocked awaiting one of them.\",\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\n },\n \"/api/v1/runs/{runId}/decisions/clarity/findings/{itemId}/reply\": {\n \"post\": {\n \"description\": \"Record an answer to one clarity-review finding — 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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\n },\n \"/api/v1/runs/{runId}/decisions/requirements/incorporate\": {\n \"post\": {\n \"description\": \"Fold the recorded answers into one standardized requirements document. Asynchronous — 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 }\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 }\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 }\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 }\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 — the decision carries only artifact ids — 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 }\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 }\n },\n \"/api/v1/runs/{runId}/report\": {\n \"get\": {\n \"description\": \"The engine’s bundle of CAPTURED FACTS about a run: the CI gate’s verdict and failing checks, the platform’s own run of the service’s lint/test/build commands (with the failing output), the red-then-green reproduction proof for a bugfix, the tester’s 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 }\n },\n \"/api/v1/services\": {\n \"get\": {\n \"description\": \"List the board service frames in the key’s 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 }\n },\n \"/api/v1/services/{serviceId}/tasks\": {\n \"get\": {\n \"description\": \"List every task under a service (the whole subtree — 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 },\n \"post\": {\n \"description\": \"Create a task inside a service frame the key’s 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 }\n },\n \"/api/v1/task-types\": {\n \"get\": {\n \"description\": \"List the task types a task can be created as in the key’s 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 }\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 },\n \"get\": {\n \"description\": \"Read a task’s 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 },\n \"patch\": {\n \"description\": \"Edit a task’s human-authored fields (title/description) before it runs. Both fields are optional.\",\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 title/description\",\n \"tags\": [\n \"Tasks\"\n ]\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 }\n },\n \"/api/v1/tasks/{taskId}/retry\": {\n \"post\": {\n \"description\": \"Retry a task’s 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 — 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 }\n },\n \"/api/v1/tasks/{taskId}/run\": {\n \"get\": {\n \"description\": \"Read a task’s 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 }\n },\n \"/api/v1/tasks/{taskId}/start\": {\n \"post\": {\n \"description\": \"Start a task’s pipeline. Uses the request’s pipelineId, else the task’s 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 — 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 }\n },\n \"/api/v1/tasks/{taskId}/stop\": {\n \"post\": {\n \"description\": \"Stop a task’s 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 }\n },\n \"/api/v1/usage\": {\n \"get\": {\n \"description\": \"Read this billing period’s 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 — a flat-rate plan bills nothing per token — 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 }\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’s 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’s size is bounded before the request is made.\",\n \"name\": \"Debug\"\n },\n {\n \"description\": \"A run’s parked human decisions — requirement-review findings and implementation-fork choices — 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’s 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 — the self-check an integration runs at startup, so “can I do this?” 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’s 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 \"description\": \"The workspace’s human-actionable notifications (list, act on, or dismiss the run tails).\",\n \"name\": \"Notifications\"\n },\n {\n \"description\": \"The workspace’s pipelines (discover a pipelineId to start a task with).\",\n \"name\": \"Pipelines\"\n },\n {\n \"description\": \"The workspace’s board services.\",\n \"name\": \"Services\"\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’s 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}\n";
|
|
7
|
+
export const OPENAPI_JSON = "{\n \"components\": {\n \"schemas\": {\n \"CreateHeadlessPublicApiKey\": {\n \"properties\": {\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 \"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 \"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 \"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 \"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 },\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 \"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 \"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 \"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 \"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 \"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 \"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 \"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 \"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 \"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 \"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 \"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 },\n \"required\": [\n \"agentKind\",\n \"state\",\n \"progress\",\n \"subtasks\"\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 \"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 \"view\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"null\"\n }\n ]\n }\n },\n \"required\": [\n \"artifactId\",\n \"kind\",\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 \"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 \"PublicTask\": {\n \"properties\": {\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 ],\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 ],\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 \"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 \"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 \"description\": {\n \"maxLength\": 2000,\n \"type\": \"string\"\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’s workspace.\",\n \"license\": {\n \"identifier\": \"MIT\",\n \"name\": \"MIT\"\n },\n \"title\": \"cat-factory Public API\",\n \"version\": \"1.21.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’s 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 }\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 }\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 }\n },\n \"/api/v1/debug/runs\": {\n \"get\": {\n \"description\": \"The triage entry point: the workspace’s 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 }\n },\n \"/api/v1/debug/runs/{runId}\": {\n \"get\": {\n \"description\": \"One run’s 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 \"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 \"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 }\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 }\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 }\n },\n \"/api/v1/debug/runs/{runId}/logs\": {\n \"get\": {\n \"description\": \"The run’s provisioning event log — 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 }\n },\n \"/api/v1/debug/runs/{runId}/search-queries\": {\n \"get\": {\n \"description\": \"The web searches the run’s 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 }\n },\n \"/api/v1/debug/runs/{runId}/tool-calls\": {\n \"get\": {\n \"description\": \"The tool calls the run’s agents made, in the order they made them — which command, against what, and what came back. The half of “how did this diff come about” 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 }\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’s 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 },\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 — 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 }\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 }\n },\n \"/api/v1/jobs/{id}/cancel\": {\n \"post\": {\n \"description\": \"Stop a headless job run, freeing its concurrency slot. Idempotent — 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 }\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 }\n },\n \"/api/v1/keys\": {\n \"get\": {\n \"description\": \"The live (non-revoked) keys for the calling key’s 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 },\n \"post\": {\n \"description\": \"Mint a key for the calling key’s 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 }\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 }\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’s startup self-check has to work whatever rung it holds. The scope ladder is INCLUSIVE (`read` ⊂ `write` ⊂ `decide` ⊂ `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 }\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 },\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 },\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 }\n },\n \"/api/v1/notifications\": {\n \"get\": {\n \"description\": \"List the open, human-actionable notifications in the key’s 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 }\n },\n \"/api/v1/notifications/{id}/act\": {\n \"post\": {\n \"description\": \"Run a notification’s 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 — 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.\",\n \"operationId\": \"actPublicNotification\",\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\": \"Act on a notification\",\n \"tags\": [\n \"Notifications\"\n ]\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 }\n },\n \"/api/v1/pipelines\": {\n \"get\": {\n \"description\": \"List the pipelines in the key’s workspace — id/name/steps plus whether each is public and safe to run headlessly — 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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\n },\n \"/api/v1/runs/{runId}/decisions/clarity/findings/{itemId}/reply\": {\n \"post\": {\n \"description\": \"Record an answer to one clarity-review finding — 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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\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 }\n },\n \"/api/v1/runs/{runId}/decisions/requirements/incorporate\": {\n \"post\": {\n \"description\": \"Fold the recorded answers into one standardized requirements document. Asynchronous — 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 }\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 }\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 }\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 }\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 — the decision carries only artifact ids — 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 }\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 }\n },\n \"/api/v1/runs/{runId}/report\": {\n \"get\": {\n \"description\": \"The engine’s bundle of CAPTURED FACTS about a run: the CI gate’s verdict and failing checks, the platform’s own run of the service’s lint/test/build commands (with the failing output), the red-then-green reproduction proof for a bugfix, the tester’s 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 }\n },\n \"/api/v1/services\": {\n \"get\": {\n \"description\": \"List the board service frames in the key’s 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 }\n },\n \"/api/v1/services/{serviceId}/tasks\": {\n \"get\": {\n \"description\": \"List every task under a service (the whole subtree — 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 },\n \"post\": {\n \"description\": \"Create a task inside a service frame the key’s 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 }\n },\n \"/api/v1/task-types\": {\n \"get\": {\n \"description\": \"List the task types a task can be created as in the key’s 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 }\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 },\n \"get\": {\n \"description\": \"Read a task’s 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 },\n \"patch\": {\n \"description\": \"Edit a task’s human-authored fields (title/description) before it runs. Both fields are optional.\",\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 title/description\",\n \"tags\": [\n \"Tasks\"\n ]\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 }\n },\n \"/api/v1/tasks/{taskId}/retry\": {\n \"post\": {\n \"description\": \"Retry a task’s 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 — 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 }\n },\n \"/api/v1/tasks/{taskId}/run\": {\n \"get\": {\n \"description\": \"Read a task’s 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 }\n },\n \"/api/v1/tasks/{taskId}/start\": {\n \"post\": {\n \"description\": \"Start a task’s pipeline. Uses the request’s pipelineId, else the task’s 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 — 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 }\n },\n \"/api/v1/tasks/{taskId}/stop\": {\n \"post\": {\n \"description\": \"Stop a task’s 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 }\n },\n \"/api/v1/usage\": {\n \"get\": {\n \"description\": \"Read this billing period’s 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 — a flat-rate plan bills nothing per token — 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 }\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’s 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’s size is bounded before the request is made.\",\n \"name\": \"Debug\"\n },\n {\n \"description\": \"A run’s 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’s 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 — the self-check an integration runs at startup, so “can I do this?” 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’s 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 \"description\": \"The workspace’s human-actionable notifications (list, act on, or dismiss the run tails).\",\n \"name\": \"Notifications\"\n },\n {\n \"description\": \"The workspace’s pipelines (discover a pipelineId to start a task with).\",\n \"name\": \"Pipelines\"\n },\n {\n \"description\": \"The workspace’s board services.\",\n \"name\": \"Services\"\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’s 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}\n";
|
|
8
8
|
//# sourceMappingURL=openapiDocument.generated.js.map
|