Selectivity Reduces Failing Inputs and Records Every Candidate Check
A useful bug report often begins with an unhelpfully large attachment. The program fails on a particular export, configuration bundle or text file, but nobody knows which part matters. Selectivity automates the patient part of that investigation: remove some material, run a command that recognizes the target behavior, and keep the smaller input when the same behavior survives. The first release handles lines in a file and whole files in a directory, with an optional pass over the lines inside the remaining files.
The command is the authority. It returns 0 when the behavior of interest is present, 1 when it is absent, and another exit when the candidate cannot be evaluated. That last distinction is essential. Deleting a header might replace a crash with a syntax error, which tells us very little about the original bug. Selectivity treats unresolved outcomes and timeouts conservatively, keeping the earlier input rather than accepting an ambiguous deletion.
Each observation starts from a fresh disposable copy. The source stays outside the reduction workspace, and changes the predicate makes to its copy do not become the saved reproducer. Every candidate check gets an audit entry containing the candidate digest, removed units and observations. The latest accepted input is saved as a checkpoint, with a JSON summary and an HTML report beside it. There is something reassuring about being able to inspect the failed attempts too; the final small file alone does not tell the whole story.
Selectivity defaults to three observations per candidate, a five-second timeout for each execution and a total budget of 10000 executions. It checks the original before reduction and repeats the predicate against the final result. An interrupted or budget-limited run leaves an incomplete checkpoint, clearly marked. A completed run can establish local deletion minimality under its configured observations, which is a narrower claim than finding the smallest possible reproducer.
The implementation is a single Go executable, released under Apache 2.0. Linux, macOS and Windows archives are on the download page, and the quick start shows the predicate contract in use. The project does not need a hosted service or an AI account. It needs a trustworthy command that can recognize the behavior you want to keep.