Changelog

Every release, in order.

Conduit follows SemVer with a +mcXX.X.X suffix marking the Minecraft build each release compiled against. While in 0.x, the minor number is the breaking-change signal.

  1. 0.10.2 +mc26.1.2 2026-06

    Operator console + leaderboards — see and rank what the server is doing.

    • Added /conduit leaderboard <stat> [count] — prints the top players by any ProfileStore counter (wins, games_played, points_total, …) in chat, with online-name resolution and stat-name suggestions.
    • Added /conduit admin instances (op-gated) — lists every live game instance with its dimension, template, player count, and callback-fault count, so a stuck instance is one command away instead of a log dig.
    • Added /conduit admin metrics (op-gated) — dumps the new Metrics registry, a process-lifetime counter set the engine bumps at known hotspots (player.leaves, phase.stuck, callback.faults).
  2. 0.10.1 +mc26.1.2 2026-06

    Quality & reliability pass — persistent player stats, achievements, stuck-phase recovery, and crash isolation.

    • Added ProfileStore (core) — durable, cross-game player profiles: schema-free counters (wins, games_played, points_total…) + attributes, persisted on the overworld via SavedData. increment / set / counter / setAttr / attr / top. The keystone for leaderboards, achievements, and match history.
    • Added Achievements (core) + AchievementToast (fx) — declarative unlock triggers on profile counters ("First Win!" when wins ≥ 1), persisted as ach.<id> attributes so they never re-fire, with a gold title-card + chime presentation wired through a callback handoff.
    • Added MatchResult + MatchHistorySavedData (arena) — snapshot a finished Match (winner / standings / points); commitTo() folds the outcome into ProfileStore, and a capped 50-entry ring buffer keeps recent results queryable.
    • Added PhaseFlow timeouts + PhaseWatchdog + TimedPhaseFlow (arena) — per-phase deadlines that auto-advance a stuck phase (an AFK host in the lobby, a missed transition) and log/alert on every recovery, so one wedged instance can't hang forever on a live stream.
    • Added GuardedDispatch + FaultPolicy (arena) — an exception-isolation barrier around game-supplied callbacks. One throwing onTick or phase callback can no longer kill the server tick or leave a half-applied phase; Game.faultPolicy() can escalate to a clean teardown.
    • Added Effect choreography (fx) — Particles (burst / ring / elimination / safe macros), FxTimeline (a self-ticking at / after / repeat sequencer), EffectThrottle (per-key cooldown gate), and ScoreBoardBinding + arena MatchScoreboard for a live standings HUD.
    • Added PlayerLifecycle (core) — one engine-wide disconnect fan-out that auto-prunes transient per-player state (game state, inventory stash, sidebar, bossbars, spectator) so long-running servers stop leaking as players churn. SpectatorManager gained a SpectatorListener observer seam.
    • Fixed Thread-safety on the player-state, inventory-stash, sidebar, bossbar, and spectator maps (now ConcurrentHashMap), plus a Sidebar.show sub-list aliasing bug — issues surfaced by a full-engine code survey.
  3. 0.10.0 +mc26.1.2 2026-06

    Vanilla GUI kit grows up — interactive, Minecraft-looking config menus.

    • Added VanillaConfigMenu — declarative config screens: declare a title + ordered list of ConfigEntry and an onChange callback, and the framework compiles a vanilla-themed screen, routes every control click + text submit, applies the standard mutation, fires the callback, and re-renders. Tab strips, automatic pagination, and a per-(player, screen) open registry.
    • Added ConfigEntry sealed types — Toggle / Cycle / Stepper / Slider / Action / Text, each immutable with typed with* helpers the framework calls for you.
    • Added Real Sliders — a recessed track with a raised handle. Click routing goes through the new positional ServerScreenManager.onButtonAt, which carries the click's screen-UV (ButtonClickPayload gained clickU/clickV) so the server resolves the track fraction. Click-to-position (an in-world screen emits a click, not mouse-move), snapped to step.
    • Changed Stateless button chrome is now texturedCycle, the Stepper [−]/[+], Action, Done, Prev/Next render the 9-slice pixel-art vanilla button. Controls whose chrome encodes state stay procedural: the toggle (bevel direction = on/off), tabs (pressed-in = selected), and the slider. The textured border is sized to vanilla's 3px/20px ratio so it reads thin and elegant, not chunky.
    • Changed Pressed / ON buttons darken the whole face uniformly (~18%) on top of the inverted bevel, so an active toggle reads as genuinely pushed into shadow rather than just re-lit.
    • Fixed Button z-fighting on rect-heavy screens (e.g. a scroll list's row backgrounds vs the arrow buttons). Buttons now composite above the per-index rect z band and below the text plane, with their internal layers a tight 0.0005 apart so the black outline no longer parallax-leaks past the fill on an off-axis screen.
  4. 0.9.0 +mc26.1.2 2026-05

    Developer-velocity pass — five reusable primitives so new games stop re-implementing scaffolding.

    • Added SafeTeleport now preloads the destination chunks (to FULL) before the deferred teleport, fixing the land-in-darkness / fall-through-terrain stutter every cross-area teleport hit. New preloadRadius overload + public preloadChunks; default radius 1, NO_PRELOAD to skip.
    • Added GatherRoom (core) — the assemble-everyone-then-send-home lifecycle (meetings, voting rooms, finales): force-loads the room while open, snapshots each player's prior position, stashes inventory, and reverses it all on disperse. Built on SafeTeleport + PlayerInventoryStash.
    • Added ConduitTest (core) — a solo-testing harness: an op-gated test list / test run <scenario> command subtree, a named-scenario registry, and a deterministic fake roster so a whole match can be driven from one client without a lobby.
    • Added Titles (fx) — fullscreen title / subtitle / action-bar cards for one player or a group, with correct packet ordering and tick-based timing.
    • Added Regions (world) — axis-aligned box fills: fill / fillHollow / fillWalls / replace. The geometry every prefab-built arena re-wrote.
  5. 0.8.0 +mc26.1.2 2026-05

    Arena instances go on-demand + handle-based; data-driven dimension specs.

    • Changed conduit-arena's InstanceManager is now on-demand + handle-based, built on RuntimeDimensions — no fixed 8-slot pool. Each acquire spins up a fresh conduit:rt-<n> world; instances are keyed by dimension, not slot.
    • Changed Session routing is String-keyed: SessionRecord.instanceSlot (int) → instanceKey; holdSlotholdInstance, setHoldExpiryHandler now takes the dimension key.
    • Added RuntimeDimensionSpec.fromStem / fromStemJson / fromDatapackStem — define a dimension from a LevelStem, raw JSON, or a datapack-registered stem.
    • Removed ServerLevelSeedMixin + the 8 instance-*.json datapack dimensions — runtime creation sets the seed at construction, so neither is needed.
    • Migration The common consumer path — acquire(server, WorldTemplate.VOID)level()release() — is unchanged. GameInstance.slot()handle() / dimension().
  6. 0.7.0 +mc26.1.2 2026-05

    Persistent runtime worlds — restart recovery.

    • Added A persist=true runtime dimension is recorded to a manifest and recreated on the next server start, loading its existing region data.
    • Changed persist now means restart-survival, not release-survival — release always fully destroys. The boot orphan sweep is manifest-aware (keeps restored worlds).
  7. 0.6.0 +mc26.1.2 2026-05

    On-demand runtime dimensions.

    • Added New conduit-instance module — create a fresh world per match and tear it down when it ends, instead of claiming from a fixed pool.
    • Added RuntimeDimensions.create / release, RuntimeDimensionSpec (voidWorld / copyOf builders, persist flag), RuntimeDimensionHandle.
    • Added Crash-orphan sweep on server start; force-release of all runtime dimensions on shutdown.
  8. 0.5.0 +mc26.1.2 2026-05

    Spectator mode simplified to vanilla SPECTATOR.

    • Changed SpectatorManager now uses vanilla GameType.SPECTATOR instead of the ADVENTURE + flight + invisibility + scoreboard-team model. Vanilla SPECTATOR natively blocks pickup / drop / use / attack and cancels damage.
    • Removed TEAM_NAME constant + the internal ability / team helpers.
    • Migration Consumers that relied on dead players being ADVENTURE must adapt — that policy moved out of the engine and into the mod.
  9. 0.4.0 +mc26.1.2 2026-05

    Modular split + player session manager.

    • Added The monolithic engine became seven separately-published modules + a conduit aggregator BOM.
    • Added Per-module initializers.
    • Added PlayerSessionManager — disconnect snapshots + reconnect routing with a configurable hold window, persisted across restart.
  10. 0.3.0 +mc26.1.2 2026-05

    Initial stable Minecraft 26.1.2 port.

    • Added First stable MC 26.1.2 port of the pre-modular engine.