Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions .github/workflows/benchmarks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,11 @@ jobs:
with:
fetch-depth: 0

# The branch's global.json pins the .NET 11 RC SDK (net11.0 + C# 15 preview only).
- name: Setup .NET 11 (RC)
# The branch's global.json pins the .NET 11 GA SDK (net11.0 + C# 15 preview only).
- name: Setup .NET 11 (GA)
uses: actions/setup-dotnet@v6
with:
dotnet-version: '11.0.100-rc.1.26425.128'
include-prerelease: true
dotnet-version: '11.0.x'

- name: Build the comparative benchmark (Release)
run: dotnet build "$BENCH_PROJECT" --configuration Release --framework net11.0
Expand Down
31 changes: 16 additions & 15 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,10 @@ permissions:
contents: read

env:
# .NET 11 SDK pin. `include-prerelease` stays until the GA SDK ships (2026-11-10); after that the value
# becomes '11.0.x' and the flag can be dropped. One place to change, three setup steps consume it.
DOTNET_VERSION: '11.0.100-rc.1.26425.128'
# .NET 11 SDK, GA since 2026-11-10. `11.0.x` follows the servicing patches; `global.json` still pins the
# exact baseline (11.0.100, rollForward latestPatch) for local builds and for the runtime-async codegen.
# One place to change, five setup steps consume it.
DOTNET_VERSION: '11.0.x'
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_NOLOGO: true
Expand All @@ -44,11 +45,10 @@ jobs:
with:
fetch-depth: 0

- name: Setup .NET 11 (RC)
- name: Setup .NET 11 (GA)
uses: actions/setup-dotnet@v6
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
include-prerelease: true

- name: Display .NET info
run: dotnet --info
Expand Down Expand Up @@ -190,12 +190,11 @@ jobs:
with:
fetch-depth: 0

# The global.json pin already selects the SDK; include-prerelease keeps setup-dotnet from rejecting it.
- name: Setup .NET 11 (RC)
# The global.json pin already selects the SDK; setup-dotnet only has to make a GA 11.0 SDK available.
- name: Setup .NET 11 (GA)
uses: actions/setup-dotnet@v6
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
include-prerelease: true

- name: Restore tools
run: dotnet tool restore --configfile NuGet.Config
Expand All @@ -208,7 +207,12 @@ jobs:

- name: Measure coverage and enforce the floor
shell: pwsh
run: ./tools/measure-coverage.ps1 -Floor 0.18
# `Category!=Allocation` keeps the allocation-ceiling canaries out of an *instrumented* run. Code coverage
# changes what the JIT is allowed to do, so those assertions stop measuring the engine and start measuring
# dotnet-coverage: measured 2026-11-12 on this job, the Runtime Async elision disappeared (0 → 71.424 bytes
# over 1.000 awaited calls, i.e. exactly the classic figure) and the batch-INSERT canary read 902 instead of
# 894 B/row. They still run — and gate — in the uninstrumented `Build and Test` jobs above.
run: ./tools/measure-coverage.ps1 -Floor 0.18 -Filter "Category!=Debug&Category!=Manual&Category!=Performance&Category!=Allocation"

- name: Upload coverage reports
if: ${{ !cancelled() }}
Expand Down Expand Up @@ -244,11 +248,10 @@ jobs:
with:
fetch-depth: 0

- name: Setup .NET 11 (RC)
- name: Setup .NET 11 (GA)
uses: actions/setup-dotnet@v6
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
include-prerelease: true

- name: Discover packable projects
id: discover-packable
Expand Down Expand Up @@ -324,11 +327,10 @@ jobs:
with:
fetch-depth: 0

- name: Setup .NET 11 (RC)
- name: Setup .NET 11 (GA)
uses: actions/setup-dotnet@v6
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
include-prerelease: true

- name: Download NuGet packages
uses: actions/download-artifact@v8
Expand Down Expand Up @@ -495,11 +497,10 @@ jobs:
with:
fetch-depth: 0

- name: Setup .NET 11 (RC)
- name: Setup .NET 11 (GA)
uses: actions/setup-dotnet@v6
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
include-prerelease: true

- name: Pack SharpCoreDB core
run: dotnet pack src/SharpCoreDB/SharpCoreDB.csproj --configuration Release --output ./artifacts --configfile NuGet.Config
Expand Down
5 changes: 2 additions & 3 deletions .github/workflows/compatibility-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ permissions:
contents: read

env:
# The server it builds is net11.0; this pin matches global.json until the GA SDK ships (2026-11-10).
DOTNET_VERSION: '11.0.100-rc.1.26425.128'
# The server it builds is net11.0; this pin matches global.json (11.0.100, GA since 2026-11-10).
DOTNET_VERSION: '11.0.x'
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_NOLOGO: true
Expand All @@ -43,7 +43,6 @@ jobs:
uses: actions/setup-dotnet@v6
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
include-prerelease: true

- name: Setup Python
uses: actions/setup-python@v7
Expand Down
7 changes: 3 additions & 4 deletions .github/workflows/dependency-submission.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,11 @@ jobs:
- name: Checkout
uses: actions/checkout@v7

# The solution it submits is net11.0; this pin matches global.json until the GA SDK ships (2026-11-10).
- name: Setup .NET 11 (RC)
# The solution it submits is net11.0; this pin matches global.json (11.0.100, GA since 2026-11-10).
- name: Setup .NET 11 (GA)
uses: actions/setup-dotnet@v6
with:
dotnet-version: '11.0.100-rc.1.26425.128'
include-prerelease: true
dotnet-version: '11.0.x'

- name: Submit dependencies
uses: advanced-security/component-detection-dependency-submission-action@v0.2.0
6 changes: 3 additions & 3 deletions .github/workflows/publish-manual.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ permissions:
packages: write

env:
DOTNET_VERSION: '11.0.100-rc.1.26425.128'
DOTNET_VERSION: '11.0.x'
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_NOLOGO: true
Expand All @@ -37,10 +37,10 @@ jobs:
with:
fetch-depth: 0

- name: Setup .NET 11 (RC)
- name: Setup .NET 11 (GA)
uses: actions/setup-dotnet@v6
with:
dotnet-version: '11.0.100-rc.1.26425.128'
dotnet-version: '11.0.x'

- name: Restore dependencies
run: dotnet restore SharpCoreDB.CI.slnf --configfile NuGet.Config
Expand Down
13 changes: 10 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,9 @@ former v2.1 RC line; see `docs/net11/PROMOTION_TO_MAIN.md`). The net10.0 / C# 14

## Running and verifying

- The .NET 11 RC SDK is pinned in `global.json` (`11.0.100-rc.1.26425.128`, `allowPrerelease`).
Target `net11.0` / C# 15 preview here; do not change the pin and do not assume a pre-.NET 11 context.
- The .NET 11 GA SDK is pinned in `global.json` (`11.0.100`, `rollForward: latestPatch`; GA since
2026-11-10 — an RC SDK no longer satisfies the pin). Target `net11.0` / C# 15 preview here; do not
change the pin and do not assume a pre-.NET 11 context.
- **`dotnet test` does not work in this repository** — Microsoft.Testing.Platform rejects the VSTest
target on .NET 10 SDK+. Run the MTP executable directly instead:
`tests/SharpCoreDB.Tests/bin/Release/net11.0/SharpCoreDB.Tests.exe -filterVSTest 'FullyQualifiedName~MyTestClass'`
Expand All @@ -59,6 +60,10 @@ former v2.1 RC line; see `docs/net11/PROMOTION_TO_MAIN.md`). The net10.0 / C# 14
- CI runs the core suite with `Category!=Debug&Category!=Manual&Category!=Performance`; 30
`Performance` and 3 `Debug` tests exist and are excluded by default. Tag new slow or benchmark
tests `[Trait("Category","Performance")]` so they stay out of the default run.
- Tag allocation-ceiling canaries `[Trait("Category","Allocation")]`. They stay in `Build and Test`, but the
**coverage** job adds `&Category!=Allocation`, because instrumentation changes what the JIT may do: measured
2026-11-12, code coverage made the Runtime Async elision disappear (0 → 71.424 bytes per 1.000 awaited calls,
exactly the classic figure) and pushed a batch-INSERT canary from 894 to 902 B/row.
- A clean build still emits ~299 warnings. Do not chase them as part of unrelated work.
- CI restores and builds `SharpCoreDB.CI.slnf` — not the `.sln` — with
`--configfile NuGet.Config /p:UseLocalProjectReferences=true`.
Expand Down Expand Up @@ -89,7 +94,9 @@ former v2.1 RC line; see `docs/net11/PROMOTION_TO_MAIN.md`). The net10.0 / C# 14
four times for acting on an inferred reading.
- **"We need a quiet machine" is not a blocker on this box — it is a script.** Check it with
`pwsh scripts/quiet-machine.ps1` (exit 0 = `QUIET`, 1 = `NOISY`) and clear what it names with
`-Apply [-StopServices] -BenchTempDir D:\scdb-bench-tmp`. Only *recording a baseline* needs the `QUIET`
`-Apply [-StopServices] -BenchTempDir D:\scdb-bench-tmp`. Run it from the repository root or pass the
absolute path to `scripts/quiet-machine.ps1`: typed from any other directory the *path* fails to resolve
before the script starts, so nothing runs and it looks like "it does nothing". Only *recording a baseline* needs the `QUIET`
verdict (`--write-baseline`, reason in the commit message); gate *verdicts* are not blocked by the one
standing finding (`WSearch` — the gate has passed on this box with it running: attempts 9/10 and
sessions 64, 65, 66-rerun, 67). Stopping `WSearch` needs an elevated shell, so an unfixable finding is a
Expand Down
17 changes: 17 additions & 0 deletions Directory.Build.targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project>

<!-- .NET 11 Runtime Async, defined once for every net11.0 project in the repository.
async/await then compiles to runtime-native async instead of a compiler-generated state machine per
method, and a synchronously-completing Task/Task<T>-returning method no longer allocates its result.
Measured on the .NET 11 GA SDK (11.0.100) with a 1.000-call loop: 71,4 B/call before, 0 B/call after,
and no IAsyncStateMachine types left in the assembly (async iterators keep theirs — see the canary).
Opt a single project out with <UseRuntimeAsync>false</UseRuntimeAsync>.
Canary: tests/SharpCoreDB.Tests/Net11/RuntimeAsyncCodegenTests.cs.
This lives in Directory.Build.targets rather than Directory.Build.props on purpose: props are
evaluated before the project body, where $(TargetFramework) is still empty, so a TFM-conditioned
switch there silently never applies. Targets are imported after the body and see the TFM. -->
<PropertyGroup Condition="$(TargetFramework.StartsWith('net11.0')) AND '$(UseRuntimeAsync)' != 'false'">
<Features>$(Features);runtime-async=on</Features>
</PropertyGroup>

</Project>
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ Use it when you need:
|---|---|---|
| Target framework | `net11.0` only (every project under `src`) | `net10.0` |
| Language | C# 15 (`LangVersion=preview`, always on) | C# 14 |
| SDK | .NET 11 RC, pinned in `global.json` (`11.0.100-rc.1.26425.128`, `allowPrerelease`, `rollForward: latestPatch`) | .NET 10 (`10.0.x`) |
| SDK | .NET 11 GA, pinned in `global.json` (`11.0.100`, `rollForward: latestPatch`) | .NET 10 (`10.0.x`) |
| Pipeline | `.github/workflows/ci.yml` | `.github/workflows/ci-net10.yml` |
| Packages | `2.1.2` — the 27 packable projects under `src` | `2.0.0.3` |
| Status | current release, receives new work | servicing only |
Expand Down
8 changes: 6 additions & 2 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,14 +151,18 @@
- ✅ **Content-verified immutable artifacts** (`ArtifactManifest`, canonical SHA-256 `artifact_id`, `IVerifiableIndex`, content-addressed `Verify()` with `BuildResult`).
- ⚠️ **Hybrid fusion scoring — partial** (`HybridFusionAlpha` in `VectorSearchOptions`, recorded in the manifest; the weighted scorer is not yet wired into GraphRAG ranking).
- ✅ **DiskANN-style index** (`DiskAnnIndex`, `DiskAnnConfig`, recall-focused graph, crossover testing helper — inspired by munarium-datastore `vector_diskann.rs`) + `CREATE VECTOR INDEX … USING DISKANN` DDL.
- ⬜ **True C# 15 union types** for `BuildResult` — deferred to .NET 11 GA (currently a `record` hierarchy).
- ⬜ **True C# 15 union types** — **shipped at GA as the opt-in `SharpCoreDB.Unions` namespace**
(`QueryOutcome`, `ExecuteOutcome`, `TableLookup`; `src/SharpCoreDB/Net11/Unions/UnionOutcomes.cs`).
`BuildResult` is deliberately **not** retrofitted onto a union — that would be a breaking change to a
shipped type, so it stays a `record` hierarchy. See `docs/net11/UNION_TYPES_DESIGN.md`.

### .NET 11 / C# 15 line (v2.1)
>> **Branch model:** **`master` is the net11.0 / C# 15 line** (the 2.1 line, promoted 2026-10-10 —
>> see `docs/net11/PROMOTION_TO_MAIN.md`). The v2.0 stable packages stay on **net10.0 / C# 14**, parked
>> on `release/v2.0`.

- Runtime Async enabled on the core project (`Features=runtime-async=on`)
- Runtime Async enabled on **every** net11.0 project (one definition in `Directory.Build.targets`; the core
project previously carried the only hand-copied switch alongside two EventSourcing projects)
- Native Zstandard compression (`ZstandardStream`) with quality presets + frame checksum
- AVX-VNNI-512 / SVE2 intrinsics and the SIMD lane APIs remain open for a later pass

Expand Down
Loading
Loading