List test plans
GET
/v1/test-plansHow to call this endpoint
Every ACP API request uses bearer authentication. The examples here show the actual request path, auth header, and body shape that the platform expects.
Path, query, and header parameters
These parameters control which ACP object the endpoint acts on and how the request is processed.
Path parameters
None.
Query parameters
| Name | Location | Type | Required | Description |
|---|---|---|---|---|
| projectId | query | string | No | — |
| status | query | draft | active | archived | No | — |
| q | query | string | No | — |
| offset | query | integer | No | — |
| limit | query | integer | No | — |
Body schema
This endpoint does not require a request body.
None.
What the API returns
Each response code below includes the documented payload shape for the ACP API.
200Organization-scoped test plansapplication/json
| Field | Type | Required | Description |
|---|---|---|---|
| object | list | Yes | — |
| data | object[] | Yes | — |
| data[].id | string | Yes | Unique identifier. |
| data[].projectId | string | Yes | Project ID. |
| data[].name | string | Yes | Human-readable name. |
| data[].description | string | Yes | Human-readable description. |
| data[].status | draft | active | archived | Yes | Current lifecycle status. |
| data[].targetType | project | workflow | function | web_app | agent | repository | custom | Yes | — |
| data[].targetId | string | Yes | — |
| data[].defaultEnvironmentId | string | Yes | — |
| data[].definition | object | Yes | — |
| data[].definition.schemaVersion | computer_agents_test_plan_v1 | Yes | — |
| data[].definition.setup | object | Yes | — |
| data[].definition.setup.command | string | Yes | — |
| data[].definition.setup.workingDirectory | string | Yes | — |
| data[].definition.setup.timeoutMs | integer | Yes | — |
| data[].definition.setup.env | object | Yes | — |
| data[].definition.setup.secretRefs | string[] | Yes | — |
| data[].definition.cases | object[] | Yes | — |
| data[].definition.cases[].id | string | Yes | Unique identifier. |
| data[].definition.cases[].name | string | Yes | Human-readable name. |
| data[].definition.cases[].description | string | Yes | Human-readable description. |
| data[].definition.cases[].kind | command | contract | integration | browser | agent | security | custom | Yes | — |
| data[].definition.cases[].command | string | Yes | — |
| data[].definition.cases[].workingDirectory | string | Yes | — |
| data[].definition.cases[].timeoutMs | integer | Yes | — |
| data[].definition.cases[].retries | integer | Yes | — |
| data[].definition.cases[].env | object | Yes | — |
| data[].definition.cases[].secretRefs | string[] | Yes | — |
| data[].definition.cases[].request | object | Yes | Kind-specific structured request. Secrets must be referenced through `secretRefs`. |
| data[].definition.cases[].assertions | object[] | Yes | — |
| data[].definition.cases[].agentId | string | Yes | Agent ID. |
| data[].definition.cases[].enabled | boolean | Yes | — |
| data[].definition.cases[].tags | string[] | Yes | — |
| data[].definition.teardown | object | Yes | — |
| data[].definition.teardown.command | string | Yes | — |
| data[].definition.teardown.workingDirectory | string | Yes | — |
| data[].definition.teardown.timeoutMs | integer | Yes | — |
| data[].definition.teardown.env | object | Yes | — |
| data[].definition.teardown.secretRefs | string[] | Yes | — |
| data[].definition.concurrency | integer | Yes | — |
| data[].definition.stopOnFailure | boolean | Yes | — |
| data[].definition.retryPolicy | object | Yes | — |
| data[].definition.retryPolicy.maxAttempts | integer | Yes | — |
| data[].definition.retryPolicy.backoffMs | integer | Yes | — |
| data[].definition.evidencePolicy | object | Yes | — |
| data[].definition.evidencePolicy.retainLogs | boolean | Yes | — |
| data[].definition.evidencePolicy.retainScreenshots | boolean | Yes | — |
| data[].definition.evidencePolicy.retainTraces | boolean | Yes | — |
| data[].definition.evidencePolicy.retainArtifacts | boolean | Yes | — |
| data[].definition.evidencePolicy.redactSecrets | boolean | Yes | — |
| data[].caseCount | integer | Yes | — |
| data[].planFingerprint | string | Yes | — |
| data[].publishedVersionId | string | Yes | — |
| data[].metadata | object | Yes | Free-form metadata object. |
| data[].createdAt | string | Yes | ISO 8601 timestamp. |
| data[].updatedAt | string | Yes | ISO 8601 timestamp. |
| data[].versions | object[] | No | — |
| data[].versions[].id | string | Yes | Unique identifier. |
| data[].versions[].testPlanId | string | Yes | — |
| data[].versions[].version | integer | Yes | — |
| data[].versions[].label | string | Yes | — |
| data[].versions[].description | string | Yes | Human-readable description. |
| data[].versions[].status | saved | published | Yes | Current lifecycle status. |
| data[].versions[].snapshot | object | Yes | — |
| data[].versions[].snapshot.name | string | Yes | Human-readable name. |
| data[].versions[].snapshot.description | string | Yes | Human-readable description. |
| data[].versions[].snapshot.status | draft | active | archived | Yes | Current lifecycle status. |
| data[].versions[].snapshot.projectId | string | Yes | Project ID. |
| data[].versions[].snapshot.targetType | project | workflow | function | web_app | agent | repository | custom | Yes | — |
| data[].versions[].snapshot.targetId | string | Yes | — |
| data[].versions[].snapshot.defaultEnvironmentId | string | Yes | — |
| data[].versions[].snapshot.definition | object | Yes | — |
| data[].versions[].snapshot.definition.schemaVersion | computer_agents_test_plan_v1 | Yes | — |
| data[].versions[].snapshot.definition.setup | object | Yes | — |
| data[].versions[].snapshot.definition.setup.command | string | Yes | — |
| data[].versions[].snapshot.definition.setup.workingDirectory | string | Yes | — |
| data[].versions[].snapshot.definition.setup.timeoutMs | integer | Yes | — |
| data[].versions[].snapshot.definition.setup.env | object | Yes | — |
| data[].versions[].snapshot.definition.setup.secretRefs | string[] | Yes | — |
| data[].versions[].snapshot.definition.cases | object[] | Yes | — |
| data[].versions[].snapshot.definition.cases[].id | string | Yes | Unique identifier. |
| data[].versions[].snapshot.definition.cases[].name | string | Yes | Human-readable name. |
| data[].versions[].snapshot.definition.cases[].description | string | Yes | Human-readable description. |
| data[].versions[].snapshot.definition.cases[].kind | command | contract | integration | browser | agent | security | custom | Yes | — |
| data[].versions[].snapshot.definition.cases[].command | string | Yes | — |
| data[].versions[].snapshot.definition.cases[].workingDirectory | string | Yes | — |
| data[].versions[].snapshot.definition.cases[].timeoutMs | integer | Yes | — |
| data[].versions[].snapshot.definition.cases[].retries | integer | Yes | — |
| data[].versions[].snapshot.definition.cases[].env | object | Yes | — |
| data[].versions[].snapshot.definition.cases[].secretRefs | string[] | Yes | — |
| data[].versions[].snapshot.definition.cases[].request | object | Yes | Kind-specific structured request. Secrets must be referenced through `secretRefs`. |
| data[].versions[].snapshot.definition.cases[].assertions | object[] | Yes | — |
| data[].versions[].snapshot.definition.cases[].agentId | string | Yes | Agent ID. |
| data[].versions[].snapshot.definition.cases[].enabled | boolean | Yes | — |
| data[].versions[].snapshot.definition.cases[].tags | string[] | Yes | — |
| data[].versions[].snapshot.definition.teardown | object | Yes | — |
| data[].versions[].snapshot.definition.teardown.command | string | Yes | — |
| data[].versions[].snapshot.definition.teardown.workingDirectory | string | Yes | — |
| data[].versions[].snapshot.definition.teardown.timeoutMs | integer | Yes | — |
| data[].versions[].snapshot.definition.teardown.env | object | Yes | — |
| data[].versions[].snapshot.definition.teardown.secretRefs | string[] | Yes | — |
| data[].versions[].snapshot.definition.concurrency | integer | Yes | — |
| data[].versions[].snapshot.definition.stopOnFailure | boolean | Yes | — |
| data[].versions[].snapshot.definition.retryPolicy | object | Yes | — |
| data[].versions[].snapshot.definition.retryPolicy.maxAttempts | integer | Yes | — |
| data[].versions[].snapshot.definition.retryPolicy.backoffMs | integer | Yes | — |
| data[].versions[].snapshot.definition.evidencePolicy | object | Yes | — |
| data[].versions[].snapshot.definition.evidencePolicy.retainLogs | boolean | Yes | — |
| data[].versions[].snapshot.definition.evidencePolicy.retainScreenshots | boolean | Yes | — |
| data[].versions[].snapshot.definition.evidencePolicy.retainTraces | boolean | Yes | — |
| data[].versions[].snapshot.definition.evidencePolicy.retainArtifacts | boolean | Yes | — |
| data[].versions[].snapshot.definition.evidencePolicy.redactSecrets | boolean | Yes | — |
| data[].versions[].snapshot.metadata | object | Yes | Functional extension metadata only; ownership and access-control fields are deliberately excluded. |
| data[].versions[].metadata | object | Yes | Free-form metadata object. |
| data[].versions[].publishedAt | string | Yes | — |
| data[].versions[].createdAt | string | Yes | ISO 8601 timestamp. |
| data[].versions[].updatedAt | string | Yes | ISO 8601 timestamp. |
| data[].runs | object[] | No | — |
| data[].runs[].id | string | Yes | Unique identifier. |
| data[].runs[].testPlanId | string | Yes | — |
| data[].runs[].versionId | string | Yes | — |
| data[].runs[].projectId | string | Yes | Project ID. |
| data[].runs[].taskId | string | Yes | — |
| data[].runs[].releaseId | string | Yes | — |
| data[].runs[].environmentId | string | Yes | Computer ID. |
| data[].runs[].agentId | string | Yes | Agent ID. |
| data[].runs[].triggerType | manual | mission_control | task | release | pull_request | schedule | api | Yes | — |
| data[].runs[].commitSha | string | Yes | — |
| data[].runs[].status | queued | running | passed | failed | completed_with_errors | cancelled | Yes | Current lifecycle status. |
| data[].runs[].totalCount | integer | Yes | — |
| data[].runs[].passedCount | integer | Yes | — |
| data[].runs[].failedCount | integer | Yes | — |
| data[].runs[].skippedCount | integer | Yes | — |
| data[].runs[].errorCount | integer | Yes | — |
| data[].runs[].durationMs | integer | Yes | — |
| data[].runs[].evidence | object | Yes | — |
| data[].runs[].evidence.schemaVersion | computer_agents_test_run_evidence_v2 | Yes | — |
| data[].runs[].evidence.runId | string | Yes | — |
| data[].runs[].evidence.planId | string | Yes | — |
| data[].runs[].evidence.planVersionId | string | Yes | — |
| data[].runs[].evidence.planFingerprint | string | Yes | — |
| data[].runs[].evidence.commitSha | string | Yes | — |
| data[].runs[].evidence.status | queued | running | passed | failed | completed_with_errors | cancelled | Yes | Current lifecycle status. |
| data[].runs[].evidence.expectedCaseIds | string[] | Yes | — |
| data[].runs[].evidence.counts | object | Yes | — |
| data[].runs[].evidence.counts.total | integer | Yes | — |
| data[].runs[].evidence.counts.passed | integer | Yes | — |
| data[].runs[].evidence.counts.failed | integer | Yes | — |
| data[].runs[].evidence.counts.skipped | integer | Yes | — |
| data[].runs[].evidence.counts.error | integer | Yes | — |
| data[].runs[].evidence.executionContext | object | Yes | — |
| data[].runs[].evidence.executionContext.environmentId | string | Yes | Computer ID. |
| data[].runs[].evidence.executionContext.agentId | string | Yes | Agent ID. |
| data[].runs[].evidence.executionContext.projectId | string | Yes | Project ID. |
| data[].runs[].evidence.executionContext.taskId | string | Yes | — |
| data[].runs[].evidence.executionContext.releaseId | string | Yes | — |
| data[].runs[].evidence.generatedAt | string | Yes | — |
| data[].runs[].evidence.resultSetFingerprint | string | Yes | — |
| data[].runs[].evidence.artifactSetFingerprint | string | Yes | — |
| data[].runs[].evidence.provenance | object | Yes | Self-reported provenance must be unverified with no attestation. Verified-worker provenance is accepted only when the server-verified attestation binds every canonical evidence identity and digest. |
| data[].runs[].evidence.provenance.schemaVersion | computer_agents_test_run_evidence_provenance_v1 | Yes | — |
| data[].runs[].evidence.provenance.source | computer_agents_thread | execution_worker | api_client | legacy_import | Yes | — |
| data[].runs[].evidence.provenance.trustLevel | self_reported | verified_worker | Yes | — |
| data[].runs[].evidence.provenance.verificationStatus | unverified | verified | Yes | — |
| data[].runs[].evidence.provenance.executor | object | Yes | — |
| data[].runs[].evidence.provenance.executor.kind | string | Yes | — |
| data[].runs[].evidence.provenance.executor.id | string | Yes | Unique identifier. |
| data[].runs[].evidence.provenance.attestation | object | Yes | — |
| data[].runs[].evidence.provenance.attestation.schemaVersion | computer_agents_test_execution_attestation_v1 | Yes | — |
| data[].runs[].evidence.provenance.attestation.attestationId | string | Yes | — |
| data[].runs[].evidence.provenance.attestation.workerId | string | Yes | — |
| data[].runs[].evidence.provenance.attestation.dispatchId | string | Yes | — |
| data[].runs[].evidence.provenance.attestation.workerAssertionId | string | Yes | — |
| data[].runs[].evidence.provenance.attestation.runId | string | Yes | — |
| data[].runs[].evidence.provenance.attestation.planId | string | Yes | — |
| data[].runs[].evidence.provenance.attestation.planVersionId | string | Yes | — |
| data[].runs[].evidence.provenance.attestation.planFingerprint | string | Yes | — |
| data[].runs[].evidence.provenance.attestation.commitSha | string | Yes | — |
| data[].runs[].evidence.provenance.attestation.environmentId | string | Yes | Computer ID. |
| data[].runs[].evidence.provenance.attestation.resultSetFingerprint | string | Yes | — |
| data[].runs[].evidence.provenance.attestation.artifactSetFingerprint | string | Yes | — |
| data[].runs[].evidence.provenance.attestation.issuedAt | string | Yes | — |
| data[].runs[].evidence.provenance.attestation.verifiedAt | string | Yes | — |
| data[].runs[].evidence.results | object[] | Yes | — |
| data[].runs[].evidence.results[].id | string | Yes | Unique identifier. |
| data[].runs[].evidence.results[].testRunId | string | Yes | — |
| data[].runs[].evidence.results[].caseId | string | Yes | — |
| data[].runs[].evidence.results[].name | string | Yes | Human-readable name. |
| data[].runs[].evidence.results[].kind | command | contract | integration | browser | agent | security | custom | Yes | — |
| data[].runs[].evidence.results[].status | queued | running | passed | failed | skipped | error | Yes | Current lifecycle status. |
| data[].runs[].evidence.results[].attempt | integer | Yes | — |
| data[].runs[].evidence.results[].durationMs | integer | Yes | — |
| data[].runs[].evidence.results[].exitCode | integer | Yes | — |
| data[].runs[].evidence.results[].summary | string | Yes | — |
| data[].runs[].evidence.results[].diagnostics | object | Yes | — |
| data[].runs[].evidence.results[].evidence | object | Yes | — |
| data[].runs[].evidence.results[].startedAt | string | Yes | ISO 8601 timestamp. |
| data[].runs[].evidence.results[].completedAt | string | Yes | ISO 8601 timestamp. |
| data[].runs[].evidence.results[].createdAt | string | Yes | ISO 8601 timestamp. |
| data[].runs[].evidence.results[].updatedAt | string | Yes | ISO 8601 timestamp. |
| data[].runs[].evidence.artifacts | object[] | Yes | — |
| data[].runs[].evidence.artifacts[].id | string | Yes | Unique identifier. |
| data[].runs[].evidence.artifacts[].testRunId | string | Yes | — |
| data[].runs[].evidence.artifacts[].testCaseResultId | string | Yes | — |
| data[].runs[].evidence.artifacts[].type | string | Yes | — |
| data[].runs[].evidence.artifacts[].name | string | Yes | Human-readable name. |
| data[].runs[].evidence.artifacts[].uri | string | Yes | — |
| data[].runs[].evidence.artifacts[].contentType | string | Yes | — |
| data[].runs[].evidence.artifacts[].sizeBytes | integer | Yes | — |
| data[].runs[].evidence.artifacts[].sha256 | string | Yes | — |
| data[].runs[].evidence.artifacts[].metadata | object | Yes | Free-form metadata object. |
| data[].runs[].evidence.artifacts[].createdAt | string | Yes | ISO 8601 timestamp. |
| data[].runs[].evidence.fingerprint | string | Yes | — |
| data[].runs[].metadata | object | Yes | Free-form metadata object. |
| data[].runs[].execution | object | Yes | — |
| data[].runs[].execution.owner | string | Yes | — |
| data[].runs[].execution.attempt | integer | Yes | — |
| data[].runs[].execution.leaseExpiresAt | string | Yes | — |
| data[].runs[].execution.heartbeatAt | string | Yes | — |
| data[].runs[].createdAt | string | Yes | ISO 8601 timestamp. |
| data[].runs[].updatedAt | string | Yes | ISO 8601 timestamp. |
| data[].runs[].startedAt | string | Yes | ISO 8601 timestamp. |
| data[].runs[].completedAt | string | Yes | ISO 8601 timestamp. |
| data[].runs[].results | object[] | No | — |
| data[].runs[].results[].id | string | Yes | Unique identifier. |
| data[].runs[].results[].testRunId | string | Yes | — |
| data[].runs[].results[].caseId | string | Yes | — |
| data[].runs[].results[].name | string | Yes | Human-readable name. |
| data[].runs[].results[].kind | command | contract | integration | browser | agent | security | custom | Yes | — |
| data[].runs[].results[].status | queued | running | passed | failed | skipped | error | Yes | Current lifecycle status. |
| data[].runs[].results[].attempt | integer | Yes | — |
| data[].runs[].results[].durationMs | integer | Yes | — |
| data[].runs[].results[].exitCode | integer | Yes | — |
| data[].runs[].results[].summary | string | Yes | — |
| data[].runs[].results[].diagnostics | object | Yes | — |
| data[].runs[].results[].evidence | object | Yes | — |
| data[].runs[].results[].startedAt | string | Yes | ISO 8601 timestamp. |
| data[].runs[].results[].completedAt | string | Yes | ISO 8601 timestamp. |
| data[].runs[].results[].createdAt | string | Yes | ISO 8601 timestamp. |
| data[].runs[].results[].updatedAt | string | Yes | ISO 8601 timestamp. |
| data[].runs[].artifacts | object[] | No | — |
| data[].runs[].artifacts[].id | string | Yes | Unique identifier. |
| data[].runs[].artifacts[].testRunId | string | Yes | — |
| data[].runs[].artifacts[].testCaseResultId | string | Yes | — |
| data[].runs[].artifacts[].type | string | Yes | — |
| data[].runs[].artifacts[].name | string | Yes | Human-readable name. |
| data[].runs[].artifacts[].uri | string | Yes | — |
| data[].runs[].artifacts[].contentType | string | Yes | — |
| data[].runs[].artifacts[].sizeBytes | integer | Yes | — |
| data[].runs[].artifacts[].sha256 | string | Yes | — |
| data[].runs[].artifacts[].metadata | object | Yes | Free-form metadata object. |
| data[].runs[].artifacts[].createdAt | string | Yes | ISO 8601 timestamp. |
| testPlans | object[] | Yes | — |
| testPlans[].id | string | Yes | Unique identifier. |
| testPlans[].projectId | string | Yes | Project ID. |
| testPlans[].name | string | Yes | Human-readable name. |
| testPlans[].description | string | Yes | Human-readable description. |
| testPlans[].status | draft | active | archived | Yes | Current lifecycle status. |
| testPlans[].targetType | project | workflow | function | web_app | agent | repository | custom | Yes | — |
| testPlans[].targetId | string | Yes | — |
| testPlans[].defaultEnvironmentId | string | Yes | — |
| testPlans[].definition | object | Yes | — |
| testPlans[].definition.schemaVersion | computer_agents_test_plan_v1 | Yes | — |
| testPlans[].definition.setup | object | Yes | — |
| testPlans[].definition.setup.command | string | Yes | — |
| testPlans[].definition.setup.workingDirectory | string | Yes | — |
| testPlans[].definition.setup.timeoutMs | integer | Yes | — |
| testPlans[].definition.setup.env | object | Yes | — |
| testPlans[].definition.setup.secretRefs | string[] | Yes | — |
| testPlans[].definition.cases | object[] | Yes | — |
| testPlans[].definition.cases[].id | string | Yes | Unique identifier. |
| testPlans[].definition.cases[].name | string | Yes | Human-readable name. |
| testPlans[].definition.cases[].description | string | Yes | Human-readable description. |
| testPlans[].definition.cases[].kind | command | contract | integration | browser | agent | security | custom | Yes | — |
| testPlans[].definition.cases[].command | string | Yes | — |
| testPlans[].definition.cases[].workingDirectory | string | Yes | — |
| testPlans[].definition.cases[].timeoutMs | integer | Yes | — |
| testPlans[].definition.cases[].retries | integer | Yes | — |
| testPlans[].definition.cases[].env | object | Yes | — |
| testPlans[].definition.cases[].secretRefs | string[] | Yes | — |
| testPlans[].definition.cases[].request | object | Yes | Kind-specific structured request. Secrets must be referenced through `secretRefs`. |
| testPlans[].definition.cases[].assertions | object[] | Yes | — |
| testPlans[].definition.cases[].agentId | string | Yes | Agent ID. |
| testPlans[].definition.cases[].enabled | boolean | Yes | — |
| testPlans[].definition.cases[].tags | string[] | Yes | — |
| testPlans[].definition.teardown | object | Yes | — |
| testPlans[].definition.teardown.command | string | Yes | — |
| testPlans[].definition.teardown.workingDirectory | string | Yes | — |
| testPlans[].definition.teardown.timeoutMs | integer | Yes | — |
| testPlans[].definition.teardown.env | object | Yes | — |
| testPlans[].definition.teardown.secretRefs | string[] | Yes | — |
| testPlans[].definition.concurrency | integer | Yes | — |
| testPlans[].definition.stopOnFailure | boolean | Yes | — |
| testPlans[].definition.retryPolicy | object | Yes | — |
| testPlans[].definition.retryPolicy.maxAttempts | integer | Yes | — |
| testPlans[].definition.retryPolicy.backoffMs | integer | Yes | — |
| testPlans[].definition.evidencePolicy | object | Yes | — |
| testPlans[].definition.evidencePolicy.retainLogs | boolean | Yes | — |
| testPlans[].definition.evidencePolicy.retainScreenshots | boolean | Yes | — |
| testPlans[].definition.evidencePolicy.retainTraces | boolean | Yes | — |
| testPlans[].definition.evidencePolicy.retainArtifacts | boolean | Yes | — |
| testPlans[].definition.evidencePolicy.redactSecrets | boolean | Yes | — |
| testPlans[].caseCount | integer | Yes | — |
| testPlans[].planFingerprint | string | Yes | — |
| testPlans[].publishedVersionId | string | Yes | — |
| testPlans[].metadata | object | Yes | Free-form metadata object. |
| testPlans[].createdAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].updatedAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].versions | object[] | No | — |
| testPlans[].versions[].id | string | Yes | Unique identifier. |
| testPlans[].versions[].testPlanId | string | Yes | — |
| testPlans[].versions[].version | integer | Yes | — |
| testPlans[].versions[].label | string | Yes | — |
| testPlans[].versions[].description | string | Yes | Human-readable description. |
| testPlans[].versions[].status | saved | published | Yes | Current lifecycle status. |
| testPlans[].versions[].snapshot | object | Yes | — |
| testPlans[].versions[].snapshot.name | string | Yes | Human-readable name. |
| testPlans[].versions[].snapshot.description | string | Yes | Human-readable description. |
| testPlans[].versions[].snapshot.status | draft | active | archived | Yes | Current lifecycle status. |
| testPlans[].versions[].snapshot.projectId | string | Yes | Project ID. |
| testPlans[].versions[].snapshot.targetType | project | workflow | function | web_app | agent | repository | custom | Yes | — |
| testPlans[].versions[].snapshot.targetId | string | Yes | — |
| testPlans[].versions[].snapshot.defaultEnvironmentId | string | Yes | — |
| testPlans[].versions[].snapshot.definition | object | Yes | — |
| testPlans[].versions[].snapshot.definition.schemaVersion | computer_agents_test_plan_v1 | Yes | — |
| testPlans[].versions[].snapshot.definition.setup | object | Yes | — |
| testPlans[].versions[].snapshot.definition.setup.command | string | Yes | — |
| testPlans[].versions[].snapshot.definition.setup.workingDirectory | string | Yes | — |
| testPlans[].versions[].snapshot.definition.setup.timeoutMs | integer | Yes | — |
| testPlans[].versions[].snapshot.definition.setup.env | object | Yes | — |
| testPlans[].versions[].snapshot.definition.setup.secretRefs | string[] | Yes | — |
| testPlans[].versions[].snapshot.definition.cases | object[] | Yes | — |
| testPlans[].versions[].snapshot.definition.cases[].id | string | Yes | Unique identifier. |
| testPlans[].versions[].snapshot.definition.cases[].name | string | Yes | Human-readable name. |
| testPlans[].versions[].snapshot.definition.cases[].description | string | Yes | Human-readable description. |
| testPlans[].versions[].snapshot.definition.cases[].kind | command | contract | integration | browser | agent | security | custom | Yes | — |
| testPlans[].versions[].snapshot.definition.cases[].command | string | Yes | — |
| testPlans[].versions[].snapshot.definition.cases[].workingDirectory | string | Yes | — |
| testPlans[].versions[].snapshot.definition.cases[].timeoutMs | integer | Yes | — |
| testPlans[].versions[].snapshot.definition.cases[].retries | integer | Yes | — |
| testPlans[].versions[].snapshot.definition.cases[].env | object | Yes | — |
| testPlans[].versions[].snapshot.definition.cases[].secretRefs | string[] | Yes | — |
| testPlans[].versions[].snapshot.definition.cases[].request | object | Yes | Kind-specific structured request. Secrets must be referenced through `secretRefs`. |
| testPlans[].versions[].snapshot.definition.cases[].assertions | object[] | Yes | — |
| testPlans[].versions[].snapshot.definition.cases[].agentId | string | Yes | Agent ID. |
| testPlans[].versions[].snapshot.definition.cases[].enabled | boolean | Yes | — |
| testPlans[].versions[].snapshot.definition.cases[].tags | string[] | Yes | — |
| testPlans[].versions[].snapshot.definition.teardown | object | Yes | — |
| testPlans[].versions[].snapshot.definition.teardown.command | string | Yes | — |
| testPlans[].versions[].snapshot.definition.teardown.workingDirectory | string | Yes | — |
| testPlans[].versions[].snapshot.definition.teardown.timeoutMs | integer | Yes | — |
| testPlans[].versions[].snapshot.definition.teardown.env | object | Yes | — |
| testPlans[].versions[].snapshot.definition.teardown.secretRefs | string[] | Yes | — |
| testPlans[].versions[].snapshot.definition.concurrency | integer | Yes | — |
| testPlans[].versions[].snapshot.definition.stopOnFailure | boolean | Yes | — |
| testPlans[].versions[].snapshot.definition.retryPolicy | object | Yes | — |
| testPlans[].versions[].snapshot.definition.retryPolicy.maxAttempts | integer | Yes | — |
| testPlans[].versions[].snapshot.definition.retryPolicy.backoffMs | integer | Yes | — |
| testPlans[].versions[].snapshot.definition.evidencePolicy | object | Yes | — |
| testPlans[].versions[].snapshot.definition.evidencePolicy.retainLogs | boolean | Yes | — |
| testPlans[].versions[].snapshot.definition.evidencePolicy.retainScreenshots | boolean | Yes | — |
| testPlans[].versions[].snapshot.definition.evidencePolicy.retainTraces | boolean | Yes | — |
| testPlans[].versions[].snapshot.definition.evidencePolicy.retainArtifacts | boolean | Yes | — |
| testPlans[].versions[].snapshot.definition.evidencePolicy.redactSecrets | boolean | Yes | — |
| testPlans[].versions[].snapshot.metadata | object | Yes | Functional extension metadata only; ownership and access-control fields are deliberately excluded. |
| testPlans[].versions[].metadata | object | Yes | Free-form metadata object. |
| testPlans[].versions[].publishedAt | string | Yes | — |
| testPlans[].versions[].createdAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].versions[].updatedAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].runs | object[] | No | — |
| testPlans[].runs[].id | string | Yes | Unique identifier. |
| testPlans[].runs[].testPlanId | string | Yes | — |
| testPlans[].runs[].versionId | string | Yes | — |
| testPlans[].runs[].projectId | string | Yes | Project ID. |
| testPlans[].runs[].taskId | string | Yes | — |
| testPlans[].runs[].releaseId | string | Yes | — |
| testPlans[].runs[].environmentId | string | Yes | Computer ID. |
| testPlans[].runs[].agentId | string | Yes | Agent ID. |
| testPlans[].runs[].triggerType | manual | mission_control | task | release | pull_request | schedule | api | Yes | — |
| testPlans[].runs[].commitSha | string | Yes | — |
| testPlans[].runs[].status | queued | running | passed | failed | completed_with_errors | cancelled | Yes | Current lifecycle status. |
| testPlans[].runs[].totalCount | integer | Yes | — |
| testPlans[].runs[].passedCount | integer | Yes | — |
| testPlans[].runs[].failedCount | integer | Yes | — |
| testPlans[].runs[].skippedCount | integer | Yes | — |
| testPlans[].runs[].errorCount | integer | Yes | — |
| testPlans[].runs[].durationMs | integer | Yes | — |
| testPlans[].runs[].evidence | object | Yes | — |
| testPlans[].runs[].evidence.schemaVersion | computer_agents_test_run_evidence_v2 | Yes | — |
| testPlans[].runs[].evidence.runId | string | Yes | — |
| testPlans[].runs[].evidence.planId | string | Yes | — |
| testPlans[].runs[].evidence.planVersionId | string | Yes | — |
| testPlans[].runs[].evidence.planFingerprint | string | Yes | — |
| testPlans[].runs[].evidence.commitSha | string | Yes | — |
| testPlans[].runs[].evidence.status | queued | running | passed | failed | completed_with_errors | cancelled | Yes | Current lifecycle status. |
| testPlans[].runs[].evidence.expectedCaseIds | string[] | Yes | — |
| testPlans[].runs[].evidence.counts | object | Yes | — |
| testPlans[].runs[].evidence.counts.total | integer | Yes | — |
| testPlans[].runs[].evidence.counts.passed | integer | Yes | — |
| testPlans[].runs[].evidence.counts.failed | integer | Yes | — |
| testPlans[].runs[].evidence.counts.skipped | integer | Yes | — |
| testPlans[].runs[].evidence.counts.error | integer | Yes | — |
| testPlans[].runs[].evidence.executionContext | object | Yes | — |
| testPlans[].runs[].evidence.executionContext.environmentId | string | Yes | Computer ID. |
| testPlans[].runs[].evidence.executionContext.agentId | string | Yes | Agent ID. |
| testPlans[].runs[].evidence.executionContext.projectId | string | Yes | Project ID. |
| testPlans[].runs[].evidence.executionContext.taskId | string | Yes | — |
| testPlans[].runs[].evidence.executionContext.releaseId | string | Yes | — |
| testPlans[].runs[].evidence.generatedAt | string | Yes | — |
| testPlans[].runs[].evidence.resultSetFingerprint | string | Yes | — |
| testPlans[].runs[].evidence.artifactSetFingerprint | string | Yes | — |
| testPlans[].runs[].evidence.provenance | object | Yes | Self-reported provenance must be unverified with no attestation. Verified-worker provenance is accepted only when the server-verified attestation binds every canonical evidence identity and digest. |
| testPlans[].runs[].evidence.provenance.schemaVersion | computer_agents_test_run_evidence_provenance_v1 | Yes | — |
| testPlans[].runs[].evidence.provenance.source | computer_agents_thread | execution_worker | api_client | legacy_import | Yes | — |
| testPlans[].runs[].evidence.provenance.trustLevel | self_reported | verified_worker | Yes | — |
| testPlans[].runs[].evidence.provenance.verificationStatus | unverified | verified | Yes | — |
| testPlans[].runs[].evidence.provenance.executor | object | Yes | — |
| testPlans[].runs[].evidence.provenance.executor.kind | string | Yes | — |
| testPlans[].runs[].evidence.provenance.executor.id | string | Yes | Unique identifier. |
| testPlans[].runs[].evidence.provenance.attestation | object | Yes | — |
| testPlans[].runs[].evidence.provenance.attestation.schemaVersion | computer_agents_test_execution_attestation_v1 | Yes | — |
| testPlans[].runs[].evidence.provenance.attestation.attestationId | string | Yes | — |
| testPlans[].runs[].evidence.provenance.attestation.workerId | string | Yes | — |
| testPlans[].runs[].evidence.provenance.attestation.dispatchId | string | Yes | — |
| testPlans[].runs[].evidence.provenance.attestation.workerAssertionId | string | Yes | — |
| testPlans[].runs[].evidence.provenance.attestation.runId | string | Yes | — |
| testPlans[].runs[].evidence.provenance.attestation.planId | string | Yes | — |
| testPlans[].runs[].evidence.provenance.attestation.planVersionId | string | Yes | — |
| testPlans[].runs[].evidence.provenance.attestation.planFingerprint | string | Yes | — |
| testPlans[].runs[].evidence.provenance.attestation.commitSha | string | Yes | — |
| testPlans[].runs[].evidence.provenance.attestation.environmentId | string | Yes | Computer ID. |
| testPlans[].runs[].evidence.provenance.attestation.resultSetFingerprint | string | Yes | — |
| testPlans[].runs[].evidence.provenance.attestation.artifactSetFingerprint | string | Yes | — |
| testPlans[].runs[].evidence.provenance.attestation.issuedAt | string | Yes | — |
| testPlans[].runs[].evidence.provenance.attestation.verifiedAt | string | Yes | — |
| testPlans[].runs[].evidence.results | object[] | Yes | — |
| testPlans[].runs[].evidence.results[].id | string | Yes | Unique identifier. |
| testPlans[].runs[].evidence.results[].testRunId | string | Yes | — |
| testPlans[].runs[].evidence.results[].caseId | string | Yes | — |
| testPlans[].runs[].evidence.results[].name | string | Yes | Human-readable name. |
| testPlans[].runs[].evidence.results[].kind | command | contract | integration | browser | agent | security | custom | Yes | — |
| testPlans[].runs[].evidence.results[].status | queued | running | passed | failed | skipped | error | Yes | Current lifecycle status. |
| testPlans[].runs[].evidence.results[].attempt | integer | Yes | — |
| testPlans[].runs[].evidence.results[].durationMs | integer | Yes | — |
| testPlans[].runs[].evidence.results[].exitCode | integer | Yes | — |
| testPlans[].runs[].evidence.results[].summary | string | Yes | — |
| testPlans[].runs[].evidence.results[].diagnostics | object | Yes | — |
| testPlans[].runs[].evidence.results[].evidence | object | Yes | — |
| testPlans[].runs[].evidence.results[].startedAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].runs[].evidence.results[].completedAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].runs[].evidence.results[].createdAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].runs[].evidence.results[].updatedAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].runs[].evidence.artifacts | object[] | Yes | — |
| testPlans[].runs[].evidence.artifacts[].id | string | Yes | Unique identifier. |
| testPlans[].runs[].evidence.artifacts[].testRunId | string | Yes | — |
| testPlans[].runs[].evidence.artifacts[].testCaseResultId | string | Yes | — |
| testPlans[].runs[].evidence.artifacts[].type | string | Yes | — |
| testPlans[].runs[].evidence.artifacts[].name | string | Yes | Human-readable name. |
| testPlans[].runs[].evidence.artifacts[].uri | string | Yes | — |
| testPlans[].runs[].evidence.artifacts[].contentType | string | Yes | — |
| testPlans[].runs[].evidence.artifacts[].sizeBytes | integer | Yes | — |
| testPlans[].runs[].evidence.artifacts[].sha256 | string | Yes | — |
| testPlans[].runs[].evidence.artifacts[].metadata | object | Yes | Free-form metadata object. |
| testPlans[].runs[].evidence.artifacts[].createdAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].runs[].evidence.fingerprint | string | Yes | — |
| testPlans[].runs[].metadata | object | Yes | Free-form metadata object. |
| testPlans[].runs[].execution | object | Yes | — |
| testPlans[].runs[].execution.owner | string | Yes | — |
| testPlans[].runs[].execution.attempt | integer | Yes | — |
| testPlans[].runs[].execution.leaseExpiresAt | string | Yes | — |
| testPlans[].runs[].execution.heartbeatAt | string | Yes | — |
| testPlans[].runs[].createdAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].runs[].updatedAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].runs[].startedAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].runs[].completedAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].runs[].results | object[] | No | — |
| testPlans[].runs[].results[].id | string | Yes | Unique identifier. |
| testPlans[].runs[].results[].testRunId | string | Yes | — |
| testPlans[].runs[].results[].caseId | string | Yes | — |
| testPlans[].runs[].results[].name | string | Yes | Human-readable name. |
| testPlans[].runs[].results[].kind | command | contract | integration | browser | agent | security | custom | Yes | — |
| testPlans[].runs[].results[].status | queued | running | passed | failed | skipped | error | Yes | Current lifecycle status. |
| testPlans[].runs[].results[].attempt | integer | Yes | — |
| testPlans[].runs[].results[].durationMs | integer | Yes | — |
| testPlans[].runs[].results[].exitCode | integer | Yes | — |
| testPlans[].runs[].results[].summary | string | Yes | — |
| testPlans[].runs[].results[].diagnostics | object | Yes | — |
| testPlans[].runs[].results[].evidence | object | Yes | — |
| testPlans[].runs[].results[].startedAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].runs[].results[].completedAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].runs[].results[].createdAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].runs[].results[].updatedAt | string | Yes | ISO 8601 timestamp. |
| testPlans[].runs[].artifacts | object[] | No | — |
| testPlans[].runs[].artifacts[].id | string | Yes | Unique identifier. |
| testPlans[].runs[].artifacts[].testRunId | string | Yes | — |
| testPlans[].runs[].artifacts[].testCaseResultId | string | Yes | — |
| testPlans[].runs[].artifacts[].type | string | Yes | — |
| testPlans[].runs[].artifacts[].name | string | Yes | Human-readable name. |
| testPlans[].runs[].artifacts[].uri | string | Yes | — |
| testPlans[].runs[].artifacts[].contentType | string | Yes | — |
| testPlans[].runs[].artifacts[].sizeBytes | integer | Yes | — |
| testPlans[].runs[].artifacts[].sha256 | string | Yes | — |
| testPlans[].runs[].artifacts[].metadata | object | Yes | Free-form metadata object. |
| testPlans[].runs[].artifacts[].createdAt | string | Yes | ISO 8601 timestamp. |