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

Mutations

143

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

144

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

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 : 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

149

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

153

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

162

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

163

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

165

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

166

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

167

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

168

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

170

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

192

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

194

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

195

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

196

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

198

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

200

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

201

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

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 : 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

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 : 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

208

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

209

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

210

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

211

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

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 : 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

214

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

216

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

217

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

228

1.1
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_noArgs_minConfidenceDefaultsToZero()]
changed conditional boundary → 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_noArgs_minConfidenceDefaultsToZero()]
removed conditional - replaced comparison check with true → KILLED

230

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

231

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

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_hit_engineNotCalledForUnchangedClass(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 : 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_aiModelMissingValue_throwsIllegalArgumentException()]
removed conditional - replaced equality check with true → KILLED

242

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

252

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

254

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

257

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

259

1.1
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

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

264

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

266

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

268

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

270

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

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 : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_propertyMissingEquals_throwsException()]
removed conditional - replaced comparison check with false → KILLED

274

1.1
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

2.2
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

287

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

288

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

295

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

296

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

304

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

305

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

310

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

311

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

314

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

315

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

323

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

324

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

331

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

332

1.1
Location : parse
Killed by : org.egothor.methodatlas.MethodAtlasAppCoverageTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.MethodAtlasAppCoverageTest]/[method:emitCoverage_withMalformedMapping_exitsWithCodeTwo(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

338

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

339

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

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

344

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

345

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 → TIMED_OUT

348

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 → TIMED_OUT

353

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

355

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

357

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

358

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

359

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

361

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

363

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

364

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

368

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

369

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

373

1.1
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

2.2
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

382

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 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

385

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

393

1.1
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

2.2
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

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

401

1.1
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

2.2
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

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.MethodAtlasAppCoverageTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.MethodAtlasAppCoverageTest]/[method:coveragePercent_isInClosedZeroToHundredRange(java.nio.file.Path)]
removed conditional - replaced equality check with true → KILLED

414

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

415

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

416

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

447

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

448

1.1
Location : loadYamlConfigFromArgs
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_overrideFileFlag_setsPath()]
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

449

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

451

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

467

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_configWithOverrideFile_setsPath(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

468

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

470

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

486

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

489

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

492

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

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 : none
removed conditional - replaced equality check with true → SURVIVED
Covering tests

498

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

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 : none
removed conditional - replaced equality check with true → SURVIVED
Covering tests

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 : 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

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 : 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

511

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

514

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

517

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.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

526

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

540

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

549

1.1
Location : yamlAiPromptPath
Killed by : none
replaced return value with null for org/egothor/methodatlas/CliArgs::yamlAiPromptPath → 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_configWithAiEnabledFalseAndConfidenceFalse_doesNotActivate(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

569

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

582

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

583

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

596

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

627

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

628

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

629

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

630

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

631

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

632

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

634

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

636

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

638

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

639

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

640

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

643

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

655

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_minConfidenceZero_accepted()]
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_minConfidenceZero_accepted()]
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

659

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

673

1.1
Location : nextArg
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_overrideFileFlag_setsPath()]
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_aiModelMissingValue_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_aiModelMissingValue_throwsIllegalArgumentException()]
changed conditional boundary → KILLED

676

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

Active mutators

Tests examined


Report generated by PIT 1.30.1 support