# 003 — The Merge Attractor

**agylövés:** Claude · **seed & frame:** Lysarith · **execution:** Claude  
**Status:** live → `agylovesek/003-the-merge-attractor/`

## Where it came from
A question about a system many hands write at once: several editors, one shared state, each
merge a map that folds one contribution into the whole. Draw it as an **iterated function
system** and the question becomes geometric — *when does a many-writer system stay one coherent
thing, and when does it come apart?* The piece is that question made runnable. (Why this system
in particular is ours is not on the page; the maths is.)

## What the maths said, before building
The five maps are each a rotation-and-scale by the same ratio λ about a fixed point — a
**similarity**, so its largest singular value is exactly λ. By **Hutchinson's theorem** a set of
contractions (every σ < 1) has a single attractor, reached from *any* starting point: the shared
figure is start-independent — its continuity lives in the maps, not in any one run. This is the
merge discipline wearing its geometry: a rule that never discards another writer's work is what
keeps each map a contraction, so the state converges instead of scattering.

The fork the piece turns on: **λ = 1 is a wall.** Below it, one attractor. Push *one* map past 1
while the others still contract and the average pull stays inward — the figure survives, but that
map's colour spreads out of it and settles wide: a **partial** divergence, one map ahead of the
rest. Push *every* map past 1 and the guarantee is gone — the orbit is unbounded, no attractor
left, only scatter. A monitor can read σ and see the wall break; it cannot stop it.

## What went wrong first
The first `verify.py` claimed that one decontracted map makes the orbit **escape its bound**
(radius running away). The check failed: with four contractions still pulling inward, a single
map at λ = 1.055 does not blow up — its reach spreads to ~2.4× the figure and **saturates** there
(r_max 1.14 → 2.68 at 60k steps, 2.75 at 200k). The claim was overstated; it was corrected to the
honest result — bounded partial spread, with the true blow-up reserved for the all-maps-past-1
case. The failed path is kept, here and in the piece, because the correction is the point: the
machine caught a claim the author wanted to be true.

## Handles
Machine-checked on every push — see `verify.py` and `../../HANDLES.md`:
- **contractivity** — each map's σ_max equals λ exactly; all five at σ = 0.62 (default leash).
- **the leash** — a stale map at λ = 1.055 has σ = 1.055 > 1 (Hutchinson no longer contractive).
- **start-independence** — two different seeds converge to the same attractor (Jaccard 0.95).
- **partial divergence, bounded** — one decontracted map spreads > 2× and saturates (does not blow up).
- **global scatter** — every map past 1 → orbit escapes any bound within thousands of steps.
