4.0.0-4.0.7 sit between the two Boot eras: 4.0.0 moved the Antora component
to `documentation/`, but the `root-aggregate-content` archive is not published
until 4.0.8 (404 at 4.0.0 and 4.0.7, 200 at 4.0.8, probed 2026-09-17). The
component path and the assembly moved apart, so `eraFor` returned `undefined`
and the eight releases were refused.
Declare a third era for `4.0.0`-`<4.0.8`: the 4.x component path with
ADR-0004's synthesized assembly, against the inputs 4.x moved
(`documentation/.../src/main`, `platform/spring-boot-dependencies/build.gradle`).
Widening a neighbour cannot express this — the 3.x era's paths do not exist at
these tags, and the archive era's assembly would merge a zip that 404s.
`BOOT_4_METADATA_ARTIFACTS` is measured, not carried over: Boot 4 split three
module trees into ~140 projects, and 103 of them both ship a partial in the
4.0.8 archive and publish a 4.0.0/4.0.7 jar carrying
`META-INF/spring-configuration-metadata.json`. The two measurements agree
exactly. `spring-boot-test` is excluded, as in 3.x.
Split the attribute port's `addDependencyVersion` table into era-scoped
`BOOT_3_MANAGED_VERSIONS` / `BOOT_4_MANAGED_VERSIONS`, threaded through
`SynthesisSources` into both `synthesizeAttributes` and `versionSourceBoms` so
the BOM fetch and the synthesis cannot disagree. 4.x reads Jackson 3 from the
`tools.jackson` coordinates and adds `version-jackson2-databind`; running the
3.x table against a 4.x BOM withholds four attributes the corpus links through.
The table is era-scoped rather than a union because both lines manage
`com.fasterxml.jackson.core:jackson-databind`, so a union would emit
`version-jackson2-databind` for 3.x, where upstream names no such attribute.
Verified against 4.0.8 as ground truth, one patch above the range: the
reconstruction reproduces all 876 attributes of the descriptor its own content
archive ships, 0 differing, 0 missing. End to end under `--strict`, 4.0.0 and
4.0.7 convert with exit 0, 147 pages, 0 unresolved `configprop:`, and exactly
2 literal attribute references — the same two files the 4.0.8 archive build
leaves, both upstream's own missing `subs="attributes"`. 3.x checked for
regression at 3.3.0 and 3.5.16.
`detect-upstream-versions.ts --project boot` now reports 4.0.0-4.0.7 as
buildable; 4.1.0 stays excluded by the availability gate.
Refs #137
Closes #137
What
Spring Boot 4.0.0–4.0.7 were refused by
eraFor. They sit between the two Boot eras: 4.0.0 moved the Antora component todocumentation/, but theroot-aggregate-contentarchive is not published until 4.0.8. The component path and the assembly moved apart, so neither existing era covered the eight releases between them.This adds a third era for
4.0.0–<4.0.8: the 4.x component path with ADR-0004's synthesized assembly, against the inputs 4.x moved. Declared oldest first, the table is now3.3.0-<4.0.0synthesized,4.0.0-<4.0.8synthesized (4.x paths),>=4.0.8archive.Widening a neighbour cannot express this — the 3.x era's paths do not exist at these tags, and the archive era's assembly would merge a zip that 404s. Reasoning and measurements are recorded in ADR-0005; ADR-0004 is untouched and still governs 3.3–3.x.
Measured, not assumed (2026-09-17)
META-INF/spring-configuration-metadata.jsonspring-boot-testamong them, as in 3.xkey=valueshape, and 4.0.0's file is byte-identical to 4.0.8's (123 entries against 3.5.16's 111)platform/library(...)/linksDSLThe regression risk the issue flagged
AntoraAsciidocAttributes.javachanged with the restructure: 4.x reads Jackson 3 from thetools.jacksoncoordinates, keeps the 2.x line as a secondJackson 2 Bombehind a newversion-jackson2-databind, and dropspulsar-client-reactive-api. Running the port's 3.x table against a 4.x BOM silently withholds four attributes the corpus links through.So the
addDependencyVersiontable is split into era-scopedBOOT_3_MANAGED_VERSIONS/BOOT_4_MANAGED_VERSIONS, threaded throughSynthesisSourcesinto bothsynthesizeAttributesandversionSourceBomsso the BOM fetch and the synthesis cannot disagree about which coordinates exist.It is era-scoped rather than a union because both lines manage
com.fasterxml.jackson.core:jackson-databind— a union would emitversion-jackson2-databindfor 3.x, where upstream names no such attribute. (Gating each row on its library being declared in the BOM was tried first and dropped: right answer, wrong reason, since upstream resolves the coordinate without consulting the library.)Verification
Ground truth. 4.0.8 is one patch above the range and shares the module split, the moved paths and the Jackson coordinates. Reconstructing it from its tag and diffing against the descriptor its own content archive ships:
version-<spring-data-module>-docs/-javadocpairs fix(boot): emit the two attribute sets the 3.x corpus still links through #199 added deliberatelyEnd to end under
--strict, with the 4.0.8 archive build as the control:configprop:include-code::groupsThe two residues are the same two files in all three builds —
tutorial/first-applicationandhow-to/native-image/developing-your-first-application, whose[source,shell]blocks omitsubs="attributes"upstream. The 92-page gap is the generated appendix, the same Gradle-output gap ADR-0004 accepted for 3.x.3.x non-regression checked at 3.3.0 and 3.5.16: no
version-jackson2-databind, Jackson values unchanged on the 2.x coordinates.Done when
Tests
421 pass, 0 fail (was 382). No test was weakened or deleted. Six tests encoded the old "4.0 gap" behaviour and were retargeted at boundaries that still exist — for example "an era ceiling is exclusive" now asserts that 4.0.0 selects the 4.x era and 4.0.8 the archive era, instead of asserting 4.0.0 is refused. New coverage: era selection at 4.0.0/4.0.7/4.0.8, the 103-artifact metadata set, and
versionSourceBomsresolving a different BOM set per era table.bun test,bunx tsc --noEmit -p .andbun run lintare clean.Out of scope
Releasing the eight versions and recording them in
catalog.jsonis a separate step, to be done after merge. Tag pushes must go three at a time — GitHub creates no push event for the fourth and later tags in one push (#61).Summary by cubic
Adds a third layout era so Spring Boot 4.0.0–4.0.7 become buildable; previously they were refused because 4.0.0 moved the Antora component to
documentation/while the content archive stayed unpublished until 4.0.8. The new era reconstructs the generated half from the tag's 4.x paths, and the managed-version attribute port is split era-scoped so 4.x's renamed Jackson coordinates register without leaking aversion-jackson2-databindattribute into 3.x output.New Features
documentation/…,platform/spring-boot-dependencies/build.gradle) plus 103spring-boot-*metadata jars; reconstructing 4.0.8 from them reproduces all 876 attributes of its shipped descriptor, 0 differing.version-jackson2-databind, Jackson values unchanged on the 2.x coordinates.detect-upstream-versions.tsnow lists 4.0.0–4.0.7; 4.1.0 stays blocked by the availability gate because its zip is unpublished.Migration
catalog.jsonis a separate step after merge.Written for commit 12258e0. Summary will update on new commits.