Skip to content

feat!: migrate to .NET 10 (CRIT-001) - #465

Merged
laurentiu021 merged 1 commit into
mainfrom
feat/dotnet-10-migration
May 20, 2026
Merged

feat!: migrate to .NET 10 (CRIT-001)#465
laurentiu021 merged 1 commit into
mainfrom
feat/dotnet-10-migration

Conversation

@laurentiu021

@laurentiu021 laurentiu021 commented May 20, 2026

Copy link
Copy Markdown
Owner

Summary

  • BREAKING CHANGE: requires .NET 10 Desktop Runtime
  • Migrated all 4 projects from net9.0-windows to net10.0-windows
  • Updated all CI workflows (ci.yml, codeql.yml, release.yml) to use .NET 10 SDK
  • Updated README (prerequisites, tech stack)
  • Updated SECURITY.md (supported versions)
  • Updated CHANGELOG with breaking change entry

Package Compatibility

All packages verified compatible:

  • System.Management, Microsoft.Extensions.DI, coverlet — explicitly target net10.0
  • CommunityToolkit.Mvvm, Serilog, xunit, NSubstitute — via netstandard2.0/2.1
  • LiveChartsCore, SkiaSharp, H.NotifyIcon — via net6.0+/net8.0+ targets
  • ModernWpfUI — via net5.0-windows7.0 (unmaintained but functional)
  • OpenTK (transitive) — .NET Framework only, suppressed via NU1701

Test plan

  • CI build passes (all projects compile on .NET 10)
  • Unit tests pass
  • CodeQL analysis passes
  • Application launches and functions correctly on .NET 10 runtime

Summary by CodeRabbit

  • Chores
    • Upgraded project and all test suites to target .NET 10 (requires .NET 10 Desktop Runtime)
    • Updated CI/CD workflows and build infrastructure to use .NET 10 SDK
    • Updated build documentation, README, and installation prerequisites for .NET 10
    • Updated security policy to mark version 0.49.x as supported

Review Change Stack

BREAKING CHANGE: requires .NET 10 Desktop Runtime to run.
@coderabbitai

coderabbitai Bot commented May 20, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This PR migrates the entire SystemManager project from .NET 9 to .NET 10. All project target frameworks are bumped to net10.0-windows, CI workflows are updated to install the .NET 10 SDK, documentation reflects the new framework version and C# 14 language features, and the security support table is updated accordingly.

Changes

.NET 9 to 10 Migration

Layer / File(s) Summary
Migration documentation
CHANGELOG.md
Changelog entry documents the breaking change: migration to .NET 10 with net10.0-windows target framework across all projects and updated CI SDK version.
Project target framework updates
SysManager/SysManager/SysManager.csproj, SysManager/SysManager.Tests/SysManager.Tests.csproj, SysManager/SysManager.IntegrationTests/SysManager.IntegrationTests.csproj, SysManager/SysManager.UITests/SysManager.UITests.csproj
All four project files (main application and three test projects) updated from net9.0-windows to net10.0-windows target framework.
CI workflow SDK versions
.github/workflows/ci.yml, .github/workflows/codeql.yml, .github/workflows/release.yml
All three CI workflows (build-and-test, CodeQL, release) updated to install .NET 10 SDK (10.0.x) instead of .NET 9 SDK, ensuring CI can build and test the updated projects.
Public documentation and policy updates
README.md, SECURITY.md
README prerequisites and tech stack updated to .NET 10 with C# 14 language version; SECURITY.md version support table updated to mark 0.49.x as supported.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~3 minutes

Possibly related PRs

  • laurentiu021/SystemManager#291: Both PRs perform similar .NET version migrations by updating CI workflow SDK setup steps and project .csproj target framework properties (291: .NET 8→9, this PR: .NET 9→10).
  • laurentiu021/SystemManager#293: Both PRs update the SECURITY.md supported versions table to manage which SystemManager version ranges are marked as supported or unsupported.
  • laurentiu021/SystemManager#301: Both PRs update README.md to reflect changes in displayed .NET version requirements and framework specifications.

Poem

🐰 From nine to ten, we hop and bound,
With net10.0-windows newly crowned,
C# 14 and workflows bright,
Our CI pipelines feel so right! ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically summarizes the main change: migrating the project to .NET 10 with a breaking change indicator.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/dotnet-10-migration

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 26-30: Replace the mutable tag for the GitHub Action
"actions/setup-dotnet@v5" with a full commit SHA (e.g.,
actions/setup-dotnet@<commit-sha>) in the workflow so the action is immutably
pinned; update both occurrences of that uses: entry and any other matching
"actions/setup-dotnet@v5", obtain the correct commit SHA from the
actions/setup-dotnet repository (or the exact released commit you trust) and
substitute it, then run a quick grep for any remaining uses: lines matching
uses: ...@vN or `@vN.N` and pin them similarly.

In @.github/workflows/codeql.yml:
- Around line 25-28: The workflow currently uses the mutable tag
actions/setup-dotnet@v5; replace this with the action pinned to a full commit
SHA (use the repository reference actions/setup-dotnet@<commit-sha>) so the
runner uses an immutable digest; find the step that names
actions/setup-dotnet@v5 and update that reference while keeping the existing
with: dotnet-version: 10.0.x intact, ensuring you copy the commit SHA from the
actions/setup-dotnet repository release commit to fully pin the action.

In @.github/workflows/release.yml:
- Around line 29-32: Replace the mutable tag reference "actions/setup-dotnet@v5"
with a pinned full commit SHA for the actions/setup-dotnet action; update the
"uses" line so the action is referenced by its commit SHA (e.g.,
actions/setup-dotnet@<full-commit-sha>) while keeping the existing
"dotnet-version: 10.0.x" input unchanged to ensure the workflow uses a fixed,
auditable action version.

In `@README.md`:
- Line 453: The README has inconsistent framework versions: the top badge shows
`.NET-9.0` while a later line reads `.NET 10 (WPF, C# 14)`; update the badge
text/value to match the document-wide target (.NET 10) so both the badge string
`.NET-9.0` and any badge image alt/title are changed to `.NET-10` (or `.NET 10`)
to keep the README consistent; locate and edit the badge markup near the top
(the `.NET-9.0` token) and ensure any other occurrences of `.NET-9.0` in the
file are updated to `.NET 10` to avoid version drift.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8cfff4d9-018b-4e7b-b853-42afe5c1ed32

📥 Commits

Reviewing files that changed from the base of the PR and between 877ccdd and ca30cb6.

📒 Files selected for processing (10)
  • .github/workflows/ci.yml
  • .github/workflows/codeql.yml
  • .github/workflows/release.yml
  • CHANGELOG.md
  • README.md
  • SECURITY.md
  • SysManager/SysManager.IntegrationTests/SysManager.IntegrationTests.csproj
  • SysManager/SysManager.Tests/SysManager.Tests.csproj
  • SysManager/SysManager.UITests/SysManager.UITests.csproj
  • SysManager/SysManager/SysManager.csproj
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Analyze (csharp)
  • GitHub Check: Build & unit tests
🧰 Additional context used
🪛 zizmor (1.25.2)
.github/workflows/codeql.yml

[error] 26-26: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

.github/workflows/ci.yml

[error] 27-27: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 99-99: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

.github/workflows/release.yml

[error] 30-30: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

🔇 Additional comments (6)
CHANGELOG.md (1)

9-13: LGTM!

SysManager/SysManager/SysManager.csproj (1)

5-5: LGTM!

SysManager/SysManager.Tests/SysManager.Tests.csproj (1)

4-4: LGTM!

SysManager/SysManager.IntegrationTests/SysManager.IntegrationTests.csproj (1)

4-4: LGTM!

SysManager/SysManager.UITests/SysManager.UITests.csproj (1)

4-4: LGTM!

SECURITY.md (1)

15-17: LGTM!

Comment thread .github/workflows/ci.yml
Comment on lines +26 to 30
- name: Setup .NET 10 SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: 9.0.x
dotnet-version: 10.0.x

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Pin actions/setup-dotnet to a full commit SHA.

Line 27 and Line 99 use a mutable tag (@v5). That violates the pinned-action policy and weakens workflow supply-chain guarantees.

🔧 Proposed fix
-      - name: Setup .NET 10 SDK
-        uses: actions/setup-dotnet@v5
+      - name: Setup .NET 10 SDK
+        uses: actions/setup-dotnet@<full-commit-sha> # v5
         with:
           dotnet-version: 10.0.x
...
-      - name: Setup .NET 10 SDK
-        uses: actions/setup-dotnet@v5
+      - name: Setup .NET 10 SDK
+        uses: actions/setup-dotnet@<full-commit-sha> # v5
         with:
           dotnet-version: 10.0.x
#!/bin/bash
# Verify all workflows use SHA-pinned actions (no `@vN` or `@vN.N` tags).
rg -nP '^\s*uses:\s*[^@\s]+@v[0-9]+(\.[0-9]+)*\s*$' .github/workflows
# Expected after fix: no matches

Also applies to: 98-102

🧰 Tools
🪛 zizmor (1.25.2)

[error] 27-27: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 26 - 30, Replace the mutable tag for
the GitHub Action "actions/setup-dotnet@v5" with a full commit SHA (e.g.,
actions/setup-dotnet@<commit-sha>) in the workflow so the action is immutably
pinned; update both occurrences of that uses: entry and any other matching
"actions/setup-dotnet@v5", obtain the correct commit SHA from the
actions/setup-dotnet repository (or the exact released commit you trust) and
substitute it, then run a quick grep for any remaining uses: lines matching
uses: ...@vN or `@vN.N` and pin them similarly.

Comment on lines +25 to +28
- name: Setup .NET 10 SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: 9.0.x
dotnet-version: 10.0.x

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

cat -n .github/workflows/codeql.yml | head -40

Repository: laurentiu021/SystemManager

Length of output: 1181


🏁 Script executed:

find .github/workflows -type f -name "*.yml" -o -name "*.yaml"

Repository: laurentiu021/SystemManager

Length of output: 227


🏁 Script executed:

rg "uses:" .github/workflows/ -A 0 | head -30

Repository: laurentiu021/SystemManager

Length of output: 1339


🏁 Script executed:

rg "@[a-z0-9.]+" .github/workflows/ --no-filename | sort | uniq

Repository: laurentiu021/SystemManager

Length of output: 553


Pin actions/setup-dotnet to a full commit SHA.

Line 26 uses @v5 (mutable tag) instead of a commit digest, which breaks pinned-action hardening.

🧰 Tools
🪛 zizmor (1.25.2)

[error] 26-26: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/codeql.yml around lines 25 - 28, The workflow currently
uses the mutable tag actions/setup-dotnet@v5; replace this with the action
pinned to a full commit SHA (use the repository reference
actions/setup-dotnet@<commit-sha>) so the runner uses an immutable digest; find
the step that names actions/setup-dotnet@v5 and update that reference while
keeping the existing with: dotnet-version: 10.0.x intact, ensuring you copy the
commit SHA from the actions/setup-dotnet repository release commit to fully pin
the action.

Comment on lines +29 to +32
- name: Setup .NET 10 SDK
uses: actions/setup-dotnet@v5
with:
dotnet-version: 9.0.x
dotnet-version: 10.0.x

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

# First, let's verify the exact content of the release.yml file at lines 29-32
cat -n .github/workflows/release.yml | sed -n '25,35p'

Repository: laurentiu021/SystemManager

Length of output: 415


🏁 Script executed:

# Let's also check what other setup actions exist in this file and how they're pinned
rg 'uses:.*@' .github/workflows/release.yml -n

Repository: laurentiu021/SystemManager

Length of output: 240


🏁 Script executed:

# Check for other workflow files and their action pinning patterns
fd -e yml -e yaml .github/workflows/ -x rg 'uses:.*setup-dotnet' -l

Repository: laurentiu021/SystemManager

Length of output: 448


🏁 Script executed:

# Get a broader view of how GitHub actions are pinned across all workflows
rg 'uses:.*actions/' .github/workflows/ -n | head -30

Repository: laurentiu021/SystemManager

Length of output: 943


Pin actions/setup-dotnet to a full commit SHA.

Line 30 uses a tag reference (@v5) instead of a pinned commit SHA, leaving the release pipeline exposed to mutable action references that could be silently updated or compromised.

🧰 Tools
🪛 zizmor (1.25.2)

[error] 30-30: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml around lines 29 - 32, Replace the mutable tag
reference "actions/setup-dotnet@v5" with a pinned full commit SHA for the
actions/setup-dotnet action; update the "uses" line so the action is referenced
by its commit SHA (e.g., actions/setup-dotnet@<full-commit-sha>) while keeping
the existing "dotnet-version: 10.0.x" input unchanged to ensure the workflow
uses a fixed, auditable action version.

Comment thread README.md
## Tech stack

- .NET 9 (WPF, C# 13)
- .NET 10 (WPF, C# 14)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Update the framework badge to avoid version drift in the same document.

Line 453 says .NET 10, but the badge near the top still displays .NET-9.0 (Line 18). Please update it so README has a single consistent framework version.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` at line 453, The README has inconsistent framework versions: the
top badge shows `.NET-9.0` while a later line reads `.NET 10 (WPF, C# 14)`;
update the badge text/value to match the document-wide target (.NET 10) so both
the badge string `.NET-9.0` and any badge image alt/title are changed to
`.NET-10` (or `.NET 10`) to keep the README consistent; locate and edit the
badge markup near the top (the `.NET-9.0` token) and ensure any other
occurrences of `.NET-9.0` in the file are updated to `.NET 10` to avoid version
drift.

@laurentiu021
laurentiu021 merged commit 9f8252b into main May 20, 2026
5 checks passed
@laurentiu021
laurentiu021 deleted the feat/dotnet-10-migration branch May 20, 2026 13:46
laurentiu021 added a commit that referenced this pull request May 22, 2026
BREAKING CHANGE: requires .NET 10 Desktop Runtime to run.

Co-authored-by: laurentiu021 <laurentiu021@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant