Open-World Narrative · Features

Live Service & Community

A focused page within the Open-World Narrative Features documentation. The full map and every sibling page live in the Features hub.

4sections12 minread1diagram

On this page

A universe this size is a service, not a box. V5 is one UE5 open-world narrative universe split across ruleset cells — a 1947-noir Urban heist city, a Prohibition-era Period crime saga, an 1899 Frontier, a Witcher-flavoured Hunter world, a hard-SF Sci-Fi theatre, and the cross-cell Mind Palace deduction layer — and it ships those five launch cells and then keeps growing for years. The post-launch product is the part that arrives after launch and keeps arriving: a 90-day season every quarter, a 100-tier per-cell battle pass, weekly contracts, persistent world events, faction-reputation ladders that decay and recover, Twitch drops and a creator-partner program, AI-narrated highlight reels, curated community spotlights, 24/7 support, and a public balance ledger so the community can audit every tuning change. This page is the feature-side companion to the Modes, Online Services & Live Operations group, and it is unusually honest about a seam that runs straight through the middle of the subject: the live-ops machinery is real, shipped TypeScript and C++, while a good deal of the content that machinery delivers — the specific Year-1 cosmetics, the per-cell theme drops, the authored restoration missions — is design data the services execute, not engine artifacts cooked to disk. Where a claim is backed by code this page names the package and function; where it is authored design data or a plan, it says so. The feature hub is ../V5_features.md.

The design line underneath everything is the same competitive-integrity rule the rest of V5 draws and that V2 and V4 drew before it: nothing sold or seasonal ever touches gameplay power. The battle pass marks gameplay-affecting rewards never-paid-only, every calendar payload asserts exclusiveGameplayRewards: false, store bundles are cosmetic-only, faction-rep decay can never be bypassed with money, and balance ships as data, never a forced binary patch. Live service grows the world; it never sells an advantage in it.

What ships, honestly#

The split is clean, and stating it up front keeps the rest of the page honest.

The live-ops services are real. apps/v5/ holds 16 deployable NestJS + Fastify packages (each with a contract.json, a Dockerfile, k8s manifests, and a contract.test.ts), wired over one shared @v5/service-shared runtime. The live-service-relevant ones — live-service-calendar (port 4223), faction-rep, replays, workshop, telemetry, balance-ledger, companion-app-bridge — are genuine services with typed contracts and pinned endpoint sets.

The load-bearing domain logic is real Postgres-backed code. Under apps/v5/service-shared/src/domain/ sit the engines the live service runs on: FactionRepDomain (a genuine exponential time-decay reputation model with an append-only ledger), WorkshopDomain (a UGC marketplace with a moderation state machine and an exact-to-the-cent revenue split), ReplaysDomain (a content-addressed, deduplicated replay store with signed download grants), TelemetryDomain (validating batched event aggregation), and LiveServiceCalendarDomain (time-windowed events with a SHA-256 content ETag). Each is unit- and integration-tested for domain correctness, not just data flow.

The UE client tier is real C++. V5/ue/Source/V5OnlineServices ships UV5_Online_LiveServiceCalendarClient, UV5_Online_FactionRepClient, and the replay/highlight builders as UBlueprintFunctionLibrary composers (BuildYear1Calendar, BuildYear1DecayPolicy, BuildYear1AIHighlightReel), over an 809-line automation test that pins the season rotations, the decay caps, and the highlight scoring.

Three honest caveats matter. First, the deployed REST feed paths return authored literals. A request to /v5/live-service-calendar/year1 resolves through handleRealRequest to evaluateServiceSpecificRule (service-shared/src/runtime.ts:1389), which returns hand-authored constants — seasonalThemeRotations: 4 (:1863), scriptCount: 12 (:1847), exclusiveGameplayRewards: false — not rows read from the calendar domain. The real Postgres LiveServiceCalendarDomain and the real FactionRepDomain decay model are exercised on the realtime path (realtime.ts) and by the read-only companion bridge, and pinned by tests; they sit one wiring step from the REST feed. Second, the seasonal content is authored design data, not cooked assets — like V4, V5 represents drops, themes, and reward sets as JSON manifests under V5/live-service/, not binary .uasset. Third, the consumer companion app is a mockup: V5/companion/ holds design-token Swift/Kotlin stubs with no buildable iOS/Android project (per V5_features.md and the v5-verification-2026-05-31 audit). The companion bridge service is real and read-only; the phone app that would consume it is not built.

The live service#

Seasons and the per-cell battle pass#

Season One is authored end-to-end in V5/live-service/season-1-live-service-manifest.json: Fracture Signals, a 90-day window (2027-03-01 → 2027-05-30) opened by a 30-day Continuum Signal day-one event. Its battle pass is the recurring engagement spine — one pass per cell, 100 tiers across the 90 days, with a free and a paid track, advanced on a battle_pass_xp currency earned from missions, contracts, and PvP, pacing toward completion at a target { min: 6, max: 8 } hours per week. Every per-cell track (bp.s01.urban.fracture_signals and four siblings) defines a free track with 34 claimable rewards and a paid track with 100, and the monetization line is drawn in the data itself: tierSkipPolicy allows purchasable skips (purchaseEnabled: true, maxSkipsPerSeason: 20) but stamps gameplayAffectingRewards: "never-paid-only". Reward families are cosmetic — outfit, vehicle-wrap, emote, nameplate, ship-decal — never frame data or stats. Unclaimed rewards stay claimable-until-season-end, so the pass never expires a reward mid-season.

Weekly contracts are the inner loop: weeklyContracts authors 7 contracts per week rotating Mondays at 00:00 UTC across a 13-week season, drawn per cell from a typed poolByCell with an intro | standard | hard | expert difficulty spread. The honest policy is in the data — unfinished-contracts-expire-at-cycle-rollover but missed-contracts-do-not-remove-earned-pass-progress — so a player who skips a week loses that week's contracts, not their tier position. Each season's seasonalThemeDrops re-skins all five cells (Urban summer-beach, Period winter-noir, Frontier high-summer, Hunter dark-autumn, Sci-Fi solar-storm) and the Year-1 calendar manifest authors all four rotations — Fracture Signals, Neon Harvest, Long Night Protocol, Founders Return — each with five per-cell themes.

Faction reputation, decay, and restoration#

Faction reputation is where the live service has its deepest real algorithm. FactionRepDomain (service-shared/src/domain/faction-rep.ts) replaces a prior simulatedDecay: true echo with a genuine model: reputation relaxes toward a neutral floor while a player is inactive, rep(t) = floor + (rep0 − floor) · exp(−ln2/halfLife · days), with REP_FLOOR = 0, REP_CEILING = 1000, DEFAULT_HALF_LIFE_DAYS = 30, and a DEFAULT_GRACE_DAYS = 14 window below which nothing decays. The surplus over the floor halves every 30 idle days; applyDelta clamps every event to ±REP_DELTA_CLAMP (100) and journals it; the weekly runDecay(nowUnix) writes every decrement into an append-only v5_faction_rep_ledger. The test (faction-rep.test.ts) pins the math against known-correct answers — decayedRep(100, 14 + 30) is toBeCloseTo(50, 5), two half-lives is 25, the grace window decays nothing — a test that would fail on a hardcoded or random return. The UE client mirrors it: SimulateFactionRepDecay asserts an inactive paragon account decays 8200 → 8100 under its rule cap and that the 14-day grace blocks decay entirely.

The recovery side is authored design data the model serves. year-1-faction-reputation-decay.json defines the weekly decay job (cadenceDays: 7, inactivityGraceDays: 14, protectNeutralTier: true, notificationLeadDays: 3) plus five per-cell restoration mission arcs — Harbor Truce (Urban), Press Amnesty (Period), Range Mediation (Frontier), Village Rite (Hunter), Station Amnesty (Sci-Fi) — each three missions restoring up to maxRestoreRep: 450 and each clearing one rival lock on completion. The release gates assert what the design promises: noDecayBelowNeutral: true and noPaidRestorationShortcuts: true. You climb back by playing, not by paying.

The calendar, world events, and hot-fixes#

flowchart TD subgraph Authored["V5/live-service/*.json — design source of truth"] S1[season-1 manifest<br/>battle pass · contracts · drops] Y1[year-1 calendar · world-events<br/>faction-decay · highlight-reel] end subgraph Services["apps/v5 — 16 NestJS services over @v5/service-shared"] Cal[live-service-calendar :4223<br/>5 JWT-gated feeds] Dom[(Postgres domains<br/>FactionRep · Workshop · Replays<br/>Telemetry · Calendar)] Lit[evaluateServiceSpecificRule<br/>authored literal payloads] end subgraph Client["V5/ue/Source/V5OnlineServices — C++"] UE[UV5_Online_* builders<br/>BuildYear1Calendar · DecayPolicy · Reel] end S1 -. authors .-> Lit Y1 -. authors .-> Lit Y1 -. authors .-> UE Lit -->|ETag feed, Bearer JWT| UE Dom -.realtime + companion read.-> Bridge[companion-app-bridge<br/>read-only home view] Lit -->|/api/public/season-calendar| Web[apps/v5/web public calendar + store]

The calendar is the single source of truth for live-service timing. V5LiveServiceCalendarController (live-service-calendar/src/controller.ts) exposes five GET routes — /feed, /year1, /world-events/year1, /pro-stadium-tour, /year3-pipeline — each requiresJwt: true and regional: true in contract.json, which declares 21 capabilities and a regional-active-active failover across iad/fra/sin primaries with pdx/dublin/syd fallbacks. Events resolve to an Upcoming | Live | Ended state from a start/end window; an event that fails to start surfaces a retry notice rather than a silent gap, and a time-limited reward, once granted, is kept permanently. Persistent world events ride the /world-events/year1 feed: 12 one-week scripts (Gang War Week first) that open a calendar window, record objective and faction telemetry, persist settled world-state mutations for 30 days, and ship exclusiveGameplayRewards: false — a player who misses Gang War Week loses a moment, not power. The Postgres LiveServiceCalendarDomain behind this (real upsertEvent/activeEvents plus a content-derived SHA-256 etag) is the shape the literal feed grows into; the architecture-level treatment of the calendar spine and the DLC GameFeature boundary lives in the arch companion, ../architecture/live-service-and-dlc.md.

Hot-fixes are data, not binaries. season-1's balanceHotfixPipeline authors the rule: delivery: "cdn-served-signed-data", binaryPatchRequired: false, fetched at session-start, signed ed25519, with a last-known-good-with-ledger-reversal rollback and eligible domains of weapon-stats, economy-values, UI strings, calendar, and faction-rep gates. Every balance change it carries posts to the public balance-ledger service with the change, the rationale, and the effective date — the transparency layer that lets the community trace exactly what moved and when.

AI commentary and highlight reels#

Post-match content is real service code over a real replay store. ReplaysDomain (domain/replays.ts) stores replay chunks content-addressed by SHA-256 — a repeated chunk bumps a refcount instead of re-storing bytes, so two replays sharing a chunk cost one copy — and issues time-bounded, HMAC-signed download grants (signDownloadGrant, 900-second TTL). On top of that store, the Year-1 AI highlight reel is authored in year-1-ai-highlight-reel.json and built client-side by UV5_Online_ReplaysService::BuildYear1AIHighlightReel / BuildTop10HighlightClips. It is honest about being AI-assisted: an optional CoquiTTS commentator track (syntheticContentIndicator: true, humanCasterOverride: true, playerDisableable: true, transcriptRequired: true), a top-10 reel ranked by a weighted v5-highlight-ranker-v1 model (kill-multiplicity 40, objective-impact 30, clutch-context 20, teamplay-chain 10), and a per-match recap attached to match history with a source-replay-verification requirement and an explicit "AI-generated recap; verify with source replay" disclaimer. The reel never touches progression (noProgressionImpact: true), and the underlying replay stays downloadable so a viewer can check the summary against the source.

Community features#

Creator partnership and Twitch drops#

The creator ecosystem is authored in the season manifest. creatorPartnership defines three revocable tiers gated on monthly views — creator-affiliate (50k, referral code + hub profile), creator-partner (250k, embargoed preview build + creator cosmetic set + private support channel), and creator-featured (1M, launch-stream slot + curated gallery feature) — with viewer interaction confined to nonGameplayHooks (photo-theme votes, poll-driven emotes, a stream-safe soundboard), so a stream can never vote a gameplay advantage. twitchDrops schedules watch-time-gated cosmetic campaigns (launch week at 30/60/120 minutes, a capital-raid final at 45/90) through the calendar, links them to the V5 account via @v5/service-auth, and grants on next login. A Streamer Mode privacy surface masks gamertags, invite codes, and the in-game social feed, and substitutes a cleared-for-broadcast music bed where audio rights require it.

Curated surfaces: Player of the Week, Hall of Fame, ambassadors#

The community-stewardship surface is authored in V5/community/customer-support-community-manifest.json, and its permission model is the interesting part. Community ambassadors are a volunteer program (≥48 active across NA/EU/LATAM/APAC) staffing report-queue triage, workshop and gallery curation, and help-channel seeding under a required conduct agreement and five training modules — with a deliberately constrained permission set: canModerate: false, canViewPrivatePlayerData: false, canEscalate: true, canCurate: true. Volunteers curate and escalate; they never adjudicate or see private data. Hall of Fame recognises top-rated Mind Palace solves (sourced from mindpalace-cloud-sync, antiCheatReviewRequired: true) and top workshop contributors (sourced from workshop), both privacyOptOutRespected. Player of the Week runs a four-step review workflow (community shortlist → trust-safety check → privacy-consent check → scheduled card) with a cosmeticOnlyReward and a 90-day post-enforcement cooldown. Every spotlight requires opt-in for personal content and preserves synthetic-content indicators where AI-assisted work is featured. These surfaces are authored design data whose sourceServices point at the real workshop, leaderboards, replays, mindpalace-cloud-sync, and compliance-dsar contracts that back them.

Customer support, telemetry, and balance transparency#

Support is a first-class capability, not an afterthought. The manifest authors a 24/7 posture: a tier-1 live chat with a 60-second first-response SLA across six knowledge domains, and a tier-2 ticket queue with per-category SLAs (account 12h, billing/technical/privacy 24h, moderation 48h) routed to trust-safety, platform-commerce, live-ops, engineering-oncall, or privacy-legal, with auditLogRequired: true and a DSAR escalation into /v5/compliance-dsar/export. Ban and anti-cheat appeals file through this path with a 7-day SLA.

Telemetry that feeds balance is real ingestion. TelemetryDomain (domain/telemetry.ts) validates and aggregates events into per-(cell, region, event-type, day) counters: it rejects oversize events (MAX_EVENT_BYTES = 2048) and caps batches (MAX_BATCH = 500), folding survivors into Postgres with one upsert per distinct key — a real, queryable aggregate that does not require a ClickHouse cluster to function (ClickHouse remains the production analytics sink). Each event carries only an opaque per-account ID and a region; consent is a per-region opt-in that stops collection rather than anonymising after the fact. Every balance change telemetry motivates posts to the public balance ledger, so the loop from "the data said X" to "we changed Y, here is why" is auditable.

The companion app — bridge real, app a mockup#

The companion bridge is genuine. CompanionAppBridgeDomain (domain/companion-app-bridge.ts) is a strictly read-only aggregator that composes a single home view from the real persisted stores — recent replays, the Mind Palace graph summary, the balance-ledger head, and decayed faction reputation — every field a live query against a real backing table, and it stamps readOnly: true to match the companion-app security model: it never mutates gameplay state. What is not built is the consumer app that would render it. V5/companion/ holds design-token Swift/Kotlin mockups with no Xcode or Gradle project; the planned Mind Palace editor, AR-overlay, and VTuber/crime-scene modes (each with its own privacy-preserving bridge endpoint) are target vision, honestly labelled as such in V5_features.md. The bridge is ready; the phone is not.

Where this connects#

The through-line is consistent with the rest of V5: the machinery is real service and engine code composing one shared backbone, and the page is precise about where shipped TypeScript and C++ end and the authored Year-1 content (and the unbuilt companion app) begin.

  • Online Services & Infrastructure — the V5OnlineServices client catalog, matchmaking, leaderboards, anti-cheat, crossplay, and the JWT auth and Bureau account/XP ledgers the seasonal calendar, world events, and faction-rep decay read from and write to.
  • Content Creator Tools & Workshop — the workshop marketplace (WorkshopDomain's 70/20/5/3/2 revenue split, moderation state machine, and 48-hour refund window) and the creator surfaces the partner program, Hall of Fame, and curated showcases feed.
  • Architecture companion: ../architecture/live-service-and-dlc.md — the calendar spine internals, the DLC GameFeature plugin boundary, the literal-vs-domain feed seam, and the no-pay-to-win / no-binary-hot-patch invariants at architecture depth.
  • The feature hub: ../V5_features.md