The card said one column. The apply wrote two. A developer found a critical flaw in their open-source tool @hyuga/llm-safe-sql, which lets language models propose SQL updates that are executed in a transaction, measured, and rolled back for human approval. The bug caused the tool to verify only columns that changed, not all columns the statement writes, allowing a concurrent update to be silently overwritten. The issue also affected multi-row updates where rows already matching the target value were never checked. The developer fixed the logic to separate 'changed' columns from 'written' columns and added a guard for engines like PostgreSQL and SQLite that rewrite rows even when values are unchanged. I have been building a thing that lets a language model propose an UPDATE , then executes it for real inside a transaction, measures the actual before and after values, and always rolls back. A human reads the measurement and decides. Only then does anything commit. The pitch is one sentence: what you approve is not the model's description of its SQL, it is what the database did when the SQL ran. Last week I found that the thing showing you that measurement was showing you a subset of it, and had been since the first release. Real output, from @hyuga/llm-safe-sql@0.4.0 installed from npm. One row: name = 'Tanaka' , postcode = '00100' . UPDATE customers SET name='Sato', postcode='00100' WHERE id=1 What this touches customers — Customer records. The postcode is used for billing address and delivery. 1 row would change, across 1 column: name Measured by running the statement and rolling it back id = 1 name: 'Tanaka' - 'Sato' One row, one column. postcode is not mentioned, and that is correct — it is being assigned the value it already holds, so nothing about it changes. The card is describing the diff accurately. Approve it. Then, before it is applied, somebody else notices the postcode is wrong and fixes it: UPDATE customers SET postcode='90210' WHERE id=1; Now apply the approved plan: Applied: UPDATE on customers, 1 row s , at 2026-08-10T09:49:12.049Z. DB now: {"name":"Sato","postcode":"00100"} The fix is gone. Zero warnings. The word postcode never appeared on the approval card, never appeared in the audit record, and never appeared in the comparison the tool makes before it commits. The diff was built like this: js const changed: string = ; for const c of Object.keys before { if same before c , after c continue; // drop what did not move if auto.has lower c continue; // drop what the DB maintains itself changed.push c ; } That is a correct answer to "what should the card show". Showing postcode: would be noise, and worse than noise — it would be the card '00100' - '00100' claiming a change where there is none. The problem is that changed was also the list the apply iterated when it re-checked that nothing had moved since approval: js for const c of plan.changed { if same live c , plan.before c throw new ApplyRefused 'ROW CHANGED', … ; } postcode is not in changed , so it is not checked. And the statement writes it on every execution. A column that is written and never verified. "The set of columns that change" and "the set of columns the statement writes" are different sets, and I had used one name for both. SET x =