Fix deletion conflict accounting coverage

This commit is contained in:
2026-09-25 03:06:57 +00:00
parent 5e2e863fbd
commit d2a6fcfd41
2 changed files with 33 additions and 8 deletions

View File

@@ -876,12 +876,18 @@ func TestRunnerApplicationSkipAfterValidatorApprovalReported(t *testing.T) {
func TestRunnerApplyConflictAfterTwoInitiallyValidDeletions(t *testing.T) {
transcript := &schema.Transcript{Segments: []schema.Segment{{ID: 1, Text: "a b"}}}
r := New(fakeFactory{modules: map[string]contracts.TranscriptModule{
"m": fakeModule{key: "m", policy: proposals.ReplacementPolicyRequireUnique, validators: []contracts.Validator{validators.ProposalShapeValidator{}, validators.NonEmptyResultingSegmentValidator{}}, proposeF: func(req contracts.ProposalRequest) ([]proposals.CorrectionProposal, error) {
return []proposals.CorrectionProposal{
{TargetSegmentID: 1, OriginalText: "a", CorrectedText: "", Confidence: 1},
{TargetSegmentID: 1, OriginalText: "b", CorrectedText: "", Confidence: 1},
}, nil
}},
"m": outcomeModule{
fakeModule: fakeModule{key: "m", policy: proposals.ReplacementPolicyRequireUnique, validators: []contracts.Validator{validators.ProposalShapeValidator{}, validators.NonEmptyResultingSegmentValidator{}}},
proposeResult: func(req contracts.ProposalRequest) (contracts.ProposalResult, error) {
return contracts.ProposalResult{
Proposals: []proposals.CorrectionProposal{
{TargetSegmentID: 1, OriginalText: "a", CorrectedText: "", Confidence: 1},
{TargetSegmentID: 1, OriginalText: "b", CorrectedText: "", Confidence: 1},
},
Operations: []outcomes.Operation{{Reference: outcomes.Reference{Kind: outcomes.OperationProposal}, Succeeded: true}},
}, nil
},
},
}})
out, err := r.Run(context.Background(), RunInput{Transcript: transcript, ModuleSpecs: []contracts.ModuleRunSpec{{ModuleKey: "m", InstanceName: "m"}}, CaptureCandidates: true})
if err != nil {
@@ -896,11 +902,18 @@ func TestRunnerApplyConflictAfterTwoInitiallyValidDeletions(t *testing.T) {
if len(out.ModuleResults[0].ValidatorRejected) != 0 || len(out.WorkUnits) != 1 || out.WorkUnits[0].CorrectionsApplied != 1 {
t.Fatalf("unexpected validation or application outcome: %+v", out)
}
foundProposal := false
for _, operation := range out.WorkUnits[0].Operations {
if operation.FailureReason != "" || len(operation.RecoveryReasons) != 0 {
if operation.Reference.Kind == outcomes.OperationProposal && operation.Succeeded {
foundProposal = true
}
if operation.FailureReason != "" || len(operation.RecoveryReasons) != 0 || len(operation.Filtered) != 0 {
t.Fatalf("apply-time conflict must not count as model error or filtering recovery: %+v", operation)
}
}
if !foundProposal {
t.Fatalf("expected successful proposal operation: %+v", out.WorkUnits[0].Operations)
}
}
func ptrConfig(c config.Config) *config.Config { return &c }