The previous two commits do not build: Command.cs lacked the using. This one
restores the build.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replaces the false comment that reopening never compares type names with the
end-to-end pin: id, content hash and a member type name moved together are
refused; the same patch without the type name opens.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Under thing2:ruling:payload-bytes-read-only the payload holds a copy made at
construction (wire bytes unchanged). New tests: a T[] argument (including
through Builders.Boxed) is copied; no list of any decoded golden is writable;
a caller's buffer written after construction does not change the payload. The
byte[] exemption in the mutable-collection scan is removed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reopening a single-file store at CultLib b3bd8dd5 does not compare recorded type names (a store
patched in id and Int64 opens and reads), so the test hands ResolvePersistedSchema a persisted
catalog entry with one member type changed (and one with Assets as a List): both are refused,
and the same entry with a moved id and unchanged names resolves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A store whose id still matches the local registry is not compared, so the patched store changes
the id and Int64 together, as a real shape change does. Presence threshold set to the measured
174 required slots. goldens/README.md is the base file plus the nil-vector section (the earlier
commit rewrote its line endings).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
catalog-members.tsv (27 rows) and type-names.txt (168 types) are generated from the C# types on
Yggdrasil at CultLib b3bd8dd5 and read by NameSetTests; the package owns the names, every other
runtime is held to them. NameSetTests also patches System.Int64 to System.Int32 in a store C#
wrote and requires reopen to refuse. Presence and list tests no longer count ThingDomainException
as a door.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The two previous GameCult.Thing.Contract commits do not build: ParamDecl's constructor assigned
InputKind. This restores Kind = Present(kind, "Kind").
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Deleted the 38 + 17 + 3 internal static Instance fields and public static unit-arm properties.
Unit arms are built with new ImageFitContain() and told by a type test; the arm constructors are
public. Builders rewritten (65 uses); UnitArmTests replaces the SameAs assertions: every decoded
unit arm is its arm type, no union base exposes a static member of its own kind, and
new ImageFitFill() still writes 92 02 90.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ThingDomain.Present and Items; every constructor, factory and key builder passes each non-nullable
reference parameter through Present (refusal names the slot, never a value) and each list through
Items (a private read-only copy, nil items refused). Lists are IReadOnlyList on every type.
TextInputNode's slot 2 property and parameter are InputKind, matching Rust input_kind.
Tests: NilPositionTests reads the Rust vector row by row; PresenceTests and ReadOnlyListTests
walk every door by reflection; InputKindNameTests. NameSetTests and the unit-arm rewrite follow.
Unit-arm statics are still present in this commit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blessed with THING_BLESS=1 on Yggdrasil; the sha256 list of every existing golden is identical
before and after (only this file is new), and the compare run passes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rename kind to input_kind at key 2 (the wire is the slot key; no golden byte moves).
nil_positions.rs walks every array element of every value golden, splices nil over it and
records whether the Rust decode door accepts it, into goldens/nil-positions.tsv. The tsv is
blessed by the next commit; this one builds, and its nil test fails until then.
golden_bytes, blessing and goldens_dir move to tests/common so both test files share one path.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Goldens, refusals, store read, keys, domains at every constructor and every door (CultLib
MessagePack, MessagePack Standard, System.Text.Json), factories-only reflection, deepest chain
the 256 bound admits. Goldens are linked from crates/thing-contract/tests/goldens, read only.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
One C# type per Rust type, keys in the crate's slot order. Unions are abstract classes with an
internal constructor and sealed arms; unit arms are shared instances. ThingDomain owns the four
domains and ThingKeys the key grammar. CommandResult is built by four factories only; its
constructor is private. Builds against CultLib b3bd8dd5 through CultLibRoot. Tests follow in the
next commit; this one builds.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Written by the production encode path (THING_BLESS=1, goldens_match). No other golden changed. Builds.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Seq, Version, Count and Segment check their domain in new, and their Deserialize calls new, so the constructors and every decode door hold one rule. Record keys take Segment so they split at the last dot; the asset key prefix is thing:asset_catalog:. result-missing-slot is dropped (CultLib's rule). Goldens are re-blessed in the next commit; this commit's goldens_match fails until then.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Eve is renamed Thing (thing2:ruling:code-home). The opening states Thing 1
stays running for live consumers, Thing 2.0 is built here, and the Thing 1
renderer repos are archived under their Eve names.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
P12-P16 from the imagination-thing2-contract-cut pass: Rust and C#
CultCache encode unions differently and cannot read each other; TS has no
typed codec; nothing live builds from the six family repos; Ghostlight's
deploy pins the Eve origin string; the site carries a generated Thing 1
surface. Cut order step 1 and the discovery row follow the 2026-10-10
rulings.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The .voidbot directory no longer exists in Eve. Remove its three .gitignore
entries and the --exclude=.voidbot tar argument in scripts/stage-to-eve.ps1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Imagination pass imagination-thing2-contract (session self-2026-10-10c-eureka).
docs/thing2-map.md holds body facts P1-P11, the model page, the consumer
contract (closed node set, compositions, one binding path, one command
envelope), the fate of every Thing 1 kind, the authority map and the cut
order by deliverable. docs/research/thing2-contract-forks-prior-art.md holds
the prior art for the forks code-home, thing-script-form,
advertisement-owner and port-cutover.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
Archived byte-identical in gamecult-ops 9aed01f; held by
thing:verdict:cut-persona-takedown.s1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Served ruling thing:ruling:thing2-one-solver-taffy: Thing 1's per-host
layout, Clay, Taffy, Yoga, AccessKit and DOM-mirror practice.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Archived byte-identical in gamecult-ops 9aed01f (artifacts/persona-eve-retired).
Ruling operator-retire-persona. Drops the README pointer to the persona doc.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Imagination pass, session self-thing-2026-10-10. Cut specs are in the
eureka mind under campaign thing; held specs for the Thing* family,
Verse and provider repos await campaigns thing-family, thing-verse and
thing-providers after cut repo-renames lands.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ruling operator-deck-is-a-site-page: the deck leaves the iframe in the
article column and becomes a page of the site, filling the screen below
the existing masthead. Body facts B12 (how the site lays a page out) and
B13 (what Quartz does to raw HTML), the shape (one copy scoped by
.thing-deck, styles and script as linked static files, applet URL kept as
a redirect), the authority map delta, question thing-page-url (top-level
recommended), and the cut spec within PipelineCutSpec bounds.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The fixture is a retired projection Eve keeps for lowering conformance.
Its purpose and the .eve header still said Huginn owns runtime
stewardship and emits the DSL, and splitTarget still pointed at Huginn.
Say what is true and drop splitTarget: the schema types it as an optional
string, so null is invalid and omission is the sanctioned "none", which
is how the other Eve-owned fixtures already spell it.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Huginn is the memory organ and will never own a .cc inspection surface;
generic .cc inspection belongs to CultCache Studio. The fixture stays as
lowering conformance material for Eve's own DSL path, so its ownerRepo is
Eve and its exit criteria no longer wait on a Huginn runtime.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
REC-027: delete scripts/capture-android-screenshot.ps1. EveFlutter's copy
(F:/Projects/EveFlutter/scripts/capture-android-screenshot.ps1) matches
byte-for-byte (sha256 75abf61227a12f760d277a3995b0170e2aac74d362940ba6cb109053aabe0f24,
3774 bytes) and is the only caller found, invoked by
EveFlutter/scripts/capture-android-flutter-parity.ps1:58. Kill-attempt
searches (rg -F "capture-android-screenshot.ps1", excluding
node_modules/.git/obj/bin) came back empty in Eve, EveConformance, EveTui,
EveElectron, EveUnity, and EvePlugins.
REC-106 (partial): delete web/fixtures/fensalir-client-surface.json, an
unused Fensalir fixture. Kill-attempt searches (rg -F
"fensalir-client-surface.json") came back empty in both Eve (re-verifying
the census) and Fensalir.
Not touched in this pass: the stale GameCult.Eve.Surface.0.3.2.nupkg and the
other reproducible ignored/gitignored outputs (artifacts/, bin~/, obj~/,
test obj/, node_modules/) — untracked and out of git's purview, reported to
the coordinator rather than deleted.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The repository was public but carried no license, so default copyright applied
and all rights were reserved. Readers could look at the code and had no right to
run, copy, modify, or self-host it. GitHub's terms grant forking within GitHub
and nothing past that.
This matters now because Erycina is being prepared for founding creators to
self-host, and its intended one-click deployment installs Idunn to bring up
Odin, Heimdall, and Erycina together. Erycina is MIT. A creator accepting that
deploy would otherwise be handed dependencies they have no license to run, which
makes "self-hosted" true only for us.
MIT to match CultLib and VoidBot, and the stated intent for GameCult projects.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>