From 97d4776b852104e1ee0fc916e62f64f0faf3fdea Mon Sep 17 00:00:00 2001 From: TheMeinerLP Date: Mon, 12 Oct 2026 12:23:24 +0200 Subject: [PATCH 1/4] fix(blog): correct the titan boot test timeline The boot smoke test (Titan #398) was already planned and merged 17 minutes after the LuckPerms fix (#401). The posts called it a consequence of the incident and claimed it would certainly have caught the failure; neither is verified. Claude-Session: https://claude.ai/code/session_019zws4ceJu2jctk3XT48fMX --- content/blog/de/titan-von-1-0-bis-3-0.md | 2 +- .../warum-unsere-tests-gruen-waren-lobby-startete-nicht.md | 6 +++--- content/blog/en/titan-from-1-0-to-3-0.md | 2 +- .../blog/en/why-our-tests-were-green-lobby-did-not-start.md | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/content/blog/de/titan-von-1-0-bis-3-0.md b/content/blog/de/titan-von-1-0-bis-3-0.md index 538b629a..b04a0637 100644 --- a/content/blog/de/titan-von-1-0-bis-3-0.md +++ b/content/blog/de/titan-von-1-0-bis-3-0.md @@ -72,7 +72,7 @@ Auf dieser Grundlage kam in 2.x innerhalb von knapp zwei Wochen ein Spielerfeatu ![Ein Spieler springt im Modus Easy über das Jump'n'Run der Lobby: einzelne Landeblöcke schweben zwischen fliegenden Inseln im offenen Himmel](/images/blog/titan-lobby-jump-and-run.webp){width="1600" height="843"} -Hinter den Kulissen ergänzte 2.4 **OpenTelemetry-Tracing und Metriken**, damit wir sehen, was langsam ist, bevor du es merkst. 2.6 brachte außerdem einen **Boot-Smoke-Test**: CI startet jetzt das ausgelieferte Jar mit der echten Konfiguration. Er ist eine Konsequenz aus einem Vorfall am Release-Tag, an dem ein Bibliotheksupdate Build und Unit-Tests durchlief, die Lobby aber nicht starten ließ. +Hinter den Kulissen ergänzte 2.4 **OpenTelemetry-Tracing und Metriken**, damit wir sehen, was langsam ist, bevor du es merkst. 2.6 brachte außerdem einen **Boot-Smoke-Test**: CI startet jetzt das ausgelieferte Jar mit der echten Konfiguration. Der Boot-Test war bereits in Arbeit und wurde 17 Minuten nach dem Fix des Vorfalls am Release-Tag gemergt, als ein Bibliotheksupdate Build und Unit-Tests durchlief, die Lobby aber nicht starten ließ. Seitdem sollte so ein Fehler in der CI auffallen. ## Version 3: ein Kern, mehrere Plattformen (10. Oktober 2026) diff --git a/content/blog/de/warum-unsere-tests-gruen-waren-lobby-startete-nicht.md b/content/blog/de/warum-unsere-tests-gruen-waren-lobby-startete-nicht.md index 7b00bbdb..de58b254 100644 --- a/content/blog/de/warum-unsere-tests-gruen-waren-lobby-startete-nicht.md +++ b/content/blog/de/warum-unsere-tests-gruen-waren-lobby-startete-nicht.md @@ -77,11 +77,11 @@ Die CloudNet-Bridge wird als Minestom-Extension geladen und war vom selben Versi Die Änderung haben wir upstream als [CloudNet PR #1906](https://github.com/CloudNetService/CloudNet/pull/1906) eingereicht: "update minestom to v2026.10.07-26.2", mit dem Fehler `NoSuchMethodError: ConnectionManager#getOnlinePlayers()` als Begründung. Der PR wurde am 11. Oktober 2026 gemergt. Auch unser Fork der CloudNet-Bridge enthält diesen Versionssprung. -## Der Boot-Test als Konsequenz +## Der Boot-Test -Der Fehler wurde beim echten Start sichtbar, nicht durch einen Test. Danach kam der Boot-Test: [PR #398](https://github.com/OneLiteFeatherNET/Titan/pull/398) mit dem Titel "boot the shipped jar and parse a real application.yaml" wurde 17 Minuten nach dem LuckPerms-Fix gemergt, um 17:59 UTC. Er startet das ausgelieferte Jar in einem eigenen Prozess und liest die echte `application.yaml` mit dem Produktionsparser. Das ist ein Smoke-Test im engeren Sinn: Er baut nichts neu, sondern prüft das Ergebnis, das ohnehin auf den Server kommt. Zum Zeitpunkt des Vorfalls gab es ihn auf dem Hauptzweig noch nicht, und die PR-Beschreibung des Fixes hält das ausdrücklich fest. +Der Fehler wurde beim echten Start sichtbar, nicht durch einen Test. Der Boot-Test war bereits in geplanter Arbeit und ist nicht wegen des Vorfalls entstanden: [PR #398](https://github.com/OneLiteFeatherNET/Titan/pull/398) mit dem Titel "boot the shipped jar and parse a real application.yaml" wurde 17 Minuten nach dem LuckPerms-Fix gemergt, um 17:59 UTC. Er startet das ausgelieferte Jar in einem eigenen Prozess und liest die echte `application.yaml` mit dem Produktionsparser. Das ist ein Smoke-Test im engeren Sinn: Er baut nichts neu, sondern prüft das Ergebnis, das ohnehin auf den Server kommt. Zum Zeitpunkt des Vorfalls gab es ihn auf dem Hauptzweig noch nicht, und die PR-Beschreibung des Fixes hält das ausdrücklich fest. -Der Boot-Test prüft genau das, was unsere Unit-Tests nicht prüfen konnten: ob das Artefakt, das wir ausliefern, überhaupt startet. Ein Start des ausgelieferten Jars hätte den Fehler vor dem Release sichtbar gemacht. +Der Boot-Test prüft genau das, was unsere Unit-Tests nicht prüfen konnten: ob das Artefakt, das wir ausliefern, überhaupt startet. Ein Start des ausgelieferten Jars hätte den Fehler vor dem Release sehr wahrscheinlich sichtbar gemacht. ## Der Zeitablauf diff --git a/content/blog/en/titan-from-1-0-to-3-0.md b/content/blog/en/titan-from-1-0-to-3-0.md index 36c62fe8..e113c333 100644 --- a/content/blog/en/titan-from-1-0-to-3-0.md +++ b/content/blog/en/titan-from-1-0-to-3-0.md @@ -72,7 +72,7 @@ On top of that foundation, 2.x shipped one player-facing feature after another i ![A player jumps along the lobby jump'n'run in easy mode: single landing blocks hang in open sky between floating islands](/images/blog/titan-lobby-jump-and-run.webp){width="1600" height="843"} -Behind the scenes, 2.4 added **OpenTelemetry tracing and metrics**, so we can see what is slow before you notice it. 2.6 also brought a **boot smoke test**: CI now starts the shipped jar with the real configuration. It is a direct consequence of an incident on release day, when a library update passed the build and every unit test but kept the lobby from starting. +Behind the scenes, 2.4 added **OpenTelemetry tracing and metrics**, so we can see what is slow before you notice it. 2.6 also brought a **boot smoke test**: CI now starts the shipped jar with the real configuration. The boot test was already in progress and was merged 17 minutes after the fix for the release-day incident, when a library update passed the build and every unit test but kept the lobby from starting. Since then, a failure like this should surface in CI. ## Version 3: one core, several platforms (October 10, 2026) diff --git a/content/blog/en/why-our-tests-were-green-lobby-did-not-start.md b/content/blog/en/why-our-tests-were-green-lobby-did-not-start.md index dc21fa34..e2ae1bf4 100644 --- a/content/blog/en/why-our-tests-were-green-lobby-did-not-start.md +++ b/content/blog/en/why-our-tests-were-green-lobby-did-not-start.md @@ -77,11 +77,11 @@ The CloudNet bridge is loaded as a Minestom extension and was affected by the sa We submitted the change upstream as [CloudNet PR #1906](https://github.com/CloudNetService/CloudNet/pull/1906): "update minestom to v2026.10.07-26.2", with the `NoSuchMethodError: ConnectionManager#getOnlinePlayers()` as its motivation. The PR was merged on 11 October 2026. Our fork of the CloudNet bridge also contains this version bump. -## The boot test as a consequence +## The boot test -The failure became visible when the server was actually started, not through a test. Afterwards came the boot test: [PR #398](https://github.com/OneLiteFeatherNET/Titan/pull/398), titled "boot the shipped jar and parse a real application.yaml", was merged 17 minutes after the LuckPerms fix, at 17:59 UTC. It starts the shipped jar in its own process and reads the real `application.yaml` with the production parser. This is a smoke test in the narrow sense: it builds nothing new and checks the result that would go to the server anyway. At the time of the incident it did not yet exist on the main branch, and the PR description of the fix says so explicitly. +The failure became visible when the server was actually started, not through a test. The boot test was already in planned work and was not created because of the incident: [PR #398](https://github.com/OneLiteFeatherNET/Titan/pull/398), titled "boot the shipped jar and parse a real application.yaml", was merged 17 minutes after the LuckPerms fix, at 17:59 UTC. It starts the shipped jar in its own process and reads the real `application.yaml` with the production parser. This is a smoke test in the narrow sense: it builds nothing new and checks the result that would go to the server anyway. At the time of the incident it did not yet exist on the main branch, and the PR description of the fix says so explicitly. -The boot test checks exactly what our unit tests could not: whether the artifact we ship starts at all. Starting the shipped jar would have made this failure visible before the release. +The boot test checks exactly what our unit tests could not: whether the artifact we ship starts at all. Starting the shipped jar would very likely have made this failure visible before the release. ## The timeline From 8de7b9b8b842c2757e7c49a901fd9be2f07dfcaf Mon Sep 17 00:00:00 2001 From: TheMeinerLP Date: Mon, 12 Oct 2026 12:26:51 +0200 Subject: [PATCH 2/4] fix(blog): smooth the boot test wording Claude-Session: https://claude.ai/code/session_019zws4ceJu2jctk3XT48fMX --- .../de/warum-unsere-tests-gruen-waren-lobby-startete-nicht.md | 2 +- content/blog/en/why-our-tests-were-green-lobby-did-not-start.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/blog/de/warum-unsere-tests-gruen-waren-lobby-startete-nicht.md b/content/blog/de/warum-unsere-tests-gruen-waren-lobby-startete-nicht.md index de58b254..2440b7cb 100644 --- a/content/blog/de/warum-unsere-tests-gruen-waren-lobby-startete-nicht.md +++ b/content/blog/de/warum-unsere-tests-gruen-waren-lobby-startete-nicht.md @@ -79,7 +79,7 @@ Die Änderung haben wir upstream als [CloudNet PR #1906](https://github.com/Clou ## Der Boot-Test -Der Fehler wurde beim echten Start sichtbar, nicht durch einen Test. Der Boot-Test war bereits in geplanter Arbeit und ist nicht wegen des Vorfalls entstanden: [PR #398](https://github.com/OneLiteFeatherNET/Titan/pull/398) mit dem Titel "boot the shipped jar and parse a real application.yaml" wurde 17 Minuten nach dem LuckPerms-Fix gemergt, um 17:59 UTC. Er startet das ausgelieferte Jar in einem eigenen Prozess und liest die echte `application.yaml` mit dem Produktionsparser. Das ist ein Smoke-Test im engeren Sinn: Er baut nichts neu, sondern prüft das Ergebnis, das ohnehin auf den Server kommt. Zum Zeitpunkt des Vorfalls gab es ihn auf dem Hauptzweig noch nicht, und die PR-Beschreibung des Fixes hält das ausdrücklich fest. +Der Fehler wurde beim echten Start sichtbar, nicht durch einen Test. Der Boot-Test war ohnehin schon geplant und ist nicht wegen des Vorfalls entstanden: [PR #398](https://github.com/OneLiteFeatherNET/Titan/pull/398) mit dem Titel "boot the shipped jar and parse a real application.yaml" wurde 17 Minuten nach dem LuckPerms-Fix gemergt, um 17:59 UTC. Er startet das ausgelieferte Jar in einem eigenen Prozess und liest die echte `application.yaml` mit dem Produktionsparser. Das ist ein Smoke-Test im engeren Sinn: Er baut nichts neu, sondern prüft das Ergebnis, das ohnehin auf den Server kommt. Zum Zeitpunkt des Vorfalls gab es ihn auf dem Hauptzweig noch nicht, und die PR-Beschreibung des Fixes hält das ausdrücklich fest. Der Boot-Test prüft genau das, was unsere Unit-Tests nicht prüfen konnten: ob das Artefakt, das wir ausliefern, überhaupt startet. Ein Start des ausgelieferten Jars hätte den Fehler vor dem Release sehr wahrscheinlich sichtbar gemacht. diff --git a/content/blog/en/why-our-tests-were-green-lobby-did-not-start.md b/content/blog/en/why-our-tests-were-green-lobby-did-not-start.md index e2ae1bf4..3e64c757 100644 --- a/content/blog/en/why-our-tests-were-green-lobby-did-not-start.md +++ b/content/blog/en/why-our-tests-were-green-lobby-did-not-start.md @@ -79,7 +79,7 @@ We submitted the change upstream as [CloudNet PR #1906](https://github.com/Cloud ## The boot test -The failure became visible when the server was actually started, not through a test. The boot test was already in planned work and was not created because of the incident: [PR #398](https://github.com/OneLiteFeatherNET/Titan/pull/398), titled "boot the shipped jar and parse a real application.yaml", was merged 17 minutes after the LuckPerms fix, at 17:59 UTC. It starts the shipped jar in its own process and reads the real `application.yaml` with the production parser. This is a smoke test in the narrow sense: it builds nothing new and checks the result that would go to the server anyway. At the time of the incident it did not yet exist on the main branch, and the PR description of the fix says so explicitly. +The failure became visible when the server was actually started, not through a test. The boot test was already planned and was not created because of the incident: [PR #398](https://github.com/OneLiteFeatherNET/Titan/pull/398), titled "boot the shipped jar and parse a real application.yaml", was merged 17 minutes after the LuckPerms fix, at 17:59 UTC. It starts the shipped jar in its own process and reads the real `application.yaml` with the production parser. This is a smoke test in the narrow sense: it builds nothing new and checks the result that would go to the server anyway. At the time of the incident it did not yet exist on the main branch, and the PR description of the fix says so explicitly. The boot test checks exactly what our unit tests could not: whether the artifact we ship starts at all. Starting the shipped jar would very likely have made this failure visible before the release. From abd2c911859c0394f74384884a723ee4ff167cde Mon Sep 17 00:00:00 2001 From: TheMeinerLP Date: Mon, 12 Oct 2026 22:06:01 +0200 Subject: [PATCH 3/4] fix(blog): cover titan 3.1 in the retrospective Claude-Session: https://claude.ai/code/session_019zws4ceJu2jctk3XT48fMX --- content/blog/de/titan-von-1-0-bis-3-0.md | 10 +++++----- content/blog/en/titan-from-1-0-to-3-0.md | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/content/blog/de/titan-von-1-0-bis-3-0.md b/content/blog/de/titan-von-1-0-bis-3-0.md index b04a0637..9854b680 100644 --- a/content/blog/de/titan-von-1-0-bis-3-0.md +++ b/content/blog/de/titan-von-1-0-bis-3-0.md @@ -1,7 +1,7 @@ --- title: 'Von 1.0 bis 3.0: fünfzehn Monate Titan, unser Lobby-Server' alternativeTitle: 'Rückblick auf 67 Releases, 696 Commits und einen Umbau' -description: 'Ein Rückblick auf Titan, unseren quelloffenen Minestom-Lobbyserver: von Version 1.0 im Juli 2025 über die 2.x-Features bis zur Plattform-Trennung in 3.0 und dem, was als Nächstes kommt.' +description: 'Ein Rückblick auf Titan, unseren quelloffenen Minestom-Lobbyserver: von Version 1.0 im Juli 2025 über die 2.x-Features bis zur Plattform-Trennung in 3.0 und dem Release von 3.1.' pubDate: '2026-10-13' releaseDate: '2026-10-13T10:00:00+02:00' headerImage: 'images/og/blog-de.png' @@ -78,13 +78,13 @@ Hinter den Kulissen ergänzte 2.4 **OpenTelemetry-Tracing und Metriken**, damit **3.0.0 ist ein Breaking Change für alle, die Titan selbst betreiben.** Der Start läuft jetzt über einen kleinen Vertrag `ServerBootstrap`, den Java über den `ServiceLoader` auswählt. Minestom-Extensions, CloudNet und LuckPerms liegen jeweils in einem eigenen **Plattform-Modul**. 3.0.1 folgte am selben Abend und übersetzte den Lobby-Switcher ins Deutsche und Englische. Die Details folgen in zwei Deep-Dives: am 20. Oktober zur Plattform-Trennung in 3.0 und am 27. Oktober dazu, warum grüne Tests keine startende Lobby bedeuten. -## Was als Nächstes kommt +## Schon als Nächstes: Titan 3.1 -Einige Verbesserungen sind bereits in Review: +Während dieser Beitrag entstand, ist [Titan 3.1.0](https://github.com/OneLiteFeatherNET/Titan/releases/tag/v3.1.0) erschienen. Es kommt mit dem nächsten Rollout in die Lobby: - Im Navigator verbindest du dich mit einem Linksklick, ein Rechtsklick teleportiert dich vor das passende Portal. -- Live-Spielerzahlen für jeden Modus im Navigator. -- Ein Fix, der jeder Lobby ihr echtes Spielerlimit an CloudNet meldet. +- Der Navigator zeigt die Spielerzahl für jeden Modus. +- Jede Lobby meldet CloudNet jetzt ihr echtes Spielerlimit statt 1, sodass der Lobby-Switcher nicht mehr „Voll (2/1)“ anzeigt. ## Mitmachen diff --git a/content/blog/en/titan-from-1-0-to-3-0.md b/content/blog/en/titan-from-1-0-to-3-0.md index e113c333..5054044b 100644 --- a/content/blog/en/titan-from-1-0-to-3-0.md +++ b/content/blog/en/titan-from-1-0-to-3-0.md @@ -1,7 +1,7 @@ --- title: 'From 1.0 to 3.0: fifteen months of Titan, our lobby server' alternativeTitle: 'A retrospective on 67 releases, 696 commits and one rebuild' -description: 'A look back at Titan, our open-source Minestom lobby server: from the 1.0 release in July 2025 through the 2.x features to the 3.0 platform split, and what comes next.' +description: 'A look back at Titan, our open-source Minestom lobby server: from the 1.0 release in July 2025 through the 2.x features to the 3.0 platform split and the 3.1 release.' pubDate: '2026-10-13' releaseDate: '2026-10-13T10:00:00+02:00' headerImage: 'images/og/blog-en.png' @@ -78,13 +78,13 @@ Behind the scenes, 2.4 added **OpenTelemetry tracing and metrics**, so we can se **3.0.0 is a breaking change for anyone running Titan themselves.** Startup now goes through a small `ServerBootstrap` contract, selected via Java's `ServiceLoader`, and Minestom extensions, CloudNet and LuckPerms each live in their own **platform module**. 3.0.1 followed the same evening and translated the lobby switcher into German and English. The details follow in two deep-dive posts: on October 20 about the 3.0 platform split, and on October 27 about why green tests did not mean a lobby that boots. -## What's next +## Already next: Titan 3.1 -Several improvements are already in review: +While this post was being written, [Titan 3.1.0](https://github.com/OneLiteFeatherNET/Titan/releases/tag/v3.1.0) was released. It reaches the lobby with the next rollout: -- In the navigator, left-click to connect and right-click to teleport in front of the matching portal. -- Live player counts for every mode in the navigator. -- A fix that reports each lobby's real player limit to CloudNet. +- In the navigator, left-click connects you and right-click teleports you in front of the matching portal. +- The navigator shows the player count for every mode. +- Each lobby now reports its real player limit to CloudNet instead of 1, so the lobby switcher no longer shows "Full (2/1)". ## Get involved From b7a92ca30eef465d2b562bc0bd382a243c863312 Mon Sep 17 00:00:00 2001 From: TheMeinerLP Date: Mon, 12 Oct 2026 22:11:57 +0200 Subject: [PATCH 4/4] fix(blog): say titan 3.1 already runs in the lobby Claude-Session: https://claude.ai/code/session_019zws4ceJu2jctk3XT48fMX --- content/blog/de/titan-von-1-0-bis-3-0.md | 2 +- content/blog/en/titan-from-1-0-to-3-0.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/blog/de/titan-von-1-0-bis-3-0.md b/content/blog/de/titan-von-1-0-bis-3-0.md index 9854b680..998216b0 100644 --- a/content/blog/de/titan-von-1-0-bis-3-0.md +++ b/content/blog/de/titan-von-1-0-bis-3-0.md @@ -80,7 +80,7 @@ Hinter den Kulissen ergänzte 2.4 **OpenTelemetry-Tracing und Metriken**, damit ## Schon als Nächstes: Titan 3.1 -Während dieser Beitrag entstand, ist [Titan 3.1.0](https://github.com/OneLiteFeatherNET/Titan/releases/tag/v3.1.0) erschienen. Es kommt mit dem nächsten Rollout in die Lobby: +Während dieser Beitrag entstand, ist [Titan 3.1.0](https://github.com/OneLiteFeatherNET/Titan/releases/tag/v3.1.0) erschienen und läuft bereits in der Lobby: - Im Navigator verbindest du dich mit einem Linksklick, ein Rechtsklick teleportiert dich vor das passende Portal. - Der Navigator zeigt die Spielerzahl für jeden Modus. diff --git a/content/blog/en/titan-from-1-0-to-3-0.md b/content/blog/en/titan-from-1-0-to-3-0.md index 5054044b..b51286cd 100644 --- a/content/blog/en/titan-from-1-0-to-3-0.md +++ b/content/blog/en/titan-from-1-0-to-3-0.md @@ -80,7 +80,7 @@ Behind the scenes, 2.4 added **OpenTelemetry tracing and metrics**, so we can se ## Already next: Titan 3.1 -While this post was being written, [Titan 3.1.0](https://github.com/OneLiteFeatherNET/Titan/releases/tag/v3.1.0) was released. It reaches the lobby with the next rollout: +While this post was being written, [Titan 3.1.0](https://github.com/OneLiteFeatherNET/Titan/releases/tag/v3.1.0) was released, and it is already running in the lobby: - In the navigator, left-click connects you and right-click teleports you in front of the matching portal. - The navigator shows the player count for every mode.