Project

To be verified

The rolling runClient checklist. Open issues are reproducible in-game and not yet fixed; still to verify is built but not yet confirmed in a play session. Confirmed items are deleted, not ticked — the session log’s “Owner-verified in-game” entries are the permanent record.

The test kit

Spawn Test Horse World (DebugTestWorldHandler.fillInventory) hands out one hotbar at a time: themed batches covering what is below, a batch deleted once worked through, batch 1 on login. Behaviour first (owner, 2026-09-11: test “stuff that isn't just does this look pretty in-game”) - batches 1 and 2 are §0-BT's own ranking of what fails badly rather than visibly, and most of batch 1 is left running rather than watched and the rest with /testkit n (/testkit alone lists them; each batch's legend ends with a clickable link to the next). Swapping a batch empties the hotbar only. Its preset eggs carry a genotype and no epigenome, so every horse from one egg rolls its own numbers - knob-placed marks land somewhere new each time. Every batch that tames carries a stick, every one that breeds carries golden carrots. Two clickable /tps on login go to the nearest plains village and dark forest. Four of those tests need files the kit cannot make, so the dev run's run/phc/ was prepared for them on 2026-09-11 and a dedicated server confirmed all four load: breeds/kit_forest_paint.json (chestnut paints, dark forest), kit_night_cremello.json (dark forest, night only), kit_broken_gene.json (logs a missing-gene warning, loads anyway), kit_zz_duplicate_friesian.json (refused); genes/aurora.json (the example gene, “1 dropped in”); and breed-spawning.toml with the Friesian moved to dark forest only and the Morgan switched off. Delete them to put the dev run back. Those six files are in the repo now, at neoforge-26.1.2/tools/testkit/ — whose README.txt is also the one-page answer to “how do I start testing”: the button, the /testkit commands, the fixed plains seed and the two things that waste an hour (rebuilding under a live client; runServer while the client holds run/). It has a note saying how to put the drop-ins back — they had only ever existed in the .gitignored run/phc/, which is to say on one laptop, so a fresh clone could not reproduce any of the four checks.

§0-DD — The ward test that gap 210 said could not be run (2026-09-13, NOT looked at)

Stand on the teal wool. That is the whole instruction.

At the far end of the yard: a block of cyan wool on the walkway, and thirty blocks past it two identical dark chambers, one holding a warded horse and one holding a plain one. Stand on the wool overnight.

Why it is built this way, because every dimension of it is load-bearing

Pass: the control fills and the warded chamber does not. Both empty means the spawn rule is wrong rather than the gene — which is precisely what the control is there to tell you, and what no previous version of this test could have distinguished. The census counts the creatures in each chamber every two minutes and every spawn logs its reason, so the morning reading is two columns of numbers rather than an impression.

Shut both doors

A chamber with its door open is a lit chamber, and a lit chamber spawns nothing. That would read as a perfect ward on both sides.

§0-DC — Four coat genes redrawn, and a biome that spawns zombies (2026-09-13, NOT looked at)

Each of these fixes something the owner named, and three of them are shape rather than colour
And the dimension can spawn hostiles now, which changes what two tests mean

A new biome, horsegenetics:debug_pens, replaces minecraft:the_void and carries zombies in its monster spawner list. That is the thing gap 210 said was impossible: the ward's real claim — that hostiles do not spawn near a warded horse — can finally be tested, because there is finally something for it to stop.

Two consequences, both handled. A sealed unlit box now fills with zombies overnight, so the glow room carries invisible light blocks at level 1 — enough to stop spawning, still black to the eye, and a glow is judged against the room rather than against absolute dark. And “is the spawner producing” stops being answerable if a natural zombie looks identical to a spawner one, so every monster spawn now logs its reason. That distinction is load-bearing: the ward lets spawner mobs through on purpose, so a spawner zombie beside a warded horse is expected and a natural one is the gene failing.

§0-DB — The night loci, testable for the first time (2026-09-13, NOT looked at)

These were unwatchable rather than untested, and nobody knew which

§0-AT has said since 2026-09-09 that "the night loci - behaviour, so nothing here is confirmed by a render". Two whole loci, night temper and night watch, that nobody has ever seen do anything. The reason turned out to be the dimension, not the genes: the horse dimension had no night, because a dimension_type needs timelines as well as a default_clock and it had only the clock. Every night-gated gene in the mod sat inert in the one place built for watching genes.

Fifteen stalls, one per behaviour, in two rows at the back of the yard. Every variant gets its own, because the variants are the point — they differ by who they are about (riders, herds, monsters, everything) and a single pen would answer for one and leave the rest exactly as unproven as they are now. It is a walk down two rows with /testkit night run once.

§0-DA — Two more things the night can answer for free (2026-09-13, NOT looked at)

Both were already-open questions that needed no new apparatus

The measuring half is built, so the marginal cost of another test is a pen or a counter. These two were picked because the thing that would answer them was already running.

And two ridden pens, which are a different shape from everything else here

Every other pen in the yard is watched. These two need a person in the saddle, so both horses come already saddled — a ridden test whose first step is “find a saddle” is a ridden test that gets put off.

And one that was quietly measuring nothing

The ward pen. See §0-CW, which now says the opposite of what it said this morning — it is worth reading before the night rather than after.

§0-CZ — Dryad is nine alleles now, and intimidating pushes properly (2026-09-13, NOT looked at)

This changes a locus's allele set, which is the most disruptive thing a change here can do

Dryad went from Dry/n to nine variants plus the wild type. That rewrites the locus's founder table and every genotype string that mentions it. Any horse in an old save carrying Dry has an allele that no longer exists. Dev-only, single tester, no saves worth keeping (hard rule 6) — but start a fresh test world rather than wondering why an old one reads oddly.

What to check, in order

  1. A matched pair plants its own species and nothing else. Spawn Oak/Oak and Spru/Spru and leave them in the yard. The watch names the block, so the log answers this without anybody looking.
  2. A mixed pair plants both, at half rate. Oak/Brch should leave roughly as many things per hour as Oak/Oak does, split between the two. This is the new rule and nothing has ever exercised it.
  3. A carrier still does nothing. Oak/n is the control — if it plants, the recessive-to-wild-type half has broken and the whole locus is now dominant.
  4. Dark oak makes a square. Dark/Dark, left alone. The saplings should cluster rather than scatter, and a tree should eventually appear. This is the one most likely to be wrong, because the clustering search is new code with no test behind it — and it fails invisibly, as a pen of saplings that never become anything, which is exactly the symptom it was written to cure.
  5. Mushrooms only appear where they survive. Mush/Mush in daylight on grass should plant nothing at all — that is the pass, not a failure. Put one in the yard's dark spawner room, or on mycelium, and it should plant there. If mushrooms appear in the open and vanish a tick later, canSurvive is not being consulted.
  6. Bone meal never touches a crop. Bone/Bone beside a wheat field is the test that matters, and the one with a design decision riding on it. It should hurry saplings and grass and leave every crop alone.
  7. Intimidating: the number should move. The yard measures it automatically. Tonight's baseline is a median nearest-cow distance of 4.2 blocks with 63 of 64 readings inside 8. If the path-based repel works, the median should sit at 8 or more and stay there. This is the first change in the mod measured against a number collected before it was made.
What the watch will tell you without being asked

The DRYAD pen counts saplings, logs and leaves; the census names the block and the delta. So most of the list above is answerable from grep '[watch]' in the morning rather than by standing in a pen. What it cannot see is a mushroom that was planted and popped — for that, the block placed event lines are the evidence, and their absence is the pass.

§0-CY — The first night's readings (2026-09-13, read off the log)

Three hours unattended, and it worked — including the part where it caught its own tests being wrong

The run started 23:07 and was still going at 02:04: 89 censuses, a flat entity count (154–155, so nothing leaked) and a flat 50.0 ms per tick throughout. The watch did the job it was built for. What follows is what it found, and two of the six pens turned out to be testing nothing — which is itself the result, and the reason the census prints every pen whether it moved or not.

Dryad — confirmed, for the first time ever

00:00:03 a sapling appeared; 00:01:09 it grew. Six oak logs and fifty-two leaves, seventy seconds apart, in a pen that had been bare grass. That is the whole gene working end to end — plant, then vanilla's own random ticks — and it has never been seen before, because until yesterday the dimension forbade the spread verb and before that the plot had the wrong floor.

But it planted three times in three hours, not twenty, and the reason is worth knowing because it applies to every spreading gene. GeneAbilityHandler.spread picks one random block per interval, from a cube of radius around the horse with a vertical offset of −1, 0 or +1, and gives up silently if that block will not convert. For a sapling the only offset that can ever work is 0: −1 is the grass block itself and is not air, +1 is air with air under it. So two thirds of the dryad's attempts are thrown away on geometry, and its effective rate is about a third of the 9 000–32 000 ticks its page advertises. Not a bug, and worth saying out loud on the gene's page (gap 208).

And one in six of its saplings can never grow at all. saplingFor picks from six species by position hash, and one of them is dark oak, which vanilla will only grow from a 2 × 2 block of saplings. A lone dark oak stands for ever: one was planted at 01:28 and was still a sapling at 02:04, while the oak next to it had become a tree in seventy seconds, and a third position logged ten failed growth attempts between 01:15 and 02:01. Fixed the same day by putting the species on the allele and clustering the dark oaks - §0-CZ, and the gene's page.

It also plants outside its own pen. A radius does not respect a fence: saplings appeared at z 110 with the pen's back wall at z 107, so the watch box under-counts. A test-design fault rather than a gene one — the box wants to be wider than the radius.

Egg layer — the cap never fired, exactly as predicted

Ground count peaked at five against a cap of eight, sat at two or three most of the night, and of 57 eggs removed every single one despawned — not one was picked up or refused. That is gap 207 confirmed by measurement rather than by arithmetic: four layers in one six-block circle still cannot outrun vanilla's 6 000-tick despawn, so nearby_cap is decorative in any real game. Either it wants an interval that can outpace the despawn or the verb's page should say the despawn is doing the work.

Holy ward — no data at all, and the control caught it

A vanilla spawner is not an unattended test

Zero monster spawned lines from the yard's spawner in three hours. BaseSpawner.serverTick begins if (this.isNearPlayer(...)), and requiredPlayerRange is 16 blocks. The spawner only runs while somebody is standing next to it, which is the one thing an overnight run guarantees nobody is doing.

The fix costs nothing and needs no code: AFK inside or beside the spawner room. Every other pen is force-loaded and runs regardless of where the player stands, so the spawner room is simply the best place to leave the character. Alternatively the field is settable through the block entity's RequiredPlayerRange NBT, but standing in the right place is free.

Worth noting what did work: §0-CW's control line — “if the log has no monster spawned lines anywhere, stop there, because a silent spawner and a perfect ward look identical”. Without it, three hours of no hostile spawns beside a warded horse reads as a triumphant pass.

Intimidating — looks like a failure, and wants a person to confirm it

64 readings, and 63 of them are inside the radius the gene claims

The gene says everything that is not a horse is held outside a radius written on the allele copy, at least eight blocks. Measured: median 4.2 blocks, upper quartile 5.4, maximum 8.0, minimum 0.6, over sixty-four readings across three hours. The cows started at three blocks and never got meaningfully further away.

It is not doing nothing — a shove is a velocity nudge of 0.35 every twenty ticks, and a cow that walks back in between beats will sit wherever the two balance. But “pushed out and held out” is not what this reads like. The candidates, in order: the aura is not firing at all (check for a repel in the horse's resolved ability list, not its genotype); the shove is too weak against pathfinding; or the pen is too small for the effect to be legible. Do not fix it from this alone — go and watch one for a minute first, because a velocity nudge that works and one that does not look different in a pen and identical in a column of numbers.

Hot blooded — it thawed, it did not flood, and it stopped early

Snow 81 → 62, ice 18 → 3, water 0 → 32, all of it inside the first fifty minutes and then completely static for over two hours. Two readings out of that:

Everything else

§0-CX — The overnight watch, and a yard that runs itself (2026-09-12, NOT looked at)

The running build is one commit behind, deliberately

The tick-time threshold fix (BEHIND_MS) is committed and type-checked but not in the client that ran the night of 2026-09-12: rebuilding would have overwritten the classes under a live client. So that night's log says BEHIND, the server is not keeping up on roughly half its census lines at exactly 50.0 ms/tick, and 50.0 is the healthy reading - this measure is wall-clock divided by ticks, and a server that keeps up sleeps out the rest of each tick, so it can never read less. Only a figure clearly above 55 means anything.

This is the whole night. If step 2 says nothing is being watched, stop and fix that first

The owner's brief: “I'm going to leave the game and the horse dimension running over night. Add as many time-reliant tests as possible, focusing on those that don't require direct intervention from me.” That is a different design brief from the one the yard was built to and it rules out more than it lets in — a test belongs in there now only if it starts itself, runs on a clock, and leaves something readable in the morning.

The third of those is the new part, and it did not exist. ActionTrace logs things a person does; every overnight test is the opposite — a sapling that appeared, snow that stopped melting, eggs that piled up and then stopped. None of those is an event anybody fires. They are differences between two readings, and nothing in the repo took readings. DebugWorldWatch does.

Before walking away — four things, in this order

  1. Go through the hay portal. The yard is built when you enter the dimension, and so is the watch. No portal, no night.
  2. Run /testkit census. It prints every watched pen to the log at once. This is the check that costs one line of chat and saves eight hours — if it answers nothing is being watched, the night will record nothing and there is no way to tell from inside the game.
  3. Stay logged in and out of the pause menu. Singleplayer stops the server on Esc; a paused server ticks nothing at all. The yard's chunks are force-loaded, so where you stand does not matter — only that the game is running.
  4. Do not leave the horse dimension. Leaving tears the plot down, and the night with it.

What it writes, and how to read it in the morning

Everything is prefixed [watch], so the night is one grep: grep '\[watch\]' neoforge-26.1.2/run/logs/latest.log. Two clocks and a pile of event hooks:

What each pen should say by morning

Three fixes underneath it, none of them visible

§0-CO — Glow is a level, not a bit (2026-09-12, the levels are confirmed; the list below is what is left)

Confirmed 2026-09-12 — and the predictions held

Gamma, geode and angler look right, and ember veins and data rain have no falloff at all — which is what the measurements said should happen before anybody looked: those two are hard-edged by construction (0.04 to 0.2, and soft bands times a SPECKLE), so coverage-times-level is level-or-nothing there. The softest lit mask in the mod is gamma's SPOTS at 1.8 and it is the one that shows the change.

So the glow level works, it is scaled by coverage, and it is invisible exactly where the geometry says it should be invisible.

And the control held: suntouched “does indeed look the same as before”. That is the one that mattered most, because it lights whole parts at full alpha through the glow effect rather than through a coat layer — so it exercises the same new alpha path with none of the new arithmetic. Unchanged there plus changed everywhere the masks are soft is the pair of readings that says the level reached the renderer without disturbing what was already right. §0-CO is closed.

Every glowing gene in the game changed, and nothing here can see it — test kit batch 2

A layer's emissive is a number now, and the mask's coverage scales it: the old threshold at coverage 0.5 is gone, so every soft-edged glow that used to end on a line now fades out. Fifty-two layers across the shipped genes say "emissive": true and every one of them is affected. The arithmetic is covered by GlowIntensityTest; what no test here can reach is what it looks like, because the glow only exists in a render, at night, in a world. The creator does not draw it either — its preview is a flat sheet with no lighting to be brighter than.

Before asking for a play session, do these three things

Owner's rule, 2026-09-12. She is the only person who can run the game, so time in it is the scarcest thing in the project - and a session that re-checks finished work spends it twice.

  1. Audit the test kit. Every batch in DebugTestWorldHandler.BATCHES, against this page: a batch whose section is confirmed is deleted and the rest move up; a batch with a confirmed item in it gets that slot re-aimed. Batch 1 is always the next thing that needs a person.
  2. Audit the horse dimension. Are the structures in it still for something open, or is one of them left over from a test that finished?
  3. Put the whole list in chat - numbered, in order, each step saying what a pass looks like. “Go and look at the yard” is not a test; it is a thing to work out first.

§0-CV — The pens that run themselves (2026-09-12, NOT looked at)

These cannot be answered by standing still

What is left in the yard is the tests that need time rather than attention. That is what a private dimension is actually good for. Each one's pass condition, and what the log should say, is on §0-CX above; this is the index.

Gone from the yard, by the owner's call (2026-09-12): the spontaneous-breeding field and the pack leader's pen — “we're done with those tests”. Verdant's three floors went the same way when they were confirmed. One question leaves with the breeding field and is worth recording as dropped rather than answered: whether LOCAL_CAP actually stops an automatic breeder. The breeding is confirmed; the cap never was, and an uncapped one is the classic way to kill a server. Say the word and the pen comes back.

§0-CW — Holy ward: the yard tests the half that is not the headline (2026-09-13, NOT looked at)

This section used to claim the opposite, and it was wrong twice over

It said a night of spawn distances would show the ward working. It cannot, for two independent reasons either of which is enough (gap 210):

  • The ward lets spawner mobs through on purpose. GeneWardHandler.isNatural gates on the spawn reason, and spawners, eggs, breeding, structures and commands all pass — because a gene that silently broke somebody's mob farm is the failure that whole design exists to avoid. The yard's zombies are mobs a working ward is supposed to ignore.
  • Natural spawning cannot happen in that dimension at all. debug_pens generates minecraft:the_void, and the void biome has no mob spawn entries. There is nothing there for a ward to cancel, at any light level, at any distance.

And in a real world the warding half only bites more than 24 blocks from every player, since vanilla never naturally spawns a monster closer and the ward reaches 8–16 (gap 180). So the gene's headline claim has never been tested, and cannot be tested here.

What the pen does test, and §0-BT ranks it higher anyway

That a warded horse does not break a mob farm. The ward hooks FinalizeSpawnEvent — a global, high-frequency event shared with every other mod in the pack — and if its allow-list is wrong, a spawner stops producing and nothing anywhere says why. That is the failure that damages somebody else's world, and it is the one this pen can actually catch.

Pass: a steady stream of monster spawned lines beside the warded horse. Fail: silence. And this is the pen that needs you — a vanilla spawner will not run unless a player is within 16 blocks (BaseSpawner.requiredPlayerRange), which is why three hours unattended produced nothing at all last night. AFK in the spawner room. Everything else in the yard is force-loaded and does not care where you stand, so that room is simply the right place to leave the character.

Testing the real claim, when somebody wants to

It needs a real world, not the yard: a dark room, a warded horse and an unwarded control room the same distance away, both more than 24 blocks from where the player stands, left overnight. The watch already logs every hostile spawn with its distance to the nearest live ward, so the apparatus exists — it is the place that does not.

§0-CS — The horse dimension's test yard (2026-09-12, NOT looked at)

Built by code nobody can watch run — so the first check is that it is even there

Thirty blocks right of the arrival road, through a door in the corridor wall: a walled yard of signed pens. See the dimension page for the plan and what is in each one. It replaces the first pen on that side.

A pen for an answered test is the most expensive thing in this project, because it spends the one resource that cannot be bought back. So the yard is audited against this page every time the page moves, and a confirmed test's pen is deleted rather than left standing with a tick on it. Gone that way already: verdant's three floors, the pack leader's cows, and the spontaneous-breeding field.

§0-CR — The kit breeds, and Make egg works (2026-09-12, NOT looked at)

Two tools that did not work, both found by using them

The kit only ever handed out mares, and HorseBreedingHandler cancels same-sex pairings - so batch 3's spontaneous-breeding test ("spawn FOUR in a wide fenced field, come back and COUNT") had never once been runnable, and the starburst breeding slot written the same morning inherited the fault. Every batch that breeds now carries both sexes, and that is written into the class as a rule rather than left to the next author.

"Make egg" sent no packet at all. The right-hand column's seven full-width rows plus the three pinned below them do not fit a 270px window (1080p at GUI scale 4); the groups overlapped, the top one is registered first, and so "Clear genes" sat on top of "Make egg" and took its clicks. Since reset() on an untouched horse changes nothing you can see, it read as a dead button. The toggle and Clear now share a row (six rows, not seven), and the screen warns in the log if the two groups ever collide again rather than silently eating clicks.

§0-CQ — F8's highlight no longer crashes the server (2026-09-12, NOT looked at)

A crash in a feature that ships in real builds

The horse highlight took every nearby horse off the herd-lead scoreboard team, including the ones never on it, and Scoreboard.removePlayerFromTeam throws for those. It hid as “F8 only turns on” for four minutes and then killed the integrated server from the auto-off tick. This is not dev-only: the binding is registered outside the production gate because the testers asked for it, so a real jar can hit it.

§0-CP — Starburst scales, Lantern and Tron burn (2026-09-12, the scaling is confirmed)

The first three genes to use the dial — and the first horses that differ in a way you can measure by eye

These are what make §0-CN and §0-CO real. All three changed their own coat golden rows and nothing else's, so the blast radius is exactly these loci.

This is test kit batch 1. runClient, press Spawn Test Horse World, and the hotbar you are handed on login is this list: six eggs, golden carrots to breed them and a clock, because half of it is a night test. /testkit offers /time set midnight beside the batch list. The world is the same plains every time — the seed is fixed (DebugTitleScreenButton.TEST_WORLD_SEED) so that what differs between two screenshots is the mod and not the weather.

The scaling reads right — owner-confirmed 2026-09-12

“The starburst does indeed look like a smooth variety of sizes.” That was the open question and the one nothing in the repo could answer: a pointsMin floor of 45% with a uniform dial over 0.45–1.0 gives a continuum rather than two sizes with a gap, so the floor does not want raising and the morph is doing what it was built to do on a real horse.

It is the first evidence that a drawn marking that erases down is worth having at all, which is the thing the whole feature rested on. What is still unseen below is everything else about these three genes.

§0-CN — The dial, the minimal shape, and the slider (2026-09-12, NOT looked at)

Three genes use it now — see §0-CP below

A knob may be marked "dial": true, and a PATH may carry pointsMin — the same shape at the gene's weakest, morphed point to point as the dial falls, so a drawn marking gets smaller rather than fainter (the format). Fifteen headless checks drive the canvas and the slider, and an answer table in the parity fixtures compares the morph itself in both engines. What no script can say is whether it is worth drawing with — and three genes carry one now, so there is something to look at: §0-CP.

§0-CM — A third-party mod can add a gene (2026-09-11, NOT looked at)

The one thing here that no test can reach

RegisterHorseGenesEvent compiles against 26.1.2 and its firing point is read off the loader's own ModLoader.constructMods (fancymodloader 11.0.15): every mod is constructed, each gets FMLConstructModEvent, and only then is the deferred work queue drained on the sync executor — so a task enqueued from that handler runs exactly once, after the last mod exists and before any registry event. That reasoning has never been run. Everything on the common/ side of it is covered by GeneApiTest; the event itself needs a second mod, and there is not one.

The cheap check, with no second mod at all: boot the game or a server and look for the line [genes] 0 gene(s) registered by other mods; the registry is frozen at N segments. If it appears, the event fired and the freeze happened at the right moment; if it never appears, the enqueued task never ran and the reasoning above is wrong. N must equal the segment count ModGeneSpecs logs two lines earlier.

§0-CL — The PATH drawing canvas (2026-09-11, NOT looked at)

Not a runClient item — it is a control in the creator, and no gene file changed

Open the gene creator, add a PATH mask (or load Prismatic, which carries two), and the points parameter is a horse you can draw on. Forty-one checks of it run in headless Chrome — clicks land where aimed, a drag moves one handle and no other, the midpoint marker inserts in order, right-click deletes, the textarea and the canvas agree in both directions, and all three planes map their two axes at one scale — so what is unlooked-at is not whether it works but whether it is pleasant, which no script can answer.

§0-CK — Feeding says when it did nothing, and a favourite is never refused (2026-09-11, NOT looked at in game)

Reported as “the diet gene doesn't appear to work”

Investigated and the locus does express - roughly one horse in eight is on a special diet, and feralOnly means breed horses can carry it too, so it is not that they are absent. What was missing is feedback: feeding a horse that is already on full health and at max bond (or capped for the day) spends the item and gives it nothing, silently. Same for the favourite. That is indistinguishable from a gene that does nothing, which is how it was read.

§0-CJ — A hay portal every 25 pens in the corridor (2026-09-11, NOT looked at in game)

Every 25th segment is a break with a portal home instead of a pair of pens — 41 of them, one every 175 blocks. Written up on the horse dimension. What to look at:

§0-CI — Gene and allele pickers on My horses (2026-09-11, NOT looked at in game)

The browser's filter language has understood gene:SB1 since it was written; what it has never had is a way to find out that SB1 is something you own. Two buttons beside the filter box now list only what is in your roster - common/horse/RosterGenetics - and picking an allele writes the term into the box rather than doing anything new, so the filter language stays the one thing that does the work.

It inherits the roster's cap

The lists are built from the same client-side roster the tab filters over, which is capped (gap 76). So they describe the horses the tab can see, not necessarily every horse the player owns - and on a big stable a gene held only by a horse past the cap will not be offered. The honest fix is the same owned-horse index gap 76 wants; until then this is one more consumer of the cap and one more reason to build it.

§0-CH — Horses come to food, and run for a favourite (2026-09-11, NOT looked at in game)

server/FoodTemptGoal, written up on horse care. Two speeds, and the gap between them is the feature. What to look at:

§0-CG — Confirmed by playtesters (2026-09-11)

Five things now stand confirmed, from outside testers rather than the dev machine
  • Bareback steering at a high bond works. This is the one worth noting twice: it was still listed on the roadmap as unbuilt (“riding without a saddle gives no control today”) while server/BarebackSteeringHandler had been shipping it all along. Written up now on horse care.
  • A horse can be ridden through water — wanted, not a bug. Vanilla swims a ridden horse; the water_averse ability is what adds ejection, so a plain horse swimming is correct.
  • Breaking the equine research shelf drops what is inside it.
  • Setting a barn name works, and so does clearing one — the first report said it could not be erased, and it could; it takes a beat to refresh. That refresh lag is the only thing left here: the client's cached record updates a tick late, which is cosmetic but reads as a failure.
  • Destroying a horse-dimension portal stops its animations.
One report still open: an “aura” of glowing entities round a horse

A tester saw entities near a horse in the horse dimension outlined by the glowing status effect, while not riding it. MobEffects.GLOWING is applied in exactly one place in the modserver/DebugHighlightHandler, the F8 toggle — which lights every horse within 96 blocks, and the horse dimension is wall-to-wall pens. So the first thing to check is whether pressing F8 again stops it.

If she is on a released jar, that does not fit: F8 was dev-only until 2026-09-11, so a real build could not reach it. Establish which jar before looking further. The toggle now times out after four minutes and says how to stop itself, which is hardening rather than a fix.

§0-CF — A GOO mask, and the drips rebuilt on it (2026-09-11, NOT looked at in game)

Owner's report on the first look at the drips: ooze drip “looks like triangles” and needed to be “more irregular and curved”, and both drips left “weird gaps on the top of the horse”. Rendered side-on and from above at several seeds; parity green, and watched go red. Design: the mask table.

§0-CE — The breeds and size test batches: confirmed (2026-09-11)

Owner-confirmed and removed from §0-CA / §0-CB / §0-CC, kept here for the session log: the custom egg's Breed list starts at Feral Mixed and carries drop-in breeds; the gene hover picture on the custom egg; a drop-in breed registers, fills its Breeds row and shows its About text; its herds spawn wild in the biome it names (15 kit_forest_paint herd founders logged in a dark forest - the breed_herds biome modifier works); a drop-in gene loads and draws; a switched-off Morgan keeps its label and entry; a moved Friesian's entry gives the new biome. The log confirmed the broken-gene breed loads with a warning and the duplicate Friesian is refused.

Then, from the log of the dark-forest trip and the size batch: Friesian herds found in the dark forest (the moved biome); kit_night_cremello herds founded only after nightfall (9 after /time set night, none before); no Morgan egg in the creative tab; a Shire towers and a Falabella stands below the waist; each size founder carries the number of copies its band says; and two Small/n Connemaras threw all three kinds of foal - Small/Small (0.73x, 0.84x), Small/n (0.88x) and an ordinary-sized n/n at 1.00x.

Fixed and confirmed the same day: the debug stick now fires the tame event (it called tameWithName bare, so a stick-tamed horse never filled its Breeds row). New: every breed founder the server rolls - egg, wild herd, cowboy, stable - logs a [breed-health] line of its health genes against its sheet, and WARN ... NOT ON ITS SHEET for any disorder or magical gene the sheet does not list. Twenty-four Quarter Horses and twenty-five Thoroughbreds logged no warning; three Quarter Horses carried HYPP, and none carried PSSM1 or HERDA (listed, rare). “Health genes” is the breed book's rule (HealthContribution), so leopard complex, splash white and grey appear beside the true disorders.

§0-CD — Vanilla's village POI tag loads again (2026-09-11, NOT looked at in game)

data/minecraft/tags/point_of_interest_type/village.json had named horsegenetics:cowboy_hitch since the hitch stopped being a POI (2026-09-07), and a tag with one missing entry fails whole: every boot logged Couldn't load tag minecraft:village, which takes vanilla's own village POIs with it. The entry is gone and a dedicated server boots without the error. Unseen: what the missing tag had broken - vanilla uses it to decide what counts as a village (raids, cats, golem spawning). Nothing to do but notice if a village behaves oddly now, in either direction.

§0-CC — 0.5.000: the settings folder and breed-spawning.toml (2026-09-11, NOT looked at in a client)

A dedicated server was booted on it twice: run/phc/ got server.toml and breed-spawning.toml, and an edit to the latter was re-read live (the log line [breeds] spawn settings read from ../phc/breed-spawning.toml changed to “shipped breeds OFF ... Feral Mixed OFF”). The logic is covered by BreedSpawnSettingsTest. No horse has been seen to spawn or not spawn under it. Design: breeds.

§0-CB — Breeds are exactly their sheets; the breed designer's second pass (2026-09-11, NOT looked at in game)

The designer was driven in a headless browser again: all sixteen steps render, the eye strip follows champagne and a white pattern, the colour search locks a hue, a range slider lands in the file, the biome checklist and a modded id land in the file, and the last step's button exports. The breed tests are green. Nothing below has been in the game. Design: where magic comes from, the format.

In the game

In the breed designer (the browser)

§0-CA — Drop-in breeds, the new breed designer, size by zygosity, hover pictures (2026-09-10, NOT looked at in game)

The designer itself was driven in a headless browser - every step renders, the preview and herd roll, a random pick of markings lands in the file, export names an unnamed breed, the Friesian imports, a phone-width window does not scroll sideways. Nothing below has been in the game. Design: the format, breeds.

The drop-in folder - the thing a player with only the jar needs

The gene hover picture - three places

The breed designer

§0-BZ — Twenty-four genes out of the evening intake (2026-09-10, NOT looked at in game)

Where to look: /testkit 1 and 2 in the test world - one preset egg per new gene, homozygous for the form its icon shows, plus three other forms (nightbell foxglove, black barred wing, coloured rainbow drip). Every gene was rendered side-on in every form before shipping; none has been on a real horse, in real light, or with other markings on top of it.

§0-BY — The third 2026-09-10 play session's fixes (NOT looked at in game)

Owner-confirmed in that session and removed from this page: the research shelf stores papers; the spawner fires on every meal with no cap; My horses shows hands; the stall ticket lands a horse properly (as a basis - still to be pushed on); the Breeds tab; molten hooves' prints render.

The kit still carries this list in its bottom two rows - four molten hooves eggs, a sheep spawner, holding pen signs and tickets, the potion mare and stallion, and the shelf and stall gear. The potion foal and the bucket were dropped for room; build them from the custom egg and creative inventory.

§0-BX — The second 2026-09-10 play session's fixes (partly confirmed)

§0-BW — The first 2026-09-10 play session's fixes (NOT looked at in game)

§0-BU — Thirteen eye loci (2026-09-10, owner-confirmed on sight)

The owner looked at the eye loci and confirmed them all: placement, sectors, glows, the third eye. What looking cannot settle is left:

  1. Chaos. Two chaos-eyed horses should not match, and one horse should regenerate the same colour every time you reload.
  2. A splashed white horse should still have two blue eyes usually, one blue eye sometimes, and a wedge rarely — and the genotype screen should now show it carrying MBl/MBl. A cremello should be light blue, a tiger-eye horse gold, a champagne one of gold / brown / green.
  3. Breeding. A blue-eyed splash bred to a plain horse should throw blue-eyed carriers, and blue eyes should reappear a generation later on foals with no splash at all. That is the design working, not a bug.

§0-BT — Twenty-seven behaviour genes, none of them ever seen (2026-09-10, NOT looked at in game)

The whole behaviour family — §12.2's batch — is built, registered and documented, and not one of these twenty-seven genes has been watched happening to a horse. This is by some distance the largest block of unverified behaviour the mod has ever carried, and it is behaviour rather than coat: a gene that paints wrongly is obvious in a render, and a gene that acts wrongly is only obvious in play.

What is proven, by measurement rather than assertion: none of them paints. All 1056 rows of the coat pipeline golden kept their rendered-byte hashes, and all 206 new rows in the bake golden carry the same "paints nothing" hash as sex and diet. Creator parity is green at 7031 checks.

What I am actually worried about, in order

The rest of this entry is a checklist. This part is a confession. Twenty-seven genes went in without one of them being watched, several touch systems that are shared with the whole world rather than with one horse, and the list below is the honest ranking of what could go wrong badly rather than visibly. If play time is limited, spend it here.

Worst case first: things that damage a save rather than look wrong

  1. Spontaneous breeding is the only gene here that can ruin a world while nobody is looking. Everything else fails in front of you. This one runs on a 600-tick beat whether or not a player is nearby, and if the local cap does not hold, the failure is an entity storm discovered hours later in a save that is already damaged.

    The cap counts horses within eight blocks and refuses above six, so a single pasture should settle and stay. What I am not sure about is a large field: the count is per-horse and local, so two clusters twenty blocks apart are two separate caps, and a big paddock could hold several. That is probably fine and might not be. Test it by leaving it alone - four expressing horses, a wide fenced field, walk away for several in-game days, come back and count. This is the one to do first and the one where "it looked fine for ten minutes" proves nothing.

  2. Holy ward can break somebody's mob farm without erroring. It hooks FinalizeSpawnEvent, which is a global, high-frequency event shared with every other mod in the pack. It is meant to cancel natural spawns only, by an allow-list of four spawn reasons.

    If that allow-list is wrong - or if another mod uses a reason I did not anticipate - a spawner stops producing and nothing anywhere says why. Stand a warding horse beside a working spawner farm and confirm the farm keeps producing. Then check a spawn egg, and a breeding pen.

    One bug in this was already found and fixed before shipping: the ward did not record which dimension the horse was in, so a horse warding in the Nether would have suppressed Overworld spawns at the same coordinates. That class of mistake is exactly what worries me about this gene - it is invisible from the player's side, and the only symptom is that monsters stopped appearing somewhere they should.

  3. Spawner is owner-confirmed, and now fires on feeding, two per meal with no cap, only when the horse actually ate (§0-BX). It still has to spawn through the normal path so other mods' protections fire. Rider immunity (fireproof, bird boned) is owner-confirmed, dismount included; ocean-born is the one still unplayed.

Things I expect to be subtly wrong rather than dangerous

Two performance bugs found while reviewing, and what they suggest

Both were fixed before shipping, and both are worth recording because they are the same mistake in two places and it will happen again.

If the game stutters in a way that correlates with horses rather than with anything obvious, the shape of both of these bugs - a per-entity cost paid by everybody, hidden behind a claim of cheapness - is the first thing to go looking for.

Start here — what is left that can damage a world

The ones most likely to be quietly wrong

Feel, which no test can reach

Frequencies, which want a few hundred wild horses

Every carriers-only locus — fireproof, holy ward, ocean-born, bird boned, gladiator, guardian, ender echo, spontaneous breeding, and all four matched-pair loci — is invisible in the wild by design, so the only way to judge the rates is to test a lot of horses through the gene database. The matched-pair loci are the ones to doubt: with dozens of alleles, finding two carriers of the same one may prove so rare that nobody ever does it. Spawner has the largest roster and is the worst case.

§0-BS — Molten hooves: prints on the ground (2026-09-10, rendering owner-confirmed)

Molten hooves lays the mod’s own flat print particle, one per half-block travelled, and the owner has seen it work ("looks pretty good to start with"; the sprite is theirs to redraw). The allele redesign is on §0-BY. What is left here:

§0-BR — Eleven more genes, and dorsal wing's underline (2026-09-10, NOT looked at in game)

Agatebound, bargello, bracketed, coronal, geode, maelstrom, nacre saddle, starburst, sunspiral, wing margin and witchfire. All eleven rendered and looked at as a contact sheet; none has been in the game.

§0-BQ — Four of yesterday's intake genes retuned (2026-09-10, NOT looked at in game)

All four were rendered and looked at, on their own preview base and on a second coat, before and after. None has been in the game.

§0-BP — Fourteen genes out of intake (2026-09-10, NOT looked at in game)

Blackwork, coastline, contour, crazework, dorsal wing, dripwork, dustfall, overcast, ringwork, rising sun, serpentine, shallows, squiggle and teardrop. Every one of them was rendered and looked at — a contact sheet of all fourteen icons, which is how dorsal wing was caught painting a plain black horse — and none has been in the game.

§0-BO — Forty-two black alleles and a split Cleave (2026-09-10, NOT looked at)

This is the largest single change to what the coat engine can draw since the import, and almost none of it has been looked at. What is established is narrow and worth separating from what is not.

Confirmed by measurement, not by eye

Nothing that existed changed, except three white forms on purpose. The bake golden gained 42 rows, lost none, and moved exactly three — pavonem, concentric eyespots and scarab dapple, the three whose white form was regraded. The pipeline golden moved six rows, all of them the one genuinely new Cleave horse.

Looked at, on a bay, in a render: moonwing black (a graphite wing with the dust and the gold intact — the best of them), snow cloud black, pavonem black and its regraded white, concentric eyespots both ways, and all four Cleave combinations including the heterozygous Wve/n. That is six genes out of forty-two.

Not looked at at all: the other thirty-six black forms. They were produced by one transformation rather than one at a time, so they are likely to be right or wrong together rather than individually — but the failure mode that matters is per-gene and cannot be measured: a near-black marking on a dark coat is a marking nobody can see. Every black form was rendered against a bay by the icon baker and none is blank, which is the floor, not the bar. The horses to look at are the black and seal brown ones, and nobody has.

§0-BN — Four genes retuned and one new one (2026-09-10, NOT looked at)

All five were checked the way this project keeps having to learn to check a coat — rendered through the icon tool’s own camera and looked at, not reasoned about from the numbers. That is enough to say a gene paints where it was meant to. It is not enough to say it looks right on a moving horse in daylight, which is what these want.

The gene files’ own notes moved from the gameplay tab to the coding tab on all 56 generated gene pages that carry them. Nothing to look at in game; it is listed here because a reader who knew where that prose was will not find it where they left it.

§0-BM — What the drawing-engine change did to the genes that were already here (0.4.1, 2026-09-09, NOT looked at)

Twenty-two genes and three masks landed at once, and the honest question after a change that size is not “do the new ones work” — that is §0-BL — but what did it do to the hundred and twenty that were already here. The answer splits cleanly in two, and the two halves want completely different amounts of attention.

The short version

No existing horse changed colour. Forty-three existing genes got rarer in the wild, some of them by a factor of seven. Nothing else moved.

Confirmed, by measurement: not one existing coat moved

This is not a judgement, it is a hash comparison, and it is the one thing on this page that does not need a play session.

So no gene needs re-verifying for appearance. If a marking you knew looks different in 0.4.1, that is a bug and a serious one, because two golden files say it cannot be.

Not confirmed, and the reason this section exists: forty-three genes got rarer

intake/tools/founders.py was re-run over the whole set, which is what it is for — it budgets the tiers together, so adding genes necessarily moves everybody’s numbers. What it also did was flatten forty-three tables that had been sitting above their declared tier, some of them well above. Across the whole mod the share of founder horses expressing some magical gene went from 16.32% to 13.35% — and that is with twenty-two new genes added, so the existing ones absorbed rather more than that figure suggests.

The ones that moved by more than a factor of two, worst first. None of these is a coat change; it is purely how often a wild horse turns up carrying one.

GeneTierFounders expressing, beforeafterfactor
Banded SocksCOMMON0.800%0.120%÷6.7
OcularEPIC0.150%0.020%÷7.5
TronEPIC0.200%0.028%÷7.1
Picasso MarkingRARE0.300%0.040%÷7.5
Dorsal ShieldUNCOMMON0.440%0.112%÷3.9
Duskfall SpeckleUNCOMMON0.440%0.112%÷3.9
TidemarkUNCOMMON0.440%0.112%÷3.9
WebbedUNCOMMON0.440%0.112%÷3.9
Wing CloakUNCOMMON0.440%0.112%÷3.9 (and still killswitched)
LaceRARE0.230%0.056%÷4.1
Stained GlassRARE0.180%0.056%÷3.2
CleaveRARE0.154%0.056%÷2.8
YaliaUNCOMMON0.236%0.112%÷2.1
BloodstainedRARE0.090%0.040%÷2.3
NyxbornEPIC0.050%0.020%÷2.5
KoiEPIC0.060%0.028%÷2.1

Another twenty-seven moved by less than a factor of two — mostly RARE and EPIC markings settling from 0.088% to 0.056% and from 0.058% to 0.028%, which is the tier budget doing exactly what it says. One went up: Striped Mane and Tail, 0.140% to 0.168%.

This is the decision to look at, and it is not a bug report. Every one of those numbers is what the gene’s own declared rarity tier says it should be; what changed is that the tier is now being enforced where before some tables had drifted above it. Whether Banded Socks at 0.12% is right is a taste question about how often a player should meet one, and the answer might well be that it was tiered wrongly rather than budgeted wrongly. The fix, if the rates are wrong, is to change the gene’s rarity and re-run founders.py — not to hand-edit a founders table, which is exactly the drift that produced this.

Existing worlds: they load, and they load a little wrong

The two editors, which are the same screen twice

Everything downstream of “how many genes are there”

§0-BL — An SVG mask, three new masks, and twenty-two genes (2026-09-09, NOT looked at)

The largest single addition to the drawing vocabulary since it existed, and none of it has been seen on a horse in the game. It has been seen on the icon baker’s contact sheet, which is a render of the real engine and is how four defects in it were caught, and that is all.

The engine

The twenty-two genes

All present in the world at their tiered founder rates, all reachable in the designer and the spawn screen. Spawn each one rather than breeding for it. The four that were retuned after a render, and so are the least settled: Morpho Wing, Gill Bloom, Concentric Eyespots and Fish Scales.

The one thing that is confirmed is that all 22 register, parse, take a genotype slot, appear on the landing page and bake an icon — and that no existing gene’s coat moved: 57 rows joined the bake golden and not one existing hash changed. Everything above is about whether the markings are any good, which no test can answer.

§0-BK — One page for making a gene, in eight tabs (2026-09-09, NOT looked at)

Documentation only — no behaviour changed, and the eight Java edits in it are comments and test messages. What wants looking at is the page itself, because it is the first one on the wiki to use a mechanism at this scale.

The three deleted pages — creating-a-gene, gene-format, modding — and gene-effects had roughly 190 inbound links between them, all rewritten to the tab their material moved to. check-links.mjs passes and reports no orphans, which proves every href resolves; it cannot prove any of them lands somewhere sensible. A spot check from a gene page and from the roadmap is worth a minute.

§0-BJ — A stall that stopped killing horses, and eight things nobody has touched (2026-09-09, NOT looked at)

Confirmed in play tonight, so deleted from the list above: binding a stall sign; spending a ticket to bring a horse home; shearing; milking a waterborn mare; research papers off a book; the Getting Started tab; the Alleles tab collecting; the cowboy and horseman reading as they/them; and the gene-preview horses turning in 3D.

  1. The rewritten stall detector, in a stall with a fence and a gate. Owner-confirmed 2026-09-10: the sign binds and finds the inside of an ordinary stall. (Where the horse lands is on §0-BX.) Then the cases the new rules are guesses about: a stall floored with slabs or carpet (should be one room), a floor with a one-block step in it (should still be one room), a two-block drop (should not), and a stall whose gate is standing open (should still stop at the gate - that is deliberate and is the rule most likely to be argued with). See gap 153.
  2. A ticket into a stall with nowhere to stand. Fill a bound stall with hay bales and spend a ticket on its horse. It must refuse, say why, and not consume the ticket - the old code invented a spot and suffocated the animal. Then the awkward ones that are still unproven: a stall in an unloaded chunk, and an interdimensional ticket used from the horse dimension.
  3. Taming by hand is owner-confirmed. Still unwatched: whether horses peel off a wild herd when you only walk past crouched with food, that a carnivorous horse ignores a carrot, and that a dhampir does not come at all. Gap 155.
  4. Bareback steering, and the saddle you should never see. Get a horse to attentive/follows - bond 81 - then ride it with no saddle. It should steer and jump like a saddled horse and show no saddle on its back. Then the part that matters: open its inventory while riding and try to take the saddle out. You should end up with nothing. Dismount and check the horse is bare again, and that a horse you saddled yourself is never touched. Gap 156.
  5. The Breeds tab. Both known faults are fixed and waiting on §0-BX. Then look at the entry itself - the plate horse, the biome list, the body scores, and whether “known to carry” naming only discovered genes reads as informative or as broken.
  6. Hearts when the bond moves, and where they stop. Hand-feed a tamed horse and watch for hearts. Then keep feeding past the daily cap of 15 and check the hearts stop - that is the only signal the cap exists.
  7. A foal that already likes you. Breed a well-bonded mare and check the foal's information screen opens at roughly a quarter of hers rather than at zero.
  8. The research shelf was rebuilt as a chest after it still "did nothing" in play - see §0-BX.
  9. The tab strip's new order - Getting started, Recipes, My horses, Breeding, Gene database, Alleles, Breeds - and that the gene previews no longer show a wild-type square except on extension, agouti and shade, where they should. The Alleles tab should likewise count every allele at those three and drop the baseline everywhere else.
  10. Shearing is worth 2 bond now, not 5, which puts it level with a hand-feed and below a treat. Nothing to look at so much as to feel: check that keeping a horse sheared no longer out-bonds actually being kind to it.

§0-BI — A checklist, an allele collection, and a shelf that looks like Minecraft (2026-09-09, NOT looked at)

§0-BH — Spawn moved under the horse (2026-09-09, NOT looked at)

Reported: “Clear genes” and “Make egg” overlapping on the custom spawn egg’s screen — gap 139 arriving exactly as predicted. Spawn is now centred in the empty strip under the preview panel rather than being the third button in the right-hand column, which gives that column back a whole row.

§0-BG — A Getting Started tab, a copy that takes time, and stables out of the mountains (2026-09-09, NOT looked at)

§0-BF — The Equine Research Shelf, and three smaller things (2026-09-09, NOT looked at)

Nothing here has been run

A block, a block entity, a container menu, a screen and two payloads, written in one pass (gap 143). Start by placing one; if the model or the screen is wrong, everything below is moot.

Also in this build, and unrelated:

§0-BE — What is left of the H menu's conversion (2026-09-09, part confirmed)

Confirmed by the owner, 2026-09-09

The browser opens, draws and reads correctly after losing its container — "the H menu looks great". That was the load-bearing question on this section and gap 141 closes with it. The tab strip has since gained scrolling, because six tabs ran off the edge.

§0-BD — A gene says what it does when you point at it (2026-09-09, NOT looked at)

Hovering a gene in the custom spawn egg's list now pops a panel with the gene's name and its one-to-three-sentence summary. It sits to the right of the list, which is empty space on that screen, and it is drawn the same way the dropdowns are rather than as a vanilla tooltip — a list row is not a widget there, and the browser twin has no vanilla tooltip to mirror.

§0-BC — Four things off a real play session, and the one that needs a fresh world (2026-09-09, NOT looked at)

The first item on this page that is a confirmation rather than a request

0.3.2 launches and makes a world. The owner confirmed it, which closes §0-BB's first and largest question. What follows are the four things that session then found, three of them fixed by reasoning rather than by being watched working.

§0-BB — 0.3.0 and 0.3.1 disconnected on world entry; 0.3.2 should not (2026-09-09, NOT looked at)

This one was found from outside

Reported by the owner’s friends against a handed-off jar, not by anyone here and not by the suite: 0.2.0 played, and both 0.3.0 and 0.3.1 kick the client on entering a world with Failed to encode packet 'clientbound/minecraft:custom_payload'. See gap 135. It has never been reproduced on this machine, because a dev-run world is entered before any horse is in view often enough that it was simply never seen — the trigger is a horse coming into render range, not the world load itself.

So the first thing to confirm is the plain one, and it wants a fresh world rather than the usual test save:

§0-BA — The PATH mask, and a checkbox that was never one (2026-09-09, NOT looked at)

Not a runClient item — but one part of it touches a shipped gene

Like §0-AZ, no registered gene uses PATH, so no horse in a world changed and neither coat golden moved. The exception is the flag fix below, which changes how an existing mask is edited — and SPOTS is used by shipped genes.

Open the gene creator and load Prismatic from the examples: it now carries a stroked, smoothed PATH down the shoulder and a filled crescent on the barrel. Worth an eye:

A mask flag is a checkbox now — and it was not before

The creator's mask form sent PARTS and CHOICE to their own editors and everything else to the number / knob / per-dose control. So SPOTS' mirror — a boolean — was offered as a number that could be driven by a knob, which is not a thing the game can read.

What to check: open any gene using SPOTS, confirm mirror is a tick box, that ticking it mirrors the spots, and that leaving it unticked exports no mirror key at all rather than "mirror": false. No gene file was damaged by this — every mirror, invert and emissive in every shipped and example gene was checked and all of them are real booleans, so the old control was never actually used to write one.


§0-AZ — The FRACTAL mask, in the creator (2026-09-09, NOT looked at)

Not a runClient item — there is nothing to see in a world yet

No registered gene uses FRACTAL. It is a new mask in the vocabulary, so it changes no horse that currently exists and moved neither coat golden. Loading a world proves nothing about it. What is unlooked-at is the tool: open the gene creator from file://, add a mask, and pick FRACTAL.

The engine half is covered — FractalMaskTest pins the field, and check-parity.mjs was confirmed to reach the new code by breaking the JS divisor and watching it go red. The form is what nobody has opened. Worth an eye:

Two FRACTAL layers also went into example-genes/prismatic.json (a ridged one on the barrel and a warped fbm one on the neck), so loading Prismatic from the creator’s examples is the fastest way to see both at once.


§0-AY — Twenty-five science tabs, and three owner’s calls inside them (2026-09-09, NOT read)

Not a runClient item

Nothing on this entry changes the game. It is here because it is unreviewed and because it contains three questions only the owner can answer — read it in a browser, not in a world.

Gap 89’s 25 missing science tabs are all written, and the check now runs with an empty exempt list. The 25 are prose against source material the owner supplied, and none of it has been read back by anyone. What most wants an eye is not the citations but the disagreements: each page now states where the mod departs from the literature, and three of those departures are decisions rather than errors (gap 134).

Tiger eye and rabicano were written last, from re-supplied source files, and carry one flag each. Tiger eye asserts a distinct paler iris for TE2/TE2 where the literature has one such horse and its phenotype was confounded by cream. Rabicano’s Rb allele symbol is the mod’s invention — there is no confirmed rabicano gene at all, only a research lead near KITLG on ECA28.

Separately, the tabs that already existed now read thin beside the new ones — MC1R at 41 words, EDNRB at 62, MITF at 90 against its PAX3 twin’s 2,024 — and 20 of the 48 natural science tabs name no breed at all. Nothing is broken; it is the same gap one level down, and it is now the roadmap section that gap 89 used to be.

§0-AX — Body size is now a server toggle (2026-09-09, NOT looked at)

body.size, a boolean in the server config, true by default. False makes HorseRecords.applyTraitsToEntity write a flat 1.0 to Attributes.SCALE rather than what the alleles resolved to, so a world keeps every size gene and gets vanilla hitboxes. Design: Speed, health, jump & size § body.size.

§0-AW — A band can follow a pitched part, and six dead layers woke up (2026-09-09, NOT looked at)

Gap 103. The neck’s own geometry used to be written out by hand in eleven gene files as a sawtooth of wavelength 90 at an amplitude of 77.94; it is now "space": "local", which asks the part what shape it is. Six of the eleven had that pair in a normalised space where it cannot work, and were selecting exactly zero texels — so those six genes have a layer that has never been seen by anyone, on any horse.

What is already proven here, so you need not check it

The four genes whose bands did land and whose knobs did not move — cosmic, shark, stars and suit — are byte-identical in the coat-bake golden, so the conversion is a refactor for them and there is nothing to look at. The eleven all still parse, the creator agrees with the game (the parity fixtures reach the new space), and the calibration has three tests under it now.

§0-AV — The coat texture cache is bounded, and F3+T now means something (2026-09-09, NOT looked at)

Gap 130, both halves. The client used to keep every coat it had ever baked until you logged out, and no resource reload touched any of it. Both caches are now texel-budgeted LRUs and there is a client reload listener. The policy is unit-tested away from the GPU (TexelBudgetCacheTest); what no test on this side can see is whether releasing a texture mid-session upsets the renderer, which is the whole of what is listed here.

§0-AU — Every coat in the mod redrew (2026-09-09, NOT looked at)

SeededRng never mixed its seed — gap 44 — and now does. That changed every horse the mod has ever generated: 883 of 1056 lines of the pipeline golden, 218 of 623 of the bake golden, and 154 gene icons. Nothing is expected to look worse, because the same distributions are being drawn from and only the draws moved, but that is an argument rather than an observation and nobody has looked at a paddock since.

§0-AT — The night loci, and nine genes repainted (2026-09-09, NOT looked at)

The two night loci are the largest piece of unverified behaviour in the mod: two new AI goals, a supersede rule between two genes, and a sound suppression, none of which has run in a game. The coat changes were all eyeballed as icons, which is not the same as having seen one in a world.

The night loci — behaviour, so nothing here is confirmed by a render

The nine repainted genes — looked at as icons, never in a world

§0-AS — Twelve genes whose masks now stay inside the parts they name (2026-09-08, NOT looked at)

Gap 120 was fixed in the engine, so an inverted mask no longer paints everything its parts list excluded. Ten genes changed as a result, and the icons were re-baked and eyeballed — which is not the same as having seen one in a world.

The check that would settle it fastest is a side-by-side against the previous icons: git show HEAD~1:wiki/assets/gene-icons/webbed.png and friends. The engine change is small and precisely scoped — exactly twelve icons moved and nothing else did — so anything that looks wrong is a gene whose art was tuned around the bug, not a regression in the fix.

§0-AR — Fourteen genes, two new masks and seven newly-executed effect verbs (2026-09-08, NOT looked at)

Six of the fourteen have been rendered as an icon and looked at; none has ever been in a world. The eight mechanical loci paint nothing at all, so an icon could not have shown them anything — every claim below rests on code that compiles and on nothing else.

The effect verbs, which are the risky half

Six verbs are new and a seventh (attribute) went from “parsed and logged once” to actually executing. Each touches a system nothing else in the mod touches, and each is flagged unverified in its own comment.

The coat genes, which have been seen only as one icon each

The four genes that changed underneath

Fielded, yalia, voided and opalized were moved from asking the pigment to asking the gradient chart. They will look different, and on cream coats they will look noticeably different — a perlino used to read as largely white and now reads as largely cream. Compare them against the previous icons before assuming a regression.

§0-AQ — The 0.2.0 jar, loaded somewhere that is not a dev run (2026-09-08, NOT looked at)

This is the check 0.1.0 exists because of. implementation project(":common") puts common/ on the runClient classpath without folding it into the jar, so the 0.0.1 jar shipped with none of the genetics classes and threw on world load — and runClient could not have told anyone, because in a dev run the module is on the classpath either way.

Half of this is already settled, by inspection

The built jar was opened and listed while cutting the tag, and everything is in it: the common/ classes, all 85 gene files (suit.json present, collar.json and waves.json correctly gone), the 49 breed files, the name tables, the four structure NBTs, and the assets. ExtremeWhiteDominantGene and WhiteLockContribution are compiled into it and PinkHairGene is not, so it is the current tree rather than a stale build. The packaging bug that produced 0.1.0 has not come back. What is left is the part a zip listing cannot answer.

Also unproven at this tag

The release notes on Releases describe roughly a hundred and fifty commits' worth of work, and the great majority of it has never been rendered in a client. Every § below this one is still open. The tag means the suite is green and the jar assembles, and nothing more than that.

§0-AP — The white lock, the reordered paint stack, and a locus that became an allele (2026-09-08, NOT looked at)

Everything here changes where in the stack a marking lands, which means the thing to look at is never one gene on its own — it is two genes on the same horse. The fastest way to see all of it is the spawn egg (or the horse designer, which is the same screen): put a tobiano on a horse, then add one magical marking at a time.

Three new alleles and two reshaped genes, none of them ever rendered in a client:

And three wiki surfaces that have never been opened by anyone:

§0-AO — Twenty-four gene fixes, four new painters and a polygenic locus (2026-09-08, NOT looked at)

Owner-driven, off a list of twenty-four notes taken from looking at the horses. Design: the session-log entry. Every gene below was re-baked and looked at from six angles on a contact sheet before it was called done, which catches a gene that paints nothing and catches nothing else — how any of it reads on a moving horse in daylight is exactly what is unverified.

The third pass, and the new page

Pavonem

The preview windows

The second pass, and what it is worth looking at for

The owner reviewed the whole registry after the first pass and sent about thirty notes; those are all applied. Two of them changed the engine again, so the things below are worth a look on a real horse rather than on a contact sheet:

The one that changes horses you already have

The four new painters

Accretion is two loci now

The rest of the list, briefly

The wiki, not the game

§0-AN — Eighty-four magical genes, imported in bulk (2026-09-08, NOT looked at)

The whole of process/ turned into gene files. Design: the session-log entry. Every one of them is JSON — no Java classes — and every one has been baked through the real pipeline as an icon and looked at on a contact sheet, which is not the same as having been seen in the game.

That contact sheet was weaker evidence than it read as

The icons those eighty-four genes were signed off on were drawn through a sheared projection — the baker's camera basis had an inverted sign, so every part slid up or down the image by its own depth. It still read as a horse, which is why nobody caught it for a day. The bake was fixed on 2026-09-08 (session log) and all 119 icons redrawn, so the sheet is worth another look: a marking that was reported as landing in the wrong place may have been the camera, and one that looked right may not be. The pipeline itself never moved — this was only ever the picture of it.

Read this first

This is the largest single change the model has ever taken: the registry went from a couple of dozen genes to over a hundred, and every horse in every existing save now has a different genotype code. Saved codes will not parse back to the same horse. That is expected under the no-legacy rule, but it is worth knowing before opening an old world.

Decisions taken without you, that you may want to reverse

“Speckling colour” is per gene, not shared Eight of the source markings (Rex, Iuari, Emitola, Gudial, Qhada, Panark, Yalia, Peafowl) describe their colour as the horse’s speckling colour, taken from a separate Speckling locus. A spec gene cannot read another gene’s drawn knobs, so each of these carries its own hue knob instead. Two of them on one horse will not match, and none of them will match Speckling itself. Fixing it properly means a way for one gene to read another’s epigenetics, which is a real feature and not a small one.
Paint Moon (G-21) refused The akkadorian source’s Paint Moon locus is real-world pinto and roan genetics — tobiano, frame overo, splashed white, sabino, rabicano, classic roan, grey. This mod already has all seven as first-class natural genes. Building a magical gene that re-implements them would give every horse two independent tobianos that know nothing about each other. Left unbuilt and recorded in process/akkadorian-z-mutation-genes.md, which is all that is left of that file.
Everything that changed over time was refused Per your rule, nothing shifts after the coat is baked. Four sources asked for it and four were refused, each replaced by a value drawn once and kept: Patina (“full expression between 8-10 years”), Opossum (“progressive through the age of a Tharoksu”), Goth (the homozygote “emerges over successive sheds”), and Stardust (“lightening increases with age”). Each horse gets a fixed extent knob instead, so a line still varies; an individual does not.
Laciano’s LL disorders refused The source gives the homozygote blindness, deafness and annual tail-hair loss, and says so deliberately. Genes in this import paint and glow and nothing else, so none of it was built. If you want it, it is a HealthContribution on a Java gene, not a spec file.
Eye colour is not wired anywhere Eleven sources say the gene sets or matches the eye colour — Angler, Aurorae, Glow, Lantern, Kintsugi, Peafowl, Flametouched, Fawn, Element Dusted, Qhada (“no pupil”), Laciano (white sclera). A spec gene has no hook into EyeColor, so none of them touch the eyes. This is the single largest gap in the import and the most likely thing you will notice.
Valentine’s hearts are round The source is emphatic that the white markings are heart-shaped. There is no heart mask and adding one is a real piece of work; the gene ships with round spots and the base-colour shift (black to fuchsia, red to pink), which is the half that actually reads at texture resolution.
“Inverting” genes only go one way Seven akkadorian loci are flagged inverting: they are supposed to flip the local polarity, so a marking reads light on a dark horse and dark on a light one. Nothing in the op set does that conditionally. They paint light. The one place the idea did survive is War Mask, which uses two layers with opposite PIGMENT masks to come out near-black on a light coat and grey on a black one — the same trick would work on the others and was not applied for time.
Every white-only gene has a coloured twin Per your rule: a gene that adds nothing but white carries a second variant allele that paints a colour instead, dominant white over recessive colour, and the coloured allele never gives blue eyes. Thirty-three genes qualify and all thirty-three have it. The line I drew is worth checking: a gene that paints white alongside something else does not qualify, so Corvid (white face, black muzzle), Cosmic (a hue ramp with white stars in it), Winged (white bands on a dark ground), Goth (dark on one copy, pale on two), Striped Mane and Tail (light bundles on dark hair and dark on light) and nine more were left alone. Say the word if you meant those too. Accretion and Quarter each have two shapes already and got one coloured allele between them, since a horse showing the coloured form carries no white allele and there is no second shape left to distinguish.

Still to verify in game

Known to be rough

§0-AM — The three-view wiki, the tabs and the search (2026-09-07, NOT looked at)

Design: the session-log entry. Gaps 8891. This is all wiki, so nothing here needs the game — but it does need the wiki served over http (python -m http.server), because the inheritance table asks the mod through wasm and a file:// page is its own opaque origin.

Nothing on this page has been rendered in a browser

The split, the tabs, the search, the inheritance widget and the index switcher were all written and structurally checked — balanced panels on all 83 tabbed pages, zero words lost against HEAD on all 69 gene pages, the build and parity green — and then not once looked at. Treat every item below as unproven, and start with the two that would make everything else moot.

The two that would make the rest moot

The tabs

The landing page

The search

The section routing — the part most likely to be wrong

Sections were routed to tabs by a rule over their headings, not by reading them. That is right far more often than not, and it will be wrong somewhere. The default was Coding, so the expected failure is a section sitting on Coding that a player wanted, rather than jargon leaking onto Gameplay. Worth a skim of a handful of pages with an eye for:

The natural genes with no science tab — resolved 2026-09-09

This section listed 25 pages that the three-view split could not route to Science, because nothing on them was in a section it could move. All 25 now have a science tab and the list is deleted rather than kept as a record of a solved problem. What replaced it — the tabs that predate that pass and are now the thin ones — is on the roadmap, and §0-AY above is the entry that still wants reading.

The two workstations, which cannot both be craftable

Fixed 2026-09-09 — worth one craft to confirm

cowboy_hitch.json and horsemans_table.json used to be the same shapeless recipe with different results, so only one of them could ever match and the other was unobtainable in survival. They now differ along the line Villagers itself draws between them: the hitch is rope-heavy (2 hair cloth + 3 braided rope + 2 fences), the table takes the leather (3 hair cloth + 2 leather + 2 fences).

Craft both. The data is checked by neoforge-26.1.2/tools/check-recipes.mjs, which refuses two recipes that occupy the same slot, but no check can confirm that a recipe a player types into a grid produces the block they wanted. Gap 92.

The item pages

§0-AL — Breeds as JSON, breed spawn eggs, and spliced lines (2026-09-07, NOT looked at)

Design: the breed file format, breeds, the two new eggs. Gaps 8385. The Java half of this is well covered by tests; none of the four things a player actually touches has been touched.

Check the registry is intact before anything else

The 49 breeds moved from an 885-line Java class into 49 JSON files. If the classpath index is not being read, every horse in the world is Feral Mixed and every other check below is moot. The boot log says [breeds] N breed(s) registered; the custom spawn egg's Breed: dropdown is the same answer with names on it.

The breed designer and drop-in checks that stood here moved to §0-CA when both were rebuilt.

The two eggs

Spliced lines

§0-AK — Stables that generate with horses in them (2026-09-07, NOT looked at)

Design and attribution: generated stables. Gaps 8082. This is the least-proven thing in the mod: three buildings converted from formats the game cannot read, placed by worldgen files nobody has generated a world with, and filled by a hook that fires on the wrong event because there is no right one.

Check a building appears at all before anything else

/place structure horsegenetics:horse_stable on flat ground in creative. If the structure does not load, the bake is wrong and everything below is moot; the error will name a block. Do all three — stables is the one converted from numeric 1.12 block ids and is by far the likeliest to have a wrong block in it, and tm_u_stable is the one with a foreign block substituted.

The buildings

Do they generate

The horses — the part with the most ways to be wrong

The genetics each one promises

The extension point

§0-AJ — Five themed random splice carrots (2026-09-07, NOT looked at)

Design: the five themed splices. Recipes: items. Nothing here has been through a runServer boot either — see the note under §0-AI; this batch adds five items, five models, five item definitions and five recipes.

Do they exist at all

Do they roll what they say

The bits that go through shared code

§0-AI — The My horses table, and the information screen made readable (2026-09-07, partly looked at)

What the owner’s own reports already confirm

Four things below were checked without anybody meaning to: the owner opened both screens mid-session and reported what was wrong with them, which establishes that the browser opens and its tabs render, that My horses draws rows (they asked what the Barn column was for, which needs rows on screen), that the Breeding preview tab renders, and that the information screen’s Genes and Other genes tabs render with gene rows on them. So the “does the roster arrive at all” gate below is passed and the checks it guarded are worth doing rather than moot.

Three defects came out of that and are fixed but not re-checked: buttons sitting on top of text (all of them are label-width now), brindle showing on every stallion, and KIT filed under Other genes on every horse. Each has its own checklist item below.

runServer could not be booted for this batch either

:common:test, :neoforge-26.1.2:build and check-parity.mjs are green; the headless boot failed on DirectoryLock again, which means another JVM was holding run/world/session.lock — somebody else’s game, not a registration fault. So nothing here has been through the “it registers and boots clean” floor, and this batch adds a payload (horse_roster, renamed from breeding_roster), five more (inspect_horse, horse_coat_request / horse_coat_batch, offspring_request / offspring_data), a hand-written stream codec and a new AI goal on every horse. Run ./gradlew :neoforge-26.1.2:runServer once with nothing else open before anything below.

Sixteen owner requests in one pass, split between the H browser and the i information screen. Design: roadmap § the horse browser, breeding § client sync. Gaps 7679.

The roster gate — passed, and here for the next change

If My horses ever says “asking the server…” and never fills, stop: the roster payload is not registering or the request is not reaching HorseRoster, and every row below is moot. Breeding preview will be empty too, because both tabs read the same roster; if only one of the two is empty, that is a different and much stranger bug and is worth saying so.

My horses (browser H, first tab — and it is now the tab that opens)

The information screen (i on the horse inventory)

The two behaviour changes

The little horses, and the buttons that were sitting on the text

Everything in this block was built after the owner’s reports, so none of it has been seen — unlike the tabs above, which have.

Offspring (information screen, fifth tab)

Two genes that were being reported wrong

The Crafting tab, which changed by side effect

§0-AH — The werewolf locus, rainbow dust, and a particle locus that went recessive (2026-09-07, NOT looked at)

runServer was not confirmed for this batch

:common:test, :neoforge-26.1.2:build and check-parity.mjs are all green, but the headless boot could not be run: another JVM was holding run/world/session.lock and run/logs/latest.log for the whole session, and it was somebody else’s game. So the usual “it registers and boots clean” floor has not been checked for the new lycan_shift attachment or the two new @EventBusSubscriber handlers. Run ./gradlew :neoforge-26.1.2:runServer once with nothing else open before anything below.

Three things, and the first of them is by a distance the most invasive change the mod has ever made: it deletes a horse entity and builds a new one, twice a game day. Design: LYCAN, rainbow dust, the particle locus’s new founder table. Gaps 73, 74, 75.

Check the horse survives the night before checking anything else

Spawn a Wlf/Wlf horse with the egg, give it a name you will recognise, /time set night, watch it become a wolf, then /time set day and watch it come back. If the horse that comes back has the same name and the i screen still shows its record and its pedigree, the whole design works. If it comes back nameless or with a fresh record, stop — the attachment did not round-trip through the tag and everything below is moot.

The shift, both ways

What the animal can and cannot be

The cloud and the temper

Rainbow dust

The particle locus going recessive

§0-AG — The horse information screen, the breeding preview, and a mare that miscarries (2026-09-07, NOT looked at)

Four separate things, and the first two deleted the surfaces they replace — so if the new screen does not open, there is no longer any way to read a horse's record in game. Start here. Design: breeding § client sync, breeding § the miscarriage, gap 71.

The first click is the load-bearing one

Get on a tamed horse, press E, and click the i in the top-left corner of the window. If that opens a dark six-tab overlay, everything below is worth checking. If it does nothing, the button could not find the horse — and the grey side panel that used to answer these questions is gone, so say so before going further.

The “i” button and the way in

The six tabs

The breeding preview (browser H, second tab)

The miscarriage

The spawn egg, in the three places it was blind

§0-AF — Nine more health genes, and a wild horse that can be sick (2026-09-07, NOT looked at)

The reference’s disorder list is now covered: HERDA, SCID, lavender foal, cerebellar abiotrophy, CVM, GBED and megaesophagus as recessives, plus HYPP and PSSM1 as the mod’s first dominant disorders. Design: the two shapes a disorder comes in.

A wild-caught horse can now be born unwell

This is the change most likely to read as a bug when it is working correctly. A dominant disorder has no silent carrier, so if founders could never be affected the allele could never exist — roughly one wild horse in thirty now has PSSM1 and about one in eighty has HYPP. Neither is ever born dying; that invariant is unchanged and tested.

§0-AE — Literal epigenetics, drift, and breeds that let go (2026-09-07, NOT looked at)

Epigenetics stopped being one opaque seed per allele copy and became named literal numbers a player can read; every value now takes a tiny drift on its way to a foal; and a breed shapes its founders and then stops influencing anything. Design: the genetics model. Nothing below has been seen in a game.

Every horse changed

A given seed makes a different-looking horse than it did, deliberately — the golden coat file was regenerated wholesale. So “this horse looks different from last session” is expected, and is not the bug. The bug would be a horse that looks different from itself across a reload.

§0-AD — No horse too slow to escape a zombie (2026-09-07, NOT looked at)

Some horses were resolving to speeds slow enough to be unusable. The genetics are unchanged — MIN_SPEED is still 0.02 — and server/HorseSpeedFloor clamps the attribute instead, at the one place it is written, to vanilla's own slowest horse (0.1125). Design: Speed, health, jump & size.

§0-AC — The cowboy, the horseman & transfer papers (2026-09-07, partly looked at)

Confirmed in game: the barn generates and sits on the ground with steps up to it, the cowboy founds and has a face, both posts hand out their jobs, the two share a surname, the horseman keeps vanilla's brain, and transfer papers work end to end. What is new and unseen is the homestead. The house is no longer built at runtime — it is baked into the same structure piece as the barn, and the two work posts moved onto its front step. The piece has since gained a ground course carrying a walk along the front of both buildings, lost the lane that ran between them, and turned the beds round; and the cowboy has gained the ability to open a door, which he has never had before. Those are all changes to a piece the village generator places, so the first question below is still whether the piece generates at all. Full design: Villagers & transfer papers.

The test world tells you where a village is

The “Spawn Test Horse World” button no longer teleports you. On login it runs the same search /locate structure minecraft:village_plains does and prints the coordinates plus a clickable /tp. Two things to confirm:

Does the barn generate at all?

Does he open the barn doors, and only by day?

Entirely new and completely unseen — he has never been able to open a door before, so there is no “it used to work” to fall back on. Design: Villagers § He can work a door. Gap: 63. The cheapest test is to stand at the barn in the morning and shut all four doors on him.

The cowboy himself

Two posts, and the house they stand on

The mounted cowboy is gone entirely — no riding, no routine, no barn shelter. A Cowboy Hitch makes the cowboy and a Horseman's Table makes the horseman, and both now stand at the door of a house baked into the same structure piece as the barn. Design: Both of them stand at the house.

Transfer papers

The horseman

Placeholder art

The blank transfer paper reuses research_paper.png. The cowboy and the horseman share one overlay, textures/entity/villager/profession/horseman.png (the owner's recolour of the farmer hat) over a plains-villager body — check the cowboy reads as the same trade as the horseman, since that shared file is the only thing making it so. The cowboy assembles that himself in CowboyOverlayLayer rather than going through vanilla's profession layer, so the two can in principle diverge: stand them next to each other once and confirm they have not.

§0-AB — KIT gains the boosters (2026-09-07, NOT looked at)

KIT went from eight alleles to twelve. The four new ones are the correction the reference asks for: W35, W32 and W34 join W20 as a group of mild, viable, additive boosters that between them are most of what this locus does to a population — W35 is commoner than W20 in the one large dataset that measured both. W15 joins as the one strong allele with a homozygote actually on record, and W23 moves from “viability unknown” to nonviable, which is what its source row says. Every breed with a KIT table gained booster lines.

Questions for the owner
  1. Two loci now hand out ordinary markings, and I did not reconcile them. SW1 at 55% and the KIT boosters at roughly 39% carriage are both doing the “this horse has a star and a sock” job, and they stack. Roughly three horses in four should have some white. If that is too many, the KIT boosters are the better-evidenced half and WILD_SW1_PERCENT is the number to cut.
  2. Booster frequencies are the reference's ordering at half its magnitude. Its dataset puts W35 at 0.168, W32 at 0.061 and W20 up to 0.34 — but it says itself that the sample is horses whose owners paid for a colour test, which is selected for having something to find. I used 0.09 / 0.035 / 0.085 / 0.010. Say if you want the raw numbers.
  3. W23 changed meaning. It used to be the locus's “viability unknown, therefore allowed” example, at broad-white. Its source row actually reads all-white or near-all-white with a suspected lethal homozygote, so it is now a strong allele and cannot double. W15 took over the “allowed” role and has better evidence for it — an observed homozygote rather than an absence of one.
  4. Three things declined, all for the standing reason. Haplotype phase (several KIT changes on one chromosome; one dataset found six across a horse's two copies) is a linkage system, and an allele pair is the model. W34’s possibly-stronger effect on chestnut would cost it an outcome of its own for a “may be”. And the other twenty-odd named W alleles are one founder each, described in terms an allele already here covers.
  5. Breed booster numbers are my judgement. The reference names which breeds carry which allele and never how often, except for W20. Everything else is a plausible number in the shape the reference gives.

§0-AA — the splash loci swap roles (2026-09-07, NOT looked at)

The two splash loci were overhauled against the reference, and the headline change is a swap: SW1 on MITF is now the widespread, minimally-expressed allele the reference says it is, and SW2 on PAX3 is rare and breed-clustered. SW1/N also gained an outcome of its own, splash-minimal, painted over a range rather than at a strength. Every wild-caught horse’s markings changed as a result.

Questions for the owner
  1. The big one: is 55% carrying SW1 the right number? The previous design put a minimal splash allele on 90% of founders so ordinary horses would have socks and blazes. The reasoning was good; the allele was wrong, so it moved to MITF, where the reference actually puts the widespread one. But I also dropped the rate, because the same reference is emphatic that ordinary markings are mostly not splash — no splash allele at all was found in 112 deliberately minimally-marked horses. 55% is a compromise between a defensible allele frequency and a world where most horses have some white. It is one constant, MitfGene.WILD_SW1_PERCENT.
  2. The honest fix is a markings system, and I did not build one. Ordinary white is polygenic. A small per-horse markings score, drawn from the shared face-marking vocabulary and running before the white loci, would let SW1’s frequency fall to what its evidence supports. That is a new system, so it is on the roadmap rather than in this change.
  3. Is splash-minimal’s range (0.10–0.44) wide enough? The reference’s claim is strong — a single SW1 copy can be indistinguishable from ordinary markings or a classic splash. The low end is a coronet band and a star; the top overlaps splash proper. Widening it further makes the outcome name less honest, narrowing it makes the allele predictable, which is the one thing it is documented not to be.
  4. Breed numbers are my judgement, not the reference’s. The source names which breeds carry which allele and never how often. I put the breeds it names at 55–65% SW1, the ones it does not at 40–55%, and Cleveland Bay at 10% because its standard forbids white. Quarter Horse, American Paint and Lipizzan carry SW2; Appaloosa carries SW4.
  5. PAX3’s page said deafness was not modelled. It was. The code has emitted the shared informational splash-deafness condition from both loci for some time; only the javadoc and the wiki still said otherwise. Corrected, no behaviour change.
  6. The Mangalarga Marchador is not in the catalogue. The reference names it for both SW1 and the grey duplication. Worth adding as a breed, or worth leaving out?
  7. Every splash horse’s markings moved. Not just the frequencies — WhitePattern.splash now derives its strength from the same roll that sets the waterline, so even a fixed-strength outcome renders slightly differently. The golden file was regenerated for it.

§0-Z — grey, rebuilt as a copy number (2026-09-07, NOT looked at)

Grey is no longer one G allele and one progression roll. It is now three alleles — G3 (triplication), G2 (duplication), N — and the dosage 1–4 picks the progression window, so a N/G2 horse is a steel or mid dapple grey for life and a G3/G3 is near white. The painter gained a head lead, an independent mane / tail stage with a root-to-tip ramp, chubari spots, a bloody shoulder, and a fixed inverted region rule. The gene also emits an informational melanoma-risk condition. Six new golden cases; nothing seen in a game.

Questions for the owner
  1. Are the four windows spread far enough apart, or too far? They are 0.06–0.52 / 0.28–0.74 / 0.50–0.90 / 0.68–1.00. Overlapping is deliberate — real variation inside a genotype class is large — but it does mean an unlucky G3/G3 and a lucky N/G2 can land close together. If you would rather each dosage be instantly identifiable, narrow them; the table is one constant in GreyCoat.
  2. Is KEEP_YOUNG = 0.46 dark enough for a “slow” grey? With no age input, every grey adult has to read as a grey, so even the least-greyed one is a long way from its birth colour. The alternative is letting a N/G2 look almost like a plain bay with a hidden flag on it, which seemed worse. Say if you want the range to start darker.
  3. Melanoma is reported and never simulated — is that the line you wanted? The settled call was “melanoma is cut with aging”. What is built is an informational condition only: a risk tier off the copy number, raised one step on a black-based coat, with no lesions drawn, no stat docked and no death. It seemed to be the honest half — it is what the real DNA test reports — but it is a step past “cut”, so it is your call. Deleting it is one method in GreyGene.
  4. Chubari at 18% and bloody shoulder at 7% — too common? A bloody shoulder in life is genuinely rare and slightly legendary; 7% of greys may make it ordinary. Both are single constants.
  5. The five-stage health pipeline was declined. The reference asked for melanoma susceptibility, then an age-related chance of lesion onset, then lesion burden and severity with health effects. The last two need an age clock and a disease-progression system, neither of which exists, so they are not built and not stubbed.
  6. G2 is only in the seven breeds the reference names. Andalusian, Connemara, American Miniature, Mustang, Quarter Horse, Tennessee Walking Horse, Welsh Pony — plus a small share in the wild pool. The reference also names the Mangalarga Marchador, which the catalogue does not carry. Everywhere else greys are pure G3, so the Lipizzan and Camargue are all fast greys.
  7. The seeds moved again. Grey now draws 1 long + 8 floats where it drew 1 long + 4, so every grey horse from an older world greys differently. Known gap #47.

§0-Y — the midtstol: dun’s two-tone mane (2026-09-07, NOT looked at)

Dun’s mane and tail are no longer flat points. They now carry a dark band down the centre with pale guard hair either side — the Fjord midtstol, which is a feature of every true dun and only famous on the Fjord because that breed clips the mane upright to show it off. Covered by DunGeneTest and three new golden cases; not seen in a game.

Questions for the owner
  1. Is GUARD_HAIR (0.28) too strong? On a grullo the outer mane comes out around a third of the black the centre keeps, which is a big jump for four texels to cover. It reads as the reference’s “cream, silver-white or yellowish” and it may read as a bug at close range instead. Easy to halve.
  2. The reference asked for a whole new system and I declined. It proposed a fictional F “Fjord mane pattern” allele plus three hidden quantitative modifier loci, with the mane stripe visible only on D/_ F/_. That would let a genuine dun show no mane stripe, which the same document says is not how dun works, and it is a new system rather than an existing one. Drawn on every dun instead. Say if you want the modifier locus anyway — the shade / sooty dosage pattern would fit it exactly.
  3. The mane cannot show a true cross-section. A real clipped Fjord mane reads pale-dark-pale across its width when you look at it head-on. The mane box is four texels wide and its two big faces are its sides, so what is drawn is the band down the middle of the side face. From the side — which is where a player looks at a horse — that is the same picture. Head-on it is not, and there is no mesh to fix it with.
  4. Should the forelock join in? The reference is emphatic that the axis starts at the forehead. There is no forelock box on the vanilla mesh, so the chain currently starts at the crest. The dun face mask is the nearest thing and it is a separate rolled accessory.

§0-X — sunshine and snowdrop (2026-09-07, NOT looked at)

Two new alleles on the existing MATP locus, both found in 2019: sun (sunshine) and sno (snowdrop). Both recessive, both rare, and both able to compound with cream. Covered by the golden file and eyeballed as side views against a perlino and a champagne bay; not seen in a game.

Questions for the owner
  1. Are they too rare? Each allele is about one copy in 330, so a homozygote is roughly one wild horse in a hundred thousand and a player will only ever breed one. Faithful (each was found once, in one horse) and possibly pointless.
  2. Two undocumented compounds had to be decided. prl/sun resolves to classic pearl and sun/sno to a double dilute. Nobody has ever seen either, so those are the mod's calls rather than facts.
  3. The gallery labels the double-dilute pen sno/sno rather than Cr/Cr, which is an artefact of allele declaration order - and the order is set that way so a genotype code prints Crprl rather than prlCr. Reversible if the pen matters more than the code string.

§0-W — manchado (2026-09-07, NOT looked at)

A new locus, manchado - the rare Argentine pattern. Covered by ManchadoGeneTest and the golden file, and eyeballed as side views beside a tobiano and a leopard. Not seen in a game.

Questions for the owner
  1. Is it too rare? Carriers only in the wild, at about 1.2%, and two of them have to meet. That is faithful to a pattern documented in a handful of Argentine horses, and it may mean nobody ever sees one.
  2. Should any breed carry it? The reference names Criollo, polo ponies, Arabians and Hackneys. Arabians are in the breed list; Criollos and polo ponies are not.
  3. How much white? The field currently covers roughly the top half of the barrel. Photographs of real manchados vary enormously and some are far whiter.

§0-V — rabicano (2026-09-07, NOT looked at)

A new locus, rabicano - white ticking from the tail dock and flank forward. Covered by RabicanoGeneTest (including a direct comparison against the real classic-roan painter) and the golden file, and eyeballed as side views. Not seen in a game.

Questions for the owner
  1. Is the ticking fine enough? It uses the same near-binary dither as roan, at a lower frequency, so at 128px it may read as blotches rather than as hairs.
  2. Should a homozygote be visibly distinct? Right now two copies only raise the floor, with the ranges overlapping most of the way - deliberately, because no dosage effect has ever been demonstrated. A breeder may want a clearer reward for doubling it.
  3. No breed carries it. It is wild-founder only. Arabians and Quarter Horses are where it is actually familiar, and both are in the breed list.

§0-U — pangaré, and the seal brown's inner limb (2026-09-07, NOT looked at)

Pangaré (mealy) - the pale muzzle, belly and inner legs - and, with it, CoatRegions.medial, which is the helper gap #51 asked for and which also gave the seal brown its fifth soft point. Both are covered by PangareGeneTest and the golden file, and eyeballed as side views; neither has been seen in a game.

Questions for the owner
  1. Is the pale too pale? A strong pangaré belly ends around MEALY_RED, which was raised once already because the chart has no gold band (gap #49) and a paler setting came out grey-cream instead of cream. It may still be too far.
  2. How high should it climb? The reference says an extreme mealy underside "may rise high on the barrel", which is what Pa2/Pa2 does. On a small pony that may be most of the horse.
  3. Five breeds carry it. The reference names about a dozen more (Ardennes, North Swedish Draught, Gotlandsruss, Finnhorse, Noriker, Brabant), most of which are not in the breed list.

§0-T — sooty (2026-09-07, NOT looked at)

A new locus, sooty - the dark countershading over a horse's topline. It is common, so unlike most of this page's entries it is not a rarity you have to hunt for: a large fraction of every wild herd now carries some, and the whole population should look a little different because of it. Covered by SootyGeneTest and the golden file, and eyeballed as side views over five bases; not seen in a game.

Questions for the owner
  1. Is it too common? Roughly two horses in three carry at least one copy. That is what the reference describes ("widely observed, common across domestic populations") and it may still be too much of a good thing when every bay in the world has a dark back.
  2. Shade and sooty are two loci for one paper. The reasoning is written up, and it is a genuine design call rather than an oversight - but a dark bay can now be dark for two independent reasons, and that may be one reason too many.
  3. Does the liver-chestnut approximation hold up? Sooty darkens a chestnut by raising the pigment chart's black axis, which on the chart's warm edge resolves brown rather than black. It is the right picture made the wrong way round, and it is worth a look before it is trusted.
  4. Should a plain black's sooty combination be hidden? It paints nothing there, but it is still a non-wild expression, so a black horse gets its own baked texture per sooty combination - five bakes for one appearance. Cheap to fix if the answer is yes.

§0-S — flaxen, and W4 (2026-09-07, NOT looked at)

Two additions to the colour side. Flaxen is a new locus - a chestnut's pale mane and tail, as a dosage - and W4 is a ninth KIT allele, the Camarillo white. Both are covered by tests and by the golden file, and both have been eyeballed as baked sheets; neither has been seen in a game.

Questions for the owner
  1. Should flaxen be on more breeds? Only the Haflinger and the Morgan name it, so every other breed horse is f/f and the whole spread lives in the feral population. The reference names five more breeds (Black Forest, Breton, Frederiksborger, Jutland, South German Coldblood), none of which is in the breed list.
  2. Is the dosage readable? Five bands over a range of four, with a roll narrower than a band. A player breeding two mild carriers should be able to see that the foal came out paler.
  3. Is one all-white allele enough? W4 and W22 are the same horse to look at, and the gene browser is the only place the difference shows until someone tries to breed two whites.

§0-R — the dhampir (2026-09-07, NOT looked at)

A new magical recessive, dhampir. The genetics are covered by DhampirGeneTest and the golden file, and the coat has been eyeballed as baked sheets: white, red-eyed, and the red survives even under the leopard complex. None of the behaviour has been run at all - three hand-written pieces (DhampirHandler and two goals) against 26.1.2 sources, and behaviour is the half no test in this repo can reach.

Questions for the owner
  1. Is the burn rate right? Half a heart every two seconds against triple health is a long, losing argument with the weather rather than an execution - deliberately, so it survives the run to the treeline. It may be far too gentle to feel like a vampire.
  2. Should it be rideable in daylight at all? Right now the goals stand down for a rider, so a player can simply ride one across a desert while it burns. That is either a nice tension or a bug.
  3. Should the white be absolute? It is painted absolutely in phase 3, so no pigment gene shows through - but the overlay phase still draws over it, so a dhampir carrying the leopard complex has spots and one with a cutie mark keeps it. That is the same layering dominant white already has, so it was left alone rather than special-cased.
  4. Other horses are excluded from the hunt. That means a dhampir alone in a paddock of horses has nothing to live on. Intended, or should it bite them too?

§0-Q — the diet locus (2026-09-07, NOT looked at)

A new locus, diet, with twelve narrow diets against an ordinary wild type. Nothing about it has been run in a game. The genetics half is covered by DietGeneTest; the feeding half is a new handler (HorseDietHandler) written against 26.1.2 sources, and every item id in DietFoods was read off those sources rather than seen in a hand.

Questions for the owner
  1. Should the diet be visible before you find out the hard way? Right now the refusal message names the food, so the answer is discoverable in one wasted apple. The gene browser also names it outright. Is that too generous, or not generous enough (a tooltip on the horse screen)?
  2. Is one in a hundred per diet the right feral rate? Twelve diets at 1% each means about one wild horse in eight has one. That is common enough to meet on purpose and rare enough to be a find; it may be too common.
  3. Is the locus natural or magical? It is declared natural, and its page says why. A lava-eating horse is not natural in any other sense; the flag currently decides only which coat pass a gene paints in, and this one paints in neither.
  4. Should a narrow diet do anything but healing? It governs healing only. Breeding is deliberately exempt so a special-diet line is not a dead end, and the mod's own gated healing (water + food blocks nearby) is untouched — which means a lava-eater still regenerates in a paddock with hay in it. That may want revisiting.

§0-P — the bay shade overhaul (2026-09-06, NOT looked at)

Bay is a four-band continuum now — blood bay, bay, liver bay, seal brown — driven by a new shade locus plus MC1R and ASIP dosage. Every bay in the world changed, and roughly half of them are now darker than the old constant-body bay. Nothing here has been seen in game; it has been checked as baked sheets and as side views. See agouti and shade.

Questions for the owner
  1. Is a blood bay red enough? The chart's warmest corner at full red pigment is #965C3F, so that is the reddest a bay body can physically be — BODY_BLACK_LIGHT is already almost on it. If blood bays should pop, the fix is the chart's warm corner (LUT lab), not a constant in BayCoat.
  2. Should the four bands be named in the UI? They are real Expressions, so the gene browser and the genome display already say “Seal brown” rather than “Bay”. That is more information than the old model could give and it may be more than you want on a tooltip.
  3. Is 5% seal brown the right rarity? It is set by ShadeGene's founder table plus the band edges. Seal needs ShD/ShD and a dosage term, which is deliberately a find.
  4. The inner limb is not drawn as a soft point. It is a classic one on a real seal brown; it was left out because the leg boxes' medial faces need addressing by Face and no gene does that yet. Worth building?

§0-O — the shadow pass (2026-09-06, NOT looked at)

Phase 3 now ends with ColorField.liftShadows(SHADOW_FLOOR): no texel a magical gene painted leaves the phase darker than #151515 in all three channels, scaled to keep its hue. The composite is a multiply, so a texel painted pure black scaled the template to nothing and the band lost every strand of hair shading. See Pipeline § the shadow pass.

§0-N — the new default gradient (2026-09-06, NOT looked at)

horselut.png replaced the default chart, so every coat in the mod changed colour at once and none of it has been seen. The golden test cannot help here — it composes against a synthetic gradient by design (gap #48) — so eyes are the only check there is. Fastest route is the LUT lab, then a herd in game.

§0-M — the dilutions, set to measured targets (2026-09-06, NOT looked at)

MATP's three outcomes and champagne are set to the owner's restriction targets, measured against the gradient installed the same day. The numbers are exact — verified on a chestnut, where a constant reads back directly because there is no black for the tint term to act on. What nobody has done is look at a horse.

OutcomeRed restrictedBlack restrictedOn a chestnut
Cr/N single cream20%29%#B69679
prl/prl classic pearl20%60%#B69679
Cr/Cr double dilute47%95%#DFD3BB
Ch/_ champagne31%80%#C6AF94

§0-L — the LUT lab (new, NOT looked at)

A browser checklist. It was a page of its own until 2026-09-08 and is now a tab on the locus it belongs to: wiki/gene-lut.html?view=lab. Upload a colour gradient and see the horses the real pipeline bakes against it — a chart on the left, a spinnable horse on the right, a base-coat row and one row per dilution locus plus tobiano. It runs the same wasm the designer does and draws with the gene creator's mesh emitter and orbit viewport; the only thing it adds is DesignerApi.setGradient pointed at a file off your disk. Nobody has opened it in a browser.

It needs a server — file:// will not work

Same reason as the designer and the preview window: loading the wasm is a fetch. The panel says so itself rather than sitting blank. Serve the repo with python -m http.server and open /wiki/gene-lut.html?view=lab.

What was checked offline

The lab's exact call sequence was driven end to end against the baked wasm in node, the way §0-J's was, with the PNGs decoded and handed in as the page hands them. Confirmed: the pipeline accepts its textures; the three bases come back Black / Bay / Chestnut; all six gene keys resolve and yield buttons (Ch/Ch; d1/d1, D/D; prl/prl, Cr/N, Cr/Cr; Mu/Mu; Z/Z; To/To); all six stack onto one genotype; a stale gene key reports missing and a bad allele token refuses. The load-bearing one: swapping the gradient really does redraw every horse — a synthetic 64×64 chart moved 4 791 texels on the dilution-stacked horse and 11 776 on a plain bay, an odd-sized LUT is accepted (GradientLut normalises), and going back to Natural is byte-identical.

The footprint overlay was checked the same way, across all three bases and eight combinations. It agrees with the model everywhere it was asked: black lands bottom-left (red 100%, black 100%), chestnut top-left, champagne on a chestnut at chart X 45% and cremello at 92%, mushroom on a black at 88%/100%, dun spreading over 29 histogram cells where a flat dilution occupies one, and a tobiano reading the chart at 4 160 texels against a solid black's 11 904 - white is off the chart rather than a colour on it. Bounds stay inside [0,1] and no cell index exceeds the bin count.

What has not been looked at at all — everything visual

§0-K — the gene-carrot recipe card (new, NOT looked at)

A browser checklist, and it is on every gene page, under a new Its gene carrot heading above the see-also block. wiki/gene-carrot/ draws the Known Gene Splice recipe as a 3×3 grid (horse hair, this gene’s research paper, a golden carrot, the rarity item) plus what feeding the carrot does, and asks the mod for everything that varies per gene. Same wasm as the preview window; the two share one load. Nobody has opened it in a browser.

What was checked offline

The export was driven over every gene page against the baked wasm: each page’s data-gene resolves to a registered gene (the two that do not, suntouched and waterborn, are example.* spec genes and were deliberately left without a card); the loci with no carrot come back saying so rather than drawing an empty grid, and the loci outside the Unknown splice pool are marked. It also turned up gap #43: every gene is the default tier, so every card prints the same price.

§0-J — the gene preview window (new, NOT looked at)

A browser checklist. It is now on every gene the horse designer says it can show a coat for — the designer's own showsAs classification, so the ability, stat, size and condition loci are deliberately left without one. Tobiano is the one that has been looked at; the leopard complex and KIT are the two worth looking at next. wiki/gene-preview/ is a drop-in window that shows one gene on a black, a bay and a chestnut, as a horse you can spin, with a dice in the corner that rerolls the epigenetics. It runs the same wasm the horse designer does, draws with the gene creator's mesh emitter and its orbit viewport, and adds only the three buttons and the wiring. Nobody has opened it in a browser.

It needs a server — file:// will not work

Same reason as the designer: loading the wasm is a fetch. Every gene page carrying a preview joins the designer in being un-double-clickable. The window says so itself rather than sitting blank. Serve the repo with python -m http.server and open /wiki/gene-tobiano.html, or read it on the published wiki.

What was checked offline

The new exports were driven end to end against the baked wasm in node, with the four PNGs decoded and handed in exactly as the page hands them: the three bases build the genotypes they claim to (E/E a/a, E/E A/A, e/e a/a), tobiano offers the one outcome the model says is distinct (To/To — the heterozygote paints the same), KIT offers one per white outcome without the page knowing anything about KIT, a stale gene key and a bad allele token both come back as a refusal rather than a plain horse, and the coats bake with white patches over each of the three bases and move when the epigenome is rerolled. EDNRB’s O/O resolves the lethal-white condition the window puts in its footer.

What has not been looked at at all — everything visual

One page carries it. Rolling it out to the rest of the coat genes is deliberately waiting on somebody actually looking at this one.

§0-I — the horse designer (new 2026-09-06, NOT looked at)

A browser checklist. wiki/horse-designer/ is the browser twin of the custom horse spawn egg: the same gene list, the same click-to-add, the same right-hand column, over a horse walking a grass field. It runs common/ compiled to WebAssembly by TeaVM — not a port, the actual bytecode — so all 48 genes are live and the coat is byte-identical to the game's. Nobody has opened it.

It needs a server — file:// will not work

Loading the wasm is a fetch, and a local file is its own opaque origin, so the browser refuses. Use the published wiki, or serve the repo: python -m http.server from the repo root, then /wiki/horse-designer/. This is the one page here that is not openable by double-clicking, and the gene creator is unaffected.

What was checked offline

The compiled Java produces byte-identical coats to the JVM — the same class run three ways (JVM, TeaVM JavaScript, TeaVM wasm) gives twenty identical coat digests across genotypes reaching every painter. The exported API was exercised end to end in node: 47 gene rows, 50 breeds, adding agouti reads back as “Bay”, and brindle on a stallion snaps to Brn/Y rather than the impossible Brn/Brn. The GUI was driven headlessly against that same wasm — every right-column button fires its method, a gene row adds, KIT’s eight alleles open a dropdown and a pick lands. Every file the page requests serves with the right MIME type, wasm included.

Parity with the spawn egg — the point of the page

Open both and compare. They should be the same screen:

Two divergences are deliberate: where the spawn egg has Spawn and Cancel there is nothing to spawn, so those slots are Wander and Reset view.

The name, the export, and the field

What it still cannot show — and says so

12 of the 47 rows are struck through. Clicking one still adds the gene (it is real, and it belongs in an exported horse); the row says “not shown here” underneath, and the reason goes to the console. Which genes those are is derived, not typedDesignerApi.showsAs asks each gene whether it paints, moves the horse’s scale, declares a condition, or is read by a painter, so a gene added later classifies itself. Worth checking the split still reads right:

VerdictGenesStruck?
coat26 — everything that paints, plus PATN1 / PATN2, which paint nothing themselves but are named in the leopard complex’s coatDependsOn()no
size6 — ACAN, B4GALT7, HMGA2, LCORL, SHOX, magic body sizeno
condition3 — PLOD1, RAPGEF5, ST14 (the condition is named in the panel’s condition line)no
ability4 — cutie mark, particle, milk, verdant. Item icons, particle types and world blocks: nothing outside Minecraft to draw them withyes
stats8 — CKM, MET, MSTN, PDK4, RYR2, magic speed / health / jump. Real and invisible; the figures ride along in the JSON exportyes

Also not drawn, on genes that are otherwise fine: emissive / glow texels (light’s gold mane paints, but does not shine).

There are no toasts any more (removed 2026-09-08, owner’s call — they did not reliably clear themselves and a run of Randomize clicks buried the horse behind them). Check that nothing important went with them: a failure to load the mod should hold the boot overlay up and say why, an unreadable horse file should raise a dialog, and everything else — lethal conditions, genes the page cannot draw, an export — should be in the browser console and, where it matters, on the panel already.


§0-H — the gene creator (rebuilt 2026-09-06, partly owner-verified)

Owner-verified in the browser (2026-09-06)

“That looks correct.” A general confirmation off the live page, not an item-by-item walk — so it closes the three things you cannot miss on opening it: the page loads at all (the expresses ReferenceError is gone), the parity line reads green, and the 3D preview reads as a horse instead of the pile of bounding boxes it was.

What a look cannot confirm is everything you have to interact with. Still open:

Owner’s note on 2026-09-06: it wants a usability pass next — see roadmap §9.1. Also still unchecked anywhere: how it behaves with no connection, where three.js does not load and the page falls back to the flat sheet (which is still a real bake).


§0-G — this session’s work (built 2026-09-06, NOT play-tested)

Six changes, none of them seen in the world. They are listed most-worth-looking-at first.

The white recalibration — look at a herd

Both white painters now measure against the topline (bounds(skin, Part.BODY).yMax()) on a convex ramp, instead of against the whole-horse box. This is the biggest visible change in the session because PAX3’s SW2 is on 90% of founders — it changes what an ordinary horse looks like.

Not fixed, and still open above: tobiano’s cover knob, which is still calibrated as if the patch field were uniform. Both are fixed now — the same two-pass quantile in both genes. Frame’s band is rebuilt (§0-F2) and tobiano’s calibration is corrected without changing how it looks (§0-F4).

Brindle — the X-linked gene

Custom egg allowed a Brn/Brn stallion — fixed 2026-09-06, NOT yet re-verified

Owner-caught: the custom horse spawn egg let you build a stallion carrying two real Brn copies, which cannot exist (a stallion has one X). CustomHorseSpawnScreen.enforceSexLinkage now snaps a sex-linked row's second slot to the gene's placeholder whenever the current sex only has one real copy at that locus, and back to a real allele when it doesn't — called after every allele edit and after the Sex button. Confirm: add brindle, set Stallion, and cycle both allele buttons - it should be impossible to land on two real copies.

Eye colour

One eye rendered backwards — fixed 2026-09-06, NOT yet re-verified

Owner-caught inspecting this: the dark pupil should sit toward the nose and the white sclera toward the ears on both eyes, but the east eye had it backwards. Cause: CoatRegions.EYE_RECTS_ADULT's east rect was two texels short of the true pixels, so it grabbed 2 background texels plus the pupil and missed the sclera — which broke the deliberate west/east mirroring the raw template relies on to compensate for the box-UV unwrap's own left/right reversal. Fixed (moved the rect from {28,42} to {30,42}, which also feeds tintIris); coat-golden.txt regenerated. Look at both eyes on a horse and confirm the pupil sits nose-side on both.

The same bug on the foal — fixed 2026-09-11, NOT yet seen

The owner-reported “the coat overwrites the sclera” on foals was this defect on the other skin, and neither an ordering nor a projection problem: the composer already redraws the eyes after both paint phases, and the coordinates were on the eyes. EYE_RECTS_BABY was simply 2 texels wide where the eye is 4 — the pupil and only the pupil — on the strength of a comment asserting the foal template has no bright sclera. It has two columns of one beside each pupil, so every white painter and every magical gene painted over the whites of a foal's eyes and the redraw put back the black. Now {4,20,4,2} and {40,20,4,2}, verified against HEAD's own face extents rather than derived. Every one of the 528 foal rows in coat-golden.txt moved and not one adult row did.

Look at: a foal beside its dam — the whites of its eyes should now read the same way hers do, pupil nose-side on both sides. Then a foal wearing something that paints the whole head (a dominant white, a broad magic zebra), which is where the old bug was most obvious. And a blue-eyed or heterochromatic foal, since the eye-colour painters read the same rects.

Green, hazel and heterochromia — built 2026-09-06, NOT looked at

All of it is asserted through the real pipeline in EyeColorTest, and none of it has been seen on a horse. The whole subject is Eye colour & heterochromia; what wants looking at, in the order it is most likely to be wrong:

  • Does a split iris read as heterochromia at all? This is the load-bearing unknown. The iris is four texels, so a "wedge" is one, two or three of them. Twelve shapes are in EyePatch.WEDGES — four halves, four single corners, four three-corner shapes — and the single corners in particular may read as a stray pixel rather than as a sector. If they do, restricting WEDGES to the four halves is a one-line retreat.
  • One blue eye. 22% of blue-eyed horses. Spawn a few SW1/N splashes and confirm some come out with one blue eye and one dark one, and that the dark one looks deliberate rather than like a half-applied tint.
  • Champagne's iris. Amber 40%, hazel 35%, light brown 17%, olive 8% — spawn a handful and confirm the four are actually distinguishable at riding distance. If amber and light brown are the same eye in practice, the palette wants spreading. Also: a champagne horse now has its own baked texture where it used to share one, so watch for any coat-cache churn on a herd of them.
  • Cream and pearl. Cr/Cr pale blue, Cr/prl blue-green, prl/prl pale. Confirm the blue-green reads as green and not as "the blue one but wrong", since it is the mod's only natural green eye besides champagne's olive.
  • Magic sectoral heterochromia. Custom egg, two different colour alleles. Confirm both colours show, the two eyes have different shapes, and that green/green and gold/n genuinely change nothing — including on a horse that already has a champagne or cream eye, which they must not overwrite. Then try chaos on a few horses and see whether the rolled colours are ever muddy.
  • The foal again. A foal iris is the 2×2 pupil with no sclera, so a wedge is a quarter of a very small block. Check a splash foal with a sectoral eye still reads as a horse and not as a smudge.

A glowing cutie mark

A Cutmrk/Cutmrk horse that also carries any light allele wears a full-bright emblem. Both are rare, so this is a custom-egg check: add cutie mark and light, and look at the flank in the dark. It should glow like the mane does.

Feral Mixed

The Unknown Gene Splice blacklist

Hard to check directly — the point is a negative. Breed a few dozen foals with an Unknown Gene Splice carrot and confirm none of them dies, none is a dwarf, and none comes out with fewer hearts than its parents. 13 of the 48 loci are excluded, derived rather than listed.


Open issues

Seen in-game, not fixed.

The top/bottom UV swap, splash’s calibration and frame’s band — all fixed

The big one is fixed: the horse’s top and bottom cube faces were UV-swapped in HorseSkinGeometry.faceMapsOf, so a painter that whitened “from below” (splash, sabino belly, frame off the underline) was flooding the back and the belly stayed coloured. Owner diagnosed it, the two Face.TOP / Face.BOTTOM maps are now the right way round, and measured splash white went from topline-heavy to belly 100%, back ~35% — a proper dipped-from-below coat. coat-golden.txt regenerated.

And splash’s own calibration is fixed too (2026-09-06) - both painters now measure against the topline rather than the whole-horse box, so a single-copy splash stops at the upper cannon instead of the belly. See §0-G for what to look at.

Frame’s topline is fixed (2026-09-06) and measured spine white went from ~75% to 0.00 at every seed. Its shape took a second pass the same day — the first one still drew a dipped horse, and the tests here did not catch it because none of them asserted the white was framed from below. See §0-F2. Tobiano crossing the topline is correct for tobiano.

Magic speed / health / jump (built 2026-09-05, NOT play-tested)

Three new genes on the magic body size pattern — codominant, epigenetic, paint nothing, ~80% wild carrier rate each, so most wild horses now carry all four body-stat genes. The genotype code is 43 segments in-game (41 built-in + the two shipped spec genes; old saves will not parse). Full checklist at §0d.

Genome display omits data-driven genes — fixed 2026-09-03, unverified

Owner, 2026-09-02: the short genome string (info panel, paper dump, seed-jar tooltip — all via GeneCodeDisplay.shortForm) never showed the spec genes, including the shipped Suntouched / Waterborn. Fixed with the data-model rewrite: GeneCodeDisplay now derives its trailing gene list (curated built-in order, then Genes.loaded()) and derives the “baseline means absent” test from the gene’s own expression table (does any combination mask?). Confirm a horse carrying Suntouched or Waterborn shows it. See §0.3.

PAX3 SW2 is now the ordinary horse (built 2026-09-05, NOT play-tested)

90% of wild horses carry one copy of SW2 — the founder table is written out as 90% SW2/N, 1% SW4/N, 9% N/N, heterozygotes only. Measured over 20 000 draws: horses showing any white-pattern locus went 33.3% → 93.6%, mean white coverage of a wild horse 32.5% → 49.5%, and a foal of two wild-caught parents is splash-bold 0.07% → 20.5%. See the gene page.

What to look at. Spawn into a fresh world and ride past a herd: nine horses in ten should have clean-edged leg white and a face marking, and they should still look like a population rather than like one horse repeated — every copy carries its own epigenetic waterline height and its own face marking, so the question is whether that reads as variety at a glance. Then breed two wild-caught horses a few times: about one foal in five should come out visibly bolder than either parent, which is the moment this change exists for.

Known to interact badly — check this first

The white audit found that WhitePattern.splash measures its waterline against the whole-horse height (hoof to ear tip) while the barrel top is at 0.622 of that and the legs only reach 0.326. So S_SPLASH of 0.34 puts the line at 0.325–0.386 — all four legs entirely white — and that is now what 90% of wild horses look like. “Minimal marking” currently means four white legs. If the herd reads as uniformly white-legged rather than as horses with socks, that is this bug and not the frequency; the fix is known gap #30.

Face markings: star, stripe and snip (built 2026-09-05, NOT play-tested)

All four white loci now draw their face marking from one shared vocabulary, WhitePattern.faceMarking(…) — three components (a patch on the forehead, a band down the nose, a patch at the nostrils) plus a width, from which every named marking falls out. Star and snip are new: both are detached patches, which the old centreline band structurally could not draw. See the pipeline page.

What to look at. Spawn-egg a horse with kit=W20/N several times and re-roll the epigenetics: about a third should carry a plain star and about a third nothing at all, with the odd snip and star-and-snip. Then walk up the ladder — kit=W20/W20, kit=SB1/N, mitf=SW1/SW1, ednrb=O/N, kit=SB1/SB1 — and check that it reads as star → star and stripe → blaze → bald face. Specifically worth confirming, because none of it has been seen on a model:

  • a star really reads as a star at 128px — it is only three to five texels across, and the concern is that it reads as a smudge or is lost in the template’s own shading;
  • a snip lands on the nostrils rather than on the lip or the chin;
  • the star sits above the eyes and not on top of the skull — the head box is pitched 30° and its bounds are the rest-pose AABB, so the projection there is approximate;
  • a blaze no longer wraps under the jaw (it used to, on every locus), and a bald face still does;
  • the foal, which has no separate muzzle box — the whole face is one part, so face space is measured over the head alone and a snip has to still land at the nose end of it;
  • the KIT-vs-splash margin difference is visible on the face as well as the body: a KIT star should have torn edges and a splash blaze clean ones.

Old saves. No format change — but every horse carrying a KIT, MITF, PAX3 or EDNRB variant repaints, because the face draws replaced the old ones in those genes’ draw order. 330 of the 450 golden rows are byte-identical; the 120 that moved are exactly those four loci.

The old “splash leg edges are a perfect ring” issue is gone with the gene: whitenLowerLeg’s hard y <= cutoff is no longer on any white-pattern path. WhitePattern.sabino jitters each leg’s margin per texel, and WhitePattern.splash is one wobbled waterline that crosses the legs at an irregular height by construction. CoatRegions.whitenLowerLeg and whitenBlaze now have no callers.

§0 — the white-pattern loci (owner-verified 2026-09-04)

The white-marking rewrite — KIT, MITF, PAX3 and EDNRB replacing the old white / splash / sabino / frame genes — is confirmed rendering correctly in-game. The eleven-item checklist that was here has moved to the session log, which is the permanent record.

That confirmation no longer covers frame, and never covered the eyes

EDNRB's shape was rebuilt on 2026-09-06 and every constant in it moved — see §0-F2. What was confirmed here on 2026-09-04 was the old frame. The three loci beside it are untouched and the confirmation stands for them; so does everything below about the lethal-white ratio, which is genetics rather than shape.

These four loci also grew eye behaviour that has never been looked at: complete and sectoral heterochromia, which is new since that confirmation. Eye colour & heterochromia, and the checklist in the eye section above.

Old saves will not parse their white-pattern loci. Dev only; start a fresh world. Summon tokens: kit=SB1/N, mitf=SW1/N, pax3=SW2/N, ednrb=O/N.

One thing left, and it is not something you can see

The lethal-white breeding ratio. Two ednrb=O/N carriers should throw an all-white O/O foal about one time in four. That is a statistic over a run of foals rather than something a play session shows you, so it stays here: breed a carrier pair repeatedly and check the rate looks Mendelian. The coat is confirmed — an O/O horse renders pure white and masks everything.

The foal no longer lives. As of 2026-09-04 the health system exists, so an O/O foal is born, named, filed in the pedigree, and then dies. Check that too while you are breeding the carrier pair — and see §0b below, which is where the whole health layer waits.

§0-F — the leopard complex (new 2026-09-06, NOT play-tested)

Three new loci — LP, PATN1, PATN2 — the appaloosa spotting family, and the model’s first cross-locus-reading gene. :common:test 405 green, :neoforge-26.1.2:build green, runServer boots clean (48 segments). Old saves will not parse (48 vs 45 code segments).

The custom spawn egg — the fastest way in

What to look at

Not built: mottled skin (the coat has no skin layer). Deferred with a note on the gene page.

§0-F2 — frame overo, rebuilt again (2026-09-06, NOT looked at)

The previous rebuild was reported here as fixed and was still wrong

It drew a horse dipped in white to a frayed waterline, with the colour reduced to scraps — and it passed every test on this page, because the tests asserted a dark spine and a white belly and a dipped horse has both. The missing assertion was the one that says frame white is framed: colour above it and below it. It exists now (frameWhiteIsFramedAboveAndBelow).

Three things were wrong — an uncalibrated threshold, a band open downward, and a jag finer than one texel — and they are laid out on the EDNRB page. The lesson worth carrying: offline measurements agreed with the old code at every step. Nothing below is a substitute for looking at the horse.

What was measured offline, and is now pinned

Asserted in WhitePatternGenesTest rather than left as a number in prose: spine white 0.00 at every seed, the legs under 10% and the upper crest under 15%, the middle of the side decisively whiter than both the belly below it and the barrel above it, the patches measurably wider than they are tall, and the range reaching both cryptic and textbook. Swept over 400 epigenetic seeds besides: no seed put white on the spine or the crest, and no seed came out with a belly whiter than its own flank.

Spawn a handful of ednrb=O/N horses from the custom egg and look for:

§0-D — dun rebuilt, and grullo made blue (2026-09-06, NOT looked at)

What changed, and why it should look different

The whole locus was re-derived from a field guide. The dilution is a new red-first, then black move (PigmentField.diluteNeutral) so grullo lands on the LUT’s neutral column instead of unmasking a black horse’s hidden red on the way out; the points now skip the dilution outright; and the leg bars are a new field entirely. There is also a shoulder bar and a face mask / cobwebbing, rolled per horse. Full account: the dun page.

The default LUT was also edited (owner) to cool its low-red column toward blue-grey, which is what makes grullo a blue rather than a neutral grey. Every desaturated colour in the mod moved a little with it — worth a glance at grey and the roans while you are in there.

Spawn dun=D/d2 on all three bases plus dun=d1/d2, and a few of each so the per-horse rolls show:

§0-F4 — tobiano recalibrated (2026-09-06, NOT looked at)

This one is meant to look identical — that is the check

Unlike frame, tobiano was not visibly broken and was not redesigned. Its cover knob was lying — a range that read as a 1.4× swing delivered a 2.8× one — and its topline bias was measured against the whole-horse box, so it landed on the mane instead of the back. Both are fixed the way frame's were; the constants were then re-declared as the range the old code actually produced and the biases re-tuned to hold the back and legs where they were. Full account: the tobiano page.

Over 400 seeds, before against after: markable surface 0.31–0.86 both ways, back median 0.64 both ways, legs median 0.74 against 0.76. Individual horses moved, the population did not.

Spawn a handful of tobiano=To/to horses and confirm nothing got worse:

§0-F3 — the two roans, rebuilt + regreyed (2026-09-06, NOT looked at)

Classic roan and the leopard complex's varnish roan were both re-derived from a region-by-region reference, and the point of the pass was that they had drifted into being the same pattern at two strengths. They are told apart by shape, not by how much white there is. Full accounts on the roan page and the leopard page.

What was measured offline, and is now pinned

RoanPatternsTest is the reference's own identification checklist run against the pipeline: classic roan even across the trunk (five zones within 0.08 luma), no shoulder shield (within 0.06), solid head / mane / tail / lower leg, a roaned neck that thins toward the poll, and the inverted V. Varnish: dark shields over the shoulder and hip (0.36–0.54 luma darker than the barrel), a whitened head where classic roan's is dark, and measurably patchier.

Spawn roan=Rn/rn and leopard=LP/LP horses and look for:

§0a — the seven magical utility genes (new 2026-09-04, NOT play-tested)

Seven new genes, a fourth coat phase, a new trait interface and two new effect verbs, none of it seen in-game. Pages: milk, magic body size, mane colour, tail colour, light, healer, verdant. Old saves will not parse — the genotype code went from 33 segments to 40 in-game. Start a fresh world.

The quickest way in is the custom spawn egg: every gene is a row, and adding one defaults it to the first allele that does something, doubled — so “add Light, spawn” is a one-click glowing horse. Summon tokens: milk=Watr/Watr, body_size=Big/n, mane_color=Mnsld/Mnstrp, tail_color=Tlsld/n, light=Lthf/Ltmn, healer=Hlr/Hlr, verdant=grass/grass.

Magic body size — now on most horses in the world

80% of wild horses carry a copy, so this is no longer a rare gene you go looking for: it is the default experience of every horse. Check the population effect first and the extremes second.

  • Walk into a herd of wild horses. Is the size spread visible as a spread, without any single horse looking wrong? That is the whole design of the 1.1× / 0.9× centre. If they all look identical the σ is too small; if individuals look silly it is too big.
  • The walking animation. A previous build had scaled horses sliding their feet along the ground — vanilla advances the leg swing from ground distance and never consults Attributes.SCALE. GeneticHorseRenderer now divides the phase by the scale. Watch a large horse and a small one walk and confirm the feet plant instead of sliding, and that an ordinary 1.0× horse is unchanged.
  • Spawn body_size=Big/Big several times: the percentages add, so these should be clearly larger than any wild horse. The bounded maximum is about 2.04×.
  • Small/Small, the same. Does the hitbox match? Where does the rider sit on each?
  • Confirm you never catch a wild Big/Big, Small/Small or Big/Small — every doubled horse should be one you bred. (Unit-tested over 20 000 founders, but worth an eye in the pens.)
  • Breed two Big/n carriers: a quarter of the foals should be Big/Big and visibly larger than either parent. This is the payoff the whole gene is arranged around.
  • Breed a large horse and confirm the foal inherits that percentage rather than a new roll.
  • A scaled foal: Skin.BABY’s projection is already approximate, and a foal is small twice over.
  • Reload the world and confirm every horse is still the size it was.
The spawn egg previews size now

The preview applies the resolved body scale, so a Rnd epigen. randomize visibly resizes the horse, and a size 1.14x readout sits under the panel whenever the horse is not ordinary size. The model is capped at 2.5× so an extreme draw stays a recognisable horse; past that the readout says (preview capped) and the number is the truth. Check the framing still looks right at both ends.

Light — the first user of the overlay phase
  • Each of Lthf / Ltmn / Lteye alone: are the gold hooves / mane / eyes in the right places? The hooves in particular were only ever checked on a UV sheet.
  • Do they glow in the dark? The emissive layer has never drawn a gene-written texel mask — only Suntouched’s whole-part list.
  • Does the horse light the ground around it? Same trailing minecraft:light block Suntouched uses, so expect it to lag a gallop.
  • A heterozygote (Lthf/Ltmn): both regions, in full. That is the codominance claim.
  • Gold eyes should keep a dark pupil — if the eye is one flat gold rectangle, shadeEyes is not doing its job.
  • On a dominant-white horse, and on a foal (which has no mane, so a Ltmn foal should light the area and show nothing).
Mane / tail colour, and healer
  • A solid mane and a striped one: do the bands read as bands on a 3D horse, or as noise? They were tuned on a UV sheet.
  • Mnsld/Mnstrp: two visibly different colours on one mane. If they look like one colour, the per-copy epigenetics are not being read.
  • Mane and tail loci together, in different colours.
  • Breed a coloured mane and confirm the foal gets the same colour.
  • Healer: is the red stripe recognisably down the centre of the mane? Compare a faint one and a vivid one.
  • Healer + mane colour: red on top of the colour, not under it.
  • Stand within 3 blocks of a healer while hurt — do you mend, and do the heart particles show?
Milk and verdant — the two you cannot see
  • Right-click a Watr/Watr horse with an empty bucket: water. A Lava/Lava one: lava, and check the cooldown is a minute.
  • A plain horse: milk from a mare only. A stallion should give nothing.
  • Water and lava should work on a stallion too.
  • Breed two Watr/Lava-capable carriers — actually, breed a Watr/Watr to a Lava/Lava: every foal is the clash, so the pairing should always refuse, with the chat line naming the cause.
  • Verdant: leave a grass/grass horse standing on dirt and come back. One block per beat, so it should be a patch, not a lawn.
  • The conversion lists are the risk: confirm a verdant horse does not eat anything you built with. Try standing one on a cobblestone path with moss/moss.
  • Nothing should spread in the horse dimension.
Suspected: you may no longer be able to mount a mare while holding a bucket

A yield cancels the interaction on both sides when it fires, so vanilla does not also read it as a mount. That was harmless while the only yield in the game was Waterborn’s, on a rare gene. Every mare now has one — so right-clicking any grown mare with an empty bucket gives milk instead of mounting, always.

Worse on the cooldown: fulfil returns early when the horse is still recharging, but the event is cancelled anyway, so for 200 ticks after milking a mare you get neither milk nor a mount and no feedback at all. Check how bad that feels. The fixes, in order of size: don’t cancel when the cooldown blocks it; require sneak; or gate milking on tamed so wild mares are unaffected (roadmap §7 wants that rule anyway).

Known and accepted, not bugs

A milk horse and a verdant horse are indistinguishable from an ordinary one until you put a bucket under them or watch the floor. That sits awkwardly beside healer, which draws a stripe precisely so you can see what it does, and it is logged as a gap rather than fixed — a marking would want to be part of the locus rather than bolted on.

§0b — the trait, size and health system (new 2026-09-04, NOT play-tested)

Thirteen new genes and a whole new subsystem, none of it seen in-game. Machinery: the horse’s body. Old saves will not parse — the genotype code went from 20 segments to 33, and then to 40 with the magical utility genes (§0a). Start a fresh world.

Testing ergonomics come first — owner, 2026-09-04

The owner’s next change is to make this easier to test before working through the list below. Expect the tooling described here (the spawn egg flow especially) to move; re-read this section against the code before trusting the steps.

How to test any of this quickly

The custom horse spawn egg is the tool. Adding a gene in its editor defaults it to homozygous for its first non-baseline allele, which for every health locus is the affected genotype — so “add PLOD1, pick Foal, spawn” is a one-click lethal foal. Spawn Adult instead and it lives (the death handler only touches babies), which is how to look at a dwarf without it dying.

Stats are genetic now — the random roll is gone

Size — the first visible non-coat gene

The lethals

Lethal at birth — owner-confirmed 2026-09-13

“Foals dying right after birth also works.” The first thing in §0b ever confirmed in play — the whole trait, size and health system has carried “NOT play-tested” since 2026-09-04, and the lethal path is the part of it with the least margin for being quietly wrong: a foal that should die and does not is a silent failure, and one that dies when it should not is a ruined line.

What this does not yet cover, because it was not reported either way: whether the death message resolves rather than printing the raw key death.attack.horsegenetics.genetic_defect. The four bullets below are untouched.

The server config

Carriers

§0d — magic speed / health / jump (new 2026-09-05, NOT play-tested)

Three new genes on the magic body size pattern — codominant, epigenetic, paint nothing. Pages: magic speed, magic health, magic jump. The genotype code went from 41 segments to 44 in-game — old saves will not parse, start a fresh world. Like magic body size, about 80% of wild horses carry a copy of each, so most wild horses now carry all four. Summon tokens: magic_speed=Swift/Swift, magic_health=Hardy/Hardy, magic_jump=Springy/Springy (and the mirrors Sluggish / Frail / Leaden).

§0e — breeds, herds & aggro (2026-09-05, partly play-tested)

49 breeds, biome-weighted herd spawning, cross / mixed breeding labels, and per-breed stat bands feeding the four magical body-stat genes. Full design: breeds.html. Nothing here has been seen in a play session; the server boots clean with the biome modifiers loaded.

§0c — the particle locus (new 2026-09-04, NOT play-tested)

Forty alleles on one gene, a new ability interface, and a rebuilt emitter verb — none of it seen in-game. Page: particle. Old saves will not parse: the genotype code went from 40 segments to 41 in-game. Start a fresh world.

The way in is the custom spawn egg. Adding the gene defaults it to the first allele that does something doubled, which is Dst/Dst — coloured dust. Summon tokens look like particle=Rflm/n. You have to make the horse walk: the trail fires only while it is moving on the ground, so a horse standing in a spawn pen shows nothing and that is correct.

CheckWhereWhat right looks like
A trail appears at allSpawn particle=Dst/n, ride itColoured dust behind the horse while moving, nothing while stopped
The six body sites read as different placesSpawn the same allele several times over, re-rolling with Rnd epigen. betweenhead / spine / all four hooves / front pair / back pair / tail are visibly distinct origins. The hoof sites are the ones most likely to be wrong — they are computed from the bounding box and yaw, so check they track when the horse turns
Two horses of one allele differRnd epigen. on Rflm/n repeatedlyDifferent colours, sites and densities every time; the particle itself never changes
A codominant pair shows both, independentlyparticle=Rflm/CsmkFlames and campfire smoke, from two different places, in two colours — not one merged stream
A non-codominant pair hides oneparticle=Dst/SoulDust only. Indistinguishable from Dst/n — that is the point
A foal inherits the exact lookBreed a trailing stallion onto a plain mareRoughly half the foals trail, and those that do match the sire exactly — same colour, same site, same count
All forty particles render sensibly at horse scaleWalk the list with the spawn eggThe suspects are the emitter-style ones, which in Bedrock spawned other particles and here are plain: Snc (sonic ring), Shrk, Raid, Skl. Also Sklk2 (a vibration aimed at the horse itself) and Dig (a sculk block particle) — both were substitutions, not the named particle
The colour-carrying particles are not invisibleparticle=Bwswrl/n, Whtswrl/n, Bkswrl/n, Dst2/nThey are visible and coloured. ColorParticleOption reads the alpha byte, so a bug here shows as nothing at all rather than as a wrong colour
Dst2 actually fadesparticle=Dst2/nTwo colours, one becoming the other — not a single flat colour
Density is not overwhelmingA count-4 horse at a gallop, then a herd of them20% of moving ticks × up to 4 particles × up to 2 emitters. If a single horse is too much, EMIT_CHANCE is the one number to turn down
The wild rate feels rightWalk the overworld, or the horse dimension corridorRoughly 1 wild horse in 13 trails something. If it reads as noise rather than as a find, WILD_ALLELE_FREQUENCY is the dial
Sites track a scaled horsePair it with body_size=Big/BigThe trail comes off the big horse’s own hooves, not off where an ordinary horse’s would be
A foal emitsAny trailing foalIt emits. The sites are computed from the bounding box, so they should scale down — but nothing has looked
Known, and accepted for now

Ten of the forty alleles are named after Bedrock particles with no Java equivalent and carry a substitute — the table is on the gene page. Two more (Bigflm, Cndlflm) were cut rather than substituted, because Java flames carry neither a colour nor a scale and the pair would have been indistinguishable from alleles that already exist.

§0f — shearing, milking rules, carrots, the gene database (new 2026-09-05, NOT play-tested)

A big multi-system pass — milking rules, shearing, the carrot family, the gene database and gene metadata. Nothing here has been seen in-game. Reference: the carrot family, gene effects (the yield else-branch + the full_health flag), the gene format (format 3).

Determinism — the thing to check first

Shearing (§12)

Milking rules (§7)

Breeding carrots (§14)

Gene database & papers (§16)

Wanted (not built yet)

Genetic eye colour

The eyes render correctly everywhere, but they are copied verbatim from the template (CoatRegions.redrawEyes). Wants a gene — and the classic hook is blue eyes on cream double-dilutes, which would make it the first gene to read MATP’s expression for something other than pigment.

Still to verify

The LUT gene (was §0-A) is owner-confirmed working in game — moved to the session log.

0-B. Horse Browser is now a container menu + a Crafting tab (built 2026-09-05, redesigned + two gene buttons added, NOT play-tested)

The Horse Browser was rebuilt from a client-only Screen into a server-synced AbstractContainerScreen over a new HorseBrowserMenu (menu/ package, new MenuType). Pressing H now sends OpenHorseBrowserPayload and the server opens the menu.

The first layout was cramped and overlapping; it was redrawn. The Gene Database tab is now a full-window reference again (list left, scrolling detail right, no slots — every menu slot goes inactive on this tab). The Crafting tab is a compact centered panel (a 3×3 grid + result + the player inventory) with the gene list still down the left. A tab strip sits at the top-centre of the window on both. All custom drawing is in screen coords (the container's leftPos/topPos translate is undone in extractLabels).

0-C. Splash white now always wears a bold face marking (built 2026-09-05, NOT play-tested)

Regression fix. After the 2026-09-05 face-marking-family rework, MITF / PAX3 splash at single-copy strength (~0.35) mostly landed on a small star, a snip, or nothing — splash horses were coming out bare-faced. WhitePattern.splash now runs its face marking at a boosted strength (SPLASH_FACE_BOOST = 0.34): a single-copy splash reads as a blaze, and a homozygote or a two-locus splash as a bald face — the splash phenotype (dipped from below and a bold blaze). Same RNG draw count, so alignment is preserved; coat-golden.txt regenerated (splash rows moved). New WhitePatternGenesTest.everySplashHorseWearsAFaceMarking.

0-D. The cutie-mark gene (built 2026-09-05, NOT play-tested)

A magical, recessive gene (horsegenetics.cutie_mark, priority 196, Cutmrk / n). Cutmrk/Cutmrk wears an emblem of 1–3 flat items on both flanks, drawn by a client render layer (CutieMarkLayer) on top of the coat and every white pattern. Paints nothing in the bake (all outcomes wild types, like particle), so the genotype code gains a segment (43 built-in genes, 45 in-game) but the catalogue is unchanged; old saves won't parse. :common:test 391 green. See gene-cutie-mark.html.

0-E. Name-tag rename window (built 2026-09-05, NOT play-tested)

Right-clicking a horse with any name tag (plain, enchanted, or anvil-renamed) opens HorseRenameScreen instead of doing the vanilla thing.

0. The Horse Browser (H) & the per-horse gene popup (new 2026-09-05)

First slice of the “H page” (HorseBrowserScreen) plus a per-horse gene inspector (GeneInspectScreen). Nothing here talks to the server — it is all common/ data already on the client. Built, not play-tested.

Half of this section is superseded (2026-09-07)

GeneInspectScreen and the grey inventory panel are deleted; the per-horse half of this checklist is now §0-AG, and the browser gained a third tab there too. The browser checks below still stand as written. The per-horse ones are kept because what they say about which loci are worth listing is still what HorseInfoScreen does.

0. Dun becomes a three-allele locus (new 2026-09-03)

Dun now carries D / d1 / d2 — six combinations on three outcomes. d1 is the new one: it draws the dorsal stripe with no dilution, so a horse can have primitive markings and not be a dun. The old catch-all d is gone; the baseline allele is d2, so summon with dun=D/d2, not dun=D/d. 235 :common:test pass (8 of them a new DunGeneTest), :neoforge-26.1.2:build is green.

Another fresh world

The dun segment’s allele tokens changed, so a save from before this will not parse its dun locus. Start a fresh world. Every one of the 240 pre-existing golden rows is byte-identical though — only the 12 new d1 cases were added — so nothing else about any coat moved.

0.1 Sex is a gene (new 2026-09-03)

Sex-linked genes, first half: horsegenetics.sex is registered at priority 1 with alleles X / Y. HorseRecord.sex is no longer a field — it is read off the genetic code — and HorseRecords.randomSex is gone, so a foal’s sex is inherited rather than rolled. 227 :common:test pass, parity is 3,832 checks across 48 cases, :neoforge-26.1.2:build is green and runServer boots clean at 20 segments.

Every horse in an existing world is a different horse, again

The genotype code gained a segment and every gene’s epigenetic seed shifted with its position in codeOrder(), so a save from before this change will not reproduce its horses. Start a fresh world. (90 of the 240 golden rows are byte-identical — the deterministic coats — which is the proof the pipeline itself did not move.)

0.2 The combination-table rewrite — no more dominance (new 2026-09-03)

The combination table: DominancePattern is deleted; every gene declares an Expression per distinct outcome and one function mapping any allele combination to one of them; randomPair is replaced by a per-combination FounderTable; cream and pearl merged into three-allele MATP; the JSON gene format moved to "format": 2; and the epigenome moved onto HorseRecord (the separate coat attachment is gone). 213 :common:test pass at the time (227 now), parity is 3,832 checks across 48 cases, runServer boots clean (19 segments then, 20 since the sex locus). Machinery: Genetics model, the gene file format, MATP.

Every horse in an existing world is a different horse

The genotype code lost a segment (cream + pearl → MATP) and founders now draw one nextFloat() per gene instead of two nextInts, so old saves will not reproduce their horses. Dev-only, no saves to keep — but start a fresh world rather than wondering why a familiar horse changed.

Known gap: the creator authors one outcome only

The format allows any number of alleles and an outcome per combination; the creator authors a two-allele gene with one visible outcome plus a wild type, which is what its single layer list can describe. A three-allele locus like MATP, or a sabino-style two-outcome gene, is hand-edited JSON. The creator says so in its own hint text; it is not a silent limitation.

0.3 The data-model rewrite — gene priority + gene-keyed codes (2026-09-03)

Gene priority: every gene has int priority(); all orderings derived by sorting on (priority, key); genotype / epigenome code strings are now gene-keyed (<geneKey>=…) and tolerant. 195 :common:test pass, runServer boots clean. (Superseded in part by §0.2, which reran all of it.) Machinery: Genetics model.

Confirmed 2026-09-03: wild spawns render their correct coats (no regression from the new codeOrder() / code format), and the right-click paper genome dump works.

Still to check:

0.4 Horse care — gated healing, bond & herds (new 2026-09-02)

First slice of horse care, all in server/HorseCareHandler + server/BondFollowGoal. Nothing seen in a running game. Full machinery: horse-care.

1. Drop-in genes actually load — the top item

New 2026-09-02, and the whole point of the gene creator: nothing about it has been seen in a running game. Baseline note: as of 2026-09-02 example.waterborn and example.suntouched ship loaded (classpath index), so a stock in-game genotype code is 41 segments (39 built-ins + the two shipped spec genes). Dropping one more gene in takes it to 42. To test the drop-in path:

  1. Open the creator, pick Load an example → Tobiano, and Download. Note what the preview looks like — that is the claim being checked.
  2. Drop tobiano.json into neoforge-26.1.2/run/phc/genes/. The folder and its README.txt should already be there from a previous launch; if not, that is itself a finding.
  3. ./gradlew :neoforge-26.1.2:runClient and read the log for [genes] loaded 3 data-driven gene(s) (Suntouched + Waterborn + Tobiano) and the genotype code now has 34 segments. (The fixture is example.tobiano — a different key from the built-in horsegenetics.tobiano, so both coexist.)

What to look at:

Also worth an eyeball

The creator itself, opened straight off disk (file://) as well as served: the 3D horse should appear and orbit, clicking it should report a body part and a body-space point, and the “show area” checkbox on a layer should highlight exactly the texels that layer covers. If three.js is blocked the flat sheet must still bake — that fallback is untested.

1b. Natural zebra striping (new, NOT looked at)

Codominant and 1 in 60 per allele, so shadow-striped horses (Zeb/n) are around 3% of wild ones and a full Zeb/Zeb is a breeding project — summon one with natural_zebra=Zeb/Zeb, or breed two shadow horses. It shares its painter with magic zebra, so a lot of what follows verifies both.

2. Magic zebra

New 2026-09-02. 1 in 100 per allele, so do not wait for a wild one: the dimension’s pens force a magical gene half the time, or summon one with magic_zebra=Mzeb/Mzeb in the code. Note the pair — it became codominant 2026-09-11 and Mzeb/n is no longer the full pattern. What to look at:

3. Pink hair

New 2026-09-02. Recessive, so only Pihr/Pihr shows and a wild one is about 1 in 144 — use the dimension’s pens (they force a magical gene half the time) or a summon.

4. The horse dimension is random pens now (new 2026-09-04)

The gallery is gone. Each pen rolls its own ShowcaseGenotypes.random draw instead of holding a catalogue entry, and the corridor is a fixed 2,000 pens (about 7,000 blocks) rather than a length derived from the genotype space. This replaces the old items 4, 6 and 7 — do not go looking for catalogue order.

Enter with F6 (or a hay portal) and walk 20–30 pens:

Leave and re-enter — this is the item that changed shape. Blocks are still left standing on teardown, but the contents are random now, so:

5. The three-phase pipeline refactor — lowest priority

CoatPipelineGoldenTest proves 20 genotypes × 3 seeds × adult/foal compose byte-identically to the pre-refactor code, so no coat is expected to have moved. The one thing the test cannot cover is that it runs against a synthetic 16×16 gradient and a flat template, not the real 500×500 redblackgradient.png and horse_white*.png.

So: on the next runClient for any other reason, glance at a magic-zebra horse (black stripes on any base, dominant white included) and at any dominant-white horse. Nothing else needs looking at. (This item used to name the Test gene, which was removed 2026-09-05.)

6. The custom spawn egg, rebuilt (new 2026-09-04)

The editor is a different screen now: every registered gene down the left in alphabetical order by its display name, a live 3D horse in the middle, and age / sex / reroll / copy / paste / reset / spawn down the right. Open it by right-clicking with the custom horse spawn egg.

7. The old spawn-egg follow-ups, re-check after the rebuild

Both 2026-09-02 fixes were in the code the rebuild replaced, so confirm they still hold: the screen’s backdrop must not draw over its own buttons (widgets render during super.extractRenderState), and nothing may run off the bottom of a short window.

8. Foals — only spot-checked, needs a real pass

Every treatment should apply on HdBabyHorseModel: a bay foal with black points and leg black, a splash foal with white socks, a champagne foal gold, a grey foal born its base colour and greying when grown. The baby head and neck geometry is a rest-pose AABB approximation — watch the face and neck for odd dark patches or misplaced marks.

9. Per-allele epigenetics + the grey rework

New 2026-09-01, not seen in-game.

10. The epigenome persists across save → reload

Bay leg heights, grey dapples and splash markings identical after a reload.

Start a fresh world

The attachment format changed (epigenetic_seed: longepigenome: String), so an existing dev save’s horses cannot read their old coat attachment — they will re-found epigenetics, or the attachment errors outright. That is the no-back-compat rule working as intended.

11. Everything else

ItemHow to check
breedNth foal names past foal 1Breed one pair 7+ times: foal 1 = parent combo, foal 2 = the other combo, foals 3–6 = one parent name half + a random word, foal 7+ = fully random, no repeats. HorseNames is unit-tested; the live offspringCount(dam, sire) link is unproven.
FamilyTreeScreen scroll modeThe default shrink-to-fit chart is confirmed good; the other path is not. Flip familyTree.scrollBar true in phc/client.toml and check the wheel and the right-edge thumb.
Stats surfacesFoal speed/health landing on the entity’s attributes; the inventory-panel green/amber/red tint vs parentStats; the paper dump’s vs parents line.
Compact gene codeGeneCodeDisplay.shortForm on the surfaces not specifically eyeballed: the paper dump’s genetic code: line and the mounted info panel’s word-wrapped block.
Water riding feelHorseWaterRidingHandler — the speed cap (0.09 b/t) and the submerged lift are a first guess.
Debug coat-gen chat lineShould be quiet in a release build. It fires correctly in dev; the !FMLEnvironment.isProduction() gate is unproven.

12. Dev test worlds delete themselves

New 2026-09-01, client/DebugTestWorldCleanup. Click Spawn Test Horse World on the title screen, play a bit, quit Minecraft normally (Save and Quit → Quit Game). Check:

13. Gene effects — the Waterborn & Suntouched genes

New 2026-09-02, and the proof that the data-driven effects pipeline works in a running game. Waterborn and Suntouched ship loaded (classpath index in the NeoForge module) — boot log shows [genes] loaded 2 data-driven gene(s) / 13 segments with no config drop. Gene pages: Waterborn, Suntouched. Fastest test horse is the custom horse spawn egg (item 14: add the gene, spawn).

Confirmed in-game 2026-09-02:

Still to check:

Suntouched — the glow verb. Confirmed in-game 2026-09-02: the emissive gold mane + tail render and look good, the gold-dust emitter shows, and the horse lights the area around it (the trailing minecraft:light block).

Still to check:

14. Custom horse spawn egg — what survived the rebuild

The screen was rebuilt on 2026-09-04 (item 6 above is the new surface). Three things from the 2026-09-02 pass are still worth a look because the rebuild kept the behaviour but not the code:

Carried over, differently: the modal “+ Add gene” picker is gone, but adding is not — the list itself is the picker now, and the “a new row lands on the allele that does something” rule is still there (item 6). Retired outright: the survival egg-consumption path, since the spawn is creative-only.

15. The gameplay-layer items

Built 2026-09-02: 17 items for the gameplay layer. Most are still behaviourless (item + recipe + creative tab only); the two seed jars have behaviour — see §16. Registered in item/ModItems; one Horse Genetics creative tab (item/ModCreativeTabs) holds all of them, and the custom horse spawn egg still also shows in the vanilla Spawn Eggs tab. Every item except the two stall signs (which borrow the vanilla oak-sign icon) has owner-supplied art.

16. Stallion seed jar — collection + impregnation (first slice)

Built 2026-09-02 (server/StallionSeedJarHandler, the horsegenetics:stored_genome data component, common/genetics/GenomeSample, and the shared HorseBreedingHandler.applyBredFoal). First test 2026-09-02 found the held jar never changed in creative (result went to another slot); fixed — the jar now transforms in the player’s hand, creative included. Owner also asked that the horse be in breeding mode first (fed a carrot / apple — isInLove()); that gate is now on both ends and the love state is consumed by the op. Partly owner-confirmed 2026-09-02 (collection + tooltip work; genome-string display bug is a separate open issue, the data itself is right). Still to check:

Explicitly not built (don’t flag as bugs): the breeding-mode gate is vanilla love, not one of this mod’s breeding carrots (they still do nothing); no 30-second timed window beyond however long love lasts; no gestation delay (foal is immediate); no carrot effects on the jar. Family tree may not draw the sire node (the jar stores the donor UUID but the stallion isn’t necessarily loaded).

17. Whistles — recall your tamed horses

Built 2026-09-02 (item/WhistleItem). Not play-tested. Right-click anywhere (air, ground, a block) holding a whistle: every tamed horse you own within range, in the same dimension, not being ridden, is teleported to a spot beside you (spread on a grid). Ranges: basic 16, golden 32, echo 64 blocks. ~3-second use cooldown.

18. Stall signs — bind a horse, define its stall

Built 2026-09-02 (item/StallSignItem, server/StallSignHandler, server/StallDetector, server/StallDebug, data/StallData + data/StallRecord + data/BoundHorse). Not play-tested. Both stall-sign items are in the Horse Genetics creative tab and the debug-world inventory; they borrow the vanilla oak-sign icon for now.

Not built (don’t flag): teleport-to-stall / auto-return (that is the tickets); a persistent in-world wireframe (the overlay is a one-shot particle flash); any cleanup other than breaking the exact sign block (rebuild the wall elsewhere and the record goes stale).

19. The dilution and non-KIT pattern genes

Built 2026-09-02 — dun, silver dapple, mushroom, roan, tobiano and frame. Hand-written Genes in common/genetics/genes/. All are rare in the wild (1/24–1/60 per allele); summon them with dun=D/d2, silver=Z/z, mushroom=Mu/Mu, roan=Rn/rn, tobiano=To/to, ednrb=O/N. Sabino has moved to the KIT locus and frame to EDNRB — both are checked in §0, the white-pattern loci, not here. Sample bakes look right; nothing seen on the 3D model. What to check:

Update this page after every play session. This is “built, not yet seen”; the roadmap is “not built at all”.