Skip to content

Commit f3453f2

Browse files
committed
Verify TimeProvider clocks and deterministic storage budgets
1 parent 7e218a1 commit f3453f2

8 files changed

Lines changed: 186 additions & 42 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,8 +378,8 @@ For detailed status, see the [implementation tracker](docs/implementation/status
378378

379379
The [TimeProvider migration](docs/Features/ResourceExecution/TimeProvider.md)
380380
supplies explicit clocks for timestamps, elapsed budgets and managed timers.
381-
Its local Aspire analyzer suite passes 388 tests; controlled real-operation
382-
test sources are joined, while full build and runtime qualification remain open.
381+
Controlled-time regressions and the remaining runtime qualification gates
382+
are tracked in the feature specification.
383383

384384
Website publication runs independently in CI when source changes. It uses the newest completed benchmark run with a verified aggregate when available; otherwise it publishes the product site without performance figures. A completed benchmark run triggers a fresh website build. [ADR-112](docs/ADR/ADR-112-independent-website-publication.md) records the source, artifact and publication checks; the revised route still needs delivered-source Linux CI and Pages verification.
385385

‎docs/Features/ResourceExecution/TimeProvider.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# ResourceExecution: controlled time
22

3-
Status: source joined; full build and runtime qualification remain incomplete. Local development verification is distinct from Linux RF3 qualification.
3+
Status: source joined; local complete build, formatter and focused runtime tests passed. Full runtime qualification remains incomplete. Local development verification is distinct from Linux RF3 qualification.
44
Decision: [ADR-115](../../ADR/ADR-115-time-provider.md).
55

66
## Goal and scope
@@ -30,9 +30,9 @@ Validation skills in order: quality-ci (check native gates), analyzer-config (ex
3030

3131
## Development evidence, 2026-10-06
3232

33-
The [development receipt](../../implementation/time-provider-development-2026-10-06.json) records actual commands, native report hash and unresolved gates. The complete Aspire-owned analyzer suite passed 388/388 tests, including readonly Stopwatch fields and the controlled migration deadline. Product clock modules, ComparisonHost and the final integration test sources compile with analyzers. The complete solution and canonical formatter remain blocked by parallel BackupRestore/cancellation-flow diagnostics; process recovery stops during prior-source preparation. The local RF3 suite failed (16 passed, 142 failed) on cluster-profile reparse paths and unavailable prior-server proof. These are local macOS development observations, with no Linux qualification, coverage, CRAP or performance claim.
33+
The [development receipt](../../implementation/time-provider-development-2026-10-06.json) records actual commands, native report hashes and unresolved gates. The complete Aspire-owned analyzer suite passed 388/388 tests, including readonly Stopwatch fields and the controlled migration deadline. The final complete Release solution build passed with zero warnings/errors, and the canonical formatter passed after the storage-policy clock fixture edit. Eight new controlled-time operation cases, three existing read-budget cases and six storage-policy cases passed through Aspire. A duplicate whole-unit attempt was gracefully stopped while another shared whole-unit run remained active; its shutdown exit zero is not a test pass. The full unit gate still has startup, CLI/process and source-inventory failures without a completed passing report. Process recovery stops during prior-source preparation. The local RF3 suite failed (16 passed, 142 failed) on cluster-profile reparse paths and unavailable prior-server proof. These are local macOS development observations, with no Linux qualification, coverage, CRAP or performance claim.
3434

35-
Controlled real-operation sources: `TimeProviderOperationTests` (JSON/native command timestamp and retry, query/due-work expiry, UTC versus monotonic budget), `NativeReadCutClockTests` (real snapshot expiry, released slot and preserved bytes), and `DueWaitControlledClockTests` (real apply waiter fallback/cancellation and joined timers). Fresh UnitTests compilation and execution remain required. The controlled timer supports these single-threaded one-shot workflows; it is not qualified as a general concurrent or periodic timer implementation. Framework-native synchronous process/thread waits without a provider overload remain bounded OS observations; managed delays and timed task waits use provider overloads.
35+
Passing real-operation workflows: `TimeProviderOperationTests` (5 cases: JSON/native command timestamp and retry, query/due-work expiry, UTC versus monotonic budget), `NativeReadCutClockTests` (1 case: real snapshot expiry, released slot and preserved bytes), `DueWaitControlledClockTests` (2 cases: real apply waiter fallback/cancellation and joined timers), `ReadExecutionTests` (3 existing cases), and `ZoneTreeStorageExecutionOptionsTests` (6 cases, including deterministic record-budget assertions under an unchanged one-second elapsed policy). Full unit/scalar and recovery/RF3 gates remain required. A native `/private/tmp` directory avoids the macOS system-temp alias without weakening filesystem guards. The controlled timer supports these single-threaded one-shot workflows; it is not qualified as a general concurrent or periodic timer implementation. Framework-native synchronous process/thread waits without a provider overload remain bounded OS observations; managed delays and timed task waits use provider overloads.
3636

3737
```mermaid
3838
flowchart LR

‎docs/implementation/status.json‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@
55
"feature": "docs/Features/ResourceExecution/TimeProvider.md",
66
"decision": "docs/ADR/ADR-115-time-provider.md",
77
"sourceStage": "clock_migration_and_deterministic_real_operation_regressions_joined",
8-
"canonicalBuildPassed": false,
9-
"canonicalFormatterPassed": false,
8+
"canonicalBuildPassed": true,
9+
"canonicalFormatterPassed": true,
1010
"runtimeQualified": false,
1111
"fullTaskComplete": false,
12-
"verificationStage": "Aspire_analyzers_388_passed_shared_build_and_runtime_gates_blocked",
12+
"verificationStage": "local_canonical_build_and_format_passed_Aspire_analyzers388_and_focused_operation_tests17_passed_runtime_qualification_open",
1313
"analyzerTestsPassed": 388,
1414
"localDevelopmentReceipt": "docs/implementation/time-provider-development-2026-10-06.json",
1515
"remaining": [
16-
"Fresh passing complete solution build and canonical formatting",
17-
"Execute controlled engine/read-cut/replica tests through freshly compiled Aspire unit runner",
18-
"Complete unit/scalar/recovery/RF3 and exact-source Linux gates"
19-
]
16+
"Complete unit/scalar/recovery/RF3 and exact-source Linux gates",
17+
"Functional coverage and source-bound CRAP remain unmeasured"
18+
],
19+
"focusedOperationTestsPassed": 17
2020
},
2121
"ORLEANS-PRIMITIVES-001": {
2222
"title": "Native Orleans capability review, services, messaging, transactions and jobs",

‎docs/implementation/time-provider-development-2026-10-06.json‎

Lines changed: 147 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
"scope": "TimeProvider local development; not Linux qualification",
44
"feature": "docs/Features/ResourceExecution/TimeProvider.md",
55
"decision": "docs/ADR/ADR-115-time-provider.md",
6-
"sourceRevisionObserved": "51ce19cfbb086b316d41cd959e98946d78cc26e3",
6+
"sourceRevisionObserved": "7e218a1f8e161d1107457f5b035759b8af2cafdd",
77
"concurrentSourceChangesExcluded": true,
8-
"canonicalBuildPassed": false,
9-
"canonicalFormatterPassed": false,
8+
"canonicalBuildPassed": true,
9+
"canonicalFormatterPassed": true,
1010
"runtimeQualified": false,
1111
"fullTaskComplete": false,
1212
"analyzers": {
@@ -67,8 +67,8 @@
6767
]
6868
},
6969
"builds": {
70-
"canonical": "failed: 33 parallel BackupRestore artifact diagnostics and one AppHost signal join; join subsequently repaired and scoped AppHost build passed",
71-
"canonicalLog": "/tmp/keyload-time-solution-build-final.log",
70+
"canonical": "passed complete Release solution build after final storage-policy controlled-clock fixture edit: 0 warnings/errors; 6m22.24s; local shared checkout with unrelated source changes",
71+
"canonicalLog": "/tmp/keyload-time-solution-after-readcut-fixture.log",
7272
"compiledModules": [
7373
"Core",
7474
"Query",
@@ -87,13 +87,29 @@
8787
"Server",
8888
"Analyzers.Tests",
8989
"CrashHost",
90-
"RecoveryTests"
90+
"RecoveryTests",
91+
"AppHost",
92+
"IntegrationTests",
93+
"ComparisonTests",
94+
"Artifacts",
95+
"Cli",
96+
"UnitTests",
97+
"SiteTests"
9198
],
9299
"scopedAppHost": "passed 0 warnings/errors, current product references; no replacement for solution gate",
93-
"unitSource": "blocked by 8 parallel cancellation-flow and BackupRestore diagnostics; controlled operation cases not executed",
94-
"unitLog": "/tmp/keyload-time-unit-source-final-r2.log",
100+
"unitSource": "passed in complete solution build, including final controlled operation fixtures",
101+
"unitLog": "/tmp/keyload-time-solution-after-readcut-fixture.log",
95102
"integrationSource": "passed 0 warnings/errors after async deadline ownership and disposal join repair",
96-
"integrationLog": "/private/tmp/keyload-time-runtime-integration-source-build.log"
103+
"integrationLog": "/private/tmp/keyload-time-runtime-integration-source-build.log",
104+
"comparisonTestsSource": "passed 0 warnings/errors; current provider-taking Redis fixture overload also compiled in final canonical attempt",
105+
"comparisonTestsLog": "/tmp/keyload-time-comparison-tests-final.log",
106+
"lastIntermediateCanonical": "failed26 errors:24 parallel BackupRestore diagnostics and2 Redis joins, latter subsequently repaired",
107+
"lastIntermediateCanonicalLog": "/tmp/keyload-time-solution-after-ownership-fix.log",
108+
"canonicalErrors": 0,
109+
"canonicalWarnings": 0,
110+
"canonicalCommand": "dotnet build KeyLoad.slnx --no-restore --configuration Release --disable-build-servers -m:1",
111+
"postReadCutFixtureVerification": "passed complete solution build and canonical formatter after final controlled-clock storage fixture edit",
112+
"lastIntermediateCanonicalPassedLog": "/tmp/keyload-time-solution-latest.log"
97113
},
98114
"recovery": {
99115
"command": "dotnet run --project src/KeyLoad.AppHost --no-build --no-restore --configuration Release -- --KeyLoadTests:Suite=recovery",
@@ -103,17 +119,17 @@
103119
},
104120
"format": {
105121
"command": "dotnet format KeyLoad.slnx --verify-no-changes --no-restore",
106-
"exitCode": 2,
107-
"status": "parallel BackupRestore and cancellation-flow diagnostics; scoped clock formatting passed",
108-
"log": "/tmp/keyload-time-format-final.log"
122+
"exitCode": 0,
123+
"status": "passed canonical verifier after final controlled-clock storage fixture edit",
124+
"log": "/tmp/keyload-time-format-after-readcut-fixture.log",
125+
"lastIntermediatePassedLog": "/tmp/keyload-time-format-post-repairs.log"
109126
},
110127
"governance": "passed 27 projects and 4 modules",
111128
"performance": "unmeasured; no acceleration claim",
112129
"coverageAndCrap": "unmeasured",
113130
"remaining": [
114-
"Fresh passing complete solution build and canonical formatting",
115-
"Execute controlled engine/read-cut/replica tests through freshly compiled Aspire unit runner",
116-
"Complete unit/scalar/recovery/RF3 and exact-source Linux gates"
131+
"Complete unit/scalar/recovery/RF3 and exact-source Linux gates",
132+
"Functional coverage and source-bound CRAP remain unmeasured"
117133
],
118134
"rf3": {
119135
"command": "dotnet run --project src/KeyLoad.AppHost --no-build --no-restore --configuration Release -- --KeyLoadTests:Suite=rf3",
@@ -131,5 +147,121 @@
131147
"nativeReportSha256": "98fa6f4065dab9fa6fd13af1dd0232305ffcdc5cf1d204f9d16876bd40b9e54d",
132148
"status": "failed local development: cluster profile rejects macOS reparse temp paths; genuine prior-server proof unavailable; no passing Docker RF3 claim",
133149
"log": "/Users/ksemenenko/.aspire/logs/cli_20261006T083253_a37d4221.log"
150+
},
151+
"controlledOperationTests": [
152+
{
153+
"className": "TimeProviderOperationTests",
154+
"command": "TMPDIR=/private/tmp dotnet run --project src/KeyLoad.AppHost --no-build --no-restore --configuration Release -- --KeyLoadTests:Suite=unit '--KeyLoadTests:Filter=/*/*/TimeProviderOperationTests/*' --KeyLoadTests:ResultsDirectory=TestResults/time-provider-engine-final --KeyLoadTests:ReportTrx=true",
155+
"exitCode": 0,
156+
"summary": {
157+
"total": 5,
158+
"passed": 5,
159+
"failed": 0,
160+
"skipped": 0,
161+
"cancelled": 0,
162+
"timedOut": 0,
163+
"flaky": 0
164+
},
165+
"nativeReport": "TestResults/time-provider-engine-final/KeyLoad.UnitTests-macos-net10.0.tunit-report.json",
166+
"nativeReportSha256": "f68d4a18103727b0d00ec835c5f02fc0de30896b1298df7eaf4b0cb171414fd3",
167+
"publicationGeneration": "50eca46d107a47fa979b219f0a42c4a2",
168+
"log": "/Users/ksemenenko/.aspire/logs/cli_20261006T085629_5dc2449b.log"
169+
},
170+
{
171+
"className": "NativeReadCutClockTests",
172+
"command": "dotnet run --project src/KeyLoad.AppHost --no-build --no-restore --configuration Release -- --KeyLoadTests:Suite=unit '--KeyLoadTests:Filter=/*/*/NativeReadCutClockTests/*' --KeyLoadTests:ResultsDirectory=TestResults/time-provider-read-cut --KeyLoadTests:ReportTrx=true",
173+
"exitCode": 0,
174+
"summary": {
175+
"total": 1,
176+
"passed": 1,
177+
"failed": 0,
178+
"skipped": 0,
179+
"cancelled": 0,
180+
"timedOut": 0,
181+
"flaky": 0
182+
},
183+
"nativeReport": "TestResults/time-provider-read-cut/KeyLoad.UnitTests-macos-net10.0.tunit-report.json",
184+
"nativeReportSha256": "4a760d73666ac0271aa4d5d8452ce7f3c95a68c7727af0ae5d39c345553ffd3d",
185+
"publicationGeneration": "d54fcca10db64f859f4436e5c0bfc312",
186+
"log": "/Users/ksemenenko/.aspire/logs/cli_20261006T084815_8cf7b840.log"
187+
},
188+
{
189+
"className": "DueWaitControlledClockTests",
190+
"command": "TMPDIR=/private/tmp dotnet run --project src/KeyLoad.AppHost --no-build --no-restore --configuration Release -- --KeyLoadTests:Suite=unit '--KeyLoadTests:Filter=/*/*/DueWaitControlledClockTests/*' --KeyLoadTests:ResultsDirectory=TestResults/time-provider-due-wait-final --KeyLoadTests:ReportTrx=true",
191+
"exitCode": 0,
192+
"summary": {
193+
"total": 2,
194+
"passed": 2,
195+
"failed": 0,
196+
"skipped": 0,
197+
"cancelled": 0,
198+
"timedOut": 0,
199+
"flaky": 0
200+
},
201+
"nativeReport": "TestResults/time-provider-due-wait-final/KeyLoad.UnitTests-macos-net10.0.tunit-report.json",
202+
"nativeReportSha256": "f12f68246c9bd0e47836531c987cbda2119bc124743df10d3a8c2cc1cec4cf56",
203+
"publicationGeneration": "5290d16876d14fe09a133251d03ec640",
204+
"log": "/Users/ksemenenko/.aspire/logs/cli_20261006T085657_fda40946.log"
205+
},
206+
{
207+
"className": "ReadExecutionTests",
208+
"command": "TMPDIR=/private/tmp dotnet run --project src/KeyLoad.AppHost --no-build --no-restore --configuration Release -- --KeyLoadTests:Suite=unit '--KeyLoadTests:Filter=/*/*/ReadExecutionTests/*' --KeyLoadTests:ResultsDirectory=TestResults/time-provider-read-execution --KeyLoadTests:ReportTrx=true",
209+
"exitCode": 0,
210+
"summary": {
211+
"total": 3,
212+
"passed": 3,
213+
"failed": 0,
214+
"skipped": 0,
215+
"cancelled": 0,
216+
"timedOut": 0,
217+
"flaky": 0
218+
},
219+
"nativeReport": "TestResults/time-provider-read-execution/KeyLoad.UnitTests-macos-net10.0.tunit-report.json",
220+
"nativeReportSha256": "dd268415510a88abda207e1afad9ae4eef2ab8a9d51bf6acfa7cc28e61a9e4f0",
221+
"publicationGeneration": "c6928f27f23047e19a737d6694d0f555",
222+
"log": "/Users/ksemenenko/.aspire/logs/cli_20261006T085721_1e1b70d9.log"
223+
},
224+
{
225+
"className": "ZoneTreeStorageExecutionOptionsTests",
226+
"command": "TMPDIR=/private/tmp ASPIRE_SUPPRESS_CLI_RUN_HOOK=true dotnet run --project src/KeyLoad.AppHost --no-build --no-restore --configuration Release -- --KeyLoadTests:Suite=unit '--KeyLoadTests:Filter=/*/*/ZoneTreeStorageExecutionOptionsTests/*' --KeyLoadTests:ResultsDirectory=TestResults/time-provider-storage-policy-final --KeyLoadTests:ReportTrx=true",
227+
"exitCode": 0,
228+
"summary": {
229+
"total": 6,
230+
"passed": 6,
231+
"failed": 0,
232+
"skipped": 0,
233+
"cancelled": 0,
234+
"timedOut": 0,
235+
"flaky": 0
236+
},
237+
"nativeReport": "TestResults/time-provider-storage-policy-final/KeyLoad.UnitTests-macos-net10.0.tunit-report.json",
238+
"nativeReportSha256": "66558f2ffa0afb61954cb835f42a4aac58f8cad81f5c10be7dc308bdfed29201",
239+
"publicationGeneration": "e9d624d8386849a9816b4232139df344",
240+
"log": "/tmp/keyload-time-storage-policy-final-run.log",
241+
"entryPoint": "native Aspire AppHost with its SDK CLI run hook suppressed; actual AppHost still owns runner readiness, execution, exit and shutdown; isolated storage-only cases avoid replacing the other full-suite AppHost"
242+
}
243+
],
244+
"controlledOperationTestsNote": "8 new controlled-clock cases, 3 existing read-budget cases and 6 storage-policy cases passed. The storage record-budget case now uses the controlled clock while keeping its 1-second policy and real store. First query fixture needed explicit full-scan consent; cancellation fixture joins real apply before asserting state. Native temp avoids macOS system-temp aliases without changing filesystem guards.",
245+
"fullUnitAttempt": {
246+
"command": "TMPDIR=/private/tmp dotnet run --project src/KeyLoad.AppHost --no-build --no-restore --configuration Release -- --KeyLoadTests:Suite=unit --KeyLoadTests:ResultsDirectory=TestResults/time-provider-unit-full --KeyLoadTests:ReportTrx=true",
247+
"cliExitCode": 0,
248+
"status": "interrupted deliberately with native Aspire SIGINT because a second shared whole-unit run was active; CLI shutdown exit0 is not a test pass; every owned host/test PID was observed terminated",
249+
"log": "/Users/ksemenenko/.aspire/logs/cli_20261006T085852_7183a28a.log",
250+
"observedFailedCasesBeforeInterruption": 11,
251+
"observedFailureAreas": [
252+
"CLI output retention",
253+
"native benchmark child settlement",
254+
"coverage CLI workflow",
255+
"Orleans test-cluster startup cancellation",
256+
"wall-time storage budget fixture now changed to injected controlled clock"
257+
],
258+
"nativeSummaryAvailable": false,
259+
"nativeCompleteReportAvailable": false
260+
},
261+
"focusedOperationTestsPassed": 17,
262+
"fullUnitSharedFollowup": {
263+
"status": "the other authorized chat owns a complete unit run; it has observed failures and source-inventory drift; no completed passing report was available at this checkpoint",
264+
"resultsDirectory": "TestResults/general-options-unit-v34",
265+
"log": "/private/tmp/keyload-general-options-aspire-unit-v34.log"
134266
}
135267
}

0 commit comments

Comments
 (0)