Skip to content

Commit da0c3ad

Browse files
committed
Add operations support handbook
1 parent 740c88e commit da0c3ad

4 files changed

Lines changed: 76 additions & 1 deletion

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ The first production milestone is M3UA over a transport abstraction. SCCP, TCAP,
4141
| Release candidates | Phase 7 manifest added for package version, source commit, internal release gates, and commercial promotion gates |
4242
| Release automation | Phase 10 foundation-ready: deterministic release plan, artifact manifest with digest tracking, SBOM plan, package signing plan, provenance tracking, release notes validation, publish channels, release gate evaluator, release CI profile, and status report added; stable commercial publication still requires real signing, SBOM generation, native SCTP evidence, and external interoperability evidence |
4343
| Developer experience | Phase 11 foundation-ready: capability catalog, M3UA ASP-to-SG quickstart, sample templates, configuration profiles, troubleshooting index, API reference index, adoption gates, documentation readiness report, DX CI profile, and status report added; enterprise production adoption still requires commercial readiness |
44-
| Operations | Phase 12 started: production operations capability catalog, runbook catalog, incident response targets, health check matrix, rollback plan, and maintenance policy added |
44+
| Operations | Phase 12 started: production operations capability catalog, runbook catalog, incident response targets, health check matrix, rollback plan, maintenance policy, and support handbook added |
4545
| Package governance | Phase 7 policy added: current package metadata is tracked; commercial target still requires package signing and SBOM automation |
4646
| Security governance | Phase 7 security policy added with private disclosure and severity response targets |
4747
| Compatibility policy | Phase 7 policy added: net10.0 target, SemVer, pre-stable breaking-change allowance, and stable major-version rule |

docs/PHASE12_OPERATIONS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,7 @@ The plan stops publication, communicates the affected version, preserves artifac
3535
## Maintenance Policy
3636

3737
`SigtranMaintenancePolicies.CreateDefault()` defines a 7-day minimum notice period, requires rollback plans, and requires lab validation for protocol and transport behavior changes.
38+
39+
## Support Handbook
40+
41+
`SigtranSupportHandbook.GetRules()` defines public GitHub issue support, private security disclosure, and commercial escalation channels.

src/sigtran.net.Tests/Program.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
Run("SIGTRAN health check matrix covers transport protocol evidence and release", SigtranHealthCheckMatrixCoversTransportProtocolEvidenceAndRelease);
6767
Run("SIGTRAN rollback plan defines package recovery steps", SigtranRollbackPlanDefinesPackageRecoverySteps);
6868
Run("SIGTRAN maintenance policy gates protocol and transport changes", SigtranMaintenancePolicyGatesProtocolAndTransportChanges);
69+
Run("SIGTRAN support handbook defines public private and commercial channels", SigtranSupportHandbookDefinesPublicPrivateAndCommercialChannels);
6970
Run("Native SCTP platform probe reports socket creation capability", NativeSctpPlatformProbeReportsSocketCreationCapability);
7071
Run("Native SCTP socket factory creates or reports unsupported platform", NativeSctpSocketFactoryCreatesOrReportsUnsupportedPlatform);
7172
Run("Native SCTP connection planner resolves endpoints", NativeSctpConnectionPlannerResolvesEndpoints);
@@ -895,6 +896,16 @@ static void SigtranMaintenancePolicyGatesProtocolAndTransportChanges()
895896
Assert(!policy.RequiresLabValidation(SigtranMaintenanceChangeKind.Documentation), "documentation changes should not require lab validation");
896897
}
897898

899+
static void SigtranSupportHandbookDefinesPublicPrivateAndCommercialChannels()
900+
{
901+
IReadOnlyList<SigtranSupportRule> rules = SigtranSupportHandbook.GetRules();
902+
903+
AssertEqual(3, rules.Count, "support rule count");
904+
Assert(rules.Any(static rule => rule.Channel == SigtranSupportChannel.GitHubIssues), "support should include GitHub issues");
905+
Assert(rules.Any(static rule => rule.Channel == SigtranSupportChannel.PrivateSecurity && rule.EscalatesIncidents), "support should include private security escalation");
906+
Assert(rules.Any(static rule => rule.Channel == SigtranSupportChannel.Commercial && rule.EscalatesIncidents), "support should include commercial escalation");
907+
}
908+
898909
static void NativeSctpPlatformProbeReportsSocketCreationCapability()
899910
{
900911
AssertEqual(132, NativeSctpPlatform.IpProtocolSctp, "native SCTP protocol number");
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
namespace sigtran.net.Core.Utilities;
2+
3+
/// <summary>
4+
/// Identifies a support intake channel.
5+
/// </summary>
6+
public enum SigtranSupportChannel
7+
{
8+
/// <summary>GitHub issue support channel.</summary>
9+
GitHubIssues,
10+
11+
/// <summary>Private security disclosure support channel.</summary>
12+
PrivateSecurity,
13+
14+
/// <summary>Commercial support support channel.</summary>
15+
Commercial
16+
}
17+
18+
/// <summary>
19+
/// Describes one support intake rule.
20+
/// </summary>
21+
public sealed class SigtranSupportRule
22+
{
23+
/// <summary>Creates a support rule.</summary>
24+
/// <param name="channel">The support channel.</param>
25+
/// <param name="scope">The support scope.</param>
26+
/// <param name="escalatesIncidents">Whether incidents can be escalated through this channel.</param>
27+
public SigtranSupportRule(SigtranSupportChannel channel, string scope, bool escalatesIncidents)
28+
{
29+
Channel = channel;
30+
Scope = string.IsNullOrWhiteSpace(scope) ? throw new ArgumentException("Scope is required.", nameof(scope)) : scope;
31+
EscalatesIncidents = escalatesIncidents;
32+
}
33+
34+
/// <summary>The support channel.</summary>
35+
public SigtranSupportChannel Channel { get; }
36+
37+
/// <summary>The support scope.</summary>
38+
public string Scope { get; }
39+
40+
/// <summary>Whether incidents can be escalated through this channel.</summary>
41+
public bool EscalatesIncidents { get; }
42+
}
43+
44+
/// <summary>
45+
/// Provides support handbook metadata.
46+
/// </summary>
47+
public static class SigtranSupportHandbook
48+
{
49+
/// <summary>Returns the support intake rules.</summary>
50+
/// <returns>The support intake rules.</returns>
51+
public static IReadOnlyList<SigtranSupportRule> GetRules()
52+
{
53+
return
54+
[
55+
new SigtranSupportRule(SigtranSupportChannel.GitHubIssues, "Public bugs, questions, and feature requests.", escalatesIncidents: false),
56+
new SigtranSupportRule(SigtranSupportChannel.PrivateSecurity, "Security reports and coordinated disclosure.", escalatesIncidents: true),
57+
new SigtranSupportRule(SigtranSupportChannel.Commercial, "Enterprise support, interoperability incidents, and release escalations.", escalatesIncidents: true)
58+
];
59+
}
60+
}

0 commit comments

Comments
 (0)