From 56d1a77407243ff6b4996210d8924bbffcfe3cee Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 26 Feb 2026 11:55:27 +0000
Subject: [PATCH 1/2] Initial plan
From 6435687c7b68c0709b3d1f08d12f369084a52888 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 26 Feb 2026 11:58:27 +0000
Subject: [PATCH 2/2] Update CHANGELOG and docs for v1.4.0 (.NET 10 migration
release)
Co-authored-by: leeoades <2321091+leeoades@users.noreply.github.com>
---
CHANGELOG.md | 10 ++++++++++
CONTRIBUTING.md | 2 +-
README.md | 4 ++--
docs/AOT-and-Trim-Compatibility.md | 8 ++++----
docs/Target-Framework-Compatibility.md | 6 +++---
docs/index.md | 2 +-
test/FunctionalStateMachine.Benchmarks/README.md | 5 ++---
7 files changed, 23 insertions(+), 14 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a65bad2..af8f9eb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this
## [Unreleased]
+## [1.4.0] - 2026-02-26
+
+### Changed
+- **⬆️ .NET 10 upgrade** — The entire solution is now built on .NET 10
+ - SDK pinned to `10.0.102` via `global.json` (`rollForward: latestFeature`)
+ - Library projects (`FunctionalStateMachine.Core`, `FunctionalStateMachine.CommandRunner`) now ship `netstandard2.0` and `net10.0` builds (previously `net8.0`)
+ - Test and sample projects target `net10.0` (previously `net9.0`)
+ - `Microsoft.Extensions.DependencyInjection.Abstractions` updated `2.2.0` → `10.0.0`
+ - `Microsoft.Extensions.DependencyInjection` updated `9.0.0` → `10.0.0`
+
## [1.3.0] - 2026-02-23
### Added
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b8132c7..b89d3f9 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -10,7 +10,7 @@ This project adheres to a Code of Conduct that all contributors are expected to
### Prerequisites
-- [.NET 9.0 SDK](https://dotnet.microsoft.com/download) or later
+- [.NET 10.0 SDK](https://dotnet.microsoft.com/download) or later
- Git
- A code editor (Visual Studio, VS Code, Rider, etc.)
diff --git a/README.md b/README.md
index 8e9f3e7..d8cd809 100644
--- a/README.md
+++ b/README.md
@@ -488,9 +488,9 @@ Explore complete, runnable examples in the `/samples` directory:
## Advanced Topics
-This library targets both `netstandard2.0` (broad compatibility) and `net8.0` (AOT/trim-ready). Both NativeAOT and `PublishTrimmed` publishing are supported with zero runtime reflection.
+This library targets both `netstandard2.0` (broad compatibility) and `net10.0` (AOT/trim-ready). Both NativeAOT and `PublishTrimmed` publishing are supported with zero runtime reflection.
-- **[Target framework compatibility](docs/Target-Framework-Compatibility.md)** — .NET Standard 2.0 vs .NET 8+, what each target provides
+- **[Target framework compatibility](docs/Target-Framework-Compatibility.md)** — .NET Standard 2.0 vs .NET 10+, what each target provides
- **[AOT and trim compatibility](docs/AOT-and-Trim-Compatibility.md)** — NativeAOT, `PublishTrimmed`, how source generators eliminate reflection
---
diff --git a/docs/AOT-and-Trim-Compatibility.md b/docs/AOT-and-Trim-Compatibility.md
index 770dced..697bd89 100644
--- a/docs/AOT-and-Trim-Compatibility.md
+++ b/docs/AOT-and-Trim-Compatibility.md
@@ -1,6 +1,6 @@
# AOT and Trim Compatibility
-The `net8.0` build of `FunctionalStateMachine.Core` and `FunctionalStateMachine.CommandRunner` is fully compatible with:
+The `net10.0` build of `FunctionalStateMachine.Core` and `FunctionalStateMachine.CommandRunner` is fully compatible with:
- **NativeAOT** (`PublishAot=true`) — compiled ahead of time to a self-contained native binary
- **Trimming** (`PublishTrimmed=true`) — unused code removed at publish time to reduce binary size
@@ -10,8 +10,8 @@ The `net8.0` build of `FunctionalStateMachine.Core` and `FunctionalStateMachine.
| Package | `IsAotCompatible` | Reflection-free | Trim-safe |
|---|---|---|---|
-| `FunctionalStateMachine.Core` | ✅ (`net8.0+`) | ✅ | ✅ |
-| `FunctionalStateMachine.CommandRunner` | ✅ (`net8.0+`) | ✅ | ✅ |
+| `FunctionalStateMachine.Core` | ✅ (`net10.0`) | ✅ | ✅ |
+| `FunctionalStateMachine.CommandRunner` | ✅ (`net10.0`) | ✅ | ✅ |
| `FunctionalStateMachine.Diagrams` | N/A (build-time only) | N/A | N/A |
| `FunctionalStateMachine.Core.Generator` | N/A (build-time only) | N/A | N/A |
| `FunctionalStateMachine.CommandRunner.Generator` | N/A (build-time only) | N/A | N/A |
@@ -28,7 +28,7 @@ Add `true` to your `.csproj`:
Exe
- net9.0
+ net10.0
true
diff --git a/docs/Target-Framework-Compatibility.md b/docs/Target-Framework-Compatibility.md
index 90e6e76..e4c5421 100644
--- a/docs/Target-Framework-Compatibility.md
+++ b/docs/Target-Framework-Compatibility.md
@@ -7,15 +7,15 @@
| Target framework | Gets |
|---|---|
| `netstandard2.0` | Broadest compatibility — .NET Framework 4.6.1+, .NET Core 2.0+, Xamarin, Unity |
-| `net8.0` | AOT-compatible build with full trim analysis |
+| `net10.0` | AOT-compatible build with full trim analysis |
-When you reference the NuGet package from a `net8.0` or `net9.0` project, NuGet automatically selects the `net8.0` build. When you reference it from a `netstandard2.0`-compatible target, NuGet selects the `netstandard2.0` build.
+When you reference the NuGet package from a `net10.0` project, NuGet automatically selects the `net10.0` build. When you reference it from any other target (including `net8.0`, `net9.0`, or `netstandard2.0`-compatible targets), NuGet selects the `netstandard2.0` build.
## Feature comparison
All state machine features are identical across both targets. The only difference is in the internals:
-| Feature | `netstandard2.0` | `net8.0+` |
+| Feature | `netstandard2.0` | `net10.0` |
|---|---|---|
| Full fluent API | ✅ | ✅ |
| Guards, conditionals | ✅ | ✅ |
diff --git a/docs/index.md b/docs/index.md
index 8007ca2..47fd3d1 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -33,7 +33,7 @@ Welcome to the Functional State Machine docs. Each guide introduces a feature, w
## Advanced
-- [Target framework compatibility (.NET Standard 2.0 vs .NET 8+)](Target-Framework-Compatibility.md)
+- [Target framework compatibility (.NET Standard 2.0 vs .NET 10+)](Target-Framework-Compatibility.md)
- [AOT and trim compatibility](AOT-and-Trim-Compatibility.md)
## For Contributors
diff --git a/test/FunctionalStateMachine.Benchmarks/README.md b/test/FunctionalStateMachine.Benchmarks/README.md
index 2962a95..17ca061 100644
--- a/test/FunctionalStateMachine.Benchmarks/README.md
+++ b/test/FunctionalStateMachine.Benchmarks/README.md
@@ -33,7 +33,7 @@ Results will be saved to `BenchmarkDotNet.Artifacts/results/` including:
## Typical Results
-*Benchmarks run on .NET 9.0*
+*Benchmarks run on .NET 10.0*
| Method | Mean | Allocated |
|---------------------------- |----------:|----------:|
@@ -63,8 +63,7 @@ Use BenchmarkDotNet's built-in analysis:
```bash
# Compare different .NET versions
-dotnet run -c Release -f net8.0
-dotnet run -c Release -f net9.0
+dotnet run -c Release -f net10.0
# Memory profiling
dotnet run -c Release --filter *Fire*