Skip to content

Start 4.0: .NET Framework 4.7.2 floor, .NET 10 tests, preview version and agent definitions - #376

Merged
lahma merged 2 commits into
mainfrom
4x/groundwork
Nov 3, 2026
Merged

lahma merged 2 commits into
mainfrom
4x/groundwork

Conversation

@lahma

@lahma lahma commented Nov 3, 2026

Copy link
Copy Markdown
Collaborator

This PR starts the 4.0 cycle. It merges before the Parlot parser (#375), so that branch can drop its net462 workarounds.

Frameworks

  • The .NET Framework floor moves from 4.6.2 to 4.7.2. TargetFullFrameworkVersion is now net472 in src/, test/ and examples/. The example web projects and their HintPaths follow.
  • The modern test target moves from net8.0 to net10.0, since .NET 8 and 9 are leaving support. That covers 11 test projects and the benchmark. The non-Windows framework in Build.Test.cs was a stale net6.0 and is now net10.0.
  • Library targets stay netstandard2.0;net472. A net10.0 library target is planned as its own PR.
  • Spring.Core no longer references the Microsoft.CSharp, System.Reflection.Emit and System.Reflection.Emit.Lightweight packages on net472, because the framework has them.
  • System.Configuration.ConfigurationManager goes from 4.7.0 to 8.0.1. 4.7.0 pulls in System.Drawing.Common 4.7.0, which has a critical advisory (GHSA-rxg9-xrhp-64gj). That reaches consumers through Spring.Core, and the net10.0 audit turned it into a build error.
  • .NET 9 removed BinaryFormatter, and about 40 tests round-trip [Serializable] types through it. The test projects reference System.Runtime.Serialization.Formatters on net10.0 only. No test was disabled, ignored or excluded with #if. The library itself has no BinaryFormatter use.

4.0 groundwork

  • Untagged builds are versioned 4.0.0-preview-*, with assembly version 4.0.0.0.

  • BreakingChanges.txt has a "3.1 to 4.0" section. The old "3.0.x to next release" heading becomes "3.0.x to 3.1", since 3.1.0 has shipped.

  • Claude Code subagent definitions are in .claude/agents/:

    • spring-grunt (Sonnet) does mechanical work.
    • spring-implementer (Sonnet) writes code and its tests.
    • spring-reviewer (Opus, read-only) validates.
    • spring-ci-triage (Sonnet) handles CI failures and Dependabot PRs.

    AGENTS.md gets the routing rules, the packet format and an "Agent hazards" section: line endings, the -c Debug output path, the examples needing MSBuild 18, culture-dependent tests and Fallout's version lockstep. It also records the Gatsby 5 constraints on website dependencies.

Tests

Run locally on Windows:

Project Before, net8.0 Before, net462 After, net10.0 After, net472
Spring.Core.Tests 2519 / 1 / 21 2740 / 1 / 23 2519 / 1 / 21 2740 / 1 / 23
Spring.Aop.Tests 488 / 0 / 4 506 / 0 / 4 488 / 0 / 4 506 / 0 / 4
Spring.Data.Tests 175 / 0 / 0 187 / 0 / 0 175 / 0 / 0 187 / 0 / 0

Cells are passed / failed / skipped. The one failure is DateTimeFormatterTests.FormatUsingDefaults, which also fails on main on that machine because of a regional-settings override.

These projects also pass on both targets:

  • Data.NHibernate5
  • Messaging.Nms
  • Scheduling.Quartz3
  • Testing.NUnit
  • Testing.Microsoft

These pass on net472, the only target they have:

  • Web
  • Web.Mvc5
  • Template.Velocity(.Castle)

The examples weren't built locally; CI's CompileExamples covers them.

🤖 Generated with Claude Code

lahma and others added 2 commits November 3, 2026 12:59
Untagged builds now carry 4.0.0 as their version placeholder, and
BreakingChanges.txt gets a 3.1-to-4.0 section (3.1.0 has shipped).

Add Claude Code subagent definitions under .claude/agents, sized for
cost: Sonnet does mechanical and implementation work, and Opus only
validates. AGENTS.md documents the routing and the packet format, and
records the repo hazards that every agent needs: CRLF and UTF-16 files,
the -c Debug OutputPath quirk, examples needing MSBuild 18, culture-
dependent tests, Fallout lockstep. It also records the Gatsby 5
dependency constraints.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Marko Lahma <marko.lahma@gmail.com>
- TargetFullFrameworkVersion net462 -> net472 (src, test, examples); example
  csproj TargetFrameworkVersion v4.6.2 -> v4.7.2 and net462 HintPaths -> net472.
- Test/benchmark TFM net8.0 -> net10.0 (including TFM-conditioned items).
- Spring.Core: on net472 Microsoft.CSharp becomes a framework Reference;
  Microsoft.CSharp/System.Reflection.Emit(.Lightweight) packages now only for
  netstandard2.0 (in-box on net472). Microsoft.Bcl.HashCode kept.
- System.Configuration.ConfigurationManager 4.7.0 -> 8.0.1: 4.7.0 transitively
  pulls System.Drawing.Common 4.7.0 (critical advisory, NU1904 now an error
  for net10.0 test projects under NuGet audit).
- Tests: reference System.Runtime.Serialization.Formatters on net10.0 so the
  BinaryFormatter round-trip tests keep running.
- Fallout Test target: non-Windows framework net6.0 -> net10.0.
- README/AGENTS.md updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Marko Lahma <marko.lahma@gmail.com>
@lahma
lahma merged commit b24108e into main Nov 3, 2026
3 checks passed
@lahma
lahma deleted the 4x/groundwork branch November 3, 2026 11:38
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