All posts

The Free Workaround We Missed

September 10, 2026

Vital Signs 2 makes a claim we need to correct: that a plain Mix can’t reliably produce a run of consecutive anomalous readings — only Perturb, a Pro-tier component, can. That’s not quite true. We have now figured out a Free-tier way to do it. Nobody caught it the first time, including the agent that helped draft the lesson. We strive to be honest whenever we mess up — including a serious look at why — so this article will explain how we got to this point.

What we got right

The math in Vital Signs 1 and 2 is correct as far as it goes. A Mix choosing between a normal and an anomalous population, one reading at a time, really can’t give you five anomalies in a row except as a statistical fluke — five independent 1-in-1000 draws landing consecutively is a 1-in-10¹⁵ event. Perturb really does solve that, by scheduling a disturbance instead of leaving it to chance.

None of that was the problem. The mistake was in making an implicit claim that Perturb was the only way to get a guaranteed run without leaving Free.

The trick: choose in groups, not one reading at a time

The Free-tier solution isn’t really obvious, until you see it. Then it becomes so simple you have to ask how you missed it: nothing says the unit Mix chooses between has to be a single reading.

<Redimension name="BaselineSquashed" dimension="15">
  <input name="NormalReading"/>
</Redimension>
<Redimension name="AbnormalSquashed" dimension="15">
  <input name="AnomalousReading"/>
</Redimension>
<Mix name="Choose" synchronous="false">
  <input name="BaselineSquashed" weight="0.999"/>
  <input name="AbnormalSquashed" weight="0.001"/>
</Mix>
<Redimension name="Vitals" dimension="3">
  <input name="Choose"/>
</Redimension>

Redimension bundles five consecutive 3-dimension readings into one 15-dimension observation, Mix picks between two bundles at the original 999:1 odds, and a second Redimension unbundles whichever 15-dimension chunk got chosen back into five sequential 3-dimension readings. Whenever the rare branch occurs, you get five anomalous readings in a row — a real, guaranteed run, no Perturb required.

Run at volume (500,000 rows), and all the math checks out: 93 abnormal episodes, every single one exactly length 5, at an observed rate of 0.00093 against the 0.001 target — both numbers landing exactly in the range where they should, not approximately.

For the problem statement in the Vital Signs 2 lesson, this solution is sufficient and is completely Free-tier.

Why we still recommend Perturb

We’re not walking back the recommendation. Perturb is still the better option. This technique guarantees run structure — always exactly 5 — but not timing. It also forces everything to line up on perfectly even boundaries at multiples of 5.

You know approximately 1 in 1000 groups will be anomalous; you don’t know which one, only that it’s somewhere in the stream. Perturb’s whole value is turning that into a schedule: a run at a specific, known, reproducible row, on demand.

Now, in some ways, that actually swings the pendulum back to the Mix version being the better approach: the more random distribution of events makes for better test data in many cases. As noted above, the Mix version also satisfies the needs of the lesson’s problem statement.

But there’s a second wrinkle in play. Vital Signs 2’s own Perturb example is extremely simplified. It uses Constant for the wait and duration — which means it produces perfectly regular and predictable output: always exactly 5 readings long, always exactly every 5000 rows.

With Perturb, you can replace those constants with real distributions (Poisson, in our case) and you get something neither Free technique can touch: genuinely variable run length and variable timing, no boundary alignment anywhere. That’s the case for Perturb — it can produce results that don’t look manufactured or have discernible patterns under scrutiny.

Where it led: a real bug, found by accident

Building that better Perturb example turned up something worth knowing on its own. Poisson with a large lambda — the wait parameter was set to 4995 — returns the wrong numbers. Not close. Worse, it did so silently, with no hint of an error.

Every lambda used from 750 through 4995 was flatlining at the same wrong mean, around 748, regardless of what was actually requested.

The cause: Knuth’s algorithm (the one Poisson uses) computes exp(-lambda) and loops until it multiplies below that value. Once you get past lambda≈746, exp(-lambda) underflows to a hard zero in double-precision floating point, and the loop’s stopping condition stops depending on lambda at all.

Obviously, we fixed that as soon as we found it. The fix itself is exact by construction: it splits a large lambda into pieces small enough for the original algorithm to handle safely, using the mathematical fact that two independent Poisson draws add up to a Poisson draw at the combined rate. We still confirmed it directly rather than just trusting the math — mean and variance track correctly from lambda=10 all the way out to 100,000, and every shipped example that uses Poisson produces byte-for-byte identical output before and after the fix.

At larger values of lambda, though, that fix runs slowly, so we also added a second, opt-in algorithm built for speed at genuinely large lambda. That one can’t be verified by construction the same way, so we held it to a harder test: a chi-squared goodness-of-fit check against the true Poisson distribution itself, not just against our own other algorithm. Both are equally correct — just built for different values of lambda.

The part that matters more than either fix

Since Agents 1 is explicitly about when to trust an agent’s Free-vs-Pro call: the Vital Signs 2 lesson’s original “you need Pro for this” recommendation wasn’t dishonest, and it wasn’t lazy. It was a natural, obvious reading of the problem — Mix chooses per-reading, so per-reading is the default unit that everyone, human or agent, reached for first.

Seeing Redimension as a general-purpose stream reshaper, rather than just the tool for bundling correlated readings together, is a result of an after-the-fact reframing of the problem, not an oversight anyone should feel bad about missing on a first pass.

So that brings us to this caveat: an agent’s recommendation — including one built on the same skills and the same real component catalog this whole site keeps insisting you check — is a best guess grounded in the most likely approach, not absolute proof that a better one doesn’t exist.

This time, a better one did. And nobody caught it until after publication.

The answer isn’t “trust agents less.” It’s the same thing the Agents 101 series already cautions in every lesson: verify the claim yourself, and when that little voice in the back of your head asks “is that actually right?” then listen to it. We did, and it paid off twice — once for a modeling technique, once for a real bug none of us was even looking for.