# Egbe Studio & Live Service

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](../../V3/features/creator-suite-lilith-studio.md)
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](../architecture/architecture-topology-and-layout.md);
its live-service moments lean on the shared-world substrate in
[./meta-hub-and-commons.md](./meta-hub-and-commons.md) and ship through the
release machinery in
[./cross-platform-rollout-and-launch.md](./cross-platform-rollout-and-launch.md).
For the full feature scope this slots into, start at the hub:
[../V6_features.md](../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.

```mermaid
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 sign** —
`provenanceBundle` 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 `SavePackage`s 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.

```mermaid
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](./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

- [Meta-hub & the Commons](./meta-hub-and-commons.md) — the shared-world shard
  continuum, the Threshold incarnation path, and the festival capacity tier
  these live-service events run on.
- [Cross-platform rollout & launch](./cross-platform-rollout-and-launch.md) —
  the environment-promotion gates, CDN content delivery, and release machinery
  that publishes a season without a client patch.
- [../architecture/architecture-topology-and-layout.md](../architecture/architecture-topology-and-layout.md)
  — the engine map: the `V6Editor` module, the Game Feature Plugin model, the
  foundry service, and where `egbe-studio`/`isis-agent-gen` sit in the library
  graph.
- The feature hub: [../V6_features.md](../V6_features.md); the backlog is
  `V6_TODOS.md`.
