# V2 Accessibility Settings Persistence

This runbook covers `TODOS.phase-72.72.13.1.15`: saving per-player accessibility
preferences and applying them on startup before gameplay.

## Runtime Surface

Accessibility settings persistence spans V2Persistence and V2UI:

- persistence struct: `FV2PersistedAccessibilitySettings`
- settings snapshot: `FV2PlayerSettingsSnapshot`
- save game: `UV2SaveGame`
- persistence subsystem: `UV2PersistenceSubsystem`
- startup apply hook: `UV2UISubsystem::ApplyStartupAccessibilitySettings`
- automation spec:
  `V2/ue/Source/V2Tests/Private/Persistence/AccessibilitySettingsPersistence.spec.cpp`
- contract:
  `V2/ue/Content/V2/UI/Accessibility/AccessibilitySettingsPersistence_V2_Contract.json`
- focused checker: `V2/ue/Tools/check-v2-accessibility-settings-persistence.py`

`FV2PersistedAccessibilitySettings` owns the save-friendly representation. It
uses primitive values and stable `FName` ids so the V2Persistence module does
not need a runtime dependency on V2UI.

## Persisted Fields

The snapshot persists:

- selected accessibility preset profile id
- HUD scale and opacity
- reduced motion
- camera shake intensity
- screen reader announcements
- large text and text scale
- color palette and contrast ids
- readable font id
- letter spacing percent

All numeric values are normalized before save. HUD scale, camera shake, and
letter spacing are stored in 5 percent steps. Large text restores at 1.5x or
higher, and letter spacing maps to at most 0.12em.

## Startup Apply

`UV2SaveGame::GetStartupAccessibilitySettings` resolves a normalized startup
snapshot. `UV2PersistenceSubsystem::MarkAccessibilitySettingsAppliedOnStartup`
records when those settings were applied. `UV2UISubsystem` exposes
`ApplyStartupAccessibilitySettings` and
`WereAccessibilitySettingsAppliedBeforeGameplay` so startup flow can apply the
runtime `FV2UIAccessibilitySettings` before gameplay HUD or match state binds.

## Verification

Run these checks after changing accessibility settings persistence:

```bash
python3 V2/ue/Tools/check-v2-accessibility-settings-persistence.py
python3 V2/ue/Tools/check-v2-profile-save-game.py
python3 V2/ue/Tools/check-v2-persistence-module.py
python3 V2/ue/Tools/check-v2-settings-ui.py
python3 V2/ue/Tools/check-v2-ui-module.py
python3 V2/ue/Tools/check-v2-ci-workflow.py
python3 V2/tools/validate-v2-docs.py
python3 -m py_compile V2/ue/Tools/check-v2-accessibility-settings-persistence.py V2/ue/Tools/check-v2-ci-workflow.py
python3 -m json.tool V2/ue/Content/V2/UI/Accessibility/AccessibilitySettingsPersistence_V2_Contract.json
```

Automation test name:
`V2.UI.Accessibility.AccessibilitySettingsPersistence.AssetContract`.

## Horde Gates

- `accessibility-settings-persistence-source`
- `accessibility-settings-persistence-profile-save`
- `accessibility-settings-persistence-normalization`
- `accessibility-settings-persistence-startup-apply`
- `accessibility-settings-persistence-automation`
- `accessibility-settings-persistence-ci-wired`
