← all reports

FcCALM for Fc–FcγR Binding Prediction: Unseen-Receptor Generalization Holds, Out-of-Distribution-Position Generalization Does Not

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).


Abstract

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.


1. Introduction

1.1 The problem

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.

1.2 The bet

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.

1.3 Summary of findings

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.


2. Background and theory

2.1 Molecular Recognition Computing (MRC; Reddy 2026)

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.

2.2 CALM (Lee et al. 2026)

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.

2.3 FcCALM (the specialization)

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).

2.4 What the theory does and does not promise about OOD

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.


3. Methods

3.1 Data

3.2 Architecture and objective

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.

3.3 Training protocol

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.

3.4 Evaluation — and a methodological correction

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.

3.5 Fidelity to the specification — what is 1-to-1, approximated, or skipped

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:

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.


4. Results

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_*.

4.1 In-distribution recognition works

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.

4.2 OOD generalization fails — and the early "win" is an artifact

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:

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.

4.3 Interface pooling does not help

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.

4.4 Data scale and label completeness do not help

4.5 Encoder unfreezing does not help

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.

4.6 The receptor encoder is a profile-ID, not a structure code

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:

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.

4.7 The decisive ablation: receptor-encoder ≡ receptor-ID

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.

4.8 Residue-level cross-attention does not fix OOD (the last architectural lever)

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.

4.9 Head-to-head: how good a verifier is FcCALM, actually?

"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.)

4.10 Leave-one-receptor-out: the receptor encoder DOES generalize (the gospel's headline)

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.

4.11 The fully-faithful build: every gospel component 1-to-1 — confirms the Fc-position verdict

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.)

4.12 FcCALMv2 — the binderSFM-v2.5-faithful architecture

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.13 Specializing the real binderSFM foundation — our best model, OOD still chance

§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.


5. Discussion

5.1 Verdict on the OOD-position question

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.

5.2 Verdict on MRC

5.3 Verdict on CALM

5.4 Why the two axes diverge (the mechanism)

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.

5.5 Threats to validity / caveats


6. Conclusions and next steps

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.


Appendix A — Full results

A.1 Coverage buckets (FEV, 1,945 scored after 29 train-overlap excluded)

covered_5pct 86 · covered_1pct 90 · partial_80_100 104 · partial_50_80 435 · ood_0_50 1230.

A.2 θ=0.5 stratified MCC / FPR (headline harness)

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

A.3 Threshold-free macro-AUROC by bucket

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

A.4 OOD per-receptor positive counts (FEV ood_0_50)

FcRn6 55 · R2AR 13 · R1 6 · R3AV 5 · R2B 3 · R3B 3 · R2AH 1 · R3AF 1 (n_neg ≈ 420–500 each).

A.5 OOD per-receptor AUROC (encoder vs ID; illustrates noise)

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

A.6 Receptor-embedding cosine matrix (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.

A.7 Completeness sweep (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.


Appendix B — Artifacts and reproduction

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).


Appendix C — The 8 receptors

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.