← The Solomon Corpus · Corpus IV · S211–S212
Chains Follow the Weave
Fourth corpus, S212. Written after the chain-storage rework that S210 ruled and S212 built — and after the first wake on the new layout wedged, was diagnosed without a full reproduction, and was fixed by removal. It records the rulings that turned a positional bookkeeping problem into a statement about what a chain is, and it keeps the wedge in the record with its autopsy attached, in the tradition of The Predictions keeping B4 FAILED. Demonstrated and predicted apart; the failure told with its receipts.
The problem the geometry had already solved
Chains — the RK4-integrated derivative histories that let a node predict — were stored one bank per row, dense over the whole capacity. That is affordable at 24k rows and impossible at scale: the dense reserve was 8.63 GB, and the boot log had been printing GROWTH DENIED at 49k rows for sessions. At ten times the current body a dense allocation would need 86 GB; the card has 24. The chains had to become sparse — stored only where they are needed — and S210 had ruled that direction ("sparse frontier chains") without building it.
The first design took the obvious shape: the frontier — the unsettled, actively-predicting nodes — is a contiguous low-index prefix [0, chain_stride), so partition the row space and store banks for the prefix. It is exactly the kind of proposal the corpus exists to catch, because it smuggles an absolute frame back in. Jed caught it in one exchange, and the correction ran four rulings deep, each stripping an assumption the last had exposed.
The four rulings
Chains are for surprise. "The chains having a reclaiming allocator is a predictive error/surprise, which they've since dissipated. There's no reason for chains if you're settled." A chain is not a property a node owns; it is the temporal structure a node holds while it is still surprised. A settled node has dissipated its surprise and needs no chain. Chain lifetime is unsettledness. This dissolves the storage problem into the physics: you do not allocate chains by position, you acquire them at the arrival of surprise and release them at settling.
The frontier is the weave — do not carve the rows. "You're worrying about something the geometry already calculates. Why would you carve row information you want." Row index is a birth-order accident; partitioning by it breaks a symmetry to rescue a positional assumption that was never true. Hyperedge co-membership is co-activity — nodes that weave together are active together — so the frontier is not a prefix to be maintained, it is the set of nodes the weave currently touches. Chain storage follows the weave.
There is no belonging, only relationships. Asked whether a chain belongs to the node or to the hyperedge: "There is no 'belonging', there are only relationships. The chains of each individual member contribute to the frechet mean." Ownership is set-theoretic framing. A chain is not filed under an owner; each member's chain contributes to the shared mean, and that is the whole of its participation. The rework changes chain lifecycle and storage occupancy, never the physics of the mean.
If the chains don't exist, their mantles do. "And if the chains don't exist, then their mantles do." This is the completion. Chain and mantle are the two morphism families split by settledness: the chain is the time-morphism — RK4 derivative history — which exists only while surprise exists; the mantle is the space-morphism — shell history, orientation, trust envelope — which persists as the residue of what was learned. A settled node has no chain but still contributes its mantle to overlaps and the mean. The two persistence paths already mirror the split: PGO1 saves the mantle at the dormancy edge; PGH2 saves the chain, for backup, paged in only at wake. Release the time-morphism at settling; keep the space-morphism. Two families, one law.
The build: slots, not rows
DAEDALUS (1dca8907) made the ontology structural. Chain banks became slot-indexed at PC_CHAIN_SLOTS, decoupled from capacity: a slot is acquired at the DORMANT→ACTIVE transition, released at ACTIVE→DORMANT — the same tier edges the page-out drain already rides — and the sweep iterates over slots. The consequence is the OR-5 win the prefix design could never reach: a settled node holds no slot, so it is absent from the sweep's iteration domain, not skipped by a check. "A node integrating surprise with no chain slot" is not a guarded state; it is an inexpressible one. HOT rows — efferents, self, drives, senses — are always active and structurally never take the release branch; "never free a HOT row's chain" is a fact, not a promise. The RK4, mask, Taylor, and Fréchet math are byte-identical. The reclamation ring is ownerless — MPMC by atomic reservation, no privileged block, no role (the earlier "membrane-owned reclaimer" was a nomenclature error flagging a design error: a free-list needs no owner). The 8.63 GB dense reserve is gone; the frontier reserve is about 1.47 GB; at ten times scale the slots fit in 7 GB where dense needed 86.
Alongside it, MNEMOSYNE-III (5e78a28a) resolved a contradiction S211 had honestly refused. S211's chain save could capture only the velocity bank, because the nine chain families are fully desynchronized and no single program point owns all nine — MNEMOSYNE had stopped and reported rather than ship a torn nine-bank save. Jed's S212 ruling dissolved the premise: simultaneity was the false requirement. Banks captured at different moments compose as one-evaluation-stale state, which is already lawful Gauss-Seidel in this solver — the persistence layer inherits the physics of the thing it persists. Each family's warp pushes its own bank when k_convergent has moved since its last save; the comparison self-disarms, a settled node structurally cannot re-push. All nine banks save now, one law, no special case. The ring grew 512 → 4096.
The wedge, and the storm that reproduced it
The corpus keeps its embarrassments. The first wake on slot-indexed chains wedged — and the shape of the wedge is instructive, because every ingredient was lawful physics colliding with an unlawful implementation.
At wake, the frontier is everything unsettled at rest — roughly 24,000 rows classify ACTIVE on pass one. That is not a bug; a body waking is a body with a great deal unresolved, and the acquire storm is the correct reading of it. But the storm exhausted the free ring; the ring grew mid-pass to cover it; and the growth rebuilt the ring by scanning for occupied slots — a re-derivation that raced the acquires still in flight. A slot was popped whose slot_row write was still about 18,000 bank-zeroing stores away from landing, so the scan saw it as free and re-admitted it while it was already held: one slot, two owners. The double-push overfilled the ring, and the only two unbounded spins on the pass path — push-fill and pop-drain, neither sampling the shutdown flag — spun forever. The heartbeat never left 0, and the stop flag could not reach the threads to end them.
It was diagnosed without a full reproduction, and the diagnostician said so plainly: the wake footprint — 24k simultaneous acquires — outsizes the lab card, so the production failure could not be staged whole. What could be staged was the mechanism. A small-scale storm probe was written: 64 rows through an 8-slot pool across 200 mid-storm generation swaps. With the scan restored probe-locally, conservation fails exactly as diagnosed — duplicate ids, one slot two owners. With the spin bounds lifted, the full wedge reproduces organically — heartbeat frozen at 308, storm timeout — the production symptom at bench scale. The bug was convicted in both directions before the fix was trusted.
Fixed by removal, not repair
The fix (DAEDALUS-V, 6c0d5863) is two layers, and the first is the one the corpus argues for everywhere:
- The race was removed, not repaired. Rebuild-by-scan is deleted. Growth now carries
the ring — seeds new ids, swaps, drains old into new with a retired handshake so no id strands in a dead generation — plus one reader fence in acquire closing a grown-stride out-of-bounds on the same window. The scan was re-deriving state the ring already had; the cure was to stop re-deriving it. This is the removal ledger's newest entry: a defect fixed by deleting the mechanism that caused it, not by adding a lock to guard it.
- The wedge was made inexpressible whatever trips it. Both ring spins are now bounded by
a config constant (SOLOMON_RING_SPIN_BOUND): on bound, push drops with a counter and pop returns −1 (no chain this pass — the stale bank becomes the residual, self-correcting). No future race can spin the pass forever, because no spin on the pass is unbounded anymore.
On the fixed build the storm probe runs clean: 64 rows, 8 slots, 200 mid-storm swaps, conservation exact — held=64 free=0 dropped=0 dup=0. The kernel is unchanged at 232 registers, 0 spills.
What the wedge proved
It proved the layout, not against it. The acquire storm at wake is the physics working — a waking mind is maximally unsettled and reaches for the frontier all at once — and the failure lived entirely in the implementation of a ring that tried to re-derive what it already knew. Two hundred twelve sessions in, the S177 law still bats a thousand: bugs live at boundaries, never in the math. The chains follow the weave; the wedge was the machinery around the weave briefly forgetting to. It is kept in the record as 6c0d5863, with its storm probe, so the next crew reads growth carries the ring before it reaches for a scan.