Skip to content

release: 0.49.0 - #624

Merged
blooop merged 1 commit into
mainfrom
release/0.49.0
Sep 14, 2026
Merged

blooop merged 1 commit into
mainfrom
release/0.49.0

Conversation

@blooop

@blooop blooop commented Sep 14, 2026

Copy link
Copy Markdown
Owner

Ships the agent subprocess contract work: #621, #623 and #622.

docs/agents-using-dl.md publishes 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 sends info to stdout and the watched up echoed each line back to the stream it arrived on. Every test of that clause asked a warm workspace, which runs no up at all.

stderr was never the command's. It came back through devpod's stream logger: timestamped, level-tagged, ANSI-coloured, stream_logger.go:492 appended. The page carried a whole section admitting it, beside a 2>&1 workaround. The fix is devpod's own --log-output json on the devpod ssh --command arm, which keeps the level as a field. Its neighbour raw would have fixed this clause and broken the first one: dl recovers a remote exit status from a line it anchors on the word fatal, and raw prints no tag, so dl ws -- 'exit 42' would have quietly stopped exiting 42.

Verified together on a real cold start, streams split:

exit=42                        status recovery survives the transport change
stdout  10 bytes  TO_STDOUT    was 26,006 bytes of build log first
stderr  tail      TO_STDERR    was: 20:27:24 info TO_STDERR stream_logger.go:492

AGENTS.md gained a short section on driving dl from a script, pointing at the contract page rather than restating it.

Release mechanics

Four copies of the version move together, as publish.yml and conda-publish.yml both read [workspace.package] version from rust/Cargo.toml: the manifest, Cargo.lock, and the README's conda badge and dl --version transcript. v0.49.0 has never been tagged (scripts/version_untaken.py agrees), and scripts/changelog_frozen.py confirms 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:

  • Keep cold-workspace command output isolated so devpod startup logs do not leak into stdout.
  • Preserve command stderr and remote exit-status reporting while maintaining clean stdout/stderr streams.

Enhancements:

  • Document the supported subprocess contract for scripts and agents.

Build:

  • Bump the workspace and lockfile version to 0.49.0.

Documentation:

  • Update release documentation, changelog, version examples, and package badges for 0.49.0.

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.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @blooop, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 11 hours and 28 minutes by commenting @sourcery-ai review. Upgrade to get a review now.

@sourcery-ai

sourcery-ai Bot commented Sep 14, 2026

Copy link
Copy Markdown
Reviewer's guide (collapsed on small PRs)

Reviewer's Guide

This 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 separation

sequenceDiagram
    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
Loading

Flow diagram for cold workspace command output

flowchart 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
Loading

File-Level Changes

Change Details Files
Correct the subprocess stream contract for cold-workspace command execution.
  • Configure the remote SSH command arm to emit JSON logs so devpod startup/build logs do not contaminate stdout and command stderr remains separated.
  • Preserve remote exit-status recovery by continuing to anchor fatal transport records on their structured level/tag.
  • Add documentation and scripting guidance for the four caller-facing agent subprocess guarantees.
  • Record regression coverage for cold starts, split stdout/stderr, and nonzero command exits.
docs/agents-using-dl.md
AGENTS.md
(tests covering agent subprocess behavior; paths not provided)
Prepare the 0.49.0 release metadata and changelog.
  • Move the workspace package version to 0.49.0, with the lockfile updated accordingly.
  • Update README Conda badge and --version example.
  • Add the release section while preserving prior changelog history.
rust/Cargo.toml
rust/Cargo.lock
README.md
CHANGELOG.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@blooop
blooop merged commit f88998f into main Sep 14, 2026
15 checks passed
@blooop
blooop deleted the release/0.49.0 branch September 14, 2026 21:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant