Absolute-units GLODAP alkalinity anchor vs the R_PICPOC ⊕ iron-pair mutex (box scale)¶
⚠ SUPERSEDED FRAMING (2026-06-27). This is a point-in-time record; its data and negative results stand, but its framing is corrected by STATUS.md and
docs/research_notes/2026-06-27_box_homogenization_DEFINITIVE.md. Specifically: R_PICPOC is NOT a "6/6 wall" and is NOT cluster-gated — it recovers at 1° box scale given a real calcite anchor (Daniels CP:PP / MODIS PIC) plus theRATIO_MAX=2fix for the contaminated Southern-Ocean ratio target; the differentiable Darwin calcite port and native resolution were tested and did not help. The project is reframed as a surrogate-to-model identifiability study over 4 OBSERVABLE params {alpfe, scav_rat, diatomgraz, R_PICPOC}; the growth pair {Smallgrow, Biggrow} is unobservable by construction (excluded, not failed). The surrogate gap is dimensional (the 0-D box homogenizes spatial structure, tracer CV→1e-15), so box-vs-Darwin spatial-pattern correlations are not fidelity metrics — identifiability comes from real absolute anchors.
Date: 2026-06-15 · Status: COMPLETE — NULL (mutex holds); NO-GO. An
apparent co-recovery (13/20) passed the pre-registered reproducibility gate but
was falsified as a cell-weighted averaging artifact by per-AOI decomposition
+ a 5-lens adversarial panel + a Darwin-ALK-source control. Branch
2imi9/schultz-jon-deck, behind NEW default-OFF flags ALK_ABS_W /
ALK_ABS_SOURCE (legacy reproduces bitwise when unset). The Tuesday (2026-06-16)
deck is FINAL and untouched; the null leaves its framing intact and better
supported.
Question¶
Does any laptop-feasible lever break the binary mutex
R_PICPOC ⊕ {iron pair (alpfe + scav_rat) + diatomgraz} — i.e. recover
R_PICPOC to Cal-grade without collapsing the iron pair — under the v3.2
Eppley config? The PIC magnitude anchor (PIC_ABS_W) recovers R_PICPOC 8/10
but wipes the iron pair → 0/10 (binary, dose-independent). Architecture levers
(PER_AOI_DINN, per-param gating, DINNDeep) are already falsified. Only new
information can move it, so we test the cheapest independent source:
total alkalinity (ALK).
Rationale (as proposed): calcite formation changes ALK in a 2:1
stoichiometry — a carbonate counter-pump signature hypothesised to be
independent of the organic-export (POC/mort) budget. If ALK gives R_PICPOC
an independent handle, it could co-recover with the iron pair, unlike the PIC
anchor that wipes it.
Forward-model analysis (registered BEFORE running — the a-priori prediction)¶
Read of src/darwindiff/carroll6_5pft_2layer.py (the box):
# surface (L1) tendencies — calcite_mort_src = mort_total_1 by default
dPIC_1 = R_PICPOC * calcite_mort_src - pic_sink_out_L1 # line 423
dALK_1 = -2.0 * R_PICPOC * calcite_mort_src # line 435
Two facts make a clean co-recovery a-priori unlikely:
-
ALK shares PIC's exact factorization. The ONLY process touching surface ALK in the box is calcite formation, and it enters as the identical product
R_PICPOC × calcite_mort_src(=R_PICPOC × mort_total) that drives PIC. There is no nitrate/organic-alkalinity term, so the box's ALK is not "independent of the organic-export budget" — it is a pure calcite signal governed by the same product. Any observable that constrainsR_PICPOC × mort_totalcannot, by itself, splitR_PICPOCfrommort_total(which the iron pair + diatomgraz own). This is the factorization/ identifiability degeneracy, restated: ALK is informationally equivalent to PIC for theR_PICPOC/mort_totalsplit. -
The absolute ALK signal is IC-dominated (likely weaker than PIC). Surface ALK has no source term, only the calcite sink, so over the 50-day box integration (
N_STEPS=200 × DT=0.25)ALK_1barely drifts from its Darwin-IC initial value (~2360 mmol/m³). The calcite-driven drawdown is a tiny perturbation on a large IC-set baseline, and the scale-normalized MSE (residual² / mean(target²), denominator ~2360²) makes theR_PICPOC- controllable part of the gradient very small. Contrast PIC, whose steady-state levelPIC_1 = R_PICPOC·mort_total / W_SINK_PICis small-magnitude and directly set by the product — a strong, scale-matched signal. So the ALK anchor may not even recoverR_PICPOC(unlike PIC), let alone co-recover it with the iron pair.
Registered prediction: NULL (mutex not broken). Two candidate mechanisms, distinguished by the run:
- (a) Signal-weakness / IC-dominance:
R_PICPOCstays ~unrecovered and the iron pair is ~preserved (the anchor is too weak to perturb anything). - (b) Factorization mutex (PIC-like): at large enough weight
R_PICPOCrecovers but the iron pair collapses → same binary mutex as PIC.
A clean co-recovery (R_PICPOC and iron pair both Cal-grade in the same
seed, reproducibly) would be the genuine surprise worth reporting and the only
GO outcome. Historical prior (v2.1 nb22) used GLODAP ALK as a fit target and
pulled R_PICPOC 360% → 74% but degraded the iron pair — consistent with the
mutex re-appearing.
Method¶
- Lever: new
ALK_ABS_Wenv var inscripts/run_v3.0_joint_multi_aoi.py(default0.0= OFF). When> 0, adds a scale-normalized absolute-units MSE between the box's surfaceALK_1and a real GLODAP TAlk target, mirroring the existingPIC_ABS_W/POC_ABS_Wabsolute-anchor pattern exactly. - Target: GLODAPv2.2016b mapped climatology
TAlk(µmol/kg), surface level, AOI-subset, regridded (nearest) onto the AOI's Darwin 1° grid, converted to mmol/m³ via ρ_sw = 1025 (glodap_loader.to_mmol_per_m3). Real ship-CTD observations, no model in the loop — a genuinely out-of-sample observable. - Config = the v3.2 Eppley best (the reproducible-5/6 operating point):
AOIS=eqpac,natlsubpolar,southernoceanpac,POSI_W=1.0,AOI_W_NATLSUBPOLAR=2.0,AOI_W_SOUTHERNOCEANPAC=2.0,CHL1_W_EXTRA=3.0,POSI_DARWIN_W=0.5,USE_EPPLEY_T=1, 1500 epochs. - No forward-model change.
ALK_1/dALK_1already exist; Track A is a runner-side loss term only.carroll6_5pft_2layer.pyis untouched by this experiment.
Pre-registered design¶
- Paired seeds 0–9 (n=10) per arm:
- control = Eppley best,
ALK_ABS_W=0(re-run fresh for an exact paired comparison; reproduces the documented Eppley control bitwise). - test = +
ALK_ABS_W ∈ {1.0, 10.0, 100.0}(dose sweep; a range up to an ALK-dominant weight so the IC-dominance/signal-weakness mechanism gets its fairest shot at actually movingR_PICPOC). Top end raised from the initial {0.1, 1.0, 10.0} after the forward-model probe (below) showed the scale- normalized ALK R_PICPOC signal is ~60,000× weaker than PIC's — a clearly-inert 0.1 was dropped and a forcing 100.0 added. Refinement made on the probe (setup) only, before any optimizer/sweep result. - Scoring:
diagnostics.band_ofonabs(recovered − Carroll)/abs(Carroll)— Cal-grade ≤ 0.40, Excellent ≤ 0.05. Joint cell-weighted recovery (the default), per Carroll 2022 published values. - SUCCESS (GO):
R_PICPOCCal-grade AND iron pair (alpfe+scav_rat) Cal-grade in the same seed, reproducibly. Screen n=10; only if ≥ 2/10 seeds show co-recovery do we extend to n=20 + split-half. - NULL (expected): mutex re-appears (mechanism a or b). Write a clean confirmation; do not change the deck. A null confirms the limit is informational — i.e. the cluster/AICR case.
- Anti-p-hack guards: paired seeds, dose sweep (not a single weight), reproducibility gate before any n=20 extension, both candidate-null mechanisms named in advance. Single-seed 5/6 events are treated as flukes (the project has documented fluke 5/6 events that vanished on retest), not co-recovery.
Forward-model probe (magnitudes; setup verification, run before the sweep)¶
Filled in after the probe — quantifies IC-dominance: box ALK_1 initial (IC)
vs final, calcite-driven drawdown, GLODAP target, IC-vs-GLODAP residual, and
∂ALK_1/∂R_PICPOC. Distinguishes which null mechanism to expect.
Probe (%LOCALAPPDATA%\ddeck\alkabs\probe_alk_signal.py, eqpac, Carroll params,
Eppley ON, 1071 ocean cells):
| quantity (masked mean) | value |
|---|---|
| GLODAP TAlk target | 2334.4 mmol/m³ |
| box ALK_1 initial (Darwin IC) | 2326.1 |
| box ALK_1 final (50-day box) | 2322.2 |
| calcite-driven drawdown (IC − final) | 3.91 mmol/m³ (~0.17%) |
| IC − GLODAP residual | −8.2 (box IC already undershoots GLODAP) |
| final − GLODAP residual | −12.2 |
d(mean ALK_1)/d(R_PICPOC) |
−92.2 |
d(mean PIC_1)/d(R_PICPOC) |
+9.41 |
scale-normalized signal ALK |∂/∂Rpp|/target |
0.039 |
scale-normalized signal PIC |∂/∂Rpp|/target |
2340 |
Two things the probe establishes (both point to a null):
- The absolute ALK anchor carries ~60,000× less R_PICPOC signal than PIC
(0.039 vs 2340) — because the box's surface ALK is IC-dominated (calcite
moves it only ~0.17%), while box PIC is calcite-defined (
PIC_1runs 0.0085 → 0.40 over the integration; R_PICPOC sets its entire magnitude). The scale-normalized ALK MSE is therefore near-inert on R_PICPOC at any reasonable weight. - What little ALK gradient exists points the wrong way. The Darwin IC
alkalinity already undershoots GLODAP (−8 mmol/m³), and calcite drawdown
makes the box final worse (−12). Minimizing the ALK residual therefore drives
R_PICPOCdown (less drawdown, higher ALK) — away from Carroll (0.042), toward 0. So the anchor cannot recover R_PICPOC even in principle; at most it degrades it.
This is a stronger a-priori null than "PIC-like mutex": the ALK anchor is expected to leave R_PICPOC ~unrecovered (and possibly push it toward 0) while the weak/mis-directed gradient leaves the iron pair ~intact — i.e. mechanism (a), signal-weakness, with the gradient mis-directed. The sweep tests this directly (and captures the indirect ALK→pCO2→F_CO2 carbonate coupling the probe's direct ∂ALK/∂R_PICPOC omits).
Result — the short version¶
NULL: the mutex holds. The ALK anchor does not genuinely break
R_PICPOC ⊕ {iron pair}. An apparent co-recovery (13/20, plus 3/20 "6/6")
that passed the pre-registered reproducibility gate turned out, under adversarial
scrutiny + per-AOI decomposition, to be a cell-weighted averaging artifact:
R_PICPOC is recovered in no single AOI — the joint metric only crosses
Carroll because the per-AOI values straddle it. Decision: NO-GO (the expected
outcome). All runs uncommitted, default-OFF; the deck is untouched.
Result — dose response (n=20 paired; seeds 0–9 + 10–19 split-half)¶
Config = v3.2 Eppley best. Compiled (triton-windows restored; numerically
equivalent to eager). Scored with diagnostics.band_of (Cal ≤0.40, Exc ≤0.05),
joint cell-weighted recovery.
| arm | ALK_ABS_W | mean/6 | iron pair | R_PICPOC (joint) | co-recovery | 6/6 | loss |
|---|---|---|---|---|---|---|---|
| c0 (control) | 0 | 3.85 | 18/20 | 0/20 | 0/20 | 0/20 | 40.0 |
| a1 | 1.0 | 3.85 | 18/20† | 0/20 | 0/20 | 0/20 | 40.0 |
| a10 | 10.0 | 4.00 | 17/20 | 2/20 | 2/20 (split 2+0) | 1/20 | 39.9 |
| a100 | 100.0 | 4.35 | 14/20 | 14/20 | 13/20 (6+7) | 3/20 | 40.2 |
| a300 | 300.0 (n=10) | 4.10 | 6/10 | 7/10 | 6/10 | 1/10 | — |
| a100d | 100.0, src=darwin (n=10) | 4.10 | 7/10 | 4/10 | 4/10 | 1/10 | — |
(† a1 ≈ control, as the forward-model probe predicted at low weight.)
At face value a100 passed the pre-registered GO gate: co-recovery reproduced in
both split-halves (6/10 + 7/10), control reproduced the documented Eppley baseline
exactly, recovered joint R_PICPOC sat on Carroll (0.040–0.057 vs 0.0425), and
total loss was flat. This looked like a genuine mutex break — the morning's
predicted null appeared falsified.
The refutation — it is a cell-weighted averaging artifact¶
A five-lens adversarial panel (each reading the raw JSONs + box code) and a direct per-AOI decomposition overturned the strong claim:
No single AOI recovers R_PICPOC. Of the 13 a100 co-recovery seeds, only
2 have any AOI's R_PICPOC within Cal-grade. The structure is systematic:
| eqpac (wt 1071) | natl (wt 482) | SO (wt 1280) | joint (cell-wt mean) | |
|---|---|---|---|---|
a100 per-AOI R_PICPOC |
~0.005–0.012 | ~0.06–0.08 | ~0.07–0.09 | ~0.045 ✅ |
| rel offset vs Carroll | 0.71–0.87 | 0.13–0.88 | 0.55–1.17 | ~0.05–0.35 |
The anchor applies a ~uniform downward pressure on R_PICPOC in every AOI
(consistent with the probe's ∂ALK/∂R_PICPOC < 0 and the IC-undershoot
mechanism): it drives eqpac toward 0, drags natl/SO down from far-too-high, and
the cell-weighted mean crosses Carroll only because the per-AOI estimates
straddle it. Worse, eqpac — the one AOI nearly right in control (0.034, ~20%
off) — is pushed to ~0.006 (87% off). Even the three "6/6" seeds have per-AOI
R_PICPOC offsets of 0.38–1.00. This is a metric/aggregation artifact riding
on an under-determined forward model, not physical identifiability.
The artifact is specific to R_PICPOC; the metric is otherwise sound. In the
control, every joint-Cal alpfe (18/20) and scav_rat (20/20) seed has ≥1 AOI
(median 2) genuinely in Cal-grade — the iron pair is per-AOI real. R_PICPOC is
the lone parameter that is per-AOI unidentified in every AOI (even in
control), which is exactly why its joint metric is the one vulnerable to
straddling.
Three independent corroborations:
- Darwin-ALK source (a100d): anchoring to Darwin's own ALK reproduces the identical straddle (eqpac 0.011, natl/SO 0.12) and artifactual co-recovery. So the effect is generic absolute-ALK-magnitude deflation, not real-GLODAP information — killing the "out-of-sample observable" framing (GLODAP also ≈ Darwin ALK to 0.36%, and GLODAP was in Carroll's own calibration set).
- Dose (a300): 3× weight only deepens the deflation (eqpac → 0.014) and erodes the iron pair further (6/10) — never a genuine per-AOI recovery.
- Forward-model probe (pre-registered): the box's surface ALK is calcite-
only (
dALK_1 = −2·R_PICPOC·mort_total, no nutrient/riverine source) and IC-dominated; matching GLODAP pins the cumulative drawdown to close a fixed Darwin-IC-vs-GLODAP offset (~8 mmol/m³) → uniform downwardR_PICPOCpressure, not identification.
Panel verdicts: forward-model lens = fatal (claim does not survive); scoring + circularity = serious (iron pair erodes — mean alpfe offset rises 0.31→0.38 with dose, 2 seeds newly Drifted; "without collapsing" and "out-of-sample" both overstated); statistical = minor (numbers reproduce exactly, pre-registration is sound, but co-recovery is band-fragile: 13/20 at Cal=0.40 → 5/20 at 0.30 → 0/20 at 0.20); over-weighting = minor ("flat loss ⇒ no tradeoff" is a void argument, though the decomposed non-ALK loss does hold).
Interpretation / decision¶
The R_PICPOC ⊕ {iron pair + diatomgraz} mutex is NOT broken by an alkalinity
anchor. R_PICPOC enters the box only as the product R_PICPOC × mort_total
(in both PIC and ALK), and the box's calcite-only, IC-dominated ALK budget
gives no independent per-AOI handle on the split. The apparent co-recovery was
the joint cell-weighted metric being fooled by straddling — confirmed by per-AOI
decomposition, the Darwin-source control, the dose-response, and five adversarial
lenses. This is the same conclusion as the PIC anchor reached (R_PICPOC is
box-scale unidentifiable), via a subtler failure mode. It strengthens the
cluster-gated / AICR framing rather than weakening it.
Decision: NO-GO on adding a line to the talk. The deck's existing framing ("R_PICPOC is the sole 6/6 wall, cluster-gated, exhaustive box-scale exclusion") stands and is now better supported (a 7th exclusion: real + model alkalinity, absolute-anchored, across a dose sweep). Nothing changes in the deck.
Methodological catch worth keeping: for a parameter that is per-AOI
unidentified (R_PICPOC), the joint cell-weighted recovery metric can be
manufactured by an anchor that makes per-AOI estimates straddle the target.
Report R_PICPOC recovery per-AOI, not only as the joint mean. (The iron
pair and diatomgraz pass the per-AOI test, so prior documented recoveries of
those are unaffected.)
Proposed clean confirmation (follow-on, not run today): an IC-perturbation
test — shift the Darwin ALK IC to match GLODAP and confirm the optimal
R_PICPOC collapses toward 0 in every AOI, demonstrating the result is an
IC-offset artifact by construction. Code path: a small ALK_IC_SHIFT flag.
Reproduce¶
# n=20 dose sweep (control + ALK_ABS_W 1/10/100), seeds 0-9 then 10-19:
ALK_STAMP=mutex ALK_SEEDS=0,1,2,3,4,5,6,7,8,9 python <orchestrator> # arms c0,a1,a10,a100
ALK_STAMP=mutex2 ALK_SEEDS=10,...,19 ALK_ARMS=c0,a10,a100 python <orchestrator>
# controls: a300 (dose top) + a100d (Darwin-ALK source):
ALK_STAMP=mutex3 ALK_ARMS=a300,a100d python <orchestrator>
# single run, GLODAP ALK anchor on the Eppley best config:
DARWIN_DATA_ROOT=D:/ecco_darwin_v5 GEOTRACES_DATA_ROOT=D:/geotraces \
GLODAP_DATA_ROOT=<...GLODAPv2.2016b_MappedClimatologies> \
AOIS=eqpac,natlsubpolar,southernoceanpac POSI_W=1.0 \
AOI_W_NATLSUBPOLAR=2.0 AOI_W_SOUTHERNOCEANPAC=2.0 CHL1_W_EXTRA=3.0 \
POSI_DARWIN_W=0.5 USE_EPPLEY_T=1 ALK_ABS_W=100 TORCH_COMPILE_BATCHED=1 \
NB23_SEEDS=0,...,9 OUTPUT_DIR=<out> python scripts/run_v3.0_joint_multi_aoi.py
%LOCALAPPDATA%\ddeck\alkabs\ (sweep_alk_abs.py,
probe_alk_signal.py, analyze_n20.py). Run JSONs: D:\runs\alk_mutex{,2,3}\.