Repository navigation
Releases: YanIanZ/SourbyCraft
Release list
Saturday, 24 October 2026, 06:16 (GMT+7) — 26.2-r49.1 aurora-nexus [release: prepare hotfix 49.1 publication]
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
withOptional.filter(predicate -> false), a condition that can never pass.
ping-absentandping-staletherefore failed even when the client correctly
returned no sample, andjava-harnessexited non-zero as a consequence. The
harness now expectsOptional.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.pyagainst the Leviathan AbyssLink sources
(digesta24002ac…): 16/16 checks PASS, includingping-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]
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.ymland
sourbycraft_config/sourbycraft_global_config.ymlreplace the TOML files. On the first boot an
existing*.tomlis parsed, written as*.ymlwith every value and comment, and renamed
*.toml.migrated; a*.ymlalways 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 throwingPolling tasks from non-owned region(or
hanging); a stoppedBRIDGE_IOlane 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-r49for the full list.
Operator behavior
- Back up
sourbycraft_config/before the first boot. The conversion is one-way: to downgrade,
delete or rename the*.ymlfile and restore*.toml.migratedto*.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: trueand a backend client certificate/key are
configured;tls: falseis 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 documentedaurora.ymlincluding theabysslinksection, and a fresh boot with AbyssLink
disabled reachesDonewithout 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.migratedcopy 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]
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'sonDisable
can never run: pumping the main-thread queue threwPolling 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 commit6c2a268). - The BRIDGE_IO lane reporting
full or stoppingno longer logs a WARN with a stack trace per skipped
repeating task during shutdown: a stopped lane saysBRIDGE_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 messageby the bridge,
AWF, Redis, chunk-generation andSourbyCraftConfigreaders, 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 onPolling 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]
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
providesaliases (#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#getChunkAtthrough 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]
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-*andentity-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=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... |
Thursday, 22 October 2026, 19:26 (GMT+7) — 26.2-r48.2 aurora-nexus [hotfix: world overrides, FAWE currentTick, startup world settings]
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.pyon 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.2push 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:test585/0 (2 skipped),:sourbycraft-server:test11971/0
(29 skipped),:test-plugin:test14/0; Pythonscripts/test_*.py648 OK (1 skipped); patch,
baseline and inherited-guard policies andpatch_surface.py --check-rebuildOK. Two slim builds with
SOURCE_DATE_EPOCH=1792670098, the second aftercleanwith--no-build-cache, both
275c88630b0e191222ecf6f9f1a1dce8bca2dcb8ef9c3eda683e26aa50d9fb9b.verify_build_identity.pypasses
for the server jar (48.2, REL,--commit,--source-root .) and the launcher jar (--api-only --licences --source-root .);LICENSE_SOURBYCRAFT/NOTICE_SOURBYCRAFTat 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), noNoSuchFieldError, no ERROR line,stopexit 0./ver
Release: Build 48.2 — Aurora Nexus,Git: hotfix/26.2-r48.2@d4dbf837…. - Paper-made world (the panel setup's
Spawnworld: custom dimensionsdungeon,mine,
superiorworldwhosepaper:level_overrideshave noAurora.Distance) with Multiverse-Core 5.8.1,
two boots of this build after Multiverse's config migration: the four worlds load (/mv list
NORMAL), noNo key Aurora.Distance, noCannot modify, noFailed to load configuration; each
world keeps its own spawn (dungeon-334 77 788,mine-37 4 937,superiorworld0 100 0) and its own
game time (advancing from its saved value) across both boots, and the record gainsAurora.Distance.
Control on the same seed with the v26.2-r48.1 jar: 4No key Aurora.Distancelines, every world's
game time replaced with the root world's,dungeonspawn replaced (8 1 8), 10Cannot modifyrefusals
and 5Failed to load configuration. Multiverse still logs oneFailed to load worlds from config
(spawn-safety read ofminecraft:the_netherbefore 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]
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
slimServerJarwrites every file of the server'sMETA-INF/licenses/into the launcher jar, in the
same sorted entry order with the fixedSOURCE_DATE_EPOCHtime, so the jar stays reproducible.NOTICE_SOURBYCRAFTdistinguishes 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; seedocs/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.pyon 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 withSOURCE_DATE_EPOCH=1792654844, the second after
cleanwith--no-build-cache, both567f568f43fd6b912544b15eb38fc0d29374288a00f5946c5b8167364bb95912.
unzip -llistsMETA-INF/licenses/LICENSE_SOURBYCRAFT(34916 bytes),NOTICE_SOURBYCRAFTand the
13 upstream texts at the jar root.verify_build_identity.pypasses for the server jar (48.1, REL,
--commit,--source-root .; manifestImplementation-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),/verRelease: Build 48.1 — Aurora Nexus,
Git: hotfix/26.2-r48.1@418b480e…, source tree clean;Bukkitversion line
26.2-48-hotfix/26.2-r48.1@418b480e…;stopexit 0. Pythonscripts/test_*.py647 OK; patch,
baseline and inherited-guard policies andpatch_surface.py --checkOK. 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]
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 againstio.canvasmcmust be rebuilt
(sourbyapi/README.md).ServerBuildInfo.BRAND_CANVAS_IDremoved;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.*
(nowAurora.*), permissioncanvas.broadcasting.receiver(nowaurora.broadcasting.receiver),
level overrideCanvas.Distance(nowAurora.Distance).canvas:pearlsdata is migrated once to
data/aurora/pearls.dat. Kept on purpose:config/canvas-*.ymlfile names and the
canvas-supportedplugin.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);PlayerSpawnLocationEventon the
global tick. - Ender pearls fire
PlayerTeleportEvent(ENDER_PEARL)on the player's region before the transfer;
cancel andsetTo()are honoured (MC 0064). - Legacy sync events:
PlayerPreLoginEvent(MC 0073),PlayerChatEventand Paper's sync
ChatEvent(Paper 0022) fire again for plugins that listen to them. ServerTickManagerAPI works (freeze, step, sprint, rate; server-wide) (MC 0074, Paper 0023,
sourbyapi 0003)./tickstays 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:loadonce per library (MC 0066);
#minecraft:tickonly withaurora.world.tick-functions(LIVE, default false)./reloadstays
unregistered (datapack-functions.md). /scheduleregistered and ticked on the global tick (MC 0065)./data … storageworks 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 logsAWF-SHUTDOWN-INCOMPLETEand 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 tologs/stalls/(STALL-RECORDER.md). /perf tickand/msptreport a tick still running with its real duration instead of a fixed
5000 ms./vershows the channel for non-release jars; the manifestBuild-Numbercarries the build number
(Build 47's REL jar printed26.2-DEV-…inBukkit.getVersion()).- Container memory is read from the process's own cgroup;
/sysshows real RSS and labels heap as heap. - Startup log uses short
SourbyCraft/<Class>andAurora/<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()inonEnable) no longer
races startup: startup finishes, skips the listeners, the startup save and the started notification,
logsStartup stopped: …instead ofDone (, 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
Wednesday, 21 October 2026, 02:36 (GMT+7) — 26.2-r47 aurora-nexus [build: honour -PsourbyChannel=REL in the settings-level project version]
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 onc0ab0cc4;PR checks39477530705 green on14e60da6. Earlier green runs for this candidate line: 38437712647 (3cd33b3f), 38434258632 (cbef3fb9, includes staged world creatione0c241e9), 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.awffiles), 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...
Sunday, 13 September 2026, 22:34 (GMT+7) — 26.2-r45 aurora [build: prepare Aurora release 45]
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