Skip to content

October 2026

What FedDPA withholds is the half that identifies best

*-dual-cpp-rebuilt-c128-t2-local.json. The same run, the same clients, the same two rounds: the local adapter each client keeps, read by the two instruments that read the global one it sends. Both halves had two training passes over the same 128 examples, so this comparison carries none of the length confound that separates the dual run from the single-adapter one. Neither FedDPA nor FDLoRA makes it.

The adapter-instance cut transmits the source, and its own schedule sharpens it

*-dual-cpp-rebuilt-c128-t2.json. FedDPA's iterative variant on the rebuilt corpus, 128 examples a client, two rounds: each client holds a global adapter that is communicated and a local adapter that never is. What the server receives is the global half, and that is what the two instruments read here. Neither FedDPA nor FDLoRA attacks the half that leaves; FedDPA states the assumption instead, that "all clients are trusted ... and the whole process does not suffer from any attacks".

The two items the reviews left open, closed

The three adversarial reviews on 2026-09-18 and 2026-09-19 each ended with a list recorded rather than fixed. Re-reading those lists against the code, most had been overtaken: the permutation now has behavioural tests rather than text searches, the enumeration counts distinct groupings, the overwrite guard claims exclusively at job start, and the contamination battery's partial output is claimed under its own name. Two were still standing, and both are closed here.

The registered subspace tests pass, and the cut is what makes the source readable

datasets/results/subspace-split-cpp-rebuilt-c128.json. Two tests were registered for the ten-project rebuild before it existed: the detector on the shared half at rank 4, and the classifier on the residual at rank 1. Both are now run on 48 C++ clients over thirteen projects, with the attribution basis fitted without the scored client's whole project and the null the same 1,716 groupings the detector uses.

The Qt result was the null's size, not Qt

*-cpp-rebuilt-c128.json. The ten-project AOSP rebuild gives seven C++ projects that can fill a client at 128 examples, against Qt's six, so the project-level permutation enumerates C(13, 7) = 1,716 distinct groupings where every earlier run had 84. Same training length, same initialization, a larger and better-balanced project set.

Cluster size carries no information about the contrast, measured

scripts/cluster_informativeness.py, datasets/results/cluster-informativeness.json. The registration binds the gate to the pooled estimand, and one of its two reasons is Kahan et al.'s condition: pooling over examples is wrong when a change's size carries information about its outcome. The report quoted a correlation for that, and nothing on disk produced it.

The two probes now differ on purpose, and the seal is enforced where months are read

scripts/separability_over_time.py. The review noted that this probe reads every built month, dev included, where separability.py stops at train, and left it. The difference is right and was undocumented: this one asks whether the corpus moves over time, and a drift reading that stops two months early cannot see the end of its own series. It reads corpus text and no held-out predictions, so the dev window is described rather than spent. The docstring now says that instead of implying both probes follow one rule.