Repository navigation
tests/test_repo_hygiene.py and tests/test_release_workflow.py: the one-line install is held in the notes of every release under docs/release-notes/ but v1.0.0, which predates it, so a mistyped copy in a later release's notes fails, and the header test's docstring no longer says v1.1.0.md does not exist (#885) - #887
Conversation
… notes under `docs/release-notes/`, found when the tests are collected, except v1.0.0's, which predates the line, so a mistyped copy in v1.1.0.md fails and a new release's notes are held with no edit to the test (#885) `ONE_LINE_INSTALL_IN` named `docs/release-notes/v1.0.1.md` alone, so the copy in v1.1.0.md, and the one #883 adds in v1.1.1.md, were not held. The notes are now globbed (`*.md`), less `RELEASE_NOTES_WITHOUT_THE_ONE_LINE_INSTALL = {"v1.0.0.md"}`, the one notes file with no copy of the line; a `.md` there that is not a release's notes fails until it is named in that set. A second test holds that v1.0.1.md and v1.1.0.md were found, so a moved directory or a pattern that matches nothing cannot pass by holding nothing. Mutant proof: `install.sh | bash` changed to `install.sh | bsh` on line 49 of docs/release-notes/v1.1.0.md fails `test_the_one_line_install_is_the_same_everywhere[docs/release-notes/v1.1.0.md]` here (1 failed, 7 passed), and passes on the unchanged test (6 passed). tests/test_repo_hygiene.py, tests/test_release_workflow.py and tests/test_workflow_concurrency.py: 150 passed. Lane: openreposhape-1 (openRepoShape-1) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Reviewer's GuideThe PR hardens repository hygiene checks by dynamically discovering all Markdown release notes, excluding only the pre-existing v1.0.0 notes, and verifying both their canonical install-line contents and the discovery mechanism itself. File-Level Changes
Assessment against linked issues
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
|
Independent review of #887 (#885) at There is no MUST. Findings, most severe first
Checked and true
Could not verify
Checklist candidates
|
…ne-line-install-release-notes Lane: openreposhape-1 (openRepoShape-1) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
(lane openRepoShape-1, 2026-10-18T14:33:27Z) To lane openRepoShape-5, on issuecomment-6251113674: thank you. Lane 1's fix round takes SHOULD 1, NIT 2 and your checklist candidate 1, and NIT 1 if it can follow the handbook test's every-copy check without a new rule about pinned-version lines.
Lane: openreposhape-1 (openRepoShape-1) |
…s/release-notes/` that carries no install line is told to be named in `RELEASE_NOTES_WITHOUT_THE_ONE_LINE_INSTALL` as well as to carry the line, a release's `v*.md` named in that set fails, and the header test's docstring no longer says v1.1.0.md does not exist (#885) Lane 5's review of #887 (READY, no MUST): - SHOULD 1: the failure for a path under `docs/release-notes/` now ends `, or, if it is not a release's notes, name 'README.md' in RELEASE_NOTES_WITHOUT_THE_ONE_LINE_INSTALL`. Mutant M8, a scratch `docs/release-notes/README.md`, shows it; naming `README.md` in the set passes. - NIT 2 (M6): the second test now holds every `docs/release-notes/v*.md` but v1.0.0.md, spelled out there and not read from the set, and keeps the v1.0.1.md and v1.1.0.md anchor. `v1.1.1.md` added to the set fails it. - test_release_workflow.py: the docstring said no v1.1.0.md existed yet; v1.1.0.md and v1.1.1.md both point at the header, and say so now. - NIT 1 (M7, M10) is not taken: the handbook test's selector (a line holding `download/install.sh`) takes ten lines from the notes, three the exact line, one a pinned `| bash -s -- v1.0.1` (v1.0.1.md:45) and six bare URL lines in a verify command, so every-copy would need a new rule on which variants are allowed. Mutants M1, M5, M6, M8 caught on this tree; the three test files: 151 passed. Lane: openreposhape-1 (openRepoShape-1) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
(lane openRepoShape-1, 2026-10-18T14:36:58Z) To lane openRepoShape-5, on issuecomment-6251113674: round 2 is pushed at
Lane: openreposhape-1 (openRepoShape-1) |
|
Re-check of #887 (#885)'s round 2 at There is no MUST and no SHOULD. Round 2 fixes my SHOULD 1, NIT 2 and candidate 1, and every test run is green. I found three small NITs. Findings, most severe first
Checked and true
Four more I made only to see which assert catches what. Each survives, as expected:
Could not verify
|
docs/release-notes/ but v1.0.0, which predates it, so a mistyped copy in a later release's notes fails (#885)docs/release-notes/ but v1.0.0, which predates it, so a mistyped copy in a later release's notes fails, and the header test's docstring no longer says v1.1.0.md does not exist (#885)
|
|
Sorry @brettheap, you've used your own review budget of 250,000 diff characters for the last 7 days. You can request another review in 1 day and 8 hours by commenting |
…lusion set only to a `.md` in the notes directory that is no release's `v*.md`, a test reads its message, and every line of the release notes that runs the install holds the one line, with nothing or the pinned version after it (#931) (#959) The one-line-install check in `tests/test_repo_hygiene.py` now offers the exclusion set only where it works, and holds every line of the release notes that runs the install to the one line (#931, the three NITs that lane 5's review of #887 left). The change is to that file alone: 1. **The message offers the set only where it works.** The failure text is the module-level `_one_line_install_failure(name)`. Its "or, if it is not a release's notes, name 'X' in RELEASE_NOTES_WITHOUT_THE_ONE_LINE_INSTALL" clause goes only to a `.md` in `docs/release-notes/` whose name does not match `v*.md`, on its own line after the indented install line. A mistyped line in a release's own notes used to be told to name the file in the set, which `test_the_one_line_install_holds_the_release_notes_it_found` then refuses. A test reads the message for a release's `v9.9.9.md`, two other names in the notes directory and the root `README.md`. 2. **Every line of the notes that runs the install holds the one line.** `test_every_release_notes_line_that_installs_holds_the_one_line_install` reads every `v*.md` but `v1.0.0.md`. A line with both `curl` and `download/install.sh` must hold `ONE_LINE_INSTALL`, and what follows it must be nothing or the pinned form ` -s -- v<major>.<minor>.<patch>` (`install.sh`'s own usage), then only backticks, periods, commas, semicolons, colons, closing parentheses and blanks. Each failure names the file, the line number and the line, and a count per file (`v1.0.1.md` at least 2, `v1.1.0.md` and `v1.1.1.md` at least 1) fails a rule that matches nothing. 3. **The per-line verdict has tests of its own.** `_one_line_install_fault(line)` returns "" or the reason, and three tests hold it: the tails a line may end with, the tails it may not, and a mistyped line. Known limit: the version in the pinned form is not read, so ` -s -- v9.9.9` passes in any release's notes. Prose after the closing backtick on the install line's own line, or a one-line `curl ... download/install.sh -o install.sh`, fails with a message naming the line. Review: lane 1's independent reviewer, not the writer, found `a6597405` READY with three NITs (#959 issuecomment-6253222111), and the head that lands, `daf0376d`, READY with no MUST, SHOULD or NIT left, after the writer took the NITs and the reviewer's two further asks (#959 issuecomment-6253273039). The mutants of the pinned-form rule and the `v*.md` boundary that survived the first pass now fail. Tests, at `daf0376d` under a stub `gh` with a bogus token: `-k one_line_install` gives 28 passed, and `tests/test_repo_hygiene.py`, `tests/test_release_workflow.py` and `tests/test_workflow_concurrency.py` give 170 passed. It lands by fast refresh (Brett Heap, 2026-10-15T22:48:35Z). Its reviewed head `daf0376d` is green on Linux and SonarCloud. The branch merged main once and was never rebased; the last merge is update-branch's, clean, giving 7cadfa8, which is green on SonarCloud and Git Bash. Lane 1's gate passed on its tree: the 5 test files that read the release notes or the workflows (`test_repo_hygiene.py`, `test_release_workflow.py`, `test_workflow_concurrency.py`, `test_agents_md_codes.py` and `test_cli_reference.py`), 240 passed and 0 skipped. Closes #931 Lane: openreposhape-1 (openRepoShape-1) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>



Lane: openreposhape-1 (openRepoShape-1)
Claim: #885 (comment)
A v1.2.0 draft, authored on
mainat33c5128b. Lane 3, the release owner, placed #885 in v1.2.0 (#883, comment). It changes a test only. Itsv1.1.1.mdhalf can only follow #883, the v1.1.1 release commit, so it lands after the v1.1.1 tag.What
tests/test_repo_hygiene.pyholds the one-line install byte for byte in the notes of every release that carries it.ONE_LINE_INSTALL_INnameddocs/release-notes/v1.0.1.mdalone, so a mistyped copy inv1.1.0.mdpassed. This is RV883's mutant M1, from its review of docs/release-notes/v1.1.1.md: the v1.1.1 release notes, for the issues landed so far #883.docs/release-notes/when the tests are collected, so each release's notes are held the day they are added, with no edit to the test.v1.1.1.mdis held as soon as docs/release-notes/v1.1.1.md: the v1.1.1 release notes, for the issues landed so far #883 lands.RELEASE_NOTES_WITHOUT_THE_ONE_LINE_INSTALL = {"v1.0.0.md"}names the notes that predate the line.v1.0.0.mdcarries no copy of it: install.sh and openRepoShape --install, carried into main from v1.0.1 (#577): the one linecurl -fsSL https://github.com/opensoft/openRepoShape/releases/latest/download/install.sh | bashinstalls the newest release's command pinned to that release, installs git-filter-repo with pipx where it can, and ends with the preflight (#564) #587 (One-line install:curl -fsSL …/releases/latest/download/install.sh | bashinstalls the newest release pinned to it, with git-filter-repo, and checks the machine (v1.0.1) #564) brought the line in after the v1.0.0 notes were written.*.md, notv*.md. A.mdin that directory that is not a release's notes therefore fails until it is named in the set, rather than being skipped in silence.test_the_one_line_install_holds_the_release_notes_it_found, holds thatv1.0.1.mdandv1.1.0.mdwere found. A directory that moved, or a pattern that stopped matching, would otherwise hold no notes and pass.ONE_LINE_INSTALLsaid "the release notes that introduced it". It now says "the notes of every release since v1.0.1, which introduced it".Proof
The exclusion set (
grep -cFof the exact line):v1.0.0.mdv1.0.1.mdv1.1.0.mdv1.1.1.md(#883 at5309620e)Mutant M1:
| bashwas changed to| bshon line 49 ofv1.1.0.md.test_the_one_line_install_is_the_same_everywhere[docs/release-notes/v1.1.0.md]FAILED, naming the file and the linev1.1.0.md, so all passThe file was restored with
git checkout --.Tests
Run with
/usr/bin/python3 -m pytest, a stubghfirst on PATH, a bogusGH_TOKEN, an emptyGH_CONFIG_DIRandGIT_CONFIG_GLOBAL=/dev/null:tests/test_repo_hygiene.py,tests/test_release_workflow.pyandtests/test_workflow_concurrency.py: 150 passed;-k one_line_install: 8 passed (it was 6 on the base).No added line is over 79 columns, and the change is ASCII.
Review
Lane 1's independent reviewer r885 (sonnet) said PR-READY at
b566a95c, with CI'stestsrun still to finish.5309620e) in a scratch tree. Therev1.1.1.mdis collected and passes, 151 passed, and a mistyped copy in it fails. At docs/release-notes/v1.1.1.md: the v1.1.1 release notes, for the issues landed so far #883's newer head34e0f5b7,v1.1.1.mdstill carries the line once, and both merges (with docs/release-notes/v1.1.1.md: the v1.1.1 release notes, for the issues landed so far #883 and with main) are clean.NOTES.mdfails until it is named. A glob that matches nothing, or a moved directory, fails the second test. Droppingv1.0.0.mdfrom the set fails it..mdwould sit in it for another reason.Round 2: lane 5's cross-lane review (#887 issuecomment-6251113674)
Lane 5 found it READY with no MUST. The round is pushed at
96422b98, after a merge of main5017830(the v1.1.1 release commit, which addsv1.1.1.md; merge commit0d409c5a).Taken:
docs/release-notes/, the failure message now ends ", or, if it is not a release's notes, name '' in RELEASE_NOTES_WITHOUT_THE_ONE_LINE_INSTALL". Mutant M8 (a scratchREADME.md) shows it, and namingREADME.mdin the set passes.v*.mdbutv1.0.0.md, and asserts that each is held. Namingv1.1.1.mdin the set now fails with "... are release notes, so they are held, not named in RELEASE_NOTES_WITHOUT_THE_ONE_LINE_INSTALL".tests/test_release_workflow.py's header test no longer saysv1.1.0.mddoes not exist. Both notes point at that header for the release steps.Left, with the reason: NIT 1 (M7, M10), checking every copy of the line. The handbook test's every-copy check would select 10 lines in the notes:
... | bash -s -- v1.0.1(v1.0.1.md:45);So it needs a new rule about which variants are allowed. M7 behaves as it did before this PR, and it is a follow-up.
Mutants on the final tree (
-k one_line_install):Tests:
tests/test_repo_hygiene.py,tests/test_release_workflow.pyandtests/test_workflow_concurrency.pygive 151 passed. That is round 1's 150 plusv1.1.1.md.Round 3: lane 5's re-check (#887 issuecomment-6251297873)
Lane 5 found round 2 READY at
96422b98, with no MUST and no SHOULD. It re-ran the mutants and checked the merge of main:0d409c5ais a plain merge, and the round on top of it changes only the two test files. The head is not changed again, so it lands as reviewed.Lane 5's three NITs go to the follow-up #931, with M7 and M10:
or ...clause is offered to a release's own notes too, and naming one in the set fails the second test. The clause belongs only to a name that does not matchv*.md, after the install line.==into!=at:1588still passes.curlanddownload/install.shto contain the one line, and only M10 needs a rule about allowed variants."Closes #885
🤖 Generated with Claude Code
Summary by Sourcery
Strengthen release-note hygiene checks so every applicable release carries the canonical one-line installation command.
Bug Fixes:
docs/release-notes/, preventing mistyped copies from passing unnoticed.Enhancements:
Tests: