From eebcd393665d1cf5a4bc75fc3015d299bcfafbce Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Fri, 2 Oct 2026 14:04:36 +0200 Subject: [PATCH] Thing map r3: rename-now wire cuts per live edge, Persona retirement, target r2 proposal Co-Authored-By: Claude Fable 5.1 --- docs/thing-campaign.md | 461 ++++++++++++++++++++++++++++++++--------- 1 file changed, 359 insertions(+), 102 deletions(-) diff --git a/docs/thing-campaign.md b/docs/thing-campaign.md index 22c6f4b..e593d5e 100644 --- a/docs/thing-campaign.md +++ b/docs/thing-campaign.md @@ -1,11 +1,17 @@ # Thing: the rename of Eve, map and target -Status: map, Imagination (`imagination-thing`), revision 2 of 2026-10-02. +Status: map, Imagination (`imagination-thing`), revision 3 of 2026-10-02. Campaign slug `thing`. Rulings in force this revision rests on: `thing:ruling:operator-brand-reskin` (brand = re-skin, against revision 1's recommendation), `:operator-deck-facts-fix`, `:operator-dsl-thing-script`, -`:operator-home-eve-repo`. Open: `wire-names`, `aetheria-eve`, -`persona-continuity`. Cut 1's spec is `docs/thing-cut-1.spec.json`. Questions, cut specs, rulings and +`:operator-home-eve-repo`, `:operator-wire-rename-now` (wire-names = +rename-now, against revision 1's recommendation), `:operator-aetheria-eve-rename` +(rename-archived), `:operator-retire-persona` (a direction ruling: the Eve +Persona is retired and nothing replaces it; `persona-continuity` was +withdrawn because the answer fell outside its options). The operator's words +for the last three, verbatim: "Rename all, retire the Persona". Open: +`aetheria-eve-contents`, `member-names` (section "Questions"). Cut 1's spec is +`docs/thing-cut-1.spec.json`; revision 3 proposes target r2. Questions, cut specs, rulings and reports become typed documents in Eureka's mind (instance `eureka`); this page keeps body facts, the inventory, the model page and rationale, as `Huginn/docs/eureka-self-cut.md` does for `eureka-body`. @@ -190,6 +196,78 @@ Persona-state steward yet. | Persona divinity arithmetic | Correct as stated (2.5/7 = 35.7%; 3.5/7 = 50.0%). | | "Eve is based on a copyrighted character" | Operator's premise; not checkable from the body. | +### B9. The apps are not published anywhere + +`org.gamecult.evecanvas` (iOS, `EveCanvas`) installs only by Theos over SSH +onto the jailbroken iPad `EVE` (`make package && make install`, README +"Deployment"); `org.gamecult.eve` (Android) installs only by `adb install -r` +onto Periwinkle with on-device approval; EveFlutter's `com.example.eve_parity` +is a parity harness. No store, TestFlight, F-Droid, AltStore or package feed +references any of them (`rg` over Eve, EveFlutter, gamecult-ops: no hit). The +Idunn targets `eve-ipad-evecanvas` and `periwinkle-eve-android` are both +`Status = "blocked"` with no deploy command. Changing the application ids makes +a new app on each device and leaves the old install behind; both devices are +operator-owned and the old app is removed by hand (`uicache`, `adb uninstall`). +Not a fork: the ids rename, and the two uninstalls are listed as operator +steps. + +### B10. There is no alias window on the wire; the store has a compatibility path + +CultLib's live `document-variants` campaign (`CultLib/docs/document-variants-cut.md`) +carries two rulings that bind this one. **F7 (operator, 2026-09-30): retire +`AsSchemaAlias`**, quoted there as "Schema aliasing sounds like a really bad +idea"; the alias API, its registry path and tests are being deleted across +runtimes, and C# `TryResolveDescriptorBySchemaAlias`, payload sniffing and +`CultNetSchemaAliasMatching` are on the deletion list. **C1 (agreed): one +string names a schema on every runtime and at Odin**, and every reader asks +for that exact string. So a renamed id has no dual-read window on the wire: +a producer and its consumers must agree at every moment they are both live. + +Stored records are different. `CompatibleSchemaIds` exists in C# +(`GameCult.Caching/CultCache.cs` line 28; a persisted entry's compatible ids +are read at line 510), TypeScript (`cultcache-ts`) and Python +(`cultcache-py`): a document type declares the old id, records stored under it +load, and new writes carry the new id. The variants map's F9 makes compatible +ids compare as a set. **Rust `cultcache-rs` has no compatible-id path** (`rg +-i compatible packages/cultcache-rs/src`: nothing), and the variants map (§2) +records that Rust `pull_rudp_catalog_snapshot` drops unknown records silently. +Rust-written stores that may hold eve-typed records: Odin's `odin.cc` +(`odin-core/src/repository.rs`; a catalog of advertisements, derived) and +Ghostlight's `service/mesh-v2.cc` (`deployment/idunn/recipe.toml` line 166; +Hands probes whether it holds `gamecult.eve.surface`-typed records). +TS/C#/Py-written stores that do: Bifrost `.bifrost/provider-store.cc` +("typed provider advertisement, operator surface, Eve interface binding", +`tools/provider-advertisement.mjs` line 372), VoidBot +`.voidbot/status/cultmesh/voidbot-swarm-state.cc`, weksa `.weksa/*.cc` +witnesses, Heimdall's verse state, repixelizer's (Python). + +Member names are part of schema identity in TypeScript and Python +(`canonicalSchemaJson` carries `member.memberName`, `cultcache-ts/src/cult-cache.ts` +line 706) and not in C# (slot and type driven, `cultcache-schema-compatibility.md`). +A member named `eve_*` (Ghostlight's deployment receipt field `eve_commit`, +`gamecult.ghostlight.deployment.v2`) is therefore a schema revision in two +runtimes, not a string swap; see question `member-names`. + +### B11. Where the Persona actually lives and speaks + +VoidBot's Discord bot, worker and `persona-scheduler` run only in the Starfire +local stack (`gamecult-ops/runbooks/voidbot-local-stack-and-reindex.md`: "the +workstation-local VoidBot stack ... not the public GameCult server"); +`scripts/test-voidbot-swarm-yggdrasil.sh` fails if `bot`, `worker` or +`persona-scheduler` appear in the Yggdrasil compose, which runs only the +swarm publisher (`systemd/voidbot.service`, "VoidBot typed swarm Eve +publisher"). The canonical Face registry is +`REPO_DISCORD_IDENTITIES_PATH=.voidbot/private/repo-discord-identities.json` +in the VoidBot checkout on Starfire (git-ignored; the committed example is +`config/repo-discord-identities.example.json`); an entry carries `id`, +`repoName`, `repoPath`, `roleId`, `avatarUrl`, `faceStatePath` +(`.voidbot/private/repo-faces/.cc` by default; Eve's is the repo's +own `.voidbot/state/eve.cc` per `.voidbot/status/void-memory-maintenance.json`). +`ensureRepoFaceInitialized` recreates `.voidbot/voice` and `identity.json` on +the first role-addressed chat, so retirement must remove the registry entry and +the Discord role, not only the repo files. The ops archive precedent for `.cc` +state is `gamecult-ops/artifacts/` (`ghostlight-campaign-*.cc`). + ## Inventory of the rename Method: `voidbot` MCP for the repo list and semantic hits, then `rg` over @@ -413,10 +491,10 @@ EveElectron 1, EveTui 1, Heimdall and EvePlugins 0. Four different things: | --- | --- | --- | --- | | GitHub repo name | `GameCult/`; injective within the org | renamed once; old name redirects until reused; never reused | operator via `gh repo rename`; Hands executes under a ruling | | Local checkout path | `F:\Projects\`; sibling paths assumed by scripts and memory notes | renamed with the repo; stale paths are a defect | Hands in cut 2; memory notes in cut 3 | -| Schema id | `gamecult.eve..v` in `Eve/schemas/*.schema.json`, mirrored as constants in CultLib Rust and consumer runtimes | versioned by suffix; a rename is a new id, so a migration of every fixture and conformance pack | ruling `wire-names`; owner of the id is the schema file in the kernel repo | +| Schema id | `gamecult.eve..v` in `Eve/schemas/*.schema.json`, mirrored as constants in CultLib Rust and consumer runtimes | renamed to `gamecult.thing..v` (same `v`: the shape is unchanged); old id declared in `CompatibleSchemaIds` so stored records load; no alias on the wire (B10) | `operator-wire-rename-now`; owner of the id is the schema file in the kernel repo; each live Verse redeploys as one window | | Provider type id | `mimir.eve_*.v1` and any other provider ids naming eve | provider-versioned | the provider repo, under `wire-names` | -| Package id | `org.gamecult.eve.*` (UPM), `@gamecult/eve-*` (npm, unpublished), `org.gamecult.eve` / `org.gamecult.evecanvas` (installed app ids) | UPM: consumers pin by git URL plus id, a rename breaks every manifest; app ids: a rename is a new app on the device | `wire-names` | -| Persona identity | `identityId: eve` (identity.json), `agentId` in `eve.cc`; Discord `roleId` numeric | one Persona, renamed in display; id frozen or migrated | VoidBot's persona-state path (`persona:migrate-portable`); no second writer; ruling `persona-continuity` | +| Package id | `org.gamecult.eve.*` (UPM), `@gamecult/eve-*` (npm, unpublished), `org.gamecult.eve` / `org.gamecult.evecanvas` (installed app ids) | UPM renamed with a new tag that consumers repin to in their own cut; npm renamed in place (unpublished); app ids renamed, old installs removed by hand (B9) | `operator-wire-rename-now` | +| Persona identity | `identityId: eve` (identity.json), `agentId` in `eve.cc`; Discord `roleId` numeric; registry entry on Starfire | retired: registry entry and role removed, state archived byte-identical with provenance, never read as live; nothing replaces it | `operator-retire-persona`; the archive is written once by Hands and owned by gamecult-ops; no live reader | | Display name | "Eve", "Eve DSL", "Eve MultiVerse", "Eve/CultUI", "EveFlutter"... in doctrine, READMEs, site, cards | replaced once by the taxonomy; historical records keep the old word | the taxonomy in this map, ruled by the operator; single copy in the Thing README "Naming" section, cited by doctrine | | Site URL | `/Blog/`, `/tags/eve`, `/static/applets//` | permanent once published; the site has no redirect mechanism | gamecult-site; invariant `old-names-resolve` | @@ -429,18 +507,27 @@ No cut is mapped on a kind whose cell is empty; none is. (`F:\Projects\CLAUDE.md`, charters, memory notes) cite it; they do not restate it differently. - Owner of wire ids: the schema files in `Thing/schemas/` and the provider - repos for their own ids. Under the recommended `wire-names` ruling they are - frozen at the `eve` spelling for every `v1`; a `gamecult.thing.*` id appears - only with a breaking revision that is paid for by something else. -- Owner of Persona state: `.voidbot/state/eve.cc` through VoidBot's - persona-state service. `identity.json` and the site card are derived - display; they do not decide the Persona's name. + repos for their own ids. Under `operator-wire-rename-now` every eve-named id + becomes a thing-named id in this campaign; the kernel declares each new id + once, consumers copy the exact string (C1), stores declare the old id + compatible or are rebuilt from their source of truth (B10). No alias, no + translation layer, no "accept both" on the wire. +- Owner of the Persona's end: `operator-retire-persona`. The last live + `eve.cc` is archived once, with provenance, in gamecult-ops; afterwards no + runtime reads it. The registry entry, the Discord role, `.voidbot/voice`, + the site card's Persona parts and the portrait are live surfaces and come + down. Nothing is created in their place. - Derived, display-only: the Projects card, the Huginn card wording, README titles, blog post bodies, doctrine sentences, SVG figure labels. - Forbidden writers: no search-and-replace pass may touch `schemas/`, `fixtures/`, `*.cc`, `Packages/manifest.json` pins, `package.json` names, `pubspec.yaml` names, Android `applicationId`, iOS bundle ids, or Discord - ids. A rename of any of those is a cut of its own under a ruling. + ids outside the wire cut that owns them; a wire cut edits each by hand with + its compatible-id declaration and its consumer repins in the same diff. No + store is rewritten in place: a `.cc` file is either read through compatible + ids by its owning runtime or deleted and rebuilt by its owning daemon from + the source of truth it caches. No agent writes to `eve.cc` after the archive + is taken. - Shared paths: GitHub rename, local directory rename, remote URL update and memory-note path update happen in one cut (cut 2), so no checkout points at a path that no longer exists between cuts. @@ -455,26 +542,45 @@ No cut is mapped on a kind whose cell is empty; none is. portrait URL the site uses, every `gamecult.org` page and tag) resolves after each cut, by redirect or by retention. No repo named `Eve*` is created in the org after cut 2. -- `wire-ids-under-ruling`: no stored or published id (`gamecult.eve.*`, - `mimir.eve_*`, `org.gamecult.eve*`, `@gamecult/eve-*`, `identityId eve`) - changes except as the `wire-names` ruling allows; EveConformance fixtures and - exported packs decode unchanged after every cut. +- `rename-whole-per-edge` (replaces revision 1's `wire-ids-under-ruling`; + chosen shape: **same-cut per edge, no dual-read window on the wire**, since + F7 retired aliasing and C1 makes every reader ask for one exact string, + B10): every eve-named wire id is renamed in this campaign; for each id, every + live producer and every live consumer of it moves in one cut per live edge, + and no commit on any `main` leaves a live edge with a producer and a + consumer disagreeing on the id; a Verse whose daemons share an id redeploys + in one Idunn window, Odin first or together (Rust drops unknown records); + every store that holds old-id records either declares the old id in + `CompatibleSchemaIds` (C#, TS, Py) or is deleted and rebuilt by its daemon + from the truth it caches (Rust, and any cache); ThingConformance fixtures + and exported packs, old and new, decode after migration; no alias, + translation or "accept both" path is introduced anywhere. - `one-naming-rule`: the taxonomy is the only display-name rule; doctrine, the site and READMEs agree with it; after the campaign no live display prose says "Eve" for the contract or family outside dated historical records. -- `persona-continuity`: one Persona, one state file, one writer; the rename - keeps provenance (`updatedAt`, `storedAt`, history) and introduces no second - copy of Persona state. +- `persona-retired` (replaces `persona-continuity`): no live surface presents + an Eve or Thing Persona: no VoidBot registry entry, no Discord role, no + `.voidbot/voice` or `.voidbot/state` in the Thing repo, no Persona badge, + portrait or biography on the Projects card, no portrait served from any + GameCult URL that live prose links; the archived state is byte-identical to + the last live `eve.cc` (sha256 recorded) with provenance (source path, + commit, `storedAt`, archive date) and is read by no runtime; no portrait is + commissioned. - `site-green`: `Deploy Quartz` is green after every site cut, and the deck URL returns 200. - `brand-per-ruling`: the site chrome around the deck follows the brand; the deck's own look follows the `brand` ruling (re-skin: brand tokens and fonts, single dark theme, layout and copy unchanged). -Not in scope: Eve's architecture, contracts or renderer behaviour; Unity +Not in scope: Eve's architecture, contracts or renderer behaviour (an id +changes, no shape changes: every renamed schema keeps its `v`); Unity CultUI (`org.gamecult.ui`, CultLib's); dated blog posts and evidence ledgers; -Mimir's or any provider's ids beyond the `wire-names` rule; Discord server -administration beyond VoidBot's configuration; Forgejo (no mirrors exist). +Epiphany (being archived under `eureka-body`; its `atlas/eve_surface.rs` and +ids die with it, not here); member names inside schemas unless `member-names` +rules otherwise; the Yggdrasil filesystem paths `/srv/repos/Eve` and +`/srv/build/Eve` (Idunn-owned deployment state, not a public name); Forgejo +(no mirrors exist); the devices' old app installs beyond the two listed +uninstalls. ## Cut 1: put the deck on the site, re-skinned to the brand @@ -615,74 +721,191 @@ dependency. ## Cut order after cut 1 -Each cut is one `cut_spec`; `depends_on` is in parentheses. +Each cut is one `cut_spec`; `depends_on` is in parentheses. Prose and +display cuts come first because they are cheap and reversible; the wire cuts +follow in producer-to-consumer order so that no live edge is ever +half-renamed (invariant `rename-whole-per-edge`); in-repo prose comes after +the kernel wire cut so READMEs state the new ids once. - **Cut 2 `repo-renames`** (none). For the seven live repos: `gh repo rename Thing -R GameCult/Eve` and so on (`ThingUnity`, `ThingFlutter`, - `ThingElectron`, `ThingTui`, `ThingPlugins`, `ThingConformance`); for - AetheriaEve as ruling `aetheria-eve` says (unarchive, rename to - `AetheriaThing`, re-archive, or leave). In the same cut: rename the local - directories `F:\Projects\Eve*` to match, `git remote set-url origin` in each, - update `.voidbot/voice/identity.json` `repoName` and `repoPath`, probe that - `raw.githubusercontent.com/GameCult/Eve/main/.voidbot/voice/eve.png` still - answers 200 (if not, cut 4 moves the card's image URL first), and run - `rg "uses: GameCult/Eve" F:\Projects --glob "**/.github/**"` (B2: action - references do not redirect; any hit is fixed in this cut). Ops wiring - (inventory A5): fields that *derive a GitHub URL from the repo name* change - (`Repo = "Eve"` in `idunn-deployment-targets.ps1` if Idunn builds the clone - URL from it, Hands probes; `Ghostlight/.gitmodules` URL and - `ghostlight.toml.in`); server filesystem paths (`/srv/repos/Eve`, - `/srv/build/Eve`, `HERMODR_EVE_*`, `eve_repo=`) stay as they are, since a - path on Yggdrasil is Idunn-owned deployment state and not a public name; - moving them is a separate ops cut if ever wanted. Verify with `git - ls-remote https://github.com/GameCult/Eve.git` still resolving, each - renamed checkout fetching, and `git submodule update` in Ghostlight. + `ThingElectron`, `ThingTui`, `ThingPlugins`, `ThingConformance`). For + AetheriaEve, ruling `operator-aetheria-eve-rename`: `gh api -X PATCH + repos/GameCult/AetheriaEve -f archived=false`, `gh repo rename AetheriaThing`, + `gh api -X PATCH repos/GameCult/AetheriaThing -f archived=true`; its + contents are not touched here (question `aetheria-eve-contents`). In the + same cut: rename the local directories `F:\Projects\Eve*` to match, `git + remote set-url origin` in each, update `.voidbot/voice/identity.json` + `repoName` and `repoPath` only if cut 5 has not yet removed the file, probe + that `raw.githubusercontent.com/GameCult/Eve/main/.voidbot/voice/eve.png` + still answers 200 (if not, cut 4 moves first), and run `rg "uses: + GameCult/Eve" F:\Projects --glob "**/.github/**"` (B2: action references do + not redirect; any hit is fixed in this cut). Ops wiring (inventory A5): + fields that *derive a GitHub URL from the repo name* change (`Repo = "Eve"` + in `idunn-deployment-targets.ps1` if Idunn builds the clone URL from it, + Hands probes; `Ghostlight/.gitmodules` URL and `ghostlight.toml.in`); server + filesystem paths (`/srv/repos/Eve`, `/srv/build/Eve`, `HERMODR_EVE_*`, + `eve_repo=`) stay as they are, since a path on Yggdrasil is Idunn-owned + deployment state and not a public name. Verify with `git ls-remote + https://github.com/GameCult/Eve.git` still resolving, each renamed checkout + fetching, and `git submodule update` in Ghostlight. - **Cut 3 `doctrine-and-memory`** (2). `F:\Projects\CLAUDE.md` lines 23, 24, 26, 28 ("Eve/CultUI", "native Eve", "CultMesh/Eve surface", "Eve DSL", "Eve - MultiVerse") and line 90 ("Eve GUI lowerings"); `~/.claude/CLAUDE.md` line - 175; `gamecult-ops/docs/persona-state-standard.md` last paragraph ("Eve, - overlays, native clients"); `gamecult-ops/docs/eve-crusade-coordination.md` - and `verse-service-architecture.md` as the inventory lists; memory notes: + MultiVerse" become "Thing", "Thing Script", "Thing MultiVerse" per ruling + `operator-dsl-thing-script`) and line 90 ("Eve GUI lowerings"); + `~/.claude/CLAUDE.md` line 175; `gamecult-ops/docs/persona-state-standard.md` + last paragraph ("Eve, overlays, native clients"); + `gamecult-ops/docs/eve-crusade-coordination.md` and + `verse-service-architecture.md` as the inventory lists; memory notes: `~/.claude/projects/F--Projects/memory/cultcache-stores-outside-assets.md` - lines 30-31 and `MEMORY.md` line 119 (reworded with the `dsl-name` ruling - so the Unity CultUI versus DSL distinction survives: "Unity CultUI is not - Thing Script" under the recommendation), - `cultlib-ci-harness.md` line 95 only if the script file is renamed. Leave as - written: `eureka-memory-organ.md` lines 90, 124, 131 and - `pending-doctrine-proposals.md` line 36 (historical); low risk, reword in - passing: `F--Projects-Aetheria/memory/aetheria-legacy-first.md` line 15, - `aetheria-cultcache-migration.md` line 19. The taxonomy is written once in - the Thing README "Naming" section and cited from doctrine. + lines 30-31 and `MEMORY.md` line 119 reworded to "Unity CultUI is not Thing + Script", `cultlib-ci-harness.md` line 95 only when the script file is + renamed (cut 8). Leave as written: `eureka-memory-organ.md` lines 90, 124, + 131 and `pending-doctrine-proposals.md` line 36 (historical); low risk, + reword in passing: `F--Projects-Aetheria/memory/aetheria-legacy-first.md` + line 15, `aetheria-cultcache-migration.md` line 19. The taxonomy and the + Thing Script name are written once in the Thing README "Naming" section and + cited from doctrine. - **Cut 4 `site-prose`** (2). `GameCult/Projects/index.md`: the Eve card - becomes the Thing card (id `thing`, repo links to the new names, portrait - URL to the new repo path), the Huginn card drops "Eve projection" and - "projects inspectable Eve surfaces" in favour of what Huginn is (B6); + becomes the Thing card with id `thing`, repo links to the new names, **no + Persona**: the portrait `` is replaced by the `swarm-avatar-fallback` + letter "T" the Ghostlight card uses, the `swarm-badge` and the + `
` biography are removed, the kicker and + description describe the contract and renderer family (ruling + `operator-retire-persona`; the legend's Face/Forming/Stewarded states are + unchanged and no "retired" state is added); the Huginn card drops "Eve + projection" and "projects inspectable Eve surfaces" for what Huginn is (B6); `Docs/Architecture-and-Evidence.md`, `Docs/Site-Architecture.md`, `Docs/index.md`, `Pitch.md`, `tour.md`, `stichting.md`, `Projects/CultLib.md` per the inventory; the SVG figure `static/interactive/portfolio-pitch/figures/surface-web-stack.svg` (two - "Eve" labels). Dated blog posts and the `eve` tag stay. `Deploy Quartz` - green. -- **Cut 5 `persona`** (2, ruling `persona-continuity`). Through VoidBot's - persona-state path: `publicName` and `publicDescription` in `eve.cc` - renamed with provenance preserved; `identity.json` `displayName: Thing`, - `avatarUrl` repointed to the repo's own `.voidbot/voice/` (the current URL - names a dead VoidBot branch, B7); a new portrait `thing.png` per - `~/.claude/doctrine/images.md` (the deck's own constraints, played - straight: no orange rock, at least one arm, nothing ordinal); `docs/eve-persona.md` - → `docs/thing-persona.md` by `git mv` with its text updated; - `.voidbot/state/README.md` repointed from the nonexistent `docs/eve-face.md` - to it; the site card image in cut 4 follows. The Discord role's display name is an operator - action in Discord and is listed, not executed. -- **Cut 6 `in-repo-prose`** (2). README titles and bodies in the eight repos, - `docs/eve-*.md` → `docs/thing-*.md` by `git mv`, comments and fixture - descriptions, `EveCanvas`/`EVE*` class prefixes only if the ruling on wire - names allows (installed app ids are wire). Forbidden-writer rule applies: - no pass over `schemas/`, fixtures or manifests. -- **Cut 7 `wire-ids`** (6, ruling `wire-names`). Under `freeze`: one - paragraph in the Thing README "Naming" section: wire ids keep the `eve` - prefix as history; new breaking revisions take `gamecult.thing.*`. Under - `rename-now`: the migration, specified then, per id class. + "Eve" labels); `static/interactive/cotsc-praxis/eve.png` is removed if + nothing live references it (Hands probes the Ink and manifest files that + name it). Dated blog posts and the `eve` tag stay. `Deploy Quartz` green. +- **Cut 5 `persona-retire`** (2; replaces revision 1's `persona`; ruling + `operator-retire-persona`). Archive first, then take down, in this order: + (a) in gamecult-ops, `artifacts/persona-eve-retired/` holding + `eve.cc` (byte-identical copy of `Eve/.voidbot/state/eve.cc` at Eve + `167a2d3`), `identity.json`, `void-memory-maintenance.json`, + `eve-persona.md`, and a `README.md` with provenance (source paths, source + commit, sha256 of each file, the `storedAt` 2026-07-08T06:13:43.893Z and + `updatedAt` 2026-05-31 from the record, archive date, the ruling id) and the + sentence that no runtime reads it; (b) on Starfire, the operator removes the + `eve` entry from `.voidbot/private/repo-discord-identities.json` and + deletes or renames away the Discord role `1510848465243082874` (operator + steps: both are outside any repo); (c) in the Thing repo, `git rm -r + .voidbot/` and `git rm docs/eve-persona.md`; the README's "See + `docs/eve-persona.md`" line goes; (d) `VoidBot/docs/persona-intake/sai.persona-intake.yaml` + lines 109, 118, 278 name Eve as a relationship target: left as Sai's memory, + not edited; the other Personas' `.cc` memories of Eve are theirs and are not + edited. No portrait is produced; `eve.png` leaves with `.voidbot/voice`. + Negative check: after the cut `rg -l "eve" --glob "**/.voidbot/**" + F:\Projects\Thing` is empty and a role-addressed chat cannot recreate the + Face because no registry entry names it. +- **Cut 6 `wire-kernel`** (2; ruling `operator-wire-rename-now`; prose + dependency on CultLib's variants C1 being on `main`, so the kernel's TS and + Kotlin consumers meet one id rule). In the Thing repo, by hand, one diff: + the 38 schema files renamed `gamecult.thing..v1.schema.json` with + their `$id`/title strings; C# `SchemaId` consts in + `packages/org.gamecult.thing.surface/Runtime/*Document*.cs` set to the new + id with `CompatibleSchemaIds = ["gamecult.eve..v1"]`; TS + `THING_*_SCHEMA` in `packages/thing-contracts/src` with the same + compatible declaration; UPM `org.gamecult.thing.surface`, npm + `@gamecult/thing-contracts` and `@gamecult/thing-browser-lowering`, NuGet + `GameCult.Thing.Surface` (version 0.4.0, packed by the renamed + `scripts/pack-dotnet-surface.ps1`), asmdef and namespaces `GameCult.Thing.*`; + mesh key prefixes `eve:` → `thing:` and `cultmesh://.../eve/...` → + `/thing/...` in the kernel's fixtures and browser lowering; fixture and + authority ids `gamecult.eve.embedded-demo*` and friends; browser anatomy + classes `cultui-*` → `thingscript-*`; the `.eve` fixtures → `.thingscript`; + `web/eve-runtime-capability.json` → `thing-runtime-capability.json`; env + and constant names `EVE_*` → `THING_*`; Android `applicationId + org.gamecult.thing`, intent extras `org.gamecult.thing.*`, `app_name`, + `ThingTheme`, Kotlin package; iOS bundle `org.gamecult.thingcanvas`, app + `ThingCanvas`, ObjC prefix `EVE` → `THG` (13 files, `git mv`); scripts + `*-eve-*` → `*-thing-*`. Tags: `thing-surface-v` on the landing + commit. Operator steps: `uicache -u /Applications/EveCanvas.app` on the iPad + and `adb uninstall org.gamecult.eve` on Periwinkle after the new builds + install (B9). Verification: the browser reference renders every fixture; + old-id fixture files decode through compatible ids; `rg "gamecult\.eve\." + --glob "!**/CompatibleSchemaIds*"` over the repo matches only compatible-id + declarations and dated docs. +- **Cut 7 `wire-runtimes`** (6). ThingUnity, ThingFlutter, ThingElectron, + ThingTui, ThingPlugins, ThingConformance: repin to the kernel's new tag and + package ids (`Packages/manifest.json` git URLs now `GameCult/Thing*.git` + with `org.gamecult.thing.*` ids; `package.json` names `@gamecult/thing-*`, + `thing-tui`, bins `thing-plugin-*`; NuGet `GameCult.Thing.PluginFields`; + pubspec `thing_parity`, Android `com.example.thing_parity`), rename their + own ids (`runtime_*`, `electron_shell_projection`, `unity_*_projection`, + `tui_grid`, `plugin*`, Electron IPC channels `thing:*`), regenerate + conformance fixtures and exported packs, and prove in ThingConformance that + the previous exported packs (old ids) still decode through compatible ids. + New tags `thingunity-*`, `thingflutter-*`, `thingtui-*`, + `thing-plugin-fields-unity-v0.3.0`. +- **Cut 8 `wire-cultlib`** (6; home of the variants campaign, so landed on a + branch its Self agrees to, after C1 is on `main`). `packages/cultcache-ts/src/swarm-documents.ts` + mirror ids; `packages/cultmesh-kotlin/.../eve/EveDocuments.kt` → + `thing/ThingDocuments.kt`, package `org.gamecult.cultmesh.thing`; Rust + `cultnet-rs/tests/provider_session.rs` and TS provider tests; samples + `eve-browser-network` → `thing-browser-network` (`EveBrowserNetworkSample`, + PackageReference `GameCult.Thing.Surface` 0.4.0, props `ThingRoot`, + `ThingSurfacePackageVersion`, flags `--thing-root`), `eve-two-runtime` → + `thing-two-runtime`; `scripts/verify-eve-browser-network.mjs` → + `verify-thing-browser-network.mjs` (then the memory note in cut 3); + `src/GameCult.Mesh/docs/getting-started/03-publish-an-eve-surface.md` → + `03-publish-a-thing.md`; READMEs. Heimdall's `vendor/CultLib` copy follows + in cut 9. The Rust compatible-id gap (B10) is a CultLib follow-up for the + variants campaign, not a Thing cut: Rust-written stores are rebuilt, not + read through. +- **Cut 9 `wire-yggdrasil-verse`** (6, 8). One cut across the daemons that + share ids on Yggdrasil's Verse, landed as per-repo commits and deployed in + **one Idunn window, Odin first**: Odin (`odin-core/src/documents.rs` ids; + `odin.cc` is a derived catalog and is deleted before the restart so Odin + rebuilds it from advertisements), Bifrost (`tools/provider-advertisement.mjs` + ids and semantic services `/thing/gui|tui|operator|governance`, + `.bifrost/eve-surfaces.cc` → `thing-surfaces.cc` in the witness list, + `MotionEveSurfaceService.cs` → `MotionThingSurfaceService.cs`; + `.bifrost/provider-store.cc` is read through TS compatible ids), Heimdall + (`verse-state.ts`, `odin-publication.ts`, `eve:plugin:gamecult.heimdall.access` + → `thing:plugin:...`, `docs/eve-access-plugin.md`, the vendored CultLib + refreshed), Ghostlight (`mesh.rs`, `idunn_health.rs`, `eve.rs` → `thing.rs`, + `deployment/idunn/recipe.toml` ids, gitlink `vendor/eve` → `vendor/thing`; + `service/mesh-v2.cc` deleted and rebuilt if the probe finds eve-typed + records, since Rust cannot read them through), Hermodr (`hermodr-daemon.cjs`, + `lower-surface.cjs`, `static-lowering.cjs`), the VoidBot swarm publisher + (`serve-voidbot-swarm-cultmesh.cjs`, `render-voidbot-swarm-dashboard.mjs`, + `export-voidbot-provider-advertisements.mjs`, `story_*` ids, + `voidbot-swarm-state.cc` via TS compatible ids), and gamecult-ops + (`compose/odin.yggdrasil.yaml` env names `HERMODR_THING_*`, unit + descriptions, `scripts/check-heimdall-odin-discovery.mjs`, the Idunn + bindings, a runbook step for the window). Verification: after the window, + Odin's catalog lists every provider under the new ids, Hermodr lowers + Bifrost's and Heimdall's surfaces, `heimdall.gamecult.org` and + `bifrost.gamecult.org` answer, and no daemon logs an unknown-schema refusal. +- **Cut 10 `wire-other-hosts`** (6, 8). Per host, each in its own deploy + window: Nightwing (Gjallar `Program.cs`, `VerseState.cs`, `gjallar.service` + semantic id `/thing/tui`; the browser-reference unit + `nightwing-eve-browser-reference.service` → `nightwing-thing-browser-reference.service` + with its Idunn target id, restart scripts and health id; Mimir's archived + `nightwing-eve-dashboard` target renamed in the record only), Raven (Vili + `vili-daemon.mjs`), Starfire (Stonks `stonks-daemon.cjs`; Mimir + `mimir.eve_*` → `mimir.thing_*`, assemblies `Mimir.Thing*`, env + `MIMIR_THING_*`, service ids `mimir-thing-*`; the local VoidBot stack), + and the remaining providers (weksa, repixelizer with Python compatible ids, + StreamPixels, AquaSynth, Brokkr, Muninn, Loki, Sai, Ymir). Epiphany is + skipped (not in scope). +- **Cut 11 `in-repo-prose`** (6, 7). README titles and bodies in the seven + live repos, `docs/eve-*.md` → `docs/thing-*.md` by `git mv` with the + "Naming" section added to the Thing README (taxonomy, Thing Script, and the + sentence that old ids load through compatible ids), `docs/cultui-style-system.md` + → `docs/thing-script.md`, comments and fixture descriptions, Mimir's and + CultLib's READMEs. Dated records stay. +- **Cut 12 `aetheria-thing-contents`** (2; only under ruling + `aetheria-eve-contents = rename-inside`). Unarchive, rename the ~25 + `eve:surface:*` keys, `gamecult.eve.surface.authoring.v1`, + `aetheria.eve_*`, `org.gamecult.aetheria.eve-runtime`, `conformance/eve/`, + `Assets/Generated/Eve/**`, props and manifests, re-archive. Under + `freeze-contents` this cut does not exist. ## Questions (the Self admits these; one fork each) @@ -712,9 +935,9 @@ admits a scoped variant for typeset essays and already hosts the cat applet with its own styles; a quoted document in a brand frame is the same move. The hybrid buys neither the joke nor the brand. -### `wire-names`: do the eve-named wire ids get renamed? +### `wire-names` (ruled: rename-now, `operator-wire-rename-now`) -The shape is `eureka-body:question:wire-names`. Options: **freeze** (every +The shape was `eureka-body:question:wire-names`. Options: **freeze** (every `gamecult.eve.*.v1`, `mimir.eve_*.v1`, `org.gamecult.eve.*`, `@gamecult/eve-*`, app ids and `identityId eve` stay; the Thing README explains them as history; the rule recorded is rename-at-next-epoch); @@ -725,9 +948,9 @@ manifest, Rust constant and installed app bought for a name). Recommended: **freeze**, with rename-at-next-epoch as the standing rule. The deck's own wave 1 says "redirect old names so nothing breaks"; wire ids have no redirect. -### `aetheria-eve`: what happens to the archived repo? +### `aetheria-eve` (ruled: rename-archived, `operator-aetheria-eve-rename`) -Options: **rename-archived** (unarchive, `gh repo rename AetheriaThing`, +Options were: **rename-archived** (unarchive, `gh repo rename AetheriaThing`, re-archive; three API calls, the deck's "eight" becomes true, the IP premise is honoured on the org list); **leave** (taxidermy stays named; the family is seven, as the Projects card already says). Recommended: **rename-archived**; @@ -761,15 +984,33 @@ pairing misleading). Recommended: **thing-script**, as the operator led with it and it names exactly use (1) without touching the schema-named tree or CultLib's package. -### `persona-continuity`: is Thing the same Persona as Eve? +### `persona-continuity` (withdrawn; answered outside its options by `operator-retire-persona`) -Options: **same-persona-renamed** (one `eve.cc`, `publicName` and -description change through VoidBot's path, `identityId eve` frozen under -`wire-names`, history and `storedAt` preserved); **new-persona** (a fresh -Persona "Thing" with new state; Eve's state archived). Recommended: -**same-persona-renamed**; the Persona standard says preserve provenance and -do not let a second writer exist, and the deck itself says "we are not -renaming the product, we are confessing it". +The Persona is retired and nothing replaces it; cut 5 and invariant +`persona-retired` carry the ruling. + +### `aetheria-eve-contents`: does the archived body's code get renamed too? + +The repo is renamed (ruled). Its contents: about 25 `eve:surface:*` keys, +`gamecult.eve.surface.authoring.v1`, `aetheria.eve_*`, +`org.gamecult.aetheria.eve-runtime`, `conformance/eve/`, 60 generated Unity +assets, manifests and props (inventory A2, A3). Options: **freeze-contents** +(the repo name changes, the code stays as archived; "rename all" is read as +every *live* id, and an archived body is on no live edge, runs nowhere, and +was ruled taxidermy by the CultCache campaign); **rename-inside** (unarchive, +cut 12, re-archive: a mass edit of dead code that no compatible-id path will +ever exercise). Recommended: **freeze-contents**. + +### `member-names`: are eve-named members inside schemas renamed? + +Known: `eve_commit` in `gamecult.ghostlight.deployment.v2` and +`deployment_receipt.v2`; Hands will find more while cutting. In TS and +Python a member name is part of schema identity (B10), so renaming one is a +schema revision (`.v3`) with its own migration, not a string swap; in C# it +is not. Options: **keep** (members stay; each is listed as a follow-up for +that schema's next revision); **rename-as-revision** (each affected schema +gets a `.v` in this campaign). Recommended: **keep**; a member name is +not an id and is read by nobody as a brand. ### `deck-facts`: are the deck's two factual slips corrected before publishing? @@ -797,19 +1038,31 @@ GitHub redirects make the rename reversible and non-breaking (B2), and every prose cut wants to write the new URLs once. Doing prose first would write old URLs that then need a second pass. -### Why wire ids are a ruling and not a cut +### Why same-cut per edge and not a dual-read window -A stored id has no redirect. Renaming `gamecult.eve.surface.v1` is a -migration of every fixture, pack, manifest and Rust constant that names it, -across at least four repos and two runtimes, and the campaign's reason (a -character's name on the brand) is not served by it; nobody reads a schema id -and sees a character. The `eureka-body` campaign faced the same fork and -recommended freeze. +The operator retired schema aliasing in the variants campaign (F7) and agreed +that one string names a schema everywhere (C1). A dual-read window on the +wire would be exactly the alias that ruling deleted, rebuilt for one rename. +The honest unit of atomicity is the live edge: source cuts can land per repo +because nothing is live until deployed, and a Verse redeploys in one window. +Stored records are the one place a second id legitimately lives, and +`CompatibleSchemaIds` already exists for it in three runtimes; Rust lacks it, +so Rust-written stores are treated as the caches they are and rebuilt. -### Why the Persona is renamed rather than reborn +### Why the kernel keeps `v1` -Persona state is the Mind the repo keeps (Persona standard). A new Persona -would discard the operating lessons in `eve.cc` to change a display name. +A renamed id with an unchanged shape is the same schema under a new name; +bumping the version would claim a shape change that did not happen and would +force every consumer to treat it as one. + +### Why the Persona is archived and not migrated + +`operator-retire-persona`: nothing replaces it. The archive keeps the Mind +the repo kept (Persona standard: do not let state rot or vanish), with +provenance, where other retired `.cc` state already lives; removing the +registry entry and the role is what makes the retirement structural, since +VoidBot would otherwise recreate the Face on the next role-addressed chat +(B11). ### Rejected @@ -822,3 +1075,7 @@ would discard the operating lessons in `eve.cc` to change a display name. - A redirect layer on gamecult.org for renamed pages: nothing is renamed on the site; the Projects card keeps its URL and changes its content. - Giving Huginn a cut: it carries no Eve wording (B6). +- A new Persona named Thing: ruled out by `operator-retire-persona`. +- Renaming Yggdrasil's `/srv/repos/Eve` and `/srv/build/Eve`: deployment + state, not a name anyone reads; an ops cut if ever wanted. +- Renaming Epiphany's `atlas/eve_surface.rs`: Epiphany is being archived.