# Accessibility, Localization & Compliance

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

- **Subtitles** — `BuildSubtitleStyle` 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 vision** — `BuildPalette` 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.
- **Photosensitivity** — `BuildPhotosensitivityPolicy(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 cues** — `BuildCombatCueSet` 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 difficulty** — `BuildDefaultDifficultyProfiles` 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 assist** — `BuildAimAssistProfile` clamps per-axis sensitivity to
  `[0.25, 1.5]`, exposes a driving variant with `0.55` stickiness and a `14°`
  acquisition cone (vs `8°` on foot), and orders the priority pyramid **enemy →
  breakable → civilian**.
- **Speech & input** — `BuildSpeechAccessProfile` 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-GB` → `UK`, `ZH-CN` → `CN`,
`CALIFORNIA` → `CA`) 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.

```mermaid
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](./platform-performance-and-tech.md) 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](./production-progression-world-and-launch.md)
  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](./online-services-and-infrastructure.md)
  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](../architecture/accessibility-security-and-compliance.md)
  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](../V5_features.md).
