Make the Eve onboarding checkpoint run against the contract that exists
The portability workflow has been red since 2026-08-22. Three things,
each hidden behind the one before it:
- Eve started refusing to build a command intent for a surface that has
not advertised a command boundary and receipt schema (Eve 4338a42,
2026-08-22). The two-runtime sample never advertised one. It now passes
a provider advertisement with worldInteraction for its surface, which is
the declaration the lowering was right to demand.
- The sample and the package-closure script still imported "cultcache-ts";
the package became @gamecult/cultcache-ts on 2026-09-04 (8cb3b72) and
CI never got far enough to say so. Two READMEs carried the same import.
- The job pinned Eve to codex/eve-browser-host-isolation, a branch that was
never merged and stopped moving on 2026-08-25. The sample is written
against Eve main and passes there; the pin now says so.
The interop workflow's Python step ran one test file by path; it now
discovers the three split suites.
scripts/verify-eve-two-runtime-sample.ps1 -EveRoot F:\Projects\Eve
(Eve main ccc3ffe) -> browserCount 1, headlessCount 1, restartCount 1
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
6d98b03471
commit
830a5d718f
6 changed files with 25 additions and 7 deletions
4
.github/workflows/cultmesh-portability.yml
vendored
4
.github/workflows/cultmesh-portability.yml
vendored
|
|
@ -28,7 +28,9 @@ jobs:
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
repository: GameCult/Eve
|
repository: GameCult/Eve
|
||||||
ref: ${{ vars.EVE_INTEGRATION_REF || 'codex/eve-browser-host-isolation' }}
|
# Eve main is the contract this sample is written against; the codex
|
||||||
|
# branch this used to pin was never merged and stopped on 2026-08-25.
|
||||||
|
ref: ${{ vars.EVE_INTEGRATION_REF || 'main' }}
|
||||||
path: Eve
|
path: Eve
|
||||||
|
|
||||||
- name: Set up .NET
|
- name: Set up .NET
|
||||||
|
|
|
||||||
5
.github/workflows/cultnet-interop.yml
vendored
5
.github/workflows/cultnet-interop.yml
vendored
|
|
@ -87,7 +87,10 @@ jobs:
|
||||||
run: npm test --workspace packages/cultnet-ts
|
run: npm test --workspace packages/cultnet-ts
|
||||||
|
|
||||||
- name: Verify Python RUDP reliability
|
- name: Verify Python RUDP reliability
|
||||||
run: python -m unittest packages/cultcache-py/tests/test_cultcache.py
|
run: |
|
||||||
|
python -m unittest discover -s packages/cultcache-py/tests
|
||||||
|
python -m unittest discover -s packages/cultnet-py/tests
|
||||||
|
python -m unittest discover -s packages/cultmesh-py/tests
|
||||||
|
|
||||||
- name: Verify Rust RUDP reliability
|
- name: Verify Rust RUDP reliability
|
||||||
run: cargo test --manifest-path packages/cultnet-rs/Cargo.toml rudp
|
run: cargo test --manifest-path packages/cultnet-rs/Cargo.toml rudp
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ import {
|
||||||
SingleFileMessagePackBackingStore,
|
SingleFileMessagePackBackingStore,
|
||||||
defineDocumentRegistry,
|
defineDocumentRegistry,
|
||||||
defineDocumentType,
|
defineDocumentType,
|
||||||
} from "cultcache-ts";
|
} from "@gamecult/cultcache-ts";
|
||||||
|
|
||||||
const itemDocument = defineDocumentType({
|
const itemDocument = defineDocumentType({
|
||||||
type: "item",
|
type: "item",
|
||||||
|
|
|
||||||
|
|
@ -195,7 +195,7 @@ the helper path.
|
||||||
## Quick Example
|
## Quick Example
|
||||||
|
|
||||||
```ts
|
```ts
|
||||||
import { CultCache, defineDocumentType } from "cultcache-ts";
|
import { CultCache, defineDocumentType } from "@gamecult/cultcache-ts";
|
||||||
import {
|
import {
|
||||||
CultNetDocumentRegistry,
|
CultNetDocumentRegistry,
|
||||||
createTcpFramedCultNetPeer,
|
createTcpFramedCultNetPeer,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import { tmpdir } from "node:os";
|
||||||
import { join } from "node:path";
|
import { join } from "node:path";
|
||||||
import { JSDOM } from "jsdom";
|
import { JSDOM } from "jsdom";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import { defineDocumentType } from "cultcache-ts";
|
import { defineDocumentType } from "@gamecult/cultcache-ts";
|
||||||
import { CultMesh } from "cultmesh-ts";
|
import { CultMesh } from "cultmesh-ts";
|
||||||
import {
|
import {
|
||||||
parseEveCommandReceipt,
|
parseEveCommandReceipt,
|
||||||
|
|
@ -172,6 +172,19 @@ let browserReceipt;
|
||||||
renderEveSurface(await node.document(surfaceDocument, surfaceId).latest(), host, {
|
renderEveSurface(await node.document(surfaceDocument, surfaceId).latest(), host, {
|
||||||
activeSurfaceId: surfaceId,
|
activeSurfaceId: surfaceId,
|
||||||
clientId: "browser-client",
|
clientId: "browser-client",
|
||||||
|
// Eve refuses to build a command intent for a surface that has not
|
||||||
|
// advertised where its commands go and what comes back. The provider
|
||||||
|
// advertisement is that declaration; a lowering cannot infer it.
|
||||||
|
provider: {
|
||||||
|
providerId,
|
||||||
|
surfaces: [{
|
||||||
|
surfaceId,
|
||||||
|
worldInteraction: {
|
||||||
|
commandBoundary: "sample.counter.commands",
|
||||||
|
receiptSchema: "gamecult.eve.command_receipt.v1",
|
||||||
|
},
|
||||||
|
}],
|
||||||
|
},
|
||||||
commandSink: async intent => {
|
commandSink: async intent => {
|
||||||
browserReceipt = await increment.bind(browserVerse).invoke(intent.payload, {
|
browserReceipt = await increment.bind(browserVerse).invoke(intent.payload, {
|
||||||
idempotencyKey: "browser-click-1",
|
idempotencyKey: "browser-click-1",
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ try {
|
||||||
|
|
||||||
writeFileSync(join(consumerRoot, "runtime-smoke.cjs"), `
|
writeFileSync(join(consumerRoot, "runtime-smoke.cjs"), `
|
||||||
const assert = require("node:assert/strict");
|
const assert = require("node:assert/strict");
|
||||||
const cache = require("cultcache-ts");
|
const cache = require("@gamecult/cultcache-ts");
|
||||||
const net = require("cultnet-ts");
|
const net = require("cultnet-ts");
|
||||||
const mesh = require("cultmesh-ts");
|
const mesh = require("cultmesh-ts");
|
||||||
assert.equal(typeof cache.defineDocumentType, "function");
|
assert.equal(typeof cache.defineDocumentType, "function");
|
||||||
|
|
@ -81,7 +81,7 @@ assert.equal("putDocument" in CultMeshBrowserClient.prototype, false);
|
||||||
execFileSync(process.execPath, ["browser-runtime-smoke.mjs"], { cwd: consumerRoot, stdio: "inherit" });
|
execFileSync(process.execPath, ["browser-runtime-smoke.mjs"], { cwd: consumerRoot, stdio: "inherit" });
|
||||||
|
|
||||||
writeFileSync(join(consumerRoot, "types-smoke.ts"), `
|
writeFileSync(join(consumerRoot, "types-smoke.ts"), `
|
||||||
import { defineDocumentType } from "cultcache-ts";
|
import { defineDocumentType } from "@gamecult/cultcache-ts";
|
||||||
import { CultNetPeer } from "cultnet-ts";
|
import { CultNetPeer } from "cultnet-ts";
|
||||||
import {
|
import {
|
||||||
CultMesh,
|
CultMesh,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue