Skip to content

breaking change: how a release is cut, agnostic and Python - #6

Merged
obarlik merged 1 commit into
mainfrom
standards/releasing
Aug 29, 2026
Merged

obarlik merged 1 commit into
mainfrom
standards/releasing

Conversation

@obarlik

@obarlik obarlik commented Aug 29, 2026

Copy link
Copy Markdown
Member

STANDARDS.md gave the version scheme and LIBRARY.md the release artifacts, but nothing said how a release is cut. Three traps fired on Codechu releases this month, all in that gap.

§5.1 (language-agnostic) — one command moves every version record and a test asserts they agree; the changelog entry precedes the tag; the tag is the only trigger and pushing it is the human signature; the pipeline is ordered so everything that can fail runs before the irreversible step, and the job gets the permissions its last step needs; verify the artefacts rather than the colour of the run, in both directions (a green run can leave a half-finished release, a red run can sit above a good one); and the procedure names its tooling and is re-read when the tooling changes.

lang/python/RELEASING.md — the four places a Python version hides, generating the PyPI long description instead of maintaining it, trusted publishing with contents: write for anything after the upload, the order that survives, and pipx-before-pip for tools.

Also fixes a dead anchor in the Python layer index (STANDARDS.md#13-active-repositories; that section has been §14 for some time) — found by walking every in-repo anchor, which now reports clean.

The version scheme was standardised; the act of releasing was not. §5
said what a number means and LIBRARY.md said what artifacts a release
produces, but nothing said how one gets out — the order, what cannot be
undone, and what to check afterwards. Every trap in the new §5.1 fired
on a Codechu release this month: a bump that moved one version record of
four; a job that published to the index and then failed for want of a
write permission, leaving a state no re-run could repair; and a release
guide still instructing a step the pipeline had stopped performing.

The Python half — where the version hides, generating the long
description rather than maintaining it, trusted publishing, and pipx
before pip for tools — is in lang/python/RELEASING.md, linked from the
layer index. That index also carried a dead anchor into STANDARDS §13
"Active repositories", which has been §14 for some time.
Copilot AI lite review requested due to automatic review settings August 29, 2026 15:49

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

This PR strengthens the organization’s documentation around how releases are cut, adding a language-agnostic procedure to STANDARDS.md and a Python-specific releasing guide that maps those rules onto PyPI workflows. It also updates the Python layer index to include the new guide and fixes a previously dead anchor reference.

Changes:

  • Added STANDARDS.md §5.1 documenting an ordered, tag-triggered release procedure with verification and permissions guidance.
  • Added lang/python/RELEASING.md describing Python-specific release concerns (version locations, long description generation, trusted publishing, and ordering).
  • Updated lang/python/README.md to link the new releasing guide and fix the “Active repositories” anchor to §14.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.

File Description
STANDARDS.md Adds an org-wide “Cutting a release” section under versioning/commits.
lang/python/RELEASING.md New Python-specific release playbook extending the org-wide release procedure.
lang/python/README.md Indexes the new Python releasing doc and fixes the active-repos anchor link.
Suppressed comments (3)

STANDARDS.md:166

  • Spelling consistency: “artefacts/colour” use British spelling, but STANDARDS.md already uses American spelling (e.g., “Color palette”). Consider standardizing here to match the rest of the doc.
5. **Verify the artefacts, not the colour of the run** — in **both**

lang/python/RELEASING.md:16

  • Spelling consistency: this table row uses “artefact”, but other Python docs use “artifact”.
| `<package>/__init__.py` | what the running tool reports, and what any artefact it produces is stamped with |

lang/python/RELEASING.md:25

  • Spelling consistency: “artefact” is used twice in this paragraph, but other docs use “artifact”.
shipping. `__init__.py` is the quiet one: it is what a produced artefact
records, and an artefact stamped with a version that did not produce it
cannot be reproduced.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread STANDARDS.md
Comment on lines +147 to +148
The version scheme above says what a number means. This says how one gets
out, and every line of it was paid for.
Comment thread STANDARDS.md
Comment on lines +152 to +154
hand moves some of them. *Incident: a release bumped the packaging
metadata and left three other records behind, so every artefact that
release produced was stamped with a version that did not produce it.*
Comment thread STANDARDS.md
irreversible step**, and grant the job the permissions its *last* step
needs — not its first. Publication to a package index cannot be undone
or repeated. *Incident: a release job published to the index and then
failed creating the source-forge release for want of a write
Comment thread lang/python/RELEASING.md

Extends [`STANDARDS.md` §5.1](../../STANDARDS.md#51-cutting-a-release),
which carries the language-agnostic rules. This is what §5.1 means when
the artefact is a wheel on PyPI.
Comment thread lang/python/RELEASING.md
Comment on lines +31 to +32
**generate it** and check it in CI — a copy maintained by remembering to
is a copy that ships one revision behind, and only a reader notices.
@obarlik
obarlik merged commit 482b11d into main Aug 29, 2026
1 check passed
@obarlik
obarlik deleted the standards/releasing branch August 29, 2026 15:52
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