From 7023285a3e3041011598971b6b88ce4589eed03a Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Tue, 10 Nov 2026 17:54:43 -0500 Subject: [PATCH] docs: retain late-slope guard control receipts --- .../late-slope-controls.json | 186 ++++++++++++++++++ .../opcua-lifecycle-memory/LATE_SLOPE.md | 8 +- 2 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 docs/plans/evidence/2026-11-10-opcua2/late-slope-controls.json diff --git a/docs/plans/evidence/2026-11-10-opcua2/late-slope-controls.json b/docs/plans/evidence/2026-11-10-opcua2/late-slope-controls.json new file mode 100644 index 000000000..5e8b2093d --- /dev/null +++ b/docs/plans/evidence/2026-11-10-opcua2/late-slope-controls.json @@ -0,0 +1,186 @@ +{ + "scope": "Short late-slope implementation controls; no lifecycle workload or acceptance run started.", + "acceptance": false, + "fixedProtocolSource": "7f21c9aa643db8a7f4e275da4a29dffc1530d21f", + "canonicalSourceSha256": "debfa39298d2d733a1791dd7f07892f3692868b7ece2764d14992c08ffee5754", + "canonicalIdenticalAcrossControlCorrection": true, + "build": { + "rawLogPath": "/tmp/opcua2-late-slope-controls-build2.log", + "sha256": "d1129816f60bcc25a1dbb525b059b241ccd0d4a51f142dc839d12de338679793", + "warnings": 0, + "errors": 0 + }, + "runs": [ + { + "rawDirectory": "artifacts/opcua2/5ea6a23f/late-slope-helpers", + "receipt": { + "source": "5ea6a23f1bed525244f1a0aa0b725586ab53e7f2", + "kind": "helpers", + "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~Late_slope_", + "--logger", + "trx;LogFileName=control.trx", + "--results-directory", + "artifacts/opcua2/5ea6a23f/late-slope-helpers" + ], + "envChanges": {}, + "runnerSeconds": 1.6146617500344291, + "testExit": 1, + "counters": { + "total": "3", + "executed": "3", + "passed": "2", + "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" + }, + "errors": [ + "Shouldly.ShouldAssertException : original cold RSS rejection" + ], + "guardPassed": false, + "lateSlopeWorkloadStarted": false, + "acceptance": false + }, + "sha256": { + "control.trx": "dd02b8f7ba18992ae33c5683a3512786b602f5e994572e867028c0c131c41821", + "run.log": "ea87872836aed8a054a8d90f79d6c2d7c55d241f5d0e608f8b928c2e92cb1528", + "receipt.json": "86d1dfea77db981e32163bd64920f5c5c0f608488ed9bfc89b439970fb65910e" + } + }, + { + "rawDirectory": "artifacts/opcua2/5ea6a23f/late-slope-reject-short", + "receipt": { + "source": "5ea6a23f1bed525244f1a0aa0b725586ab53e7f2", + "kind": "reject-short", + "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~Repeated_lifecycles_return_resources_to_a_steady_baseline", + "--logger", + "trx;LogFileName=control.trx", + "--results-directory", + "artifacts/opcua2/5ea6a23f/late-slope-reject-short" + ], + "envChanges": { + "OTOPCUA_SDK2_SOAK": "1", + "OTOPCUA_SDK2_SOAK_MODE": "late-slope", + "OTOPCUA_SDK2_SOAK_SECONDS": "90", + "OTOPCUA_SDK2_SOAK_OUTPUT": "artifacts/opcua2/5ea6a23f/late-slope-reject-short/rejected.jsonl" + }, + "runnerSeconds": 1.5285202499944717, + "testExit": 1, + "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" + }, + "errors": [ + "Shouldly.ShouldAssertException : seconds\r\n should be\r\n7200\r\n but was\r\n90\r\n\r\nAdditional Info:\r\n late-slope diagnostic duration is fixed at 7200 seconds" + ], + "guardPassed": true, + "lateSlopeWorkloadStarted": false, + "acceptance": false + }, + "sha256": { + "control.trx": "2d87f07849e842b28075f7c3c9ea3b373f6b44db0169c39ea4e4be3ce3bbe3f9", + "run.log": "de5347f82912389c05dc4c9a5aa657422e54e8e64fc49f8d26a838051cdd2f1b", + "receipt.json": "5d1b2288bd790cf2bbc4920e3da450a8da315facfd79221374f7453e89c39138" + } + }, + { + "rawDirectory": "artifacts/opcua2/7f21c9aa/late-slope-helpers", + "receipt": { + "source": "7f21c9aa643db8a7f4e275da4a29dffc1530d21f", + "kind": "helpers", + "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~Late_slope_", + "--logger", + "trx;LogFileName=control.trx", + "--results-directory", + "artifacts/opcua2/7f21c9aa/late-slope-helpers" + ], + "envChanges": {}, + "runnerSeconds": 1.585877291043289, + "testExit": 0, + "counters": { + "total": "3", + "executed": "3", + "passed": "3", + "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" + }, + "errors": [], + "guardPassed": true, + "lateSlopeWorkloadStarted": false, + "acceptance": false + }, + "sha256": { + "control.trx": "71ade221b65006a29829270e239287e16695c7f25501f6fc853495b911ac6599", + "run.log": "ccaeb6c87f755d93291036f334c45a46b1a7285ca868f57738b78306ac92ec6e", + "receipt.json": "7175914165da0094f85e8369be1defabf9d5d1eae49cba78f386536c668c7a85" + } + } + ], + "notes": [ + "First helper attempt preserved as 2 pass/1 fail; Shouldly rethrew the intended ShouldAssertException sentinel. Only test capture was corrected, not emitter or canonical behavior.", + "Actual 90-second request was rejected before evidence file creation. The expected test exit1 was preserved; guard true validates that specific rejection.", + "Final helper run3/3 tests cancellation propagation, both independent cleanup owners, first exception preservation and diagnostic-only result emission.", + "These controls do not qualify or launch the two-hour workload." + ] +} diff --git a/scripts/validation/opcua-lifecycle-memory/LATE_SLOPE.md b/scripts/validation/opcua-lifecycle-memory/LATE_SLOPE.md index 5236eea93..2c811fc80 100644 --- a/scripts/validation/opcua-lifecycle-memory/LATE_SLOPE.md +++ b/scripts/validation/opcua-lifecycle-memory/LATE_SLOPE.md @@ -47,7 +47,7 @@ have at least 10 samples, first sample no later than 60s after its start, last s 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. -If fewer than 385 cycles and 96 restarts complete by 1800s, report the elapsed +Unless at least 385 cycles and 96 restarts complete by 1800s, report the elapsed slopes descriptively but withhold attribution to the phase after the previously observed restart milestone. Reaching that count still does not prove factory saturation in this run; no EventPipe observer is attached. @@ -85,3 +85,9 @@ 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. + +The canonical mode is implemented. The [short control receipts](../../../docs/plans/evidence/2026-11-10-opcua2/late-slope-controls.json) +record three passing helper tests and actual rejection of a 90-second request +before setup. The original helper assertion-capture failure is retained; the +canonical source is byte-identical across that test-only correction. These +controls do not approve a bundle, start the workload or satisfy #799.