From 3147927d2ac3867dc6ebab624b66e644fcab80ae Mon Sep 17 00:00:00 2001 From: Malcolm Nixon Date: Sun, 12 Jul 2026 22:05:21 -0400 Subject: [PATCH 1/2] docs(roadmap): ground Tool package size reduction in confirmed pack findings --- ROADMAP.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/ROADMAP.md b/ROADMAP.md index 612bfdc..a052047 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -333,6 +333,40 @@ that: local feed → restore → exercise parse→layout→render-to-SVG-in-memory and render-to-PNG (again proving SkiaSharp natives for `.Png` consumers). +### Tool package size (confirmed: 435 MB, over NuGet.org's ~250 MB limit) + +Packing `DemaConsulting.SysML2Tools.Tool` locally confirmed a **434.94 MB** `.nupkg` — well past +NuGet.org's hard size limit. Inspecting the archive found three compounding, independently +fixable causes: + +1. **Native SkiaSharp debug symbols ship in the package.** `761.7 MB` (57%) of the uncompressed + content is `libSkiaSharp.pdb` (Windows x86/x64/arm64) — third-party native debug symbols nobody + debugs into. These arrive as ordinary content files from the transitive `SkiaSharp` package (via + `DemaConsulting.Rendering.Skia`) and are not excluded today. **Fix:** add an MSBuild target + (e.g. `BeforeTargets="_GetPackageFiles"` or the tool-packing equivalent) that filters + `**/native/*.pdb` out of the packed file list. +2. **Full triplication from multi-targeting.** `Tool` targets `net8.0;net9.0;net10.0`, and + `PackAsTool` stages a complete, independent `tools/{tfm}/any/runtimes/**` tree per TFM — tripling + every native asset. **.NET 9 is STS and already out of support**; `.NET 8` (LTS, supported to + Nov 2026) and `.NET 10` (current LTS) are the only versions worth shipping. **Decision: target + `net10.0` only** for the `Tool` package (single TFM, maximal size reduction; `Core`/`Language`/ + `Stdlib` remain multi-targeted `net8.0;net9.0;net10.0` since they're ordinary libraries consumed + by projects on any of those TFMs — this change is scoped to `Tool` only). +3. **Untrimmed RID matrix.** The transitive `SkiaSharp` native-asset packages bundle every RID + SkiaSharp supports, including ones this project doesn't need to support (`linux-loongarch64`, + `linux-bionic-*`, `linux-musl-loongarch64`, etc.). The `Tool.csproj`'s own OS-conditioned + `SkiaSharp.NativeAssets.{Win32,Linux.NoDependencies,macOS}` references are effectively + redundant/dead — the full matrix arrives unconditionally via `DemaConsulting.Rendering.Skia` + regardless of host OS. **Fix:** pin an explicit, curated RID list (Windows x64/x86/arm64, Linux + x64/arm64 + musl x64/arm64, macOS x64/arm64) so only supported platforms are packaged. + +**Scope:** `src/DemaConsulting.SysML2Tools.Tool/DemaConsulting.SysML2Tools.Tool.csproj` only. +**Visual/verification gate:** `dotnet pack` the `Tool` project and confirm the resulting +`.nupkg` is comfortably under NuGet.org's limit (target: well under 100 MB); the packed tool must +still install and render correctly (SVG + PNG) on at least the currently-tested OS matrix +(Windows/Linux/macOS) — this is exactly what the "Package validation gate" tool smoke test above +already covers, so it doubles as the regression check for this fix. + ### Licensing, docs, gallery, publish - **Licensing/attribution:** `--licenses` output covering Noto Sans (SIL OFL 1.1) and other OTS; From 59675c5e40b1194ae73c7f2c0d698c243aa414f4 Mon Sep 17 00:00:00 2001 From: Malcolm Nixon Date: Sun, 12 Jul 2026 23:09:00 -0400 Subject: [PATCH 2/2] fix(tool): reduce packed Tool nupkg size from 435 MB to ~43 MB - Target net10.0 only for the Tool project (Core/Language/Stdlib remain net8.0;net9.0;net10.0); .NET 9 is STS and already out of support, and triple-targeting tripled every native SkiaSharp asset in the package. - Add TrimPublishedNativeAssets MSBuild target (AfterTargets= ComputeResolvedFilesToPublishList) that strips transitive native SkiaSharp .pdb debug symbols and non-curated RID directories from the published/packed output. - Remove the now-dead-weight OS-conditioned SkiaSharp.NativeAssets.* PackageReferences (the full RID matrix already arrives unconditionally via DemaConsulting.Rendering.Skia's own SkiaSharp dependency) and pin to a curated RID allowlist: win-x64/x86/arm64, linux-x64/arm64, linux-musl-x64/arm64, osx. - Update Tool.Tests.csproj to net10.0-only to match the ProjectReference. - Narrow build.yaml's integration-test job matrix to 10.x only. - Update requirements/design/verification docs and README to reflect the net10.0-only Tool platform. --- .github/workflows/build.yaml | 2 +- README.md | 3 +- docs/design/sysml2-tools-tool.md | 2 +- docs/design/sysml2-tools-tool/program.md | 2 +- .../platform-requirements.yaml | 20 +------ docs/verification/sysml2-tools-tool.md | 8 +-- docs/verification/sysml2-tools-tool/export.md | 4 +- docs/verification/sysml2-tools-tool/help.md | 4 +- docs/verification/sysml2-tools-tool/query.md | 6 +-- docs/verification/sysml2-tools-tool/render.md | 4 +- .../DemaConsulting.SysML2Tools.Tool.csproj | 53 +++++++++++++++++-- .../ProgramStrings.cs | 2 +- ...maConsulting.SysML2Tools.Tool.Tests.csproj | 2 +- 13 files changed, 70 insertions(+), 42 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 3d7c434..a98d102 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -313,7 +313,7 @@ jobs: strategy: matrix: os: [windows-latest, ubuntu-latest, macos-latest] - dotnet-version: ['8.x', '9.x', '10.x'] + dotnet-version: ['10.x'] steps: # === INSTALL DEPENDENCIES === diff --git a/README.md b/README.md index 6f1110b..8ce5c06 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,8 @@ documentation, CI/CD pipelines, and AI-assisted modeling workflows. - **Self-Validation**: Built-in validation tests with TRX/JUnit output for regulated environments - **Multi-Platform Support**: Builds and runs on Windows, Linux, and macOS -- **Multi-Runtime Support**: Targets .NET 8, 9, and 10 +- **Multi-Runtime Support**: CLI tool targets .NET 10; library packages (`Core`/`Language`/ + `Stdlib`) support .NET 8, 9, and 10 ## Installation diff --git a/docs/design/sysml2-tools-tool.md b/docs/design/sysml2-tools-tool.md index 432c530..57fa7d6 100644 --- a/docs/design/sysml2-tools-tool.md +++ b/docs/design/sysml2-tools-tool.md @@ -136,7 +136,7 @@ N/A - not a safety-classified software item. ## Design Constraints -- Platform: multi-targets net8.0, net9.0, and net10.0 framework compatibility specifications on Windows, Linux, and macOS. +- Platform: targets net10.0 framework compatibility specifications on Windows, Linux, and macOS. - Threading: single-threaded console application; no shared mutable state between invocations. - Immutability: `Context` properties are set once at construction via `init` accessors and are read-only thereafter. diff --git a/docs/design/sysml2-tools-tool/program.md b/docs/design/sysml2-tools-tool/program.md index bbbbf51..d03a81c 100644 --- a/docs/design/sysml2-tools-tool/program.md +++ b/docs/design/sysml2-tools-tool/program.md @@ -92,7 +92,7 @@ accessor is hand-written (a thin static class with one `ResourceManager` field a `public static string` property per resx key) rather than generated by the Visual Studio "ResXFileCodeGenerator" custom tool, because that generator only runs inside Visual Studio — a hand-written class builds identically under `dotnet build`/CI on every target framework -(net8.0/net9.0/net10.0), with or without an IDE. Adding a future locale (e.g., French) +(net10.0), with or without an IDE. Adding a future locale (e.g., French) requires zero code changes: adding `ProgramStrings.fr.resx` with the same key names is enough — the .NET SDK's default resx-embedding behavior produces a satellite assembly that `ResourceManager` discovers automatically based on the current UI culture, falling back to diff --git a/docs/reqstream/sysml2-tools-tool/platform-requirements.yaml b/docs/reqstream/sysml2-tools-tool/platform-requirements.yaml index b6ecc36..c074ee0 100644 --- a/docs/reqstream/sysml2-tools-tool/platform-requirements.yaml +++ b/docs/reqstream/sysml2-tools-tool/platform-requirements.yaml @@ -4,7 +4,7 @@ # These requirements specify the platforms and runtimes the tool must support. # They ensure the tool works across the required execution environments. # -# Test links can include a source filter prefix (e.g. "windows@", "ubuntu@", "dotnet8.x@") to restrict +# Test links can include a source filter prefix (e.g. "windows@", "ubuntu@", "dotnet10.x@") to restrict # which test results count as evidence for a requirement. This is critical for platform and runtime # requirements - removing these filters invalidates the evidence-based proof. # @@ -12,8 +12,6 @@ # windows@TestName - proves the test passed on a Windows platform # ubuntu@TestName - proves the test passed on a Linux (Ubuntu) platform # macos@TestName - proves the test passed on a macOS platform -# dotnet8.x@TestName - proves the self-validation test ran with .NET 8.x runtime -# dotnet9.x@TestName - proves the self-validation test ran with .NET 9.x runtime # dotnet10.x@TestName - proves the self-validation test ran with .NET 10.x runtime sections: @@ -46,22 +44,6 @@ sections: - "macos@TemplateTool_VersionDisplay" - "macos@TemplateTool_HelpDisplay" - - id: Template-Platform-Net8 - title: The tool shall support .NET 8 runtime. - justification: | - .NET 8 is an LTS release providing long-term stability for enterprise users. - tests: - - "dotnet8.x@TemplateTool_VersionDisplay" - - "dotnet8.x@TemplateTool_HelpDisplay" - - - id: Template-Platform-Net9 - title: The tool shall support .NET 9 runtime. - justification: | - .NET 9 support enables users to leverage the latest .NET features. - tests: - - "dotnet9.x@TemplateTool_VersionDisplay" - - "dotnet9.x@TemplateTool_HelpDisplay" - - id: Template-Platform-Net10 title: The tool shall support .NET 10 runtime. justification: | diff --git a/docs/verification/sysml2-tools-tool.md b/docs/verification/sysml2-tools-tool.md index 4b54753..3ed1782 100644 --- a/docs/verification/sysml2-tools-tool.md +++ b/docs/verification/sysml2-tools-tool.md @@ -20,13 +20,13 @@ Detailed, per-subsystem verification for each of the tool's eight subsystems (`C ## Test Environment -Integration tests run on .NET 8.0, .NET 9.0, and .NET 10.0 across Windows, Linux, and macOS. -All scenarios are expected to produce identical results on all supported runtime and platform -combinations. Temporary files and directories are created and cleaned up within each test. +Integration tests run on .NET 10.0 across Windows, Linux, and macOS. All scenarios are expected +to produce identical results on all supported platforms. Temporary files and directories are +created and cleaned up within each test. ## Acceptance Criteria -- All integration tests pass with zero failures across all supported runtimes and platforms. +- All integration tests pass with zero failures across all supported platforms. - Exit code 0 is returned for all valid invocations. - Exit code non-zero is returned for all invalid argument combinations. - Results files are created at the specified paths when `--results` is used with `--validate`. diff --git a/docs/verification/sysml2-tools-tool/export.md b/docs/verification/sysml2-tools-tool/export.md index a7b7628..fa47b7d 100644 --- a/docs/verification/sysml2-tools-tool/export.md +++ b/docs/verification/sysml2-tools-tool/export.md @@ -10,12 +10,12 @@ test in `test/DemaConsulting.SysML2Tools.Tool.Tests/SelfTest/ValidationTests.cs` invoke `Context.Create`, `ExportCommand.RunAsync`, `Program.RunAsync`, and (for the end-to-end scenario) the built tool as a real process via `Runner.Run`, asserting on captured console output, exit code, produced file content, and deserialized JSON/JSONL -shape. Tests run against all three target frameworks. +shape. Tests run against the tool's target framework. #### Test Environment - Framework: xUnit v3 -- Target frameworks: net8.0, net9.0, net10.0 +- Target framework: net10.0 - Test project: `DemaConsulting.SysML2Tools.Tool.Tests` - Dependencies: `DemaConsulting.SysML2Tools.Tool` (internal access via `InternalsVisibleTo`); OMG reference models under `test/SysMLModels/OMG/` (locatable via a repo-root search diff --git a/docs/verification/sysml2-tools-tool/help.md b/docs/verification/sysml2-tools-tool/help.md index 4ef2e20..1715518 100644 --- a/docs/verification/sysml2-tools-tool/help.md +++ b/docs/verification/sysml2-tools-tool/help.md @@ -12,12 +12,12 @@ The Help subsystem is verified using unit/integration tests in two files under `HelpArgumentParser.Parse` directly (parser-only tests), and `Context.Create` + `Program.RunAsync` (end-to-end tests), asserting on captured console output, exit code, and byte-for-byte parity between `help []` and ` [] --help`. Tests -run against all three target frameworks. +run against the tool's target framework. #### Test Environment - Framework: xUnit v3 -- Target frameworks: net8.0, net9.0, net10.0 +- Target framework: net10.0 - Test project: `DemaConsulting.SysML2Tools.Tool.Tests` - Dependencies: `DemaConsulting.SysML2Tools.Tool` (internal access via `InternalsVisibleTo`) diff --git a/docs/verification/sysml2-tools-tool/query.md b/docs/verification/sysml2-tools-tool/query.md index 4bf008c..d960240 100644 --- a/docs/verification/sysml2-tools-tool/query.md +++ b/docs/verification/sysml2-tools-tool/query.md @@ -9,13 +9,13 @@ The Query subsystem is verified using unit/integration tests in five files under `test/DemaConsulting.SysML2Tools.Tool.Tests/Cli/ContextTests.cs`. Tests invoke `Context.Create`, `QueryCommand.RunAsync`, `Program.RunAsync`, and (for a subset of real-workspace scenarios) `QueryEngine`'s verb methods directly, asserting on captured -console output, exit code, and `QueryResult` shape. Tests run against all three target -frameworks. +console output, exit code, and `QueryResult` shape. Tests run against the tool's target +framework. #### Test Environment - Framework: xUnit v3 -- Target frameworks: net8.0, net9.0, net10.0 +- Target framework: net10.0 - Test project: `DemaConsulting.SysML2Tools.Tool.Tests` - Dependencies: `DemaConsulting.SysML2Tools.Tool` (internal access via `InternalsVisibleTo`); OMG reference models under `test/SysMLModels/OMG/` (locatable via a repo-root search diff --git a/docs/verification/sysml2-tools-tool/render.md b/docs/verification/sysml2-tools-tool/render.md index c582a53..bc85f0a 100644 --- a/docs/verification/sysml2-tools-tool/render.md +++ b/docs/verification/sysml2-tools-tool/render.md @@ -6,12 +6,12 @@ The Render subsystem is verified using unit tests in `test/DemaConsulting.SysML2Tools.Tool.Tests/Render/RenderSubsystemTests.cs`. Tests invoke `Program.RunAsync` with controlled `Context` instances and assert on context output and exit code. File-writing scenarios use a temporary directory -(`Path.GetTempPath()`). Tests run against all three target frameworks. +(`Path.GetTempPath()`). Tests run against the tool's target framework. ### Test Environment - Framework: xUnit v3 -- Target frameworks: net8.0, net9.0, net10.0 +- Target framework: net10.0 - Test project: `DemaConsulting.SysML2Tools.Tool.Tests` - Dependencies: `DemaConsulting.SysML2Tools.Tool` (internal access via `InternalsVisibleTo`) diff --git a/src/DemaConsulting.SysML2Tools.Tool/DemaConsulting.SysML2Tools.Tool.csproj b/src/DemaConsulting.SysML2Tools.Tool/DemaConsulting.SysML2Tools.Tool.csproj index e34166f..ed8f6b0 100644 --- a/src/DemaConsulting.SysML2Tools.Tool/DemaConsulting.SysML2Tools.Tool.csproj +++ b/src/DemaConsulting.SysML2Tools.Tool/DemaConsulting.SysML2Tools.Tool.csproj @@ -2,7 +2,7 @@ Exe - net8.0;net9.0;net10.0 + net10.0 latest enable enable @@ -50,11 +50,19 @@ - - - + + + ;win-x64;win-x86;win-arm64;linux-x64;linux-arm64;linux-musl-x64;linux-musl-arm64;osx; + + @@ -99,4 +107,41 @@ + + + + + + + + + + + diff --git a/src/DemaConsulting.SysML2Tools.Tool/ProgramStrings.cs b/src/DemaConsulting.SysML2Tools.Tool/ProgramStrings.cs index cd4a7f6..08f4b7b 100644 --- a/src/DemaConsulting.SysML2Tools.Tool/ProgramStrings.cs +++ b/src/DemaConsulting.SysML2Tools.Tool/ProgramStrings.cs @@ -28,7 +28,7 @@ namespace DemaConsulting.SysML2Tools; /// ProgramStrings.resx. Deliberately not generated by the Visual Studio /// "ResXFileCodeGenerator" custom tool, because that generator only runs inside Visual /// Studio and is not invoked by dotnet build/CI — this class must build identically -/// everywhere dotnet build runs (net8.0/net9.0/net10.0, any OS, any IDE or none). +/// everywhere dotnet build runs (net10.0, any OS, any IDE or none). /// /// /// Adding a future locale requires zero code changes: place a diff --git a/test/DemaConsulting.SysML2Tools.Tool.Tests/DemaConsulting.SysML2Tools.Tool.Tests.csproj b/test/DemaConsulting.SysML2Tools.Tool.Tests/DemaConsulting.SysML2Tools.Tool.Tests.csproj index 2a96dc9..4e7e47c 100644 --- a/test/DemaConsulting.SysML2Tools.Tool.Tests/DemaConsulting.SysML2Tools.Tool.Tests.csproj +++ b/test/DemaConsulting.SysML2Tools.Tool.Tests/DemaConsulting.SysML2Tools.Tool.Tests.csproj @@ -3,7 +3,7 @@ Exe - net8.0;net9.0;net10.0 + net10.0 latest enable enable