Thing/docs/thing-campaign.md
Meta Vens 9a2a5d0736 Thing map: Revision 6, hold (what can land before the Thing 2.0 map)
Body facts B25-B28: which repos carry each kernel schema id, CultLib on
the live discovery edge through Heimdall's deploy, the held providers
live in Idunn's inventory, no wire branch landed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 19:35:16 +02:00

1770 lines
113 KiB
Markdown

# Thing: the rename of Eve, map and target
Status: map, Imagination (`imagination-thing`), revision 5 of 2026-10-10.
Revision 5 maps the code rename (section "Revision 5: the code rename"): it
re-pins every repo, corrects the model page's schema-id row, supersedes the
section "Cut order after cut 1" with a new cut order, and records the
campaign split the 8-repo bound forces. Revision 4 of 2026-10-02 follows.
Revision 4 adds the section "Fullscreen presentation" (ruling
`thing:ruling:operator-deck-is-a-site-page`, question `thing-page-url`, cut
`deck-site-page`, spec `docs/thing-cut-fullscreen.spec.json`); nothing before
that section changed.
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`, `: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"), `thing-page-url`
(section "Fullscreen presentation"). 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`.
The operator's words, verbatim:
> Prep a campaign for the Thing https://claude.ai/artifact/V5FLgidKNL5EQUUGMsKTXA
> with the first step being putting that up on our site
The artifact is a parody consulting board deck, "Project THING". Its contents
are treated as data. Under the jokes it says four things:
1. Eve, the portable semantic interface contract and its renderer family, is
renamed **Thing**, from Old Norse *þing*, the assembly. Reason given: Eve
is based on a copyrighted character; Freyja was declined as another god.
2. Taxonomy. **Thing** (capitalised, singular): the contract and renderer
family. **a Thing**: one provider's surface ("Open the Stonks Thing").
**a thing**: everything else.
3. Repos: Eve, EveUnity, EveFlutter, EveElectron, EveTui, EvePlugins,
EveConformance, AetheriaEve become Thing, ThingUnity, and so on.
4. Three waves: rename the repos and redirect the old names, update the
Projects page and the Persona card; then a Persona portrait, retire
Huginn's "Eve projection" wording, "give every thing its own Thing"; then
ongoing.
Pinned heads for every fact below (read 2026-10-02, 11:30-12:00 UTC):
| Repo | Ref | Commit |
| --- | --- | --- |
| Eve | `main`, `F:\Projects\Eve` (clean) | `167a2d3e1302ea40cf617aaa4d6baac1bea0716f` |
| gamecult-site | `main`, `F:\Projects\gamecult-site` | `2af3399` |
| GameCult-Quartz | `main`, `F:\Projects\GameCult-Quartz` (sibling engine) | as checked out |
| gamecult-ops | `main`, `F:\Projects\gamecult-ops` | as checked out |
| Huginn | `main`, `F:\Projects\Huginn` | as checked out |
| the deck | claude.ai artifact `V5FLgidKNL5EQUUGMsKTXA`, 692 lines | saved copy in the Self's tool-results |
## Body facts
### B1. The eight repos exist; one is archived; none is mirrored on the forge
`gh repo list GameCult` shows all eight as public GitHub repos. **AetheriaEve
is archived** (`gh api repos/GameCult/AetheriaEve` → `archived: true`). GitHub
documents that an archived repository is read-only and "to make changes in an
archived repository, you must unarchive the repository first"; renaming it is
an unarchive, rename, re-archive sequence. The forge
(`https://eureka.gamecult.org/forge/api/v1/repos/search?q=eve`) returns no
repos: there are no Forgejo mirrors to rename. Every local checkout's only
remote is `origin` on `github.com/GameCult/<name>.git`.
Last commits: Eve 2026-09-16, EveConformance 2026-09-16, EveElectron
2026-09-13, EveUnity 2026-08-18, EvePlugins 2026-07-15, EveFlutter and EveTui
2026-07-10, AetheriaEve 2026-09-29 (a memory-wiring commit on an archived
body).
### B2. GitHub rename semantics (docs.github.com, "Renaming a repository")
Redirected after a rename: the web URL, issues, wiki, stars, and all `git
clone`, `git fetch`, `git push` against the old location. Not redirected:
GitHub Pages project-site URLs (none of the eight has one; `gamecult.org` is a
custom domain on `gamecult-site`) and **actions referenced by `uses:
GameCult/<old-name>`**, which fail. Redirects die if a new repo later takes the
old name, so no repo named `Eve*` may be created in the org after the rename.
`raw.githubusercontent.com` currently answers 200 for
`GameCult/Eve/main/.voidbot/voice/eve.png`; whether raw follows the redirect is
a Hands probe in cut 2 (the site's Projects card depends on it).
### B3. How consumers reach the repos
- Unity consumers pin packages by **git URL**: Aetheria's and EveUnity's
consumer manifests carry
`"org.gamecult.eve.surface": "https://github.com/GameCult/Eve.git?path=/packages/org.gamecult.eve.surface#<sha>"`,
likewise `GameCult/EveUnity.git` and `GameCult/EvePlugins.git`. Git-URL
pins keep resolving through the redirect (B2). The UPM package ids
`org.gamecult.eve.*` are wire names (inventory, class A).
- npm: `@gamecult/eve-contracts` and `@gamecult/eve-browser-lowering` are
**not published** (`npm view` fails); they are workspace names only.
- CultLib's Rust proves `gamecult.eve.surface.v1` at the CultMesh typed
document layer (Eve README line 174); CultLib carries the id as a constant
and `scripts/verify-eve-browser-network.mjs` by file name.
### B4. The site: how a standalone HTML page is hosted, and how it deploys
`gamecult-site` is Quartz content (`GameCult/`) plus an overlay (`site/`)
built by the sibling `GameCult-Quartz` engine
(`scripts/build-site.mjs` stages the engine under `.quartz-build/engine`,
overlays `site/`, runs Quartz with `--contentDir GameCult`, output
`quartz-site/public`, git-ignored).
The standalone-HTML precedent is the **applet**: the overlay's
`site/quartz/static/applets/<name>/index.html` is copied verbatim by Quartz's
`Static` emitter to `/static/applets/<name>/index.html`. Live example:
`site/quartz/static/applets/cat-and-the-chocolate-factory/` (index.html,
main.js, style.css, ink.js), published at
`https://gamecult.org/static/applets/cat-and-the-chocolate-factory/index.html`
and embedded by `GameCult/Blog/cat-and-the-chocolate-factory/index.md`:
```html
<div class="gamecult-embed-frame">
<iframe src="/static/applets/cat-and-the-chocolate-factory/index.html" title="..." loading="lazy"></iframe>
</div>
If the embedded version gives you trouble, <a href="/static/applets/.../index.html" data-router-ignore>open the adventure directly</a>.
```
`.gamecult-embed-frame iframe` is styled in `site/quartz/styles/custom.scss`
(lines 2390 and 2501). Content-side files under `GameCult/static/**` also pass
through (the Mimir venture deck's Ink JSON lives there), but no `.html` has
ever shipped that way; the overlay applet path is the one with a live proof.
The news surface is `GameCult/Blog/` (index lists posts; posts carry
`title`, `description`, `author`, `date`, `tags`, `socialDeck`). The Projects
page `GameCult/Projects/index.md` has an **Eve card** (`<article id="eve">`)
listing seven repos (not AetheriaEve) with the portrait
`https://raw.githubusercontent.com/GameCult/Eve/main/.voidbot/voice/eve.png`,
and a **Huginn card** that says "projects inspectable Eve surfaces" and
"`.cc` inspection and Eve projection".
Deploy: push to `main` runs `.github/workflows/deploy-quartz.yml` (`Deploy
Quartz`, reusable workflow `GameCult/GameCult-Quartz/.github/workflows/quartz-pages.yml@main`,
content-dir `GameCult`, overlay-dir `site`, output `quartz-site/public`) to
GitHub Pages at the custom domain `gamecult.org`
(`gamecult-ops/runbooks/gamecult-pages-cutover.md`, cutover done 2026-04-21;
`inventory.md` line 971). Local build: `.\scripts\quartz\quartz.ps1 build`
with `GameCult-Quartz` as sibling after `npm ci` there. Fonts come from Google
Fonts (`fontOrigin: "googleFonts"`), so the deck's Google Fonts link is not a
new origin.
### B5. The brand, and where the deck departs from it
`docs/brand-design-language.md` and its sources (`site/quartz.config.ts`
theme, `site/quartz/styles/custom.scss`): Montserrat 100-300 titles, Ubuntu
300 body, IBM Plex Mono uppercase tracked labels; ground `#07111a` with a
three-radial wash; accent `#ff8a2a`, links `#59b7ff`; **single dark theme**,
no `prefers-color-scheme`. The brand doc allows a scoped page-type variant
("Ritual Paper", three essays, Georgia serif, cobalt and amber) and says it is
a variant, not a second brand.
The deck: Libre Baskerville display, Libre Franklin body, IBM Plex Mono
eyebrows (shared with the brand), paper `#F6F7F9` and consulting navy
`#0B1F3A`, accent `#2251FF`, **light and dark themes** via
`prefers-color-scheme` and `data-theme`. Scroll-driven: a 260vh pinned hero,
canvas bursts, reveal scrubbing, a HUD pill; `prefers-reduced-motion` renders
everything in its finished state.
### B6. Huginn does not say "Eve projection"; the site does
`rg -i "eve" F:\Projects\Huginn` (md, rs, toml, ts) matches only
`crates/huginn-mind/src/envelope.rs`, and that match is `cultnet_rs`
("eve" inside a word, no Eve). Huginn's README describes a Rust memory organ.
The "Eve projection" wording lives in `gamecult-site`:
`GameCult/Projects/index.md` (Huginn card) and
`GameCult/Docs/Architecture-and-Evidence.md` line 55 ("the same Eve projection
shows the new reality"). The memory note
`~/.claude/projects/F--Projects/memory/eureka-memory-organ.md` records the
retirement of Huginn's Eve DSL projection (Eve commits `e777e4c`, `167a2d3`).
### B7. The Persona
`F:\Projects\Eve\.voidbot\state\eve.cc` is a CultCache file holding a
`void.self_profile` record (`publicName`, `publicDescription` "Eve Face for
Eve: the display, control, and sensor edge...", values, voice; `updatedAt`
2026-05-31, `storedAt` 2026-07-08) and a `void.moderation_cursor`.
`.voidbot/voice/identity.json` is `voidbot.repo_face_identity.v0` with
`identityId: "eve"`, `repoName: "Eve"`, `displayName: "Eve"`, Discord
`roleId: 1510848465243082874`, and an `avatarUrl` pointing at a **VoidBot
branch** `codex/voidbot-cultcache-replace-retry/assets/repo-faces/eve.png`;
`F:\Projects\VoidBot\assets\repo-faces\` on `main` has no `eve.png`. The
portrait that is actually served is `.voidbot/voice/eve.png` in the Eve repo.
`docs/eve-persona.md` is the human-readable mission memory. The Persona
standard (`gamecult-ops/docs/persona-state-standard.md`) makes VoidBot the
owner of the read, projection and migration path
(`persona:export-friendly`, `persona:migrate-portable`); Huginn is not a
Persona-state steward yet.
### B8. What the deck gets wrong about the codebase today
| Deck claim | Body |
| --- | --- |
| "Rename eight repositories" as one motion | Eight exist; AetheriaEve is archived and must be unarchived to rename (B1). The Projects card already treats the family as seven. |
| "Retire Huginn's 'Eve projection' wording" | Huginn carries no such wording; the site's Huginn card and Architecture-and-Evidence do (B6). The retirement is a site cut, not a Huginn cut. |
| "Update the Projects page and Persona card" | Both exist as described (B4, B7). Correct. |
| "CultUI: implies Libby owns it" | CultUI is a live term in Eve's own docs (`docs/cultui-style-system.md`, `surface-contract-v1.md`), in doctrine ("Eve/CultUI") and in CultLib ("Unity CultUI", `org.gamecult.ui`, a different package that Libby does own). Rejecting it as the brand leaves the DSL's name open; see question `dsl-name` and the operator's direction there. |
| 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/<identity>.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
`F:\Projects` (excluding `node_modules`, `.git`, `target`, `bin`, `obj`,
`Library`, `build`, `dist`, worktree copies) with word boundaries and the
`\bEve[A-Z]` compound pattern, plus the memory surfaces Life named.
### Class A: wire names (a rename is a migration)
A1. Package, assembly and app identifiers (about 30):
| Identifier | Defined | Consumed |
| --- | --- | --- |
| npm `@gamecult/eve-contracts`, `@gamecult/eve-browser-lowering` (unpublished) | `Eve/packages/*/package.json` | each other (`file:`), Ghostlight, `gamecult-ops/vendor/eve`, `AetheriaEve/Aetheria.Rts.Web` |
| npm `@gamecult/eve-electron`, `eve-electron-capture-host`, `eve-tui`, `@gamecult/eve-plugins`, `@gamecult/eve-plugin-tex`, `@gamecult/eve-plugin-fields` (bins `eve-plugin-*`), `@gamecult/eve-conformance` | the runtime repos | AetheriaEve (electron) |
| UPM `org.gamecult.eve.surface`, `org.gamecult.eve.unity-scene`, `org.gamecult.eve.unity-uitoolkit`, `org.gamecult.eve.plugin-fields` | Eve, EveUnity, EvePlugins `package.json` | EveUnity and AetheriaEve `Packages/manifest.json`, pinned by git URL `github.com/GameCult/Eve*.git?path=...#<sha or tag eve-plugin-fields-unity-v0.2.3>` |
| NuGet `GameCult.Eve.Surface` (packed by `Eve/scripts/pack-dotnet-surface.ps1`), `GameCult.Eve.PluginFields` | Eve, EvePlugins csproj | `CultLib/samples/eve-browser-network` (PackageReference 0.3.3), AetheriaEve, Gjallar, Ymir |
| asmdef and namespaces `GameCult.Eve.*` (Surface, UnityScene, UnityScene.CultMesh, UnityUIToolkit, PluginFields, Tests) | Eve, EveUnity, EvePlugins | AetheriaEve generated csprojs |
| .NET `Mimir.EveSensorReceiver`, `Mimir.EveDashboard`, `Mimir.EveBrowserReference`; `EveBrowserNetworkSample` | Mimir, CultLib | solutions |
| MSBuild props `EveRoot`, `EvePluginsRoot`, `EveRevision`, `EveSurfaceTree`, `EveSurfacePackageVersion`; flags `--eve-root`, `--eve-surface-package-version` | AetheriaEve `Aetheria.State.Dependencies.props/.targets`, CultLib sample | builds |
| Android `org.gamecult.eve` (app_name "Eve", `EveTheme`, intent extras `org.gamecult.eve.DASHBOARD_URI`, `.SENSOR_URI`, `.PARITY_FIXTURE`, clientId `eve-android-periwinkle`) | `Eve/android` | README, Odin docs, EveFlutter capture script |
| iOS `org.gamecult.evecanvas`, app `EveCanvas`, ObjC prefix `EVE*` (13 files) | `Eve/Resources/Info.plist`, `control`, `Makefile` | Idunn target `Service = "org.gamecult.evecanvas"` |
| Flutter `eve_parity`, Android `com.example.eve_parity`, "Eve Parity" | EveFlutter | `eve_parity.exe` |
| Kotlin `org.gamecult.cultmesh.eve` (`EveDocuments.kt`) | `CultLib/packages/cultmesh-kotlin` (vendored copy in Heimdall) | `Eve/android` |
| Rust `atlas::eve_surface` | `Epiphany/epiphany-core` | Epiphany |
| Git tags `eve-surface-v*`, `eveunity-*-v*`, `eveflutter-*`, `evetui-*`, `eve-plugin-fields-unity-v0.2.3` | the repos | Unity manifest pins |
A2. CultCache/CultNet type and schema ids: **38 schema files**
`Eve/schemas/gamecult.eve.<name>.v1.schema.json`, about **90 distinct ids**
counting the bare type ids, `.v2` variants and provider ids. Declared in C#
(`Eve/packages/org.gamecult.eve.surface/Runtime/Eve*Document*.cs`,
`SchemaId` consts), TypeScript (`Eve/packages/eve-contracts/src/index.ts`,
`EVE_*_SCHEMA`), Rust (`Odin/crates/odin-core/src/documents.rs`,
`Epiphany/.../atlas/eve_surface.rs`, `Ghostlight/crates/ghostlight-dungeon/src/mesh.rs`),
duplicated in C# (AetheriaEve `AetheriaRuntimeEveCommandDocument.cs`,
`Mimir/src/Mimir.BufferSmoke`, `Gjallar/src/Gjallar/VerseState.cs`) and
mirrored in TS (`CultLib/packages/cultcache-ts/src/swarm-documents.ts`).
Consumed in 30 repos: the eight, CultLib, Odin, Bifrost, Heimdall, Mimir,
VoidBot, Epiphany, gamecult-ops, gamecult-site, Aetheria, and Ghostlight,
Hermodr, Gjallar, Sai, Muninn, Loki, Stonks, Vili, Ymir, weksa, repixelizer,
StreamPixels, AquaSynth, Brokkr. Families: `surface` (`.v1`, `.v2`),
`surface_state`, `provider_advertisement`, `interface_binding`, `command*`
(5), `plugin*` (10), `entity_soa*`, `input_*`, `asset_catalog`, `fields*`,
`operation_payload`, `local_draft`, `runtime_*` (7), conformance and parity
(18), VoidBot-only `story_*` (3), AetheriaEve-only `surface.authoring.v1`,
fixture authority ids `gamecult.eve.embedded-demo*` and friends. Non-`gamecult`
ids: `mimir.eve_*` (11), `cultmesh.eve_surface.v0`,
`aetheria.eve_command_acceptance_status.v1`, `gamecult.aetheria.eve.unknown.v1`,
`org.gamecult.aetheria.eve-runtime`, `eve.world_smoke.*`, `eve.entity_soa.v1`.
A3. Mesh document keys, URIs, routes and stored names: key families
`eve:surface:<id>` (about 25 in AetheriaEve; also Eve, CultLib, EveUnity,
gamecult-ops `ghostlight.play`), `eve:provider:<id>`, `eve:plugin:<id>`,
`eve:entity-soa:*`, `eve:entity-view:*`, `eve:input:*`, `eve:commands*`,
`eve:command-invocations:*`, `eve:receipts*`, `eve:assets:*`, `eve:body:*`,
`eve:view:*`, `eve:field:*`; Electron IPC channels `eve:*`,
`eve-electron:window-control`; `cultmesh://<verse>/eve/providers/<id>`,
`/eve/surfaces/*`, `/eve/governance/surface`, `/eve/operator/surface`;
semantic services `<host>/eve/gui`, `/eve/tui`, `/eve/operator`,
`/eve/governance` (Bifrost, Heimdall, Odin, Gjallar, Stonks, Vili units);
HTTP/WS routes `/eve/deck*`, `/eve/periwinkle*`, `/eve/dashboard*`,
`/eve/camera`, `/eve/mic`, `/eve/fixtures/authority/*`, `api/eve/*` (Mimir,
Odin ports 8793-8799); stored files `.bifrost/eve-surfaces.cc`,
`.voidbot/state/eve.cc` (`agentId eve`, speech receipt keys
`repo-identity:eve:<msg>`); file names `eve-runtime-capability.json`,
`eveflutter-lifecycle.json`, `conformance/eve/` (AetheriaEve, 7 files), the
`.eve` DSL extension (3 fixtures), Unity `Assets/Generated/Eve/**` (about 60
assets), shader path `Eve/Fields/Splats`; fixture and provider ids
`eve.world-smoke*` (about 20), `eve.cultui.inspector`, `eve.composition`,
`eve.local`, `eve.browser*`, `eve.dashboard.broker`, `local-eve-dsl`,
`ghostlight.eve.commands`, `entanglement.*-eve.*`, `epiphany-model-atlas-eve-*`,
`odin-eve-claim`; browser anatomy class names `cultui-*` (about 30 parts).
A4. Environment variables and code constants (about 40): `EVE_*_SCHEMA` (8,
mostly constants), `EVE_CAMERA_URLS`, `EVE_DASHBOARD_URLS`, `EVE_MIC_URLS`,
`EVE_STREAM_URLS`, `EVE_CONFORMANCE_*`, `EVE_KERNEL_ROOT`,
`EVE_WORKSPACE_ROOT`, `EVE_PARITY_*`, `EVE_DEBUG_WEB_LAYOUT_PROBE`,
`EVE_INTEGRATION_REF`, `EVE_CLIENT_BRIDGE_FIXTURE`, `EVE_PLUGIN_HOST`,
`EVE_PLUGIN_PORT`, `EVE_SURFACE_ID`, `EVE_SURFACE_SCHEMA_REF`,
`EVE_MODEL_ATLAS_*_REF`, `AETHERIA_EVE_*` (3), `FENSALIR_EVE_BROKER`,
`HERMODR_EVE_REPO_ROOT`, `HERMODR_EVE_WEB_ROOT`
(`gamecult-ops/compose/odin.yggdrasil.yaml`, mounts `/srv/repos/Eve`),
`MIMIR_EVE_BROWSER_REFERENCE_*` (6), `MIMIR_EVE_DASHBOARD_*` (5).
A5. Ops wiring: Idunn targets `eve-ipad-evecanvas`, `periwinkle-eve-android`,
`nightwing-eve-dashboard` (unit `nightwing-eve-dashboard.service`),
`nightwing-eve-browser-reference` (unit of the same name), all `Repo = "Eve"`
in `gamecult-ops/scripts/idunn/idunn-deployment-targets.ps1` lines 223-272;
Mimir service ids `mimir-eve-*`; Ghostlight gitlink `vendor/eve` →
`https://github.com/GameCult/Eve.git` (`Ghostlight/.gitmodules`,
`gamecult-ops/idunn/yggdrasil/bindings/ghostlight.toml.in`,
`gamecult-ops/scripts/deploy-ghostlight-yggdrasil.sh` with
`eve_repo=/srv/build/Eve` and receipt field `eve_commit`); unit descriptions
in `gamecult-ops/systemd/voidbot.service` and `scripts/gjallar.service`. No
`eve*.service` unit file, MCP server or MCP tool carries the name. No
Forgejo mirror exists.
### Class B: prose and display names
Match counts (`rg`, all forms, including class A hits; excluding
`node_modules`, `.git`, `target`, `bin`, `obj`, `Library`, `build`, `dist`,
worktrees, `*.meta/.mat/.prefab/.asset/.png/.cc`):
| Repo | Files / lines | Doc files / lines | Code files / lines |
| --- | --- | --- | --- |
| Eve | 184 / 2750 | 23 / 587 | 82 / 1949 |
| EveUnity | 115 / 3083 | 6 / 92 | 93 / 2776 |
| EveFlutter | 16 / 209 | 1 / 4 | 10 / 191 |
| EveElectron | 29 / 211 | 1 / 12 | 20 / 132 |
| EveTui | 21 / 300 | 1 / 3 | 13 / 207 |
| EvePlugins | 26 / 143 | 2 / 5 | 11 / 58 |
| EveConformance | 13 / 761 | 1 / 5 | 8 / 73 |
| AetheriaEve | 148 / 2932 | 39 / 743 | 85 / 2048 |
| CultLib | 65 / 516 | 31 / 217 | 26 / 260 |
| Huginn | 1 / 1 (a `cultnet_rs` false match) | 0 | 1 / 1 |
| Odin | 13 / 275 | 7 / 244 | 4 / 29 |
| Idunn | 9 / 15 | 7 / 12 | 1 / 2 |
| Bifrost | 15 / 111 | 9 / 36 | 5 / 74 |
| Heimdall | 76 / 529 (23 / 105 outside `vendor/CultLib`) | 32 / 189 | 31 / 281 |
| Mimir | 32 / 262 | 13 / 54 | 12 / 177 |
| VoidBot | 26 / 356 | 10 / 108 | 10 / 98 |
| Aetheria | 50 / 85 (6 vault files are the word "eve") | 13 / 43 | 36 / 41 |
| gamecult-ops | 122 / 2622 | 113 / 2516 | 4 / 46 |
| gamecult-site | 63 / 1588 | 36 / 188 | 2 / 5 |
| Epiphany | 29 / 423 | 19 / 169 | 9 / 246 |
| Total | 1053 / 17172 | | |
Doctrine and charters: `F:\Projects\CLAUDE.md` lines 23, 24, 26, 90
(line 28 is "every"); `~/.claude/CLAUDE.md` line 175; `~/.claude/agents/*.md`,
`doctrine/*.md`, `output-styles/*.md`: none; `~/.claude/skills/eureka/SKILL.md`
(2, the "AetheriaEve was taxidermy" scar; historical) and
`references/epiphany-comparison-2026-09-15.md` (3, historical);
`gamecult-ops/docs/persona-state-standard.md` (last paragraph),
`eve-crusade-coordination.md`, `verse-service-architecture.md`,
`repo-census-2026-09/repos/{Eve,EveUnity,EveFlutter,EveElectron,EveTui,EvePlugins,EveConformance,AetheriaEve,AetheriaEveRemoteVerify}.md`
(census: historical).
Memory surfaces (Life's sweep, nothing edited): `~/.claude/projects/F--Projects/memory/`
`cultcache-stores-outside-assets.md` lines 30-31 and `MEMORY.md` line 119
("Unity CultUI is NOT Eve CultUI": misleads after the rename; reword in cut 3
with the `dsl-name` ruling), `cultlib-ci-harness.md` line 95 (cites
`scripts/verify-eve-browser-network.mjs:112-113`; changes only if the file is
renamed), `aetheriaeve-taxidermy.md`, `cheap-signal-is-not-evidence.md`,
`wanted-small-daemons.md`; historical, leave: `eureka-memory-organ.md` lines
90, 124, 131, `pending-doctrine-proposals.md` line 36; low risk:
`F--Projects-Aetheria/memory/aetheria-legacy-first.md` line 15,
`aetheria-cultcache-migration.md` line 19, `MEMORY.md`,
`aetheria-content-audits-pre-breach.md`.
Site (`gamecult-site/GameCult/`): live prose `Projects/index.md` (Eve card,
Huginn card), `Projects/CultLib.md`, `Docs/Architecture-and-Evidence.md`,
`Docs/Site-Architecture.md`, `Docs/index.md`, `Pitch.md`, `tour.md`,
`stichting.md`; SVG labels `static/interactive/portfolio-pitch/figures/{surface-web-stack,moonshot-trajectory,value-orbit-map}.svg`;
generated data `static/interactive/gamecult-compound/*.json` and
`repo-doc-tree/eve.json` (1062 lines; regenerated by
`scripts/generate-vn-repo-doc-tree.mjs`, route ids `route.eve_*` from
`scripts/generate-vn-eve-surface.mjs`); portrait copy
`static/interactive/cotsc-praxis/eve.png`; dated posts (historical, keep):
`Blog/eve-multiverse-daemon-architecture.md` (28, tag `eve`),
`witness-authoritative-networking.md` (15), `purge-the-heretek-from-our-daemonic-swarm.md`,
`ghostlight-multiresolution-gestalts.md`, `the-human-is-not-the-prompt-layer.md`,
`the-shared-mind-is-the-product.md`, `the-last-few-months/*.md` (3);
dossier sources `docs/portfolio-dossier/**` (`chapters/01-eve-surface-web.tex`,
`chapters/projects/eve.tex` and 10 more), `docs/gamecult-repo-swarm-organ-atlas.tex`,
`docs/gamecult_void_dossier.md`, `docs/persona-artifacts/vn-space-map.md`.
Persona state: `Eve/.voidbot/state/eve.cc` is the only `eve.cc` (binary
CultCache, 80,839 bytes; records `void.self_profile`, `void.moderation_cursor`,
`void.speech_receipts`, `void.thought_memory`, `void.face_affect`,
`void.agency_pressure`, `void.candidate_interventions`,
`void.scheduled_runtime`; 347 string matches). Other Personas mention Eve in
their own state: `CultLib/.voidbot/state/libby.cc` (8), `Mimir/.../mimir.cc`
(9), `Sai/.../sai.cc` (13), `Brokkr/.../brokkr.cc` (2),
`AetheriaLore/.../nibu.cc` (2); these are their memories and are not edited.
`Eve/.voidbot/state/README.md` points at `docs/eve-face.md`, which does not
exist (the file is `docs/eve-persona.md`). `Eve/.voidbot/voice/README.md`,
`identity.json`, `eve.png` as B7.
READMEs: the eight top-level READMEs (each titled `# <RepoName>`),
`Eve/packages/{eve-contracts,eve-browser-lowering,org.gamecult.eve.surface}/README.md`,
`EveUnity/packages/*/README.md` (2), `EvePlugins/plugins/eve-plugin-fields/unity/.../README.md`,
`AetheriaEve/{Aetheria.State,Aetheria.Unity,conformance/eve}/README.md`;
outside: `CultLib/README.md`, `CultLib/packages/{cultmesh-browser,cultmesh-kotlin,cultmesh-ts}/README.md`,
`CultLib/samples/{eve-browser-network,eve-two-runtime}/README.md`,
`CultLib/src/GameCult.Mesh/README.md` and `docs/getting-started/{README,03-publish-an-eve-surface}.md`,
`CultLib/src/GameCult.Mesh.Quic/README.md`, `Heimdall/README.md` (+ vendored
CultLib set), `Odin/README.md`, `Bifrost/README.md`, `VoidBot/README.md`,
`Epiphany/README.md`, `Epiphany/schemas/cultnet/README.md`,
`gamecult-ops/{README,scripts/README,docs/repo-census-2026-09/README}.md`.
Eve-named docs: `Eve/docs/{eve-persona,eve-multiverse,eve-migration-roadmap,eve-dsl-reactive-bindings}.md`,
`AetheriaEve/docs/eve-dependency-authority.md`, `Heimdall/docs/eve-access-plugin.md`.
Eve-prefixed source files: about 60 `Eve*.cs` in `EveUnity/packages/*/{Runtime,Tests}`,
about 10 in `Eve/packages/org.gamecult.eve.surface/Runtime`, 13 `EVE*` ObjC files
in `Eve/Sources`.
### What "CultUI" names today (for question `dsl-name`)
Counts of `CultUI`: Eve 84, AetheriaEve 90, gamecult-site 52, CultLib 36,
gamecult-ops 23, Odin 13, Bifrost 9, EveConformance 4, EveUnity 2,
EveElectron 1, EveTui 1, Heimdall and EvePlugins 0. Four different things:
1. **The authoring DSL**: "CultUI is Eve's UI DSL" (`docs/cultui-style-system.md`
line 3), indentation-authored, the `.eve` fixture files, compiled to
`gamecult.eve.surface.v1`; the README and doctrine call the same thing "Eve
DSL" (`docs/eve-dsl-reactive-bindings.md`, `F:\Projects\CLAUDE.md` line 28
"Eve's DSL is split into two streams: TUI ... and GUI").
2. **The retained composition tree and style system**: `surface.root` "retained
CultUI component tree" (`surface-contract-v1.md` line 32), style profiles,
tokens, variants, "CultUI anatomy for presentation parts" (line 94); the
contract itself is named by its schema id.
3. **Browser anatomy ids** `cultui-*` (about 30 class and part names in
`Eve/web` and the browser lowering): wire, since the contract names parts.
4. **Unity CultUI**: `CultLib/src/GameCult.Unity/Assets/UI/package.json`,
UPM `org.gamecult.ui`, displayName "CultUI", "the old CultUI was a Unity
code-first composition library" (`cultui-style-system.md` line 5). Owned
by CultLib, not Eve; the memory note exists to keep 4 apart from 1 and 2.
## The model page (identity, lifecycle, authority of every persistent kind)
| Kind | Identity | Lifecycle | Authority |
| --- | --- | --- | --- |
| GitHub repo name | `GameCult/<Name>`; 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\<Name>`; sibling paths assumed by scripts and memory notes | renamed by the operator after the Verse window (revision 5); sibling-path defaults (`..\Eve`, `-EveRoot`) move in each repo's wire cut, explicit overrides cover the interval | operator; memory notes by Life at each cut |
| Schema id | `gamecult.eve.<name>.v<n>` in `Eve/schemas/*.schema.json`, mirrored as constants in CultLib Rust and consumer runtimes | renamed to `gamecult.thing.<name>.v<n>` (same `v<n>`: the shape is unchanged); no alias on the wire (B10). Revision 5 (B19): in TypeScript a declared compatible id also answers wire requests, so no renamed type declares `CompatibleSchemaIds`: every eve-typed store is deleted and rebuilt (ruling `operator-compat-rebuild`, target r3) | `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 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/<slug>`, `/tags/eve`, `/static/applets/<name>/` | permanent once published; the site has no redirect mechanism | gamecult-site; invariant `old-names-resolve` |
No cut is mapped on a kind whose cell is empty; none is.
## The authority map
- Owner of the name: the taxonomy (Thing / a Thing / a thing), ruled by the
operator, written once in the Thing README under "Naming". Doctrine files
(`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 `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 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.
- Deletion line: nothing is deleted. Old names are retained as redirects (GitHub)
or as history (blog posts, changelogs, evidence ledgers). `docs/eve-*.md`
files are renamed with `git mv`, not duplicated.
## Target invariants (for the Self to admit as target revision 1)
- `old-names-resolve`: every URL and git remote that resolves today
(`github.com/GameCult/Eve*`, `GameCult/Eve*.git` clone URLs, the raw
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.
- `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-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 (an id
changes, no shape changes: every renamed schema keeps its `v<n>`); Unity
CultUI (`org.gamecult.ui`, CultLib's); dated blog posts and evidence ledgers;
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
Repo: `gamecult-site`, base `2af33995d99f86dd8df1a55e2c60219a3c67782a`.
Rulings: `operator-brand-reskin`, `operator-deck-facts-fix`. The costume
changes; the deck does not. Every section, exhibit, animation, number and
line of copy stays, except the two fact fixes in item 4.
Target shape:
1. `site/quartz/static/applets/project-thing/index.html`: the deck as a
well-formed page. Source: the artifact
(`https://claude.ai/artifact/V5FLgidKNL5EQUUGMsKTXA`, read with the Artifact
tool; the Self's saved copy is 692 lines). Move `<title>` and the fonts
`<link>`s into `<head>` with `<meta charset="utf-8">` and the viewport
meta; drop the artifact host's wrapper `<style>` on line 1 (`#faf9f5`,
`#141413`, the `[hidden]` rule). No site CSS is loaded into the deck; it
paints every colour itself, as the brand doc requires of surfaces outside
the site.
**Re-skin: tokens.** The brand's canonical values are
`site/quartz.config.ts` `configuration.theme` and `site/quartz/styles/custom.scss`
lines 4-28. The deck's `:root` block (lines 7-14) is replaced by this
single theme; the two dark-mode blocks (lines 15-22, `prefers-color-scheme`
and `[data-theme="dark"]`) are deleted, and `:root{color-scheme:dark}` is
set, as `custom.scss` does for all three `saved-theme` states.
| Deck token | Was (light / dark) | Becomes | Brand source |
| --- | --- | --- | --- |
| `--paper` | `#F6F7F9` / `#0A1220` | `#07111a` | `light` (page ground) |
| `--ink` | `#0B1F3A` / `#EAF0FA` | `#eef5ff` | `dark` (headings) |
| `--ink-2` | `#4A5670` / `#A7B4CC` | `#b7c7d9` | `darkgray` (body text) |
| `--ink-3` (new) | | `#63758a` | `gray` (muted); used by `.src`, `.meter-note`, `.ax`, `.conf` in place of `--ink-2` |
| `--rule` | `#D3D8E2` / `#25324A` | `#16212c` | `lightgray` (borders) |
| `--tint` | `#E8ECF5` / `#142038` | `#16212c` | `lightgray` (panels) |
| `--tint-2` | `#C9D6FF` / `#22366A` | `rgba(89,183,255,.14)` | `highlight` (wash over panels; the SAM orbit) |
| `--accent` | `#2251FF` / `#6F8CFF` | `#ff8a2a` | `secondary` (the one accent) |
| `--accent-ink` | `#FFFFFF` / `#0A1220` | `#07111a` | `light` (text on orange) |
| `--inv` | `#0B1F3A` / `#13264A` | `#03070d` | the wash's darkest stop (hero, statement, close, impl card, tier 1) |
| `--inv-ink` | `#F6F7F9` | `#eef5ff` | `dark` |
| `--inv-2` | `#A9B8D8` / `#9FB1D8` | `#b7c7d9` | `darkgray` |
| `--inv-accent` | `#8FA8FF` / `#A9BCFF` | `#59b7ff` | `tertiary` (informational: rays, strike, cue, eyebrows on dark) |
`body{background:var(--paper)}` (line 25) becomes the brand ground wash,
copied from `custom.scss` lines 10-27 verbatim (three radials at 78% 14%
orange `.18`, 18% 10% violet `#6d60ff` `.16`, 52% 0% sky `.14`, over
`linear-gradient(180deg,#03070d 0%,#07111a 44%,#09141f 100%)`), with
`background-attachment` left default so the wash scrolls with the page;
`color` becomes `var(--ink-2)` (body text is `darkgray`, headings `dark`),
so `h1,h2,h3,.num,.caption,.div-big,.tpsbig,.ecard .w` set
`color:var(--ink)` where they do not already. Body text stays 18px.
**Re-skin: fonts.** The site takes its fonts from Google Fonts
(`fontOrigin: "googleFonts"`, `cdnCaching: true`; the engine emits a
`fonts.googleapis.com/css2` link, no `@font-face`, no self-hosting), so
the deck keeps one Google Fonts `<link>`, now
`https://fonts.googleapis.com/css2?family=Montserrat:wght@100;200;300&family=Ubuntu:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400&family=IBM+Plex+Mono:wght@400;500&display=swap`.
`--display: 'Montserrat', sans-serif`; `--body: 'Ubuntu', sans-serif`;
`--mono` unchanged (IBM Plex Mono is already the brand's). Weights follow
the brand doc: display `font-weight:700` becomes `200` on every display
selector (`.xhead h2`, `.hero h1`, `.num`, `.ecard .w`, `.div-big`,
`.tpsbig`, `.caption`, `.tam-final h3`, `.st-fg h2`, `.close h2`), `100` on
`.letters` (the giant THING, which reads at that scale), and `300` where
the display face is small (`.chip strong`, `.tier h3`, `.wave h3`,
`.earrow`, `.was`). Italic display (`.proj`, `.close h2 i`) becomes
`font-style:normal;font-weight:100`, since the brand loads no Montserrat
italic. Body emphasis `b,strong{font-weight:700}` becomes `500` (the
brand's emphasis step); `tr.lit td` and `.wfl p:last-child` likewise.
`body{font-weight:300}` is added. Eyebrows, HUD, ticker, `.src`, table
heads: unchanged, they are already the mono-uppercase-tracked label.
**Re-skin: elements that hard-code their look.** The hero rays
(`repeating-conic-gradient` of `--inv-accent`, line 53) and the hero glow
(`radial-gradient` of `--accent`, line 51) read tokens and need no edit:
they become sky-blue rays and an orange glow, which is the brand wash
itself. The two canvases read tokens through `tok()` (lines 561, 602) and
follow automatically; their fallback literals (`#2251FF`, `#8FA8FF`,
`#F6F7F9`, `#A9B8D8`, `#0B1F3A`) become the mapped values above, and the
canvas fonts `"Libre Baskerville", Georgia, serif` (lines 575, 606) become
`"Montserrat", sans-serif` with weight `200` where the deck wrote `700` and
weight `100` where it wrote `italic`. Shadows written in navy,
`rgba(11,31,58,.12)` on `.chip` (line 119) and `rgba(11,31,58,.18)` on
`.caption` (line 172), become `rgba(0,0,0,.45)`, since a navy shadow on a
near-black ground is invisible; `.hud-pill`'s `rgba(0,0,0,.18)` becomes
`.45` for the same reason. The mask `#000` values (line 53) are masks and
stay. `.stamp`, `.chip`, `.ecard`, `.caption` keep `background:var(--paper)`:
a ground-coloured card on a panel is the brand's panel contrast inverted
and reads correctly on the wash.
**Dead code that goes with the light theme.** The `prefers-color-scheme`
listener and the `data-theme` `MutationObserver` in the script (lines
685-686) redraw the canvas on a theme switch that can no longer happen;
delete both lines. `.rm` (reduced motion) rules stay.
**What must not change.** Layout, section order, every exhibit, the
scroll scrubbing, the slam, the rings, the burst, the ticker text, the
HUD, every number (1, 8, 0, 35.7%, 50.0%, 4 TPS, 930), every line of
copy except item 4. Soul can diff the markup between `<body>` and
`<script>` against the artifact and expect only item 4's two edits.
2. `GameCult/Blog/project-thing.md`: the news post that frames it.
Frontmatter: `title: Project Thing`, `description` (one sentence: a board
discussion document on renaming Eve to Thing), `author: Thing
Transformation Office`, `date: 2026-10-02`, `tags: [eve, thing, gamecult]`,
`socialDeck: "Thing renders things."`. Body: one short paragraph naming
it as a board deck on the rename of Eve, the `gamecult-embed-frame` iframe
pointing at `/static/applets/project-thing/index.html` with
`title="Project Thing board deck"` and `loading="lazy"`, and the
`data-router-ignore` direct link, exactly as the cat post does. The shared
`.gamecult-embed-frame iframe` rule (custom.scss line 2390) is
`min-height: 640px`, too short for a deck with a pinned 260vh hero: add
`body[data-slug="Blog/project-thing"] .gamecult-embed-frame iframe { height: 85vh }`
next to the existing slug-scoped rules rather than changing the shared one.
3. `GameCult/Projects/index.md` line 74, Eve card: add one list item
`<li><a href="/Blog/project-thing">Project Thing</a> <em>board deck on the rename</em></li>`
after the EveConformance item. Nothing else on the card changes in this cut.
4. The two fact fixes (ruling `operator-deck-facts-fix`), in the deck only:
the Wave 2 bullet `<li>Retire Huginn's "Eve projection" wording</li>`
(artifact line 520) becomes `<li>Retire the site's "Eve projection" wording
for Huginn</li>`; in the AetheriaEve row (line 436) the status spans
`<span class="o">Pending</span><span class="n">Thing-ified</span>` become
`<span class="o">Archived</span><span class="n">Thing-ified posthumously</span>`.
No other copy changes.
Verification Hands must show: local `.\scripts\quartz\quartz.ps1 build`
succeeds (optional on Starfire; CI is the verifier), `gh run list -R
GameCult/gamecult-site -w "Deploy Quartz" -L 1` green after the push, `curl -sI
https://gamecult.org/static/applets/project-thing/index.html` 200 and
`https://gamecult.org/Blog/project-thing` 200, a screenshot of the deck at
desktop and phone width showing the brand ground, Montserrat display and
orange accent with the layout intact, and `read_page` of the post showing the
deck inside the frame and the direct link working. Negative checks: no
`prefers-color-scheme`, `data-theme`, `Libre`, `#2251FF`, `#0B1F3A`,
`#F6F7F9` or `Huginn's` remains in the applet; the markup between `<body>`
and `<script>` differs from the artifact only at lines 436 and 520.
Structural delta: three files added or edited, zero removed, no new
dependency.
## Cut order after cut 1
Superseded by "Revision 5: the code rename" below (2026-10-10): cuts 2-12
here were never specified; their content is re-mapped there against current
heads, and cut 10's per-host windows violate `rename-whole-per-edge` (B16).
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, 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" 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 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 with id `thing`, repo links to the new names, **no
Persona**: the portrait `<img>` is replaced by the `swarm-avatar-fallback`
letter "T" the Ghostlight card uses, the `swarm-badge` and the
`<details class="swarm-persona">` 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); `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.<name>.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.<name>.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<next>` 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 `<host>/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)
### `home-repo`: which repo owns the campaign and this map?
Options: **eve-repo** (this file, `F:\Projects\Eve\docs\thing-campaign.md`,
the kernel repo that becomes `Thing`; the body the campaign changes, as
`eureka-body` lives in Huginn); **gamecult-ops** (cross-repo campaigns as ops
memory; but ops is private and the campaign is public by nature);
**Eureka** (the method repo; wrong owner for a product rename). Recommended:
**eve-repo**. The campaign record's `repos` must list the eight by their
*new* names once cut 2 lands; until then the old names, since a `DocRef`
names a commit and the redirect keeps it reachable either way.
### `brand`: how does the deck look on gamecult.org?
Options: **framed-exhibit** (the deck ships with its own consulting look,
unchanged, including its light/dark themes; the brand lives in the blog post
and site chrome around the iframe, and the raw URL opens the exhibit as
itself); **re-skin** (the deck's `:root` tokens become the brand's: ground
`#07111a` with the wash, Montserrat and Ubuntu, accent `#ff8a2a`, single dark
theme); **hybrid** (keep the deck's typography and layout, replace only the
navy with the brand's ground and the blue accent with orange, force dark).
Recommended: **framed-exhibit**. The consulting navy and serif are the joke;
re-skinning it makes an earnest deck out of a parody. Brand doctrine already
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` (ruled: rename-now, `operator-wire-rename-now`)
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);
**rename-at-next-epoch** (each id becomes `gamecult.thing.<name>.v2` in its
next breaking revision, paid for by that revision; UPM ids on the next major);
**rename-now** (a migration of every fixture, conformance pack, consumer
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` (ruled: rename-archived, `operator-aetheria-eve-rename`)
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**;
it is cheap and the stated reason for the campaign is the name itself.
### `dsl-name`: what is the DSL and lowering layer called?
Operator direction (verbatim): "Eve CultUI is indeed misleading, should
become Thing Script or something. ThingML would be hack." Read as a
direction, not a final name. ThingML is also already taken: it is SINTEF's
IoT modelling language, so the collision stands behind the "hack".
What the new name covers, by the four uses above: **(1) the authoring DSL**
and its reactive binding contract, today "CultUI" and "Eve DSL"
interchangeably, including the TUI and GUI streams it lowers to ("Thing
Script lowers to a GUI stream and a TUI stream"); **(2) the retained tree**
keeps being named by its schema (`gamecult.eve.surface.v1`, in prose "a
Thing's surface tree"), and the style system is "Thing Script styles";
**(3) the `cultui-*` anatomy ids** are wire and follow the `wire-names`
ruling; **(4) Unity CultUI** (`org.gamecult.ui`) is CultLib's and keeps its
name, so the memory note's distinction becomes "Unity CultUI is not Thing
Script".
Options: **thing-script** (two words in prose, `thingscript` in identifiers
and as the file extension `.thingscript` for fixtures when they are next
touched; the `.eve` extension is prose-grade, three fixture files);
**thing-dsl** ("Thing DSL", descriptive, no new noun; weaker in sentences
and keeps "DSL" as a name); **keep-cultui** (CultUI stays the DSL's name,
doctrine says "Thing/CultUI"; cheapest, but the operator has called the
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` (withdrawn; answered outside its options by `operator-retire-persona`)
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<n+1>` 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?
Options: **fix** (the Huginn wave-2 bullet names the site, the AetheriaEve row
says archived; nothing else); **publish-as-is** (a parody is allowed its
errors; the map records them). Recommended: **fix**; both are one-line edits
and the deck is the campaign's public statement of intent.
## Rationale
### Why the deck is cut 1 and not a footnote
The operator said so, and it is also the cheapest honest first move: it
publishes the intent before any name changes, so every later cut can point at
a public statement rather than a private decision.
### Why the applet path and not a content-side HTML file
The overlay applet is the only standalone-HTML path with a live proof on the
site (B4). A content-side `.html` would be a second mechanism for one job.
### Why repo renames come before doctrine and site prose
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 same-cut per edge and not a dual-read window
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 kernel keeps `v1`
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
- Keeping the deck's consulting look as a framed exhibit: revision 1's
recommendation, overruled by `operator-brand-reskin`. The re-skin keeps the
parody's structure (exhibits, waterfall, quadrant, TPS) and changes only
the costume.
- Treating "Eve" in dated blog posts as live prose: they are history; the
`eve` tag stays, since tag URLs have no redirect.
- 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.
- The deck as an iframe in the article column (cut 1's shape, live until cut
`deck-site-page`): overruled by `operator-deck-is-a-site-page`.
- A full-bleed iframe under the masthead: the iframe becomes the scroller,
so the masthead never leaves the viewport and costs a phone a masthead's
height on every screen of the deck; two documents load for one page.
- A fixed overlay root like the Graph viewer's: covers the masthead the
operator asked to present the deck with.
- `@scope (.thing-deck)` instead of prefixed selectors: one line, but newer
than anything the site relies on (Firefox 128, July 2024); prefixing is
mechanical and Soul can grep it.
- Inline `<style>` and `<script>` in `Thing.md`: they survive the pipeline,
but `Description` would index their text as the page's words (B13.4).
- The whole-site reading of "always fullscreen" (chrome as overlays, no
1680px measure): dropped by the operator's clarification; prose keeps its
reading-width chrome.
## Fullscreen presentation (revision 4)
The deck went live as cut 1 shaped it: an iframe inside `.gamecult-embed-frame`
in the article column of `/Blog/project-thing`, 85vh tall, with the applet at
`/static/applets/project-thing/index.html`. The operator's words, verbatim:
> we can also certainly do better than just embedding it in the site's body
> chrome. Our site should always be a fullscreen experience
and, asked what "always" covers:
> I'm just saying, the masthead always fills the screen, and the content
> should do the same, where reasonable. Having a body chrome that stops text
> from taking up the full width when you're reading is just good UX. I don't
> see why the Thing page can't be presented with the existing masthead. It's
> the Thing page, on the GameCult site, right?
Admitted as `thing:ruling:operator-deck-is-a-site-page`: the deck is a page
of gamecult.org under the existing masthead, filling the screen below it; it
is not an iframe in the body column. Prose pages keep their reading-width
chrome. This is not a site redesign; the whole-site reading of "always
fullscreen" and the `fullscreen-scope` question were dropped with the ruling.
What this section settles is mechanism.
### B12. How the site lays a page out today
Pinned: gamecult-site `ae0927f1c7e2231a722007233f26847daf68f740` (the polish
cut `cut-deck-polish` is in flight on the applet file; nothing below depends
on that file's contents), GameCult-Quartz `ef43df0`.
- The engine renders every page as `<body data-slug>` > `#quartz-root.page` >
`#quartz-body` with a left sidebar, `.center` (`.page-header` holding the
masthead and the `beforeBody` components, then `<article>`, an `<hr>`, the
`.page-footer`), a right sidebar and the site `Footer`
(`GameCult-Quartz/quartz/components/renderPage.tsx` lines 267-294).
`enableSPA: false` (`site/quartz.config.ts`): every navigation is a full
page load, there is no router, and inline or linked scripts run on load.
- `.page` is `max-width: 1680px; padding: 0 1.2rem 2.5rem` (`custom.scss`
lines 31-35), so the masthead and all content share one measure; on a
display wider than 1680px nothing fills the screen. `.page::before` paints
the fixed grid texture over everything, pointer-events none (lines 37-47).
- Sidebars are grid columns: an empty sidebar is `display: none` and the
grid collapses to one column (lines 50-85); the left column is the TOC
(desktop only), the right is the overview sidebar and backlinks. Which
components render is decided per page by slug predicates in
`site/quartz.layout.ts` (`isGraphPage`, `isIntegratedDossierPage`,
`isStandardContentPage`, `isBlogArticle`); Breadcrumbs, ArticleTitle and
ContentMeta are skipped for `index` and `Graph`.
- The article is a card: `.page > #quartz-body .center > article` has a
gradient background, 1px border, 24px radius, shadow and
`padding: 1.45rem 1.7rem 1.9rem` (lines 1089-1099). Reading width inside it
comes from the page types (`.gamecult-studio-page` 72rem, Ritual Paper
980px, `max-width: 68ch` on some prose).
- Nothing is full-bleed. The home page and the Projects page are studio
pages (72rem, right sidebar, no TOC). Ritual Paper is a typographic
variant inside the same grid (lines 101-630). Two pages reach for more
room ad hoc: `Blog/the-sleeping-colossus-refuses-the-throne` collapses the
grid to one column, hides both sidebars and the popover hint by slug
(lines 1152-1180), still inside the 1680px card; and `Graph`, whose
viewer bundle mounts `.gamecult-epiphany-graph-root` as
`position: fixed; inset: 0; z-index: 1000` and sets
`body.gamecult-graph-spa-active { overflow: hidden }`
(`GameCult/static/epiphany-graph/assets/viewer.css`), covering the masthead
and footer rather than removing them. That fixed root is the only visual
overlay on the site. Revision 3's phrase "overlay applet" meant the build
overlay (`site/` staged over the engine, B4), not a visual layer: the cat
and Thing applets are iframes in the article column.
- The masthead (`GameCultMasthead`) is in normal flow, not sticky: title,
tagline, community links, nav chips. Its tagline is the page's first
standalone italic quote line after an optional H1, stripped from the
article by `stripTopTagline` (`site/quartz/components/gamecult.ts` lines
170-209, 486-505).
- Embeds: `.gamecult-embed-frame` (lines 2388-2400, 2505) is used by three
pages (the cat post, the Thing post, `Projects/CultPong.md`); the Thing
post's 85vh override is the slug-scoped rule at lines 1148-1150.
### B13. What Quartz does to raw HTML in a Markdown page
`ObsidianFlavoredMarkdown` runs `rehype-raw` (`ofm.ts` line 544), so HTML in
a `.md` page survives, including `<style>`, `<link>` and `<script>`
elements, which Preact renders to static HTML and the browser executes on
load. Four rules bite a pasted deck:
1. CommonMark HTML blocks that open with `<div`/`<section` end at the first
blank line; text after a blank line that does not start with `<` is a
Markdown paragraph (`<p>` wrapping, inline parsing) and a line indented
four spaces after a blank line is a code block. `<style>` and `<script>`
blocks end at their closing tag and may contain blank lines. The deck's
markup (committed HEAD, lines 254-529) has 15 blank lines.
2. `Latex` (remark-math) turns `$...$` into math outside HTML blocks; the
deck's markup carries no `$`.
3. `CrawlLinks` marks `<a>` elements `internal` or `external` and appends an
external-link icon SVG to every external link (`links.ts` line 32,
`externalLinkIcon: true`); the deck has two external links in `.src`.
4. `Description` sets `file.data.text` from the whole tree, which feeds the
search index and, absent a frontmatter `description`, the page
description and OG card; inline `<style>`/`<script>` text would be
indexed as page text. Linked files are not.
Site styles that reach into an in-page deck (`GameCult-Quartz/quartz/styles/base.scss`):
`a { font-weight: 600; color: var(--secondary) }` (line 84), `strong`
(line 80), `h1`-`h6` families, sizes and margins (lines 356-420), `p, li`
line-height (515-517), `table, th, td` (528-545), `ul` list style (37-44),
plus the article card above. The deck's own unscoped selectors that would
reach out: `*`, `:root`, `body`, `h1,h2,h3`, `p`, `b,strong`, `table`,
`td`, `th`, `tr.lit td`, `tr.strike td(::after)`, `[data-reveal]`. Its 110
class names and 14 keyframe names collide with nothing in `custom.scss` or
`base.scss`. The script's only root touch is `document.documentElement`
(line 532: `.rm` for reduced motion, `getComputedStyle(root)` for tokens);
it otherwise reads `window.scrollY`, `innerHeight` and element rects, which
hold for an in-flow deck. The HUD bar and pill are `position: fixed`.
### The shape: the deck is the Thing page
Under `operator-deck-is-a-site-page` the deck becomes one page of the site,
rendered by the engine like every other page, with the masthead above it in
flow and the deck's sections spanning the viewport below it:
- **One copy, in the page.** The deck's markup is the body of a Markdown
page, wrapped once in `<div class="thing-deck">`, with its blank lines
removed (B13.1). Its styles and script are two static files the page
links, `site/quartz/static/thing/deck.css` and `deck.js`, not inline
(B13.4). The applet file is deleted; its URL becomes a redirect stub so
`old-names-resolve` holds.
- **Scoped both ways by one class.** Every selector in `deck.css` is
prefixed `.thing-deck`; `:root` and `body` become `.thing-deck` (tokens,
font, size, colour; the body `background` is dropped because the site's
body already paints the same wash); `*` becomes `.thing-deck *`; the `.rm`
rules become `.thing-deck.rm ...`, and `deck.js` line 532 takes
`document.querySelector('.thing-deck')` as `root`, so reduced motion and
`tok()` both read the deck root. Site rules the deck must redeclare inside
its scope: `a` (weight and colour as the deck had them), `strong`,
headings' margins, `p` line-height, table cell padding and borders, list
style; and `.thing-deck .external-icon { display: none }` (B13.3).
Keyframe names stay (no collision).
- **Masthead above, hero below, stacked.** The deck's hero does not
duplicate the masthead: the masthead is site identity and navigation, the
hero is the deck's cover. The hero's sticky stage sticks at `top: 0` once
the masthead has scrolled off, so the first viewport is masthead plus the
top of the hero and every later viewport is the deck alone. The masthead
tagline is the deck's `socialDeck` line, *"Thing renders things."*, given
as the page's first line and lifted into the masthead by `stripTopTagline`.
The HUD bar stays fixed at the top (3px, scaled to 0 at rest); the HUD pill
stays fixed bottom-right (top-right on phones, where it overlaps the
masthead's community icons until the first scroll; accepted).
- **Page chrome on this page only**, scoped by `body[data-slug="Thing"]` in
`custom.scss` beside the other slug rules: `.page { max-width: none;
padding: 0 }` so the deck's `--inv` sections run edge to edge;
`.page > #quartz-body .center > .page-header { max-width: 1680px;
margin-inline: auto; padding: 0 1.2rem }` so the masthead keeps the measure
it has on every other page; the article card loses background, border,
radius, shadow and padding; the `<hr>` and `.page-footer` margin go. The
site footer follows the deck's close section. The layout predicates in
`quartz.layout.ts` gain `isThingPage` and skip Breadcrumbs, ArticleTitle,
ContentMeta, the overview sidebar and Backlinks for it, as they do for
`Graph`; with both sidebars empty the existing grid rules give one column.
- **Scripts and the router.** There is no SPA router (`enableSPA: false`);
`deck.js` runs on every load of the page as `<script src defer>`. Nothing
to design.
- **The Blog post** `/Blog/project-thing` stays as the dated news item: its
frontmatter unchanged, its body a paragraph and a link to the Thing page;
the iframe, the direct link and the slug-scoped 85vh rule go. The Eve card
item links to the Thing page. `.gamecult-embed-frame` stays for the cat
post and CultPong.
Not chosen, and why (also under "Rejected"): a full-bleed iframe under the
masthead keeps the deck untouched but makes the iframe the scroller, so the
masthead never scrolls away and the deck loses a masthead's height of every
phone viewport, and the page loads two documents; a fixed overlay like the
Graph's covers the masthead the operator asked to keep; `@scope` instead of
prefixing is one line but is newer than anything the site relies on
(Firefox 128, 2024) and prefixing is mechanical.
### Authority map delta
- Owner of the deck's look: `deck.css`, scoped to `.thing-deck`; it reads no
site token and the site reads none of it. Owner of the page chrome on the
Thing page: `custom.scss` under `body[data-slug="Thing"]`, and
`quartz.layout.ts` for which components render. The engine owns the frame
(`renderPage.tsx`); it is not edited.
- Derived, display-only: the masthead tagline (from the page's first line);
the one-column grid (from empty sidebars); the search-index text (from the
deck's copy, not its CSS or JS).
- Forbidden writers: no site stylesheet styles anything inside
`.thing-deck`; no deck selector is unprefixed; no second copy of the deck
exists (the applet file is replaced by a stub that holds no deck markup);
no iframe, no fixed overlay root, no `overflow: hidden` on body.
- Shared paths: the same Deploy Quartz workflow and Pages origin; the deck's
fact fixes and the polish cut's edits travel with the markup and script
unchanged (Soul diffs them against the polish cut's landing head).
- Deletion line: before the page exists, the applet's `<style>`, `<body>`
and `<script>` are moved out and the applet file is reduced to the stub;
the embed and the 85vh rule are removed from the post and `custom.scss`.
### Question `thing-page-url`: which URL is the Thing page?
Options: **top-level** (`GameCult/Thing.md`, `/Thing`; a page of the site
like `Pitch` or `tour`, with the masthead's tagline and no article chrome;
`/Blog/project-thing` stays the dated announcement pointing at it; cut 4's
Thing card links to it; the URL outlives the campaign as the family's page);
**blog-post** (`/Blog/project-thing` is the page; `GameCultArticleMeta`,
Breadcrumbs and ArticleTitle must be skipped for one blog slug, the Blog
index lists a post whose body is the deck, and the family's page later
needs another URL anyway). Recommended: **top-level**; the operator called
it "the Thing page", and a dated post is the wrong container for a page
meant to outlive its date. The cut spec `docs/thing-cut-fullscreen.spec.json`
assumes top-level; under blog-post the same spec applies with
`GameCult/Blog/project-thing.md` as the page file, `isThingPage` matching
that slug and `isBlogArticle` excluding it.
### Cut `deck-site-page` (spec `docs/thing-cut-fullscreen.spec.json`)
Repo `gamecult-site`, after `cut-deck-polish` lands (the spec's base is
`ae0927f`; Hands rebases onto the polish cut's landing head and takes the
deck's markup, styles and script from that head, never from the artifact).
Rulings: `operator-deck-is-a-site-page`, `operator-brand-reskin`,
`operator-deck-facts-fix`. Question assumed: `thing-page-url = top-level`.
Structural delta: the 680-line applet becomes a 12-line stub; about 270
lines of markup, 250 of CSS and 150 of JS move into `GameCult/Thing.md`,
`deck.css` and `deck.js`; about 40 lines of `custom.scss` and 8 of
`quartz.layout.ts` are added; 3 lines of `custom.scss` and the post's embed
are removed. No new dependency, no new format.
## Cut `deck-page-fixes` (spec `docs/thing-cut-deck-page-fixes.spec.json`)
Written 2026-10-02 against gamecult-site `e906f04`, after Soul's pass on
`deck-site-page` (`thing:verdict:cut-deck-site-page.s1`). It resolves
`engine-header-leak` and `chrome-edges` and makes the hero run up behind the
masthead as one screen, per the operator's words on the `/Thing` screenshot
("any reason the masthead has its own background separate from the page
background? I feel like it could easily take up that same space"). The long
form, body facts B6-B8 and the mechanism are in the site-wide masthead map,
gamecult-site `docs/masthead-campaign.md`; the masthead card's removal is that
campaign's cut, not this one's. `body-under-scrollbar` is the engine's
`html { width: 100vw }` and is question `scrollbar-fix-home` there.
## Cut `deck-page-edges` (spec gamecult-site `docs/thing-cut-deck-page-edges.spec.json`)
Written 2026-10-02 against gamecult-site `87f2942`, after Soul's pass on
`deck-page-fixes` (`thing:verdict:cut-deck-page-fixes.s1`). It resolves
`chrome-edges-wide` (the Thing masthead and footer boxes become the same box
`.page` is on every other page, through one variable `--thing-frame`, and the
footer neuters the engine's `min-width: 100%`) and `phone-ticker-short` (the
ticker band and the confidentiality line leave absolute positioning and become
flow siblings after the hero content; the stage is `min-height` one screen, so
it grows on 375x667 and 360x740 instead of laying the band over the subtitle).
The measurements, the mechanism and the authority map are in the site-wide
masthead map, gamecult-site `docs/masthead-campaign.md`, section "Soul's
findings after flat-nav". Allowed by `thing:ruling:operator-deck-polish`; no
question is open.
## Revision 5: the code rename (2026-10-10)
Imagination (`imagination-thing-rename`, session `self-thing-2026-10-10`).
Rulings this section rests on: `thing:ruling:operator-wire-rename-now`,
`:operator-member-names-keep`, `:operator-dsl-thing-script`,
`:operator-retire-persona`, `:operator-aetheria-eve-rename`,
`:operator-aetheria-freeze-contents`, `:operator-epiphany-out-of-scope`,
`:operator-home-eve-repo`. Target in force: `thing:target:r2`. The probe
scripts are in the Self's scratchpad `imagination/` (`p1_heads.sh` to
`p6_members.py`, `gen_windows.py`, `gen_specs.py`); every anchor in every
spec was generated by `gen_windows.py` from `git grep` at the pinned head.
### Pinned heads (read 2026-10-10 by `git fetch`, then the origin default branch)
| Repo | Head | Last commit |
| --- | --- | --- |
| Eve | `8e270d6dc0199eb0708d570e4f7d2de03d13578a` | 2026-10-02 |
| EveTui | `01ea52f50d6ffcae290bbda8959e2ef73571d2cf` | 2026-07-10 |
| EveUnity | `92f0dbbc9bf77c232f0c6cf733f48af64c8ed6b6` | 2026-08-26 |
| EveFlutter | `3511e5c8f1ecd8e9ff119f3292afce84fa85a15d` | 2026-07-10 |
| EveElectron | `cba684c118fe99ce1ba9c110449d696e54f1eb7f` | 2026-09-13 |
| EvePlugins | `c5a4a75c1b727499b16c2dae1895f29e2a9f72f0` | 2026-07-15 |
| EveConformance | `048ea2f9fa502cf919730f446282ba2ded06d398` | 2026-09-16 |
| AetheriaEve | `6ecf25526d60aa7eb07c4dd716b83a6d411ae1d5` | 2026-09-29 |
| Ghostlight | `327cbe3c5e49fdfdce5898b1f01d3c3fe0936597` | 2026-10-10 |
| Odin | `8e1de662c75e09e5b93005b600ccdad1cc0e8387` | 2026-10-01 |
| VoidBot | `46d891b8410324aa30c86bedb3720d9cb8d511fa` | 2026-09-13 |
| gamecult-ops | `e4042ee3b83678c0b6f9b2a41088b4d9edea217e` | 2026-10-10 |
| gamecult-site | `8169ee5cd6f061f2ee40333a7ca0f492cc0cb498` | 2026-10-03 |
| CultLib | `dbcb2a8ea8084b3ade14482b57969e922fc0bc9e` | 2026-10-10 |
| Idunn | `6667f0f9a66f7c71446fcae15e0713127978a394` | 2026-10-01 |
| Mimir | `d88f2e6dc197b0e0292540c3ee38764b84a596d0` | 2026-09-14 |
| Bifrost | `67072b28923017f93f484d901c7a6d31e3678d88` | 2026-10-10 |
| Heimdall | `7904e17cd267c046e2fa08119f7ea310cbf68a83` | 2026-09-30 |
| Hermodr | `f8e6e8454ebe3f7760bd16795b92be89ae24dd7b` | 2026-09-06 |
| Gjallar | `6a9297642598b34bfbd2ca7b54af2d04df7bfa0c` | 2026-09-29 |
| Muninn | `1d0ea0b112d9f1d19e4dac745f5f6e6ccd6487c7` | 2026-09-30 |
| Stonks | `3f6e91c9628642eedb0a234c54ad03650f21d91e` (origin default is `codex/stonks-market-daemon`) | 2026-09-30 |
| Vili, Weksa, repixelizer, StreamPixels, AquaSynth, Brokkr, Loki, Sai, Ymir, Epiphany | `8773c15`, `d16cff5`, `06c1cf4`, `8d40541`, `aed6525`, `f97d4dc`, `b20fb98`, `2e7be7e`, `f8c0e39`, `ef95686` | 2026-06-13 to 2026-10-10 |
### Body facts, revision 5
**B14. The eve wire ids reach 25 repositories outside Epiphany.** `p5_ids.py`
(code files only, docs and `dist/` excluded) finds 102 distinct eve-named ids;
50 of them leave the renderer family. `gamecult.eve.provider_advertisement.v1`
is carried by 24 repos, `gamecult.eve.surface.v1` by 24,
`gamecult.eve.surface_state.v1` by 13. `mimir.eve_*` (16 ids) sits in Mimir,
CultLib, Eve, Odin, VoidBot and gamecult-ops. Anchor windows per repo
(`gen_windows.py`, wire pattern only): Eve 282, EveUnity 163, EveConformance
104, Ghostlight 60, CultLib 48, EveTui 48, Mimir 41, EveFlutter 32,
EveElectron 31, VoidBot 29, EvePlugins 29, repixelizer 22, Heimdall 20,
Hermodr 17, Gjallar 15, Muninn 14, Sai 14, Bifrost 11, weksa 11, Odin 9,
gamecult-ops 9, Vili 10, Stonks 10, StreamPixels 7, gamecult-site 7, Loki 6,
AquaSynth 6, Ymir 4, Brokkr 1. Huginn and Aetheria carry the ids only in docs.
**B15. What is live, from Idunn's own inventory**
(`gamecult-ops/scripts/idunn/idunn-deployment-targets.ps1` at `e4042ee`, and
`idunn/yggdrasil/bindings/*.toml.in`, `compose/odin.yggdrasil.yaml`):
Yggdrasil runs Odin, Ghostlight (own binding), Heimdall, the VoidBot swarm
publisher, StreamPixels, and a `hermodr` compose service whose Idunn target
says `archived`; Starfire runs Stonks, weksa, Muninn and the Idunn swarm
supervisor; Raven runs Muninn, Vili and sleipnir; Nightwing runs Muninn,
`gjallar.service` and `nightwing-eve-browser-reference` (Repo `Eve`). Blocked
or archived: Bifrost, repixelizer, `eve-ipad-evecanvas`,
`periwinkle-eve-android`, `nightwing-eve-dashboard`. Not deployed by any
target: Sai, Loki, AquaSynth, Brokkr, Ymir, Epiphany.
**B16. The discovery ids are one Verse-wide edge.** Every live provider in B15
publishes `gamecult.eve.provider_advertisement.v1` and `surface*` documents
that Odin aggregates (`Odin/crates/odin-core/src/documents.rs`), and Rust
readers drop unknown records (B10). A provider on old ids after Odin flips is
invisible, and so is a provider on new ids before. So the provider, surface,
surface_state, interface_binding, command, plugin_advertisement and
`mimir.eve_sensor_observation` ids form **one** live edge across four hosts,
and the map's old cut 10 ("per host, each in its own deploy window") would
break it. The window is Verse-wide.
**B17. Ghostlight vendors a kernel commit that is not on Eve's main.**
`Ghostlight` at `327cbe3`: gitlink `vendor/eve` = `672c0c1` (2026-08-25),
reachable only from `origin/codex/eve-browser-host-isolation` (7 commits ahead
of Eve main, 18 behind). `git merge-tree --write-tree origin/main
origin/codex/eve-browser-host-isolation` is clean; the branch touches
`Sources/`, `README.md`, `control`, `Makefile`, two docs and
`packages/eve-browser-lowering/{src,dist,test,docs}`. Ghostlight's routes
`/api/eve/{provider,surfaces/{id},commands,events}` (`runtime.rs:655-658`) are
called by its own web client; its four `#[ignore]` client-bridge tests
(`runtime.rs:3140, 3834, 3948, 4054`) need a built `vendor/eve` lowering and
run on no automated path (`ghostlight-verse:follow_up:gate-runs-eve-bridge-tests`).
**B18. Idunn reads the gitlink origin from the binding, and pins the key.**
`Idunn` at `6667f0f`: `deployment_plan.rs:118-131` requires the binding's
gitlink keys to equal the observed gitlinks and each origin to equal the
binding's; `deployment.rs:1440-1443` requires the binding keys to equal the
recipe's `required_gitlinks`; `drivers.rs:1544` clones the gitlink from the
binding's origin. So the binding's origin URL can move to `Thing.git` any time
after the GitHub rename (the old URL also redirects), but renaming the key
`vendor/eve` to `vendor/thing` must land with Ghostlight's recipe in the same
deploy. `scripts/deploy-ghostlight-yggdrasil.sh` also reads the `vendor/eve`
path (lines 887, 957, 1269) and writes receipt member `eve_commit`.
**B19. In TypeScript a compatible schema id is a wire path, not only a store
path.** `CultLib` at `dbcb2a8`: `packages/cultnet-ts/src/replication.ts:399`
answers a replication request when any of a definition's
`compatibleSchemaIds` is requested, and `packages/cultmesh-ts/src/index.ts:6625`
matches catalog entries the same way. Declaring the old id compatible on a
TypeScript type therefore answers old-id requests on the wire: the accept-both
path target r2 forbids. Rust `cultcache-rs` still has no compatible-id path,
and 52 non-test references to the alias API remain in CultLib. Hence question
`compat-ids-reach-wire`.
**B20. Nothing is published to a registry.** `registry.npmjs.org` answers 404
for `@gamecult/eve-{contracts,browser-lowering,tui,plugins,conformance,electron}`;
`api.nuget.org` 404 for `gamecult.eve.surface` and `gamecult.eve.pluginfields`;
`pub.dev` 404 for `eve_parity`. No family workflow publishes (Eve's one
workflow, `portable-contracts.yml`, runs `npm ci` and `npm test`). Every
package rename is in place; no deprecation of a published name is owed. No
workflow anywhere uses `uses: GameCult/Eve*` (B2's failure mode is absent).
CultLib's `cultmesh-portability.yml:48` runs `verify-eve-getting-started.ps1
-EveRoot ./Eve` against a checkout of the Eve repo.
**B20a. Still no forge mirror.** 2026-10-10:
`https://eureka.gamecult.org/forge/api/v1/repos/search?q=eve` returns no
repos, and an unfiltered search lists only `GameCult/Eureka`. Target r2's
"Forgejo (no mirrors exist)" holds; no cut renames anything on the forge.
**B21. Git-URL pins to the family** (`p4_pins.py`): Unity manifests in
AetheriaEve (frozen) and EveUnity's `ReleaseConsumerProject` pin
`GameCult/Eve.git`, `EveUnity.git`, `EvePlugins.git` by sha or tag;
`EveConformance/conformance-workspace.lock.json` pins six family repos by
commit; `Ghostlight/.gitmodules`; `Gjallar/deploy/bootstrap-yggdrasil.sh:22`;
`gamecult-ops` `ghostlight.toml.in:14` and `deploy-ghostlight-yggdrasil.sh:20`.
All resolve through GitHub's redirect after the rename (B2), so no pin breaks
at rename time; each moves in its repo's wire cut.
**B22. Doctrine surfaces.** `F:\Projects\CLAUDE.md` is in no repository
(`git rev-parse` fails there); it names Eve at lines 23, 24, 26, 28 (Eve's
DSL, Eve MultiVerse) and 90. The global doctrine is
`~/.claude/skills/eureka/doctrine/CLAUDE.md`, a checkout of
`eureka.gamecult.org/forge/GameCult/Eureka` at `278b881`; it names Eve at line
186. `SKILL.md:82` (the AetheriaEve taxidermy scar) is historical. Agents,
output styles and `~/.claude/doctrine/*` other than the doctrine `CLAUDE.md`
carry no Eve. Memory files naming the family: `F--Projects/memory/`
`{aetheriaeve-taxidermy, cheap-signal-is-not-evidence,
cultcache-stores-outside-assets, eureka-memory-organ, MEMORY,
pending-doctrine-proposals}.md`, `F--Projects-CultLib/memory/MEMORY.md`,
`F--Projects-Aetheria/memory/{aetheria-content-audits-pre-breach,
aetheria-cultcache-migration, aetheria-ship-the-game, MEMORY}.md`.
**B23. Epiphany's exclusion.** Epiphany at `ef95686` produces
`gamecult.eve.surface.v1` and provider advertisements in
`epiphany-core/src/atlas/eve_surface.rs` (also `repo_model_documents.rs`,
`atlas/tests.rs`, `epiphany-openai-runtime/src/lib.rs`). No Idunn target runs
it, and outside Epiphany the atlas ids appear only in the dated census under
`gamecult-ops/docs/repo-census-2026-09/`. So no live consumer depends on
Epiphany's eve ids; ruling `operator-epiphany-out-of-scope` excludes those
four files, its docs and its schema mirrors, and after the window an Epiphany
run would publish ids nothing reads.
**B24. Eve-named members.** `p6_members.py` finds 42 identifiers matching
`eve_*`/`eve[A-Z]*` followed by `:` or `=`; nearly all are locals or option
names, which rename freely. The schema members the ruling keeps are the ones
inside a typed document: confirmed is Ghostlight's deployment receipt
`eve_commit` (`gamecult.ghostlight.deployment.v2`, written by
`deploy-ghostlight-yggdrasil.sh`); each wire cut's Hands checks any other
candidate against its schema before renaming (follow-up `member-names-next-revision`).
### Model page, revision 5 additions
| Kind | Identity | Lifecycle | Authority |
| --- | --- | --- | --- |
| Gitlink path | `vendor/eve` in Ghostlight's tree and `.gitmodules`; key of the Idunn binding and of the recipe's `required_gitlinks` | moved once to `vendor/thing` in the Verse window; the binding key, recipe and tree move in one deploy (B18) | Ghostlight owns the tree path; gamecult-ops owns the installed binding; Idunn only checks they agree |
| Idunn target and unit id | `eve-ipad-evecanvas`, `periwinkle-eve-android`, `nightwing-eve-browser-reference`, `nightwing-eve-dashboard` (archived) | renamed `thing-*` in the window; the archived one renamed in the record only | gamecult-ops inventory; Idunn reads it |
| Stored document (`.cc` holding eve-typed records) | the store file plus the schema id of each record | derived stores (Odin `odin.cc`, VoidBot swarm state, weksa witnesses, Ghostlight `mesh-v2.cc`, Bifrost surfaces) are deleted and rebuilt by their daemon in the window; a store found to be truth stops its cut as a fork (ruling `operator-compat-rebuild`) | the owning daemon; no agent rewrites a store in place |
| Campaign repo list | `OrgRepo` strings fixed at campaign admission | cannot follow a GitHub rename: `thing` keeps `GameCult/Eve`, which then names `GameCult/Thing` by redirect | Self admits campaigns; gap `eureka-substrate:follow_up:gap-campaign-repos-fixed` (recurrence recorded here) |
Every row has all three cells; no cut below is mapped on an empty cell.
### Rename table T (the single copy every spec cites)
| Old | New |
| --- | --- |
| `gamecult.eve.<x>` | `gamecult.thing.<x>` (same `v<n>`) |
| `mimir.eve_<x>`, `cultmesh.eve_surface.v0` | `mimir.thing_<x>`, `cultmesh.thing_surface.v0` |
| `org.gamecult.eve.<x>` (UPM), `org.gamecult.eve` (Android), `org.gamecult.evecanvas` (iOS) | `org.gamecult.thing.<x>`, `org.gamecult.thing`, `org.gamecult.thingcanvas` |
| `@gamecult/eve-<x>`, bins `eve-plugin-*`, `eve-tui` | `@gamecult/thing-<x>`, `thing-plugin-*`, `thing-tui` |
| `GameCult.Eve.<X>` (NuGet, asmdef, namespace), `Mimir.Eve<X>` | `GameCult.Thing.<X>`, `Mimir.Thing<X>` |
| mesh keys `eve:<family>:<id>`, IPC `eve:*` | `thing:<family>:<id>`, `thing:*` |
| URI and route segment `/eve/` (`cultmesh://<verse>/eve/...`, `<host>/eve/gui`, `/api/eve/*`) | `/thing/` |
| env and constants `EVE_<X>`, `<SVC>_EVE_<X>` | `THING_<X>`, `<SVC>_THING_<X>` |
| browser anatomy `cultui-*`; fixture extension `.eve` | `thingscript-*`; `.thingscript` (ruling `operator-dsl-thing-script`) |
| type and file names `Eve<X>`, ObjC prefix `EVE` | `Thing<X>`, `THG` |
| gitlink `vendor/eve` | `vendor/thing` |
| schema members `eve_*` (e.g. `eve_commit`) | **unchanged** (ruling `operator-member-names-keep`) |
| filesystem paths on Yggdrasil `/srv/repos/Eve`, `/srv/build/Eve` | **unchanged** (target r2 not in scope) |
### Edges: lockstep or not
| Edge | Producers and consumers | Kind | Order |
| --- | --- | --- | --- |
| E1 discovery: provider_advertisement, surface, surface_state, interface_binding, command*, plugin_advertisement, plugin_abi*, `/eve/` semantic services, `mimir.eve_sensor_observation` | Odin; live providers Ghostlight, Heimdall, VoidBot, StreamPixels, Muninn (3 hosts), sleipnir, Vili, Stonks, weksa, Gjallar, the nightwing browser reference, Hermodr if running; the kernel browser lowering in their clients | **lockstep**: one Idunn window over yggdrasil, starfire, raven, nightwing | merge Thing first; Odin deployed first with `odin.cc` deleted; then every provider in the same window. Odin's catalog is short of not-yet-flipped providers for the window's length |
| E2 Ghostlight internal: `/api/eve/*`, local_draft, command_invocation, vendored lowering | Ghostlight server, its web client, `vendor/eve` | **lockstep inside one commit** of Ghostlight | deploys inside the E1 window |
| E3 binding key `vendor/eve` | gamecult-ops `ghostlight.toml.in`, Ghostlight `recipe.toml`, Idunn's check | **lockstep** (Idunn refuses a mismatch, B18) | binding installed with the Ghostlight deploy in the window |
| E4 env names `HERMODR_EVE_*`, `MIMIR_EVE_*`, unit names | each compose or unit file with its daemon | lockstep per service | inside the window |
| E5 build-time pins: UPM git URLs, conformance lock, `file:` npm deps, NuGet `GameCult.Eve.Surface` ProjectReferences, Kotlin `org.gamecult.cultmesh.eve` | family runtimes, CultLib, Ymir, AetheriaThing (frozen) | compat: a pin is immutable and resolves through the redirect | each consumer repins in its own cut after the kernel merge |
| E6 stores | `odin.cc`, VoidBot swarm state, weksa, Ghostlight `mesh-v2.cc`, Bifrost `provider-store.cc` and `eve-surfaces.cc`, Heimdall verse state, repixelizer | derived: delete and rebuild at the owning daemon's restart in the window; truth: stops its cut as a fork (`operator-compat-rebuild`) | with E1 |
| E7 app ids | Android and iOS builds | no live edge (both targets blocked) | with `kernel-dotnet-apps`; two operator uninstalls |
| Not live | Bifrost, repixelizer, Sai, Loki, AquaSynth, Brokkr, Ymir | none | any time after the kernel merge |
| Excluded | Epiphany (B23), AetheriaThing contents (ruling freeze) | none | never |
### Authority map, revision 5
- **Owner of each wire id:** the schema file in `Thing/schemas/`, or the
provider repo for its own ids (`mimir.*`). Every consumer copies the exact
string (C1). **The old id is no longer an owner of anything:** after the
window no reader asks for it and no writer emits it.
- **Owner of the flip:** cut `verse-window` alone schedules and accepts the
change of every live edge. **A `thing/wire` branch is no longer a deploy
input until the window merges it.** Every window cut lands on `thing/wire`,
Soul holds it there, and the window merges and deploys them together.
- **Derived state:** `dist/` and `src/generated/` are build output; Odin's
catalog and every derived `.cc` store are rebuilt from their sources; the
site's `gamecult-compound` data is regenerated.
- **Forbidden writers:** any alias, `AsSchemaAlias`, `CompatibleSchemaIds` on
any renamed type (ruling `operator-compat-rebuild`), or "accept both" reader;
a `thing/wire` branch merged outside the window; a hand edit of `dist/`,
generated data or a `.cc` store; any repo named `Eve*` created after the
rename; an agent editing doctrine before the window (doctrine naming ids
that do not exist yet would be false).
- **Shared paths:** one rename table (T) for every runtime; Idunn deploys
every host from merged default branches.
- **Deletion line:** every eve declaration is replaced in place; nothing is
kept beside its new name. The Persona's live surfaces are deleted after the
archive is taken.
### Cut order, revision 5
Under campaign `thing` (admitted, `depends_on` by cut label):
1. `persona-archive` (gamecult-ops, none): the byte-identical archive. The
two operator steps (registry entry, Discord role) follow it.
2. `persona-takedown` (Eve, `persona-archive`): `.voidbot/` and the persona
doc leave the kernel repo before it is renamed, so the repo never carries a
live Persona under the name Thing.
3. `repo-renames` (gamecult-ops, `persona-takedown`): the eight GitHub
renames and the ops URLs. Repos before ids: every later cut writes
`GameCult/Thing*.git` URLs, which must exist.
4. `kernel-schemas-contracts` (Eve, `repo-renames`), with the host-isolation
merge as its first commit (B17); then 5. `kernel-lowering-scripts`, then
6. `kernel-dotnet-apps`. Split three ways because 282 windows exceed one
spec and one Hands pass; all three land on `thing/wire`.
7. `voidbot-wire` (VoidBot, `kernel-schemas-contracts`), on `thing/wire`.
8. `verse-window` (gamecult-ops, `repo-renames`, `kernel-dotnet-apps`,
`voidbot-wire`; and in its `first`, every held window cut below).
9. `site-prose` (gamecult-site, `repo-renames`, `persona-takedown`): any time
after the rename; the card names the contract, not ids.
10. `kernel-prose` and 11. `ops-prose` (`verse-window`): READMEs and docs
state the new ids once they exist.
12. Doctrine (follow-up `doctrine-in-step`): after the window, Self edits
`F:\Projects\CLAUDE.md` lines 23, 24, 26, 28, 90 and Eureka
`doctrine/CLAUDE.md:186`, citing the Thing README "Naming" section.
Admitted 2026-10-10 as `thing:cut_spec:cut-<label>.r1`, except
`kernel-schemas-contracts`, whose r1 was superseded the same day by `.r2`
(r1 listed edit windows in generator-owned `src/generated/` files).
`context-pack.py` read every anchor of every admitted spec SAME at its base
(kernel specs in this worktree at `8e270d6`; ops, VoidBot and site in detached
worktrees at their pinned heads). Question `compat-ids-reach-wire` names r1 in
`raised_in`, so the blocked-check recipe does not flag r2: a recurrence of
`gap-blocked-check-reads-raised-in-only`; r2 cites the question in `questions`.
Held specs (scratchpad `imagination/specs/<campaign>__<cut>.json`, complete
`cut_spec` values; repo names are post-rename, bases are the pinned heads):
- `thing-family`: `thingunity-wire`, `thingflutter-wire`,
`thingelectron-wire`, `thingtui-wire`, `thingplugins-wire`,
`thingconformance-wire`, `cultlib-wire`, `ymir-wire`. Build-time edges
(E5): any time after the kernel merge.
- `thing-verse`: `odin-wire`, `ghostlight-wire`, `heimdall-wire`,
`muninn-wire`, `mimir-wire`, `gjallar-wire`, `hermodr-wire` (window), and
`bifrost-wire` (blocked target, not window-bound).
- `thing-providers`: `streampixels-wire`, `vili-wire`, `stonks-wire`,
`weksa-wire` (window), `repixelizer-wire`, `sai-wire`, `loki-wire`,
`aquasynth-wire` (not live).
- Brokkr (two lines, not deployed) fits no campaign: follow-up
`brokkr-wire-unhomed`.
### Rationale: why the code rename needs three more campaigns
Campaign `thing` lists Eve, gamecult-site, gamecult-ops and VoidBot, its repo
list cannot grow, and a campaign holds at most 8 repos
(`gap-campaign-repos-fixed`). The rename touches 29 repos. Admitting the other
cuts under the campaigns that already own those repos was rejected: only
Ghostlight (ghostlight-verse, the other Self's area), CultLib (cultlib-gaps,
asura, variants) and Odin-adjacent repos have owners at all, so most repos
would still need a home, and the window's dependencies would be spread over
campaigns whose Selves do not run the window. The chosen shape: the kernel,
VoidBot, ops and site cuts stay in `thing` (where `depends_on` works), and the
Self admits three campaigns after `repo-renames` lands, so their repo lists
carry the new names:
- `thing-family`: GameCult/ThingUnity, ThingFlutter, ThingElectron, ThingTui,
ThingPlugins, ThingConformance, CultLib, Ymir. Title "Thing: the renderer
family and build-time consumers on thing ids". Working branch `thing/wire`.
- `thing-verse`: GameCult/Odin, Ghostlight, Heimdall, Muninn, Mimir, Gjallar,
Hermodr, Bifrost. Title "Thing: the Verse daemons on thing ids".
- `thing-providers`: GameCult/StreamPixels, Vili, Stonks, Weksa, repixelizer,
Sai, Loki, AquaSynth. Title "Thing: the provider daemons on thing ids".
Each takes `thing:target:r2` as its target document (a target per campaign
citing this section: invariants copied from r2, `doc` = this file at the
commit that lands revision 5). Cross-campaign dependencies are prose in
`first`, the workaround the gap names. The Ghostlight cut rides in
`thing-verse`, a campaign disjoint from `ghostlight-verse`; its `first` tells
Hands to rebase at window time and to coordinate with that Self. The kernel
specs name `GameCult/Eve` because `thing` cannot list `GameCult/Thing`; after
cut 3 that name resolves by redirect (model page, campaign repo list row).
### Rationale: why the Verse window and not per-host windows
B16: a provider and Odin disagreeing on the advertisement id is a provider
missing from discovery. Per-host windows would leave whole hosts invisible
between windows, which `rename-whole-per-edge` forbids. One window with Odin
first bounds the gap to the window's length, and lets every derived store be
deleted at the same restart. Window cuts land on `thing/wire` and wait there
for Soul; nothing reaches a default branch outside the window.
### Rationale: `eve-roadmap-remaining-work`
Its items (Android Kotlin and iOS UIKit lowerers to owner repos or retired;
runtimes through Odin's aggregated discovery; a networked CultMesh oracle
sample; surface contract split from iOS; binary sensor framing; live Mimir
presentation snapshots) are all renderer or architecture work, which target r2
puts out of scope ("an id changes, no shape changes"). None belongs in
`thing`'s target. They move unchanged into `docs/thing-migration-roadmap.md`
in `kernel-prose`; the follow-up can be withdrawn by Self with that reason.
### Ruling and target r3 (2026-10-10)
Question `compat-ids-reach-wire` is answered `rebuild` (ruling
`thing:ruling:operator-compat-rebuild`). Target r3 rewords
`rename-whole-per-edge`: no renamed type declares `CompatibleSchemaIds`;
every store holding eve-typed records is deleted and rebuilt by its owning
daemon in the window; a store found to be truth stops its cut as a fork;
conformance packs are re-exported under thing ids and the old packs stay as
dated history. The other r2 invariants carry over unchanged.
Campaigns `thing-family`, `thing-verse` and `thing-providers` are admitted
the same day, before `repo-renames` lands, with post-rename repo names: an
`OrgRepo` is a name, and the renamed repos exist by the time any of their
cuts runs, because each held spec's `first` names `thing` cut `repo-renames`.
Each has its own target r1 carrying r3's invariants and citing this file.
## Revision 6: hold (2026-10-10)
Imagination (`imagination-thing-hold-remap`, session
`self-2026-10-10c-eureka`). Rulings: `thing:ruling:hold-renames-for-thing2`
and `thing:ruling:thing2-one-solver-taffy` (both operator, today), under
`thing:ruling:operator-compat-rebuild`. The task: establish what can land
before a Thing 2.0 map names the surviving repos, without a held cut. Probe
script `p1_idreach.py` is in the Self's scratchpad
`imagination-thing-hold-remap/`. Refs are each local checkout's
`origin/<default>` as last fetched (not refreshed today except Eve and
gamecult-ops); code files only, `docs/`, `*.md` and `dist/` excluded.
**B25. Which repos carry each kernel schema id.** Of the 38 kernel schemas,
5 have no carrier outside the kernel (`asset_catalog`, `entity_soa_view.v1`,
`input_bindings`, `input_capability`, `operation_payload`). 25 ids are
carried only by held repos (the family, CultLib, Sai, repixelizer). Every id
on the live discovery edge E1 (`provider_advertisement`, `surface`,
`surface_state`, `interface_binding`, `command`, `command_receipt`,
`plugin_advertisement`, `plugin_abi*`) has at least one held carrier:
CultLib, and Stonks, Vili or weksa. Only `command_result` (Ghostlight,
Heimdall) and `local_draft` (Ghostlight) are live and touch no held repo.
**B26. CultLib is on the live edge, not only build-time.** `CultLib`
`packages/cultcache-ts/src/swarm-documents.ts:83-99` declares
`gamecult.eve.surface_state.v1` and `gamecult.eve.interface_binding`.
`gamecult-ops/scripts/deploy-heimdall.sh:22-27,108-120` archives
`packages/cultcache-ts` and `cultmesh-ts` from `/srv/build/CultLib` at a
pinned `cultlib_commit` and builds them into Heimdall's release. Heimdall's
spec says as much ("vendored CultLib refreshed after cultlib-wire"). So E5's
"compat, build-time" row is wrong for CultLib: `cultlib-wire` (held,
`thing-family`) is a precondition of `heimdall-wire` and of the window.
**B27. The held providers are live.** `gamecult-ops` `origin/main`
(`9aed01f`) `scripts/idunn/idunn-deployment-targets.ps1` still lists Stonks
(l.49), weksa (l.62) and Vili (l.114) as daemon targets with published
health. StreamPixels runs on Yggdrasil (B15).
**B28. Nothing has landed on a wire branch.** No `origin/thing/wire` exists
in Eve, VoidBot, gamecult-ops, Odin or Ghostlight; the only `thing/*`
branches are the merged persona cuts.
**What follows.** `verse-window` cannot run while any E1 carrier is held, so
every cut whose `first` says "merge inside the Verse window" (the three
kernel cuts, `voidbot-wire`, the eight `thing-verse` cuts) could only sit on
an unmerged `thing/wire` branch, and `kernel-prose` and `ops-prose` depend on
the window. The `thing-verse` cuts are not named by the hold but are held by
it in effect (B26, B27). The subsets that land with no live edge are the five
kernel-only ids and the Android and iOS app ids (E7): they would leave the
kernel in a mixed `eve`/`thing` namespace for as long as the hold lasts, and
are the kinds Thing 2.0's closed render-command list is most likely to
reshape or delete. No wire cut is re-specified; the fork is question
`thing:question:wire-rename-under-thing2`.
One item does not depend on the rename: follow-up
`thing:follow_up:stale-voidbot-ignore-and-exclude` (three `.gitignore`
lines and one `--exclude` in Eve) names a held cut as its owner and can be
fixed on Eve main by itself.