Skip to content

Commit 77409c7

Browse files
committed
Align current ADR workflows and verify native fixture repairs
1 parent afd03cd commit 77409c7

8 files changed

Lines changed: 41 additions & 20 deletions

File tree

‎AGENTS.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ The explicit owner instruction to enable Orleans distributed directory and activ
203203
- The owner reiterated in this serialization review on 2026-10-03 that tests may run locally. Run local TUnit development regressions and bounded recovery/performance experiments when useful; this explicitly supersedes the former local-execution prohibition. Required delivered-source GitHub qualification still retains the exact SHA, run/job URL and original artifacts. Development builds and static source/governance checks are not runtime test results.
204204
- `restore`: `dotnet restore KeyLoad.slnx` with centrally pinned versions; current root forbids generating/committing package lock files. The historical CI baseline used locked mode; the current workflow is migrating to the no-lock policy.
205205
- `build`: `dotnet build KeyLoad.slnx --no-restore --configuration Release`; warnings-as-errors and current analyzers are configured in Directory.Build.props.
206-
- `test`: dispatch `gh workflow run ci.yml --repo managedcode/KeyLoad --ref main`, inspect `gh run view <run-id> --repo managedcode/KeyLoad`, and download the resulting test/comparison artifacts. CI executes `dotnet test --project tests/<project> --no-build --no-restore --configuration Release` for unit, recovery, RF3 and comparison suites. No skipped suite can count as passing.
206+
- `test`: dispatch `gh workflow run build-and-tests.yml --repo managedcode/KeyLoad --ref main`, inspect `gh run view <run-id> --repo managedcode/KeyLoad`, and retain original required test artifacts. Every test suite enters the actual Aspire AppHost; its native children execute TUnit for unit/scalar, analyzer, process recovery and genuine SDK/MCP RF3. Benchmarks owns native comparison measurement separately. No skipped required suite can count as passing.
207207
- `format`: `dotnet format KeyLoad.slnx --verify-no-changes --no-restore` is the required formatter command and CI gate; source configuration does not establish a green formatter qualification.
208208
- `analyze`: solution Release build with TreatWarningsAsErrors=true, AnalysisLevel=latest-all, SDK/style analysis and centrally attached KeyLoad.Analyzers; compiler SARIF reports are retained under artifacts/code-quality.
209209
- `complexity`: numeric policy limits below are mandatory and are enforced by source-owned KLD0030/KLD0031/KLD0032/KLD0033 during ordinary consumer builds; the analyzer infrastructure has a real compiler source-inventory fixture in CI. Configuration or a scoped build MUST NOT be reported as a passing full gate without the exact-SHA complete build and fixture qualification.
@@ -213,8 +213,8 @@ The explicit owner instruction to enable Orleans distributed directory and activ
213213
- .NET target is net10.0. C# 14.0 is explicitly pinned in Directory.Build.props. Root .editorconfig is the source of truth for formatting/style/analyzer severity; nested files require a concrete subtree purpose.
214214
- Use the Prostir root `.editorconfig` as the owner-selected baseline. Enable .NET static analyzers and build-time code-style checks for every solution project, with warnings treated as errors.
215215
- Keep repository-owned Roslyn rules in the KeyLoad analyzer project, attach them centrally to consuming projects, and retain compiler diagnostic reports so rules can be authored and verified in code.
216-
- Canonical CI: `.github/workflows/ci.yml`; Pages publication: `.github/workflows/pages.yml`. Skills installed by this bootstrap: none.
217-
- The latest owner correction 2026-10-03 supersedes that historical placement and the five-workflow dispatch: `gh workflow run ci.yml --repo managedcode/KeyLoad --ref main` builds/tests the project; `benchmarks.yml` runs all load/comparison suites then qualifies/publishes the same-run website; `release.yml` builds and publishes real database/packages/images with an immutable dated tag. Only these three workflows remain. All test qualification remains GitHub-only.
216+
- Canonical Build and Tests: `.github/workflows/build-and-tests.yml`; independent Website qualification and Pages publication: `.github/workflows/website.yml`. Skills installed by this bootstrap: none.
217+
- The current owner corrections require four workflows: `build-and-tests.yml` builds/tests the project; `benchmarks.yml` runs native load/comparison measurement and ends with the bounded Website dispatch; `website.yml` independently qualifies/builds/publishes the site on trusted main changes or manual dispatch; `release.yml` remains prepared/manual and publishes only after readiness or an explicit owner release request. Actual local Aspire tests are development evidence; delivered-source qualification remains exact-source Linux GitHub evidence. Preserve every required suite, source/run/artifact, privacy, topology, coverage and fault gate.
218218

219219
### Project AGENTS Policy
220220
- Multi-project solutions MUST keep one root `AGENTS.md` plus one local `AGENTS.md` in each project or module root.

‎docs/ADR/ADR-053-unified-visual-identity.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,10 @@ Rollout, rollback and verification:
140140
- **Rollout:** a single release. The console and the site deploy independently.
141141
- **Rollback:** revert the assets and restore the three init properties with the original source. Stored data is untouched.
142142
- **Verification:**
143-
- ci.yml unit tests: metrics ring and middleware.
143+
- build-and-tests.yml unit tests: metrics ring and middleware.
144144
- RF3: failure-log route template and voter membership through the real SDK and official MCP.
145145
- Real Chrome console flow: existing hooks plus new views.
146-
- pages.yml SiteTests: unchanged hooks, budgets and the parity test.
146+
- website.yml SiteTests: unchanged hooks, budgets and the parity test.
147147
- Subjective beauty is judged from desktop/mobile screenshots of a real RF3 cluster (manual exception). It never replaces a functional gate.
148148

149149
Join points: shared enum/DTO edits are lead-only, and backend and UI write scopes are disjoint. This ADR stays Accepted until exact-SHA unit, RF3 browser and site qualification pass.

‎docs/ADR/ADR-080-benchmark-failure-isolation.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ tuple (including the no-producer state); a changed or newly available tuple requ
4545
fresh qualification. Content-only success is not measured-cohort qualification.
4646

4747
The four workflow boundaries and optional selection contract are implemented by
48-
`ci.yml`, `benchmarks.yml`, `website.yml`, `release.yml`, and the current selection,
48+
`build-and-tests.yml`, `benchmarks.yml`, `website.yml`, `release.yml`, and the current selection,
4949
receipt, proof, freshness and builder modules under `scripts/Features/BenchmarkComparisons/`
5050
and `site/Features/BenchmarkComparisons/`. Stable detailed acceptance remains in
5151
[BenchmarkComparisons](../Features/BenchmarkComparisons.md), including these exact

‎docs/ADR/ADR-113-centralized-runtime-options.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,7 @@ acceptance remain mandatory and open.
598598
### Independent delivered-source analyzer coverage join
599599

600600
TASK-CQ-GENERAL-CI-001 maps REQ-CQ-006/012/013 and AC-CQ-009/033..038 to the
601-
existing Linux `analyzer-rules` job in `.github/workflows/ci.yml`. Prepare the
601+
existing Linux `analyzer-rules` job in `.github/workflows/build-and-tests.yml`. Prepare the
602602
unchanged 54-source analyzer inventory and exact settings copy after the native
603603
Release build, run the complete analyzer suite through the existing Aspire
604604
entry with the native Cobertura collector, then verify the original report

‎docs/implementation/status.json‎

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
"runtimeAdoption": "docs/Features/ClusterRouting/RuntimeAdoption.md",
2828
"runtimeJournal": "docs/Features/ClusterRouting/RuntimeJournal.md",
2929
"restorePassed": true,
30-
"canonicalBuildPassed": false,
31-
"verificationStage": "R105_current_source_build_in_progress_formatter_and_Aspire_regressions_pending_after_four_fixture_joins_R104_build_format_passed_full_unit4023_of4044_with21_failures_exact_source_Linux_qualification_pending",
30+
"canonicalBuildPassed": true,
31+
"verificationStage": "R106_current_source_full_build_and_format_passed_zero_drift_actual_Aspire_focused235_executed229_passed6_failed_full_unit_rerun_and_exact_source_Linux_qualification_pending",
3232
"capabilityReview": "docs/Features/ClusterRouting/CapabilityReview.md",
3333
"capabilityReviewCompleted": true,
3434
"documentationVerifiedOn": "2026-10-06",
@@ -44,7 +44,7 @@
4444
"Real operation Aspire unit/scalar/recovery/RF3, creator revocation, uncertain scheduling, functional coverage and exact-source Linux fault/resource/performance evidence"
4545
],
4646
"canonicalFormatterPassed": true,
47-
"localDevelopmentReceipt": "R104 source-bound development build/formatter and actual Aspire StorageRecovery190/190 passed; full Aspire unit4044 executed4023 passed21 failed with zero skips and source/assembly drift. R105 fixture repairs joined, fresh build/regressions pending. Coverage binary exists but full coverage/CRAP and Linux delivery remain unqualified."
47+
"localDevelopmentReceipt": "R106 full Release build and native formatter passed with 4,101 compile inputs, zero source drift, warnings or errors. Actual Aspire focused groups: ClusterRouting213/218, document mutations2/2, replica persistence8/8, reader capability2/2, native saga jobs4/5; zero skips and source/assembly drift. Six failures remain. Prior full R104 unit4023/4044 with21 failures remains red; a complete current rerun is pending. R104 unfiltered coverage includes performance child processes and is not qualifying functional coverage. Full coverage/CRAP and Linux delivery remain open."
4848
},
4949
"NUGET-REFRESH-001": {
5050
"title": "All published NuGet versions refreshed on 2026-10-05",
@@ -3778,18 +3778,35 @@
37783778
"closure": "only full mapped criteria and required evidence close an acceptance"
37793779
},
37803780
"codeDelivery": {
3781-
"currentBuild": "R105 full Release verification in progress after four reviewed current-fixture joins; R104 passed 4,101 inputs with zero source drift and zero warnings/errors",
3782-
"formatter": "R105 current-source formatter pending; R104 full dotnet format passed with zero source drift",
3781+
"currentBuild": "R106 full Release passed: 4,101 compile inputs, zero source drift, zero warnings/errors; original log SHA2569d494dae978bec8022ac81beedfef15f19d21813efb79b4b73971cf08a0adfc8",
3782+
"formatter": "R106 full native dotnet format passed with zero source drift after current fixture joins",
37833783
"verificationScope": "local source-bound development; Linux delivered-source gates remain open"
37843784
},
3785+
"currentArchitectureDecisions": {
3786+
"reviewed": 111,
3787+
"mermaidFences": 116,
3788+
"actualSvgRendersPassed": 116,
3789+
"indexEntriesVerified": 111,
3790+
"activeOldWorkflowFilenameReferences": 0,
3791+
"sourceBinding": "R5 binds all current ADR bytes and reuses verified R4 SVGs only after exact equality of all116 fence bodies; no new render or database qualification inferred"
3792+
},
37853793
"nativeQualification": {
37863794
"physicalNativeId8Omission": "passed",
37873795
"physicalRF3Id7MissingFieldFlow": "open",
3788-
"functionalCoverageAndCRAP": "open",
3796+
"functionalCoverageAndCRAP": "open; R104 unfiltered binary is ineligible because native performance children can contribute. R106 focused functional binaries are partial evidence only; full source-bound coverage and CRAP remain unmeasured",
37893797
"scalarRecoveryRF3AndLinuxDelivery": "open",
37903798
"currentStorage": "R104 actual Aspire/TUnit StorageRecovery 190/190 passed with zero source/assembly drift",
3791-
"BackupRestore": "R103 actual Aspire/TUnit 85/85 passed; current full R104 unit completed with21 failures overall, R105 qualification pending",
3792-
"completeUnit": "R104 actual Aspire full unit completed: 4,044 executed, 4,023 passed, 21 failed, zero skipped and zero source/assembly drift. Four current-fixture repairs for 18 failures joined; three remaining failures under diagnosis. R105 rerun pending."
3799+
"BackupRestore": "R103 actual Aspire/TUnit 85/85 passed; complete current-source rerun and Linux qualification remain pending",
3800+
"completeUnit": "Prior R104 actual Aspire full unit: 4,044 executed, 4,023 passed, 21 failed, zero skipped and source/assembly drift. R106 focused235 executed229 passed6 failed; these are not a complete suite. Full unfiltered ordinary unit rerun pending, separately from functional coverage.",
3801+
"focusedCurrentFixtures": {
3802+
"ClusterRouting": "213/218 passed; four C1 receipt/lifetime failures and one diagnostics failure remain",
3803+
"DocumentMutationImageReads": "2/2 passed",
3804+
"ReplicaNativePersistence": "8/8 passed",
3805+
"ReaderCapability": "2/2 passed",
3806+
"NativeSagaJobs": "4/5 passed; exact concrete coordinator/journal request Graph transition remains under diagnosis",
3807+
"sourceAndAssemblyDrift": 0,
3808+
"skipped": 0
3809+
}
37933810
}
37943811
}
37953812
},

‎tests/KeyLoad.UnitTests/Features/ClusterReplication/Cases/RequestCqrsReaderCapabilityTests.cs‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@ internal sealed class RequestCqrsReaderCapabilityTests(RequestCqrsCohortRuntimeF
1313
public async Task ZeroAndUnknownReaderCapabilitiesRejectAndRecoverWithHealthyVoter()
1414
{
1515
using var deadline = new CancellationTokenSource(TestBound, TimeProvider.System);
16-
await using var scenario = await RequestCqrsCohortScenario.StartAsync(runtime, deadline.Token);
17-
await VerifyNonCurrentMarkerAsync(scenario, StoreReaderContract.Unspecified, deadline.Token);
18-
await VerifyNonCurrentMarkerAsync(scenario, UnknownReaderCapability, deadline.Token);
16+
await VerifyNonCurrentMarkerAsync(runtime, StoreReaderContract.Unspecified, deadline.Token);
17+
await VerifyNonCurrentMarkerAsync(runtime, UnknownReaderCapability, deadline.Token);
1918
}
2019

2120
[Test]
@@ -49,14 +48,16 @@ public async Task ReachableNotReadyThirdVoterWithUnsupportedReaderRejectsMajorit
4948
await Assert.That(scenario.Client.HasCompatibleCohort).IsTrue();
5049
}
5150

52-
private static async Task VerifyNonCurrentMarkerAsync(RequestCqrsCohortScenario scenario,
51+
private static async Task VerifyNonCurrentMarkerAsync(RequestCqrsCohortRuntimeFixture runtime,
5352
int readerCapability, CancellationToken cancellationToken)
5453
{
54+
await using var scenario = await RequestCqrsCohortScenario.StartAsync(runtime, cancellationToken);
5555
scenario.PublishRemoteOneRecord(scenario.Discovery(RequestCqrsCohortScenario.FirstRemote, 1,
5656
runtimeJournalReaderContract: readerCapability));
5757
var failure = await Assert.ThrowsExactlyAsync<KeyLoadException>(
5858
() => scenario.Client.EnsureCompatibleCohortAsync(cancellationToken));
5959
await RequestCqrsReaderCapabilityAssertions.AssertIncompatibleAsync(failure);
60+
await Assert.That(scenario.RemoteOne.Requests).IsGreaterThan(0);
6061
await Assert.That(scenario.Client.HasCompatibleCohort).IsFalse();
6162
var readsAfterAdmission = scenario.RemoteOne.Requests;
6263
var cachedFailure = await Assert.ThrowsExactlyAsync<KeyLoadException>(() =>

‎tests/KeyLoad.UnitTests/Features/InternalSerialization/Cases/ReplicaNativePersistenceTests.cs‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ private static async Task AssertCurrentHardStateRejectionRecovers(ReplicaNativeF
115115
Dictionary<string, byte[]?> rejectionImage;
116116
using (var store = files.Open())
117117
{
118-
using (var initialized = new DurableReplicaLog(store, UnitExecutionOptions.ReplicaConfiguration(files.Configuration))) { }
118+
using (var initialized = new DurableReplicaLog(store, UnitExecutionOptions.ReplicaConfiguration(files.Configuration)))
119+
{ }
119120
var identity = store.Identity;
120121
originalState = store.Read(view => view.ReadOwnedValue(stateKey))!;
121122
originalMembership = store.Read(view => view.ReadOwnedValue(membershipKey))!;

‎tests/KeyLoad.UnitTests/Features/Messaging/Fixtures/NativeSagaTimeoutClusterConfigurators.cs‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ public void Configure(ISiloBuilder siloBuilder)
3636
siloBuilder.AddOrleansGraph(configureGraph: graph => graph
3737
.AllowClientCallGrain<IRequestGrain>()
3838
.AllowClientCallGrain<IRecurringDueCoordinatorGrain>()
39+
.AddGrainTransition<IRecurringDueCoordinatorGrain, IRequestGrain>()
40+
.MethodByName(nameof(IRecurringDueCoordinatorGrain.ProcessDueAsync), nameof(IRequestGrain.ExecuteStreamAsync)).And()
3941
.AddGrainTransition<IRequestGrain, IDatabaseReadGrain>()
4042
.MethodByName(nameof(IRequestGrain.ExecuteStreamAsync), nameof(IDatabaseReadGrain.ExecuteAsync)).And()
4143
.AddGrainTransition<IRequestGrain, ICommandPartitionGrain>()

0 commit comments

Comments
 (0)