Skip to content

Commit b5d0acf

Browse files
committed
Add commercial evidence file verification report
1 parent 6c13558 commit b5d0acf

7 files changed

Lines changed: 153 additions & 4 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ The first production milestone is M3UA over a transport abstraction. SCCP, TCAP,
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 |
7676
| Commercial evidence artifact intake | Phase 38 foundation-complete: artifact intake target identity, artifact source registration, SHA-256 digest coverage, redaction review, completeness evaluation, dossier reporting, promotion handoff, execution-to-dossier bridge, status reporting, and final validation 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, explicit intake blockers, retained Markdown summary, digest-covered handoff, end-to-end intake assembly, and intake readiness status to a governed execution run; real artifact files are still required before commercial publication |
77-
| Commercial evidence file verification | Phase 39 in progress: retained file evidence item verification and retained file manifest coverage are available, checking file existence, non-empty size, SHA-256 validity, digest match, UTC observation time, unique retained paths, and coverage of promotion-required handoff items; verification reporting, retention ledger, integrity seal, publication attachments, promotion gate, command plan, status reporting, and final validation remain |
77+
| Commercial evidence file verification | Phase 39 in progress: retained file evidence item verification, retained file manifest coverage, and file verification blocker reporting are available, checking file existence, non-empty size, SHA-256 validity, digest match, UTC observation time, unique retained paths, promotion-required handoff coverage, and explicit verification blockers; retention ledger, integrity seal, publication attachments, promotion gate, command plan, status reporting, and final validation remain |
7878

7979
## Requirements
8080

docs/PHASE39_COMMERCIAL_EVIDENCE_FILE_VERIFICATION.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,20 @@ A retained file is verified only when the file exists, is non-empty, carries val
2929

3030
The manifest is the first aggregate proof that retained file observations match the digest-covered handoff from artifact intake.
3131

32+
## Unit 3 - File Verification Report
33+
34+
`SigtranCommercialEvidenceFileVerificationReport` evaluates the retained file manifest and produces explicit blocker reasons:
35+
36+
- Missing retained files.
37+
- Empty retained files.
38+
- Invalid SHA-256 values.
39+
- Digest mismatches.
40+
- Non-UTC observation times.
41+
- Duplicate retained paths.
42+
- Incomplete promotion handoff coverage.
43+
44+
The report keeps verification gates auditable. A commercial release decision can now distinguish "not verified" from the specific retained file condition that blocked promotion.
45+
3246
## Validation
3347

3448
Each unit in this phase is validated with:

docs/PHASE39_SUMMARY.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ Phase 39 prepares the SDK to verify retained commercial evidence files after art
66

77
- Retained file evidence item that verifies existence, size, SHA-256 validity, digest match, and UTC observation time.
88
- Retained file manifest that covers every promotion-required handoff item with verified unique retained files.
9+
- File verification report that exposes missing, empty, invalid digest, digest mismatch, non-UTC observation, duplicate path, and incomplete handoff blockers.
910

1011
## Readiness Position
1112

12-
The phase is in progress. Retained file evidence item verification and retained file manifest coverage are available. Verification reporting, retention ledger, integrity seal, publication attachments, promotion gate, command plan, status reporting, and final validation remain.
13+
The phase is in progress. Retained file evidence item verification, retained file manifest coverage, and blocker reporting are available. Retention ledger, integrity seal, publication attachments, promotion gate, command plan, status reporting, and final validation remain.

docs/PHASE_INDEX.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ This index is the complete phase map for Sigtran.NET. It links each phase to the
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 |
4545
| 38 | Commercial evidence artifact intake | [Phase 38 Commercial Evidence Artifact Intake](PHASE38_COMMERCIAL_EVIDENCE_ARTIFACT_INTAKE.md), [Phase 38 Summary](PHASE38_SUMMARY.md) | Foundation complete; real artifact files still required |
46-
| 39 | Commercial evidence file verification | [Phase 39 Commercial Evidence File Verification](PHASE39_COMMERCIAL_EVIDENCE_FILE_VERIFICATION.md), [Phase 39 Summary](PHASE39_SUMMARY.md) | In progress; retained file manifest complete |
46+
| 39 | Commercial evidence file verification | [Phase 39 Commercial Evidence File Verification](PHASE39_COMMERCIAL_EVIDENCE_FILE_VERIFICATION.md), [Phase 39 Summary](PHASE39_SUMMARY.md) | In progress; verification report complete |
4747

4848
## Current Commercial Gate
4949

docs/SDK_ROADMAP.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ Status: Phase 38 is foundation-complete. Artifact intake target identity binds a
347347
- Track file existence, size, observation time, digest match, retention, integrity sealing, publication attachment, promotion gate, and operator command contracts.
348348
- Keep file verification separate from real lab execution: verification contracts can evaluate retained files, but publication remains blocked until real files are present and approved.
349349

350-
Status: Phase 39 is in progress. Retained file evidence item verification now checks existence, non-empty size, SHA-256 validity, digest match, and UTC observation time. Retained file manifest coverage now verifies that every promotion-required handoff item has a unique verified retained file. Verification reporting, retention ledger, integrity seal, publication attachments, promotion gate, command plan, status reporting, and final validation remain in progress.
350+
Status: Phase 39 is in progress. Retained file evidence item verification now checks existence, non-empty size, SHA-256 validity, digest match, and UTC observation time. Retained file manifest coverage now verifies that every promotion-required handoff item has a unique verified retained file. File verification reporting now exposes missing, empty, invalid digest, digest mismatch, non-UTC observation, duplicate path, and incomplete handoff blockers. Retention ledger, integrity seal, publication attachments, promotion gate, command plan, status reporting, and final validation remain in progress.
351351

352352
## Recommended First Deliverable
353353

src/Sigtran.NET.Tests/Program.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@
298298
Run("SIGTRAN commercial evidence artifact intake status summarizes foundation readiness", SigtranCommercialEvidenceArtifactIntakeStatusSummarizesFoundationReadiness);
299299
Run("SIGTRAN commercial evidence retained file verifies observed digest", SigtranCommercialEvidenceRetainedFileVerifiesObservedDigest);
300300
Run("SIGTRAN commercial evidence retained file manifest covers handoff items", SigtranCommercialEvidenceRetainedFileManifestCoversHandoffItems);
301+
Run("SIGTRAN commercial evidence file verification report identifies blockers", SigtranCommercialEvidenceFileVerificationReportIdentifiesBlockers);
301302
Run("SIGTRAN status capabilities use domain documentation labels", SigtranStatusCapabilitiesUseDomainDocumentationLabels);
302303
Run("Native SCTP platform probe reports socket creation capability", NativeSctpPlatformProbeReportsSocketCreationCapability);
303304
Run("Native SCTP socket factory creates or reports unsupported platform", NativeSctpSocketFactoryCreatesOrReportsUnsupportedPlatform);
@@ -5014,6 +5015,31 @@ static void SigtranCommercialEvidenceRetainedFileManifestCoversHandoffItems()
50145015
Assert(!incomplete.IsReady, "missing retained files should block manifest readiness");
50155016
}
50165017

5018+
static void SigtranCommercialEvidenceFileVerificationReportIdentifiesBlockers()
5019+
{
5020+
SigtranCommercialEvidenceRetainedFileManifest verifiedManifest = CreateDefaultCommercialEvidenceRetainedFileManifest();
5021+
SigtranCommercialEvidencePromotionHandoff handoff = verifiedManifest.Handoff;
5022+
SigtranCommercialEvidenceFileVerificationReport verifiedReport = SigtranCommercialEvidenceFileVerificationReports.Evaluate(verifiedManifest);
5023+
5024+
SigtranCommercialEvidenceRetainedFile[] mismatchFiles = verifiedManifest.Files.ToArray();
5025+
SigtranCommercialEvidencePromotionHandoffItem firstItem = handoff.Items[0];
5026+
mismatchFiles[0] = new(
5027+
firstItem.Kind,
5028+
firstItem.RetainedPath,
5029+
firstItem.Sha256,
5030+
new string('c', 64),
5031+
sizeBytes: 4096,
5032+
DateTimeOffset.UtcNow,
5033+
exists: true);
5034+
SigtranCommercialEvidenceFileVerificationReport mismatchReport = SigtranCommercialEvidenceFileVerificationReports.Evaluate(new(handoff, mismatchFiles));
5035+
5036+
Assert(verifiedReport.IsVerified, verifiedReport.Describe());
5037+
AssertEqual(0, verifiedReport.Blockers.Count, "verified retained file report blocker count");
5038+
Assert(!mismatchReport.IsVerified, "digest mismatch should block retained file report verification");
5039+
AssertEqual(1, mismatchReport.DigestMismatchCount, "retained file digest mismatch count");
5040+
Assert(mismatchReport.Blockers.Contains("retained-file-digest-mismatch"), "retained file report should expose digest mismatch blocker");
5041+
}
5042+
50175043
static SigtranCommercialEvidenceRetainedFileManifest CreateDefaultCommercialEvidenceRetainedFileManifest()
50185044
{
50195045
return SigtranCommercialEvidenceRetainedFiles.CreateVerifiedManifest(

src/Sigtran.NET/Core/Utilities/SigtranCommercialEvidenceRetainedFiles.cs

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,114 @@ public string Describe()
136136
}
137137
}
138138

139+
/// <summary>
140+
/// Describes the retained commercial evidence file verification report.
141+
/// </summary>
142+
public sealed class SigtranCommercialEvidenceFileVerificationReport
143+
{
144+
/// <summary>Creates a retained commercial evidence file verification report.</summary>
145+
/// <param name="manifest">The retained file manifest under verification.</param>
146+
/// <param name="blockers">The verification blockers discovered from the manifest.</param>
147+
public SigtranCommercialEvidenceFileVerificationReport(
148+
SigtranCommercialEvidenceRetainedFileManifest manifest,
149+
IReadOnlyList<string> blockers)
150+
{
151+
Manifest = manifest ?? throw new ArgumentNullException(nameof(manifest));
152+
ArgumentNullException.ThrowIfNull(blockers);
153+
Blockers = blockers.ToArray();
154+
}
155+
156+
/// <summary>The retained file manifest under verification.</summary>
157+
public SigtranCommercialEvidenceRetainedFileManifest Manifest { get; }
158+
159+
/// <summary>The verification blockers discovered from the manifest.</summary>
160+
public IReadOnlyList<string> Blockers { get; }
161+
162+
/// <summary>The number of observed files that do not exist.</summary>
163+
public int MissingFileCount => Manifest.Files.Count(static file => !file.Exists);
164+
165+
/// <summary>The number of observed files that exist but are empty.</summary>
166+
public int EmptyFileCount => Manifest.Files.Count(static file => file.Exists && !file.HasContent);
167+
168+
/// <summary>The number of observed files with invalid SHA-256 values.</summary>
169+
public int InvalidDigestCount => Manifest.Files.Count(static file => !file.HasValidDigestValues);
170+
171+
/// <summary>The number of observed files whose valid digest does not match the expected digest.</summary>
172+
public int DigestMismatchCount => Manifest.Files.Count(static file => file.HasValidDigestValues && !file.DigestMatches);
173+
174+
/// <summary>The number of observed files whose observation time is not normalized to UTC.</summary>
175+
public int NonUtcObservationCount => Manifest.Files.Count(static file => !file.HasUtcObservationTime);
176+
177+
/// <summary>Whether the retained file verification report is complete and unblocked.</summary>
178+
public bool IsVerified => Manifest.IsReady
179+
&& Blockers.Count == 0;
180+
181+
/// <summary>Formats a compact retained file verification summary.</summary>
182+
/// <returns>The retained file verification summary.</returns>
183+
public string Describe()
184+
{
185+
return $"commercialEvidenceFilesVerified={IsVerified} blockers={Blockers.Count} files={Manifest.Files.Count}";
186+
}
187+
}
188+
189+
/// <summary>
190+
/// Provides commercial evidence file verification report helpers.
191+
/// </summary>
192+
public static class SigtranCommercialEvidenceFileVerificationReports
193+
{
194+
/// <summary>Evaluates a retained file manifest and returns a verification report.</summary>
195+
/// <param name="manifest">The retained file manifest to evaluate.</param>
196+
/// <returns>The retained file verification report.</returns>
197+
public static SigtranCommercialEvidenceFileVerificationReport Evaluate(SigtranCommercialEvidenceRetainedFileManifest manifest)
198+
{
199+
ArgumentNullException.ThrowIfNull(manifest);
200+
201+
List<string> blockers = [];
202+
203+
if (!manifest.Handoff.IsReady)
204+
{
205+
blockers.Add("promotion-handoff-not-ready");
206+
}
207+
208+
if (!manifest.CoversRequiredHandoffItems)
209+
{
210+
blockers.Add("retained-file-manifest-incomplete");
211+
}
212+
213+
if (!manifest.UsesUniqueRetainedPaths)
214+
{
215+
blockers.Add("retained-file-path-duplicate");
216+
}
217+
218+
if (manifest.Files.Any(static file => !file.Exists))
219+
{
220+
blockers.Add("retained-file-missing");
221+
}
222+
223+
if (manifest.Files.Any(static file => file.Exists && !file.HasContent))
224+
{
225+
blockers.Add("retained-file-empty");
226+
}
227+
228+
if (manifest.Files.Any(static file => !file.HasValidDigestValues))
229+
{
230+
blockers.Add("retained-file-digest-invalid");
231+
}
232+
233+
if (manifest.Files.Any(static file => file.HasValidDigestValues && !file.DigestMatches))
234+
{
235+
blockers.Add("retained-file-digest-mismatch");
236+
}
237+
238+
if (manifest.Files.Any(static file => !file.HasUtcObservationTime))
239+
{
240+
blockers.Add("retained-file-observation-not-utc");
241+
}
242+
243+
return new(manifest, blockers);
244+
}
245+
}
246+
139247
/// <summary>
140248
/// Provides commercial evidence retained file helpers.
141249
/// </summary>

0 commit comments

Comments
 (0)