config-drift-checker · komo-stack · mutation test
9 stayed green under a case that claims them. 2 did not run (budget).
Each mutant is one small sabotage of a temp copy of the setup: a deleted or inverted rule, a blurred skill trigger, a removed skill or a disabled hook. A good suite goes red on every one.
A case claims them, but it stayed green with the sabotage in place. Tighten its graders.
| result | operator | mutant | caught by | cost |
|---|---|---|---|---|
| missed | delete-rule | deleted rule 'Explicit constructor injection only. Declare dependencies a…' from skills/spring-boot-conventions/SKILL.md delete-rule:skill/spring-boot-conventions/explicit-constructor-injection-only-declare-dependencies | spring-controller-follows-conventions 1.00 to 1.00 | $0.11 |
| missed | delete-rule | deleted rule 'Never use field injection (@Autowired on a field) and never…' from skills/spring-boot-conventions/SKILL.md delete-rule:skill/spring-boot-conventions/never-use-field-injection-autowired | spring-controller-follows-conventions 1.00 to 1.00 | $0.11 |
| missed | invert-rule heuristic | inverted rule 'Never use field injection (@Autowired on a field) and never…' in skills/spring-boot-conventions/SKILL.md ('Never' became 'Always') invert-rule:skill/spring-boot-conventions/never-use-field-injection-autowired | spring-controller-follows-conventions 1.00 to 1.00 | $0.11 |
| caught | delete-rule | deleted rule 'Request and response shapes are Java records, grouped in a…' from skills/spring-boot-conventions/SKILL.md delete-rule:skill/spring-boot-conventions/request-and-response-shapes-are-java | spring-request-dtos-are-validated-records 1.00 to 0.67 | $0.11 |
| missed | delete-rule | deleted rule 'Validate request bodies with jakarta.validation (@Valid, @N…' from skills/spring-boot-conventions/SKILL.md delete-rule:skill/spring-boot-conventions/validate-request-bodies-with-jakarta-validation | spring-request-dtos-are-validated-records 1.00 to 1.00 | $0.12 |
| missed | delete-rule | deleted rule '@RestController + @RequestMapping("/api/<area>"). Thin: par…' from skills/spring-boot-conventions/SKILL.md delete-rule:skill/spring-boot-conventions/restcontroller-requestmapping-api-area-thin-parse | spring-controller-follows-conventions 1.00 to 1.00 | $0.11 |
| caught | delete-rule | deleted rule 'Every response is wrapped: ApiResponse.ok(body) or ApiRespo…' from skills/spring-boot-conventions/SKILL.md delete-rule:skill/spring-boot-conventions/every-response-is-wrapped-apiresponse-ok | spring-controller-follows-conventions 1.00 to 0.83 | $0.11 |
| missed | invert-rule heuristic | inverted rule 'Every response is wrapped: ApiResponse.ok(body) or ApiRespo…' in skills/spring-boot-conventions/SKILL.md ('Never' became 'Always') invert-rule:skill/spring-boot-conventions/every-response-is-wrapped-apiresponse-ok | spring-controller-follows-conventions 1.00 to 1.00 | $0.11 |
| caught | delete-rule | deleted rule 'Pagination is 1-based page and size query params. Clamp: in…' from skills/spring-boot-conventions/SKILL.md delete-rule:skill/spring-boot-conventions/pagination-is-1-based-page | spring-controller-follows-conventions 1.00 to 0.67 | $0.11 |
| missed | delete-rule | deleted rule 'Business rules and authorization checks live in the service…' from skills/spring-boot-conventions/SKILL.md delete-rule:skill/spring-boot-conventions/business-rules-and-authorization-checks-live | spring-service-owns-rules-and-errors 1.00 to 1.00 | $0.16 |
| missed | delete-rule | deleted rule 'Services return records or small result types, never Map<St…' from skills/spring-boot-conventions/SKILL.md delete-rule:skill/spring-boot-conventions/services-return-records-or-small-result | spring-service-owns-rules-and-errors 1.00 to 1.00 | $0.13 |
| caught | invert-rule heuristic | inverted rule 'Services return records or small result types, never Map<St…' in skills/spring-boot-conventions/SKILL.md ('never' became 'always') invert-rule:skill/spring-boot-conventions/services-return-records-or-small-result | spring-service-owns-rules-and-errors 1.00 to 0.80 | $0.14 |
| caught | delete-rule | deleted rule 'Throw domain exceptions; a @RestControllerAdvice handler ma…' from skills/spring-boot-conventions/SKILL.md delete-rule:skill/spring-boot-conventions/throw-domain-exceptions-a-restcontrolleradvice-handler | spring-service-owns-rules-and-errors 1.00 to 0.80 | $0.15 |
| missed | invert-rule heuristic | inverted rule 'Throw domain exceptions; a @RestControllerAdvice handler ma…' in skills/spring-boot-conventions/SKILL.md ('Do not' became 'Do') invert-rule:skill/spring-boot-conventions/throw-domain-exceptions-a-restcontrolleradvice-handler | spring-service-owns-rules-and-errors 1.00 to 1.00 | $0.14 |
| caught | blur-trigger | blurred the trigger description of skill 'spring-boot-conventions' in skills/spring-boot-conventions/SKILL.md blur-trigger:skill/spring-boot-conventions | spring-service-owns-rules-and-errors 1.00 to 0.80 | $0.59 |
| not run | drop-skill | removed skill 'spring-boot-conventions' (skills/spring-boot-conventions/) entirely drop-skill:skill/spring-boot-conventions budget $3 spent before this mutant | ||
| not run | disable-hook | disabled hook PreToolUse on Bash (node ${CLAUDE_PLUGIN_ROOT}/hooks-handlers/guard.m…) in hooks/hooks.json disable-hook:hook/pretooluse-bash budget $3 spent before this mutant |
Scores are the mean over a case's runs with the setup loaded, against a reference run of the unmutated setup. Inverted rules are a word swap and can read oddly, so they are marked heuristic. Generated by config-drift-checker mutate.