manifest-vs-actual-history guard: extend manifest-check.sh for v0.4.0 silent-desync class #56
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#56
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Why this exists now (and not deferred to discovery)
v0.4.0 (#52) introduces
.release-toolkit-manifest.jsonas the base of the git-log walk that decides cut-vs-update. The manifest'slast_released_shais load-bearing for correctness: a wrong SHA → wrong commit-walk window → wrong CHANGELOG content + wrong bump computation.The convention "operators don't hand-edit the manifest" is not a guard. A desynced manifest produces a silent-wrong CHANGELOG — the workflow runs successfully, the rolling PR opens with the wrong content, and the operator sees nothing flagged unless they catch the diff during PR review.
Silent-wrong is exactly the failure class #41 taught us to guard loudly. Filing now so the v0.4.0 design doesn't ship without a tracker for the obvious next gap.
Desync sources to catch
The manifest can drift from actual history via:
Proposed guard mechanics
Extend
manifest-check.sh(currently checksrelease-toolkit.yml+version_files+[Unreleased]section +manifest >= tag) with steps:last_released_shaexists in the local git history (git cat-file -e $LAST_SHA)last_released_shawas a release-prep merge (subject regex match against^chore\(release\): prepare v[0-9]+\.[0-9]+\.[0-9]+)last_released_tagexists AND points atlast_released_sha(or at agit tag-attached annotated tag whose target is that SHA)last_released_versionmatches the version-string embedded inlast_released_tag(modtag_format)Each step emits
OK/FAIL/SKIPlines like the existing manifest-check steps.A failed check halts the workflow + emits the specific reason. Silent → loud.
What this is NOT
pull_requestCI step (existingmanifest-check.ymlconsumer); doesn't prevent the manifest from being mutated, just catches the mutation before merge to main.schema: 1) gives forward-compat room.Refs
Filed: 2026-06-25 from Surveyor's #55 design-review d296 catch.
refs/pull/N/headon auto-delete-branch merge #92bosun referenced this issue2026-07-27 05:22:49 +02:00
2>/dev/null || trueflattens downstream refusals into empty answers, defusing the three-state seams #6972>/dev/null || trueflattens downstream refusals into empty answers, defusing the three-state seams #697