feat(bom): add falco-bom, a platform pinning the published modules - #5
Merged
Conversation
The three published modules are built and released together and only ever make sense in the same version, but a consumer had to repeat that version on every dependency line and was free to get it wrong. falco-bom is a java-platform project whose only product is a POM with a dependencyManagement block, so the version is declared once as a platform and the modules cannot drift into a combination nobody tested. It pins its siblings by project reference rather than by coordinate string, which makes Gradle read the version off the module itself instead of asking someone to keep a literal in sync on every release. The single line Release Please rewrites stays the only place a version number is written. Two consequences for the root build. java-library and java-platform are mutually exclusive, so the block that configures the Java modules now runs over the subprojects minus falco-bom, while group and version stay on all of them because the BOM needs its own version to be right. And java-platform is applied to falco-bom from the root script rather than from the module's own, because a subproject's script only runs after the root one and the publishing block further down would otherwise reach for a javaPlatform component that is not registered yet. The README keeps the BOM on a snapshot coordinate in the three-argument form for now: it was added after 0.3.0 was cut, so the release endpoint does not serve it yet, and the Renovate rule that rewrites release coordinates would otherwise point the snippet at a version that does not exist. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This comment has been minimized.
This comment has been minimized.
Contributor
Test results 153 files 153 suites 2m 50s ⏱️ Results for commit fdb0853. ♻️ This comment has been updated with latest results. |
This comment has been minimized.
This comment has been minimized.
The Gradle build files carried extensive prose comments explaining why things are built the way they are. That rationale now lives on the project wiki (https://github.com/OneLiteFeatherNET/Falco/wiki), split into pages by topic: build setup, versioning and releases, dependency management, publishing, testing/Javadoc, and the benchmarks/demo modules. Each build file keeps a single one-line pointer to the wiki. No functional code changed. The `// x-release-please-version` marker on the version line in the root build.gradle.kts was deliberately left untouched, since Release Please locates that line by this exact comment string. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This comment has been minimized.
This comment has been minimized.
This was referenced Aug 1, 2026
Brings in the DemoReport path fix from #8, without which the Windows job fails on five tests this branch never touched.
* docs: move the long-form documentation to the wiki
Moves docs/anvil-chunk-loader.md, docs/light-engine.md, docs/benchmarks.md,
docs/rationale/, docs/research/ and STATUS.md to the OneLiteFeatherNET/Falco
wiki (Anvil-Chunk-Loader, Light-Engine, Benchmarking, the five Rationale-*
pages, the four Research-* pages, and Project-Status), verbatim apart from
relative links rewritten to wiki page names or GitHub blob URLs. Home.md
gains "Getting started" / "Background: rationale" / "Background: research"
groups above the six existing Gradle build pages, all of which stay linked.
README.md is slimmed from 494 to 300 lines: it keeps what a first-time
visitor needs (what the project is, the module table, a condensed
performance summary, the four-step quick start, and how to declare the
dependency including the BOM) and points to the wiki for everything else.
The four illustrated benchmark write-ups moved into the wiki's Benchmarking
page as "Headline results", with the chart SVGs staying in docs/charts/
(referenced from the wiki via raw.githubusercontent.com, since the wiki is
a separate repository) rather than being duplicated there.
Left in the repository, and why:
- docs/charts/ — generator script plus the SVGs README embeds directly;
moving images into the wiki would need a different reference scheme for
no benefit, since the wiki page already reaches them over raw GitHub URLs.
- docs/superpowers/ — planning-workflow artefacts (a spec and its plan),
not user documentation; the spec is explicitly left "as it was approved"
with an addendum, so it stays put rather than being edited or moved.
- falco-demo/README.md — a module README next to the code it documents;
only its three links to files that did move were repointed.
- STATUS.md's content is not stale: it is the active decision/defect/open-
items log referenced throughout the other documents, so it moved whole
as Project-Status rather than being trimmed or split.
Fixes every cross-reference this broke: the two docs/benchmarks.md links
in falco-demo/README.md and one in .github/pull_request_template.md, the
docs/*.md references baked into four .github/ISSUE_TEMPLATE/*.yml forms
(dropdown options, checklist labels, placeholders), and two Javadoc
{@code docs/research/instance-container.md} mentions in falco-instance
(text only, no logic touched). The renovate.json custom manager still
matches exactly the three two-argument release coordinates in README.md
and not the three-argument falco-bom snapshot line, verified with the
regex it actually uses.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* docs: correct the stale version references in the README
The README still quoted 0.2.1/0.2.2-SNAPSHOT after 0.3.0 shipped:
- The snapshot explanation said the latest release was 0.2.1 and the
snapshot endpoint served 0.2.2-SNAPSHOT. It is 0.3.0 released and
0.3.1-SNAPSHOT served (release patch + 1, per build.gradle.kts).
- The Javadoc table linked falco-anvil and falco-light at 0.2.1, and
claimed falco-instance had "No release yet" with only a
0.2.2-SNAPSHOT javadoc link. falco-instance shipped in 0.3.0 (see
CHANGELOG.md and commit cee5f94), so all three now point at their
0.3.0 release javadoc.
Verified each new javadoc URL resolves (200) before adding it; none of
the old URLs are removed without a working replacement. The falco-bom
three-argument snapshot coordinate is left untouched, since it exists
specifically so the renovate.json customManager does not rewrite it to
a release version that does not exist yet.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.
Proposed changes
The three published modules are built and released together and only ever make sense in the same
version, but a consumer had to repeat that version on every dependency line and was free to get it
wrong.
falco-bomis ajava-platformproject whose only product is a POM with adependencyManagementblock, so the version is declared once as a platform:dependencies { implementation(platform("net.onelitefeather", "falco-bom", "0.3.1-SNAPSHOT")) implementation("net.onelitefeather:falco-anvil") implementation("net.onelitefeather:falco-light") implementation("net.onelitefeather:falco-instance") }It pins its siblings by project reference rather than by coordinate string, so Gradle reads the
version off the module itself instead of asking someone to keep a literal in sync on every release.
The single line Release Please rewrites stays the only place a version number is written.
Two consequences for the root build, both of which are the actual substance of this change:
java-libraryandjava-platformare mutually exclusive plugins, so the block that configuresthe Java modules now runs over
subprojects - project(":falco-bom").groupandversionstayon all subprojects, because the BOM needs its own version to be right for the project references
above to resolve to the correct numbers.
java-platformis applied tofalco-bomfrom the root script, not from the module's own. Asubproject's build script only runs after the root one, so a plugin applied there would leave the
javaPlatformsoftware component unregistered by the time the publishing block further down theroot script reaches for it.
The publishing setup is split accordingly: one shared block configures the repository, credentials
and the release/snapshot switch for all four published modules, and two component-specific blocks
publish
components["java"]with sources and javadoc jars for the libraries, andcomponents["javaPlatform"]for the BOM, which has nothing to compile or document.Why the README uses a snapshot coordinate
The BOM was added after
0.3.0was cut, so the release endpoint does not serve it and won't —falco-bom:0.3.0returns 404 and always will. Until the first release that contains it, the READMEwrites the coordinate in the three-argument form, which is the same device this project already used
for
falco-instancebefore it had a release: the Renovate rule that rewritesgroup:name:versioncoordinates to the latest release deliberately does not match it, so the snippet cannot be pointed at
a version that does not exist. From the next release on it becomes a normal coordinate and both the
snapshot version and the comment explaining it should go.
Types of changes
Checklist
(bom), alongside the(anvil)/(light)/(instance)/(map)the template lists. Itfollows the same convention of naming the module it touches.
I have added tests— not applicable, and deliberately so: ajava-platformproject has nosources and no runtime behaviour to test. What it produces is a POM, and that is verified by
generating it (see below) rather than by a test class.
Tests are package-private, named— no tests added, see above.test<What><Expectation>Javadoc on every new class and method— no classes or methods added; the build file carriesprose comments in the style of the surrounding build scripts instead.
@NotNull; the package@NotNullByDefaultcovers it./gradlew buildis green locallyUsing itsection of the READMEVerification
./gradlew :falco-bom:generatePomFileForMavenPublicationproduces exactly thedependencyManagementblock the change exists for:
./gradlew clean build— green, existing modules and their tests unaffected by thesubprojectsrestructure.
./gradlew publishToMavenLocal—~/.m2/repository/net/onelitefeather/falco-bom/0.3.0/containsfalco-bom-0.3.0.pomandfalco-bom-0.3.0.module.leaves the BOM's three-argument snapshot line alone, which is the intended behaviour described
above.
Further comments
Nothing in
.github/workflowsneeded changing — there are no per-module path filters or publishlists;
publishruns at the root and now covers four modules instead of three.STATUS.mdanddocs/were left alone on purpose. Their module tables describe compiled types andtest counts, and a platform module has neither, so a row there would be noise rather than signal.
Out of scope, but worth recording: the
Snapshots,MavenandAPI documentationsubsections ofthe README still carry hardcoded
0.2.1/0.2.2-SNAPSHOTexamples and a "no release yet" note forfalco-instancethat0.3.0already made false. Those were stale before this change and fixing themmeans verifying live javadoc URLs, so they are left for a separate documentation pass.
🤖 Generated with Claude Code