Beads reshape (split / merge / reassign / prune) like Gaussian splats optimize (Bead Reshaping)

**Note** from Bead: Bead Reshaping · [canonical source](https://redfish.acequia.io/guerin/.agents/4c17b0ec-441c-4285-85d1-f727492cc58a/2026-06-17/notes/00-beads-reshape-like-gaussian-splats.md) · session 2026-06-17 · discussion: Talk: Bead Reshaping

> Opened 2026-06-17 from Stephen's directive (verbatim in the chat log): *"as we add things like contacts > on this bead (agentscript-webgpu) they conceptually don't belong. Beads will reshape (splitting and > merging) with other beads much like gaussian splats optimize their number and shapes."*

## 1. The analogy — adaptive density control for beads **3D Gaussian Splatting** doesn't fix the number or shape of its primitives. During optimization it runs **adaptive density control**: it **clones/splits** splats where reconstruction is poor (high positional gradient — under-covered or over-stretched regions), **prunes** splats with near-zero opacity, and lets each splat's **position/scale/opacity** drift, so the *set* of primitives converges to the one that best represents the scene with the fewest, best-shaped Gaussians. (The engine literally ships this — the splat trainer in `c66cbd1d` / `taos-engine/src/splats/training`.) **Beads are the same.** The bead set is a set of primitives covering **concept-space / the work**. It should be optimized the same way: | Gaussian splatting | Bead reshaping | |---|---| | splat = a primitive covering part of the scene | bead = a primitive covering part of the work/concept-space | | **clone / split** a high-gradient splat | **split** a bead that has accreted a separable concern | | **prune** a low-opacity splat | **apoptose** (`/end-bead`) a dead/unreferenced bead — *not* necrosis | | merge / overlapping redundancy collapses | **merge** two beads converging on one concept | | position / **scale** / opacity drift | a bead's **scope / boundary** drifts (its `about.md` mechanism) | | positional **gradient** drives densification | **conceptual tension** drives reshaping (§2) | | loss = reconstruction error | "loss" = how well the bead set matches the true structure of the work | So a bead is not a permanent container; it is a **current best primitive**, subject to the same split/merge/prune optimization. The Glass Bead Game's recombinable beads, made dynamic.

## 2. The signal: conceptual tension = the "gradient" What tells you a bead needs to reshape? **Content that conceptually doesn't belong** — the smell Stephen named. Symptoms = a high "gradient": - a bead's `about.md` mechanism needs "and also…" clauses for unrelated concerns (heterogeneity); - material is added that a *different* bead is the natural home for (contacts on a WebGPU bead); - two beads keep citing/duplicating each other (merge pressure); - a bead has no inbound references and isn't advancing (prune pressure → apoptosis). These are **soft signals**: bead boundaries are **soft constraints** (cf. every-constraint-is-soft / the Hubler ecology). Reshaping = **least-action relaxation of the partition** toward lower tension — the same bidirectional-coherence relaxation the rest of the ecology uses, applied to the bead graph itself. And in agent-based-hubler-network terms, reshaping is just the **population dynamics** (hatch/merge/die) of beads-as-agents.

## 3. The operations (offer-only / apoptotic) - **Split** — move a separable concern out into a new (or existing) bead; leave a link where it was. - **Merge** — fold two convergent beads into one; tombstone the absorbed GUID with a redirect. - **Reassign** — move a single artifact to its proper bead (the contacts move, §4). - **Prune** — apoptose a dead bead (flush a durable summary first; never necrose). All **offer-only**: a reshaper proposes (dock envelopes), it does not silently rewrite another bead. The **mayordomo / bead-orchestrator (`4c6470f9`)** owns the `.agents/` registry and is the natural place to *execute* ratified reshapes — this bead supplies the *theory + protocol*, that bead the *mechanism*.

## 4. Worked example #1 — contacts accreted onto agentscript-webgpu While building the **agentscript-webgpu water model**, the conversation added: contact info for **Joshua Thorp** (CTO, provisioning), **Joshua Widdicombe** (Harvard), **Kasra "Kaz" Manavi** (Simtable), plus a **save → user-subdomain provisioning** flow. The contacts are pure accretion — a WebGPU bead is not the home for an address book (high gradient). **Reshape applied (reassign — iterative).** The contacts were first staged at `redfish.acequia.io/people/`, then — when that still wasn't the right shape — reshaped into a dedicated **`contacts` collection bead** ([`e47cb39d`](https://redfish.acequia.io/guerin/.agents/e47cb39d-e473-45fb-98a7-457b2d19066e/about.md), members `thorp/`/`widdicombe/`/`kaz/`, a `contacts.json` index; "a collection, not a STAC collection, self-sovereign"). The staged `people/` copies were deleted. **The two-step move is itself the lesson: reshaping is iterative — the right primitive emerged by relaxation, not first guess** (the splat optimizer also takes many steps). The agentscript-webgpu bead keeps only a **link** to the provisioning contact. **Reshape flagged (candidate split):** the **save / user-provisioning / user-model** concern in agentscript-webgpu `notes/02` conceptually belongs with the **Acequia User Model** bead ([`9e1d87f5`](https://redfish.acequia.io/guerin/.agents/9e1d87f5-a226-4d1a-be05-64c8d5cacf38/about.md)) and Kaz's AnyHazard user-model review ([`31bd5380`](https://redfish.acequia.io/guerin/.agents/31bd5380-d743-420f-81a1-9258e7fbbf9a/about.md)). For now agentscript-webgpu *links* to them (done); a future split would move the save-flow design there, leaving the water model with just "call the user-model's save API."

## Open questions - **Q1.** The "doesn't-belong gradient" — can it be made quantitative (a loss the orchestrator computes over `keywords.json`/`about.md` to flag split/merge candidates), or does it stay a human/LLM judgment? - **Q2.** Link preservation across a split/merge: absolute-URI inbound links break when content moves. WebDAV MOVE + a redirect/tombstone? A per-bead `names.json` indirection so links resolve through it? - **Q3.** Cadence + driver: who runs reshaping — the mayordomo on a schedule, or event-driven when a dirtying turn raises a bead's heterogeneity? (cf. the dirty-gated bead-sync.) - **Q4.** Merge mechanics: how to fuse two beads' dated `notes/chats/` without losing provenance.

## References (bead cross-links) - Bead: Contacts · [canonical](https://redfish.acequia.io/guerin/.agents/e47cb39d-e473-45fb-98a7-457b2d19066e/) - Bead: Acequia User Model & Architecture Bead · [canonical](https://redfish.acequia.io/guerin/.agents/9e1d87f5-a226-4d1a-be05-64c8d5cacf38/) - Bead: 31bd5380 · [canonical](https://redfish.acequia.io/guerin/.agents/31bd5380-d743-420f-81a1-9258e7fbbf9a/)