chore(release): clear both 2.1.1 cut blockers and the SNAPSHOT leak they exposed - #473
Merged
Conversation
The hero was the 2.0 banner with a newer version pill: the kicker read "GRAPHCOMPOSE 2.0 / MODULE-FIRST", the graph was labelled "THE 2.0 MODULE GRAPH", and the module row showed render-pdf, render-docx and an extension slot — no render-pptx. The image at the top of the README omitted the backend the release is about. Both labels now derive their line from the build version, so they cannot announce the release they were typed on again. The extension-slot card gives its place to render-pptx: the ServiceLoader SPI it stood for is already stated by the proof chip below, and the row now carries the three shipped backends. The two fixed-layout cards read alike on purpose — they consume the same resolved layout graph, which is why a deck matches the PDF. The regenerated PNG is stamped 2.1.0 rather than the working 2.1.1-SNAPSHOT, matching the published release; the release script re-renders it on the next cut.
PR #458 was merged to both branches, so main's 7e8432b and develop's cc1974d carry the same change under different commits. The content is already here - the banner PNG is byte-identical on both sides and the render-pptx hero card is on develop - but main was no longer an ancestor, and the post-release fast-forward of main would have been rejected at the next cut. Recorded with -s ours because develop's tree is already correct and has moved past main; this merge exists to restore ancestry, not to carry content.
…name 2.1.1 in the README
The committed engine decks rendered "v2.1.1-SNAPSHOT" - on the hero pill, in the
every-page footer and in the PDF metadata - so the asset the README links to
advertised a coordinate nobody can resolve. Example documents are regenerated
whenever their content changes, not only at a release, and the reactor version
carries a qualifier between cuts.
The strip already existed, privately, in one deck: EngineDeckExample open-coded
replaceFirst("-.*$", "") for its version pill and interpolated the raw value
everywhere else, and the v2 deck never inherited it. It moves to
ExampleVersion.withoutQualifier(), the v1 deck drops its own duplicate
banner.properties loader, and every rendered site now goes through the one
accessor. ExampleVersionTest pins it: removing the strip turns two of its three
tests red.
The four committed decks are regenerated and carry no qualifier.
README's "Latest stable" block names v2.1.1. cut-release.ps1 deliberately does
not rewrite that prose and aborts at Step 0 when it disagrees with the version
being cut.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Three things stand between
developand a 2.1.1 cut. Two abort the release script or the post-release push; the third is a defect already published.1.
cut-release.ps1aborts at Step 0. README's "Latest stable" block still names v2.1.0. The script checks it (cut-release.ps1:243) and deliberately does not rewrite that prose, so the cut stops before doing anything.2.
mainis not an ancestor ofdevelop.git merge-base --is-ancestor origin/main origin/developreturns false:7e8432bc(#458) exists only on main. The post-release fast-forward ofmainwould be rejected. No content is missing — the same PR landed on develop ascc1974db, the banner PNG is byte-identical on both sides, and therender-pptxhero card is present — so the divergence is ancestry alone.3. The committed decks publish a
-SNAPSHOTcoordinate. Decompressing the PDF content streams shows2.1.1-SNAPSHOTinassets/readme/examples/engine-deck-v2.pdf(hero pill), inengine-deck.pdf(footer on every page) and in both files' metadata — and in the two Pages-served copies. The README links the first of those. Introduced by regenerating the decks off-cycle, when the reactor version carries a qualifier.What
The sync merge is recorded with
-s ours: develop's tree is already correct and has moved past main, so this merge restores ancestry rather than carrying content. Its diff againstdevelopis empty.The version strip is centralised. It already existed, privately, in one deck —
EngineDeckExampleopen-codedreplaceFirst("-.*$", "")for its pill and interpolated the raw value everywhere else, which is exactly why the v2 deck never inherited it. It becomesExampleVersion.withoutQualifier(), the v1 deck drops its own duplicatebanner.propertiesloader, and every rendered site routes through the one accessor.README names v2.1.1, which is what the Step 0 gate wants.
Tests
Full eight-module reactor
clean verify— BUILD SUCCESS.examples47/47 (44 + 3 new).javadoc:javadocclean.ExampleVersionTestis mutation-checked: replacingwithoutQualifier()'s body withCURRENTturns two of its three tests red.The four regenerated decks were re-inspected by decompressing their streams — the only version token left in any of them is
2.1.1. Layout snapshots are unaffected: the version pill sits in a fixed 96×30 box, so the shorter string does not move geometry.The Step 0 precondition is verified against the script's own regex rather than by eye.
Not in scope
The regeneration mechanism behind #454/#461 — a release-script step for
assets/readme/**— is deliberately left out. It is new release behaviour needing re-verification under-DryRun,-PostReleaseOnlyand-SkipShowcase, and the cut itself is the wrong place to debut it. Two older example assets (canvas-layer-showcase.pdfat v1.6,inline-highlight-chips.pdfat 1.9.0) still carry stale versions in their own copy; that is content rewriting, not a patch fix.