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

Mutations

135

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

136

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

138

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

141

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

142

1.1
Location : parse
Killed by : none
removed call to java/util/Map::forEach → NO_COVERAGE

145

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

146

1.1
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 call to org/egothor/methodatlas/CliArgs::applyYamlAiConfig → KILLED

154

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

155

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

157

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

158

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

159

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

160

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

162

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

184

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

186

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

187

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

188

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

190

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_configWithPromoteAiTrue_setsFlag(java.nio.file.Path)]
removed conditional - replaced equality check with true → KILLED

192

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

193

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

194

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

196

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

198

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

209

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

211

1.1
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

2.2
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

212

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

215

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

216

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

219

1.1
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

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 false → KILLED

223

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

229

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

231

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

233

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

235

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

237

1.1
Location : parse
Killed by : none
removed call to java/util/List::clear → SURVIVED
Covering tests

240

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

242

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

244

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

246

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

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

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

250

1.1
Location : parse
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_twoPropertiesSameKey_accumulate()]
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_twoPropertiesSameKey_accumulate()]
replaced return value with Collections.emptyList for org/egothor/methodatlas/CliArgs::lambda$parse$1 → KILLED

260

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

261

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

264

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

265

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

273

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

274

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

281

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

282

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

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

288

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

289

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

292

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

293

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

294

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

295

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

297

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

298

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

299

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

303

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

305

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

307

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

308

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

309

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

311

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

313

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

314

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

318

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

319

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

323

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

332

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

335

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

343

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_noArgs_returnsDefaults()]
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_sarifFlag_impliesSecurityOnly()]
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_sarifWithIncludeNonSecurity_disablesImplicitFilter()]
removed conditional - replaced equality check with true → KILLED

351

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

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

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

4.4
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

352

1.1
Location : parse
Killed by : org.egothor.methodatlas.MethodAtlasAppCoverageTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.MethodAtlasAppCoverageTest]/[method:emitCoverage_withoutMapping_exitsWithCodeTwoAndPrintsHelpfulError(java.nio.file.Path)]
removed call to java/io/PrintStream::println → KILLED

353

1.1
Location : parse
Killed by : none
removed call to java/io/PrintStream::println → SURVIVED
Covering tests

354

1.1
Location : parse
Killed by : none
removed call to java/io/PrintStream::println → SURVIVED
Covering tests

355

1.1
Location : parse
Killed by : none
removed call to java/io/PrintStream::println → SURVIVED
Covering tests

364

1.1
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

2.2
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

365

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

366

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

394

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

395

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

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

396

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

398

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

414

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_configWithPromoteAiTrue_setsFlag(java.nio.file.Path)]
removed conditional - replaced equality check with false → KILLED

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

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

415

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

417

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

2.2
Location : resolveOutputModeFromYaml
Killed by : org.egothor.methodatlas.CliArgsTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.CliArgsTest]/[method:parse_configWithValidYaml_appliesYamlValues(java.nio.file.Path)]
Changed switch default to be first case → KILLED

433

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

436

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

439

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

442

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

445

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

448

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

451

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

454

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

458

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

461

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

464

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

467

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

470

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

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

484

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

487

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

493

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

513

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

526

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

527

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

536

1.1
Location : applyPromptOverride
Killed by : none
removed call to org/egothor/methodatlas/ai/PromptTemplateValidator::validateOrThrow → NO_COVERAGE

540

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

566

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

570

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

571

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

572

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

573

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

574

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

575

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

577

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

579

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

581

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

582

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

583

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

586

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

598

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

602

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

616

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

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

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

619

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

Active mutators

Tests examined


Report generated by PIT 1.22.1