diff --git a/docs/plans/2026-11-10-opcua-sdk-2-evidence.md b/docs/plans/2026-11-10-opcua-sdk-2-evidence.md index 5648321b..7212f96a 100644 --- a/docs/plans/2026-11-10-opcua-sdk-2-evidence.md +++ b/docs/plans/2026-11-10-opcua-sdk-2-evidence.md @@ -549,3 +549,53 @@ configured-store replacement semantics and was not adopted. These results leave the original cold RSS failures and #799/G4 unchanged. The [prospective resolution procedure](../../scripts/validation/opcua-lifecycle-memory/RESOLUTION.md) is explicitly a design draft, not approval to launch a warmed acceptance run. + +### Baseline ownership repair and SDK2 follow-through + +The [original ownership controls](../../scripts/validation/opcua-lifecycle-memory/baseline-canonical/OWNERSHIP.md) +retain both ordinary exit-1 outcomes. Closed-session/point objects collect while +the same original host remains alive, and old authentication and continuation +tokens are rejected. After normal stop, five original server graph objects +remain. One separate public terminal Dispose releases all five and reduces active +timers from seven to two. The intervention does not rewrite the ordinary failure +or identify a particular measured timer root. + +The SDK1 host omitted terminal server disposal. This was repaired independently +on master `efb9197a`; [#807](https://gitea.dohertylan.com/dohertj2/lmxopcua/issues/807) +is closed. Five causal RED cases pass after the fix; 1,032 owning tests pass with +one existing skip, and the Release solution builds without warnings. The frozen +`83ed880e` publications and aggregate oracles remain unchanged. The repaired +master has not been selected as a resource denominator. + +SDK2 already disposes adopted servers through ApplicationInstance. Follow-on +review found that a second host disposal could return while the owner was still +closing a real session, and configuration/certificate failure before adoption +could strand the host's raw server. One owner now provides shared completion, +retains server/authentication state through shutdown, and directly awaits terminal +disposal only for an unadopted server. A terminally disposed host rejects new +startup. This does not claim general concurrent asynchronous Start/Dispose support. + +At integrated source `ce21f5db`, the whole solution builds with **zero warnings +or errors**. The server unit suite has **1,122 passes** and one existing skip; +full wire has **193 passes** and three existing opt-in diagnostic skips. The +seven focused ownership cases, actual encrypted concurrent shutdown and aligned +weak-root control pass; trusted-channel/certificate and same-PKI two-boot checks +are included. [Source hashes and guarded RED/GREEN receipts](evidence/2026-11-10-opcua2/disposal-ownership-integrated.json) +preserve the three intended unit RED failures, the real-session RED, and the +earlier test compilation/assertion attempts separately. Astra independently +verified source, causal failures and integrated results. Earlier full CI, publish +and soak evidence retain their own source revisions and outcomes. + +The [pure Apple empty-keychain control](../../scripts/validation/opcua-lifecycle-memory/native-retention/PURE_APPLE.md) +kept AppleDatabase inventory flat across 200 successful create/delete/release +operations with unchanged default/search-list fingerprints. Empty-keychain +lifecycle alone is insufficient to reproduce the native retention. The first +[installed bridge import attempt](../../scripts/validation/opcua-lifecycle-memory/native-retention/NATIVE_IMPORT_ATTEMPT.md) +failed after one partial operation on a diagnostic identity-association +assumption; all owners and private files were cleaned. It is not a repeated +import result or evidence of native retention resolution. + +#799 and G4 remain open. The [proposed Linux late-slope diagnostic](../../scripts/validation/opcua-lifecycle-memory/LATE_SLOPE.md) +has implementation design approval only. It retains the cold baseline and first +resource rejection and cannot emit acceptance. No new long run or release is +approved; Windows/live interoperability gates remain separate. diff --git a/docs/plans/evidence/2026-11-10-opcua2/disposal-ownership-integrated.json b/docs/plans/evidence/2026-11-10-opcua2/disposal-ownership-integrated.json new file mode 100644 index 00000000..f6516661 --- /dev/null +++ b/docs/plans/evidence/2026-11-10-opcua2/disposal-ownership-integrated.json @@ -0,0 +1,1255 @@ +{ + "source": "ce21f5db092c55dd84f2111820903ed30eadbc5e", + "acceptance": false, + "scope": "SDK2 host disposal source/affected regression gate; no G4 or release approval.", + "sdk1MasterRepair": "efb9197a", + "sourceHashes": { + "wireRedHost": "fb1524f257e4d74790b8139866db8900cf8965de27ff05bee490c0e189c526f3", + "wireRedMatches69dcc431": true, + "greenAndIntegratedHost": "07e8c158e5c0aee57b0d65a4918654a6e7f6682f4f0865e1fdfb5c3d6b076c72", + "unchangedWireRedGreenTest": "61b79537f183f82b2154d785815514d902c7b5d1f9fd3a5aeb222441a8274b9c", + "integratedUnitTests": "bfc149483b656b72eeb6e5ea18bc6ce42821399d358f52eb5e18ad7bfe2dd52a" + }, + "workerUnitAttempts": [ + { + "rawWorktree": "opcua2-server", + "rawDirectory": "artifacts/opcua2/69dcc431/disposal-red1/server-unit", + "receipt": { + "base": "69dcc431ecf389f4b8d4a1bcd1d7e30d0d834b91", + "sourceSha256": "14ed9100151d3e56162cd894b756a575c80c120db591da546f735730a1fa6eb1", + "hostSourceSha256": "fb1524f257e4d74790b8139866db8900cf8965de27ff05bee490c0e189c526f3", + "command": [ + "dotnet", + "test", + "tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.csproj", + "-c", + "Release", + "--no-restore", + "-m:2", + "--filter", + "FullyQualifiedName~OpcUaApplicationHostDisposalTests", + "--logger", + "trx;LogFileName=disposal-red.trx", + "--results-directory", + "artifacts/opcua2/69dcc431/disposal-red1/server-unit" + ], + "testExit": 1, + "guardExit": 2, + "expectedRed": true + }, + "hashes": { + "guard.log": "ca89c1d10842a8652ed00785fdf6922db920041ae94c14ab762dd92644540736", + "runner-receipt.json": "352f015003ea5d71dcafb3bcc68185730d4c2a13493eadfe12e8051a451d6556", + "test.log": "0cb50d06a09a96d8b68fdad28e81f22712056cab55931a66bf8a719dc296e8c3" + } + }, + { + "rawWorktree": "opcua2-server", + "rawDirectory": "artifacts/opcua2/69dcc431/disposal-red2/server-unit", + "receipt": { + "base": "69dcc431ecf389f4b8d4a1bcd1d7e30d0d834b91", + "sourceSha256": "1361bc8df69614b3e7c0800911077d5544a3d577f6c6e39c35743eab9a5036ff", + "hostSourceSha256": "fb1524f257e4d74790b8139866db8900cf8965de27ff05bee490c0e189c526f3", + "command": [ + "dotnet", + "test", + "tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.csproj", + "-c", + "Release", + "--no-restore", + "-m:2", + "--filter", + "FullyQualifiedName~OpcUaApplicationHostDisposalTests", + "--logger", + "trx;LogFileName=disposal.trx", + "--results-directory", + "artifacts/opcua2/69dcc431/disposal-red2/server-unit" + ], + "testExit": 1, + "guardExit": 0, + "expectedRed": true, + "testLogSha256": "f1c12d2f64d4cf097d719026ae89089a56900f854baa8773ddab7c6e2872d077", + "counters": { + "total": "7", + "executed": "7", + "passed": "3", + "failed": "4", + "error": "0", + "timeout": "0", + "aborted": "0", + "inconclusive": "0", + "passedButRunAborted": "0", + "notRunnable": "0", + "notExecuted": "0", + "disconnected": "0", + "warning": "0", + "completed": "0", + "inProgress": "0", + "pending": "0" + }, + "results": [ + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Disposed_host_rejects_start_without_taking_server_ownership", + "outcome": "Failed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Host_terminally_disposes_its_booted_server_once", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Canceled_start_before_application_adoption_terminally_disposes_the_server", + "outcome": "Failed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Shutdown_stage_failure_still_terminally_disposes_the_server", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Partial_startup_failure_does_not_strand_the_server", + "outcome": "Failed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Stop_only_is_distinct_from_terminal_server_disposal", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Concurrent_disposers_share_completion_and_one_cleanup_owner", + "outcome": "Failed" + } + ], + "trxSha256": "5004104644b5745650f2855ea0e044259fe6109b2224ca9def113c203b7d777a" + }, + "hashes": { + "disposal.trx": "5004104644b5745650f2855ea0e044259fe6109b2224ca9def113c203b7d777a", + "guard.log": "167117b90b56a4f54f4653122ff4f8f4e6780ec94c775fcf264da59b5813186b", + "runner-receipt.json": "d510b88a95cf0bbadd9d75a271f44dab918ff3b2f013898e53b85d4448354a39", + "test.log": "f1c12d2f64d4cf097d719026ae89089a56900f854baa8773ddab7c6e2872d077" + }, + "selectedResults": [ + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Disposed_host_rejects_start_without_taking_server_ownership", + "outcome": "Failed", + "duration": "00:00:01.4483936", + "error": "Shouldly.ShouldAssertException : Task `host.StartAsync(server, Ct)`\r\n should throw\r\nSystem.ObjectDisposedException\r\n but did not" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Host_terminally_disposes_its_booted_server_once", + "outcome": "Passed", + "duration": "00:00:00.3331628" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Canceled_start_before_application_adoption_terminally_disposes_the_server", + "outcome": "Failed", + "duration": "00:00:00.1480967", + "error": "Shouldly.ShouldAssertException : Task `server.NodeManagerLifecycle.AddAsync(probe, callerContext: null, CancellationToken.None).AsTask()`\r\n should throw\r\nSystem.ObjectDisposedException\r\n but threw\r\nOpc.Ua.ServiceResultException" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Shutdown_stage_failure_still_terminally_disposes_the_server", + "outcome": "Passed", + "duration": "00:00:00.3255879" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Partial_startup_failure_does_not_strand_the_server", + "outcome": "Failed", + "duration": "00:00:00.3758288", + "error": "Shouldly.ShouldAssertException : await Should.ThrowAsync(host.StartAsync(server, Ct));\n failure.ToString()\r\n should contain (case insensitive comparison)\r\n\"controlled SDK2 partial startup\"\r\n but was actually\r\n\"[80020000] (BadInternalError) 'Unexpected error starting application'\n[80020000] (BadInternalError) ...\"" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Stop_only_is_distinct_from_terminal_server_disposal", + "outcome": "Passed", + "duration": "00:00:00.3607047" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Concurrent_disposers_share_completion_and_one_cleanup_owner", + "outcome": "Failed", + "duration": "00:00:00.3616519", + "error": "Shouldly.ShouldAssertException : calls\r\n should satisfy the condition\r\n!task.IsCompleted\r\n but\r\n[System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult], System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult], System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult]]\r\n do not" + } + ] + }, + { + "rawWorktree": "opcua2-server", + "rawDirectory": "artifacts/opcua2/69dcc431/disposal-red3/server-unit", + "receipt": { + "base": "69dcc431ecf389f4b8d4a1bcd1d7e30d0d834b91", + "sourceSha256": "d4eb806d84bae04bbf42b79bc547d1686939bc90903a8559b47ac6ab89c86258", + "hostSourceSha256": "fb1524f257e4d74790b8139866db8900cf8965de27ff05bee490c0e189c526f3", + "command": [ + "dotnet", + "test", + "tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.csproj", + "-c", + "Release", + "--no-restore", + "-m:2", + "--filter", + "FullyQualifiedName~OpcUaApplicationHostDisposalTests", + "--logger", + "trx;LogFileName=disposal.trx", + "--results-directory", + "artifacts/opcua2/69dcc431/disposal-red3/server-unit" + ], + "testExit": 1, + "guardExit": 2, + "expectedRed": true, + "testLogSha256": "92a4f2dd3833654cc3644e83ef375d03afb98d69566d625d35bd8f7d70c0125a" + }, + "hashes": { + "guard.log": "ca89c1d10842a8652ed00785fdf6922db920041ae94c14ab762dd92644540736", + "runner-receipt.json": "b21b51c056180dc7bb87252e1113758011b0e039623e4aab66f8c2278c7c447f", + "test.log": "92a4f2dd3833654cc3644e83ef375d03afb98d69566d625d35bd8f7d70c0125a" + } + }, + { + "rawWorktree": "opcua2-server", + "rawDirectory": "artifacts/opcua2/69dcc431/disposal-red4/server-unit", + "receipt": { + "base": "69dcc431ecf389f4b8d4a1bcd1d7e30d0d834b91", + "sourceSha256": "bfc149483b656b72eeb6e5ea18bc6ce42821399d358f52eb5e18ad7bfe2dd52a", + "hostSourceSha256": "fb1524f257e4d74790b8139866db8900cf8965de27ff05bee490c0e189c526f3", + "command": [ + "dotnet", + "test", + "tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.csproj", + "-c", + "Release", + "--no-restore", + "-m:2", + "--filter", + "FullyQualifiedName~OpcUaApplicationHostDisposalTests", + "--logger", + "trx;LogFileName=disposal.trx", + "--results-directory", + "artifacts/opcua2/69dcc431/disposal-red4/server-unit" + ], + "testExit": 1, + "guardExit": 0, + "expectedRed": true, + "testLogSha256": "ef48dcd50f5382da29b6de9700bdfbfcd72509b4fd2e2ceafeca8c8c5c4ce80c", + "counters": { + "total": "7", + "executed": "7", + "passed": "4", + "failed": "3", + "error": "0", + "timeout": "0", + "aborted": "0", + "inconclusive": "0", + "passedButRunAborted": "0", + "notRunnable": "0", + "notExecuted": "0", + "disconnected": "0", + "warning": "0", + "completed": "0", + "inProgress": "0", + "pending": "0" + }, + "results": [ + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Stop_only_is_distinct_from_terminal_server_disposal", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Concurrent_disposers_share_completion_and_one_cleanup_owner", + "outcome": "Failed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Host_terminally_disposes_its_booted_server_once", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Partial_startup_failure_does_not_strand_the_server", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Shutdown_stage_failure_still_terminally_disposes_the_server", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Disposed_host_rejects_start_without_taking_server_ownership", + "outcome": "Failed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Canceled_start_before_application_adoption_terminally_disposes_the_server", + "outcome": "Failed" + } + ], + "trxSha256": "53573a61fd0806e9bedde4fea22ca74b7ded602250a5a90d6a1fafbc341d8c98" + }, + "hashes": { + "disposal.trx": "53573a61fd0806e9bedde4fea22ca74b7ded602250a5a90d6a1fafbc341d8c98", + "guard.log": "167117b90b56a4f54f4653122ff4f8f4e6780ec94c775fcf264da59b5813186b", + "runner-receipt.json": "35e08691a46b3822987445d74ca42ed1f7ca68600d910e7237c63799c614eda9", + "test.log": "ef48dcd50f5382da29b6de9700bdfbfcd72509b4fd2e2ceafeca8c8c5c4ce80c" + }, + "selectedResults": [ + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Stop_only_is_distinct_from_terminal_server_disposal", + "outcome": "Passed", + "duration": "00:00:00.3720153" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Concurrent_disposers_share_completion_and_one_cleanup_owner", + "outcome": "Failed", + "duration": "00:00:00.3608831", + "error": "Shouldly.ShouldAssertException : calls\r\n should satisfy the condition\r\n!task.IsCompleted\r\n but\r\n[System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult], System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult], System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult]]\r\n do not" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Host_terminally_disposes_its_booted_server_once", + "outcome": "Passed", + "duration": "00:00:00.3512674" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Partial_startup_failure_does_not_strand_the_server", + "outcome": "Passed", + "duration": "00:00:00.3630662" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Shutdown_stage_failure_still_terminally_disposes_the_server", + "outcome": "Passed", + "duration": "00:00:00.3991869" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Disposed_host_rejects_start_without_taking_server_ownership", + "outcome": "Failed", + "duration": "00:00:01.4280537", + "error": "Shouldly.ShouldAssertException : Task `host.StartAsync(server, Ct)`\r\n should throw\r\nSystem.ObjectDisposedException\r\n but did not" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Canceled_start_before_application_adoption_terminally_disposes_the_server", + "outcome": "Failed", + "duration": "00:00:00.1376637", + "error": "Shouldly.ShouldAssertException : Task `server.NodeManagerLifecycle.AddAsync(probe, callerContext: null, CancellationToken.None).AsTask()`\r\n should throw\r\nSystem.ObjectDisposedException\r\n but threw\r\nOpc.Ua.ServiceResultException" + } + ] + }, + { + "rawWorktree": "opcua2-server", + "rawDirectory": "artifacts/opcua2/945c44c4/disposal-green1/server-unit", + "receipt": { + "base": "945c44c475f4fb7716fbe2ed45db99fe2622990e", + "sourceSha256": "bfc149483b656b72eeb6e5ea18bc6ce42821399d358f52eb5e18ad7bfe2dd52a", + "hostSourceSha256": "07e8c158e5c0aee57b0d65a4918654a6e7f6682f4f0865e1fdfb5c3d6b076c72", + "command": [ + "dotnet", + "test", + "tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.csproj", + "-c", + "Release", + "--no-restore", + "-m:2", + "--filter", + "FullyQualifiedName~OpcUaApplicationHostDisposalTests", + "--logger", + "trx;LogFileName=disposal.trx", + "--results-directory", + "artifacts/opcua2/945c44c4/disposal-green1/server-unit" + ], + "testExit": 0, + "guardExit": 0, + "expectedRed": false, + "testLogSha256": "2e1e678ed7f388a703e99d429570647fdd7e1f3c4162ec4f1fda5f749be3f0a3", + "counters": { + "total": "7", + "executed": "7", + "passed": "7", + "failed": "0", + "error": "0", + "timeout": "0", + "aborted": "0", + "inconclusive": "0", + "passedButRunAborted": "0", + "notRunnable": "0", + "notExecuted": "0", + "disconnected": "0", + "warning": "0", + "completed": "0", + "inProgress": "0", + "pending": "0" + }, + "results": [ + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Concurrent_disposers_share_completion_and_one_cleanup_owner", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Partial_startup_failure_does_not_strand_the_server", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Host_terminally_disposes_its_booted_server_once", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Stop_only_is_distinct_from_terminal_server_disposal", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Shutdown_stage_failure_still_terminally_disposes_the_server", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Disposed_host_rejects_start_without_taking_server_ownership", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Canceled_start_before_application_adoption_terminally_disposes_the_server", + "outcome": "Passed" + } + ], + "trxSha256": "6bbb87237a5c658cf037a861cb2c1db77132ac7a55d1fe9d1e50814849d20944" + }, + "hashes": { + "disposal.trx": "6bbb87237a5c658cf037a861cb2c1db77132ac7a55d1fe9d1e50814849d20944", + "guard.log": "167117b90b56a4f54f4653122ff4f8f4e6780ec94c775fcf264da59b5813186b", + "runner-receipt.json": "19ecbc433c3e80e451c713b7cc103f4d498166cbd9f945dee4001f42c1e4e74f", + "test.log": "2e1e678ed7f388a703e99d429570647fdd7e1f3c4162ec4f1fda5f749be3f0a3" + }, + "selectedResults": [ + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Concurrent_disposers_share_completion_and_one_cleanup_owner", + "outcome": "Passed", + "duration": "00:00:01.4431850" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Partial_startup_failure_does_not_strand_the_server", + "outcome": "Passed", + "duration": "00:00:00.3873736" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Host_terminally_disposes_its_booted_server_once", + "outcome": "Passed", + "duration": "00:00:00.3960047" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Stop_only_is_distinct_from_terminal_server_disposal", + "outcome": "Passed", + "duration": "00:00:00.3441234" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Shutdown_stage_failure_still_terminally_disposes_the_server", + "outcome": "Passed", + "duration": "00:00:00.4266992" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Disposed_host_rejects_start_without_taking_server_ownership", + "outcome": "Passed", + "duration": "00:00:00.0013863" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Canceled_start_before_application_adoption_terminally_disposes_the_server", + "outcome": "Passed", + "duration": "00:00:00.1301853" + } + ] + } + ], + "wireRedGreen": [ + { + "rawWorktree": "opcua-sdk-2-upgrade", + "rawDirectory": "artifacts/opcua2/58f8d57f/concurrent-disposal-red", + "receipt": { + "source": "58f8d57f5a03eccfc4cdb8335e8f94fd4fcbe7ea", + "command": [ + "dotnet", + "test", + "tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.csproj", + "-c", + "Release", + "--no-build", + "--no-restore", + "--filter", + "FullyQualifiedName~Concurrent_host_disposal_waits_for_the_actual_encrypted_session_to_close", + "--logger", + "trx;LogFileName=close.trx", + "--results-directory", + "artifacts/opcua2/58f8d57f/concurrent-disposal-red" + ], + "envNames": [], + "elapsedSeconds": 8.704079249990173, + "testExit": 1, + "timedout": false, + "counters": { + "total": "1", + "executed": "1", + "passed": "0", + "failed": "1", + "error": "0", + "timeout": "0", + "aborted": "0", + "inconclusive": "0", + "passedButRunAborted": "0", + "notRunnable": "0", + "notExecuted": "0", + "disconnected": "0", + "warning": "0", + "completed": "0", + "inProgress": "0", + "pending": "0" + }, + "guardPassed": true, + "acceptance": false + }, + "hashes": { + "close.trx": "98fa310a74c5356a495b05df89f12f790b46e51d00bb959937e301664776f44b", + "receipt.json": "d251d027cd3f125966e44fcb5c0d39b094886c0e038107ace14d0a9176b9e39c", + "run.log": "1dce2c24a5a24e4b7d2ca15299714bf0651cb13d67c218fdde532fef61cfb19b" + }, + "selectedResults": [ + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2LifecycleSoakTests.Concurrent_host_disposal_waits_for_the_actual_encrypted_session_to_close", + "outcome": "Failed", + "duration": "00:00:07.3436324", + "error": "Shouldly.ShouldAssertException : calls\r\n should satisfy the condition\r\n!call.IsCompleted\r\n but\r\n[System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult], System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult], System.Threading.Tasks.Task`1[System.Threading.Tasks.VoidTaskResult]]\r\n do not\r\n\r\nAdditional Info:\r\n every caller must await the actual shutdown owner" + } + ] + }, + { + "rawWorktree": "opcua-sdk-2-upgrade", + "rawDirectory": "artifacts/opcua2/19610c68/concurrent-disposal-green", + "receipt": { + "source": "19610c6812adc3f3dd4e6ebf7b02893fb11d26c2", + "command": [ + "dotnet", + "test", + "tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.csproj", + "-c", + "Release", + "--no-build", + "--no-restore", + "--filter", + "FullyQualifiedName~Concurrent_host_disposal_waits_for_the_actual_encrypted_session_to_close", + "--logger", + "trx;LogFileName=close.trx", + "--results-directory", + "artifacts/opcua2/19610c68/concurrent-disposal-green" + ], + "envNames": [], + "elapsedSeconds": 8.619972749962471, + "testExit": 0, + "timedout": false, + "counters": { + "total": "1", + "executed": "1", + "passed": "1", + "failed": "0", + "error": "0", + "timeout": "0", + "aborted": "0", + "inconclusive": "0", + "passedButRunAborted": "0", + "notRunnable": "0", + "notExecuted": "0", + "disconnected": "0", + "warning": "0", + "completed": "0", + "inProgress": "0", + "pending": "0" + }, + "guardPassed": true, + "acceptance": false + }, + "hashes": { + "close.trx": "bafbadfaf3c53eb8c8ca5861f116dffb5712dd6a9bacc65f0ccf2dced9a37911", + "receipt.json": "528c69471974518a0ed46cbcd458b22d2d503346e46028fbf76e9323d9185fd2", + "run.log": "fbb6b003942cdc6446868429bce4c0064364f87ffad18dc22b98b8ed1ec10ed7" + }, + "selectedResults": [ + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2LifecycleSoakTests.Concurrent_host_disposal_waits_for_the_actual_encrypted_session_to_close", + "outcome": "Passed", + "duration": "00:00:07.4291355" + } + ] + } + ], + "integratedSuites": [ + { + "rawWorktree": "opcua-sdk-2-upgrade", + "rawDirectory": "artifacts/opcua2/ce21f5db/ownership-unit", + "receipt": { + "source": "ce21f5db092c55dd84f2111820903ed30eadbc5e", + "kind": "unit", + "command": [ + "dotnet", + "test", + "tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.csproj", + "-c", + "Release", + "--no-build", + "--no-restore", + "--logger", + "trx;LogFileName=suite.trx", + "--results-directory", + "artifacts/opcua2/ce21f5db/ownership-unit" + ], + "runnerSeconds": 84.25089187500998, + "testExit": 0, + "timedout": false, + "counters": { + "total": "1123", + "executed": "1122", + "passed": "1122", + "failed": "0", + "error": "0", + "timeout": "0", + "aborted": "0", + "inconclusive": "0", + "passedButRunAborted": "0", + "notRunnable": "0", + "notExecuted": "0", + "disconnected": "0", + "warning": "0", + "completed": "0", + "inProgress": "0", + "pending": "0" + }, + "observedSkipped": [ + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.AddressSpaceComposerDeviceHostTests.Compose_resolves_driver_device_and_device_host", + "outcome": "NotExecuted" + } + ], + "failed": [], + "requiredResults": { + "OpcUaApplicationHostDisposalTests": [ + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Host_terminally_disposes_its_booted_server_once", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Stop_only_is_distinct_from_terminal_server_disposal", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Partial_startup_failure_does_not_strand_the_server", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Concurrent_disposers_share_completion_and_one_cleanup_owner", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Shutdown_stage_failure_still_terminally_disposes_the_server", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Canceled_start_before_application_adoption_terminally_disposes_the_server", + "outcome": "Passed" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Disposed_host_rejects_start_without_taking_server_ownership", + "outcome": "Passed" + } + ] + }, + "guardPassed": true, + "acceptance": false + }, + "hashes": { + "receipt.json": "4849553feb95b1b5e3232485e3230f768048192d1d042907ae2b43371288d53b", + "run.log": "85219b43d7085423a1cc4e6762bf892001fc56b9ae90559548359ec3fa787d3b", + "suite.trx": "1270bb227715effbdf0d2215ae351928f4f67c7a2ee6ec39d07d82a8d1fc6920" + }, + "selectedResults": [ + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Host_terminally_disposes_its_booted_server_once", + "outcome": "Passed", + "duration": "00:00:02.6196888" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostServerArrayTests.ServerArray_contains_local_uri_and_configured_peers_after_start", + "outcome": "Passed", + "duration": "00:00:02.6336236" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostImpersonationTests.HandleImpersonation_username_denial_sets_validation_error_and_no_identity", + "outcome": "Passed", + "duration": "00:00:00.0005565" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostSecurityTests.BuildUserTokenPolicies_withholds_anonymous_when_disallowed", + "outcome": "Passed", + "duration": "00:00:00.0010164" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.AddressSpaceComposerDeviceHostTests.Compose_resolves_driver_device_and_device_host", + "outcome": "NotExecuted", + "duration": "00:00:00.0010000", + "error": "v3: equipment no longer binds a driver/device \u2014 Equipment lost DriverInstanceId/DeviceId and Compose no longer takes a devices list, so EquipmentNode's DriverInstanceId/DeviceId/DeviceHost projection is always null. Equipment references raw tags via UnsTagReference. The device-endpoint merge this suite characterized now lives in Runtime.Tests DeploymentArtifactRawPathTests; the host-extraction unit is Commons.Tests DeviceConfigIntentTests." + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostImpersonationTests.HandleImpersonation_anonymous_token_is_admitted_with_a_role_carrying_identity", + "outcome": "Passed", + "duration": "00:00:00.0009813" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostImpersonationTests.HandleImpersonation_null_username_treated_as_empty_string", + "outcome": "Passed", + "duration": "00:00:00.0002539" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostImpersonationTests.HandleImpersonation_authenticator_throwing_results_in_rejection", + "outcome": "Passed", + "duration": "00:00:00.0013993" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostImpersonationTests.HandleImpersonation_username_success_carries_roles_on_identity", + "outcome": "Passed", + "duration": "00:00:00.0003506" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostQuotaTests.Default_request_quotas_are_the_former_hard_coded_values", + "outcome": "Passed", + "duration": "00:00:00.0000324" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostSecurityTests.StartAsync_populates_ServerConfiguration_with_all_enabled_profiles", + "outcome": "Passed", + "duration": "00:00:02.7010180" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Stop_only_is_distinct_from_terminal_server_disposal", + "outcome": "Passed", + "duration": "00:00:02.4740242" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostImpersonationTests.HandleImpersonation_anonymous_token_is_rejected_when_disallowed", + "outcome": "Passed", + "duration": "00:00:00.0001548" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostQuotaTests.History_read_batch_cap_default_scales_with_the_machine", + "outcome": "Passed", + "duration": "00:00:00.0000356" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostSecurityTests.StartAsync_with_only_signandencrypt_omits_None_endpoint", + "outcome": "Passed", + "duration": "00:00:04.3576357" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostTests.StartAsync_reuses_existing_certificate_on_second_boot", + "outcome": "Passed", + "duration": "00:00:03.8161918" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostQuotaTests.Configured_transport_quotas_replace_only_what_is_set", + "outcome": "Passed", + "duration": "00:00:00.0001549" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostTests.StartAsync_creates_application_certificate_in_pki_own", + "outcome": "Passed", + "duration": "00:00:02.6321287" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Partial_startup_failure_does_not_strand_the_server", + "outcome": "Passed", + "duration": "00:00:02.0852459" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Concurrent_disposers_share_completion_and_one_cleanup_owner", + "outcome": "Passed", + "duration": "00:00:02.7909106" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostSecurityTests.BuildSecurityPolicies_dedupes_repeated_profiles", + "outcome": "Passed", + "duration": "00:00:00.0028993" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostQuotaTests.Unset_transport_quotas_keep_the_sdk_defaults", + "outcome": "Passed", + "duration": "00:00:00.0000902" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostSecurityTests.BuildUserTokenPolicies_emits_anonymous_and_username", + "outcome": "Passed", + "duration": "00:00:00.0006326" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostImpersonationTests.HandleImpersonation_username_success_sets_identity_and_no_validation_error", + "outcome": "Passed", + "duration": "00:00:00.0001364" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostSecurityTests.BuildSecurityPolicies_default_set_emits_all_three_baseline_profiles", + "outcome": "Passed", + "duration": "00:00:00.0001438" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostSecurityTests.BuildSecurityPolicies_empty_input_falls_back_to_none", + "outcome": "Passed", + "duration": "00:00:00.0002451" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Shutdown_stage_failure_still_terminally_disposes_the_server", + "outcome": "Passed", + "duration": "00:00:02.5965896" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostImpersonationTests.NullOpcUaUserAuthenticator_always_denies", + "outcome": "Passed", + "duration": "00:00:00.0091229" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Canceled_start_before_application_adoption_terminally_disposes_the_server", + "outcome": "Passed", + "duration": "00:00:00.0020510" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostQuotaTests.Configured_request_quotas_are_applied", + "outcome": "Passed", + "duration": "00:00:00.0001442" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests.OpcUaApplicationHostDisposalTests.Disposed_host_rejects_start_without_taking_server_ownership", + "outcome": "Passed", + "duration": "00:00:00.0015274" + } + ] + }, + { + "rawWorktree": "opcua-sdk-2-upgrade", + "rawDirectory": "artifacts/opcua2/ce21f5db/ownership-wire", + "receipt": { + "source": "ce21f5db092c55dd84f2111820903ed30eadbc5e", + "kind": "wire", + "command": [ + "dotnet", + "test", + "tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.csproj", + "-c", + "Release", + "--no-build", + "--no-restore", + "--logger", + "trx;LogFileName=suite.trx", + "--results-directory", + "artifacts/opcua2/ce21f5db/ownership-wire" + ], + "runnerSeconds": 77.99274358293042, + "testExit": 0, + "timedout": false, + "counters": { + "total": "196", + "executed": "193", + "passed": "193", + "failed": "0", + "error": "0", + "timeout": "0", + "aborted": "0", + "inconclusive": "0", + "passedButRunAborted": "0", + "notRunnable": "0", + "notExecuted": "0", + "disconnected": "0", + "warning": "0", + "completed": "0", + "inProgress": "0", + "pending": "0" + }, + "observedSkipped": [ + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2LifecycleSoakTests.Saturation_protocol_actual_observer_drains_and_rejects_extra_foreign_markers(foreignMarker: False)", + "outcome": "NotExecuted" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2LifecycleSoakTests.Saturation_protocol_actual_observer_drains_and_rejects_extra_foreign_markers(foreignMarker: True)", + "outcome": "NotExecuted" + }, + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2LifecycleSoakTests.Repeated_lifecycles_return_resources_to_a_steady_baseline", + "outcome": "NotExecuted" + } + ], + "failed": [], + "requiredResults": { + "Concurrent_host_disposal_waits_for_the_actual_encrypted_session_to_close": [ + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2LifecycleSoakTests.Concurrent_host_disposal_waits_for_the_actual_encrypted_session_to_close", + "outcome": "Passed" + } + ], + "Closed_tokens_are_rejected_and_ownership_is_observed_without_harness_roots": [ + { + "name": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2LifecycleSoakTests.Closed_tokens_are_rejected_and_ownership_is_observed_without_harness_roots", + "outcome": "Passed" + } + ] + }, + "guardPassed": true, + "acceptance": false + }, + "hashes": { + "receipt.json": "726c06bc65304adc5fe39135af2543d3b5506a1aae1f1f53ab274b2a47b7610f", + "run.log": "88dc205dbd46ca40752b43225445f1dbe3db9dcc7efb766a4f2e2ffb5b8e6572", + "suite.trx": "acffd063c0460cbd38009b574d1dd051e32efa650a138102432f409be2c6d3ac" + }, + "selectedResults": [ + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2RepeatedAlarmAuthorityWireTests.A_current_trunk_retry_uses_its_application_grant_and_current_key(native: False, method: \"Acknowledge\", change: \"expiry\")", + "outcome": "Passed", + "duration": "00:00:06.8861529" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"modified\", change: \"alias\")", + "outcome": "Passed", + "duration": "00:00:01.2633277" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"raw\", change: \"alias\")", + "outcome": "Passed", + "duration": "00:00:02.9804145" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"modified\", change: \"rebuild\")", + "outcome": "Passed", + "duration": "00:00:01.6961533" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"events\", change: \"rebuild\")", + "outcome": "Passed", + "duration": "00:00:02.0645314" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2CertificateValidationTests.A_trusted_chain_does_not_bypass_endpoint_identity_checks(wrongUri: False)", + "outcome": "Passed", + "duration": "00:00:01.6910248" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"modified\", change: \"expiry\")", + "outcome": "Passed", + "duration": "00:00:00.9790523" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"raw\", change: \"expiry\")", + "outcome": "Passed", + "duration": "00:00:00.8683132" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2RepeatedAlarmAuthorityWireTests.A_current_trunk_retry_uses_its_application_grant_and_current_key(native: False, method: \"Acknowledge\", change: \"key\")", + "outcome": "Passed", + "duration": "00:00:05.9353576" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"raw\", change: \"key\")", + "outcome": "Passed", + "duration": "00:00:03.0823952" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2LifecycleSoakTests.Closed_tokens_are_rejected_and_ownership_is_observed_without_harness_roots", + "outcome": "Passed", + "duration": "00:00:15.3047305" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2LifecycleSoakTests.Saturation_protocol_actual_observer_drains_and_rejects_extra_foreign_markers(foreignMarker: False)", + "outcome": "NotExecuted", + "duration": "00:00:00.0010000", + "error": "Requires the separately built diagnostic observer." + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"events\", change: \"expiry\")", + "outcome": "Passed", + "duration": "00:00:01.2485367" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"events\", change: \"key\")", + "outcome": "Passed", + "duration": "00:00:01.7667971" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"modified\", change: \"grant\")", + "outcome": "Passed", + "duration": "00:00:02.2352612" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2TrustedChannelTests.Concurrent_IPv4_and_IPv6_activations_keep_their_own_transport_peer(profile: Basic256Sha256Sign)", + "outcome": "Passed", + "duration": "00:00:05.8730672" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2TrustedChannelTests.Trusted_channel_does_not_turn_invalid_credentials_into_another_identity(profile: Basic256Sha256SignAndEncrypt)", + "outcome": "Passed", + "duration": "00:00:08.5873268" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2CertificateValidationTests.Trust_and_certificate_failures_keep_the_configured_rejection_policy(scenario: \"bad-issuer-usage\")", + "outcome": "Passed", + "duration": "00:00:01.7434428" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2TrustedChannelTests.Concurrent_IPv4_and_IPv6_activations_keep_their_own_transport_peer(profile: Basic256Sha256SignAndEncrypt)", + "outcome": "Passed", + "duration": "00:00:07.4064361" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2CertificateValidationTests.Trust_and_certificate_failures_keep_the_configured_rejection_policy(scenario: \"expired\")", + "outcome": "Passed", + "duration": "00:00:01.8150395" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"raw\", change: \"rebuild\")", + "outcome": "Passed", + "duration": "00:00:01.6228082" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2LifecycleSoakTests.Saturation_protocol_actual_observer_drains_and_rejects_extra_foreign_markers(foreignMarker: True)", + "outcome": "NotExecuted", + "duration": "00:00:00.0010000", + "error": "Requires the separately built diagnostic observer." + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2RepeatedAlarmAuthorityWireTests.A_current_trunk_retry_uses_its_application_grant_and_current_key(native: False, method: \"Acknowledge\", change: \"grant\")", + "outcome": "Passed", + "duration": "00:00:06.5592020" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2CertificateValidationTests.A_trusted_chain_does_not_bypass_endpoint_identity_checks(wrongUri: True)", + "outcome": "Passed", + "duration": "00:00:01.4625738" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"modified\", change: \"key\")", + "outcome": "Passed", + "duration": "00:00:04.7009030" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"raw\", change: \"grant\")", + "outcome": "Passed", + "duration": "00:00:01.6985112" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2RepeatedAlarmAuthorityWireTests.A_current_trunk_retry_uses_its_application_grant_and_current_key(native: False, method: \"Confirm\", change: \"grant\")", + "outcome": "Passed", + "duration": "00:00:04.9504516" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"raw\", change: \"replace\")", + "outcome": "Passed", + "duration": "00:00:02.9857185" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2LifecycleSoakTests.Repeated_lifecycles_return_resources_to_a_steady_baseline", + "outcome": "NotExecuted", + "duration": "00:00:00.0010000", + "error": "Opt in with OTOPCUA_SDK2_SOAK=1 and an explicit soak mode." + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2LifecycleSoakTests.Concurrent_host_disposal_waits_for_the_actual_encrypted_session_to_close", + "outcome": "Passed", + "duration": "00:00:10.6159525" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2CertificateValidationTests.Trust_and_certificate_failures_keep_the_configured_rejection_policy(scenario: \"valid\")", + "outcome": "Passed", + "duration": "00:00:01.6818982" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2TrustedChannelTests.Trusted_key_retains_narrow_authority_and_revocation_reaches_its_open_session(profile: Basic256Sha256SignAndEncrypt, mode: SignAndEncrypt)", + "outcome": "Passed", + "duration": "00:00:09.1008785" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2RepeatedAlarmAuthorityWireTests.A_current_trunk_retry_uses_its_application_grant_and_current_key(native: True, method: \"Acknowledge\", change: \"expiry\")", + "outcome": "Passed", + "duration": "00:00:05.8004678" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2TrustedChannelTests.Trusted_key_retains_narrow_authority_and_revocation_reaches_its_open_session(profile: Basic256Sha256Sign, mode: Sign)", + "outcome": "Passed", + "duration": "00:00:08.6631839" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2RepeatedAlarmAuthorityWireTests.A_current_trunk_retry_uses_its_application_grant_and_current_key(native: False, method: \"Confirm\", change: \"expiry\")", + "outcome": "Passed", + "duration": "00:00:05.2903164" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"events\", change: \"alias\")", + "outcome": "Passed", + "duration": "00:00:02.2122166" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"modified\", change: \"replace\")", + "outcome": "Passed", + "duration": "00:00:05.3778347" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2RepeatedAlarmAuthorityWireTests.A_current_trunk_retry_uses_its_application_grant_and_current_key(native: False, method: \"Confirm\", change: \"key\")", + "outcome": "Passed", + "duration": "00:00:03.3317551" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"events\", change: \"replace\")", + "outcome": "Passed", + "duration": "00:00:02.8810558" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2CertificateValidationTests.Trust_and_certificate_failures_keep_the_configured_rejection_policy(scenario: \"missing-issuer\")", + "outcome": "Passed", + "duration": "00:00:02.3539615" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2HistoryAuthorityWireTests.A_saved_cursor_requires_its_live_node_and_current_authority(kind: \"events\", change: \"grant\")", + "outcome": "Passed", + "duration": "00:00:01.3933929" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2TrustedChannelTests.An_untrusted_client_is_rejected_before_application_authentication", + "outcome": "Passed", + "duration": "00:00:07.1088642" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2CertificateValidationTests.Trust_and_certificate_failures_keep_the_configured_rejection_policy(scenario: \"revoked\")", + "outcome": "Passed", + "duration": "00:00:01.5483811" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2TrustedChannelTests.Trusted_channel_does_not_turn_invalid_credentials_into_another_identity(profile: Basic256Sha256Sign)", + "outcome": "Passed", + "duration": "00:00:09.1007595" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2RepeatedAlarmAuthorityWireTests.A_current_trunk_retry_uses_its_application_grant_and_current_key(native: True, method: \"Acknowledge\", change: \"key\")", + "outcome": "Passed", + "duration": "00:00:03.4014469" + }, + { + "testName": "ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.Sdk2RepeatedAlarmAuthorityWireTests.A_current_trunk_retry_uses_its_application_grant_and_current_key(native: True, method: \"Acknowledge\", change: \"grant\")", + "outcome": "Passed", + "duration": "00:00:03.5501807" + } + ] + } + ], + "integratedWeakControl": [ + { + "phase": "observer-controls", + "observations": { + "targets": [ + "retained-control", + "collectible-control" + ], + "survivorsByRound": [ + 1, + 1, + 1, + 1, + 1 + ] + } + }, + { + "phase": "wire-contract", + "observations": { + "oldAuthStatus": 2149908480, + "oldBrowseRejected": true, + "oldHistoryRejected": true, + "abandonedBrowse": 1, + "abandonedHistory": 6, + "freshPositiveRounds": 2 + } + }, + { + "phase": "closed-objects-same-host-live", + "observations": { + "targets": [ + "closed-client-session", + "closed-server-session", + "closed-point-owner", + "m_browse", + "browse-data", + "m_history", + "history-value", + "history-state", + "m_history", + "history-value", + "history-state", + "m_history", + "history-value", + "history-state", + "m_history", + "history-value", + "history-state", + "m_history", + "history-value", + "history-state", + "m_history", + "history-value", + "history-state" + ], + "survivorsByRound": [ + 0, + 0, + 0, + 0, + 0 + ] + } + }, + { + "phase": "sdk2-disposal-proofs", + "observations": { + "managersDisposed": 2, + "cachedStores": 0, + "pkiDescriptors": 0 + } + }, + { + "phase": "after-normal-host-stop", + "observations": { + "targets": [ + "client-application", + "client-config", + "client-manager", + "server-manager", + "server-application", + "server-rig", + "server", + "node-manager", + "event-source", + "certificate-validation-core", + "cached-store", + "certificate-validation-core", + "cached-store" + ], + "survivorsByRound": [ + 0, + 0, + 0, + 0, + 0 + ] + } + } + ], + "builds": [ + { + "rawLogPath": "/tmp/opcua2-concurrent-disposal-red-build.log", + "sha256": "4be09c7c3cd3efdb3c93d1ab582b23be52a9166fbff086852aad9d0c41be1bab", + "warnings": 0, + "errors": 0 + }, + { + "rawLogPath": "/tmp/opcua2-concurrent-disposal-green-build.log", + "sha256": "91ea5bf1e6c27c0d8f3d43127430a1ec229671e0e2b3b09be2569c4c444d3a48", + "warnings": 0, + "errors": 0 + }, + { + "rawLogPath": "/tmp/opcua2-ownership-integrated-build.log", + "sha256": "e81045af3dacc3dd2e51e26476a5d0bd6082d1574814fbae36c9c36c6fb080a8", + "warnings": 0, + "errors": 0 + } + ], + "review": "Astra verified actual source/design, three intended unit REDs and all seven GREENs, exact unchanged encrypted-session RED/GREEN, integrated 1122 unit and 193 wire passes and unchanged merge source. Final selected-package hash review pending.", + "limits": [ + "Existing unit skip and three pre-existing opt-in diagnostic skips are retained.", + "No claim of general concurrent asynchronous Start/Dispose support.", + "Older full CI and publish/soak receipts retain their original source and outcomes.", + "No resource cap, baseline or target SDK changed." + ] +} diff --git a/scripts/validation/opcua-lifecycle-memory/LATE_SLOPE.md b/scripts/validation/opcua-lifecycle-memory/LATE_SLOPE.md new file mode 100644 index 00000000..4b24294b --- /dev/null +++ b/scripts/validation/opcua-lifecycle-memory/LATE_SLOPE.md @@ -0,0 +1,80 @@ +# Proposed fixed-duration late-slope diagnostic + +Design draft only. No new mode, artifact or long execution is approved by this +document. Resolve the current ownership/code gates and review native attribution +before deciding whether this experiment supplies a still-needed fact for #799. + +The question is whether the canonical Linux process continues to grow well after +the observed generated-code step. This is separate from choosing a warmed +acceptance baseline, a cross-version performance denominator, or resolving macOS +private-key import retention. The existing `profile` allowance stays 60–1800s. + +If approved, add a distinct diagnostic mode fixed at **7200 seconds** of canonical +cycling after startup, including its cold and qualification-era cycles. It must +not claim 7200 seconds *after warmup*. Keep every normal operation, the active +restart every fourth cycle, all logical/ownership checks and actual PKI descriptor +checks. Use fresh committed source and immutable self-contained Linux ARM64 +.NET10.0.14 artifacts, exact SDK2.0.1 and the landed HG1.0.0 graph. Freeze image, +PKI identity, fixture and instrumentation before launch. Root owns the long run. + +Keep the original cycle-3 baseline and +64MiB managed / +128MiB RSS / +32 FD caps. +Record the sample before asserting; catch only the three resource-cap assertions, +latch the first rejection permanently and continue **every canonical cycle and +restart**, with resource sampling. Managed-monotonic, logical/ownership, observer, +operation and shutdown failures remain fatal. After final ownership/shutdown +checks, emit a diagnostic receipt with `acceptance=false` and rethrow the original +cap rejection. Never emit ordinary `complete`/two-hour acceptance or convert an +earlier rejection to success. A duration completion is distinct from test success. + +Prospectively report **all** quiescent observations, cold rejection, maximum +observed quiescent RSS and final values. Predeclare these elapsed-time windows: + +| Window | Quiescent sample elapsed seconds | +|---|---:| +| Early late phase | 1800–2400 | +| Middle late phase | 3600–4200 | +| Final late phase | 6600–7200 | + +Proposed fixed bounds are startup 120s, each complete cycle including its restart +30s, cycle deadline 7230s, independent shutdown owners 20s each and container +deadline 7440s. The final cycle may finish after 7200s, but cannot extend +its 30s bound. Validate these bounds with reviewed short controls before committing +the protocol; hitting one makes the diagnostic incomplete, not grounds to relax it. + +The existing quiescent sample precedes the optional restart. Thus two adjacent +bounded cycles allow at most 60s between quiescent samples. Each 600s window must +have at least 10 samples, first sample no later than 60s after its start, last sample +no earlier than 60s before its end, observed span at least 480s, and no internal gap +above 60s. Apply the same 60s maximum gap over the entire 1800–7200s reporting range. +Missing coverage is incomplete evidence; it must not become a favorable slope. + +For each window report sample count, first/last/min/max/median RSS and retained +managed bytes, FD range, GC committed range, JIT/timer/thread ranges and elapsed +coverage. Missing windows are incomplete evidence. Also report ordinary least +squares RSS and managed-byte slopes against actual sample elapsed seconds for +all observations in 1800–7200s, with units bytes/hour and the exact sample count. +Do not choose a favorable endpoint/window/statistic after observing results. +These descriptive slopes have **no new pass threshold**. Quiescent maxima are +not continuous process peak measurements, and native MethodSize is not RSS. + +Retain certificate allocation StackTrace tracking at the same enabled setting as +the earlier canonical saturation experiment and disclose its overhead. Do not +attach EventPipe to this proposed run or claim generated-factory readiness from +absent counters; earlier traces remain separate source-scoped evidence. This +instrumented diagnostic cannot be relabelled as uninstrumented acceptance or as +one of the required representative-load comparison runs. + +Freeze cycle-phase elapsed timestamps before cleanup and retain shutdown duration +separately; no cleanup sample feeds the windows or slopes. The new mode must +reach its explicit post-shutdown checks before rethrowing a latched resource cap; +the generic profile mode currently throws earlier and must keep its old behavior. +Cleanup must attempt both independent owners under their separate deadlines even +when one fails or the operation token is canceled. Preserve the first rejection +alongside any later cleanup failure; neither error may erase the other. + +Before execution, implement and review the proposed setup/last-cycle/cleanup and +outer deadlines in the actual harness and launcher; no extension or retry-to-green. +Require negative controls proving a latched first failure cannot disappear, +wrong duration/mode is rejected, no ordinary acceptance receipt can be emitted, +and malformed/missing sample windows fail the summarizer. Review actual source, +control results and every immutable artifact hash with Astra before launch.