Skip to content

release: changelog for 0.9.0 - #194

Merged
cachafla merged 1 commit into
mainfrom
andres/release-0.9.0
Nov 10, 2026
Merged

cachafla merged 1 commit into
mainfrom
andres/release-0.9.0

Conversation

@cachafla

Copy link
Copy Markdown
Collaborator

Moves Unreleased to 0.9.0 for the release. It's minor: WithUpstreamCredentials (#187), WithRequestTenant and WithTenants (#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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@kam-validmind kam-validmind left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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-10 heading goes directly under ## [Unreleased]. Unreleased stays in the file, now empty, ready for the next change.
  • The [Unreleased] link now compares v0.9.0...HEAD, and a new [0.9.0] link compares v0.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

@cachafla
cachafla merged commit e5b9c7a into main Nov 10, 2026
1 check passed
@cachafla
cachafla deleted the andres/release-0.9.0 branch November 10, 2026 20:37
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.

2 participants