Skip to main content

@eigeninteractive/testkit

@eigeninteractive/testkit: drive a game's rules through the real kernel without a Worker, a database or a network. Build a table, submit actions as seats, assert on the resulting transitions and per-seat observations.

Interfaces​

ActionCase​

Defined in: server/packages/testkit/src/twin-fixtures.ts:177

A game-action case: exercises schemas, applyAction, and (through expected.observation) computeObservation for the acting seat.

Properties​

action​
action: JsonObject;

Defined in: server/packages/testkit/src/twin-fixtures.ts:188

config​
config: JsonObject;

Defined in: server/packages/testkit/src/twin-fixtures.ts:180

expected​
expected: ExpectedEnvelope & {
observation?: JsonObject;
valid: boolean;
};

Defined in: server/packages/testkit/src/twin-fixtures.ts:189

Type Declaration​
observation?​
observation?: JsonObject;
valid​
valid: boolean;
kind​
kind: "action";

Defined in: server/packages/testkit/src/twin-fixtures.ts:178

name​
name: string;

Defined in: server/packages/testkit/src/twin-fixtures.ts:179

obs?​
obs?: JsonObject;

Defined in: server/packages/testkit/src/twin-fixtures.ts:183

Dart-side observation payload; unused here (defaults to state).

participantCount?​
participantCount?: number;

Defined in: server/packages/testkit/src/twin-fixtures.ts:186

pending​
pending: number[];

Defined in: server/packages/testkit/src/twin-fixtures.ts:184

playerIndex​
playerIndex: number;

Defined in: server/packages/testkit/src/twin-fixtures.ts:185

rngSeed?​
rngSeed?: string;

Defined in: server/packages/testkit/src/twin-fixtures.ts:187

state​
state: JsonObject;

Defined in: server/packages/testkit/src/twin-fixtures.ts:181


BotSeatableCase​

Defined in: server/packages/testkit/src/twin-fixtures.ts:218

A botSeatable predicate case.

Properties​

botConfig​
botConfig: JsonObject;

Defined in: server/packages/testkit/src/twin-fixtures.ts:222

expected​
expected: boolean;

Defined in: server/packages/testkit/src/twin-fixtures.ts:223

gameConfig​
gameConfig: JsonObject;

Defined in: server/packages/testkit/src/twin-fixtures.ts:221

kind​
kind: "botSeatable";

Defined in: server/packages/testkit/src/twin-fixtures.ts:219

name​
name: string;

Defined in: server/packages/testkit/src/twin-fixtures.ts:220


BuildGameContractOptions​

Defined in: server/packages/testkit/src/game-contract.ts:45

Inputs for building a GameContract without writing it.

Extended by​

Properties​

fixturesRoot?​
fixturesRoot?: string | URL;

Defined in: server/packages/testkit/src/game-contract.ts:51

Root containing v<N>/*.json twin fixtures.

game​
game: string;

Defined in: server/packages/testkit/src/game-contract.ts:47

Stable display name used as the generated Dart type prefix.

gameModule​
gameModule: GameModule;

Defined in: server/packages/testkit/src/game-contract.ts:49

Authoritative TypeScript rules registry.


CommitInput​

Defined in: server/packages/kernel/dist/index.d.ts:239

Properties​

game​
game: GameRow;

Defined in: server/packages/kernel/dist/index.d.ts:240

intent​
intent: Intent;

Defined in: server/packages/kernel/dist/index.d.ts:245

now​
now: number;

Defined in: server/packages/kernel/dist/index.d.ts:248

The commit instant (epoch ms), sampled once by the host and never read here.

roster​
roster: Seat[];

Defined in: server/packages/kernel/dist/index.d.ts:244

rules​
rules: GameRules;

Defined in: server/packages/kernel/dist/index.d.ts:251

The version unit for the game's schemaVersion, already resolved by the host from the GameModule.versions map.

staleViews?​
staleViews?: {
current: SeatView | null;
expected: SeatView | null;
};

Defined in: server/packages/kernel/dist/index.d.ts:259

Same-view material for a stale game action: the acting seat's stored frames at expectedVersion and at the current version. Only consulted when intent.expectedVersion < state.version; if absent (or either frame is missing, e.g. compacted away), the stale action is rejected conservatively.

current​
current: SeatView | null;
expected​
expected: SeatView | null;
state​
state: StateRow | null;

Defined in: server/packages/kernel/dist/index.d.ts:243

The latest transition, or null before v0 (only a start intent is meaningful then).


CommitPlan​

Defined in: server/packages/kernel/dist/index.d.ts:305

Properties​

action​
action: TransitionAction | null;

Defined in: server/packages/kernel/dist/index.d.ts:308

effects​
effects: Effect[];

Defined in: server/packages/kernel/dist/index.d.ts:319

frames​
frames: ObservationFrame[];

Defined in: server/packages/kernel/dist/index.d.ts:311

Per-seat projected frames (identified seats only), persisted with the transition, fanned out over sockets. No raw state escapes the kernel.

nextState​
nextState: StateRow;

Defined in: server/packages/kernel/dist/index.d.ts:307

The next transition row, already versioned (v+1, or 0 for start).

outcomes​
outcomes: OutcomeEntry[] | null;

Defined in: server/packages/kernel/dist/index.d.ts:318

Per-seat results when this transition ends the game, else null.

Rating deltas are deliberately NOT here: they depend on global cross-game priors (D1-domain data the kernel must never need). The D1 applier computes them inside the rating CAS via computeRatings (ratings.ts) and the host delivers them as a follow-up versioned ratings transition.


EmitGameContractOptions​

Defined in: server/packages/testkit/src/game-contract.ts:55

Inputs for emitting or checking a GameContract file.

Extends​

Properties​

fixturesRoot?​
fixturesRoot?: string | URL;

Defined in: server/packages/testkit/src/game-contract.ts:51

Root containing v<N>/*.json twin fixtures.

Inherited from​

BuildGameContractOptions.fixturesRoot

game​
game: string;

Defined in: server/packages/testkit/src/game-contract.ts:47

Stable display name used as the generated Dart type prefix.

Inherited from​

BuildGameContractOptions.game

gameModule​
gameModule: GameModule;

Defined in: server/packages/testkit/src/game-contract.ts:49

Authoritative TypeScript rules registry.

Inherited from​

BuildGameContractOptions.gameModule

output​
output: string | URL;

Defined in: server/packages/testkit/src/game-contract.ts:57

Destination game-contract.json path.


ExpectedEnvelope​

Defined in: server/packages/testkit/src/twin-fixtures.ts:169

What a case may assert about the envelope a hook (or a whole transcript) produced. Every field is optional: a fixture pins what it means to pin. outcome is three-valued — absent leaves the outcome unchecked, null asserts the game is ongoing, a list asserts it ended exactly so.

Properties​

outcome?​
outcome?: OutcomeEntry[] | null;

Defined in: server/packages/testkit/src/twin-fixtures.ts:172

pending?​
pending?: number[];

Defined in: server/packages/testkit/src/twin-fixtures.ts:171

state?​
state?: JsonObject;

Defined in: server/packages/testkit/src/twin-fixtures.ts:170


GameContract​

Defined in: server/packages/testkit/src/game-contract.ts:37

Language-neutral schemas and fixtures shared by a game's Worker and app.

Properties​

fixtures​
fixtures: GameContractFixture[];

Defined in: server/packages/testkit/src/game-contract.ts:41

formatVersion​
formatVersion: 1;

Defined in: server/packages/testkit/src/game-contract.ts:38

game​
game: string;

Defined in: server/packages/testkit/src/game-contract.ts:39

versions​
versions: Record<string, GameContractVersion>;

Defined in: server/packages/testkit/src/game-contract.ts:40


GameContractFixture​

Defined in: server/packages/testkit/src/game-contract.ts:19

One validated twin-fixture document embedded in a GameContract.

Properties​

document​
document: unknown;

Defined in: server/packages/testkit/src/game-contract.ts:23

Validated fixture document, retained in its original JSON shape.

path​
path: string;

Defined in: server/packages/testkit/src/game-contract.ts:21

POSIX-style path relative to the supplied fixtures root.


GameContractVersion​

Defined in: server/packages/testkit/src/game-contract.ts:27

The four JSON Schemas emitted for one game schemaVersion.

Properties​

schemas​
schemas: {
action: Record<string, unknown>;
config: Record<string, unknown>;
observation: Record<string, unknown>;
state: Record<string, unknown>;
};

Defined in: server/packages/testkit/src/game-contract.ts:28

action​
action: Record<string, unknown>;
config​
config: Record<string, unknown>;
observation​
observation: Record<string, unknown>;
state​
state: Record<string, unknown>;

GameRow​

Defined in: server/packages/kernel/dist/index.d.ts:174

The game's standing configuration: the DO meta snapshot.

Properties​

budgetSeconds​
budgetSeconds: number | null;

Defined in: server/packages/kernel/dist/index.d.ts:181

config​
config: JsonObject;

Defined in: server/packages/kernel/dist/index.d.ts:179

Stored creation config; parsed against the version unit's config schema before any hook sees it.

incrementSeconds​
incrementSeconds: number | null;

Defined in: server/packages/kernel/dist/index.d.ts:182

rated​
rated: boolean;

Defined in: server/packages/kernel/dist/index.d.ts:183

ratingPool​
ratingPool: string | null;

Defined in: server/packages/kernel/dist/index.d.ts:184

schemaVersion​
schemaVersion: number;

Defined in: server/packages/kernel/dist/index.d.ts:176

status​
status: GameStatus;

Defined in: server/packages/kernel/dist/index.d.ts:175

turnSeconds​
turnSeconds: number | null;

Defined in: server/packages/kernel/dist/index.d.ts:180


InitialStateCase​

Defined in: server/packages/testkit/src/twin-fixtures.ts:228

The opening transition: what initialState returns for one config and seat count, drawing from the version-0 stream a start commit derives.

Properties​

config​
config: JsonObject;

Defined in: server/packages/testkit/src/twin-fixtures.ts:231

expected​
expected: ExpectedEnvelope;

Defined in: server/packages/testkit/src/twin-fixtures.ts:234

kind​
kind: "initialState";

Defined in: server/packages/testkit/src/twin-fixtures.ts:229

name​
name: string;

Defined in: server/packages/testkit/src/twin-fixtures.ts:230

playerCount​
playerCount: number;

Defined in: server/packages/testkit/src/twin-fixtures.ts:232

rngSeed?​
rngSeed?: string;

Defined in: server/packages/testkit/src/twin-fixtures.ts:233


LifecycleCase​

Defined in: server/packages/testkit/src/twin-fixtures.ts:239

An applyLifecycle case: one engine-driven transition (a turn that ran out, a resign, a purged account) resolved against a stated position.

Properties​

config​
config: JsonObject;

Defined in: server/packages/testkit/src/twin-fixtures.ts:242

expected​
expected: ExpectedEnvelope;

Defined in: server/packages/testkit/src/twin-fixtures.ts:251

kind​
kind: "lifecycle";

Defined in: server/packages/testkit/src/twin-fixtures.ts:240

name​
name: string;

Defined in: server/packages/testkit/src/twin-fixtures.ts:241

participantCount?​
participantCount?: number;

Defined in: server/packages/testkit/src/twin-fixtures.ts:249

pending​
pending: number[];

Defined in: server/packages/testkit/src/twin-fixtures.ts:244

playerIndex?​
playerIndex?: number;

Defined in: server/packages/testkit/src/twin-fixtures.ts:248

The forfeiting seat. Required for forfeit/autoForfeit; a timeout carries no seat (its victims are pending), so it must be omitted.

rngSeed?​
rngSeed?: string;

Defined in: server/packages/testkit/src/twin-fixtures.ts:250

state​
state: JsonObject;

Defined in: server/packages/testkit/src/twin-fixtures.ts:243

type​
type: LifecycleType;

Defined in: server/packages/testkit/src/twin-fixtures.ts:245


ObservationFrame​

Defined in: server/packages/kernel/dist/index.d.ts:98

One seat's projected frame, tagged with its seat. The host stamps version/timing when it persists and fans these out.

Properties​

data​
data: JsonObject;

Defined in: server/packages/kernel/dist/index.d.ts:100

pendingPlayers​
pendingPlayers: number[];

Defined in: server/packages/kernel/dist/index.d.ts:101

playerIndex​
playerIndex: number;

Defined in: server/packages/kernel/dist/index.d.ts:99


PlayerLimitsCase​

Defined in: server/packages/testkit/src/twin-fixtures.ts:210

A playerLimits case: the seats one config may be played with.

Properties​

config​
config: JsonObject;

Defined in: server/packages/testkit/src/twin-fixtures.ts:213

expected​
expected: {
maxPlayers: number;
minPlayers: number;
};

Defined in: server/packages/testkit/src/twin-fixtures.ts:214

maxPlayers​
maxPlayers: number;
minPlayers​
minPlayers: number;
kind​
kind: "playerLimits";

Defined in: server/packages/testkit/src/twin-fixtures.ts:211

name​
name: string;

Defined in: server/packages/testkit/src/twin-fixtures.ts:212


RatingPoolCase​

Defined in: server/packages/testkit/src/twin-fixtures.ts:196

A ratingPool predicate case. Omitted timing fields mean null.

Properties​

access​
access: GameAccess;

Defined in: server/packages/testkit/src/twin-fixtures.ts:199

budgetSeconds?​
budgetSeconds?: number | null;

Defined in: server/packages/testkit/src/twin-fixtures.ts:201

config​
config: JsonObject;

Defined in: server/packages/testkit/src/twin-fixtures.ts:205

expected​
expected: string | null;

Defined in: server/packages/testkit/src/twin-fixtures.ts:206

incrementSeconds?​
incrementSeconds?: number | null;

Defined in: server/packages/testkit/src/twin-fixtures.ts:202

kind​
kind: "ratingPool";

Defined in: server/packages/testkit/src/twin-fixtures.ts:197

maxPlayers​
maxPlayers: number;

Defined in: server/packages/testkit/src/twin-fixtures.ts:204

minPlayers​
minPlayers: number;

Defined in: server/packages/testkit/src/twin-fixtures.ts:203

name​
name: string;

Defined in: server/packages/testkit/src/twin-fixtures.ts:198

turnSeconds?​
turnSeconds?: number | null;

Defined in: server/packages/testkit/src/twin-fixtures.ts:200


Rejected​

Defined in: server/packages/kernel/dist/index.d.ts:42

An intent the kernel refused. A value, not a throw: rejections are part of the normal protocol.

Properties​

code​
code: RejectCode;

Defined in: server/packages/kernel/dist/index.d.ts:44

message​
message: string;

Defined in: server/packages/kernel/dist/index.d.ts:45

rejected​
rejected: true;

Defined in: server/packages/kernel/dist/index.d.ts:43


RngCase​

Defined in: server/packages/testkit/src/twin-fixtures.ts:277

Recorded draws from one derived RNG stream. Generated by rngFixtureCase, never hand-written: the values ARE the TypeScript kernel's, and the Dart port has to reproduce them bit for bit.

Properties​

draws​
draws: number[];

Defined in: server/packages/testkit/src/twin-fixtures.ts:285

kind​
kind: "rng";

Defined in: server/packages/testkit/src/twin-fixtures.ts:278

name​
name: string;

Defined in: server/packages/testkit/src/twin-fixtures.ts:279

seat?​
seat?: number;

Defined in: server/packages/testkit/src/twin-fixtures.ts:284

Present ⇒ the bot stream for that seat, keyed "<seed>:bot<seat>".

seed​
seed: string;

Defined in: server/packages/testkit/src/twin-fixtures.ts:280

version​
version: number;

Defined in: server/packages/testkit/src/twin-fixtures.ts:282

The state version the stream belongs to (deriveRng's second arg).


RngFixtureCaseOptions​

Defined in: server/packages/testkit/src/twin-fixtures.ts:980

What stream to record, and how much of it.

Properties​

count​
count: number;

Defined in: server/packages/testkit/src/twin-fixtures.ts:990

How many draws to record (1 to 64).

name​
name: string;

Defined in: server/packages/testkit/src/twin-fixtures.ts:982

The case name, used as the test name on both sides.

seat?​
seat?: number;

Defined in: server/packages/testkit/src/twin-fixtures.ts:988

Record the bot stream for this seat instead of the transition's own.

seed​
seed: string;

Defined in: server/packages/testkit/src/twin-fixtures.ts:984

The game's base seed.

version​
version: number;

Defined in: server/packages/testkit/src/twin-fixtures.ts:986

The state version whose stream to record.


Seat​

Defined in: server/packages/kernel/dist/index.d.ts:188

One seat of the roster. Both ids null ⇒ the account was purged mid-game (the seat plays on as "Deleted User" for display, but can never act).

Properties​

botId​
botId: string | null;

Defined in: server/packages/kernel/dist/index.d.ts:191

playerIndex​
playerIndex: number;

Defined in: server/packages/kernel/dist/index.d.ts:189

type​
type: "bot" | "human";

Defined in: server/packages/kernel/dist/index.d.ts:192

userId​
userId: string | null;

Defined in: server/packages/kernel/dist/index.d.ts:190


SeatView​

Defined in: server/packages/kernel/dist/index.d.ts:82

A seat's stored projection at one version: what the same-view compare runs on (and what the DO persists per transition as frames[]).

Properties​

data​
data: JsonObject;

Defined in: server/packages/kernel/dist/index.d.ts:83

pendingPlayers​
pendingPlayers: number[];

Defined in: server/packages/kernel/dist/index.d.ts:84


StateRow​

Defined in: server/packages/kernel/dist/index.d.ts:196

The latest committed transition: state plus the engine-owned clocks. All instants are epoch milliseconds.

Properties​

deadline​
deadline: number | null;

Defined in: server/packages/kernel/dist/index.d.ts:203

The true turn deadline shown to clients; the alarm arms one millisecond after deadline + grace.

pending​
pending: number[];

Defined in: server/packages/kernel/dist/index.d.ts:199

playerTimes​
playerTimes: number[] | null;

Defined in: server/packages/kernel/dist/index.d.ts:205

Per-seat budget banks (ms), budget mode only.

rngSeed​
rngSeed: string;

Defined in: server/packages/kernel/dist/index.d.ts:200

state​
state: JsonObject;

Defined in: server/packages/kernel/dist/index.d.ts:198

turnStartedAt​
turnStartedAt: number | null;

Defined in: server/packages/kernel/dist/index.d.ts:209

When the current turn is consuming a budget bank. Null for untimed, per-action, and hook-override turns. This is persisted so charging the turn that ends never depends on the next envelope.

version​
version: number;

Defined in: server/packages/kernel/dist/index.d.ts:197


TranscriptCase​

Defined in: server/packages/testkit/src/twin-fixtures.ts:260

A whole match, replayed through the real kernel from a stated base seed. The one case that pins the engine's bookkeeping — versions, pending hand-off, the per-transition RNG streams — rather than a single hook.

Properties​

config​
config: JsonObject;

Defined in: server/packages/testkit/src/twin-fixtures.ts:263

expected​
expected: ExpectedEnvelope & {
status: "active" | "finished";
version: number;
};

Defined in: server/packages/testkit/src/twin-fixtures.ts:268

Type Declaration​
status​
status: "active" | "finished";
version​
version: number;
kind​
kind: "transcript";

Defined in: server/packages/testkit/src/twin-fixtures.ts:261

name​
name: string;

Defined in: server/packages/testkit/src/twin-fixtures.ts:262

playerCount​
playerCount: number;

Defined in: server/packages/testkit/src/twin-fixtures.ts:264

seed​
seed: string;

Defined in: server/packages/testkit/src/twin-fixtures.ts:266

The game's base RNG seed: every transition's stream derives from it.

transitions​
transitions: TranscriptTransition[];

Defined in: server/packages/testkit/src/twin-fixtures.ts:267


TwinFixtureFile​

Defined in: server/packages/testkit/src/twin-fixtures.ts:160

One fixture file: cases targeting one schemaVersion unit.

Properties​

cases​
cases: TwinFixtureCase[];

Defined in: server/packages/testkit/src/twin-fixtures.ts:162

schemaVersion​
schemaVersion: number;

Defined in: server/packages/testkit/src/twin-fixtures.ts:161

Type Aliases​

Effect​

type Effect =
| {
botId: string;
kind: "wakeBot";
seat: number;
}
| {
kind: "notifyTurn";
seat: number;
userId: string;
}
| {
kind: "notifyFinished";
userIds: string[];
};

Defined in: server/packages/kernel/dist/index.d.ts:293

A push/wake the host should attempt post-commit (single attempt + error log, with no retry machinery in v1). The kernel names seats; the host resolves delivery (FCM targets, bot webhook vs local bot).


Intent​

type Intent =
| {
kind: "start";
seed: string;
}
| {
actor: "user" | "bot";
data: unknown;
expectedVersion: number;
kind: "action";
seat: number;
}
| {
kind: "lifecycle";
type: "timeout";
}
| {
kind: "lifecycle";
seat: number;
type: "forfeit" | "autoForfeit";
};

Defined in: server/packages/kernel/dist/index.d.ts:213

What the host asks the kernel to do: the kernel-facing half of a Command (authorization already happened at the edge; dedupe at the DO).

Union Members​

Type Literal​
{
kind: "start";
seed: string;
}
kind​
kind: "start";
seed​
seed: string;

The game's base RNG seed, freshly generated by the host (randomSeed()); stored on v0 and copied to every later row.


Type Literal​
{
actor: "user" | "bot";
data: unknown;
expectedVersion: number;
kind: "action";
seat: number;
}
actor​
actor: "user" | "bot";
data​
data: unknown;

The raw move payload, parsed against the unit's action schema.

expectedVersion​
expectedVersion: number;

The version the client computed the move against. Equal to the current version in the common case; a lower value is arbitrated by the same-view rule.

kind​
kind: "action";
seat​
seat: number;

Type Literal​
{
kind: "lifecycle";
type: "timeout";
}

Type Literal​
{
kind: "lifecycle";
seat: number;
type: "forfeit" | "autoForfeit";
}

forfeit = a voluntary resign (a user action); autoForfeit = the engine-driven variant (account purge; identity-less system action).


RejectCode​

type RejectCode =
| "notActive"
| "notReady"
| "expired"
| "notPending"
| "stateUpdated"
| "invalidPayload"
| "illegalMove"
| "abstain";

Defined in: server/packages/kernel/dist/index.d.ts:21

Why an intent was refused. Stable machine codes: the host's transport mapping and the client's retry policy key on these, so treat renames as breaking.


TranscriptTransition​

type TranscriptTransition =
| {
data: JsonObject;
kind: "game";
playerIndex: number;
}
| {
kind: "lifecycle";
playerIndex: number;
type: "forfeit";
};

Defined in: server/packages/testkit/src/twin-fixtures.ts:255

One transition of a TranscriptCase: a seat's move, or a resign.


TwinFixtureCase​

type TwinFixtureCase =
| ActionCase
| PlayerLimitsCase
| RatingPoolCase
| BotSeatableCase
| InitialStateCase
| LifecycleCase
| TranscriptCase
| RngCase;

Defined in: server/packages/testkit/src/twin-fixtures.ts:288

Variables​

GAME_CONTRACT_FORMAT_VERSION​

const GAME_CONTRACT_FORMAT_VERSION: 1 = 1;

Defined in: server/packages/testkit/src/game-contract.ts:16

Current format of the language-neutral contract consumed by EigenInteractive's Dart generator.

Functions​

buildGameContract()​

function buildGameContract(options): GameContract;

Defined in: server/packages/testkit/src/game-contract.ts:150

Build a deterministic in-memory contract without touching the filesystem.

Parameters​

ParameterType
optionsBuildGameContractOptions

Returns​

GameContract


checkConfiguredGameContract()​

function checkConfiguredGameContract(root?): Promise<void>;

Defined in: server/packages/testkit/src/contract-command.ts:76

Fails when the conventionally configured contract is absent or stale.

Use this in CI through eigen-contract --check.

Parameters​

ParameterType
root?any

Returns​

Promise<void>


checkGameContract()​

function checkGameContract(options): void;

Defined in: server/packages/testkit/src/game-contract.ts:194

Fail when an emitted contract is missing or differs from its inputs.

Parameters​

ParameterType
optionsEmitGameContractOptions

Returns​

void


commit()​

function commit(input): CommitPlan | Rejected;

Defined in: server/packages/kernel/dist/index.d.ts:323

Parameters​

ParameterType
inputCommitInput

Returns​

CommitPlan | Rejected


deepEquals()​

function deepEquals(a, b): boolean;

Defined in: server/packages/testkit/src/twin-fixtures.ts:1079

Structural JSON equality. Object keys with undefined values count as absent (matching how schema libraries model optional fields); array order matters.

Parameters​

ParameterType
aJson | undefined
bJson | undefined

Returns​

boolean


deriveRng()​

function deriveRng(seed, version): Rng;

Defined in: server/packages/kernel/dist/index.d.ts:334

The deterministic RNG for one transition: rand-seed's sfc32 keyed by the game's base seed and the state version the envelope will commit as. The same (seed, version) always yields the same draw sequence, so a replay re-derives it, and every transition gets an independent stream, so hooks draw as many values as they need with no cross-invocation state. The derivation is fixed, so recorded games stay replayable.

Parameters​

ParameterType
seedstring
versionnumber

Returns​

Rng


emitConfiguredGameContract()​

function emitConfiguredGameContract(root?): Promise<void>;

Defined in: server/packages/testkit/src/contract-command.ts:67

Emits game-contract.json from an EigenInteractive package's conventional layout.

This is the programmatic form of the eigen-contract executable. Most games should invoke the executable through their package script.

Parameters​

ParameterType
root?any

Returns​

Promise<void>


emitGameContract()​

function emitGameContract(options): void;

Defined in: server/packages/testkit/src/game-contract.ts:188

Emit one deterministic, newline-terminated game-contract.json.

Parameters​

ParameterType
optionsEmitGameContractOptions

Returns​

void


evaluateTwinCase()​

function evaluateTwinCase(
rules,
kase,
schemaVersion?
): string[];

Defined in: server/packages/testkit/src/twin-fixtures.ts:596

Run one fixture case against a rules unit, returning failure descriptions (empty ⇒ the case passes). Pure; the file-reading test registrar is twinFixtureTests.

schemaVersion is the version the case targets. It never selects behavior — the caller already resolved rules from it — and only labels the engine guard messages a lifecycle or transcript case can provoke; twinFixtureTests passes the fixture file's.

Parameters​

ParameterTypeDefault value
rulesGameRulesundefined
kaseTwinFixtureCaseundefined
schemaVersion?number1

Returns​

string[]


gameContractFilename()​

function gameContractFilename(game): string;

Defined in: server/packages/testkit/src/game-contract.ts:202

A useful default filename for scripts that accept an output directory.

Parameters​

ParameterType
gamestring

Returns​

string


gameContractJson()​

function gameContractJson(options): string;

Defined in: server/packages/testkit/src/game-contract.ts:183

Render one deterministic, newline-terminated contract document.

Parameters​

ParameterType
optionsBuildGameContractOptions

Returns​

string


isRejected()​

function isRejected(result): result is Rejected;

Defined in: server/packages/kernel/dist/index.d.ts:322

Type guard: did commit() refuse the intent?

Parameters​

ParameterType
resultCommitPlan | Rejected

Returns​

result is Rejected


parseTwinFixtureFile()​

function parseTwinFixtureFile(path, json): TwinFixtureFile;

Defined in: server/packages/testkit/src/twin-fixtures.ts:554

Validate one fixture file's parsed JSON, or throw naming the offending file, case, and field. Exported so a repo can lint its fixtures without running them.

Parameters​

ParameterType
pathstring
jsonunknown

Returns​

TwinFixtureFile


projectView()​

function projectView(rules, args): SeatView;

Defined in: server/packages/testkit/src/kernel-scenarios.ts:39

Project one seat's view of a state: the stored-frame shape the same-view rule compares (commit()'s staleViews input). Convenience for scenario tests that replay a simultaneous-move race.

Parameters​

ParameterTypeDescription
rulesGameRules-
args{ cause?: TransitionCause; config: JsonObject; isReplay?: boolean; participantCount?: number; pending: number[]; seat: number | null; state: JsonObject; }-
args.cause?TransitionCause-
args.configJsonObject-
args.isReplay?boolean-
args.participantCount?number-
args.pendingnumber[]-
args.seatnumber | nullThe seat to project for, or null for a viewer.
args.stateJsonObject-

Returns​

SeatView


randomSeed()​

function randomSeed(): string;

Defined in: server/packages/kernel/dist/index.d.ts:327

A fresh base seed for a new game: 128 random bits, hex-encoded. Stored on the game's v0 state row and copied onto every later row (server-only, never expose it: the whole randomness of the game is derivable from it).

Returns​

string


rngFixtureCase()​

function rngFixtureCase(options): RngCase;

Defined in: server/packages/testkit/src/twin-fixtures.ts:994

Record one derived stream from the real kernel as a fixture case.

Parameters​

ParameterType
optionsRngFixtureCaseOptions

Returns​

RngCase


twinFixtureTests()​

function twinFixtureTests(gameModule, fixturesRoot): void;

Defined in: server/packages/testkit/src/twin-fixtures.ts:622

Register one vitest test per fixture case found under fixturesRoot (layout: <root>/v<N>/*.json). Call at the top level of a test module running in a Node environment.

Parameters​

ParameterType
gameModuleGameModule
fixturesRootstring | URL

Returns​

void


writeRngFixture()​

function writeRngFixture(path, cases): void;

Defined in: server/packages/testkit/src/twin-fixtures.ts:1031

Write a fixture file of generated rng cases.

The schemaVersion is read from the v<N>/ directory in path, the same rule eigen-contract enforces over every fixture file, so the two can never be written out of agreement. The document is validated before it is written: a generator that emits something the runners would refuse to load should fail at the generator.

The output is plain two-space JSON. Only the values mean anything to either runner, so a repo that formats JSON should run its formatter afterwards.

import { rngFixtureCase, writeRngFixture } from "@eigeninteractive/testkit";

writeRngFixture("src/module/fixtures/v1/rng.json", [
rngFixtureCase({ name: "version 0", seed: "twin-fixtures", version: 0, count: 16 }),
rngFixtureCase({ name: "seat 1's bot stream", seed: "twin-fixtures", version: 3, seat: 1, count: 16 }),
]);

Parameters​

ParameterType
pathstring
casesRngCase[]

Returns​

void

References​

DEADLINE_GRACE_MS​

Re-exports DEADLINE_GRACE_MS