Skip to content

Releases: YanIanZ/SourbyCraft

Saturday, 24 October 2026, 06:16 (GMT+7) — 26.2-r49.1 aurora-nexus [release: prepare hotfix 49.1 publication]

Choose a tag to compare

@github-actions github-actions released this 23 Oct 23:16

SourbyCraft 26.2 Build 49.1 — SourbyCraft-26.2-REL.jar (sha256 a33c5ddfffffd0b4e8c89e109b69130c7fb57ab99f5751d7283359844e1de290)

Auto-published from hotfix/26.2-r49.1 after a green build + boot test.

SourbyCraft 26.2 Build 49.1 — hotfix (Aurora Nexus)

Release source: hotfix/26.2-r49.1, based on v26.2-r49.
Publication requires the official build, boot and independent reproducibility jobs to pass.
Java: 25 · Minecraft: 26.2 · Engine: Aurora Engine. No STABLE claim.

Changes

  • The AbyssLink interoperability harness asserted absent and stale ping samples
    with Optional.filter(predicate -> false), a condition that can never pass.
    ping-absent and ping-stale therefore failed even when the client correctly
    returned no sample, and java-harness exited non-zero as a consequence. The
    harness now expects Optional.empty() for those two checks; matched samples
    keep their predicate. Test-only change — no server runtime code, configuration
    key, protocol field or gameplay behavior changes.

The hotfix backports only this test fix. Build 49.1 contains no Build 50 work
(AWF multi-profile/Redis fabric, the SourbyMod loader, versioning 26.3) and no
other Build 49 changes.

Operator behavior

None. No configuration key is added, renamed or re-read; the shipped jar's
runtime behavior is identical to 26.2-r49. Operators do not need to update for
this hotfix unless they run the AbyssLink interoperability harness.

Verification

  • scripts/abysslink/run_interop.py against the Leviathan AbyssLink sources
    (digest a24002ac…): 16/16 checks PASS, including ping-absent,
    ping-stale, ping-found, heartbeat, reconnect and the negative
    certificate/hostname cases. JDK 25.0.2.
  • Harness golden/limit checks are unchanged by this fix.
  • Artifact, boot and reproducibility jobs are the official CI gates for this
    publication.

Commits

  • release: prepare hotfix 49.1 publication
  • fix(abysslink): assert absent and stale ping samples as empty

Saturday, 24 October 2026, 05:25 (GMT+7) — 26.2-r49 aurora-nexus [Merge pull request #58 from YanIanZ/docs/versioning-26.3]

Choose a tag to compare

@github-actions github-actions released this 23 Oct 22:25
6921fe7

SourbyCraft 26.2 Build 49 — SourbyCraft-26.2-REL.jar (sha256 c2ce625ba8de4466d174d9501cc1d34ea8a80771e18f97027343d56c864b6f8f)

Auto-published from 26.2 after a green build + boot test.

SourbyCraft 26.2 Build 49 — Aurora Nexus (normal release)

Release source: 26.2 at the merge of PR #54 (2b499e34).
Java: 25 · Minecraft: 26.2 · Engine: Aurora Engine. No STABLE claim: the gates in
26.2-build-49.md remain open.

This is the first release that contains the Build 49 configuration layout and the YAML config files.

Changes since the Build 48 line

  • YAML configuration with a one-time conversion. sourbycraft_config/aurora.yml and
    sourbycraft_config/sourbycraft_global_config.yml replace the TOML files. On the first boot an
    existing *.toml is parsed, written as *.yml with every value and comment, and renamed
    *.toml.migrated; a *.yml always wins, a read-only directory keeps reading the TOML, and an
    unparseable file is left untouched and named with file + near-line. Build 49 key layout
    (console, players, messages, plugins.*, updater; aurora.* services) as described in
    AURORA-CONFIG.md.
  • AbyssLink (optional, disabled by default). A bounded, verified-mTLS client for Leviathan's
    separate control listener (heartbeat, proxy ping samples, health reports, advisory threat
    signals) and a Folia-safe native /ping. Gameplay forwarding and admission are unchanged; a
    configuration or TLS failure logs one WARN and leaves the server fully available. See
    docs/abysslink.
  • Shutdown fixes from 48.4. A sync chunk load requested from the region shutdown thread is
    refused with an owned message instead of throwing Polling tasks from non-owned region (or
    hanging); a stopped BRIDGE_IO lane is reported as stopping, rate-limited, without a stack
    trace; config parse failures name the file and near-line.
  • The earlier 26.2 work merged since v26.2-r48 (relaxed thread checks, teleport/portal seams,
    bridging context routing, PaperLib 26.x compatibility, off-thread chunk waits) is included; see
    git log v26.2-r48..v26.2-r49 for the full list.

Operator behavior

  • Back up sourbycraft_config/ before the first boot. The conversion is one-way: to downgrade,
    delete or rename the *.yml file and restore *.toml.migrated to *.toml.
  • An unparseable old TOML is not converted and not renamed; the server logs the file and near-line
    and uses documented defaults for values it cannot read.
  • AbyssLink stays off until aurora.abysslink.enabled: true and a backend client certificate/key are
    configured; tls: false is rejected.
  • Thread-check defaults and the bridge mode are unchanged from 48.4.

Verification

  • Full server suite green on the release tree; Python suite 720 tests OK (1 skip) on the AbyssLink
    and YAML branches.
  • Boot probes: TOML→YAML conversion with .toml.migrated, second boot reads YAML, fresh install
    seeds a documented aurora.yml including the abysslink section, and a fresh boot with AbyssLink
    disabled reaches Done without an AbyssLink error.
  • The release workflow repeats build, tests, boot tests, independent rebuild, signature and
    publication for this tag.

Open gates (not claimed)

  • STABLE: the Build 49 gate list in 26.2-build-49.md is not PASS.
  • AbyssLink: protocol/implementation tests pass locally; no deployed Leviathan interoperability,
    real proxy traffic or soak is claimed.
  • The YAML conversion is covered by unit tests and boots, not by an exhaustive matrix of operator
    files; the .migrated copy is the recovery path.

Commits

  • Merge pull request #58 from YanIanZ/docs/versioning-26.3
  • feat(release): enforce the 26.3 Build 100 line and Aurora Forge codename
  • Merge pull request #57 from YanIanZ/fix/ci-awf-yaml-export
  • fix(ci): write the AWF export boot's config as YAML
  • Merge pull request #55 from YanIanZ/release/26.2-r49
  • release: prepare Build 49 publication
  • Merge pull request #54 from YanIanZ/feat/abysslink
  • fix(config): seed AbyssLink keys and keep its settings read-only
  • feat(abysslink): verified-mTLS Leviathan control client and native /ping
  • Merge pull request #53 from YanIanZ/feat/config-yaml
  • fix(config): keep the bootstrap provisioning reader self-contained
  • docs(config): YAML files, examples and the conversion rules
  • refactor(config): open SourbyCraft's files as YAML everywhere they are read
  • feat(config): YAML with comments and a one-time TOML conversion
  • Merge pull request #52 from YanIanZ/fix/shutdown-bridge-noise
  • fix(shutdown): refuse sync chunk loads on the shutdown thread
  • test(shutdown): write a block from the legacy plugin's onDisable
  • fix(config): name the line a config parse failure comes from
  • fix(bridge): a stopped IO lane is not logged as saturation
  • fix(shutdown): wait for the chunk load instead of pumping the main queue
  • chore(patches): re-export unchanged feature patches after the reapply
  • Merge pull request #50 from YanIanZ/feat/bridge-relaxed-thread-checks
  • Merge pull request #49 from YanIanZ/fix/bridge-offthread-chunks
  • docs(bridge): record Luminol verification
  • fix(teleport): preserve portal state at its seam
  • feat(config): expose thread checks in Build 49
  • feat(bridge): port LightingLuminol thread checks
  • docs(guards): regenerate ledger summary for paper 0028
  • fix(world): World#getChunkAt from a thread that ticks nothing waits for the chunk (paper 0028)
  • Merge #47: fix(compat): PaperLib uses its async chunk path on 26.x (paper 0027)
  • fix(compat): PaperLib uses its async chunk path on 26.x (paper 0027)
  • Merge #48: feat(bridge): anchor untargeted legacy sync tasks to the player they act for (paper 0026)
  • feat(bridge): anchor untargeted legacy sync tasks to the player they act for (paper 0026)
  • Merge #46: fix(plugins): count plugins that never loaded as failed
  • fix(plugins): count plugins that never loaded as failed
  • Merge #45: fix(startup): honour provides in the missing-dependency warning
  • fix(startup): honour provides in the missing-dependency warning
  • Merge #44: fix(world): world settings on the startup thread before regions tick (paper 0025)
  • fix(world): world settings on the startup thread before regions tick (paper 0025)
  • Merge #42: fix(compat): restore MinecraftServer.currentTick as a global-tick counter (0083)

Saturday, 24 October 2026, 02:57 (GMT+7) — 26.2-r48.4 aurora-nexus [release: prepare hotfix 48.4 publication]

Choose a tag to compare

@github-actions github-actions released this 23 Oct 19:57

SourbyCraft 26.2 Build 48.4 — SourbyCraft-26.2-REL.jar (sha256 e3aeba557c7a77afebd796f42f1545a393ed7bf5f2df292e74b180c17acaf347)

Auto-published from hotfix/26.2-r48.4 after a green build + boot test.

SourbyCraft 26.2 Build 48.4 — hotfix (Aurora Nexus)

Release source: hotfix/26.2-r48.4, based on v26.2-r48.3 (0d544f27).
Publication requires the official build, boot and independent reproducibility jobs to pass.
Java: 25 · Minecraft: 26.2 · Engine: Aurora Engine. No STABLE claim.

Changes

  • A synchronous chunk load requested from the region shutdown thread is refused up front with an owned
    message. The scheduler halts before plugins disable, so a load scheduled from a plugin's onDisable
    can never run: pumping the main-thread queue threw Polling tasks from non-owned region (r48.3),
    and waiting for the load hung the shutdown (boot probe). An already loaded chunk still serves the
    write. Feature patch 0081 (Minecraft commit 6c2a268).
  • The BRIDGE_IO lane reporting full or stopping no longer logs a WARN with a stack trace per skipped
    repeating task during shutdown: a stopped lane says BRIDGE_IO lane is stopping, keeps the
    per-plugin rate limit, and logs no throwable. Saturation keeps its WARN and also drops the throwable.
  • An unreadable config file is reported as file (near line N: snippet): parser message by the bridge,
    AWF, Redis, chunk-generation and SourbyCraftConfig readers, instead of a token with no location
    (Invalid integer: sourby). Values and files are never rewritten by the diagnostic.
  • The legacy test fixture writes an unloaded chunk from onDisable; the bridge boot requires the
    refusal marker and fails on Polling tasks from non-owned region.

The hotfix backports only these changes. Build 49 configuration renaming, the TOML→YAML migration,
console changes, background level.dat writer and Build 50 hook refactors are excluded. The portable
port's MC 0084–0086 remain 0078–0080 on this base. Build 48 configuration files keep their layout.

Operator behavior

No configuration key is added or renamed. aurora.bridge.mode still defaults to off; with
mode = "safe" the 2026-10-22 relaxed thread-check default applies as in 48.3.

A plugin that writes to an unloaded chunk from onDisable now receives an
IllegalStateException naming the halted scheduler instead of the bridge/pollTask error; the write
cannot be applied at that point either way. Writes to already loaded chunks are unaffected.

The shutdown log is quieter: one rate-limited stopping line per plugin instead of a stack trace per
skipped run. Diagnostic-only; scheduling behavior is unchanged.

Verification

Verified local candidate: 12,060 tests (0 failures/errors, 29 skipped), API 585 (0 failures/errors, 2 skipped), test-plugin 14 (0 failures/errors).
Python suite: 648 tests OK, 1 skipped. Patch/baseline/guard/surface policies and build identity
verified with Temurin 25. Boot/stop probe with aurora.bridge.mode = "safe" and the legacy plugin:
LEGACY_DISABLE_UNLOADED_BLOCK_WRITE_REFUSED with the owned message, clean exit 0, no
Polling tasks from non-owned region, no BRIDGE_IO stack traces.

Tested artifact code revision: 9533137ffd35bf3b87cd8081df3a283b4b074048.

Commits

  • release: prepare hotfix 48.4 publication
  • fix(shutdown): refuse sync chunk loads on the shutdown thread
  • test(shutdown): write a block from the legacy plugin's onDisable
  • fix(config): name the line a config parse failure comes from
  • fix(bridge): a stopped IO lane is not logged as saturation
  • docs(release): record fresh preflight checks
  • release: prepare hotfix 48.3 publication
  • docs(hotfix): record 48.3 candidate evidence
  • fix(config): show hotfix thread-check mode
  • test(teleport): record the portal config seam
  • fix(teleport): keep portal state at the patch seam
  • release: prepare Build 48.3 candidate
  • feat(bridge): port LightingLuminol thread checks
  • fix(world): World#getChunkAt from a thread that ticks nothing waits for the chunk (paper 0028)
  • fix(compat): PaperLib uses its async chunk path on 26.x (paper 0027)
  • feat(bridge): anchor untargeted legacy sync tasks to the player they act for (paper 0026)
  • fix(plugins): count plugins that never loaded as failed
  • fix(startup): honour provides in the missing-dependency warning
  • release: Build 48.2 local verification evidence
  • release: Build 48.2, hotfix of Build 48 for world overrides, FAWE currentTick and startup world settings
  • fix(world): world settings on the startup thread before regions tick (paper 0025)
  • fix(compat): restore MinecraftServer.currentTick as a global-tick counter (0077)
  • fix(world): missing Aurora/Canvas.Distance means no override
  • release: Build 48.1 local verification evidence
  • release: Build 48.1, hotfix of Build 48 for the licence texts (SEC-13)
  • ci(release): publish hotfix releases from hotfix/26.2-r.
  • fix(licence): ship GPL text and source notice in the released jar (SEC-13)

Friday, 23 October 2026, 22:10 (GMT+7) — 26.2-r48.3 aurora-nexus [docs(release): record fresh preflight checks]

Choose a tag to compare

@github-actions github-actions released this 23 Oct 15:10

SourbyCraft 26.2 Build 48.3 — SourbyCraft-26.2-REL.jar (sha256 b884e29988b1cbd814b86c0cc09cde8254f6fdb7bdd908b9b8e5ca6289192d90)

Auto-published from hotfix/26.2-r48.3 after a green build + boot test.

SourbyCraft 26.2 Build 48.3 — hotfix (Aurora Nexus)

Release source: hotfix/26.2-r48.3, based on v26.2-r48.2 (d6a00483).
Publication requires the official build, boot and independent reproducibility jobs to pass.
Java: 25 · Minecraft: 26.2 · Engine: Aurora Engine. No STABLE claim.

Changes

  • Plugin startup dependencies honor provides aliases (#45); indexed plugins the manager never created are
    reported as failed consistently (#46).
  • Legacy tasks inherit the player whose command/event scheduled them, including through async continuations
    (#48, Paper 0026). Explicit targets still take precedence; native region/entity scheduler behavior remains.
  • Shaded PaperLib on Minecraft 26.x selects its async chunk/teleport implementation (#47, Paper 0027).
  • A thread that ticks nothing may wait for World#getChunkAt through the chunk system, bounded to 30 seconds
    (#49, Paper 0028); tick-thread behavior follows the ownership mode below.
  • LightingLuminol thread-check port: MC 0078–0080 and Paper 0029, with world-data leases, collection locking,
    visible relaxed-access counters, bounded motion-aware teleport waiting and legacy teleport/portal events.
    Review fixes reclassify listener redirects, restore portal-cancelled entity/client worlds, preserve effective
    portal rotation and metadata, retain velocity flags, and remove the early-settings initialization lock cycle.

The hotfix backports only these changes. Build 49 configuration renaming, console changes, background level.dat
writer and Build 50 hook refactors are excluded. The portable port's MC 0084–0086 become 0078–0080 on this base;
Paper 0026–0029 retain their numbers. Build 48 configuration files keep their existing layout.

Operator behavior

aurora.bridge.mode remains off by default. With mode = "safe", the owner's 2026-10-22 decision
("Tiru penuh LightingLuminol") makes aurora.bridge.thread-checks = "relaxed" the default, including existing
safe-mode servers without that key. enforced restores ownership refusals; bridged relaxes only bridged task
bodies. The key is RESTART_REQUIRED, read early; -Daurora.bridge.thread-checks= overrides it. Mode off
keeps checks enforced regardless of the configured value. New aurora.toml files contain the key and explanation;
existing operator files are preserved. /ver, /perf plugins, /sourbycraft config, plugin diagnostics and the boot log show the mode.

Relaxed/bridged checks permit foreign-thread access; data races, persisted world corruption, item duplication
and deadlocks remain possible. These modes are unsafe and unqualified. Functional tests and boots do not
establish plugin safety or release-wide performance. Player gameplay, portal cancellation/redirection in real
plugins, broader AWF concurrency and sustained soak remain owner acceptance gates.

Legacy PlayerTeleportEvent/PlayerPortalEvent support also runs in enforced mode. Its independent restart-only
escape hatch is -Daurora.compat.async-teleport-events=false.

Verification

Verified local candidate: full hotfix server suite 12,053 tests (0 failures/errors, 29 skipped), API 585
(0 failures/errors, 2 skipped), test-plugin 14 (0 failures/errors). The final diagnostic-row change passed 31
focused tests; the publication preflight reran all 648 Python tests successfully with no skips (the earlier run
had one skip). Patch/baseline/guard/surface policies, packaging, build identity,
source provenance and API/licence verification passed with Temurin 25.0.5+8.

Isolated SAFE enforced and default-relaxed boots each passed 31 required fixture markers and stopped cleanly.
A region-scheduled read-only fixture reopened the relaxed run's AWF FILE world and found its saved GLOWSTONE.
This establishes one-block local persistence evidence, not AWF safety under arbitrary relaxed concurrent access.

Tested artifact code revision: 897075f7df62dcd155e75c9483fcffec051d67c1. Documentation-only later commits
are not embedded in it. Exact scope, commands, skips, failed-check explanations, SHA-256 and open gates.
Four integration regressions, the portal client-dimension case and early-settings lock case failed before their
fixes; structural/unit tests do not replace real-player portal tests.

Owner authorized publication on 2026-10-23 after review and verification. The push workflow publishes
v26.2-r48.3 only after its build, boot and independent rebuild succeed, then offers it through the auto-updater.
The published artifact's exact commit, checksum, SBOM, provenance and available signatures come from that run;
the local candidate hash above is not the CI artifact hash. No panel/VPS deployment is part of this release.

Commits

  • docs(release): record fresh preflight checks
  • release: prepare hotfix 48.3 publication
  • docs(hotfix): record 48.3 candidate evidence
  • fix(config): show hotfix thread-check mode
  • test(teleport): record the portal config seam
  • fix(teleport): keep portal state at the patch seam
  • release: prepare Build 48.3 candidate
  • feat(bridge): port LightingLuminol thread checks
  • fix(world): World#getChunkAt from a thread that ticks nothing waits for the chunk (paper 0028)
  • fix(compat): PaperLib uses its async chunk path on 26.x (paper 0027)
  • feat(bridge): anchor untargeted legacy sync tasks to the player they act for (paper 0026)
  • fix(plugins): count plugins that never loaded as failed
  • fix(startup): honour provides in the missing-dependency warning
  • release: Build 48.2 local verification evidence
  • release: Build 48.2, hotfix of Build 48 for world overrides, FAWE currentTick and startup world settings
  • fix(world): world settings on the startup thread before regions tick (paper 0025)
  • fix(compat): restore MinecraftServer.currentTick as a global-tick counter (0077)
  • fix(world): missing Aurora/Canvas.Distance means no override
  • release: Build 48.1 local verification evidence
  • release: Build 48.1, hotfix of Build 48 for the licence texts (SEC-13)
  • ci(release): publish hotfix releases from hotfix/26.2-r.
  • fix(licence): ship GPL text and source notice in the released jar (SEC-13)

Saturday, 24 October 2026, 06:11 (GMT+7) — 26.2-r50 aurora-nexus [Build 50@5f5a167PR!] [fix(mod): accept numeric versions and audit the loader's file-only classloading]

Choose a tag to compare

@github-actions github-actions released this 23 Oct 23:11

SourbyCraft 26.2 Build 50@5f5a167PR! — SourbyCraft-26.2-REL.jar (sha256 7137f22cb9c723859a17c15fb2db0ae50127872525fa80d71d59687fdf15197f)

Auto-published from 26.2 after a green build + boot test.

SourbyCraft 26.2 Build 50 — Aurora Nexus

Codename: Aurora Nexus. Owner decision 2026-10-24: the 26.2 line stays Aurora Nexus through
Build 50; the Minecraft 26.3 line starts at Build 100 with codename Aurora Forge
(scripts/release_version.py enforces both the build-number range and the 26.3 codename). Goal:
leave SourbyCraft ready to move to Minecraft 26.3.

Status: PRERELEASE PREPARED — release=pre, sourbyBuild=50; optimisation build (pengoptimalan), owner decision 2026-10-21. Only the owner-reported AWF/MultiProfile rows are PASS; every other gate is NOT RUN.
Target channel: GitHub prerelease now (release=pre, tag v26.2-r50); normal release only after every gate
Java: 25
Engine: Aurora Engine

Plan and item allocation: ROADMAP-47-50.md. Item references there
(docs/TODO.md:N, board ids) are the source of truth for scope; this document holds the gates.

Theme

Certified baselines first, then measured optimizations in the entity, chunk and network domains,
the async pathfinding default decision, and memory/allocation work. Every performance statement
follows docs/DEVELOPMENT.md: commit/build,
workload, hardware, thread/worker/config values, world state, client fidelity, window,
certification state, metric and statistic.

Entry criteria

  • Build 49 tagged. Certified references are taken on the Build 49 tree; optimizations are
    compared against them.
  • A quiet machine meeting the certification rule (foreign CPU below 10 % for the whole window,
    docs/architecture/qualification-readiness.md §6). None exists on 2026-10-21; four attempts in
    September measured 21–23 % average.
  • Real clients available for players-* and entity-stress (entity activation is computed around
    players; driving mobs without players measures the inactive path).
  • Owner decision on the representative product workload.

Rules

  • Regression gate (docs/DEVELOPMENT.md §7): unexplained >3 % regression → investigate; >5 % → written
    justification; >10 % → blocks unless it fixes a correctness/security defect.
  • Stability budget (docs/DEVELOPMENT.md §6) holds for every optimization; a change touching
    concurrency or lifecycle needs a soak.
  • No default changed for performance without certified A/B evidence (ENG-9 rule); no gains from
    reduced gameplay work (docs/DEVELOPMENT.md §5); no thread-count folklore (§6).
  • Uncertified runs may guide work but are labelled uncertified and support no release-wide claim.

AWF and MultiProfile in Build 50

Build 50 carries the first shipping AWF MultiProfile, the Aurora Redis Fabric foundation, AWF
hardening and the ML1 SourbyMod loader. The AWF features are off by default; SourbyMods load only
from jars an operator places in mods/. None of them is qualified:

Change State Owner procedure
AWF MultiProfile (profiles, switching, recovery, admin commands) implemented, unqualified docs/testing/owner/03-EXPERIMENTAL-FEATURES-TESTING.md §1
Aurora Redis Fabric (pools, sessions, coordination, cache, routing) implemented, unqualified docs/testing/owner/03-EXPERIMENTAL-FEATURES-TESTING.md §2
Distributed MultiProfile (two nodes, fence, takeover) experimental, unqualified, BLOCKED on a two-node environment 03 §MP-010
AWF missing-template refusal and registry validation implemented, needs owner run docs/testing/owner/01-AWF-TESTING.md §AWF-009, §AWF-010
AWF shutdown after the Redis fabric's STORAGE pool implemented, needs owner run 03 §RF-004
Async pathfinding unchanged, still OFF by default docs/testing/owner/02-ASYNC-PATHFINDING-TESTING.md
SourbyMod (ML1) new native loader; no Fabric/Forge; one WARN per unsupported jar 03 §SM-001

SourbyMod (ML1)

mods/*.jar with a sourbymod.yml at the root are loaded in their own URLClassLoader
(parent = server classloader, so NMS + Bukkit + dev.iyanz.sourbycraft.* are visible). onLoad
runs in the sourby mods boot stage after configuration and before worlds; onEnable runs on
ServerLoadEvent(STARTUP); onDisable runs in SourbyCraftBootstrap.close() in reverse order.
A broken mod is isolated (WARN, server continues), duplicate ids and api > 1 are skipped, and
descriptor parsing uses SnakeYAML SafeConstructor. The loader is not a Fabric/Forge loader:
those jars are refused with one WARN each. Format and limits: docs/SOURBYMODS.md.

Owner testing handbook: docs/testing/owner/00-TESTING-INDEX.md.
Every entry there is READY FOR OWNER TEST or BLOCKED; nothing is PASSED.

Publication stage (prerelease)

Owner decision 2026-10-24: Build 50 ships first as a GitHub prerelease (release=pre,
sourbyBuild=50, tag v26.2-r50). The auto-updater skips prereleases unless
updater.allow-prerelease: true.

The display identity follows the stage:

Stage release Display Colour
Prerelease (now) pre Build 50@<short-commit>PR! red
Release (after every gate) true Build 50 — Aurora Nexus green

BuildInfo.formatReleaseIdentity is the single formatter for /ver, /sourbycraft version|status,
the ready summary and the launch lines; SourbyCraftColors.releaseStage is the single colour rule.
The GitHub release title uses the same identity (Build 50@<short>PR! while release=pre).
Changing the stage is one line in gradle.properties plus the normal gate review; no code change.

Owner report 2026-10-24: AWF and MultiProfile testing is complete. The result sheets and any
evidence still belong in docs/testing/owner/06-RESULTS-TEMPLATE.md; the statuses in
00-TESTING-INDEX.md record the report, not an agent-run test.

Owner decisions needed

Decision Blocks
Release channel — decided 2026-10-24: prerelease (release=pre), normal release after every gate publication
Representative workload: "one player exploring new terrain" vs "10 players settled" (also decides the chunk-worker recommendation and pre-generation priority) baseline gate, chunk-worker recommendation
Certified host: which machine, and when it is quiet every certified gate
Async pathfinding default (aurora.entity.async-pathfinding, OFF today) after benchmark + soak pathfinding gate
EDF scheduler (parked LeafPile-derived AuroraEdfScheduler): unpark or keep parked scheduler row

Release readiness

PASS means certified evidence on the tree that would be tagged. Nothing is PASS on 2026-10-24.

Gate State Evidence required Context (2026-10-21)
Certified reference pair NOT RUN idle + chunk-stress certified by run_baseline.py on the Build 49 tree, twice for comparability blocked: no quiet machine
Certified workloads NOT RUN certified runs: players-10/50/100 with connected clients, entity stress (mob AI, tracking, combat), chunk generation/traversal/save stress, network, plugins-10 on a host with a shell uncertified demo runs only (docs/BASELINE.md); certified 10-player soak predates Build 47
JFR review NOT RUN rank_hotspots.py CPU, allocation, contention and I/O rankings from certified runs tooling verified 2026-10-20; rankings only from uncertified runs (hotspots-entity-ai.md)
Entity optimizations NOT RUN per change: profile → candidate → certified before/after on the same workload, ownership/reentrancy/persistence notes (docs/DEVELOPMENT.md truthfulness §4), default-off or rollback for material risk exploratory collision/query/tracker samples; one tracker candidate withdrawn as unsafe
Chunk optimizations NOT RUN same as above; new-terrain stutter profiled with chunk-generation-metrics on, root cause shown before a fix is claimed chunk-worker 2 vs 6 delivery observation (2026-10-06, uncertified, one workload)
Network optimizations NOT RUN encode/decode, compression, chunk-send, allocation/copy profiles; certified before/after static audit network-allocation-copy-audit.md
Async pathfinding NOT RUN sync vs async benchmark on a certified workload; mob behaviour soak (villager workstations, per-type attribution); owner decision recorded asyncpath-soak-2 functional flag-on run (2026-10-21): 204 accepted / 0 refused, no exceptions; not a benchmark
Scheduler (EDF) HELD only if the owner unparks it: AuroraEdfSchedulerTest, independence policy, boot, certified comparison parked since 2026-10-07
Memory PARTIAL allocation MB/s matches JFR; RSS/cgroup on Linux/container RSS/cgroup: functional run on a shared VPS (cgroup v2, jar r47, no clients) matched heap/Process RSS/limit to the OS in a cgroup-namespace emulation; host cgroup view lacked container usage (F1), fix uncommitted and fixture-tested only, not re-run; real Docker/Pterodactyl and cgroup v1 untested; evidence; allocation MB/s vs JFR NOT RUN
Startup NOT RUN cold vs warm startup benchmark (startup cache) startup cache UNMEASURED
Performance observability NOT RUN advisory, noise-aware CI performance gate; per-region flame summary (JFR opt-in) needs two certified runs of one workload
Representative benchmark report NOT RUN report naming every workload, host, config hash, certification state and statistic —
Stability regression NOT RUN Build 49 stability gates repeated for the changes (persistence, crash, soak, shutdown) —
AWF MultiProfile PASSED (owner report 2026-10-24) docs/testing/owner/03-… §1: profile isolation, reconnect, recovery; distributed and world-binding remain BLOCKE...
Read more

Thursday, 22 October 2026, 19:26 (GMT+7) — 26.2-r48.2 aurora-nexus [hotfix: world overrides, FAWE currentTick, startup world settings]

Choose a tag to compare

@github-actions github-actions released this 22 Oct 12:26

SourbyCraft 26.2 Build 48.2 — SourbyCraft-26.2-REL.jar (sha256 7fc98f037d5d8e73c57bc50f8dd14cf7886d9db462bf36d576f37238c981ddf5)

Auto-published from hotfix/26.2-r48.2 after a green build + boot test.

SourbyCraft 26.2 Build 48.2 — hotfix of Build 48 (Aurora Nexus)

Status: hotfix release v26.2-r48.2 (release=true), published from the branch hotfix/26.2-r48.2
Base: v26.2-r48.1 (branch hotfix/26.2-r48.1, commit 228b5999) plus the three fixes listed below, nothing
else from 26.2
Signing: same as Build 48 — Ed25519 jar signature, signed release manifest, GitHub build-provenance
attestation, CycloneDX SBOM; the jar is rebuilt on a second runner and must be byte-identical
Java: 25 · Minecraft: 26.2 · Engine: Aurora Engine

Build 48.2 fixes three faults found on the Sourby Demo panel (Epic Skyblock v9.7 setup on v26.2-r48.1,
2026-10-22). Each is a port of a fix merged on 26.2; the Build 49 work merged there is not included.

What changed

A Paper-made world keeps its saved overrides (26.2 #41)

paper:level_overrides written by Paper has neither Aurora.Distance nor the old Canvas.Distance key.
PerWorldDistanceConfig.LEVEL_OVERRIDES_FIELD returned an error there (Failed to parse saved data for 'SavedDataType[paper:level_overrides]': No key Aurora.Distance), so the whole record was dropped and rebuilt
from the root world: such a world lost its own spawn, game time, game type and difficulty, and the next save
wrote the replacement. Now a missing key means "no distance override"; the new key still wins over the old
one, the deprecation line is logged only when Canvas.Distance is read, and a malformed value is still an
error. The readers return a fresh unset config instead of the shared DEFAULT (whose references are mutable).
Tests: PerWorldDistanceLegacyKeyTest.

MinecraftServer.currentTick for FastAsyncWorldEdit (26.2 #42)

FastAsyncWorldEdit's v26_2 adapter (2.15.4 and the latest 2.16.1) reads Paper's
MinecraftServer.currentTick with getstatic; the region-threading base had removed the field, so creating a
BukkitWorld threw NoSuchFieldError: WorldGuard failed to enable and Jobs was disabled. Minecraft feature
patch 0077 (0083 on 26.2) declares public static volatile int currentTick again and advances it once per
global tick (bridge/LegacyServerTick). It is a global-tick counter, not a region tick, and no server code
reads it. Details: fawe-currenttick-compat.md. Tests:
LegacyServerTickTest. Also from that change: scripts/agent_testserver.py --large-plugin-jar (plugin jars
up to 32 MiB on the agent test server, used to verify this fix).

World settings during startup (26.2 #44)

Plugins that apply per-world settings while they enable (Multiverse-Core 5.8.1: setPVP -> setGameRule,
setTicksPerSpawns, ...) were refused with Cannot modify server settings off of the global region, and
Multiverse logged Failed to load configuration for every world. Paper feature patch 0025 routes the 12
CraftWorld world-settings setters through guards/WorldSettingsOwner: before the region scheduler starts the
server's startup thread may change them (as on Paper); once regions tick only the global tick may (unchanged);
the shutdown thread always may. Region ownership checks are unchanged; inherited-guard ledger F-GLOBAL-TICK
29 -> 17 sites. Details: multiverse-world-settings-compat.md.
Tests: WorldSettingsOwnerTest, RegionOwnershipContractTest. Known limit, unchanged: Multiverse's import of a
world without a stored spawn still reads blocks before any region owns them and is refused.

Identity and the auto-updater

/ver and the startup banner say Build 48.2 — Aurora Nexus; sourbycraft-build.properties has
buildNumber=48.2; the manifest Build-Number stays 48 (Paper parses it as an integer). The auto-updater
orders 48 < 48.1 < 48.2 < 49: Build 48 and 48.1 servers are offered 48.2 (installed only where
apply-mode = "auto"), and the next 26.2 release (Build 49) supersedes it.

Not in this hotfix

Everything else merged to 26.2 after v26.2-r48 (Build 49 configuration layout and console design, Build 50
hook refactors, updater rollback fixture, level.dat writer, and the rest). Those ship with Build 49/50.

Verification

  • CI (push to hotfix/26.2-r48.2): Gradle tests, Python suite, policies, boot test, independent rebuild
    with identical SHA-256, verify_build_identity.py on the server jar (48.2, REL, commit, source
    root) and on the launcher jar (--licences), signature, manifest, attestation. Run id and hashes are
    in the GitHub release.
  • 26.2 push run for #44 (8333a8fb, contains #41 and #42; the #41/#42 runs were superseded and
    cancelled): run 39772341256, build, tests, boot and rebuild-compare success.
  • Local, before publishing, at d4dbf837 (this file's previous revision; the commit after it changes
    only this file): Gradle :sourbyapi:test 585/0 (2 skipped), :sourbycraft-server:test 11971/0
    (29 skipped), :test-plugin:test 14/0; Python scripts/test_*.py 648 OK (1 skipped); patch,
    baseline and inherited-guard policies and patch_surface.py --check-rebuild OK. Two slim builds with
    SOURCE_DATE_EPOCH=1792670098, the second after clean with --no-build-cache, both
    275c88630b0e191222ecf6f9f1a1dce8bca2dcb8ef9c3eda683e26aa50d9fb9b. verify_build_identity.py passes
    for the server jar (48.2, REL, --commit, --source-root .) and the launcher jar (--api-only --licences --source-root .); LICENSE_SOURBYCRAFT/NOTICE_SOURBYCRAFT at the jar root.
  • FastAsyncWorldEdit 2.15.4 + WorldGuard 7.0.19 on the agent test server (opus-hotfix-48.2-fawe2,
    aurora.bridge.mode = "safe", --large-plugin-jar): both enable (/plugins: FAWE bridged, WorldGuard
    native, 0 failed/disabled), no NoSuchFieldError, no ERROR line, stop exit 0. /ver
    Release: Build 48.2 — Aurora Nexus, Git: hotfix/26.2-r48.2@d4dbf837….
  • Paper-made world (the panel setup's Spawn world: custom dimensions dungeon, mine,
    superiorworld whose paper:level_overrides have no Aurora.Distance) with Multiverse-Core 5.8.1,
    two boots of this build after Multiverse's config migration: the four worlds load (/mv list
    NORMAL), no No key Aurora.Distance, no Cannot modify, no Failed to load configuration; each
    world keeps its own spawn (dungeon -334 77 788, mine -37 4 937, superiorworld 0 100 0) and its own
    game time (advancing from its saved value) across both boots, and the record gains Aurora.Distance.
    Control on the same seed with the v26.2-r48.1 jar: 4 No key Aurora.Distance lines, every world's
    game time replaced with the root world's, dungeon spawn replaced (8 1 8), 10 Cannot modify refusals
    and 5 Failed to load configuration. Multiverse still logs one Failed to load worlds from config
    (spawn-safety read of minecraft:the_nether before any region owns it), the known limit above.
  • Functional only, no performance claim.

Commits

  • release: Build 48.2 local verification evidence
  • release: Build 48.2, hotfix of Build 48 for world overrides, FAWE currentTick and startup world settings
  • fix(world): world settings on the startup thread before regions tick (paper 0025)
  • fix(compat): restore MinecraftServer.currentTick as a global-tick counter (0077)
  • fix(world): missing Aurora/Canvas.Distance means no override
  • release: Build 48.1 local verification evidence
  • release: Build 48.1, hotfix of Build 48 for the licence texts (SEC-13)
  • ci(release): publish hotfix releases from hotfix/26.2-r.
  • fix(licence): ship GPL text and source notice in the released jar (SEC-13)

Thursday, 22 October 2026, 15:43 (GMT+7) — 26.2-r48.1 aurora-nexus [hotfix: GPL text and source notice in the distributed jar]

Choose a tag to compare

@github-actions github-actions released this 22 Oct 08:43

SourbyCraft 26.2 Build 48.1 — SourbyCraft-26.2-REL.jar (sha256 37e4b234e3bc235c276a9028f2acd8458f6e291a463e71617640a48c6e94ce44)

Auto-published from hotfix/26.2-r48.1 after a green build + boot test.

SourbyCraft 26.2 Build 48.1 — hotfix of Build 48 (Aurora Nexus)

Status: hotfix release v26.2-r48.1 (release=true), published from the branch hotfix/26.2-r48.1
Base: v26.2-r48 (commit 001b86f1) plus the commits listed below, nothing else from 26.2
Signing: same as Build 48 — Ed25519 jar signature, signed release manifest, GitHub build-provenance
attestation, CycloneDX SBOM; the jar is rebuilt on a second runner and must be byte-identical
Java: 25 · Minecraft: 26.2 · Engine: Aurora Engine

Build 48.1 changes no server behaviour. It fixes what the published file contains.

Why: the released jar did not carry its licence (SEC-13)

SourbyCraft is GPL-3.0-only since Build 48. The file servers download, SourbyCraft-26.2-REL.jar
(the launcher jar), had no META-INF/licenses/: its only readable licence was the launcher's MIT
LICENSE.txt. The GPL text (LICENSE_SOURBYCRAFT), the source notice (NOTICE_SOURBYCRAFT) and the
upstream licence texts existed only inside the patched server jar the launcher writes on first boot,
so the distributed binary did not carry the licence and source offer GPL-3.0 section 6 asks for. The
notice also said "This jar does not contain the Minecraft server", which is false for the patched
server jar where it sat. Evidence: the v26.2-r48 REL jar (sha256 abb1ae6b…, equal to the published
.sha256) listed with unzip -l, and a first boot of it (agent evidence 2026-10-22,
licence-and-cache-2026-10-22.md part A, Build 49 work; not part of this hotfix).

What changed

  • slimServerJar writes every file of the server's META-INF/licenses/ into the launcher jar, in the
    same sorted entry order with the fixed SOURCE_DATE_EPOCH time, so the jar stays reproducible.
  • NOTICE_SOURBYCRAFT distinguishes the launcher jar (no Minecraft server code) from the patched server
    jar (contains Minecraft code, which stays under Mojang's terms).
  • verify_build_identity.py --licences --source-root . runs on the launcher jar in CI: the GPL text
    (pinned hash), the notice markers, and byte equality with the checkout's licence directory.
  • Release pipeline support for hotfix branches (also on 26.2): hotfix/26.2-r<N>.<M> publishes
    v26.2-r<N>.<M> through the same jobs; see docs/development/AUTO-UPDATER.md, "Hotfix releases".
  • sourbyBuild=48.1.

Identity and the auto-updater

/ver and the startup banner say Build 48.1 — Aurora Nexus; sourbycraft-build.properties has
buildNumber=48.1. The manifest Build-Number stays 48 because Paper parses it as an integer, so
Bukkit.getVersion() reads 26.2-48-… as on Build 48. The auto-updater orders 48 < 48.1 < 49:
Build 48 servers are offered 48.1 (installed only where apply-mode = "auto"), and the next 26.2
release (Build 49) supersedes it.

Not in this hotfix

Everything merged to 26.2 after v26.2-r48 (#27–#30 and later: Build 49 configuration layout, bench
tools, rebase tooling). Those ship with Build 49.

Verification

  • CI (push to hotfix/26.2-r48.1): Gradle tests, Python suite, policies, boot test, independent rebuild
    with identical SHA-256, verify_build_identity.py on the server jar (48.1, REL, commit, source
    root) and on the launcher jar (--licences), signature, manifest, attestation. Run id and hashes are
    in the GitHub release.
  • Local, before publishing, at 418b480e (this file's previous revision; the commit after it changes
    only this file): two slim builds with SOURCE_DATE_EPOCH=1792654844, the second after
    clean with --no-build-cache, both 567f568f43fd6b912544b15eb38fc0d29374288a00f5946c5b8167364bb95912.
    unzip -l lists META-INF/licenses/LICENSE_SOURBYCRAFT (34916 bytes), NOTICE_SOURBYCRAFT and the
    13 upstream texts at the jar root. verify_build_identity.py passes for the server jar (48.1, REL,
    --commit, --source-root .; manifest Implementation-Version: Build 48.1, Build-Number: 48)
    and for the launcher jar (--api-only --licences --source-root .). Boot on the agent test server
    (opus-hotfix-48.1-1, harness defaults): Done (14.479s), /ver Release: Build 48.1 — Aurora Nexus,
    Git: hotfix/26.2-r48.1@418b480e…, source tree clean; Bukkit version line
    26.2-48-hotfix/26.2-r48.1@418b480e…; stop exit 0. Python scripts/test_*.py 647 OK; patch,
    baseline and inherited-guard policies and patch_surface.py --check OK. Functional only, no
    performance claim.

Commits

  • release: Build 48.1 local verification evidence
  • release: Build 48.1, hotfix of Build 48 for the licence texts (SEC-13)
  • ci(release): publish hotfix releases from hotfix/26.2-r.
  • fix(licence): ship GPL text and source notice in the released jar (SEC-13)

Thursday, 22 October 2026, 13:32 (GMT+7) — 26.2-r48 aurora-nexus [Merge #19: Build 48 Aurora Nexus, full signed release]

Choose a tag to compare

@github-actions github-actions released this 22 Oct 06:32
001b86f

SourbyCraft 26.2 Build 48 — SourbyCraft-26.2-REL.jar (sha256 abb1ae6b46c61b8375c4eb0fc9d1ca302ff8c40bacd603b737787c1f1b2b987e)

Auto-published from 26.2 after a green build + boot test.

SourbyCraft 26.2 Build 48 — Aurora Nexus

Status: FULL RELEASE by owner decision 2026-10-22 (release=true), not labelled STABLE — the
STABLE label stays reserved for Build 49 (ROADMAP-47-50.md)
Target channel: full release (release=true); servers with the auto-updater on apply_mode=notify
(the default) are told about it, servers still on auto install it
Signing: signed — first release signed with the SEC-2 Ed25519 release key (fingerprint
sha256:a9643e8b3dcdaae50d0acd5a93f4ef1fff593ee7c8bf26199ca32a0b7232f9c4; public key in the jar at
META-INF/sourbycraft-release.pub); the release also carries a GitHub build-provenance attestation and a
CycloneDX SBOM
Java: 25 · Minecraft: 26.2 · Engine: Aurora Engine

Build 48 is the refinement release of the 47–50 plan: it replaces inherited Canvas/Folia guards with
SourbyCraft-owned behaviour, restores vanilla features region threading had switched off, removes the
CanvasMC plugin API and names, and adds the diagnostics real testers of Build 49 need. Everything below
is verified by unit/integration tests and short local functional boots on the agent test server. None
of it is qualified, and no performance claim is made. Real-server, real-player testing is owner-run.

Breaking changes for plugins

  • io.canvasmc.* plugin API removed, no shim. The former Canvas API is
    dev.iyanz.sourbycraft.api.* (event, event.world, region, simd, Unsupported,
    world.WorldUnloadResult). Plugins compiled against io.canvasmc must be rebuilt
    (sourbyapi/README.md).
  • ServerBuildInfo.BRAND_CANVAS_ID removed; BRAND_SOURBYCRAFT_ID (sourbycraft:sourbycraft) is
    the brand id.
  • Deprecated names still read until Build 50 with a deprecation WARN (once per name; the permission once per holder): JVM flags Canvas.*
    (now Aurora.*), permission canvas.broadcasting.receiver (now aurora.broadcasting.receiver),
    level override Canvas.Distance (now Aurora.Distance). canvas:pearls data is migrated once to
    data/aurora/pearls.dat. Kept on purpose: config/canvas-*.yml file names and the
    canvas-supported plugin.yml key.

What changed since Build 47

Owned behaviour replacing inherited guards (the inherited-guard ledger
now records a decision for every guard; 118 remain, none UNDECIDED):

  • Command blocks run under region rules (MC 0055), aurora.world.command-blocks, LIVE, default
    off
    . Local two-region run: own-region commands run, 19 cross-region command types refused with no
    mutation (evidence).
  • Teleport: synchronous teleports run on the owning region (MC 0057/0058, Paper 0017,
    JVM property -Daurora.compat.sync-teleport, read once at JVM start (not a config key), default on); PlayerSpawnLocationEvent on the
    global tick.
  • Ender pearls fire PlayerTeleportEvent(ENDER_PEARL) on the player's region before the transfer;
    cancel and setTo() are honoured (MC 0064).
  • Legacy sync events: PlayerPreLoginEvent (MC 0073), PlayerChatEvent and Paper's sync
    ChatEvent (Paper 0022) fire again for plugins that listen to them.
  • ServerTickManager API works (freeze, step, sprint, rate; server-wide) (MC 0074, Paper 0023,
    sourbyapi 0003). /tick stays unregistered.
  • Refusals of main-thread-only calls name the owned alternative (MC 0061, Paper 0019); work queued
    on the undrained server queue fails loudly (MC 0060).
  • World unload gives entity tasks their retired callback instead of running their body (Paper 0021,
    ENG-3), and releases bridged plugin tasks anchored to that world.

Vanilla features restored:

  • Datapack functions: /function, /return, #minecraft:load once per library (MC 0066);
    #minecraft:tick only with aurora.world.tick-functions (LIVE, default false). /reload stays
    unregistered (datapack-functions.md).
  • /schedule registered and ticked on the global tick (MC 0065).
  • /data … storage works from the console inline and from players/command blocks through the
    global tick; console block data is handed to the owning region (MC 0069).
  • Wandering traders: one spawner per world on the global tick, timers persisted (MC 0068).

Persistence and shutdown:

  • Global-owned level data saved on autosave (MC 0056); forced-chunk tickets saved on autosave (MC 0067).
    Raids and the world PDC stay shutdown-only (no consistent concurrent copy exists).
  • AWF shutdown deadline (D6): aurora.awf.shutdown-deadline-ms (default 30000, RESTART_REQUIRED);
    an unconfirmed storage logs AWF-SHUTDOWN-INCOMPLETE and the stop exits with status 70 (MC 0071).
    The budget includes the vanilla chunk save; very large worlds may need a larger value.
  • save-all flush (D4) says "Saved the game" only after every AWF storage confirmed its commit
    (MC 0072).

Diagnostics and operations:

  • Stall recorder: when the global tick or a region completes no tick for 10 s, thread dumps, memory,
    cgroup and GC data go to logs/stalls/ (STALL-RECORDER.md).
  • /perf tick and /mspt report a tick still running with its real duration instead of a fixed
    5000 ms.
  • /ver shows the channel for non-release jars; the manifest Build-Number carries the build number
    (Build 47's REL jar printed 26.2-DEV-… in Bukkit.getVersion()).
  • Container memory is read from the process's own cgroup; /sys shows real RSS and labels heap as heap.
  • Startup log uses short SourbyCraft/<Class> and Aurora/<Class> logger tags.

Build and supply chain:

  • Reproducible slim jar from SOURCE_DATE_EPOCH; CI rebuilds from a fresh checkout and refuses to
    publish on a hash mismatch; the release job attests the jar and SBOM
    (gh attestation verify SourbyCraft-26.2-REL.jar --repo YanIanZ/SourbyCraft).
  • SourbyClip 3.1.3: every launcher download has a whole-transfer deadline, a size cap and a bounded
    same-source retry.
  • Repository root follows PaperMC/Paper's layout.

Startup and shutdown:

  • A stop requested during startup (a plugin calling Bukkit.shutdown() in onEnable) no longer
    races startup: startup finishes, skips the listeners, the startup save and the started notification,
    logs Startup stopped: … instead of Done (, then runs the normal stop and saves once with storage
    open (MC 0076). Before, the startup save could flush into closed region files
    (ClosedChannelException) or the JVM could exit mid-startup. A stop from another thread during
    startup (Ctrl+C, an async task) is not held yet.
  • The region scheduler start line reads Initialised Aurora region scheduler (EDF) … (MC 0075).

Licence:

  • SourbyCraft is now licensed GPL-3.0-only (was PolyForm Noncommercial, which could not apply to a
    jar derived from GPLv3 Paper). The names and logos are covered by
    TRADEMARK.md; the jar carries the GPL text and a source notice under
    META-INF/licenses/ (LICENSE.md).

Plugin compatibility (evidence, no code change):

  • 19 legacy plugins through the bridge in safe mode, headless: Vault, EssentialsX, LuckPerms,
    DeluxeHubReloaded, ntdLuckyBlock, ChatGames and ReMinions enabled and ran their console commands with
    no rejected operation, violation or quarantine; the failures are plugin-side and fail the same way on
    Paper 26.2 (table).
  • SuperiorSkyblock2 2026.3 (real jar) with the SSB-AuroraWorlds module enables in safe mode with the
    spawn callback routed to a region; the unported jar alone fails on a changed Minecraft constructor
    (evidence).

Release gates

Gate states are in 26.2-build-48.md; the human test procedure for Build 49 is the
real-test runbook. Open at publication:

Gate State
Compile, tests, boot/shutdown in CI verified by the publishing CI run itself (build, rebuild comparison, boot test)
Startup log clean local boot clean (no ANSI, no internal logger names, no repeats); CI boot excerpt from the publishing run
Bridge fixes on a real server PARTIAL — legacy fixtures in CI; SSB2 real jar + module and 19 legacy plugins headless on the agent test server; player flows and real-server acceptance owner-run
Command/HUD/Spark PARTIAL — /tps, /mspt, /perf, /spark tps agree on one snapshot and a local Spark profile carries the SourbyCraft/Aurora config (evidence); HUD bars need a real client (owner)
Global-tick stall under a 50-client teleport storm (panel bench 2026-10-21) OPEN — not root-caused; the stall recorder now captures evidence
Signing (SEC-2) key created and the release signed (owner decision 2026-10-22); signed-manifest enforcement on servers still to be exercised by the owner
Owner decisions ENG-11 behaviour; command-block default (shipped off)
Licence DECIDED — GPL-3.0-only + trademark policy (owner 2026-10-22); open: whether the private SourbyPatcher toolchain must be published as GPL corresponding source

Versioning

sourbyBuild=48, codename=aurora-nexus (unchanged from Build 47; Builds 48–49 stay Aurora Nexus on 26.2, Build 50 becomes Aurora Forge), channel REL, tag v26.2-r48. Public identity:
SourbyCraft 26.2 Build 48 — Aurora Nexus.

Commits

  • Merge #19: Build 48 Aurora Nexus, full signed release
  • release: Build 48 notes and gate tracker cover #20-#26
  • release: Build 48 Aurora Nexus as a full, signed release
  • Merge #26: hold a stop requested during startup...
Read more

Wednesday, 21 October 2026, 02:36 (GMT+7) — 26.2-r47 aurora-nexus [build: honour -PsourbyChannel=REL in the settings-level project version]

Choose a tag to compare

@github-actions github-actions released this 20 Oct 19:36

SourbyCraft 26.2 Build 47 — SourbyCraft-26.2-REL.jar (sha256 411eadb035cfde40ddb2264bd38f7c3cc603878b410ba1079e5a6dbb60af938d)

Auto-published from 26.2 after a green build + boot test.

SourbyCraft 26.2 Build 47 — Aurora Nexus

Status: FULL RELEASE by owner decision 2026-10-21 (release=true), not labelled STABLE — release-candidate audit 2026-10-07, consistency passes 2026-10-14 and 2026-10-21; the gates listed under What did not pass are open and move to Build 49/50
Target channel: full release (release=true); the STABLE label is reserved for Build 49 (ROADMAP-47-50.md)
Signing: unsigned — release signing (SEC-2) is not configured; the jar and release carry no Ed25519 signature
Java: 25
Engine: Aurora Engine

Release pillars

  • Aurora Compatibility Bridge
  • Aurora Instant Startup Cache
  • Aurora World Fabric
  • Aurora Execution Fabric and Resource Governor
  • Network/storage observability
  • Structured startup and plugin diagnostics

Safety order

Correctness > reliability > data safety > stability > compatibility > tail latency > resource efficiency > startup performance > scalability > throughput.

Public identity

Public branding is SourbyCraft 26.2 Build 47 — Aurora Nexus. Paper, Folia, Canvas, Moonrise and AdvancedSlimePaper are implementation/provenance inputs, not public build suffixes.

Mandatory release gates

Build 47 is published as a full release by owner decision (2026-10-21) but is NOT declared STABLE; the STABLE declaration moves to Build 49, which must pass compile, unit/integration, patch regeneration, plugin compatibility, region ownership, world load/unload/save, crash recovery, cache corruption, backend failure, startup, stress, soak and shutdown qualification (26.2-build-49.md).

Core contracts

  • no expensive CallerRuns fallback onto region owners;
  • no unbounded executor queues;
  • no blocking filesystem/database work on region threads;
  • no worker mutation of live region-owned state;
  • no startup cache containing live runtime objects;
  • no compatibility color/status stronger than observed runtime evidence;
  • no release-wide performance percentage without comparable certified evidence.

Implementation status

Status is per pillar and reflects the 26.2 tree as read on 2026-10-07, not qualification,
with a consistency pass on 2026-10-14. Everything listed under Changes since the 2026-09-26
audit
is now committed (49d4e640, f188fe78, 3da221d0 on 2026-10-07; e0c241e9 and
d97fe247 on 2026-10-13/14) and has passed CI; the latest green run at the 2026-10-14 pass was
38445246566 on d97fe247 (as of 2026-10-21: push CI 39456620331 on c0ab0cc4; see Changes
since the 2026-10-14 consistency pass
). CI green means compile, the Java and Python suites, and the CI boots; it is
not qualification. None of the rows below has been through every mandatory release gate. Open
findings of the 2026-10-14 system audit (tracked in
TODO.md) apply to this tree.

Pillar State (2026-10-07; pass 2026-10-14) What exists What does not
Aurora Compatibility Bridge IMPLEMENTED, default off; not QUALIFIED State model and /plugins palette; aurora.bridge.mode (off default, safe); the three Folia load gates admit undeclared plugins in SAFE mode; sync tasks go to the caller's region (aurora.bridge.sync-route, LIVE) or the global region; async tasks to the governed BRIDGE_IO lane; explicit owners through RegionTask (Paper 0010) and EntityTask (Paper 0011); LightingLuminol global-scheduler port and disable cleanup (Paper 0007); per-plugin LIVE limits and Bukkit worker queries (Paper 0008); native-plugin cancel fix (Paper 0009); per-plugin bridged body timing in /plugins <name> and /perf plugins; violation counting and quarantine; fixes B86 (reload after disable) and B87 (adapter NPE) Re-enabling the same plugin instance after disable is reopened by Paper 0012 (in CI boots since 37515867230; no marker or boot exercises the re-enable itself). Unwrapped callbacks get only the caller-region/global fallback; direct world mutation is not intercepted. The bridge cannot make a plugin region-aware (compat-vs-performance §3). No player-driven workflow or soak with bridged plugins. LOG-mode guard hits of bridged plugins now reach quarantine (audit ENG-1, fixed 1c57a736, unit-tested; no boot fixture)
Aurora Instant Startup Cache IMPLEMENTED, UNMEASURED SHA-256 fingerprints, environment key, per-entry integrity, WARN-once discard/rebuild, atomic writes; per jar: descriptor, dependency edges, constant-pool class index and compatibility scan; dependency graph (missing hard deps, cycles); boot-stage and index phase timings; startup profile compared with the previous boot Transform outputs and AWF indexes are not cached. The index is diagnostic and does not change how plugins load. No cold/warm benchmark, so no startup speed-up is claimed
Aurora World Fabric EXPERIMENTAL, OPT-IN (default off) FILE and Redis backends under RegionFileStorage for listed or /awf-managed worlds; AuroraWorlds API and /awf (create, load, unload, save, delete, export, templates, copy-on-write instances, named generators); Slime v12/v13 import; .awf v2 world files with per-world WorldProperties; empty-chunk pruning that keeps non-regenerable data; discard/close fences for queued commits; multi-plugin lifecycle admission (WorldRequest, WorldOperationBusyException) No MongoDB/MySQL backends. No sustained player-load or Redis-over-network qualification. /awf create waiting on the global tick (B80, B85) fixed 2026-10-13 (e0c241e9, CI run 38434258632 green). Slime world PDC is not restored (B76 partial). Unload with players online and unload nosave with dirty chunks are untested
Execution Fabric / Resource Governor PARTIAL Specification; BRIDGE_IO and STORAGE lanes that reject instead of caller-runs; budgets from aurora.scheduler.* (RESTART_REQUIRED); /perf governor Region ticks, chunk workers, Netty, the async-path pool and the startup pool are not governed. No CPU arbitration. The LeafPile-derived EDF backend (the parked EDF patch in minecraft-patches/parked/) is HELD, not in the build
Network/storage observability PARTIAL Wire bytes and packets per direction, connections, per-second rates in /perf network; AWF storage metrics; chunk-system read/write/delete counts and per-world pending I/O in /perf storage; optional generic chunk-generation stage timing in /perf chunks (feature patch 0026, default off, RESTART_REQUIRED) Handler cost remains unmeasured. Region-file save p50/p99/max exist in /perf storage (feature patch 0043, RegionFileSaveLatencyTest 8/8 and RegionFileSaveLatencyHookTest 3/3, 2026-10-20) but no boot has recorded a sample, so no vanilla save-latency value is reported. Region-file load p50/p99/max (patch 0050) also show in /perf storage, Netty outbound queue health (connections over the high-water mark, pending bytes; a point sample) in /perf network, and region task queue wait since boot (patch 0049, tick/chunk, bucketed "at most" p50/p99) in /perf scheduler (PerfTelemetryRowsTest 7/7, 2026-10-20); none has been observed on a running server. No run with the 0026 recorder enabled is recorded (Sourby Demo cannot pass -D flags), so it has produced no data
Structured startup and plugin diagnostics PARTIAL Boot stage timings; index timings; undeclared plugins named with their scan verdict; internals warning; missing dependencies and cycles; /sys lines; per-plugin bridged task body time (count, total, max, p99); per-plugin onLoad/onEnable wall time (Paper 0013, PluginTimings, PluginTimingsTest; committed 2026-10-07, in CI since 37515867230) No qualification of the timings against a profiler

Operator switches:

Setting Default Lifecycle
aurora.bridge.mode off RESTART_REQUIRED
aurora.bridge.sync-route caller-region LIVE
aurora.bridge.quarantine-after 3 LIVE
aurora.bridge.max-pending-tasks-per-plugin 0 (unlimited) LIVE
aurora.bridge.max-running-async-tasks-per-plugin 0 (unlimited) LIVE
aurora.awf.worlds empty RESTART_REQUIRED
-Daurora.startup.cache=false cache on RESTART_REQUIRED
-Dsourbycraft.region-watchdog.enabled=true (feature patch 0025) watchdog off RESTART_REQUIRED
-Dsourbycraft.chunk-generation-metrics.enabled=true (feature patch 0026) off RESTART_REQUIRED

Release readiness (audited 2026-10-07)

Latest green CI at the 2026-10-14 pass: run 38445246566 on d97fe247 (Redis backend-failure fixes). As of 2026-10-21: push CI 39456620331 green on c0ab0cc4; PR checks 39477530705 green on 14e60da6. Earlier green runs for this candidate line: 38437712647 (3cd33b3f), 38434258632 (cbef3fb9, includes staged world creation e0c241e9), 38427215968 (console NPE fix), 37538976640 (3b81637c, Minecraft feature 0028, now 0027), 37515867230 (beb7f40e, first CI of the committed release-candidate patches).

Verdict (2026-10-07): not ready for release=true. Superseded 2026-10-21 by the owner's
publication decision
(full release, not STABLE; see Publication decision below). The gate
states in the table are unchanged by that decision; the ones that did not pass are listed with
their target build.

Two trees were distinguished on 2026-10-07, because the evidence differed:

  • committed head 1fe984ed (AWF Redis backend and .awf files), CI run 485
    (37420627980, 2026-10-06 05:51 UTC, green);
  • release-candidate tree: on 2026-10-07 a working tree with uncommitted Paper patches
    0005–0011, Minecraft feature patches 0023–0027, the bridge/AWF fixes and the API additions.

Consistency pass 2026-10-14: the release-candidate tree has sin...

Read more

Sunday, 13 September 2026, 22:34 (GMT+7) — 26.2-r45 aurora [build: prepare Aurora release 45]

Choose a tag to compare

@github-actions github-actions released this 13 Sep 15:34

Build 45c — SourbyCraft-26.2-REL.jar (sha256 b56eb31f0aee133bf3eef46b8d569b4ce03f72b49930697e25dec6cf495933d5)

Auto-published from release/26.2-canvas after a green build + boot test.

SourbyCraft 26.2 — Build 45c, Aurora

Build 45 integrates Claude's committed Phase 0/1 work and a follow-up review of its baseline comparison gate.

  • Remove shared ServerLevel scratch collections from patches 0013 and 0015. Concurrent region ticks now use the upstream per-call collections again.
  • Publish a detached immutable particle list only when effect particles change. Reusing the published list previously prevented synchronization from detecting changes.
  • Move RegionTickMetrics into SourbyCraft's own source tree; keep the upstream metrics integration patch small. Existing TickData compatibility checks remain in the test suite.
  • Add workload/JFR baseline capture, metric extraction, comparison tooling, and patch/threading inventories.
  • Fix baseline comparison to reject uncertified inputs, avoid a PASS verdict under provenance drift, and compare the captured network throughput field.

Java 25 is required. This release retains the operator's configuration and does not automatically tune heap, GC, or gameplay settings. Release identity advances from 44 to 45; manifest and properties both derive from sourbyBuild.

Validation and limits

CI must pass patch regeneration, API/server tests, boot/JFR, and Docker checks before automatic publication. Scratch-buffer tests cover ownership/publication constraints; baseline comparison regressions have dedicated Python tests.

The baseline harness is initial instrumentation, not proof of a performance improvement. Player workloads require external connected clients; status-protocol network load does not simulate gameplay. Controlled before/after workload runs and multi-hour soak remain outstanding. See baseline instructions, threading review, and build 44 scope.

Claude contributions are preserved in commits 4bca656, fc0f8e7, 8e25023 and 3fcc958, with the originating Claude session recorded in their commit metadata.

Commits

  • build: prepare Aurora release 45
  • fix(baseline): reject uncertified comparisons
  • fix(entity)!: correct three unsafe scratch-buffer reuses
  • refactor(perf)!: move RegionTickMetrics into the Sourby source tree
  • docs(patches): inventory and classify every downstream patch
  • feat(baseline): add Phase 0 performance baseline harness