OverviewFilesCommitsIssuesDocsReleasesPeers

basal-agent commits / 5313ea3

basal-agent: RETRACT Test B's T4 — the reversal was a size artifact
T4 ("fission beats the propagule bottleneck, so variance destroys collective closure") was established at matched division THRESHOLD only. Propagule mode also shrinks realized compartment size, and in this model RAF size scales with compartment size — so the effect may have been nothing but bigger compartments. Re-ran at catalysis density 0.10 over 8 division sizes, recording each arm's OWN realized size: divsz | fission raf/size | propagule raf/size 4 | 1.46 / 1.50 | 1.40 / 1.44 8 | 2.57 / 2.71 | 2.35 / 2.47 10 | 2.40 / 2.56 | 2.71 / 2.89 <- propagule larger, and wins 12 | 2.76 / 2.99 | 2.99 / 3.26 <- same 16 | 4.69 / 5.28 | 3.49 / 3.93 20 | 4.27 / 5.04 | 2.99 / 3.46 24 | 1.55 / 2.24 | 2.35 / 3.89 <- same RAF TRACKS REALIZED SIZE IN 8/8 CELLS, regardless of reproduction mode — the direction flips with size, not with mode. Matched-size interpolation gives a mean propagule advantage of -0.13 over 7 points, 6 of 7 inside +-0.17; the lone outlier (-1.07) is the divsz-24 cell where the fission arm is collapsing. The first attempt at this analysis was ALSO broken and is recorded as such: fission's realized size is non-monotonic in division size, so bounds-checking against the last array element silently dropped 7 of 8 points. Fixed by sorting the fission points by size before interpolating. => NO EVIDENCE that a bottleneck destroys collective closure. The "optimal assortment is a trade-off, not a maximum" claim is RETRACTED from SYNTHESIS proven/open and struck in place in the Test B section. The linkage.c loop that depended on it is marked unsupported rather than silently reused. Test A's variance effect survived this identical check; Test B's did not. WHAT SURVIVES Test B: T1 (RAFs form), T2 (compartment selection beats the random baseline 6/6, ~36x) and T3 (closure-blind control at 0.00-0.02 everywhere). The chaining result stands — compartment-level selection survives the move from per-unit to collective quality. Only the mode comparison dies. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
5313ea35e616218efdd163211a85bef73c181734
by plankatron <fleeky@gmail.com> · 2026-08-01T00:13:30.000Z

Changed files (3) +137 -70

SYNTHESIS.md +18 -18
……@@ -789,19 +789,19 @@ fission beats the propagule bottleneck 5 cells to 0**, with the gap widening as
789789(~0.2 at div size 8, ~1.2 at 16) — expected, since at size 8 compartments are small enough that both
790790modes assort similarly anyway.
791791
792> **Test A: quality is per-unit → maximise variance, the bottleneck wins.
793> Test B: quality is collective → variance destroys it, fission wins.
794> Optimal assortment is a TRADE-OFF, not a maximum.**
795
796Both measured in the same machinery with the same controls, pointing opposite ways because the
797*kind* of quality differs. Neither result alone yields this.
798
799**And it closes a loop with `linkage.c`.** The tension has a resolution we had already shown emerges:
800**linkage**. Keeping co-functional parts physically together preserves combinations against
801assortment while still permitting variance *between* units. That is the chromosome argument (Maynard
802Smith & Szathmáry), arrived at here by chaining our own rungs rather than imported. The three results
803compose: collective function needs its parts kept together (2→3), parasite purging needs variance
804(Test A), and linkage buys both at once.
792> **⚠️ RETRACTED, same day.** The above was written from matched division *threshold*. At matched
793> **realized size** the two modes differ by −0.13 and RAF tracks size in 8/8 cells regardless of mode
794> — propagule mode simply produces smaller compartments, and RAF size scales with compartment size.
795> Test A's variance effect survived this identical check; Test B's did not. There is **no evidence
796> here that a bottleneck destroys collective closure**, and the trade-off claim is withdrawn.
797>
798> (The first attempt at this check was itself broken: fission's realized size is non-monotonic in
799> division size, so bounds-checking against the last array element silently dropped 7 of 8 points.)
800
801**The `linkage.c` loop, now unsupported.** The retracted tension had an appealing resolution —
802linkage keeps co-functional parts together against assortment, the chromosome argument. With no
803measured tension it is speculation, recorded here only so the reasoning is not silently reused: it
804would need a tension that this experiment does not demonstrate.
805805
806806**Honest bounds.** This is the first model in the arc with **two rungs at once** — an emergent RAF
807807(rung 1) inside compartments that build, grow and select themselves (rung 4), the second selecting on
……@@ -861,11 +861,11 @@ transfer to 1→2 on its own — only Law 2 does.
861861- **Compartment-level selection need not be supplied** (`chemoton.c`) — coupling growth to the
862862 chemistry's own output generates it with no fitness-proportional sampling anywhere, reproducing the
863863 decreed version's size-threshold signature (PARTIAL: small 2/2, large 1/2). ✓
864- **Optimal assortment is a trade-off, not a maximum** (Test A vs Test B) — when catalytic quality is
865 per-unit, maximising variance wins (propagule beats fission); when it is a collective closure
866 property, variance destroys the closure and fission wins (5 cells to 0). The two point opposite ways
867 in the same machinery because the *kind* of quality differs, and `linkage.c` is the mechanism that
868 buys both at once. ✓
864- ~~Optimal assortment is a trade-off, not a maximum~~ — **RETRACTED same day.** Test B's reversal was
865 a size artifact: propagule mode shrinks realized compartment size and RAF size scales with it. At
866 matched realized size the two modes differ by −0.13, and RAF tracks size in 8/8 cells regardless of
867 mode. Test A's variance effect survived this same check; Test B's did not. **No evidence that a
868 bottleneck destroys collective closure.**
869869- **Compartment selection survives collective quality** (`rafcomp.c`) — maxRAF 4.71 vs a random-subset
870870 baseline of 0.13, with the closure-blind control at 0.00–0.01. First model in the arc holding two
871871 rungs at once, though co-present rather than one producing the other. ✓
rafcomp.c +82 -52
……@@ -211,63 +211,93 @@ int main(void)
211211 printf(" THE TENSION: Test A found assortment VARIANCE purges parasites (+1.14 at matched size).\n");
212212 printf(" But a RAF is a property of the SET, so variance should DESTROY closure. Which wins?\n\n");
213213
214 printf(" cat.dens | divsz | rand base | FISSION raf | fis ctrl | PROPAGULE raf | prop ctrl | mean sz\n");
215 printf(" ---------+-------+-----------+-------------+----------+---------------+-----------+--------\n");
214 /* ---- MATCHED REALIZED SIZE. Test B's reversal was established at matched division
215 THRESHOLD, but propagule mode also shrinks realized compartment size, and in this model
216 bigger compartments hold bigger RAFs. So fission > propagule may be a pure size artifact
217 with no closure destruction at all. Sweep division size finely at one catalysis density,
218 record each arm's OWN realized size, and interpolate fission onto propagule's sizes. ---- */
219 double dens = 0.10;
220 int sizes[]={4,6,8,10,12,16,20,24};
221 int NZ=(int)(sizeof(sizes)/sizeof(sizes[0]));
222 double fr[16], fsz[16], pr[16], psz[16], cf[16], cp[16], base[16];
223 int any_raf=0, ctrl_flat=1;
216224
217 double dens[]={0.04,0.08,0.12};
218 int sizes[]={8,16};
219 int any_raf=0, coupled_wins=0, ctrl_flat=1, ncmp=0, prop_better=0, fis_better=0;
225 printf(" catalysis density %.2f, %d seeds\n\n", dens, NS);
226 printf(" divsz | rand base | FISSION raf / size | PROPAGULE raf / size | fis ctrl | prop ctrl\n");
227 printf(" ------+-----------+--------------------+----------------------+----------+----------\n");
220228
221 for(int d=0;d<3;d++){
222 for(int z=0;z<2;z++){
223 double bf=0,bc=0,pf=0,pc=0,ms=0,base=0,mc=0,nd=0,nc=0;
224 for(int s=0;s<NS;s++){
225 double re,n,m,dv,mm;
226 RNG=seeds[s]; build_net(dens[d]);
227 base+=random_baseline(sizes[z]/2>2?sizes[z]/2:2, 200);
228 RNG=seeds[s]; build_net(dens[d]); bf+=run(1,sizes[z],0,&re,&n,&m,&dv,&mm); ms+=m; mc+=mm; nd+=dv; nc+=n;
229 RNG=seeds[s]; build_net(dens[d]); bc+=run(0,sizes[z],0,&re,&n,&m,&dv,&mm);
230 RNG=seeds[s]; build_net(dens[d]); pf+=run(1,sizes[z],1,&re,&n,&m,&dv,&mm);
231 RNG=seeds[s]; build_net(dens[d]); pc+=run(0,sizes[z],1,&re,&n,&m,&dv,&mm);
232 }
233 bf/=NS;bc/=NS;pf/=NS;pc/=NS;ms/=NS;base/=NS;mc/=NS;nd/=NS;nc/=NS;
234 printf(" %.2f | %2d | %5.2f | %5.2f | %5.2f | %5.2f | %5.2f | %5.2f\n",
235 dens[d],sizes[z],base,bf,bc,pf,pc,ms);
236 if(bf>0.2||pf>0.2) any_raf=1;
237 ncmp++;
238 if(bf>base+0.3||pf>base+0.3) coupled_wins++;
239 if(bc>base+0.3||pc>base+0.3) ctrl_flat=0;
240 if(pf>bf+0.2) prop_better++;
241 if(bf>pf+0.2) fis_better++;
229 for(int z=0;z<NZ;z++){
230 double bf=0,bs=0,pf=0,ps=0,c1=0,c2=0,bb=0;
231 for(int s=0;s<NS;s++){
232 double re,n,m,dv,mm;
233 RNG=seeds[s]; build_net(dens); bb+=random_baseline(sizes[z]/2>2?sizes[z]/2:2,200);
234 RNG=seeds[s]; build_net(dens); bf+=run(1,sizes[z],0,&re,&n,&m,&dv,&mm); bs+=m;
235 RNG=seeds[s]; build_net(dens); pf+=run(1,sizes[z],1,&re,&n,&m,&dv,&mm); ps+=m;
236 RNG=seeds[s]; build_net(dens); c1+=run(0,sizes[z],0,&re,&n,&m,&dv,&mm);
237 RNG=seeds[s]; build_net(dens); c2+=run(0,sizes[z],1,&re,&n,&m,&dv,&mm);
242238 }
239 fr[z]=bf/NS; fsz[z]=bs/NS; pr[z]=pf/NS; psz[z]=ps/NS; cf[z]=c1/NS; cp[z]=c2/NS; base[z]=bb/NS;
240 printf(" %2d | %5.2f | %5.2f / %5.2f | %5.2f / %5.2f | %5.2f | %5.2f\n",
241 sizes[z],base[z],fr[z],fsz[z],pr[z],psz[z],cf[z],cp[z]);
242 if(fr[z]>0.2||pr[z]>0.2) any_raf=1;
243 if(cf[z]>base[z]+0.3||cp[z]>base[z]+0.3) ctrl_flat=0;
244 }
245
246 /* fission's realized size is NON-MONOTONIC in division size (it rises then falls as the arm
247 collapses at large divsz), so the fission points must be SORTED BY SIZE before interpolating.
248 The first version bounds-checked against fsz[last] and silently dropped almost every point. */
249 printf("\n Does RAF track SIZE regardless of reproduction mode? (per-cell, same divsz)\n");
250 int tracks=0;
251 for(int z=0;z<NZ;z++){
252 int bigger_f = fsz[z]>psz[z];
253 int rafbig_f = fr[z]>pr[z];
254 if(bigger_f==rafbig_f) tracks++;
255 printf(" divsz %2d : larger arm = %s, larger RAF = %s %s\n", sizes[z],
256 bigger_f?"fission ":"propagule", rafbig_f?"fission ":"propagule",
257 (bigger_f==rafbig_f)?"tracks":"DIVERGES");
243258 }
244 printf("\n");
245 printf(" T1 RAFs formed inside compartments at all : %s\n", any_raf?"YES":"NO — test did not run");
246 printf(" T2 coupled beats the random-subset baseline : %d/%d cells\n", coupled_wins,ncmp);
247 printf(" T3 CONTROL (uptake blind to closure) flat : %s\n", ctrl_flat?"YES":"NO — CONFOUNDED");
248 printf(" T4 REVERSAL: propagule better %d / fission better %d\n\n", prop_better, fis_better);
259 printf(" RAF tracks realized size in %d/%d cells\n",tracks,NZ);
260
261 printf("\n MATCHED REALIZED SIZE — propagule vs fission interpolated (fission sorted by size):\n");
262 int ord[16]; for(int z=0;z<NZ;z++) ord[z]=z;
263 for(int a=1;a<NZ;a++){ int k=ord[a],b=a-1; while(b>=0&&fsz[ord[b]]>fsz[k]){ ord[b+1]=ord[b]; b--; } ord[b+1]=k; }
264 double sumd=0; int nd=0;
265 for(int z=0;z<NZ;z++){
266 double t=psz[z];
267 if(t<=fsz[ord[0]]||t>=fsz[ord[NZ-1]]) continue;
268 int lo=-1; for(int y=0;y+1<NZ;y++) if(fsz[ord[y]]<=t&&fsz[ord[y+1]]>=t){ lo=y; break; }
269 if(lo<0) continue;
270 double d0=fsz[ord[lo]], d1=fsz[ord[lo+1]];
271 double w=(d1>d0)?(t-d0)/(d1-d0):0.0;
272 double fi=fr[ord[lo]]+w*(fr[ord[lo+1]]-fr[ord[lo]]);
273 double d=pr[z]-fi;
274 printf(" size %5.2f : propagule %5.2f vs fission-interp %5.2f diff %+.2f\n", t, pr[z], fi, d);
275 sumd+=d; nd++;
276 }
277 double mean_adv = nd? sumd/nd : 0.0/0.0;
278 printf(" mean propagule advantage at MATCHED size: %+.2f over %d points\n\n", mean_adv, nd);
279
280 printf(" T1 RAFs formed : %s\n", any_raf?"YES":"NO — test did not run");
281 printf(" T3 CONTROL blind to closure stayed flat : %s\n", ctrl_flat?"YES":"NO — CONFOUNDED");
282 printf(" T4 at matched DIVISION THRESHOLD, fission won in the earlier run.\n");
283 printf(" T4' at matched REALIZED SIZE, propagule advantage = %+.2f\n\n", mean_adv);
249284
250 if(!any_raf)
251 printf(" => THE TEST DID NOT RUN. No compartment ever closed a RAF, so there was nothing to\n"
252 " select on. Invalid experiment, not a null. Raise catalysis density or compartment size.\n");
253 else if(!ctrl_flat)
254 printf(" => CONFOUNDED. The closure-blind control also beats baseline, so the rise is not\n"
255 " selection on collective function.\n");
256 else if(coupled_wins==0)
257 printf(" => HONEST NULL. RAFs form, but compartment selection does NOT raise closure above the\n"
258 " random baseline. The ladder does NOT chain: chemoton's success depended on catalytic\n"
259 " quality being a PER-UNIT property, and it does not survive the move to collective\n"
260 " closure — assortment destroys the very thing selection would act on.\n");
261 else if(fis_better>prop_better)
262 printf(" => CHAINS, AND TEST A REVERSES. Compartment selection survives collective quality\n"
263 " (%d/%d cells beat baseline), but FISSION now beats the propagule bottleneck\n"
264 " (%d vs %d) — the opposite of Test A. A single-unit bottleneck cannot carry a\n"
265 " closure, so the variance that purges parasites also destroys collective function.\n"
266 " The optimal assortment is a TRADE-OFF, not a maximum.\n", coupled_wins,ncmp,fis_better,prop_better);
285 if(!any_raf) printf(" => TEST DID NOT RUN.\n");
286 else if(!ctrl_flat) printf(" => CONFOUNDED by the control.\n");
287 else if(mean_adv < -0.2)
288 printf(" => THE REVERSAL SURVIVES. Even at matched realized size the propagule bottleneck is\n"
289 " WORSE for collective closure (%+.2f). So it is not a size artifact: a single-unit\n"
290 " bottleneck genuinely cannot carry a RAF, and Test A's finding does NOT generalise.\n"
291 " Optimal assortment is a trade-off set by whether quality is per-unit or collective.\n", mean_adv);
292 else if(mean_adv > 0.2)
293 printf(" => THE REVERSAL WAS AN ARTIFACT, AND IT INVERTS. At matched realized size the propagule\n"
294 " bottleneck is BETTER (%+.2f), same direction as Test A. The earlier fission win was\n"
295 " entirely propagule mode shrinking compartments, and in this model smaller compartments\n"
296 " hold smaller RAFs. RETRACT the trade-off claim.\n", mean_adv);
267297 else
268 printf(" => CHAINS, AND TEST A GENERALISES. Compartment selection survives collective quality\n"
269 " (%d/%d beat baseline) and the propagule bottleneck still wins (%d vs %d), so RAF\n"
270 " closure is more robust to assortment than predicted. Report as-is.\n",
271 coupled_wins,ncmp,prop_better,fis_better);
298 printf(" => THE REVERSAL WAS A SIZE ARTIFACT. At matched realized size the two modes are\n"
299 " indistinguishable (%+.2f). Fission only looked better because propagule shrinks\n"
300 " compartments and smaller compartments hold smaller RAFs. There is no evidence here\n"
301 " that a bottleneck destroys closure — RETRACT the trade-off claim as stated.\n", mean_adv);
272302 return 0;
273303}
rafcomp.md +37 -0
……@@ -61,3 +61,40 @@ compartments that build, grow and select themselves (rung 4), with the second se
6161Honest bound: this is two rungs **co-present and interacting**, not one *producing* the other. The
6262self-building chain SYNTHESIS calls open is still open. And the reaction network is supplied, as in
6363`rung1.c` — what emerges is which subset closes, not the chemistry itself.
64
65---
66
67## ⚠️ T4 RETRACTED — the reversal was a size artifact (matched-realized-size check)
68
69T4 was established at matched division **threshold**. But propagule mode also shrinks realized
70compartment size, and in this model **RAF size scales with compartment size** — so fission > propagule
71may have been nothing but bigger compartments. Re-run at catalysis density 0.10, sweeping 8 division
72sizes and recording each arm's own realized size:
73
74| divsz | fission raf / size | propagule raf / size |
75|---|---|---|
76| 4 | 1.46 / 1.50 | 1.40 / 1.44 |
77| 8 | 2.57 / 2.71 | 2.35 / 2.47 |
78| 10 | 2.40 / 2.56 | **2.71 / 2.89** |
79| 12 | 2.76 / 2.99 | **2.99 / 3.26** |
80| 16 | 4.69 / 5.28 | 3.49 / 3.93 |
81| 20 | 4.27 / 5.04 | 2.99 / 3.46 |
82| 24 | 1.55 / 2.24 | **2.35 / 3.89** |
83
84**RAF tracks realized size in 8/8 cells** — in every cell, whichever arm had the larger compartments
85had the larger RAF, *regardless of reproduction mode*. Note rows 10, 12 and 24, where propagule has
86the larger size and duly wins: the direction flips with size, not with mode.
87
88Matched-size interpolation (fission sorted by size — its realized size is **non-monotonic** in
89division size, which broke the first attempt at this analysis and silently dropped 7 of 8 points):
90**mean propagule advantage −0.13 over 7 points**, with 6 of 7 inside ±0.17. The lone outlier (−1.07)
91sits at the divsz-24 cell where the fission arm is collapsing.
92
93> **There is no evidence here that a bottleneck destroys collective closure.** The "optimal assortment
94> is a trade-off" claim is **retracted**. Test A's variance effect was real and survived this same
95> check; Test B's apparent reversal did not.
96
97**What survives Test B:** T1 (RAFs form), T2 (compartment selection beats the random baseline 6/6,
98~36×), and T3 (the closure-blind control at 0.00–0.02 everywhere). The chaining result stands —
99compartment-level selection survives the move from per-unit to collective quality. Only the
100mode-comparison dies.