Skip to content

Commit 9b51e26

Browse files
committed
Add commercial evidence dossier intake report
1 parent 3294388 commit 9b51e26

7 files changed

Lines changed: 121 additions & 4 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, 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 |
76+
| Commercial evidence artifact intake | Phase 38 in progress: artifact intake target identity, artifact source registration, SHA-256 digest coverage, redaction review, completeness evaluation, and dossier reporting 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, and a retained Markdown summary to a governed execution run; promotion handoff, execution bridge, status reporting, and final validation remain |
7777

7878
## Requirements
7979

docs/PHASE38_COMMERCIAL_EVIDENCE_ARTIFACT_INTAKE.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,19 @@ Each required review records the retained path, artifact kind, reviewer identity
6161

6262
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.
6363

64+
## Unit 6 - Dossier Intake Report
65+
66+
`SigtranCommercialEvidenceDossierIntakeReports` creates a retained Markdown report for the intake:
67+
68+
- Execution run identifier.
69+
- Intake identifier.
70+
- Reviewer identity.
71+
- Dossier root.
72+
- Source, digest, and redaction review counts.
73+
- Completion state and blocker count.
74+
75+
The report path must be under the intake dossier root. This gives release operators a single retained summary before promotion handoff.
76+
6477
## Validation
6578

6679
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
@@ -9,7 +9,8 @@ Phase 38 prepares the SDK to receive real execution artifacts and convert them i
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.
1111
- Artifact completeness evaluator that reports explicit source, digest, and redaction blockers.
12+
- Dossier intake report that renders a retained Markdown summary for the execution run, intake id, reviewer, counts, completion state, and blockers.
1213

1314
## Readiness Position
1415

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.
16+
The phase is in progress. Artifact intake identity, source registration, digest coverage, redaction review, completeness evaluation, and dossier reporting are available. 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; completeness evaluation 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; dossier reporting 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 now reports explicit source, digest, and redaction blockers. 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 now renders a retained Markdown summary with run, intake, reviewer, counts, completion state, and blockers. 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: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@
292292
Run("SIGTRAN commercial evidence artifact digests cover retained sources", SigtranCommercialEvidenceArtifactDigestsCoverRetainedSources);
293293
Run("SIGTRAN commercial evidence redaction reviews approve trace-bearing artifacts", SigtranCommercialEvidenceRedactionReviewsApproveTraceBearingArtifacts);
294294
Run("SIGTRAN commercial evidence artifact completeness reports blockers", SigtranCommercialEvidenceArtifactCompletenessReportsBlockers);
295+
Run("SIGTRAN commercial evidence dossier intake report renders retained summary", SigtranCommercialEvidenceDossierIntakeReportRendersRetainedSummary);
295296
Run("SIGTRAN status capabilities use domain documentation labels", SigtranStatusCapabilitiesUseDomainDocumentationLabels);
296297
Run("Native SCTP platform probe reports socket creation capability", NativeSctpPlatformProbeReportsSocketCreationCapability);
297298
Run("Native SCTP socket factory creates or reports unsupported platform", NativeSctpSocketFactoryCreatesOrReportsUnsupportedPlatform);
@@ -4898,6 +4899,24 @@ static void SigtranCommercialEvidenceArtifactCompletenessReportsBlockers()
48984899
Assert(blocked.Blockers.Contains("redaction-review-incomplete"), "blocked completeness should report redaction review");
48994900
}
49004901

4902+
static void SigtranCommercialEvidenceDossierIntakeReportRendersRetainedSummary()
4903+
{
4904+
SigtranCommercialEvidenceArtifactCompletenessResult completeness = CreateDefaultCommercialEvidenceArtifactCompletenessResult();
4905+
SigtranCommercialEvidenceDossierIntakeReport report = SigtranCommercialEvidenceDossierIntakeReports.CreateDefault(completeness);
4906+
string markdown = report.RenderMarkdown();
4907+
4908+
Assert(report.IsReady, markdown);
4909+
Assert(report.UsesDossierReportPath, "dossier intake report should be retained under dossier root");
4910+
Assert(markdown.Contains("run-20260622-001", StringComparison.Ordinal), "dossier intake report should include run id");
4911+
Assert(markdown.Contains("intake-20260622-001", StringComparison.Ordinal), "dossier intake report should include intake id");
4912+
Assert(markdown.Contains("Complete: `True`", StringComparison.Ordinal), "dossier intake report should include completion state");
4913+
}
4914+
4915+
static SigtranCommercialEvidenceArtifactCompletenessResult CreateDefaultCommercialEvidenceArtifactCompletenessResult()
4916+
{
4917+
return SigtranCommercialEvidenceArtifactCompleteness.Evaluate(CreateDefaultCommercialEvidenceRedactionReviewManifest());
4918+
}
4919+
49014920
static SigtranCommercialEvidenceRedactionReviewManifest CreateDefaultCommercialEvidenceRedactionReviewManifest()
49024921
{
49034922
return SigtranCommercialEvidenceRedactionReviews.CreateApproved(
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
namespace Sigtran.NET.Core.Utilities;
2+
3+
/// <summary>
4+
/// Describes the commercial evidence dossier intake report.
5+
/// </summary>
6+
public sealed class SigtranCommercialEvidenceDossierIntakeReport
7+
{
8+
/// <summary>Creates a commercial evidence dossier intake report.</summary>
9+
/// <param name="completeness">The artifact completeness result.</param>
10+
/// <param name="reportPath">The retained report path.</param>
11+
public SigtranCommercialEvidenceDossierIntakeReport(
12+
SigtranCommercialEvidenceArtifactCompletenessResult completeness,
13+
string reportPath)
14+
{
15+
Completeness = completeness ?? throw new ArgumentNullException(nameof(completeness));
16+
ReportPath = string.IsNullOrWhiteSpace(reportPath) ? throw new ArgumentException("Report path is required.", nameof(reportPath)) : reportPath;
17+
}
18+
19+
/// <summary>The artifact completeness result.</summary>
20+
public SigtranCommercialEvidenceArtifactCompletenessResult Completeness { get; }
21+
22+
/// <summary>The retained report path.</summary>
23+
public string ReportPath { get; }
24+
25+
/// <summary>The artifact intake target.</summary>
26+
public SigtranCommercialEvidenceArtifactIntakeTarget Target => Completeness.RedactionReviewManifest.DigestManifest.SourceManifest.Target;
27+
28+
/// <summary>The number of registered artifact sources.</summary>
29+
public int SourceCount => Completeness.RedactionReviewManifest.DigestManifest.SourceManifest.Sources.Count;
30+
31+
/// <summary>The number of digest entries.</summary>
32+
public int DigestCount => Completeness.RedactionReviewManifest.DigestManifest.Digests.Count;
33+
34+
/// <summary>The number of redaction reviews.</summary>
35+
public int RedactionReviewCount => Completeness.RedactionReviewManifest.Reviews.Count;
36+
37+
/// <summary>Whether the report path is scoped under the dossier root.</summary>
38+
public bool UsesDossierReportPath => ReportPath.StartsWith(Target.DossierRoot + "/", StringComparison.Ordinal);
39+
40+
/// <summary>Whether the report is ready for retention.</summary>
41+
public bool IsReady => Completeness.IsComplete
42+
&& UsesDossierReportPath
43+
&& SourceCount > 0
44+
&& DigestCount == SourceCount;
45+
46+
/// <summary>Renders the report as Markdown.</summary>
47+
/// <returns>The rendered Markdown report.</returns>
48+
public string RenderMarkdown()
49+
{
50+
return string.Join(
51+
Environment.NewLine,
52+
[
53+
"# Commercial Evidence Dossier Intake Report",
54+
string.Empty,
55+
$"Run: `{Target.ExecutionRun.RunId}`",
56+
$"Intake: `{Target.IntakeId}`",
57+
$"Reviewer: `{Target.ReviewerName}`",
58+
$"Dossier root: `{Target.DossierRoot}`",
59+
$"Sources: `{SourceCount}`",
60+
$"Digests: `{DigestCount}`",
61+
$"Redaction reviews: `{RedactionReviewCount}`",
62+
$"Complete: `{Completeness.IsComplete}`",
63+
$"Blockers: `{Completeness.Blockers.Count}`"
64+
]);
65+
}
66+
}
67+
68+
/// <summary>
69+
/// Provides commercial evidence dossier intake report helpers.
70+
/// </summary>
71+
public static class SigtranCommercialEvidenceDossierIntakeReports
72+
{
73+
/// <summary>Creates the default retained dossier intake report.</summary>
74+
/// <param name="completeness">The artifact completeness result.</param>
75+
/// <returns>The dossier intake report.</returns>
76+
public static SigtranCommercialEvidenceDossierIntakeReport CreateDefault(
77+
SigtranCommercialEvidenceArtifactCompletenessResult completeness)
78+
{
79+
ArgumentNullException.ThrowIfNull(completeness);
80+
SigtranCommercialEvidenceArtifactIntakeTarget target = completeness.RedactionReviewManifest.DigestManifest.SourceManifest.Target;
81+
82+
return new(completeness, $"{target.DossierRoot}/intake-report.md");
83+
}
84+
}

0 commit comments

Comments
 (0)