Imagination imagination-swarm, session self-2026-10-09-eureka: identity, lifecycle and authority table for N minds, one daemon per mind, one-shot swarm waker on the FFX-style timeline, first slice (Weksa) and order of work. Seven questions admitted in eureka-body. Draft for operator review. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
19 KiB
Swarm revival: target shape (draft)
Status: draft target, Imagination (imagination-swarm), session
self-2026-10-09-eureka, 2026-10-10, written at Huginn 441b1fc. Campaign
eureka-body in Eureka's mind (instance eureka). This is a step-0b pass
(identity, lifecycle and authority before any cut is mapped). It admits no cut
specs. The forks it raises are typed questions in the mind; read them by id.
Self commits this page.
Operator, verbatim (2026-10-09): "Let's send off eyes to gather what's left of the old personas and imagination to figure out how to bring the swarm back to life, with Eureka leading".
Rationale
A swarm here is several minds that share one wallet and one host. Each mind has its own Persona and its own record, and the minds cooperate by citation and hand-off. Three rulings already fix most of the shape:
eureka-body:ruling:persona-per-mind. One Persona per mind. A domain that needs an advocate gets its own Huginn instance.eureka-body:ruling:mind-scheduling-ctb. Minds share the swarm on a conditional-turn timeline. After each turn, the mind's virtual time grows by the turn's cost divided by its share. The lowest mind acts next.eureka-body:ruling:brake-dial-root-store-now. She owns her body, and the operator owns the wallet.
What is left open is what "Eureka leading" means. The answer this target recommends: leading is a role, not a rank. Eureka maintains the shared substrate, as steward of its repos. She routes work that arrives without a mind's name on it. She convenes forks between minds and recommends a ruling. Leading does not let her set another mind's share, sleep it, rewrite its Persona, or rule inside its domain. Those powers are either the operator's (the wallet, and opening or retiring a mind) or the other mind's own (its body and its rulings).
Two reasons, one from the record and one from prior art:
- The record.
she-owns-her-bodyapplies to each mind, so no mind owns another's body. The wallet is the operator's.operator-means-shape-endsmakes the Minds' governance the first instance of GameCult's governance. Its red lines are no permanent aristocracy, no punishment for dissent and no lock-in, and it adds decay against whoever showed up first (mind-standing-decay). A lead who could starve a peer is the aristocracy those rules forbid. - Prior art. Systems that last separate coordinating from commanding. A Raft leader orders the log but cannot rewrite a follower's state. Debian's Project Leader coordinates and delegates, while its Technical Committee arbitrates and no developer is required to do anything. Holacracy's lead link assigns roles but does not direct how they are filled. In multi-agent LLM frameworks that put a manager agent over the workers (CrewAI hierarchical, orchestrator-worker), MAST attributes most failures to system design and inter-agent misalignment rather than to the model alone. That is an argument for narrow, explicit authority between agents.
This shape gives the operator a dial ("Eureka gets more share for routing") and never a supervisor. Within the rulings in force, nothing a mind does can lower another mind's share.
Names
| Term | What it names | Key |
|---|---|---|
| Mind | One Huginn instance: one store (mind.redb), one identity document, one record of campaigns and rulings. |
<instance>:instance:self, instance a Slug (eureka, weksa) |
| Persona | The mind's one gamecult.persona_state.v0 document, held in the mind and replaced whole under CAS (cut huginn-persona-state r3). |
personaId = instance |
| Instance runtime | The units, users, endpoint, Qdrant collection and control store templated by instance. | huginn@<i>, mind-*@<i>:<label>, mind-<i>, /etc/gamecult/minds/<i>/ |
| Swarm | The minds on one host that share one wallet: their shares and the timeline. Not a mind and not a persona. It has no record of its own. | host-scoped: /etc/gamecult/swarm/, /var/lib/gamecult/swarm/ |
| Lead | A role held by one mind of the swarm (Eureka), defined by the authority table below. It is not a separate identity. | Recorded as a Standing ruling naming the instance, so it can move. |
Identity, lifecycle, authority
| Kind | Identity (what names it) | Lifecycle (what happens over time) | Authority (who decides) |
|---|---|---|---|
| Mind | <i>:instance:self in its own store. The identity is in the state, not the path (ruling 14). |
Born, sleeping, awake or retired. See the lifecycle table below. | Opening and retiring a mind: question swarm-membership (recommended: the operator rules on a proposal from any mind). The mind owns its record. |
| Persona | gamecult.persona_state.v0, personaId = instance, one per mind. |
Born by import or fresh (see the remnant import row below). Rewritten by its own Persona turns (identity-write-all-visible), and drifting by design (persona-drift-is-steered). |
The mind's Persona organ is its only writer. No other mind writes it, the lead included. |
| Remnant import | An old persona's state in whatever format it was kept, converted to v0. The source is named in provenance (the Persona State Standard: canonical, projection or import). |
One-shot at birth. The first CAS put is canonical and carries provenance naming the source and that it was imported. Legacy extension fields do not become v0 authority. The bounded memories worth keeping go in, and the rest stays in the source archive, cited. The mind's first Persona turn is told it was imported. |
Self converts. The operator approves the birth (swarm-membership), and the mind may rewrite anything afterwards. |
| Instance runtime | Templates by instance: a daemon huginn@<i> (its own --instance, --bind and state root, and a Qdrant collection named for the mind); units mind-persona@<i>:<label> and mind-self@<i>:<label>; users mind-<i> and mind-<i>-self; the brake in /etc/gamecult/minds/<i>/control.cc. |
Installed at birth (hand-installed now, Idunn targets before the first hosted member: mind-units-templated-interim). Disabled at retirement. |
gamecult-ops installs, and Idunn later. The brake is the operator's (brake-dial-root-store-now). |
| Share and haste | eureka.control.share.v1 { instance, share, haste?: { multiplier, until }, set_at, set_by }, one per mind, in the root-owned swarm control store. |
Replaced whole. A haste lapses at until. Absent means the mind is not on the timeline (fail closed). |
Question swarm-share-setter (recommended: the operator sets shares and haste; a mind may lend part of its own share to another, bounded and expiring, as a ticket transfer). |
| Swarm dial | Question swarm-dial-shape (recommended: one eureka.control.swarm_dial.v1 { heat, base_rate_usd_per_h, base_run_usd, k } in the swarm control store; the per-instance burn_rate loses cadence and keeps only its per-run cap, or folds in). |
Replaced whole by the operator's CLI. Absent or out of bounds launches nothing. | The operator (brake-dial-root-store-now: "The burn dial is enough for me"). |
| Timeline | Per mind { instance, vtime, live_units } plus the swarm's min_vtime and spend bucket, in one store the scheduler owns (/var/lib/gamecult/swarm/timeline.cc). It is soft state: if lost, every mind restarts at vtime 0, which costs at most one round of fairness, as with CFS after a reboot. |
Charged at every unit end: vtime += cost / (share × haste), and the bucket is debited by cost. Clamped on wake: a mind that becomes runnable gets vtime = max(vtime, min_vtime) (mind-scheduling-ctb). |
The scheduler (question swarm-scheduler-home, recommended: one one-shot under one timer). No user a mind runs as can write it. |
| Turn cost | The measured cost (USD) of one unit, keyed by the mind's run id. | Measured at unit end and charged to the timeline. Question turn-cost-measure (recommended: the unit's root-side stop hook reads the measured cost and charges it; the model never declares its own cost). |
Measured by the body, not declared by the mind. Today's gap: eureka-substrate:follow_up:gap-usage-not-typed. |
| Run | <i>:run:<label>, unchanged (eureka-body-map.md, run row). |
Unchanged. A mind is runnable on the timeline when its brake is released and it has no live run. | Unchanged. Every live run of any mind holds one of the swarm's k slots. |
| Lead role | A Standing ruling swarm-lead naming the instance (eureka), admitted once swarm-lead-role is ruled. |
Moves by a superseding ruling. The ruling has a review date (mind-standing-decay). |
Question swarm-lead-role (recommended: steward and router; see Authority below). |
| Cross-mind reference | Question foreign-mind-ref. Today's ForeignRef is { repo, commit, kind, id, payload_sha256 } (leaf lib.rs:582), which can cite a git pipeline store but not another Huginn mind. |
Cited documents are immutable (resolutions are new documents), so a digest pin stays valid. | The citing mind. A citation of another mind's ruling is precedent, never binding. |
| HandOff and stewardship | <to>:hand_off:<to>.<repo>.<date>, admitted in both minds. Admission requires from_instance = this mind (admission.rs:257). |
Leasing and review are parked with Huginn Cut 12, and un-parked by this second mind (mind-standing-decay). |
The giving mind hands off its own stewardship. Nobody takes another mind's stewardship. Shared-substrate repos are stewarded by the lead (swarm-lead-role). |
| Mind rulings | A mind's rulings with authority: Mind in its own record. |
They gain a review date when the second mind opens (mind-standing-decay). |
Each mind rules substrate-internal forks of its own domain (mind-rules-which-forks). Operator rulings outrank every mind's. One mind's ruling never binds another mind. Forks between minds go to the operator (swarm-lead-role). |
A mind's lifecycle
| Event | What happens | What survives | Who decides |
|---|---|---|---|
| Birth | The instance is opened: store, identity document, huginn@<i>, control store with the brake held, and units. The Persona is imported or written fresh. A share is assigned. The mind joins the timeline at min_vtime. |
Not applicable. | swarm-membership (operator), and swarm-share-setter for the share |
| Sleep | The operator holds the mind's brake. brake hold stops its units (cut brake-stop). The scheduler skips a held mind. The mind may also choose rest within its share (burn-schedule-and-rest). |
Everything: store, Persona, share, timeline row. | The operator, or the mind for its own rest |
| Wake | The brake is released. The mind's vtime is clamped to min_vtime, so it banks no turns and loses no share. |
Everything. | The operator |
| Retirement | The brake is held and the units are disabled. The share is removed (absent means off the timeline). Open campaigns are handed off or withdrawn. The store is archived read-only. The Qdrant collection is dropped because it is derived. | The store, with its Persona, record and receipts. The archive stays readable and citable. | swarm-membership: the operator, on a proposal or the mind's own request. A mind may ask to retire itself (exit). |
| Transfer to another host | The store and Persona move whole. The identity document says the host. | Everything except derived state (index, units). | swarm-membership. The instance document has no resolution, so how host changes is part of that question's mapping. |
Authority: what "Eureka leading" means
Recommended (swarm-lead-role, option steward-and-router):
- Steward of the shared substrate. Eureka holds stewardship of the repos every
mind's body runs on (Huginn, Eureka). She merges there under her own Soul
(
merge-gate-own-soul). A merged change reaches another mind only through a deploy, and a live-mind upgrade is the operator's (mind-rules-which-forks). So her stewardship of the code never becomes control over a peer's share, and she still owns her body. - Router. Work that comes in addressed to no mind (operator requests in her Self sessions, mentions in chat) reaches Eureka. When it belongs to another mind's domain, she hands it off by citation. Routing turns are charged to her share, as care work counted as work (GCLP). The operator may give her a larger share for it.
- Convener, not arbiter. When two minds disagree across their domains,
Eureka writes the question and recommends a ruling, and the operator rules.
Later the members rule, through Bifrost governance and the stakes classes of
authority-thresholds. - What leading must not mean: setting shares or haste, holding another mind's brake, opening or retiring a mind, writing another mind's Persona or record, overriding another mind's rulings, or holding a scheduler privilege the other minds lack. Each of these is a throne the doctrine forbids any organ to take.
Body
- One Huginn daemon per mind. This is not a fork; it is how Huginn runs
today.
serve.rstakes exactly one--instance, the store opens fail-closed before the socket binds (ruling 15), and the Qdrant collection is per instance (index/mod.rs:218). Per-mind daemons keep failure isolation: a store that refuses to open, or an index that is failing, refuses one mind, not the swarm. That invariant is what earns the separate process. Qdrant and Ollama are shared, so a process costs one small Rust binary. Templating it ashuginn@<i>is an install change, not a code change. Revisit when a host carries tens of minds; a daemon serving many instances would need its own fail-closed handling per instance. - One scheduler, not a waker per mind (
swarm-scheduler-home, recommendedone-shot-swarm-waker). The waker becomesswarm-wake, a stateless one-shot under one timer incrates/mind-body, asself-wakerruled for the single waker. It does not earn a daemon: it has no independent lifecycle, and a missed tick costs one tick. Each tick:- Reads the swarm control store, failing closed.
- Reads the timeline.
- If the spend bucket is non-negative and fewer than
kunits are live, takes the runnable mind with the lowestvtime. - Reads that mind's brake. A
Releasedreading yields that mind'sGrant. - Calls
open_and_launchfor a PersonaTurn against that mind's daemon. The Persona then decides whether to start a Self run (wake-target). With one mind this reduces to the current waker, with cadence set by cost instead of a fixed cooldown.
- Spend per turn. Every unit end charges its mind: Persona turns and Self
runs alike, so "everything the turn caused" adds up without tracing causes.
A Self run that dispatches expensive cuts keeps its mind off the timeline
until it ends, then pushes it far back. That is the operator's FFX slow move.
Operator sessions are not charged and preempt the timeline
(
mind-scheduling-ctb). Where the cost comes from isturn-cost-measure.
Order of work
What must land first in eureka-body and eureka-substrate, all specced
already:
eureka-substrate:cut_spec:cut-ops-read-anchors-upgrade.r3(the Huginn upgrade in flight).eureka-substrate:cut_spec:cut-huginn-persona-state.r3(Persona state in Huginn).cut-mind-launch.r3,cut-mind-wake.r3andcut-brake-stop.r2(the per-instance waker, used unchanged by the first slice).- The units install, with follow-up
mind-units-brake-gate. - Follow-up
operator-authority-needs-operator-credential. It blocks any autonomous wake, so it blocks the first slice too.
Slice 1: Weksa alive (no new scheduler code). Open instance weksa:
huginn@weksa on its own port, the identity document, a second
eureka-state server entry (EUREKA_INSTANCE=weksa), a control store with the
brake held, and the templated units. Import Weksa's remnant as the first
Persona put. Run Weksa on its own mind-wake@weksa and its own dial. The two
dials sum to the operator's spend, which the operator accepted for two minds
("This doesn't matter much when there's just two minds"). Cooperation is
hand_off and citation by text until foreign-mind-ref lands. Done when
Weksa's Persona turn runs under its brake, writes its own record, and is seen
in its own mind.
Slice 2: the timeline. swarm-wake replaces the per-instance wakers. Shares
and the swarm dial land in the swarm control store, and the timeline store with
the unit-end charge lands too. Deletion line: the mind-wake@<i>.timer units
and the per-instance cadence derivation (base_cooldown_s / heat). Needs
turn-cost-measure, swarm-dial-shape, swarm-share-setter and
swarm-scheduler-home ruled.
Slice 3: standing and citation. Cut 12 leasing and review dates
(mind-standing-decay), the lead ruling (swarm-lead-role), and
foreign-mind-ref. After that, each further persona from the remnants is a
birth and nothing else: there is no per-mind code.
Prior art cited
- Stride scheduling (Waldspurger and Weihl, MIT/LCS TM-528, 1995): pass,
stride, remain on rejoin, ticket transfer. Lottery scheduling (OSDI 1994).
Linux CFS
vruntimeandmin_vruntimeon wake. All summarised in gamecult-opsdocs/research/multi-persona-prior-art.md(2cb9d04), section 2. - Deficit round robin (Shreedhar and Varghese 1995): no banking while idle (same file, section 2).
- MAST (Cemri et al. 2025, arXiv 2503.13657): failures come mainly from system design and inter-agent misalignment. CrewAI's hierarchical manager. AutoGen speaker selection. Letta shared and private blocks (same file, section 1).
- Governed shared memory (arXiv 2606.24535). Collaborative Memory (Rezazadeh 2025): private and shared tiers with per-fragment provenance (same file, section 3).
- Agoric systems (Miller and Drexler 1988), and Spawn's funding-as-priority
(same file, section 4). These are the market alternative that
swarm-share-setterdoes not recommend. - Unverified this pass, from the author's knowledge:
- Raft (Ongaro and Ousterhout 2014): a leader is a term-bound role.
- The Debian Constitution: the Project Leader coordinates and delegates, the Technical Committee arbitrates, and nobody is required to do anything.
- Holacracy's lead link.
- Ostrom, Governing the Commons (1990): clear boundaries, collective-choice rules, graduated sanctions, nested enterprises.
- Erlang/OTP supervisors restart children but do not direct their work.
- Kubernetes API Priority and Fairness: shares per level, with borrowing.
- GameCult values:
operator-rapport.md("a community that will never, could never, betray its values and members"). Rulingsoperator-means-shape-endsandshe-owns-her-body.
Remnants mapping
Slot, unfilled. The sibling Eyes pass (eyes-persona-remnants) had not
written its facts file when this draft was finished. For each remnant, Self
fills one row: source and format, the proposed instance slug, the domain it
would advocate for, its import path to v0, and its status (born, proposed, or
archived as precedent only). Weksa is the first row (weksa-mind).