OverviewFilesCommitsIssuesDocsReleasesPeers

hypercore-kb commits / f34fc14

basal-agent: fidfloor.c fixed and valid — multilevel selection RAISES Eigen's floor
Three faults from the invalid first run, all fixed: 1. MIXED was not well-mixed (120 isolated compartments, division off). Strands are now shuffled globally every step, making it one pool as polymer.c is. 2. COLLAPSE DIAGNOSED: uptake was below replacement by construction — UPTAKE*0.5 = 0.275 against degradation 0.30. BLIND could never sustain itself, and the apparent "SELECT wins" was SELECT being the only arm able to exceed replacement once function climbed. Now GROW=0.45 > D=0.30 for every arm. 3. CONFOUND removed BY CONSTRUCTION: total material moved per step is identical across arms, only its allocation differs. BLIND 108714 replications vs SELECT 108132; mean pop 2586 vs 2573. Matched-condition discipline applied at design time rather than after the fact. 6 seeds, L=16, divsz 8, start 0.530: f | MIXED | BLIND | SELECT 0.90 | 0.675 | 0.582 | 0.615 0.95 | 0.793 | 0.611 | 0.704 0.98 | 0.905 | 0.632 | 0.817 floor: 0.98 >0.98 >0.98 F1 PASSES — MIXED reproduces polymer.c's 0.98 floor. F4 passes (38.3 div/step). F2 FAILS, IN THE OPPOSITE DIRECTION FROM THE PREDICTION. Emergent compartment selection does not lower the fidelity floor; compartmentalization makes things WORSE, ordering MIXED > SELECT > BLIND at every fidelity. Selection does real work (SELECT beats BLIND by +0.185 at f=0.98) but never recovers what compartmentalizing costs. Mechanism: at divsz 8 compartments hold ~4-8 strands, drift dominates, and good sequences are lost faster than between-compartment selection spreads them. THE TENSION EXPOSED: ribozyme.c and chemoton.c both found small compartments are REQUIRED (the corrector needs assortment variance). Here small compartments are what DESTROYS sequence information. Opposite requirements on the same parameter — possibly why 1->2 is the rung that stays open: it is the only transition needing compartments both small enough to correct and large enough to remember. Flagged not run: a division-size sweep for an intermediate optimum. Deliberately deferred rather than bolted on in a saturated session. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
f34fc14b95fcf0dc46d51a5e83da1ce521977c8a
by plankatron <fleeky@gmail.com> · 2026-08-01T01:02:22.000Z

Changed files (2) +105 -28

basal-agent/fidfloor.c +36 -28
……@@ -1,26 +1,19 @@
1/* fidfloor.c — INVALID AS WRITTEN. DO NOT READ ITS NUMBERS AS A RESULT.
1/* fidfloor.c — does EMERGENT compartment selection lower the fidelity floor? (rung 1+4 -> 2)
22 *
3 * ⚠️ F1 FAILED: the MIXED baseline returns 0.000 at EVERY fidelity, including f=0.98 where
4 * polymer.c reports emergence at 0.92. A baseline that does not reproduce the thing it is a
5 * baseline for makes every other column uninterpretable. Two faults, one identified, one not:
3 * FIXED after a first run that was INVALID. Three faults, all found and corrected:
4 * (1) MIXED was not well-mixed — 120 isolated compartments with division off, i.e. MORE
5 * compartmentalized than the arms it controls for. Now strands are SHUFFLED globally every
6 * step, making it one pool, which is what polymer.c is.
7 * (2) POPULATIONS COLLAPSED because uptake was below replacement by construction:
8 * UPTAKE*0.5 = 0.275 against degradation 0.30. BLIND could never sustain itself, and the
9 * apparent 'SELECT wins' was simply SELECT being the only arm able to exceed replacement
10 * once function climbed. Per-unit growth rate is now GROW=0.45 > D=0.30 for every arm.
11 * (3) CONFOUND: selection changed TOTAL uptake, hence population and replication count (8099 vs
12 * 3308). Now the total material moved per step is IDENTICAL across arms by construction —
13 * only its ALLOCATION differs (by mean match, or by size, or uniformly). This is the
14 * matched-condition discipline applied at design time rather than after the fact.
615 *
7 * (1) IDENTIFIED — MIXED is not well-mixed. It is 120 isolated compartments of 24 with division
8 * disabled, i.e. MORE compartmentalized than the arms it is supposed to be the control for,
9 * not less. polymer.c is ONE population of 800 with global fitness-weighted replication.
10 * A fix would be to keep the machinery and shuffle strands across compartments each step.
11 * (2) NOT IDENTIFIED — populations collapse (mean 168 against ~2880 initial in MIXED). The
12 * material budget arithmetic does not explain this; something else is wrong.
13 *
14 * What the run appeared to show, and why it means nothing: SELECT rose with f (0.353 at 0.95,
15 * 0.628 at 0.98) while MIXED and BLIND sat at 0.000. But 0.000 is EXTINCTION, so that comparison
16 * says only "the function-coupled arm survived and the others died" — a survival effect, not a
17 * fidelity-floor effect. It is confounded on top of that: SELECT ran 8099 replications against
18 * BLIND's 3308, exactly the population/replication confound the header promised to watch for.
19 *
20 * Kept in the tree as a record of an invalid experiment, NOT written into SYNTHESIS. Anyone
21 * resuming should fix (1), diagnose (2), and re-establish F1 before reading any other column.
22 *
23 * ---- original header follows ----
16 * ---- original rationale follows ----
2417 *
2518 * fidfloor.c — does EMERGENT compartment selection lower the fidelity floor? (rung 1+4 -> 2)
2619 *
……@@ -81,7 +74,7 @@
8174#define MAXSZ 24
8275#define COSTUNIT 1.0
8376#define TOTALMAT 3000.0
84#define UPTAKE 0.55
77#define GROW 0.45 /* per-unit material inflow; MUST exceed D or every arm decays */
8578
8679static unsigned long long RNG;
8780static unsigned long long xs(void){ RNG^=RNG<<13; RNG^=RNG>>7; RNG^=RNG<<17; return RNG; }
……@@ -127,16 +120,19 @@ static double run(int mode,double f,int divsz,double *start,double *ndiv,double
127120 else k++;
128121 }
129122
130 /* uptake, rationed when demand exceeds supply */
123 /* uptake. TOTAL material moved is identical across arms (GROW per surviving unit, capped by
124 the pool); only its ALLOCATION differs. This removes the population/replication confound
125 by construction rather than checking for it afterwards. */
126 long units=0; for(int c=0;c<ncomp;c++) units+=C[c].n;
127 double budget = GROW*(double)units; if(budget>pool) budget=pool;
131128 double Dm=0;
132129 for(int c=0;c<ncomp;c++){
133130 double out;
134 if(mode==0){ double m=0; for(int k=0;k<C[c].n;k++) m+=matchC(C[c].s[k]); out = C[c].n? (m/C[c].n)/L*C[c].n : 0; }
135 else out = 0.5*C[c].n;
136 demand[c]=UPTAKE*out; Dm+=demand[c];
131 if(mode==0){ double m=0; for(int k=0;k<C[c].n;k++) m+=matchC(C[c].s[k]); out = C[c].n? (m/(C[c].n*(double)L))*C[c].n : 0; }
132 else out = C[c].n; /* BLIND and MIXED: allocate by size, blind to function */
133 demand[c]=out; Dm+=demand[c];
137134 }
138 double fr=(Dm>0&&Dm>pool)?pool/Dm:1.0;
139 for(int c=0;c<ncomp;c++){ double t=demand[c]*fr; C[c].mat+=t; pool-=t; }
135 if(Dm>0) for(int c=0;c<ncomp;c++){ double t=budget*demand[c]/Dm; C[c].mat+=t; pool-=t; }
140136
141137 /* growth: material buys template-directed replication, parent by fitness WITHIN compartment */
142138 for(int c=0;c<ncomp;c++){
……@@ -164,6 +160,18 @@ static double run(int mode,double f,int divsz,double *start,double *ndiv,double
164160 }
165161 for(int c=0;c<ncomp;){ if(C[c].n<=0){ pool+=C[c].mat; C[c]=C[ncomp-1]; ncomp--; } else c++; }
166162 if(ncomp<=0) break;
163
164 /* MIXED: shuffle strands across all compartments so the population is genuinely ONE
165 well-mixed pool — the polymer.c single-level baseline. */
166 if(mode==2 && ncomp>1){
167 for(int rep=0;rep<4;rep++)
168 for(int c=0;c<ncomp;c++){
169 if(C[c].n<=0) continue;
170 int d=(int)(xs()%(unsigned)ncomp); if(d==c||C[d].n<=0) continue;
171 int a=(int)(xs()%(unsigned)C[c].n), b=(int)(xs()%(unsigned)C[d].n);
172 uint64_t t=C[c].s[a]; C[c].s[a]=C[d].s[b]; C[d].s[b]=t;
173 }
174 }
167175 { long u=0; for(int c=0;c<ncomp;c++) u+=C[c].n; popsum+=u; }
168176 }
169177
basal-agent/fidfloor.md +69 -0
……@@ -0,0 +1,69 @@
1# `fidfloor.c` — multilevel selection does NOT lower Eigen's floor; it raises it
2
3**Question.** `polymer.c` (single level) found heritable function needs f ≥ 0.98 while un-catalysed
4templating supplies ~0.85 — and the replicase closing that gap is itself a functional sequence
5needing the fidelity first. Eigen's bootstrap paradox. But that threshold was measured in a
6*single-level* population, and error thresholds are known to relax under multilevel selection. Since
7`chemoton.c` now gives compartment selection that **emerges** rather than being decreed, the natural
8test is whether it drops the floor toward 0.85.
9
10**Three arms, identical machinery, differing only in how uptake is allocated.** SELECT ∝ mean
11functional match; BLIND ∝ size (compartments exist, selection removed — the control); MIXED = one
12globally shuffled pool (the `polymer.c` baseline).
13
14## Results (6 seeds, L=16, div size 8, start 0.530)
15
16| f | MIXED (1 level) | BLIND (comps, no sel) | SELECT (emergent sel) |
17|---|---|---|---|
18| 0.80 | 0.570 | 0.552 | 0.559 |
19| 0.85 | 0.606 | 0.563 | 0.574 |
20| 0.90 | 0.675 | 0.582 | 0.615 |
21| 0.95 | **0.793** | 0.611 | 0.704 |
22| 0.98 | **0.905** | 0.632 | 0.817 |
23
24| floor (first f where function emerges) | |
25|---|---|
26| MIXED | **0.98** |
27| BLIND | >0.98 |
28| SELECT | >0.98 |
29
30**F1 passes** — MIXED reproduces `polymer.c`'s floor at 0.98. **F4 passes** — 38.3 divisions/step,
31real turnover. **The confound is removed by construction** — total material moved per step is
32identical across arms, only its allocation differs, giving BLIND 108,714 replications against
33SELECT's 108,132 and mean populations of 2586 vs 2573.
34
35## F2 fails, and in the opposite direction
36
37Emergent compartment selection does **not** lower the fidelity floor. **Compartmentalisation makes
38things worse**, and the ordering is consistent at every fidelity: **MIXED > SELECT > BLIND**.
39
40Selection does real work — SELECT beats BLIND by **+0.185** at f=0.98, so between-compartment
41selection is genuinely operating. It just never recovers what compartmentalising costs.
42
43**Mechanism.** At division size 8 the compartments hold ~4–8 strands. Inside a unit that small,
44**drift dominates and good sequences are lost faster than between-compartment selection can spread
45them**. The well-mixed pool of ~1800 gives sequence-level selection far more to work with. Group
46selection buys less than fragmentation costs.
47
48## The tension this exposes
49
50`ribozyme.c` and `chemoton.c` both found small compartments are **required** — the corrector needs
51high assortment variance, and large compartments fail. Here small compartments are what **destroys**
52sequence information.
53
54> Small compartments purge parasites and lose sequences. Those are opposite requirements on the same
55> parameter, and every crossing in the arc has needed the first while rung 1→2 needs the second.
56
57That may be why 1→2 is the rung that stays open: it is the only transition needing compartments to be
58*both* small enough to correct *and* large enough to remember.
59
60**Untested and flagged, not run:** a division-size sweep would show whether an intermediate optimum
61exists. Deliberately not run in a saturated session — it is exactly the kind of follow-up that today's
62four-check tally says to design carefully rather than bolt on.
63
64## Provenance
65
66First run was **invalid** and is recorded as such in the file header: MIXED was not well-mixed, uptake
67sat below replacement (0.275 vs degradation 0.30) so BLIND could never sustain itself, and selection
68changed total uptake and hence replication count. The apparent "SELECT wins" of that run was SELECT
69being the only arm able to exceed replacement. All three faults fixed before these numbers.