Sizecurve by Bananafest Destiny

Which size goes first: we counted it instead of assuming it

In a broken run, the middle size is gone about 89% of the time. We published that on 16 September from 190 stores. We have since read 159 stores we had not seen then, and in those alone it is 90.7%. The ends are the part that moves.

16 September 2026, held-out check added 19 September · re-read from data already on disk · zero new requests to anyone

Our first report measured how often a style's size run breaks: about one buyable style in ten, in two samples drawn separately. What it did not measure — what it only drew as a diagram — is where in the run the breakage lands. We had been telling merchants that runs break in the middle. That was the pitch before it was a finding.

We had the data already. A third list of 158 stores, sourced later for a different job (finding merchants to write to, not to publish about), sat scanned and cached. Re-reading cached responses costs nobody a second request. So we counted it, then pooled it with the two published samples to check the shape held everywhere, not just in the newest list.

The shape

For every style with a broken run, we recorded which sizes in its core were gone and which were still buyable, and pooled all three samples: 190 stores with a readable size run, 4,495 broken alpha-sized runs read in full.

56%XXS
62%XS
78%S
89%M
79%L
72%XL
60%XXL

Of the broken runs that offered each size, the share that no longer do. Read as: of the 4,495 broken runs that offered an M, 89% no longer do.

sizegoneof runs offering it%
XXS7681,36856.1%
XS2,5334,12261.5%
S3,5214,49478.3%
M3,9894,49588.7%
L3,5694,49479.4%
XL2,9784,16671.5%
XXL1,3212,20859.8%

Held out: 159 stores we had not read when we published this

The table above is the whole reason to install anything we make, which is exactly why it should not be taken on our word. It was computed once, in one pass, over the stores we happened to have. A finding that convenient wants a sample that could have embarrassed it.

Three days later we had one. Sourcing work for something else put another 159 storefronts on disk, read on 19 September — after the sentence above was written and published. None of them were in the pool it was computed from. Running the same count over those alone is a held-out check, not a bigger version of the same count, and it is the only kind of check that can actually fail.

sizepublished, 16 Sepheld out, 159 new storesmoved
XXS56.1%52.0%−4.1
XS61.5%53.0%−8.5
S78.3%76.0%−2.3
M88.7%90.7%+2.0
L79.4%79.5%+0.1
XL71.5%65.3%−6.2
XXL59.8%58.3%−1.5

4,149 broken alpha runs across the 159 held-out stores, against 4,495 in the published pool. Pooling everything we have read — 438 stores, 9,041 broken alpha runs — puts M at 89.3%.

The middle held. The ends did not. M and L moved by two points and a tenth. XS moved eight and a half, XL six. That is the same thing the first report found when it tripled its own sample and had to withdraw a headline: the figures that sit on a large, stable base replicate, and the ones sitting on the thin tails of a distribution wander. XS and XL are offered by fewer runs and are the first sizes a brand drops when it trims a range, so their denominators are both smaller and more variable.

So the claim we will keep making is the narrow one. The middle of a broken run is empty roughly nine times in ten, and it is the most reliable number on this page. The 56–60% figure for the ends that the first version of this standfirst quoted was too precise for what the data supports; read as “roughly half to two-thirds, and it depends which list you read,” it is fine, and that is how it is written now.

The count is reproducible: scan/position.py in the repository derives the held-out column (--since 2026-09-17) and the 438-store pooled figure from the cached scan files. It does not reproduce the 16 September column, and this is worth saying rather than glossing: that table was computed by hand and the script was not kept, so the left-hand column above is the claim as published and not something we can re-run. Re-deriving it from the same directories today lands M at 88.2% rather than 88.7%, because the pool is not defined identically. A number you cannot re-run is a number held on trust, including by us, which is why the script exists now and why the check that matters is the right-hand column.

Numeric runs (waist and dress sizes, pooled 24–46) show the same rise and fall — low 60s at 24, high 70s through the low-to-mid 30s, high 70s through 38–40, back down through the 40s — but noisier, because the tails are thin: size 46 is only 2.2% of the numeric sample, against 16.5% at 36. We are not going to hang a headline on a number with 107 observations behind it. The alpha table is the one we stand behind; the numeric runs are corroborating, not load-bearing.

The objection, first, because it is obvious

M is gone most often because M sells most often. That is true, and it is not a defence, and nobody here is claiming a merchant did anything wrong. A store that sells more M than XXS will run out of M more often — that is not a finding, it is arithmetic, and we are not pretending otherwise.

The finding is what that arithmetic does to the run once it happens. A size curve bought flat — the same units of every size, the easiest thing to order and the thing most buying tools default to — guarantees that the size with the most demand is also the size that runs out first, and by the widest margin. The style does not go fully sold out; it goes on selling everything except the size most people wanted, for however long it takes to reorder, while still showing as “in stock.” That is not bad luck. That is what a flat curve does every time, and the middle-sizes-empty-first pattern is the visible symptom of it, not a separate problem.

So the honest reading of this table is not “stores are careless about M.” It is: the size most likely to decide whether a style is still worth showing on a category page is the one least likely to still be there.

Method

Same instrument, same rules as the first report: public /products.json only, robots.txt obeyed per host, one request at a time, no accounts, no customer data. This report adds nothing new to that list, because it made no new requests at all — every number above comes from responses already cached on disk from the earlier scan and from sourcing work done since. A parser fix or a new question should cost us an afternoon re-reading a directory, not cost a stranger's server a second sweep. That is the rule this report was written to prove we actually follow.

What we checked before publishing this

A number this convenient — it confirms the exact thing we sell — does not go on the site on the strength of one pass.

It holds inside each sample separately. Not just pooled. The listicle sample (54 stores), the independent-label sample (44 stores) and the prospecting sample (92 stores) were compiled by three different people for three different reasons at different times. M comes out at 88%, 90% and 90% in the three samples taken alone. The ends move more between samples than the middle does.

It survives removing the largest contributors. We dropped each of the six stores contributing the most broken styles, one at a time, and recomputed. The largest single store in the pool is 458 broken styles out of 4,495; removing it moves M from 88.7% to 88.9%. No store is carrying this finding.

We ruled out the version of this that would have been circular. Our own scanner labels a run “broken” only when every core size is gone — which means M is gone by definition in that subset, and reporting that figure would have been reporting our own label back at ourselves. The 89% above is not that: it is measured over every broken run, including the ones where only some core sizes are gone, so M being the one most often on the missing list is a real, checkable pattern and not a tautology. We are saying this plainly because we caught ourselves about to publish the circular version and do not want to be trusted less carefully than we would trust someone else's number.

What this does not show

It does not show demand. We cannot see how many units of M this store sold before M sold out — from outside a storefront that number does not exist. It is possible, though we think unlikely given how consistently the shape repeats, that some of these stores stock M generously and it still moves fastest for reasons that have nothing to do with buying discipline. What the pattern shows is the outcome, at scale, across stores that have never spoken to each other: whatever the cause, the middle empties first and stays empty longest, on the majority of the styles that break at all.

Is your own middle empty right now? The check below reads your public catalogue the same way this scan read theirs and names the styles.

This takes you to the check with the address already filled in. Nothing is read until you press the button there — no login, no install, nothing private.