BatchSubmissionException exposes stage(), certainty(), and known
artifactIds(). MayHaveSucceeded means the request could have been accepted;
do not blindly submit the same job again. Reconcile with provider-side jobs or
the recorded artifact ID before deciding what to do.
BatchReadRetryPolicy and the delay seam can be
injected into BatchHttpTransport for deterministic tests.
BatchCancellationException carries the saved reference and mutation
certainty. A lost response or HTTP 408 can mean cancellation was accepted;
retrieve the job again before deciding whether to retry. An explicit 4xx
rejection, other than HTTP 408, is reported as Rejected. The live runner
prints these fields without exposing credentials or result text.
For offline application tests, construct a BatchRuntime with an injected
ScriptedBatchDriver or injected HTTP/upload transports. This exercises the
same BatchInference facade without credentials. Provider fixtures are
separate from normalized expectations and record whether their values are
documented-shape synthetic values or authenticated observations. Ordinary
HTTP recording does not cover the contained libcurl uploader.
The package tests include a real loopback multipart receiver and a separate
PHP-process reference-resume test. The large-payload proof is run from the
repository root with: