Skip to content

Commit d12b858

Browse files
committed
Add commercial roadmap realignment status
1 parent 3facf5b commit d12b858

6 files changed

Lines changed: 296 additions & 3 deletions

File tree

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ if (!M3uaTypedMessageParser.TryParseSignallingCongestion(
183183
- [Phase 24 Summary](docs/PHASE24_SUMMARY.md)
184184
- [Phase 25 Commercial Release Execution](docs/PHASE25_COMMERCIAL_RELEASE_EXECUTION.md)
185185
- [Phase 26 Commercial Roadmap Realignment](docs/PHASE26_COMMERCIAL_ROADMAP_REALIGNMENT.md)
186+
- [Phase 26 Summary](docs/PHASE26_SUMMARY.md)
186187
- [External Peer Interop Migration](docs/EXTERNAL_PEER_INTEROP_MIGRATION.md)
187188
- [Continuous Integration](docs/CI.md)
188189
- [SCTP Transport](docs/SCTP_TRANSPORT.md)
@@ -208,6 +209,7 @@ The roadmap is intentionally conservative:
208209
9. Capture real interoperability lab evidence and promote passing artifacts into commercial readiness.
209210
10. Complete release automation and supply-chain hardening for governed package publication.
210211
11. Complete developer experience and enterprise adoption guidance.
212+
12. Keep external peer interoperability package-neutral in SDK source while executing maintained peer labs as retained release evidence.
211213
12. Complete production operations and support readiness.
212214
13. Complete compliance and audit readiness foundations.
213215
14. Complete performance, capacity, and benchmark readiness foundations.

docs/PHASE26_COMMERCIAL_ROADMAP_REALIGNMENT.md

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,21 @@ Commercial evidence and release execution readiness now use `externalPeerInterop
108108

109109
Public labels, CI variables, status capability names, and README roadmap text now use external peer terminology. Legacy OpenSS7/IPSS7 wording is retained only where the repository is documenting historical blocker evidence or reference material.
110110

111-
## Direction
111+
## Unit 10 - Final Realignment Status
112112

113-
The next units build a maintained peer selection policy, neutral lab environment contract, artifact contract, run plan, comparison contract, and readiness aggregation. The default lab may use a maintained package, but the SDK API remains independent of that package.
113+
`SigtranCommercialRoadmapRealignmentStatus` summarizes the completed package-neutral realignment work without using a roadmap phase number or peer package name in the source API.
114+
115+
The status report checks:
116+
117+
- Ten completed package-neutral realignment capabilities.
118+
- Public contract names do not include package-specific peer fragments.
119+
- Maintained peer selection policy is available.
120+
- External peer execution foundation is ready.
121+
- Commercial release gates use `external-peer-interop`.
122+
- Commercial release remains blocked until maintained peer selection and digest-covered external peer evidence are retained.
123+
124+
## Final Status
125+
126+
The commercial roadmap realignment foundation is complete.
127+
128+
The next implementation work should execute a maintained external SIGTRAN peer lab and attach review-ready evidence. The default lab may use a maintained package, but the SDK API remains independent of that package.

docs/PHASE26_SUMMARY.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Phase 26 Summary
2+
3+
Commercial Roadmap Realignment is foundation-complete.
4+
5+
## Completed Units
6+
7+
1. Package-neutral source contracts.
8+
2. External peer profile support model.
9+
3. Maintained peer selection policy.
10+
4. External peer lab environment contract.
11+
5. Digest-covered external peer artifacts.
12+
6. External peer run commands.
13+
7. External peer commercial readiness aggregation.
14+
8. Commercial release gate alignment.
15+
9. Migration notes and public label cleanup.
16+
10. Final realignment status and documentation.
17+
18+
## Current State
19+
20+
`SigtranCommercialRoadmapRealignmentStatus.GetReport().FoundationReady` is expected to be true.
21+
22+
The SDK public contracts now describe external peers, maintained peers, interoperability evidence, and commercial readiness without binding source names to a specific peer package.
23+
24+
## Production Claim Boundary
25+
26+
The realignment foundation does not make the SDK commercially ready by itself. Commercial release remains blocked until a maintained external SIGTRAN peer run produces passing PCAP, peer logs, SDK traces, configuration, comparison evidence, and release artifacts with digest coverage.
27+
28+
## API Entry Points
29+
30+
- `SigtranCommercialRoadmapRealignmentStatus`
31+
- `SigtranExternalPeerCommercialReadiness`
32+
- `SigtranMaintainedPeerSelectionPolicy`
33+
- `SigtranInteropPeerProfile`
34+
- `SigtranExternalPeerInteropStatus`

docs/SDK_ROADMAP.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ Status: Phase 25 has execution evidence in place. Linux SCTP loopback evidence i
234234
- Add maintained peer selection, lab environment, artifact, run, comparison, and readiness contracts without naming public APIs after a peer package.
235235
- Document any selected peer package only in lab profile notes, configuration examples, and retained evidence.
236236

237-
Status: Phase 26 has started with package-neutral source contract naming, external peer profile support models, and maintained peer selection policy criteria. Commercial release remains blocked until a maintained external SIGTRAN peer run produces passing PCAP, peer logs, SDK traces, and comparison evidence.
237+
Status: Phase 26 is foundation-complete for package-neutral commercial roadmap realignment. `SigtranCommercialRoadmapRealignmentStatus` now gates source naming, public labels, external peer readiness, maintained peer selection, and commercial release gate alignment. Commercial release remains blocked until a maintained external SIGTRAN peer run produces passing PCAP, peer logs, SDK traces, configuration, comparison evidence, and digest-covered release artifacts.
238238

239239
## Recommended First Deliverable
240240

src/sigtran.net.Tests/Program.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@
133133
Run("SIGTRAN external peer readiness separates foundation from evidence", SigtranExternalPeerReadinessSeparatesFoundationFromEvidence);
134134
Run("SIGTRAN external peer commercial readiness aggregates selection lab and evidence", SigtranExternalPeerCommercialReadinessAggregatesSelectionLabAndEvidence);
135135
Run("SIGTRAN external peer status summarizes execution foundation", SigtranExternalPeerStatusSummarizesExecutionFoundation);
136+
Run("SIGTRAN commercial roadmap realignment status summarizes package-neutral completion", SigtranCommercialRoadmapRealignmentStatusSummarizesPackageNeutralCompletion);
136137
Run("SIGTRAN protocol interop vector catalog covers SCCP TCAP and MAP", SigtranProtocolInteropVectorCatalogCoversSccpTcapAndMap);
137138
Run("SIGTRAN protocol interop references require trace validation", SigtranProtocolInteropReferencesRequireTraceValidation);
138139
Run("SIGTRAN protocol interop artifact manifest requires reference SDK and comparison", SigtranProtocolInteropArtifactManifestRequiresReferenceSdkAndComparison);
@@ -1760,6 +1761,35 @@ static void SigtranExternalPeerStatusSummarizesExecutionFoundation()
17601761
Assert(!SigtranExternalPeerInteropStatus.Verified, SigtranExternalPeerInteropStatus.Describe());
17611762
}
17621763

1764+
static void SigtranCommercialRoadmapRealignmentStatusSummarizesPackageNeutralCompletion()
1765+
{
1766+
IReadOnlyList<string> capabilities = SigtranCommercialRoadmapRealignmentStatus.GetCompletedCapabilities();
1767+
IReadOnlyList<string> publicNames = SigtranCommercialRoadmapRealignmentStatus.GetPublicContractNames();
1768+
IReadOnlyList<string> guardCategories = SigtranCommercialRoadmapRealignmentStatus.GetPackageSpecificNameGuardCategories();
1769+
SigtranCommercialRoadmapRealignmentReport report = SigtranCommercialRoadmapRealignmentStatus.GetReport();
1770+
1771+
AssertEqual(10, SigtranCommercialRoadmapRealignmentStatus.CompletedUnitCount, "commercial roadmap realignment completed unit count");
1772+
AssertEqual(10, capabilities.Count, "commercial roadmap realignment capability count");
1773+
AssertEqual(3, guardCategories.Count, "commercial roadmap realignment guard category count");
1774+
Assert(capabilities.Contains("public-label-migration"), "commercial roadmap realignment should include public label migration");
1775+
Assert(publicNames.All(name => name.Contains("external", StringComparison.OrdinalIgnoreCase)
1776+
|| name.Contains("commercial", StringComparison.OrdinalIgnoreCase)
1777+
|| name.Contains("maintained", StringComparison.OrdinalIgnoreCase)
1778+
|| name.Contains("evidence", StringComparison.OrdinalIgnoreCase)
1779+
|| name.Contains("package-neutral", StringComparison.OrdinalIgnoreCase)
1780+
|| name.Contains("public-label", StringComparison.OrdinalIgnoreCase)
1781+
|| string.Equals(name, "documentation", StringComparison.OrdinalIgnoreCase)), "public realignment contract names should use package-neutral domains");
1782+
Assert(report.PackageNeutralNamingReady, report.Describe());
1783+
Assert(report.MaintainedPeerPolicyReady, report.Describe());
1784+
Assert(report.ExternalPeerExecutionFoundationReady, report.Describe());
1785+
Assert(report.CommercialGateAligned, report.Describe());
1786+
Assert(report.FoundationReady, report.Describe());
1787+
Assert(!report.CommercialReleaseReady, report.Describe());
1788+
Assert(report.Blockers.Contains("maintained-peer-selection-required"), "current realignment report should require maintained peer selection evidence");
1789+
Assert(report.Blockers.Contains("external-peer-review-ready-evidence-required"), "current realignment report should require review-ready external peer evidence");
1790+
Assert(SigtranCommercialRoadmapRealignmentStatus.Describe().Contains(SigtranCommercialRoadmapRealignmentStatus.StatusLabel, StringComparison.Ordinal), "realignment description should include the status label");
1791+
}
1792+
17631793
static SigtranExternalPeerInteropArtifactManifest CreateCompleteExternalPeerManifest()
17641794
{
17651795
SigtranExternalPeerInteropArtifactManifest manifest = new();
Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
namespace sigtran.net.Core.Utilities;
2+
3+
/// <summary>
4+
/// Describes the package-neutral commercial roadmap realignment result.
5+
/// </summary>
6+
public sealed class SigtranCommercialRoadmapRealignmentReport
7+
{
8+
/// <summary>Creates a commercial roadmap realignment report.</summary>
9+
/// <param name="completedUnitCount">The completed work unit count.</param>
10+
/// <param name="capabilities">The completed capability ids.</param>
11+
/// <param name="packageNeutralNamingReady">Whether public contract names are package-neutral.</param>
12+
/// <param name="maintainedPeerPolicyReady">Whether the maintained peer policy is available.</param>
13+
/// <param name="externalPeerExecutionFoundationReady">Whether external peer execution foundation is ready.</param>
14+
/// <param name="commercialGateAligned">Whether commercial gates use external peer terminology.</param>
15+
/// <param name="externalPeerCommercialInteropReady">Whether current external peer commercial interop evidence is ready.</param>
16+
/// <param name="blockers">The current blocker identifiers.</param>
17+
public SigtranCommercialRoadmapRealignmentReport(
18+
int completedUnitCount,
19+
IReadOnlyList<string> capabilities,
20+
bool packageNeutralNamingReady,
21+
bool maintainedPeerPolicyReady,
22+
bool externalPeerExecutionFoundationReady,
23+
bool commercialGateAligned,
24+
bool externalPeerCommercialInteropReady,
25+
IReadOnlyList<string> blockers)
26+
{
27+
ArgumentNullException.ThrowIfNull(capabilities);
28+
ArgumentNullException.ThrowIfNull(blockers);
29+
30+
CompletedUnitCount = completedUnitCount;
31+
Capabilities = capabilities.ToArray();
32+
PackageNeutralNamingReady = packageNeutralNamingReady;
33+
MaintainedPeerPolicyReady = maintainedPeerPolicyReady;
34+
ExternalPeerExecutionFoundationReady = externalPeerExecutionFoundationReady;
35+
CommercialGateAligned = commercialGateAligned;
36+
ExternalPeerCommercialInteropReady = externalPeerCommercialInteropReady;
37+
Blockers = blockers.ToArray();
38+
}
39+
40+
/// <summary>The completed work unit count.</summary>
41+
public int CompletedUnitCount { get; }
42+
43+
/// <summary>The completed capability ids.</summary>
44+
public IReadOnlyList<string> Capabilities { get; }
45+
46+
/// <summary>Whether public contract names are package-neutral.</summary>
47+
public bool PackageNeutralNamingReady { get; }
48+
49+
/// <summary>Whether the maintained peer policy is available.</summary>
50+
public bool MaintainedPeerPolicyReady { get; }
51+
52+
/// <summary>Whether external peer execution foundation is ready.</summary>
53+
public bool ExternalPeerExecutionFoundationReady { get; }
54+
55+
/// <summary>Whether commercial gates use external peer terminology.</summary>
56+
public bool CommercialGateAligned { get; }
57+
58+
/// <summary>Whether current external peer commercial interop evidence is ready.</summary>
59+
public bool ExternalPeerCommercialInteropReady { get; }
60+
61+
/// <summary>The current blocker identifiers.</summary>
62+
public IReadOnlyList<string> Blockers { get; }
63+
64+
/// <summary>Whether the package-neutral roadmap realignment foundation is complete.</summary>
65+
public bool FoundationReady => Capabilities.Count == CompletedUnitCount
66+
&& PackageNeutralNamingReady
67+
&& MaintainedPeerPolicyReady
68+
&& ExternalPeerExecutionFoundationReady
69+
&& CommercialGateAligned;
70+
71+
/// <summary>Whether the realigned commercial release gate can pass today.</summary>
72+
public bool CommercialReleaseReady => FoundationReady
73+
&& ExternalPeerCommercialInteropReady
74+
&& Blockers.Count == 0;
75+
76+
/// <summary>Formats a compact realignment status summary.</summary>
77+
/// <returns>The realignment status summary.</returns>
78+
public string Describe()
79+
{
80+
return $"commercialRoadmapRealignmentReady={FoundationReady} commercialReleaseReady={CommercialReleaseReady} blockers={Blockers.Count}";
81+
}
82+
}
83+
84+
/// <summary>
85+
/// Provides package-neutral commercial roadmap realignment status.
86+
/// </summary>
87+
public static class SigtranCommercialRoadmapRealignmentStatus
88+
{
89+
private static readonly string[] Capabilities =
90+
[
91+
"package-neutral-source-contracts",
92+
"external-peer-profile-model",
93+
"maintained-peer-selection-policy",
94+
"external-peer-lab-environment-contract",
95+
"digest-covered-external-peer-artifacts",
96+
"external-peer-run-commands",
97+
"external-peer-commercial-readiness",
98+
"commercial-release-gate-alignment",
99+
"public-label-migration",
100+
"documentation"
101+
];
102+
103+
private static readonly string[] PublicContractNames =
104+
[
105+
nameof(SigtranExternalPeerInteropStatus),
106+
nameof(SigtranExternalPeerCommercialReadiness),
107+
nameof(SigtranMaintainedPeerSelectionPolicy),
108+
nameof(SigtranCommercialReleaseExecutionReadiness),
109+
nameof(SigtranCommercialEvidenceGate),
110+
StatusLabel,
111+
SigtranExternalPeerInteropStatus.StatusLabel
112+
];
113+
114+
private static readonly string[] PackageSpecificNameGuardCategories =
115+
[
116+
"peer-product-type-name",
117+
"peer-product-label",
118+
"peer-product-ci-variable"
119+
];
120+
121+
/// <summary>The status label.</summary>
122+
public const string StatusLabel = "Commercial Roadmap Realignment";
123+
124+
/// <summary>The number of completed realignment work units.</summary>
125+
public const int CompletedUnitCount = 10;
126+
127+
/// <summary>Returns the completed realignment capability names.</summary>
128+
/// <returns>The completed capability names.</returns>
129+
public static IReadOnlyList<string> GetCompletedCapabilities()
130+
{
131+
return Capabilities.ToArray();
132+
}
133+
134+
/// <summary>Returns the public contract names checked by the package-neutral naming guard.</summary>
135+
/// <returns>The public contract names checked by the naming guard.</returns>
136+
public static IReadOnlyList<string> GetPublicContractNames()
137+
{
138+
return [.. PublicContractNames, .. Capabilities];
139+
}
140+
141+
/// <summary>Returns the package-specific naming categories guarded by the realignment status.</summary>
142+
/// <returns>The guarded package-specific naming categories.</returns>
143+
public static IReadOnlyList<string> GetPackageSpecificNameGuardCategories()
144+
{
145+
return PackageSpecificNameGuardCategories.ToArray();
146+
}
147+
148+
/// <summary>Whether the realignment public names are package-neutral.</summary>
149+
public static bool PackageNeutralNamingReady => GetPublicContractNames()
150+
.All(static name => name.Contains("external", StringComparison.OrdinalIgnoreCase)
151+
|| name.Contains("commercial", StringComparison.OrdinalIgnoreCase)
152+
|| name.Contains("maintained", StringComparison.OrdinalIgnoreCase)
153+
|| name.Contains("evidence", StringComparison.OrdinalIgnoreCase)
154+
|| name.Contains("package-neutral", StringComparison.OrdinalIgnoreCase)
155+
|| name.Contains("public-label", StringComparison.OrdinalIgnoreCase)
156+
|| string.Equals(name, "documentation", StringComparison.OrdinalIgnoreCase));
157+
158+
/// <summary>Creates the current package-neutral commercial roadmap realignment report.</summary>
159+
/// <returns>The current realignment report.</returns>
160+
public static SigtranCommercialRoadmapRealignmentReport GetReport()
161+
{
162+
SigtranExternalPeerCommercialReadinessReport commercialPeer = SigtranExternalPeerCommercialReadiness.CreateCurrent();
163+
SigtranCommercialReleaseExecutionReadinessReport release = SigtranCommercialReleaseExecutionReadiness.CreateCurrent();
164+
165+
bool maintainedPeerPolicyReady = SigtranMaintainedPeerSelectionPolicy.CreateDefault().GetCriteria().Count == 6
166+
&& SigtranInteropPeerProfiles.CreateExternalPeerSignallingGateway().IsMaintainedCommercialCandidate;
167+
bool commercialGateAligned = release.Items.Any(static item => item.Name == "external-peer-interop")
168+
&& release.Items.All(static item => !item.Name.Contains("openss7", StringComparison.OrdinalIgnoreCase))
169+
&& release.Items.All(static item => !item.Name.Contains("ipss7", StringComparison.OrdinalIgnoreCase));
170+
171+
List<string> blockers = [];
172+
if (!PackageNeutralNamingReady)
173+
{
174+
blockers.Add("package-neutral-naming-required");
175+
}
176+
177+
if (!maintainedPeerPolicyReady)
178+
{
179+
blockers.Add("maintained-peer-policy-required");
180+
}
181+
182+
if (!SigtranExternalPeerInteropStatus.FoundationReady)
183+
{
184+
blockers.Add("external-peer-execution-foundation-required");
185+
}
186+
187+
if (!commercialGateAligned)
188+
{
189+
blockers.Add("commercial-gate-alignment-required");
190+
}
191+
192+
blockers.AddRange(commercialPeer.Blockers);
193+
194+
return new(
195+
CompletedUnitCount,
196+
Capabilities,
197+
PackageNeutralNamingReady,
198+
maintainedPeerPolicyReady,
199+
SigtranExternalPeerInteropStatus.FoundationReady,
200+
commercialGateAligned,
201+
commercialPeer.CommercialInteropReady,
202+
blockers);
203+
}
204+
205+
/// <summary>Formats a compact realignment status summary.</summary>
206+
/// <returns>The realignment status summary.</returns>
207+
public static string Describe()
208+
{
209+
SigtranCommercialRoadmapRealignmentReport report = GetReport();
210+
return $"{StatusLabel}: completedUnits={CompletedUnitCount} capabilities={Capabilities.Length} foundationReady={report.FoundationReady} commercialReleaseReady={report.CommercialReleaseReady}";
211+
}
212+
}

0 commit comments

Comments
 (0)