Captures the decoded placement grid, the four legacy frequency reducers,
the full ruined-portal findGenerationPoint and findSuitableY algorithms
with their exact draw order, the template name arrays, and the fixture
marker coordinates that pin the grid to vanilla. This is the working map
for the piece-placement ports that follow.
Loads the 26.1.2 structure datapack: 20 structure sets, 34 structure
definitions, and the worldgen biome tags they reference. Random-spread
placement follows RandomSpreadStructurePlacement byte for byte — region
floorDiv by spacing, one Legacy stream salted per region, two
spread-type draws for the offset — and the four legacy frequency
reducers keep their exact draws, including the hardcoded buried-treasure
salt and the outpost's discarded full-range int.
Verified against the fixture: on seed 12345 the ruined_portals set
claims exactly chunk (1,0), the chunk whose captured blocks carry the
ruined portal's obsidian, gold, and crying obsidian. TestStructure-
PlacementGrid pins that plus village separation invariants.
Ports MonsterRoomFeature from bytecode with vanilla draw order and loop
structure: shell validation (solid floor and ceiling, one to five open
side columns), interior cave_air carving, cobblestone walls with the
mossy three-in-four floor roll drawn only where vanilla draws it, chest
placement faced away from its single opaque neighbour with the loot-seed
long consumed even though block entities are not modelled yet, and the
spawner's one-draw mob pick. Writes go through Feature.safeSetBlock
semantics against #minecraft:features_cannot_replace, captured verbatim
from the jar into the embedded datapack data.
The pass slots between geodes and the ores so the rooms' cave_air
pockets exist before ore ellipsoids roll their air-exposure discards.
The committed fixture's four chunks happen to contain no dungeons, so
measured parity holds at 98.028%, but the generator's output can differ
elsewhere: generatorVersion bumps to 22.
All three jobs move to [self-hosted, windows]. The race job now adds the
machine-wide MSYS2 mingw64 toolchain to GITHUB_PATH: the runner service
account only sees the machine PATH, which has no C compiler, so -race
could not build its cgo runtime. The dead verify.yml.selfrun file goes
away — GitHub never reads that suffix and its content already lives
here.
The featureless capture settles what the 98.028% gap is made of: base
terrain is bit-exact, so the drift comes from air-writing features
(monster rooms, geode voids, lava lakes) that vanilla runs before the
ores and the region replay does not cover yet. Both files now point at
monster rooms as the next step instead of at carver and aquifer edges.
TestVanillaBaseTerrainParity compares our noise+surface+carver+aquifer+
vein pipeline against a vanilla capture whose biomes carry no features
and no structure sets: all 393,216 cells match. The plain-state fixture
mismatches the base-terrain diagnostic used to attribute to carver or
aquifer defects are therefore feature outputs wearing plain states —
monster-room cave_air, geode voids, lava-lake lava — and its doc comment
now says so.
-featureless derives a world datapack from the server jar (inner server
or bundler layout): every biome keeps its carvers but loses its feature
stages and every structure set loses its structures, so the capture is
pure noise terrain with surface rules, carvers, aquifers, and veins.
-blocks-only writes a blocks-only RIOBASE1 fixture for it. -port avoids
colliding with something else already listening on 25565.
CLAUDE.md still claimed there was no placed/configured feature system and
that ores never generate below y=0; both stopped being true when the
stage-6 region replay landed. Document what the replay covers, which
decoration stays hand-written, the measured parity baseline, and the new
env-gated base-terrain diagnostic. README gains the same correction plus
the 966-cell base-terrain measurement.
Splits fixture mismatches into classes that name the responsible
subsystem: plain-vs-plain cells are direct base-terrain defects and come
with sample coordinates, single-side feature states count as flips per
family, and disk-shaped outputs land in an ambiguous bucket so they
cannot pollute the plain signal.
First run on seed 12345: 966 base cells (0.246%), dominated by vanilla-
carved cave segments missing from our carver output and deepslate-to-
water aquifer edges.
The combined stage-6 pass in placeScheduledUndergroundOresStage already
replays ores, underwater magma, and disks in datapack order; the separate
placeScheduledDisks and placeScheduledUnderwaterMagma passes have no
callers left. Keep the per-position helpers the combined pass and tests
use.