Natural gene / X-linked

Brindle (MBTPS2)

Irregular white streaks, soft-edged and broken, running down from the topline and not matching from one side of the horse to the other. It is the mod's only sex-linked gene, and that is the point of it: a stallion has one X, so he carries one copy and can never be a carrier, while a mare needs two. The trait runs visibly down one side of a pedigree in a way no autosomal gene can.

What it does

What to look for: soft, broken white streaks running down from the back, and not matching on the two sides of the horse. That mismatch is the giveaway — no other pattern here does it.

It is inherited differently from everything else. It rides on the X chromosome, so a stallion has only one copy: he either shows it or does not, and can never carry it hidden. A mare needs two copies to show it and can carry one silently. In practice that means it appears far more often in colts, and a mare can pass it to sons who show it when she does not.

Crossing two of them

Its gene carrot

Gene key
horsegenetics.brindle
Priority
36 (natural band, with the dilutions)
Inheritance
X-linked
Alleles
Brn n Y (reserved)
Combinations
6, of which 5 can occur (Y/Y cannot — every horse has an X) — 3 outcomes
Outcomes
wild, brindle-carrier (a wild type), brindle
Default allele
n
Wild frequency
2% per X — so 2% of wild stallions and 0.04% of wild mares
Founder draws
1 × nextFloat() (from a sex-aware table)
Coat effect
white streaks over barrel, quarters, neck and upper legs — non-deterministic
Field
coat.pattern.BlaschkoStripes
Epigenetic draws
1 long + 3 nextFloat
Notation
a stallion's single copy displays as X-Brn
Rebuilt, still not play-tested

The inheritance is unit-tested to textbook ratios and the sample bakes (:common:bakeCoatSamples, the brindle_* images) read as brindle in an orthographic unwrap — asymmetric, broken, white. What has not been seen is a brindle horse in the world, at any distance. Checklist on To be verified.

The combination table

CombinationWhoOutcomeEffect
n/nmarewildNothing
Brn/nmarebrindle-carrierNothing shows — but half her sons are brindle
Brn/BrnmarebrindleThe stripes
n/YstallionwildNothing
Brn/YstallionbrindleThe stripes — one copy is all he has
Y/YCannot occur. Every horse takes an X from its dam.

The crosses — this is the whole appeal

A stallion gives his X to every daughter and his Y to every son. So brindle does something no other gene in the mod does: it skips the male line entirely for one generation and comes back through the mares.

PairingColtsFillies
brindle stallion × plain mare0% brindle0% brindle, 100% carriers
plain stallion × carrier mare50% brindle0% brindle, 50% carriers
plain stallion × brindle mare100% brindle0% brindle, 100% carriers
brindle stallion × carrier mare50% brindle50% brindle, 50% carriers

Read down that table and the breeding project writes itself: a brindle mare is the prize, she needs a brindle sire and a dam carrying it, and once you have her every son she throws is brindle for ever after. Measured over 4,000 foals per pairing in BrindleGeneTest.

In the wild: fifty stallions to one mare

A stallion needs one copy and a mare needs two, so at an allele frequency of p the rates are p and — a factor of 1/p apart. At 2% that is 2% of stallions against 0.04% of mares, measured at 40:1 over 200,000 founder draws. A player will meet several brindle stallions before they ever meet a brindle mare, and will notice the asymmetry a long time before they know the reason for it.

How a hemizygous horse is stored

A genotype is one AllelePair per gene — two slots, always — and sex linkage does not change that. A stallion's second slot holds a reserved Y allele meaning "this locus is not on the Y". That is what keeps the change small: Genotype is untouched, the epigenome stays aligned slot-for-slot (the reserved slot simply carries epigenetics nothing reads), the code string keeps its shape, and parsing needs no special case because Y is a declared allele of the gene like any other.

The reserved allele is declared last, which is load-bearing rather than tidy: AllelePair canonicalises on declaration order, so declaring it last is what puts a stallion's real allele in the first slot. Registration refuses a sex-linked gene that gets this wrong, because the failure otherwise is not an exception — it is a gene that quietly misbehaves for exactly one sex.

On screen a hemizygous copy is written with an X- prefix (X-Brn) rather than beside its own placeholder, which would read as a homozygote of something. The prefix is unambiguous on sight because - is the gene separator in a code string and can never appear inside an allele token. The code string itself is unaffected: the token stays Brn.

What it paints

White streaks. Not a dilution of the horse's own colour and not stripes of a second one — a brindle streak goes to white hair and stops there, so the pattern reads the same on a black, a bay, a palomino or a grey. It goes through PigmentField.whiten, the shared move every white marking in the mod uses, which is what keeps a streak through a black horse on the gradient's neutral column: it fades through greys rather than walking sideways into the browns, which is what scaling the two pigments together would do.

That also keeps brindle inside phase 1's restrict-only contract with room to spare. White is what is left when all the pigment is taken away, which is the one thing phase 1 is always allowed to do — where a darker stripe would have to be countershading, the way dun's d1 does it.

Why it does not share the zebra field

Brindle and zebra look superficially alike — “stripes on a horse” — and for one build they shared BodyStripes. That is what made both of them wrong. They are not the same picture and they do not come from the same place.

Zebra (ZebraStripes)Brindle (BlaschkoStripes)
causea patterning system laid over a body mapX-inactivation mosaicism — which cell clone won, where
edgescrispsoft, wavy, tapered
symmetryroughly matched side to sidenone — a streak on the right need not exist on the left
continuitya band runs the whole waybroken: streaks fork, fade out and reappear
widthfairly even along a bandvaries within one streak — narrow at the back, broad on the barrel
shapevertical, arcing over the hipa lazy S down the side
legsrings all the way rounda few crosswise strokes, upper leg only
headstriped, dark muzzlenothing

The asymmetry is the gene, not a garnish

A plain stripe field phases on |z|, so whatever it draws on the right it draws on the left. A brindle mare is a functional mosaic: early in development each patch of her skin randomly silenced one of her two X chromosomes (lyonisation), and as those clones expanded over the foetus they wrote the pattern. The two sides of her were coloured in by different draws. That is the whole reason the pattern exists, and a field that cannot express it is drawing something else.

So each band is rolled twice — once for the horse's right, once for its left — and the texel reads whichever side it is on, blended over two body units either side of the spine so the two meet without a cut down the topline. Two copies of the same allele, two independent answers.

Blaschko lines, and the shape they make

BR1's streaks broadly follow Blaschko lines — the developmental paths skin-cell clones trace as they proliferate and migrate. They are not a fixed tiger-stripe layout: they flow in different directions on different body regions. The useful mental sketch is

a V at the topline → long descending S-like streaks on the barrel → shorter vertical streaks on neck, shoulder and hip → irregular transverse strokes on the upper limbs.

RegionWhat BR1 looks like thereWhat the field draws
Back / topline The visual source of most of the pattern; on the dorsal midline the arrangement tends toward V-shaped or chevron-like, with streaks descending from there onto each side. A slant on |z| — the same chevron that stops a constant-X face rendering as one flat band.
Barrel / flank The clearest area. Mostly vertical to slightly diagonal, descending toward the belly; on the barrel they curve, taper, split or merge rather than staying parallel. A phase in X plus a sway that pushes the middle of a streak forward and lets both ends trail — the S — plus a noise warp.
Belly / underline Fades or becomes fragmentary; streaks terminate, soften or taper before reaching the lowest belly. They never make neat horizontal belly bands. Coverage faded out below the bottom third of the barrel box.
Neck A common and often highly visible location — a mane-to-shoulder waterfall of streaks running lengthwise from the crest toward the throat, uneven in width, with blurred jagged borders. The same field at 0.90 strength, without the sway: the neck is too short for an S to be anything but a wobble.
Upper legs Where the limbs are involved it is the upper leg, and the pattern wraps more horizontally than the body's — irregular partial bands, broken rings, short transverse streaks. A phase in y instead of x, windowed to the forearm and gaskin at 0.75 strength.
Head, mane, tail The head is not a defining location and can be nearly unaffected; a normal mane and tail do not rule BR1 out. Nothing at all — which also keeps the pattern off the head, where the rest-pose projection is only approximate.

The knobs, and the one that bites

KnobRangeWhat it does
nextLong()The warp, break and per-band field's seed
spacing2.0–3.2 body unitsSeven to eleven streaks along the 22-unit barrel, before the break field and the per-side roll take some away
duty0.16–0.30Mean fraction of each period that is streak, before the per-band width hash varies it — much thinner than the gaps
warp0.4–0.95 body unitsHow far the noise bends a streak off its plane
The first pass drew a soft-edged zebra

Duty ran 0.30–0.46 with a soft edge 0.22 of a period wide on top, which put about as much white on the horse as coat — and a horse whose light and dark bands are the same width reads as a zebra with the edges rubbed out, whatever the field underneath it is doing. The break field was gentle for the same reason: a threshold of 0.32 sampled over a long stretch of body removes one end of a streak rather than punching a series of gaps in it.

Both came down together in the same pass — duty and the edge that scales with it, then the break threshold up and its feature size down, so a streak now arrives as four or five short dashes rather than one long bar. The pattern only reads as brindle when the coat is plainly the ground and the streaks are marks made on it.

The warp has to stay well under half the spacing. Brindle is a smeared pattern and the temptation is to warp it hard, but once the warp exceeds the gap between two streaks they bend into each other and the whole thing stops being stripes. The first build ran a warp of 1.6–3.0 against a spacing of 1.5–2.8 and baked out as convincing wood grain.

A fourth number is a constant rather than a knob: the coverage is gained above 1 before it is whitened. A brindle streak is white, so the core of one has to reach white — and the raw coverage rarely does, because the field multiplies the soft edge profile by a per-side presence roll and a break field. Saturating takes the core all the way while leaving both the edge and the streaks the rolls have genuinely damped, soft. Without it every streak came out a tan smear, which is to say a diluted stripe, which is the thing this deliberately is not.

Stored values, on the expressing copy: seed for the streak field, then spacing, duty and warp — read by name, so the gene can be re-tuned without repainting every horse that carries it.

The biology, and what is deliberately left out

BR1 is an intronic splice-site change in MBTPS2 (originally reported as c.1437+4T>C), inherited X-linked semidominant. MBTPS2 is a skin and hair gene, so real BR1 is best understood as a hair-texture trait that is sometimes accompanied by lighter or darker pigmentation — stripe hairs are reported as less straight and more unruly than the surrounding coat, and in some horses the texture difference is more obvious than any colour shift. Expression also changes with the season: a winter coat can look diffuse or moth-eaten rather than sharply striped.

None of that is modelled, and the reasons are the same reason: the mod has one channel, and it is colour. There is no hair-direction or hair-quality attribute for a texture difference to live in, no seasons, and no ageing. So the gene draws the pigment half of the trait at its most legible — white — and the texture half is a line in this paragraph.

Two further real-world details are deliberately absent:

  • The homozygous mare and the hemizygous stallion are supposed to lack the stripes. In the original pedigree, XBR1Y males and XBR1XBR1 mares showed sparse mane and tail and not the classic striped coat — because the classic pattern needs a mixture of normal-X-active and BR1-X-active clones, and neither of those genotypes has one. The mod inverts this: those are exactly the combinations that show. It is a deliberate trade — the real rule makes the visible phenotype an exclusively heterozygous-mare affair, which is a locus with no breeding target and nothing for a stallion to carry visibly. What is kept is the part that makes the pedigree interesting: one copy for a stallion, two for a mare, and a pattern that skips the male line.
  • Chimerism. Many brindled-looking horses are not BR1 at all: two genetically distinct cell populations, often from fused early embryos, whose boundaries read as streaks. It can affect either sex and is not predictably heritable — which is precisely why it is not here. There would be nothing to breed.

The scaffolding it proves

Brindle is the first user of Inheritance, and everything it needed is general:

  • Gene.inheritance()AUTOSOMAL (the default), X_LINKED or Y_LINKED.
  • Genotype.breedWith routes the sire's copy by the foal's own sex instead of drawing it. Sex is priority 1, so it is always already decided by the time any other gene is reached. The second coin is still flipped and thrown away — two booleans per gene is an invariant a lot of things lean on, and a locus that quietly consumed one would make the random stream depend on a foal's sex.
  • Gene.sexConsistent drops combinations no horse of either sex could carry, so the catalogue does not enumerate them and the random splice cannot roll them.
  • Gene.realAlleles — two for a diploid horse, one for a hemizygous one — is what a sex-linked gene's expressionOf counts. "Every real copy is Brn" covers "recessive in mares" and "always shows in stallions" in one sentence with no special case.
  • A sex-aware founder table. A stallion's is written out rather than derived from Hardy-Weinberg, because Hardy-Weinberg is a statement about diploid loci and this one is not.

Y-linked is built but has no gene. The mirror case works — a mare's pair is two reserved X placeholders, a stallion's is a placeholder plus his one real allele — and is waiting for a gene that wants it.

Not modelled

Sexual dimorphism in the coat is a different thing entirely and is unbuilt: the sex locus paints nothing and deliberately never will, so a stallion's crest would be a separate gene reading this one. Also not planned at all: imprinting, crossing over, linkage.

Mosaicism is a special case and needs saying carefully. There is no general mosaicism in the model — a genotype is one pair per gene and every texel reads the same one. What this gene has is the look of a mosaic, painted: BlaschkoStripes rolls each band independently per side, which produces the asymmetry X-inactivation produces without any of the machinery. It is a drawing of the phenomenon and not an implementation of it, and nothing else in the mod can reach it.