Detection categories

Every category the engine knows. Categories live in the server's embedded corpus (global.yml), are loaded once at process start, and match against added lines of every diff.

Fixability is the contract slop apply honours:

Language-agnostic

CategoryFixabilityWhat it catches
self_congratsSafeDeleteLLM editorialising ("comprehensive", "robust", "production-ready")
fillerSafeDeleteWordy filler ("in order to", "at the end of the day")
prompt_leakSafeDeleteChat-turn residue leaked into source
ai_scaffoldingSafeDelete"Let me", "I'll now", first-person agent narration
hedgesSafeDelete"essentially", "arguably", filler that softens nothing
listySafeDeleteEssay scaffolding leaked from the model
co_authored_aiSafeDeleteAI co-authorship trailers committed to source
meta_referenceSafeDelete"see above", "used by X" that rot as code moves
narrative_openerSafeDelete"First", "Then" comments narrating code shape
ai_tellsTodoCompetitive / market framing words ("landscape", "tapestry")
template_placeholderTodo[Your name], [Insert price], <YOUR_…> left unfilled
defensive_crudTodoif x is None: x = None and friends
boolean_redundantTodoif foo == True
useless_promise_wrapTodonew Promise(resolve => resolve(x))
boundary_off_by_oneTodoLoop bound that looks inclusive/exclusive-swapped
catch_rethrowTodocatch (e) { throw e; }
null_check_redundantTodoOverlapping x !== null && x !== undefined
naming_slopTodotmp, data, result as the actual function name
branch_no_testTodoNew control-flow branch without a paired test
error_no_messageTodothrow new Error() with no string
unused_genericTodoGeneric type parameter declared but never used
double_cast_unknownTodoTS as unknown as T escape hatch
emoji_in_codeTodoEmoji in non-prose source
hardcoded_urlTodolocalhost, example.com, YOUR_… in source
hardcoded_idTodoUUID / API-key shaped literal pasted in
noop_console_logSafeDeleteconsole.log() with no argument
triple_negationSafeReplace!!!x
redundant_string_castSafeReplaceString(String(x))
todo_implementFlag// TODO: implement style markers
fixme_hack_xxx_commentTodoFIXME / HACK / XXX markers — fix or track

Python

CategoryFixabilityWhat it catches
python_mutable_defaultTododef f(x=[])
python_print_debugTodoprint(...) in non-test code
python_range_len_loopTodofor i in range(len(x))
python_pass_placeholderTododef foo(): pass body
python_ellipsis_placeholderTododef foo(): ... body
python_bare_exceptTodoexcept: with no exception class
python_empty_exceptTodoexcept X: pass
python_star_importTodofrom x import *
python_global_statementTodoglobal x inside a function

Rust

CategoryFixabilityWhat it catches
rust_non_test_unwrapTodo.unwrap() / .expect() outside #[cfg(test)]
rust_pub_no_docTodopub fn / struct / trait with no /// doc

C# / .NET

CategoryFixabilityWhat it catches
csharp_async_voidTodoasync void outside event handlers
csharp_task_blocking_getTodo.Result / .Wait() / .GetAwaiter().GetResult()
csharp_count_any_anti_patternTodo.Count() > 0 instead of .Any()
csharp_tolist_foreachTodo.ToList().ForEach(...)
csharp_throw_generic_exceptionTodothrow new Exception(...)
csharp_not_implementedFlagthrow new NotImplementedException()

SQL

CategoryFixabilityWhat it catches
sql_select_starTodoSELECT * FROM …
sql_where_1_eq_1SafeDeleteWHERE 1=1
sql_leading_wildcard_likeTodoLIKE '%foo%' (full-scan)
sql_destructive_no_whereFlagDELETE FROM x / UPDATE x SET … with no WHERE

Context gating

A category may declare itself ignored in certain contexts:

The full gating matrix is enforced inline in crates/slop-detector/src/lib.rs — search for is_in_test_ctx.