# Thing 2.0 map Campaign `thing2` in the eureka mind. Imagination pass `imagination-thing2-contract`, session `self-2026-10-10c-eureka`, 2026-10-10. Target `thing2:target:r1` (`docs/thing2-target.md`). Rulings in force and cited by id: `thing:ruling:thing2-one-solver-taffy`, `thing:ruling:thing2-thing-owns-text`, `thing:ruling:wire-rename-freeze-fold`, `thing:ruling:operator-compat-rebuild`, `thing:ruling:hold-renames-for-thing2`, `thing:ruling:operator-dsl-thing-script`, `thing:ruling:operator-member-names-keep`, `thing:ruling:operator-aetheria-eve-rename`. This page holds body facts, the model page, the consumer contract at the level consumers need, the cut order at the level of deliverables, and rationale. The questions it raises are documents in the mind (`thing2:question:*`); it does not restate their options. Research for the forks: `docs/research/thing2-contract-forks-prior-art.md`. Evidence it builds on: `docs/research/thing2-consumer-census.md` (census, cited as C§n, BD1-BD9), `docs/research/thing2-foundation-prior-art.md`, `docs/research/thing2-text-input-a11y-prior-art.md`, and `docs/thing-campaign.md` (rename table T, edges E1-E7, body facts B1-B28). ## Body facts Probes run 2026-10-10 against `origin/` after `git fetch` unless a local path is named. Scripts are in the session scratchpad `imagination-thing2-contract/`. **P1. The Thing 1 contract is 38 schemas, most of them process machinery.** `p1_schemas.py` over Eve `schemas/` at `a758787`: 38 files. Eleven describe conformance, hand-off, split-target, release, capture and witness bookkeeping (`conformance_*`, `*_handoff`, `runtime_*`, `capability_matrix`, `provider_scenario`); five describe one renderer's output (`unity_*`, `electron_shell_projection`, `web_layout_probe`, `tui_grid`); seven describe the plugin system (`plugin*`). Every schema but `command_invocation`, `command_result`, `entity_soa_view`, `input_*` and `asset_catalog` sets `additionalProperties: true`. **P2. Commands travel in four overlapping envelopes, and the result is hand-built JSON.** `command.v1` (descriptor, open), `command_invocation.v1` (closed), `command_receipt.v1` (open, `state` enum `accepted|denied|pending|reconciled`) and `command_result.v1` (closed: exactly `schema, receipt, transientProjection, pluginPayload, draftDirective`). Ghostlight `crates/ghostlight-dungeon/src/eve.rs` at `327cbe3`: `validate_invocation` (`:665-700`) re-checks the envelope by string comparison; `command_result` (`:734-`) takes `state: &str` and builds the receipt with `json!`; its own log filter names a state `"completed"` that the receipt enum does not admit (`:746`). Today it passes only `accepted` and `denied` (tally of call sites). The browser rejects a flat result whole through `ajv` (`web/package.json` depends on `ajv`; `eve.rs:723-731` comment). Nothing but convention stands between a provider and a result the viewer refuses. **P3. One surface kind has two schemas and is stored as an untyped blob.** `surface.v1` declares `type: const "surface-state"`; `surface_state.v1` exists only as code: CultLib `packages/cultcache-ts/src/swarm-documents.ts:82-96` (members `providerId, title, version, updatedAt, surface: object`) and Odin `crates/odin-core/src/documents.rs` (`EveSurfaceStateRecord { surface: Value }`; advertisement and interface binding are `{ value: Value }`). The load-bearing shape is JSON inside CultCache. **P4. `interface_binding.v1` is not a binding.** weksa `scripts/weksa-daemon.mjs:321-341` writes routes (`endpoints`, `routes`, `cultMeshAddress`) and the whole operator surface into it; its document type parses anything (`schema: { parse: (value) => value }`, `:418`). It is a third copy of the advertisement's routes and the surface. **P5. The text DSL lets the renderer write state.** `web/eve-dsl.js:103-155`: `var`, `collection`, `derive` (`count`, `latest`) live in a renderer-local mesh, and `applyAction` appends or sets values there on a button press (`web/fixtures/reactive-composition.eve`: `button "Append Event" append swarm.events ...`). **P6. A domain-looking kind is layout plus a server-side command.** Muninn `crates/sleipnir-daemon/src/main.rs:1374-1415`: `binding.target` is a labelled target with `x, y, anchorX, anchorY` over a controller image; "listening" is the daemon's `pending_learn` state. Absolute positioning (Taffy `position: absolute` with insets), a button and a bound label compose it. **P7. Login needs a host effect, not a plugin payload.** Ghostlight `web/src/heimdall-access-adapter.ts:48-66`: a `pluginPayload` of schema `heimdall.auth_navigation_receipt.v1` makes the client call `window.location.assign(url)`; on return it reads the URL and resumes (`:82`, `:134`). **P8. Two live viewers render surfaces.** Ghostlight's web client vendors `@gamecult/eve-browser-lowering` and `eve-contracts` from `vendor/eve` (`web/package.json`). gamecult-ops `scripts/idunn/idunn-deployment-targets.ps1:262-272` at `9aed01f`: `nightwing-eve-browser-reference`, `Repo = "Eve"`, `Status = "runtime-enforced"`, `Deploy = $null`. Odin aggregates and renders nothing. **P9. CultCache-rs members are serde types.** CultLib `packages/cultcache-rs/src/lib.rs:5501-5520`: a `DatabaseEntry` whose member is a struct holding an enum round-trips through the MessagePack store. Whether the TS, C# and Python CultCache runtimes decode a recursive tagged union written by Rust with parity was not established in this pass. It is the first thing the contract cut proves (see the cut order). **P10. The stale `.voidbot` lines are still on Eve main.** `a758787`: `.gitignore:28-30` and `scripts/stage-to-eve.ps1:24` (`--exclude=.voidbot`). `git grep -n '\.voidbot' -- .gitignore scripts` prints exactly those four lines; `Sources/EVEViewController.mm` mentions `voidbot.swarm` (no dot) and is not matched. **P11. The campaign's repo list has room for the early cuts only.** Mind, `thing2:campaign:self`: repos `GameCult/Eve`, `GameCult/gamecult-ops`. `eureka-substrate:cut_spec:cut-campaign-repos.r1` (target-revision repo sets, up to 16) is in force with no report; both its questions are answered (`eureka-substrate:ruling:campaign-repo-set-home`, `:campaign-repo-removal`). ## The model page Every persistent kind Thing 2.0 has. Ids follow rename table T: schema `gamecult.thing..v`, mesh key `thing::`. No row keeps a compatible eve id (`operator-compat-rebuild`). | Kind | What names it | What happens to it over time | Who decides (one writer) | | --- | --- | --- | --- | | Thing Script document (a published surface) | schema `gamecult.thing.surface.v1`; key `thing:surface:.