Build1 distinct publisher3 min readPublished
A sign convention chosen by the author sat on both sides of the invariant, so mutation testing could not reach it. Fifteen minutes with a real importer could.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
Look at what the two sides of that equality are made of. In IIF the block is double entry: the account line reads -150.00, the two category lines read 100.00 and 50.00, and the block sums to zero [5][6][1]. QIF records the same purchase from the account's point of view only, so the T line is -150.00 and the split lines are -100.00 and -50.00, which add up to the T line instead of cancelling it [7][2]. The converter therefore negates every split amount on the way across, which in the source is one character inside a template string [8]. The maintainer of qbofile, a browser based converter for the formats small business accounting runs on [1], is blunt about what that character is: a claim about how software they did not write reads a format they do not own [2][9].
No assertion built from the converter's own output can reach it. `sumOf(splits)` and `transaction.total` are both computed downstream of the convention [3], so inverting the convention inverts both, the difference is still zero, and the suite reports success [4].
The write-up then does the thing most people skip and mutates the code: minus sign deleted, four tests red, minus sign restored, all green [10]. That is worth having, because it rules out a vacuous assertion, which the author notes is a real failure mode [11]. It also establishes less than it feels like it establishes. A correct sign, flipped, goes red. An incorrect sign, flipped, also goes red [12]. The same observation follows from both hypotheses, so it eliminates neither of them [4].
What settled the question was a file built so the answer had to come from outside: one credit card account so the `!Type:CCard` header gets exercised, two separate split transactions, and one category fed by both of them, 100.00 from the first and 120.00 from the second [13]. That last choice is the load-bearing one. 220.00 appears in neither transaction on its own [3], so it cannot be produced by reading back what the generator just wrote; it only shows up if an importer parsed both blocks and got the sign right in both. GnuCash reported Office Supplies at 220.00, raised no warnings, did not complain that a split failed to balance, and brought the account in as a credit card [14]. Fifteen minutes, and the belief became a measurement [15].
The defect that mattered was never in the sign. Deciding which lines deserved an external check meant re-reading the whole chain, and the bug was sitting in it [16]. QIF has separate P and M fields for payee and memo, and IIF carries both, but the generator emitted only a P line, fed by a `description` field defined upstream as `MEMO || NAME` [17]. Every transaction carrying a memo shipped that memo as the payee and dropped the payee [18]: `PSUPPLIES RUN` in the output, COSTCO gone [19]. Nothing errors, the importing software has no way to know a field went missing, and neither does the person reading the register afterwards [20].
That is the failure mode a format converter exists to prevent, and by the author's own account they had built one [20]. It survived because the join between parser and generator was checked in the middle instead of at both ends; it was the second time that day the same assumption went unexamined, that a downstream generator can hold everything the upstream parser produces [21]. The rule written down afterwards is to open the field lists at both ends and diff them [22]. The write-up does not argue for external checks everywhere, and grants that most of the time the unit test genuinely is the last word [24]. The triage question is narrower than any coverage target: whether the line rests on a belief about someone else's software [23].
Ranked by verification strength, evidence, and original report placement.
The IIF example given is a $150 purchase split two ways: TRNS Amex Platinum -150.00, SPL Office Supplies 100.00, SPL Meals 50.00.
In IIF the entry is double entry: the account side is negative, the category side is positive, and the whole block sums to zero.
QIF takes the same event from the account's point of view only: T-150.00 with split lines $-100.00 and $-50.00, which sum to the T line rather than cancelling it.
The author maintains qbofile, a browser based converter for the file formats small business accounting runs on.
The conversion in question goes from IIF, used by QuickBooks Desktop since the 1990s, into QIF, which Quicken and GnuCash read.
The assertion relied on was assert.equal(sumOf(splits), transaction.total); both sides of that equation are produced by the author's own code, using a sign convention the author chose.
Follow any of these and your For You feed starts watching them — no settings page required.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Concrete and self-consistent, but single-author and unreplicated
The post supplies unusually checkable specifics for a personal write-up: the exact assertion, both file-format snippets whose arithmetic checks out, the one-line negation, the mutation result (four tests red, green on restore), a fixture design whose expected 220.00 cannot appear inside either transaction, and the observed GnuCash outcome plus before/after generator output. The reasoning about why mutation testing cannot discriminate the sign hypothesis is self-supporting logic. What caps the score is provenance: every factual step rests on one first-person account with no independent replication, no linked repo artifact in the supplied material, and no second importer tested.
No adoption data in the supplied source
The source discloses nothing about uptake: no user or download counts for qbofile, no indication how many files or transactions have passed through the IIF-to-QIF path, no other projects adopting the described practice, and no timeline for how long the payee/memo defect shipped. The two logged observations are the author's own interop check and his own fix, which are engineering events rather than evidence of adoption, so no adoption level can be measured without inference.
Deliberately deflationary relative to what it demonstrates
The framing runs against overstatement: the author downgrades his own green suite, states that his mutation experiment proved only non-vacuity, concedes that most assumptions cannot be run past real software and that the unit test is usually the last word, and invites contradiction from anyone with a disagreeing QIF importer. The demonstrated result is modest but real and the language stays inside it, which reads as slightly understated. The only pull the other way is generalising a fifteen-minute anecdote plus one recalled QuickBooks episode into a broad rule, which is why the value sits near zero rather than deeply negative.
Self-published maintainer post about his own project
The author is the maintainer of the tool under discussion and publishes on a developer platform where such posts build reputation and project visibility, and he points readers to the project's repo notes. That is a mild promotional incentive. Offsetting it, the post's substance is an admission of a shipped defect and of over-trusting his own tests, which is costly rather than flattering, and the supplied source shows no vendor sponsorship, no commercial offer, no pricing, and no comparative attack on a competitor.
Moderate: internally verifiable craft claims, single unreplicated source
Confidence is anchored by the fact that the core reasoning (self-referential invariant, mutation-testing blindness, format arithmetic) can be checked inside the text, and by the specificity of the code and output snippets. It is held down by the single-publisher, single-author cluster with no corroboration of the GnuCash behaviour, no adoption dimension at all, and no way to confirm the reported test counts or timings.
build
The importer said it worked, wrote nothing, and left two accounts behind1 distinct publisher
build
3,845 tests, 94.22% coverage, and nine things the suite could not see1 distinct publisher
build
Coverage at 80% was a price on human attention, and CI is the wrong place to charge it1 distinct publisher
build
Coverage Is A Line Counter, So A Coverage Gate Buys You Line-Counting Tests1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 24, 2026