Add valar batch commands for RFC-0003 batch executions - #14
Merged
Conversation
Batch services could not be created through the CLI at all: kind is only settable when a service is created, and neither SubmitArtifact nor SubmitBuild sent it, so batch was reachable only by hand-rolled HTTP. builds push gains --kind. It is validated before the artifact upload, because the upload is what creates the service, and it is repeated on the build request because the server reads an absent kind as "function" and answers 409 on a mismatch with an existing batch service. valar batch adds run, list, inspect, logs, cancel and config. Two behaviours worth noting. run --follow waits for the execution to finish and then prints its output, rather than streaming live: batch containers routinely exit in under a second, so a tail started when the status turns "running" usually attaches to an already-closed log and returns nothing. Waiting first makes the output deterministic, which was not true of the first version. And inspect translates blocked_gate into something actionable. The five gates look identical from outside -- the execution simply has not started -- but "no single runner has room" and "batch is at its configured share" call for different responses. config only sends a PATCH when a flag was actually passed, so reading the configuration cannot silently rewrite it.
lnsp
added a commit
that referenced
this pull request
Jul 26, 2026
This branch was cut from a stale local master, before #11 replaced streamRequest with streamOnce plus a reconnecting follow helper. The squash merge of #14 produced no textual conflict -- the removed symbol and the new call site are in different parts of the file -- so master built green in the branch and broken on trunk. Batch log streaming now uses the same path service logs do. A followed stream reconnects and resumes at an exact byte offset. It always starts at the beginning of the log rather than anchoring to the end: an execution's output is finite and usually short, so there is nothing to gain from skipping the start and a real chance of missing all of it.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Batch services could not be created through the CLI at all —
kindis only settable at service creation, and neitherSubmitArtifactnorSubmitBuildsent it, so batch was reachable only by hand-rolled HTTP.builds pushgains--kind, validated before the artifact upload since the upload is what creates the service, and repeated on the build request because the server reads an absent kind asfunctionand 409s against an existing batch service.valar batchaddsrun,list,inspect,logs,cancel,config.Exercised against the live platform (2.4.1):
Two behaviours worth review:
run --followwaits for completion, then prints output rather than streaming live. Batch containers routinely exit in under a second, so a tail started when status turnsrunningusually attaches to an already-closed log and returns nothing — the first version of this did exactly that and printed an EOF error. Waiting first is deterministic.inspecttranslatesblockedGateinto something actionable. The five gates look identical from outside (the execution just hasn't started) but "no single runner has room" and "batch is at its configured share" call for different responses.configonly PATCHes when a flag was actually passed, so reading the config can't silently rewrite it.