Phase 6 small-n operating study at the SEA-AD design — 2026-10-09
Follows
examples/trajectory_power_study/phase5_report_template.mdsection for section. The study is split into two profiles (spec "Phase 6 small-n study profiles", split rule), so each section reports both runs. Rates and Monte Carlo SEs are read from the two runs'report/directories. The few figures that are not inreport/(selected-rank breakdowns, anchor reproduction) are computed frommerged.jsonl, whose sha256 is in eachPROVENANCE.txt, and are marked as such.
Runs: results/phase6-small-n-magnitude-2026-10-09/ (magnitude) and results/phase6-small-n-2026-10-09/
(orientation, shape, translation) · Configs: examples/trajectory_power_study/phase6_small_n_magnitude.json
(sha256 41211d61…) and examples/trajectory_power_study/phase6_small_n_study.json (sha256 18cf0fc7…) ·
Gate decisions: magnitude PROCEED, orientation/shape HOLD (advisory, design D6; from each run's
report/phase4_gate_decision.json).
In one paragraph. At the SEA-AD MTG astrocyte design (n = 80, three stages, cells of 9–28, two blocks),
the three RRPP tests hold their size. Every Type I cell of the baseline column is at or below α (0.010–0.040, bound 0.0695), and the three-block columns stay inside the bound. The tests
differ sharply in power. delta detects a joint size change of 10 % about half the time (0.542) and of 25 %
almost always (0.956), and the magnitude construction leaves angle and shape at the floor. angle and
shape stay weak even at the strongest orientation and shape constructions the generator can build: 0.300 and
0.228 at e = 1.00, where every differential site has been relocated. They are also not specific. The orientation
construction rejects shape (0.464) and delta (0.354) more often than angle, and the shape construction
rejects delta (0.330) more often than shape. For the case study, a delta rejection is interpretable
evidence that the trajectories differ. A delta non-rejection is evidence against size changes of about 25 % or
more. angle and shape rejections are interpretable as evidence of a difference, but not of which kind, and
their non-rejections carry no information at n = 80 (section 8).
1. Configuration and provenance
Design point. The study reproduces the SEA-AD MTG astrocyte case-study design fixed on 2026-10-09. Sex is
the group (A = F, B = M; the surgery is applied to the smaller group, the conservative assignment, design D4).
ADNC is merged into three stages (Not AD + Low / Intermediate / High). The donor table at ≥30 nuclei per donor
per omic is group_stage_sizes = [[11, 10, 28], [9, 10, 12]] (n = 80). All three InterSIM blocks are generated,
but only methylation + expression are measured (integration_params.layers), as the two-block analogue of
ATAC + RNA (design D2). Every trajectory surgery acts on methylation indicators, so each mode's construction is
present in the measured space. Measurement is pooled PLS on M-value methylation with the committed
stage-supervised double-CV rank, and magnitude_kind = joint. p_dmp = 0.1 and ρ = 0 are copied from
Phase 5. Only the stage count and sizes change.
Design grid. Both profiles cross the ≥30-nuclei and ≥50-nuclei tables ([[10, 9, 25], [9, 9, 12]], n = 74)
with two-block and three-block measurement (layers null), giving four columns. The cohort-size contrast is the
baseline vs the ≥50-nuclei column at two blocks. The block-count contrast is the baseline vs the three-block
column at n = 80. Columns that differ only in layers evaluate the same generated datasets. The fourth column
(≥50 nuclei, three blocks) exists because the engine crosses design-grid axes (design D4, accepted 2026-10-09).
Effect axes. These come from the pilot (results/phase6-small-n-pilot-2026-10-09/NOTES.md; each profile's
metadata.effect_axis gives the reason for each point). Magnitude: 0 / 0.02 / 0.05 / 0.10 / 0.25 / 0.50 / 1.00,
covering the measured rise and saturation. Orientation, shape and translation: 0 / 0.25 / 0.50 / 0.75 / 1.00.
For orientation and shape, e = 1.00 is the construction maximum, because _relocate_rows clamps the relocated
fraction at 1.
Monte Carlo sizing and seeds. 500 replicates × 999 permutations per cell. Base seed 800 and the matched-seed
family phase6-small-n are shared with the pilot. This makes the shared zero-effect anchor the same datasets in
the pilot and both profiles, and the family is independent of every Phase 5 record. Both configs derive from
phase6_small_n_pilot.json (metadata.derives_from) and name each other as split siblings.
Provenance. See each run's PROVENANCE.txt; the fields the template requires are all present. In summary:
- Records were produced at code revision 5325f6d; the reports were rendered at 946e471, which adds only a
reporting fix (section 2).
- The runs used cluster ing, partition 512x1024, AMD EPYC 7662, with --exclude=n3 and later n3,n4.
STUDY_N_JOBS was unset and BLAS was pinned to one thread.
- Software: python 3.11.16, motco 0.6.0, numpy 2.3.5, scikit-learn 1.8.0, scipy 1.16.3, uv 0.12.10.
- Layout: 100 shards per profile, error policy record, and n_jobs = 1 in every record (each
report/report_contract.json).
- Magnitude: 30 cells × 500 = 15,000 units, median 11.6 s per unit, 47.6 core-hours.
- Orientation/shape/translation: 54 cells × 500 = 27,000 units, median 13.2 s per unit, 102.4 core-hours.
2. Unit and failure accounting
| magnitude | orientation / shape / translation | |
|---|---|---|
| units expected | 15,000 (30 cells × 500) | 27,000 (54 cells × 500) |
| units present exactly once | 15,000 | 27,000 |
| cells present with exactly 500 replicates | 30 / 30 | 54 / 54 |
| parameter-signature mismatches | 0 | 0 |
status = failed records |
0 | 0 |
censored surgeries (report/realized_surgery.csv, censored_fraction) |
0 at every cell | 0 at every cell |
attribution (report/driver_report.csv) |
not requested (15,000) | 4 orientation cells: 500 eligible / 500 computed / 0 failed each; 25,000 not requested |
Node incident. At 19:40Z node n4 ran out of memory under other users' jobs, and the 12 magnitude shards
running there stalled without writing. They were cancelled and requeued, and no unit was lost or duplicated
(magnitude PROVENANCE.txt, node_incident).
Report fix. The first report at 5325f6d crashed before writing anything: design-point coordinates for a
sequence-valued axis come back from JSONL as unhashable lists. 946e471 fixes this and adds a regression test
(tests/test_study_design_point_report.py::test_list_valued_design_axes_survive_a_jsonl_round_trip). Records
and statistics are unaffected.
3. Gate decision
The Phase 4 gate is declared as advisory acceptance (design D6). At n = 80 a missed 0.80 power floor is a finding about the case study's design, not a defect.
Magnitude profile — PROCEED (report/phase4_gate_decision.json; rules reduced to magnitude as in the Phase 5
re-measurement):
- Mandatory power: magnitude/delta reaches 1.000 at e = 1.00 against the 0.80 floor.
- Mandatory controls at e = 1.00, bound α + 2·SE = 0.0695: magnitude/angle 0.008, magnitude/shape 0.002.
- Type I inflation: anchor 0.026 / 0.024 / 0.020 (delta / angle / shape); type_i_baseline none
0.016 / 0.028 / 0.018.
- Completeness met.
Orientation/shape profile — HOLD (report/phase4_gate_decision.json). Two mandatory power rules fail, and
both curves are monotone (tolerated_monotone=True):
- orientation/angle: top rate 0.300 against the 0.80 floor.
- shape/shape: top rate 0.228 against the 0.80 floor.
Every Type I inflation observation passes (report/phase4_gate.csv): the anchor, type_i_baseline none and
translation, and translation at every e (0.010–0.040, bound 0.0695). The descriptive roles (orientation/delta,
orientation/shape, shape/delta, shape/angle) are reported in section 6, and completeness is met. No
confirmation re-run is required: a HOLD on mandatory power at the top effect is not a marginal exceedance. The
HOLD is the measured answer to "can orientation and shape be detected at n = 80?".
4. Type I error
Null claims read the type_i_baseline cells, a separate seed family from the power grid (report/type_i_table.csv):
| cell | delta |
angle |
shape |
|---|---|---|---|
none (type_i_baseline-ca766c21680e) |
0.016 ± 0.006 | 0.028 ± 0.007 | 0.018 ± 0.006 |
translation at e = 1.00 (type_i_baseline-74c0457435ca) |
0.034 ± 0.008 | 0.040 ± 0.009 | 0.018 ± 0.006 |
Both cells have the same cell ids and signatures in the two profiles and are the same measurement. They are counted once.
The shared zero-effect anchor reads 0.026 ± 0.007 / 0.024 ± 0.007 / 0.020 ± 0.006. It is
power_primary-6f04726ce01b in the magnitude profile and power_primary-1a2e4088b485 in the
orientation/shape profile (report/report_contract.json resolves it to [magnitude] and to
[orientation, shape, translation], counted_as: 1). The two cells hold the same 500 datasets. Generator seeds
and selected ranks are identical at all 500 replicate indices, observed statistics agree to within 1.4e-11, and
p-values are identical (computed from merged.jsonl). The anchor is therefore one measurement, not one per
mode or per profile. Its first 100 replicates also reproduce the pilot's anchor to within 7.3e-12 on the
observed statistics, with identical seeds and ranks (p-values differ: 199 vs 999 permutations).
Translation at e > 0, read as a negative control on all three statistics (report/power_curves.csv):
0.014–0.032 for delta, 0.018–0.030 for angle and 0.010–0.030 for shape, at every e.
The two-block measurement is conservative at n = 80. The baseline column's null rates sit at half of α. At
three blocks the anchor rates rise to 0.062 ± 0.011 (delta) and 0.056 ± 0.010 (shape), still inside the
bound; at ≥50 nuclei and two blocks they fall to 0.010 and 0.008 (report/design_point_operating.csv).
5. Power per mode
Baseline column (≥30 nuclei, two blocks), report/power_curves.csv, rate ± Monte Carlo SE:
| mode | e | delta |
angle |
shape |
|---|---|---|---|---|
| anchor | 0 | 0.026 ± 0.007 | 0.024 ± 0.007 | 0.020 ± 0.006 |
| magnitude | 0.02 | 0.052 ± 0.010 | 0.024 ± 0.007 | 0.022 ± 0.007 |
| 0.05 | 0.206 ± 0.018 | 0.020 ± 0.006 | 0.024 ± 0.007 | |
| 0.10 | 0.542 ± 0.022 | 0.018 ± 0.006 | 0.022 ± 0.007 | |
| 0.25 | 0.956 ± 0.009 | 0.016 ± 0.006 | 0.014 ± 0.005 | |
| 0.50 | 1.000 | 0.010 ± 0.004 | 0.006 ± 0.003 | |
| 1.00 | 1.000 | 0.008 ± 0.004 | 0.002 ± 0.002 | |
| orientation | 0.25 | 0.070 ± 0.011 | 0.034 ± 0.008 | 0.068 ± 0.011 |
| 0.50 | 0.160 ± 0.016 | 0.058 ± 0.010 | 0.196 ± 0.018 | |
| 0.75 | 0.194 ± 0.018 | 0.090 ± 0.013 | 0.320 ± 0.021 | |
| 1.00 | 0.354 ± 0.021 | 0.300 ± 0.020 | 0.464 ± 0.022 | |
| shape | 0.25 | 0.104 ± 0.014 | 0.042 ± 0.009 | 0.060 ± 0.011 |
| 0.50 | 0.216 ± 0.018 | 0.076 ± 0.012 | 0.090 ± 0.013 | |
| 0.75 | 0.292 ± 0.020 | 0.112 ± 0.014 | 0.172 ± 0.017 | |
| 1.00 | 0.330 ± 0.021 | 0.138 ± 0.015 | 0.228 ± 0.019 |
Magnitude. The delta rise sits about 10× higher on the native joint axis than at n = 1200 (Phase 5
re-measurement: 0.836 at e = 0.01, 0.996 at 0.02). e is the per-omic size ratio minus one, so delta has about
even odds at a 10 % joint size change and is near certain at 25 %. The pilot (100 × 199) measured 0.58 and 0.93
at the same points, agreeing within pooled SE.
Orientation, with its recorded geometry. The anchor's pooled relative eigengap has median 0.111 and terciles
0.082 / 0.144 (report/design_point_operating.csv, baseline rows). Three stage means always span at most a
2-D subspace. The small eigengap, a near-isotropic triangle whose PC1 is poorly determined, comes from the
generator's isotropic endpoint ρ = 0: each stage draws its differential sites independently, so the stage means
do not trend. It is not a property of three stages. A real cohort whose stages trend would have a larger
eigengap. The Phase 5 continuity sweep found that this does not translate into orientation power under the
current construction: the orientation surgery realizes a smaller latent contrast on a trending baseline
(design-point report, "Continuity does not help"). The angle null is
correspondingly wide and variable: per-replicate q95 median 84° and IQR 115° at the anchor. At the orientation
cells:
| e | median eigengap (terciles) | angle null q95 median (IQR) |
orientation/angle power |
|---|---|---|---|
| 0.25 | 0.135 (0.101 / 0.173) | 59° (109°) | 0.034 ± 0.008 |
| 0.50 | 0.160 (0.120 / 0.210) | 56° (105°) | 0.058 ± 0.010 |
| 0.75 | 0.176 (0.135 / 0.222) | 65° (114°) | 0.090 ± 0.013 |
| 1.00 | 0.167 (0.127 / 0.213) | 63° (104°) | 0.300 ± 0.020 |
Orientation angle power within eigengap terciles at e = 1.00 (report/eigengap_stratified_power.csv,
power_primary rows):
| tercile | eigengap range | power |
|---|---|---|
| low | 0.013–0.127 | 0.114 ± 0.025 |
| middle | 0.127–0.213 | 0.449 ± 0.038 |
| high | 0.213–0.441 | 0.337 ± 0.037 |
At e = 0.75 the same terciles give 0.060 / 0.138 / 0.072. In the low tercile, angle power is at most 0.114 at
every e (0.018 / 0.048 / 0.060 / 0.114).
Rank selection. Power at e = 1.00 also depends on the CV-selected rank (merged.jsonl). Elsewhere the rank is
2 or 3 in essentially every replicate. At e = 1.00 in the baseline column, 257 of 500 replicates select more than
three components, because relocating every differential site creates group-specific variation that CV
retains. Those replicates reject angle at 0.506, against 0.082 for the 243 at rank ≤ 3.
Comparison with the pilots. The Phase 5 design-point and ladder pilots measured orientation angle at
0.88 and 0.85 (n = 1200, four stages). The Phase 6 pilot (100 × 199) measured 0.24 at e = 1.00 and the
paper-grade run 0.300 ± 0.020, a difference of 1.3 pooled SE (pilot SE about 0.043).
Shape. shape/shape rises to 0.228 at the construction maximum, against a pilot value of 0.18. The shape
null is not the limiting factor (q95 near 0.1 in the pilot records). The construction is small: one interior
vertex of a three-vertex path.
Cohort-size and block-count contrasts
report/design_point_operating.csv, target statistic per mode, at the points where the curves move:
| mode / statistic, e | baseline (n = 80, 2 blocks) | ≥50 nuclei (n = 74, 2 blocks) | three blocks (n = 80) | n = 74, 3 blocks |
|---|---|---|---|---|
anchor delta / angle / shape |
0.026 / 0.024 / 0.020 | 0.010 / 0.022 / 0.008 | 0.062 / 0.020 / 0.056 | 0.038 / 0.024 / 0.044 |
magnitude/delta, 0.05 |
0.206 ± 0.018 | 0.198 ± 0.018 | 0.438 ± 0.022 | 0.436 ± 0.022 |
magnitude/delta, 0.10 |
0.542 ± 0.022 | 0.502 ± 0.022 | 0.774 ± 0.019 | 0.770 ± 0.019 |
orientation/angle, 0.50 |
0.058 ± 0.010 | 0.066 ± 0.011 | 0.162 ± 0.016 | 0.144 ± 0.016 |
orientation/angle, 1.00 |
0.300 ± 0.020 | 0.112 ± 0.014 | 0.294 ± 0.020 | 0.210 ± 0.018 |
shape/shape, 0.50 |
0.090 ± 0.013 | 0.088 ± 0.013 | 0.306 ± 0.021 | 0.276 ± 0.020 |
shape/shape, 1.00 |
0.228 ± 0.019 | 0.138 ± 0.015 | 0.472 ± 0.022 | 0.448 ± 0.022 |
Cohort size (baseline vs ≥50 nuclei, two blocks). Dropping six donors leaves magnitude essentially unchanged
(0.206 → 0.198; 0.542 → 0.502, within 1.3 pooled SE). It costs orientation/angle at e = 1.00 most of its power
(0.300 → 0.112). That drop is a rank-selection effect, not a smooth sample-size effect. At n = 74 only 39 of 500
replicates select more than three components, against 257 at n = 80, and within each rank class power is
similar (0.436 vs 0.506 above rank 3; 0.085 vs 0.082 at or below it; merged.jsonl). shape/shape at e = 1.00
falls from 0.228 to 0.138. Below the construction maximum, orientation and shape are unchanged within SE.
Block count (baseline vs three blocks, n = 80, same datasets). The third standardized block raises every
mode's power where the curve is rising:
- magnitude/delta at 0.05: 0.206 → 0.438;
- orientation/angle at 0.50: 0.058 → 0.162;
- shape/shape at 0.50: 0.090 → 0.306.
It also raises the null rates of delta and shape from about half of α to near α (0.026 → 0.062,
0.020 → 0.056), so part of the gain is the two-block measurement's conservatism being removed. Orientation at
e = 1.00 is the exception (0.300 vs 0.294): there both columns are dominated by the rank-selection effect above.
Interaction column (n = 74, three blocks). It follows the three-block column within SE, except
orientation/angle at e = 1.00 (0.210), where rank selection again carries the difference.
6. Cross-talk
The baseline column's off-diagonals are shown below (report/specificity_matrix.csv at the top effect,
report/power_curves.csv per effect, and report/phase4_localization.csv for where each first becomes
material).
Magnitude's off-diagonals are mandatory controls. magnitude/angle is 0.008–0.024 and magnitude/shape
0.002–0.024 at every e, against the 0.0695 bound. The joint construction stays size-pure at n = 80, as it was
at n = 1200.
Orientation → shape and orientation → delta exceed the target statistic. At e = 1.00 they are 0.464
and 0.354, against angle 0.300; at e = 0.50, 0.196 and 0.160 against 0.058. Under the default materiality
rule, the localization table labels both projection_associated: they first exceed the rule in the PLS latent
space (shape from e = 0.75, normalized excess 0.055–0.077; delta at e = 1.00, 0.062). That label must not be
carried into the paper. The
magnitude-construction diagnostic (§1, §4) refuted the
projection-associated framing for orientation's cross-talk at n = 1200: the response is present within each omic
block, and under the recalibrated (null-dispersion) rule no pair localizes as projection-associated. That rule
is opt-in and was not used here. The orientation construction is a per-omic feature relocation, and its
shape/delta responses are reported as construction cross-talk. They are descriptive gate roles, not
acceptance targets.
Shape's off-diagonals are construction-present. shape → angle (0.138 at e = 1.00) is material in the
population-standardized geometry from e = 0.25 (normalized 0.236–0.436). shape → delta (0.330) is material
from e = 0.75 (0.054–0.065). Bending one vertex of a three-vertex path changes its direction and length, not
only its shape. Shape's construction moves delta more often than shape.
7. Drivers
Orientation attribution ran on the four nonzero orientation power_primary cells, observed component only
(report/driver_report.csv; contract echo in report/report_contract.json). For each transition (0→1, 1→2), at
e = 0.25 / 0.50 / 0.75 / 1.00:
| e | precision (0→1 / 1→2) | recall (0→1 / 1→2) | mean selected | within-replicate bootstrap sign stability |
|---|---|---|---|---|
| 0.25 | 0.996 / 0.996 | 0.375 / 0.379 | 20 | 0.787 / 0.786 |
| 0.50 | 1.000 / 1.000 | 0.194 / 0.193 | 20 | 0.813 / 0.810 |
| 0.75 | 1.000 / 1.000 | 0.131 / 0.132 | 20 | 0.835 / 0.835 |
| 1.00 | 1.000 / 1.000 | 0.101 / 0.102 | 20 | 0.855 / 0.856 |
The top-20 observed drivers are almost always true drivers. Recall falls with e because the truth set grows
(every relocated site and its cascade) while k stays at 20. bootstrap_top_k_frequency_mean is 0.040 at every
cell. That is top_k / n_features (20 / 498) by construction for a mean over all features, so it carries no
information here. The attribution figure is report/phase4_attribution_stability.png ("Within-replicate
bootstrap stability (observed component)").
No cross-replicate driver-stability claim is made. Cross-replicate top-k Jaccard and sign agreement (
top_k_jaccard,sign_agreementinreport/phase4_attribution.csv) aredescriptiveonly: every replicate index draws a fresh differential-indicator set, so the true driver set genuinely differs across replicates and matched seeds pair cells within a replicate index, not across them. A stability claim needs a design that holds the driver set fixed, which this study is not.
Driver precision is high even where angle power is low. Attribution describes the observed directional
contrast whether or not the angle test rejects, so in the case study a driver list is descriptive and is not
evidence of an orientation difference.
8. Construction limitations and case-study interpretability
- This is a structural analogue, not an emulator. InterSIM blocks are Gaussian/M-value with 367 + 131 measured features against 80 samples. SEA-AD RNA and ATAC pseudobulks after VST are only approximately Gaussian and will have thousands of filtered features. The operating characteristics transfer as statements about the design (n, cell sizes, three stages, two blocks, stage-supervised PLS), not about RNA/ATAC distributions. The case-study repo must report its feature filtering beside any result.
- Orientation power is eigengap- and rank-conditional. At ρ = 0 the three stage means form a
near-isotropic triangle, and its eigengap is small (anchor median 0.111). This is the generator's
independent-baseline assumption, copied from Phase 5, not a consequence of three stages. The operating
characteristics here are not measured at other baseline geometries, and Phase 5 found the orientation
construction's realized contrast is not ρ-invariant. In the low eigengap tercile,
anglepower is at most 0.114 even at the construction maximum. At the construction maximum, power depends on whether CV retains more than three components, which a six-donor change in the cohort moves from 51 % to 8 % of replicates. The Phase 5 exit condition stands: the cohort's own recorded eigengap, not n, is what carries an orientation statement. - The orientation and shape constructions are bounded. e = 1.00 relocates every differential site, so no larger construction exists. The HOLD is a statement that these constructions are not detectable at n = 80, not that the effect axis was too short.
- The statistics are not mode-specific at n = 80. The orientation construction is detected more often by
shapeanddeltathan byangle, and the shape construction more often bydeltathan byshape. Only magnitude is specific: the joint size change leavesangleandshapeat the floor. - Deviation from the predeclared targets. The orientation/
angleand shape/shapepower floors (0.80) are missed. Per design D6 this revises the claim, not the method or the Monte Carlo size. MOTCO's orientation and shape tests are not claimed to have useful power at this design.
Per-statistic interpretability for the SEA-AD cohort (n = 80, ≥30 nuclei, RNA + ATAC):
| statistic | rejection may be reported as evidence? | non-rejection may be reported as evidence? |
|---|---|---|
delta |
Yes, that the two sexes' ADNC trajectories differ. Type I is controlled (0.016–0.034). A rejection is consistent with a size difference, but it does not by itself exclude a direction or shape difference, since those constructions also reject delta at up to 0.35. |
Yes, against large size differences only. Power is 0.956 for a 25 % joint size change and 0.542 for 10 %. A non-rejection argues against a size difference of about 25 % or more, and is uninformative below that. |
angle |
Yes, that the trajectories differ (Type I 0.024–0.040), but not specifically in direction. Orientation constructions reject shape and delta more often, and shape constructions reject angle at up to 0.14. Report it with the cohort's recorded eigengap. If that eigengap falls in the simulated low tercile (below about 0.13), a rejection is still valid at level α, but the test had little chance of one. |
No. Power is at most 0.300, at the strongest construction the generator can build, and 0.03–0.09 below it. A non-rejection is uninformative at n = 80. |
shape |
Yes, that the trajectories differ (Type I 0.018–0.020), but not specifically in shape. The orientation construction rejects shape at 0.464, more than either angle or the shape construction's own 0.228. |
No. Power is at most 0.228 at the construction maximum. A non-rejection is uninformative at n = 80. |
Using the ≥50-nuclei cohort (n = 74) leaves these statements unchanged for delta and makes angle and shape
weaker still. Adding a third standardized block would raise power for all three statistics, but the case study
has two blocks.
9. Reproduction
Reproduction never passes a worker-count override: n_jobs is part of every cell's parameter signature and
both configs' contracts forbid it (the runner exits 2). Parallelize across shards. Avoid nodes under memory
pressure: a stalled shard can be cancelled and resubmitted, and the signature-guarded resume skips completed
units.
export OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1
# SLURM (partition/resource flags are cluster-specific); STUDY_N_JOBS must stay unset.
for P in magnitude:phase6-small-n-magnitude-2026-10-09 study:phase6-small-n-2026-10-09; do
CFG=examples/trajectory_power_study/phase6_small_n_${P%%:*}.json; RUN=results/${P#*:}
sbatch -p <partition> --cpus-per-task=1 --mem=2G --time=8:00:00 --array=0-99 \
--export=ALL,STUDY_CONFIG=$(pwd)/$CFG,STUDY_OUT=$(pwd)/$RUN,N_SHARDS=100 \
scripts/motco_study_array.sbatch
done
# After completion, per profile:
uv run python scripts/motco_study.py merge --out-dir $RUN
uv run python scripts/motco_study.py report --config $CFG --out-dir $RUN
Each run commits report/ and PROVENANCE.txt and leaves the shard and merged JSONL gitignored. The pilot that
fixed the effect axes is results/phase6-small-n-pilot-2026-10-09/ (NOTES.md, PROVENANCE.txt).