Files
RustNotMC/docs/collision-geometry.md
SashegDev 874b6f20c2 Клиент: начальный импорт кодовой базы
Основа — Horizon (MIT). История апстрима не переносится: этот репозиторий ведёт свою.
2026-10-29 22:04:28 +03:00

130 KiB

Horizon collision geometry

The version target is Minecraft Java Edition 26.3. Geometry is a simulation foundation; Horizon has a native client for inspecting a controlled block scene. Live gameplay and entity simulation remain unfinished.

horizon-core::geometry provides Vec3, Aabb, Axis, Direction, BlockHit, and immutable VoxelShape values. Coordinates are doubles. Arithmetic keeps vanilla's operation order, signed zero, NaN comparisons, normalization threshold, and collision epsilon. It does not enable approximate or fused simulation math.

Implemented vector operations include addition/subtraction, vector-to, component products, scaling, normalization, dot/cross products, interpolation, projection, distance/length, horizontal vectors and finite/equality checks. Rotations, look directions, alignment, axis replacement, direction offsets, and pitch/yaw extraction are also implemented. The full Vec3 API and entity integration remain absent.

Trig uses vanilla's 65,536-entry float sine table with double angle scaling and Java long narrowing. The table is generated from the pinned formula in Rust; the geometry suite compares every generated entry against the runtime table. Inverse trig narrows to float at vanilla's conversion points. These comparisons validate the tested platform; other platforms need the same bit comparisons.

Bounding boxes normalize endpoints with Java-compatible min/max. Queries include half-open containment, strict intersection, transforms, distances, ray clipping, block-coordinate construction with wrapping integer endpoints, setters, next-value deflation, and swept-box collision tests. A disjoint intersect preserves vanilla's constructor normalization rather than introducing a different empty-box rule.

Shapes keep exact coordinate arrays and a packed occupancy grid. Greedy boxes are cached once in vanilla order. Collision-distance queries use occupied grid cells; ray and closest-point queries reuse the cached boxes. Column minima/maxima use vanilla's cyclic perpendicular coordinates and infinity for empty/outside cells. Cube shapes retain arithmetic lookup; moved shapes use array lookup even for a zero offset. Ray hits preserve face tie ordering, endpoint exclusion, tolerances, and the 0.001 inside-hit nudge. Boolean shape joins and overlap predicates preserve cube, identical, disjoint and epsilon-merger behavior. Shape operations reject truth tables that fill two empty cells, as vanilla does. Per-axis cube-coordinate metadata survives partial merges and is checked when importing cached shapes. Box construction preserves thin-box rejection and up to 1/8 cube quantization. Optimized joins reconstruct greedy boxes in vanilla order. Face extraction is implemented; edge extraction and shape rotations remain absent.

Discrete axis extrema are retained separately from occupied cells. A box can quantize to no occupied cells while retaining a finite minimum/maximum on other axes. That state affects vanilla's lower-block floor-height lookup. Empty joins also preserve their integer sentinel extrema; optimization and moving an empty shape return the canonical empty shape.

Shape clones preserve identity and share immutable coordinate, occupancy and box storage. New shapes keep separate identities even when their grids are equal. This preserves alias-sensitive join shortcuts and avoids copying large grids when an operation returns an existing shape. The cache importer shares equal grid storage while retaining the distinct vanilla shape identities.

resolve_shape_movement ports vanilla's movement resolver over a supplied shape list: Y first, then horizontal axes in movement-magnitude order, translating the box by resolved motion before each axis query. candidate_step_heights preserves float narrowing, duplicate identity, current-Y exclusion, and sorted candidate heights. resolve_step_movement adds the initial collision and step-up decision, including landing-height adjustment, a second collider query, and the first candidate improving horizontal movement. entity_collision_bounds preserves the initial entity query bounds. These helpers take caller-selected colliders; they do not choose world/entity shapes, set grounding, change velocity, or apply inside-block effects.

The step-up corpus calls the actual private Entity.collide method for 17,680 cases per JAR. Reference fixtures supply entity inputs and controlled block/entity/border shape lists; vanilla performs the movement decisions. Query bounds and results are compared bit for bit. This verifies the decision with those inputs, not live world selection or entity state transitions.

block_floor_height returns the selected shape's maximum Y, or lazily queries the lower shape only when the current one is empty. Its 12,000-case corpus also checks the lower supplier's invocation count against BlockGetter.

traverse_blocks visits blocks in vanilla ray order, including its endpoint nudge, strict corner comparisons, early callback return, integer wrap and signed-zero endpoint equality. It accepts finite rays and an explicit visit budget. Invalid geometry or exceeding that budget returns a typed error; earlier callbacks remain applied. Actual block/fluid ray selection is a separate integration task.

Inclusive block-box iterators preserve X/Y/Z order, while directional iterators preserve vanilla's movement-dependent axis order and corner signs. AABB iteration includes floored maximum faces. They return independent position values and reject true volumes above the positive Java-int domain, instead of reproducing overflowed Java iteration counts.

sweep_intersected_blocks ports movement-path visits from BlockGetter.forEachBlockIntersectedBetween: tiny movement, the initial box, ray-clipped footprints, packed-position deduplication, final box, step indices, and early callback stops. Stationary/tiny movement avoids a deduplication-set allocation. Inputs and computed geometry must be finite; a caller-selected work budget counts ray steps and iterator candidates, including suppressed duplicates. Earlier callbacks are not rolled back on an error. Block effects still need their own implementations and integration with entity movement.

horizon-world::collision::CachedCollisionRegistry imports a private local export of vanilla cache data. The export includes DataVersion, all state descriptors, deduplicated shapes, coordinate-kind metadata, discrete extrema, and a per-state cache index. Import verifies every state ID against the block registry. Section lookup also requires the same borrowed registry. Imported nonempty extrema must agree with occupancy; empty extrema must be in the grid's domain or match vanilla's empty-join sentinel triple. Extrema form part of the grid-sharing key, so equal occupancy does not erase different metadata. There is no fallback shape for an unsupported state: None means block behavior must select it, while a cached empty shape is a valid Some value.

This covers the cached branch of the no-context BlockState.getCollisionShape method. Vanilla's overload taking CollisionContext always calls block behavior; the cache cannot establish entity collision parity. Dynamic and ordinary entity-context selection are implemented as described below. Experimental minecart contexts, world borders, movement integration, fluid simulation, block effects and live collision broad-phase queries remain pending.

Run the comparisons after preparing the pinned artifacts:

python3 tools/test_geometry_parity.py
python3 tools/test_collision_parity.py

Both suites invoke actual vanilla methods from the authenticated client and server JARs. They compare canonical double bits, including infinities/NaNs, rather than using a numerical tolerance. The geometry corpus includes empty and sparse grids, greedy decomposition, overlapping boxes, rays, tiny movements and IEEE boundaries. It compares 1,320,187 output lines per JAR, including 2,400 integer-box iterator cases, 2,400 AABB iterator cases, and 9,022 movement-path traces. The registry suite exercises cached shape queries through resident section IDs, translation at negative and world-border coordinates, and invalid import rejection. Its export records 35,524 cached states, 199 uncached states, 6,093 shape identities, and 330 distinct grids. The comparison runs 213,144 queries plus state/box/identity checks, producing 1,097,456 matching output lines per JAR. These counts describe this branch and corpus; they are not a gameplay coverage percentage.

Raw grids admit at most 1,048,576 cells with strictly increasing, non-NaN coordinates. Oversized or malformed imports/joins return typed errors. This bounded library API does not reproduce Java's complete exception/object surface.

All exported data, test inputs, reference output, and compiled adapters remain under gitignored .local/. Success reports record exact sources, inputs, outputs, and reference hashes. A runner removes its prior success report before running and rejects edits to the captured sources during validation. Passing these suites does not prove whole-game parity or any FPS/render-distance improvement.

Checked-in geometry metadata and cached-collision metadata identify their tested source versions. Reports cover their recorded snapshots; later changes require fresh validation.

Entity obstruction now evaluates ordered candidate snapshots, excluded entity identity, spectator/removal/building flags, shared root-vehicle identity and voxel-shape intersection. Empty shapes skip the query; candidate collection finishes before obstruction evaluation. Unit-block queries translate in floating point, including integer-coordinate boundaries. Run python3 tools/test_entity_obstruction_parity.py to compare against the actual vanilla EntityGetter default methods and entity metadata queries.

The entity-obstruction report records 15,121 matching output lines per JAR over composite shapes, boundary contacts, thin boxes, metadata filters, vehicle roots and injected query failures. The Java fixture privately allocates entity snapshots without running their constructors. Entity lifecycle, spatial indexing and vehicle-tree maintenance remain separate implementation work. Workspace tests, warning-free Clippy and 138 Python tests passed at this snapshot.

Legacy block solidity now uses explicit definition overrides and cached collision bounds, with force-on precedence and native mean-size/height thresholds. The no-context replaceable and liquid flags are kept independently. Solid rendering uses the occlusion definition flag and a full-shape test over imported raw occlusion geometry. Import validates the pinned DataVersion, full state identities and complete block definitions before building a shared property table. Predicates query this table in constant time.

python3 tools/test_block_properties_parity.py compares all 35,723 states and 18,096 synthetic cache/flag/shape cases, including adjacent floating-point values around solidity thresholds and both occlusion flag values. The block-properties report records 197,180 matching lines per JAR. Definition flags, collision and raw occlusion data are private runtime inputs; Rust calculates solidity and solid rendering and caches full-face occlusion masks. Every state and synthetic shape is compared on all six faces; source and fixture hashes are recorded. Item/fluid-context replacement and collision with live entities remain separate work.

Face selection now preserves native cube-axis shortcuts, epsilon sample points, slice coordinates and clamped parent extrema, including sparse slices whose native bounds differ from occupied boxes. Repeated queries share face identities. The FULL, CENTER and RIGID support tests execute against the selected shape. python3 tools/test_face_support_parity.py compares 1,615 input shapes and nested faces, producing 595,686 matching lines per JAR in the face-support report. The refreshed geometry report also retains 1,320,187 matching lines per JAR after face slicing was added. Block-specific support-shape selection is a separate layer.

Registered support caches now derive FULL/CENTER/RIGID masks from privately imported support geometry and share results by shape identity. The importer checks the data kind and full state identities. None explicitly requests uncached behavior; it never becomes an assumed unsupported face. python3 tools/test_block_support_parity.py compares 35,524 cached states across six directions and three support kinds, while retaining 199 uncached states. The cached-support report records 248,867 matching lines per JAR.

Face-cache storage is now lazy and attached to shape identity. Clones share it; new identities and moved shapes start with an empty cache. A regression test checks that cached faces do not retain their parent after it is dropped. The face and geometry differential suites passed again after this allocation change, as did workspace tests, Clippy and 140 Python tests. No FPS claim is inferred from these library checks.

Dynamic support selection now handles bamboo collision offsets, dripstone and sulfur-spike thickness/direction, the empty-context scaffolding support shape, powder snow, and shulker animation-state support faces. Moving-piston lookup preserves missing/wrong block-entity behavior and delegates active entity shape calculation to the world. The dynamic-support report records 4,867,780 matching lines per JAR over 107,308 fixtures covering all 199 uncached states, coordinate boundaries, block-entity snapshots and query failures. Run python3 tools/test_dynamic_support_parity.py to reproduce it. The current suite also compares no-entity-context collision geometry in 60,161 fixtures, including 13,014 shulker progress fixtures. Shulker collision bounds retain native float interpolation and differ from animation-state support faces. BlockCollisionRegistry dispatches cached and dynamic collision queries; entity movement contexts and block-entity lifecycle remain separate work. Workspace tests, warning-free Clippy and seven focused Python tests passed.

Moving-piston collision now selects stationary extended bases and moving heads, translates shapes using native float progress arithmetic, and honors the movement-direction collision exclusion. Interpolation preserves float operation order, including negative partial ticks and IEEE edge cases. The separate collision-related state used for entity pushing retains its own sticky/head rules; entity pushing itself is not implemented by this module.

python3 tools/test_piston_shape_parity.py compares 102,315 fixtures, including every registered moved state and 10,000 raw float interpolation cases. The piston-shape report records 1,096,811 matching lines per JAR. This corpus uses absent block entities for moved-block collision selection. Workspace tests, warning-free Clippy and 142 Python tests passed. Tick progression and live world mutation remain separate work.

The refreshed dynamic-support corpus also includes 9,216 active piston snapshots, composing block-entity lookup with piston collision generation and all support tests. It compares extension/retraction, source heads, progress boundaries, collision exclusions and query failures. These snapshots do not exercise piston ticks, pushed entities or chunk updates.

The archived block-survival snapshot executes 51 rule kinds with 63 distinct rule/tag bindings over registry-bound solid flags, air identity, support tags and FULL/CENTER/RIGID geometry and empty-context collision. The verified snapshot covers all 1,286 pinned block definitions and 35,723 states. Candidate properties select attachment direction, hanging state, door/plant halves and pale moss carpet's serialized bottom property. Pressure plates and cactus flowers preserve repeated neighbor reads. Downward center support applies the unstable-bottom-center tag only where native helpers do. Upper doors require the same block below; upper double plants also require its lower half. Crop survival checks brightness against 8 before querying support; farmland preserves its conditional second read above, and dripleaf stems read both neighbors. Sugar cane, lily pads, frogspawn, spore blossoms, small dripleaves and tall seagrass preserve their independent fluid queries, source/full-water requirements and tag checks. Growing plants preserve head/body identity and kelp support restrictions. Scaffolding recomputes neighbor distance in native order; chorus plants and flowers preserve branching reads and early exits. Piston heads validate base type, facing and extension. Mangrove propagules, speleothems, pitcher crops, bells and shelf mushrooms use their version-specific attachment rules. Multiface blocks, vines, hanging moss, snow layers and sea pickles preserve support/collision query order. Fire uses imported ignition odds and waterlogging; cactus checks horizontal solids and lava before its support and upper liquid state. Paths recognize fence gates, and mushrooms preserve the light-override tag and solid-render requirement.

Interrupted runs can be resumed with python3 tools/test_block_survival_parity.py --resume. The runner verifies source, environment, fixture and compiled-artifact hashes before reusing completed stages. A changed output is regenerated; changed inputs require a fresh run without --resume. Checkpoints stay under .local, and a parity report is written only after both native comparisons pass.

python3 tools/test_block_survival_parity.py compares actual native canSurvive calls in both pinned JARs. The block-survival report records 35,998,488 matching output lines per JAR across 9,229,463 fixtures. Each supported candidate state is exercised; behavior representatives are tested against every neighbor state, changing repeated reads, integer-coordinate wrapping, absent/closed/open shulker snapshots and injected block/entity query failures, plus light thresholds, independent fluid sequences and fluid-query failures. Native method ownership and support-tag fields supply private definition metadata; survival results are calculated in Rust. Workspace tests, Clippy and the 147-test Python suite passed. This establishes the recorded survival scope; full placement, neighbor updates, scheduled behavior and complete block gameplay remain pending.

Collision contexts now preserve empty-context fallback heights, position-only queries, and captured entity position, descending, main-hand and placement flags. Height comparisons retain the native float epsilon widened to double. Null placement factories use -Double.MAX_VALUE; withPosition sets the placement flag and ignores the supplied height when the entity is absent. Empty item stacks match AIR in entity/empty contexts, while position-only contexts never report a held item. Living-entity fluid callbacks run before the same-family exclusion, with the second fluid as their argument, and propagate failures.

python3 tools/test_collision_context_parity.py exercises actual native factories and queries over 8,338 context snapshots, comparing 225,126 output lines per JAR. The context report records the pinned artifacts and exact source/input/output hashes. The corpus includes adjacent representable values around height thresholds, empty shapes, integer-coordinate extremes, NaN/infinity, null entities, item count boundaries, all five fluid types and callback failures. Native entity and stack snapshots are allocated privately without their constructors; this checks query behavior, not entity construction or inventory lifecycle. Inventory changes after context capture, experimental minecart contexts and live movement integration remain pending. Contextual block-shape selection is being added separately.

ScaffoldingCollision now selects stable scaffold geometry, the unstable bottom platform, or an empty shape using the collision context. Placement contexts are always empty. Descending affects the top surface check; the bottom platform also requires nonzero support distance, the bottom flag and the lower height check. No-context support and contextual collision share the same immutable stable shape.

python3 tools/test_scaffolding_collision_parity.py compares all 32 states across 56,448 fixtures, producing 524,300 matching lines per JAR in the scaffolding report. The native context dispatch executes against a world proxy that rejects all queries. Full shape coordinates, bounds, ordered boxes and cube metadata match for empty, position, entity and placement contexts, including adjacent doubles at both height thresholds. Block placement, distance updates, collapse and live entity motion through scaffolding are separate work.

LiquidCollision implements contextual water/lava collision selection. The always-fluid flag returns a full cube before querying entities or neighbors. Otherwise, flowing block levels and nonliving contexts return empty. Source blocks request the living entity's standing shape, check its height, then read the fluid above and invoke the entity's standing predicate. Empty candidate shapes still follow those query rules. Above-block coordinates wrap as Java integers.

python3 tools/test_liquid_collision_parity.py compares all 32 water/lava block states, all 33 possible above-block liquid/empty states, full selected shape data and ordered callback traces, including failures at each query. The liquid-collision report records 571,179 matching lines per JAR. Standing shapes and fluid abilities are controlled inputs in this suite; each entity type still needs its implementation. Fluid spreading, swimming, drowning and live movement remain pending.

Powder snow now selects the native 0.9f-high falling shape when fall distance exceeds 2.5, a full cube for falling-block entities, and a full cube for entities that can walk on it, are above it and are not descending. Placement and absent entity contexts are empty. Walkability checks the entity-type tag first, then leather boots only for living entities; successful tags skip equipment queries. The API takes current entity metadata and lazy tag/equipment providers.

python3 tools/test_powder_snow_collision_parity.py compares 63,336 fixtures and 599,180 matching lines per JAR in the powder-snow report. The native block method and walkability predicate execute over controlled entity snapshots. The corpus covers fall-distance and top-height boundaries, nonfinite values, falling-block instances, item counts, query failures and skipped queries. Entity tag loading, freezing, sinking and live movement remain separate work.

BlockCollisionRegistry::collision_shape_with_context now combines the contextual scaffolding, liquid and powder-snow rules with the existing cached/dynamic paths. It dispatches these overrides before consulting cached geometry. The pinned native audit checks 35,492 context-independent cached states at seven positions with both interface and entity contexts that reject every query: each returns the identical cache object without world reads. The 32 cached liquid states query the context and take their separate behavior path. The 199 uncached states continue through explicit behavior implementations.

python3 tools/test_contextual_collision_parity.py validates integrated dispatch for all 35,723 states, 11 contexts and both fluid-flag inputs: 785,906 fixtures and 2,391,334 matching output lines per JAR in the contextual-registry report. Outputs compare cache-relative shape equality or full uncached geometry, plus ordered world/entity callbacks. This integration corpus supplies missing block entities; active shulker and piston snapshots retain their separate suites. These checks establish the recorded collision-query scope, not entity movement or whole-game parity.

Private shape exports now carry explicit canonical-identity markers. The importer restores the global empty/full-block shapes only when their complete grid metadata matches, and rejects duplicate or malformed canonical claims. Equal unmarked shapes keep distinct identities. Older exports remain readable and report has_canonical_identities() == false; they cannot establish the canonical identity needed by vanilla's block-collision iterator fast path.

The canonical-identity report adds identity checks for every cached state: 5,566 canonical empty, 3,348 canonical full-block and 26,610 other cached states, with 1,132,980 matching output lines per JAR. The integrated contextual comparison also passes again with 2,391,334 lines per JAR in its regression report. Five import tests cover legacy data, equal-but-distinct grids, canonical restoration and malformed identity metadata. Workspace Clippy passes without warnings.

BlockCollisionScan now implements lazy cursor selection around entity bounds. It retains the native epsilon-expanded cursor, X/Y/Z visit order, skipped corners, large-shape face filtering, moving-piston edge filtering and suffocation-before- shape query order. Only successful chunk lookups are reused; absent chunks are queried again. Shape selection uses the global collision world, while suffocation uses the selected chunk. Canonical full blocks use native AABB intersection; other shapes use moved voxel intersection. Returned positions are independent values. Providers supply current block metadata and contextual shape selection.

python3 tools/test_block_collision_scan_parity.py compares 4,176 fixtures and 517,820 matching lines per JAR in the collision-scan report. The native iterator runs over controlled metadata, shapes and chunk availability; traces cover early termination, missing chunks, query failures, thin/zero-width bounds, integer-coordinate wrapping and equal shapes with different canonical identities. Two Rust API tests cover finite/bounded input requirements, cursor visit budgets and termination after errors. Unsupported cursor volumes return errors; Java's overflowing iteration counts are outside this bounded API. Registry/world integration and live movement still need implementation.

BlockCollisionRegistry now prepares native cursor-filter flags for every state: uncached shapes are large, while cached shapes are large when any axis extends outside the unit block. Moving-piston identity is bound to the same registry. SuffocationRegistry binds the native predicate definitions and resolved causes_suffocation tag. Default predicates combine tag membership with full collision geometry; overrides preserve piston extension, constant predicates and lazy shulker block-entity checks. Missing or wrong-type shulker block entities count as suffocating. Tag changes require rebinding the suffocation registry.

python3 tools/test_suffocation_parity.py checks all 35,723 states with natural, empty and all-block tag bindings at four positions, including integer extremes. Every shulker state also covers absent/wrong block entities, all animation states and query failures. The suffocation report records 1,697,193 matching lines per JAR, including scan flags and query traces. These are registry predicates; live collision-world binding, movement and suffocation damage remain separate integration work. The contextual regression also passes again with 2,391,334 lines per JAR, and its all-state native audit now compares large-shape and moving-piston flags. Workspace Clippy passes.

RegistryCollisionWorld now binds BlockCollisionScan directly to registered metadata, contextual shapes and suffocation rules. Chunk providers return current state IDs and a chunk-local block-entity provider; contextual collision uses the global world. Construction rejects legacy collision exports without complete canonical identity metadata, because their unit-block fast paths can differ.

python3 tools/test_registry_collision_scan_parity.py compares native BlockCollisions over resident ProtoChunk sections with the Rust binding over TerrainChunk sections. All registered states cover ordinary and suffocating-only selection. Additional scenes cover partial/dynamic blocks, chunk and build-height boundaries, missing chunks, replacements, early termination and query failures. Shulker fixtures deliberately give the chunk and global providers different entities to check routing. The resident collision report records 3,046,929 matching output lines per JAR. Six collision import/binding tests pass, including legacy-metadata rejection; workspace Clippy passes. Live chunk loading, entity lifecycle, movement and the playable client remain separate integration work.

resolve_world_movement now joins registry-backed block scanning to the native step-up decision. It selects entity colliders once, including for zero/underflow movement, then collects applicable border and block shapes in native order for the initial and optional step query. try_resolve_step_movement accepts owned or borrowed collider lists and propagates provider failures without returning a partial displacement. The shared implementation avoids allocating reference lists for owned shapes; existing borrowed callers retain the same API.

python3 tools/test_world_movement_parity.py runs actual Entity.collide over registered blocks and resident Java sections, comparing the Rust world collector and step solver. Every registered state appears as an obstacle; additional cases cover step heights, grounded/falling motion, ceilings, partial/dynamic blocks, chunk boundaries, zero/underflow motion and failures during collection. The world movement report records 7,062,798 matching lines per JAR. Entity collider lists, border proximity/shapes and collision contexts are controlled fixture inputs. Actual entity selection, border state, travel/gravity/velocity, grounded side effects and playable integration remain pending.

The geometry regression passes again with 1,320,187 lines per JAR, including the existing native step fixtures. All six movement unit tests and workspace Clippy pass. New tests cover owned-query failures during both initial and step collection and signed zero preservation when collection is skipped.

entity_collision_shapes now implements EntityGetter.getEntityCollisions selection over ordered entity snapshots: average-size short circuit, epsilon inflation, exact bounds/excluded-identity filtering, spectator suppression and lazy collision-policy callbacks. With a source entity it invokes that entity's canCollideWith; without one it invokes each candidate's canBeCollidedWith(null). Selected bounds become shapes after policy evaluation. Providers retain responsibility for live storage and each entity type's policy.

python3 tools/test_entity_collision_parity.py compares the actual native getter, default vehicle-root checks and controlled policy overrides, including failures at query/callback boundaries. Tiny/zero-width and nonfinite query boxes, inflated boundary contacts, spectators, shared vehicles, null sources and ordered shape outputs are covered. The entity collision report records 158,558 matching lines per JAR. Workspace Clippy passes. This adds the selection helper needed by movement; live entity indexing, lifecycle and entity-type policy implementations remain pending.

BorderGeometry now models stationary and moving world-border extents, cached stationary collision geometry, center/absolute-limit changes, tick progression, partial-tick bounds and movement proximity. The pinned version decrements size transition progress once per tick. Ordinary bounds and collision shapes use the previous size while moving; completing the transition installs a stationary extent at the target. Collision geometry subtracts the floor/ceil-rounded inner column from the infinite outer shape. Boundary predicates retain their asymmetric inclusive minimum/exclusive maximum tests and native floating-point order.

python3 tools/test_world_border_parity.py compares actual WorldBorder mutation sequences, extent metadata, complete shape geometry and proximity predicates. The border report records 1,138,830 matching lines per JAR, including zero/large durations, wrapping start timestamps, completion, retargeting, signed zero, extreme finite centers/sizes and nonfinite query/interpolation inputs. The supported construction and mutation domain requires finite nonnegative sizes, finite centers and nonnegative absolute limits/durations. A unit test verifies invalid parameters leave the existing extent unchanged; workspace Clippy passes. Saved-data codecs, listeners, dirty-state events, damage, synchronization and live movement binding remain separate work.

restitute_movement now implements the pinned post-collision velocity calculation with lazy entity/block bounce queries, gravity thresholds, nonliving float scaling and air-drag interpolation. It preserves horizontal/vertical collision branches, callback ordering, the position-sync field write and final velocity assignment. Errors retain already performed effects instead of rolling back the world or returning a fabricated successful velocity.

python3 tools/test_restitution_parity.py executes actual Entity.restituteMovementAfterCollisions on living and nonliving snapshots with controlled block restitution and suppression tags. The restitution report records 177,090 matching lines per JAR. Fixtures cover changing lazy getter values, signed zero/nonfinite arithmetic, bounce callbacks that alter velocity, and failures before/after each side effect. Workspace Clippy passes. Registered block property/tag provisioning, actual bounce sounds/events, Entity.move guards, fall damage, grounding and full player simulation remain pending.

find_supporting_block now selects the nearest colliding block center using the native distance arithmetic and wrapping Y/Z/X position tie-break. GroundState implements the thin foot query, previous-horizontal-footprint fallback and both ground/collision flag updates. Null movement preserves the prior support in the native branch where no fallback query can run; query failures retain preceding flag writes.

python3 tools/test_ground_support_parity.py compares actual CollisionGetter.findSupportingBlock, Entity.checkSupportingBlock and both setOnGroundWithMovement overloads. The ground support report records 342,709 selection lines and 151,444 state-transition lines per JAR, covering ties, nonfinite entity positions, missing chunks, query errors, nullable movement and sequential changes of support. Shape/context snapshots are controlled; registry-backed scanning has separate integration coverage. Workspace Clippy passes. Full live entity movement, support-dependent effects and gameplay remain pending. The shared scanner regression also passes with 517,820 matching lines per JAR after extending its fixtures.

movement_support now implements support-dependent positions, the three public offset variants and base-entity block jump/speed factors. It preserves the support X/Z coordinates, conditional fence/wall/gate lookup, float-to-double offset widening, cached entity block position and lazy block queries. Jump-factor lookup always reads the lower block; speed lookup can short-circuit for water, bubble columns or a non-unit current factor.

python3 tools/test_movement_support_parity.py compares the actual native methods with controlled state/tag/property snapshots. The movement support report records 51,572 matching lines per JAR, including float boundaries, nonfinite positions/offsets/factors, tag/type short circuits and errors at every query. Workspace Clippy passes. Registered movement-property provisioning, living-entity efficiency and the full movement lifecycle remain pending.

MovementProperties imports version-bound raw friction, speed, jump, bounce and fall-distance-reduction fields plus fence-gate type. BoundMovementProperties binds resolved fence/wall/bounce-suppression tags; rebinding leaves previous snapshots unchanged. RegistryMovementWorld connects real state IDs from a block provider to the support-position and factor calculations, rejecting unknown IDs.

python3 tools/test_movement_registry_parity.py independently checks native property getters for every state, then runs actual entity support/factor queries over all 35,723 states / 1,286 blocks under normal, empty and universal tags. Mixed-block scenes and failing providers check query order. The registered movement report records 2,300,888 matching lines per JAR. Three import/binding tests and workspace Clippy pass. This provisions movement data; full player travel, live entity state and block bounce effects remain separate integration work.

PistonMovement now accumulates displacement per axis and resets it when the game tick changes. It preserves the initial squared-length short circuit, lazy time lookup, first nonzero axis, the +/-0.51 cumulative clamp and float-derived small-displacement threshold. A failed time lookup leaves the accumulator intact.

python3 tools/test_piston_movement_parity.py runs actual Entity.limitPistonMovement across sequential tick/push inputs. The piston movement report records 325,197 matching lines per JAR, including repeated/opposing pushes, threshold neighbors, signed zero, nonfinite inputs and injected failures. Workspace Clippy passes. Piston block events, entity pushing and the surrounding Entity.move lifecycle remain pending. The registered movement regression passes again with 2,300,888 lines per JAR on the integrated sources.

no_world_collision implements the entity-bearing collision-free query over the registry-bound world. It consumes block collisions lazily, then checks whether the selected entity list is empty, then tests applicable border geometry. Each stage short-circuits the later providers; a nonempty entity list blocks the query even if its supplied shape is empty. Collision contexts are supplied explicitly.

python3 tools/test_world_collision_check_parity.py executes native CollisionGetter.noCollision over registered blocks and resident Java sections. The world collision-check report records 4,793,095 matching lines per JAR. All states, context variants, empty and disjoint controlled entity/border shapes, missing chunks, boundaries and provider failures are covered. Workspace Clippy passes. Null-entity overloads, actual entity-list/border providers and live player ledge behavior remain pending. The shared movement regression also passes with 7,062,798 matching lines per JAR.

back_off_from_edge implements the player ledge guards, above-ground test and X/Z/diagonal displacement reductions. It retains lazy step/staying/grounded queries, float step widening, signed-zero behavior and the exact thin collision probe arithmetic. A caller-supplied query budget bounds nonconverging inputs and returns an error without fabricating a successful displacement.

python3 tools/test_edge_backoff_parity.py executes actual player methods with controlled collision-free query results. The edge backoff report records 46,578 matching lines per JAR, covering all mover types, flight/crouch guards, fall/step and 0.05 thresholds, nonfinite values and query failures. Two query-budget unit tests and workspace Clippy pass. Registered-world ledge probes, live crouching/attribute state and the complete player movement loop are separate integration work.

Registered-world ledge integration now runs back_off_from_edge through no_world_collision and registry-bound resident chunk scans. The native side executes actual Player.maybeBackOffFromEdge and its collision probes over ProtoChunk sections. Every state is used as a supporting block, with additional falling, step-height, chunk-edge, diagonal, dynamic-block and guard/error cases.

python3 tools/test_world_edge_backoff_parity.py passes with 27,109,699 matching lines per JAR in the world ledge report. The shared fixture now supports player probes alongside direct movement and collision checks; workspace Clippy passes. Entity lists, border applicability and collision contexts remain controlled snapshots. A complete player movement/travel loop and playable client remain pending.

check_fall_damage now implements base-entity fall-distance accumulation and landing order. Downward displacement narrows to float before being subtracted from the double fall distance. Grounded landings call the block, read the possibly changed position/support, emit the ground event and reset fall distance. Errors preserve completed field writes and callback effects.

python3 tools/test_fall_damage_parity.py runs actual Entity.checkFallDamage with controlled water, landing and event providers. The base fall report records 44,566 matching lines per JAR, including nonfinite arithmetic, float underflow, callback mutations and failures at every boundary. Workspace Clippy passes. Living-entity fluid/particle behavior, registered block landing effects, health/damage and full movement remain pending.

living_fall implements default living-entity fall power/damage calculation, impulse-height exemption and landing damage callback order. It retains separate immunity checks for passenger propagation and damage calculation, double/float arithmetic and saturating floor-to-int conversion. Positive damage resets the impulse context, selects the fall sound, plays block landing sound and dispatches hurt. A rejected hurt callback does not change the native positive-damage result. ImpulseContext also models setter, grace-extension and reset behavior; disabling ignore clears grace time while retaining the impact position until a later reset.

python3 tools/test_living_fall_parity.py compares actual living methods and sequential impulse changes. The living fall report records 153,025 matching lines per JAR, including changing immunity, passenger callback mutations, nonfinite arithmetic, sound threshold selection and failures after partial state changes. Workspace Clippy passes. Attribute provisioning, passenger storage/recursion, actual health processing, tick/save/network behavior and the complete movement lifecycle remain pending.

push_entities_up implements the block-replacement push: query old/new shapes, subtract old occupied space without optimizing the join, translate to world coordinates and select entities using the added shape's bounds. It reads each current entity box before calculating its upward displacement and invokes a relative teleport even when that displacement is zero.

python3 tools/test_block_push_parity.py compares actual Block.pushEntitiesUp with controlled shapes and selected entity lists. The block push report records 101,006 matching lines per JAR, including empty/redundant geometry, partial shapes, large coordinates, nonfinite entity boxes, mutations of later entities and failures after partial effects. Workspace Clippy passes. Registered replacement dispatch, actual entity selection and teleport/network semantics remain separate integration work.

block_landing binds audited native landing/bounce families to every registered state. It implements fall-distance reduction, hay/honey damage multipliers, slime suppression, powder-snow fall sounds, upward dripstone tips, farmland replacement with occupant pushes, turtle-egg destruction/decrement and shelf mushroom bounce sounds. Random draws, server-class checks, client flags, spawn protection, mob griefing, sounds, writes and events retain native order.

python3 tools/test_block_landing_parity.py invokes registered native methods for all 35,723 states / 1,286 blocks with eight entity class families. The registered landing report records 3,524,267 matching lines per JAR, including float/double boundaries, NaN/infinity, failed writes, callback failures, egg hatch preservation and farmland collision pushes. Targeted Clippy passes. Actual health, live entity selection/storage, teleport/network behavior, audio playback and full movement lifecycle integration remain separate work.

movement_emission accumulates native movement/flight distances, evaluates climbable and powder-snow states, and dispatches step/swim/flap effects. Legacy and current support blocks retain their separate sound/event rules. Threshold updates use Java float-to-int saturation and wrapping integer addition, and sound/event callbacks can change fields observed by subsequent operations.

python3 tools/test_movement_emission_parity.py compares actual native movement emission, block vibration dispatch, flapping and next-step arithmetic. The movement emission report records 598,611 matching lines per JAR across 53,036 fixtures, including predicate combinations, sound/event modes, differing support blocks, nonfinite numbers, mutations and provider failures. Targeted Clippy passes. Sound callbacks are controlled and the crystal-sound predicate is false in this gate; registered sound selection, audio playback and full movement integration remain pending.

entity_move sequences native movement phases: no-physics/piston early exits, stuck multiplier reset, edge backoff, collision resolution, fall-reset clipping, position/recording writes, collision/ground flags, landing, removal, restitution, movement emission and block speed multiplication. MovementHistory retains at most 100 records by merging the oldest pair and dropping their original-axis movement metadata. Callbacks can change fields read by later phases.

python3 tools/test_entity_move_parity.py invokes actual Entity.move with native shape resolution and zero restitution. The movement lifecycle report records 543,653 matching lines per JAR, covering signed zero, tiny/nonfinite movement, collisions, early exits, recording cap, authority guards, landing mutations/removal and failures after partial writes. Targeted Clippy passes. This gate controls piston/edge decisions, ground support, ray hits and landing callbacks; step height is zero and non-passenger emission is tested separately. Binding all phases to a live entity/world and player travel remains pending.

world_ray implements ordered block/fluid ray clipping, nearest-hit selection with block precedence on ties, and interaction-shape overrides that replace only the hit face. It also implements native fluid pick modes and fall-reset shape selection, including player type identity, end portals/gateways and server-side zero-delay Nether portals. Traversal limits and invalid geometry return errors.

python3 tools/test_world_ray_parity.py compares actual BlockGetter.clip and native ClipContext modes. The world ray report records 248,725 matching lines per JAR, including inside hits, ties, misses, interaction geometry, short/signed-zero rays, lazy predicates/rules and provider failures. Targeted Clippy passes. Separate limit tests distinguish a miss from nonfinite geometry, exhausted traversal budget and failed world reads. Shapes and state predicates are controlled; registered shape binding, actual fluid shape caching and full entity/world integration remain pending.

FluidShapeCache matches native registered-fluid shape caching. The first successful lookup of a nonempty fluid state samples the fluid above and retains its resulting shape across later positions/world views. Failed reads leave the state uncached. Empty and full cube shapes preserve canonical identity; distinct noncanonical cached shapes retain their own identities.

python3 tools/test_fluid_shape_parity.py runs every registered native fluid state in changing query sequences. The fluid shape report records 387,950 matching lines per JAR across 5,181 sequences, comparing geometry, cache population, canonical/alias identities, query suppression and failures. Targeted Clippy passes. The pinned registry has no amount-nine state; unsupported custom fluid definitions are outside this module. Fluid propagation, entity immersion and live world/ray integration remain pending.

InteractionShapes imports a complete state-bound table with a distinct table kind and mandatory canonical identity metadata. The pinned owner audit finds only default empty, cauldron, composter, hopper and scaffolding implementations; all are static per state. Geometry uses the existing validated discrete shape importer while preserving eight native shape identities.

python3 tools/test_interaction_shape_parity.py compares every registered state and actual native interaction-face overrides with supplied collision geometry. The interaction shape report records 188,682 matching lines per JAR across all 35,723 states. Native interaction-shape world queries are rejected by the fixture. Import checks reject wrong table kind, partial mappings, missing canonical metadata, foreign state ordering and invalid IDs. Targeted Clippy passes. Registered outline/visual shapes, complete ray-world binding and gameplay integration remain pending.

FallRayRegistry binds fall-reset tags, portal identities, interaction geometry and fluid states to the complete registered block-state table. fall_reset_ray uses that binding with the shared fluid-shape cache and native water selection. Tag reloads produce new validated registry snapshots; unknown tag members and invalid state IDs are rejected.

python3 tools/test_registry_fall_ray_parity.py compares actual registered BlockGetter.clip behavior with native block/fluid tags and shape getters. The registered fall-ray report records 3,024,623 matching lines per JAR across 120,297 fixtures, including all 35,723 states, tag reloads, server/client distinctions, player type checks, portal delays, changing above-fluid states, shared cache reuse and failures. Targeted Clippy passes. World storage is controlled; live entity movement and complete player/world gameplay integration remain pending.

living_landing wraps base fall handling with fluid refresh, server-only changed block notification and landing particles, followed by climbing-position cleanup. Particle positions preserve the native support-block edge projection and capture entity coordinates before later callbacks. Attribute, fluid, particle and block callbacks can mutate fields; failures retain preceding writes.

python3 tools/test_living_landing_parity.py invokes actual LivingEntity.checkFallDamage and its base implementation. The living landing report records 244,844 matching lines per JAR, including server/nonserver levels, water changes, numeric boundaries, particle locations/counts, callback failures, field mutations and climbing cleanup. Targeted Clippy passes. Fluid immersion, changed-block enchantments, particle rendering and live gameplay binding remain pending; those providers are controlled by this gate.

living_air implements input normalization/rotation, friction-influenced speed, ladder/scaffolding limits, relative movement, collision-triggered climbing and air travel. Ground friction is captured before movement while levitation, gravity and drag are sampled afterwards. Player class identity controls ladder slide suppression. Native float arithmetic and quantized trigonometry are kept.

python3 tools/test_living_air_parity.py invokes the actual native private air, relative movement, climbing, speed, friction and input-vector methods. The air travel report records 443,554 matching lines per JAR, including both player/nonplayer classes, changed ground/climbing predicates, missing client chunks, levitation, nonfinite boundaries, callback mutations and failures. Targeted Clippy passes. Extreme effect amplifiers are injected directly for integer-boundary checks; normal constructor clamping is outside this gate. Collision movement, gravity, attributes and immersion remain controlled providers; live gameplay binding and complete player travel are pending.

living_fluid adds native water/lava acceleration, slowdown, falling adjustment, shallow-lava handling, collision escape and ridden buoyancy. It shares input rotation with air movement. Fluid heights and escape queries remain lazy, with movement mutations visible to subsequent velocity updates.

python3 tools/test_living_fluid_parity.py compares the actual native travel and fluid helper methods. The fluid travel report records 265,100 matching lines per JAR, including sprint changes, movement efficiency, dolphin effects, shallow-fluid boundaries, escape probes, ridden float guards, nonfinite values, callback mutations and failures. Targeted Clippy passes. Collision movement, immersion depths, free-space queries, attributes and gravity are controlled; live fluid propagation and gameplay binding remain pending.

living_motion implements default living jump strength/boost, sprint jump impulses, gravity and slow falling, vertical liquid input, rider flight speed and air drag. Native finite-addition filtering and delayed synchronization flags preserve partial writes when providers fail.

python3 tools/test_living_motion_parity.py compares the corresponding actual living methods plus Entity.applyGravity and addDeltaMovement. The jump and gravity report records 113,623 matching lines per JAR, including float thresholds, extreme raw effect amplifiers, signed zero/nonfinite values, rider classes, callback mutations and failures. Targeted Clippy passes. Entity-type jump/flight overrides, effect and attribute storage, registered jump-factor binding and live gameplay integration remain pending.

player_travel wraps living travel with passenger bypass, swimming pitch adjustment, head-fluid checks and preservation of creative-flight vertical velocity. It also binds player flight speed to sprint/passenger/ability rules and implements the flying ability's fluid-affection predicate.

python3 tools/test_player_travel_parity.py invokes actual Player.travel, getFlyingSpeed and isAffectedByFluids. The player travel report records 120,933 matching lines per JAR, including ability and velocity mutations, callback failures, signed zero/nonfinite positions and the distinction between direct ability fields and virtual ability access. Targeted Clippy passes. Parent travel is selected through a controlled fluid callback; connecting the verified living phases and collision movement to the live player/world remains pending.

ClimbingRegistry binds resolved climbing/glide-through tags and actual trapdoor class identities to all registered states. on_climbable preserves spectator and gliding guards, open-trapdoor/ladder facing checks, wrapping below-position arithmetic and last-climbable position writes. Negative or failed checks retain the previous climbing position. Unknown members/properties and IDs are rejected.

python3 tools/test_climbing_parity.py invokes actual registered LivingEntity.onClimbable and trapdoor support checks. The climbing report records 3,820,054 matching lines per JAR across all 35,723 states, including all trapdoor states against every registered ladder facing, tag reloads, spectator/gliding guards, captured positions, mutations and failures. Targeted Clippy passes. Entity/world storage is controlled; live movement binding and equipment-based glide eligibility remain pending.

fluid_occupancy implements section-ordered liquid checks over resident block sections with a complete registered fluid-presence table. BlockSection.any_state checks active palette entries so dry sections skip cell unpacking. Bounds use inclusive floored endpoints, and chunk requests retain native behavior even when no requested vertical section is within world height. Invalid geometry, foreign registries and query-budget exhaustion return explicit errors.

python3 tools/test_fluid_occupancy_parity.py compares actual LevelReader.containsAnyLiquid, BoxBlockMatcher and BlockScanUtils with native ProtoChunk sections. The liquid occupancy report records 116,664 matching lines per JAR, including fluid presence for all 35,723 states, public chunk/section query order, height boundaries, palette changes/compaction and failures. Rust-only checks verify typed budget, nonfinite and registry errors. Targeted Clippy passes. Chunk snapshots repeat controlled resident data; collision composition for Entity.isFree and live world binding remain pending. No performance gain is claimed without measurement.

free_space.offset_is_free composes native offset bounds, registry-bound block/entity/border collision clearance and resident liquid occupancy. The liquid scan runs only after collision clearance succeeds. Both phases share resident TerrainChunk storage through RegistryCollisionWorld; their typed errors and separate query budgets remain visible to the caller.

python3 tools/test_free_space_parity.py invokes actual Entity.isFree, native collision iteration and liquid scanning on the corresponding resident ProtoChunk storage. The free-space report records 5,764,046 matching lines per JAR across all 35,723 states, offsets, fluid/context variants, height boundaries, required missing chunks and failures. Targeted Clippy passes. Entity lists, border applicability and collision contexts are controlled; chunk generation, live entity indexing and full playable integration remain pending. The collision-only regression also passes 4,793,095 matching lines per JAR after extending the shared fixture and registry binding.

entity_fluid tracks body depth, eye immersion and current accumulation across updates. It preserves one-tick tracker retention, missing-chunk preflight, ordered cell scans, the first matching current tag, camera support checks and partial writes on query failure. Current application distinguishes player averaging from other entities' normalization and dispatches the final velocity addition with its finite-input filter and fresh velocity read.

python3 tools/test_entity_fluid_parity.py invokes actual EntityFluidInteraction and Entity.addDeltaMovement. The entity fluid report records 607,338 matching lines per JAR with real ProtoChunk fluid-presence sections, ordered/reloaded overlapping tags, wet/dry sequences, eye boundaries, nonfinite heights/current arithmetic, mutations and injected failures. Rust-only checks cover explicit query-budget/nonfinite errors and reset-before-error behavior. Targeted Clippy passes. Fluid heights/flows and entity fields are controlled here; neighboring-cell flow calculation, live world/entity binding and full playable integration remain pending. Extreme-coordinate Java scans are bounded by injected callback failures rather than allowed to traverse billions of cells.

fluid_flow computes water/lava current vectors from ordered horizontal and lower neighbors, preserving f32 height subtraction before f64 accumulation. Falling fluids apply the native wall deflection, including the same-family, upward-face and IceBlock guards, then normalize the resulting vector.

python3 tools/test_fluid_flow_parity.py invokes actual registered FluidState.getFlow, FlowingFluid.getFlow and its solid-face helper. The fluid flow report records 1,051,071 matching lines per JAR from 51,846 fixtures covering all registered fluid states, neighboring families/heights, per-face wall flags, falling deflection, wrapping coordinates and query failures. Targeted Clippy passes. Block tag/class flags and face support are controlled in this comparison; binding those to registered block storage and support shapes, fluid spreading and complete gameplay remain pending.

registry_fluid now binds contained fluid states, resolved flow-blocking tags and actual IceBlock class membership to the full block registry. Its world adapter composes current/height/camera queries with cached and dynamic support shapes. Foreign registry identities, unknown tag members and invalid state IDs are rejected explicitly; tag reloads use a new immutable binding.

python3 tools/test_registry_fluid_parity.py compares actual registered height, camera immersion, current vectors and solid-face queries. The registered fluid report records 2,446,969 matching lines per JAR from 409,389 fixtures, covering all 35,723 block states, waterlogged contents, cached/dynamic support, natural and reloaded tags, neighboring fluid families, coordinate wrapping and failures. Targeted Clippy passes, including checks for typed invalid-ID and foreign-registry errors. World cells are controlled and block entities are absent in this suite; active block-entity lifecycle, live entity binding, fluid spreading and complete playable integration remain pending.

entity_fluid_tick composes immersion updates with entity water-entry behavior and current application. It captures water/lava membership before effects, resets fall distance in water, dispatches a splash after the first tick when newly entering water, updates the touching-water flag and queries the push predicate again before applying forces. Lava uses the dimension's FAST_LAVA attribute to select its current coefficient.

python3 tools/test_entity_fluid_tick_parity.py invokes actual Entity.updateFluidInteraction with native immersion and current application. The entity fluid tick report records 953,830 matching lines per JAR, including changing push predicates, first-tick/entry flags, simultaneous water/lava, attribute selection, nonfinite arithmetic, callback mutations and failures around partial writes. The immersion regression also passes 607,338 lines per JAR after extending the shared fixtures. Targeted Clippy passes. Splash dispatch is controlled; audio/particle generation, full live entity/world binding and playable integration remain pending.

RegistryFluidWorld now implements entity immersion queries through the bound fluid contents, height calculations, camera support and neighbor-derived current vectors. Entity fields and loaded chunk/section views remain supplied by the world provider, preserving captured positions and partial-write order.

python3 tools/test_registered_entity_fluid_parity.py invokes actual EntityFluidInteraction with registered fluid and support behavior. The registered immersion report records 6,550,126 matching lines per JAR, including all 35,723 states in immersed and above-eye cells, mixed water/lava neighborhoods, waterlogged blocks, ordered/reloaded tags, current velocities, tracker retention and query failures. Targeted Clippy passes. Shared-fixture regressions also pass: tick composition (953,830 lines per JAR) and controlled immersion (607,338 lines per JAR). Chunk presence and section wet flags are controlled, and block entities are absent here; full live chunk/entity lifecycle, fluid propagation and playable gameplay remain pending.

swimming implements entity/player swimming transitions, underwater/shallow-water predicates and the fluid jump threshold. The player flying ability disables swimming directly. Other transitions preserve short-circuit query order, prior eye-in-water state, passenger guards, captured block position and final state writes only after all required queries succeed.

python3 tools/test_swimming_parity.py compares actual Entity/Player methods. The swimming report records 191,142 matching lines per JAR, including flag combinations, native fluid tag membership, failures/mutations, and f32 eye-height boundaries/nonfinite values. Targeted Clippy passes. Synchronized entity storage, full input/tick integration and playable gameplay remain pending.

fluid_box implements default entity immersion bounds and boat passenger waterline clipping. Entity bounds are deflated and captured before vehicle lookup. Submerged boats retain those bounds; other boats restrict immersion to the portion strictly above their top, returning no box when none remains.

python3 tools/test_fluid_box_parity.py compares actual entity/boat methods. The fluid box report records 92,822 matching lines per JAR, including actual boat status values, virtual modifier dispatch, thin/inverted bounds, waterline boundaries, signed zero/nonfinite values and mutations/failures. Targeted Clippy passes. Vehicle snapshots are controlled; live passenger lifecycle and full gameplay remain pending.

water_splash generates native water-entry sound, bubble/splash particle and game event requests. It preserves controlling-passenger identity, captured velocity, f32 volume/pitch arithmetic, float-rounded surface height, changing entity width, and random draws before each emitted effect. A particle budget returns an explicit error after preserving preceding effects and RNG consumption.

python3 tools/test_water_splash_parity.py invokes actual Entity.doWaterSplashEffect with native legacy and xoroshiro random generators. The water splash report records 192,506 matching lines per JAR across 7,840 fixtures, including sound thresholds, self/other passengers, particle positions/velocities, callback mutations/failures, nonfinite arithmetic and the next RNG value after the effect. A Rust-only budget check verifies that exhaustion preserves the two sound-pitch random draws. Targeted Clippy passes. Sound identities and effect sinks are controlled; audio playback, particle simulation/rendering and full gameplay integration remain pending.

attributes implements basic/ranged attribute instances, ordered modifiers, three-stage value calculation, cache invalidation and permanent-state packing. Modifier clones retain reference identity for transient-update notifications. Per-operation maps preserve native hash-table iteration, growth and deletion order because modifier arithmetic is sensitive to floating-point association. The implementation also retains native partial writes when a dirty observer fails, stale operation entries after operation-changing updates, merge-on-apply semantics and self-replacement behavior.

python3 tools/test_attribute_parity.py compares actual AttributeInstance methods using every registered attribute definition. The attribute report records 1,404,798 matching lines per JAR across 2,391 fixtures, including collision clusters, resize/shrink boundaries, seeded operation sequences, reference identity, observer cache reads/failures, nonfinite values and signed zero. The adapter observes iterator order, as native calculation does; Java stream traversal can differ. Targeted Clippy passes. Registry/entity/equipment binding, packed data/network codecs and full gameplay integration remain pending.

attributes::entity imports version-checked attribute definitions and entity supplier bases, and composes them with the attribute engine. Reads fall back to the supplier without creating instances; first instance access schedules an update and a sync for client-syncable attributes. Mutations retain those set memberships until individually acknowledged. Base resets use the entity's supplier value and do not instantiate absent entries. Missing attributes and missing modifiers remain distinguishable, including lookup after instantiation.

python3 tools/test_entity_attribute_parity.py compares actual AttributeMap operations with 40 registered attributes and 93 entity suppliers. The entity attribute report records 1,771,555 matching lines per JAR across 4,720 fixtures. Targeted Clippy passes. The exporter asserts that registered default suppliers contain no modifiers. Set membership is observed in registry order: this does not establish JVM identity-hash collection order, cross-attribute bulk assignment/serialization, custom suppliers, equipment integration or a live entity tick.

food implements eating, saturation, exhaustion, hunger predicates and the server hunger tick. It retains the captured level/difficulty, short-circuit player queries, fast/slow regeneration timers, starvation health/difficulty guards, wrapping integer arithmetic, Java float edge behavior and partial state writes when callbacks fail. Heal and starvation requests use explicit world hooks, which can mutate food state before subsequent tick work.

python3 tools/test_food_parity.py compares actual FoodData methods. The food report records 180,878 matching lines per JAR across 15,211 fixtures, including 240-tick sequences, threshold boundaries, all difficulties, callback mutation/failure, signed zero and nonfinite arithmetic. Targeted Clippy passes. World rules, player health/healing and damage delivery are controlled; consumables, saved hunger data and live survival gameplay integration remain pending.

food_storage reads/writes hunger state in player NBT compounds. Missing and nonnumeric fields use native defaults; numeric tags retain vanilla coercions, including floor-to-int for floats/doubles, truncation of long integer bits and no post-load clamping. Writes replace the four hunger fields with native int/ float types, normalize float signed zero and preserve unrelated player fields.

python3 tools/test_food_storage_parity.py compares actual FoodData persistence through TagValueInput/TagValueOutput. The food storage report records 45,955 matching lines per JAR, covering every NBT numeric type, missing/wrong-type fields, conversion boundaries, nonfinite values and save/load round trips. Targeted Clippy passes. ProblemReporter diagnostics and the complete player save lifecycle remain pending; these results establish the four hunger fields, not a playable save/load implementation.

living_health implements health/absorption clamping, healing dispatch, player hurt and living dead-or-dying predicates. Health writes capture synchronized storage before attribute lookup. SyncedFloat preserves Java boxed-float equality, writes the value before the update callback, and marks dirty only after that callback succeeds; it also supports default/dirty extraction for a single float item.

python3 tools/test_living_health_parity.py compares actual LivingEntity/Player methods and actual SynchedEntityData float items. The living health report records 442,007 matching lines per JAR, covering nonfinite values, signed zeros/NaN equality, forced updates, dirty extraction, health-data replacement during callbacks and partial effects after exceptions. Targeted Clippy passes. Attribute values and the internal absorption sink are controlled. Player-specific absorption synchronization, multiple synchronized items, registered attribute binding, full damage processing and playable entities remain pending.

attribute_health binds the health engine to registered entity attributes and mutable synchronized health. AttributeHealth borrows existing state, queries actual modified MAX_HEALTH/MAX_ABSORPTION values and propagates observer errors without losing partial health writes. Base living absorption uses field storage.

python3 tools/test_attribute_health_parity.py composes actual registered AttributeMap, LivingEntity/Player health methods, SynchedEntityData and FoodData. The composition report records 666,082 matching lines per JAR, including all 93 entity suppliers, attribute base/modifier changes, real regeneration health writes, 100-tick hunger sequences and failed synchronization callbacks. Targeted Clippy passes. The internal absorption sink and starvation damage delivery are controlled; player absorption synchronization, attribute-change refresh, full damage and live gameplay integration remain pending.

Entity attribute storage now shares immutable supplier bases and allocates each mutable instance only on first access. This retains dense lookup indices while avoiding space for unused instance objects in every entity.

python3 tools/measure_attribute_memory.py --phase before|after measures a Linux release-process workload of 20,000 held-live zombie attribute maps, using five fresh processes per case. Median process RSS changed from 175,820 to 12,848 KiB with defaults only, and 175,800 to 29,076 KiB with four active attributes per entity. Both cases retain the same health-read checksum. The before and after reports record samples and source hashes; the baseline entity implementation is fd185a6. RSS includes runtime, catalog and allocator overhead. This is not whole-game memory, a timing benchmark or evidence of an FPS improvement.

The optimized implementation passes both pinned JAR comparisons again: entity attributes (1,771,555 lines per JAR) and health/hunger composition (666,082 lines per JAR). Targeted Clippy passes.

combat_rules implements armor/toughness and magic-protection damage arithmetic. It preserves the nonnull-weapon/server-level guards and clamps modified armor effectiveness only after the server enchantment hook.

python3 tools/test_combat_rules_parity.py compares actual CombatRules methods. The combat rules report records 184,248 matching lines per JAR, including armor/toughness boundaries, random float bit patterns, nonfinite/signed-zero values, query mutations/failures, null/empty/unenchanted weapons and server/nonserver branches. Native unenchanted stacks have explicitly empty components. Targeted Clippy passes. Enchanted item components, damage tags, armor durability and the complete damage pipeline remain pending; the exposed enchantment hook is not an enchantment implementation.

living_damage implements the inner actuallyHurt sequence for base living entities and players. It preserves invulnerability/armor/magic dispatch, both absorption reads before the first write, guarded absorbed statistics, Java float rounding, player exhaustion/taken statistics, base-living second absorption writes, and combat/health/game-event ordering. Callback failures retain preceding writes and effects.

python3 tools/test_living_damage_parity.py compares actual LivingEntity/Player methods with real final absorption clamping and controlled phase/storage sinks. The living damage report records 161,198 matching lines per JAR, including entity/player paths, attacker types, stat limits/rounding, nonfinite values, mutations and failures at query boundaries. Targeted Clippy passes. Armor/magic results, health storage, combat/ stat sinks and exhaustion delivery are controlled. Outer hurt gates, resistance/ equipment binding, combat tracking and playable damage integration remain pending.

player_food implements player exhaustion, eating eligibility and the hunger threshold for exhaustive manoeuvres. Invulnerability reads the abilities field directly. Exhaustion additionally checks the client/server side before updating direct food storage; manoeuvre eligibility uses virtual food and ability lookups. StoredPlayerFood binds these operations to ordinary mutable FoodData state.

python3 tools/test_player_food_parity.py compares actual Player methods and native FoodData. The player food report records 32,723 matching lines per JAR, covering direct/virtual distinctions, captured food identity during mutations, guard short-circuiting, injected failures, nonfinite exhaustion and integer hunger boundaries. The stored-state binding is also compared. Targeted Clippy passes. Consumable components, full ability storage and live player tick integration remain pending.

damage_reduction composes native armor/toughness arithmetic with living damage bypass checks and armor-durability dispatch. Its magic-reduction path preserves resistance amplifier overflow, reduced-damage clamping, resisted statistics, repeated attacker lookup and the server-only enchantment protection query. Armor attributes floor to Java's saturated integer range before float conversion.

python3 tools/test_damage_reduction_parity.py compares actual living methods for base entities and ServerPlayer receivers. The damage reduction report records 78,069 matching lines per JAR, covering bypass combinations, resistance/stat boundaries, numeric edges, query failures/mutations and actual empty-equipment protection iteration. Targeted Clippy passes. Equipment is empty; enchanted components, actual armor durability, registered damage/effect bindings and the full hurt sequence remain pending.

synced_floats stores multiple synchronized float fields. It preserves boxed float equality, per-field/global dirty state, ascending-ID dirty/default lists, received assignment without newly marking dirty, per-entry and batch callbacks, and prefix effects when an observer or field lookup fails. Callbacks may reenter the table to set/assign fields or drain existing dirty values.

python3 tools/test_synced_floats_parity.py compares actual SynchedEntityData. The synchronized float report records 554,909 matching lines per JAR, including forced/equal updates, received duplicates, reentrant operations, missing IDs, callback failures and NaN/signed-zero equality. Native gaps are untouched default float items; observed keys are explicit configured IDs. Targeted Clippy passes. Other serializers, serializer-mismatch errors, wire codecs and player absorption binding remain pending.

player_health binds ordinary registered player attributes to health and absorption in one synchronized float table. The player absorption getter and internal setter use virtual data access; health retains its direct data access. The final absorption setter still applies the registered maximum before writing.

python3 tools/test_player_health_parity.py compares actual Player methods, registered player attributes and SynchedEntityData, exporting the actual pinned health/absorption field IDs. The player health report records 243,146 matching lines per JAR, covering modified limits, healing, absorption reads/writes, combined dirty/default lists, received assignments, callback packet drains and failures. Targeted Clippy passes. Observer effects are controlled; custom virtual data replacement, other synchronized serializers, wire codecs and full player damage/tick integration remain pending.

server_player_damage composes ordinary server-player inner damage with registered armor/toughness and health/absorption limits, shared synchronized float storage and stored hunger. Armor break callbacks may change attributes before the hit queries armor; received damage uses the actual reduction and health modules, and player exhaustion retains its ability/client guards.

python3 tools/test_server_player_damage_parity.py compares the native Player inner damage method on ServerPlayer receivers, using actual native reduction, registered modified attributes, synchronized data and FoodData. The server-player damage report records 373,455 matching lines per JAR, covering repeated hits, bypass flags, resistance, numeric edges, armor attribute mutation, dirty packet drains and callback failures. Targeted Clippy passes. Empty equipment and controlled source/effect, durability, combat/stat/event services bound this scope; outer hurt gates, enchanted equipment and the complete player lifecycle remain pending.

living_hurt implements the outer living hurt sequence: early rejection, blocking/freezing/helmet dispatch, non-finite damage sanitization, repeated-hit cooldowns, hurt-animation writes, attribution, impact/knockback, death/sound branches, last-source timestamps, effect notifications and criterion dispatch. Services receive live hurt state, including the distinct field writes before and after the inner hit in fresh-hit and cooldown-difference branches.

python3 tools/test_living_hurt_parity.py invokes the native LivingEntity method directly on base and ServerPlayer receivers. The living hurt report records 441,413 matching lines per JAR, including numeric edges, repeated hits, callback mutations/failures, empty-hand death-protection lookup, native soundless blocking components and victim criteria with no listeners. Targeted Clippy passes. Inner damage, blocking amounts, sounds, knockback, death and attribution/effect services are controlled. Successful totems, attacker-player criteria, actual blocking reduction, full service bindings and player-specific outer gates remain pending.

player_hurt adds the player ability/invulnerability gates, no-action reset, shoulder removal, damage-source difficulty scaling and exact-zero rejection before living hurt. The server-player wrapper first checks PvP permission for player attackers and player owners of arrow attackers. Difficulty is queried separately for the peaceful, easy and hard branches as in vanilla.

python3 tools/test_player_hurt_parity.py compares actual Player and ServerPlayer methods through the native living hurt sequence. The player hurt report records 410,880 matching lines per JAR, including all three-query difficulty combinations, player/arrow-owner PvP gates, repeated hits and callback failures. Targeted Clippy passes. Native downstream living services retain the controlled fixture scope above; invulnerability internals, rule/source registries, actual team permissions, successful totems, attacker server-player criteria and complete player lifecycle integration remain pending.

damage_immunity implements entity permanent/temporary invulnerability and base source immunity, living enchantment dispatch, ordered player damage gamerules, and server-player dimension-change/client-loading checks. It preserves early returns and repeated source-tag queries across the inheritance layers.

python3 tools/test_damage_immunity_parity.py compares each native layer on ServerPlayer receivers, retaining native empty-equipment enchantment iteration. The damage immunity report records 170,314 matching lines per JAR, including mixed damage tags, rule precedence, virtual flag mutations and callback failures. Targeted Clippy passes. Source/rule queries and virtual flags are controlled; registered source/rule bindings, nonempty enchantment immunity and full pipeline integration remain pending.

server_player_combat binds server/player/living outer hurt to the checked registered-attribute, synchronized-health/absorption and hunger inner damage path. Dead-or-dying reads live health and the direct death flag; the outer cooldown/animation state is shared across hits. PvP, blocking, effects, attribution, knockback, death and other world services remain explicit.

python3 tools/test_server_player_combat_parity.py compares the actual native ServerPlayer hurt chain through actual inner reduction and player storage. The server-player combat report records 561,528 matching lines per JAR, including repeated hits, death rejection, modified attributes, cooldown differences, packet drains, numeric edges and failures after partial writes. Some fixtures explicitly reset cooldown between hits; they do not claim entity-tick coverage. Targeted Clippy passes. Invulnerability answers, blocking amounts, armor-durability callbacks, effects, PvP permission, combat/event/knockback/death services and criterion listeners are controlled. Enchanted items, registered sources, actual lifecycle services and playable integration remain pending.

The stored-player combat binding now executes the verified server-player invulnerability predicates at every outer and inner query. Its inner damage body is shared with standalone living/player damage after the required predicate has run. Native integration retains inherited Entity/LivingEntity/Player/ServerPlayer immunity methods, including empty-equipment enchantment iteration, gamerule precedence, dimension changes and client-loading guards.

The combat immunity integration report records 1,176,994 matching lines per JAR. The standalone inner-damage regression report retains 161,198 matching lines per JAR after extracting the shared body. Targeted Clippy passes. Virtual flags, source tags/rule values and the other world services listed above remain controlled; the fixture now executes the immunity decisions themselves instead of supplying their final result.

damage_source imports version-checked native decoded damage definitions and resolves their raw tag resources with the shared tag implementation. Sources retain distinct direct/causing entities and optional explicit positions. Weapon and fallback position queries use the direct entity; difficulty scaling uses the stored causing entity, while creative-source detection dispatches virtual causing-entity access before reading player abilities.

python3 tools/test_damage_source_parity.py covers all 51 bundled damage types and 36 damage-type tags, using the actual native DamageType codec and TagLoader. The damage-source report records 152,175 matching lines per JAR, including constructor identities, scaling, exhaustion, tag/type membership, position/weapon queries, virtual causing-entity replacement, mutations and failures. Targeted Clippy passes. Catalogs are immutable snapshots with local indices, not network IDs. Rust DamageType codecs, runtime reload, death-message generation, full entity query bindings and combat source integration remain pending.

Registered damage sources now drive a composed player-combat fixture. Source helpers map the immunity, outer-hurt and reduction tag enums to the imported vanilla tags. Native source methods supply exhaustion, difficulty scaling, creative-source abilities and direct-entity weapon selection through the real ServerPlayer hurt chain; thorns also follows its native secondary-sound branch.

python3 tools/test_registered_player_combat_parity.py records 1,431,711 matching lines per JAR in the registered player-combat report, covering all 51 damage types and 36 tags, direct/causing entity combinations, repeated hits, health/absorption/hunger, cooldown state and callback failures. Targeted Clippy passes. Equipment is unenchanted; virtual entity flags/rule values, blocking amounts, durability, PvP permission, attribution, effects, knockback/death services and empty criterion listeners remain controlled. Complete entity lifecycle and playable game integration remain pending.

blocking_rules implements damage-reduction angle/type conditions, ordered reduction sums and clamping, block delay/disable tick rounding and item-damage threshold/floor arithmetic. Source type-set membership is queried only when its entry's angle condition reaches that check.

python3 tools/test_blocking_rules_parity.py compares native BlocksAttacks records and direct holder-set membership. The blocking rules report records 105,068 matching lines per JAR, including exact angle boundaries, NaN/infinity/signed zero, randomized float bits, source-type mutations and query failures. Targeted Clippy passes. Angles are supplied in radians; direction/acos calculation, component codecs, item durability, sounds and full blocking integration remain pending.

view_direction implements native float-table pitch/yaw vectors and horizontal blocking angles, using the pinned pure-Rust libm 0.2.16 inverse cosine. A local 203,072-input probe found 7,908 differences with the platform acos, versus none with this pinned implementation, so platform math is not used for this path.

python3 tools/test_view_direction_parity.py compares actual native view vectors and Java Math.acos, plus the native view/subtract/normalize/dot/acos composition used by blocking. The view-direction report records 226,459 matching lines per JAR, including random doubles, inverse- cosine boundaries, arbitrary float rotations, degenerate horizontal vectors and the widened float-PI fallback. Targeted Clippy passes. Full item-blocking dispatch and validation against JVMs on other platforms remain pending. This does not resolve the separately tracked Math.cos/Gaussian portability differences.

item_blocking implements living blocking dispatch: item/component capture, bypass and pierced-arrow rejection, source direction, component reduction, blocking-item damage dispatch and the later non-projectile melee response. The virtual level/used hand are queried after reduction; melee response retains the original server-level argument and performs a fresh direct-entity lookup.

python3 tools/test_item_blocking_parity.py compares actual LivingEntity applyItemBlocking with native components on base and ServerPlayer receivers. The item-blocking report records 87,930 matching lines per JAR, including callback mutations/failures, captured items/components, piercing/bypass combinations, native direction/math, client/stat guards and melee responses. Targeted Clippy passes. Native stacks are explicitly undamageable; actual damageable-item mutation, blocking eligibility, component codecs and complete combat/world integration remain pending.

item_use implements blocking-item eligibility and both elapsed-use timer overloads. It retains the original blocking delay while rereading active-item storage and remaining ticks after the virtual duration query; partial-tick queries preserve the second virtual use-state check.

python3 tools/test_item_use_parity.py compares the actual inherited native methods with real blocking components and controlled virtual item durations. The item-use report records 108,690 matching lines per JAR, covering wrapping tick arithmetic, delay boundaries, absent components, empty stacks, shared item types, partial float values and callback mutations/failures. Targeted Clippy passes. Full item-use lifecycle, damageable-item storage and complete combat/world integration remain pending.

item_durability stores the durability projection of an item stack, including raw versus visible counts/components, clamped damage access, damageability/break predicates and wrapping count changes. Server-level damage preserves creative immunity, the positive float enchantment pipeline, advancement-before-write and copy-before-shrink ordering. The non-breaking variant retains its native empty break consumer, including unusual invalid component values.

python3 tools/test_item_durability_parity.py compares actual unenchanted native ItemStack operations. The durability report records 81,762 matching lines per JAR, including absent components, empty/air stacks, unbreakable flags, integer boundaries, callback mutations and failures. Targeted Clippy passes. This is a durability projection, not complete item-stack component storage. Enchantment effects, component codecs, equipment break handling and full gameplay integration remain pending.

blocking_item_damage composes blocking-component item-damage arithmetic with stored durability. It preserves player-only handling, the passed level's client guard for item-use statistics, the later virtual entity-level check and the server-player-only creative/advancement queries. Break callbacks receive the pre-shrink stack copy and the caller's original equipment slot.

python3 tools/test_blocking_item_damage_parity.py compares actual native BlocksAttacks calls into ItemStack storage on non-player, Player and ServerPlayer receivers. The blocking durability report records 71,800 matching lines per JAR, including scalar float boundaries, invalid/absent durability components, statistic item capture, callback mutations and failures. Targeted Clippy passes. Stacks are unenchanted; full component storage, equipment lifecycle and complete combat/world integration remain pending.

item_use_lifecycle implements living use ticks, per-item updates, completion, release and stop ordering. Stable stack handles preserve type versus identity checks, rereads after virtual hand queries, captured level/item arguments, wrapping countdowns, returned-item placement and failure-visible state changes.

python3 tools/test_item_use_lifecycle_parity.py compares actual inherited native methods and ItemStack dispatch with controlled custom item handlers. The lifecycle report records 144,736 matching lines per JAR, including empty stacks, changed held/active items, shared item types, client/server queries, finish vibrations, kinetic-map presence and callback mutation/failure ordering. Targeted Clippy passes. Starting use, actual synchronized flags, consumable/kinetic effects, remainder/cooldown components and full inventory/game-tick integration remain pending.

item_use_start starts use from a captured held stack, writes the returned duration after its callback, synchronizes equipment before changing using/offhand flags, emits the component's start vibration and resets recent kinetic enemies when the final active stack has a kinetic-weapon component.

python3 tools/test_item_use_start_parity.py compares inherited native startUsingItem and its private equipment packet construction. The start-use report records 84,873 matching lines per JAR, including captured stack/level/hand arguments, empty stacks, callback mutation/failure ordering, flag writes, native UseEffects/KineticWeapon presence and clearing a populated kinetic-enemy map. Targeted Clippy passes; all 20 existing horizon-world library tests pass with these changes. Synchronized flag storage, packet encoding/delivery, kinetic combat and complete inventory/game-tick integration remain pending.

item_use_catalog imports all 1,658 pinned item identities and a typed projection of their default components for stack size, durability and use-duration/release queries. Component-driven use preserves consumable precedence over blocking and kinetic weapons. Registered duration overrides remain separate; consumables truncate float ticks while instruments floor them. Empty stacks query air behavior and hide their stored components.

python3 tools/test_item_use_catalog_parity.py binds vanilla's actual component initializers and confirms both JARs export equivalent defaults. The registered item-use report records 246,715 matching lines per JAR, covering every item default, count changes and component mutation sequences, override behavior, stackability, durability and integer/float extremes. Targeted Clippy passes. The imported projection does not implement all item components or their codecs; full inventory, enchantment effects and stored gameplay integration remain pending.

component_patch stores shared immutable prototypes and ordered copy-on-write patches. Set/remove return values, redundant-value sanitation, explicit removals, unsanitized restoration, independent copies and saved patch snapshots retain native behavior. Entry iteration emits patched values before untouched defaults; key-set order instead applies the patch to the prototype's key sequence.

python3 tools/test_component_patch_parity.py compares actual native patched maps. The component-patch report records 622,680 matching lines per JAR, including integer/boxed-float equality, NaN/signed zero, copy isolation and mutation-before-error when a restored removal has no prototype default. Targeted Clippy passes. Prototypes have at most seven keys in this suite; callers supply prototype order and native value equality. Native large-prototype identity-hash ordering, codecs, mutable payload aliases and full item/inventory integration remain pending.

component_durability binds damage/count queries and mutations directly to shared component prototypes and patches. The durability algorithm now accepts DurabilityStorage, so writes and storage errors occur at their native points, including before break callbacks. The earlier plain durability projection remains supported through the same interface.

python3 tools/test_component_durability_parity.py compares native ItemStack operations with nonempty prototypes and observable patches at every callback. The component durability report records 83,727 matching lines per JAR, including original/copy independence and mutation-before-error for unsanitized restored removals. Targeted Clippy passes. The refactor also preserves both native regression suites: scalar durability (81,762 lines per JAR) and blocking durability (71,800 lines per JAR). Full component codecs, enchanted durability, equipment and complete gameplay integration remain pending.

item_stack_storage implements stored item identity, count/pop-time storage, component visibility, copying, splitting, transmutation and consumption. Copies share component data until a write; canonical empty results are explicit so a containing item store can preserve reference identity. Negative counts and wrapping arithmetic follow the pinned methods, including mutations to an empty stack and consumption callbacks that change or fail after a copy is captured.

python3 tools/test_item_stack_storage_parity.py compares 7,856 fixtures with actual native ItemStack methods and small bound integer-component prototypes. The storage report records 568,580 matching lines per JAR. Comparisons include raw and visible state, component patch order, stack identity and item/component/count equality. Targeted Clippy passes. The fixture arena preserves canonical EMPTY aliases; a production inventory, full component values/codecs and complete item-use, equipment and game-tick integration remain pending.

item_stack_refs adds shared stack identity with automatic reference-counted lifetime management on the simulation thread. simple_container uses these references for get/set, merging, removals, reverse removal by type, clearing, capacity checks and item counts. Copies retain independent component patches; container slots and callers can deliberately share the same stack.

python3 tools/test_simple_container_parity.py compares actual native container and stack methods, including changes and failures in virtual size/change hooks. The container report records 590,402 matching lines per JAR. It checks alias identity, raw/visible counts, empty-stack references, component-sensitive merging, overflow, invalid indices and mutation prefixes on failure. In particular, native insertion into the first empty slot clears the remainder before limiting the inserted copy. Targeted Clippy passes. Player inventory, menus, crafting accounting, persistence, arbitrary getItem/setItem overrides and complete gameplay integration remain pending. Reference counting here has not been benchmarked as a performance gain.

player_inventory implements the 36 ordinary slots, seven mapped equipment slots, shared entity equipment, selected hotbar slot, picking, matching/crafting eligibility, removals, replacement, clearing and the change counter. Equipment retains populated entries when cleared. Stack and equipment references can be shared across inventories; replacing an inventory retains stack aliases.

python3 tools/test_player_inventory_parity.py compares actual native Inventory, EntityEquipment and ItemStack methods. The inventory report records 790,440 matching lines per JAR, including invalid-index failure prefixes, selected-slot changes, negative equipment removal amounts, ordinary versus equipment identity, self-replacement and shared equipment clearing. Components cover damage, unbreakable presence, a fixed enchantment and literal custom names. Native Map.of iteration order varies by JVM; fixtures explicitly supply equipment-map order to both sides when removing an aliased reference. Targeted Clippy passes. Pickup, inventory/equipment ticks, menus, recipe accounting, persistence, full component values and complete gameplay integration remain pending.

inventory_pickup composes player slot search and insertion with shared stack storage. Search checks the selected slot, offhand, then ordinary slots. Insertion consumes its source, preserves component-sensitive merging and pop time, and handles damaged stacks and creative fallback at their native callback points.

python3 tools/test_inventory_pickup_parity.py compares actual native Inventory.add/getSlotWithRemainingSpace, ItemStack operations and shared equipment. The pickup report records 424,282 matching lines per JAR, including source/destination aliases, callback mutations, failures, count overflow, invalid slots and the damaged copy-and-clear that happens before slot validation. Targeted Clippy passes. Native crash-report wrapping is represented as an error; diagnostic text is not compared. Item-entity pickup events, networking, inventory ticks, menus, full components and complete gameplay integration remain pending.

inventory_tick composes inventory/equipment iteration with ItemStack's pop-time update and ServerLevel-only item dispatch. It retains stack arguments across level callbacks, reads hotbar selection at the native point and observes changes to later equipment entries during the same tick. Aliased stacks can be visited more than once, with each visit updating their shared pop-time counter.

python3 tools/test_inventory_tick_parity.py compares actual Inventory.tick, EntityEquipment.tick and ItemStack.inventoryTick with custom item handlers. The tick report records 195,957 matching lines per JAR, including empty stacks, callbacks that mutate later slots, weakly consistent equipment iteration and failure prefixes. The client comparison uses an actual allocated ClientLevel for the non-server branch; the dedicated JAR uses null because ClientLevel is absent. Targeted Clippy passes. Registered items' individual tick effects, full entity and world ticking and complete gameplay integration remain pending.

player_equipment binds the main hand to the selected inventory slot and other equipment to the shared entity map. Hand/slot writes capture the previous item, store the new reference and then invoke the equip callback. Clearing the base equipment map does not clear the selected stack; clearing the inventory does.

python3 tools/test_player_equipment_parity.py compares actual PlayerEquipment and inherited LivingEntity hand/slot access over a real native Inventory. The equipment report records 408,852 matching lines per JAR, including selection changes, callback mutations/failures, old/new aliases, raw enum-map main-hand entries and the selected main-hand override. Targeted Clippy passes. Full onEquipItem effects, synchronized flags, active-use integration and complete gameplay integration remain pending.

The item-use interfaces now accept cloned shared references as well as small copyable handles. StackRef equality compares object identity; component/count value comparisons remain explicit. Captured references stay alive through callbacks that replace the active or held stack. The lifecycle fixture now uses the production reference-counted stack implementation.

The native regressions retain 144,736 lifecycle, 84,873 start-use and 108,690 eligibility/timing matching lines per JAR. Reports: lifecycle, start, eligibility. Targeted Clippy and all 20 horizon-world library tests pass. Hand queries and flags remain controlled in these fixtures; composing them with actual player inventory, synchronized flags and full item effects remains pending.

synced_values shares the synchronized scalar algorithm between bytes and floats, retaining Java boxed-float equality. living_use_flags binds the pinned byte field to using-item/offhand queries and signed-mask flag writes. Flag writes use the same write-before-callback, callback-before-dirty ordering as other synchronized values.

python3 tools/test_synced_bytes_parity.py compares actual byte SynchedEntityData and inherited LivingEntity flag methods. The byte/flag report records 572,100 matching lines per JAR, covering all initial bytes, signed masks, forced updates, assignments, reentrant callbacks, dirty packing and failures. The float regression retains 554,909 matching lines per JAR. Targeted Clippy passes. Mixed-serializer storage, entity schemas, wire codecs and full item-use/gameplay integration remain pending.

inventory_use binds living item-use ticks, completion, release and stop to actual player inventory/hands, shared stack references and synchronized byte flags. Equipment storage changes precede equip callbacks; synchronized flag writes retain their value/callback/dirty ordering. Effects receive the same mutable inventory, flag storage and active-use state.

python3 tools/test_inventory_use_parity.py compares inherited native lifecycle methods composed with real Inventory, PlayerEquipment and SynchedEntityData. The combined report records 349,310 matching lines per JAR, including live count mutations, selection/offhand changes, equipment callbacks, flag dirty prefixes, completion replacement and failed callbacks. Targeted Clippy passes. Item/level effects and the equip/synchronized observers are controlled; starting use, default observer reactions, consumables, kinetic combat, remainders/cooldowns and complete gameplay integration remain pending.

inventory_use::flags_updated implements LivingEntity's synchronized use-flag reaction. On clients, a using flag can select the held stack and query its duration; clearing use can clear the active stack and remaining time. Server notifications leave active-use state unchanged. Received assignments notify even when the byte value is unchanged, while ordinary unchanged writes do not.

python3 tools/test_use_flag_reaction_parity.py invokes the inherited native observer through actual synchronized writes/assignments, player inventory and equipment. The reaction report records 366,331 matching lines per JAR, including duration callbacks, empty-but-distinct stack references, signed masks, repeated received values, selection/count mutations and failures before dirty marking. Ordinary lifecycle operations are also exercised with the real observer reaction. Targeted Clippy passes. Other synchronized keys, start-use packet flow, full item/equip effects and complete gameplay integration remain pending.

inventory_use now binds start-use to stored inventory, shared active stacks and synchronized flag reactions. Server equipment synchronization precedes flag writes, followed by start vibration and the kinetic-enemy reset service. Captured stack/hand arguments and live state reads retain native callback ordering.

python3 tools/test_inventory_use_start_parity.py exercises inherited native start-use with actual Inventory, PlayerEquipment and synchronized storage. The start report records 9,506 fixtures and 223,004 matching lines per JAR, including native equipment packet construction, observer reactions, callback mutations/failures and clearing a populated kinetic-enemy map. Targeted Clippy passes. Packet encoding/delivery, the full kinetic-enemy map and combat, complete item/equip effects and full gameplay integration remain pending.

item_template implements immutable template construction, conversion from stacks, count replacement with native reference identity, current-prototype component lookup, creation and patch precedence. Strict validation checks damageable/stackable incompatibility before contained components and top-level size. A required component-schema service handles contained validation. Rejected creations return canonical EMPTY; rejected applied patches restore the exact previous raw patch, including redundant entries.

python3 tools/test_item_template_parity.py compares actual ItemStackTemplate and ItemStack validation with scalar max-stack-size/max-damage/damage components. The template report records 518,556 matching lines per JAR, covering zero/negative/overflow-edge counts, changed prototypes, component removals, aliasing and validation rollback. Targeted Clippy passes. Contained components and bundle-weight validation are not exercised by this corpus; their schema implementation, codecs, use-remainder integration and complete gameplay integration remain pending.

use_remainder converts a consumed stack using the validated item-template factory. Infinite materials and unchanged visible counts retain the original reference. An exhausted stack returns the created remainder; otherwise an extra item callback runs and the captured original reference is returned. Callback mutations and failures retain their native prefix.

python3 tools/test_use_remainder_parity.py compares actual UseRemainder with native template creation. The remainder report records 353,264 matching lines per JAR, including canonical EMPTY creation, empty-but-distinct inputs, reference replacement and callback failures. Targeted Clippy passes. The concrete actor inventory/drop handler, contained-component validation, finish-use side effects and complete gameplay integration remain pending.

bundle_weight implements checked native fraction construction, addition and multiplication, nested-bundle overhead, occupied-beehive weight and lazy caching of successful and failed weight calculations. Contained validation checks container sizes, then bundle sizes and weight, then charged projectile sizes. It does not recursively apply full strict validation to each contained item.

python3 tools/test_bundle_weight_parity.py compares pinned Fraction arithmetic, actual BundleContents and ItemStack strict validation. The bundle report records 137,332 matching lines per JAR, including overflow, negative template counts, changed prototypes, cached errors, nested bundles, bee presence, empty component visibility and validation order. Targeted Clippy passes. Typed schema adapters remain fixture-local; complete bundle inventory operations, codecs, item-use integration and full gameplay integration remain pending.

java_hash_map supplies default-capacity storage for non-null keys with native hash codes and a total comparable ordering consistent with equality. It retains linked bucket traversal, tree-bin root movement, red/black insertion/deletion, resize splits, iterator removal and structural-modification checks. Tree lookup uses the ordered tree; removed arena slots are reused.

python3 tools/test_java_hash_map_parity.py compares this API with the actual JDK 25 HashMap used by vanilla cooldown storage. The map report records 601,084 matching lines for each pinned-game classpath run, including all-key collisions, tree/list transitions, varied removal orders, iterator mutations and clear-on-empty behavior. Both runs use the same installed JDK; this is a collection comparison, not a gameplay parity claim. Targeted Clippy passes. Null/non-comparable keys, alternate map constructors and unexposed Map methods are outside this storage API. Concrete cooldown and gameplay integration remain pending.

item_cooldowns composes cooldown entries with native hash-map ordering. Adds store before start notifications; removals notify even for missing groups. Tick expiry removes before end notifications, rereads the live clock and preserves iterator invalidation after callback mutations. Percentages use native wrapping integer differences and float arithmetic. identifier supplies validated names, Java hashes and path-first ordering. UseCooldown converts seconds and retrieves the player cooldown manager before adding through the stack's current group.

python3 tools/test_item_cooldowns_parity.py compares actual ItemCooldowns and UseCooldown over real stack components, with controlled player/start/end callbacks. The cooldown report records 167,906 matching lines per JAR, including colliding identifiers, wrapping clocks, zero/negative durations, float edge cases, empty visibility, reentrant ticks and mutation/failure prefixes. Targeted Clippy passes. Complete item-finish integration, server cooldown packets and full gameplay remain pending.

item_after_use composes shared stack copying, item completion, validated remainder creation and cooldown application. The original stack is copied before the item handler; remainder, cooldown and count are captured from that copy before actor callbacks. The original copy reaches cooldown grouping even when the item handler returns another stack. use_remainder::convert_with permits creation and delivery to share the same mutable world without overlapping borrows. Templates and component patches support structural value equality.

python3 tools/test_item_after_use_parity.py invokes actual ItemStack.finishUsingItem and native remainder/template/cooldown implementations. The completion report records 211,804 matching lines per JAR, including prototype changes, original copies, empty aliases and mutations/failures at each effect boundary. The remainder regression retains 353,264 matching lines per JAR. Targeted Clippy passes. Item handlers and actor extra-item delivery remain controlled; concrete consumables, full inventory-use binding, contained schemas and complete gameplay remain pending.

extra_items::deliver connects server-player remainder delivery to actual inventory pickup. Failed insertion reaches the predicted drop service with the same remaining stack; successful insertion retains native count consumption and slot aliases. The drop service represents throwRandomly=false and Prediction::PREDICTED.

python3 tools/test_extra_items_parity.py composes native item completion, remainders and cooldowns with inherited ServerPlayer extra-item handling and real Inventory/PlayerEquipment. The delivery report records 272,124 matching lines per JAR, including full/partially filled inventories, offhand merging, aliased slots, creative material queries, partial insertion and callback failures. Targeted Clippy passes. Drop arguments are verified, but entity spawning remains controlled. Concrete item handlers, full contained schemas, complete use lifecycle and full gameplay remain pending.

food_properties implements the food consumption listener with stored FoodData and native random streams. It captures the actor's random source before the first sound, updates hunger and saturation for players, then emits the burp sound using the captured source and current position.

python3 tools/test_food_properties_parity.py compares actual FoodProperties.onConsume with real FoodData and both native random generators. The food listener report records 70,632 matching lines per JAR, including player/non-player actors, sound arguments, subsequent random state, changed food stores and positions, and callback mutation/failure prefixes. Targeted Clippy passes. Sound playback, complete consumable dispatch, particles/effects and full gameplay integration remain pending.

item_particles emits eating particles from one retained ItemStackTemplate. Each iteration reads the actor's direct random field and current rotations; eye-height and level callbacks preserve native evaluation order. Component mutations after capture do not alter the particle template.

python3 tools/test_item_particles_parity.py compares inherited LivingEntity.spawnItemParticles with real templates and both native random generators. The particle report records 143,167 matching lines per JAR, including exact position/velocity bits, empty stacks, negative particle counts, snapshot identity, float edge cases, random-source replacement and callback mutation/failure prefixes. Targeted Clippy passes. The fixture uses scalar damage component patches and controlled particle delivery; renderer enqueue, full consumable dispatch and complete gameplay remain pending.

consumable supplies consumption timing and particle/sound dispatch. Both eating and drinking pitch draws occur for every animation before particle callbacks. Sound overrides run afterward; volume and pitch retain their previously drawn values. Particle emission may use a different actor random source from the one supplied for sound selection.

python3 tools/test_consumable_emission_parity.py composes actual Consumable emission with inherited LivingEntity particles and real item templates. The consumable emission report records 124,732 matching lines per JAR, covering all animations, timing overflow and float edges, random-source aliases, optional particles, sound overrides and callback mutation/failure prefixes. Targeted Clippy passes. Sound playback, rendering, consumable completion/effects and full gameplay remain pending.

consumable now also runs eligibility, immediate/timed start and completion. Completion captures its random source before emission, selects the current item for server statistics, dispatches live component listeners, then runs server effects, the game event and finite-material stack shrink in native order. The same input stack is returned even when callbacks empty it. Timed starts return CONSUME without a transformed stack; immediate starts return that stack.

python3 tools/test_consumable_parity.py compares actual Consumable methods with concrete FoodProperties/FoodData, inherited particles, shared stacks and both native random generators. The consumption report records 246,033 matching lines per JAR, covering player/non-player/server branches, food component changes, stat item selection, empty advancement trigger storage, client/server effects, game events, creative material queries and mutation/failure prefixes. Targeted Clippy passes. Eligibility and start-use callbacks, statistics, effect bodies and event delivery remain controlled; listener enumeration here binds the ordinary food schema. Full advancement evaluation, potion effects, entity/world lifecycle integration and playable gameplay remain pending.

status_effect stores shared MobEffectInstance identity, scalar details, hidden chains and blend state. Native copies retain scalar details while omitting hidden effects and resetting blend state. Stronger/longer effect updates preserve hidden-chain aliases and native change flags. Duration mapping skips zero and infinite durations; scaling uses the pinned version's floor and narrowing rules.

python3 tools/test_status_effect_parity.py compares actual constructors, copy/update operations, duration mapping/scaling, equality and blend copying. The status storage report records 655,643 matching lines per JAR, covering constructor clamping, raw amplifiers, shared hidden chains, negative/overflow/infinite durations, float edges and mapper mutation/failure behavior. Equality excludes hidden and blend state as in vanilla. Mismatched-holder warning logs are outside the comparison. Server/client ticking, concrete effect behavior, registries and full entity integration remain pending.

consume_effect implements apply-status, remove-status, clear-status and sound consumption effects. Applying status effects draws probability even for an empty list, creates fresh native-style instance copies and visits every entry without short-circuiting on success. Removal preserves holder order and duplicates; sound playback captures block position before querying the actor's category.

python3 tools/test_consume_effect_parity.py compares the four actual native consume-effect classes with real effect instances and random generators. The consume-effect report records 184,437 matching lines per JAR, including NaN/probability edges, copy identity/details, hidden/blend resets, shared input mutation, return-value aggregation, sound arguments and callback failure prefixes. Targeted Clippy passes. Actor status add/remove/clear and sound delivery remain controlled; named holder-set rebinding, teleport consumption and full gameplay integration remain pending.

teleport_consume implements random-teleport consumption, including the 16-attempt limit, coordinate/random evaluation order, logical-height bounds, dismounting and post-success effects. Successful teleports emit the game event, class-specific sound and optional packed directional-particle event before resetting fall distance and impulse context.

python3 tools/test_teleport_consume_parity.py compares actual TeleportRandomlyConsumeEffect with both native random generators, ordinary and fox actor classes, native offset packing and fall/impulse reset bodies. The teleport consumption report records 282,010 matching lines per JAR, including exact candidates and subsequent random state, height overflow, float edges, attempt exhaustion, captured/live positions and callback mutation/failure prefixes. Targeted Clippy passes. Destination validation and teleporting, passenger links and world event delivery remain controlled services; full gameplay integration remains pending.

status_effect also implements server/client ticking and client blend updates. Hidden instances count down with their parent. When the active duration reaches zero, the hidden details are restored before the server downgrade callback. Infinite effects use the actor's tick count for scheduling. Blend updates retain native callback/read ordering, duration-dependent steps and interpolation.

python3 tools/test_status_tick_parity.py compares actual MobEffectInstance ticks, skipBlending and getBlendFactor with controlled MobEffect callbacks. The status tick report records 412,552 matching lines per JAR, including shared hidden chains, zero/negative/infinite durations, raw amplifiers, early application failures, downgrade notifications, blend float edge cases, removed actors and callback mutation/failure prefixes. Targeted Clippy passes. Registered effect behaviors, entity effect maps, UI rendering and full gameplay remain pending.

java_hash_map now supports non-comparable keys, unequal keys whose comparable ordering returns zero, and the native map-copy constructor. Lookup searches ambiguous tree branches; tree insertion uses class/identity tie-breaking. Copies size their table from the source count before insertion, retaining shared values while allowing the resulting bucket order to differ.

python3 tools/test_java_identity_map_parity.py compares actual JDK 25 HashMap operations and copies across mixed key classes. Each Java process exports its actual identity hashes for Rust to use in that same scenario. The identity/copy report records 577,200 matching lines per classpath run. The ordered-key regression retains 601,084 matching lines, and the cooldown regression retains 167,906 matching lines per JAR. Targeted Clippy passes. Map-only runs use the same installed JDK; these comparisons do not assert gameplay parity or equal identity hashes across processes. Keys must have pure operations; null keys and other unexposed Map APIs remain outside this storage subset.

PlayerAttributeHealth, ServerPlayerDamage and ServerPlayerCombat can now borrow LiveAttributes, the same storage used by the resident moving player, as well as EntityAttributes. Health limits and armor queries use the borrowed store; equipment damage callbacks can update it before damage reduction reads armor and toughness. Player absorption retains synchronized float storage.

The live player combat comparison runs the identical corpus through both stores and matches 1,176,994 output lines against each pinned Java reference. It covers repeated hits, cooldowns, health and absorption writes, exhaustion, numeric edges, armor mutation during a hit and callback failures. Equipment, attribution, death services and other world consumers retain the controlled boundaries documented in the report. Connecting this binding to the resident client landing consumer remains the next step.