Preserve proposal outcomes and classify filtered proposals

This commit is contained in:
2026-09-24 17:09:35 +00:00
parent 51169ff9e9
commit 42bde59827
8 changed files with 144 additions and 54 deletions

View File

@@ -0,0 +1,21 @@
package validators
import (
"gitea.maximumdirect.net/eric/audita/internal/framework/outcomes"
"gitea.maximumdirect.net/eric/audita/internal/framework/proposals"
)
// DefectiveProposalReason recognizes a safely rejected defect in a proposal
// response. Editorial disagreement and later apply-time conflicts are excluded.
func DefectiveProposalReason(reason string) (outcomes.ReasonCode, bool) {
switch reason {
case ReasonInvalidTargetSegment, ReasonMissingTargetSegment,
ReasonEmptyOriginalText, ReasonMissingOriginalText,
ReasonInvalidConfidence, ReasonNoEffect, ReasonEmptyResultingText,
string(proposals.SkipReasonAmbiguousOriginal),
string(proposals.SkipReasonInvalidProposal):
return outcomes.ReasonCode(reason), true
default:
return "", false
}
}

View File

@@ -0,0 +1,20 @@
package validators
import "testing"
func TestDefectiveProposalReasonSeparatesFilteringFromEditorialRejection(t *testing.T) {
for _, reason := range []string{
ReasonInvalidTargetSegment, ReasonMissingTargetSegment, ReasonEmptyOriginalText,
ReasonMissingOriginalText, ReasonInvalidConfidence, ReasonNoEffect,
ReasonEmptyResultingText, "ambiguous_original_text",
} {
if got, ok := DefectiveProposalReason(reason); !ok || string(got) != reason {
t.Fatalf("defective proposal %q classified as %q, %t", reason, got, ok)
}
}
for _, reason := range []string{ReasonLowConfidence, ReasonProtectedGlossaryTerm, "editorial_rejection", ReasonValidatorInputTooLarge} {
if got, ok := DefectiveProposalReason(reason); ok {
t.Fatalf("ordinary rejection %q classified as %q", reason, got)
}
}
}

View File

@@ -113,11 +113,11 @@ func EnforceDecisionCardinality(candidate []proposals.EnrichedCorrectionProposal
}
func approval(index int) Decision {
return Decision{ProposalIndex: index, Approved: true, ReasonCode: ReasonApproved, Message: "approved"}
return Decision{ProposalIndex: index, Approved: true, Disposition: DispositionApproved, ReasonCode: ReasonApproved, Message: "approved"}
}
func rejection(index int, reasonCode string, msg string) Decision {
return Decision{ProposalIndex: index, Approved: false, ReasonCode: reasonCode, Message: strings.TrimSpace(msg)}
return Decision{ProposalIndex: index, Approved: false, Disposition: DispositionRejected, ReasonCode: reasonCode, Message: strings.TrimSpace(msg)}
}
func confidenceThresholdForModule(moduleKey string, cfg *config.Config) float64 {