Skip to content

chore(release): clear both 2.1.1 cut blockers and the SNAPSHOT leak they exposed - #473

Merged
DemchaAV merged 3 commits into
developfrom
chore/unblock-2.1.1
Jul 28, 2026
Merged

chore(release): clear both 2.1.1 cut blockers and the SNAPSHOT leak they exposed#473
DemchaAV merged 3 commits into
developfrom
chore/unblock-2.1.1

Conversation

@DemchaAV

Copy link
Copy Markdown
Owner

Merge this one with a merge commit, not squash. It carries a sync merge whose second parent is the whole point; squashing discards it and re-opens blocker 2.

Why

Three things stand between develop and 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.ps1 aborts 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. main is not an ancestor of develop. git merge-base --is-ancestor origin/main origin/develop returns false: 7e8432bc (#458) exists only on main. The post-release fast-forward of main would be rejected. No content is missing — the same PR landed on develop as cc1974db, the banner PNG is byte-identical on both sides, and the render-pptx hero card is present — so the divergence is ancestry alone.

3. The committed decks publish a -SNAPSHOT coordinate. Decompressing the PDF content streams shows 2.1.1-SNAPSHOT in assets/readme/examples/engine-deck-v2.pdf (hero pill), in engine-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 against develop is empty.

The version strip is centralised. It already existed, privately, in one deck — EngineDeckExample open-coded replaceFirst("-.*$", "") for its pill and interpolated the raw value everywhere else, which is exactly why the v2 deck never inherited it. It becomes ExampleVersion.withoutQualifier(), the v1 deck drops its own duplicate banner.properties loader, 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. examples 47/47 (44 + 3 new). javadoc:javadoc clean.

ExampleVersionTest is mutation-checked: replacing withoutQualifier()'s body with CURRENT turns 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, -PostReleaseOnly and -SkipShowcase, and the cut itself is the wrong place to debut it. Two older example assets (canvas-layer-showcase.pdf at v1.6, inline-highlight-chips.pdf at 1.9.0) still carry stale versions in their own copy; that is content rewriting, not a patch fix.

DemchaAV and others added 3 commits July 26, 2026 14:40
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.
@DemchaAV
DemchaAV merged commit dc854f0 into develop Jul 28, 2026
10 checks passed
@DemchaAV
DemchaAV deleted the chore/unblock-2.1.1 branch July 28, 2026 10:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant