← All posts

What a Placeholder Row Does to Your Averages

2026-10-21

A single bad default can corrupt an average by two points while leaving the headline number looking fine. Here is the arithmetic.


> Update, 2026-10-22: This backlog has been cleared. All 174 entries now carry full six-dimension scores and valid rationales; the unevaluated state described below no longer exists in the directory. The post is left as written, because the explanation of how the defect happened is the part worth keeping.

We have 765 rows in the skills table. 174 of them were imported and never evaluated: their structure, content, and engineering values are exactly zero.

The damage, dimension by dimension:

DimensionAll 765 rowsFully evaluated 591Distortion
Structure6.478.37−1.90
Content6.868.88−2.02
Engineering6.598.53−1.94
Security9.219.69−0.48
Workflow8.118.20−0.08
Trigger7.837.72+0.11
Overall score8.408.53−0.13

The headline number barely moves

The overall score drops by 0.13 points — small enough to pass unnoticed, and small enough that every published aggregate would have looked plausible.

The reason is that the placeholder rows carry a plausible score (average 7.97) rather than zero. Whoever designed the default chose a reasonable-looking value, which is exactly what made it invisible.

The dimension averages collapse

The three zeroed dimensions move by roughly two points each. A reader told that "structure averages 6.47 across the ecosystem" would draw a strong conclusion about how skill authors write. The true figure is 8.37. The conclusion would be backwards.

This is the practical hazard of missing data: it does not look missing, it looks like a measurement. And it distorts exactly the columns where it appears, while leaving the summary statistic intact.

The test that catches it

Before computing any average, ask of each column: could this value have come from a default?

In all three cases the giveaway is suspicious roundness or repetition. Real data is lumpy; defaults are uniform.

The fix, in order of value

  1. Use null, not zero, for "unknown". Zero is a measurement. The absence of a measurement needs a different state, and every aggregation must decide explicitly what to do with it.
  2. Make the default loud. An unevaluated record should be visibly incomplete in the UI, not silently presentable.
  3. Run a completeness report with every batch. Count rows with null dimensions, fallback strings, and placeholder scores; refuse to publish aggregates that include them.
  4. None of this is specific to skill directories. It is the standard data-quality discipline that a fast-moving importer tends to skip, and the cost is a published statistic that is wrong in the direction of looking reasonable.