Notable changes per release. The ## X.Y.Z section for each version is
published verbatim as that version's GitHub Release notes
(.github/workflows/pypi-release.yaml). Newest first. Releases before
0.1.1 predate this changelog; see the compare views at
https://github.com/max-sixty/tend/compare for their history.
- Generated workflows pin
actions/checkoutto v7. All generated workflows (and tend's own) move from checkout v6 to v7. The review workflow opts into v7's fork-PR checkout guard (allow-unsafe-pr-checkout: true), which otherwise refuses to check out a fork'srefs/pull/N/{merge,head}underpull_request_target(the "pwn request" guard), so fork-PR reviews keep running. (#725) - Both Claude harnesses update to claude-code 2.1.185. (#719)
- The bot surfaces a blocking scope rule instead of silently routing around it. When a
running-in-ciscope restriction blocks the right action — e.g. engaging an existing upstream thread in another repo — the bot now surfaces the blocker on the triggering thread and offers either to take the upstream action on approval or to relax the rule via the consuming repo'srunning-tendoverlay, rather than substituting a second-best local workaround without signaling it hit a wall. (#717)
- CI-poll loops fit the Bash tool's 10-minute cap. The bundled
running-in-cipoll recipes cap theirsleeploops at 9 iterations and call the Bash step withtimeout: 600000, so the harness no longer auto-backgrounds a longer loop and strands the gated follow-up (dismissing a stale approval, posting failure analysis). (#695) - Nightly workflow-regen bases its worktree on an open PR, not branch-ref existence. The
nightlyskill's regen step now bases on thetend/update-workflowsbranch only when an open PR rides it, and otherwise bases onHEADand drops any leftover remote branch. A PR previously closed without merge no longer leaves a stale branch that inflates the diff, produces an inaccurate PR body, or defeats the no-value skip. (#721)
- The codex
effortvalue list in the README and the install-tend skill is corrected tolow | medium | high | xhigh. (#710)
- Composite-action step bodies are de-duplicated into scripts under
shared/steps/, and each harness action lives under a harness-named path. Generated workflows now invokemax-sixty/tend/claude@X.Y.Z(andclaude-interactive) rather than the bare-root default; existing pinned refs keep resolving and the nightly regen stamps the new path automatically. (#712) review-reviewersdocuments thepull_request_reviewself-trigger as expected (non-)behavior, and theworker-deploycomment corrects the live-stream count to two. (#707, #711)
- The default
claudeharness runs the official binary headless behind the credential proxy. The rootaction.yamlwas rewritten to runclaude -pas a non-sudotend-sandboxuser behind the same credential-injecting mitmproxy the interactive harness uses, replacing theanthropics/claude-code-action@v1wrapper that handed the bot PAT and the Anthropic credential to the agent directly. Both credentials now live only in the proxy and never enter the agent's environment or disk; completion is theclaude -pexit code. The action gainsclaude_version,timeout_seconds, andmitmproxy_versioninputs and drops the unused claude-code-action passthroughs. (#704)
- Bundled skills replace guidance duplicated from
running-in-ci— triage's recheck-before-posting and review-runs' read-only-mount workaround — with references to the canonical sections. (#703) - The
claude-smokeworkflow that exercises the headless harness end-to-end becomesworkflow_dispatch-only, matchinginteractive-smoke. (#706)
- Interactive harness isolates both credentials behind the proxy. Phase 2 extends the credential-injecting proxy to the Anthropic model credential, so the sandboxed agent holds only dummies for both the GitHub PAT and the model token while the runner-owned proxy injects the real values per host. The agent toolchain now installs directly as the non-sudo sandbox user (dropping a ~200 MB per-run copy), and the proxy also injects the PAT for
raw.githubusercontent.com. (#686, #683, #684) - install-tend isolates each bot's auth in a per-bot
GH_CONFIG_DIR. Bot credentials live in a dedicated~/.config/gh-bots/<bot-name>dir selected per command and stored outside the OS keychain, removing thegh auth switchchoreography that could strand a bot as the active account and 403 a maintainer's pushes. (#688) - Interactive harness updated to claude-code 2.1.179. The pinned
claudebinary resolves--model opusto Opus 4.8. (#697)
- Bundled skill refinements: nightly skips stamp-only workflow-regen PRs and scopes "Notable changes" to adopter-relevant entries, review-reviewers keeps an audit trail on empty-window cycles, and over-prescriptive guidance is reframed as examples and open frames. (#693, #692, #689, #690, #675)
- tend-repo maintenance: a weekly task keeps the pinned agent binaries current, integration-fixture secrets reseed outside the sandbox, and the secret env-gating rejection analysis is recorded alongside a CLAUDE.md restructure. (#696, #685, #687)
- Claude harnesses run with
bypassPermissions. The previousdontAskmode hard-denies writes to Claude Code's protected paths (.github/, dotfiles), blocking autonomous fixes that touch those files. Everything the bot writes still lands through a reviewed PR. (#677) - GitHub Releases publish on tag push. The release workflow extracts the version's section from
CHANGELOG.mdand creates the release; 0.1.1–0.1.3 are backfilled. Nightly workflow-update PRs now summarize notable upstream changes instead of pasting a file list. (#678) - install-tend triages an existing bot PAT before minting a new one. The bot-token step runs the scope audit and routes to reuse, scope refresh, or first-time login. (#680)
- The review skill checks the PR's check rollup before approving, so visible CI failures aren't rubber-stamped. (#667)
- The interactive harness passes GitHub Actions context env vars (
GITHUB_RUN_ID,GITHUB_REPOSITORY, …) into the sandbox; skill recipes for run self-reference and URL construction depend on them. (#664)
- README clarifies that the weekly workflow approves dependency PRs rather than auto-merging them. (#673)
- Skill refinements across running-in-ci, triage, and ci-fix: end the turn only when work is shipped, defer test suites to PR CI, split CI monitoring into gated/ungated cases, label transient-tracker issues
tend-outage, and carve out bot-authored machine-report issues. (#661, #671, #669, #670, #666)
- Interactive harness isolates the GitHub PAT. The agent runs as a non-sudo
tend-sandboxuser; the PAT lives only in a local credential-injecting proxy that adds it for GitHub hosts, so it never enters the agent's environment. (#652) - Prior-run context recall. The bot recalls context from earlier runs on the same issue or PR instead of starting cold each invocation. (#649)
- tend now dogfoods the
claude-interactiveharness for its own review/mention/triage/ci-fix workflows. (#622)
- Worker reliability: throw on Search failures instead of caching an empty payload, return 503 (not a 200 all-zero payload) on cold-cache failure, and share the
/activitypayload across colos via a KV tier. (#648, #650, #653) - Site
liveDatapolling self-schedules so ticks can't overlap. (#655) - Mention workflow skips no-op sessions for undirected bot comments. (#608)
review-reviewerspre-creates the monthly tracking issue to eliminate a matrix race. (#657)
- Skill refinements across running-in-ci, notifications, review-runs, ci-fix, and running-tend; dead-input and template cleanups in the actions and generator.
claude-interactiveharness. A PTY-supervised alternative to the Agent SDK: runs the officialclaudebinary under ascript(1)supervisor with a Stop-hook sentinel. (#609)- Per-workflow harness override. Trial a different harness (and matching model) on one workflow at a time. (#612)
- Mention workflow uses
comment.updated_atso edit events report accurate queue delay. (#595) - Interactive harness: token-usage jq parser double-iterator fix, and the
-newerfilter dropped from the session-JSONL parser. (#616, #614)