Maintain first-party addons

Create, Sable and Propulsion are independent Gradle builds under addons/. Their integration code, Guest declarations, ABI locks and tests belong to the owning addon. Use the all-addon stand to verify behavior with the complete pinned physics runtime. For a new third-party mod, start with the public addon SDK.

Create

Run from addons/create with Gradle on JDK 25 and a Java 21 toolchain:

./gradlew-sandbox-dev-parallel-summary check buildProductionJar
./gradlew-sandbox-dev-parallel runGameTestServer

The standalone GameTest server uses real kinetic devices and boilers. The production archive checks reject upstream, base-mod and GameTest implementation classes. Player-facing behavior lives in the Create guide.

Sable

The addon registers the SDK world-projection adapter and wraps upstream SubLevelAssemblyHelper.moveBlocks in an explicit peripheral-transfer scope. The base mod owns network and display SavedData; the addon supplies live logical poses and exact block mappings. Run workspace and addon Gradle builds sequentially: the addon includes the workspace build and shares its output directories.

The snapshot adapter is request-only: no background feed, subscriptions or cached body registry. Membership is resolved for each request. Addon 1.2 retains snapshot selector 0 and adds mass-properties selector 1: immutable merged mass, plot-space center and full local inertia tensor. PhysicsMassPropertiesTest covers component orientation, owned scalar copies and invalid data; computerAssemblyAndReturn executes both APIs through the real Guest VM. The SDK validates bounded immutable record shapes; Rust materializes the reply in budgeted slices without invoking Guest constructors. Structured responses use Runtime ABI 1.13 and bundled native C ABI 20.

Build and test

Run from addons/sable, with Gradle on JDK 25 and a Java 21 toolchain available:

./gradlew-sandbox-dev-parallel-summary check
./gradlew-sandbox-dev-parallel runGameTestServer
./gradlew-sandbox-dev-parallel runClient

For joint Create/Sable runs, use the all-addon development stand. It is a development stand and produces no umbrella mod. The lifecycle GameTest compiles and runs a real Guest program before assembly, on the construction and after return into the world. It checks typed fields, unavailable-operation exceptions, ComputerId retention, runtime replacement and persisted file contents. Full disassembly, split and merge scenarios need separate coverage.

The pinned Sable JAR embeds Companion, Rapier and Veil; Veil embeds additional libraries. The build extracts those exact versions for the development classpath. These extracted files are not copied into this addon archive.

Propulsion

A narrowly scoped mixin marks saves of engines controlled by Compukters and clears unowned digital input/mode on full NBT loading, including assembly copies. Configuration survives; live program ownership does not transfer. Ordinary uncontrolled Propulsion and ComputerCraft saves and client update packets retain their upstream behavior.

state() uses the adapter’s configured kN conversion. In the pinned 1.1.5 binary, getTargetThrustNewtons() actually returns configured kN; its method name is not a units contract. Structured replies use Runtime ABI 1.13 / native C ABI

  1. Existing ordinary-engine operation IDs are 0..4, vector operations are 5..11, and mount() is ID 12 in capability version 1. Changing a release’s x.y version does not automatically change these ABI locks.

Build and test

Run from addons/propulsion with Gradle on JDK 25 and a Java 21 toolchain:

./gradlew-sandbox-dev-parallel-summary check
./gradlew-sandbox-dev-parallel runGameTestServer

For combined Create/Sable/Propulsion and Aeronautics runs, use the all-addon development stand. The standalone build extracts the pinned upstream Sable libraries for Loom; these are not bundled into this addon.

Lifecycle evidence

Standalone check verifies the archive and both ordinary and vector GameTest sources. Real Guest programs exercise exclusive ownership, invalid inputs, typed observations, cable loss, completion, explicit close, tiny input clearing, computer removal, NBT copies and actual Sable assembly. Vector tests also preserve live redstone steering signals and client packets. The shared dev stand composes these scenarios with Create and Sable tests and pinned Aeronautics. Mount observations are checked in the ordinary world and on an assembled four-engine Sable platform with rotated peripheral names, including neutral force directions and read-only ownership. Interactive flight under changing load remains a manual scenario; no additional VM or Propulsion ticks are introduced.

Cosmonautics telemetry

addons/cosmonautics owns the cosmonautics Guest capability, its ABI lock and typed server adapter. Space.status() observes dimension/Deep Space membership; planet() resolves the current linked planet; orbit() copies the loaded construction’s Deep Space instance state in its named orbital frame. No host controller, subscription or physics propagation is installed. Sable solver motion and orbital instance motion remain separate. The generated value replies reuse existing SDK support and canonical Double vectors.

Run the addon check and developmentModJar. OrbitObservationTest covers valid circular/elliptic/hyperbolic observations and rejection of nonfinite, inconsistent, singular and unrepresentable numerical inputs. The archive check requires the generated contract and Guest bundle and rejects bundled upstream implementations. From the workspace, :compiler-k2:compileSpaceTelemetryExample with -PcompuktersCosmonauticsGuestApiBundle=<absolute path to the built .cagb> compiles the real example against the actual addon bundle, including its Guest apsis helpers. The test fails if the bundle is missing. Real surface/Deep Space and dimension-transfer continuity require a dimension-capable world; focused adapter/build checks do not establish those scenarios or successful orbital insertion.

Space.guidance() adds a one-request unit-direction triad with dimension/frame/instance/tick identity. GuidanceDirectionsTest verifies scaled normalization, handedness, zero/nonfinite and near-radial rejection. The pinned physics mixin transfers world velocity components directly into the current orbital frame, and only at the instance boundary. The addon README owns this upstream-specific coordinate contract. testKotlinOrbitalPointingVmConformance executes the shipped example controller’s signs, damping, covariance and ideal-plant convergence. :compiler-k2:compileOrbitalProgradeExample accepts three absolute bundle properties: compuktersCosmonauticsGuestApiBundle, compuktersSableGuestApiBundle, compuktersPropulsionGuestApiBundle. The example README defines the pending in-world pointing scenario; focused tests do not establish nozzle dynamics, orbital burns or safe dimension-transfer control.

Version and compatibility checks

The shared addon versioning policy keeps the addon’s API line independent of the Compukters target line. Each standalone check validates the remapped production filename, loader version and bounded Compukters dependency through verifyAddonVersioning. The workspace SDK and platform bundle are rebuilt from the same checkout through included-build dependencies.

Checkpoint ownership

ProgramAddonHost and generated AddonHostHandler bindings expose bounded checkpoint() and restoreCheckpoint(state) methods. Capture must explicitly opt in; stateless handlers return an empty byte array. A stateful handler serializes logical tokens and resource descriptions, without world objects, callbacks, native pointers or current machine epochs. Generated bindings frame each handler through AddonCheckpointCodec within 1 MiB. ResourceCheckpointWriter/ResourceCheckpointReader provide bounded scalar, byte and UTF-8 fields.

Capture runs on the server owner during unload, after the computer may already have disappeared from the world’s block-entity table. Preserve identities of previously issued resources rather than invalidating them solely because that owner detached. Restoration must resolve and validate the current device instance, reachability and exclusivity before reacquiring anything. Failed rebinding releases partial resources, keeps execution parked and retains the checkpoint for explicit recovery. Core process-scoped hosts recreate independent live program scopes before activation. The Sable observation handler is stateless; Create and Propulsion stateful hosts still need resource codecs.