In May 2026 we ran "Experience Compounds, It Does Not Merely Keep". A well-written notebook still tells you the judgment of that day thirty years later, but it stops there, whereas experience kept in the same shape does not stop, it multiplies.
The spine of that piece was three layers. Facts stack into technique; technique stacks into prediction. And one condition makes all three possible — the same shape.
If the shape is the same you can lay them over each other. And the moment you do, you see what one person could not see in a lifetime.
We still think that is right. The problem is that the piece never once showed what "the same shape" actually looks like. It only said "in the same fields, in the same units, in the same format".
This time we write how many fields that is, and what it survives.
The same shape was six fields
Here is the format in which a node declares itself in the greenhouse control sample.
printf("%s{\"id\":\"%s\",\"role\":\"%s\",\"kind\":\"%s\","
"\"model\":\"%s\",\"unit\":\"%s\",\"value\":%.1f}",
i ? "," : "", n->id, n->role, n->kind, n->model,
n->unit, n->value);
Six fields. id · role · kind · model · unit · value.
The farming notebook the original used as an example had six columns too: date / crop / transplanted / first flower / temperature that day / outcome. The coincidence is amusing, but what matters is not the count — it is what became a field.
That unit is a field is the heart of this format. If the thermometer measures in Fahrenheit, it says Fahrenheit. It does not helpfully pre-convert the value for anybody. The hardware states honestly only what it knows, and the reconciling is done above.
And the reconciling happens in exactly one place.
/// The value moved into the unit the rules use.
///
/// This is the only place in this sample that knows about units, and it
/// decides from the unit the node declared, not from a model name. Even a
/// sensor nobody has heard of states its own unit, so it lands here exactly.
double get canonicalValue {
switch (unit) {
case 'F':
return (value - 32) * 5 / 9;
default:
return value;
}
}
That is the actual implementation of "you can lay them over each other". The place that makes different products speaking in different units stand in the same position. The original called this "putting them in the same fields", and building it showed that deciding the fields and gathering the conversion into one place are two different jobs.
Had it branched on model name, that one place would become a list. Every new product adds a line to it. Read unit and a product you have never seen fits automatically. The same shape means not only a format but that there is one place that interprets the format.
Laid over each other, it actually held
The original said that laying them over each other shows what was invisible. What the laying-over survived in this sample is in the log.
We ran two different installations with the same rules.
A: discovered 3 nodes — t1:temperature:TH-100(C), h1:humidity:HM-20(pct), v1:vent:VT-9(pct)
A: vent above 26C: 26.5 -> v1=80.0
B: discovered 5 nodes — t1:temperature:FX-200(F), h1:humidity:HM-20(pct),
c1:co2:CO-5(ppm), v1:vent:VT-9(pct), w1:valve:WV-3(pct)
B: vent above 26C: 26.3 -> v1=80.0
server code: unchanged rules: unchanged rebuild: none
A Celsius sensor and a Fahrenheit sensor lined up in front of the same threshold. And a CO2 sensor and a valve appeared in the middle without anything changing.
This is the leanest form of the multiplication the original described. For experience to compound, what arrives later has to be able to stand in the same place as what came before, and six fields made that possible.
(The whole greenhouse chain is in Swap the Sensor, the Control Stays.)
Without an anchor, an exception cannot speak
The best observation in the original was this.
Once there was one anchor, the exceptions started to speak. In scattered notes, twenty-two days and fifteen days would both have drifted past as "a bit different this year". With no baseline to compare against, you did not even know they were exceptions.
Building it, that structure appeared directly in the code. When the equipment server hands over machine state, it gives not just the value but what that value is compared against.
final overdue = (m['runHours'] as int) > (m['serviceEveryHours'] as int);
final vibrationOver =
(m['vibrationMm'] as num) > (m['vibrationLimitMm'] as num);
return _json({
'id': id, ...m,
'serviceOverdue': overdue,
'vibrationOverLimit': vibrationOver,
});
With only vibrationMm: 5.2 nothing can be said. vibrationLimitMm: 4.5 has to be beside it for 5.2 to become an exception. The original's "the anchor of eighteen days" is this place.
And that difference shows in the actual answer.
A: CONV-03 needs attention — service is overdue (9310 h against a 8000 h interval)
and vibration is above limit (5.2 mm against 4.5 mm).
There is always a reference beside the number. That is the real form of the original's "set the average as a baseline so every year is read on top of it".
(The equipment assistant is in Put the Reason Next to the Answer.)
Eighteen days and 250 years — written as illustrations
The original had several numbers. First flower at an average of eighteen days after transplanting, variance within two days, and 250 years of experience across generations.
Those numbers were illustrations, not observations. No farm's actual records were seen, and 250 years is a picture made by arithmetic. But they were written specifically enough to read as observations.
In this piece those numbers are marked as illustrations. And only what this series actually measured is written as a number.
| Value | Kind | |
|---|---|---|
| Fields in a node's self-declaration | 6 | Measured (the format is that) |
| Places in the code that know about units | 1 | Measured |
| One piece of a rule | 7 lines | Measured |
| Rule lines changed going from install A to B | 0 | Measured |
| "First flower on day eighteen" | — | Illustration |
| "250 years across generations" | — | Illustration |
The layer we did not prove
The original's spine was three layers. Facts → technique → prediction.
What this series actually showed reaches the first layer. That laid out in the same shape they can be stacked, and that laid out that way a new arrival stands in the same place as those before it. That far.
The second layer — facts stacking into technique — was not visible. These samples ran for a few days, and there was no time worth calling a stack. The greenhouse rules were written by me, not derived from data.
The third layer — technique becoming prediction — was not even attempted. That part of the original remains exactly where it was.
Not blurring this matters. The original's problem was speaking all three layers in one breath, letting the evidence for the first layer drag the third along. The first layer being true and the third layer being true are claims of different sizes.
What this sample did not do
We keep the original's four conditions in its honesty section. Here is what building it added.
The difficulty of keeping "the same shape" lies on the format side too, not only the human side. The original saw it as a human problem — "on a busy spring day it is hard to open the notebook and fill the columns". Building it showed that if the person choosing the fields chooses wrong, everything after it is off. Without unit as a field, the moment a Fahrenheit sensor arrives the rules receive a value off by twenty-odd. Which fields to have is the whole of the design.
This piece has no new sample. Everything quoted was made in earlier pieces.
The farming narrative belongs to the original and was not reported. It is written anonymously so there is no question of a real individual, but it is quoted here only as illustration so that it does not read as observation.
What a "knowledge layer" protocol actually is was not addressed by this series. The original trailed that layer, and the six fields shown here are one very low course of it. What sits above is still unknown.
Leaving things stackable
The original closed by saying experience compounds rather than merely keeping.
Six months later we add a line. To compound, they first have to be stackable; to be stackable the fields have to match; and for the fields to match, somebody has to have chosen those fields well.
It was six fields. Leave one of them out — unit — and the other five would have been useless. A Fahrenheit value would have sat down in the Celsius seat.
Compounding does not happen by itself. But making a place where it can happen by itself is something you can do, and that was not impressive engineering — it was having one more field.
makemind.dev "Horizon" — It shows that the same shape was really six fields.