diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
index 8dea6c227..216df0589 100644
--- a/.mvn/wrapper/maven-wrapper.properties
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -1,3 +1,3 @@
wrapperVersion=3.3.4
distributionType=only-script
-distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.12/apache-maven-3.9.12-bin.zip
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.16/apache-maven-3.9.16-bin.zip
diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml
index f38ad3564..1ad6ce226 100644
--- a/benchmarks/pom.xml
+++ b/benchmarks/pom.xml
@@ -25,9 +25,9 @@
17
1.37
- 6.1.2
+ 6.1.3
3.27.7
- 1.6.1
+ 1.6.2
1.0.10
9.7.1
diff --git a/core/pom.xml b/core/pom.xml
index 493f78f88..5e1d1bddb 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -47,13 +47,13 @@
0.64.8
- 1.6.1
+ 1.6.2
1.18.46
2.0.18
3.27.7
- 6.1.2
+ 6.1.3
5.23.0
1.18.11
1.5.0
diff --git a/core/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java b/core/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java
index 5ab605d87..2bda9b460 100644
--- a/core/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java
+++ b/core/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java
@@ -1038,6 +1038,82 @@ private static boolean declaresDependencyOn(Element project, String artifactId)
return false;
}
+ /**
+ * Every consumer-smoke default names the release a user can actually resolve.
+ *
+ *
The harness verifies the published artefacts, and each of its entry points writes
+ * down which version to verify when the caller names none: the two runner scripts, the
+ * workflow input, and the {@code } each consumer pom falls back to. The
+ * runners always pass one, so the poms' copy decides nothing on a normal run — which is
+ * how it sat two releases behind the rest without a single run going red, until
+ * Dependabot opened a pull request to move it.
+ *
+ * Read out of the files rather than compared against a constant here, and held to
+ * {@link #acceptableTargets()} — the same published-release rule the install snippets
+ * follow. A default naming a version nobody can download would have the gate verify a
+ * release that does not exist; one naming an older release has it report green for the
+ * release before, which is the failure a release gate must not have.
+ */
+ @Test
+ void everyConsumerSmokeDefaultNamesThePublishedRelease() throws Exception {
+ Set targets = acceptableTargets();
+ Map defaults = new LinkedHashMap<>();
+
+ defaults.put("scripts/release-smoke/run.sh",
+ declaredVersion("scripts/release-smoke/run.sh",
+ "(?m)^GC_VERSION=\"([\\w.\\-]+)\""));
+ defaults.put("scripts/release-smoke/run.ps1",
+ declaredVersion("scripts/release-smoke/run.ps1",
+ "\\[string]\\$Version = '([\\w.\\-]+)'"));
+ defaults.put(".github/workflows/release-smoke.yml",
+ declaredVersion(".github/workflows/release-smoke.yml",
+ "(?m)^\\s+default: '([\\w.\\-]+)'"));
+
+ List consumers = consumerProjects();
+ assertThat(consumers)
+ .describedAs("no consumer-smoke project under scripts/release-smoke: the harness "
+ + "this guards would be verifying nothing")
+ .isNotEmpty();
+ for (Path pom : consumers) {
+ String relative = PROJECT_ROOT.relativize(pom).toString().replace('\\', '/');
+ defaults.put(relative,
+ declaredVersion(relative, "([\\w.\\-]+)"));
+ }
+
+ assertThat(defaults)
+ .describedAs("each consumer-smoke default must name the published release %s: a "
+ + "run that accepts the prefilled value would otherwise verify a version "
+ + "nobody can resolve, or the release before this one", targets)
+ .allSatisfy((where, version) -> assertThat(version)
+ .describedAs("%s", where)
+ .isIn(targets));
+ }
+
+ /** The consumer projects, found rather than listed: one arrives per published coordinate. */
+ private static List consumerProjects() throws IOException {
+ Path root = PROJECT_ROOT.resolve("scripts/release-smoke");
+ if (!Files.isDirectory(root)) {
+ return List.of();
+ }
+ try (Stream entries = Files.list(root)) {
+ return entries.map(entry -> entry.resolve("pom.xml"))
+ .filter(Files::isRegularFile)
+ .sorted()
+ .toList();
+ }
+ }
+
+ /** The one version a file declares, or a failure naming the file that stopped declaring it. */
+ private static String declaredVersion(String relativePath, String pattern) throws IOException {
+ Matcher declared = Pattern.compile(pattern)
+ .matcher(Files.readString(PROJECT_ROOT.resolve(relativePath)));
+ assertThat(declared.find())
+ .describedAs("%s no longer declares a smoke version matching %s — the release step "
+ + "that moves it would silently skip the file", relativePath, pattern)
+ .isTrue();
+ return declared.group(1);
+ }
+
private static Element directChild(Element parent, String name) {
NodeList children = parent.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
diff --git a/examples/pom.xml b/examples/pom.xml
index 7d304bb4f..18f7234e6 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -18,7 +18,7 @@
${project.version}
- 1.6.1
+ 1.6.2
17
2026-01-15
- 6.1.2
+ 6.1.3
3.27.7
diff --git a/qa/pom.xml b/qa/pom.xml
index 78777d274..59fd176ce 100644
--- a/qa/pom.xml
+++ b/qa/pom.xml
@@ -38,10 +38,10 @@
3.5.6
2.22.1
- 6.1.2
+ 6.1.3
3.27.7
5.23.0
- 1.6.1
+ 1.6.2
3.0.8
21.0.12
3.0.8
- 6.1.2
+ 6.1.3
3.27.7
- 1.6.1
+ 1.6.2
1.1.0
3.15.0
diff --git a/scripts/cut-release.ps1 b/scripts/cut-release.ps1
index fbde2642c..6b5e55cc9 100644
--- a/scripts/cut-release.ps1
+++ b/scripts/cut-release.ps1
@@ -776,6 +776,16 @@ function Update-ReleaseSmokeDefaultVersion($repoRoot, $newVersion) {
# re-verifies the PREVIOUS release and reports green — the one failure mode a
# release gate must not have. Each pattern is anchored to its own construct so
# a bump cannot smear across unrelated version strings in the same file.
+ #
+ # The consumer projects carry that default a second time, in the
+ # each pom falls back to when the runner passes none. Every runner does pass one,
+ # so the fallback decides nothing on a normal run — which is why it sat two
+ # releases behind until Dependabot opened a PR to move it. It is still a published
+ # version written down in the repository, so it moves with the release.
+ #
+ # Found rather than listed: the projects are one per published coordinate
+ # combination, so the set grows when a coordinate does, and a list here would be a
+ # second place to remember that.
$targets = @(
@{ Path = 'scripts/release-smoke/run.sh'; Pattern = '(?<=^GC_VERSION=")[\w\.\-]+(?=")'; Label = 'run.sh default' },
@{ Path = 'scripts/release-smoke/run.sh'; Pattern = '(?<=tests gc\.version=)[\w\.\-]+'; Label = 'run.sh usage' },
@@ -785,6 +795,19 @@ function Update-ReleaseSmokeDefaultVersion($repoRoot, $newVersion) {
@{ Path = 'scripts/release-smoke/README.md'; Pattern = '(?<=defaults to the current published release \(`)[\w\.\-]+(?=`\))'; Label = 'README prose' }
)
+ $consumerRoot = Join-Path $repoRoot 'scripts/release-smoke'
+ if (Test-Path $consumerRoot) {
+ foreach ($project in Get-ChildItem $consumerRoot -Directory | Sort-Object Name) {
+ if (Test-Path (Join-Path $project.FullName 'pom.xml')) {
+ $targets += @{
+ Path = "scripts/release-smoke/$($project.Name)/pom.xml"
+ Pattern = '(?<=)[\w\.\-]+(?=)'
+ Label = "$($project.Name) fallback"
+ }
+ }
+ }
+ }
+
foreach ($target in $targets) {
$path = Join-Path $repoRoot $target.Path
if (-not (Test-Path $path)) {
diff --git a/scripts/release-smoke/s1-graph-compose/pom.xml b/scripts/release-smoke/s1-graph-compose/pom.xml
index 18168a3fa..37684e8f8 100644
--- a/scripts/release-smoke/s1-graph-compose/pom.xml
+++ b/scripts/release-smoke/s1-graph-compose/pom.xml
@@ -13,10 +13,10 @@
UTF-8
17
- 2.0.0
- 5.11.4
+ 2.2.0
+ 6.1.3
3.27.7
- 3.5.2
+ 3.5.6
diff --git a/scripts/release-smoke/s2-core-only/pom.xml b/scripts/release-smoke/s2-core-only/pom.xml
index db8dc0634..34e8795e3 100644
--- a/scripts/release-smoke/s2-core-only/pom.xml
+++ b/scripts/release-smoke/s2-core-only/pom.xml
@@ -13,11 +13,11 @@
UTF-8
17
- 2.0.0
- 5.11.4
+ 2.2.0
+ 6.1.3
3.27.7
- 3.5.2
- 3.5.0
+ 3.5.6
+ 3.6.3
diff --git a/scripts/release-smoke/s3-core-render-pdf/pom.xml b/scripts/release-smoke/s3-core-render-pdf/pom.xml
index 7471748e7..d6b9ffec1 100644
--- a/scripts/release-smoke/s3-core-render-pdf/pom.xml
+++ b/scripts/release-smoke/s3-core-render-pdf/pom.xml
@@ -13,10 +13,10 @@
UTF-8
17
- 2.0.0
- 5.11.4
+ 2.2.0
+ 6.1.3
3.27.7
- 3.5.2
+ 3.5.6
diff --git a/scripts/release-smoke/s4-templates/pom.xml b/scripts/release-smoke/s4-templates/pom.xml
index 81c8e4122..2bfd5fd4d 100644
--- a/scripts/release-smoke/s4-templates/pom.xml
+++ b/scripts/release-smoke/s4-templates/pom.xml
@@ -14,10 +14,10 @@
UTF-8
17
- 2.0.0
- 5.11.4
+ 2.2.0
+ 6.1.3
3.27.7
- 3.5.2
+ 3.5.6
diff --git a/scripts/release-smoke/s5-testing/pom.xml b/scripts/release-smoke/s5-testing/pom.xml
index 437c7a428..e8eaaeb75 100644
--- a/scripts/release-smoke/s5-testing/pom.xml
+++ b/scripts/release-smoke/s5-testing/pom.xml
@@ -14,10 +14,10 @@
UTF-8
17
- 2.0.0
- 5.11.4
+ 2.2.0
+ 6.1.3
3.27.7
- 3.5.2
+ 3.5.6
diff --git a/scripts/release-smoke/s6-bundle/pom.xml b/scripts/release-smoke/s6-bundle/pom.xml
index d8fcb37a1..dda9806bd 100644
--- a/scripts/release-smoke/s6-bundle/pom.xml
+++ b/scripts/release-smoke/s6-bundle/pom.xml
@@ -14,10 +14,10 @@
UTF-8
17
- 2.0.0
- 5.11.4
+ 2.2.0
+ 6.1.3
3.27.7
- 3.5.2
+ 3.5.6
diff --git a/scripts/release-smoke/s7-core-render-pptx/pom.xml b/scripts/release-smoke/s7-core-render-pptx/pom.xml
index 390d4a21f..9e5b40e68 100644
--- a/scripts/release-smoke/s7-core-render-pptx/pom.xml
+++ b/scripts/release-smoke/s7-core-render-pptx/pom.xml
@@ -14,10 +14,10 @@
UTF-8
17
- 2.0.0
- 5.11.4
+ 2.2.0
+ 6.1.3
3.27.7
- 3.5.2
+ 3.5.6
diff --git a/scripts/release-smoke/s8-core-render-docx/pom.xml b/scripts/release-smoke/s8-core-render-docx/pom.xml
index 2146e4747..db5341bb9 100644
--- a/scripts/release-smoke/s8-core-render-docx/pom.xml
+++ b/scripts/release-smoke/s8-core-render-docx/pom.xml
@@ -13,10 +13,10 @@
UTF-8
17
- 2.0.0
- 5.11.4
+ 2.2.0
+ 6.1.3
3.27.7
- 3.5.2
+ 3.5.6
diff --git a/templates/pom.xml b/templates/pom.xml
index 406415484..9fb51273c 100644
--- a/templates/pom.xml
+++ b/templates/pom.xml
@@ -56,9 +56,9 @@
17
1.18.46
- 6.1.2
+ 6.1.3
3.27.7
- 1.6.1
+ 1.6.2
3.15.0
3.5.1
diff --git a/testing/pom.xml b/testing/pom.xml
index de12fc6ea..82398d0d6 100644
--- a/testing/pom.xml
+++ b/testing/pom.xml
@@ -59,9 +59,9 @@
3.0.8
2.22.1
- 6.1.2
+ 6.1.3
3.27.7
- 1.6.1
+ 1.6.2
3.15.0
3.5.1