Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
bdd5ee2
G2.4: add one-URCB InformationReport commissioning proof
masarray Aug 20, 2026
86f2a5b
G2.4: add explicit one-URCB commissioning shortcut
masarray Aug 20, 2026
da71c43
G2.4: make qualification evidence window phase-aware
masarray Aug 20, 2026
4388a10
G2.4: render one-URCB activation and InformationReport evidence
masarray Aug 20, 2026
acc1e83
G2.4: test strict one-URCB and InformationReport gates
masarray Aug 20, 2026
a5614a9
G2.4: fix report-frame test helper
masarray Aug 20, 2026
f6bae14
G2.4: select URCB from forced live availability evidence
masarray Aug 20, 2026
9c1ece0
G2.4: route field proof through forced-live URCB selector
masarray Aug 20, 2026
43078dd
G2.4: regress forced-live URCB selection
masarray Aug 20, 2026
763e47f
G2.4: replace regression fixture with class-compatible form
masarray Aug 20, 2026
6d67196
G2.4: regress forced-live URCB selection safely
masarray Aug 20, 2026
535a432
G2.4: pin transactional URCB field-lease engine
masarray Aug 20, 2026
80fe2ec
G2.4: transact temporary URCB proof fields with exact restore
masarray Aug 20, 2026
bcc4c0a
G2.4: regress transactional lease selection from field evidence
masarray Aug 20, 2026
d16ac32
G2.4: disclose transactional proof-field lease in UI
masarray Aug 20, 2026
34ab83e
G2.4: advance engine lock regression with G1 ancestry guards
masarray Aug 20, 2026
7500556
P0: add isolated TrgOps commissioning probe service
masarray Aug 20, 2026
f2764e1
P0: add isolated TrgOps micro-probe shortcut
masarray Aug 20, 2026
3e855cb
P0: render isolated TrgOps probe evidence
masarray Aug 20, 2026
e8b475a
P0: add TrgOps micro-probe safety regression guards
masarray Aug 20, 2026
b7ad43e
P0: pin corrected TrgOps engine candidate
masarray Aug 20, 2026
acec815
P0: advance engine lock guard with TrgOps protocol evidence
masarray Aug 20, 2026
e2c60b2
P0: preserve complete G1 wire mapping regression guard
masarray Aug 20, 2026
7be1879
P1: add isolated OptFlds commissioning service
masarray Aug 20, 2026
b647756
P1: add isolated OptFlds commissioning shortcut
masarray Aug 20, 2026
cacb2a2
P1: add isolated OptFlds evidence window
masarray Aug 20, 2026
80c15d0
P1: add OptFlds isolation regression guards
masarray Aug 20, 2026
7e7b337
P1: pin isolated OptFlds probe engine
masarray Aug 20, 2026
c64fe7e
P1: preserve G1 ancestry with OptFlds probe engine
masarray Aug 20, 2026
f2b4d7a
P1: freeze final documented engine head
masarray Aug 20, 2026
e14a309
P1: align ancestry guard with final engine head
masarray Aug 20, 2026
90b1e7d
P1: freeze exact final engine candidate
masarray Aug 20, 2026
58ca521
P1: pin ancestry guard to final engine candidate
masarray Aug 20, 2026
9049abf
G2.4: accept caller-owned URCB auto-reservation after proof-field lease
masarray Aug 20, 2026
c1431cf
G2.4: regress caller-owned auto-reservation post-lease gate
masarray Aug 20, 2026
3b3c791
G2.4: bind URCB Owner to exact local MMS endpoint
masarray Aug 20, 2026
59939f2
G2.4: regress server Owner against local MMS endpoint
masarray Aug 20, 2026
7370fae
G2.4: lock endpoint-bound RCB Owner proof engine
masarray Aug 20, 2026
b526d84
G2.4: pin endpoint-bound Owner proof and preserve G1 ancestry
masarray Aug 20, 2026
4a451cf
G2.4-C: add fresh-association read-only cleanup closure
masarray Aug 20, 2026
7cebc26
G2.4-C: add read-only cleanup closure shortcut
masarray Aug 20, 2026
6969c06
G2.4-C: add read-only closure evidence window
masarray Aug 20, 2026
74b45b6
G2.4-C: regress fresh cleanup closure and read-only boundary
masarray Aug 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 92 additions & 0 deletions DynamicReportQualificationResultWindow.G24C.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
using System.Text;
using ArIED61850Tester.Services;

namespace ArIED61850Tester;

internal partial class DynamicReportQualificationResultWindow
{
internal DynamicReportQualificationResultWindow(DynamicReportCleanupClosureCommissioningResult result)
{
ArgumentNullException.ThrowIfNull(result);
InitializeComponent();

Title = "G2.4-C Fresh Association Cleanup Closure Evidence";
HeaderText.Text = "G2.4-C Fresh Association Cleanup Closure";
SummaryText.Text = result.Summary;
StateText.Text = result.IsSuccess
? "G2.4 Cleanup Closed"
: result.IsBlocked
? "Blocked"
: "Cleanup closure not proven";
EvidenceTextBox.Text = BuildG24CEvidence(result);

if (result.IsSuccess)
SetPassBadge();
}

private static string BuildG24CEvidence(DynamicReportCleanupClosureCommissioningResult result)
{
var builder = new StringBuilder();
builder.AppendLine("ARSAS G2.4-C FRESH ASSOCIATION CLEANUP CLOSURE EVIDENCE");
builder.AppendLine(new string('=', 72));
builder.AppendLine($"Result: {result.Summary}");
builder.AppendLine($"Blocked: {result.IsBlocked}");
builder.AppendLine($"G2.4-C success: {result.IsSuccess}");

if (result.Identity is not null)
{
builder.AppendLine();
builder.AppendLine("IED IDENTITY");
builder.AppendLine($"Stable identity: {result.Identity.StableIdentityKey}");
builder.AppendLine($"Model fingerprint: {result.Identity.ModelFingerprint}");
builder.AppendLine($"Model: {result.Identity.Model}");
builder.AppendLine($"Firmware: {result.Identity.FirmwareRevision}");
builder.AppendLine($"Profile revision: {result.Identity.ProfileRevision}");
}

builder.AppendLine();
builder.AppendLine("G2.4 PROVEN TARGET");
builder.AppendLine($"Input profile state: {result.InputProfile?.State.ToString() ?? "-"}");
builder.AppendLine($"URCB: {G24CTextOrDash(result.RcbReference)}");
builder.AppendLine($"Previous temporary DataSet: {G24CTextOrDash(result.TemporaryDataSetReference)}");

if (result.FreshRcbSnapshot is not null)
{
var snapshot = result.FreshRcbSnapshot;
builder.AppendLine();
builder.AppendLine("FRESH-ASSOCIATION RCB CLOSURE");
builder.AppendLine($"Availability: {snapshot.Availability}");
builder.AppendLine($"DatSet probe: {snapshot.DataSetProbeState}");
builder.AppendLine($"DatSet: {G24CTextOrDash(snapshot.DataSetReference)}");
builder.AppendLine($"RptEna: {G24CTextOrDash(snapshot.EnabledState)}");
builder.AppendLine($"Resv: {G24CTextOrDash(snapshot.ReservationState)}");
builder.AppendLine($"Owner: {G24CTextOrDash(snapshot.Owner)}");
builder.AppendLine($"Reservation time: {G24CTextOrDash(snapshot.ReservationTimeSeconds)}");
builder.AppendLine($"TrgOps read-only: {G24CTextOrDash(snapshot.TriggerOptions)}");
builder.AppendLine($"OptFlds read-only: {G24CTextOrDash(snapshot.OptionalFields)}");
builder.AppendLine($"RptID: {G24CTextOrDash(snapshot.ReportId)}");
}

builder.AppendLine();
builder.AppendLine("TEMPORARY DATASET CLOSURE");
builder.AppendLine($"Absent from fresh NamedVariableList: {result.TemporaryDataSetAbsentFromNameList}");
builder.AppendLine($"Direct DataSet directory absent: {result.TemporaryDataSetDirectoryAbsent}");
builder.AppendLine($"Fresh association healthy: {result.AssociationHealthy}");

builder.AppendLine();
builder.AppendLine("WIRE / SAFETY EVIDENCE");
foreach (var line in result.EvidenceLines)
builder.AppendLine(line);

builder.AppendLine();
builder.AppendLine("SAFETY STATE");
builder.AppendLine("G2.4-C is read-only and performs zero MMS writes or DataSet mutations.");
builder.AppendLine("G2.4-C does not alter the persisted InformationReportProven profile.");
builder.AppendLine("G2.4 Cleanup Closed != ProductionEligible.");
builder.AppendLine("Production automatic dynamic reporting remains OFF until G2.5/G2.6 acceptance gates pass.");
return builder.ToString();
}

private static string G24CTextOrDash(string? value)
=> string.IsNullOrWhiteSpace(value) ? "-" : value.Trim();
}
88 changes: 88 additions & 0 deletions DynamicReportQualificationResultWindow.P1.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
using System.Text;
using ArIED61850Tester.Services;

namespace ArIED61850Tester;

internal partial class DynamicReportQualificationResultWindow
{
internal DynamicReportQualificationResultWindow(DynamicReportOptionalFieldsProbeCommissioningResult result)
{
ArgumentNullException.ThrowIfNull(result);
InitializeComponent();

Title = "P1 Isolated OptFlds Micro-Probe Evidence";
HeaderText.Text = "P1 Isolated OptFlds Micro-Probe";
SummaryText.Text = result.Summary;
StateText.Text = result.IsSuccess
? "P1 OptFlds Proven"
: result.IsBlocked
? "Blocked"
: result.CleanupSucceeded
? "Not proven / restored"
: "Restore unproven";
EvidenceTextBox.Text = BuildP1Evidence(result);

if (result.IsSuccess)
SetPassBadge();
}

private static string BuildP1Evidence(DynamicReportOptionalFieldsProbeCommissioningResult result)
{
var builder = new StringBuilder();
builder.AppendLine("ARSAS P1 ISOLATED OPTFLDS MICRO-PROBE EVIDENCE");
builder.AppendLine(new string('=', 62));
builder.AppendLine($"Result: {result.Summary}");
builder.AppendLine($"Blocked: {result.IsBlocked}");
builder.AppendLine($"P1 success: {result.IsSuccess}");
builder.AppendLine($"Restore proven: {result.CleanupSucceeded}");

if (result.Identity is not null)
{
builder.AppendLine();
builder.AppendLine("IED IDENTITY");
builder.AppendLine($"Stable identity: {result.Identity.StableIdentityKey}");
builder.AppendLine($"Model fingerprint: {result.Identity.ModelFingerprint}");
builder.AppendLine($"Model: {result.Identity.Model}");
builder.AppendLine($"Firmware: {result.Identity.FirmwareRevision}");
builder.AppendLine($"Profile revision: {result.Identity.ProfileRevision}");
}

builder.AppendLine();
builder.AppendLine("P1 TARGET");
builder.AppendLine($"Input profile state: {result.InputProfile?.State.ToString() ?? "-"}");
builder.AppendLine($"URCB: {P1TextOrDash(result.RcbReference)}");
builder.AppendLine("Requested optional fields: reason-for-inclusion + data-set-name");
builder.AppendLine("Correct canonical OptFlds raw target: 061800");

if (result.Probe is not null)
{
builder.AppendLine();
builder.AppendLine("OPTFLDS READ / WRITE / RESTORE");
builder.AppendLine($"Original raw: {P1TextOrDash(result.Probe.OriginalRaw)}");
builder.AppendLine($"Requested raw: {P1TextOrDash(result.Probe.RequestedRaw)}");
builder.AppendLine($"Readback raw: {P1TextOrDash(result.Probe.ReadbackRaw)}");
builder.AppendLine($"Restore readback raw: {P1TextOrDash(result.Probe.RestoreReadbackRaw)}");
builder.AppendLine($"Requested semantic match: {result.Probe.RequestedComparison?.IsSemanticMatch.ToString() ?? "-"}");
builder.AppendLine($"Requested raw exact: {result.Probe.RequestedComparison?.IsRawExact.ToString() ?? "-"}");
builder.AppendLine($"Requested padding-only diff: {result.Probe.RequestedComparison?.PaddingOnlyDifference.ToString() ?? "-"}");
builder.AppendLine($"Restore semantic match: {result.Probe.RestoreComparison?.IsSemanticMatch.ToString() ?? "-"}");
builder.AppendLine($"Restore raw exact: {result.Probe.RestoreComparison?.IsRawExact.ToString() ?? "-"}");
builder.AppendLine($"Restore padding-only diff: {result.Probe.RestoreComparison?.PaddingOnlyDifference.ToString() ?? "-"}");
}

builder.AppendLine();
builder.AppendLine("WIRE / SAFETY EVIDENCE");
foreach (var line in result.EvidenceLines)
builder.AppendLine(line);

builder.AppendLine();
builder.AppendLine("SAFETY STATE");
builder.AppendLine("P1 writes OptFlds only on one forced-live proven-free URCB and immediately restores it.");
builder.AppendLine("No TrgOps, DatSet, Resv, RptEna, GI or dynamic DataSet service is used by P1.");
builder.AppendLine("P1 does not advance the G2 profile and production automatic dynamic reporting remains OFF.");
return builder.ToString();
}

private static string P1TextOrDash(string? value)
=> string.IsNullOrWhiteSpace(value) ? "-" : value.Trim();
}
8 changes: 4 additions & 4 deletions DynamicReportQualificationResultWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
x:ClassModifier="internal"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="G2 Dynamic Reporting Qualification Evidence"
Title="G2 Dynamic Reporting Commissioning Evidence"
Width="980" Height="720" MinWidth="760" MinHeight="520"
WindowStartupLocation="CenterOwner"
Background="#F4F7FB"
Expand All @@ -23,12 +23,12 @@
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Text="G2 Dynamic Reporting Qualification" FontSize="19" FontWeight="SemiBold" Foreground="#1F2937"/>
<TextBlock x:Name="HeaderText" Text="G2 Dynamic Reporting Commissioning" FontSize="19" FontWeight="SemiBold" Foreground="#1F2937"/>
<TextBlock x:Name="SummaryText" Margin="0,6,0,0" TextWrapping="Wrap" FontSize="12.5" Foreground="#536275"/>
</StackPanel>
<Border Grid.Column="1" x:Name="StateBadge" Margin="14,0,0,0" Padding="10,5" CornerRadius="9"
Background="#FFF8E6" BorderBrush="#F2D28A" BorderThickness="1" VerticalAlignment="Top">
<TextBlock x:Name="StateText" Text="Qualification" FontSize="11" FontWeight="Bold" Foreground="#946200"/>
<TextBlock x:Name="StateText" Text="Commissioning" FontSize="11" FontWeight="Bold" Foreground="#946200"/>
</Border>
</Grid>
</Border>
Expand All @@ -52,7 +52,7 @@
<ColumnDefinition Width="8"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="Production dynamic reporting remains OFF unless later G2 gates explicitly prove RCB activation, actual InformationReport delivery, and G2.6 regressions."
<TextBlock Text="Production dynamic reporting remains OFF unless later G2 gates explicitly prove controlled scale-out and all G2.6 physical regressions."
TextWrapping="Wrap" VerticalAlignment="Center" FontSize="11" Foreground="#667085"/>
<Button Grid.Column="1" Content="Copy Evidence" Click="CopyEvidence_Click" Padding="14,7"/>
<Button Grid.Column="3" Content="Close" Click="Close_Click" Padding="18,7" IsDefault="True"/>
Expand Down
Loading
Loading