# Changelog — SSTHangerSelector.HybridDLL

All notable changes to the **SST Hanger Selector Hybrid DLL** NuGet package
(`SSTHangerSelector.HybridDLL`) are documented here.

The package bundles `SSTHangerSelector.DesktopAPI` (the public facade), the
`SSTHangerSelector.Core` calculation engine, `SSTLibrary`, the auto-update components,
and the runtime protobuf data files. A single package version pins all of them
together, so an entry below may describe a change made in any of those parts.

- **Package id:** `SSTHangerSelector.HybridDLL`
- **Published to:** Azure Artifacts (DEV / QA / PROD feeds, selected by the
`publishTarget` parameter of `SSTHangerSelector.DesktopAPI/azure-pipelines.yml`)
- **Format:** based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/);
versions follow `MAJOR.MINOR.PATCH` with `-rcN` suffixes for pre-release builds.


## [1.0.6-r1] - 2026-10-14

**NuGet package:** `SSTHangerSelector.HybridDLL`
**Compatibility:** Windows, .NET Framework 4.8. Public API signatures unchanged.
**Upgrade notes:** Update to `1.0.6-r1` from the QA feed or replace the supplied DLLs. No environment or local data changes required.

### Changed

- OAuth authentication is deferred until an online operation requires it. Offline mode no longer performs authentication or connectivity checks.


### Fixed

- Fixed offline selection failing without Internet access when using `SST_Dev`, `SST_QA`, or `SST_Production`. Previously, token acquisition during initialization prevented the local calculation engine from running. ([TTST-24059](https://strongtie.atlassian.net/browse/TTST-24059))


Online operations still require authentication. Switching between online and offline modes remains controlled by the calling application.

## [1.0.6] — 2026-07-16

The first version consumable from **.NET 9** projects, and the first to ship the
complete set of runtime assemblies. Also refreshes both the US and Canada selector
databases.

### Breaking changes

- **Angle inputs are now `int` instead of `double`** (CS-458). On
`Models/Request/AngleOptionsModel` and `Models/Request/HangerOptionsModel`, the
properties `SkewAngle`, `SlopeAngle`, `TopFlangeOpenClosedAngle` and
`TopFlangeSlopedDownAngle` changed type from `double` to `int`. Callers passing
fractional angles must round before assigning; recompilation is required.
- **`Newtonsoft.Json` is no longer shipped inside the package.** Up to 1.0.5 the
package carried `Newtonsoft.Json.dll` in `lib\`. From 1.0.6 it does not, and the
package declares no NuGet dependency on it either, so **consumers must reference
`Newtonsoft.Json` themselves** (13.0.1 or later is what the DLL is built against).
Projects that relied on the package to supply it will fail at runtime with a
`FileNotFoundException` for `Newtonsoft.Json` until they add the reference.
- **Target framework folder moved from `lib\net452` to `lib\net48`.** Consumers still
on .NET Framework 4.5.2–4.7.2 no longer resolve assemblies from this package and
must retarget to 4.8 (or .NET 9).
- **The joist-selector entry points were removed from the Desktop API**:
`Business/JoistSelectorBLL` and `Business/Outputs/SSTManufacturerProduct` are gone.
Joist selection remains available through the hosted HTTP API
(`hanger-selector/joist-selector/get-joist-manufacturer-products`).


### Added

- **.NET 9 consumer support.** `SSTHangerSelector.HybridDLL.targets` now resolves
`SSTHangerSelector.DesktopAPI`, `SSTHangerSelector.Core`, `SSTLibrary` and
`AutoUpdate` as references when the consuming project targets `net9.0`, so
SDK-style .NET 9 projects can consume the net48 assemblies directly.
- **Multiple CCU support in the Core engine** (CS-390). `DataReader`, `DataServer` and
`DataDirectoryHelper` were reworked so more than one CCU data set can be loaded and
served from the same process.
- **Runtime dependencies and symbols are now part of the package.**
`SSTHangerSelector.DesktopAPI.dll`, `SSTHangerSelector.Core.dll` and `SSTLibrary.dll`
ship with their matching `.pdb` files, alongside the previously missing
`AutoUpdate.dll` (+ `AutoUpdate.dll.config`, `AutoUpdate.XmlSerializers.dll`),
`Interop.SHDocVw.dll`, `protobuf-net.dll` and `zlib.net.dll`.
- **This changelog.** It is packed into the `.nupkg` and declared as the package
readme, so it renders on the Azure Artifacts package page and ships inside every
downloaded package.


### Changed

- **Canada selector database refreshed** to the 2026-07-06 data set (CS-490).
- **US selector database refreshed** (CS-405), including an updated protobuf payload.
- **HWP hangers: Type B exclusion** (CS-400) — Type B HWP hangers are now excluded
from results where they are not applicable, and the HWP data was updated.
- Publishing pipeline reworked to target DEV / QA / PROD Azure Artifacts feeds from a
single `publishTarget` parameter, with PROD publishes restricted to the `master` and
`release/v*` branches.


### Fixed

- Duplicate entry removed from `packages.config`, which could produce inconsistent
restores.


## [1.0.5] — 2026-03-12

The first genuinely usable package. 1.0.3 shipped without the product assemblies, so
this is the first version that can be consumed on its own. It also carries four months
of engine work that had accumulated since 1.0.3.

### Breaking changes

- **JSON property names aligned with API V2 input** (CS-323, CS-325). Request and
response models serialise with the V2 names. Consumers that build or parse JSON
payloads by hand against the old names must update them.


### Added

- **The product assemblies are now in the package.**
`SSTHangerSelector.DesktopAPI.dll`, `SSTHangerSelector.Core.dll` and
`Newtonsoft.Json.dll` were added to `lib\net452`; previously only `SSTLibrary.dll`
was present, which made 1.0.3 unusable standalone.
- **`.props` / `.targets` MSBuild integration**
(`SSTHangerSelector.HybridDLL.props`, `SSTHangerSelector.HybridDLL.targets`). On
every consumer build these copy the packaged DLLs/PDBs and the
`SSTData_USA_SST.protobuf` / `SSTData_CANADA_SST.protobuf` data files into the
consumer's output directory under `Data\`, so the engine finds its runtime data with
no manual copy step.
- **`DataDirectoryHelper.SetDataDirectory(path)`** (CS-296) — points the engine at a
custom runtime data folder. It resets the `DataReader` and `DataServer` caches so the
new directory takes effect immediately; calling it with the current path is a no-op.
- **Multi-truss (flush bottom) support** for top-flange and face-mount hanger styles
(CS-282).
- **New material validation for the header**, rejecting unsupported header materials
during input validation.


### Changed

- **US selector database updated** to the 2025-11-24 data set (CS-295).
- **Canada selector database updated** to the 2026-03-04 data set (CS-319, CS-321),
with the Canadian enum mapping updated to match (CS-336).
- Online-mode request/response models extended so metal hangers and hanger series
deserialise correctly (ADP-421, ADP-422).
- Runtime data paths built with `Path.Combine` instead of string concatenation.


### Fixed

- **Load calculation fix for Canada** (CS-346), together with a fix for all obsolete
Canadian enum values that could otherwise cause incorrect or failed selections.
- **Non-firewall hangers no longer appear in results for wall headers** (CS-329).
- **Truss and hanger data read failure** corrected (CS-337).
- **Deserialisation of metal hangers and hanger series in online mode**
(ADP-421, ADP-422), resolving issues reported by customers.