Skip to content

I2826 — A GitHub release carries the tool's own changelog for its tag, never GitHub's generated notes

Publish each GitHub release with the body `majordomus release changelog` composes for its tag (the release's decisions, including a release declaration such as ADR 0175, its conventional changes and its artifacts) instead of `gh release create --generate-notes`, and refuse a release whose published body is not that projection.

READY wave 0 · p2 · implementation profile · parallel safe

Part of safe-self-update — Every mesh node follows the published release by itself, versions meet safely, and a release's provenance can be checked.

Ready. Every dependency is done, so majordomus plan start I2826 will be accepted.

Objective

Publish each GitHub release with the body `majordomus release changelog` composes for its tag (the release's decisions, including a release declaration such as ADR 0175, its conventional changes and its artifacts) instead of `gh release create --generate-notes`, and refuse a release whose published body is not that projection.

Why

Found on 2026-10-17 while preparing v1.0.0-alpha.1's declaration (ADR 0175): .github/workflows/release.yml creates the release with --generate-notes, so the body a person reads is GitHub's list of merged pull requests, authored by nobody in this repository, while ADR 0029 says the changelog is composed from the layer and every surface is derived. The release record's notes_url points back at that page. The only authored text that reaches the tool's output for a tag is a decision dated in its window. Deferred past the alpha by the release seat: no release-path change before v1.0.0-alpha.1.

Current state

The GitHub release body is GitHub's generated pull request list; release.changelog is printed by the tool and published nowhere a release reader looks.

Desired state

release.yml writes `majordomus release changelog --tag <tag>` (or the equivalent capability output) as the release body; a check refuses a published release whose body differs from that projection; docs/RELEASE.md says so.

Scope

  • .github/workflows/release.yml
  • apps/majordomus-cli/src/capability/builtin/release.rs
  • scripts/ci/release-check
  • docs/RELEASE.md
  • test/cases/3341_a_release_carries_its_own_changelog.sh

Dependencies

None. This issue is a root of the graph.

Acceptance criteria

  • A release built from a fixture tag is created with the body the tool's changelog composes for that tag, and no --generate-notes
  • release-check refuses a published release whose body is not the tool's changelog for its tag, naming the command that writes it

Validation

  • bin/majordomus plan validate
  • bash scripts/ci/release-check

Evidence required

  • release_body_is_the_changelog_case

Evidence

None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.

Timeline

started
—
verified
—
completed
—

Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.

Canonical record: .ai/repo/project/issues/I2826.yaml. Read it back with majordomus plan show I2826.

Searches the titles and descriptions of every page this site publishes.