Skip to content

Commit d08ffbc

Browse files
committed
Complete maintained peer lab runner foundation
1 parent 2ebf2fe commit d08ffbc

6 files changed

Lines changed: 201 additions & 3 deletions

File tree

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ The first production milestone is M3UA over a transport abstraction. SCCP, TCAP,
6464
| Native SCTP implementation | Phase 8 foundation-ready: Linux SCTP probe, socket factory, endpoint planner, native adapter, connector, listener, lab profile, readiness report, and commercial gate integration; production readiness still requires Linux SCTP lab verification |
6565
| Interoperability lab | Phase 9 foundation-ready: lab scenario catalog, artifact manifests, run reports, external peer M3UA ASP-to-SG template, trace comparison, evidence promotion, opt-in CI profile, readiness report, and commercial gate integration added; production readiness still requires passing external lab evidence |
6666
| Maintained peer lab automation | Phase 28 foundation-ready: executable run manifest, deterministic environment file rendering, command script rendering, artifact digest manifests, comparison report, run report, evidence bundle, manual self-hosted workflow template, commercial readiness bridge, and automation status reporting are available; commercial release still requires real retained maintained-peer evidence |
67-
| Maintained peer lab runner | Phase 29 in progress: runner workspace, execution input bundle, output artifact materialization, preflight, command manifest, evidence collection, digest generation, comparison handoff, and workflow readiness contracts are available; commercial release still requires execution against a real maintained external peer |
67+
| Maintained peer lab runner | Phase 29 foundation-ready: runner workspace, execution input bundle, output artifact materialization, preflight, command manifest, evidence collection, digest generation, comparison handoff, workflow readiness, and status reporting contracts are available; commercial release still requires execution against a real maintained external peer |
6868

6969
## Requirements
7070

@@ -192,6 +192,7 @@ if (!M3uaTypedMessageParser.TryParseSignallingCongestion(
192192
- [Phase 28 Maintained Peer Lab Automation](docs/PHASE28_MAINTAINED_PEER_LAB_AUTOMATION.md)
193193
- [Phase 28 Summary](docs/PHASE28_SUMMARY.md)
194194
- [Phase 29 Maintained Peer Lab Runner](docs/PHASE29_MAINTAINED_PEER_LAB_RUNNER.md)
195+
- [Phase 29 Summary](docs/PHASE29_SUMMARY.md)
195196
- [External Peer Interop Migration](docs/EXTERNAL_PEER_INTEROP_MIGRATION.md)
196197
- [Continuous Integration](docs/CI.md)
197198
- [SCTP Transport](docs/SCTP_TRANSPORT.md)
@@ -213,7 +214,7 @@ The roadmap is intentionally conservative:
213214

214215
Phase 27 completed the maintained external peer lab foundation, including package-neutral binding, host prerequisites, validated lab configuration, deterministic artifact planning, command planning, traffic vectors, manual self-hosted CI policy, digest-covered retained evidence gates, and status reporting.
215216
Phase 28 completed the automation and evidence handoff layer above that foundation, including a single run manifest, deterministic environment file rendering, command script rendering, comparison reporting, run reporting, digest manifests, an evidence bundle, a manual self-hosted workflow template, a commercial readiness bridge, and automation status reporting for retained lab artifact handoff.
216-
Phase 29 materializes the maintained peer lab runner layer, starting with deterministic runner workspace paths, execution input bundles, output artifact mapping, preflight checks, command manifests, evidence collection, digest generation, comparison handoff, and workflow readiness for real lab execution.
217+
Phase 29 completed the maintained peer lab runner materialization layer, including deterministic runner workspace paths, execution input bundles, output artifact mapping, preflight checks, command manifests, evidence collection, digest generation, comparison handoff, workflow readiness, and status reporting for real lab execution.
217218
5. Harden MAP SMS with external interoperability vectors and operator-profile validation.
218219
6. Use completed interoperability tooling to run external lab validation, native SCTP verification, and release automation hardening.
219220
7. Complete commercial readiness gates and publish governed release candidates.

docs/PHASE29_MAINTAINED_PEER_LAB_RUNNER.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,23 @@ The handoff is ready only when run ids are consistent, digest coverage is comple
107107

108108
This keeps workflow availability separate from runner readiness and prevents planned YAML from being mistaken for a passing lab execution.
109109

110+
## Unit 10 - Runner Status
111+
112+
`SigtranMaintainedPeerLabRunnerStatus` now summarizes the completed runner materialization foundation. It reports ten completed capabilities:
113+
114+
- Runner workspace materialization.
115+
- Runner input bundle.
116+
- Artifact output materialization.
117+
- Runner preflight.
118+
- Runner command manifest.
119+
- Runner evidence collection.
120+
- Runner digest generation.
121+
- Runner comparison handoff.
122+
- Runner workflow readiness.
123+
- Runner status reporting.
124+
125+
The foundation report is ready, but commercial readiness remains blocked until a real maintained peer run produces retained runner evidence.
126+
110127
## Validation
111128

112129
Each unit in this phase is validated with:

docs/PHASE29_SUMMARY.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Phase 29 Summary
2+
3+
Phase 29 completed the maintained external peer lab runner materialization foundation. The SDK now has package-neutral contracts for preparing deterministic runner inputs, validating preflight readiness, mapping expected outputs, collecting retained artifacts, applying digest coverage, and handing passing comparison output into the maintained peer evidence bundle.
4+
5+
## Completed Capabilities
6+
7+
- Runner workspace materialization.
8+
- Runner input bundle.
9+
- Artifact output materialization.
10+
- Runner preflight checks.
11+
- Runner command manifest.
12+
- Runner evidence collection.
13+
- Runner digest generation.
14+
- Runner comparison handoff.
15+
- Runner workflow readiness.
16+
- Runner status reporting.
17+
18+
## Commercial Readiness Position
19+
20+
The runner foundation is complete. Commercial release readiness still requires a real maintained peer lab execution on a suitable Linux host with retained artifacts:
21+
22+
- PCAP.
23+
- Peer log.
24+
- Peer configuration.
25+
- SDK trace.
26+
- Comparison report.
27+
- Run report.
28+
- Digest manifest.
29+
30+
The SDK intentionally separates runner materialization contracts from real retained commercial evidence.
31+
32+
## Validation
33+
34+
Phase 29 was validated with:
35+
36+
```powershell
37+
dotnet build src\Sigtran.NET.sln
38+
dotnet run --project src\Sigtran.NET.Tests\Sigtran.NET.Tests.csproj
39+
dotnet pack src\Sigtran.NET\Sigtran.NET.csproj -c Release
40+
```

docs/SDK_ROADMAP.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ Status: Phase 28 is foundation-complete. It has a run manifest that aggregates b
259259
- Keep runner materialization package-neutral and separate from real retained lab evidence.
260260
- Prepare the SDK for a real maintained external peer lab run without manufacturing passing artifacts.
261261

262-
Status: Phase 29 has deterministic maintained peer lab runner workspace, execution input bundle, output artifact materialization, preflight, command manifest, evidence collection, digest generation, comparison handoff, and workflow readiness contracts.
262+
Status: Phase 29 is foundation-complete. It has deterministic maintained peer lab runner workspace, execution input bundle, output artifact materialization, preflight, command manifest, evidence collection, digest generation, comparison handoff, workflow readiness, and status reporting contracts. Commercial readiness still requires a real maintained peer lab execution with retained digest-covered runner evidence.
263263

264264
## Recommended First Deliverable
265265

src/Sigtran.NET.Tests/Program.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
Run("SIGTRAN maintained peer lab runner digests cover retained artifacts", SigtranMaintainedPeerLabRunnerDigestsCoverRetainedArtifacts);
6565
Run("SIGTRAN maintained peer lab runner comparison handoff creates evidence bundle", SigtranMaintainedPeerLabRunnerComparisonHandoffCreatesEvidenceBundle);
6666
Run("SIGTRAN maintained peer lab runner workflow readiness gates execution", SigtranMaintainedPeerLabRunnerWorkflowReadinessGatesExecution);
67+
Run("SIGTRAN maintained peer lab runner status summarizes completion", SigtranMaintainedPeerLabRunnerStatusSummarizesCompletion);
6768
Run("SIGTRAN trace comparison reports ordered mismatches", SigtranTraceComparisonReportsOrderedMismatches);
6869
Run("SIGTRAN interoperability evidence promotion requires passing lab run", SigtranInteropEvidencePromotionRequiresPassingLabRun);
6970
Run("SIGTRAN interoperability lab CI profile is opt-in", SigtranInteropLabCiProfileIsOptIn);
@@ -1284,6 +1285,33 @@ static void SigtranMaintainedPeerLabRunnerWorkflowReadinessGatesExecution()
12841285
Assert(!blocked.RunnerMaterializationReady, blocked.Describe());
12851286
}
12861287

1288+
static void SigtranMaintainedPeerLabRunnerStatusSummarizesCompletion()
1289+
{
1290+
IReadOnlyList<string> capabilities = SigtranMaintainedPeerLabRunnerStatus.GetCompletedCapabilities();
1291+
SigtranMaintainedPeerLabRunnerStatusReport foundation = SigtranMaintainedPeerLabRunnerStatus.GetFoundationReport();
1292+
1293+
AssertEqual(10, SigtranMaintainedPeerLabRunnerStatus.CompletedUnitCount, "maintained peer lab runner unit count");
1294+
AssertEqual(10, capabilities.Count, "maintained peer lab runner capability count");
1295+
Assert(foundation.FoundationReady, foundation.Describe());
1296+
Assert(!foundation.CommercialReady, foundation.Describe());
1297+
Assert(foundation.Blockers.Contains("real-maintained-peer-run-required"), foundation.Describe());
1298+
1299+
SigtranMaintainedPeerLabRunManifest runManifest = SigtranMaintainedPeerLabRunManifests.CreateDefault("phase29-unit10");
1300+
SigtranMaintainedPeerLabRunnerInputBundle inputs = SigtranMaintainedPeerLabRunnerInputs.CreateDefault(runManifest);
1301+
SigtranMaintainedPeerLabRunnerArtifactMaterializationPlan artifacts = SigtranMaintainedPeerLabRunnerArtifacts.CreateDefault(inputs.Workspace);
1302+
SigtranMaintainedPeerLabRunnerEvidenceCollection collection = SigtranMaintainedPeerLabRunnerEvidenceCollections.Collect(artifacts, artifacts.GetRequiredOutputPaths());
1303+
const string digest = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
1304+
Dictionary<string, string> digestByPath = collection.Artifacts.ToDictionary(static artifact => artifact.Path, static _ => digest, StringComparer.Ordinal);
1305+
SigtranMaintainedPeerLabRunnerDigestReport digestReport = SigtranMaintainedPeerLabRunnerDigests.Create(runManifest.ArtifactPlan, collection, digestByPath);
1306+
IReadOnlyList<string> expected = runManifest.TrafficVectors.SelectMany(static vector => vector.ExpectedMessages).ToArray();
1307+
SigtranMaintainedPeerLabRunnerComparisonHandoff handoff = SigtranMaintainedPeerLabRunnerComparisonHandoffs.Create(inputs, digestReport, expected, DateTimeOffset.UnixEpoch);
1308+
SigtranMaintainedPeerLabRunnerStatusReport commercial = SigtranMaintainedPeerLabRunnerStatus.FromHandoff(handoff);
1309+
1310+
Assert(commercial.FoundationReady, commercial.Describe());
1311+
Assert(commercial.RunnerEvidenceReady, commercial.Describe());
1312+
Assert(commercial.CommercialReady, commercial.Describe());
1313+
}
1314+
12871315
static void SigtranTraceComparisonReportsOrderedMismatches()
12881316
{
12891317
SigtranInteropLabTemplate template = SigtranInteropPeerProfiles.CreateExternalPeerM3uaAspToSgTemplate();
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
namespace Sigtran.NET.Core.Utilities;
2+
3+
/// <summary>
4+
/// Describes maintained external peer lab runner readiness status.
5+
/// </summary>
6+
public sealed class SigtranMaintainedPeerLabRunnerStatusReport
7+
{
8+
/// <summary>Creates a maintained peer lab runner status report.</summary>
9+
/// <param name="completedCapabilityCount">The completed runner capability count.</param>
10+
/// <param name="foundationReady">Whether the runner foundation is ready.</param>
11+
/// <param name="runnerEvidenceReady">Whether retained runner evidence is ready.</param>
12+
/// <param name="blockers">The current blocker identifiers.</param>
13+
public SigtranMaintainedPeerLabRunnerStatusReport(
14+
int completedCapabilityCount,
15+
bool foundationReady,
16+
bool runnerEvidenceReady,
17+
IReadOnlyList<string> blockers)
18+
{
19+
ArgumentNullException.ThrowIfNull(blockers);
20+
CompletedCapabilityCount = completedCapabilityCount < 0 ? throw new ArgumentOutOfRangeException(nameof(completedCapabilityCount)) : completedCapabilityCount;
21+
FoundationReady = foundationReady;
22+
RunnerEvidenceReady = runnerEvidenceReady;
23+
Blockers = blockers.ToArray();
24+
}
25+
26+
/// <summary>The completed runner capability count.</summary>
27+
public int CompletedCapabilityCount { get; }
28+
29+
/// <summary>Whether the runner foundation is ready.</summary>
30+
public bool FoundationReady { get; }
31+
32+
/// <summary>Whether retained runner evidence is ready.</summary>
33+
public bool RunnerEvidenceReady { get; }
34+
35+
/// <summary>The current blocker identifiers.</summary>
36+
public IReadOnlyList<string> Blockers { get; }
37+
38+
/// <summary>Whether runner evidence can support a commercial readiness claim.</summary>
39+
public bool CommercialReady => FoundationReady && RunnerEvidenceReady && Blockers.Count == 0;
40+
41+
/// <summary>Formats a compact runner status summary.</summary>
42+
/// <returns>The runner status summary.</returns>
43+
public string Describe()
44+
{
45+
return $"capabilities={CompletedCapabilityCount} foundation={FoundationReady} evidence={RunnerEvidenceReady} blockers={Blockers.Count} commercial={CommercialReady}";
46+
}
47+
}
48+
49+
/// <summary>
50+
/// Provides maintained external peer lab runner status helpers.
51+
/// </summary>
52+
public static class SigtranMaintainedPeerLabRunnerStatus
53+
{
54+
/// <summary>The completed runner unit count.</summary>
55+
public const int CompletedUnitCount = 10;
56+
57+
/// <summary>Returns the completed maintained peer lab runner capabilities.</summary>
58+
/// <returns>The completed maintained peer lab runner capabilities.</returns>
59+
public static IReadOnlyList<string> GetCompletedCapabilities()
60+
{
61+
return
62+
[
63+
"runner-workspace-materialization",
64+
"runner-input-bundle",
65+
"artifact-output-materialization",
66+
"runner-preflight",
67+
"runner-command-manifest",
68+
"runner-evidence-collection",
69+
"runner-digest-generation",
70+
"runner-comparison-handoff",
71+
"runner-workflow-readiness",
72+
"runner-status-reporting"
73+
];
74+
}
75+
76+
/// <summary>Returns maintained peer lab runner foundation status without real retained evidence.</summary>
77+
/// <returns>The maintained peer lab runner foundation status.</returns>
78+
public static SigtranMaintainedPeerLabRunnerStatusReport GetFoundationReport()
79+
{
80+
SigtranMaintainedPeerLabRunManifest runManifest = SigtranMaintainedPeerLabRunManifests.CreateDefault();
81+
SigtranMaintainedPeerLabRunnerInputBundle inputs = SigtranMaintainedPeerLabRunnerInputs.CreateDefault(runManifest);
82+
SigtranMaintainedPeerLabRunnerArtifactMaterializationPlan artifacts = SigtranMaintainedPeerLabRunnerArtifacts.CreateDefault(inputs.Workspace);
83+
IReadOnlyList<string> allPrerequisites = SigtranMaintainedPeerLabPrerequisites.GetDefault()
84+
.Select(static prerequisite => prerequisite.Id)
85+
.ToArray();
86+
SigtranMaintainedPeerLabRunnerPreflightReport preflight = SigtranMaintainedPeerLabRunnerPreflight.Evaluate(inputs, artifacts, allPrerequisites);
87+
SigtranMaintainedPeerLabRunnerCommandManifest commands = SigtranMaintainedPeerLabRunnerCommandManifests.Create(inputs, artifacts, preflight);
88+
SigtranMaintainedPeerLabRunnerWorkflowReadinessReport workflow = SigtranMaintainedPeerLabRunnerWorkflowReadiness.Evaluate(commands);
89+
90+
bool foundationReady = workflow.Ready && GetCompletedCapabilities().Count == CompletedUnitCount;
91+
return new(
92+
CompletedUnitCount,
93+
foundationReady,
94+
runnerEvidenceReady: false,
95+
["real-maintained-peer-run-required", "retained-runner-evidence-required"]);
96+
}
97+
98+
/// <summary>Returns maintained peer lab runner status from a comparison handoff.</summary>
99+
/// <param name="comparisonHandoff">The runner comparison handoff.</param>
100+
/// <returns>The maintained peer lab runner status.</returns>
101+
public static SigtranMaintainedPeerLabRunnerStatusReport FromHandoff(SigtranMaintainedPeerLabRunnerComparisonHandoff comparisonHandoff)
102+
{
103+
ArgumentNullException.ThrowIfNull(comparisonHandoff);
104+
SigtranMaintainedPeerLabCommercialReadinessReport commercial = SigtranMaintainedPeerLabCommercialBridge.Evaluate(comparisonHandoff.ToEvidenceBundle());
105+
106+
return new(
107+
CompletedUnitCount,
108+
foundationReady: true,
109+
runnerEvidenceReady: comparisonHandoff.IsHandoffReady && commercial.CommercialReady,
110+
commercial.Blockers);
111+
}
112+
}

0 commit comments

Comments
 (0)