There should be a place (places due to RC vs. watchlist issue) on the backend where you can configure:
* What filters there are
* Whether they are available on new RC page, or both old and new.
* The default value (may be based on a preference, can vary by watchlist vs. RC, e.g. 'hideminor' vs. 'watchlisthideminor' preferences) (the default can vary for non-preference cases too)
* The actual modification this makes to the DB query
* Prioritization (where it appears in the filter list)
* Filters that imply/control other filters (e.g. if you select "Likely have problems", it should also find edits that are "Very likely have problems"). More information is at {T149452}. This includes (all separate cases even if the rendering happens to be the same):
** Auto-drop URL conflicts like {T151873}
** Cases where selecting one causes another to be grayed out, or a potential similar UI:
*** No effect between filters (e.g. likely/very likely).
*** Conflict: Only good-faith edits, log entries are grayed out.
* Mark groups that are full coverage (if you check everything, all entries are included). As opposed to things like 'Content type'.
This needs to extensible by extensions (we already have a need for this, e.g. ORES, Wikidata, Translate).
I suggest hooks would be a good option for extensibility, but @mooeypoo points out having extensions modify a wg could work.
Potentially pass in callbacks to a registration method, and disable if there are any missing (e.g. {T152797}).
In output for new rcfilters UI:
* If possible, backend converts 'all' to actual default values (e.g. comma-sep).
* Doesn't need to redirect 'all' URL, but would be nice if it's all *and* other stuff.
* Don't need to omit default: false.
** For send_unselected type, default: false means that this parameter is not active (e.g. for 'hideanons', default: false means anons are not hidden by default).
** For string type, default: false means that this parameter item is not active (e.g. for 'learner' of 'userExpLevel', default: false means 'learner' rows are not displayed by default).
* Numeric values (e.g. rcdays) to be solved later.
In output for old rcfilters UI, same except:
* Data attribute of filter name to hide/show link.
* Tag filter links with class for whether they exist in the new implementation.