Use this checklist before tagging or publishing a release.
Run with JDK 21:
./gradlew buildThe build runs verifyGameplayInvariants and verifyReleaseJar, which check:
- no mixin configuration is introduced
- teleport rope correction does not return
- the mod remains server-safe/client-optional in metadata
- critical gameplay defaults stay pinned
- visual sync keeps client packets optional and avoids active-link work while idle
- the release jar exists in
fabric-mod-dev/release/ fabric.mod.jsonexists in the jar- mod id and version match Gradle metadata
- Minecraft and Fabric API dependencies match the target versions
- required server and optional client classes are present
- the Fabric GameTest entrypoint and smoke test class are present
Run the headless Fabric GameTest suite with Java 21:
scripts/run-headless-gametests.shThe script writes an XML report to
build/gametest-results/mc_elma_rope-gametest.xml.
- Start a Fabric dedicated server for Minecraft
1.21.10. - Install Fabric API
0.138.4+1.21.10. - Install
mc_elma_rope-0.4.0-beta.3.jaron the server. - Confirm startup creates or reads
config/mc_elma_rope.json. - Confirm no client-only classloading crash occurs.
Latest local dev-runtime smoke evidence is recorded in
SERVER_SMOKE_REPORT.md.
The release jar declares com.mcelma.rope.test.McElmaRopeGameTests under the
fabric-gametest entrypoint. These smoke tests cover:
- default config values
- default fence and chain anchor support
- manager self-link rejection
- anchor add, length clamping, and cleanup
- persisted link restore duplicate protection
- tied target disconnect penalty queue and reconnect effect application
- controller disconnect cleanup without punishing the tied target
- tied target disconnect lead refund to the survival-mode controller
- anchored target disconnect persistence without lead refund
- anchored target unavailable before disconnect callback persistence
- anchored target reconnect restore and reconnect penalty application
- broken anchor cleanup for offline anchored rope records
- invalid offline anchor restore rejection
- command-created ropes not queuing reconnect penalties by default
- controller release and anchored release permission behavior
- broken anchor block cleanup for matching anchored ropes
- dead and spectator endpoint cleanup
- one-way taut rope physics and loose rope no-op behavior
- timed bind with lead consumption
- timed controller release and slower third-party rescue
- third-party rescue disabled by config
- tied-player rescue denial
- spawn-protected bind denial
- timed anchor tying
- default taut self-escape denial
- config value sanitization and malformed config fallback
- custom anchor id/tag reload
- protected player name reload
- protected player UUID reload
- physics preset override behavior
- holder damage type filter reload
- persisted player-player rope save/load restore
- persisted anchored rope save/load restore
- pending restore behavior for missing player endpoints
- max held duration expiration
- active-link performance smoke scales:
0,50,100,256 - manager tick active-link invariant checks
Run these tests with Fabric's GameTest server tooling when the MC-ELMA test environment is available. They are smoke tests, not a replacement for the multiplayer gameplay checklist below.
- Join once without the client mod and confirm gameplay still works.
- Join once with the client mod and confirm visible rope rendering uses the default vanilla-like braided style, not the legacy three-line style.
- Confirm visual packets do not block gameplay when the client mod is absent.
- Survival player binds another player with a lead after
3s. - Survival bind consumes one lead.
- Controller releases after
3swith empty main hand and receives one lead. - Third-party rescue works after
12swhen enabled. - Third-party rescue fails when
enableThirdPartyRelease=false. - Tied players cannot bind another player.
- Tied players cannot release another player's rope.
- Anchor binding works on fences, fence gates, walls, chains, iron bars, lightning rods, end rods, and bells.
- Anchor release returns one lead on manual release when eligible.
- Breaking the exact anchor block releases the anchored rope and does not refund a lead.
- Breaking a different anchor block does not release unrelated anchored ropes.
- Anchor a tied player, disconnect that tied player, reconnect, and confirm the rope restores to the same anchor when the anchor block still exists.
- Confirm anchored disconnect does not return a lead to the controller.
- Tied player starts escape with empty main hand.
- Escape progress pauses while the holder is inside
selfEscapeGuardRadiuswhenselfEscapeGuardProgressMultiplier=0.0. - Escape cancels while taut when
selfEscapeCancelWhenTaut=true. - Escape progresses slowly while taut when
selfEscapeCancelWhenTaut=false. - Escape cancels when the tied player moves too far.
- Escape cancels when the tied player takes damage.
- Escape completion respects
selfEscapeSuccessDenominator. - Cooldown prevents immediate repeated attempts.
- Holder damage drop respects
holderDamageDropDenominator. - Denied damage type ids never trigger drop.
- Non-empty allowed damage type ids restrict the drop roll to that list.
- Anchor ropes do not drop from holder damage.
- Held player-player disconnect clears active ropes.
- Held tied target disconnect returns one lead to the controller when
refundLeadToControllerOnTargetDisconnect=true. - Anchored tied target disconnect stores offline anchor state when
persistAnchoredRopesOnDisconnect=true. - Anchored tied target reconnect restores the anchor rope and applies the configured disconnect penalty.
- If the tied player endpoint disappears before the disconnect callback, the anchor rope is still written to offline state.
- If login temporarily places the player in another dimension, the offline anchor record remains pending and retries after the player reaches the anchor world.
- An active anchored rope is captured during an orderly server shutdown and restores when the tied target reconnects after restart.
- Breaking an anchor while the tied player is offline clears the offline anchored rope record.
- Command-created ropes do not queue reconnect penalties when
disconnectPenaltyOnlyLeadCreatedRopes=true. - Controller disconnect does not punish the tied target.
- Tied target reconnect receives Mining Fatigue I and Slowness I for 2 minutes with default penalty settings.
enableDisconnectPenalty=falseprevents reconnect penalty application.persistDisconnectPenalties=truepreserves pending penalties through server restart.- Death clears active ropes and does not refund leads.
- Spectator mode clears active ropes and does not refund leads.
- Dimension or portal mismatch clears active ropes and does not refund leads.
maxHeldDurationTicksclears old ropes when enabled.persistRopes=falsekeeps restart behavior non-persistent.persistRopes=truesaves world-local state and restores when endpoint players rejoin.
- Confirm idle server cost with
0active ropes. - Confirm only active links tick with
50,100, and256active ropes. - Confirm
/mcelmarope listremains readable and bounded.