Status: TIFS submission candidate CoVe strict-cells PASS · 307/307 268-row deduped grid Audit fixes in flight

QuantLeak-HybridRAG

Edge RAG compresses the language model to fit a 6 GB envelope. Does that compression change what the system leaks about its private database? We measured datastore membership inference across a four-rung quantization ladder, dense and hybrid retrieval, two datastores, and six attack families. The generator channel turned out to be flat at chance — and the membership signal turned out to live somewhere else entirely: the retrieval layer.

0.4 0.5 0.6 0.7 0.8 bits per weight → attack AUC Generator channel — flat chance 0.5 IQ1_M pooled AUC 0.586 — results/t1/stats.json 0.586 IQ2_XS pooled AUC 0.506 — results/t1/stats.json 0.506 Q2_K pooled AUC 0.558 — results/t1/stats.json 0.558 Q4_K_M pooled AUC 0.532 — results/t1/stats.json 0.532 Retrieval channel — saturated Rank (1/rank) Rank (1/rank) membership AUC 1.000 — results/t1/retriever_only_verdict.md 1.000 Dense cosine Dense cosine membership AUC 0.876 — results/t1/retriever_only_verdict.md 0.876 BM25 (NF) BM25 (NF) membership AUC 0.627 — results/t1/retriever_only_verdict.md 0.627 BM25 (Enron) BM25 (Enron) membership AUC 0.940 — results/t1/retriever_only_verdict.md 0.940 no generator involved — pure retrieval signal
The whole result in one picture. Left: attack AUC across the four quantization rungs sits on the 0.5 chance line — compressing the generator neither protects the datastore nor makes it leak worse. Right: the retrieval channel is saturated — a candidate document's rank in the index separates members from non-members at AUC 1.000, before any generator call. Numbers from the frozen sweep and the retriever-only control; hover a value for its artifact.

The finding: the wrong layer has been defended

RAG answers a question by retrieving documents from a datastore, then asking a language model to write an answer from them. Prior membership-inference (MIA) work probes the generator. But the generator only ever sees what retrieval hands it. If membership is decided upstream, then quantizing — or otherwise hardening — the generator is aimed at the wrong layer.

We tested both layers on the same datastores. The generator-side ladder is null: every rung within noise of chance, and formally equivalent to a full-precision baseline. The retrieval-side control is the opposite: a document's rank in the fused index is a near-perfect membership oracle, because members are indexed and non-members are not. That gap — flat generator, saturated retriever — is the paper's thesis, and it is a positive result, not a null.

The generator null still matters: it retires a folklore belief that compression hides datastore contents, and it is what makes the channel claim clean — there is no generator leakage to confound the retrieval measurement.

What we built

Queryuser request Encoder-Guardz-score + lexical · pre-retrieval FAISS IVF-SQ8dense ANN · CPU BM25sparse RRF k=60 Granite 4.2-3BGGUF quantized generator KV cache q8_0privacy side-path Quant ladderIQ1_M 1.76 → Q4_K_M 4.65 bpw generator swapped across the ladder; retrieval + fusion held fixed
The measured stack. A pre-retrieval encoder guard can abstain before embedding; retrieval fuses dense ANN with BM25 by reciprocal-rank fusion; the generator is swapped across the quantization ladder while retrieval and fusion stay fixed.

Components

  • Generator — Granite 4.2-3B, QLoRA fine-tuned (r16, α32, NF4) for RAG grounding; final training loss 1.479 on 10,500 contamination-free examples.
  • Quant ladder — importance-matrix GGUF: IQ1_M 1.76, IQ2_XS 2.06, Q2_K 2.90, Q4_K_M 4.65 bpw.
  • Retrieval — FAISS IVF-SQ8 (CPU) + BM25, fused by RRF at k=60.
  • KV cache — q8_0, tested as a privacy-relevant setting, not just a memory knob.
  • Context — YaRN extension without retraining, needle-validated 6/6 at 8K and 16K.

The grid

  • 4 quants × 2 datastores × 2 retrieval modes × 5 core families × 3 seeds.
  • 268 deduped rows (320 raw minus 52 resume-replicates), aggregating to 92 configurations.
  • Plus an F16 positive control, a scoped entailment attack arm, an RRF-k lane, a guard on/off arm, and a retriever-only control.
  • All rows synthetic:false, one generator lineage (granite-sft).
1 Dataset build 10,500 rows · NF-free 2 QLoRA SFT loss 1.479 3 Quant ladder imatrix → 4 GGUFs 4 MIA sweep 268 rows · 3 seeds 5 Statistics equivalence · selectivity 6 Paper TIFS
The research pipeline — a genuine sequence, so it is numbered: contamination-free data → grounded SFT → importance-matrix quantization → attack sweep → statistics → paper.

Seven results, each traceable

All values below are re-derived this session from the artifacts named in each tooltip. The paper's own verifier checks every decimal in the manuscript against the same evidence tree.

The generator channel is null — and now stated as equivalenceEQUIVALENT

Pooled per-quant attack AUC is 0.586 / 0.506 / 0.558 / 0.532 for IQ1_M / IQ2_XS / Q2_K / Q4_K_M — flat and non-monotone. For the loss/zlib families, all 16/16 configurations are statistically equivalent to the F16 baseline within a pre-registered margin δ=0.1 (largest observed difference 0.018). No configuration survives Holm correction (0/92). Verdict: no quantization level is a privacy control, and none makes leakage worse.

paper/ieee_main.tex §RQ1 · results/t1/stats.json · results/t1/tost_scores.jsonl

The harness can find leakage when it existsPOSITIVE CONTROL

A grid of nulls is only credible if the instrument is sensitive. On the unquantized base model, the mask-based attack reaches mean AUC 0.712 while the statistical families sit at chance (loss 0.506, zlib 0.509, S2MIA 0.487). The same harness that reports nulls on quantized models reports strong signal at full precision — where the literature says it lives.

results/t1/f16_control.jsonl

The retrieval channel owns membershipNEW · PRE-PAPER

A retriever-only control scores membership with no generator involved. The rank of the candidate document in the fused top-10 separates members from non-members at AUC 1.000 on both datastores; the dense embedding cosine reaches 0.876, and BM25 0.627–0.940. This is definitional once seen clearly — members are indexed, non-members are not — and it is the thesis: generator-side defenses are aimed at the wrong layer.

results/t1/retriever_only_verdict.md · scripts/retriever_only.py

Hybrid fusion does not amplify the statistical familiesNOT CONFIRMED

We hypothesized BM25+RRF fusion would amplify leakage, since BM25 ranks are invariant under quantization. Over 40 matched dense/hybrid pairs: mean ΔAUC +0.010, range −0.086 to +0.208, 35/40 within ±0.05 (17 positive, 20 negative, 3 exactly zero). An RRF-k sensitivity lane (k=30/90) is flat, so the null is not an artifact of the one fusion constant.

paper/ieee_main.tex §RQ2 · results/t1/rrfk_sens.jsonl

One family does move: entailment attacks rise under hybridOPEN LEAD

The entailment-stealth family (MEntA) is the only one that tracks fusion. Hybrid per-quant means climb 0.618 → 0.726 → 0.807 → 0.833 while dense stays flat (0.625 → 0.537 → 0.520 → 0.529). It is a 2-seed scoped arm today — the reason a 5-seed replication is the next mandatory experiment, not a claim yet.

results/t1/raw_sweep.jsonl · results/t1/menta_det.jsonl

The guard is utility-free but efficacy-null on plain probesNULL

A pre-retrieval firewall (embedding centroid z-score fused with lexical attack features) abstains before embedding and search. On the real pipeline it costs 0.1 ms p50 warm, abstains on 0/60 legitimate member queries, and leaves loss/MBA AUC unchanged (Δ +0.009 / −0.013). Its detection signal covers frame-shaped attack queries (calibration TPR 0.733 at FPR ≤1%), not plain-query probing. Reported as a null, not hidden.

results/t1/guard_summary.json · paper/ieee_main.tex §RQ3

q8_0 KV cache is membership-neutralNEUTRAL

Against an FP16 KV baseline at n=100 per arm: loss ΔAUC 0.019 and zlib 0.00670.19× and 0.07× the ±2·SE resolution band. The edge stack can halve KV memory with no measurable membership cost.

results/t1/kv-q8/bench.json

Main table, regenerated from the deduped data

Mean AUC over the two dataset-level means at k=60. Toggle retrieval mode; hover a cell for its sidecar row. Values above 0.6 (warm) mark the mask-based and differential-calibration columns; the calibration column is under repair — see the correction ledger.

Loss Zlib S2MIA MBA DCMI IQ1_M · dense IQ1_M (1.76 bpw) dense · Loss AUC 0.531 — results/t1/table1_canonical.jsonl0.531 IQ1_M (1.76 bpw) dense · Zlib AUC 0.529 — results/t1/table1_canonical.jsonl0.529 IQ1_M (1.76 bpw) dense · S2MIA AUC 0.488 — results/t1/table1_canonical.jsonl0.488 IQ1_M (1.76 bpw) dense · MBA AUC 0.580 — results/t1/table1_canonical.jsonl0.580 IQ1_M (1.76 bpw) dense · DCMI AUC 0.801 — results/t1/table1_canonical.jsonl0.801 IQ1_M · hybrid IQ1_M (1.76 bpw) hybrid · Loss AUC 0.527 — results/t1/table1_canonical.jsonl0.527 IQ1_M (1.76 bpw) hybrid · Zlib AUC 0.525 — results/t1/table1_canonical.jsonl0.525 IQ1_M (1.76 bpw) hybrid · S2MIA AUC 0.497 — results/t1/table1_canonical.jsonl0.497 IQ1_M (1.76 bpw) hybrid · MBA AUC 0.577 — results/t1/table1_canonical.jsonl0.577 IQ1_M (1.76 bpw) hybrid · DCMI AUC 0.801 — results/t1/table1_canonical.jsonl0.801 IQ2_XS · dense IQ2_XS (2.06 bpw) dense · Loss AUC 0.494 — results/t1/table1_canonical.jsonl0.494 IQ2_XS (2.06 bpw) dense · Zlib AUC 0.493 — results/t1/table1_canonical.jsonl0.493 IQ2_XS (2.06 bpw) dense · S2MIA AUC 0.499 — results/t1/table1_canonical.jsonl0.499 IQ2_XS (2.06 bpw) dense · MBA AUC 0.521 — results/t1/table1_canonical.jsonl0.521 IQ2_XS (2.06 bpw) dense · DCMI AUC 0.503 — results/t1/table1_canonical.jsonl0.503 IQ2_XS · hybrid IQ2_XS (2.06 bpw) hybrid · Loss AUC 0.498 — results/t1/table1_canonical.jsonl0.498 IQ2_XS (2.06 bpw) hybrid · Zlib AUC 0.486 — results/t1/table1_canonical.jsonl0.486 IQ2_XS (2.06 bpw) hybrid · S2MIA AUC 0.492 — results/t1/table1_canonical.jsonl0.492 IQ2_XS (2.06 bpw) hybrid · MBA AUC 0.528 — results/t1/table1_canonical.jsonl0.528 IQ2_XS (2.06 bpw) hybrid · DCMI AUC 0.547 — results/t1/table1_canonical.jsonl0.547 Q2_K · dense Q2_K (2.9 bpw) dense · Loss AUC 0.461 — results/t1/table1_canonical.jsonl0.461 Q2_K (2.9 bpw) dense · Zlib AUC 0.459 — results/t1/table1_canonical.jsonl0.459 Q2_K (2.9 bpw) dense · S2MIA AUC 0.464 — results/t1/table1_canonical.jsonl0.464 Q2_K (2.9 bpw) dense · MBA AUC 0.676 — results/t1/table1_canonical.jsonl0.676 Q2_K (2.9 bpw) dense · DCMI AUC 0.659 — results/t1/table1_canonical.jsonl0.659 Q2_K · hybrid Q2_K (2.9 bpw) hybrid · Loss AUC 0.457 — results/t1/table1_canonical.jsonl0.457 Q2_K (2.9 bpw) hybrid · Zlib AUC 0.461 — results/t1/table1_canonical.jsonl0.461 Q2_K (2.9 bpw) hybrid · S2MIA AUC 0.467 — results/t1/table1_canonical.jsonl0.467 Q2_K (2.9 bpw) hybrid · MBA AUC 0.686 — results/t1/table1_canonical.jsonl0.686 Q2_K (2.9 bpw) hybrid · DCMI AUC 0.787 — results/t1/table1_canonical.jsonl0.787 Q4_K_M · dense Q4_K_M (4.65 bpw) dense · Loss AUC 0.458 — results/t1/table1_canonical.jsonl0.458 Q4_K_M (4.65 bpw) dense · Zlib AUC 0.465 — results/t1/table1_canonical.jsonl0.465 Q4_K_M (4.65 bpw) dense · S2MIA AUC 0.457 — results/t1/table1_canonical.jsonl0.457 Q4_K_M (4.65 bpw) dense · MBA AUC 0.680 — results/t1/table1_canonical.jsonl0.680 Q4_K_M (4.65 bpw) dense · DCMI AUC 0.594 — results/t1/table1_canonical.jsonl0.594 Q4_K_M · hybrid Q4_K_M (4.65 bpw) hybrid · Loss AUC 0.487 — results/t1/table1_canonical.jsonl0.487 Q4_K_M (4.65 bpw) hybrid · Zlib AUC 0.479 — results/t1/table1_canonical.jsonl0.479 Q4_K_M (4.65 bpw) hybrid · S2MIA AUC 0.499 — results/t1/table1_canonical.jsonl0.499 Q4_K_M (4.65 bpw) hybrid · MBA AUC 0.643 — results/t1/table1_canonical.jsonl0.643 Q4_K_M (4.65 bpw) hybrid · DCMI AUC 0.559 — results/t1/table1_canonical.jsonl0.559
0.450.80+ AUC cool = at chance · warm = elevated

Correction ledger — what we found wrong in our own work

An honest explainer has to show the corrections, not just the results. Four data-integrity defects were found and fixed in a post-draft audit; a fifth is in flight.

DefectWhat was wrongCorrection
C1 Table 1 was stale: 14 of 40 cells did not reproduce from the deduped sweep, and the verifier could not see it. Table regenerated from a canonical aggregator; fresh recompute now yields 0 mismatches. Dedup policy documented (stochastic re-runs averaged).
C2 The claim verifier matched a number against any evidence row, so a wrong-cell value still passed. Cell-binding verifier added (--strict-cells): 56 table cells checked by name; a wrong-cell selftest must fail.
C3 The differential-calibration attack built its calibration set from the evaluation non-members themselves — in-sample, so its reported AUC was inflated (1.000 on one configuration). Disjoint calibration enforced; early re-run collapses the artifact (e.g. 0.671 → 0.473). Full lane completing now.
O3 An early draft credited grounding for pushing loss attacks to chance — but the ungrounded F16 base is already at chance (loss 0.506, zlib 0.509). Claim scoped/demoted; an F16-SFT control is the clean experiment that would settle it, scheduled.
O4 Cross-family generalization rested on a single-seed, single-quant, domain-mismatched probe. Downgraded to a probe; a proper second family is deferred to revision (the pinned runtime cannot serve the candidate architecture).

This ledger is the reason to trust the rest of the page: the audit was adversarial, the corrections are measured, and the verifier was extended so the same class of error cannot pass again.

Verification: how to trust a number here

Claim-level checking

Every decimal in the manuscript is machine-checked against the evidence tree. The strict mode binds table cells to named sidecar rows so a value that exists but belongs to the wrong cell fails.

scripts/cove_verify.py --strict-cells
307/307 claims · 56 cells · PASS

Self-audit

Four audit tracks (evidence, statistics, code/artifact, threat/novelty) plus an adversarial pass produced 33 findings — 7 critical — including the training-data contamination that forced a full rebuild of the SFT set to exclude all datastore documents.

docs/audits/Q1_WEAKNESS_REVIEW.md

References

All 38 entries cross-checked against live APIs: 33 clean, 5 corrected (a wrong venue, a wrong DOI, a wrong volume), 0 unverifiable.

Honest failures on the page

Faithfulness is 0.809 against a 0.85 gate — not met. Two defects are named: a query-echo mode and zero abstention. The gate is never printed as met.

What's next

In flight

  • Clean calibration lane — finish the disjoint re-run of the differential-calibration attack (C3).
  • Entailment grid, 5 seeds — turn the one moving family into a result or retire it.
  • Guard vs entailment — the defense experiment that decides whether the paper has a positive defense or only a positive measurement.
  • F16-SFT control — settles the grounding attribution.

Gates that decide the paper's shape

  • Gate 1 — does a channel leak? Passed: the retrieval channel is saturated.
  • Gate 2 — is the entailment rise stable at 5 seeds? Pending.
  • Gate 3 — does the guard cut it? Pending.

If Gate 2 or 3 fails, the paper falls back to an honest negative-results measurement rather than a manufactured positive.

Human-gated items remain: real author block and affiliations, and activating the IEEE AI-use disclosure verbatim. These are submission logistics, not research.