AiResultCache.java

1
package org.egothor.methodatlas;
2
3
import java.io.IOException;
4
import java.nio.file.Path;
5
import java.util.ArrayList;
6
import java.util.HashMap;
7
import java.util.List;
8
import java.util.Map;
9
import java.util.Optional;
10
11
import org.egothor.methodatlas.ai.AiClassSuggestion;
12
import org.egothor.methodatlas.ai.AiMethodSuggestion;
13
import org.egothor.methodatlas.ai.CredentialTriageVerdict;
14
import org.egothor.methodatlas.api.ScanRecord;
15
import org.egothor.methodatlas.emit.DeltaReport;
16
17
/**
18
 * In-memory cache of AI results loaded from a previous MethodAtlas run, keyed by
19
 * the per-class {@code content_hash} fingerprint.
20
 *
21
 * <p>
22
 * Each entry ({@link AiCacheEntry}) holds the complete AI answer for one class —
23
 * method classifications <em>and</em> any credential-triage verdicts — plus the
24
 * prompt-catalogue signature that produced it. This lets one cached answer serve a
25
 * later classification-only run, a later credential run, or a combined run without
26
 * re-querying the model, provided the prompt signature still matches. An answer
27
 * obtained under a different prompt catalogue is never reused.
28
 * </p>
29
 *
30
 * <p>
31
 * Two source formats are accepted by {@link #load(Path)}: the unified JSON-Lines
32
 * cache (the format MethodAtlas now writes) and the legacy per-method scan CSV
33
 * (produced by older {@code -content-hash} runs). Legacy entries carry no prompt
34
 * signature and no credential verdicts: their classifications may still be reused
35
 * by content hash, but they can never satisfy a credential query.
36
 * </p>
37
 *
38
 * <p>
39
 * Instances are obtained via {@link #load(Path)} or the no-op {@link #empty()}.
40
 * Not thread-safe for the hit/miss counters; the scan loop is single-threaded.
41
 * </p>
42
 *
43
 * @see AiCacheStore
44
 * @see MethodAtlasApp
45
 */
46
public final class AiResultCache {
47
48
    private final Map<String, AiCacheEntry> byHash;
49
    private int hits;
50
    private int misses;
51
52
    private AiResultCache(Map<String, AiCacheEntry> byHash) {
53
        this.byHash = byHash;
54
    }
55
56
    /** Returns an empty cache that always produces misses. */
57
    public static AiResultCache empty() {
58 1 1. empty : replaced return value with null for org/egothor/methodatlas/AiResultCache::empty → KILLED
        return new AiResultCache(Map.of());
59
    }
60
61
    /**
62
     * Loads a cache from a unified JSON-Lines cache file or a legacy scan CSV,
63
     * auto-detected from the file's first non-blank character.
64
     *
65
     * @param path path to a unified cache file or a legacy MethodAtlas CSV
66
     * @return loaded cache; never {@code null}
67
     * @throws IOException if the file cannot be read
68
     */
69
    public static AiResultCache load(Path path) throws IOException {
70
        Map<String, AiCacheEntry> byHash = new HashMap<>();
71 2 1. load : removed conditional - replaced equality check with false → KILLED
2. load : removed conditional - replaced equality check with true → KILLED
        if (AiCacheStore.looksLikeJsonLines(path)) {
72
            for (AiCacheEntry entry : AiCacheStore.read(path)) {
73 4 1. load : removed conditional - replaced equality check with true → SURVIVED
2. load : removed conditional - replaced equality check with true → SURVIVED
3. load : removed conditional - replaced equality check with false → KILLED
4. load : removed conditional - replaced equality check with false → KILLED
                if (entry.contentHash() != null && !entry.contentHash().isEmpty()
74 2 1. load : removed conditional - replaced equality check with true → SURVIVED
2. load : removed conditional - replaced equality check with false → KILLED
                        && entry.suggestion() != null) {
75
                    byHash.put(entry.contentHash(), entry);
76
                }
77
            }
78
        } else {
79 1 1. load : removed call to org/egothor/methodatlas/AiResultCache::loadLegacyCsv → KILLED
            loadLegacyCsv(path, byHash);
80
        }
81 1 1. load : replaced return value with null for org/egothor/methodatlas/AiResultCache::load → KILLED
        return new AiResultCache(byHash);
82
    }
83
84
    /**
85
     * Loads legacy entries from a per-method scan CSV. Only rows with a non-empty
86
     * {@code content_hash} and a non-{@code null} {@code ai_security_relevant}
87
     * column (AI was enabled) are included; the resulting entries carry no prompt
88
     * signature and no credential verdicts.
89
     *
90
     * @param csvPath legacy CSV path
91
     * @param byHash   map to populate, keyed by content hash
92
     * @throws IOException if the file cannot be read
93
     */
94
    @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops")
95
    private static void loadLegacyCsv(Path csvPath, Map<String, AiCacheEntry> byHash) throws IOException {
96
        List<ScanRecord> records = DeltaReport.loadRecords(csvPath);
97
98
        Map<String, List<ScanRecord>> grouped = new HashMap<>();
99
        for (ScanRecord r : records) {
100 6 1. loadLegacyCsv : removed conditional - replaced equality check with true → SURVIVED
2. loadLegacyCsv : removed conditional - replaced equality check with true → KILLED
3. loadLegacyCsv : removed conditional - replaced equality check with false → KILLED
4. loadLegacyCsv : removed conditional - replaced equality check with false → KILLED
5. loadLegacyCsv : removed conditional - replaced equality check with true → KILLED
6. loadLegacyCsv : removed conditional - replaced equality check with false → KILLED
            if (r.contentHash() != null && !r.contentHash().isEmpty() && r.aiSecurityRelevant() != null) {
101 1 1. lambda$loadLegacyCsv$0 : replaced return value with Collections.emptyList for org/egothor/methodatlas/AiResultCache::lambda$loadLegacyCsv$0 → KILLED
                grouped.computeIfAbsent(r.contentHash(), k -> new ArrayList<>()).add(r);
102
            }
103
        }
104
105
        for (Map.Entry<String, List<ScanRecord>> entry : grouped.entrySet()) {
106
            List<AiMethodSuggestion> methods = new ArrayList<>(entry.getValue().size());
107
            for (ScanRecord r : entry.getValue()) {
108
                methods.add(new AiMethodSuggestion(
109
                        r.method(),
110
                        Boolean.TRUE.equals(r.aiSecurityRelevant()),
111
                        r.aiDisplayName(),
112 2 1. loadLegacyCsv : removed conditional - replaced equality check with true → SURVIVED
2. loadLegacyCsv : removed conditional - replaced equality check with false → KILLED
                        r.aiTags() != null ? r.aiTags() : List.of(),
113
                        r.aiReason(),
114 2 1. loadLegacyCsv : removed conditional - replaced equality check with false → SURVIVED
2. loadLegacyCsv : removed conditional - replaced equality check with true → KILLED
                        r.aiConfidence() != null ? r.aiConfidence() : 0.0,
115 2 1. loadLegacyCsv : removed conditional - replaced equality check with true → SURVIVED
2. loadLegacyCsv : removed conditional - replaced equality check with false → KILLED
                        r.aiInteractionScore() != null ? r.aiInteractionScore() : 0.0));
116
            }
117
            AiClassSuggestion suggestion = new AiClassSuggestion(null, null, null, null, methods);
118
            byHash.put(entry.getKey(), new AiCacheEntry(entry.getKey(), null, suggestion));
119
        }
120
    }
121
122
    /**
123
     * Returns the cached AI answer for a class by content hash, ignoring the prompt
124
     * signature.
125
     *
126
     * @param contentHash SHA-256 fingerprint of the class source, or {@code null}
127
     * @return cached suggestion, or empty on a miss or {@code null} hash
128
     */
129
    public Optional<AiClassSuggestion> lookup(String contentHash) {
130 2 1. lookup : removed conditional - replaced equality check with false → SURVIVED
2. lookup : removed conditional - replaced equality check with true → KILLED
        if (contentHash == null) {
131 1 1. lookup : Replaced integer addition with subtraction → KILLED
            misses++;
132
            return Optional.empty();
133
        }
134
        AiCacheEntry entry = byHash.get(contentHash);
135 2 1. lookup : removed conditional - replaced equality check with true → KILLED
2. lookup : removed conditional - replaced equality check with false → KILLED
        if (entry != null) {
136 1 1. lookup : Replaced integer addition with subtraction → KILLED
            hits++;
137 1 1. lookup : replaced return value with Optional.empty for org/egothor/methodatlas/AiResultCache::lookup → KILLED
            return Optional.of(entry.suggestion());
138
        }
139 1 1. lookup : Replaced integer addition with subtraction → KILLED
        misses++;
140
        return Optional.empty();
141
    }
142
143
    /**
144
     * Returns the cached classification for a class when the content hash matches and
145
     * the cached answer is compatible with the current prompt catalogue.
146
     *
147
     * <p>
148
     * A unified entry must carry a matching {@code promptSignature}; a legacy entry
149
     * (no signature) is served by content hash alone, preserving prior behaviour.
150
     * Updates the hit/miss counters.
151
     * </p>
152
     *
153
     * @param contentHash     SHA-256 fingerprint of the class source, or {@code null}
154
     * @param promptSignature signature of the current run's prompt catalogue
155
     * @return cached classification, or empty on a miss
156
     */
157
    public Optional<AiClassSuggestion> classification(String contentHash, String promptSignature) {
158 2 1. classification : removed conditional - replaced equality check with true → KILLED
2. classification : removed conditional - replaced equality check with false → KILLED
        AiCacheEntry entry = contentHash == null ? null : byHash.get(contentHash);
159 4 1. classification : removed conditional - replaced equality check with false → KILLED
2. classification : removed conditional - replaced equality check with true → KILLED
3. classification : removed conditional - replaced equality check with false → KILLED
4. classification : removed conditional - replaced equality check with true → KILLED
        if (entry != null && (entry.promptSignature() == null
160 2 1. classification : removed conditional - replaced equality check with false → KILLED
2. classification : removed conditional - replaced equality check with true → KILLED
                || entry.promptSignature().equals(promptSignature))) {
161 1 1. classification : Replaced integer addition with subtraction → SURVIVED
            hits++;
162 1 1. classification : replaced return value with Optional.empty for org/egothor/methodatlas/AiResultCache::classification → KILLED
            return Optional.of(entry.suggestion());
163
        }
164 1 1. classification : Replaced integer addition with subtraction → SURVIVED
        misses++;
165
        return Optional.empty();
166
    }
167
168
    /**
169
     * Returns cached credential-triage verdicts for a class when the content hash and
170
     * the prompt signature both match and verdicts were actually recorded.
171
     *
172
     * <p>
173
     * Unlike {@link #classification(String, String)} this requires a non-{@code null}
174
     * matching signature (a legacy entry can never satisfy a credential query) and
175
     * does not touch the hit/miss counters.
176
     * </p>
177
     *
178
     * @param contentHash     SHA-256 fingerprint of the class source, or {@code null}
179
     * @param promptSignature signature of the current run's prompt catalogue
180
     * @return cached verdicts, or empty when none are cached for this signature
181
     */
182
    public Optional<List<CredentialTriageVerdict>> verdicts(String contentHash, String promptSignature) {
183 2 1. verdicts : removed conditional - replaced equality check with false → SURVIVED
2. verdicts : removed conditional - replaced equality check with true → KILLED
        AiCacheEntry entry = contentHash == null ? null : byHash.get(contentHash);
184 4 1. verdicts : removed conditional - replaced equality check with true → SURVIVED
2. verdicts : removed conditional - replaced equality check with false → KILLED
3. verdicts : removed conditional - replaced equality check with false → KILLED
4. verdicts : removed conditional - replaced equality check with true → KILLED
        if (entry != null && entry.promptSignature() != null
185 2 1. verdicts : removed conditional - replaced equality check with true → KILLED
2. verdicts : removed conditional - replaced equality check with false → KILLED
                && entry.promptSignature().equals(promptSignature)
186 2 1. verdicts : removed conditional - replaced equality check with false → KILLED
2. verdicts : removed conditional - replaced equality check with true → KILLED
                && entry.suggestion().secrets() != null) {
187 1 1. verdicts : replaced return value with Optional.empty for org/egothor/methodatlas/AiResultCache::verdicts → KILLED
            return Optional.of(entry.suggestion().secrets());
188
        }
189
        return Optional.empty();
190
    }
191
192
    /**
193
     * Returns {@code true} when this cache contains at least one entry.
194
     *
195
     * <p>When {@code false}, content hashes do not need to be computed for lookups
196
     * because all results would be misses regardless.</p>
197
     *
198
     * @return {@code true} when the cache is non-empty
199
     */
200
    public boolean isActive() {
201 3 1. isActive : replaced boolean return with true for org/egothor/methodatlas/AiResultCache::isActive → KILLED
2. isActive : removed conditional - replaced equality check with false → KILLED
3. isActive : removed conditional - replaced equality check with true → KILLED
        return !byHash.isEmpty();
202
    }
203
204
    /** Returns the number of successful cache lookups so far. */
205
    public int hits() {
206 1 1. hits : replaced int return with 0 for org/egothor/methodatlas/AiResultCache::hits → KILLED
        return hits;
207
    }
208
209
    /** Returns the number of unsuccessful cache lookups so far. */
210
    public int misses() {
211 1 1. misses : replaced int return with 0 for org/egothor/methodatlas/AiResultCache::misses → KILLED
        return misses;
212
    }
213
}

Mutations

58

1.1
Location : empty
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:empty_isNotActiveAndAlwaysMisses()]
replaced return value with null for org/egothor/methodatlas/AiResultCache::empty → KILLED

71

1.1
Location : load
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_roundTripsClassificationAndVerdicts(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

2.2
Location : load
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_multipleMethodsSameHash_groupedIntoOneSuggestion(java.nio.file.Path)]
removed conditional - replaced equality check with true → KILLED

73

1.1
Location : load
Killed by : none
removed conditional - replaced equality check with true → SURVIVED
Covering tests

2.2
Location : load
Killed by : none
removed conditional - replaced equality check with true → SURVIVED Covering tests

3.3
Location : load
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_roundTripsClassificationAndVerdicts(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

4.4
Location : load
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_roundTripsClassificationAndVerdicts(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

74

1.1
Location : load
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_roundTripsClassificationAndVerdicts(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

2.2
Location : load
Killed by : none
removed conditional - replaced equality check with true → SURVIVED
Covering tests

79

1.1
Location : load
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_multipleMethodsSameHash_groupedIntoOneSuggestion(java.nio.file.Path)]
removed call to org/egothor/methodatlas/AiResultCache::loadLegacyCsv → KILLED

81

1.1
Location : load
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_csvWithoutAiColumns_producesInactiveCache(java.nio.file.Path)]
replaced return value with null for org/egothor/methodatlas/AiResultCache::load → KILLED

100

1.1
Location : loadLegacyCsv
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_csvWithoutContentHashColumn_producesInactiveCache(java.nio.file.Path)]
removed conditional - replaced equality check with true → KILLED

2.2
Location : loadLegacyCsv
Killed by : none
removed conditional - replaced equality check with true → SURVIVED
Covering tests

3.3
Location : loadLegacyCsv
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_multipleMethodsSameHash_groupedIntoOneSuggestion(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

4.4
Location : loadLegacyCsv
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_multipleMethodsSameHash_groupedIntoOneSuggestion(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

5.5
Location : loadLegacyCsv
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_csvWithoutAiColumns_producesInactiveCache(java.nio.file.Path)]
removed conditional - replaced equality check with true → KILLED

6.6
Location : loadLegacyCsv
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_multipleMethodsSameHash_groupedIntoOneSuggestion(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

101

1.1
Location : lambda$loadLegacyCsv$0
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:lookup_nullHash_returnsMissAndIncrementsMisses(java.nio.file.Path)]
replaced return value with Collections.emptyList for org/egothor/methodatlas/AiResultCache::lambda$loadLegacyCsv$0 → KILLED

112

1.1
Location : loadLegacyCsv
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_methodSuggestionFieldsRestoredCorrectly(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

2.2
Location : loadLegacyCsv
Killed by : none
removed conditional - replaced equality check with true → SURVIVED
Covering tests

114

1.1
Location : loadLegacyCsv
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:lookup_nullHash_returnsMissAndIncrementsMisses(java.nio.file.Path)]
removed conditional - replaced equality check with true → KILLED

2.2
Location : loadLegacyCsv
Killed by : none
removed conditional - replaced equality check with false → SURVIVED
Covering tests

115

1.1
Location : loadLegacyCsv
Killed by : none
removed conditional - replaced equality check with true → SURVIVED
Covering tests

2.2
Location : loadLegacyCsv
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_methodSuggestionFieldsRestoredCorrectly(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

130

1.1
Location : lookup
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_multipleMethodsSameHash_groupedIntoOneSuggestion(java.nio.file.Path)]
removed conditional - replaced equality check with true → KILLED

2.2
Location : lookup
Killed by : none
removed conditional - replaced equality check with false → SURVIVED
Covering tests

131

1.1
Location : lookup
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:lookup_nullHash_returnsMissAndIncrementsMisses(java.nio.file.Path)]
Replaced integer addition with subtraction → KILLED

135

1.1
Location : lookup
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:empty_isNotActiveAndAlwaysMisses()]
removed conditional - replaced equality check with true → KILLED

2.2
Location : lookup
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_multipleMethodsSameHash_groupedIntoOneSuggestion(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

136

1.1
Location : lookup
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_csvWithContentHashAndAiColumns_hitOnMatchingHash(java.nio.file.Path)]
Replaced integer addition with subtraction → KILLED

137

1.1
Location : lookup
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_multipleMethodsSameHash_groupedIntoOneSuggestion(java.nio.file.Path)]
replaced return value with Optional.empty for org/egothor/methodatlas/AiResultCache::lookup → KILLED

139

1.1
Location : lookup
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:empty_isNotActiveAndAlwaysMisses()]
Replaced integer addition with subtraction → KILLED

158

1.1
Location : classification
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_roundTripsClassificationAndVerdicts(java.nio.file.Path)]
removed conditional - replaced equality check with true → KILLED

2.2
Location : classification
Killed by : org.egothor.methodatlas.MethodAtlasAppApplyTagsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.MethodAtlasAppApplyTagsTest]/[method:applyTags_noImportsAddedWhenNothingAnnotated(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

159

1.1
Location : classification
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_signatureMismatchMissesBoth(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

2.2
Location : classification
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:legacyCsvEntry_servesClassificationNotVerdicts(java.nio.file.Path)]
removed conditional - replaced equality check with true → KILLED

3.3
Location : classification
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_roundTripsClassificationAndVerdicts(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

4.4
Location : classification
Killed by : org.egothor.methodatlas.command.ScanOrchestratorCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.command.ScanOrchestratorCacheTest]/[method:cacheMiss_runsCombinedClassificationAndRecordsVerdicts(java.nio.file.Path)]
removed conditional - replaced equality check with true → KILLED

160

1.1
Location : classification
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_roundTripsClassificationAndVerdicts(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

2.2
Location : classification
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_signatureMismatchMissesBoth(java.nio.file.Path)]
removed conditional - replaced equality check with true → KILLED

161

1.1
Location : classification
Killed by : none
Replaced integer addition with subtraction → SURVIVED
Covering tests

162

1.1
Location : classification
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_roundTripsClassificationAndVerdicts(java.nio.file.Path)]
replaced return value with Optional.empty for org/egothor/methodatlas/AiResultCache::classification → KILLED

164

1.1
Location : classification
Killed by : none
Replaced integer addition with subtraction → SURVIVED
Covering tests

183

1.1
Location : verdicts
Killed by : none
removed conditional - replaced equality check with false → SURVIVED
Covering tests

2.2
Location : verdicts
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_roundTripsClassificationAndVerdicts(java.nio.file.Path)]
removed conditional - replaced equality check with true → KILLED

184

1.1
Location : verdicts
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_roundTripsClassificationAndVerdicts(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

2.2
Location : verdicts
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_roundTripsClassificationAndVerdicts(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

3.3
Location : verdicts
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:legacyCsvEntry_servesClassificationNotVerdicts(java.nio.file.Path)]
removed conditional - replaced equality check with true → KILLED

4.4
Location : verdicts
Killed by : none
removed conditional - replaced equality check with true → SURVIVED
Covering tests

185

1.1
Location : verdicts
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_signatureMismatchMissesBoth(java.nio.file.Path)]
removed conditional - replaced equality check with true → KILLED

2.2
Location : verdicts
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_roundTripsClassificationAndVerdicts(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

186

1.1
Location : verdicts
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_roundTripsClassificationAndVerdicts(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

2.2
Location : verdicts
Killed by : org.egothor.methodatlas.command.ScanOrchestratorCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.command.ScanOrchestratorCacheTest]/[method:cacheHit_withoutVerdicts_issuesExactlyOneDedicatedTriageCall(java.nio.file.Path)]
removed conditional - replaced equality check with true → KILLED

187

1.1
Location : verdicts
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:unifiedCache_roundTripsClassificationAndVerdicts(java.nio.file.Path)]
replaced return value with Optional.empty for org/egothor/methodatlas/AiResultCache::verdicts → KILLED

201

1.1
Location : isActive
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:empty_isNotActiveAndAlwaysMisses()]
replaced boolean return with true for org/egothor/methodatlas/AiResultCache::isActive → KILLED

2.2
Location : isActive
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_nonSecurityMethod_cachedAndRestoredAsNonSecurity(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

3.3
Location : isActive
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:empty_isNotActiveAndAlwaysMisses()]
removed conditional - replaced equality check with true → KILLED

206

1.1
Location : hits
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:load_csvWithContentHashAndAiColumns_hitOnMatchingHash(java.nio.file.Path)]
replaced int return with 0 for org/egothor/methodatlas/AiResultCache::hits → KILLED

211

1.1
Location : misses
Killed by : org.egothor.methodatlas.AiResultCacheTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.AiResultCacheTest]/[method:empty_isNotActiveAndAlwaysMisses()]
replaced int return with 0 for org/egothor/methodatlas/AiResultCache::misses → KILLED

Active mutators

Tests examined


Report generated by PIT 1.22.1