Before you put a NUMBER in front of a maintainer — "N tickets affected", "X% of cases", "this run is 13% slower" — establish what that same number would be if nothing were wrong, and report the ratio. Build the floor by comparing against something that SHOULD be identical: repeat the measurement (N≥5), or shuffle the one variable your claim depends on and keep everything else fixed. If the signal is under ~2x the floor, say so yourself before the reviewer does. Use when you are about to quote a count, a percentage, or a performance delta in an issue, PR description or mailing-list post. Trigger terms: benchmark, regression, faster, slower, N tickets, X percent, how many, count, delta, improvement, is this significant, noise, variance, baseline.
A number is the most persuasive thing you can hand a maintainer and the easiest thing
to get wrong. "14 of 19 operations regressed" and "917 records are stale" both read as
findings, and both can be exactly what you would see if nothing at all were wrong —
because measurements repeat differently, and because base rates produce coincidences
at scale.
The fix is one question asked before publishing: what would this same number be if
there were no effect? Answer it by measuring, not by estimating. Then quote the ratio,
not the raw count. A maintainer who sees 917 vs 633 expected by chance can act on it;
a maintainer who sees 917 and later discovers the floor has learned that your numbers
need checking.
This is cheap, it is often a single extra loop or a shuffle(), and it is the
difference between a claim that survives review and one that gets quietly discounted.
When to use
You are about to write a number into an issue, a PR description, a benchmark report
or a mailing-list post — a count, a percentage, a rate, or an A-vs-B delta.
You ran a performance comparison, in any form. One run per side is a demo, not a
result.
You mined a corpus (issues, commits, logs) and are about to report "N items match".
A tool you are using reports a variance statistic (RSD, stddev, confidence interval)
and you were about to read only the mean.
When NOT to use
The property is deterministic and unique: a stack trace, a compile error, "this
command cannot run at all", "the parameter is not in the code". aggregate crashing
unconditionally needs no floor — it either runs or it does not.
The measure is already relative to a control population by construction (rates
reported as open vs closed, treatment vs holdout): the comparison group is the
floor. Say that, rather than building a second one.
A status nobody sets by accident (Patch Available, an explicit approval, a
human label): a chance model for a deliberate act is not meaningful. Argue it in one
line instead of computing it.
You are reporting a single reproduced defect. n=1 with a reproduction and a
control is evidence; do not dress it as a statistic.
The practice (checklist)
Name the variable your claim depends on. "917 edges went stale" depends on
which closure paired with which edge. "Lucene 11 is 13% slower" depends on
which build ran in which run. Write it down — the floor is built by
destroying exactly that and nothing else.
Build the floor by comparison, not by estimate. Two routes:
- repeat — run the identical configuration N≥5 times and take the spread
(RSD, stddev). If the tool computes it for you, use the tool's number, not
your intuition;
- shuffle — permute the dependent variable, hold graph/structure/marginals
fixed, repeat ≥3 times with a fixed seed, and take the mean and spread.
Done when you have a floor and the floor's own variability, so you know
whether the floor itself is stable.
Compute signal ÷ floor and write it in the artifact. Not the raw count
alone. 917 vs 633 (1.45×). 95 vs 55 (1.74×).
Narrow the filter and re-measure. A real effect gets further from chance as
you make the criterion more specific; a base-rate artefact does not move. This is
the single most convincing check you can show a reviewer, and it costs one rerun.
Disclose a weak ratio yourself. Under ~2× is worth reporting with the ratio
attached and the interpretation softened — "N against M expected by chance". Do
not drop it and do not inflate it.
State which null model you used and one you did not. A shuffle preserves some
structure and destroys other structure; naming the alternative (block-permute
within era, degree-preserving rewire, matched controls) shows the floor is a
choice rather than a fact.
Say where the floor does not apply. If part of your claim is a pure
deterministic join with no random variable in it, that part has no floor — write
that down instead of implying the whole thing was controlled.
Rationalizations
Shortcut
Why it fails
"N=1 each side, the delta is huge, that's enough."
The receipt below: N=1 endorsed a −13% regression, N=2 endorsed it again, and N=5 retracted it. The tool's own RSD over five identical runs was 14.33% — the "signal" was inside the floor the whole time.
"I estimated the noise floor from experience — it's about ±0.2%."
That estimate was off by ~70×. An estimated floor is a guess wearing a number's clothes; the measured one came free from a command that already existed.
"917 is a big number, it can't be chance."
Shuffling the pairing gave 633 from pure base rates. Large corpora manufacture large coincidences; scale is the reason to compute a floor, not a reason to skip it.
"The tool printed a variance column, but the mean is what matters."
The variance column is the floor. In the receipt, 79% RSD on one operation carried a meaningless −53% that would have gone into a report as a finding.
"Adding a floor makes my result look weaker."
It makes it survivable. A 1.45× reported as 1.45× is a contribution; a 1.45× reported as a discovery is a thing the reviewer will find, and then they will re-check everything else you said.
"Throughput was rock-stable between two runs, so it's a reliable metric."
Between two runs. At N=5 the same metric showed 14.33% RSD on the same operation. Two identical-looking runs are not a variance estimate.
RECEIPT
SOURCING-receipt — the discipline retracted one finding and corrected one
published number, in two independent domains. Both are internal measurements, not a
merged PR: this skill's evidence is that it caught my own errors before a maintainer
had to.
1. Benchmarking — N=5 retracted what N=1 and N=2 both endorsed. Task: does Solr on
Lucene 11 regress against Lucene 10.4? Method progression and outcome:
stage
what it said
why it was wrong
N=1 per side
index-append throughput −13% on Lucene 11
nothing to compare the variance against
noise floor estimated from two "identical" runs
throughput stable to <±0.2%, so −13% beat it ~50×
two runs is not a spread; one of them had been starved of CPU by other work on the machine (2.5 h vs ~38 min wall-clock for the same workload)
N=5 per side + the tool's own aggregate
RSD 14.33% on that operation across five identical runs
the −13% sits inside the real floor. Finding retracted.
Two further things the floor exposed in the same campaign: 14 of 19 operations were
throttled, so their throughput is pinned to the target rate by construction and
describes the scheduler rather than the server; and refresh-after-index carried
79% RSD behind a meaningless −53%. Without the floor, a −13% "regression" would
have gone to a mailing list as a result.
2. Corpus mining — a shuffle floor corrected a number I had already published. A
claim of the form "917 records are stale: their dependency closed after the link was
made". Control: shuffle the closure dates among closed records, holding the graph,
statuses and link dates fixed; 5 trials, fixed seed.
count
records
real
917
577
shuffled floor (5 trials, floor RSD 1.6%)
633
440
signal ÷ floor
1.45×
1.31×
So 69% of the count was base rate, and the honest headline is "917 against 633
expected by chance". The check that made it credible rather than merely deflating:
narrowing the filter raised the ratio — restricting to dependency links whose
target was resolved Fixed gave 95 vs a floor of 55 = 1.74×, which is what a real
effect does and an artefact does not.
The same shuffle control, applied to a different claim in the same body of work,
confirmed it decisively — a human label matched the code paths 88% of the time
against a shuffled baseline of 24–27%. The technique is not a way to talk yourself
down; it is the thing that tells the two cases apart.
Lifecycle
Signals it worked: the number you publish is the one that survives — nobody
asks "how many runs?", "compared to what?", or "is that above noise?"; a reviewer
engages with the mechanism instead of the statistic; and when you narrow the filter
the ratio rises, which is the check you can show rather than assert.
Log a misfire when: you shipped a count and then built the floor and it moved
the claim (log the before/after ratio); the floor's own spread was so wide the
comparison said nothing (wrong null model — log which one you used); or you built a
floor for something deterministic and burned time on a chance model for a deliberate
act.
Death criterion: retire this if the houses you contribute to start requiring a
variance statement in their own report templates, so the practice is enforced by the
tooling rather than by you remembering it. Retire the shuffle half if a project
ships a null-model utility you should be calling instead of hand-rolling.
Overlaps:use-the-tool-for-its-purpose
gets you to N≥2 and real data in the first place — this skill is what you do with the
numbers that come back;
verify-before-a-committer-comment
covers correcting a claim you have already made, which is where a late floor lands
you.
1---2name: state-the-noise-floor3description: Before you put a NUMBER in front of a maintainer — "N tickets affected", "X% of cases", "this run is 13% slower" — establish what that same number would be if nothing were wrong, and report the ratio. Build the floor by comparing against something that SHOULD be identical: repeat the measurement (N≥5), or shuffle the one variable your claim depends on and keep everything else fixed. If the signal is under ~2x the floor, say so yourself before the reviewer does. Use when you are about to quote a count, a percentage, or a performance delta in an issue, PR description or mailing-list post. Trigger terms: benchmark, regression, faster, slower, N tickets, X percent, how many, count, delta, improvement, is this significant, noise, variance, baseline.4---56# State the noise floor, not just the count78## Purpose910A number is the most persuasive thing you can hand a maintainer and the easiest thing11to get wrong. "14 of 19 operations regressed" and "917 records are stale" both read as12findings, and both can be exactly what you would see if nothing at all were wrong —13because measurements repeat differently, and because base rates produce coincidences14at scale.1516The fix is one question asked *before* publishing: **what would this same number be if17there were no effect?** Answer it by measuring, not by estimating. Then quote the ratio,18not the raw count. A maintainer who sees `917 vs 633 expected by chance` can act on it;19a maintainer who sees `917` and later discovers the floor has learned that your numbers20need checking.2122This is cheap, it is often a single extra loop or a `shuffle()`, and it is the23difference between a claim that survives review and one that gets quietly discounted.2425## When to use2627- You are about to write a number into an issue, a PR description, a benchmark report28 or a mailing-list post — a count, a percentage, a rate, or an A-vs-B delta.29- You ran a performance comparison, in any form. **One run per side is a demo, not a30 result.**31- You mined a corpus (issues, commits, logs) and are about to report "N items match".32- A tool you are using reports a variance statistic (RSD, stddev, confidence interval)33 and you were about to read only the mean.3435## When NOT to use3637- The property is **deterministic and unique**: a stack trace, a compile error, "this38 command cannot run at all", "the parameter is not in the code". `aggregate` crashing39 unconditionally needs no floor — it either runs or it does not.40- The measure is already **relative to a control population** by construction (rates41 reported as *open vs closed*, *treatment vs holdout*): the comparison group *is* the42 floor. Say that, rather than building a second one.43- A **status nobody sets by accident** (`Patch Available`, an explicit approval, a44 human label): a chance model for a deliberate act is not meaningful. Argue it in one45 line instead of computing it.46- You are reporting a **single reproduced defect**. n=1 with a reproduction and a47 control is evidence; do not dress it as a statistic.4849## The practice (checklist)5051- [ ] **Name the variable your claim depends on.** "917 edges went stale" depends on52 *which* closure paired with *which* edge. "Lucene 11 is 13% slower" depends on53 *which* build ran in *which* run. Write it down — the floor is built by54 destroying exactly that and nothing else.55- [ ] **Build the floor by comparison, not by estimate.** Two routes:56 - **repeat** — run the identical configuration N≥5 times and take the spread57 (RSD, stddev). If the tool computes it for you, use the tool's number, not58 your intuition;59 - **shuffle** — permute the dependent variable, hold graph/structure/marginals60 fixed, repeat ≥3 times with a fixed seed, and take the mean and spread.61 *Done when* you have a floor **and** the floor's own variability, so you know62 whether the floor itself is stable.63- [ ] **Compute signal ÷ floor and write it in the artifact.** Not the raw count64 alone. `917 vs 633 (1.45×)`. `95 vs 55 (1.74×)`.65- [ ] **Narrow the filter and re-measure.** A real effect gets *further* from chance as66 you make the criterion more specific; a base-rate artefact does not move. This is67 the single most convincing check you can show a reviewer, and it costs one rerun.68- [ ] **Disclose a weak ratio yourself.** Under ~2× is worth reporting *with the ratio69 attached and the interpretation softened* — "N against M expected by chance". Do70 not drop it and do not inflate it.71- [ ] **State which null model you used and one you did not.** A shuffle preserves some72 structure and destroys other structure; naming the alternative (block-permute73 within era, degree-preserving rewire, matched controls) shows the floor is a74 choice rather than a fact.75- [ ] **Say where the floor does not apply.** If part of your claim is a pure76 deterministic join with no random variable in it, that part has no floor — write77 that down instead of implying the whole thing was controlled.7879## Rationalizations8081| Shortcut | Why it fails |82|---|---|83| "N=1 each side, the delta is huge, that's enough." | The receipt below: N=1 endorsed a −13% regression, N=2 endorsed it again, and N=5 retracted it. The tool's own RSD over five *identical* runs was 14.33% — the "signal" was inside the floor the whole time. |84| "I estimated the noise floor from experience — it's about ±0.2%." | That estimate was off by ~70×. An estimated floor is a guess wearing a number's clothes; the measured one came free from a command that already existed. |85| "917 is a big number, it can't be chance." | Shuffling the pairing gave 633 from pure base rates. Large corpora manufacture large coincidences; scale is the *reason* to compute a floor, not a reason to skip it. |86| "The tool printed a variance column, but the mean is what matters." | The variance column is the floor. In the receipt, 79% RSD on one operation carried a meaningless −53% that would have gone into a report as a finding. |87| "Adding a floor makes my result look weaker." | It makes it *survivable*. A 1.45× reported as 1.45× is a contribution; a 1.45× reported as a discovery is a thing the reviewer will find, and then they will re-check everything else you said. |88| "Throughput was rock-stable between two runs, so it's a reliable metric." | Between *two* runs. At N=5 the same metric showed 14.33% RSD on the same operation. Two identical-looking runs are not a variance estimate. |8990## RECEIPT9192***SOURCING-receipt*** — **the discipline retracted one finding and corrected one93published number, in two independent domains.** Both are internal measurements, not a94merged PR: this skill's evidence is that it caught *my own* errors before a maintainer95had to.9697**1. Benchmarking — N=5 retracted what N=1 and N=2 both endorsed.** Task: does Solr on98Lucene 11 regress against Lucene 10.4? Method progression and outcome:99100| stage | what it said | why it was wrong |101|---|---|---|102| N=1 per side | `index-append` throughput **−13%** on Lucene 11 | nothing to compare the variance against |103| noise floor estimated from two "identical" runs | throughput stable to **<±0.2%**, so −13% beat it ~50× | two runs is not a spread; one of them had been starved of CPU by other work on the machine (2.5 h vs ~38 min wall-clock for the same workload) |104| **N=5 per side + the tool's own `aggregate`** | **RSD 14.33%** on that operation across five *identical* runs | the −13% sits **inside** the real floor. **Finding retracted.** |105106Two further things the floor exposed in the same campaign: **14 of 19 operations were107throttled**, so their throughput is pinned to the target rate by construction and108describes the scheduler rather than the server; and `refresh-after-index` carried109**79% RSD** behind a meaningless **−53%**. Without the floor, a −13% "regression" would110have gone to a mailing list as a result.111112**2. Corpus mining — a shuffle floor corrected a number I had already published.** A113claim of the form *"917 records are stale: their dependency closed after the link was114made"*. Control: shuffle the closure dates among closed records, holding the graph,115statuses and link dates fixed; 5 trials, fixed seed.116117| | count | records |118|---|---|---|119| real | **917** | 577 |120| shuffled floor (5 trials, floor RSD 1.6%) | **633** | 440 |121| **signal ÷ floor** | **1.45×** | 1.31× |122123So **69% of the count was base rate**, and the honest headline is *"917 against 633124expected by chance"*. The check that made it credible rather than merely deflating:125**narrowing the filter raised the ratio** — restricting to dependency links whose126target was resolved *Fixed* gave **95 vs a floor of 55 = 1.74×**, which is what a real127effect does and an artefact does not.128129The same shuffle control, applied to a different claim in the same body of work,130**confirmed** it decisively — a human label matched the code paths 88% of the time131against a shuffled baseline of 24–27%. **The technique is not a way to talk yourself132down; it is the thing that tells the two cases apart.**133134## Lifecycle135136- **Signals it worked:** the number you publish is the one that survives — nobody137 asks "how many runs?", "compared to what?", or "is that above noise?"; a reviewer138 engages with the mechanism instead of the statistic; and when you narrow the filter139 the ratio *rises*, which is the check you can show rather than assert.140- **Log a misfire when:** you shipped a count and *then* built the floor and it moved141 the claim (log the before/after ratio); the floor's own spread was so wide the142 comparison said nothing (wrong null model — log which one you used); or you built a143 floor for something deterministic and burned time on a chance model for a deliberate144 act.145- **Death criterion:** retire this if the houses you contribute to start requiring a146 variance statement in their own report templates, so the practice is enforced by the147 tooling rather than by you remembering it. Retire the *shuffle* half if a project148 ships a null-model utility you should be calling instead of hand-rolling.149- **Overlaps:** [use-the-tool-for-its-purpose](../use-the-tool-for-its-purpose/SKILL.md)150 gets you to N≥2 and real data in the first place — this skill is what you do with the151 numbers that come back;152 [verify-before-a-committer-comment](../verify-before-a-committer-comment/SKILL.md)153 covers correcting a claim you have already made, which is where a late floor lands154 you.
Run npx skillmds@latest add serhiy-bzhezytskyy/state-the-noise-floor in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Before you put a NUMBER in front of a maintainer — "N tickets affected", "X% of cases", "this run is 13% slower" — establish what that same number would be if nothing were wrong, and report the ratio. Build the floor by comparing against something that SHOULD be identical: repeat the measurement (N≥5), or shuffle the one variable your claim depends on and keep everything else fixed. If the signal is under ~2x the floor, say so yourself before the reviewer does. Use when you are about to quote a count, a percentage, or a performance delta in an issue, PR description or mailing-list post. Trigger terms: benchmark, regression, faster, slower, N tickets, X percent, how many, count, delta, improvement, is this significant, noise, variance, baseline. It is listed under Docs & Writing on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
serhiy-bzhezytskyy (@serhiy-bzhezytskyy) published this skill. Their other Agent Skills are listed on their SkillMD profile.