Repository navigation
release: changelog for 0.9.0 - #194
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kam-validmind
left a comment
There was a problem hiding this comment.
Merge with recommendations · no blocking issues · 1 optional small fix · no questions for you
This PR only moves the Unreleased changelog entries under a new 0.9.0 heading and updates the compare links. I ran the release recipe's notes extraction against it: it picks up the whole 0.9.0 section (Added, Security, Fixed) and stops at 0.8.0. Everything merged since v0.8.0 (#187, #193) is covered, and every option the notes name exists in the code. The upgrade notes for WithRequestTenant embedders are present.
Small fixes: F1 the reworded upstream 401 error is a change to existing behavior but sits under Added; Fixed would be easier to find.
Ready for your approval, @kam-validmind.
calibrated-review v3 · review · run by @kam-validmind · head 5862315
Full review: what changed, how it works, what we checked
What this PR does
Atryum is about to release version 0.9.0. The release script publishes the changelog section whose heading matches the tag as the top half of the GitHub release notes. This PR gives the entries that were waiting under "Unreleased" the heading ## [0.9.0] - 2026-11-10, and updates the links at the bottom of the file. No code changes. People reading the 0.9.0 release page are the ones who see the result.
How it works
The change is four added lines and one removed line in CHANGELOG.md:
- A new
## [0.9.0] - 2026-11-10heading goes directly under## [Unreleased]. Unreleased stays in the file, now empty, ready for the next change. - The
[Unreleased]link now comparesv0.9.0...HEAD, and a new[0.9.0]link comparesv0.8.0...v0.9.0.
After the merge, a maintainer tags the commit v0.9.0, pushes the tag, and runs just release v0.9.0. The script strips the v, finds the heading ## [0.9.0], and copies every line up to the next ## [ heading into the release notes.
Findings
🟡 F1: The reworded upstream 401 error is listed under Added
- What goes wrong: An operator upgrading from 0.8.0 scans the notes for behavior that changed. The 0.9.0 section has no "Changed" group. One entry does change existing behavior for every install: when an upstream server answers
401, the error now reads "the upstream rejected the credential (HTTP 401)" instead of "unexpected end of JSON input". That entry is the fourth bullet under "Added", between two new options. - Why it matters: Little. Nothing breaks, and the new message is better. A reader looking for fixes may miss it. This is a tidiness point, and the author is free to decline it.
- Where:
CHANGELOG.md:38(the bullet),CHANGELOG.md:12(the "Added" heading),internal/mcp/client.go:1084(the new message). - Fix: Move that one bullet to the "Fixed" group of the 0.9.0 section. No wording change is needed.
- How we know: Read at the PR head. The repo's release-notes guide asks for Keep a Changelog groups, where a corrected message belongs under Fixed or Changed.
What we checked and found safe
| What we checked | Why it is safe here |
|---|---|
| The release script finds the section | Running the script's extraction against the file at this PR's head returns 65 lines with the Added, Security and Fixed groups, and stops at the 0.8.0 heading. |
| The heading format | It is ## [0.9.0] - 2026-11-10: no v prefix, today's date, as the release-notes guide requires. |
| Unreleased is kept | The ## [Unreleased] heading is still there and empty, so the next PR has a place to add its entry. |
| Nothing merged since 0.8.0 is missing | The history from v0.8.0 to this PR holds only #187 (upstream credentials) and #193 (many tenants). Both are described in the section. |
| The notes name real things | Every option and type the section names (WithUpstreamCredentials, WithRequestTenant, WithTenants, UpstreamUnavailable, UpstreamInitialize, ErrNoTenant, tenant.Lookup) exists in the code at this head. |
| The upgrade notes the PR promises | The three notes for an embedder that sets WithRequestTenant are present: a query with no tenant fails, Atryum refuses to start as a database login that row-level security does not bind, and config [[upstreams]] belong to the default tenant (under Security). |
| The compare links | Both links are correct. No v0.9.0 tag exists yet, so they start working when the tag is pushed, which is the normal order. |
| The version number | A minor bump fits: the release adds options, and the project is still before 1.0. |
| Configuration and rollout (architecture checklist) | The only rollout step here is the release order: merge, tag, push the tag, release. The script reads the notes from the tagged commit, so this PR must merge before the tag is made. |
| Other architecture topics | Concurrency, tenant isolation, security, API, database, messaging, performance, frontend and error handling do not apply: no code, schema or setting changes. |
Not reviewed
The PR says "nothing changes for a single-tenant Atryum". I did not re-verify that in the code of #187 and #193; those PRs had their own reviews. From the changelog text, the reworded 401 message (F1) is the one change a single-tenant install sees. Only the license check ran on this PR; no build or test check ran, which is expected for a changelog-only change.
Terms used here
- Compare link: a GitHub URL that shows every commit between two tags.
- Embedder: a program that runs Atryum inside itself as a Go library, instead of as a standalone server.
- Tenant: one organization's separate set of data inside a shared database.
- Row-level security: a Postgres feature that shows a database login only the rows it is allowed to see.
- Upstream: a tool server that Atryum forwards an agent's calls to.
Agent handoff · calibrated-review v3 · review · 5862315
calibrated-review: 3
mode: review
pr: validmind/atryum#194
head: 5862315dc
merge_base: 68b25cddf
run_by: kam-validmind
verdict: merge-with-recs
downgraded: 0
items:
- id: F1
class: fix-now
type: hygiene
direction: safe
title: The reworded upstream 401 error is listed under Added, not Changed or Fixed
scenario: >-
An operator upgrading from 0.8.0 reads the 0.9.0 notes for behavior
changes. The 0.9.0 section has no Changed group, and the one change that
reaches every install (a tool call or tool listing that gets a 401 from
an upstream now fails with "the upstream rejected the credential (HTTP
401)" instead of "unexpected end of JSON input") sits as the fourth
bullet under Added. Nothing breaks; the entry is only harder to find.
Not blocking: safe direction, and no written rule in the repo is broken.
evidence:
- 'CHANGELOG.md:38 at head: the bullet starting "A `401` from an upstream" is under "### Added" (line 12)'
- internal/mcp/client.go:1084 at head produces the new message, so the entry describes a change to existing behavior
- '.claude/skills/release-notes/SKILL.md:27 asks for Keep a Changelog groups (Added, Changed, Fixed, Security)'
fix: >-
Optional. Move the bullet that starts "A `401` from an upstream on a
tool call or a tool listing" from "### Added" to "### Fixed" in the
0.9.0 section of CHANGELOG.md. No other text changes.
done_when: the 401 bullet is under Fixed (or Changed) in the 0.9.0 section, or the author declines
sweeps:
- {id: S1, hits: 0, checked: 0, findings: []}
- {id: S2, hits: 0, checked: 0, findings: []}
- {id: S3, hits: 0, checked: 0, findings: []}
- {id: S4, hits: 0, checked: 0, findings: []}
- {id: S5, hits: 0, checked: 0, findings: []}
- {id: S6, hits: 0, checked: 0, findings: []}
- {id: S7, hits: 0, checked: 0, findings: []}
- {id: S8, hits: 0, checked: 0, findings: []}
- {id: S9, hits: 0, checked: 0, findings: []}
- {id: S10, hits: 0, checked: 0, findings: []}
- {id: S11, hits: 0, checked: 0, findings: []}
- {id: S12, hits: 0, checked: 0, findings: []}
- {id: S13, hits: 0, checked: 0, findings: []}
- {id: S14, hits: 0, checked: 0, findings: []}
- {id: S15, hits: 0, checked: 0, findings: []}
- {id: S16, hits: 0, checked: 0, findings: []}
- {id: S17, hits: 0, checked: 0, findings: []}
sweeps_note: >-
The diff is one file, CHANGELOG.md (4 added lines, 1 removed). No sweep's
pathspec (Go, migrations, API routes, hook, go.mod, docs/, web/) matches
it, so every sweep is recorded with zero hits.
arch:
- topic: Concurrency
applies: no
- topic: Tenant isolation and access
applies: no
- topic: Security
applies: no
- topic: API
applies: no
- topic: Database
applies: no
- topic: Messaging and integrations
applies: no
- topic: Performance and scale
applies: no
- topic: Configuration and rollout
applies: yes
checked: >-
the release path that consumes this file: the heading format the
release-push recipe matches, the notes it extracts, the compare links,
and whether the section covers every change since v0.8.0
findings: []
safe_because: >-
the release-push awk run against CHANGELOG.md at head with ver=0.9.0
extracts 65 lines with the Added, Security and Fixed groups; the
Unreleased heading stays, empty; v0.8.0..head holds only PRs 187 and
193 and both are in the section; no v0.9.0 tag exists yet, so the new
compare links resolve once the tag is pushed
- topic: Frontend
applies: no
- topic: Errors and observability
applies: no
accepted_risks:
- checked: the changelog names only things that exist at head
why: >-
WithUpstreamCredentials, WithRequestTenant, WithTenants,
UpstreamUnavailable, UpstreamInitialize, ErrNoTenant, tenant.Lookup,
SessionKey and OnUnauthorized all appear in non-test Go at head
- checked: minor version bump
why: >-
the release adds options and the project is pre-1.0; the upgrade notes
the PR body names (a query with no tenant fails, the start-up refusal,
config upstreams belong to the default tenant) are in the section
- checked: compare links
why: Unreleased now compares v0.9.0...HEAD and a 0.9.0 link compares v0.8.0...v0.9.0
verification:
- run: >-
git show 5862315:CHANGELOG.md | awk -v ver=0.9.0 (the release-push
recipe from the Justfile)
result: 65 lines, 3 groups, stops at the 0.8.0 heading
- run: git log --oneline v0.8.0..5862315
result: PR 187, PR 193 and this commit; nothing else
- run: git ls-remote --tags https://github.com/validmind/atryum.git 'v0.9*'
result: no tag yet
- run: gh pr checks 194
result: only license/cla ran, pass; no build or test check ran on this PR
- claim: 'PR body says "Nothing changes for a single-tenant Atryum"'
result: >-
NOT CHECKED in code. From the changelog text, the reworded 401 error
(F1) is the one change that reaches a single-tenant install.
- claim: 'PR body says "No docs change: this only renames the changelog section"'
result: verified, the diff touches only CHANGELOG.md
Moves Unreleased to 0.9.0 for the release. It's minor:
WithUpstreamCredentials(#187),WithRequestTenantandWithTenants(#193) are new options.Nothing changes for a single-tenant Atryum. The upgrade notes are for an embedder that sets
WithRequestTenant: a query with no tenant now fails, Atryum refuses to start as a login row-level security doesn't bind, and config[[upstreams]]belong only to the default tenant (under Security).No docs change: this only renames the changelog section.
🤖 Generated with Claude Code