Skip to content

Commit 09561ba

Browse files
joejstuartclaude
andcommitted
fix: use effectiveTime instead of time.Now() in computeSuccesses
Success filtering was using time.Now() instead of the evaluator's effective time, causing inconsistent behavior for backdated runs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 14ba351 commit 09561ba

4 files changed

Lines changed: 12 additions & 8 deletions

File tree

internal/evaluator/base_evaluator.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ func (b *basePolicyEvaluator) postProcessResults(ctx context.Context, runResults
318318
result.Exceptions = exceptions
319319
result.Skipped = skipped
320320

321-
result.Successes = b.computeSuccesses(result, b.rules, target.Target, target.ComponentName, missingIncludes, unifiedFilter)
321+
result.Successes = b.computeSuccesses(result, b.rules, target.Target, target.ComponentName, missingIncludes, unifiedFilter, effectiveTime)
322322

323323
totalRules += len(result.Warnings) + len(result.Failures) + len(result.Successes)
324324
results = append(results, result)
@@ -351,6 +351,7 @@ func (b *basePolicyEvaluator) computeSuccesses(
351351
componentName string,
352352
missingIncludes map[string]bool,
353353
unifiedFilter PostEvaluationFilter,
354+
effectiveTime time.Time,
354355
) []Result {
355356
seenRules := map[string]bool{}
356357
for _, outcomes := range [][]Result{result.Failures, result.Warnings, result.Skipped, result.Exceptions} {
@@ -395,7 +396,7 @@ func (b *basePolicyEvaluator) computeSuccesses(
395396

396397
if unifiedFilter != nil {
397398
filteredResults, _ := unifiedFilter.FilterResults(
398-
[]Result{success}, rules, imageRef, componentName, missingIncludes, time.Now())
399+
[]Result{success}, rules, imageRef, componentName, missingIncludes, effectiveTime)
399400
if len(filteredResults) == 0 {
400401
log.Debugf("Skipping result success: %#v", success)
401402
continue

internal/evaluator/conftest_evaluator.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ func (c conftestEvaluator) Evaluate(ctx context.Context, target EvaluationTarget
661661
result.Skipped = skipped
662662

663663
// Replace the placeholder successes slice with the actual successes.
664-
result.Successes = c.computeSuccesses(result, rules, target.Target, target.ComponentName, missingIncludes, unifiedFilter)
664+
result.Successes = c.computeSuccesses(result, rules, target.Target, target.ComponentName, missingIncludes, unifiedFilter, effectiveTime)
665665

666666
totalRules += len(result.Warnings) + len(result.Failures) + len(result.Successes)
667667

@@ -802,6 +802,7 @@ func (c conftestEvaluator) computeSuccesses(
802802
componentName string,
803803
missingIncludes map[string]bool,
804804
unifiedFilter PostEvaluationFilter,
805+
effectiveTime time.Time,
805806
) []Result {
806807
// what rules, by code, have we seen in the Conftest results, use map to
807808
// take advantage of hashing for quicker lookup
@@ -858,7 +859,7 @@ func (c conftestEvaluator) computeSuccesses(
858859
if unifiedFilter != nil {
859860
// Use the unified filter to check if this success should be included
860861
filteredResults, _ := unifiedFilter.FilterResults(
861-
[]Result{success}, rules, imageRef, componentName, missingIncludes, time.Now())
862+
[]Result{success}, rules, imageRef, componentName, missingIncludes, effectiveTime)
862863

863864
if len(filteredResults) == 0 {
864865
log.Debugf("Skipping result success: %#v", success)

internal/evaluator/conftest_evaluator_unit_filtering_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ package evaluator
2828

2929
import (
3030
"testing"
31+
"time"
3132

3233
ecc "github.com/conforma/crds/api/v1alpha1"
3334
"github.com/stretchr/testify/assert"
@@ -532,6 +533,7 @@ func TestComputeSuccessesLegacyFallback(t *testing.T) {
532533
tt.componentName,
533534
tt.missingIncludes,
534535
nil, // nil unifiedFilter triggers the legacy fallback path
536+
time.Now(),
535537
)
536538

537539
assert.Equal(t, tt.expectedCount, len(successes), "unexpected number of successes")

internal/evaluator/opa_evaluator_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,7 @@ func TestBasePolicyEvaluatorComputeSuccesses(t *testing.T) {
756756
},
757757
}
758758

759-
successes := b.computeSuccesses(result, rules, "", "", map[string]bool{}, nil)
759+
successes := b.computeSuccesses(result, rules, "", "", map[string]bool{}, nil, time.Now())
760760
assert.Len(t, successes, 1)
761761
assert.Equal(t, "Pass", successes[0].Message)
762762
assert.Equal(t, "test.ns.rule2", successes[0].Metadata[metadataCode])
@@ -776,7 +776,7 @@ func TestBasePolicyEvaluatorComputeSuccesses(t *testing.T) {
776776
},
777777
}
778778

779-
successes := b.computeSuccesses(result, rules, "", "", map[string]bool{}, nil)
779+
successes := b.computeSuccesses(result, rules, "", "", map[string]bool{}, nil, time.Now())
780780
assert.Empty(t, successes)
781781
})
782782

@@ -788,7 +788,7 @@ func TestBasePolicyEvaluatorComputeSuccesses(t *testing.T) {
788788

789789
result := Outcome{Namespace: "test.ns"}
790790

791-
successes := b.computeSuccesses(result, rules, "", "", map[string]bool{}, nil)
791+
successes := b.computeSuccesses(result, rules, "", "", map[string]bool{}, nil, time.Now())
792792
assert.Len(t, successes, 2)
793793
})
794794

@@ -812,7 +812,7 @@ func TestBasePolicyEvaluatorComputeSuccesses(t *testing.T) {
812812
}
813813
result := Outcome{Namespace: "test.ns"}
814814

815-
successes := b.computeSuccesses(result, extendedRules, "", "", map[string]bool{}, nil)
815+
successes := b.computeSuccesses(result, extendedRules, "", "", map[string]bool{}, nil, time.Now())
816816
require.Len(t, successes, 1)
817817
assert.Equal(t, "Full Rule", successes[0].Metadata[metadataTitle])
818818
assert.Equal(t, "A complete rule", successes[0].Metadata[metadataDescription])

0 commit comments

Comments
 (0)