Skip to content

Commit 3294388

Browse files
committed
Add commercial evidence artifact completeness evaluation
1 parent 94761db commit 3294388

7 files changed

Lines changed: 124 additions & 8 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ The first production milestone is M3UA over a transport abstraction. SCCP, TCAP,
7373
| RC publish and commercial gate | Phase 35 complete: dry-run release rehearsal, gated NuGet prerelease publication, retained release notes, retained migration notes, final commercial readiness reporting, RC/stable decisioning, RC publication evidence manifest, release workflow channel wiring, status reporting, and final commercial gate report are available; stable publication remains blocked until commercial evidence is complete |
7474
| Commercial evidence readiness lockdown | Phase 36 foundation-complete: release target locking, protected secret readiness, evidence retention mapping, commercial evidence checklist, release preflight, protected release environments, dossier handoff, go/no-go gating, status reporting, and final validation are available; RC and stable publication remain blocked until retained commercial release evidence is complete |
7575
| Commercial evidence execution orchestration | Phase 37 foundation-complete: evidence execution run identity, stage catalog, operator command plan, execution environment contract, artifact collection manifest, digest/redaction verification, blocker classification, retry/resume policy, status reporting, and final validation are available; real retained execution artifacts are still required before commercial publication |
76-
| Commercial evidence artifact intake | Phase 38 in progress: artifact intake target identity, artifact source registration, SHA-256 digest coverage, and redaction review are available, binding a stable intake id, reviewer identity, UTC receipt time, run-scoped dossier root, concrete source paths, unique retained dossier paths, retained digests, and trace-bearing artifact approvals to a governed execution run; completeness evaluation, dossier reporting, promotion handoff, execution bridge, status reporting, and final validation remain |
76+
| Commercial evidence artifact intake | Phase 38 in progress: artifact intake target identity, artifact source registration, SHA-256 digest coverage, redaction review, and completeness evaluation are available, binding a stable intake id, reviewer identity, UTC receipt time, run-scoped dossier root, concrete source paths, unique retained dossier paths, retained digests, trace-bearing artifact approvals, and explicit intake blockers to a governed execution run; dossier reporting, promotion handoff, execution bridge, status reporting, and final validation remain |
7777

7878
## Requirements
7979

docs/PHASE38_COMMERCIAL_EVIDENCE_ARTIFACT_INTAKE.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,16 @@ The digest manifest is required before redaction review and promotion handoff be
5151

5252
Each required review records the retained path, artifact kind, reviewer identity, UTC review time, approval state, and notes. Rejected or missing reviews block the intake from moving into completeness evaluation.
5353

54+
## Unit 5 - Artifact Completeness Evaluation
55+
56+
`SigtranCommercialEvidenceArtifactCompleteness` evaluates whether intake can move into dossier reporting:
57+
58+
- Source registration must be complete.
59+
- Digest coverage must be complete.
60+
- Redaction review must be complete.
61+
62+
The evaluator returns explicit blocker codes such as `artifact-source-registration-incomplete`, `artifact-digest-coverage-incomplete`, and `redaction-review-incomplete` so release operators can correct the right evidence area without guessing.
63+
5464
## Validation
5565

5666
Each unit in this phase is validated with:

docs/PHASE38_SUMMARY.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ Phase 38 prepares the SDK to receive real execution artifacts and convert them i
88
- Artifact source manifest that maps every required expected execution artifact to a concrete source path and a unique retained dossier path.
99
- Artifact digest manifest that requires SHA-256 coverage for every retained source.
1010
- Redaction review manifest that requires approved review for trace-bearing retained artifacts.
11+
- Artifact completeness evaluator that reports explicit source, digest, and redaction blockers.
1112

1213
## Readiness Position
1314

14-
The phase is in progress. Artifact intake identity, source registration, digest coverage, and redaction review are available. Completeness evaluation, dossier reporting, promotion handoff, execution bridge, status reporting, and final validation remain.
15+
The phase is in progress. Artifact intake identity, source registration, digest coverage, redaction review, and completeness evaluation are available. Dossier reporting, promotion handoff, execution bridge, status reporting, and final validation remain.

docs/PHASE_INDEX.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ This index is the complete phase map for Sigtran.NET. It links each phase to the
4242
| 35 | RC publish and commercial gate | [Phase 35 RC Publish And Commercial Gate](PHASE35_RC_PUBLISH_COMMERCIAL_GATE.md), [Phase 35 Summary](PHASE35_SUMMARY.md), [Phase 35 Commercial Gate Report](PHASE35_COMMERCIAL_GATE_REPORT.md) | RC gate foundation complete; stable publication blocked |
4343
| 36 | Commercial evidence readiness lockdown | [Phase 36 Commercial Evidence Readiness Lockdown](PHASE36_COMMERCIAL_EVIDENCE_READINESS_LOCKDOWN.md), [Phase 36 Summary](PHASE36_SUMMARY.md) | Foundation complete; real commercial evidence still required |
4444
| 37 | Commercial evidence execution orchestration | [Phase 37 Commercial Evidence Execution Orchestration](PHASE37_COMMERCIAL_EVIDENCE_EXECUTION_ORCHESTRATION.md), [Phase 37 Summary](PHASE37_SUMMARY.md) | Foundation complete; real execution artifacts still required |
45-
| 38 | Commercial evidence artifact intake | [Phase 38 Commercial Evidence Artifact Intake](PHASE38_COMMERCIAL_EVIDENCE_ARTIFACT_INTAKE.md), [Phase 38 Summary](PHASE38_SUMMARY.md) | In progress; redaction review complete |
45+
| 38 | Commercial evidence artifact intake | [Phase 38 Commercial Evidence Artifact Intake](PHASE38_COMMERCIAL_EVIDENCE_ARTIFACT_INTAKE.md), [Phase 38 Summary](PHASE38_SUMMARY.md) | In progress; completeness evaluation complete |
4646

4747
## Current Commercial Gate
4848

docs/SDK_ROADMAP.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ Status: Phase 37 is foundation-complete. Evidence execution run identity binds a
339339
- Register artifact sources, digests, redaction reviews, completeness results, dossier reports, promotion handoff, and execution-to-dossier bridging.
340340
- Keep intake foundation separate from commercial publication: intake can prove that artifacts are ready for review, but publication remains blocked until all retained evidence is complete and approved.
341341

342-
Status: Phase 38 is in progress. Artifact intake target identity now binds a stable intake id, reviewer identity, UTC receipt time, and run-scoped dossier root to a governed commercial evidence execution run. Artifact source registration now maps every required expected execution artifact to a concrete source path and unique retained dossier path while rejecting floating `artifacts/latest` aliases. Digest coverage now records SHA-256 values for every retained source and blocks invalid digest values. Redaction review now requires approved reviewer records for trace-bearing retained artifacts. Completeness evaluation, dossier reporting, promotion handoff, execution bridge, status reporting, and final validation remain in progress.
342+
Status: Phase 38 is in progress. Artifact intake target identity now binds a stable intake id, reviewer identity, UTC receipt time, and run-scoped dossier root to a governed commercial evidence execution run. Artifact source registration now maps every required expected execution artifact to a concrete source path and unique retained dossier path while rejecting floating `artifacts/latest` aliases. Digest coverage now records SHA-256 values for every retained source and blocks invalid digest values. Redaction review now requires approved reviewer records for trace-bearing retained artifacts. Completeness evaluation now reports explicit source, digest, and redaction blockers. Dossier reporting, promotion handoff, execution bridge, status reporting, and final validation remain in progress.
343343

344344
## Recommended First Deliverable
345345

src/Sigtran.NET.Tests/Program.cs

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@
291291
Run("SIGTRAN commercial evidence artifact sources cover expected execution artifacts", SigtranCommercialEvidenceArtifactSourcesCoverExpectedExecutionArtifacts);
292292
Run("SIGTRAN commercial evidence artifact digests cover retained sources", SigtranCommercialEvidenceArtifactDigestsCoverRetainedSources);
293293
Run("SIGTRAN commercial evidence redaction reviews approve trace-bearing artifacts", SigtranCommercialEvidenceRedactionReviewsApproveTraceBearingArtifacts);
294+
Run("SIGTRAN commercial evidence artifact completeness reports blockers", SigtranCommercialEvidenceArtifactCompletenessReportsBlockers);
294295
Run("SIGTRAN status capabilities use domain documentation labels", SigtranStatusCapabilitiesUseDomainDocumentationLabels);
295296
Run("Native SCTP platform probe reports socket creation capability", NativeSctpPlatformProbeReportsSocketCreationCapability);
296297
Run("Native SCTP socket factory creates or reports unsupported platform", NativeSctpSocketFactoryCreatesOrReportsUnsupportedPlatform);
@@ -4863,10 +4864,7 @@ static void SigtranCommercialEvidenceArtifactDigestsCoverRetainedSources()
48634864
static void SigtranCommercialEvidenceRedactionReviewsApproveTraceBearingArtifacts()
48644865
{
48654866
SigtranCommercialEvidenceArtifactDigestManifest digests = CreateDefaultCommercialEvidenceArtifactDigestManifest();
4866-
SigtranCommercialEvidenceRedactionReviewManifest reviews = SigtranCommercialEvidenceRedactionReviews.CreateApproved(
4867-
digests,
4868-
"release-review",
4869-
DateTimeOffset.UtcNow);
4867+
SigtranCommercialEvidenceRedactionReviewManifest reviews = CreateDefaultCommercialEvidenceRedactionReviewManifest();
48704868
SigtranCommercialEvidenceRedactionReview firstReview = reviews.Reviews[0];
48714869
SigtranCommercialEvidenceRedactionReviewManifest rejectedReviews = new(
48724870
digests,
@@ -4881,6 +4879,33 @@ static void SigtranCommercialEvidenceRedactionReviewsApproveTraceBearingArtifact
48814879
Assert(!rejectedReviews.IsReady, "rejected redaction review should block readiness");
48824880
}
48834881

4882+
static void SigtranCommercialEvidenceArtifactCompletenessReportsBlockers()
4883+
{
4884+
SigtranCommercialEvidenceArtifactDigestManifest digests = CreateDefaultCommercialEvidenceArtifactDigestManifest();
4885+
SigtranCommercialEvidenceRedactionReviewManifest reviews = CreateDefaultCommercialEvidenceRedactionReviewManifest();
4886+
SigtranCommercialEvidenceArtifactCompletenessResult complete = SigtranCommercialEvidenceArtifactCompleteness.Evaluate(reviews);
4887+
SigtranCommercialEvidenceRedactionReview firstReview = reviews.Reviews[0];
4888+
SigtranCommercialEvidenceRedactionReviewManifest rejectedReviews = new(
4889+
digests,
4890+
[
4891+
new(firstReview.RetainedPath, firstReview.Kind, "release-review", DateTimeOffset.UtcNow, approved: false, "Sensitive data still present.")
4892+
]);
4893+
SigtranCommercialEvidenceArtifactCompletenessResult blocked = SigtranCommercialEvidenceArtifactCompleteness.Evaluate(rejectedReviews);
4894+
4895+
Assert(complete.IsComplete, complete.Describe());
4896+
AssertEqual(0, complete.Blockers.Count, "complete artifact intake blockers");
4897+
Assert(!blocked.IsComplete, blocked.Describe());
4898+
Assert(blocked.Blockers.Contains("redaction-review-incomplete"), "blocked completeness should report redaction review");
4899+
}
4900+
4901+
static SigtranCommercialEvidenceRedactionReviewManifest CreateDefaultCommercialEvidenceRedactionReviewManifest()
4902+
{
4903+
return SigtranCommercialEvidenceRedactionReviews.CreateApproved(
4904+
CreateDefaultCommercialEvidenceArtifactDigestManifest(),
4905+
"release-review",
4906+
DateTimeOffset.UtcNow);
4907+
}
4908+
48844909
static SigtranCommercialEvidenceArtifactDigestManifest CreateDefaultCommercialEvidenceArtifactDigestManifest()
48854910
{
48864911
return SigtranCommercialEvidenceArtifactDigests.CreateCovered(
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
namespace Sigtran.NET.Core.Utilities;
2+
3+
/// <summary>
4+
/// Describes commercial evidence artifact intake completeness.
5+
/// </summary>
6+
public sealed class SigtranCommercialEvidenceArtifactCompletenessResult
7+
{
8+
/// <summary>Creates a commercial evidence artifact completeness result.</summary>
9+
/// <param name="redactionReviewManifest">The redaction review manifest.</param>
10+
/// <param name="blockers">The completeness blocker codes.</param>
11+
public SigtranCommercialEvidenceArtifactCompletenessResult(
12+
SigtranCommercialEvidenceRedactionReviewManifest redactionReviewManifest,
13+
IReadOnlyList<string> blockers)
14+
{
15+
RedactionReviewManifest = redactionReviewManifest ?? throw new ArgumentNullException(nameof(redactionReviewManifest));
16+
ArgumentNullException.ThrowIfNull(blockers);
17+
Blockers = blockers.ToArray();
18+
}
19+
20+
/// <summary>The redaction review manifest.</summary>
21+
public SigtranCommercialEvidenceRedactionReviewManifest RedactionReviewManifest { get; }
22+
23+
/// <summary>The completeness blocker codes.</summary>
24+
public IReadOnlyList<string> Blockers { get; }
25+
26+
/// <summary>Whether source registration is complete.</summary>
27+
public bool SourceRegistrationComplete => RedactionReviewManifest.DigestManifest.SourceManifest.IsReady;
28+
29+
/// <summary>Whether digest coverage is complete.</summary>
30+
public bool DigestCoverageComplete => RedactionReviewManifest.DigestManifest.IsReady;
31+
32+
/// <summary>Whether redaction review is complete.</summary>
33+
public bool RedactionReviewComplete => RedactionReviewManifest.IsReady;
34+
35+
/// <summary>Whether every required artifact is ready for dossier reporting.</summary>
36+
public bool IsComplete => Blockers.Count == 0
37+
&& SourceRegistrationComplete
38+
&& DigestCoverageComplete
39+
&& RedactionReviewComplete;
40+
41+
/// <summary>Formats a compact artifact completeness summary.</summary>
42+
/// <returns>The artifact completeness summary.</returns>
43+
public string Describe()
44+
{
45+
return $"commercialEvidenceArtifactCompleteness={IsComplete} blockers={Blockers.Count} intake={RedactionReviewManifest.DigestManifest.SourceManifest.Target.IntakeId}";
46+
}
47+
}
48+
49+
/// <summary>
50+
/// Provides commercial evidence artifact completeness evaluation.
51+
/// </summary>
52+
public static class SigtranCommercialEvidenceArtifactCompleteness
53+
{
54+
/// <summary>Evaluates artifact intake completeness.</summary>
55+
/// <param name="redactionReviewManifest">The redaction review manifest.</param>
56+
/// <returns>The artifact completeness result.</returns>
57+
public static SigtranCommercialEvidenceArtifactCompletenessResult Evaluate(
58+
SigtranCommercialEvidenceRedactionReviewManifest redactionReviewManifest)
59+
{
60+
ArgumentNullException.ThrowIfNull(redactionReviewManifest);
61+
List<string> blockers = [];
62+
63+
if (!redactionReviewManifest.DigestManifest.SourceManifest.IsReady)
64+
{
65+
blockers.Add("artifact-source-registration-incomplete");
66+
}
67+
68+
if (!redactionReviewManifest.DigestManifest.IsReady)
69+
{
70+
blockers.Add("artifact-digest-coverage-incomplete");
71+
}
72+
73+
if (!redactionReviewManifest.IsReady)
74+
{
75+
blockers.Add("redaction-review-incomplete");
76+
}
77+
78+
return new(redactionReviewManifest, blockers);
79+
}
80+
}

0 commit comments

Comments
 (0)