Skip to content

Commit 5d1d2fc

Browse files
committed
Harden stable release execution
1 parent 2c78e0e commit 5d1d2fc

358 files changed

Lines changed: 10607 additions & 888 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/dotnet.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ jobs:
1414

1515
steps:
1616
- name: Checkout
17-
uses: actions/checkout@v5
17+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
1818

1919
- name: Setup .NET
20-
uses: actions/setup-dotnet@v5
20+
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
2121
with:
2222
dotnet-version: 10.0.x
2323

.github/workflows/release.yml

Lines changed: 209 additions & 28 deletions
Large diffs are not rendered by default.

CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,27 @@ All notable changes to SIGTRAN.NET will be documented in this file.
44

55
This project follows Semantic Versioning once the public API reaches a stable release. During the alpha phase, breaking API changes may still occur as protocol behavior, transport abstractions, and interoperability evidence are finalized.
66

7+
## [1.0.0-rc.2] - Unreleased
8+
9+
### Added
10+
11+
- Formal layer contracts and stateful SCTP, M3UA, M2PA, SCCP, TCAP, and MAP SMS
12+
runtime APIs.
13+
- Runtime health, BCL/OpenTelemetry diagnostics, structured events,
14+
configuration validation, and an operations host.
15+
- Reflection-based public API baseline and protected stable release decision.
16+
17+
### Changed
18+
19+
- Normal package builds now produce `1.0.0-rc.2` rather than accidental stable
20+
`1.0.0` packages.
21+
- Repository release/evidence governance types are internal and no longer part
22+
of the consumer API.
23+
24+
### Release status
25+
26+
Unpublished. Stable `1.0.0` remains blocked by the retained `NO-GO` decision.
27+
728
## [0.1.0-alpha] - 2026-06-27
829

930
### Release type

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ Repository: <https://github.com/araditc/sigtran.net>
1313
## Status
1414

1515
SIGTRAN.NET is currently in a **public release-candidate** track. Version
16-
`1.0.0-rc.1` has been published and restored from NuGet.org.
16+
`1.0.0-rc.1` has been published and restored from NuGet.org. Source builds now
17+
default to the unpublished `1.0.0-rc.2` candidate so ordinary packing cannot
18+
accidentally create a stable package.
1719

1820
Native Linux SCTP, external SCTP/M3UA, and cross-implementation full-stack MAP
1921
SMS traffic evidence are retained. Stateful M3UA, M2PA, SCCP, TCAP, and MAP SMS
@@ -174,6 +176,8 @@ Start here:
174176
- [Phase 53 performance and resilience](docs/PHASE53_OPERATOR_PERFORMANCE_RESILIENCE.md)
175177
- [Phase 54 production operations package](docs/PHASE54_PRODUCTION_OPERATIONS_PACKAGE.md)
176178
- [Runtime operations](docs/OPERATIONS_RUNTIME.md)
179+
- [Phase 55 stable release execution](docs/PHASE55_STABLE_RELEASE_EXECUTION.md)
180+
- [Public API baseline](docs/PUBLIC_API_BASELINE.md)
177181
- [Interoperability and tooling](docs/INTEROPERABILITY.md)
178182
- [Compatibility policy](docs/COMPATIBILITY.md)
179183
- [Quality and contribution rules](docs/QUALITY.md)
@@ -184,6 +188,7 @@ Release and governance:
184188

185189
- [Changelog](CHANGELOG.md)
186190
- [v0.1.0-alpha release notes](docs/releases/v0.1.0-alpha.md)
191+
- [RC.1 to RC.2 migration](docs/migrations/1.0.0-rc.1-to-rc.2.md)
187192
- [Alpha release checklist](docs/ALPHA_RELEASE.md)
188193
- [Production readiness report](docs/COMMERCIAL_READINESS_REPORT.md)
189194

@@ -228,6 +233,7 @@ Stable production support requires:
228233
- Trusted package signing and provenance.
229234
- Stable package publication evidence.
230235
- Stable API lifecycle validation.
236+
- A machine-evaluated `GO` stable release decision.
231237
- Security, release, compliance, and operations review.
232238

233239
The Linux SCTP, external M3UA, repository-profile full-stack traffic, and

docs/API_NAMING.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ Avoid public type, member, and parameter names containing:
1919
- `ReadinessReport`
2020
- Phase-numbered names such as `Phase17`
2121

22-
Historical planning documents can still describe business goals in prose, but SDK identifiers must remain neutral, protocol-oriented, and reusable outside this repository's release plan.
22+
Historical planning documents can still describe business goals in prose, but
23+
SDK identifiers must remain neutral, protocol-oriented, and reusable outside
24+
this repository's release plan. Release governance models are internal and are
25+
not part of the package compatibility contract.
2326

2427
The test suite includes a public API naming guard that scans exported types, public members, and public parameters for these banned planning terms.

docs/COMMERCIAL_READINESS_REPORT.md

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
Status: public RC prerelease publication is closed; stable commercial publication remains gated.
44

5+
Source builds now default to unpublished version `1.0.0-rc.2`. Stable release
6+
manifest `eng/release/stable-release.json` and
7+
`eng/evaluate-stable-release.ps1` produce the authoritative machine decision.
8+
59
The readiness APIs now consume `SigtranVerificationCatalogs.CreateCurrent()`.
610
Native Linux SCTP and external SCTP/M3UA evidence report passing status from their
711
retained manifests instead of stale hard-coded flags.
@@ -56,6 +60,20 @@ retained manifests instead of stale hard-coded flags.
5660
Ubuntu 24.04 against the independent C/lksctp peer. Native SCTP established,
5761
the M3UA ASP became active, live/readiness were healthy, and the metrics
5862
endpoint reported one active association with zero faults or reconnects.
63+
- The exported SDK surface was reduced from 1,133 XML-documented types to 313
64+
actual exported types. Repository governance/evidence types are internal.
65+
Reflection baselines retain 6,440 RC.1 members and 2,185 stable-candidate
66+
members; the intentional prerelease break is documented for RC.2.
67+
- The stable workflow now pins the SBOM tool, compares the public API baseline,
68+
evaluates retained evidence, validates certificate chain/fingerprint/expiry,
69+
requires a matching existing tag and exact confirmation, uses a protected
70+
environment, uploads artifacts, verifies public NuGet restore, and creates a
71+
GitHub release only after all gates pass.
72+
- GitHub API evidence confirms main branch protection with strict
73+
`build-test-pack`, one approval, stale-review dismissal, conversation
74+
resolution, linear history, and no force-push/deletion. The
75+
`nuget-stable` environment is restricted to protected branches and requires
76+
reviewer approval.
5977

6078
## Remaining Production Blockers
6179

@@ -78,9 +96,18 @@ retained manifests instead of stale hard-coded flags.
7896
representative cluster SCTP/CNI deployment evidence has yet been retained.
7997
Cluster network, firewall, readiness, termination, and rollback behavior need
8098
validation in the adopting operator environment.
99+
- The machine-evaluated stable decision is `NO-GO`. Stable publication is
100+
blocked by independent external M2PA, operator/vendor profile acceptance,
101+
20K TPS capacity, multi-host soak, representative Kubernetes SCTP, and
102+
organization-trusted signing evidence.
81103

82104
## Production Decision
83105

84106
Do not publish this SDK as stable commercially production-ready yet.
85107

86-
The SDK has enough retained evidence for public RC consumption and controlled integration use. The stable release gate is ready to evaluate future stable publication evidence, but it must not be used to claim a stable public commercial release until the protected stable publication run, trusted public signing evidence, and stable NuGet publication evidence are retained and verified. The legacy OpenSS7/IPSS7 path can remain as historical evidence, but it is no longer the SDK's permanent commercial gate.
108+
The SDK has enough retained evidence for public RC consumption and controlled
109+
integration use. Stable publication is mechanically guarded and remains
110+
`NO-GO`; no stable tag or NuGet package may be created until every manifest
111+
gate passes and the protected workflow succeeds. The legacy OpenSS7/IPSS7 path
112+
can remain as historical evidence, but it is no longer the SDK's permanent
113+
release gate.

docs/PHASE15_API_LIFECYCLE.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ This phase makes the public SDK surface easier to consume in large projects by d
66

77
## API Surface Catalog
88

9-
`SigtranApiSurfaceCatalog.GetSurfaces()` exposes the public API surfaces that adopters should track:
9+
The historical `SigtranApiSurfaceCatalog` described the API surfaces that
10+
adopters should track:
1011

1112
- M3UA
1213
- SCTP
@@ -51,9 +52,12 @@ Migration guides must include code samples so users can update applications with
5152

5253
## Public API Baseline
5354

54-
`SigtranPublicApiBaseline.CreateCurrent()` defines the current pre-stable public API baseline manifest.
55+
The historical readiness model is now internal release tooling. The executable,
56+
version-controlled baseline is `eng/api/Sigtran.NET.1.0.public-api.txt`; see
57+
[Public API Baseline](PUBLIC_API_BASELINE.md).
5558

56-
The baseline covers known public surfaces and requires diff review before API-shaping changes are accepted.
59+
The reflection-based baseline covers only exported types and public members.
60+
Release planning and evidence orchestration types are intentionally excluded.
5761

5862
## API Lifecycle Readiness
5963

docs/PHASE34_SUPPLY_CHAIN_RELEASE_EXECUTION.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ The gate keeps supply-chain completeness separate from commercial release readin
110110
- Verify package signature and timestamp with `dotnet nuget verify --all`.
111111
- Create GitHub provenance and SBOM attestations with `actions/attest-build-provenance` and `actions/attest-sbom`.
112112
- Retain provenance marker, public API diff, and digest manifest artifacts.
113-
- Upload package, symbols, and supply-chain evidence with `actions/upload-artifact@v4`.
113+
- Upload package, symbols, and supply-chain evidence with the SHA-pinned
114+
`actions/upload-artifact` action.
114115

115116
`SigtranReleaseWorkflowValidation` now requires these workflow fragments, including SBOM generation, signing, verification, attestation, artifact upload, and final SBOM/API diff environment outputs.
116117

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# Phase 55 - Stable Release Execution
2+
3+
Phase 55 turns the stable release foundation into executable controls and
4+
records the real release decision.
5+
6+
## Delivered Units
7+
8+
1. Package defaults changed from accidental stable `1.0.0` to source version
9+
`1.0.0-rc.2`.
10+
2. Repository governance and evidence orchestration types removed from the
11+
exported SDK surface.
12+
3. Reflection-based RC.1 and stable-candidate public API baselines retained.
13+
4. Machine-enforced API comparison added to the release workflow.
14+
5. Versioned stable evidence manifest and `GO/NO-GO` evaluator added.
15+
6. SBOM tool and GitHub Actions pinned; package/SBOM attestations retained.
16+
7. Stable certificate trust, fingerprint, validity, and chain validation added.
17+
8. Stable publication bound to an existing matching tag, exact confirmation,
18+
protected GitHub environment, and NuGet secret.
19+
9. Public NuGet visibility/clean restore verification and GitHub release
20+
creation added after a successful stable push.
21+
10. Stable assessment execution and final release decision retained.
22+
23+
## Stable Gate
24+
25+
`eng/release/stable-release.json` is the source-controlled evidence manifest.
26+
`eng/evaluate-stable-release.ps1` verifies:
27+
28+
- stable SemVer and requested version agreement;
29+
- existence and SHA-256 digest of every declared evidence file;
30+
- every required gate's declared outcome;
31+
- presence and digest of the public API baseline.
32+
33+
The workflow can run a stable assessment with `publish=false`. A stable
34+
publication additionally requires:
35+
36+
- decision `GO`;
37+
- exact confirmation `publish Sigtran.NET 1.0.0`;
38+
- existing tag `v1.0.0` pointing at the workflow commit;
39+
- approval in the `nuget-stable` GitHub environment;
40+
- trusted non-self-issued certificate matching the protected fingerprint;
41+
- timestamped signature verification;
42+
- `NUGET_API_KEY`.
43+
44+
## Current Decision
45+
46+
The current decision is `NO-GO`. Passing repository evidence covers native
47+
Linux SCTP, independent M3UA, repository-profile full-stack MAP SMS traffic,
48+
runtime operations, and the public API baseline.
49+
50+
Open required gates are:
51+
52+
- independent external M2PA interoperability;
53+
- operator/vendor profile acceptance;
54+
- 20K TPS target;
55+
- representative multi-host soak/failover;
56+
- representative Kubernetes SCTP deployment;
57+
- organization-trusted stable signing identity.
58+
59+
The protected publication gate is configured and retained at
60+
`docs/evidence/PHASE55_GITHUB_PROTECTION_20260724T102354Z.json`. Main requires
61+
strict `build-test-pack`, one PR approval, stale-review dismissal, conversation
62+
resolution, linear history, and blocks force-push/deletion. `nuget-stable`
63+
requires a reviewer and protected branch. Administrators can bypass repository
64+
rules, so the machine evidence manifest and exact workflow confirmation remain
65+
mandatory independent controls. Protection does not make protocol and capacity
66+
gates pass.
67+
68+
## Publication Result
69+
70+
No stable tag or NuGet package is created while the decision is `NO-GO`.
71+
`1.0.0-rc.1` remains the latest public package. Source packaging defaults to
72+
the next RC candidate so an ordinary `dotnet pack` cannot accidentally produce
73+
a stable package.

docs/PHASE55_SUMMARY.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Phase 55 Summary
2+
3+
Status: stable release execution controls complete; stable publication blocked
4+
by evidence.
5+
6+
The package now defaults to RC.2, exports only consumer-facing protocol/runtime
7+
APIs plus focused diagnostics, has a real reflection-based API baseline and
8+
diff, and uses a machine-readable stable evidence decision. The workflow
9+
supports protected signing, attestations, package upload, public restore
10+
verification, and GitHub release creation only after every stable gate passes.
11+
Release actions are pinned to reviewed commit SHAs.
12+
Main branch protection and the reviewer-gated `nuget-stable` environment were
13+
created and verified through the GitHub API.
14+
15+
The current release decision is `NO-GO`. No stable package has been published.

0 commit comments

Comments
 (0)