|
| 1 | +# Brief Review: Issue #119 — Add support for net9.0 and net10.0 |
| 2 | + |
| 3 | +## Verdict: Revisions required before moving to ready/ |
| 4 | + |
| 5 | +The brief is largely solid — all stated file paths exist, all "current values" match the actual codebase, and the scope fits comfortably in one PR. |
| 6 | +However, four issues must be addressed before implementation begins. |
| 7 | + |
| 8 | +--- |
| 9 | + |
| 10 | +## Issue 1 — SIGNIFICANT: Examples project will not build in the devcontainer after the change |
| 11 | + |
| 12 | +**Location in brief:** Affected Files table (Examples row), Risks section |
| 13 | + |
| 14 | +**Problem:** |
| 15 | +The devcontainer (`/.devcontainer/Dockerfile`) is built on `mcr.microsoft.com/dotnet/sdk:9.0-bookworm-slim` and additionally installs the .NET 8.0 *runtime* only. |
| 16 | +Targets buildable in the devcontainer today: `net8.0`, `net9.0`, `netstandard2.0`. |
| 17 | + |
| 18 | +The brief changes `HdrHistogram.Examples.csproj` from `net8.0` to `net10.0` (single target). |
| 19 | +After this change, the Examples project cannot be built or run inside the devcontainer — the .NET 10 SDK is simply not present. |
| 20 | + |
| 21 | +The brief's "local failure is acceptable during transition" applies to the main library and test project; those are CI-authoritative artefacts. |
| 22 | +The Examples project is described in the brief itself as "a developer-facing runnable tool", so breaking its local buildability is a direct regression. |
| 23 | + |
| 24 | +**Required resolution (choose one and state it explicitly in the brief):** |
| 25 | + |
| 26 | +- **Option A (preferred):** Update `.devcontainer/Dockerfile` to use `mcr.microsoft.com/dotnet/sdk:10.0-bookworm-slim` as the base image and add an explicit install of the 8.0 and 9.0 runtimes. |
| 27 | + Add `.devcontainer/Dockerfile` to the Affected Files table. |
| 28 | +- **Option B:** Target Examples at `net9.0` (matching the current devcontainer SDK) and note this as an interim state pending a devcontainer upgrade in a follow-up issue. |
| 29 | +- **Option C:** Make Examples multi-target (`net10.0;net9.0`) so it is runnable wherever any of those SDKs is present. |
| 30 | + |
| 31 | +--- |
| 32 | + |
| 33 | +## Issue 2 — MINOR: CI YAML format for multiple SDK versions is ambiguous |
| 34 | + |
| 35 | +**Location in brief:** Affected Files table (ci.yml row) |
| 36 | + |
| 37 | +**Problem:** |
| 38 | +The brief states the required value is `8.0.x`, `9.0.x`, `10.0.x` (multi-line) but does not show the exact YAML syntax. |
| 39 | +The `actions/setup-dotnet@v4` action supports a multi-line scalar for `dotnet-version`, but an implementer unfamiliar with the action could also try multiple separate steps, which would not work with `cache: true` correctly. |
| 40 | + |
| 41 | +The current `ci.yml` also uses `cache: true` with `cache-dependency-path: '**/*.csproj'`. |
| 42 | +With multiple SDK versions, NuGet restore and caching behaviour should be confirmed. |
| 43 | + |
| 44 | +**Required fix:** |
| 45 | +Add an exact YAML snippet to the brief, for example: |
| 46 | + |
| 47 | +```yaml |
| 48 | +- uses: actions/setup-dotnet@v4 |
| 49 | + with: |
| 50 | + dotnet-version: | |
| 51 | + 8.0.x |
| 52 | + 9.0.x |
| 53 | + 10.0.x |
| 54 | + cache: true |
| 55 | + cache-dependency-path: '**/*.csproj' |
| 56 | +``` |
| 57 | +
|
| 58 | +--- |
| 59 | +
|
| 60 | +## Issue 3 — MINOR: BenchmarkDotNet risk has no resolution path |
| 61 | +
|
| 62 | +**Location in brief:** Risks and Open Questions section |
| 63 | +
|
| 64 | +**Problem:** |
| 65 | +The brief correctly flags that `BenchmarkDotNet 0.13.12` may not support `net10.0` and says "verify during implementation." |
| 66 | +That leaves the implementer without any guidance on what to do if verification fails. |
| 67 | + |
| 68 | +**Required fix:** |
| 69 | +Add a concrete fallback action, for example: |
| 70 | + |
| 71 | +> If `BenchmarkDotNet 0.13.12` fails to build against `net10.0`, upgrade both `BenchmarkDotNet` and `BenchmarkDotNet.Diagnostics.Windows` to the latest stable version as part of this PR and update the version in `spec/tech-standards/build-system.md` accordingly. |
| 72 | + |
| 73 | +--- |
| 74 | + |
| 75 | +## Issue 4 — MINOR: Spec update not itemised |
| 76 | + |
| 77 | +**Location in brief:** Affected Files table (build-system.md row), Acceptance Criteria |
| 78 | + |
| 79 | +**Problem:** |
| 80 | +The brief says to update `spec/tech-standards/build-system.md` to "reflect the new targets" but does not enumerate which sections require changes. |
| 81 | +The file currently has at least five distinct locations that reference the old framework targets: |
| 82 | + |
| 83 | +| Line | Section | Content to update | |
| 84 | +|------|---------|-------------------| |
| 85 | +| 24–26 | Main Library TargetFrameworks | `net8.0;netstandard2.0` → `net10.0;net9.0;net8.0;netstandard2.0` | |
| 86 | +| 35–37 | Test Project TargetFramework | `net8.0` → `net10.0;net9.0;net8.0` | |
| 87 | +| 42–45 | Benchmarking Project TargetFrameworks | `net8.0` → `net10.0;net9.0;net8.0` | |
| 88 | +| 226–228 | Benchmark Configuration list | "net8.0 (current LTS runtime)" → list all three runtimes | |
| 89 | +| 254 | Prerequisites | ".NET 8.0 SDK (or later)" → ".NET 10.0 SDK (or later)" | |
| 90 | + |
| 91 | +The AppVeyor section (lines 137–177) is already acknowledged as out of scope, which is correct. |
| 92 | + |
| 93 | +**Required fix:** |
| 94 | +Replace the single "update to reflect new targets" note with the table above. |
| 95 | +The Examples project section is absent from the spec (the spec does not currently document the Examples target framework), so no change is needed for Examples. |
| 96 | + |
| 97 | +--- |
| 98 | + |
| 99 | +## Summary of required actions |
| 100 | + |
| 101 | +| # | Severity | Action | |
| 102 | +|---|----------|--------| |
| 103 | +| 1 | Significant | Choose and document an explicit resolution for the devcontainer/Examples incompatibility | |
| 104 | +| 2 | Minor | Add exact YAML snippet for the multi-version `setup-dotnet` step | |
| 105 | +| 3 | Minor | Specify the fallback action if BenchmarkDotNet 0.13.12 is incompatible with net10.0 | |
| 106 | +| 4 | Minor | Replace vague spec-update note with the itemised list of sections to change | |
0 commit comments