# Dalamud v15.0.3.5 to v15.0.3.6

Release review observed September 29, 2026, at 19:38:27 UTC. This is a verified API 15 tag review with launcher delivery still pending at that observation. Source inspection does not establish compilation or in-game acceptance.

## Release and delivery

The official `15.0.3.6` tag resolves to `b666d821a47306fb447c60155b5d99377f91a5ee`. Compared with `15.0.3.5` at `e81744f6aea94bb6781affdd0d0b9319592f95d9`, the [official comparison](https://github.com/goatcorp/Dalamud/compare/15.0.3.5...15.0.3.6) contains 69 commits and 98 changed files. The annotated tag was created at 19:29:19 UTC; `master` matched the tag when checked. There were no merged post-tag changes at that observation.

| Authority | Observed value | Meaning |
| --- | --- | --- |
| Official runtime tag | `15.0.3.6`, commit `b666d821a47306fb447c60155b5d99377f91a5ee` | The release source exists. |
| [Stable launcher endpoint](https://kamori.goats.dev/Dalamud/Release/VersionInfo?track=release) | `15.0.3.5`, applicable to `2026.09.15.0000.0000` | The checked response had not promoted the new tag. |
| [Beta launcher endpoint](https://kamori.goats.dev/Dalamud/Release/VersionInfo?track=stg) | `15.0.3.5-68-g985a56f22`, applicable to the same game | Beta carries the preceding source state at `985a56f22bb45f42715f13ee62c0acc84b825085`. |
| Public plugin SDK and packager | `Dalamud.NET.Sdk/15.0.0`, `DalamudPackager/15.0.0` | No API 16 adoption or package-version bump is established. |

These are timestamped snapshots. The announcement's “within a few minutes” is rollout intent, not evidence that every launcher already received the update. GitHub's separate latest formal Release record still names `14.0.4.0`; runtime tags and launcher endpoints own the newer runtime facts.

A second observation at 19:42:32 UTC returned the same Stable and Beta versions and game applicability. The first observation is retained above; no launcher promotion is claimed by this review.

The supplied announcement lists 16 named feature/fix PRs plus the ClientStructs update. All listed changes are included. Its headline says 17 PRs from six contributors; the complete tag ancestry also includes earlier ClientStructs PR #2969 and schema PR #2914, yielding 19 matched merged PR records across the same six GitHub author accounts. Treat the announcement as a curated release summary, rather than an exhaustive commit/PR count.

## Main-thread access needs attention

[PR #2962](https://github.com/goatcorp/Dalamud/pull/2962) adds main-thread guards around game-object, character, battle-character, party and status wrapper access. In this release, the newly added `DevModeAssertMainThread` throws only when Dalamud DevMode is enabled. Its source explicitly marks unconditional enforcement as API 16 follow-up work. This distinction does not make worker-thread game-object reads safe.

Audit `Task.Run`, timers, network handlers, IPC entry points and continuations that read live wrapper properties. Obtain the required values on the framework thread, then pass copied strings, numbers or independent data objects to background work. Capturing an `IGameObject` reference on the framework thread and reading its properties later on a worker does not satisfy this requirement. Existing framework-thread reads do not need a new dispatch layer merely because the release added guards.

[PR #2970](https://github.com/goatcorp/Dalamud/pull/2970) uses unconditional `AssertMainThread` for game-dependent SeString evaluation. Affected paths include `setresettime`, `settime`, `switchplatform`, `pcname`, `ifpcgender`, `ifpcname`, fixed player links, global parameters and placeholder expressions. Do not assume the evaluator has the same DevMode-only behavior as object wrappers. Evaluate game-dependent text on the framework thread and give workers the resulting value. Pure text handling and every possible macro are not universally prohibited on workers by this change.

## Input, events and text

| Change | Practical consequence |
| --- | --- |
| [Extended key support #2947](https://github.com/goatcorp/Dalamud/pull/2947) and [modifier correction #2987](https://github.com/goatcorp/Dalamud/pull/2987) | Left/right Shift, Ctrl and Alt are extended keys. `IsVirtualKeyValid` and `GetValidVirtualKeys` describe game keys; use the extended counterparts when enumerating all supported plugin keys. The indexer and raw-value methods handle both sets. Verify release/press behavior and key pickers. “Directional” here refers to sided modifiers, not arrow keys. |
| [Active plugin change details #2941](https://github.com/goatcorp/Dalamud/pull/2941) | `AffectedPlugins` supplies identity and version information that remains available after unload. Handlers that only invalidate their own caches can retain that behavior. |
| [Data adapters #2940](https://github.com/goatcorp/Dalamud/pull/2940) | `IIdDataShareAdapter` gains liveness support with compatibility defaults; `INameDataShareAdapter` is removed. Ordinary IPC call gates are a separate interface and do not require conversion to adapters. |
| [AFK state #2972](https://github.com/goatcorp/Dalamud/pull/2972) | `IPlayerState.IsAwayFromKeyboard` is an additive API; adopting it is optional unless a plugin specifically needs the new value. |
| [Rented builder helpers #2975](https://github.com/goatcorp/Dalamud/pull/2975) | New passthrough methods are convenience APIs; existing valid builder use remains valid. |
| [Lumina 7.7.0 #2978](https://github.com/goatcorp/Dalamud/pull/2978) | The old `Lumina.Text.SeString` model and related legacy payload/expression types are removed. Use current read-only SeString types and supported builder APIs where those legacy types remain. The separate `Dalamud.Game.Text.SeStringHandling.SeString` type is not the removed Lumina type. |

The [Lumina 7.6.0 to 7.7.0 comparison](https://github.com/NotAdam/Lumina/compare/7.6.0...7.7.0) also includes OGG audio extraction fixes and link-payload updates. Current sheet access, row references and texture-provider use do not automatically require migration because Lumina advanced.

## ClientStructs and runtime corrections

The pinned ClientStructs commit changes from `b53cdf38b532a2ffdb711f13d9501db046bf7d0d` to `313161e448e335adddd928f8a0212b2c328b5659`: [47 commits and 39 changed files](https://github.com/aers/FFXIVClientStructs/compare/b53cdf38b532a2ffdb711f13d9501db046bf7d0d...313161e448e335adddd928f8a0212b2c328b5659). Relevant areas include job-gauge inheritance/obsolete members, PlayerState mappings, pad-device structures, graphics/post-effect structures, item-detail and salvage UI, hotbar mappings, and generated native string overloads. The final generator fix avoids passing a null pointer for an empty `ReadOnlySpan`.

Compare the exact members, offsets, signatures and generated delegates each plugin actually uses. An upstream struct appearing in the changed-file list is a reason to inspect its consumed members, not proof that every caller needs a rewrite. Custom native layouts and signature helpers still require in-client validation after any applicable runtime update.

The Lumina.Excel pin advances from `2b2854671facac83f02fdec1f355986f2edaeb3f` to `a39a756938ba32e5125bad87d1b4abe359d802b1`, including schema/generator work. [Nameplate PR #2977](https://github.com/goatcorp/Dalamud/pull/2977) corrects full-update detection and flags; [allocation PR #2983](https://github.com/goatcorp/Dalamud/pull/2983) changes internal frame/addon work. Check plugins that depend on refresh timing or flags separately from source compilation.

## Framework build changes

[CMake PR #2982](https://github.com/goatcorp/Dalamud/pull/2982), the `.slnx` migration, solution GUID correction and dependency XML documentation packaging concern Dalamud's own build. The [official source-build guide](https://dalamud.dev/building/) is for framework contributors. They do not require ordinary plugin authors to convert plugin projects to CMake, change their own solution format, or bump the API 15 SDK.

## Work that remains outside this tag

At the observation time, [ClientStructs PR #2988](https://github.com/goatcorp/Dalamud/pull/2988), [ITooltip #2986](https://github.com/goatcorp/Dalamud/pull/2986), [nameplate force-refresh #2990](https://github.com/goatcorp/Dalamud/pull/2990), [plugin assembly exposure #2992](https://github.com/goatcorp/Dalamud/pull/2992), allocation work #2994 and framework fixes #2910 were open. API 16 rollup, generated sheet namespaces, disposable lifecycle listeners and `IEnumerable` params proposals also remain development work. None is a shipped requirement of `15.0.3.6` merely because it appears in current PR activity.

## Validation checklist

- Confirm the runtime actually selected by the launcher before attributing behavior to `15.0.3.6`.
- Inspect game-state reads in worker tasks, timers, network/IPC callbacks and async continuations; exercise those paths with DevMode enabled.
- Exercise game-dependent evaluator macros on the main thread and verify localized text and player links.
- Test generic and left/right modifier bindings, extended keys and press/release handling.
- Verify affected native hooks, object/party/status reads, addon lifecycle behavior, nameplate refresh and texture/sheet features in the client.
- Keep static inspection, compilation, installation and in-game acceptance as separate recorded results.

This report records source and official-endpoint evidence. It does not report plugin builds, live game tests, or remote publication of this document.
