Skip application for sections without approved edits

This commit is contained in:
2026-11-10 20:50:50 +00:00
parent c86f4fa416
commit 791deca3cd
3 changed files with 22 additions and 4 deletions

View File

@@ -707,6 +707,8 @@ decisions, and output order without rescanning decisions for each candidate.
## R20 — P3: Skip Apply-Time Copies for Sections With No Approved Edits
**Status:** Completed. Sections without approved proposals retain their existing segments. The runner still records every work unit, and sections with approved changes use the existing ordered application and protection checks. No-edit coverage verifies transcript and work-unit results.
**Category**
Avoidable transcript copying during Stage 12 application.

View File

@@ -254,6 +254,12 @@ func transcriptFromSections(sections []chunking.Section) *schema.Transcript {
// applyWithinSections leaves section membership and initial metadata unchanged.
// Approved proposals are applied only to their identified section.
func applyWithinSections(sections []chunking.Section, approved []proposals.EnrichedCorrectionProposal, policy proposals.ReplacementPolicy, vocabulary validators.ProtectedVocabulary, allowRepetitionCleanup bool) ([]chunking.Section, []proposals.AppliedChange, []proposals.SkippedChange, []int, error) {
applied := make([]proposals.AppliedChange, 0)
skipped := make([]proposals.SkippedChange, 0)
appliedBySection := make([]int, len(sections))
if len(approved) == 0 {
return sections, applied, skipped, appliedBySection, nil
}
bySection := make(map[int][]proposals.EnrichedCorrectionProposal, len(sections))
known := make(map[int]struct{}, len(sections))
for _, section := range sections {
@@ -270,11 +276,12 @@ func applyWithinSections(sections []chunking.Section, approved []proposals.Enric
}
updated := make([]chunking.Section, len(sections))
copy(updated, sections)
applied := make([]proposals.AppliedChange, 0)
skipped := make([]proposals.SkippedChange, 0)
appliedBySection := make([]int, len(sections))
for i, section := range sections {
result := proposals.ApplyProposals(transcriptFromSection(section), bySection[section.Index], policy, func(before, after string) bool { return vocabulary.AllowsChange(before, after, allowRepetitionCleanup) })
candidates := bySection[section.Index]
if len(candidates) == 0 {
continue
}
result := proposals.ApplyProposals(transcriptFromSection(section), candidates, policy, func(before, after string) bool { return vocabulary.AllowsChange(before, after, allowRepetitionCleanup) })
updated[i].Segments = result.Transcript.Segments
applied = append(applied, result.Applied...)
skipped = append(skipped, result.Skipped...)

View File

@@ -5,6 +5,7 @@ import (
"errors"
"os"
"path/filepath"
"reflect"
"strconv"
"strings"
"sync"
@@ -396,6 +397,14 @@ func TestRunnerProposalsExecutePerChunkSection(t *testing.T) {
if len(out.ModuleResults) != 1 {
t.Fatalf("expected one module result, got %+v", out.ModuleResults)
}
if !reflect.DeepEqual(out.FinalTranscript, transcript) || len(out.WorkUnits) != 3 {
t.Fatalf("no-edit run changed the transcript or inventory: %+v", out)
}
for _, unit := range out.WorkUnits {
if unit.State != outcomes.WorkCompleted || unit.CorrectionsApplied != 0 {
t.Fatalf("no-edit section was not completed: %+v", unit)
}
}
if len(seenBySection) != 3 {
t.Fatalf("expected 3 chunked proposal calls, got %d", len(seenBySection))
}