<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on Selectivity.net</title>
    <link>https://selectivity.net/posts/</link>
    <description>Recent content in Posts on Selectivity.net</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 24 Oct 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://selectivity.net/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Selectivity Finds the Two CSV Records Behind a Calculation Bug</title>
      <link>https://selectivity.net/selectivity-finds-the-two-csv-records-behind-a-calculation-bug/</link>
      <pubDate>Sat, 24 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://selectivity.net/selectivity-finds-the-two-csv-records-behind-a-calculation-bug/</guid>
      <description>&lt;p&gt;A CSV importer can be wrong for a reason that disappears when a developer tests one record at a time. The example here needs a sequence: a discount for an order, followed later by a refund for that same order. A deliberately faulty importer deducts the refund twice when it has already seen a discount. A reference implementation deducts it once. The predicate compares the two results and asks Selectivity to preserve their disagreement.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Selectivity Isolates Numeric Precision Loss in JSON Lines</title>
      <link>https://selectivity.net/selectivity-isolates-numeric-precision-loss-in-json-lines/</link>
      <pubDate>Sat, 24 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://selectivity.net/selectivity-isolates-numeric-precision-loss-in-json-lines/</guid>
      <description>&lt;p&gt;An input can be perfectly valid and still expose a disagreement between two consumers. In this example, one path keeps an integer identifier exactly as parsed. The other deliberately sends the identifier through a floating-point conversion before turning it back into an integer. Most of the generated JSON Lines records produce the same answer. One does not: 9007199254740993 becomes 9007199254740992 in the lossy path.&lt;/p&gt;&#xA;&lt;p&gt;Selectivity starts with 150 independently valid records totaling 4144 bytes. The predicate parses every remaining line, checks its schema, then compares the exact identifier sequence with the lossy sequence. In one run of Selectivity 0.1.1 on Linux x86_64 with Python 3.12.14, the result is one 41-byte record. The reducer makes 36 predicate executions across 12 candidate checks, with three observations per candidate and a five-second timeout. There are no unresolved checks.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Selectivity Keeps a Useful Checkpoint When the Test Budget Runs Out</title>
      <link>https://selectivity.net/selectivity-keeps-a-useful-checkpoint-when-the-test-budget-runs-out/</link>
      <pubDate>Sat, 24 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://selectivity.net/selectivity-keeps-a-useful-checkpoint-when-the-test-budget-runs-out/</guid>
      <description>&lt;p&gt;A reduction can be useful before it is finished. That matters when the predicate is expensive, a CI job has a fixed allowance, or a developer wants to make a first pass without committing to thousands of executions. Selectivity&amp;rsquo;s execution budget puts a bound on how many predicate processes can start. Reaching that limit leaves an incomplete run and the latest accepted checkpoint, rather than silently promoting unfinished work to a completed result.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Selectivity Makes Large Bug Reports Easier to Understand</title>
      <link>https://selectivity.net/selectivity-makes-large-bug-reports-easier-to-understand/</link>
      <pubDate>Sat, 24 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://selectivity.net/selectivity-makes-large-bug-reports-easier-to-understand/</guid>
      <description>&lt;p&gt;A minimal reproducer is a small example that still demonstrates a problem. It gives the person investigating a bug less material to read and fewer irrelevant details to carry through each experiment. Getting there is often laborious. You remove a group of rows, rerun the program, discover that the failure has vanished, restore the rows and try a smaller group. It is useful work, just rather repetitive.&lt;/p&gt;&#xA;&lt;p&gt;Selectivity turns that routine into a search driven by a predicate. The predicate is a command that answers whether the particular behavior survives in the candidate input. Selectivity begins with larger deletions and works toward smaller ones when necessary. Each successful deletion becomes the new starting point. Eventually the engine reaches individual units, such as one line or one file, and checks whether removing any of them still preserves the predicate.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Selectivity Reduces a Configuration Bundle by Files and Lines</title>
      <link>https://selectivity.net/selectivity-reduces-a-configuration-bundle-by-files-and-lines/</link>
      <pubDate>Sat, 24 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://selectivity.net/selectivity-reduces-a-configuration-bundle-by-files-and-lines/</guid>
      <description>&lt;p&gt;The directory demonstration asks a slightly different question from the single-file example: can the reducer find both the relevant files and the relevant lines within them? The generated bundle starts with a.txt, nested/b.txt and junk.txt. The predicate needs alpha in the first file and omega in the nested file. Extra lines and the third file are unnecessary. It resembles a configuration bundle in shape, while remaining a generated text fixture with a known answer.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Selectivity Reduces a Generated File From 20000 Lines to Two</title>
      <link>https://selectivity.net/selectivity-reduces-a-generated-file-from-20000-lines-to-two/</link>
      <pubDate>Sat, 24 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://selectivity.net/selectivity-reduces-a-generated-file-from-20000-lines-to-two/</guid>
      <description>&lt;p&gt;The line-reduction demonstration starts with a deliberately oversized text file whose answer is known in advance. It has 20000 lines: alpha appears on line 702, omega on line 17891, and every other line contains an irrelevant row label. The predicate succeeds only when both trigger lines are present. This makes a useful check of the reducer, because a result that loses either trigger is wrong and a result that keeps unnecessary lines is visibly unfinished.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Selectivity Reduces Failing Inputs and Records Every Candidate Check</title>
      <link>https://selectivity.net/selectivity-reduces-failing-inputs-and-records-every-candidate-check/</link>
      <pubDate>Sat, 24 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://selectivity.net/selectivity-reduces-failing-inputs-and-records-every-candidate-check/</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Selectivity Takes Its Name From the Rule That Chooses What Survives</title>
      <link>https://selectivity.net/selectivity-takes-its-name-from-the-rule-that-chooses-what-survives/</link>
      <pubDate>Sat, 24 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://selectivity.net/selectivity-takes-its-name-from-the-rule-that-chooses-what-survives/</guid>
      <description>&lt;p&gt;Selectivity is named for the decision at the center of every reduction. Some parts of an input are necessary to preserve the behavior under investigation. Other parts can disappear. The engine discovers useful deletions by applying a rule supplied by the developer, over and over, to progressively smaller candidates.&lt;/p&gt;&#xA;&lt;p&gt;That rule is the predicate. It might recognize a specific crash, a disagreement between two parsers or a configuration combination that produces the wrong result. The same input can reduce differently under a different predicate, because a different question makes different material relevant. The name points to that dependence. Selectivity chooses what survives according to an explicit test.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Selectivity Tests Input Preservation and Uncertain Predicates</title>
      <link>https://selectivity.net/selectivity-tests-input-preservation-and-uncertain-predicates/</link>
      <pubDate>Sat, 24 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://selectivity.net/selectivity-tests-input-preservation-and-uncertain-predicates/</guid>
      <description>&lt;p&gt;The central promise of a reducer is easy to state and surprisingly easy to weaken: the saved input should be smaller, while still satisfying the behavior being investigated. Testing only a successful reduction would miss several ways that promise can go wrong. Selectivity&amp;rsquo;s verification therefore checks the copies and the evidence around the search, alongside the search itself.&lt;/p&gt;&#xA;&lt;p&gt;The automated tests cover line reduction, directory file removal and the optional line pass inside directory files. They also check empty input, raw line-ending preservation and files without a final newline. One predicate deliberately overwrites its disposable input. The saved result must still contain the accepted snapshot bytes, and the source must retain its original contents. A permissions test uses a restrictive creation mask to confirm that the copy restores the modeled file permissions explicitly.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
