Open-World Narrative · Features

Accessibility, Localization & Compliance

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

5sections11 minread1diagram

On this page

V5 is one UE5 open-world narrative universe split across six ruleset cells — 1947-noir Urban, Prohibition-era Period, an 1899 Frontier, a Witcher-flavoured Hunter, a hard-SF Sci-Fi, and the cross-cell Mind Palace — shipped age-rated, voiced, online, and cross-play across nine day-one platforms. At that scale, accessibility, localization, and legal compliance stop being a backlog and become a launch precondition: a platform holder bounces a build over a missing accessibility matrix, a regulator fines over a deletion that fails to cascade or a moderation action with no statement of reasons, a market refuses a build whose gore is uncut for its rating board, and a deaf or colour-blind player who cannot follow a deduction is a player who refunds. This page is the surface where those three meet, and it is unusually concrete because V5 makes one deliberate architectural choice: it reimplements the model rather than composing the shared one. A repository-wide search finds zero V5 imports of @oshun/*, @themis/*, or @aphrodite/* — the cross-product locale catalog @oshun/i18n and the shared privacy packages are real and used by the Oshun app shells, but they are not this product's root. Accessibility, localization, residency, data-subject rights, age-gating, DSA moderation, and the region-rating matrix are authored as three first-party Unreal C++ modules — V5Accessibility, V5Localization, V5Compliance — over JSON policy manifests under V5/legal/ and V5/loc/. The features hub is ../V5_features.md.

What ships, honestly#

The boundary between implemented-and-tested and declared-intent runs cleanly through this cluster, and it is worth stating up front.

  • Three real, domain-specific UE C++ modules. V5/ue/Source/V5Accessibility/Private/V5AccessibilitySystems.cpp (392 lines), V5Compliance/.../V5ComplianceSystems.cpp (282 lines), and V5Localization/.../V5LocalizationSystems.cpp (486 lines) are UBlueprintFunctionLibrary builders that author typed, persistable launch profiles — not policy stubs. All three are registered as Runtime modules in V5/ue/V5.uproject, depend only on Core/CoreUObject/Engine/V5Core, and have compiled object files present under V5/ue/Intermediate/Build/Linux/x64/UnrealEditor/Development/ (systems, gen, and test objects) from the on-box UnrealEngine-5.5.4 build.
  • The specs assert computed values, not truthiness. Thirteen automation tests across the three modules pin real arithmetic — a 30-day DSAR resolving to DueUnixSeconds == 2593000, a 72-hour EU moderation SLA, a photosensitivity clamp of ≤ 3 flashes, a 240-route voice-chat translation matrix, font-scale clamps 1.7 → 1.6 — and would fail on a hardcoded return.
  • Zero cooked content. V5 carries no .uasset files; it is a logic-plus-manifest skeleton. The C++ compiles and is unit-tested, but no cert run, no profiled accessibility playthrough, and no played day-one build can be evidenced from this repo. Those claims are forward-looking by construction.
  • The external accessibility audit was fabricated, then retracted — and the two sources still disagree. The C++ BuildExternalAuditEngagement() still names an invented counterparty ("AccessForge Accessibility Audit Cooperative", id accessforge-a11y) with Status = Engaged; the legal source of truth, V5/legal/accessibility-consultant-engagement.json, was corrected on 2026-06-12 to status: "not_engaged", vendor [VENDOR TBD], every date null. The one fact both share is the only one that gates ship: bSignedAuditReceived = false. This page records the divergence rather than smoothing it.
  • Real-time voice-chat translation is a real router over named provider seams. The 240-pair route matrix, opt-in gating, output-mode resolution, and refusal logic are real; the STT/MT/TTS providers (WhisperSTT, V5RealtimeMT, CoquiTTS) are named integration points, and the transcript transform is a deterministic stand-in, labeled below.

Accessibility#

V5Accessibility is deliberately a settings-and-policy library, not a renderer: it produces the FV5Accessibility* structs the rest of the game and UI consume, and the spec pins the behaviour per feature.

The settings model#

  • SubtitlesBuildSubtitleStyle clamps font scale to [0.8, 1.6] and border to [0, 6]px, applies per-speaker colour coding (Player / Companion / Radio / SFX), keeps an SFX caption track, and carries a period-radio caption flag. The spec asserts the high-end clamps (1.7 → 1.6, 8.0 → 6.0).
  • Colour visionBuildPalette remaps both the UI palette and the gameplay-cue tags (cue.threat.*, cue.clue_trail.*, cue.faction.*) across four modes — Deutera, Proton, Trit, Monochrome — and any high-contrast or monochrome selection sets bMindPalaceShapeCoding so deduction cues never depend on hue alone.
  • PhotosensitivityBuildPhotosensitivityPolicy(true) drops the flash budget from 12 to 3 per five seconds, removes strobe, dims burst overlays to a 0.55 brightness scalar, and applies to VR/AR; the spec asserts MaxFlashesPerFiveSeconds ≤ 3.
  • Combat audio cuesBuildCombatCueSet emits five events (incoming fire, hit confirmation, low health, target lock, vehicle collision), each with a MetaSound graph id, a visual-companion id, and spatial-marker / vibration companions; low-health rides a 1.15 volume scalar, and the caller's disabled-event list is honoured per cue.
  • Per-cell difficultyBuildDefaultDifficultyProfiles produces one profile for every cell (GetAllV5Cells()), with Easy/Normal/Hard/Brutal driving concrete scalars: Easy = 0.6 / 0.65 / 1.3 damage / accuracy / resource with a 12 s hint delay; Brutal = 1.65 / 1.45 / 0.65 at 120 s. Each is bStoredPerCell, so an easy Sci-Fi flight model and a hard Hunter combat model coexist in one profile.
  • Aim assistBuildAimAssistProfile clamps per-axis sensitivity to [0.25, 1.5], exposes a driving variant with 0.55 stickiness and a 14° acquisition cone (vs on foot), and orders the priority pyramid enemy → breakable → civilian.
  • Speech & inputBuildSpeechAccessProfile advertises Coqui TTS over all 16 launch cultures (bCoversAllLaunchLanguages is the literal Num() == 16 check) and Whisper STT that requires opt-in; BuildInputAccessPlan enables per-input remapping across seven named Enhanced-Input contexts and one-handed schemes for the PS5 Access and Xbox Adaptive controllers.
  • Camera comfort, period-radio captions, Mind Palace contrast round out the set — camera shake clamped to [0, 1], period-radio captions split into dialog / SFX / station-ident / music-description channels, and the Mind Palace carrying six evidence/thread shape tokens for colour-independent deduction.

The launch QA gate#

BuildLaunchQASuite assembles 13 checks spanning every surface above, twelve of them automated under the V5.Accessibility filter. The thirteenth, qa.accessibility.external_audit, is bManualReview and carries status ReleaseBlocked — the suite encodes that an internal pass is necessary but not sufficient, and that an external, signed audit gates ship. As "What ships" records, that audit has not been received: the MindPalaceQAAndAudit spec deliberately asserts TestFalse("Signed audit is not falsely claimed", …). So the settings model is real and tested, but the launch readiness it feeds stays red on the one human sign-off it cannot fabricate.

Localization, voice-over & region variants#

V5Localization reimplements the whole launch language plan in C++ rather than reaching for @oshun/i18n. (The shared lib is real — eight app-shell locales, an ICU Intl.* formatter, a <requested> → <language> → en-US fallback chain, RTL metadata — but it serves the Oshun product shells and is not imported anywhere under V5/.)

Sixteen packs and the dashboard pipeline#

BuildLaunchLanguagePacks authors 16 packs: 4 full-lipsync (en-US, fr, de, es-LATAM), 8 lipsync-light (en-UK, es-ES, it, pt-br, ja, ko, zh-Hans, zh-Hant), and 4 text-only (ru, ar, pl, tr; Arabic flagged bRightToLeft). Every pack covers the same five string domains — UI, Subtitle, Caption, Codex, PeriodRadio — and carries a /Game/Localization/V5/<culture>/V5.archive path and a ST_V5_<culture> string-table path. BuildDashboardPipeline runs the real UE Localization Dashboard commandlet chain (GatherTextFromSource, GatherTextFromAssets, GenerateGatherManifest, GenerateGatherArchive, GenerateTextLocalizationResource) with en-US as native culture. The out-of-Unreal mirror V5/loc/language-packs.json agrees pack-for-pack and exists so pipeline tooling can read the plan without the editor.

Voice-over and lipsync tiers#

BuildVoiceRecordingProfiles emits a profile for each of the 12 voiced packs, routing studios by culture — studio.la (en-US, es-LATAM), studio.london (en-UK, fr, de, es-ES, it, pt-br), studio.tokyo (ja, ko), else outsourced — and sizing PrincipalLineCount at 92,000 lines for full-lipsync cultures and 54,000 otherwise (the Sci-Fi player character carries a separate SciFiPlayerLinesPerGender default of 38,000). BuildLipsyncProfiles then marks the four full cultures bFullFaceUsd with a strict 0.25 s max sync offset, and the lipsync-light cultures a viseme pass at 0.5 s; every profile keeps a Sequencer note track. The VoiceAndLipsync spec asserts exactly 12 recordings, 4 full, 8 light.

Real-time voice-chat translation#

This is the system that most needs an honest label. BuildRealtime­VoiceChat­ TranslationRoutes builds the full 240-route ordered matrix (16 × 15), and ValidateRealtimeVoiceChatTranslationPlan asserts every invariant: 16 unique supported cultures, 15 inbound and 15 outbound routes per culture, a ≤ 750 ms end-to-end budget, party and team voice, speaker and listener opt-in, no raw-audio retention, no training on voice chat, a synthetic-voice indicator, and per-route profanity filtering. Output mode is resolved from the target tier — voiced targets get SynthesizedVoiceAndCaption via CoquiTTS at a 650 ms budget; text-only targets (ru, ar, pl, tr) get CaptionOnly with no TTS at 450 ms. TranslateVoiceChatTranscript refuses unless the route exists, the cultures differ, the transcript is non-empty, and all three privacy gates are set. What is real here is the router, the gating, the output-mode and latency resolution, and the refusal logic, all spec-verified end to end. What is a named seam is the actual STT → MT → TTS: WhisperSTT, V5RealtimeMT, and CoquiTTS are provider identifiers, not in-module implementations, and the transcript transform itself ("[ja] Hold the gate.") is a deterministic target-tagged stand-in, not a shipped translation. The release-gate manifest path is fullvision_realtime_voice_chat_translation_manifest.json.

Region rating variants and content gates#

BuildRegionRatingVariants authors 8 board variants — US ESRB M, EU PEGI 18, UK BBFC 18, DE USK 18, JP CERO Z, CN NTAB, AU ACB R18+, KR GRAC — each linked to its build-variant id and content-gate ids. BuildContentGates carries the six real edits the boards demand: the AO-rated Hard Vacuum cinematic excluded from the US M build, the 1968 Mafia gore-cut for USK, a toned-down extreme-gore cinematic for CERO Z, NTAB faction-name swaps for CN, an ACB-reviewed chemical-misuse edit for AU, and GRAC commerce/online-interaction disclosures for KR; five of the six set bBlocksUncutContent. These satisfy the cert obligations in V5/legal/rating-boards.json and V5/legal/platform-cert-bans.json.

The localization QA gate#

BuildLocalizationQAProfiles emits 16 profiles, every one bReleaseGate and bProofreadRequired; the 12 voiced cultures additionally carry RequiresLipsyncCheck. BuildLaunchPlan composes the dashboard pipeline, packs, recordings, lipsync, the 240-route translation plan, the 8 rating variants, the 6 gates, and the 16 QA profiles into one launch object — so a per-language proofread-plus-lipsync pass is encoded as a gate, not a promise.

Privacy, residency & compliance#

V5Compliance is the clearest expression of the reimplement-rather-than-compose decision, and its math is rule-driven and time-bounded.

Residency and data-subject rights#

NormalizeRegion folds aliases (GB/EN-GBUK, ZH-CNCN, CALIFORNIACA) and BuildResidencyPolicy resolves storage per jurisdiction: CN pins to cn-shanghai / cn-hangzhou with bCrossRegionReplicationBlocked and bCNOnly; EU to fra / dublin with bEUOnly; UK to london / dublin; California to pdx; and the global default spreads across iad / pdx / sin / syd unpinned. The BuildLaunchResidencyPolicies set and V5/legal/data-residency.json agree field-for-field. BuildDSARRequest stamps a 30-day SLA, computes DueUnixSeconds = Created + 30·86400, routes through the companion-app portal (/companion/privacy/dsar), enumerates export scopes (account, save-games, telemetry, workshop, moderation), and embeds the caller's residency policy so an EU subject's export bucket never leaves the EU. CCPA do-not-sell is an account-level flag forced on for California regardless of input.

Age-gating, DSA moderation, and the release-coverage AND#

BuildAgeGateProfile bands age into Under13 / Teen / Adult and, for under-13, cascades the full COPPA restriction set in one place — guardian consent required, social surfaces / voice chat / Workshop publishing / personalized ads all disabled, telemetry essential-only, DSAR routed through a guardian. DSA moderation is region-aware: BuildModerationReport marks a report DSA-eligible only for EU/UK, and only then sets human-review-required, an appeal path, a transparency-log id, and a 72-hour SLA (vs 120 elsewhere); the spec deliberately asserts a US report is not falsely DSA-eligible. Privacy notices are authored for 10 jurisdictions (Global, CA, EU, UK, CN, BR, JP, KR, AU, NZ), each disclosing do-not-sell where California/Global applies and DSA reporting where EU/UK applies; the cookie model defaults to essential-only with reject-all, requires explicit marketing opt-in for EU/UK/CN/BR/KR, and shows a do-not-sell link only for California. BuildLaunchProfile ANDs all of it into one bAllReleaseGatesAuthored assertion — ≥ 5 residency policies, ≥ 10 notices, cookie models mirroring notices, a 30-day DSAR, a visible DSA appeal path, and a guardian-gated under-13 profile — so a single missing piece fails the whole launch-coverage check.

flowchart TB P[V5 player · 16 cultures · 9 platforms] P --> A11Y["V5Accessibility (UE C++, 392 ln)<br/>subtitles · 4 colour modes · photosensitivity<br/>difficulty · aim · speech · input"] P --> LOC["V5Localization (UE C++, 486 ln)<br/>16 packs · VO/lipsync tiers<br/>240-route voice-chat translation · 8 rating variants"] P --> COMP["V5Compliance (UE C++, 282 ln)<br/>residency · 30-day DSAR · consent<br/>age gate · DSA 72h"] A11Y --> QA{"Launch QA suite · 13 checks"} LOC --> LQA{"Per-language QA · proofread + lipsync"} COMP --> GATE{"bAllReleaseGatesAuthored"} QA -->|external_audit = ReleaseBlocked| BLOCK[release blocked: signed a11y audit not received] LOC -. STT/MT/TTS are named provider seams .-> SEAM[(WhisperSTT · V5RealtimeMT · CoquiTTS)] nocontent["0 .uasset · logic+manifest skeleton"] -.->|caps cooked + cert claims| BLOCK

Where this connects#

  • Sideways to platform & tech: Platform, Performance & Tech owns the nine-platform parity matrix, the per-region store SKUs these rating variants ship into, and the zero-.uasset reality that caps every cooked and cert claim here.
  • Sideways to production & launch: Production, Progression, World & Launch owns the mocap / VO / composer capacity behind the 12 voiced SKUs and the release-gate aggregation that reads this page's accessibility, localization, and compliance gates.
  • Sideways to online services: Online Services & Infrastructure owns the anti-cheat and competitive-integrity surface that completes the compliance picture, plus the moderation queue whose UGC the DSA reporting governs.
  • Architecture companion: Accessibility, Security & Compliance is the system-level home of these three modules, the service tier (compliance-dsar, anti-cheat), and the full record of the retracted audit.
  • The features hub: ../V5_features.md.