diff --git a/web/fixtures/epiphany-model-atlas-surface.json b/web/fixtures/epiphany-model-atlas-surface.json index cd84872..4a4196d 100644 --- a/web/fixtures/epiphany-model-atlas-surface.json +++ b/web/fixtures/epiphany-model-atlas-surface.json @@ -15,6 +15,7 @@ "defaultView": "attention", "stateAuthority": "gamecult.model.entanglement_projection.v0", "presentationState": "provider-owned-ephemeral", + "domainMutationRoute": "gamecult://swarm/{swarm_id}/workspace/{workspace_id}/epiphany/modeling", "viewOrder": [ "attention", "drilldown", @@ -110,7 +111,7 @@ { "targetProp": "items", "pointerId": "epiphany.model-atlas.attention.items", - "sourceId": "cultmesh://gamecult.swarm/epiphany/modeling/entanglements#attention", + "sourceId": "cultmesh://gamecult-local/asgard/starfire/epiphany/model-atlas/entanglements#attention", "schemaId": "gamecult.model.entanglement_projection.v0", "routeKind": "network", "routeDescription": "CultMesh projection of entanglements currently requiring operator or owner attention." @@ -132,7 +133,7 @@ { "targetProp": "title", "pointerId": "epiphany.model-atlas.selected.title", - "sourceId": "cultmesh://gamecult.swarm/epiphany/modeling/entanglements#selected.title", + "sourceId": "cultmesh://gamecult-local/asgard/starfire/epiphany/model-atlas/entanglements#selected.title", "schemaId": "gamecult.model.entanglement_projection.v0", "routeKind": "network", "routeDescription": "Provider-authored title for the selected entanglement." @@ -149,7 +150,7 @@ { "targetProp": "text", "pointerId": "epiphany.model-atlas.selected.summary", - "sourceId": "cultmesh://gamecult.swarm/epiphany/modeling/entanglements#selected.summary", + "sourceId": "cultmesh://gamecult-local/asgard/starfire/epiphany/model-atlas/entanglements#selected.summary", "schemaId": "gamecult.model.entanglement_projection.v0", "routeKind": "network", "routeDescription": "Provider-authored relationship summary." @@ -168,7 +169,7 @@ { "targetProp": "value", "pointerId": "epiphany.model-atlas.selected.state", - "sourceId": "cultmesh://gamecult.swarm/epiphany/modeling/entanglements#selected.state", + "sourceId": "cultmesh://gamecult-local/asgard/starfire/epiphany/model-atlas/entanglements#selected.state", "schemaId": "gamecult.model.entanglement_projection.v0", "routeKind": "network", "routeDescription": "Derived entanglement state owned by Epiphany Modeling." @@ -204,7 +205,7 @@ { "targetProp": "items", "pointerId": "epiphany.model-atlas.selected.claims", - "sourceId": "cultmesh://gamecult.swarm/epiphany/modeling/entanglements#selected.claims", + "sourceId": "cultmesh://gamecult-local/asgard/starfire/epiphany/model-atlas/entanglements#selected.claims", "schemaId": "gamecult.model.entanglement_projection.v0", "routeKind": "network", "routeDescription": "Endpoint-owned claims retained without merging their authority." @@ -240,7 +241,7 @@ { "targetProp": "items", "pointerId": "epiphany.model-atlas.selected.evidence", - "sourceId": "cultmesh://gamecult.swarm/epiphany/modeling/entanglements#selected.evidence", + "sourceId": "cultmesh://gamecult-local/asgard/starfire/epiphany/model-atlas/entanglements#selected.evidence", "schemaId": "gamecult.model.entanglement_projection.v0", "routeKind": "network", "routeDescription": "Verification evidence projected by Epiphany Modeling." @@ -294,7 +295,7 @@ { "targetProp": "nodes", "pointerId": "epiphany.model-atlas.graph.nodes", - "sourceId": "cultmesh://gamecult.swarm/epiphany/modeling/entanglements#graph.nodes", + "sourceId": "cultmesh://gamecult-local/asgard/starfire/epiphany/model-atlas/entanglements#graph.nodes", "schemaId": "gamecult.model.entanglement_projection.v0", "routeKind": "network", "routeDescription": "Derived repository nodes for graphical lowering." @@ -302,7 +303,7 @@ { "targetProp": "edges", "pointerId": "epiphany.model-atlas.graph.edges", - "sourceId": "cultmesh://gamecult.swarm/epiphany/modeling/entanglements#graph.edges", + "sourceId": "cultmesh://gamecult-local/asgard/starfire/epiphany/model-atlas/entanglements#graph.edges", "schemaId": "gamecult.model.entanglement_projection.v0", "routeKind": "network", "routeDescription": "Derived entanglement edges for graphical lowering." @@ -338,7 +339,7 @@ { "targetProp": "items", "pointerId": "epiphany.model-atlas.graph.linear", - "sourceId": "cultmesh://gamecult.swarm/epiphany/modeling/entanglements#graph.linear", + "sourceId": "cultmesh://gamecult-local/asgard/starfire/epiphany/model-atlas/entanglements#graph.linear", "schemaId": "gamecult.model.entanglement_projection.v0", "routeKind": "network", "routeDescription": "Linear projection of the same graph for compact and TUI lowerings." diff --git a/web/fixtures/epiphany-model-atlas.provider-advertisement.json b/web/fixtures/epiphany-model-atlas.provider-advertisement.json index 16c2721..39d45d3 100644 --- a/web/fixtures/epiphany-model-atlas.provider-advertisement.json +++ b/web/fixtures/epiphany-model-atlas.provider-advertisement.json @@ -1,12 +1,12 @@ { "schema": "gamecult.eve.provider_advertisement.v1", "providerId": "epiphany.model-atlas", - "serviceId": "epiphany.modeling", - "verseId": "gamecult.swarm", - "rootVerse": "gamecult", - "canonicalService": "gamecult.epiphany.modeling", - "locatedService": "gamecult.swarm.epiphany.modeling", - "cultMeshAddress": "cultmesh://gamecult.swarm/epiphany/modeling", + "serviceId": "epiphany.model-entanglement-projector", + "verseId": "gamecult-local", + "rootVerse": "asgard", + "canonicalService": "asgard.epiphany.model-atlas", + "locatedService": "asgard.starfire.epiphany.model-atlas", + "cultMeshAddress": "cultmesh://gamecult-local/asgard/starfire/epiphany/model-atlas", "title": "Epiphany Model Atlas", "kind": "modeling.projection", "updatedAtUtc": "2026-08-14T00:00:00Z", @@ -46,6 +46,7 @@ "gamecult.model.entanglement_projection.v0" ], "ownership": "epiphany-owns-entanglement-projection-eve-renders-one-retained-tree", + "domainMutationRoute": "gamecult://swarm/{swarm_id}/workspace/{workspace_id}/epiphany/modeling", "summary": "Attention-first cross-repo Modeling view with drilldown and a secondary graph from one typed CultMesh projection." } ], diff --git a/web/model-atlas-conformance.test.mjs b/web/model-atlas-conformance.test.mjs index 1ccc4a1..e54f648 100644 --- a/web/model-atlas-conformance.test.mjs +++ b/web/model-atlas-conformance.test.mjs @@ -4,6 +4,8 @@ import test from "node:test"; import { findProviderCatalogEntry, mergeProviderAdvertisement } from "./provider-advertisements.mjs"; const projectionSchema = "gamecult.model.entanglement_projection.v0"; +const projectionSource = "cultmesh://gamecult-local/asgard/starfire/epiphany/model-atlas/entanglements#"; +const domainMutationRoute = "gamecult://swarm/{swarm_id}/workspace/{workspace_id}/epiphany/modeling"; const catalog = readJson("./local-provider-catalog.json"); const advertisement = readJson("./fixtures/epiphany-model-atlas.provider-advertisement.json"); const surface = readJson("./fixtures/epiphany-model-atlas-surface.json"); @@ -27,6 +29,13 @@ test("advertises one canonical Model Atlas surface to GUI and TUI consumers", () const merged = mergeProviderAdvertisement(catalogProvider, advertisement); assert.equal(merged.surfaces.length, 1); + assert.equal(advertisement.providerId, "epiphany.model-atlas"); + assert.equal(advertisement.serviceId, "epiphany.model-entanglement-projector"); + assert.equal(advertisement.verseId, "gamecult-local"); + assert.equal(advertisement.rootVerse, "asgard"); + assert.equal(advertisement.canonicalService, "asgard.epiphany.model-atlas"); + assert.equal(advertisement.locatedService, "asgard.starfire.epiphany.model-atlas"); + assert.equal(advertisement.cultMeshAddress, "cultmesh://gamecult-local/asgard/starfire/epiphany/model-atlas"); assert.equal(merged.surfaces[0].surfaceId, surface.surface.id); assert.equal(merged.surfaces[0].url, "./fixtures/epiphany-model-atlas-surface.json"); assert.deepEqual(merged.surfaces[0].loweringTargets, ["gui", "tui"]); @@ -34,6 +43,8 @@ test("advertises one canonical Model Atlas surface to GUI and TUI consumers", () assert.equal(surface.surface.root.kind, "surface"); assert.equal("nodes" in surface, false); assert.equal("selectedNodeId" in surface, false); + assert.equal(merged.surfaces[0].domainMutationRoute, domainMutationRoute); + assert.equal(surface.surface.root.props.domainMutationRoute, domainMutationRoute); }); test("keeps attention primary while retaining drilldown and a secondary graph", () => { @@ -63,7 +74,7 @@ test("binds every modeled value to the Epiphany-owned CultMesh projection", () = assert.ok(bindings.length >= 9); assert.ok(bindings.every(binding => binding.schemaId === projectionSchema)); - assert.ok(bindings.every(binding => binding.sourceId.startsWith("cultmesh://gamecult.swarm/epiphany/modeling/entanglements#"))); + assert.ok(bindings.every(binding => binding.sourceId.startsWith(projectionSource))); assert.ok(bindings.every(binding => binding.routeKind === "network")); assert.deepEqual( component("epiphany.model-atlas.graph").stateBindings.map(binding => binding.targetProp), @@ -83,6 +94,10 @@ test("limits select and filter operations to provider-owned presentation state", .filter(Boolean); assert.deepEqual([...surfaceCommands.keys()].sort(), [...advertisedCommands.keys()].sort()); + assert.deepEqual([...surfaceCommands.keys()].sort(), [ + "epiphany.model-atlas.presentation.filter", + "epiphany.model-atlas.presentation.select", + ]); assert.deepEqual(controlCommands.sort(), [...surfaceCommands.keys()].sort()); for (const command of [...advertisement.commands, ...surface.commands]) { assert.equal(command.presentationOnly, true);