fix: the release page drops internal rule numbers and the miscounted "three" images
CI and images / lint (push) Successful in 2s
CI and images / extension-version (push) Successful in 2s
CI and images / extension-test (push) Successful in 17s
CI and images / frontend-build (push) Successful in 20s
CI and images / backend-lint-and-test (push) Successful in 32s
CI and images / integration (push) Successful in 2m21s
CI and images / sign-extension (push) Successful in 3s
CI and images / build-agent (push) Successful in 6s
CI and images / build-web (push) Successful in 6s
CI and images / smoke-web (push) Successful in 41s
CI and images / promote (push) Successful in 1s

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LVjrnpQjRgHdvq95rASoiR
This commit is contained in:
2026-09-25 10:09:47 -04:00
co-authored by Claude Opus 5.5
parent edd2daa16a
commit 32874ca678
2 changed files with 18 additions and 8 deletions
+8 -8
View File
@@ -210,8 +210,8 @@ def render(
) )
parts.append( parts.append(
f"Built from `{short}`. The rollback unit is the immutable `:c-` tag " f"Built from `{short}`. To roll back to this release, pull these "
f"(rule 145) — these three move together:\n\n```\n" f"immutable `:c-` tags — the images move together:\n\n```\n"
+ "\n".join(f"{image}:c-{short}" for image in IMAGES) + "\n".join(f"{image}:c-{short}" for image in IMAGES)
+ "\n```" + "\n```"
) )
@@ -221,10 +221,10 @@ def render(
# truncated to MAX_COMMITS, which is 200 lines of internal build-out # truncated to MAX_COMMITS, which is 200 lines of internal build-out
# presented to someone who has never seen this project. # presented to someone who has never seen this project.
parts.append( parts.append(
"---\n\n_First release under rule 148's `vYYYY.MM.DD.HHMM` shape, so " "---\n\n_The first release, so there is no earlier one to diff "
"there is no predecessor to diff against and no changelog to derive. " "against and no changelog to derive. The description above is "
"The description above is README.md's, quoted at publish time. Later " "README.md's, quoted at publish time. Later releases carry the "
"releases carry the commits since the previous one._" "commits since the previous one._"
) )
return "\n\n".join(parts) return "\n\n".join(parts)
@@ -257,8 +257,8 @@ def cross_checks(tag: str, sha: str) -> list[str]:
if not RULE_148.match(tag): if not RULE_148.match(tag):
notes.append( notes.append(
f"`{tag}` is not rule 148's `vYYYY.MM.DD.HHMM` shape. Published " f"`{tag}` is not the `vYYYY.MM.DD.HHMM` release-tag shape. "
f"anyway — the old `v26.*` tags predate the rule." f"Published anyway — the old `v26.*` tags predate it."
) )
else: else:
derived = artifact_version("web") derived = artifact_version("web")
+10
View File
@@ -14,6 +14,7 @@ re-implementation of it.
""" """
from __future__ import annotations from __future__ import annotations
import re
import subprocess import subprocess
from pathlib import Path from pathlib import Path
@@ -162,6 +163,15 @@ def test_the_first_release_describes_the_product_instead_of_diffing(shaped_histo
assert not [ln for ln in body.split("\n") if ln.startswith("- work landing")] assert not [ln for ln in body.split("\n") if ln.startswith("- work landing")]
@pytest.mark.parametrize("tag", ["v2026.08.28.2208", "v2026.08.29.1000"])
def test_the_release_page_cites_no_internal_rule_numbers(shaped_history, tag):
"""The release page is read by strangers. "rule 145" names a record in the
operator's own notes, which a reader cannot open — say what the rule means
instead. Covers the first-release overview and the changelog body."""
body = body_of(notes(tag, cwd=shaped_history))
assert not re.search(r"\brule\s+\d+", body, re.IGNORECASE), body
def test_the_overview_is_readmes_words_not_a_second_copy(shaped_history): def test_the_overview_is_readmes_words_not_a_second_copy(shaped_history):
"""Two hand-maintained descriptions of one product drift and nothing """Two hand-maintained descriptions of one product drift and nothing
catches it. The release page quotes README.md so there is one source.""" catches it. The release page quotes README.md so there is one source."""