Prove that every request of the batch job succeeded. A batch that reaches the status completed is not a batch in which every request succeeded. This level reads request_counts and refuses a batch with a failed count above zero.

Contract identity.
FactValue
Contract idopenai.batch.all_requests_succeeded
Version1.0.0
Hashf7efcd09d699f148
Completion levelall_requests_succeeded
PublisherBuilt and signed by Provely.
CertificationProvisional
SkillOpenAI Platform API 0.1.0
Valid for provider API versionsspec_2_3_0

What is the intent?

Run every request of the input file as one batch job, and get a result for each one.

What is the subject and the action?

MemberValue
Subject typeopenai.batch
Subject identitybatch_id = $action.result.id
Canonical effectai.batch_job_start
Provider operationPOST /batches
Idempotencynone, retry is not safe

How does the evidence correlate with this operation?

StrategyAssuranceKeysRequired
resource_idstrongbatch_id from $action.result.idyes
fingerprintweakinput_file_id from $input.input_file_id; endpoint from $input.endpointno

Which evidence does the contract require?

Minimum evidence level E2. An independent channel is required. Minimum channels: 1.

ChannelLevelIndependenceVerifierDescription
batch_readbackE2provider readbackhttpRead the batch from the provider. A condition path is $observed.batch_readback.status, and a second one is $observed.batch_readback.request_counts.failed.
batch_completed_eventsE3provider eventwebhookThe batch.completed events of this batch. The payload carries the identifier of the batch and no other member of it, so the count states the end of the job and never the result of one request. The webhook verifier returns {events, count, latest, earliest, types, duplicates_dropped}.

Which conditions must all hold for VERIFIED?

ConditionMeaningPathOperatorExpectedEvidence
batch_presentThe provider holds the batch with the returned identifier.$observed.batch_readback.ideq$action.result.idbatch_readback
batch_status_completedThe batch reached the status completed. The published table states that the results are ready.$observed.batch_readback.statuseqcompletedbatch_readback
batch_input_file_matchesThe batch reads the input file that the intent named.$observed.batch_readback.input_file_ideq$input.input_file_idbatch_readback
batch_created_in_windowThe provider created the batch after the operation started. OpenAI writes created_at in seconds since the epoch.$observed.batch_readback.created_attime_after$operation.created_atbatch_readback
batch_completed_eventAt least one batch.completed event names this batch. The payload carries the identifier only, so this condition states the end of the job and nothing about one request.$observed.batch_completed_events.countgte1batch_completed_events
batch_no_request_failedNo request of the batch failed. The published description of the member is the number of requests that have failed.$observed.batch_readback.request_counts.failedeq0batch_readback
batch_holds_requestsThe batch holds at least one request. An empty batch has no failed request and proves no work.$observed.batch_readback.request_counts.totalgt0batch_readback
batch_completed_every_requestThe number of requests that completed successfully equals the number of requests in the batch.$observed.batch_readback.request_counts.completedeq$observed.batch_readback.request_counts.totalbatch_readback

Which conditions give CONTRADICTED?

ConditionClassReasonPathOperatorExpected
batch_on_wrong_input_filewrong subjectThe batch reads a different input file than the intent named.$observed.batch_readback.input_file_idne$input.input_file_id
batch_on_wrong_endpointwrong subjectThe batch calls a different endpoint than the intent named.$observed.batch_readback.endpointne$input.endpoint
batch_predates_operationpre existing stateThe batch is older than the operation. It proves nothing.$observed.batch_readback.created_attime_before$operation.created_at
batch_requests_failedpartial completionThe batch finished, and requests inside it failed. Do not retry the batch: the requests that succeeded would run a second time. Ask a person.$observed.batch_readback.request_counts.failedgt0

Which observed states map to a verdict before completion?

RuleMatchVerdictReason
completed_with_failed_requests($observed.batch_readback.status eq "completed") and ($observed.batch_readback.request_counts.failed gt 0)CONTRADICTEDThe batch finished, and requests inside it failed. A retry would run the requests that succeeded a second time. Ask a person.
terminal_failure$observed.batch_readback.status in ["failed","expired"]FAILEDThe provider ended the batch without results. Read the errors of the input file.
cancelled$observed.batch_readback.status eq "cancelled"CONTRADICTEDA person or an agent cancelled the batch. Ask a person before a new batch runs.
still_running$observed.batch_readback.status in ["validating","in_progress","finalizing","cancelling"]PENDINGThe batch has not reached a terminal status. The runtime observes again later.

How long does the runtime observe?

Timing memberValue
Initial delay1000 ms
Poll interval30000 ms
Backoffexponential factor 2, max 900000 ms
Maximum attempts120
Timeout93600000 ms
Stale read window60000 ms
On timeoutUNVERIFIABLE (evidence_unavailable_before_timeout), escalated to a person

Where do these rules come from?

  • openai.openapi#/components/schemas/Batch/properties/request_counts: openai.openapi, retrieved 2026-09-09
  • openai.openapi#/components/schemas/BatchRequestCounts/properties/failed: openai.openapi, retrieved 2026-09-09
  • openai.docs.batch#batch-jobs/the-request-counts-of-a-batch: openai.docs.batch, retrieved 2026-09-09
  • openai.docs.batch#batch-jobs/the-output-file-and-the-error-file: openai.docs.batch, retrieved 2026-09-09
  • openai.openapi#/components/schemas/Batch/properties/id: openai.openapi, retrieved 2026-09-09
  • openai.openapi#/paths/~1batches~1{batch_id}/get/responses/200: openai.openapi, retrieved 2026-09-09
  • openai.openapi#/components/schemas/Batch/properties/status: openai.openapi, retrieved 2026-09-09
  • openai.docs.batch#batch-jobs/the-status-of-a-batch: openai.docs.batch, retrieved 2026-09-09
  • openai.openapi#/components/schemas/Batch/properties/input_file_id: openai.openapi, retrieved 2026-09-09
  • openai.openapi#/components/schemas/CreateBatchRequest/properties/input_file_id: openai.openapi, retrieved 2026-09-09
  • openai.openapi#/components/schemas/Batch/properties/created_at: openai.openapi, retrieved 2026-09-09
  • openai.events#/events/batch.completed: openai.events, retrieved 2026-09-09
  • openai.openapi#/components/schemas/WebhookBatchCompleted/properties/data: openai.openapi, retrieved 2026-09-09
  • openai.docs.webhooks#webhooks/the-event-types: openai.docs.webhooks, retrieved 2026-09-09
  • openai.openapi#/components/schemas/BatchRequestCounts/properties/total: openai.openapi, retrieved 2026-09-09
  • openai.openapi#/components/schemas/BatchRequestCounts/properties/completed: openai.openapi, retrieved 2026-09-09

Can openai.batch.all_requests_succeeded return VERIFIED from the action response alone?

No. The minimum evidence level is E2. The action response is E1. The completion conditions read batch_readback and batch_completed_events.

What happens after the timeout?

The verdict is UNVERIFIABLE with the reason evidence_unavailable_before_timeout. The operation goes to a person for review.