Skip to content

G2.4 CLOSED: physical InformationReport + fresh cleanup closure PASS - #225

Merged
masarray merged 43 commits into
mainfrom
g2.4-one-urcb-information-report-proof
Aug 21, 2026
Merged

masarray merged 43 commits into
mainfrom
g2.4-one-urcb-information-report-proof

Conversation

@masarray

@masarray masarray commented Aug 20, 2026 •

Copy link
Copy Markdown
Owner

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:

  • ARSAS b526d84f962405a0374412bfddb426b155ab6d86
  • engine 26c85400a4da230c4429e6302847f230385b6687

Proved:

  • exact G2.3 envelope: 8 members;
  • URCB AA1C1F08R4ADD/LLN0.RP.A_URCB01;
  • temporary DataSet AA1C1F08R4ADD/LLN0.AR_G24_BFD53D73;
  • endpoint-bound ownership PASS: Availability=UsedByCaller, Resv=true, Owner=C0A851F0, localTcpAddress=192.168.81.240;
  • temporary TrgOps 0244 and OptFlds 061800 accepted/read back;
  • dynamic DataSet creation + exact 8-member directory readback PASS;
  • DatSet binding accepted;
  • explicit Resv=true write rejected object-access-denied, consistent with SIPROTEC already auto-reserving the URCB for the association;
  • RptEna=true accepted;
  • GI accepted after report routing was installed;
  • ACTUAL InformationReport received and routed by exact RptID;
  • exact report DataSet identity verified;
  • values=8, included indexes [0,1,2,3,4,5,6,7];
  • exact ordered 8/8 member mapping verified;
  • report kind GeneralInterrogation;
  • association healthy after report;
  • monitor cleanup: RptEna=false, DatSet restored empty, temporary DataSet deleted;
  • proof fields restored with IEC significant-bit equality;
  • profile saved as InformationReportProven.

Physical G2.4-C Fresh Association Cleanup Closure — PASS

Exact read-only closure candidate:

  • ARSAS 74b45b6795d0687547440740ba00eaa67aa01ea0
  • engine lock 26c85400a4da230c4429e6302847f230385b6687

Fresh association physical evidence:

  • stable identity unchanged: ied:AA1C1F08R4;
  • fingerprint unchanged: sha256:50c691318c6d6a16b68b121ac48627c26e6e32b937836d559dca1b9eb559f0d9;
  • persisted profile valid in state InformationReportProven;
  • exact proven URCB re-identified: AA1C1F08R4ADD/LLN0.RP.A_URCB01;
  • Availability=NoDataSet;
  • DatSet forced-live read succeeded and is empty;
  • RptEna=false;
  • Resv=false;
  • Owner empty;
  • reservation time absent/not positive;
  • read-only TrgOps normalized to 0204;
  • read-only OptFlds normalized to 060000;
  • exact temporary DataSet absent from fresh NamedVariableList discovery;
  • direct GetNamedVariableListAttributes for AA1C1F08R4ADD/LLN0.AR_G24_BFD53D73 returned MMS Confirmed-Error, proving the temporary DataSet directory is absent;
  • fresh association remained MmsInitiated and healthy;
  • G2.4-C performed zero MMS writes and did not alter the persisted profile.

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:

  • WriteReportAttribute / WriteSingleVariable;
  • Prepare/Probe report-control proof fields;
  • Define/DeleteNamedVariableList;
  • persistent report monitor;
  • GI;
  • profile Save.

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:

Artifacts:

  • portable 9403067026, SHA-256 92bacfc7295c52ae39620b99c8237b52165e5d3b6ced1dce03b4cf4b771e805b;
  • installer 9403042103, SHA-256 23e5d5ac4df49301f129c27be6b071a4047b79f4b9495cfade52042c9898ae5c;
  • test evidence 9403045292, SHA-256 03939df610f37895d2d27e3d9a571593dcf007755fb748ca4c53a3da24e0aba4;
  • source snapshot 9402995419, SHA-256 8352da2d31ced452518515a7f98d120f30cb16b5386d4ce74d71975b8a0036b7.

Merge readiness

All planned G2.4 physical gates are now PASS. Recommended merge order, once explicitly authorized:

  1. merge engine PR Guard exact runtime RCB names against double indexing #95 to ARIEC61850 main using a merge commit;
  2. verify engine main/CI;
  3. merge ARSAS PR G2.4 CLOSED: physical InformationReport + fresh cleanup closure PASS #225 to ARSAS main using a merge commit;
  4. verify ARSAS main/full CI;
  5. freeze G2.4 milestone.

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.

@masarray masarray changed the title G2.4: prove one URCB with actual InformationReport G2.4/P0: prove corrected TrgOps before one-URCB InformationReport Aug 20, 2026
@masarray masarray changed the title G2.4/P0: prove corrected TrgOps before one-URCB InformationReport G2.4/P1: prove OptFlds before one-URCB InformationReport Aug 20, 2026
@masarray masarray changed the title G2.4/P1: prove OptFlds before one-URCB InformationReport G2.4: P0/P1 physical PASS, next actual one-URCB InformationReport Aug 20, 2026
@masarray masarray changed the title G2.4: P0/P1 physical PASS, next actual one-URCB InformationReport G2.4: endpoint-bound URCB Owner proof before actual InformationReport Aug 20, 2026
@masarray masarray changed the title G2.4: endpoint-bound URCB Owner proof before actual InformationReport G2.4: physical InformationReport PASS + read-only cleanup closure merge gate Aug 20, 2026
@masarray masarray changed the title G2.4: physical InformationReport PASS + read-only cleanup closure merge gate G2.4 CLOSED: physical InformationReport + fresh cleanup closure PASS Aug 21, 2026
@masarray
masarray marked this pull request as ready for review August 21, 2026 01:56
@masarray
masarray merged commit da5d4a1 into main Aug 21, 2026
4 checks passed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment on lines +767 to +771
if (snapshot.Attributes.Contains("Resv", StringComparer.OrdinalIgnoreCase) &&
ParseBool(snapshot.ReservationState) != false)
{
reason = $"URCB Resv is not explicit false: {TextOrDash(snapshot.ReservationState)}";
return false;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge 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 👍 / 👎.

Comment on lines +235 to +236
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}");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge 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 👍 / 👎.

Comment on lines +334 to +339
finalAvailability = await auxiliary.CheckReportControlAvailabilityAsync(
oneRcbInventory,
discovery.IedDirectory,
BuildPostLeaseAvailabilityOptions(selectedRcb.Reference),
cancellationToken).ConfigureAwait(false);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant