G2.4 CLOSED: physical InformationReport + fresh cleanup closure PASS - #225
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 74b45b6795
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if (snapshot.Attributes.Contains("Resv", StringComparer.OrdinalIgnoreCase) && | ||
| ParseBool(snapshot.ReservationState) != false) | ||
| { | ||
| reason = $"URCB Resv is not explicit false: {TextOrDash(snapshot.ReservationState)}"; | ||
| return false; |
There was a problem hiding this comment.
Require an explicitly free availability state
When a server does not advertise Resv, this condition skips the reservation check and IsLeaseableFreeUrcbForG24 can accept a snapshot whose Availability is Unknown or InUse, provided DatSet is empty, RptEna is false, and Owner is blank. The P0, P1, and G2.4 flows then perform active writes against an RCB that was never positively proven free; require the forced-live snapshot to have the exact free/NoDataSet availability (and appropriate confidence) before selecting it.
Useful? React with 👍 / 👎.
| var directoryAbsent = !dataSetDirectory.IsSuccess; | ||
| evidence.Add($"G2.4-C temporary DataSet direct directory: absent={directoryAbsent}; success={dataSetDirectory.IsSuccess}; members={dataSetDirectory.Members.Count}; result={dataSetDirectory.Message}"); |
There was a problem hiding this comment.
Distinguish nonexistence from directory read failure
Any unsuccessful GetDataSetDirectoryAsync result is treated as proof that the temporary DataSet is absent. MMS failures such as object-access-denied or other confirmed errors also produce IsSuccess == false; if access controls additionally omit the list from GetNameList, closureSafe reports PASS even though the DataSet may still exist. Only the specific object-nonexistent response should satisfy this cleanup gate, while other failures should leave absence unproven.
Useful? React with 👍 / 👎.
| finalAvailability = await auxiliary.CheckReportControlAvailabilityAsync( | ||
| oneRcbInventory, | ||
| discovery.IedDirectory, | ||
| BuildPostLeaseAvailabilityOptions(selectedRcb.Reference), | ||
| cancellationToken).ConfigureAwait(false); | ||
| } |
There was a problem hiding this comment.
Restore leased fields when post-lease work is cancelled
After fieldPrepare.Lease has changed TrgOps/OptFlds, cancellation during this awaited revalidation throws OperationCanceledException, which is excluded from the catch filter and occurs before the later monitor finally. The service therefore disposes the association without calling RestoreProofFieldLeaseAsync, potentially leaving the commissioned fields changed; the entire post-lease region should be protected by a non-cancellable restoration finally.
Useful? React with 👍 / 👎.
Status
G2.4 is CLOSED / merge-ready on Siemens SIPROTEC
AA1C1F08R4.The core one-URCB dynamic reporting path physically delivered an actual strictly mapped 8-member InformationReport, and the follow-up G2.4-C fresh-association read-only closure physically proved that the server-side auto-reservation and all temporary resources were released after the G2.4 association ended.
Production automatic dynamic reporting remains OFF.
InformationReportProven != ProductionEligible; G2.5/G2.6 remain future gates.Physical G2.4 PASS
Physical InformationReport candidate:
b526d84f962405a0374412bfddb426b155ab6d8626c85400a4da230c4429e6302847f230385b6687Proved:
AA1C1F08R4ADD/LLN0.RP.A_URCB01;AA1C1F08R4ADD/LLN0.AR_G24_BFD53D73;Availability=UsedByCaller,Resv=true,Owner=C0A851F0,localTcpAddress=192.168.81.240;0244and OptFlds061800accepted/read back;Resv=truewrite rejectedobject-access-denied, consistent with SIPROTEC already auto-reserving the URCB for the association;RptEna=trueaccepted;[0,1,2,3,4,5,6,7];GeneralInterrogation;RptEna=false, DatSet restored empty, temporary DataSet deleted;InformationReportProven.Physical G2.4-C Fresh Association Cleanup Closure — PASS
Exact read-only closure candidate:
74b45b6795d0687547440740ba00eaa67aa01ea026c85400a4da230c4429e6302847f230385b6687Fresh association physical evidence:
ied:AA1C1F08R4;sha256:50c691318c6d6a16b68b121ac48627c26e6e32b937836d559dca1b9eb559f0d9;InformationReportProven;AA1C1F08R4ADD/LLN0.RP.A_URCB01;Availability=NoDataSet;DatSetforced-live read succeeded and is empty;RptEna=false;Resv=false;0204;060000;GetNamedVariableListAttributesforAA1C1F08R4ADD/LLN0.AR_G24_BFD53D73returned MMS Confirmed-Error, proving the temporary DataSet directory is absent;MmsInitiatedand healthy;Therefore the previously open cleanup question is physically closed: the SIPROTEC auto-reservation is association-scoped/released after teardown, the URCB returns to a free empty state, and the temporary DataSet is gone.
G2.4-C implementation boundary
G2.4-C is ARSAS-only and READ ONLY. It does NOT call:
Regression tests enforce this boundary and fail closed on residual
Resv, Owner, DatSet,RptEna, temporary DataSet presence, or association failure.CI — exact merge candidate
All green on ARSAS
74b45b6795d0687547440740ba00eaa67aa01ea0:32359457569;32359457568;32359457577;32359457678;Artifacts:
9403067026, SHA-25692bacfc7295c52ae39620b99c8237b52165e5d3b6ced1dce03b4cf4b771e805b;9403042103, SHA-25623e5d5ac4df49301f129c27be6b071a4047b79f4b9495cfade52042c9898ae5c;9403045292, SHA-25603939df610f37895d2d27e3d9a571593dcf007755fb748ca4c53a3da24e0aba4;9402995419, SHA-2568352da2d31ced452518515a7f98d120f30cb16b5386d4ce74d71975b8a0036b7.Merge readiness
All planned G2.4 physical gates are now PASS. Recommended merge order, once explicitly authorized:
mainusing a merge commit;mainusing a merge commit;This PR intentionally remains draft only until explicit merge authorization. Merge does NOT enable production automatic dynamic reporting. Next development level after merge is G2.5 spontaneous dchg proof / controlled scale-out, followed by G2.6 physical regressions before
ProductionEligible.