# Dalamud v15.0.3.0 to v15.0.3.1 - Public Report

Observed: 2026-08-07 13:19 MDT

## Summary

Dalamud `15.0.3.1` is a focused API 15 hotfix. The tag resolves to
`61a0db84a93fdc0f9bedcd4e07b5ca87c8027812`; the exact range from
`15.0.3.0` contains 11 commits and 16 changed files.

There is no API-level, SDK, or packager version bump. The main compatibility
areas are corrected emote-unlock behavior, removal of the managed MinHook
backend, hook-creation reliability, failed-load/manual-retry cleanup, and a
ClientStructs update.

## Release State

| Surface | Result |
| --- | --- |
| Dalamud tag | `15.0.3.1` / `61a0db84` |
| Post-tag repository changes | none; `master` matches the tag |
| Public SDK | `Dalamud.NET.Sdk/15.0.0`, unchanged |
| Public packager | `DalamudPackager/15.0.0`, unchanged |
| ClientStructs | `8121cbbc`, updated from `cc474ca9` |
| Lumina.Excel | `2b285467`, unchanged |

The immutable tag appeared before channel rollout completed. By 13:15 MDT,
Release and STG both served `15.0.3.1`. Release still reported inapplicable to
the current game contract, while STG reported applicable. By 13:19 MDT,
Release also targeted the current game and reported applicable. Verify the
locally installed runtime before testing.

## What Changed

### Emote unlock checks

`IUnlockState.IsEmoteUnlocked` now returns:

- `false` for an invalid or missing emote category;
- `true` for emotes with no unlock link;
- the normal unlock-link result otherwise.

Consumers should not need a source change unless they had added local
workarounds for those edge cases.

### Hook backend behavior

The managed MinHook implementation and its package dependency are removed.
Explicit `HookBackend.MinHook` and `HookBackend.Reloaded` values are obsolete;
automatic backend selection is the supported path.

Plugins that explicitly pass a backend should remove that argument. Ordinary
`IGameInteropProvider.HookFromAddress` and `HookFromSignature` usage remains
the intended public pattern.

### Signature and plugin-load reliability

The internal signature helper now creates hooks through a typed generic path.
The loader also cleans resources after constructor/load failures, avoids
repeated automatic retries, and keeps manual retry/reload available.

These are framework-side fixes. Plugin-local retry or cleanup workarounds
should not be added without reproducing a remaining problem on the new runtime.

### ClientStructs

The release moves ClientStructs from `cc474ca9` to `8121cbbc` across 117
commits and 129 files. The range includes UI/game state, addon and agent
definitions, content directors, group/object managers, gearsets, party-list
arrays, layout types, and newly named structures.

Plugins that use raw pointers, generated member-function addresses, manual
signatures, or assumed struct offsets should run targeted in-game validation.
Changed-file volume alone does not prove that a plugin is broken.

## Recommended Validation

1. Confirm the selected channel is applicable to the current game and that
   `15.0.3.1` is locally installed.
2. Load each hook-heavy or raw-ClientStructs plugin.
3. Exercise hook creation, enable/disable, disposal, and reload.
4. Test constructor/load failure recovery and manual retry if the plugin has a
   safe test path.
5. Recheck manual signatures and any raw struct views against the current game.

Static review or a successful build does not replace in-client validation.

## Sources

- <https://github.com/goatcorp/Dalamud/tree/15.0.3.1>
- <https://github.com/goatcorp/Dalamud/compare/15.0.3.0...15.0.3.1>
- <https://github.com/goatcorp/Dalamud/pull/2902>
- <https://github.com/goatcorp/Dalamud/pull/2905>
- <https://github.com/aers/FFXIVClientStructs/compare/cc474ca90dce0824334544ad7ec7d769f3cb6ee5...8121cbbc26b7a583b63b230306f70419bea727d2>
- <https://api.nuget.org/v3-flatcontainer/dalamud.net.sdk/index.json>
- <https://api.nuget.org/v3-flatcontainer/dalamudpackager/index.json>
