CliArgs.java

1
package org.egothor.methodatlas;
2
3
import java.io.IOException;
4
import java.nio.file.Files;
5
import java.nio.file.Path;
6
import java.nio.file.Paths;
7
import java.time.Duration;
8
import java.util.ArrayList;
9
import java.util.LinkedHashMap;
10
import java.util.LinkedHashSet;
11
import java.util.List;
12
import java.util.Locale;
13
import java.util.Map;
14
import java.util.Set;
15
16
import org.egothor.methodatlas.ai.AiOptions;
17
import org.egothor.methodatlas.emit.OutputMode;
18
import org.egothor.methodatlas.ai.AiProvider;
19
import org.egothor.methodatlas.ai.PromptTemplateException;
20
import org.egothor.methodatlas.ai.PromptTemplateKind;
21
import org.egothor.methodatlas.ai.PromptTemplateSet;
22
import org.egothor.methodatlas.ai.PromptTemplateValidator;
23
24
/**
25
 * Parses command-line arguments into a {@link CliConfig}.
26
 *
27
 * <p>
28
 * This class centralises all argument-parsing logic for the MethodAtlas
29
 * application. It is intentionally separated from {@link MethodAtlasApp} to
30
 * keep each class focused and below the project's cyclomatic-complexity
31
 * threshold.
32
 * </p>
33
 *
34
 * <p>
35
 * When a {@code -config <file>} argument is present it is processed first
36
 * (via a pre-scan) so that the YAML file provides default values before
37
 * individual command-line flags are evaluated. Command-line flags always take
38
 * precedence over values from the YAML configuration file.
39
 * </p>
40
 *
41
 * <p>
42
 * This class is a non-instantiable utility holder.
43
 * </p>
44
 *
45
 * @see CliConfig
46
 * @see MethodAtlasApp
47
 */
48
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.LongVariable"})
49
final class CliArgs {
50
51
    private static final String DEFAULT_FILE_SUFFIX = "java:Test.java";
52
    private static final String FLAG_CONFIG = "-config";
53
    private static final String FLAG_AI_CACHE = "-ai-cache";
54
    private static final String FLAG_AI_CACHE_OUT = "-ai-cache-out";
55
    private static final String FLAG_DRIFT_DETECT = "-drift-detect";
56
    private static final String FLAG_EMIT_SOURCE_ROOT = "-emit-source-root";
57
    private static final String FLAG_INCLUDE_NON_SECURITY = "-include-non-security";
58
    private static final String FLAG_SARIF_OMIT_SCORES = "-sarif-omit-scores";
59
    private static final String FLAG_APPLY_TAGS_FROM_CSV = "-apply-tags-from-csv";
60
    private static final String FLAG_PROMOTE_AI = "-promote-ai";
61
    private static final String FLAG_MISMATCH_LIMIT = "-mismatch-limit";
62
    private static final String FLAG_MIN_CONFIDENCE = "-min-confidence";
63
    private static final String FLAG_EMIT_RECEIPT = "-emit-receipt";
64
    private static final String FLAG_RECEIPT_FILE = "-receipt-file";
65
    private static final String FLAG_EMIT_COVERAGE = "-emit-coverage";
66
    private static final String FLAG_COVERAGE_FILE = "-coverage-file";
67
    private static final String FLAG_COVERAGE_MAPPING = "-coverage-mapping";
68
    private static final String FLAG_EVIDENCE_PACK = "-evidence-pack";
69
    private static final String FLAG_EVIDENCE_PACK_DIR = "-evidence-pack-dir";
70
    private static final String FLAG_EVIDENCE_PACK_OVERWRITE = "-evidence-pack-overwrite";
71
    private static final String FLAG_EVIDENCE_PACK_KEYRING = "-evidence-pack-keyring";
72
    private static final String FLAG_EVIDENCE_PACK_KEYRING_ENV = "-evidence-pack-keyring-env";
73
    private static final String FLAG_EVIDENCE_PACK_KEYRING_PASSWORD_FILE = "-evidence-pack-keyring-password-file";
74
    private static final String FLAG_EVIDENCE_PACK_KEYRING_PASSWORD_ENV = "-evidence-pack-keyring-password-env";
75
    private static final String FLAG_EVIDENCE_PACK_KEY_ALIAS = "-evidence-pack-key-alias";
76
    private static final String FLAG_EVIDENCE_PACK_SIGN_ALGO = "-evidence-pack-sign-algo";
77
    private static final String FLAG_DETECT_SECRETS = "-detect-secrets";
78
    private static final String FLAG_SECRETS_INCLUDE = "-secrets-include";
79
    private static final String FLAG_SECRETS_RULES = "-secrets-rules";
80
    private static final String FLAG_SECRETS_OUT = "-secrets-out";
81
    private static final String FLAG_SECRETS_SEPARATE_LLM = "-secrets-separate-llm";
82
    private static final String FLAG_SECRETS_SHOW_VALUES = "-secrets-show-values";
83
    private static final String FLAG_SECRETS_ERROR_THRESHOLD = "-secrets-error-threshold";
84
    private static final String FLAG_SECRETS_WARNING_THRESHOLD = "-secrets-warning-threshold";
85
    private static final String FLAG_SECRETS_MIN_SCORE = "-secrets-min-score";
86
    private static final String FLAG_CLASSIFICATION_PROMPT = "-classification-prompt";
87
    private static final String FLAG_TRIAGE_PROMPT = "-triage-prompt";
88
    private static final String FLAG_DEDICATED_TRIAGE_PROMPT = "-dedicated-triage-prompt";
89
    private static final String FLAG_PARALLEL_AI = "-parallel-ai";
90
    private static final String FLAG_AI_CWE = "-ai-cwe";
91
    private static final String FLAG_GAP_REPORT = "-gap-report";
92
    private static final String FLAG_GAP_REPORT_FILE = "-gap-report-file";
93
    private static final String FLAG_EVIDENCE_REPORT = "-evidence-report";
94
    private static final String FLAG_EVIDENCE_REPORT_FILE = "-evidence-report-file";
95
    private static final String FLAG_ATTEST = "-attest";
96
    private static final String FLAG_ATTEST_FILE = "-attest-file";
97
98
    /**
99
     * Prevents instantiation of this utility class.
100
     */
101
    private CliArgs() {
102
    }
103
104
    /**
105
     * Parses command-line arguments into a structured configuration object.
106
     *
107
     * <p>
108
     * If a {@code -config <file>} argument is present it is loaded first and
109
     * its values seed the initial configuration. Subsequent command-line flags
110
     * override those defaults.
111
     * </p>
112
     *
113
     * <p>
114
     * <b>SARIF mode and security filtering:</b> when {@code -sarif} is selected
115
     * (or {@code outputMode: sarif} is set in YAML), the security-only filter is
116
     * applied automatically — only security-relevant methods are emitted. This
117
     * default exists because SARIF is consumed by GitHub Code Scanning and
118
     * equivalent security tooling that expects actionable security findings, not
119
     * an exhaustive inventory of all test methods. Use {@code -include-non-security}
120
     * to override this behaviour and include all methods in the SARIF document.
121
     * </p>
122
     *
123
     * <p>
124
     * The {@code -security-only} flag continues to work independently and applies
125
     * the same filter to CSV and plain-text output modes.
126
     * </p>
127
     *
128
     * @param args raw command-line arguments
129
     * @return parsed command-line configuration, or {@code null} when a
130
     *         validation error (for example {@code -emit-coverage} without
131
     *         {@code -coverage-mapping}) has already been reported to
132
     *         {@code stderr} and the caller should exit with a bad-arguments code
133
     * @throws IllegalArgumentException if an option value is missing, malformed,
134
     *                                  or unsupported, or if the config file
135
     *                                  cannot be read
136
     */
137
    @SuppressWarnings({"PMD.AvoidReassigningLoopVariables", "PMD.CyclomaticComplexity",
138
            "PMD.NPathComplexity", "PMD.NcssCount", "PMD.CognitiveComplexity"})
139
    /* default */ static CliConfig parse(String... args) {
140
        // Pre-scan for -config to load YAML defaults before processing other flags.
141
        YamlConfig.YamlConfigFile yamlConfig = loadYamlConfigFromArgs(args);
142
143
        // Seed initial values from YAML (command-line flags will override these).
144
        OutputMode outputMode = resolveOutputModeFromYaml(yamlConfig);
145 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with true → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        boolean emitMetadata = yamlConfig != null && yamlConfig.emitMetadata;
146 4 1. parse : removed conditional - replaced equality check with true → KILLED
2. parse : removed conditional - replaced equality check with true → KILLED
3. parse : removed conditional - replaced equality check with false → KILLED
4. parse : removed conditional - replaced equality check with false → KILLED
        List<String> fileSuffixes = yamlConfig != null && yamlConfig.fileSuffixes != null
147
                ? new ArrayList<>(yamlConfig.fileSuffixes) : new ArrayList<>();
148 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with true → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        Set<String> testMarkers = yamlConfig != null && yamlConfig.testMarkers != null
149
                ? new LinkedHashSet<>(yamlConfig.testMarkers) : new LinkedHashSet<>();
150
        Map<String, List<String>> properties = new LinkedHashMap<>();
151 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with true → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        if (yamlConfig != null && yamlConfig.properties != null) {
152
            yamlConfig.properties.forEach((k, v) -> properties.put(k, new ArrayList<>(v)));
153
        }
154
        AiOptions.Builder aiBuilder = AiOptions.builder();
155 4 1. parse : removed conditional - replaced equality check with true → KILLED
2. parse : removed conditional - replaced equality check with false → KILLED
3. parse : removed conditional - replaced equality check with false → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        if (yamlConfig != null && yamlConfig.ai != null) {
156
            applyYamlAiConfig(aiBuilder, yamlConfig.ai);
157
        }
158
159
        List<Path> paths = new ArrayList<>();
160
        String manualWorkDir = null;
161
        String manualResponseDir = null;
162
        boolean manualIsConsume = false;
163
        boolean applyTags = false;
164 4 1. parse : removed conditional - replaced equality check with true → KILLED
2. parse : removed conditional - replaced equality check with true → KILLED
3. parse : removed conditional - replaced equality check with false → KILLED
4. parse : removed conditional - replaced equality check with false → KILLED
        boolean contentHash = yamlConfig != null && yamlConfig.contentHash;
165 4 1. parse : removed conditional - replaced equality check with false → KILLED
2. parse : removed conditional - replaced equality check with true → KILLED
3. parse : removed conditional - replaced equality check with false → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        Path overrideFilePath = yamlConfig != null && yamlConfig.overrideFile != null
166
                ? Paths.get(yamlConfig.overrideFile) : null;
167 4 1. parse : removed conditional - replaced equality check with true → KILLED
2. parse : removed conditional - replaced equality check with false → KILLED
3. parse : removed conditional - replaced equality check with true → KILLED
4. parse : removed conditional - replaced equality check with false → KILLED
        boolean securityOnly = yamlConfig != null && yamlConfig.securityOnly;
168 4 1. parse : removed conditional - replaced equality check with false → KILLED
2. parse : removed conditional - replaced equality check with false → KILLED
3. parse : removed conditional - replaced equality check with true → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        boolean includeNonSecurity = yamlConfig != null && yamlConfig.includeNonSecurity;
169 4 1. parse : removed conditional - replaced equality check with true → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with false → SURVIVED
4. parse : removed conditional - replaced equality check with true → KILLED
        boolean sarifOmitScores = yamlConfig != null && yamlConfig.sarifOmitScores;
170 4 1. parse : removed conditional - replaced equality check with false → KILLED
2. parse : removed conditional - replaced equality check with true → KILLED
3. parse : removed conditional - replaced equality check with false → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        double minConfidence = yamlConfig != null && yamlConfig.minConfidence != null
171
                ? yamlConfig.minConfidence : 0.0;
172 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with true → SURVIVED
4. parse : removed conditional - replaced equality check with true → KILLED
        boolean driftDetect = yamlConfig != null && yamlConfig.driftDetect;
173
        boolean emitSourceRoot = false;
174
        Path aiCacheFile = null;
175
        Path aiCacheOut = null;
176
        Path applyTagsFromCsvFile = null;
177
        int mismatchLimit = -1;
178
        boolean emitReceipt = false;
179
        Path receiptFile = null;
180
        boolean emitCoverage = false;
181
        Path coverageFile = null;
182
        Path coverageMappingFile = null;
183
        String evidencePackFramework = null;
184
        Path evidencePackDir = null;
185
        boolean evidencePackOverwrite = false;
186
        Path evidencePackKeyringFile = null;
187
        String evidencePackKeyringEnv = null;
188
        Path evidencePackPasswordFile = null;
189
        String evidencePackPasswordEnv = null;
190
        String evidencePackKeyAlias = null;
191
        String evidencePackSignAlgo = null;
192
        boolean verbose = false;
193
        // -promote-ai lets the apply-from-csv engine write unvalidated AI output
194
        // into source where curated columns are blank — risky and off by default.
195
        // Seeded from YAML (promoteAi:) and overridable by the CLI flag.
196 4 1. parse : removed conditional - replaced equality check with true → SURVIVED
2. parse : removed conditional - replaced equality check with false → KILLED
3. parse : removed conditional - replaced equality check with false → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        boolean promoteAi = yamlConfig != null && yamlConfig.promoteAi;
197
        // Credential-detection flags — all off/null/default until -detect-secrets is given.
198 4 1. parse : removed conditional - replaced equality check with true → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with false → SURVIVED
4. parse : removed conditional - replaced equality check with true → KILLED
        boolean detectSecrets = yamlConfig != null && yamlConfig.detectSecrets;
199 2 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with true → KILLED
        String secretsInclude = yamlConfig != null ? yamlConfig.secretsInclude : null;
200 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with true → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        Path secretsRules = yamlConfig != null && yamlConfig.secretsRules != null
201
                ? Paths.get(yamlConfig.secretsRules) : null;
202 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with true → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        Path secretsOut = yamlConfig != null && yamlConfig.secretsOut != null
203
                ? Paths.get(yamlConfig.secretsOut) : Path.of("methodatlas-credentials.csv");
204 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with true → SURVIVED
4. parse : removed conditional - replaced equality check with true → KILLED
        boolean secretsSeparateLlm = yamlConfig != null && yamlConfig.secretsSeparateLlm;
205 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with true → SURVIVED
4. parse : removed conditional - replaced equality check with true → KILLED
        boolean secretsShowValues = yamlConfig != null && yamlConfig.secretsShowValues;
206 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with true → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        double secretsErrorThreshold = yamlConfig != null && yamlConfig.secretsErrorThreshold != null
207
                ? yamlConfig.secretsErrorThreshold : 0.8;
208 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with true → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        double secretsWarningThreshold = yamlConfig != null && yamlConfig.secretsWarningThreshold != null
209
                ? yamlConfig.secretsWarningThreshold : 0.4;
210 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with true → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        double secretsMinScore = yamlConfig != null && yamlConfig.secretsMinScore != null
211
                ? yamlConfig.secretsMinScore : 0.0;
212 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with true → SURVIVED
3. parse : removed conditional - replaced equality check with false → SURVIVED
4. parse : removed conditional - replaced equality check with true → KILLED
        boolean parallelAi = yamlConfig != null && yamlConfig.parallelAi;
213 4 1. parse : removed conditional - replaced equality check with true → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with false → SURVIVED
4. parse : removed conditional - replaced equality check with true → KILLED
        boolean aiCwe = yamlConfig != null && yamlConfig.aiCwe;
214 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with true → SURVIVED
4. parse : removed conditional - replaced equality check with true → KILLED
        boolean gapReport = yamlConfig != null && yamlConfig.gapReport;
215 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with true → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        Path gapReportFile = yamlConfig != null && yamlConfig.gapReportFile != null
216
                ? Path.of(yamlConfig.gapReportFile) : null;
217 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with true → SURVIVED
3. parse : removed conditional - replaced equality check with false → SURVIVED
4. parse : removed conditional - replaced equality check with true → KILLED
        boolean evidenceReport = yamlConfig != null && yamlConfig.evidenceReport;
218 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with true → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        Path evidenceReportFile = yamlConfig != null && yamlConfig.evidenceReportFile != null
219
                ? Path.of(yamlConfig.evidenceReportFile) : null;
220 4 1. parse : removed conditional - replaced equality check with true → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with false → SURVIVED
4. parse : removed conditional - replaced equality check with true → KILLED
        boolean attest = yamlConfig != null && yamlConfig.attest;
221 4 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with false → SURVIVED
3. parse : removed conditional - replaced equality check with true → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        Path attestFile = yamlConfig != null && yamlConfig.attestFile != null
222
                ? Path.of(yamlConfig.attestFile) : null;
223
        // Optional prompt-template override files (CLI overrides YAML). Resolved into
224
        // an effective PromptTemplateSet after parsing, validated fail-fast.
225
        Path classificationPromptFile = yamlAiPromptPath(yamlConfig, "classification");
226
        Path triagePromptFile = yamlAiPromptPath(yamlConfig, "triage");
227
        Path dedicatedTriagePromptFile = yamlAiPromptPath(yamlConfig, "dedicatedTriage");
228
        // Tracks whether the first CLI -file-suffix has been seen; when it is,
229
        // subsequent -file-suffix values are appended rather than replacing defaults.
230
        boolean cliFileSuffixSet = false;
231
232 3 1. parse : removed conditional - replaced comparison check with true → KILLED
2. parse : removed conditional - replaced comparison check with false → KILLED
3. parse : changed conditional boundary → KILLED
        for (int i = 0; i < args.length; i++) {
233
            String arg = args[i];
234 2 1. parse : removed conditional - replaced equality check with true → KILLED
2. parse : removed conditional - replaced equality check with false → KILLED
            if (FLAG_AI_CACHE.equals(arg)) {
235 1 1. parse : Changed increment from 1 to -1 → TIMED_OUT
                aiCacheFile = Paths.get(nextArg(args, ++i, arg));
236
                continue;
237
            }
238 2 1. parse : removed conditional - replaced equality check with true → KILLED
2. parse : removed conditional - replaced equality check with false → KILLED
            if (FLAG_AI_CACHE_OUT.equals(arg)) {
239 1 1. parse : Changed increment from 1 to -1 → TIMED_OUT
                aiCacheOut = Paths.get(nextArg(args, ++i, arg));
240
                continue;
241
            }
242 2 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with true → KILLED
            if (FLAG_AI_CWE.equals(arg)) {
243
                aiCwe = true;
244
                continue;
245
            }
246 2 1. parse : removed conditional - replaced equality check with false → KILLED
2. parse : removed conditional - replaced equality check with true → KILLED
            if (arg.startsWith("-ai")) {
247
                i = applyAiArg(arg, args, i, aiBuilder);
248
                continue;
249
            }
250
            switch (arg) {
251
                case "-plain" -> outputMode = OutputMode.PLAIN;
252
                case "-sarif" -> outputMode = OutputMode.SARIF;
253
                case "-json" -> outputMode = OutputMode.JSON;
254
                case "-github-annotations" -> outputMode = OutputMode.GITHUB_ANNOTATIONS;
255
                case "-apply-tags" -> applyTags = true;
256 1 1. parse : Changed increment from 1 to -1 → KILLED
                case FLAG_APPLY_TAGS_FROM_CSV -> applyTagsFromCsvFile = Paths.get(nextArg(args, ++i, arg));
257
                case FLAG_PROMOTE_AI -> promoteAi = true;
258 1 1. parse : Changed increment from 1 to -1 → KILLED
                case FLAG_MISMATCH_LIMIT -> mismatchLimit = Integer.parseInt(nextArg(args, ++i, arg));
259
                case "-content-hash" -> contentHash = true;
260
                case "-redact-comments" -> aiBuilder.redactComments(true);
261 1 1. parse : Changed increment from 1 to -1 → TIMED_OUT
                case FLAG_CONFIG -> i++; // value already consumed in pre-scan; skip here
262
                case "-file-suffix" -> {
263 2 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with true → KILLED
                    if (!cliFileSuffixSet) {
264
                        // First CLI -file-suffix replaces YAML defaults
265
                        fileSuffixes.clear();
266
                        cliFileSuffixSet = true;
267
                    }
268 1 1. parse : Changed increment from 1 to -1 → KILLED
                    fileSuffixes.add(nextArg(args, ++i, arg));
269
                }
270 1 1. parse : Changed increment from 1 to -1 → KILLED
                case "-test-marker", "-test-annotation" -> testMarkers.add(nextArg(args, ++i, arg));
271
                case "-property" -> {
272 1 1. parse : Changed increment from 1 to -1 → KILLED
                    String kv = nextArg(args, ++i, arg);
273
                    int eq = kv.indexOf('=');
274 3 1. parse : changed conditional boundary → SURVIVED
2. parse : removed conditional - replaced comparison check with false → KILLED
3. parse : removed conditional - replaced comparison check with true → KILLED
                    if (eq < 0) {
275
                        throw new IllegalArgumentException(
276
                                "Invalid -property value: '" + kv + "'; expected key=value format");
277
                    }
278 2 1. lambda$parse$1 : replaced return value with Collections.emptyList for org/egothor/methodatlas/CliArgs::lambda$parse$1 → KILLED
2. parse : Replaced integer addition with subtraction → KILLED
                    properties.computeIfAbsent(kv.substring(0, eq), k -> new ArrayList<>()) // NOPMD - one list per unique key, not per iteration
279
                            .add(kv.substring(eq + 1));
280
                }
281
                case "-emit-metadata" -> emitMetadata = true;
282
                case "-security-only" -> securityOnly = true;
283
                case FLAG_INCLUDE_NON_SECURITY -> includeNonSecurity = true;
284
                case FLAG_SARIF_OMIT_SCORES -> sarifOmitScores = true;
285
                case FLAG_DRIFT_DETECT -> driftDetect = true;
286
                case FLAG_EMIT_SOURCE_ROOT -> emitSourceRoot = true;
287
                case "-verbose" -> verbose = true;
288
                case FLAG_PARALLEL_AI -> parallelAi = true;
289
                case FLAG_GAP_REPORT -> gapReport = true;
290
                case FLAG_GAP_REPORT_FILE -> {
291 1 1. parse : Changed increment from 1 to -1 → NO_COVERAGE
                    String value = nextArg(args, ++i, arg);
292 2 1. parse : removed conditional - replaced equality check with true → NO_COVERAGE
2. parse : removed conditional - replaced equality check with false → NO_COVERAGE
                    if (value.isBlank()) {
293
                        throw new IllegalArgumentException("-gap-report-file path must not be blank");
294
                    }
295
                    gapReportFile = Paths.get(value);
296
                }
297
                case FLAG_EVIDENCE_REPORT -> evidenceReport = true;
298
                case FLAG_EVIDENCE_REPORT_FILE -> {
299 1 1. parse : Changed increment from 1 to -1 → NO_COVERAGE
                    String value = nextArg(args, ++i, arg);
300 2 1. parse : removed conditional - replaced equality check with true → NO_COVERAGE
2. parse : removed conditional - replaced equality check with false → NO_COVERAGE
                    if (value.isBlank()) {
301
                        throw new IllegalArgumentException(
302
                                "-evidence-report-file path must not be blank");
303
                    }
304
                    evidenceReportFile = Paths.get(value);
305
                }
306
                case FLAG_ATTEST -> attest = true;
307
                case FLAG_ATTEST_FILE -> {
308 1 1. parse : Changed increment from 1 to -1 → NO_COVERAGE
                    String value = nextArg(args, ++i, arg);
309 2 1. parse : removed conditional - replaced equality check with false → NO_COVERAGE
2. parse : removed conditional - replaced equality check with true → NO_COVERAGE
                    if (value.isBlank()) {
310
                        throw new IllegalArgumentException("-attest-file path must not be blank");
311
                    }
312
                    attestFile = Paths.get(value);
313
                }
314 1 1. parse : Changed increment from 1 to -1 → KILLED
                case FLAG_MIN_CONFIDENCE -> minConfidence = parseConfidenceThreshold(nextArg(args, ++i, arg));
315 1 1. parse : Changed increment from 1 to -1 → KILLED
                case "-override-file" -> overrideFilePath = Paths.get(nextArg(args, ++i, arg));
316
                case FLAG_EMIT_RECEIPT -> emitReceipt = true;
317
                case FLAG_RECEIPT_FILE -> {
318 1 1. parse : Changed increment from 1 to -1 → KILLED
                    String value = nextArg(args, ++i, arg);
319 2 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with true → KILLED
                    if (value.isBlank()) {
320
                        throw new IllegalArgumentException(
321
                                "-receipt-file path must not be blank");
322
                    }
323
                    receiptFile = Paths.get(value);
324
                }
325
                case FLAG_EMIT_COVERAGE -> emitCoverage = true;
326
                case FLAG_COVERAGE_FILE -> {
327 1 1. parse : Changed increment from 1 to -1 → KILLED
                    String value = nextArg(args, ++i, arg);
328 2 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with true → KILLED
                    if (value.isBlank()) {
329
                        throw new IllegalArgumentException(
330
                                "-coverage-file path must not be blank");
331
                    }
332
                    coverageFile = Paths.get(value);
333
                }
334
                case FLAG_COVERAGE_MAPPING -> {
335 1 1. parse : Changed increment from 1 to -1 → TIMED_OUT
                    String value = nextArg(args, ++i, arg);
336 2 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with true → KILLED
                    if (value.isBlank()) {
337
                        throw new IllegalArgumentException(
338
                                "-coverage-mapping path must not be blank");
339
                    }
340
                    coverageMappingFile = Paths.get(value);
341
                }
342 1 1. parse : Changed increment from 1 to -1 → NO_COVERAGE
                case FLAG_EVIDENCE_PACK -> evidencePackFramework = nextArg(args, ++i, arg);
343 1 1. parse : Changed increment from 1 to -1 → NO_COVERAGE
                case FLAG_EVIDENCE_PACK_DIR -> evidencePackDir = Paths.get(nextArg(args, ++i, arg));
344
                case FLAG_EVIDENCE_PACK_OVERWRITE -> evidencePackOverwrite = true;
345
                case FLAG_EVIDENCE_PACK_KEYRING ->
346 1 1. parse : Changed increment from 1 to -1 → NO_COVERAGE
                    evidencePackKeyringFile = Paths.get(nextArg(args, ++i, arg));
347 1 1. parse : Changed increment from 1 to -1 → NO_COVERAGE
                case FLAG_EVIDENCE_PACK_KEYRING_ENV -> evidencePackKeyringEnv = nextArg(args, ++i, arg);
348
                case FLAG_EVIDENCE_PACK_KEYRING_PASSWORD_FILE ->
349 1 1. parse : Changed increment from 1 to -1 → NO_COVERAGE
                    evidencePackPasswordFile = Paths.get(nextArg(args, ++i, arg));
350
                case FLAG_EVIDENCE_PACK_KEYRING_PASSWORD_ENV ->
351 1 1. parse : Changed increment from 1 to -1 → NO_COVERAGE
                    evidencePackPasswordEnv = nextArg(args, ++i, arg);
352 1 1. parse : Changed increment from 1 to -1 → NO_COVERAGE
                case FLAG_EVIDENCE_PACK_KEY_ALIAS -> evidencePackKeyAlias = nextArg(args, ++i, arg);
353 1 1. parse : Changed increment from 1 to -1 → NO_COVERAGE
                case FLAG_EVIDENCE_PACK_SIGN_ALGO -> evidencePackSignAlgo = nextArg(args, ++i, arg);
354
                case FLAG_DETECT_SECRETS -> detectSecrets = true;
355 1 1. parse : Changed increment from 1 to -1 → TIMED_OUT
                case FLAG_SECRETS_INCLUDE -> secretsInclude = nextArg(args, ++i, arg);
356 1 1. parse : Changed increment from 1 to -1 → NO_COVERAGE
                case FLAG_SECRETS_RULES -> secretsRules = Paths.get(nextArg(args, ++i, arg));
357 1 1. parse : Changed increment from 1 to -1 → TIMED_OUT
                case FLAG_SECRETS_OUT -> secretsOut = Paths.get(nextArg(args, ++i, arg));
358
                case FLAG_SECRETS_SEPARATE_LLM -> secretsSeparateLlm = true;
359
                case FLAG_SECRETS_SHOW_VALUES -> secretsShowValues = true;
360
                case FLAG_SECRETS_ERROR_THRESHOLD ->
361 1 1. parse : Changed increment from 1 to -1 → KILLED
                    secretsErrorThreshold = Double.parseDouble(nextArg(args, ++i, arg));
362
                case FLAG_SECRETS_WARNING_THRESHOLD ->
363 1 1. parse : Changed increment from 1 to -1 → TIMED_OUT
                    secretsWarningThreshold = Double.parseDouble(nextArg(args, ++i, arg));
364
                case FLAG_SECRETS_MIN_SCORE ->
365 1 1. parse : Changed increment from 1 to -1 → TIMED_OUT
                    secretsMinScore = Double.parseDouble(nextArg(args, ++i, arg));
366 1 1. parse : Changed increment from 1 to -1 → NO_COVERAGE
                case FLAG_CLASSIFICATION_PROMPT -> classificationPromptFile = Paths.get(nextArg(args, ++i, arg));
367 1 1. parse : Changed increment from 1 to -1 → NO_COVERAGE
                case FLAG_TRIAGE_PROMPT -> triagePromptFile = Paths.get(nextArg(args, ++i, arg));
368
                case FLAG_DEDICATED_TRIAGE_PROMPT ->
369 1 1. parse : Changed increment from 1 to -1 → NO_COVERAGE
                    dedicatedTriagePromptFile = Paths.get(nextArg(args, ++i, arg));
370
                case "-manual-prepare" -> {
371 1 1. parse : Changed increment from 1 to -1 → KILLED
                    manualWorkDir = nextArg(args, ++i, arg);
372 1 1. parse : Changed increment from 1 to -1 → KILLED
                    manualResponseDir = nextArg(args, ++i, arg);
373
                    manualIsConsume = false;
374
                }
375
                case "-manual-consume" -> {
376 1 1. parse : Changed increment from 1 to -1 → KILLED
                    manualWorkDir = nextArg(args, ++i, arg);
377 1 1. parse : Changed increment from 1 to -1 → KILLED
                    manualResponseDir = nextArg(args, ++i, arg);
378
                    manualIsConsume = true;
379
                }
380
                default -> {
381 2 1. parse : removed conditional - replaced equality check with true → KILLED
2. parse : removed conditional - replaced equality check with false → KILLED
                    if (arg.startsWith("-")) {
382
                        throw new IllegalArgumentException("Unknown argument: " + arg);
383
                    }
384
                    paths.add(Paths.get(arg));
385
                }
386
            }
387
        }
388
389
        ManualMode manualMode = null;
390 2 1. parse : removed conditional - replaced equality check with false → KILLED
2. parse : removed conditional - replaced equality check with true → KILLED
        if (manualWorkDir != null) {
391
            Path workDir = Paths.get(manualWorkDir);
392
            Path responseDir = Paths.get(manualResponseDir);
393 2 1. parse : removed conditional - replaced equality check with true → KILLED
2. parse : removed conditional - replaced equality check with false → KILLED
            manualMode = manualIsConsume
394
                    ? new ManualMode.Consume(workDir, responseDir)
395
                    : new ManualMode.Prepare(workDir, responseDir);
396
        }
397
398
        // SARIF is consumed by security tooling that expects findings, not a full
399
        // test inventory. Apply the security-only filter implicitly unless the
400
        // caller has explicitly opted in to the full-inventory form.
401 4 1. parse : removed conditional - replaced equality check with true → KILLED
2. parse : removed conditional - replaced equality check with false → KILLED
3. parse : removed conditional - replaced equality check with true → KILLED
4. parse : removed conditional - replaced equality check with false → KILLED
        if (outputMode == OutputMode.SARIF && !includeNonSecurity) {
402
            securityOnly = true;
403
        }
404
405
        // Coverage mode requires a user-authored mapping file; the tool ships no
406
        // built-in mapping. Reject the request with a structured stderr message
407
        // pointing at the reference template; the caller (MethodAtlasApp) maps
408
        // the null return value to exit code 2.
409 4 1. parse : removed conditional - replaced equality check with false → KILLED
2. parse : removed conditional - replaced equality check with true → KILLED
3. parse : removed conditional - replaced equality check with false → KILLED
4. parse : removed conditional - replaced equality check with true → KILLED
        if (emitCoverage && coverageMappingFile == null) {
410
            System.err.println("Error: -emit-coverage requires -coverage-mapping <path>.");
411
            System.err.println("A reference template and authoring guide are available at:");
412
            System.err.println("  docs/examples/asvs4-mapping.json");
413
            System.err.println("  docs/usage-modes/control-coverage.md");
414
            return null;
415
        }
416
417
        // Resolve and validate any prompt-template overrides, then hand the effective
418
        // set to the AI options so both prompt rendering and receipt hashing use it.
419
        aiBuilder.promptTemplates(
420
                resolvePromptTemplates(classificationPromptFile, triagePromptFile, dedicatedTriagePromptFile));
421
422 2 1. parse : removed conditional - replaced equality check with false → KILLED
2. parse : removed conditional - replaced equality check with true → KILLED
        List<String> resolvedSuffixes = fileSuffixes.isEmpty() ? List.of(DEFAULT_FILE_SUFFIX) : fileSuffixes;
423 2 1. parse : removed conditional - replaced equality check with false → SURVIVED
2. parse : removed conditional - replaced equality check with true → KILLED
        Set<String> resolvedMarkers = testMarkers.isEmpty() ? Set.of() : testMarkers;
424 1 1. parse : replaced return value with null for org/egothor/methodatlas/CliArgs::parse → KILLED
        return new CliConfig(outputMode, aiBuilder.build(), paths, resolvedSuffixes, resolvedMarkers,
425
                Map.copyOf(properties), emitMetadata, manualMode, applyTags, contentHash, overrideFilePath,
426
                securityOnly, aiCacheFile, driftDetect, applyTagsFromCsvFile, mismatchLimit, emitSourceRoot,
427
                sarifOmitScores, minConfidence, emitReceipt, receiptFile,
428
                emitCoverage, coverageFile, coverageMappingFile,
429
                evidencePackFramework, evidencePackDir,
430
                evidencePackOverwrite, evidencePackKeyringFile, evidencePackKeyringEnv,
431
                evidencePackPasswordFile, evidencePackPasswordEnv,
432
                evidencePackKeyAlias, evidencePackSignAlgo, verbose, promoteAi,
433
                detectSecrets, secretsInclude, secretsRules,
434
                secretsOut, secretsSeparateLlm, secretsShowValues,
435
                secretsErrorThreshold, secretsWarningThreshold, secretsMinScore,
436
                aiCacheOut, parallelAi, aiCwe,
437
                gapReport, gapReportFile,
438
                evidenceReport, evidenceReportFile,
439
                attest, attestFile);
440
    }
441
442
    // -------------------------------------------------------------------------
443
    // YAML config helpers
444
    // -------------------------------------------------------------------------
445
446
    /**
447
     * Pre-scans {@code args} for a {@code -config <file>} argument and loads the
448
     * YAML file if found.
449
     *
450
     * @param args raw command-line arguments
451
     * @return parsed YAML config, or {@code null} when no {@code -config} flag is
452
     *         present
453
     * @throws IllegalArgumentException if the config file cannot be read
454
     */
455
    private static YamlConfig.YamlConfigFile loadYamlConfigFromArgs(String... args) {
456 4 1. loadYamlConfigFromArgs : changed conditional boundary → SURVIVED
2. loadYamlConfigFromArgs : removed conditional - replaced comparison check with true → KILLED
3. loadYamlConfigFromArgs : removed conditional - replaced comparison check with false → KILLED
4. loadYamlConfigFromArgs : Replaced integer subtraction with addition → KILLED
        for (int i = 0; i < args.length - 1; i++) {
457 2 1. loadYamlConfigFromArgs : removed conditional - replaced equality check with true → KILLED
2. loadYamlConfigFromArgs : removed conditional - replaced equality check with false → KILLED
            if (FLAG_CONFIG.equals(args[i])) {
458 1 1. loadYamlConfigFromArgs : Replaced integer addition with subtraction → KILLED
                Path configPath = Paths.get(args[i + 1]);
459
                try {
460 1 1. loadYamlConfigFromArgs : replaced return value with null for org/egothor/methodatlas/CliArgs::loadYamlConfigFromArgs → KILLED
                    return YamlConfig.load(configPath);
461
                } catch (IOException e) {
462
                    throw new IllegalArgumentException("Cannot load config file: " + configPath, e);
463
                }
464
            }
465
        }
466
        return null;
467
    }
468
469
    /**
470
     * Derives the initial {@link OutputMode} from a loaded YAML config.
471
     *
472
     * @param yamlConfig YAML config, or {@code null}
473
     * @return resolved output mode; defaults to {@link OutputMode#CSV}
474
     */
475
    private static OutputMode resolveOutputModeFromYaml(YamlConfig.YamlConfigFile yamlConfig) {
476 4 1. resolveOutputModeFromYaml : removed conditional - replaced equality check with true → KILLED
2. resolveOutputModeFromYaml : removed conditional - replaced equality check with false → KILLED
3. resolveOutputModeFromYaml : removed conditional - replaced equality check with false → KILLED
4. resolveOutputModeFromYaml : removed conditional - replaced equality check with true → KILLED
        if (yamlConfig == null || yamlConfig.outputMode == null) {
477 1 1. resolveOutputModeFromYaml : replaced return value with null for org/egothor/methodatlas/CliArgs::resolveOutputModeFromYaml → KILLED
            return OutputMode.CSV;
478
        }
479 1 1. resolveOutputModeFromYaml : replaced return value with null for org/egothor/methodatlas/CliArgs::resolveOutputModeFromYaml → KILLED
        return switch (yamlConfig.outputMode.toLowerCase(Locale.ROOT)) {
480
            case "plain" -> OutputMode.PLAIN;
481
            case "sarif" -> OutputMode.SARIF;
482
            case "json" -> OutputMode.JSON;
483
            default -> OutputMode.CSV;
484
        };
485
    }
486
487
    /**
488
     * Seeds the AI options builder from YAML configuration values.
489
     *
490
     * @param builder   AI options builder to update
491
     * @param aiConfig  AI section of the YAML config; never {@code null}
492
     */
493
    @SuppressWarnings("PMD.NPathComplexity")
494
    private static void applyYamlAiConfig(AiOptions.Builder builder, YamlConfig.YamlAiConfig aiConfig) {
495 2 1. applyYamlAiConfig : removed conditional - replaced equality check with false → KILLED
2. applyYamlAiConfig : removed conditional - replaced equality check with true → KILLED
        if (Boolean.TRUE.equals(aiConfig.enabled)) {
496
            builder.enabled(true);
497
        }
498 2 1. applyYamlAiConfig : removed conditional - replaced equality check with false → KILLED
2. applyYamlAiConfig : removed conditional - replaced equality check with true → KILLED
        if (aiConfig.provider != null) {
499
            builder.provider(AiProvider.valueOf(aiConfig.provider.toUpperCase(Locale.ROOT)));
500
        }
501 2 1. applyYamlAiConfig : removed conditional - replaced equality check with false → KILLED
2. applyYamlAiConfig : removed conditional - replaced equality check with true → KILLED
        if (aiConfig.model != null) {
502
            builder.modelName(aiConfig.model);
503
        }
504 2 1. applyYamlAiConfig : removed conditional - replaced equality check with true → SURVIVED
2. applyYamlAiConfig : removed conditional - replaced equality check with false → KILLED
        if (aiConfig.baseUrl != null) {
505
            builder.baseUrl(aiConfig.baseUrl);
506
        }
507 2 1. applyYamlAiConfig : removed conditional - replaced equality check with true → SURVIVED
2. applyYamlAiConfig : removed conditional - replaced equality check with false → KILLED
        if (aiConfig.apiKey != null) {
508
            builder.apiKey(aiConfig.apiKey);
509
        }
510 2 1. applyYamlAiConfig : removed conditional - replaced equality check with true → SURVIVED
2. applyYamlAiConfig : removed conditional - replaced equality check with false → KILLED
        if (aiConfig.apiKeyEnv != null) {
511
            builder.apiKeyEnv(aiConfig.apiKeyEnv);
512
        }
513 2 1. applyYamlAiConfig : removed conditional - replaced equality check with false → KILLED
2. applyYamlAiConfig : removed conditional - replaced equality check with true → KILLED
        if (aiConfig.taxonomyFile != null) {
514
            builder.taxonomyFile(Paths.get(aiConfig.taxonomyFile));
515
        }
516 2 1. applyYamlAiConfig : removed conditional - replaced equality check with false → KILLED
2. applyYamlAiConfig : removed conditional - replaced equality check with true → KILLED
        if (aiConfig.taxonomyMode != null) {
517
            builder.taxonomyMode(
518
                    AiOptions.TaxonomyMode.valueOf(aiConfig.taxonomyMode.toUpperCase(Locale.ROOT)));
519
        }
520 2 1. applyYamlAiConfig : removed conditional - replaced equality check with false → KILLED
2. applyYamlAiConfig : removed conditional - replaced equality check with true → KILLED
        if (aiConfig.maxClassChars != null) {
521
            builder.maxClassChars(aiConfig.maxClassChars);
522
        }
523 2 1. applyYamlAiConfig : removed conditional - replaced equality check with false → KILLED
2. applyYamlAiConfig : removed conditional - replaced equality check with true → KILLED
        if (aiConfig.timeoutSec != null) {
524
            builder.timeout(Duration.ofSeconds(aiConfig.timeoutSec));
525
        }
526 2 1. applyYamlAiConfig : removed conditional - replaced equality check with false → KILLED
2. applyYamlAiConfig : removed conditional - replaced equality check with true → KILLED
        if (aiConfig.maxRetries != null) {
527
            builder.maxRetries(aiConfig.maxRetries);
528
        }
529 2 1. applyYamlAiConfig : removed conditional - replaced equality check with false → KILLED
2. applyYamlAiConfig : removed conditional - replaced equality check with true → KILLED
        if (Boolean.TRUE.equals(aiConfig.confidence)) {
530
            builder.confidence(true);
531
        }
532 2 1. applyYamlAiConfig : removed conditional - replaced equality check with false → KILLED
2. applyYamlAiConfig : removed conditional - replaced equality check with true → KILLED
        if (Boolean.TRUE.equals(aiConfig.redactComments)) {
533
            builder.redactComments(true);
534
        }
535 2 1. applyYamlAiConfig : removed conditional - replaced equality check with false → SURVIVED
2. applyYamlAiConfig : removed conditional - replaced equality check with true → KILLED
        if (aiConfig.apiVersion != null) {
536
            builder.apiVersion(aiConfig.apiVersion);
537
        }
538
    }
539
540
    /**
541
     * Reads an AI prompt-template override path from the YAML config, if present.
542
     *
543
     * @param yamlConfig loaded YAML config, or {@code null}
544
     * @param which      one of {@code "classification"}, {@code "triage"},
545
     *                   {@code "dedicatedTriage"}
546
     * @return the configured path, or {@code null} when unset
547
     */
548
    private static Path yamlAiPromptPath(YamlConfig.YamlConfigFile yamlConfig, String which) {
549 4 1. yamlAiPromptPath : removed conditional - replaced equality check with false → SURVIVED
2. yamlAiPromptPath : removed conditional - replaced equality check with true → SURVIVED
3. yamlAiPromptPath : removed conditional - replaced equality check with false → KILLED
4. yamlAiPromptPath : removed conditional - replaced equality check with true → KILLED
        if (yamlConfig == null || yamlConfig.ai == null) {
550
            return null;
551
        }
552
        String value = switch (which) {
553
            case "classification" -> yamlConfig.ai.classificationPrompt;
554
            case "triage" -> yamlConfig.ai.triagePrompt;
555
            case "dedicatedTriage" -> yamlConfig.ai.dedicatedTriagePrompt;
556
            default -> null;
557
        };
558 3 1. yamlAiPromptPath : removed conditional - replaced equality check with true → SURVIVED
2. yamlAiPromptPath : replaced return value with null for org/egothor/methodatlas/CliArgs::yamlAiPromptPath → SURVIVED
3. yamlAiPromptPath : removed conditional - replaced equality check with false → KILLED
        return value == null ? null : Paths.get(value);
559
    }
560
561
    /**
562
     * Builds the effective {@link PromptTemplateSet} from the built-in defaults plus
563
     * any operator overrides, validating each override fail-fast.
564
     *
565
     * @param classification  classification template file, or {@code null}
566
     * @param triageAppendix   folded triage-appendix template file, or {@code null}
567
     * @param dedicatedTriage standalone triage template file, or {@code null}
568
     * @return the resolved template set; never {@code null}
569
     * @throws IllegalArgumentException if an override file cannot be read or fails
570
     *                                  structural validation
571
     */
572
    private static PromptTemplateSet resolvePromptTemplates(Path classification, Path triageAppendix,
573
            Path dedicatedTriage) {
574
        PromptTemplateSet set = PromptTemplateSet.defaults();
575
        set = applyPromptOverride(set, PromptTemplateKind.CLASSIFICATION, classification);
576
        set = applyPromptOverride(set, PromptTemplateKind.TRIAGE_APPENDIX, triageAppendix);
577
        set = applyPromptOverride(set, PromptTemplateKind.DEDICATED_TRIAGE, dedicatedTriage);
578 1 1. resolvePromptTemplates : replaced return value with null for org/egothor/methodatlas/CliArgs::resolvePromptTemplates → KILLED
        return set;
579
    }
580
581
    /**
582
     * Loads, validates, and applies a single prompt-template override.
583
     *
584
     * @param set  the set to extend; must not be {@code null}
585
     * @param kind the kind the file overrides; must not be {@code null}
586
     * @param file the override file, or {@code null} to leave the kind unchanged
587
     * @return the (possibly extended) set; never {@code null}
588
     * @throws IllegalArgumentException if the file cannot be read or is invalid
589
     */
590
    private static PromptTemplateSet applyPromptOverride(PromptTemplateSet set, PromptTemplateKind kind, Path file) {
591 2 1. applyPromptOverride : removed conditional - replaced equality check with true → SURVIVED
2. applyPromptOverride : removed conditional - replaced equality check with false → KILLED
        if (file == null) {
592 1 1. applyPromptOverride : replaced return value with null for org/egothor/methodatlas/CliArgs::applyPromptOverride → KILLED
            return set;
593
        }
594
        String body;
595
        try {
596
            body = Files.readString(file);
597
        } catch (IOException e) {
598
            throw new IllegalArgumentException("Cannot read prompt template " + file + ": " + e.getMessage(), e);
599
        }
600
        try {
601
            PromptTemplateValidator.validateOrThrow(kind, body, file.toString());
602
        } catch (PromptTemplateException e) {
603
            throw new IllegalArgumentException(e.getMessage(), e);
604
        }
605 1 1. applyPromptOverride : replaced return value with null for org/egothor/methodatlas/CliArgs::applyPromptOverride → NO_COVERAGE
        return set.with(kind, body);
606
    }
607
608
    // -------------------------------------------------------------------------
609
    // AI argument helper
610
    // -------------------------------------------------------------------------
611
612
    /**
613
     * Applies a single AI-related command-line argument to the builder.
614
     *
615
     * <p>
616
     * Handles all {@code -ai*} flags. Returns the updated argument index so
617
     * the caller's loop counter stays consistent when the flag consumes an
618
     * additional value token.
619
     * </p>
620
     *
621
     * @param arg     the flag token being processed
622
     * @param args    full argument array
623
     * @param i       current position in {@code args}
624
     * @param builder AI options builder to update
625
     * @return updated value of {@code i} after consuming any argument value
626
     * @throws IllegalArgumentException if a required value token is missing or
627
     *                                  the flag is unrecognised
628
     */
629
    private static int applyAiArg(String arg, String[] args, int i, AiOptions.Builder builder) {
630
        int idx = i;
631
        switch (arg) {
632
            case "-ai" -> builder.enabled(true);
633
            case "-ai-confidence" -> builder.confidence(true);
634
            case "-ai-redact-comments" -> builder.redactComments(true);
635
            case "-ai-provider" ->
636 1 1. applyAiArg : Changed increment from 1 to -1 → KILLED
                builder.provider(AiProvider.valueOf(nextArg(args, ++idx, arg).toUpperCase(Locale.ROOT)));
637 1 1. applyAiArg : Changed increment from 1 to -1 → KILLED
            case "-ai-model" -> builder.modelName(nextArg(args, ++idx, arg));
638 1 1. applyAiArg : Changed increment from 1 to -1 → KILLED
            case "-ai-base-url" -> builder.baseUrl(nextArg(args, ++idx, arg));
639 1 1. applyAiArg : Changed increment from 1 to -1 → KILLED
            case "-ai-api-key" -> builder.apiKey(nextArg(args, ++idx, arg));
640 1 1. applyAiArg : Changed increment from 1 to -1 → KILLED
            case "-ai-api-key-env" -> builder.apiKeyEnv(nextArg(args, ++idx, arg));
641 1 1. applyAiArg : Changed increment from 1 to -1 → TIMED_OUT
            case "-ai-taxonomy" -> builder.taxonomyFile(Paths.get(nextArg(args, ++idx, arg)));
642
            case "-ai-taxonomy-mode" ->
643 1 1. applyAiArg : Changed increment from 1 to -1 → KILLED
                builder.taxonomyMode(
644
                        AiOptions.TaxonomyMode.valueOf(nextArg(args, ++idx, arg).toUpperCase(Locale.ROOT)));
645 1 1. applyAiArg : Changed increment from 1 to -1 → KILLED
            case "-ai-max-class-chars" -> builder.maxClassChars(Integer.parseInt(nextArg(args, ++idx, arg)));
646
            case "-ai-timeout-sec" ->
647 1 1. applyAiArg : Changed increment from 1 to -1 → KILLED
                builder.timeout(Duration.ofSeconds(Long.parseLong(nextArg(args, ++idx, arg))));
648 1 1. applyAiArg : Changed increment from 1 to -1 → KILLED
            case "-ai-max-retries" -> builder.maxRetries(Integer.parseInt(nextArg(args, ++idx, arg)));
649 1 1. applyAiArg : Changed increment from 1 to -1 → NO_COVERAGE
            case "-ai-api-version" -> builder.apiVersion(nextArg(args, ++idx, arg));
650
            default -> throw new IllegalArgumentException("Unknown AI argument: " + arg);
651
        }
652 1 1. applyAiArg : replaced int return with 0 for org/egothor/methodatlas/CliArgs::applyAiArg → TIMED_OUT
        return idx;
653
    }
654
655
    /**
656
     * Validates and parses the {@code -min-confidence} argument value.
657
     *
658
     * @param value raw string value from the command line
659
     * @return parsed confidence threshold in the range {@code [0.0, 1.0]}
660
     * @throws IllegalArgumentException if the value is outside {@code [0.0, 1.0]}
661
     */
662
    private static double parseConfidenceThreshold(String value) {
663
        double parsed = Double.parseDouble(value);
664 6 1. parseConfidenceThreshold : removed conditional - replaced comparison check with true → KILLED
2. parseConfidenceThreshold : removed conditional - replaced comparison check with false → KILLED
3. parseConfidenceThreshold : changed conditional boundary → KILLED
4. parseConfidenceThreshold : removed conditional - replaced comparison check with true → KILLED
5. parseConfidenceThreshold : removed conditional - replaced comparison check with false → KILLED
6. parseConfidenceThreshold : changed conditional boundary → KILLED
        if (parsed < 0.0 || parsed > 1.0) {
665
            throw new IllegalArgumentException(
666
                    "-min-confidence value must be between 0.0 and 1.0, got: " + parsed);
667
        }
668 1 1. parseConfidenceThreshold : replaced double return with 0.0d for org/egothor/methodatlas/CliArgs::parseConfidenceThreshold → KILLED
        return parsed;
669
    }
670
671
    /**
672
     * Returns the argument value following an option token.
673
     *
674
     * @param args   full command-line argument array
675
     * @param index  index of the expected option value
676
     * @param option option whose value is being retrieved
677
     * @return argument value at {@code index}
678
     * @throws IllegalArgumentException if {@code index} is outside the bounds of
679
     *                                  {@code args}
680
     */
681
    private static String nextArg(String[] args, int index, String option) {
682 3 1. nextArg : removed conditional - replaced comparison check with true → KILLED
2. nextArg : removed conditional - replaced comparison check with false → KILLED
3. nextArg : changed conditional boundary → KILLED
        if (index >= args.length) {
683
            throw new IllegalArgumentException("Missing value for " + option);
684
        }
685 1 1. nextArg : replaced return value with "" for org/egothor/methodatlas/CliArgs::nextArg → KILLED
        return args[index];
686
    }
687
}

Mutations

145

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

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

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

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

146

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

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

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

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

148

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

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

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

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

151

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

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

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

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

155

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

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

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

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

164

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

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

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

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

165

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

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

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

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

167

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

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

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

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

168

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

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

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

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

169

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

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

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

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

170

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

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

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

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

172

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

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

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

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

196

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

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

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

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

198

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

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

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

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

199

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

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

200

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

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

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

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

202

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

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

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

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

204

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

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

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

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

205

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

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

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

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

206

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

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

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

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

208

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

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

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

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

210

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

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

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

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

212

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

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

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

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

213

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

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

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

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

214

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

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

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

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

215

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

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

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

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

217

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

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

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

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

218

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

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

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

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

220

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

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

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

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

221

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

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

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

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

232

1.1
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_noProperty_emptyMap()]
removed conditional - replaced comparison check with true → KILLED

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

3.3
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_noProperty_emptyMap()]
changed conditional boundary → KILLED

234

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

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

235

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → TIMED_OUT

238

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

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

239

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → TIMED_OUT

242

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

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

246

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

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

256

1.1
Location : parse
Killed by : org.egothor.methodatlas.MethodAtlasAppApplyTagsFromCsvTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.MethodAtlasAppApplyTagsFromCsvTest]/[method:applyTagsFromCsv_emptyCsvReturnsZero(java.nio.file.Path)]
Changed increment from 1 to -1 → KILLED

258

1.1
Location : parse
Killed by : org.egothor.methodatlas.MethodAtlasAppApplyTagsFromCsvTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.MethodAtlasAppApplyTagsFromCsvTest]/[method:applyTagsFromCsv_mismatchLimitReturnsOne(java.nio.file.Path)]
Changed increment from 1 to -1 → KILLED

261

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → TIMED_OUT

263

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

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

268

1.1
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_fileSuffixMissingValue_throwsIllegalArgumentException()]
Changed increment from 1 to -1 → KILLED

270

1.1
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_testAnnotationAlias_sameAsTestMarker()]
Changed increment from 1 to -1 → KILLED

272

1.1
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_propertyMissingEquals_throwsException()]
Changed increment from 1 to -1 → KILLED

274

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

2.2
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_singleProperty_stored()]
removed conditional - replaced comparison check with true → KILLED

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

278

1.1
Location : lambda$parse$1
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_singleProperty_stored()]
replaced return value with Collections.emptyList for org/egothor/methodatlas/CliArgs::lambda$parse$1 → KILLED

2.2
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_singleProperty_stored()]
Replaced integer addition with subtraction → KILLED

291

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

292

1.1
Location : parse
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

2.2
Location : parse
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

299

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

300

1.1
Location : parse
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

2.2
Location : parse
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

308

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

309

1.1
Location : parse
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

2.2
Location : parse
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

314

1.1
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_minConfidenceBelowZero_throws()]
Changed increment from 1 to -1 → KILLED

315

1.1
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_overrideFileFlag_setsPath()]
Changed increment from 1 to -1 → KILLED

318

1.1
Location : parse
Killed by : org.egothor.methodatlas.MethodAtlasAppReceiptTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.MethodAtlasAppReceiptTest]/[method:absentFlag_doesNotWriteReceipt(java.nio.file.Path)]
Changed increment from 1 to -1 → KILLED

319

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

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

327

1.1
Location : parse
Killed by : org.egothor.methodatlas.MethodAtlasAppCoverageTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.MethodAtlasAppCoverageTest]/[method:absentFlag_doesNotWriteCoverageReport(java.nio.file.Path)]
Changed increment from 1 to -1 → KILLED

328

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

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

335

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → TIMED_OUT

336

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

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

342

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

343

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

346

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

347

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

349

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

351

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

352

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

353

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

355

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → TIMED_OUT

356

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

357

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → TIMED_OUT

361

1.1
Location : parse
Killed by : org.egothor.methodatlas.CliArgsCredentialsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsCredentialsTest]/[method:parsesThresholds()]
Changed increment from 1 to -1 → KILLED

363

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → TIMED_OUT

365

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → TIMED_OUT

366

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

367

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

369

1.1
Location : parse
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

371

1.1
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_manualPrepare_createsPrepareModeWithPaths()]
Changed increment from 1 to -1 → KILLED

372

1.1
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_manualPrepare_createsPrepareModeWithPaths()]
Changed increment from 1 to -1 → KILLED

376

1.1
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_manualConsume_createsConsumeModeWithPaths()]
Changed increment from 1 to -1 → KILLED

377

1.1
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_manualConsume_createsConsumeModeWithPaths()]
Changed increment from 1 to -1 → KILLED

381

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

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

390

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

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

393

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

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

401

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

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

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

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

409

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

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

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

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

422

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

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

423

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

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

424

1.1
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_noPromoteAi_defaultsFalse()]
replaced return value with null for org/egothor/methodatlas/CliArgs::parse → KILLED

456

1.1
Location : loadYamlConfigFromArgs
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_unknownAiFlag_throwsIllegalArgumentException()]
removed conditional - replaced comparison check with true → KILLED

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

3.3
Location : loadYamlConfigFromArgs
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_unknownAiFlag_throwsIllegalArgumentException()]
Replaced integer subtraction with addition → KILLED

4.4
Location : loadYamlConfigFromArgs
Killed by : none
changed conditional boundary → SURVIVED
Covering tests

457

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

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

458

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

460

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

476

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

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

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

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

477

1.1
Location : resolveOutputModeFromYaml
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_noArgs_returnsDefaults()]
replaced return value with null for org/egothor/methodatlas/CliArgs::resolveOutputModeFromYaml → KILLED

479

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

495

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

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

498

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

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

501

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

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

504

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

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

507

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

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

510

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

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

513

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

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

516

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

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

520

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

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

523

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

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

526

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

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

529

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

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

532

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

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

535

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

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

549

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

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

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

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

558

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

2.2
Location : yamlAiPromptPath
Killed by : none
replaced return value with null for org/egothor/methodatlas/CliArgs::yamlAiPromptPath → SURVIVED Covering tests

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

578

1.1
Location : resolvePromptTemplates
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_noPromoteAi_defaultsFalse()]
replaced return value with null for org/egothor/methodatlas/CliArgs::resolvePromptTemplates → KILLED

591

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

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

592

1.1
Location : applyPromptOverride
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_noPromoteAi_defaultsFalse()]
replaced return value with null for org/egothor/methodatlas/CliArgs::applyPromptOverride → KILLED

605

1.1
Location : applyPromptOverride
Killed by : none
replaced return value with null for org/egothor/methodatlas/CliArgs::applyPromptOverride → NO_COVERAGE

636

1.1
Location : applyAiArg
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_aiProviderAnthropicUppercase_setsProvider()]
Changed increment from 1 to -1 → KILLED

637

1.1
Location : applyAiArg
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_aiModelMissingValue_throwsIllegalArgumentException()]
Changed increment from 1 to -1 → KILLED

638

1.1
Location : applyAiArg
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_aiBaseUrl_setsBaseUrl()]
Changed increment from 1 to -1 → KILLED

639

1.1
Location : applyAiArg
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_aiApiKey_setsApiKey()]
Changed increment from 1 to -1 → KILLED

640

1.1
Location : applyAiArg
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_aiApiKeyEnv_setsApiKeyEnv()]
Changed increment from 1 to -1 → KILLED

641

1.1
Location : applyAiArg
Killed by : none
Changed increment from 1 to -1 → TIMED_OUT

643

1.1
Location : applyAiArg
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_aiTaxonomyMode_setsOptimized()]
Changed increment from 1 to -1 → KILLED

645

1.1
Location : applyAiArg
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_aiMaxClassChars_setsValue()]
Changed increment from 1 to -1 → KILLED

647

1.1
Location : applyAiArg
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_aiTimeoutSec_setsTimeout()]
Changed increment from 1 to -1 → KILLED

648

1.1
Location : applyAiArg
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_aiMaxRetries_setsMaxRetries()]
Changed increment from 1 to -1 → KILLED

649

1.1
Location : applyAiArg
Killed by : none
Changed increment from 1 to -1 → NO_COVERAGE

652

1.1
Location : applyAiArg
Killed by : none
replaced int return with 0 for org/egothor/methodatlas/CliArgs::applyAiArg → TIMED_OUT

664

1.1
Location : parseConfidenceThreshold
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_minConfidenceBelowZero_throws()]
removed conditional - replaced comparison check with true → KILLED

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

3.3
Location : parseConfidenceThreshold
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_minConfidenceZero_accepted()]
changed conditional boundary → KILLED

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

5.5
Location : parseConfidenceThreshold
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_minConfidenceAboveOne_throws()]
removed conditional - replaced comparison check with false → KILLED

6.6
Location : parseConfidenceThreshold
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_minConfidenceOne_accepted()]
changed conditional boundary → KILLED

668

1.1
Location : parseConfidenceThreshold
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_minConfidenceFlag_setsValue()]
replaced double return with 0.0d for org/egothor/methodatlas/CliArgs::parseConfidenceThreshold → KILLED

682

1.1
Location : nextArg
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_twoTestMarkers_bothPresent()]
removed conditional - replaced comparison check with true → KILLED

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

3.3
Location : nextArg
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_fileSuffixMissingValue_throwsIllegalArgumentException()]
changed conditional boundary → KILLED

685

1.1
Location : nextArg
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_twoTestMarkers_bothPresent()]
replaced return value with "" for org/egothor/methodatlas/CliArgs::nextArg → KILLED

Active mutators

Tests examined


Report generated by PIT 1.30.1 support