Rank-floor check — 2026-10-23
Paper-grade size and power check of the PLS latent-space rank floor (
min_components=2, MOTCO 0.10.0) against the unfloored 0.9.0 rule at the Phase 6 SEA-AD design (openspec/changes/archive/2026-10-23-minimum-latent-rank/, design D7, specrank-floor-validation). It is the gate behind the default flip:motco analyzeand the simulation harness select the PLS rank from candidates at or above 2 only once this check names the floor-2 arm admissible. Every number below is read fromresults/rank-floor-2026-10-23/(delta0.05/anddelta0.1/:rank_floor_decision.json,rank_floor_rates.csv,rank_floor_replicates.csv,rank_floor_pvalues.csv,merged.jsonl, the last three kept on ing asPROVENANCE.txtrecords;calibration/;smoke-delta0.05/,smoke-delta0.1/). Rates are rejection rates at p ≤ 0.05 over the available replicates of 500, at 999 permutations.
Run: two SLURM arrays of 100 shards on ing (partition 512x1024): job 925691 for δ = 0.05 and job 925791 for
δ = 0.1, 7,000 units each, 100 / 100 tasks completed, 0 arm failures, 53.0 + 45.8 recorded
core-hours (29 and 25 s per unit, two analyses at 999 permutations). The code is local main at 0a15d44 plus this
change's working tree, rsynced over the cluster checkout and verified by tree hash; file hashes are in each
PROVENANCE.txt.
Decision: adopt_floor at δ = 0.05 and adopt_floor at δ = 0.1, hence adopt_floor under the predeclared
conjunction. The floor-2 arm holds the bound 0.0695 for every statistic at both controls in both runs.
In one paragraph. At the Phase 6 SEA-AD design with the stage signal weakened until the unfloored rank rule
selects rank 1 in 58 % (δ = 0.05) and 42 % (δ = 0.1) of the null replicates (held-out CV AUROC
0.51 and 0.57), each of 7,000 units per strength was analysed twice on the same data and permutation draws,
with the 0.9.0 rule and with the rank floor of 2. In the floored arm the zero-effect anchor rejects delta 0.042 / 0.044,
angle 0.054 / 0.060 and shape 0.036 / 0.038 (δ = 0.05 / 0.1), and the translation
control 0.036 / 0.036, 0.046 / 0.042 and 0.026 / 0.030, all at or below
0.0695 at R = 500. The floor lifted 4,257 and 3,228 rank-1 selections, mostly to rank 2; in the unfloored arm every rank-1 unit measured
angle as exactly 0° or 180° with a two-point null that never rejected. Power is at the null in both arms at
these strengths, so the check establishes size, not a gain: the floor defines angle and shape where the 0.9.0
rule left them degenerate, and the record's spectrum and null summary say how resolvable they are.
1. Construction and calibration
- Why a new construction. The 0.9.0 latent-adjustment power comparison recorded the CV-selected rank per unit at the Phase 6 construction: no unit in any arm selected rank 1 (roadmap, Next changes item 4), while both SEA-AD cohorts did (held-out AUROC 0.63 / 0.66). The floor changes the measurement only where the unfloored rule selects rank 1, so it is validated where that happens.
- Data.
generate_semisynthetic_trajectoryat the Phase 6 small-n design: three stages,group_stage_sizes = [[11, 10, 28], [9, 10, 12]](n = 80), methylation (M-values) and expression measured, 498 features, joint magnitude,p_dmp = 0.1,baseline_continuity = 0, with the stage signal weakened through the per-omic effect sizesdelta_methyl = delta_expr = delta_protein = δ, at the Phase 6 value 2.0 for every committed study. Two strengths were run, δ = 0.05 and δ = 0.1 (below).p_dmpstays at 0.1 so every pool-limited surgery keeps its Phase 6 headroom (translation 98 sites available, orientation and shape 242; every cell fits). - Cells. The zero-effect anchor; the
translationnegative control at e = 1.0;magnitudeat e = 0.02, 0.05, 0.1, 0.25 (the Phase 6 magnitude profile below its saturation);orientationandshapeat e = 0.25, 0.5, 0.75, 1.0 (the Phase 6 study profile). 14 cells × 500 replicates = 7,000 units per strength. The generator and RRPP seeds depend on the replicate index only (base seed 2026), so every cell and both arms of replicatershare the baseline draw and the permutation draws. - Arms. Each unit is analysed with
analyze_trajectoriestwice, with the harness CV defaults (cv2_splits = 4,cv1_splits = 3,n_repeats = 5,max_components = 20,random_state = 1203), 999 permutations, the same RRPP seed, no covariates and the net-displacement estimator: floor_1:min_components = 1, the 0.9.0 rule (measured, not judged);floor_2:min_components = 2, the candidate default.- Rule (predeclared in design D7, pure function
rank_floor_decision). For the anchor and the translation control, thefloor_2arm's rate over its R available replicates must be at most α + k·√(α(1 − α)/R) with α = 0.05 and k = 2 (0.0695 at R = 500) fordelta,angleandshape. Every statistic holding at both controls givesadopt_floor, otherwisediagnose_floor_excess. With two strengths,adopt_floorrequires both runs to hold (settled with the user before submission). Thefloor_1arm's rates are reported and never enter the decision; power rows are descriptive.
Calibration
The calibration criterion is that the unfloored rule selects rank 1 in at least half of the null (anchor) replicates
on a recorded smoke run before any paper-grade run (scripts/rank_floor_check.py calibrate; every iteration is in
results/rank-floor-2026-10-23/calibration/calibration.json). Weakening δ alone first raises the selected rank:
at δ = 1.0 and 0.5 the held-out AUROC stays at 1.0 and the CV picks 3–6 components, at δ = 0.25 it is 0.92 with
4–11 components, because the stage signal thins across more directions before it fades. It reaches rank 1 only once
the signal is near chance.
| δ | R | rank-1 fraction | rank distribution | mean CV AUROC |
|---|---|---|---|---|
| 2.0 (Phase 6) | 20 | 0.00 | 2: 8, 3: 12 | 1.000 |
| 1.0 | 20 | 0.00 | 3: 20 | 1.000 |
| 0.5 | 20 | 0.00 | 3: 1, 4: 8, 5: 9, 6: 2 | 1.000 |
| 0.25 | 20 | 0.00 | 4–11 | 0.920 |
| 0.15 | 50 | 0.08 | 1: 4, 2: 12, 3: 8, 4–12: 26 | 0.702 |
| 0.1 | 20 / 50 | 0.55 / 0.44 | 1: 22, 2: 13, 3: 5, 4–10: 10 (R = 50) | 0.579 / 0.583 |
| 0.05 | 50 | 0.58 | 1: 29, 2: 14, 3: 4, 4: 3 | 0.525 |
Both strengths meet the criterion on their smoke replicates (δ = 0.05: 0.70; δ = 0.1: 0.55), and they bracket the SEA-AD regime from the two sides: δ = 0.1 has the cohorts' held-out AUROC (0.58 against 0.63–0.66) with a rank-1 fraction near one half, δ = 0.05 is robustly in the rank-1 regime with almost no stage signal left (AUROC 0.52).
Smoke profiles
R = 20 at 99 permutations, 14 cells × 2 arms = 560 analyses per strength (smoke-delta0.05/, smoke-delta0.1/). No
arm failed; the floor_2 arm selected rank ≥ 2 in every unit while floor_1 measured angle in one dimension in
183 / 280 (δ = 0.05) and 147 / 280 (δ = 0.1) units. Each smoke decision reads diagnose_floor_excess on one
statistic at 3 of 20 rejections (0.150 against the R = 20 bound 0.147): anchor angle at δ = 0.05, translation
delta at δ = 0.1. At R = 20 one rejection moves a rate by 0.05, so the smoke decisions are calibration and cost
evidence, not verdicts. Cost: 26–53 s per unit at 99 permutations locally, 58 s at 999 permutations.
2. Rates against the bound
Rate (Monte Carlo SE) with the floor-2 verdict against α + 2·√(α(1 − α)/500) = 0.0695; the floor-1 arm is descriptive.
| control | statistic | floor-2 δ = 0.05 | floor-2 δ = 0.1 | floor-1 δ = 0.05 | floor-1 δ = 0.1 |
|---|---|---|---|---|---|
| anchor | delta |
0.042 (0.0090) holds | 0.044 (0.0092) holds | 0.044 (0.0092) | 0.042 (0.0090) |
| anchor | angle |
0.054 (0.0101) holds | 0.060 (0.0106) holds | 0.030 (0.0076) | 0.038 (0.0086) |
| anchor | shape |
0.036 (0.0083) holds | 0.038 (0.0086) holds | 0.048 (0.0096) | 0.046 (0.0094) |
| translation | delta |
0.036 (0.0083) holds | 0.036 (0.0083) holds | 0.038 (0.0086) | 0.036 (0.0083) |
| translation | angle |
0.046 (0.0094) holds | 0.042 (0.0090) holds | 0.016 (0.0056) | 0.026 (0.0071) |
| translation | shape |
0.026 (0.0071) holds | 0.030 (0.0076) holds | 0.034 (0.0081) | 0.026 (0.0071) |
At p < 0.05 instead of p ≤ 0.05 the floor-2 anchor rates are delta 0.042 / 0.044, angle 0.052 / 0.058, shape
0.036 / 0.038 and the translation rates 0.036 / 0.036, 0.046 / 0.042, 0.024 / 0.030; the decision is unchanged.
Stability. Floor-2 rates over five consecutive blocks of 100 replicates:
- δ = 0.05, anchor:
delta0.06, 0.03, 0.05, 0.05, 0.02;angle0.05, 0.04, 0.07, 0.05, 0.06;shape0.04, 0.01, 0.07, 0.04, 0.02. Translation:delta0.03, 0.03, 0.02, 0.05, 0.05;angle0.02, 0.04, 0.06, 0.04, 0.07;shape0.04, 0.01, 0.03, 0.02, 0.03. - δ = 0.1, anchor:
delta0.07, 0.02, 0.05, 0.04, 0.04;angle0.04, 0.05, 0.07, 0.05, 0.09;shape0.06, 0.01, 0.07, 0.02, 0.03. Translation:delta0.03, 0.03, 0.02, 0.05, 0.05;angle0.02, 0.03, 0.06, 0.03, 0.07;shape0.05, 0.01, 0.05, 0.01, 0.03.
No block exceeds 0.09, and no statistic is near the bound in both runs at once (angle at the anchor is the closest,
0.054 and 0.060). Every unit was available in both arms: no CV training fold failed, which the 0.9.0 checks saw only
with categorical covariates.
3. What the floor changes
- Calibration realized. The unfloored anchor arm selected rank 1 in 289 / 500 replicates at δ = 0.05 (0.578; criterion met) and 210 / 500 at δ = 0.1 (0.420; the smoke replicates' 0.55 was the high side of the R = 50 estimate 0.44, so the paper-grade fraction sits just under one half, as reported before submission). The anchor rank distributions are 1: 289, 2: 120, 3: 59, 4: 18, 5: 10, ≥6: 4 (floor 1) against 2: 346, 3: 91, 4: 27, 5: 23, 6: 7, ≥7: 6 (floor 2) at δ = 0.05, and 1: 210, 2: 131, 3: 66, 4: 27, 5: 25, ≥6: 41 against 2: 275, 3: 104, 4: 37, 5: 39, 6: 22, ≥7: 23 at δ = 0.1.
- The lift. Over all 7,000 units the unfloored rule selected rank 1 in 4,257 (δ = 0.05) and 3,228 (δ = 0.1); the floor moved those to rank 2 in 3,289 / 2,187, rank 3 in 558 / 499, rank 4 in 184 / 180 and higher in the rest. The two arms select the same rank in 2,635 / 3,633 units; in 108 / 139 units the unfloored modal rank was already ≥ 2 but moved, because outer folds that had chosen rank 1 chose another candidate under the floor. The floor-2 arm selected rank 2 in 4,795 / 3,909 units and rank ≥ 3 in the remainder; it never fell back to a lower rank.
angleat rank 1. In every unfloored anchor unit that selected rank 1 the observedangleis exactly 0° (246 and 182 units) or 180° (43 and 28), its null's 95 % quantile is 180° (a two-point distribution) and its smallest p-value is 0.068 / 0.054: the rank-1angletest never rejects. The unfloored arm's anchoranglerates (0.030 / 0.038) therefore come entirely from its rank ≥ 2 units, where they are 15 / 211 = 0.071 and 19 / 290 = 0.066. Under the 0.9.0 rule a real-dataanglep-value of 1.0 at rank 1 says nothing about orientation; this is the degeneracy the floor removes.- Null width. The median over anchor replicates of the
anglenull's 95 % quantile is 84.0° / 61.2° in the unfloored arm (180° in its rank-1 units, 55.9° / 52.4° in its others) against 61.2° / 57.0° with the floor; the null's median SD is 34.0° / 21.0° against 17.8° / 16.3°. In a two-dimensional space with no stage signal theanglenull is wide (two near-random directions), which is what a resolvable-orientation reader should see innull_summary.angle. - The signal. Mean held-out CV AUROC at the anchor is 0.513 / 0.571 (floor 1) and 0.516 / 0.580 (floor 2): the floor does not change what the CV can find, only the smallest rank it may report.
4. Power in both arms
Rejection rates at p ≤ 0.05 over 500 replicates, floor 1 / floor 2, with the angle difference (floor 2 − floor 1)
and its pooled Monte Carlo SE; the last column is the share of units whose unfloored rule selected rank 1. Descriptive.
δ = 0.05:
| mode | e | delta 1 / 2 |
angle 1 / 2 (diff, pooled SE) |
shape 1 / 2 |
rank-1 share, floor 1 |
|---|---|---|---|---|---|
| magnitude | 0.02 | 0.044 / 0.042 | 0.030 / 0.056 (+0.026, 0.013) | 0.050 / 0.038 | 0.58 |
| magnitude | 0.05 | 0.044 / 0.042 | 0.030 / 0.054 (+0.024, 0.013) | 0.046 / 0.036 | 0.57 |
| magnitude | 0.1 | 0.046 / 0.038 | 0.030 / 0.054 (+0.024, 0.013) | 0.044 / 0.036 | 0.58 |
| magnitude | 0.25 | 0.046 / 0.044 | 0.032 / 0.058 (+0.026, 0.013) | 0.044 / 0.040 | 0.58 |
| orientation | 0.25 | 0.030 / 0.022 | 0.020 / 0.032 (+0.012, 0.010) | 0.038 / 0.046 | 0.65 |
| orientation | 0.5 | 0.034 / 0.032 | 0.024 / 0.040 (+0.016, 0.011) | 0.024 / 0.024 | 0.60 |
| orientation | 0.75 | 0.044 / 0.038 | 0.010 / 0.042 (+0.032, 0.010) | 0.038 / 0.040 | 0.64 |
| orientation | 1 | 0.030 / 0.028 | 0.020 / 0.036 (+0.016, 0.010) | 0.032 / 0.040 | 0.64 |
| shape | 0.25 | 0.046 / 0.036 | 0.024 / 0.060 (+0.036, 0.013) | 0.044 / 0.054 | 0.62 |
| shape | 0.5 | 0.054 / 0.048 | 0.030 / 0.052 (+0.022, 0.013) | 0.048 / 0.046 | 0.61 |
| shape | 0.75 | 0.036 / 0.038 | 0.028 / 0.056 (+0.028, 0.013) | 0.048 / 0.036 | 0.62 |
| shape | 1 | 0.046 / 0.040 | 0.026 / 0.060 (+0.034, 0.013) | 0.044 / 0.032 | 0.64 |
δ = 0.1:
| mode | e | delta 1 / 2 |
angle 1 / 2 (diff, pooled SE) |
shape 1 / 2 |
rank-1 share, floor 1 |
|---|---|---|---|---|---|
| magnitude | 0.02 | 0.046 / 0.048 | 0.038 / 0.060 (+0.022, 0.014) | 0.046 / 0.040 | 0.42 |
| magnitude | 0.05 | 0.046 / 0.046 | 0.038 / 0.060 (+0.022, 0.014) | 0.044 / 0.038 | 0.41 |
| magnitude | 0.1 | 0.044 / 0.048 | 0.034 / 0.060 (+0.026, 0.013) | 0.044 / 0.038 | 0.40 |
| magnitude | 0.25 | 0.046 / 0.050 | 0.042 / 0.062 (+0.020, 0.014) | 0.038 / 0.034 | 0.38 |
| orientation | 0.25 | 0.032 / 0.026 | 0.024 / 0.034 (+0.010, 0.011) | 0.052 / 0.048 | 0.49 |
| orientation | 0.5 | 0.030 / 0.030 | 0.026 / 0.048 (+0.022, 0.012) | 0.036 / 0.028 | 0.51 |
| orientation | 0.75 | 0.048 / 0.046 | 0.018 / 0.042 (+0.024, 0.011) | 0.038 / 0.040 | 0.54 |
| orientation | 1 | 0.030 / 0.032 | 0.028 / 0.042 (+0.014, 0.012) | 0.034 / 0.042 | 0.58 |
| shape | 0.25 | 0.044 / 0.040 | 0.036 / 0.056 (+0.020, 0.013) | 0.058 / 0.062 | 0.43 |
| shape | 0.5 | 0.058 / 0.048 | 0.038 / 0.052 (+0.014, 0.013) | 0.048 / 0.042 | 0.43 |
| shape | 0.75 | 0.036 / 0.034 | 0.042 / 0.062 (+0.020, 0.014) | 0.040 / 0.040 | 0.48 |
| shape | 1 | 0.054 / 0.040 | 0.030 / 0.060 (+0.030, 0.013) | 0.050 / 0.042 | 0.51 |
At these strengths the surgeries scale a stage effect that is itself near the noise (magnitude multiplies δ by
1 + e; orientation, shape and translation relocate differential sites whose shift is δ), so every rate in both arms
sits at the null, 0.010–0.062. The construction therefore measures size, not power: nothing here says the floor
makes angle or shape powerful. The angle differences of +0.016 to +0.036, several above two pooled SEs, are
the unfloored arm's under-rejection at rank 1 (its angle rates of 0.010–0.042 are below α, as at the anchor), not
detection; delta and shape differ by at most ±0.014 between the arms.
5. Decision, limitation and scope
Decision, read verbatim from results/rank-floor-2026-10-23/delta0.05/rank_floor_decision.json and
delta0.1/rank_floor_decision.json: "decision": "adopt_floor" in both, with "exceeding": [] and every
floor_2 verdict "holds" at the anchor and the translation control. Under the predeclared conjunction the
check adopts the floor: MOTCO 0.10.0 keeps min_components=2 as the default of fit_pls_latent_space,
SimulationEvaluationParams and TrajectoryAnalysisParams / motco analyze.
Limitation: the floor guarantees two dimensions, not a second axis with signal. When the stage signal supports
one component, or none, the second component is the best of the remaining candidates and carries whatever the inner
CV preferred among them; angle and shape are then defined but their nulls are wide, and at these strengths
their power is at α. A rank-2 selection under the floor is a statement about the measurement space, not evidence of
a second biological axis. Read the record's config_spectrum relative eigengap and null_summary.angle together:
they say how resolvable orientation is in each analysis, and the selected rank stays the covariate reported beside
any angle result. The 0.9.0 rule remains reachable as min_components=1 for comparison.
Scope.
- The construction weakens the per-omic effect sizes uniformly;
p_dmp, the cell sizes, the block set and the joint magnitude are the Phase 6 study's. It reproduces the SEA-AD cohorts' held-out AUROC regime, not their mechanism (a dominant technical axis aligned with stage), which the covariate-aware latent construction addresses. - Both arms used the harness CV defaults and no covariates; the floor applies inside the same cross-validation with covariates and latent adjustment, but their interaction was not measured here.
- Every committed study config, fixture and dated report pins
min_components: 1and is unchanged by the default (tests/test_rank_floor_default_pins.py); the sead_sexdiff cohorts are to be rerun at the floor in their own proposal, pinning MOTCO 0.10.0. - Replicates are matched across cells and arms by seed; the two strengths are independent runs with their own decision files, and the report's conjunction rule was fixed with the user before submission.