SarifEmitter.java

1
package org.egothor.methodatlas.emit;
2
3
import java.io.IOException;
4
import java.io.PrintWriter;
5
import java.util.ArrayList;
6
import java.util.LinkedHashMap;
7
import java.util.List;
8
import java.util.Locale;
9
import java.util.Map;
10
import java.util.regex.Pattern;
11
12
import org.egothor.methodatlas.TagAiDrift;
13
import org.egothor.methodatlas.TestMethodSink;
14
import org.egothor.methodatlas.ai.AiMethodSuggestion;
15
16
import com.fasterxml.jackson.annotation.JsonInclude;
17
import com.fasterxml.jackson.annotation.JsonInclude.Include;
18
import com.fasterxml.jackson.annotation.JsonProperty;
19
import com.fasterxml.jackson.databind.SerializationFeature;
20
import com.fasterxml.jackson.databind.json.JsonMapper;
21
22
/**
23
 * Buffers test method records and serializes them as a single SARIF 2.1.0 JSON
24
 * document when {@link #flush(PrintWriter)} is called.
25
 *
26
 * <p>
27
 * SARIF (Static Analysis Results Interchange Format) is an OASIS standard for
28
 * representing the results of static analysis tools. MethodAtlas uses it to
29
 * emit a machine-readable inventory of discovered test methods, with
30
 * security-relevant methods distinguished from ordinary test methods via the
31
 * SARIF result level ({@code note} vs {@code none}).
32
 * </p>
33
 *
34
 * <p>
35
 * Each test method becomes one SARIF result. Security-relevant methods receive
36
 * level {@code note} and a rule derived from the first non-umbrella AI tag
37
 * (e.g. {@code security/auth}). All other methods receive level {@code none}
38
 * and rule {@code test-method}.
39
 * </p>
40
 *
41
 * <p>
42
 * AI enrichment fields (display name, tags, reason, confidence) are stored in
43
 * the SARIF result {@code properties} bag when an {@link AiMethodSuggestion}
44
 * is available.  The interaction score and, when confidence reporting is
45
 * enabled, the confidence percentage are also embedded directly in the
46
 * result message text so they remain visible in tooling (such as GitHub Code
47
 * Scanning) that does not render the {@code properties} bag.
48
 * </p>
49
 *
50
 * <p>
51
 * This class implements {@link TestMethodSink} so it can be passed directly to
52
 * the orchestration layer in {@code MethodAtlasApp}.
53
 * </p>
54
 *
55
 * @see TestMethodSink
56
 */
57
// SarifEmitter handles multiple SARIF rule types, severity tiers, and output variants;
58
// its aggregate class CC legitimately exceeds the 80 default.
59
@SuppressWarnings("PMD.CyclomaticComplexity")
60
public final class SarifEmitter implements TestMethodSink {
61
62
    private static final String SARIF_SCHEMA =
63
            "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json";
64
    private static final String SARIF_VERSION = "2.1.0";
65
    private static final int SINGLE_CHAR_LENGTH = 1;
66
    private static final int RULE_ID_PART_COUNT = 2;
67
    private static final String RULE_TEST_METHOD = "test-method";
68
    private static final String RULE_SECURITY_TEST = "security-test";
69
    private static final String RULE_EMPTY_DISPLAY_NAME = "annotation/empty-display-name";
70
    private static final String RULE_SECURITY_PLACEBO = "security-test/placebo";
71
    private static final String LEVEL_NOTE = "note";
72
    private static final String LEVEL_NONE = "none";
73
    private static final String LEVEL_WARNING = "warning";
74
75
    /** Interaction score at or above which a security test is flagged as a potential placebo. */
76
    private static final double PLACEBO_THRESHOLD = 0.8;
77
78
    private static final String SEVERITY_CRITICAL = "9.0";
79
    private static final String SEVERITY_DESERIALIZATION = "8.5";
80
    private static final String SEVERITY_HIGH = "7.5";
81
    private static final String SEVERITY_MEDIUM_HIGH = "6.5";
82
    private static final String SEVERITY_MEDIUM = "5.5";
83
    private static final String SEVERITY_PLACEBO = "6.0";
84
    private static final String SEVERITY_LOW = "4.0";
85
    private static final String SEVERITY_DEFAULT = "5.0";
86
87
    /**
88
     * Maps AI taxonomy tags to SARIF {@code security-severity} scores (0–10).
89
     * GitHub Code Scanning maps ≥9 → Critical, ≥7 → High, ≥4 → Medium, >0 → Low.
90
     */
91
    private static final Map<String, String> TAG_SEVERITY = Map.ofEntries(
92
            Map.entry("injection", SEVERITY_CRITICAL),
93
            Map.entry("sqli", SEVERITY_CRITICAL),
94
            Map.entry("rce", SEVERITY_CRITICAL),
95
            Map.entry("xxe", SEVERITY_CRITICAL),
96
            Map.entry("deserialization", SEVERITY_DESERIALIZATION),
97
            Map.entry("auth", SEVERITY_HIGH),
98
            Map.entry("authn", SEVERITY_HIGH),
99
            Map.entry("authz", SEVERITY_HIGH),
100
            Map.entry("access-control", SEVERITY_HIGH),
101
            Map.entry("privilege-escalation", SEVERITY_HIGH),
102
            Map.entry("idor", SEVERITY_HIGH),
103
            Map.entry("crypto", SEVERITY_MEDIUM_HIGH),
104
            Map.entry("session", SEVERITY_MEDIUM_HIGH),
105
            Map.entry("xss", SEVERITY_MEDIUM_HIGH),
106
            Map.entry("csrf", SEVERITY_MEDIUM_HIGH),
107
            Map.entry("path-traversal", SEVERITY_MEDIUM_HIGH),
108
            Map.entry("redirect", SEVERITY_MEDIUM),
109
            Map.entry("logging", SEVERITY_LOW),
110
            Map.entry("dos", SEVERITY_LOW));
111
112
    private static final Pattern RULE_NAME_SEPARATOR = Pattern.compile("[/-]");
113
114
    private final boolean aiEnabled;
115
    private final boolean confidenceEnabled;
116
    private final boolean scoresInMessage;
117
    private final String filePrefix;
118
    private final String toolVersion;
119
    private final List<ResultRecord> records = new ArrayList<>();
120
121
    /**
122
     * Creates a new SARIF emitter with scores embedded in result message text
123
     * (the default behaviour).
124
     *
125
     * @param aiEnabled         whether AI enrichment columns should be included
126
     * @param confidenceEnabled whether the {@code aiConfidence} property should
127
     *                          be included; only meaningful when {@code aiEnabled}
128
     *                          is {@code true}
129
     * @param filePrefix        forward-slash path prefix prepended to every
130
     *                          artifact URI to produce a repo-relative path (e.g.
131
     *                          {@code "src/test/java/"}); use empty string when
132
     *                          the scan root is already the repository root
133
     */
134
    public SarifEmitter(boolean aiEnabled, boolean confidenceEnabled, String filePrefix) {
135
        this(aiEnabled, confidenceEnabled, filePrefix, true);
136
    }
137
138
    /**
139
     * Creates a new SARIF emitter.
140
     *
141
     * @param aiEnabled         whether AI enrichment columns should be included
142
     * @param confidenceEnabled whether the {@code aiConfidence} property should
143
     *                          be included; only meaningful when {@code aiEnabled}
144
     *                          is {@code true}
145
     * @param filePrefix        forward-slash path prefix prepended to every
146
     *                          artifact URI to produce a repo-relative path (e.g.
147
     *                          {@code "src/test/java/"}); use empty string when
148
     *                          the scan root is already the repository root
149
     * @param scoresInMessage   when {@code true} (the default), the interaction
150
     *                          score and confidence percentage are embedded in the
151
     *                          result message text so they are visible in tooling
152
     *                          (such as GitHub Code Scanning) that does not render
153
     *                          the {@code properties} bag; set to {@code false}
154
     *                          when the consuming system already displays
155
     *                          {@code properties} and the extra text is unwanted
156
     */
157
    public SarifEmitter(boolean aiEnabled, boolean confidenceEnabled, String filePrefix,
158
            boolean scoresInMessage) {
159
        this.aiEnabled = aiEnabled;
160
        this.confidenceEnabled = confidenceEnabled;
161
        this.scoresInMessage = scoresInMessage;
162
        this.filePrefix = filePrefix;
163
        String v = SarifEmitter.class.getPackage().getImplementationVersion();
164 2 1. <init> : removed conditional - replaced equality check with true → SURVIVED
2. <init> : removed conditional - replaced equality check with false → SURVIVED
        this.toolVersion = v != null ? v : "dev";
165
    }
166
167
    /**
168
     * Buffers a single test method record.
169
     */
170
    @Override
171
    @SuppressWarnings("PMD.UseObjectForClearerAPI")
172
    public void record(String fqcn, String method, int beginLine, int loc, String contentHash,
173
            List<String> tags, String displayName, AiMethodSuggestion suggestion) {
174
        records.add(new ResultRecord(fqcn, method, beginLine, loc, contentHash, tags, displayName, suggestion));
175
    }
176
177
    /**
178
     * Serializes all buffered records as a SARIF 2.1.0 JSON document and writes
179
     * it to the supplied writer.
180
     *
181
     * @param out destination writer
182
     * @throws IllegalStateException if JSON serialization fails
183
     */
184
    public void flush(PrintWriter out) {
185
        Map<String, SarifRule> rulesById = new LinkedHashMap<>();
186
        List<SarifResult> results = new ArrayList<>();
187
188
        for (ResultRecord rec : records) {
189
            String ruleId = resolveRuleId(rec.suggestion());
190
            rulesById.computeIfAbsent(ruleId, SarifEmitter::buildRule);
191
            results.add(buildResult(rec, ruleId));
192
193 4 1. flush : removed conditional - replaced equality check with true → SURVIVED
2. flush : removed conditional - replaced equality check with false → KILLED
3. flush : removed conditional - replaced equality check with true → KILLED
4. flush : removed conditional - replaced equality check with false → KILLED
            if (rec.displayName() != null && rec.displayName().isEmpty()) {
194
                rulesById.computeIfAbsent(RULE_EMPTY_DISPLAY_NAME, SarifEmitter::buildRule);
195
                results.add(buildEmptyDisplayNameResult(rec));
196
            }
197
198
            AiMethodSuggestion s = rec.suggestion();
199 7 1. flush : changed conditional boundary → SURVIVED
2. flush : removed conditional - replaced equality check with false → KILLED
3. flush : removed conditional - replaced equality check with true → KILLED
4. flush : removed conditional - replaced comparison check with true → KILLED
5. flush : removed conditional - replaced equality check with false → KILLED
6. flush : removed conditional - replaced comparison check with false → KILLED
7. flush : removed conditional - replaced equality check with true → KILLED
            if (s != null && s.securityRelevant() && s.interactionScore() >= PLACEBO_THRESHOLD) {
200
                rulesById.computeIfAbsent(RULE_SECURITY_PLACEBO, SarifEmitter::buildRule);
201
                results.add(buildPlaceboResult(rec));
202
            }
203
        }
204
205
        SarifDriver driver = new SarifDriver("MethodAtlas", toolVersion,
206
                new ArrayList<>(rulesById.values()));
207
        SarifTool tool = new SarifTool(driver);
208
        SarifRun run = new SarifRun(tool, results);
209
        SarifDocument doc = new SarifDocument(SARIF_SCHEMA, SARIF_VERSION, List.of(run));
210
211
        JsonMapper mapper = JsonMapper.builder()
212
                .enable(SerializationFeature.INDENT_OUTPUT)
213
                .build();
214
215
        try {
216 1 1. flush : removed call to java/io/PrintWriter::print → KILLED
            out.print(mapper.writeValueAsString(doc));
217
        } catch (IOException e) {
218
            throw new IllegalStateException("Failed to serialize SARIF output", e);
219
        }
220
    }
221
222
    // -------------------------------------------------------------------------
223
    // Private helpers
224
    // -------------------------------------------------------------------------
225
226
    private String resolveRuleId(AiMethodSuggestion suggestion) {
227 4 1. resolveRuleId : removed conditional - replaced equality check with true → KILLED
2. resolveRuleId : removed conditional - replaced equality check with false → KILLED
3. resolveRuleId : removed conditional - replaced equality check with true → KILLED
4. resolveRuleId : removed conditional - replaced equality check with false → KILLED
        if (suggestion == null || !suggestion.securityRelevant()) {
228 1 1. resolveRuleId : replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveRuleId → KILLED
            return RULE_TEST_METHOD;
229
        }
230
        List<String> tags = suggestion.tags();
231 4 1. resolveRuleId : removed conditional - replaced equality check with false → SURVIVED
2. resolveRuleId : removed conditional - replaced equality check with true → KILLED
3. resolveRuleId : removed conditional - replaced equality check with true → KILLED
4. resolveRuleId : removed conditional - replaced equality check with false → KILLED
        if (tags == null || tags.isEmpty()) {
232 1 1. resolveRuleId : replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveRuleId → KILLED
            return RULE_SECURITY_TEST;
233
        }
234
        for (String tag : tags) {
235 2 1. resolveRuleId : removed conditional - replaced equality check with true → KILLED
2. resolveRuleId : removed conditional - replaced equality check with false → KILLED
            if (!"security".equals(tag)) {
236 1 1. resolveRuleId : replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveRuleId → KILLED
                return "security/" + tag;
237
            }
238
        }
239 1 1. resolveRuleId : replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveRuleId → KILLED
        return RULE_SECURITY_TEST;
240
    }
241
242
    private static SarifRule buildRule(String ruleId) {
243
        String name = toRuleName(ruleId);
244
        String description = toRuleDescription(ruleId);
245
        List<String> tags = toRuleTags(ruleId);
246 2 1. buildRule : removed conditional - replaced equality check with false → SURVIVED
2. buildRule : removed conditional - replaced equality check with true → KILLED
        SarifRuleProperties ruleProps = tags.isEmpty() ? null : new SarifRuleProperties(tags);
247
        SarifHelp help = new SarifHelp(toRuleHelp(ruleId));
248 1 1. buildRule : replaced return value with null for org/egothor/methodatlas/emit/SarifEmitter::buildRule → KILLED
        return new SarifRule(ruleId, name, new SarifMessage(description), ruleProps, help);
249
    }
250
251
    private static List<String> toRuleTags(String ruleId) {
252 2 1. toRuleTags : removed conditional - replaced equality check with true → KILLED
2. toRuleTags : removed conditional - replaced equality check with false → KILLED
        if (RULE_TEST_METHOD.equals(ruleId)) {
253 1 1. toRuleTags : replaced return value with Collections.emptyList for org/egothor/methodatlas/emit/SarifEmitter::toRuleTags → KILLED
            return List.of("test");
254
        }
255 2 1. toRuleTags : removed conditional - replaced equality check with false → SURVIVED
2. toRuleTags : removed conditional - replaced equality check with true → KILLED
        if (RULE_SECURITY_TEST.equals(ruleId)) {
256 1 1. toRuleTags : replaced return value with Collections.emptyList for org/egothor/methodatlas/emit/SarifEmitter::toRuleTags → SURVIVED
            return List.of("security");
257
        }
258 2 1. toRuleTags : removed conditional - replaced equality check with true → KILLED
2. toRuleTags : removed conditional - replaced equality check with false → KILLED
        if (RULE_EMPTY_DISPLAY_NAME.equals(ruleId)) {
259 1 1. toRuleTags : replaced return value with Collections.emptyList for org/egothor/methodatlas/emit/SarifEmitter::toRuleTags → KILLED
            return List.of("annotation", "quality");
260
        }
261 2 1. toRuleTags : removed conditional - replaced equality check with false → SURVIVED
2. toRuleTags : removed conditional - replaced equality check with true → KILLED
        if (RULE_SECURITY_PLACEBO.equals(ruleId)) {
262 1 1. toRuleTags : replaced return value with Collections.emptyList for org/egothor/methodatlas/emit/SarifEmitter::toRuleTags → KILLED
            return List.of("security", "placebo", "test-quality");
263
        }
264
        String[] parts = ruleId.split("/", RULE_ID_PART_COUNT);
265 2 1. toRuleTags : removed conditional - replaced equality check with true → SURVIVED
2. toRuleTags : removed conditional - replaced equality check with false → KILLED
        if (parts.length == RULE_ID_PART_COUNT) {
266 1 1. toRuleTags : replaced return value with Collections.emptyList for org/egothor/methodatlas/emit/SarifEmitter::toRuleTags → KILLED
            return List.of(parts[0], parts[1]);
267
        }
268 1 1. toRuleTags : replaced return value with Collections.emptyList for org/egothor/methodatlas/emit/SarifEmitter::toRuleTags → NO_COVERAGE
        return List.of("security");
269
    }
270
271
    private static String toRuleName(String ruleId) {
272
        StringBuilder sb = new StringBuilder();
273
        for (String part : RULE_NAME_SEPARATOR.split(ruleId, -1)) {
274 2 1. toRuleName : removed conditional - replaced equality check with true → SURVIVED
2. toRuleName : removed conditional - replaced equality check with false → KILLED
            if (!part.isEmpty()) {
275
                sb.append(Character.toUpperCase(part.charAt(0)));
276 3 1. toRuleName : removed conditional - replaced comparison check with true → SURVIVED
2. toRuleName : changed conditional boundary → SURVIVED
3. toRuleName : removed conditional - replaced comparison check with false → KILLED
                if (part.length() > SINGLE_CHAR_LENGTH) {
277
                    sb.append(part.substring(1));
278
                }
279
            }
280
        }
281 1 1. toRuleName : replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::toRuleName → KILLED
        return sb.toString();
282
    }
283
284
    private static String toRuleDescription(String ruleId) {
285 2 1. toRuleDescription : Changed switch default to be first case → SURVIVED
2. toRuleDescription : replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::toRuleDescription → SURVIVED
        return switch (ruleId) {
286
            case RULE_TEST_METHOD -> "JUnit test method";
287
            case RULE_SECURITY_TEST -> "Security-relevant test method";
288
            case RULE_EMPTY_DISPLAY_NAME -> "@DisplayName annotation with empty string value";
289
            case RULE_SECURITY_PLACEBO ->
290
                "Security test with interaction-only assertions (placebo test)";
291 2 1. toRuleDescription : removed conditional - replaced equality check with false → SURVIVED
2. toRuleDescription : removed conditional - replaced equality check with true → SURVIVED
            default -> ruleId.startsWith("security/")
292
                    ? "Security test: " + ruleId.substring("security/".length())
293
                    : ruleId;
294
        };
295
    }
296
297
    private static String toRuleHelp(String ruleId) {
298 2 1. toRuleHelp : Changed switch default to be first case → KILLED
2. toRuleHelp : replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::toRuleHelp → KILLED
        return switch (ruleId) {
299
            case RULE_TEST_METHOD ->
300
                "MethodAtlas inventories all JUnit test methods found in the scanned source tree. "
301
                + "This result represents a test method that was not classified as security-relevant "
302
                + "by the AI, or that was scanned without AI enrichment enabled. No action is required.";
303
            case RULE_EMPTY_DISPLAY_NAME ->
304
                "A @DisplayName(\"\") annotation produces an unnamed test entry in JUnit reports, "
305
                + "CI dashboards, and audit evidence packages. Tests without names are difficult to "
306
                + "trace in security audit logs. Replace @DisplayName(\"\") with a meaningful "
307
                + "description of what the test verifies.";
308
            case RULE_SECURITY_PLACEBO ->
309
                "This security test has an interaction score at or above the threshold of "
310
                + PLACEBO_THRESHOLD + " (the actual score is shown in the finding message). "
311
                + "The score measures what fraction of the test's assertions only verify "
312
                + "that methods were called (e.g. Mockito verify(), spy call counts) "
313
                + "rather than asserting on return values, thrown exceptions, or observable state. "
314
                + "Such tests may give false confidence: the code under test could return wrong data "
315
                + "or corrupt state and the test would still pass. "
316
                + "Add assertions on security-critical outputs, e.g. "
317
                + "assertThat(response.getStatus()).isEqualTo(403), "
318
                + "assertThrows(SecurityException.class, ...), "
319
                + "or assertThat(audit.getEvents()).contains(expectedEvent).";
320
            default ->
321
                "MethodAtlas detected this test method as security-relevant via AI analysis. "
322
                + "Review the suggested @DisplayName and @Tag values in the result message. "
323
                + "If correct, apply them by running: ./methodatlas -ai -apply-tags SOURCE_ROOT. "
324
                + "The finding message also includes the interaction score and, when enabled, "
325
                + "the AI confidence score. An interaction score ≥ 0.8 means the test verifies "
326
                + "only method calls, not actual outcomes — in that case a separate "
327
                + "security-test/placebo finding is also raised.";
328
        };
329
    }
330
331
    private SarifResult buildResult(ResultRecord rec, String ruleId) {
332 2 1. buildResult : removed conditional - replaced equality check with true → KILLED
2. buildResult : removed conditional - replaced equality check with false → KILLED
        String level = RULE_TEST_METHOD.equals(ruleId) ? LEVEL_NONE : LEVEL_NOTE;
333
        String messageText = resolveMessageText(rec);
334
335
        String artifactUri = filePrefix + rec.fqcn().replace('.', '/') + ".java";
336
        SarifArtifactLocation artifactLocation = new SarifArtifactLocation(artifactUri, null);
337
338 3 1. buildResult : removed conditional - replaced comparison check with false → KILLED
2. buildResult : changed conditional boundary → KILLED
3. buildResult : removed conditional - replaced comparison check with true → KILLED
        SarifRegion region = rec.beginLine() > 0 ? new SarifRegion(rec.beginLine()) : null;
339
        SarifPhysicalLocation physicalLocation = new SarifPhysicalLocation(artifactLocation, region);
340
341
        String logicalFqmn = rec.fqcn() + "." + rec.method();
342
        SarifLogicalLocation logicalLocation = new SarifLogicalLocation(logicalFqmn, "member");
343
344
        SarifLocation location = new SarifLocation(physicalLocation, List.of(logicalLocation));
345
346
        SarifProperties properties = buildProperties(rec, ruleId);
347
348 1 1. buildResult : replaced return value with null for org/egothor/methodatlas/emit/SarifEmitter::buildResult → KILLED
        return new SarifResult(ruleId, level, new SarifMessage(messageText),
349
                List.of(location), properties);
350
    }
351
352
    private String resolveMessageText(ResultRecord rec) {
353
        AiMethodSuggestion s = rec.suggestion();
354 4 1. resolveMessageText : removed conditional - replaced equality check with false → SURVIVED
2. resolveMessageText : removed conditional - replaced equality check with true → KILLED
3. resolveMessageText : removed conditional - replaced equality check with false → KILLED
4. resolveMessageText : removed conditional - replaced equality check with true → KILLED
        if (s == null || !s.securityRelevant()) {
355 1 1. resolveMessageText : replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveMessageText → KILLED
            return rec.fqcn() + "." + rec.method();
356
        }
357
358
        StringBuilder sb = new StringBuilder(256);
359
360 4 1. resolveMessageText : removed conditional - replaced equality check with true → SURVIVED
2. resolveMessageText : removed conditional - replaced equality check with false → KILLED
3. resolveMessageText : removed conditional - replaced equality check with true → KILLED
4. resolveMessageText : removed conditional - replaced equality check with false → KILLED
        if (s.displayName() != null && !s.displayName().isBlank()) {
361
            sb.append("AI suggests: @DisplayName(\"").append(s.displayName()).append("\")");
362
        } else {
363
            sb.append("AI classifies as security-relevant");
364
        }
365 4 1. resolveMessageText : removed conditional - replaced equality check with true → SURVIVED
2. resolveMessageText : removed conditional - replaced equality check with false → KILLED
3. resolveMessageText : removed conditional - replaced equality check with true → KILLED
4. resolveMessageText : removed conditional - replaced equality check with false → KILLED
        if (s.tags() != null && !s.tags().isEmpty()) {
366
            for (String tag : s.tags()) {
367
                sb.append(" @Tag(\"").append(tag).append("\")");
368
            }
369
        }
370
        sb.append('.');
371
372 4 1. resolveMessageText : removed conditional - replaced equality check with true → KILLED
2. resolveMessageText : removed conditional - replaced equality check with false → KILLED
3. resolveMessageText : removed conditional - replaced equality check with true → KILLED
4. resolveMessageText : removed conditional - replaced equality check with false → KILLED
        if (s.reason() != null && !s.reason().isBlank()) {
373
            String reason = s.reason().strip();
374
            sb.append(" Reason: ").append(reason);
375 2 1. resolveMessageText : removed conditional - replaced equality check with false → SURVIVED
2. resolveMessageText : removed conditional - replaced equality check with true → SURVIVED
            if (!reason.endsWith(".")) {
376
                sb.append('.');
377
            }
378
        }
379
380
        sb.append(resolveScoreText(s));
381
382 1 1. resolveMessageText : replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveMessageText → KILLED
        return sb.toString();
383
    }
384
385
    /**
386
     * Returns an optional score/confidence suffix to append to a security-method
387
     * message, or an empty string when {@code scoresInMessage} is {@code false}.
388
     *
389
     * <p>
390
     * Extracted from {@link #resolveMessageText(ResultRecord)} to keep its
391
     * NPath and cyclomatic complexity within PMD thresholds.
392
     * </p>
393
     *
394
     * @param s the AI suggestion for the method
395
     * @return formatted score text, possibly empty; never {@code null}
396
     */
397
    private String resolveScoreText(AiMethodSuggestion s) {
398 2 1. resolveScoreText : removed conditional - replaced equality check with false → KILLED
2. resolveScoreText : removed conditional - replaced equality check with true → KILLED
        if (!scoresInMessage) {
399
            return "";
400
        }
401
        // Embed numeric scores so the operator can see them in tooling
402
        // (such as GitHub Code Scanning) that does not render the properties bag.
403
        StringBuilder sb = new StringBuilder(192);
404
        sb.append(String.format(Locale.ROOT, " Interaction score: %.2f.", s.interactionScore()));
405
406 5 1. resolveScoreText : removed conditional - replaced comparison check with true → SURVIVED
2. resolveScoreText : changed conditional boundary → SURVIVED
3. resolveScoreText : removed conditional - replaced equality check with false → KILLED
4. resolveScoreText : removed conditional - replaced comparison check with false → KILLED
5. resolveScoreText : removed conditional - replaced equality check with true → KILLED
        if (confidenceEnabled && s.confidence() > 0.0) {
407 1 1. resolveScoreText : Replaced double multiplication with division → KILLED
            sb.append(String.format(Locale.ROOT, " Confidence: %.0f%%.", s.confidence() * 100));
408
        }
409
410 3 1. resolveScoreText : changed conditional boundary → SURVIVED
2. resolveScoreText : removed conditional - replaced comparison check with true → SURVIVED
3. resolveScoreText : removed conditional - replaced comparison check with false → KILLED
        if (s.interactionScore() >= PLACEBO_THRESHOLD) {
411
            sb.append(" Assertions primarily verify method calls, not actual outcomes."
412
                    + " See the security-test/placebo finding for remediation guidance.");
413
        }
414 1 1. resolveScoreText : replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveScoreText → KILLED
        return sb.toString();
415
    }
416
417
    private SarifProperties buildProperties(ResultRecord rec, String ruleId) {
418
        AiMethodSuggestion s = rec.suggestion();
419 2 1. buildProperties : removed conditional - replaced equality check with true → KILLED
2. buildProperties : removed conditional - replaced equality check with false → KILLED
        String sourceTags = rec.tags().isEmpty() ? null : String.join(";", rec.tags());
420
        String securitySeverity = resolveSecuritySeverity(ruleId, s);
421
422 4 1. buildProperties : removed conditional - replaced equality check with true → SURVIVED
2. buildProperties : removed conditional - replaced equality check with false → KILLED
3. buildProperties : removed conditional - replaced equality check with true → KILLED
4. buildProperties : removed conditional - replaced equality check with false → KILLED
        if (!aiEnabled || s == null) {
423 1 1. buildProperties : replaced return value with null for org/egothor/methodatlas/emit/SarifEmitter::buildProperties → KILLED
            return new SarifProperties(rec.loc(), rec.contentHash(), sourceTags,
424
                    null, null, null, null, null, null, null, securitySeverity);
425
        }
426
427 4 1. buildProperties : removed conditional - replaced equality check with false → SURVIVED
2. buildProperties : removed conditional - replaced equality check with true → KILLED
3. buildProperties : removed conditional - replaced equality check with false → KILLED
4. buildProperties : removed conditional - replaced equality check with true → KILLED
        String aiTags = s.tags() == null || s.tags().isEmpty() ? null : String.join(";", s.tags());
428
        String aiDisplayName = s.displayName();
429 4 1. buildProperties : removed conditional - replaced equality check with false → KILLED
2. buildProperties : removed conditional - replaced equality check with true → KILLED
3. buildProperties : removed conditional - replaced equality check with false → KILLED
4. buildProperties : removed conditional - replaced equality check with true → KILLED
        String aiReason = s.reason() == null || s.reason().isBlank() ? null : s.reason();
430 2 1. buildProperties : removed conditional - replaced equality check with true → KILLED
2. buildProperties : removed conditional - replaced equality check with false → KILLED
        Double aiConfidence = confidenceEnabled ? s.confidence() : null;
431
        TagAiDrift drift = TagAiDrift.compute(rec.tags(), s);
432 2 1. buildProperties : removed conditional - replaced equality check with true → SURVIVED
2. buildProperties : removed conditional - replaced equality check with false → KILLED
        String tagAiDrift = drift != null ? drift.toValue() : null;
433 1 1. buildProperties : replaced return value with null for org/egothor/methodatlas/emit/SarifEmitter::buildProperties → KILLED
        return new SarifProperties(rec.loc(), rec.contentHash(), sourceTags,
434
                s.securityRelevant(), aiDisplayName, aiTags, aiReason, s.interactionScore(), aiConfidence,
435
                tagAiDrift, securitySeverity);
436
    }
437
438
    private SarifResult buildEmptyDisplayNameResult(ResultRecord rec) {
439
        String artifactUri = filePrefix + rec.fqcn().replace('.', '/') + ".java";
440
        SarifArtifactLocation artifactLocation = new SarifArtifactLocation(artifactUri, null);
441 3 1. buildEmptyDisplayNameResult : removed conditional - replaced comparison check with true → SURVIVED
2. buildEmptyDisplayNameResult : removed conditional - replaced comparison check with false → SURVIVED
3. buildEmptyDisplayNameResult : changed conditional boundary → SURVIVED
        SarifRegion region = rec.beginLine() > 0 ? new SarifRegion(rec.beginLine()) : null;
442
        SarifPhysicalLocation physicalLocation = new SarifPhysicalLocation(artifactLocation, region);
443
        SarifLogicalLocation logicalLocation = new SarifLogicalLocation(
444
                rec.fqcn() + "." + rec.method(), "member");
445
        SarifLocation location = new SarifLocation(physicalLocation, List.of(logicalLocation));
446
        String message = "@DisplayName(\"\") on " + rec.fqcn() + "." + rec.method()
447
                + " is explicitly empty — the test will appear unnamed in CI reports and audit "
448
                + "evidence packages. Replace with a meaningful description, e.g. "
449
                + "@DisplayName(\"Verifies that ...\").";
450 2 1. buildEmptyDisplayNameResult : removed conditional - replaced equality check with false → SURVIVED
2. buildEmptyDisplayNameResult : removed conditional - replaced equality check with true → KILLED
        String sourceTags = rec.tags().isEmpty() ? null : String.join(";", rec.tags());
451
        SarifProperties properties = new SarifProperties(rec.loc(), null, sourceTags,
452
                null, null, null, null, null, null, null, null);
453 1 1. buildEmptyDisplayNameResult : replaced return value with null for org/egothor/methodatlas/emit/SarifEmitter::buildEmptyDisplayNameResult → KILLED
        return new SarifResult(RULE_EMPTY_DISPLAY_NAME, LEVEL_NOTE,
454
                new SarifMessage(message), List.of(location), properties);
455
    }
456
457
    private SarifResult buildPlaceboResult(ResultRecord rec) {
458
        String artifactUri = filePrefix + rec.fqcn().replace('.', '/') + ".java";
459
        SarifArtifactLocation artifactLocation = new SarifArtifactLocation(artifactUri, null);
460 3 1. buildPlaceboResult : changed conditional boundary → SURVIVED
2. buildPlaceboResult : removed conditional - replaced comparison check with true → SURVIVED
3. buildPlaceboResult : removed conditional - replaced comparison check with false → KILLED
        SarifRegion region = rec.beginLine() > 0 ? new SarifRegion(rec.beginLine()) : null;
461
        SarifPhysicalLocation physicalLocation = new SarifPhysicalLocation(artifactLocation, region);
462
        SarifLogicalLocation logicalLocation = new SarifLogicalLocation(
463
                rec.fqcn() + "." + rec.method(), "member");
464
        SarifLocation location = new SarifLocation(physicalLocation, List.of(logicalLocation));
465
466
        AiMethodSuggestion s = rec.suggestion();
467
        StringBuilder placeboMsg = new StringBuilder(512);
468
        placeboMsg.append(String.format(Locale.ROOT,
469
                "Interaction score: %.2f (threshold: %.1f). "
470
                + "This security test only verifies that methods were called, "
471
                + "not what values they returned or what state they produced. "
472
                + "Tests that do not assert outcomes cannot catch regressions in security-critical logic. "
473
                + "Add assertions on return values, thrown exceptions, or observable state changes.",
474
                s.interactionScore(), PLACEBO_THRESHOLD));
475 7 1. buildPlaceboResult : removed conditional - replaced comparison check with true → SURVIVED
2. buildPlaceboResult : changed conditional boundary → SURVIVED
3. buildPlaceboResult : removed conditional - replaced equality check with true → SURVIVED
4. buildPlaceboResult : removed conditional - replaced equality check with false → KILLED
5. buildPlaceboResult : removed conditional - replaced equality check with false → KILLED
6. buildPlaceboResult : removed conditional - replaced equality check with true → KILLED
7. buildPlaceboResult : removed conditional - replaced comparison check with false → KILLED
        if (scoresInMessage && confidenceEnabled && s.confidence() > 0.0) {
476
            placeboMsg.append(String.format(Locale.ROOT,
477 1 1. buildPlaceboResult : Replaced double multiplication with division → KILLED
                    " Confidence: %.0f%%.", s.confidence() * 100));
478
        }
479
        String message = placeboMsg.toString();
480
481 2 1. buildPlaceboResult : removed conditional - replaced equality check with true → SURVIVED
2. buildPlaceboResult : removed conditional - replaced equality check with false → SURVIVED
        String sourceTags = rec.tags().isEmpty() ? null : String.join(";", rec.tags());
482
        SarifProperties properties = new SarifProperties(rec.loc(), null, sourceTags,
483
                null, null, null, null, s.interactionScore(), null, null, SEVERITY_PLACEBO);
484 1 1. buildPlaceboResult : replaced return value with null for org/egothor/methodatlas/emit/SarifEmitter::buildPlaceboResult → KILLED
        return new SarifResult(RULE_SECURITY_PLACEBO, LEVEL_WARNING,
485
                new SarifMessage(message), List.of(location), properties);
486
    }
487
488
    private static String resolveSecuritySeverity(String ruleId, AiMethodSuggestion suggestion) {
489 2 1. resolveSecuritySeverity : removed conditional - replaced equality check with true → KILLED
2. resolveSecuritySeverity : removed conditional - replaced equality check with false → KILLED
        if (RULE_TEST_METHOD.equals(ruleId)) {
490 1 1. resolveSecuritySeverity : replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveSecuritySeverity → KILLED
            return null;
491
        }
492 4 1. resolveSecuritySeverity : removed conditional - replaced equality check with true → SURVIVED
2. resolveSecuritySeverity : removed conditional - replaced equality check with false → KILLED
3. resolveSecuritySeverity : removed conditional - replaced equality check with false → KILLED
4. resolveSecuritySeverity : removed conditional - replaced equality check with true → KILLED
        if (suggestion != null && suggestion.tags() != null) {
493
            for (String tag : suggestion.tags()) {
494
                String severity = TAG_SEVERITY.get(tag);
495 2 1. resolveSecuritySeverity : removed conditional - replaced equality check with true → KILLED
2. resolveSecuritySeverity : removed conditional - replaced equality check with false → KILLED
                if (severity != null) {
496 1 1. resolveSecuritySeverity : replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveSecuritySeverity → KILLED
                    return severity;
497
                }
498
            }
499
        }
500 1 1. resolveSecuritySeverity : replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveSecuritySeverity → KILLED
        return SEVERITY_DEFAULT;
501
    }
502
503
    // -------------------------------------------------------------------------
504
    // Internal buffer record
505
    // -------------------------------------------------------------------------
506
507
    private record ResultRecord(String fqcn, String method, int beginLine, int loc,
508
            String contentHash, List<String> tags, String displayName, AiMethodSuggestion suggestion) {
509
    }
510
511
    // -------------------------------------------------------------------------
512
    // SARIF 2.1.0 POJO records
513
    // -------------------------------------------------------------------------
514
515
    private record SarifDocument(
516
            @JsonProperty("$schema") String schema,
517
            String version,
518
            List<SarifRun> runs) {
519
    }
520
521
    private record SarifRun(SarifTool tool, List<SarifResult> results) {
522
    }
523
524
    private record SarifTool(SarifDriver driver) {
525
    }
526
527
    private record SarifDriver(String name, String version, List<SarifRule> rules) {
528
    }
529
530
    @JsonInclude(Include.NON_NULL)
531
    private record SarifRule(String id, String name, SarifMessage shortDescription,
532
            SarifRuleProperties properties, SarifHelp help) {
533
    }
534
535
    private record SarifHelp(String text) {
536
    }
537
538
    private record SarifRuleProperties(List<String> tags) {
539
    }
540
541
    private record SarifResult(
542
            String ruleId,
543
            String level,
544
            SarifMessage message,
545
            List<SarifLocation> locations,
546
            SarifProperties properties) {
547
    }
548
549
    private record SarifLocation(
550
            SarifPhysicalLocation physicalLocation,
551
            List<SarifLogicalLocation> logicalLocations) {
552
    }
553
554
    private record SarifPhysicalLocation(
555
            SarifArtifactLocation artifactLocation,
556
            @JsonInclude(Include.NON_NULL) SarifRegion region) {
557
    }
558
559
    @JsonInclude(Include.NON_NULL)
560
    private record SarifArtifactLocation(String uri, String uriBaseId) {
561
    }
562
563
    private record SarifRegion(int startLine) {
564
    }
565
566
    private record SarifLogicalLocation(String fullyQualifiedName, String kind) {
567
    }
568
569
    private record SarifMessage(String text) {
570
    }
571
572
    @JsonInclude(Include.NON_NULL)
573
    private record SarifProperties(
574
            int loc,
575
            String contentHash,
576
            String sourceTags,
577
            Boolean aiSecurityRelevant,
578
            String aiDisplayName,
579
            String aiTags,
580
            String aiReason,
581
            Double aiInteractionScore,
582
            Double aiConfidence,
583
            String tagAiDrift,
584
            @JsonProperty("security-severity") String securitySeverity) {
585
    }
586
}

Mutations

164

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

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

193

1.1
Location : flush
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_emptyDisplayName_producesEmptyDisplayNameFinding()]
removed conditional - replaced equality check with false → KILLED

2.2
Location : flush
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securitySeverityPresentWithoutAi_whenRuleIsSecurityTest()]
removed conditional - replaced equality check with true → KILLED

3.3
Location : flush
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_emptyDisplayName_producesEmptyDisplayNameFinding()]
removed conditional - replaced equality check with false → KILLED

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

199

1.1
Location : flush
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_placeboResult_hasLevelWarning()]
removed conditional - replaced equality check with false → KILLED

2.2
Location : flush
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_nonSecurityMethodWithHighInteractionScore_noPlaceboResult()]
removed conditional - replaced equality check with true → KILLED

3.3
Location : flush
Killed by : none
changed conditional boundary → SURVIVED
Covering tests

4.4
Location : flush
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodWithLowInteractionScore_noPlaceboResult()]
removed conditional - replaced comparison check with true → KILLED

5.5
Location : flush
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_placeboMessage_scoreAlwaysPresent_evenWhenScoresInMessageFalse()]
removed conditional - replaced equality check with false → KILLED

6.6
Location : flush
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_placeboResult_hasLevelWarning()]
removed conditional - replaced comparison check with false → KILLED

7.7
Location : flush
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securitySeverityPresentWithoutAi_whenRuleIsSecurityTest()]
removed conditional - replaced equality check with true → KILLED

216

1.1
Location : flush
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_toolDriverHasCorrectName()]
removed call to java/io/PrintWriter::print → KILLED

227

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

2.2
Location : resolveRuleId
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_nonSecurityMethodWithHighInteractionScore_noPlaceboResult()]
removed conditional - replaced equality check with false → KILLED

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

4.4
Location : resolveRuleId
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_nullTagsInSuggestion_resolveRuleIdReturnsSecurityTest()]
removed conditional - replaced equality check with false → KILLED

228

1.1
Location : resolveRuleId
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securitySeverityPresentWithoutAi_whenRuleIsSecurityTest()]
replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveRuleId → KILLED

231

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

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

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

4.4
Location : resolveRuleId
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityAuthRuleHasTags()]
removed conditional - replaced equality check with false → KILLED

232

1.1
Location : resolveRuleId
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_nullTagsInSuggestion_resolveRuleIdReturnsSecurityTest()]
replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveRuleId → KILLED

235

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

2.2
Location : resolveRuleId
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityAuthRuleHasTags()]
removed conditional - replaced equality check with false → KILLED

236

1.1
Location : resolveRuleId
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityAuthRuleHasTags()]
replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveRuleId → KILLED

239

1.1
Location : resolveRuleId
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodWithOnlySecurityTagGetsRuleSecurityTest()]
replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveRuleId → KILLED

246

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

2.2
Location : buildRule
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_testMethodRuleHasTestTag()]
removed conditional - replaced equality check with true → KILLED

248

1.1
Location : buildRule
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_testMethodRuleHasTestTag()]
replaced return value with null for org/egothor/methodatlas/emit/SarifEmitter::buildRule → KILLED

252

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

2.2
Location : toRuleTags
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_testMethodRuleHasTestTag()]
removed conditional - replaced equality check with false → KILLED

253

1.1
Location : toRuleTags
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_testMethodRuleHasTestTag()]
replaced return value with Collections.emptyList for org/egothor/methodatlas/emit/SarifEmitter::toRuleTags → KILLED

255

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

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

256

1.1
Location : toRuleTags
Killed by : none
replaced return value with Collections.emptyList for org/egothor/methodatlas/emit/SarifEmitter::toRuleTags → SURVIVED
Covering tests

258

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

2.2
Location : toRuleTags
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_emptyDisplayName_ruleRegisteredInDriver()]
removed conditional - replaced equality check with false → KILLED

259

1.1
Location : toRuleTags
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_emptyDisplayName_ruleRegisteredInDriver()]
replaced return value with Collections.emptyList for org/egothor/methodatlas/emit/SarifEmitter::toRuleTags → KILLED

261

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

2.2
Location : toRuleTags
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityAuthRuleHasTags()]
removed conditional - replaced equality check with true → KILLED

262

1.1
Location : toRuleTags
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_placeboResult_ruleIsRegistered()]
replaced return value with Collections.emptyList for org/egothor/methodatlas/emit/SarifEmitter::toRuleTags → KILLED

265

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

2.2
Location : toRuleTags
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityAuthRuleHasTags()]
removed conditional - replaced equality check with false → KILLED

266

1.1
Location : toRuleTags
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityAuthRuleHasTags()]
replaced return value with Collections.emptyList for org/egothor/methodatlas/emit/SarifEmitter::toRuleTags → KILLED

268

1.1
Location : toRuleTags
Killed by : none
replaced return value with Collections.emptyList for org/egothor/methodatlas/emit/SarifEmitter::toRuleTags → NO_COVERAGE

274

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

2.2
Location : toRuleName
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_placeboResult_ruleIsRegistered()]
removed conditional - replaced equality check with false → KILLED

276

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

2.2
Location : toRuleName
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_placeboResult_ruleIsRegistered()]
removed conditional - replaced comparison check with false → KILLED

3.3
Location : toRuleName
Killed by : none
changed conditional boundary → SURVIVED Covering tests

281

1.1
Location : toRuleName
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_placeboResult_ruleIsRegistered()]
replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::toRuleName → KILLED

285

1.1
Location : toRuleDescription
Killed by : none
Changed switch default to be first case → SURVIVED
Covering tests

2.2
Location : toRuleDescription
Killed by : none
replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::toRuleDescription → SURVIVED Covering tests

291

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

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

298

1.1
Location : toRuleHelp
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityAuthRuleHasHelpText()]
Changed switch default to be first case → KILLED

2.2
Location : toRuleHelp
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_testMethodRuleHasHelpText()]
replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::toRuleHelp → KILLED

332

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

2.2
Location : buildResult
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_nonSecurityMethodGetsLevelNoneAndRuleTestMethod()]
removed conditional - replaced equality check with false → KILLED

338

1.1
Location : buildResult
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_regionStartLinePresent_whenBeginLinePositive()]
removed conditional - replaced comparison check with false → KILLED

2.2
Location : buildResult
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_regionAbsent_whenBeginLineZero()]
changed conditional boundary → KILLED

3.3
Location : buildResult
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_regionAbsent_whenBeginLineZero()]
removed conditional - replaced comparison check with true → KILLED

348

1.1
Location : buildResult
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_regionStartLinePresent_whenBeginLinePositive()]
replaced return value with null for org/egothor/methodatlas/emit/SarifEmitter::buildResult → KILLED

354

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

2.2
Location : resolveMessageText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodMessage_alwaysIncludesInteractionScore()]
removed conditional - replaced equality check with false → KILLED

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

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

355

1.1
Location : resolveMessageText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_nonSecurityMethodMessageIsFullyQualifiedMethodName()]
replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveMessageText → KILLED

360

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

2.2
Location : resolveMessageText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodMessage_scoresOmitted_whenScoresInMessageFalse()]
removed conditional - replaced equality check with false → KILLED

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

4.4
Location : resolveMessageText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodMessage_scoresOmitted_whenScoresInMessageFalse()]
removed conditional - replaced equality check with false → KILLED

365

1.1
Location : resolveMessageText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodMessage_noDisplayName_usesGenericLine()]
removed conditional - replaced equality check with false → KILLED

2.2
Location : resolveMessageText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_nullTagsInSuggestion_resolveRuleIdReturnsSecurityTest()]
removed conditional - replaced equality check with true → KILLED

3.3
Location : resolveMessageText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodMessage_noDisplayName_usesGenericLine()]
removed conditional - replaced equality check with false → KILLED

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

372

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

2.2
Location : resolveMessageText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodMessageContainsDisplayNameAndTags()]
removed conditional - replaced equality check with false → KILLED

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

4.4
Location : resolveMessageText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodMessageContainsDisplayNameAndTags()]
removed conditional - replaced equality check with false → KILLED

375

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

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

382

1.1
Location : resolveMessageText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodMessage_alwaysIncludesInteractionScore()]
replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveMessageText → KILLED

398

1.1
Location : resolveScoreText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodMessage_confidenceOmitted_whenScoresInMessageFalse()]
removed conditional - replaced equality check with false → KILLED

2.2
Location : resolveScoreText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodMessage_alwaysIncludesInteractionScore()]
removed conditional - replaced equality check with true → KILLED

406

1.1
Location : resolveScoreText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodMessage_includesConfidence_whenEnabled()]
removed conditional - replaced equality check with false → KILLED

2.2
Location : resolveScoreText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodMessage_includesConfidence_whenEnabled()]
removed conditional - replaced comparison check with false → KILLED

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

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

5.5
Location : resolveScoreText
Killed by : none
changed conditional boundary → SURVIVED Covering tests

407

1.1
Location : resolveScoreText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodMessage_includesConfidence_whenEnabled()]
Replaced double multiplication with division → KILLED

410

1.1
Location : resolveScoreText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodMessage_highInteractionScore_includesPlaceboWarning()]
removed conditional - replaced comparison check with false → KILLED

2.2
Location : resolveScoreText
Killed by : none
changed conditional boundary → SURVIVED
Covering tests

3.3
Location : resolveScoreText
Killed by : none
removed conditional - replaced comparison check with true → SURVIVED Covering tests

414

1.1
Location : resolveScoreText
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodMessage_alwaysIncludesInteractionScore()]
replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveScoreText → KILLED

419

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

2.2
Location : buildProperties
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_sourceTagsAbsent_whenEmpty()]
removed conditional - replaced equality check with false → KILLED

422

1.1
Location : buildProperties
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_tagAiDriftTagOnly_whenSourceTagButAiDisagrees()]
removed conditional - replaced equality check with false → KILLED

2.2
Location : buildProperties
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_tagAiDriftTagOnly_whenSourceTagButAiDisagrees()]
removed conditional - replaced equality check with true → KILLED

3.3
Location : buildProperties
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_tagAiDriftAbsent_whenSuggestionNull()]
removed conditional - replaced equality check with false → KILLED

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

423

1.1
Location : buildProperties
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:contentHash_presentInPropertiesWhenProvided()]
replaced return value with null for org/egothor/methodatlas/emit/SarifEmitter::buildProperties → KILLED

427

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

2.2
Location : buildProperties
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_nullTagsInSuggestion_resolveRuleIdReturnsSecurityTest()]
removed conditional - replaced equality check with true → KILLED

3.3
Location : buildProperties
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_propertiesContainAiFields_whenAiEnabled()]
removed conditional - replaced equality check with false → KILLED

4.4
Location : buildProperties
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_propertiesContainAiFields_whenAiEnabled()]
removed conditional - replaced equality check with true → KILLED

429

1.1
Location : buildProperties
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_blankAiReason_storedAsNullInProperties()]
removed conditional - replaced equality check with false → KILLED

2.2
Location : buildProperties
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_propertiesContainAiFields_whenAiEnabled()]
removed conditional - replaced equality check with true → KILLED

3.3
Location : buildProperties
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_propertiesContainAiFields_whenAiEnabled()]
removed conditional - replaced equality check with false → KILLED

4.4
Location : buildProperties
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_nonSecurityMethodWithHighInteractionScore_noPlaceboResult()]
removed conditional - replaced equality check with true → KILLED

430

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

2.2
Location : buildProperties
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_aiConfidencePresent_whenConfidenceEnabled()]
removed conditional - replaced equality check with false → KILLED

432

1.1
Location : buildProperties
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_tagAiDriftTagOnly_whenSourceTagButAiDisagrees()]
removed conditional - replaced equality check with false → KILLED

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

433

1.1
Location : buildProperties
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_tagAiDriftTagOnly_whenSourceTagButAiDisagrees()]
replaced return value with null for org/egothor/methodatlas/emit/SarifEmitter::buildProperties → KILLED

441

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

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

3.3
Location : buildEmptyDisplayNameResult
Killed by : none
changed conditional boundary → SURVIVED Covering tests

450

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

2.2
Location : buildEmptyDisplayNameResult
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_emptyDisplayName_resultHasLocInProperties()]
removed conditional - replaced equality check with true → KILLED

453

1.1
Location : buildEmptyDisplayNameResult
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_emptyDisplayName_producesEmptyDisplayNameFinding()]
replaced return value with null for org/egothor/methodatlas/emit/SarifEmitter::buildEmptyDisplayNameResult → KILLED

460

1.1
Location : buildPlaceboResult
Killed by : none
changed conditional boundary → SURVIVED
Covering tests

2.2
Location : buildPlaceboResult
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_placeboResult_hasCorrectPhysicalLocation()]
removed conditional - replaced comparison check with false → KILLED

3.3
Location : buildPlaceboResult
Killed by : none
removed conditional - replaced comparison check with true → SURVIVED Covering tests

475

1.1
Location : buildPlaceboResult
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_placeboResult_messageIncludesConfidence_whenEnabled()]
removed conditional - replaced equality check with false → KILLED

2.2
Location : buildPlaceboResult
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_placeboResult_messageIncludesConfidence_whenEnabled()]
removed conditional - replaced equality check with false → KILLED

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

4.4
Location : buildPlaceboResult
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_placeboResult_messageIncludesConfidence_whenEnabled()]
removed conditional - replaced comparison check with false → KILLED

5.5
Location : buildPlaceboResult
Killed by : none
removed conditional - replaced comparison check with true → SURVIVED
Covering tests

6.6
Location : buildPlaceboResult
Killed by : none
changed conditional boundary → SURVIVED Covering tests

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

477

1.1
Location : buildPlaceboResult
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_placeboResult_messageIncludesConfidence_whenEnabled()]
Replaced double multiplication with division → KILLED

481

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

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

484

1.1
Location : buildPlaceboResult
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securityMethodWithHighInteractionScore_producesPlaceboResult()]
replaced return value with null for org/egothor/methodatlas/emit/SarifEmitter::buildPlaceboResult → KILLED

489

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

2.2
Location : resolveSecuritySeverity
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securitySeverityPresentWithoutAi_whenRuleIsSecurityTest()]
removed conditional - replaced equality check with false → KILLED

490

1.1
Location : resolveSecuritySeverity
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securitySeverityPresentWithoutAi_whenRuleIsSecurityTest()]
replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveSecuritySeverity → KILLED

492

1.1
Location : resolveSecuritySeverity
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securitySeverityIsCritical_forInjectionTag()]
removed conditional - replaced equality check with false → KILLED

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

3.3
Location : resolveSecuritySeverity
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securitySeverityIsCritical_forInjectionTag()]
removed conditional - replaced equality check with false → KILLED

4.4
Location : resolveSecuritySeverity
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_nullTagsInSuggestion_resolveRuleIdReturnsSecurityTest()]
removed conditional - replaced equality check with true → KILLED

495

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

2.2
Location : resolveSecuritySeverity
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securitySeverityIsCritical_forInjectionTag()]
removed conditional - replaced equality check with false → KILLED

496

1.1
Location : resolveSecuritySeverity
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securitySeverityIsCritical_forInjectionTag()]
replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveSecuritySeverity → KILLED

500

1.1
Location : resolveSecuritySeverity
Killed by : org.egothor.methodatlas.SarifEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.SarifEmitterTest]/[method:flush_securitySeverityDefaultsMedium_forUnknownTag()]
replaced return value with "" for org/egothor/methodatlas/emit/SarifEmitter::resolveSecuritySeverity → KILLED

Active mutators

Tests examined


Report generated by PIT 1.22.1