REGRESSION: #1045's --diff-filter=d makes the rolling cut PR fail fragment-coverage — releases are blocked #1051

Closed
opened 2026-08-28 18:56:10 +02:00 by bosun · 0 comments
Owner

#1045 (merged 90f30ba4, 2026-08-28) excludes D-status entries from the fragment change set. The rolling cut PR deletes fragments as its entire purpose, so its change set is now empty and fragment-coverage refuses it as forgotten. The next release cannot cut.

Measured on the live rolling PR

#1043  base bb056e6 -> head d2aec51

git diff --name-status BASE...HEAD -- changelog.d
  D  changelog.d/1032-concurrency-regression-guard.internal.md
  D  changelog.d/1033.fixed.md
  D  changelog.d/1036-isolate-the-unknown-change-set-arm.internal.md
  D  changelog.d/1037-pre-push-battery.added.md
  D  changelog.d/1038.fixed.md
  D  changelog.d/1046-go-ci-runner-and-uncapped-lint.added.md
  D  changelog.d/735-adoption-docs-correction.internal.md

git diff --name-only --diff-filter=d BASE...HEAD -- changelog.d
  []
fragment-coverage: FAIL - forgotten: no changed fragment and no valid
no-changelog declaration

Why the fix was right and still did this

#1033 is correct: a PR that deletes a fragment and adds nothing must not be graded fragment-present. The rolling cut PR is the one legitimate member of that population — deleting fragments and writing CHANGELOG.md is exactly what rt prep does.

The predicate cannot distinguish "deleted a fragment and provided nothing" from "consumed the fragments into the CHANGELOG" — and the second is the release mechanism itself.

Candidate fixes, not ranked

  • treat a diff that deletes fragments and modifies CHANGELOG.md as the cut shape, and grade it present
  • exempt the rolling-prep branch by name, which is narrower and more brittle
  • have rt prep write the no-changelog declaration into the rolling PR body

⚠️ The first is the only one that describes the actual invariant. The other two encode where the cut happens rather than what a cut is.

Acceptance criteria

  • The rolling cut PR passes fragment-coverage without a per-branch exemption. PR #1052 implements the cut-consumed state from deleted fragment paths plus CHANGELOG.md changed, and its cut-signal arm passes.
  • A genuine delete-only PR — deletions with no CHANGELOG.md change — still FAILS, per #1033. The delete-only and CHANGELOG.md-only arms both fail as required.
  • An arm for each, and the arms must fail on each other's fixture. The CLI, gate, and workflow controls pair the fixtures; workflow wiring mutation makes both new arms fail.

Closeout

Release-toolkit PR #1052 was merged at exact merge commit bee4b31cfeb4874b1ca528c4ba611b1378bb96f0; its reviewed PR head was 856228182eb4c428371872bca8a6006a7bdf73e7. Official Lookout review 6158 was exact-bound and current, and Forgejo CI was 25/25 successful.

The merged contract requires CHANGED_FILES and PR_BODY; DELETED_FILES and CHANGELOG_CHANGED are optional metadata. When absent, the optional fields provide no cut signal and preserve old-caller behavior; a present malformed CHANGELOG_CHANGED value refuses. The cut shape is deleted fragments plus CHANGELOG.md changed, while delete-only remains forgotten.

The merged tree verifies the cut, delete-only, CHANGELOG.md-only, absent-optional-input, malformed-value, and workflow-mutation controls. Go test/vet/build, Bats 146/146, ShellCheck, fragment-check, and diff checks passed. All three acceptance criteria are discharged.

Refs frankenbit/release-toolkit#1033 and frankenbit/release-toolkit#1052.

`#1045` (merged `90f30ba4`, 2026-08-28) excludes D-status entries from the fragment change set. **The rolling cut PR deletes fragments as its entire purpose**, so its change set is now empty and `fragment-coverage` refuses it as `forgotten`. **The next release cannot cut.** ## Measured on the live rolling PR ``` #1043 base bb056e6 -> head d2aec51 git diff --name-status BASE...HEAD -- changelog.d D changelog.d/1032-concurrency-regression-guard.internal.md D changelog.d/1033.fixed.md D changelog.d/1036-isolate-the-unknown-change-set-arm.internal.md D changelog.d/1037-pre-push-battery.added.md D changelog.d/1038.fixed.md D changelog.d/1046-go-ci-runner-and-uncapped-lint.added.md D changelog.d/735-adoption-docs-correction.internal.md git diff --name-only --diff-filter=d BASE...HEAD -- changelog.d [] ``` ``` fragment-coverage: FAIL - forgotten: no changed fragment and no valid no-changelog declaration ``` ## Why the fix was right and still did this `#1033` is correct: *a PR that deletes a fragment and adds nothing must not be graded fragment-present.* **The rolling cut PR is the one legitimate member of that population** — deleting fragments and writing `CHANGELOG.md` is exactly what `rt prep` does. **The predicate cannot distinguish "deleted a fragment and provided nothing" from "consumed the fragments into the CHANGELOG"** — and the second is the release mechanism itself. ## Candidate fixes, not ranked - treat a diff that deletes fragments **and modifies `CHANGELOG.md`** as the cut shape, and grade it present - exempt the rolling-prep branch by name, which is narrower and more brittle - have `rt prep` write the `no-changelog` declaration into the rolling PR body ⚠️ **The first is the only one that describes the actual invariant.** The other two encode where the cut happens rather than what a cut is. ## Acceptance criteria - [x] The rolling cut PR passes `fragment-coverage` without a per-branch exemption. PR #1052 implements the cut-consumed state from deleted fragment paths plus `CHANGELOG.md` changed, and its cut-signal arm passes. - [x] A genuine delete-only PR — deletions with no `CHANGELOG.md` change — still FAILS, per `#1033`. The delete-only and `CHANGELOG.md`-only arms both fail as required. - [x] An arm for each, and the arms must fail on each other's fixture. The CLI, gate, and workflow controls pair the fixtures; workflow wiring mutation makes both new arms fail. ## Closeout Release-toolkit PR #1052 was merged at exact merge commit `bee4b31cfeb4874b1ca528c4ba611b1378bb96f0`; its reviewed PR head was `856228182eb4c428371872bca8a6006a7bdf73e7`. Official Lookout review 6158 was exact-bound and current, and Forgejo CI was 25/25 successful. The merged contract requires `CHANGED_FILES` and `PR_BODY`; `DELETED_FILES` and `CHANGELOG_CHANGED` are optional metadata. When absent, the optional fields provide no cut signal and preserve old-caller behavior; a present malformed `CHANGELOG_CHANGED` value refuses. The cut shape is deleted fragments plus `CHANGELOG.md` changed, while delete-only remains forgotten. The merged tree verifies the cut, delete-only, `CHANGELOG.md`-only, absent-optional-input, malformed-value, and workflow-mutation controls. Go test/vet/build, Bats 146/146, ShellCheck, fragment-check, and diff checks passed. All three acceptance criteria are discharged. Refs frankenbit/release-toolkit#1033 and frankenbit/release-toolkit#1052.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
frankenbit/release-toolkit#1051
No description provided.