Skip to content

Commit 116c052

Browse files
committed
Add release candidate manifest
1 parent 7ecf2f4 commit 116c052

4 files changed

Lines changed: 87 additions & 0 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ The first production milestone is M3UA over a transport abstraction. SCCP, TCAP,
3838
| Commercial readiness | Phase 7 started: internal release readiness is available; commercial production readiness requires native SCTP verification, external interoperability evidence, and release governance |
3939
| Native SCTP support | Phase 7 matrix added: Linux requires lab verification; Windows and macOS are contract-only until a production provider is verified |
4040
| External interoperability evidence | Phase 7 registry added for peer-stack lab results and packet trace references; current evidence inventory is empty until real lab artifacts are captured |
41+
| Release candidates | Phase 7 manifest added for package version, source commit, internal release gates, and commercial promotion gates |
4142

4243
## Requirements
4344

docs/PHASE7_COMMERCIALIZATION.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,14 @@ registry.Add(new SigtranInteropEvidenceItem(
4343
```
4444

4545
The current registry is intentionally empty until real lab artifacts are added. Commercial readiness requires at least one passing external evidence item, and later release policies should require multiple peer stacks and scenarios.
46+
47+
## Release Candidate Manifest
48+
49+
`SigtranReleaseCandidate.Create(version, commitSha)` creates an auditable release snapshot.
50+
51+
```csharp
52+
SigtranReleaseCandidateManifest manifest =
53+
SigtranReleaseCandidate.Create("1.0.0-alpha.1", "abcdef0");
54+
```
55+
56+
Release candidates can be published after internal gates pass. Promotion to commercial production remains blocked until the commercial readiness report is fully green.

src/sigtran.net.Tests/Program.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
Run("SIGTRAN commercial readiness reports release gates", SigtranCommercialReadinessReportsReleaseGates);
2424
Run("SIGTRAN native SCTP support matrix reports verification status", SigtranNativeSctpSupportMatrixReportsVerificationStatus);
2525
Run("SIGTRAN interop evidence registry tracks lab results", SigtranInteropEvidenceRegistryTracksLabResults);
26+
Run("SIGTRAN release candidate manifest reports promotion gates", SigtranReleaseCandidateManifestReportsPromotionGates);
2627
Run("TCAP BER element encodes short and long lengths", TcapBerElementEncodesShortAndLongLengths);
2728
Run("TCAP transaction identifiers use BER context tags", TcapTransactionIdentifiersUseBerContextTags);
2829
Run("TCAP BER Invoke component round-trips", TcapBerInvokeComponentRoundTrips);
@@ -305,6 +306,16 @@ static void SigtranInteropEvidenceRegistryTracksLabResults()
305306
Assert(!SigtranInteropEvidence.CreateCurrentRegistry().HasPassingEvidence(), "current interop evidence should be empty until real lab artifacts are added");
306307
}
307308

309+
static void SigtranReleaseCandidateManifestReportsPromotionGates()
310+
{
311+
SigtranReleaseCandidateManifest manifest = SigtranReleaseCandidate.Create("1.0.0-alpha.1", "abcdef0");
312+
313+
AssertEqual("Sigtran.Net", manifest.PackageId, "release candidate package id");
314+
Assert(manifest.CanPublishReleaseCandidate, "release candidate should be publishable after internal gates");
315+
Assert(!manifest.CanPromoteToCommercialProduction, "release candidate should not promote without commercial gates");
316+
Assert(manifest.Describe().Contains("commercialProduction=False", StringComparison.Ordinal), manifest.Describe());
317+
}
318+
308319
static void TcapBerElementEncodesShortAndLongLengths()
309320
{
310321
Span<byte> shortBuffer = stackalloc byte[8];
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
namespace sigtran.net.Core.Utilities;
2+
3+
/// <summary>
4+
/// Describes one SDK release candidate manifest.
5+
/// </summary>
6+
public sealed class SigtranReleaseCandidateManifest
7+
{
8+
/// <summary>Creates a release candidate manifest.</summary>
9+
/// <param name="packageId">The package id.</param>
10+
/// <param name="version">The package version.</param>
11+
/// <param name="commitSha">The source commit SHA.</param>
12+
/// <param name="readiness">The commercial readiness report.</param>
13+
public SigtranReleaseCandidateManifest(
14+
string packageId,
15+
string version,
16+
string commitSha,
17+
SigtranCommercialReadinessReport readiness)
18+
{
19+
PackageId = string.IsNullOrWhiteSpace(packageId) ? throw new ArgumentException("Package id is required.", nameof(packageId)) : packageId;
20+
Version = string.IsNullOrWhiteSpace(version) ? throw new ArgumentException("Version is required.", nameof(version)) : version;
21+
CommitSha = string.IsNullOrWhiteSpace(commitSha) ? throw new ArgumentException("Commit SHA is required.", nameof(commitSha)) : commitSha;
22+
Readiness = readiness ?? throw new ArgumentNullException(nameof(readiness));
23+
}
24+
25+
/// <summary>The package id.</summary>
26+
public string PackageId { get; }
27+
28+
/// <summary>The package version.</summary>
29+
public string Version { get; }
30+
31+
/// <summary>The source commit SHA.</summary>
32+
public string CommitSha { get; }
33+
34+
/// <summary>The commercial readiness report.</summary>
35+
public SigtranCommercialReadinessReport Readiness { get; }
36+
37+
/// <summary>Whether this manifest can be used for a public release candidate.</summary>
38+
public bool CanPublishReleaseCandidate => Readiness.InternalReleaseReady;
39+
40+
/// <summary>Whether this manifest can be promoted to commercial production.</summary>
41+
public bool CanPromoteToCommercialProduction => Readiness.CommercialReady;
42+
43+
/// <summary>Formats a compact manifest summary.</summary>
44+
/// <returns>The manifest summary.</returns>
45+
public string Describe()
46+
{
47+
return $"{PackageId} {Version} commit={CommitSha} releaseCandidate={CanPublishReleaseCandidate} commercialProduction={CanPromoteToCommercialProduction}";
48+
}
49+
}
50+
51+
/// <summary>
52+
/// Builds release candidate manifests for the SDK.
53+
/// </summary>
54+
public static class SigtranReleaseCandidate
55+
{
56+
/// <summary>Creates a release candidate manifest.</summary>
57+
/// <param name="version">The package version.</param>
58+
/// <param name="commitSha">The source commit SHA.</param>
59+
/// <returns>The release candidate manifest.</returns>
60+
public static SigtranReleaseCandidateManifest Create(string version, string commitSha)
61+
{
62+
return new("Sigtran.Net", version, commitSha, SigtranCommercialReadiness.GetReport());
63+
}
64+
}

0 commit comments

Comments
 (0)