-
1.2 - Sandbox update
Stablereleased this
2026-09-20 17:07:14 +02:00 | 0 commits to main since this releaseSummary
1.2 turns Herald from a bot that sent the raw diff to a model into one that reviews pull requests inside an ephemeral Dev Container. Each review now clones the PR head, builds and starts the repository's
devcontainer.json, and lets the model explore the code with read-only tools — the code is no longer shipped in the prompt. To support this, the project was split into a Cargo workspace (herald-server+ a newdevcontainer-rscrate), the third-party OpenRouter SDK was replaced by an in-tree client with tool calling, and Herald can now run in a container with nothing mounted but the container daemon socket. Review comments are anchored on changed lines and tagged with a severity.Important changes
- Sandboxed reviews (new core flow). Every review runs inside a disposable Dev Container built from the pull request's
.devcontainer/devcontainer.json. The model explores the repository with read-only tools (ls,file_size,read_file,grep,find) instead of receiving the code. A repository without a.devcontainer/devcontainer.jsoncan no longer be reviewed. - New
devcontainer-rscrate. Full devcontainer lifecycle (parse, build, up, hooks, exec, teardown) driven through the container daemon's Docker-compatible API via Bollard. Nodocker/podmanbinary is required inside the image, and both Docker and Podman sockets work. - Workspace restructure and binary rename. The single
heraldpackage became a workspace ofcrates/herald-serverandcrates/devcontainer-rs; the binary and package are nowherald-server(Containerfile, CI and scripts updated accordingly). - In-tree OpenRouter client.
openrouter-rswas dropped for a local client implementing non-streamingPOST /chat/completionswith tool calling, reasoning enabled, and cost reporting. It removes a duplicatereqwestversion from the tree. - Containerized deployment fixed. The clone and the build context are streamed to the daemon over the socket instead of being bind-mounted from a host path, so Herald works in a container with only
-v …/podman.sock:/var/run/docker.sock— no shared workspace directory. BOT_NAMEremoved. The bot's name is now the login of the Gitea user owningGITEA_TOKEN, resolved at startup (GET /api/v1/user).- New environment variables.
SANDBOX_MAX_ITERATIONS(default8) andDOCKER_HOST(defaultunix:///var/run/docker.sock).BOT_NAMEwas removed;.env.exampleand the README table updated. - Pull request data comes from the API, not the webhook. The diff is fetched from
/api/v1/repos/{owner}/{repo}/pulls/{n}.diff(the webhookdiff_urlis session-authenticated and does not serve private repositories), and the changed-file list is fetched and paginated for exact paths and statuses. - Review comments are anchored on changed lines. Each comment is placed on an
addedline (new_position) or aremovedline (old_position); the side is resolved from the diff, and any comment that does not match a changed line is dropped (with a warning). - Severity on every comment. Comments are tagged
bug,security,performanceormaintainability, shown at the start of the posted comment and broken down in the review summary.
Other changes
- Generated lockfiles excluded from the changes handed to the model (
Cargo.lock,package-lock.json,npm-shrinkwrap.json,yarn.lock,pnpm-lock.yaml,bun.lock(b),composer.lock,Gemfile.lock,poetry.lock,uv.lock,Pipfile.lock,go.sum,packages.lock.json,flake.lock,pubspec.lock). - Prompts rewritten for the tool-based flow: exhaustive reporting, "read before you assert", explicit
added/removedsemantics (removed lines are not in the working directory), anchoring rules, and a summary that also lists what the PR does well. - Sandbox isolation hardened. Each review gets its own image tag, container and network; the network is cut after
postCreateCommand/postStartCommand;runArgsfrom the untrusted PR are parsed but never applied;${localEnv:…}references are never read from Herald's environment (secret-exfiltration guard); every container command is bounded by a timeout and all resources are removed on completion or failure. - Diff size capped at 1 MiB, with an explicit error above it.
- Graceful shutdown deadline of 60 s, so a stuck sandbox cannot keep the process alive indefinitely.
- Startup warning when the container daemon is unreachable (every review would fail).
- Dependency and toolchain updates: Rust 1.98,
reqwest0.12 → 0.13,sentry0.48 → 0.49 (new client options API),tower-http0.6 → 0.7. - CI strengthened:
cargo fmt --check,cargo clippy --workspace --all-targets --all-features -- -D warnings, workspace tests, and a Containerfile build. - Containerfile reworked: multi-stage build, minimal runtime packages (
git,ca-certificates,libssl3t64,libzstd1,zlib1g), and the binary as PID 1 to receiveSIGTERM. - Dev container updated:
rust:1.98-trixiewithclippy/rustfmt, plus--userns=keep-idandlabel=disable;.zed/settings.jsonadded,.vscode/settings.jsonand.dockerignoreremoved. - README: new "Sandboxed reviews" section documenting the flow, the socket, the
runArgspolicy and the isolation guarantees.
Downloads
- Sandboxed reviews (new core flow). Every review runs inside a disposable Dev Container built from the pull request's
-
1.1: Metrics update
Stablereleased this
2026-07-26 21:57:51 +02:00 | 18 commits to main since this release- Adding auto fetch bot name (remove BOT_NAME env var)
- Adding prometheus metrics
Metric Type Description herald_webhooks_received_totalcounter Total webhooks received (label: event_type)herald_webhooks_duplicate_totalcounter Webhooks rejected as duplicates (label: event_type)herald_webhooks_channel_full_totalcounter Webhooks dropped because the bot channel was full (label: event_type)herald_bot_tasks_activegauge Bot tasks currently in progress herald_bot_tasks_completed_totalcounter Bot tasks completed successfully (label: event_type)herald_bot_tasks_failed_totalcounter Bot tasks that failed (label: event_type)herald_openrouter_cost_cents_totalcounter Total OpenRouter cost in cents (divide by 100 for USD) Downloads
-
released this
2026-06-16 22:14:57 +02:00 | 25 commits to main since this release- Fix missing env var error
- Fix missing sentry backtrace
- Fix trace spamming
Downloads
-
1.0
Stablereleased this
2026-06-12 22:42:11 +02:00 | 30 commits to main since this releaseFirst release with review action support
Downloads