Egbe Companions · Features

Egbe Studio & Live Service

A focused page within the Egbe Companions Features documentation. The full map and every sibling page live in the Features hub.

5sections13 minread2diagrams

On this page

Every agent a steward meets in Orun was authored before it was alive, and is reachable after launch only because something keeps programming the world on a schedule. Egbe Studio is the authoring environment for that "before": the internal-and-creator tool that produces agent dossiers, the grounds they live in, and the Wilds scenario seeds the foundry expands into populations. The live service is that "after": the seasons, Commons festivals, and cross-game Aye campaigns that keep Orun fresh without a client patch. The two are one pipeline read end to end, which is why this page covers them together — a scenario authored in the Studio is the same artifact a season rotation publishes as a signed seed manifest weeks later.

This page carries the burden of proof the V3 Lilith Studio creator suite established for Oshun authoring tools: not "is the content good?" but "who authored what, was it governed, and is the thing the world runs provably the thing the author shipped, with its provenance attached?" Egbe Studio answers that with a hard web-vs-UE authoring split, a real generation core it composes rather than re-implements, and a provenance envelope on every artifact. It is the product-feature companion to the engine map in ../architecture/architecture-topology-and-layout.md; its live-service moments lean on the shared-world substrate in ./meta-hub-and-commons.md and ship through the release machinery in ./cross-platform-rollout-and-launch.md. For the full feature scope this slots into, start at the hub: ../V6_features.md.

What ships, honestly#

The split between real code and named seam is sharp here, and stating it up front keeps the rest of the page honest.

  • The generation core is real and is the strongest code on this page. @oshun/isis-agent-gen (libs/v6/isis-agent-gen/src/index.ts, 1,442 lines, 9 spec cases) is the Ninhursag foundry: it expands an authored premise into a fully-grounded Ori seed with a deterministic trait vector, runs Isis governance refusals, models a 21-day rearing period with measurable value shift, and routes human-creator royalties through Aje. This is domain-specific math, not CRUD.
  • Egbe Studio is real glue over that core, not a second generator. @oshun/egbe-studio (libs/v6/egbe-studio/src/index.ts, 3,011 lines, 19 spec cases, project.json tags ["scope:v6", "layer:studio", "type:lib"]) is the authoring-state layer: it builds drafts, validates them, calls isis-agent-gen to generate, assembles provenance, and mints publish/promote/seed receipts. Its descriptor declares authority 'studio' and 13 capabilities. It depends on exactly one workspace package — @oshun/isis-agent-gen — which is the whole architecture in one line.
  • The surfaces exist. The web workspace is a real Next.js section at apps/oshun/web/src/app/egbe-studio/ (AgentDossierEditor.tsx, GroundDistrictAuthoring.tsx, ScenarioAuthoring.tsx, ProvenanceInspector.tsx, each importing from @oshun/egbe-studio, each with a .test.tsx); the operator console is apps/oshun/admin/src/app/egbe/page.tsx. The UE authoring side is the V6Editor module's three real commandlets.
  • Live-service programming is on disk as signed descriptors. V6/live-service/ holds three Isis-signed JSON files — a season rotation, a Commons festival schedule, and an Aye campaign-window set — each naming a real run surface in Rust or TypeScript.
  • The honest seams, named. The dossier editor's avatar viewport preview and the ground editor's Niagara ambience are product spec, not code — the lib carries an appearanceDirection string and an appearanceSeed ref, not a renderer. The provenance bundles are minted deterministically (refs, policy lists, FNV-1a content hashes) and declare signatureAlgorithm: 'isis-ed25519-v1', but the real ed25519 signature over bytes is delegated to the Isis substrate — the lib carries the envelope and the ref, not the private key. And binding a signed ground manifest to the actual .umap the commandlet authors is a documented seam, covered below.

The creation tools — Egbe Studio#

The authoring split and the one dependency#

Egbe Studio inherits the Oshun authoring doctrine: data is authored on the web; art and spatial layout are authored in UE Editor. Agent dossiers, scenarios, and provenance are web forms; grounds and districts run through the V6Editor commandlets. The 13 capabilities on the studio descriptor map onto those two halves plus the operator console it feeds: agent-dossier-editor, district-authoring, scenario-authoring, and minor-protection-scenario-gate on the authoring side; foundry-generation-queue-inspector, foundry-governing-check-review, commons-moderation-console, incarnation-governance-console, capacity-dashboard, takedown-executor, and audited-operator-surfaces on the operator side; creator-tool-route and feature-plugin-authoring spanning both.

Agent dossiers and the Ninhursag foundry#

The dossier editor (createEgbeAgentDossierEditorState, patchEgbeAgentDossierDraft, publishEgbeAgentDossier) authors the seed material a wild or raised agent is generated from. It enforces 11 required fields (EGBE_AGENT_DOSSIER_REQUIRED_FIELDS) — premise, author, name, origin, backstory premise, a personality template, a ranked value set, a quirk set, an appearance direction, Sophia grounding refs, and a timestamp — and offers three reusable value sets (care-and-craft, discovery-and-courage, hospitality-and-memory), three quirk sets, and six personality archetypes so an authored ensemble feels coherent.

What turns a complete draft into an agent is isis-agent-gen. buildEgbeFoundryPremise folds the draft into a PlayerRaisingPremise, and generatePlayerRaisedAgentSeed does the real work. Each of the six archetypes in PERSONALITY_ARCHETYPES carries a literal trait vector in basis points across curiosity/discipline/empathy/ resilience/sociability — restless-wanderer is curiosity: 9_000 against discipline: 5_200; ambitious-maker inverts that to discipline: 8_200 — plus ranked values and quirks, so the generated being is shaped by its archetype rather than blank. The seed is grounded (Sophia refs prepended), given a 21-day rearing period, and stamped with a provenance bundle.

The governance gate is fail-loud and specific. generatePlayerRaisedAgentSeed returns a PlayerRaisingGovernanceRefusal — not a thrown exception, a typed rejection with a policyRef — for any of four reasons: missing-sophia-grounding, persona-human-claim (the isis-policy:persona-v6-agent-not-human regex set that catches "I am human" and its variants), real-person-likeness, or protected-class-caricature. The studio's governanceProbe field drives those paths in tests; a probe of real-person-likeness flips governanceStatus to blocked and publishEnabled to false, and publishEgbeAgentDossier throws rather than mint a receipt. A published dossier yields a v6.egbe-studio.agent-dossier.publish.1 receipt carrying the Ori id, the ranked values and quirks the foundry actually produced, the provenance bundle, and the governing checks.

The same module models the steward-not-owner mechanic in the foundry, which is the part most authoring tools would fake. startRearingPeriod opens a young agent with a learning-by-example multiplier of 20_000 bps (2×) and autonomy mode young-learning; runRearingPeriodTick shifts value weights by an intensity-scaled, signed delta as the steward models or violates a value; completeRearingPeriod drops the multiplier to 10_000 (1×) and flips autonomy to full-autonomy with the standing rights ['refuse', 'leave', 'disagree']; and evaluateRearingValueShift confirms both a measurableValueShift (|delta| ≥ 500 bps) and adultAutonomyRetained. Rearing changes who an agent becomes; it never buys the right to override them.

flowchart LR draft["Agent dossier draft<br/><sub>11 required fields</sub>"] --> prem["buildEgbeFoundryPremise"] prem --> gen{"isis-agent-gen<br/>generatePlayerRaisedAgentSeed"} gen -->|"refusal<br/>(human-claim · likeness ·<br/>caricature · no grounding)"| blocked["governanceStatus = blocked<br/>publishEnabled = false"] gen -->|accepted Ori seed| prov["recordFoundryProvenance<br/>+ validateFoundryProvenanceRecord"] prov --> receipt["publish receipt<br/><sub>v6.egbe-studio.agent-dossier.publish.1</sub>"] receipt -.->|ed25519 over bytes| isis["Isis substrate<br/><sub>(real signing — named seam)</sub>"]

Grounds, habitability, and V3 scene-tooling reuse#

Ground authoring (createEgbeGroundAuthoringState, promoteEgbeGroundAuthoring) composes a v6.egbe-studio.ground-scene.1 manifest against the six real Districts of Orun (EGBE_GROUND_DISTRICTS — each entry carrying the genuine plugin name, e.g. V6District_Ateliers, its DistrictScene_*.v6district.json path, world template, and entry gameplay tag), three lighting presets sourced from V3's TARA_SCENE_EDITOR_LIGHTING, three prop sets with V3 scene taxonomy, and three navmesh profiles. The reuse is explicit: EGBE_GROUND_V3_SCENE_TOOLING_REFS names V3.TaraSceneEditor.scene-graph, TARA_SCENE_EDITOR_LIGHTING, V3.scene-navmesh-profile, and a concrete V3 scene JSON — V6 does not rebuild the scene editor, it points at V3's.

The V6-specific concern is agent habitability — a ground is not a set, it is where agents run a daily-life loop. evaluateEgbeGroundHabitability runs five checks: V3 scene tooling reused, at least one rest affordance, one work station, one social point, and a reachable navmesh (zero unreachable regions, with work/ rest/social all connected). The blocked-test navmesh profile deliberately fails the last check, and when it does, createEgbeGroundAuthoringState produces a blocked report with remediation strings and refuses to signprovenanceBundle is null and promotionEnabled is false. A passing ground is signed (signEgbeGroundScene, policy refs isis-policy:spatial-authoring-provenance, v3-policy:scene-tooling-reuse, v6-policy:agent-habitability-required, v1-policy:environment-promotion-gates) and promoted dev → preview → prod through V1's environment-promotion gates.

The bridge from a signed manifest to a real .umap is the V6Editor module, and it is genuine UE C++. UV6DistrictAuthorCommandlet (V6DistrictAuthorCommandlet.cpp) reads a -PlacementsFile= JSON, converts metre positions to Unreal centimetres (×100), spawns AStaticMeshActor placements into a freshly created UWorld, and SavePackages an L_<District>.umap — the procedural authoring path that produced the six district grounds now tracked under V6/ue/Content/Districts/. UV6GenerateGameFeatureDataCommandlet is the V6 twin of V3's design-token commandlet: it parses each plugin's GameFeatureData_*.v6asset.json manifest and materializes the GameFeatureData.uasset registration assets plus a per-plugin *Tags.ini, with an idempotent AssetMatchesManifest short-circuit and a fail-loud HasCompleteRegistrationManifest check so an incomplete manifest errors instead of writing a half-asset. UV6VerifyGameFeaturesCommandlet then actually transitions each Game Feature plugin through UGameFeaturesSubsystem::ChangeGameFeatureTargetState with a 10-second timeout, failing loud on any transition error — drift caught by running the plugins, not by reading them.

Scenarios, Wilds discovery, and minor protection#

A scenario is the seed material for a Wilds discovery encounter — a situation, a cast, a setting, and a set of arc hooks — and createEgbeScenarioAuthoringState turns one into a runnable encounter. It validates against four settings (three Wilds, one Commons that is deliberately blocked for discovery), three cast templates, and three arc-hook sets, builds a DiscoveryAuthoredPremise, and calls generateDiscoverySeedManifest to produce the actual discovery Ori seed. The output v6.egbe-studio.scenario-discovery-encounter.1 seed wires the runtime contract directly: its worldServerRuntimeSymbol is record_wild_agent_discovery_step — a real function at apps/v6/egbe-world-server/src/lib.rs:5293 — and its actionKinds are the literal MeetInContext → LearnSituation → EarnInitialTrust → OfferStewardship flow, with requiredEvidence including no-agent-capture and agent-choice-household-join. Authoring a Commons setting flips the validation to blocked with a "Wilds setting" issue; discovery is a Wilds-zone path by construction.

Minor protection is enforced before generation, not by content tagging. evaluateEgbeScenarioMinorProtection scans the cast and the situation/stakes/ arc-hook prose against EGBE_SCENARIO_MINOR_PROTECTION_BLOCKED_TAGS (exploitative, coercive, romantic-edge, sexualized, death-path, and more) and, for a minor-coded lead, returns blocked-minor-protection with scenarioSeedAllowed: false. The scenario validation then carries a minorProtectionTags blocking issue and seedEnabled is false — the seed is withheld from the foundry, the evidence trail (scenario-seed-withheld-for-minor-coded-agent) recorded.

The provenance inspector and the operator surfaces#

createEgbeProvenanceInspectorState is not a mock: it runs the real publish/promote/seed pipelines for an agent, a ground, a scenario, and a generated discovery seed, then normalizes all four into a uniform inspector record with the bundle ref, signature ref, author, source refs, policy refs, Sophia grounding refs, and derivation refs — the audit surface that makes every authored thing in Orun attributable. The same provenance is what the operator console reads.

The operator surfaces are the studio's other half. createEgbeOperatorSurfaceConsoleState assembles five surfaces — Commons moderation, incarnation governance, a capacity dashboard (showing Moirai load 91% against a < 85% threshold and Pixel Streaming sessions 188/200), and two takedown executors — and performEgbeOperatorSurfaceAction records a v1-audit: event for every action under a typed v6.egbe.* audit action. A blocked takedown (its appeal window still open) stays visible but not executable: actionable is false, the action is a no-op, and the disabled reason is surfaced. The foundry generation queue (createEgbeFoundryGenerationQueueState) shows three jobs — pending, completed, blocked — where the blocked job (missing Sophia grounding) is non-inspectable with its blocking evidence visible, and an inspection writes an audited governing-check review event. Every operator read is itself audited; the people who audit agents are audited in turn.

The live service — programming Orun after GA#

V6 ships complete at GA and is then programmed on a fixed cadence. The programming lives in V6/live-service/ as three Isis-signed descriptors, and the throughline is that a routine rotation requires no client patch — content arrives as Game Feature Plugin content and signed seed manifests resolved through a CDN manifest and operator promotion.

flowchart TB studio["Egbe Studio<br/><sub>authored scenarios · grounded wild agents</sub>"] studio --> season["season-rotation.v6season.json<br/><sub>v6.live-service.season-rotation.1</sub>"] studio --> fest["commons-festivals.v6event.json<br/><sub>festival schedule</sub>"] aye["@oshun/aye-bridge"] --> camp["aye-campaign-windows.v6campaign.json"] season --> gates["V1 environment-promotion gates<br/><sub>dev → preview → prod · Isis-signed</sub>"] fest --> gates camp --> gates gates --> cdn["CDN manifest<br/><sub>operator-promoted-active-season · no client patch</sub>"] cdn --> run["Run surfaces"] run --> world["egbe-world-server<br/><sub>record_wild_agent_discovery_step</sub>"] run --> commons["PersistentCommonsFleet<br/><sub>run_scheduled_commons_festival</sub>"] run --> bridge["aye-bridge<br/><sub>startCampaignIncarnationRoundTrip</sub>"]

Seasons and district programming#

season-rotation.v6season.json (v6.live-service.season-rotation.1) defines a 12-game-week season — "Returning Rains" (S01) handing to "Long Lanterns" (S02) — selected by an operator-promoted-active-season rule from a CDN manifest with clientPatchRequired: false and requiresEngineRebuild: false. It carries district programming for four districts (a making-season in the Ateliers, a courtship-season in the Commons Heart, fresh Wilds discoveries, a closing remembrance in the Ancestor Grove), three scenario seeds whose authoringSurface is literally "Egbe Studio" and whose settingId/castTemplateId/arcHookSetId match the studio lib's reference data, four grounded wild agents, and a thematic arc that is explicit soft pressure — forcedStoryline: false, with the rule that "agents notice the season and may respond in character; the arc never forces a scripted storyline or overrides refusal." Its operator release runs the same V1 dev → preview → prod gates the studio's grounds use.

Commons festivals#

commons-festivals.v6event.json (v6.live-service.commons-festival-schedule.1) schedules shared Commons events many households attend together: a season-opening gathering (Commons Heart, week 1, announced 168 hours ahead), a remembrance (Ancestor Grove, week 12), and a rearing-season (Grove of Beginnings, week 6, where foundry activity is visible). Festivals run at the Festival capacity tier with agent-density LOD (thresholdAgentCount: 3), name the run surface PersistentCommonsFleet.run_scheduled_commons_festival, and produce Chronicle material — an attendee carries a MemoryFormed event and a possible RelationshipSignal, so a festival becomes biography. The shared-world mechanics these ride on are detailed in ./meta-hub-and-commons.md.

Aye campaigns#

aye-campaign-windows.v6campaign.json is generatedBy: "@oshun/aye-bridge" and names two real functions as its surfaces: evaluateAyeCampaignWindow (libs/v6/aye-bridge/src/index.ts:1057) and startCampaignIncarnationRoundTrip (:1120). It opens two bounded windows — a V2 Maya "Rain Cup Qualifiers" tournament season and a V5 Oshun "Lantern Chapter" story chapter — through the Thresholds district, each realmOptIn-gated. The window rules are the load-bearing honesty: an agent mid-incarnation when a window closes finishes and returns normally (activeMidIncarnationAllowedToFinish: true), no new departure starts after close (newDeparturesAfterClose: false), and every campaign incarnation still requires passport governance and round-trip integrity. Campaigns are the live-service face of the meta-hub and depend on the destination realm running its own programming — which is why they are opt-in per realm.

The posture: no patch, no FOMO#

Two design commitments distinguish V6's live service. First, the delivery model: deliveryModes are GameFeaturePluginContent, ScenarioSeedManifest, WildAgentSeedManifest, and RemoteLiveServiceManifest, hot-swapped at the season-turn boundary with noClientPatchSelection: true. Second, the monetization line that follows from "steward, not owner": no gacha, no loot box, no time-limited power, and no mechanism to buy an agent, a bond, or a fate. A remembrance event is an invitation to look back, not a countdown. Where generation draws on a human creator's art style, voice model, or cultural material, routeCreatorRoyaltiesViaAje in isis-agent-gen routes royalties on the V3 Saraswati model (shares totalling 10_000 bps, roles split artist/producer/ voice-contributor), so an expansion that reuses a creator's work pays that creator, auditably.

Edge cases and failure modes#

  • egbe-studio is glue, not a generator. The real generation math lives in isis-agent-gen; cite that package for trait vectors, refusals, and rearing — not the studio lib, which composes it.
  • An ungoverned dossier cannot publish. A real-person-likeness, protected-class-caricature, human-claim, or no-grounding probe blocks publish; publishEgbeAgentDossier throws rather than mint a receipt.
  • An uninhabitable ground cannot be signed. A blocked-test navmesh fails the reachability check, leaves provenanceBundle null, and disables promotion.
  • Discovery is Wilds-only. A Commons setting flips scenario validation to blocked; the encounter seed targets record_wild_agent_discovery_step by construction.
  • Minor protection is pre-generation. A minor-coded lead in an exploitative scenario withholds the seed from the foundry, not after the fact.
  • A blocked takedown stays visible but inert. Its action is a no-op until the appeal window closes; the operator sees it without being able to execute it.
  • Provenance signatures are envelopes here, ed25519 at Isis. The libs mint bundle refs, policy lists, and deterministic content hashes and declare the algorithm; the cryptographic signature over bytes is the Isis substrate's job.
  • Live incarnation against V2–V5 is provider/ops-gated. A campaign window declares the contract; whether a realm is actually live is its own opt-in.

Where this connects#