Release: dev → main (download restarts, misfiled attachments, undated posts) #259

Merged
bvandeusen merged 7 commits from dev into main 2026-09-25 12:19:51 -04:00
2 changed files with 18 additions and 8 deletions
Showing only changes of commit 32874ca678 - Show all commits
+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."""