From e4a9cd503ecbbb60f7f456f653b61b6037421ecb Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Tue, 20 Oct 2026 11:23:35 +0700 Subject: [PATCH 01/10] chore(p0-h): pin exact tested Edition 2.2 engine as code-only successor of P0-C --- engines/ARIEC61850.lock.json | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/engines/ARIEC61850.lock.json b/engines/ARIEC61850.lock.json index 56303af58..611129b77 100644 --- a/engines/ARIEC61850.lock.json +++ b/engines/ARIEC61850.lock.json @@ -2,9 +2,9 @@ "schemaVersion": 1, "repository": "masarray/ARIEC61850", "ref": "main", - "commit": "ba21d882f67de22c10d3155b449aac77aa8b4899", - "sourcePullRequest": 181, - "purpose": "P0-C typed MMS read evidence and SSOT read-outcome projection isolated code trial; historical P0-A/B + report controls remain unchanged; physical qualification required.", + "commit": "ded5036029706db1a752bb045d1fbc43b67fe9c6", + "sourcePullRequest": 182, + "purpose": "P0-G Edition 2.2 SCL identity classifier stacked on P0-C; historical physical baselines preserved; code trial only.", "previousTrialPin": { "commit": "4467124775d8d9d76f3db194f9fbfd97144767a8", "sourcePullRequest": 134, @@ -320,5 +320,22 @@ "readOnly": true, "physicalQualificationRequired": true, "mainlinePromotionForbidden": true + }, + "p0GSclEditionTrial": { + "status": "code-trial-not-physical", + "enginePullRequest": 182, + "baseEngineCommit": "ba21d882f67de22c10d3155b449aac77aa8b4899", + "exactCommit": "ded5036029706db1a752bb045d1fbc43b67fe9c6", + "engineCiRun": 39368865409, + "syntheticEdition1_2_21_22MatrixRequired": true, + "preserveHistoricalSclNamespaceRequired": true, + "unknownReleaseCannotDowngrade": true, + "existingEditionEnumOrdinalsPreserved": true, + "mmsEngineUnchanged": true, + "physicalQualificationRequired": true, + "mainlinePromotionForbidden": true, + "vendorBranchingForbidden": true, + "cyclicMmsProcessPollingForbidden": true, + "controlAndRcbWritesForbidden": true } } From d59c0bbd88f88bc94f04ddc45115204a6b862bfb Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Tue, 20 Oct 2026 11:23:53 +0700 Subject: [PATCH 02/10] test(p0-h): fail-closed ancestry and safety predicates for Edition 2.2 engine trial --- scripts/test-p0-g-scl-edition-trial.ps1 | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 scripts/test-p0-g-scl-edition-trial.ps1 diff --git a/scripts/test-p0-g-scl-edition-trial.ps1 b/scripts/test-p0-g-scl-edition-trial.ps1 new file mode 100644 index 000000000..a2332eb6d --- /dev/null +++ b/scripts/test-p0-g-scl-edition-trial.ps1 @@ -0,0 +1,35 @@ +# P0-G is an SCL Edition 2.2 metadata identification successor of the +# immutable P0-C typed-Read engine. This gate never promotes physical evidence. +function Test-P0GSclEditionTrial { + param([Parameter(Mandatory = $true)]$Lock) + $trial = $Lock.p0GSclEditionTrial + if ($null -eq $trial) { return $false } + + . (Join-Path $PSScriptRoot 'test-p0-c-typed-read-trial.ps1') + $parent = $Lock | ConvertTo-Json -Depth 100 | ConvertFrom-Json -Depth 100 + $parent.commit = 'ba21d882f67de22c10d3155b449aac77aa8b4899' + $parent.sourcePullRequest = 181 + if (-not (Test-P0CTypedReadTrial -Lock $parent)) { return $false } + + return ( + [string]$Lock.repository -ceq 'masarray/ARIEC61850' -and + [string]$Lock.ref -ceq 'main' -and + [string]$Lock.commit -ceq 'ded5036029706db1a752bb045d1fbc43b67fe9c6' -and + [int]$Lock.sourcePullRequest -eq 182 -and + [string]$trial.status -ceq 'code-trial-not-physical' -and + [string]$trial.baseEngineCommit -ceq 'ba21d882f67de22c10d3155b449aac77aa8b4899' -and + [string]$trial.exactCommit -ceq [string]$Lock.commit -and + [int]$trial.enginePullRequest -eq 182 -and + [long]$trial.engineCiRun -eq 39368865409 -and + [bool]$trial.syntheticEdition1_2_21_22MatrixRequired -and + [bool]$trial.preserveHistoricalSclNamespaceRequired -and + [bool]$trial.unknownReleaseCannotDowngrade -and + [bool]$trial.existingEditionEnumOrdinalsPreserved -and + [bool]$trial.mmsEngineUnchanged -and + [bool]$trial.physicalQualificationRequired -and + [bool]$trial.mainlinePromotionForbidden -and + [bool]$trial.vendorBranchingForbidden -and + [bool]$trial.cyclicMmsProcessPollingForbidden -and + [bool]$trial.controlAndRcbWritesForbidden + ) +} From 3c008aef5d060d2b19098d6497974589837848e3 Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Tue, 20 Oct 2026 11:24:05 +0700 Subject: [PATCH 03/10] ci(p0-h): recognize exact Edition 2.2 descendant only with immutable P0-C ancestry --- scripts/resolve-ariec-lock.ps1 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/resolve-ariec-lock.ps1 b/scripts/resolve-ariec-lock.ps1 index 5033d8466..e8682a3de 100644 --- a/scripts/resolve-ariec-lock.ps1 +++ b/scripts/resolve-ariec-lock.ps1 @@ -127,6 +127,8 @@ if ($null -ne $lock.sclAssociationInteroperability) { $p0BRcbTrialValid = Test-P0BRcbPlannerTrial -Lock $lock . (Join-Path $PSScriptRoot 'test-p0-c-typed-read-trial.ps1') $p0CTypedReadTrialValid = Test-P0CTypedReadTrial -Lock $lock + . (Join-Path $PSScriptRoot 'test-p0-g-scl-edition-trial.ps1') + $p0GSclEditionTrialValid = Test-P0GSclEditionTrial -Lock $lock $acceptedTrial = ( ($trialValid -and [string]$lock.commit -ceq [string]$trial.exactCommit -and [int]$lock.sourcePullRequest -eq 148) -or ($serverAtValid -and [string]$lock.commit -ceq [string]$serverAt.exactCommit -and [int]$lock.sourcePullRequest -eq 153) -or @@ -136,7 +138,8 @@ if ($null -ne $lock.sclAssociationInteroperability) { $m217KTrialValid -or $p0AIdentityTrialValid -or $p0BRcbTrialValid -or - $p0CTypedReadTrialValid + $p0CTypedReadTrialValid -or + $p0GSclEditionTrialValid ) if (-not $historicalAnchorValid -or -not $acceptedTrial) { throw 'SCL association physical-tested engine head differs from integration lock.' From 208491f31b957ecceed75a139a70e2c2fdb02253 Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Tue, 20 Oct 2026 11:25:41 +0700 Subject: [PATCH 04/10] ci(p0-h): R7 recognizes only validated exact P0-G engine trial, never arbitrary SHA --- .github/workflows/scl-interoperability-r7.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/scl-interoperability-r7.yml b/.github/workflows/scl-interoperability-r7.yml index 03fa37b49..50867e40f 100644 --- a/.github/workflows/scl-interoperability-r7.yml +++ b/.github/workflows/scl-interoperability-r7.yml @@ -102,6 +102,8 @@ jobs: $p0BRcbTrialValid = Test-P0BRcbPlannerTrial -Lock $lock . .\ARSAS\scripts\test-p0-c-typed-read-trial.ps1 $p0CTypedReadTrialValid = Test-P0CTypedReadTrial -Lock $lock + . .\ARSAS\scripts\test-p0-g-scl-edition-trial.ps1 + $p0GSclEditionTrialValid = Test-P0GSclEditionTrial -Lock $lock $trial = $lock.smartInteroperabilityCodeTrial if ($null -ne $trial -and $lock.commit -eq $trial.exactCommit) { if ([int]$lock.sourcePullRequest -ne 148 -or @@ -167,6 +169,12 @@ jobs: } Write-Host 'P10 trusted-SCL identity trial accepted for code CI ONLY; R7/R10 physical gate unchanged.' } + elseif ($p0GSclEditionTrialValid) { + if ($env:GITHUB_BASE_REF -eq 'main' -or $env:GITHUB_REF_NAME -eq 'main') { + throw 'P0-G Edition 2.2 engine metadata trial is not physically accepted for mainline.' + } + Write-Host 'P0-G exact Edition 2.2 SCL root identification engine trial accepted for CI ONLY.' + } elseif ($m217KTrialValid -or $p0AIdentityTrialValid -or $p0BRcbTrialValid -or $p0CTypedReadTrialValid) { if ($env:GITHUB_BASE_REF -eq 'main' -or $env:GITHUB_REF_NAME -eq 'main') { throw 'M2.17-K is not physically accepted and cannot run as a mainline promotion.' From a021bddb9c0648743fdd934c330a73b4b8586982 Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Tue, 20 Oct 2026 11:27:14 +0700 Subject: [PATCH 05/10] ci(p0-h): preserve R10 reference authority for exact P0-G descendant --- .github/workflows/interoperability-reference-guard.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/interoperability-reference-guard.yml b/.github/workflows/interoperability-reference-guard.yml index 0f8277e81..edfa0ca5f 100644 --- a/.github/workflows/interoperability-reference-guard.yml +++ b/.github/workflows/interoperability-reference-guard.yml @@ -94,6 +94,8 @@ jobs: $p0BRcbTrialValid = Test-P0BRcbPlannerTrial -Lock $lock . .\ARSAS\scripts\test-p0-c-typed-read-trial.ps1 $p0CTypedReadTrialValid = Test-P0CTypedReadTrial -Lock $lock + . .\ARSAS\scripts\test-p0-g-scl-edition-trial.ps1 + $p0GSclEditionTrialValid = Test-P0GSclEditionTrial -Lock $lock $trial = $lock.smartInteroperabilityCodeTrial $serverAt = $lock.sclServerAtTrial $originalTrial = $lock.commit -eq $trial.exactCommit -and @@ -141,7 +143,7 @@ jobs: if ($trial.status -ne 'code-verified-not-physical' -or [int]$trial.issue -ne 144 -or [int]$trial.integrationPullRequest -ne 148 -or - -not ($originalTrial -or $serverAtTrial -or $datasetTrial -or $p10Trial -or $coreRoutingTrialValid -or $m217KTrialValid -or $p0AIdentityTrialValid -or $p0BRcbTrialValid -or $p0CTypedReadTrialValid) -or + -not ($originalTrial -or $serverAtTrial -or $datasetTrial -or $p10Trial -or $coreRoutingTrialValid -or $m217KTrialValid -or $p0AIdentityTrialValid -or $p0BRcbTrialValid -or $p0CTypedReadTrialValid -or $p0GSclEditionTrialValid) -or -not [bool]$trial.fullDiscoveryFallbackForbidden -or -not [bool]$trial.vendorBranchingForbidden -or -not [bool]$trial.physicalPromotionRequired) { From 42be7310c30dbb0bdd8a889f20bee0c0c59199da Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Tue, 20 Oct 2026 11:27:34 +0700 Subject: [PATCH 06/10] ci(p0-h): include exact descendant in mainline readiness code-trial allowlist --- .github/workflows/smart-discovery-mainline-readiness.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/smart-discovery-mainline-readiness.yml b/.github/workflows/smart-discovery-mainline-readiness.yml index 46efab1b3..794bac290 100644 --- a/.github/workflows/smart-discovery-mainline-readiness.yml +++ b/.github/workflows/smart-discovery-mainline-readiness.yml @@ -119,6 +119,8 @@ jobs: $p0BRcbTrialValid = Test-P0BRcbPlannerTrial -Lock $lock . .\scripts\test-p0-c-typed-read-trial.ps1 $p0CTypedReadTrialValid = Test-P0CTypedReadTrial -Lock $lock + . .\scripts\test-p0-g-scl-edition-trial.ps1 + $p0GSclEditionTrialValid = Test-P0GSclEditionTrial -Lock $lock $trial = $lock.smartInteroperabilityCodeTrial $serverAt = $lock.sclServerAtTrial $closure = $lock.datasetFirstDiscoveryTrial @@ -170,7 +172,7 @@ jobs: $lock.commit -eq $p10.exactCommit -and [int]$lock.sourcePullRequest -eq 161 - if ($originalTrial -or $serverAtTrial -or $datasetTrial -or $p10Trial -or $coreRoutingTrialValid -or $m217KTrialValid -or $p0AIdentityTrialValid -or $p0BRcbTrialValid -or $p0CTypedReadTrialValid) { + if ($originalTrial -or $serverAtTrial -or $datasetTrial -or $p10Trial -or $coreRoutingTrialValid -or $m217KTrialValid -or $p0AIdentityTrialValid -or $p0BRcbTrialValid -or $p0CTypedReadTrialValid -or $p0GSclEditionTrialValid) { if (-not $historicalTrialValid -or $lock.ref -ne 'main') { throw 'Stacked trial identity or ancestor authority is inconsistent.' From 2a5d2a0616350e13623fbde8b2757ac80c9ba245 Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Tue, 20 Oct 2026 11:28:39 +0700 Subject: [PATCH 07/10] fix(p0-h): support both Windows PowerShell 5.1 and pwsh in ancestry gate --- scripts/test-p0-g-scl-edition-trial.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/test-p0-g-scl-edition-trial.ps1 b/scripts/test-p0-g-scl-edition-trial.ps1 index a2332eb6d..746631eb2 100644 --- a/scripts/test-p0-g-scl-edition-trial.ps1 +++ b/scripts/test-p0-g-scl-edition-trial.ps1 @@ -6,7 +6,7 @@ function Test-P0GSclEditionTrial { if ($null -eq $trial) { return $false } . (Join-Path $PSScriptRoot 'test-p0-c-typed-read-trial.ps1') - $parent = $Lock | ConvertTo-Json -Depth 100 | ConvertFrom-Json -Depth 100 + $parent = $Lock | ConvertTo-Json -Depth 100 | ConvertFrom-Json $parent.commit = 'ba21d882f67de22c10d3155b449aac77aa8b4899' $parent.sourcePullRequest = 181 if (-not (Test-P0CTypedReadTrial -Lock $parent)) { return $false } From 31634cf20d7d7bb1d59792703ab3124446dc25a8 Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Tue, 20 Oct 2026 11:34:50 +0700 Subject: [PATCH 08/10] test(p0-h): shared exact-P0-C-or-gated-P0-G engine ancestry proof --- .../P0GEngineLockEvidenceAssert.cs | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 tests/ARSAS.Tests/P0GEngineLockEvidenceAssert.cs diff --git a/tests/ARSAS.Tests/P0GEngineLockEvidenceAssert.cs b/tests/ARSAS.Tests/P0GEngineLockEvidenceAssert.cs new file mode 100644 index 000000000..e11f98ad2 --- /dev/null +++ b/tests/ARSAS.Tests/P0GEngineLockEvidenceAssert.cs @@ -0,0 +1,54 @@ +using System.Text.Json; + +namespace ARSAS.Tests; + +/// +/// Keep the historical P0-C predecessor fixed even when an explicitly tested +/// descendant is the active code-only engine lock. Never accept a generic +/// different SHA merely because the physical-history metadata still exists. +/// +internal static class P0GEngineLockEvidenceAssert +{ + private const string P0C = "ba21d882f67de22c10d3155b449aac77aa8b4899"; + private const string P0G = "ded5036029706db1a752bb045d1fbc43b67fe9c6"; + + internal static void AssertAuthorizedPinnedEngine( + JsonElement lockRoot, JsonElement typedReadTrial) + { + Assert.Equal(P0C, typedReadTrial.GetProperty("exactCommit").GetString()); + Assert.Equal(181, typedReadTrial.GetProperty("enginePullRequest").GetInt32()); + Assert.True(typedReadTrial.GetProperty("physicalQualificationRequired").GetBoolean()); + Assert.True(typedReadTrial.GetProperty("mainlinePromotionForbidden").GetBoolean()); + + var actual = lockRoot.GetProperty("commit").GetString(); + if (string.Equals(actual, P0C, StringComparison.Ordinal)) + { + Assert.Equal(181, lockRoot.GetProperty("sourcePullRequest").GetInt32()); + return; + } + + Assert.Equal(P0G, actual); + Assert.Equal(182, lockRoot.GetProperty("sourcePullRequest").GetInt32()); + var successor = lockRoot.GetProperty("p0GSclEditionTrial"); + Assert.Equal("code-trial-not-physical", successor.GetProperty("status").GetString()); + Assert.Equal(P0C, successor.GetProperty("baseEngineCommit").GetString()); + Assert.Equal(P0G, successor.GetProperty("exactCommit").GetString()); + Assert.Equal(182, successor.GetProperty("enginePullRequest").GetInt32()); + Assert.Equal(39368865409L, successor.GetProperty("engineCiRun").GetInt64()); + foreach (var required in new[] + { + "syntheticEdition1_2_21_22MatrixRequired", + "preserveHistoricalSclNamespaceRequired", + "unknownReleaseCannotDowngrade", + "existingEditionEnumOrdinalsPreserved", + "mmsEngineUnchanged", + "physicalQualificationRequired", + "mainlinePromotionForbidden", + "vendorBranchingForbidden", + "cyclicMmsProcessPollingForbidden", + "controlAndRcbWritesForbidden" + }) + Assert.True(successor.GetProperty(required).GetBoolean(), + "P0-G ancestry/safety predicate missing: " + required); + } +} From 1ba04eb337face7fd431427cd35d41c311be5a41 Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Tue, 20 Oct 2026 11:35:08 +0700 Subject: [PATCH 09/10] test(p0-h): preserve P0-C ancestor and require exact CI-proven P0-G runtime SHA --- .../M217KC264TypedStatusReportIntegrationTests.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/ARSAS.Tests/M217KC264TypedStatusReportIntegrationTests.cs b/tests/ARSAS.Tests/M217KC264TypedStatusReportIntegrationTests.cs index e60d858c8..f491e1570 100644 --- a/tests/ARSAS.Tests/M217KC264TypedStatusReportIntegrationTests.cs +++ b/tests/ARSAS.Tests/M217KC264TypedStatusReportIntegrationTests.cs @@ -76,9 +76,8 @@ public void TestProductUsesExplicitlyApprovedEngineCommitNotPreviouslyPinnedDll( var typedReadTrial = lockRoot.GetProperty("p0CTypedReadTrial"); Assert.Equal(rcbTrial.GetProperty("exactCommit").GetString(), typedReadTrial.GetProperty("baseEngineCommit").GetString()); - Assert.Equal(typedReadTrial.GetProperty("exactCommit").GetString(), - lockRoot.GetProperty("commit").GetString()); - Assert.Equal(181, lockRoot.GetProperty("sourcePullRequest").GetInt32()); + P0GEngineLockEvidenceAssert.AssertAuthorizedPinnedEngine( + lockRoot, typedReadTrial); Assert.True(typedReadTrial.GetProperty("strictInvokeId").GetBoolean()); Assert.True(typedReadTrial.GetProperty("strictAccessOrdinal").GetBoolean()); Assert.True(typedReadTrial.GetProperty("physicalQualificationRequired").GetBoolean()); From e3962b6fefbd699c2681c6aff0f2d13dd417dff2 Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Tue, 20 Oct 2026 11:35:12 +0700 Subject: [PATCH 10/10] test(p0-h): preserve P0-C ancestor and require exact CI-proven P0-G runtime SHA --- .../SmartInteroperabilityTrialGuardRegressionTests.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/ARSAS.Tests/SmartInteroperabilityTrialGuardRegressionTests.cs b/tests/ARSAS.Tests/SmartInteroperabilityTrialGuardRegressionTests.cs index 782c5111a..fe98284bd 100644 --- a/tests/ARSAS.Tests/SmartInteroperabilityTrialGuardRegressionTests.cs +++ b/tests/ARSAS.Tests/SmartInteroperabilityTrialGuardRegressionTests.cs @@ -127,9 +127,8 @@ public void TrialLock_PreservesHistoricalPhysicalAuthorityAndExplicitlyRequiresP var typedReadTrial = root.GetProperty("p0CTypedReadTrial"); Assert.Equal(rcbTrial.GetProperty("exactCommit").GetString(), typedReadTrial.GetProperty("baseEngineCommit").GetString()); - Assert.Equal(typedReadTrial.GetProperty("exactCommit").GetString(), - root.GetProperty("commit").GetString()); - Assert.Equal(181, root.GetProperty("sourcePullRequest").GetInt32()); + P0GEngineLockEvidenceAssert.AssertAuthorizedPinnedEngine( + root, typedReadTrial); Assert.True(typedReadTrial.GetProperty("strictInvokeId").GetBoolean()); Assert.True(typedReadTrial.GetProperty("strictAccessOrdinal").GetBoolean()); Assert.True(typedReadTrial.GetProperty("physicalQualificationRequired").GetBoolean());