{"site":{"name":"Koji","description":"AI-native customer research platform that helps teams conduct, analyze, and synthesize customer interviews at scale.","url":"https://www.koji.so","contentTypes":["blog","documentation"],"lastUpdated":"2026-08-24T22:55:44.741Z"},"content":[{"type":"documentation","id":"a2fe8f9a-7a5c-4d9a-87d5-b2ae8f5c8ee5","slug":"cell-suppression-differencing-attack-research-reports","title":"The Differencing Attack: Why Suppressing the Small Segment Publishes It (2026)","url":"https://www.koji.so/docs/cell-suppression-differencing-attack-research-reports","summary":"Suppressing a sensitive table cell while publishing marginal totals lets a reader recover it exactly by subtraction; statistical agencies call the remedy complementary suppression and warn it is hard to guarantee manually. The dashboard form is worse: two filtered views differing by one respondent disclose that respondent, and rounding to one decimal place still pinned a single 0-10 score to exactly 6 in the worked example. Defences are a frozen segment grid, bands instead of point estimates, never publishing a set alongside its near-complement, and a minimum-difference review rule.","content":"**TL;DR:** The standard fix for a too-small segment - hide the cell, publish the totals - usually publishes the cell. If a row shows a total of 13 and two of its three cells are visible at 7 and 4, the hidden cell is 2, exactly, by subtraction. Statistical agencies have known this since the 1970s and call the fix *complementary suppression*: you must also blank cells that were never sensitive, in every row and column the sensitive cell touches. The same arithmetic works on dashboards, where two filtered views one respondent apart disclose that respondent's answer - and rounding to one decimal place does not save you. In a worked case below, rounded means still pin a single respondent's 0-10 score to exactly 6.\n\n## The reflex, and why it inverts\n\nYou run a study, you build the segment table, and one cell reads n = 2. You know better than to publish it, so you blank it out and ship the rest.\n\nYou have just published it.\n\nHere is the table, with the small cell hidden:\n\n| Plan tier | EMEA | AMER | APAC | Total |\n| --- | --- | --- | --- | --- |\n| Starter | 18 | 12 | 9 | 39 |\n| Growth | 22 | 15 | 11 | 48 |\n| Enterprise | 7 | 4 | (suppressed) | 13 |\n| **Total** | **47** | **31** | **22** | **100** |\n\nThe suppressed cell is 13 - 7 - 4 = **2**. It is also 22 - 9 - 11 = 2 down the column. Two independent routes to the same answer, both requiring a subtraction that a reader does in their head.\n\nThe US Federal Committee on Statistical Methodology states the principle in *Statistical Policy Working Paper 22*: \"In a row or column with a suppressed sensitive cell, at least one additional cell must be suppressed, or the value in the sensitive cell could be calculated exactly by subtraction from the marginal total.\" The additional cells the paper requires - \"certain other non-sensitive cells must also be suppressed\" - are what it calls complementary suppressions.\n\nNote the direction of the failure. The protective act - blanking the cell - is what creates the disclosure, because it advertises *where* the small group is while leaving the arithmetic that recovers it intact. Had you published the raw 2, a reader would have had to notice it. Suppressing it and publishing the total tells them exactly which subtraction to perform.\n\nThis is the structural inversion at the heart of statistical disclosure control: **the more visibly you protect a cell, the more precisely you locate it.**\n\n## Complementary suppression is harder than it looks\n\nThe obvious remedy is to blank a second cell in each affected row and column. The FCSM working paper is careful to say that this is not sufficient either. Of a worked example with \"at least two suppressed cells in each row and column,\" it observes: \"This table appears to offer protection to the sensitive cells, however, a closer review shows disclosure of sensitive data still occurs.\"\n\nThe reason is that a table with margins is a *system of linear equations*. Each row total is an equation, each column total is an equation, and each suppressed cell is an unknown. If the system has a unique solution - or bounds the unknown tightly enough - the suppression pattern has failed no matter how many cells you blanked. The paper's own appendix lists the two audits an agency runs on any proposed pattern: whether \"Implicitly Published Unions of Suppressed Cells Are Sensitive,\" and whether \"Row, Column and/or Layer Equations Can Be Solved for Suppressed Cells.\"\n\nThe working paper's conclusion is one that any research team should take seriously before rolling their own: \"While it is possible to select cells for complementary suppression manually, in all but the simplest of cases, it is difficult to guarantee that the result provides adequate protection.\"\n\nFor a research report, this means the honest options are narrower than they look:\n\n- **Collapse the category.** Merge APAC into a Rest-of-World bucket so no small cell exists. This is [generalisation](/docs/k-anonymity-segment-reporting-minimum-base-size), and it is nearly always the right answer.\n- **Drop the margin.** If you publish the interior cells without row and column totals, the subtraction has nothing to work with. Readers dislike this, and they are right to, but it is at least sound.\n- **Publish nothing at that granularity.** If the cut is too fine for the sample, the cut is too fine for the report.\n\nWhat is *not* an option is blanking one cell and shipping the totals, which is what nearly everyone does.\n\n## The dashboard version, which is worse\n\nTables at least make the arithmetic visible. Interactive dashboards hide it, and generate the equations automatically.\n\nConsider a satisfaction tracker on a 0-10 scale. A colleague runs two views:\n\n- Filter: **Enterprise** - n = 41, mean = 4.20\n- Filter: **Enterprise, excluding EMEA** - n = 40, mean = 4.15\n\nBoth views comfortably exceed any minimum base size. Neither is a small cell. But they differ by exactly one respondent, so:\n\n41 x 4.20 - 40 x 4.15 = 172.2 - 166.0 = **6.2**\n\nThe single EMEA Enterprise respondent scored 6.2. That is not an inference about a group; it is one person's answer, recovered from two aggregates that both passed the base-size check.\n\nThe instinctive objection is that the dashboard rounds, so the recovery is approximate. Work it through. If both means are rounded to one decimal place, the true sums lie in intervals, and the difference lies in the interval:\n\n41 x 4.195 - 40 x 4.155 = 5.795 to 41 x 4.205 - 40 x 4.145 = 6.605\n\nThe recovered value is somewhere in (5.795, 6.605), a window of width 0.81. On a 0-10 integer scale there is exactly **one** integer in that window: 6. Rounding narrowed eleven possible answers to one. It did not protect anybody.\n\nThis generalises unpleasantly. Any dashboard that lets a user (a) apply arbitrary filters and (b) see counts and means will let a determined user recover individual values, and the more precisely it reports, the fewer queries they need. The base-size rule that guards each *view* cannot see the *difference between views*, because the difference is not a view.\n\n## Where research reports leak by differencing\n\nFour patterns account for most of it.\n\n**Wave-over-wave trackers.** You publish quarterly. Q3 has 84 respondents in a segment, Q4 has 85. If the tracker reports both means, the new respondent's score is recoverable by the arithmetic above. Trackers are especially exposed because the same segments recur by design and the sample changes by small increments.\n\n**The \"excluding\" cut.** Any report that shows both a total and a subset - \"all customers,\" \"all customers except churned\" - hands the reader the complement for free. If the complement is small, it is disclosed.\n\n**Longitudinal panels with attrition.** A panel that loses one member between reports is a differencing attack that ran itself.\n\n**Overlapping segment definitions.** \"Enterprise\" and \"ACV above 100k\" overlap in all but two accounts. Publishing both means the symmetric difference is a two-person group with a computable average.\n\nThe common thread: none of these involves publishing a small cell. Every individual number passed review. The disclosure lives in the *relationship between* numbers, which is precisely what a per-artefact review cannot see - a theme that reaches its logical conclusion in the [privacy budget](/docs/privacy-budget-research-reporting-composition).\n\n## What to do instead\n\n**Fix the segment grid once, and freeze it.** The single most effective control is to define a standing set of report segments - coarse enough that every cell clears your k threshold with room to spare - and report only on that grid, every time. Frozen grids are immune to the \"excluding\" cut and to overlapping-definition differencing, because there is only one definition.\n\n**Report bands, not point estimates, for anything small.** A mean reported as \"between 4 and 5\" cannot be differenced usefully. This costs less than it seems, because a mean computed on 40 people has a confidence interval wider than the band anyway; you are removing precision that was never real. Publishing the interval is more honest as well as safer.\n\n**Never publish both a set and its near-complement.** If the report shows \"all,\" it should not also show \"all except a small group.\"\n\n**Ban ad-hoc filter combinations in shared dashboards.** Give people the frozen grid. If someone needs a bespoke cut, it should be a request that a human reviews - which is also the point at which you notice that the cut has an n of 3.\n\n**Add a minimum-difference rule to your review.** Alongside \"no cell below k,\" add *no two published figures may be based on respondent sets differing by fewer than k people*. That second rule is the one that catches differencing, and almost nobody has it written down.\n\n## How Koji reduces the surface\n\nKoji is an AI-native research platform: the AI interviewer runs voice and text conversations, probes with its own follow-up questions, and produces the analysed report automatically. Three consequences matter for differencing risk.\n\n**Reports are generated artefacts, not live query surfaces.** A Koji report is produced for a study with a defined respondent set and a defined set of cuts derived from the study's structured questions. That is a fundamentally smaller attack surface than a self-serve BI dashboard where any user can compose arbitrary filters, because the set of published aggregates is finite, enumerable and reviewable before it ships. Most differencing risk in practice comes from the unbounded-query pattern, and a generated report simply does not have one.\n\n**Segments come from declared questions, so the grid is stable by construction.** Koji's six structured question types - `open_ended`, `scale`, `single_choice`, `multiple_choice`, `ranking` and `yes_no` - carry stable IDs from the interview plan through analysis into report aggregation. A `single_choice` question with five declared options produces the same five segments in every study that uses it. That is a frozen grid arriving as a side effect of good question design, rather than as a policy somebody has to enforce.\n\n**Depth does not require a finer grid.** The reason teams slice into two-person cells is that they are hunting for the story, and on a survey platform the only way to find a story is to keep cutting. In an AI interview the story is already in the transcript: the follow-up probing - up to three follow-ups per question, driven by what the respondent actually said - produces the *why* at the individual level, so the quantitative grid can stay coarse. You quote the Enterprise APAC customer's reasoning without publishing an n = 2 cell containing their score. The qualitative and quantitative layers carry different loads, and only one of them needs to be fine-grained.\n\nThe responsibility is still yours. Koji does not know which of your segments are sensitive or who might be reading. What it can do is keep the published aggregate set small, stable and enumerable - which is the precondition for auditing it at all.\n\n## Frequently asked questions\n\n### What is a differencing attack on a research report?\n\nIt is the recovery of a hidden or individual value by subtracting two published aggregates. The simplest form is a suppressed table cell recovered from a row total; the more common form in practice is two dashboard views that differ by one respondent, where the difference of the two totals is that respondent's answer.\n\n### If I suppress a small cell, is the report safe?\n\nUsually not. *Statistical Policy Working Paper 22* is explicit: \"the value in the sensitive cell could be calculated exactly by subtraction from the marginal total\" unless additional, non-sensitive cells are also suppressed. Suppressing one cell while publishing row and column totals is the single most common disclosure-control mistake in reporting.\n\n### Does complementary suppression fix it?\n\nIt is necessary but hard to get right. The same working paper shows an example with at least two suppressed cells in every row and column and notes that \"a closer review shows disclosure of sensitive data still occurs,\" because the table is a solvable system of equations. Its own conclusion is that manual selection of complementary cells cannot be guaranteed adequate \"in all but the simplest of cases.\" Collapsing the category is the more reliable fix.\n\n### Does rounding protect against differencing?\n\nOnly partially, and often not at all. In the worked example above, two means rounded to one decimal place still bound one respondent's 0-10 score to the interval (5.795, 6.605), which contains exactly one integer. Rounding turns an exact recovery into a narrow one; whether that matters depends on how many values the answer could take, and for a rating scale the answer is usually \"not enough to help.\"\n\n### How do I stop dashboards from leaking this way?\n\nRestrict published cuts to a frozen segment grid rather than allowing arbitrary filter composition, and add a minimum-difference rule to your review: no two published figures may be based on respondent sets differing by fewer than k people. Base-size rules alone cannot catch differencing, because each individual view passes.\n\n### Are trackers more exposed than one-off studies?\n\nYes. A tracker reports the same segments repeatedly over a sample that changes by small increments, which is the ideal setup for differencing - a segment that goes from 84 to 85 respondents publishes the 85th respondent's score if both waves report a mean. Report tracker segments as bands, or hold the panel composition fixed within a reporting period.\n\n## Related Resources\n\n- [k-Anonymity for Segment Reporting](/docs/k-anonymity-segment-reporting-minimum-base-size) - the base-size rule this article shows is necessary but not sufficient, and why generalisation beats suppression.\n- [Quasi-Identifiers in Research Data](/docs/quasi-identifiers-research-data-reidentification) - why the combination of screener fields is the identifier, and how to measure uniqueness before you publish.\n- [The Privacy Budget in Research Reporting](/docs/privacy-budget-research-reporting-composition) - the general case: a sequence of individually safe releases is not a safe sequence.\n- [Structured Questions in AI Interviews](/docs/structured-questions-guide) - the six question types, and how declared option sets produce a stable segment grid.\n- [How to Read Your Koji Research Report](/docs/reading-your-research-report) - what a generated report actually contains, section by section.\n- [User Research Report Template](/docs/user-research-report-template) - structuring findings for an audience, including where base sizes belong.","category":"Research Methods","lastModified":"2026-08-24T03:25:26.339056+00:00","metaTitle":"The Differencing Attack: Why Suppressing a Small Segment Publishes It (2026)","metaDescription":"Blank the n=2 cell, publish the row total, and the cell is recoverable by subtraction. How differencing works in reports and dashboards, and what to do instead.","keywords":["differencing attack","cell suppression","complementary suppression","dashboard privacy leak","statistical disclosure control","small segment reporting","research report privacy"],"aiSummary":"Suppressing a sensitive table cell while publishing marginal totals lets a reader recover it exactly by subtraction; statistical agencies call the remedy complementary suppression and warn it is hard to guarantee manually. The dashboard form is worse: two filtered views differing by one respondent disclose that respondent, and rounding to one decimal place still pinned a single 0-10 score to exactly 6 in the worked example. Defences are a frozen segment grid, bands instead of point estimates, never publishing a set alongside its near-complement, and a minimum-difference review rule.","aiPrerequisites":["Understanding of minimum base size and k-anonymity"],"aiLearningOutcomes":["Recover a suppressed cell from published margins and see why the reflex fails","Recognise the four differencing patterns common in research reporting","Evaluate whether rounding provides real protection","Apply a frozen segment grid and a minimum-difference review rule"],"aiDifficulty":"intermediate","aiEstimatedTime":"10 min"}],"pagination":{"total":1,"returned":1,"offset":0}}