A two-axis result. The contrastive receptor encoder does generalize to an unseen FcγR (the gospel's headline claim — validated), but the model does not rank binding at Fc sequence positions the screen never varied (the OOD-position gap — unsolved across every lever tried). An earlier draft over-claimed a blanket "receptor-encoding falsified"; the leave-one-receptor-out test (§4.10) corrected it.
Internal research report — BIIE / ETH Zürich, FcGPT/SFM program. Workstream 7 (WS7).
Date: 2026-06-16. Status: complete (negative result). Companions:
ws7_fccalm_status_report.md,
ood_generalization_execution_plan.md,
ws7_fccalm_execution.md; theory sources in
context/documents/ (1-Method-MRC_Final.md, CALM.md,
FcCALM.md).
A binding verifier for Fc–FcγR engineering is excellent inside the screened library (MCC ≈ 0.93) but collapses on designs that mutate positions the screen never varied — the out-of-distribution (OOD) coverage regime where a one-hot classifier sits at MCC ≈ 0.09–0.11 and false-positive rate (FPR) ≈ 0.47–0.52. We tested whether FcCALM, a convergence-theory–prescribed dual-encoder contrastive model (after CALM; Lee et al. 2026) that embeds the Fc variant and the receptor from sequence into a shared space, closes this gap. The hypothesis (its reason to exist) was that encoding the receptor from sequence lets a binding decision interpolate at Fc positions the screen never explored.
The result splits cleanly along two distinct generalization axes that WS7 had conflated.
Axis 1 — unseen Fc positions (the OOD-position gap): FcCALM does NOT generalize.
Across thirteen training runs: FcCALM recognises binding in-distribution (covered-zone AUROC
≈ 0.99) but produces no OOD-position ranking signal — the threshold-free per-receptor
(macro) AUROC in the OOD bucket is ≈ 0.5 (chance) and does not move with interface/DMS
pooling, more data, label completeness, ESM-2 LoRA fine-tuning, or residue-level
cross-attention. Crucially, this holds even for a fully-faithful build (§4.11) that
combines every previously-skipped gospel component 1-to-1 — per-receptor co-crystal FcR
pooling, hard-negative families 1–3, cross-attention, 5× data — so the negative is not an
artifact of an incomplete implementation. (Notably, those faithful components do lift the
in-distribution and partially-covered buckets — best-in-zone OVERALL AUROC 0.86 — confirming
they work wherever training signal exists, and only fail where the screen never varied the
position.) We also reimplemented FcCALM as a binderSFM-v2.5-faithful model (transformer
backbone + symmetric cross-attention + interface/contact heads, structure-as-labels; §4.12),
and then specialized the published binderSFM v2.8 foundation itself (CALMEncoderV2
loaded from the released weights, abSFM-style fine-tune; §4.13). The specialized foundation is
our best model overall (OVERALL macro-AUROC 0.81 > the FFN's 0.80 ≫ from-scratch v2's
0.66), with the gains concentrated in the partially-covered buckets — validating the
foundation→specialize paradigm — yet it still leaves Fc-position OOD at chance (0.53), just
as the production SFM's own foundation→specialize lesson and SKEMPI single-mutation evidence
(ρ≈0.08) predict. The early apparent "OOD win" over one-hot is a calibration/abstention
artifact, exposed once we separate ranking (AUROC) from threshold placement (MCC at θ=0.5).
Axis 2 — unseen receptors (the gospel's headline claim, §6.2): FcCALM DOES generalize. A leave-one-receptor-out test (train on 7, score the held-out 8th from its sequence; §4.10) gives held-out AUROC 0.72–0.84 for 7 of 8 receptors — excluding the outlier FcRn, mean 0.78 vs 0.79 for the fully-trained model (essentially no penalty), and single-residue allotype holdouts transfer cleanly. The receptor encoder does read sequence and place an unseen FcγR. The lone failure is FcRn (0.17, anti-correlated) — a biologically distinct receptor with no analog among the training seven.
These reconcile via a receptor-encoder-vs-receptor-ID ablation: with all 8 receptors in training the encoder is functionally identical to a learned 8-way ID lookup (§4.7) — so for scoring known receptors the sequence adds nothing — but that ID-equivalence hides a generalization capacity that only surfaces under leave-one-out. We therefore retract the earlier blanket claim that the receptor-encoding mechanism is "falsified": it is falsified only as a route to Fc-position OOD, not as receptor generalization. We conclude the OOD-position failure is structural — a property of the objective and the Fc-side representation — and recommend pivoting to structure-based scorers (WS3) for that axis, while the receptor axis behaves as the convergence theory predicts. We record throughout what this does and does not say about Molecular Recognition Computing (MRC) and CALM.
Scope (see §3.5). This tests a faithful but incomplete slice of the spec — the Stage-1 verifier — on both axes: the Fc-position OOD axis (fails) and, via leave-one-out, the unseen-receptor axis (holds; §4.10). Several gospel components are still approximated or skipped (co-crystal FcR pooling, full top-6 unfreeze, hard-neg families 2–3, the AR decoder, the full library, nested CV) — a follow-up "fully-faithful" build is in progress to confirm the Fc-position negative is not an artifact of incompleteness. On plain in-zone accuracy FcCALM trails the one-hot baseline (§4.9) — its value is ranking and receptor transfer, not calibrated in-zone classification.
The FcGPT program produced the richest molecular-recognition dataset in the SFM portfolio:
~3.1M unique Fc variants FACS-sorted for binding against 8 Fcγ/Fc receptors. Supervised
classifiers (one-hot → MLP) on this library reach MCC > 0.91 per receptor and are excellent
inside the library. They fail on engineered designs that touch positions the screen
never varied: on the first experimental-validation set (FEV), stratifying by
position-coverage, the one-hot classifier drops from MCC ≈ 0.93 in the well-covered bucket
to MCC ≈ 0.09–0.11 / FPR ≈ 0.47–0.52 in the ood_0_50 bucket (designs whose mutated
positions are <50% covered by the training library). A one-hot encoding has zero signal
at a never-varied position by construction — the corresponding weight is untrained.
This OOD-position gap is the single problem the eight-workstream OOD execution plan attacks. This report is the complete account of Workstream 7 (WS7): FcCALM, the SFM-native contrastive attack.
FcCALM reformulates Fc–FcγR binding from 8-label classification into molecular recognition: the Fc variant (agent) and the receptor (target) are each encoded from sequence into a shared unit-sphere embedding, trained with symmetric InfoNCE; a binding decision is the geometry between an Fc embedding and a receptor embedding. The WS7 hypothesis (plan §0; ws7_fccalm_execution.md §0):
Because the receptor is encoded (not a fixed label), the binding decision is a continuous geometric relation that can interpolate at Fc positions the screen never explored — exactly where one-hot has nothing.
The result is two-axis, and the axes go opposite ways. FcCALM does generalize to an unseen receptor (§4.10 leave-one-out — the gospel's headline claim, validated for the FcγR family), but does not rank binding at unseen Fc positions (§4.2–4.8 — the OOD-position gap, unmoved by every lever). WS7 had conflated these into one "does FcCALM fix OOD?" question; separating them is the paper's main correction (an earlier draft wrongly declared the whole receptor-encoding mechanism falsified — §4.7, §4.10). We report the full experimental record (§4), the methodological correction needed to read it (§3.4, §4.2 — ranking vs calibration), the fidelity-to-spec accounting (§3.5), and the verdicts on the theory (§5). The contribution is the clean separation of the two axes, plus a reusable, honest evaluation methodology.
MRC is the convergence theory that prescribes the architecture. Its claim: at thermal equilibrium, binding selection follows a Boltzmann distribution; softmax attention is that distribution, and Luce's choice axioms make it the unique selection function. For any system satisfying five conditions — discrete contacts, bilinear interaction energy, a finite competing pool, thermal equilibrium, stochastic selection — the theory derives a complete recipe (MRC §3): dual encoders (bilinear energy ⇒ independent agent/target features), cosine/inner-product compatibility fed to softmax, the InfoNCE objective (the negative log-likelihood of the convergence equation — BCE is ruled out because it treats pairs independently and violates independence-of-irrelevant-alternatives), a symmetric loss (ΔG_AB = ΔG_BA), hard negatives (informative competitors sharpen the embedding), a learned temperature τ ≡ k_BT, and a 2-parameter affinity calibration ΔG = w·s + b to recover binding strength from similarity. The theory further predicts such models are more data-efficient and exhibit exponential (not power-law) scaling with diversity.
CALM is the first SFM instantiation (antibody–antigen): AntiBERTy (Ab) + ESM-2 650M (Ag) → FFN projection → mean pool → cosine similarity → symmetric multi-positive InfoNCE; learned τ (init 0.2); cluster-aware nested CV. CALM-1.0 trains on 4,138 SAbDab pairs. Hard negatives are explicitly future work in CALM.
FcCALM (R&D plan, context/documents/FcCALM.md) maps CALM
onto Fc–FcγR. Agent = Fc domain (EU residues 216–447, 232 aa), ESM-2 650M (not AntiBERTy:
the Fc is constant-region, outside AntiBERTy's VH/VL pretraining). Target = FcR extracellular
domain, ESM-2 650M separately instantiated. Two material upgrades over CALM: (i) explicit
FACS negatives — (Fc, FcR, label=0) pairs, so the InfoNCE denominator has true negatives,
not only in-batch samples; (ii) a structured batch containing all 8 receptors every step
(only 8 exist), each with binders and non-binders, giving both cross-receptor and
within-receptor negatives. Pooling is meant to be interface-weighted (Fc from the FcGPT DMS
map; FcR from co-crystal contacts). Hard-negative mining has four families: (1) allotype
swaps, (2) interface-adjacent Fc mutants, (3) cross-receptor profile swaps, (4)
express-positive/bind-negative. Training is three-stage (contrastive → decoder warm-up →
joint); WS7 needs Stage 1 only (the decoder is for generation, not verification).
A point that becomes central in §5: MRC promises data-efficient recognition within the binding manifold the model has observed. It does not promise extrapolation to Fc sequence positions never seen varied. The gospel's own mechanisms for never-varied positions are the residue-level cross-attention path and family-2 interface hard negatives; of these we tested a verifier-side cross-attention readout (§4.8, no lift) but built neither the autoregressive decoder nor families 2–3 (§3.5). The WS7 hypothesis (§1.2) is a plausible corollary — "the receptor geometry might interpolate" — not a theorem. This report tests that corollary directly.
R1 FcγR1, FcRn6 FcRn,
R2AH/R2AR FcγR2A-H167/R167 (single-residue allotypes), R2B FcγR2B, R3AF/R3AV
FcγR3A-F176/V176 (single-residue allotypes), R3B FcγR3B.FcCALM (Fc-CALM/src/calm/encoder/binding.py):
two FFN heads on frozen ESM-2 650M embeddings (1280-d → 2048 → 512), pooled (mean or
interface-weighted), L2-normalised to a 512-d unit sphere; learned logit_scale (τ init
0.2, clamp 100). The objective is label-aware symmetric multi-positive InfoNCE: for a
structured batch, build_pair_label_matrix builds the (B,B) grid of "does Fc_i bind the
receptor of pair j"; positives are binders (label==1), the denominator runs over
positives and explicit negatives (label==0), unknown (-1) cells are removed, and
hard negatives are up-weighted. Per-receptor P(bind) is the read-out — a 2-parameter
affinity-calibration head σ(w_R·cos(z_Fc, z_R) + b_R) fit on a frozen backbone (MRC §7),
never a training loss.
Stage-1 InfoNCE, 15 epochs, structured sampler (all 8 receptors per batch, balanced binders/non-binders, n_per_class=8), AdamW, leakage-safe cluster split by Fc edit distance; then the calibration head is fit for 50 epochs with the encoders frozen. Frozen-embedding runs take ~6–21 min on one RTX-4090 (embeddings precomputed and cached). The ESM-2 fine-tune variant (§4.5) puts ESM-2 650M in the graph via LoRA (rank 16 on attention q/v, bf16, gradient checkpointing); it takes ~2.6 h.
Every scorer reports through the stratified FEV harness
(scripts/eval/fev_stratified.py): per-receptor MCC/FPR
+ exact-match, stratified by position-coverage bucket (covered_5pct n=86, covered_1pct
90, partial_80_100 104, partial_50_80 435, ood_0_50 1230), at decision threshold
θ=0.5. The headline number is ood_0_50 macro-MCC.
The correction (essential to this report's conclusions): MCC at a fixed θ conflates two
different things — ranking quality (can the model order binders above non-binders?) and
calibration (where does the 0.5 threshold fall?). The OOD set is ~80% non-binders, so a
conservatively-calibrated model abstains, drives FPR down, and mechanically inflates MCC
with no better embedding. We therefore added a threshold-free scoreboard
(scripts/eval/fev_auroc.py): per-bucket AUROC via the
Mann–Whitney rank statistic, reported as both micro (pool all 8 receptors) and macro
(per-receptor mean). The distinction is decisive:
This methodology is now standing policy for FEV evaluation.
This negative result concerns what we actually built, which is a faithful but deliberately incomplete slice of the FcCALM specification: the Stage-1 contrastive verifier, used as an Fc-position OOD scorer. Two divergences from the gospels (FcCALM.md / CALM.md / MRC) are load-bearing and we flag them before any results are read:
ood_0_50 bucket). These are different axes, and the answers differ: the receptor axis
holds (§4.10 leave-one-out) while the Fc-position axis fails (§4.2–4.8). The original
conflation of the two is corrected throughout this revision.| Spec element | Gospel prescription | What we built | Fidelity |
|---|---|---|---|
| InfoNCE objective (symmetric, multi-positive; BCE ruled out) | MRC §3.3–3.4 | exactly that | ✅ 1-to-1 |
| Explicit FACS negatives in the denominator | FcCALM §3.3 | yes | ✅ 1-to-1 |
| Structured all-8-receptor batch | FcCALM §2.6 | yes | ✅ 1-to-1 |
| Learned τ (init 0.2); 2-param affinity calibration | MRC §3.6, §7 | yes | ✅ 1-to-1 |
| Dual ESM-2 650M encoders | FcCALM §2.2–2.3 | yes | ✅ 1-to-1 |
| Leakage-safe cluster split (Fc edit distance) | FcCALM §3.3 | yes | ✅ 1-to-1 |
| Family-1 allotype hard negatives | FcCALM §2.7 | yes | ✅ 1-to-1 |
| Fc interface pooling | DMS map of specific residues (hinge/loops/FcRn motifs) | data-driven proxy + a DMS-derived map | ⚠️ approximated — not the exact gospel residue list |
| FcR interface pooling | co-crystal contacts ≤4.5 Å (gospel cites PDB 3AVE/1T89/3RY6/4X4M — see note†) | ✅ built 1-to-1, all 8 receptors (corrected PDB set), per-receptor pooling (§4.11) | ✅ now faithful |
| Stage-1 unfreeze | freeze 5 ep, then top-6 ESM layers, 20–50 ep, early-stop val R@1 | frozen embeddings; or LoRA r16 q/v, 15 ep, no R@1 stop | ⚠️ approximated — PEFT, fewer params + epochs |
| Hard-neg families 2–3 (interface mutants; profile swaps) | FcCALM §2.7 | ✅ built — 19,371-pair edit-distance index, wired (§4.11) | ✅ now faithful (family-4 ≈ FACS negatives) |
| Residue-level cross-attention | AR decoder cross-attending FcR token states (generation) | verifier-side soft cross-attention scorer (§4.8) | ⚠️ adapted to verification |
| Training length / data | ~20–50 ep; v1 = full Tier-1 library (5–15M pairs) | 15 ep; fully-labelled k=8 subset (5,066 Fc) | ⚠️ shorter + deliberately subset (partial labels collapse OOD, §4.4) |
| Cross-validation | nested 5-fold + CIs | single fold/seed per config | ⚠️ no CIs |
| Success axis | retrieval R@1/10/50, per-rec MCC≥0.85, exact≥0.90, allotype, unseen-receptor, scaling ΔBIC | FEV coverage-stratified MCC/AUROC (Fc-position OOD) + leave-one-receptor-out (§4.10) + allotype diagnostic | ⚠️ both axes now tested; retrieval/scaling still not |
| Decoder / Stages 2–3 (generation) | full AR decoder | not built | ❌ out of scope (verifier) |
† Correction to the gospel's PDB list. Verifying against RCSB, two of the four PDB IDs FcCALM.md cites for FcR-interface pooling are wrong: 3AVE is the fucosylated Fc fragment alone (no receptor — not an Fc–FcγRIIIa complex), and 4X4M is FcγRI–Fc (CD64), not Fc–FcRn. The corrected, fully-human co-crystal set actually covers all 8 receptors: FcγRI 4W4O/4X4M/4ZNE, FcγRIIa 3RY6, FcγRIIb 3WJJ, FcγRIIIa 3AY4/1E4K, FcγRIIIb 1T83/1T89, FcRn 4N0U/1I1A. So the FcR-pooling prior can be built 1-to-1 for every receptor — no borrowing or mean-pool fallback needed (contra an earlier assumption).
What this scopes the claim to (updated — gaps now closed). §4.11 builds the faithful version: per-receptor co-crystal FcR pooling + DMS Fc pooling + hard-neg families 1–3 + cross-attention + 5× data, combined. It confirms the Fc-position negative (OOD macro-AUROC 0.45–0.55, still chance), so the result is not an artifact of incompleteness. The components still un-built (the AR generative decoder, the full top-6 unfreeze, nested CV, the full multi-million-pair library) are unlikely to change it for the reason §5.4 gives — none adds training signal at never-varied positions — but we flag them as untested. Separately, the gospel's headline claim (unseen-receptor generalization) is tested and holds (§4.10). The negative result is precise: the Stage-1 verifier does not generalize past the covered Fc-position zone, even fully-faithful; the receptor axis is a different story.
The baseline to beat: one-hot at ood_0_50 MCC ≈ 0.09–0.11 / FPR ≈ 0.47–0.52
(covered_5pct MCC ≈ 0.93). All FcCALM runs are under runs/ws7_*.
The Stage-1 spike (ws7_spike: k=8, frozen ESM-2, mean pool) recognises binding inside the
covered zone: covered_5pct MCC 0.805, micro-AUROC 0.990 / macro-AUROC 0.987. The
InfoNCE objective converges and the 2-param calibration head is well-behaved. This validates
the basic CALM/MRC recognition claim on Fc–FcγR: in-distribution, the contrastive embedding
discriminates binders from non-binders nearly perfectly.
At θ=0.5 the spike appears to beat one-hot OOD: ood_0_50 MCC 0.092 → 0.217, FPR
0.517 → 0.145. This was the original "OOD crossover" result. The threshold-free lens
dissolves it:
ood_0_50 macro-AUROC = 0.540 — chance. The embedding does not rank binders above
non-binders OOD.The per-receptor OOD AUROCs confirm the macro number is barely estimable: positive counts are FcRn6 55, R2AR 13, R1 6, R3AV 5, R2B 3, R3B 3, R2AH 1, R3AF 1. Five of eight receptors rest on ≤6 positives. Only FcRn6 is well-powered, and there the spike is 0.814 — the OOD signal that exists is essentially one receptor (FcRn), consistent with FcRn's distinct biology.
Operational note: the low OOD FPR is genuinely useful for screening (few false positives), but it is conservative abstention, not learned OOD discrimination — and must not be reported as the latter.
Replacing mean pooling with a binding-determinant-weighted pool (the gospel's §2.4 prior) leaves OOD ranking at chance:
| pooling | OOD macro-AUROC | covered_5pct macro-AUROC |
|---|---|---|
mean (ws7_spike) |
0.540 | 0.987 |
data-driven (ws7_interface) |
0.507 | (≈0.97) |
DMS map (ws7_interface_dms) |
0.473 | (≈0.97) |
The data-driven map is OOD-blind by construction: it scores positions by their binding association in the training library, so the low-coverage OOD positions get ≈0 weight — the pool down-weights exactly the residues that differ OOD. The DMS map does carry signal at 178/190 OOD positions the library never varied, and still does not help: pooling/ reweighting fixed ESM-2 features cannot create OOD signal that is not in the features.
ws7_scaled (k≥4, 107k Fc) gives ood_0_50 MCC 0.130 /
FPR 0.323 — worse than the 5k k=8 spike.ood_0_50 MCC / FPR
by minimum known labels: k=8/5,066 → 0.217 / 0.145; k≥7/11.5k → 0.100 / 0.457; k≥6/24.5k
→ 0.132 / 0.422; k≥4/107k → 0.130 / 0.323. All trained healthy. The monotonic-completeness
hypothesis is rejected: only fully-labelled Fc give the (artifact) OOD MCC, and more
partial data does not recover it — masked partial labels break the structured-batch
cross-receptor InfoNCE and poison the calibration read-out.ws7_esm puts ESM-2 650M back in the graph via LoRA (rank 16 on q/v; 2.7M trainable, 0.41%;
15 epochs; InfoNCE 3.75→3.47). Threshold-free:
| bucket | frozen (ws7_spike) macro-AUROC |
ESM-LoRA (ws7_esm) macro-AUROC |
|---|---|---|
covered_5pct |
0.987 | 0.935 |
ood_0_50 |
0.540 | 0.647* |
*The apparent OOD gain is noise: it is driven by the single-positive receptors (R3AF's 0.24→0.998 flip alone accounts for ~0.095 of the 0.107 macro move). On the only well-powered receptor, FcRn6 (55 positives), ESM-unfreezing is worse (0.814→0.616); R2AR (13) also worse (0.583→0.446). In-distribution is flat-to-worse. Adapting the encoder did not create OOD signal — the failure is not a frozen-features artifact.
A 2-minute diagnostic from the ws7_spike checkpoint: the 8×8 cosine matrix of the trained
receptor embeddings (Appendix A.6). The decisive observation is that the single-residue
allotype siblings are not each other's nearest neighbours:
R2AH, R2AR) = 0.808, but R2AH's nearest neighbour is R3AF (a different gene)
at 0.928;R3AF, R3AV) = 0.895, but R2AR ≈ R2B (different genes) at 0.993.A sequence/structure-faithful encoder would place the 1-residue-apart pairs closest by far. It does the opposite: it clusters receptors by their training binding profile (which Fc variants they bind), not by sequence identity. The gospel's "critical design test" (§2.3) — distinct embeddings for single-residue allotypes — passes only in the narrowest sense (cos < 1.0); the geometry the WS7 hypothesis needs (a generalisable sequence→structure code) is not what the encoder built.
We ran the test the plan flagged as decisive (WS7 §4.3 #3): replace the receptor encoder
with a learned 8-row ID embedding (nn.Embedding(8, 512)), discard the receptor sequence
entirely, leave the Fc side and the recipe identical (ws7_recep_id,
model.encoder.receptor_id=true). Result, at every coverage bucket:
| bucket | receptor-ID (ablation) micro / macro-AUROC | receptor-encoder (ws7_spike) micro / macro |
|---|---|---|
covered_5pct |
0.992 / 0.990 | 0.990 / 0.987 |
covered_1pct |
0.815 / 0.752 | 0.804 / 0.755 |
partial_80_100 |
0.789 / 0.723 | 0.807 / 0.747 |
partial_50_80 |
0.776 / 0.794 | 0.775 / 0.786 |
ood_0_50 |
0.802 / 0.538 | 0.807 / 0.540 |
| OVERALL | 0.813 / 0.802 | 0.812 / 0.800 |
Per the plan: "if they tie, 'receptor structure helps OOD' is false and we say so." They tie — for scoring the 8 trained receptors, the sequence adds nothing over an ID, OOD or in-zone. Important correction (see §4.10): this does not mean the encoder learned nothing — the leave-one-receptor-out test shows it generalizes to an unseen receptor, a capacity that is simply redundant when all 8 are in training (an ID suffices). So read this result as "≡ ID for scoring trained receptors," and conclude only that receptor encoding is not the route to Fc-position OOD — not that the encoder is inert.
The pooling-bottleneck risk (FcCALM §2.8; the WS7 risk register) is that collapsing each
side to one 512-d vector discards per-position information — so a single mutation at an
interface position is washed out across ~232 residues. The gospel's named remedy is a
residue-level cross-attention that keeps per-residue states (MRC's "discrete contacts").
We implemented it as a readout (interaction=crossattn, runs/ws7_xattn): each Fc residue
softly attends (learned q/k, learnable sharpness γ) over the receptor residues, and the
pair score is the masked-mean contact energy over Fc residues — no pooling of either side,
feeding the same symmetric InfoNCE and the same calibration head. Result:
| bucket | cross-attn (ws7_xattn) macro-AUROC |
pooled cosine (ws7_spike) macro-AUROC |
|---|---|---|
covered_5pct |
0.991 | 0.987 |
covered_1pct |
0.733 | 0.755 |
partial_50_80 |
0.727 | 0.786 |
ood_0_50 |
0.568 | 0.540 |
| OVERALL | 0.777 | 0.800 |
OOD macro-AUROC moves 0.540 → 0.568, but this is within the noise floor (the only
well-powered OOD receptor, FcRn6 n=55, moves 0.814→0.843; the rest rest on 1–13 positives)
and remains ≈chance. Worse, residue resolution degraded in-distribution ranking
(OVERALL macro-AUROC 0.800→0.777; covered_1pct and partial buckets down), worsened
calibration (BCE 0.18→0.30), and collapsed θ=0.5 MCC (covered_5pct 0.805→0.595) as the
model became over-conservative (OOD FPR 0.047). Verdict: residue resolution was not the
bottleneck. Removing pooling neither unlocked OOD signal nor preserved in-zone quality.
Caveat: the head is single-attention-head, 15-epoch, with un-supervised (learned, not
DMS/co-crystal) contacts — under-tuned, and the in-zone MCC collapse is partly a
trainability/calibration symptom; but more tuning would recover in-zone quality, not
manufacture OOD signal the training data does not contain. This was the last
architectural lever (after pooling, unfreezing, and the receptor-ID ablation), and it
confirms the structural verdict from a fourth angle.
"Recognises binding in-distribution" needs a yardstick — and the yardstick is the existing one-hot MLP. On the metric available for both (θ=0.5 MCC), FcCALM trails one-hot in-zone:
| verifier | covered_5pct MCC | ood_0_50 MCC | ood_0_50 FPR |
|---|---|---|---|
| one-hot MLP (baseline) | 0.926 | 0.092 | 0.517 |
FcCALM ws7_spike (mean pool) |
0.805 | 0.217 | 0.145 |
FcCALM ws7_recep_id (learned ID) |
0.820 | 0.232 | 0.135 |
FcCALM ws7_esm (LoRA unfreeze) |
0.786 | 0.161 | 0.109 |
FcCALM ws7_xattn (cross-attention) |
0.595 | 0.216 | 0.047 |
Read honestly: - In-zone, one-hot wins (MCC 0.93 vs FcCALM's best ≈0.82). FcCALM is an excellent in-zone ranker (covered_5pct AUROC ≈ 0.99) but its calibrated accuracy sits below one-hot's — so "strong in-zone verifier" should read "competent in-zone ranker, below one-hot on accuracy." - OOD, neither has real ranking signal. One-hot's MCC 0.09 is the floor; FcCALM's 0.22 is the abstention artifact of §4.2 (its OOD macro-AUROC is chance), not better ranking. - FcCALM's only distinctive property is lower OOD FPR (conservative abstention) — operationally useful as a screening gate, but not a ranking advantage and not unique to the contrastive model (raising one-hot's threshold buys the same trade).
So FcCALM is not the best verifier we have on any axis that reflects skill: one-hot is better in-zone and OOD is a wash. The comparators that might beat one-hot OOD — ESM-C / FcGPT-embed encoders (WS2) and structural scorers (WS3) — were not run in this report. That is the open comparison, and the reason §6 recommends running WS3 next. (Caveat: we have in-zone MCC for both but AUROC only for FcCALM; the one-hot run emitted MCC/FPR, not calibrated probabilities for a clean AUROC A/B — so the in-zone comparison is on MCC.)
Everything above is the Fc-position axis. The gospel's actual headline generalization claim
(FcCALM §1.3, §6.2) is the receptor axis: hold out one of the 8 FcRs, train on the other
7, and predict the held-out receptor from its sequence. We ran it (runs/ws7_loro): the
held-out receptor is never a contrastive target and is excluded from calibration, so its score
is monotonic in cosine and its AUROC is the clean unseen-receptor metric. Overall FEV AUROC of
the held-out receptor (well-powered — n_pos 58–208), vs the full 8-receptor model (ws7_spike):
| held-out | allotype sibling in training? | LORO AUROC | full-model AUROC | Δ |
|---|---|---|---|---|
| R3AV | R3AF (1 residue) | 0.839 | 0.756 | +0.083 |
| R3B | no | 0.816 | 0.848 | −0.033 |
| R2AR | R2AH (1 residue) | 0.790 | 0.657 | +0.133 |
| R3AF | R3AV (1 residue) | 0.775 | 0.842 | −0.067 |
| R2B | no | 0.771 | 0.687 | +0.084 |
| R1 | no | 0.732 | 0.922 | −0.189 |
| R2AH | R2AR (1 residue) | 0.721 | 0.822 | −0.102 |
| FcRn6 | no | 0.170 | 0.863 | −0.693 |
| MEAN (all 8) | 0.702 | 0.800 | −0.098 | |
| MEAN (excl. FcRn) | 0.778 | 0.791 | −0.013 |
The receptor encoder generalizes to an unseen FcγR. Seven of eight held-out receptors score 0.72–0.84 — far above chance — and excluding the FcRn outlier there is essentially no penalty for never having trained on the receptor (0.778 vs 0.791). The allotype holdouts are the cleanest test (the held-out receptor's 1-residue sibling stays in training): R3AV→ 0.839, R2AR→0.790, both ≥ their fully-trained score. So the encoder reads receptor sequence and transfers across the single-residue allotype difference — the FcCALM thesis, on its own headline axis, holds.
The exception is FcRn (0.170, anti-correlated). FcRn is the biological outlier — pH- dependent, +β2m, ~290 aa, a CH2–CH3 interface rather than the lower-hinge FcγR interface, and no analog among the training seven. With nothing to interpolate from, the encoder places it on the wrong side of the Fc cloud. The lesson is graded: an unseen member of a represented family transfers; an unseen receptor type does not.
Reconciliation with §4.7. The receptor-ID tie is not contradicted: with all 8 receptors in training, an 8-way ID is sufficient to score them, so the sequence encoding is redundant there — but it carries a generalization capacity that is invisible in-distribution and only surfaces under leave-one-out. This is why §4.7's "≡ ID" must be read as "≡ ID for scoring the trained receptors," not "the encoder learned nothing." We retract the earlier blanket "receptor-encoding falsified." What is falsified is only the WS7 corollary that receptor encoding would fix Fc-position OOD — which it does not (§4.2–4.8), because that gap is on the Fc side.
The §3.5 audit flagged several gospel components as approximated or skipped, leaving open the objection that the Fc-position negative is an artifact of an incomplete build. We closed that objection by building all of them 1-to-1 and combining them: Fc interface pooling (DMS map) + per-receptor FcR interface pooling (≤4.5 Å co-crystal contacts, all 8 receptors — see the corrected PDB set in §3.5†) + hard-negative families 1–3 (allotype + a 19,371-pair interface-mutant / profile-swap index) + residue-level cross-attention + 5× more data (k≥6, 24,528 Fc). Three faithful models, scored threshold-free:
| model (all faithful) | covered_5pct | partial_50_80 | ood_0_50 | OVERALL |
|---|---|---|---|---|
ws7_fair — pooled (Fc+FcR), k=8 |
0.991 | 0.905 | 0.497 | 0.859 |
ws7_fair_xattn — cross-attention, k=8 |
0.992 | 0.774 | 0.554 | 0.798 |
ws7_fair_k6 — pooled, k≥6 (24.5k) |
0.907 | 0.614 | 0.451 | 0.549 |
ws7_spike — baseline (mean pool) |
0.987 | 0.786 | 0.540 | 0.800 |
| (macro-AUROC; 0.5 = chance) |
The Fc-position gap is unmoved. None of the three fully-faithful models lifts ood_0_50
macro-AUROC above chance (0.497 / 0.554 / 0.451, vs baseline 0.540). The negative result is
therefore not an artifact of incompleteness — it survives the most faithful build the
spec allows. (At θ=0.5 the faithful pooled model posts the highest OOD MCC of any run, 0.283
at FPR 0.083 — but that is once again the conservative-abstention artifact of §4.2, not OOD
ranking, since its OOD macro-AUROC is chance.)
A genuine positive, though — the faithful components work where there is signal. The
faithful pooled model is the best in-distribution FcCALM we trained: partial_50_80
macro-AUROC jumps 0.786 → 0.905 and OVERALL 0.800 → 0.859. So the gospel's interface
pooling and hard negatives are not inert — they sharpen the embedding exactly where training
data constrains it (in-zone and partially-covered), and do nothing only in the bucket where
no training example ever varied the position. That contrast — everything improves except
ood_0_50 — is the cleanest demonstration in this report that the OOD-position failure is a
property of the data/objective, not the architecture. (The k≥6 scaled run degraded
across the board — partial labels break the structured-batch recipe even when faithful,
reproducing the completeness finding of §4.4.)
The runs above are all the v0.1-style design (frozen ESM-2 → FFN projection → single global
head). The production SFM the Reddy-lab lineage actually uses (binderSFM v2.5; 91% R@1 OOD on
PINDER) is two generations ahead: a shared transformer backbone + symmetric
cross-attention + three heads (global pre-XA InfoNCE, plus interface and contact
auxiliary heads supervised by structure as labels). We reimplemented FcCALM to match it
(FcCALMv2, runs/ws7_v2): shared SequenceTransformerEncoder, SymmetricCrossAttention,
the pre-XA/post-XA routing (the v2.5 accommodation-collapse fix), interface + contact heads
supervised by the per-receptor co-crystal contact maps + interface masks (§4.11's labels),
magnitude-normalized multi-task loss. It trains healthy (L_global ~3.7, not collapsed →
the pre-XA routing works; contact loss 1.76→0.36 → the contact head learns the interface).
| bucket (macro-AUROC) | FcCALMv2 (full arch, k=8) | v1 spike (FFN, k=8) |
|---|---|---|
| covered_5pct | 0.941 | 0.987 |
| partial_50_80 | 0.727 | 0.786 |
| ood_0_50 | 0.558 | 0.540 |
| OVERALL | 0.656 | 0.800 |
Two results. (1) From scratch on 5,066 pairs, the full architecture underperforms the
simple FFN across the board — a 14M-param transformer + cross-attention + 3 heads underfits
this tiny-data regime where a frozen-ESM-2 FFN does not. This is binderSFM's own central
lesson (the foundation→specialize paradigm): abSFM is not trained from scratch, it is v2.5
specialized on SAbDab (14%→75% R@1). So the genuinely faithful path is to specialize the
real v2.5 foundation weights, not to train the v2.5 architecture from scratch on a small
domain set. (2) Fc-position OOD is still chance (0.558 ≈ 0.540) — the full faithful
architecture plus co-crystal multi-task supervision does not close it either, exactly as
binderSFM's own SKEMPI evidence (single-mutation ρ≈0.08) predicts. The architecture gap to the
production SFM is now closed in our code; the Fc-position gap is not closeable by architecture.
Artifacts: binding_v2.py, binding_v2_train.py, build_fcr_contact_labels.py,
configs/model/encoder/fccalm_v2.yaml, submit_ws7_v2.sbatch.
§4.12 trained the v2.5 architecture from scratch and it underfit — which is binderSFM's own
warning (specialize the foundation, don't retrain its architecture on a small set). We then
obtained the published foundation weights (SFM-BIIE-ETHZ/binderSFM on HuggingFace:
v25_b3_best.pth and the cross-kingdom v28_ep7_best.pth), reconstructed the exact model
(CALMEncoderV2; both load strict=True), and ran the proper abSFM specialization: init
from v2.8, fine-tune the multi-task heads on the Fc–FcγR structured batch + co-crystal labels
at lr 5e-5 for 12 epochs, fit the per-receptor calibration (runs/ws7_v2spec).
| bucket (macro-AUROC) | v1 (FFN) | v2 (scratch) | v2spec (specialized v2.8) |
|---|---|---|---|
| covered_5pct | 0.987 | 0.941 | 0.928 |
| covered_1pct | 0.755 | 0.661 | 0.810 |
| partial_50_80 | 0.786 | 0.727 | 0.858 |
| ood_0_50 | 0.540 | 0.558 | 0.529 |
| OVERALL | 0.800 | 0.656 | 0.812 |
Two results. (1) The foundation→specialize paradigm wins: v2spec is the best model
overall (0.812 > v1's 0.800, ≫ from-scratch v2's 0.656), with the largest gains in the
partially-covered buckets (covered_1pct +0.055, partial_50_80 +0.072) — the 91%-OOD-PPI
prior plus the structural multi-task heads genuinely help generalisation toward partially-seen
positions. This validates the abSFM lesson on Fc–FcγR and explains why from-scratch v2 failed.
(v1's frozen-ESM-2 FFN still edges the most-covered bucket — pure memorisation where data is
densest.) (2) Fc-position OOD is still chance (0.529 ≈ 0.540): specializing the genuine
production foundation does not lift the OOD bucket — the definitive confirmation, now with
the real binderSFM weights, that the position axis is a data/objective limit, not an
architecture/representation one (its own SKEMPI evidence predicted exactly this). FcCALM is now
as close to binderSFM as physically possible — the exact architecture, specialized from the
published v2.8 weights — and the two-axis verdict is unchanged. Artifacts: arch=calmv2 +
init_from in binding_v2_train, CALMEncoderV2.load_foundation,
configs/model/encoder/fccalm_v2spec.yaml, submit_ws7_v2spec.sbatch.
No representation-level lever produced OOD-position ranking signal. Interface/DMS pooling, data scale, label completeness, encoder unfreezing, residue-level cross-attention, and the receptor encoder itself all leave OOD macro-AUROC at chance (≈0.54). The failure is structural, confirmed from four independent angles (pooling, unfreeze, ID ablation, cross-attention): nothing in the InfoNCE objective sees never-varied positions, so nothing rewards extrapolation to them; and the Fc-side ESM-2 representation — frozen or LoRA-adapted, pooled any way — does not encode OOD-position binding effects in a form the contrastive geometry can read out. In-distribution the embedding is near-perfect; it simply does not transfer past the covered zone.
The receptor and Fc axes fail/succeed for opposite reasons, and seeing why explains the whole result. The receptor axis works because the encoder did learn a generalisable receptor→embedding function (§4.10): receptors live in a low-dimensional, sequence-smooth family (8 points, several 1-residue apart), so the function interpolates a held-out FcγR from its neighbours — and the explicit cross-receptor negatives in the structured batch give exactly the signal to learn it. (It breaks only for FcRn, which sits off that manifold.) The Fc- position axis fails because the objective rewards separating binders from non-binders among observed variants, and a pooled — or even residue-resolved — ESM-2 embedding of a never- varied position carries no library-grounded signal for that position: nothing in training ever varied it, so nothing rewards getting it right. Pooling cannot inject signal that is not in the features; reweighting a blind map cannot un-blind it; 0.41%-LoRA on q/v barely perturbs the features; and cross-attention can see the mutated residue but still has no trained signal for it. The receptor encoder generalises because its target manifold was densely sampled; the Fc side does not because the OOD positions were, by definition, never sampled at all.
Conclusion (two axes). On the receptor axis, FcCALM works: it generalizes to an unseen FcγR from sequence (§4.10, held-out AUROC 0.72–0.84, ≈no penalty ex-FcRn), validating the gospel's headline claim — the contrastive encoder learned a real receptor→embedding function, not a lookup. On the Fc-position axis, it does not: it produces no OOD-position ranking signal, and no lever moves it (pooling, unfreeze, receptor-ID, cross-attention all null), because that gap is on the Fc side where the screen never sampled the positions — a structural/objective limit, not an architecture-tuning one. Separately, as a plain in-zone verifier it trails one-hot on calibrated accuracy (covered_5pct MCC 0.81 vs 0.93; §4.9). So: keep FcCALM for what it is good at (receptor-conditioned tasks, unseen-receptor transfer); do not expect FcCALM-side tuning to close the OOD-position gap — pivot to structure (WS3) for that.
Next steps, prioritized:
1. Pivot to structure (WS3). ESM-IF / ProteinMPNN complex-conditioned log-likelihood
ratio (mutant vs WT) on the Fc–FcγR complex — crystal where available, ESMFold2-generated
otherwise — scored through the same harness. Structure reasons from 3D context present at
every position; it is the OOD plan's "natural OOD-position interpolator" and has never
been run. Mandatory first ablation: Fc-alone vs Fc+receptor, to prove the signal is
interface affinity, not Fc-domain stability.
2. Cheap diligence on FcCALM's residual value. Measure error-correlation of FcCALM's
prob_<R> with one-hot (and later ESM-C / ESM-IF). If < 0.6, FcCALM earns a place as a
decorrelated ensemble member even though its standalone OOD is weak (the FLIP2-endorsed
ensemble win) — the only remaining reason to keep it in the pipeline.
3. Settle the theory once (independent of OOD). Run the prescribed scaling curve
(subsample diversity 1/5/10/25/50/100%, fit exponential vs power-law, ΔBIC) — the clean
test of MRC's central convergence prediction, which the OOD question never addressed.
4. Remaining untested levers (now few, all low-prior). The §4.11 fully-faithful build
tested per-receptor co-crystal FcR pooling, hard-neg families 1–3, cross-attention, and 5×
data — all null on Fc-position OOD. What is still unbuilt: the full top-6-layer unfreeze,
nested CV, the multi-million-pair full library, and the autoregressive decoder (a
generation component, out of scope for a verifier). None adds training signal at
never-varied positions, so none is expected to change the Fc-position verdict; listed for
completeness, not as promising leads.
covered_5pct 86 · covered_1pct 90 · partial_80_100 104 · partial_50_80 435 ·
ood_0_50 1230.
| run | covered_5pct MCC | ood_0_50 MCC | ood_0_50 FPR | OVERALL MCC |
|---|---|---|---|---|
| one-hot (baseline) | 0.926 | 0.092 | 0.517 | 0.277 |
ws7_spike (k=8, mean) |
0.805 | 0.217 | 0.145 | 0.345 |
ws7_scaled (k≥4) |
— | 0.130 | 0.323 | — |
ws7_esm (LoRA unfreeze) |
0.786 | 0.161 | 0.109 | 0.334 |
ws7_recep_id (ablation) |
0.820 | 0.232 | 0.135 | 0.345 |
ws7_xattn (cross-attention) |
0.595 | 0.216 | 0.047 | 0.217 |
| run | covered_5pct | ood_0_50 | OVERALL |
|---|---|---|---|
ws7_spike (encoder, mean) |
0.987 | 0.540 | 0.800 |
ws7_interface (data-driven pool) |
— | 0.507 | — |
ws7_interface_dms (DMS pool) |
— | 0.473 | — |
ws7_esm (LoRA unfreeze) |
0.935 | 0.647 (noise) | 0.819 |
ws7_recep_id (learned ID) |
0.990 | 0.538 | 0.802 |
ws7_xattn (cross-attention) |
0.991 | 0.568 (noise) | 0.777 |
ws7_fair (faithful pooled Fc+FcR + families 1–3, k=8) |
0.991 | 0.497 | 0.859 |
ws7_fair_xattn (faithful cross-attn + families, k=8) |
0.992 | 0.554 | 0.798 |
ws7_fair_k6 (faithful pooled, k≥6 24.5k) |
0.907 | 0.451 | 0.549 |
ws7_v2 (binderSFM arch, from scratch) |
0.941 | 0.558 | 0.656 |
ws7_v2spec (specialized published v2.8) |
0.928 | 0.529 | 0.812 |
ood_0_50)FcRn6 55 · R2AR 13 · R1 6 · R3AV 5 · R2B 3 · R3B 3 · R2AH 1 · R3AF 1 (n_neg ≈ 420–500 each).
| receptor | n_pos | ws7_spike (encoder) |
ws7_recep_id (ID) |
|---|---|---|---|
| FcRn6 | 55 | 0.814 | 0.780 |
| R2AR | 13 | 0.583 | 0.517 |
| R1 | 6 | 0.668 | 0.711 |
| R3AV | 5 | 0.639 | 0.629 |
| R2B | 3 | 0.805 | 0.711 |
| R3B | 3 | 0.440 | 0.429 |
| R2AH | 1 | 0.129 | 0.423 |
| R3AF | 1 | 0.240 | 0.103 |
ws7_spike) R1 FcRn6 R2AH R2AR R2B R3AF R3AV R3B
R1 1.000 -0.357 0.283 0.138 0.185 0.436 0.245 0.301
FcRn6 -0.357 1.000 0.089 0.187 0.155 -0.023 0.043 0.023
R2AH 0.283 0.089 1.000 0.808 0.817 0.928 0.823 0.910
R2AR 0.138 0.187 0.808 1.000 0.993 0.769 0.919 0.548
R2B 0.185 0.155 0.817 0.993 1.000 0.758 0.889 0.570
R3AF 0.436 -0.023 0.928 0.769 0.758 1.000 0.895 0.798
R3AV 0.245 0.043 0.823 0.919 0.889 0.895 1.000 0.600
R3B 0.301 0.023 0.910 0.548 0.570 0.798 0.600 1.000
Allotype pairs: cos(R2AH,R2AR)=0.808, cos(R3AF,R3AV)=0.895. Off-diagonal min −0.357, mean 0.490, max 0.993. Allotype siblings are not mutual nearest neighbours.
ood_0_50 MCC / FPR by min known labels)k=8/5,066 → 0.217 / 0.145 · k≥7/11.5k → 0.100 / 0.457 · k≥6/24.5k → 0.132 / 0.422 · k≥4/107k → 0.130 / 0.323.
Code. Fc-CALM/src/calm/encoder/binding.py (FcCALM, InfoNCE, calibration,
receptor_id ablation mode, data-driven pooling), binding_data.py (structured sampler),
binding_mining.py (family-1 hard negatives), binding_esm.py (LoRA path),
binding_train.py (stage=fccalm). Config Fc-CALM/configs/model/encoder/fccalm.yaml.
Eval. scripts/eval/calm_predict.py (adapter:calm → predictions parquet),
scripts/eval/fev_stratified.py (θ=0.5 scoreboard), scripts/eval/fev_auroc.py
(threshold-free per-bucket micro/macro AUROC). Coverage zone:
runs/_diag/coverage_zone_retraining_v2.json.
Runs. runs/ws7_{spike,scaled,completeness,k6,k7,interface,interface_dms,esm,recep_id,xattn,loro,fair,fair_xattn,fair_k6}.
Slurm: scripts/training/fccalm/submit_ws7_{spike,scaled,esm,interface,interface_dms,recep_id,xattn,loro,fair}.sbatch.
Modes/flags in binding.py / fccalm.yaml: interaction=crossattn, receptor_id=true,
binding.holdout_receptor=<R> (LORO), binding.recep_interface_map_path (per-receptor 2D
co-crystal pooling), binding.hard_neg_index_path (families 2–3). LORO summary:
scripts/eval/loro_summary.py. Family-2/3 index: build_hard_neg_index.py →
runs/_diag/fccalm_hard_neg_index.parquet (19,371). FcR co-crystal map:
build_fcr_interface_map.py → data/fc_interface/recep_position_weights.npy (8 receptors).
Key reproduction commands.
# decisive ablation (receptor-encoder vs learned receptor-ID)
sbatch scripts/training/fccalm/submit_ws7_recep_id.sbatch
# threshold-free A/B of any two runs
PYTHONPATH=src .venv/bin/python scripts/eval/fev_auroc.py \
--preds runs/ws7_recep_id/eval/calm_fev_predictions.parquet \
runs/ws7_spike/eval/calm_fev_predictions.parquet
Infra note. The binding DataLoader deadlocks on a large fp16 mmap with num_workers>0;
use FcBindingData.from_dir(preload=True) (sequential RAM load) + num_workers=0 +
PYTHONUNBUFFERED=1. Never stage durable run data under /tmp (cleared mid-run).
| data name | receptor | UniProt | ECD | allotype |
|---|---|---|---|---|
R1 |
FcγR1 (CD64) | P12314 | ~276 aa | — |
FcRn6 |
FcRn (+β2m) | P55899 | ~290 aa | α-ECD + β2m |
R2AH |
FcγR2A-H167 | P12318 | ~175 aa | 167H |
R2AR |
FcγR2A-R167 | P12318 | ~175 aa | 167R |
R2B |
FcγR2B | P31994 | ~175 aa | — |
R3AF |
FcγR3A-F176 | P08637 | ~190 aa | 176F |
R3AV |
FcγR3A-V176 | P08637 | ~190 aa | 176V |
R3B |
FcγR3B | O75015 | ~190 aa | — |
The allotype pairs (R2AH/R2AR, R3AF/R3AV) differ by a single residue and are the
"critical design test" of §2.3 / §4.6.