Skip to content

Commit ce51277

Browse files
Jammy2211Jammy2211claude
authored
chore: drop expired release-notes banner; complete autohands registry (#254)
Two hygiene leftovers from the 2026-08-19 release-board census (#239). The time-boxed ANNOUNCEMENT banner in generate_release_notes.py expired 2026-07-24, so announcement_banner() had returned "" on every call since. Delete the mechanism rather than document it; the datetime.date import goes with it. The banner markdown also appears as a literal fixture string in test_slack_release_notes.py, which imports nothing from the deleted code — kept as the file's only blockquote -> mrkdwn case, with its comment corrected. `bin/autohands help` claimed to be "the registry of what is a CLI verb", but eleven modules in autohands/ had grown __main__ blocks without ever appearing in it. Nine become real verbs (generate_markdown, regenerate_navigator, the four workspace guards, slack_release_notes, tombstone, clone_seed), each with help text stating its actual input contract — they differ: cwd, --root, or a positional path. The rest are declared in a new INTERNAL_MODULES array with a one-line reason each, and printed by `autohands help`, so the registry describes the whole package rather than a subset. tests/test_autohands_registry.py makes that an enforced invariant: every executable module is a verb or allowlisted, the allowlist has no ghosts, every verb carries its SHORT_DESC + cmd_* + help_* trio, and the two lists are disjoint. Each assertion was negative-tested to confirm it fires. Refs #249 Co-authored-by: Jammy2211 <JNightingale2211@gmail.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
1 parent 90f108f commit ce51277

5 files changed

Lines changed: 374 additions & 46 deletions

File tree

AGENTS.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,15 @@ deep `verify_install` suite, and URL hygiene all live in PyAutoHeart now;
2424
`autohands verify_install` / `autohands url_check` / `autohands watch|status|
2525
tick|fix` are thin shims that delegate to `pyauto-heart`. Build keeps only the
2626
executor primitives: the build/notebook pipeline (`pre_build`, `generate*`,
27-
`run_all` / `run*`), the navigator catalogue (the `navigator.py` /
28-
`check_navigator.py` / `regenerate_navigator.py` modules — workflow-invoked,
29-
not CLI verbs), tagging + release (`tag_and_merge`, `bump_colab_urls`,
30-
`release.yml`), the release-notes and Slack tooling
31-
(`generate_release_notes`, `slack_release_notes`), the release board
32-
(`board`, published by `release_board.yml`), assistant seeding
33-
(`clone_seed`), and `repro_command`. `bin/autohands help` is the registry of
34-
what is a CLI verb; see `docs/internals.md` for the pipeline detail.
27+
`run_all` / `run*`), the navigator catalogue and the workspace guards, tagging +
28+
release (`tag_and_merge`, `bump_colab_urls`, `release.yml`), the release-notes
29+
and Slack tooling (`generate_release_notes`, `slack_release_notes`), the release
30+
board (`board`, published by `release_board.yml`), assistant seeding
31+
(`clone_seed`), and `repro_command`. `bin/autohands help` is the **complete**
32+
registry of `autohands/` — every module there is a CLI verb or an
33+
`INTERNAL_MODULES` entry, enforced by `tests/test_autohands_registry.py`, so
34+
read `help` rather than listing verbs here. See `docs/internals.md` for the
35+
pipeline detail.
3536

3637
See [`docs/internals.md`](docs/internals.md) for the build pipeline, workspace
3738
folder structure, config files, and `release.yml` details. Read it when

autohands/generate_release_notes.py

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -14,39 +14,9 @@
1414
import subprocess
1515
import sys
1616
from argparse import ArgumentParser
17-
from datetime import date
1817
from pathlib import Path
1918

2019

21-
# Time-boxed announcement banner prepended to generated release notes.
22-
# The banner is included only while today <= EXPIRY, then drops off
23-
# automatically — no follow-up edit needed. Set EXPIRY to None (or move the
24-
# date into the past) to disable. `repos` limits which repos show it; None
25-
# means all repos.
26-
ANNOUNCEMENT = {
27-
"expiry": date(2026, 7, 24),
28-
"repos": {"PyAutoLabs/PyAutoLens"},
29-
"markdown": (
30-
"> 📣 **Major Milestones Announcement** — PyAutoLens now ships an AI assistant "
31-
"(conversational + agentic), full JAX GPU support, and agentic-AI development via "
32-
"PyAutoScientist. "
33-
"[Read the announcement →](https://github.com/PyAutoLabs/PyAutoLens/discussions/603)"
34-
),
35-
}
36-
37-
38-
def announcement_banner(repo, today=None):
39-
"""Return the announcement markdown for `repo`, or "" if none applies today."""
40-
today = today or date.today()
41-
expiry = ANNOUNCEMENT.get("expiry")
42-
if not expiry or today > expiry:
43-
return ""
44-
repos = ANNOUNCEMENT.get("repos")
45-
if repos and repo not in repos:
46-
return ""
47-
return ANNOUNCEMENT.get("markdown", "")
48-
49-
5020
# Dependency chain: downstream repos include upstream changes
5121
UPSTREAM_DEPS = {
5222
"PyAutoLabs/PyAutoFit": [],
@@ -197,12 +167,6 @@ def generate_notes(repo, version, prs, upstream_prs_by_repo):
197167
name = REPO_NAMES.get(repo, repo.split("/")[-1])
198168
lines = [f"# {name} v{version}", ""]
199169

200-
# Time-boxed announcement banner (self-expiring; see ANNOUNCEMENT above).
201-
banner = announcement_banner(repo)
202-
if banner:
203-
lines.append(banner)
204-
lines.append("")
205-
206170
# Classify own PRs
207171
categories = {"breaking": [], "feature": [], "fix": [], "internal": []}
208172
for pr in prs:

0 commit comments

Comments
 (0)