release: 0.49.0 - #624
Merged
Merged
release: 0.49.0#624
Conversation
The two halves of the agent subprocess contract that the transport was not keeping, and the page that now says so. `docs/agents-using-dl.md` promises a caller that stdout is the command's output and stderr is the command's diagnostics. Neither held. A cold launch put devpod's whole build transcript on stdout ahead of the answer, 26KB of it, because devpod logs `info` there and the watched `up` echoed each line back where it came from. A command's stderr came back through devpod's stream logger, timestamped, level-tagged and ANSI-coloured, which is the difference between a compiler's diagnostics a caller can parse and ones it cannot. Both are fixed, stderr is the fifth clause of the published contract rather than a section apologising for itself, and AGENTS.md now carries the short recipe for driving dl from a script. The version in rust/Cargo.toml is what publish.yml reads to decide there is a release to make, so this is the commit that ships the change rather than a note about one. All four copies move together: Cargo.toml, Cargo.lock, and the README's conda badge and `dl --version` transcript.
Reviewer's guide (collapsed on small PRs)Reviewer's GuideThis release fixes the agent subprocess transport by using devpod JSON logging on remote command execution, keeping startup/build output off stdout, preserving stderr and remote exit-status semantics, and documenting the verified caller contract. It also synchronizes the 0.49.0 version across release metadata and user-facing documentation. Sequence diagram for agent subprocess stream separationsequenceDiagram
participant Caller
participant dl
participant devpod
participant Command
Caller->>dl: dl <ws> -- <command>
dl->>devpod: ssh --command <command> --log-output json
devpod->>Command: Execute remote command
Command-->>devpod: stdout and stderr
devpod-->>dl: JSON log records with level fields
dl-->>Caller: stdout: command output
dl-->>Caller: stderr: command errors and startup logs
dl-->>Caller: remote exit status
Flow diagram for cold workspace command outputflowchart LR
Caller[Caller script] --> DL[dl <ws> -- <command>]
DL --> Start[Start stopped workspace]
Start --> JSON[devpod JSON log transport]
JSON --> Streams[Separate stdout and stderr]
Streams --> Status[Preserve remote exit status]
Streams --> Caller
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
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.
Ships the agent subprocess contract work: #621, #623 and #622.
docs/agents-using-dl.mdpublishes four things a caller may write code against. Two of them were not true.stdout was the command's, except when it wasn't. A
dl <ws> -- <command>against a stopped workspace put devpod's whole start transcript on stdout ahead of the command's own output, 26,006 bytes in front of an 18-byte answer, because devpod's logger sendsinfoto stdout and the watchedupechoed each line back to the stream it arrived on. Every test of that clause asked a warm workspace, which runs noupat all.stderr was never the command's. It came back through devpod's stream logger: timestamped, level-tagged, ANSI-coloured,
stream_logger.go:492appended. The page carried a whole section admitting it, beside a2>&1workaround. The fix is devpod's own--log-output jsonon thedevpod ssh --commandarm, which keeps the level as a field. Its neighbourrawwould have fixed this clause and broken the first one: dl recovers a remote exit status from a line it anchors on the wordfatal, andrawprints no tag, sodl ws -- 'exit 42'would have quietly stopped exiting 42.Verified together on a real cold start, streams split:
AGENTS.mdgained a short section on drivingdlfrom a script, pointing at the contract page rather than restating it.Release mechanics
Four copies of the version move together, as
publish.ymlandconda-publish.ymlboth read[workspace.package] versionfromrust/Cargo.toml: the manifest,Cargo.lock, and the README's conda badge anddl --versiontranscript.v0.49.0has never been tagged (scripts/version_untaken.pyagrees), andscripts/changelog_frozen.pyconfirms all 87 released sections are untouched.🤖 Generated with Claude Code
Summary by Sourcery
Release version 0.49.0 with reliable subprocess stream handling and documented scripting behavior.
Bug Fixes:
Enhancements:
Build:
Documentation: