Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 16 additions & 13 deletions docs/contributing/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,23 +36,25 @@ a republication of the BOM without a single commit in this repository.
| | | Pinned here |
| --- | --- | --- |
| Java | 25 (toolchain and `release`), no `--enable-preview` anywhere | yes, in the root `build.gradle.kts` |
| Minestom | `2026.06.20-26.1.2`, `compileOnly` | **no** — `library("minestom", …).withoutVersion()`, resolved through `net.onelitefeather:mycelium-bom` `1.7.2` |
| Adventure | `5.1.1`, `adventure-nbt` used directly — Minestom speaks `CompoundBinaryTag` natively, so there is no conversion layer | yes, `adventure-bom` `5.1.1` |
| Minestom | `2026.10.07-26.2`, `compileOnly` | **no** — `library("minestom", …).withoutVersion()`, resolved through `net.onelitefeather:mycelium-bom` `1.8.9` |
| Adventure | `5.2.0`, `adventure-nbt` used directly — Minestom speaks `CompoundBinaryTag` natively, so there is no conversion layer | yes, `adventure-bom` `5.2.0` |
| Annotations | `org.jetbrains:annotations:26.1.0` | yes |
| Tests | JUnit 6.1.0, Cyano `0.6.2` (`MicrotusExtension`) for anything needing a server | **no** — both `withoutVersion()`, resolved through `mycelium-bom` `1.7.2` |
| Tests | JUnit 6.1.3, Cyano `0.7.6` (`MicrotusExtension`) for anything needing a server | **no** — both `withoutVersion()`, resolved through `mycelium-bom` `1.8.9` |
| Benchmarks | JMH 1.37 via `me.champeau.jmh` 0.7.3, in the separate `falco-benchmarks` module | yes, both |
| `fastutil` | `8.5.18` | yes |
| Architecture | ArchUnit 1.4.2, in the separate `falco-archunit` module | yes |
| Build | Gradle 9.6.1, seven modules on one shared version | yes |
| `fastutil` | `8.5.19` | yes |
| Architecture | ArchUnit 1.5.1, in the separate `falco-archunit` module | yes |
| Build | Gradle 9.8.1, eight modules on one shared version | yes |

The seven modules are `falco-anvil`, `falco-light`, `falco-instance`, `falco-benchmarks`,
`falco-demo`, `falco-archunit` and `falco-bom`; the first three are published, `falco-bom` publishes
only their constraints, and the other three are not published at all.
The eight modules are `falco-anvil`, `falco-light`, `falco-instance`, `falco-migration`,
`falco-bom`, `falco-benchmarks`, `falco-demo` and `falco-archunit`; `falco-anvil`, `falco-light`,
`falco-instance` and `falco-migration` are published, `falco-bom` publishes only version constraints
for `falco-anvil`, `falco-light` and `falco-instance`, and `falco-benchmarks`, `falco-demo` and
`falco-archunit` are not published at all.

**The Minestom version is the one that would invalidate a comparison silently.** Every head-to-head
table under [Measured](../reference/measured-results.md#measured) measures the Minestom of the day the run happened,
and that version is decided by `mycelium-bom` `1.7.2`, not by anything in this repository.
`2026.06.20-26.1.2` is what it resolved to; a third party reproducing a number has to check that
and that version is decided by `mycelium-bom` `1.8.9`, not by anything in this repository.
`2026.10.07-26.2` is what it resolves to today; a third party reproducing a number has to check that
theirs resolves to the same thing before comparing.

`adventure-nbt`, `jetbrains-annotations` and `fastutil` are declared explicitly rather than taken
Expand Down Expand Up @@ -169,7 +171,8 @@ Four of its checks decide most of the outcome.

[`.github/workflows/build-pr.yml`](https://github.com/OneLiteFeatherNET/Falco/blob/main/.github/workflows/build-pr.yml)
is what then runs on the branch. It is a thin caller of the shared
`OneLiteFeatherNET/workflows/.github/workflows/gradle-build-pr.yml` job at `v2.4.0`, pinned to
`OneLiteFeatherNET/workflows/.github/workflows/gradle-build-pr.yml` job at the version pinned in
[`.github/workflows/build-pr.yml`](https://github.com/OneLiteFeatherNET/Falco/blob/main/.github/workflows/build-pr.yml), pinned to
Java 25 on Temurin with `run-tests: true`, so a pull request is checked by the same build the first
command under [Working on this](#working-on-this) runs locally. A second workflow,
`close_invalid_prs.yml`, calls the organisation's `close-invalid-prs` job when a pull request is
Expand All @@ -184,7 +187,7 @@ default owner later cannot silently widen who approves a release.

- The versions in [Environment](#environment) are declared in
[`settings.gradle.kts`](https://github.com/OneLiteFeatherNET/Falco/blob/main/settings.gradle.kts)
for the version catalogue and the seven modules, in
for the version catalogue and the eight modules, in
[`build.gradle.kts`](https://github.com/OneLiteFeatherNET/Falco/blob/main/build.gradle.kts) for the
toolchain, the release target and the single `version = …` line, and in
[`gradle/wrapper/gradle-wrapper.properties`](https://github.com/OneLiteFeatherNET/Falco/blob/main/gradle/wrapper/gradle-wrapper.properties)
Expand Down
6 changes: 3 additions & 3 deletions docs/contributing/build-setup.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Everything below is checkable in four files:
[`build.gradle.kts`](https://github.com/OneLiteFeatherNET/Falco/blob/main/build.gradle.kts),
[`settings.gradle.kts`](https://github.com/OneLiteFeatherNET/Falco/blob/main/settings.gradle.kts),
[`gradle.properties`](https://github.com/OneLiteFeatherNET/Falco/blob/main/gradle.properties) and
the seven module scripts. Gradle itself is pinned by the wrapper at `9.6.1`, in
the eight module scripts. Gradle itself is pinned by the wrapper at `9.8.1`, in
[`gradle/wrapper/gradle-wrapper.properties`](https://github.com/OneLiteFeatherNET/Falco/blob/main/gradle/wrapper/gradle-wrapper.properties),
so `./gradlew` is the only supported way to run any of it.

Expand Down Expand Up @@ -43,7 +43,7 @@ the architecture rules over the other modules — see [Architecture Rules](archi

`falco-benchmarks/build.gradle.kts` holds the only `plugins { }` block in the repository, a single
`alias(libs.plugins.jmh)`. Every other plugin in the table is applied imperatively from the root, so
the seven module scripts contain dependencies, a `description`, and — in `falco-benchmarks` and
the eight module scripts contain dependencies, a `description`, and — in `falco-benchmarks` and
`falco-demo` — task wiring, and nothing else.

`falco-archunit` gets `java-library` and `jacoco` from the root like every non-BOM module, and both
Expand Down Expand Up @@ -128,7 +128,7 @@ This assignment sits outside the `java-library` configuration block precisely so

## No repositories are declared per-project

None of the seven module build files declares a `repositories { }` block. Repositories come
None of the eight module build files declares a `repositories { }` block. Repositories come
exclusively from `dependencyResolutionManagement` in `settings.gradle.kts`, and that file does not
set `repositoriesMode`, so Gradle's default `RepositoriesMode.PREFER_PROJECT` applies: the moment a
module declared its own block, that block would win and the settings-level declaration would be
Expand Down
19 changes: 10 additions & 9 deletions docs/contributing/dependency-management.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,30 +62,31 @@ itself. Where a version is stated below it is the one the catalog declares today
`net.kyori:adventure-text-minimessage`, `net.onelitefeather:cyano`, Mockito and the JUnit BOM, and
nothing else — checkable in the published `mycelium-bom` POM. JMH is not among them, so both the
benchmark harness and the Gradle JMH plugin need an explicit version here.
- **`slf4j` (`2.0.18`) and `annotations` (`26.1.0`).** Not managed by the mycelium BOM either, for
- **`slf4j` (`2.0.20`) and `annotations` (`26.1.0`).** Not managed by the mycelium BOM either, for
the same reason and with the same consequence.
- **`adventureBom` (`5.1.1`).** The library modules receive Adventure transitively through Minestom,
- **`adventureBom` (`5.2.0`).** The library modules receive Adventure transitively through Minestom,
which is `compileOnly` and therefore never reaches a runtime classpath (see below). The benchmarks
module runs its code for real and needs Adventure at runtime, so it imports the Adventure platform
directly. The value matches what Minestom pulls in — `net.minestom:minestom:2026.06.20-26.1.2`
declares `net.kyori:adventure-nbt` at version `5.1.1` — but nothing in the build asserts that the
two agree, so a Minestom upgrade that moves Adventure has to be followed here by hand.
directly. The value is meant to match what Minestom pulls in. It matched `net.minestom:minestom:2026.06.20-26.1.2`,
which declares `net.kyori:adventure-nbt` at `5.1.1`; whether the version resolved today declares the same
version was not re-checked for this page. Nothing in the build asserts that the two agree, so a
Minestom upgrade that moves Adventure has to be followed here by hand.
- **`slf4j.simple`.** Only `falco-demo` needs an SLF4J binding, and it takes it as `runtimeOnly`. The
library modules depend on `slf4j-api` alone and leave the choice of binding to the consumer; a demo
that actually runs would otherwise greet the user with "No SLF4J providers were found" before
printing anything of its own.
- **`fastutil` (`8.5.18`, explicit version).** Minestom declares `it.unimi.dsi:fastutil` at
- **`fastutil` (`8.5.19`, explicit version).** Minestom declares `it.unimi.dsi:fastutil` at
**runtime** scope, so it never reaches a *compile* classpath through Minestom. `falco-instance`
compiles against fastutil types, and `falco-light`'s equivalence test and the comparison benchmarks
call Minestom methods that take a fastutil collection, so the dependency has to be named
explicitly — and naming it means pinning it. `8.5.18` is the same version Minestom
`2026.06.20-26.1.2` declares.
explicitly — and naming it means pinning it. The value is meant to match the version Minestom
declares: `8.5.18` was the match for `2026.06.20-26.1.2`, and the version resolved today was not re-checked.

Six entries are declared with `withoutVersion()` — `minestom`, `adventure.nbt`, `cyano` and the
three JUnit coordinates. Their versions come from a platform at use site: the mycelium BOM for
Minestom, Cyano and JUnit, and Minestom's own dependency graph for `adventure-nbt`. The consequence
worth knowing is that **no Minestom version string appears anywhere in this repository**: it is
whatever `net.onelitefeather:mycelium-bom:1.7.2` manages, which today is `2026.06.20-26.1.2`. What
whatever `net.onelitefeather:mycelium-bom:1.8.9` manages, which today is `2026.10.07-26.2`. What
that costs is traceability — an upgrade to the mycelium BOM moves Minestom, and therefore moves the
Minestom side of every comparison this project publishes, through a diff that mentions only a BOM
version. Anyone reproducing a measured result therefore needs the Minestom version stated alongside
Expand Down
6 changes: 3 additions & 3 deletions docs/contributing/documentation-conventions.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,10 @@ limit in its own provenance line rather than in a page footer, because a disclai
something only where the number is.

**Claims about somebody else's code carry a revision.** Minestom is read from the sources jar of
`net.minestom:minestom:2026.06.20-26.1.2`, which is the version this repository compiles against —
`net.minestom:minestom:2026.10.07-26.2`, which is the version this repository compiles against —
`settings.gradle.kts` declares `minestom` `withoutVersion()` and takes the version from
`net.onelitefeather:mycelium-bom:1.7.2`, whose `dependencyManagement` pins exactly
`2026.06.20-26.1.2`. That is a resolved version and not a pinned one: republishing the BOM changes
`net.onelitefeather:mycelium-bom:1.8.9`, whose `dependencyManagement` pins exactly
`2026.10.07-26.2`. That is a resolved version and not a pinned one: republishing the BOM changes
the Minestom side of every comparison without any commit here. Each such claim names the file, the
line and the member, so it can be checked in a minute and so it reads as analysis of a specific
revision rather than as a verdict on another project. The same rule governs Starlight and Phosphor
Expand Down
2 changes: 1 addition & 1 deletion docs/contributing/publishing.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ runs that workflow, and exactly one of its two publish jobs fires:
| `publish` | `release_created == 'true'` | `publish` |
| `publish-snapshot` | `release_created != 'true'` | `-Psnapshot build`, then `-Psnapshot publish` |

Both jobs call `OneLiteFeatherNET/workflows/.github/workflows/gradle-publish.yml@v2.4.0` with
Both jobs call `OneLiteFeatherNET/workflows/.github/workflows/gradle-publish.yml` at the version pinned in [`.github/workflows/release-please.yml`](https://github.com/OneLiteFeatherNET/Falco/blob/main/.github/workflows/release-please.yml), with
`java-version: "25"` and `secrets: inherit`, which is where the two `ONELITEFEATHER_MAVEN_*` values
the block above reads come from. The conditions are exact opposites of the same output, so a push
publishes either a release or a snapshot and never both. [Versioning and
Expand Down
2 changes: 1 addition & 1 deletion docs/contributing/testing-and-javadoc.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ in the same package.
The run is reproducible in the sense that matters for a build: the JDK is not whichever one launched
Gradle. The root build pins a Java 25 toolchain and `options.release = 25` (see [Build
Setup](build-setup.md)), and `.github/workflows/build-pr.yml` requests Temurin 25 from the shared
`gradle-build-pr.yml@v2.4.0` workflow with `run-tests: true`, so a pull request runs the same
`gradle-build-pr.yml` workflow, at the version pinned in [`.github/workflows/build-pr.yml`](https://github.com/OneLiteFeatherNET/Falco/blob/main/.github/workflows/build-pr.yml), with `run-tests: true`, so a pull request runs the same
compiler and the same test JVM version a local `./gradlew check` does.

Every test JVM is started with one system property:
Expand Down
2 changes: 1 addition & 1 deletion docs/contributing/versioning-and-releases.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ publish-snapshot:
```

`-Psnapshot` reaches Gradle inside the task strings because the shared
`OneLiteFeatherNET/workflows/.github/workflows/gradle-publish.yml@v2.4.0` workflow passes them to
`OneLiteFeatherNET/workflows/.github/workflows/gradle-publish.yml` workflow, at the version pinned in [`.github/workflows/release-please.yml`](https://github.com/OneLiteFeatherNET/Falco/blob/main/.github/workflows/release-please.yml), passes them to
`./gradlew` verbatim and offers no separate input for properties or environment variables.

Everything that is not a release therefore ships a snapshot: a merged feature, a documentation fix,
Expand Down
17 changes: 9 additions & 8 deletions docs/how-to/add-falco-to-your-build.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,18 @@ snapshot endpoints are both public.

```kotlin
dependencies {
implementation(platform("net.onelitefeather:falco-bom:2.1.0"))
implementation(platform("net.onelitefeather:falco-bom:3.0.1"))

implementation("net.onelitefeather:falco-anvil")
implementation("net.onelitefeather:falco-light")
implementation("net.onelitefeather:falco-instance")
implementation("net.onelitefeather:falco-migration")
implementation("net.onelitefeather:falco-migration:3.0.1") // not in the BOM, so it takes its version here
}
```

Take only the modules you need. The platform constrains a version for each; it does not pull in
one you did not declare.
Take only the modules you need. The platform constrains a version for `falco-anvil`, `falco-light`
and `falco-instance`; it does not pull in one you did not declare, and it does not cover
`falco-migration`.

3. Declare Minestom yourself. Falco does not bring it:

Expand All @@ -47,10 +48,10 @@ Version each module individually instead of step 2:

```kotlin
dependencies {
implementation("net.onelitefeather:falco-anvil:2.1.0")
implementation("net.onelitefeather:falco-light:2.1.0")
implementation("net.onelitefeather:falco-instance:2.1.0")
implementation("net.onelitefeather:falco-migration:2.1.0")
implementation("net.onelitefeather:falco-anvil:3.0.1")
implementation("net.onelitefeather:falco-light:3.0.1")
implementation("net.onelitefeather:falco-instance:3.0.1")
implementation("net.onelitefeather:falco-migration:3.0.1")
}
```

Expand Down
Loading
Loading