Classify source relatedness as data-quality advisories

This commit is contained in:
2026-08-27 15:49:53 +00:00
parent 1f1967c8d2
commit ccba2ce3f9
25 changed files with 232 additions and 189 deletions

View File

@@ -8,6 +8,7 @@ import (
"strings"
"gitea.maximumdirect.net/eric/notarius/internal/framework/contracts"
frameworkdiagnostics "gitea.maximumdirect.net/eric/notarius/internal/framework/diagnostics"
)
const (
@@ -17,6 +18,25 @@ const (
MaxMessageBytes = 4096
)
// DataQualityResult converts accepted source-quality findings into bounded,
// locally grouped advisories. These findings do not indicate process
// degradation.
func DataQualityResult(findings []contracts.Warning) (contracts.ValidationResult, error) {
collector := frameworkdiagnostics.NewCollector()
for _, finding := range findings {
if err := collector.Add(contracts.ProducerDiagnostic{
Disposition: contracts.DiagnosticDispositionAdvisory,
Category: contracts.DiagnosticCategoryDataQuality,
ReasonCode: finding.ReasonCode,
OccurrenceCount: 1,
Samples: []contracts.DiagnosticSample{{Scope: finding.Scope, Message: finding.Message}},
}); err != nil {
return contracts.ValidationResult{}, fmt.Errorf("collect data-quality diagnostic: %w", err)
}
}
return contracts.ValidationResult{Approved: true, Diagnostics: collector.Diagnostics()}, nil
}
func Truncate(value string) string {
runes := []rune(value)
if len(runes) <= MaxDisplayedRunes {

View File

@@ -51,3 +51,21 @@ func TestLimitWarningsBoundsOutputAndReportsOmissions(t *testing.T) {
t.Fatal("LimitWarnings() mutated its input")
}
}
func TestDataQualityResultGroupsFindingsWithoutWarnings(t *testing.T) {
result, err := DataQualityResult([]contracts.Warning{
{Scope: "records[0]", ReasonCode: "not_near_source", Message: "first"},
{Scope: "records[0]", ReasonCode: "not_near_source", Message: "first"},
{Scope: "records[1]", ReasonCode: "not_near_source", Message: "second"},
})
if err != nil {
t.Fatal(err)
}
if !result.Approved || len(result.Warnings) != 0 || len(result.Diagnostics) != 1 {
t.Fatalf("result = %#v", result)
}
diagnostic := result.Diagnostics[0]
if diagnostic.Disposition != contracts.DiagnosticDispositionAdvisory || diagnostic.Category != contracts.DiagnosticCategoryDataQuality || diagnostic.OccurrenceCount != 3 || diagnostic.OmittedSampleCount != 1 || len(diagnostic.Samples) != 2 {
t.Fatalf("diagnostic = %#v", diagnostic)
}
}