Skip to content

Scrub the legacy n(z) A/B/C blind: an n(z) is a catalogue entry's - #359

Merged
cailmdaley merged 43 commits into
developfrom
refactor/scrub-legacy-blind
Sep 28, 2026
Merged

cailmdaley merged 43 commits into
developfrom
refactor/scrub-legacy-blind

Conversation

@cailmdaley

@cailmdaley cailmdaley commented Sep 28, 2026 •

Copy link
Copy Markdown
Collaborator

Removes the legacy n(z) A/B/C "blind" axis. It has nothing to do with Smokescreen blinding (#253). Picking an n(z) now means picking a cat_config entry, which already names its n(z) in shear.redshift_path.

What changes

  • CosmologyValidation loses blind=. get_redshift reads the entry's shear.redshift_path as written.
  • The workflow drops BLINDS, FIDUCIAL["blind"], harmonic.fiducial.blind, the pseudo-Cl/covariance/inference {blind} wildcard, and --blind on the pseudo-Cl scripts. build_redshift_path is replaced by catalogue_entry(version) and redshift_path(version).
  • SP_v1.4.6.3_{A,B,C} are copies of SP_v1.4.6.3 that differ only in their n(z): same mask, cov_th and paths. papers/bmodes compares them through fiducial.nz_realisations.
  • The PSF-leakage nz.dndz.path is a {pipeline} template. It points to the same file as before.
  • papers/bmodes paper macros:
    • The pure-E/B PTE macros read the pte_joint that pure_eb_data_vector writes. They were never emitted, because the script read pte_joint_min, which nothing writes.
    • Dead per-blind and COSEBIs macro blocks go. Nothing produced their inputs, and no TeX uses them.
  • bb_covariance_blind_independence becomes bb_covariance_nz_independence. It takes its realisations from nz_realisations, and the first entry is the reference. For A/B/C the figure and the B_to_A/C_to_A evidence are unchanged.
  • redshift_path(version) returns the entry's shear.redshift_path as written, the same way get_redshift reads it.

Result-affecting config changes

  • SP_v1.4.8, SP_v1.4.11.3, SP_v1.4.11.3_ecut07 and SP_v1.4.11.2 now read the n(z) their CosmoCov covariances were built with (nz_SP_v1.4.8_A, nz_SP_v1.4.6_A), not dndz_SP_A.txt. Their harmonic products (pseudo-Cℓ, theory) shift. Their covariances do not change.
  • The fiducial SP_v1.4.6.3 path is unchanged, in both configuration and harmonic space.

For users: existing products need renaming on disk to avoid recomputing them.

  • The blind=A / _A_ token is dropped: pseudo_cl_{v}_blind=A_powspace_nbins=32.sacc becomes pseudo_cl_{v}_powspace_nbins=32.sacc, and covariance_{v}_A_g_… becomes covariance_{v}_g_….
  • B and C realisation products move the token into the version: covariance_SP_v1.4.6.3_leak_corr_B_g_… becomes covariance_SP_v1.4.6.3_B_leak_corr_g_…. The same goes for …_leak_corr_B_pure_eb_* and pseudo_cl_cov_SP_v1.4.6.3_leak_corr_blind=B_….

Verified on candide at d887c936:

  • container fast suite: 306 passed, 1 xfailed;
  • workflow/tests: 7 passed, 1 skipped (the SLURM smoke test runs only from a login node), including dry-runs of the real papers/cosmo_val and papers/bmodes DAGs.

— Claude (Opus) on behalf of Cail.

🤖 Generated with Claude Code

cailmdaley and others added 25 commits September 25, 2026 20:57
…logue paths

The synthetic pure-E/B pins passed in CI and failed on candide because
TreeCorr's default bin_slop/angle_slop make ξ± follow the tree's top-level
split, which varies with the jackknife patches and, through min_top, with the
thread count TreeCorr takes from cpu_count(). Fixed patch centres alone leave
a 4-vs-48-thread spread (reporting ξ− up to 16%); exact binning removes it
(1e-12). The test measures with bin_slop = angle_slop = 0, and test_b_modes
pins pure_eb_from_xi on the same ξ±, committed as
tests/data/pure_eb_xi_fixture.npz.

The configured-path guard skips cat_config's paths.output and directory-less
calibration params.input_path values. The two LFmask entries (data gone) and
the six unread covmat_file keys leave cat_config.yaml, and the slow duplicate
test_catalog_paths_exist goes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
TreeCorr derives min_top, the depth of its root cells, from its thread count
(max(3, ceil(log2 n)), with n from cpu_count() when unset). The root cells set
which pairs bin_slop approximates, so at default slop calculate_2pcf's ξ±
depended on the node: on the synthetic catalogue, 48 threads move ξ± by 0.038σ
against 4. The shared treecorr_config pins min_top = 6, which is what TreeCorr
derives on candide's 48- and 64-CPU nodes; the same config reaches the
aperture-mass, leakage and ρ/τ correlations.

test_calculate_2pcf_does_not_depend_on_thread_count measures at production
binning on 4 and 48 threads (fresh Catalog each, shared patch centres) and
requires agreement below 1e-6σ; it is red without the pin.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
calculate_pure_eb_correlation (modes and jackknife) and pure_eb_covariance_mc
call cosmo_numba through pure_eb_from_xi, so the transform test_b_modes pins
is the one every pure-E/B product runs through.

The committed ξ± fixture is now a conftest fixture (pure_eb_xi) with two
users. The synthetic pure-E/B test asserts that the ξ± and edges it measures
equal the fixture (agreement 2e-13), and that its modes are pure_eb_from_xi of
them; this replaces its copy of the mode pins, and np.savez of what it
measures regenerates the fixture. test_b_modes pins pure_eb_from_xi on the
fixture, which fails loudly if cosmo_numba does not import, with no skip.
A failure now names what moved: the measured ξ±, the wiring into the kernel,
or the transform.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
The jackknife covariance function indexed pure_EB(x) once per key, so every
realisation ran cosmo_numba's transform six times (55 transforms at npatch=8
where 10 suffice; values unchanged). _eb_vector concatenates the modes in
_EB_KEYS order for both the jackknife and the MC covariance.

The synthetic pure-E/B test counts transforms around calculate_pure_eb and is
red on the per-key closure (55 > npatch + 2).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
Two tests in the section compare values (pure-E/B against committed ξ±, ξ±
across TreeCorr thread counts); the header defers to each test's docstring
instead of listing them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
…, one output root, one integration grid

- Launch-time parity: container.image_runtime reads the image's Python minor
  and Snakemake version (SIF via apptainer, sandbox off disk, tags skipped);
  common.check_host_parity stops a launch whose host Snakemake differs, with
  the reinstall command. configure() and image_sims.smk call it; the README
  install line pins --python 3.12.
- The catalogue config is the launched checkout's cosmo_val/cat_config.yaml,
  loaded by configure() into CATALOG_CONFIG; the paper Snakefiles no longer
  merge it into `config`, and covariance.smk / ecut.smk read CATALOG_CONFIG.
- One output root: cv_init_params passes output_dir=COSMO_VAL, cv_runner no
  longer chdirs into the live checkout, and CosmologyValidation drops its
  COSMO_VAL environment fallback.
- One integration grid (R12): the cosebis grid is gone; cv_cosebis reads the
  integration part and the CosmoCov g covariance on that grid (the one
  pure-E/B uses). An npatch=1 grid defaults to the diagonal covariance, and a
  binning outside the named grids takes its covariance from its own patches.
- The candide profile sets jobs: 100.
- workflow/tests: host-launcher DAG tests on a toy checkout (P1-P3) and the
  real papers on candide (P4, P5 = the container smoke test, moved here); CI
  runs them in a workflow-dag job. test_bmodes_workflow_dry_run.py is
  replaced by P4.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
… image

- container.CACHE_DIR is ~/.cache/sp_validation whatever XDG_CACHE_HOME says.
  A job runs the image from the path the launching host resolved, and on
  candide XDG_CACHE_HOME is node-local /scratch: from such a shell the launch
  fell back to the registry tag and skipped the parity check.
  SPV_CONTAINER / SPV_SANDBOX remain the overrides.
- test_launch_reads_the_image_under_home: a mismatched image under a fake
  ~/.cache stops the launch while XDG_CACHE_HOME points elsewhere.
- test_papers_resolve_on_candide asserts unconditionally that the launch read
  a local image (no "parity unchecked").
- test_image_sims_checks_parity_at_launch: the standalone image-sims
  Snakefile stops on a mismatched image.
- test_assemble_resolves pins each terminal file's inputs: the reporting ξ±
  part with its CosmoCov ng covariance, the fiducial-binning pseudo-Cl part
  with its NaMaster covariance, COSEBIs, pure-E/B and ρ/τ.
- The container smoke test launches as the README does (no --jobs), so the
  candide profile's job bound is under test.
- Test docstrings drop the design-table row IDs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
A grid is a binning; rule xi takes cov=patch_cov(npatch) directly, so
grid_cov, _named_grid and the grids' cov key go. cv_init_params loses its
unused version_list, and the cosmo_val rules pass one CV_INIT.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
Name where the other rules write: masks under the run directory's
output/masks/, papers/bmodes' figures and macros under its docs/, image sims
under grids_base.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
…5 test what a launch does

A job's Snakemake inherits the launching shell's environment (--export=ALL),
and a login shell may point XDG_CACHE_HOME at node-local storage: every job
then fails creating its source cache. Two halves close it, each needed (shown
on n33 by replaying the captured sbatch job command with srun stubbed):
- the candide profile leaves source-cache out of shared-fs-usage, so a job
  neither reuses the launch's cache path nor creates its own under XDG;
- common.py drops XDG_CACHE_HOME from what jobs inherit, because the
  slurm-jobstep executor forces a shared source cache on the Snakemake it
  starts for each job step.
test_a_job_needs_no_launch_cache covers both (each mutation turns it red).

P4 (test_papers_resolve_on_candide) now passes from a shell with node-local
XDG_CACHE_HOME under srun, and its bmodes case also resolves an e-cut
catalogue, so both CATALOG_CONFIG readers in ecut.smk are exercised. P5 hands
the smoke Snakefile the image a launch resolves (no registry pull). The host
launcher and CI carry snakemake-executor-plugin-slurm, as the README install
line does, so the candide profile is parsed in CI.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
…tainer.py does

container_env.sh still followed XDG_CACHE_HOME, so from a login shell that
points it at node-local storage the sweep drivers ran a missing image while
spv-container and the workflow found the real one.
test_sweep_drivers_run_the_resolved_image pins the shell copy of the
resolution (cache and sandbox precedence) to container.resolve_image.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
Which covariance a part carries had two homes that disagreed: rule xi passed
cov=patch_cov(npatch) ("diagonal" at npatch=1), while run_2pcf's own default,
reached by the CLI and papers/bmodes' run_xi_sweep, was "none". The same
file name then held variances or not depending on who wrote it. run_2pcf now
carries what TreeCorr estimated (gg.var_method, which calculate_2pcf sets from
npatch): the jackknife covariance with patches, the shot-noise diagonal
without. The cov argument, --cov, the jackknife guard, rule xi's cov param
and common.patch_cov (with its test) go. Rule xi hands its wildcards to
grid_of directly (xi_binning_of goes).

test_xi_part_carries_the_covariance_the_measurement_estimated runs run_2pcf
on the synthetic catalogue at npatch 1 and 4; the previous run_2pcf fails
both cases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
… check with a stub

The candide profile deploys with apptainer, and Snakemake asks for the apptainer
binary and its version even in a dry-run, so test_a_job_needs_no_launch_cache
failed on GitHub's runners, which have no apptainer. A stub apptainer on the
test's PATH answers that check; the dry-run reads nothing else from it.

In a CI emulation (a clean checkout, a fresh HOME, no apptainer or SLURM on
PATH, the workflow-dag command) the suite goes from 1 failed, 11 passed to 12
passed. Both mutations still turn the test red there: source-cache added back to
the profile's shared-fs-usage (NotADirectoryError under the blocked
XDG_CACHE_HOME) and the XDG_CACHE_HOME pop removed from common.py (the job sees
the launch's cache).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
…nakefiles do

P5's Snakefile never imported common, so its launch did not drop
XDG_CACHE_HOME: from a login shell pointing it at node-local /scratch, the
job's inner Snakemake died creating its source cache (PermissionError), which
says nothing about what a real launch does. The Snakefile now imports common,
resolves its image with common.resolve_container and checks host/image parity,
as the entry Snakefiles do. P5 launches exactly as the README does, with no
--config container=, and the literal default image and the test that kept it in
step with CONTAINER_URI go.

Checked on n33 with sbatch stubbed to record what it would submit, then the
recorded job replayed with srun stubbed, from a shell with XDG_CACHE_HOME set
to /scratch/cdaley/tmp/xdg: at the parent commit the job environment carries
XDG_CACHE_HOME and the replay fails with PermissionError; with this commit it
carries none, the job runs in the SIF, and P5's assertions pass on its report.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
The host/image parity check had a home beside the resolver, so configure()
resolved the image once only to check it, and every Snakefile that picks its
own image (image_sims.smk, the smoke Snakefile) had to remember a second
line. resolve_container now runs check_host_parity on the image it returns:
the image checked is the image that runs, and the extra call sites go.
check_host_parity stays cached, since composed Snakefiles evaluate
container: more than once.

Removing the check from resolve_container turns 5 host tests red (both
parity cases, the unreadable-image line, the image under ~/.cache, image
sims).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
…s src

The smoke Snakefile imported common but never put the checkout's src/ on the
job's PYTHONPATH, so its job imported the image's baked sp_validation, and
P5's assertion (any editable src/ layout) passed on it. The smoke Snakefile
now calls inject_checkout_pythonpath as configure() does for the entry
Snakefiles, and P5 asserts the job's sp_validation is this checkout's
src/sp_validation/__init__.py.

Run on n08 through the default profile (apptainer, no SLURM): the job reports
<checkout>/src/sp_validation/__init__.py; with the injection removed it
reports /sp_validation/src/sp_validation/__init__.py, which the new assertion
rejects and the old one accepted. P5 itself needs a SLURM submit host and has
not been run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
A launch from any checkout that named no COSMO_VAL read that checkout's
catalogue config and code but wrote every cosmo_val product into the
production tree, silently. COSMO_VAL now defaults to the launched checkout's
(gitignored) cosmo_val/output, so production is written only from the
production checkout or when a launch names it; COSMO_INFERENCE keeps its
shared default. README says so.

P2 gains an unnamed case: with COSMO_VAL unset, every declared output lies
under the toy checkout's cosmo_val/output, the inference root or results/.
Restoring the production default turns it red (outputs under
/n17data/cdaley/unions/code/sp_validation/cosmo_val/output).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
With patches, calculate_2pcf wrote its .txt with write_cov=True and no
per-patch results. TreeCorr 5.1.4 writes num_rows only alongside patch
results, so its reader ran on into the cov block and raised ("got 12 columns
instead of 11"). The two ξ± figure rules re-enter calculate_2pcf on the
reporting grid (npatch=100) and hit exactly that read. The dump now carries
the columns only; the covariance matrix lives in the SACC part, and the
figure readers use the columns.

test_a_patched_xi_dump_reads_back measures at npatch=4, then re-enters
calculate_2pcf from a fresh CosmologyValidation and compares the columns;
under write_cov=True it fails with the ValueError above.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
A real launch through the committed candide profile, of an up-to-date
target, submits nothing, so it runs in CI and on an allocation; the same
launch through the profile without `jobs` is refused. test_container_smoke
submits a real job and needs sbatch, which only a login node has; it is
documented as the login-node check it is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013EGDJZeA8v26eKGAHQqh5j
P5 (one real SLURM job through the candide profile, from a login node)
passed, but only on its retry: the job finished, its output took more
than 5 s to show on the login node's /home, and Snakemake re-ran it. On a
multi-hour job that retry costs hours, and a second miss fails the run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TJSfyQjoQXjPKsEfkGhZLj
Choosing an n(z) is choosing a catalogue entry: each entry's
shear.redshift_path is its n(z), read by CosmologyValidation.get_redshift
and by the workflow's redshift_path(version). CosmologyValidation loses its
blind override, and the pseudo-Cl, covariance, inference and papers/bmodes
filenames lose their blind token and wildcard.

- common: catalogue_entry()/redshift_path() replace build_redshift_path;
  covariance_{base,dir,path} and pseudo_cl_tag drop blind; the version
  constraint admits the _A/_B/_C entries.
- covariance.smk: get_cat_params and the star-halo mask resolve through
  the catalogue entry.
- papers/bmodes: bb_covariance_blind_independence and the talk n(z) plot
  compare fiducial.nz_realisations, the SP_v1.4.6.3_{A,B,C}_leak_corr
  entries; pure-E/B, COSEBIs PTE and pseudo-Cl paths are per version.
- cat_config: SP_v1.4.6.3_{A,B,C} match SP_v1.4.6.3 but for their n(z);
  SP_v1.4.8 and SP_v1.4.11.3(_ecut07) name the n(z) their covariances used.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TJSfyQjoQXjPKsEfkGhZLj
nz.dndz.path names the file with {pipeline}; the same file as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TJSfyQjoQXjPKsEfkGhZLj
Like SP_v1.4.11.3, its covariance was built from nz_SP_v1.4.6_A.txt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TJSfyQjoQXjPKsEfkGhZLj
cailmdaley and others added 4 commits September 28, 2026 05:52
A script: job unpickles the host's snakemake object with whichever snakemake
it imports first, and the image's site-packages precede the host's appended
sys.path. The image carried its own (the workflow extra, and the base image's
jupyter extra), so the host had to match its version exactly. The Dockerfile
now uninstalls every snakemake* package after the sync and the workflow extra
drops snakemake; the job then reads the pickle with the package that wrote it.

The launch check keeps only the Python minor (check_host_python): the host's
snakemake and its compiled dependencies load into the image's interpreter.
The README install line, CI's DAG job and the test harness no longer pin a
Snakemake version. The container smoke job now reports which snakemake
unpickled its object and asserts it is the host's version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TJSfyQjoQXjPKsEfkGhZLj
Drops the candide LD_LIBRARY_PATH to /softs/openmpi: /softs is not bound, so
the path does not exist inside the container, and no containerized rule uses
MPI. Drops the default profile's --bind /home (apptainer mounts $HOME already).
States the real reasons for the rest: rerun-triggers leaves out software-env
because it hashes the per-person image path; shared-fs-usage leaves out
source-cache because jobs would be handed the launch's node-local cache path;
slurm_account because the executor's guess fails on candide; retries and
kept logs for fan-outs and their printed output.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TJSfyQjoQXjPKsEfkGhZLj
Apptainer binds $HOME, so a job read the launcher's own matplotlibrc, and a
LaTeX preamble there the image cannot typeset stopped every figure rule.
common.py points each job's MATPLOTLIBRC (through APPTAINERENV_, past
--cleanenv) at an empty workflow/matplotlibrc. The container smoke job reports
the matplotlibrc it would read and the test asserts it is the repo's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TJSfyQjoQXjPKsEfkGhZLj
cailmdaley and others added 10 commits September 28, 2026 05:57
workflow.common runs in the host Snakemake with no sp_validation installed,
and loads container.py by path; container.py imports only the standard
library, since it also runs as the spv-container CLI before any image exists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TJSfyQjoQXjPKsEfkGhZLj
…ainer from mounting it

A job's home is its working directory, so a checkout or output tree under
the launching user's home was invisible to the job: the toy run's jobs
imported the image's sp_validation instead of the checkout's src/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TJSfyQjoQXjPKsEfkGhZLj
#358 deleted the ecut rules and the sweep drivers' container_env.sh, so
their edits here, the dry-run test this branch folded into
workflow/tests, and the test pinning container_env.sh go with them; the
bmodes DAG test resolves the 'paper' target.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The image's TeX now carries sfmath, so a usetex preamble typesets inside
jobs and the repo matplotlibrc override has nothing left to guard. The
shapepipe:develop base ships no snakemake, so the uninstall step is gone;
pyproject says why the workflow extra must not re-add it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rofile and README

The launch resolves its image and runs it; the README states that the host
Snakemake runs on the image's Python (3.12). The CONTRACTS notes go (the
workflow-dag CI job is what enforces host-importability). The candide profile
excludes n17 and n36 only, and the README's output-roots paragraph and the
profile's shared-fs-usage comment say what they need to in fewer lines. The DAG
tests drop the Python-check tests and the profile job-bound test, and
test_one_integration_grid checks only the shared COSEBIs/pure-E/B inputs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The container smoke job reports and checks placement, imports, Snakemake
version and provenance; the host-side suite no longer needs numpy.
test_xi_grids loses its grid-count test, and the pure-E/B cosmo_val test keeps
its value checks without counting kernel calls.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Combines #358's removal of the papers/bmodes claims layer with this branch's
removal of the n(z) A/B/C blind axis. Files #358 deletes stay deleted (spec
.md files, claims/presentation/ecut rules, sweep scripts), since this
branch's edits to them only renamed blind tokens. figures.smk takes #358's
spec-less inputs with this branch's blind-free paths: cosebis_binning_comparison
stays dropped, precompute_pure_eb carries no blind wildcard constraint,
pure_eb_covariance reads the fiducial version's npz directly, and
bb_covariance_blind_independence iterates over NZ_REALISATIONS.
pure_eb_data_vector.main and harmonic_space_pte_matrices take neither specs
nor a blind.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lind macros

pure_eb_data_vector writes one fiducial `pte_joint`, so \ebfiducialPte and
\ebfullPte read that key. The covariance_blind_consistency and
per-blind PTE-spread macros go: nothing produces their inputs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@cailmdaley
cailmdaley changed the base branch from feat/workflow-baseline to develop September 28, 2026 17:25
cailmdaley and others added 4 commits September 28, 2026 19:37
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

# Conflicts:
#	src/sp_validation/tests/test_cv_init_params.py
#	workflow/common.py
#	workflow/rules/cosmo_val.smk
#	workflow/rules/covariance.smk
#	workflow/tests/conftest.py
… reads

generate_paper_macros no longer emits \cosebisfiducialPte, \cosebisfullPte or
\cosebisthetaMin/Max: they read keys cosebis_version_comparison evidence
does not carry and no paper uses them (the COSEBIS PTEs come from
\configPte<Ver>Cosebis[Full]). The macro rules drop the cosebis and BB
realisation evidence inputs accordingly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ions

The BB-covariance n(z)-independence check (renamed from
bb_covariance_blind_independence: rule, script, tapestry outputs) takes its
realisation labels from config fiducial.nz_realisations, the first as the
reference and every other compared against it; figure markers, evidence keys
(<label>_to_<reference>, plus reference_realisation) and summary maxima follow
the configured set rather than a hardcoded A/B/C. The summary flag is
cosebis_bb_nz_independent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Matches CosmologyValidation.get_redshift, which does not join the entry's
subdir; base_version's docstring names what uses it (footprint, plotting
style).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@cailmdaley
cailmdaley merged commit a8a08bc into develop Sep 28, 2026
4 checks passed
@cailmdaley
cailmdaley deleted the refactor/scrub-legacy-blind branch September 28, 2026 21:46
cailmdaley added a commit that referenced this pull request Sep 28, 2026
The branch's own change (ddeb904..e34b46a) is laid onto develop, which
now carries #357, #358 and #359 as squashes, and each cut there holds:

* workflow/common.py: no image_python/check_host_python and no
  APPTAINERENV_MATPLOTLIBRC. base_version is custody's base catalogue;
  variants share their base's footprint and plotting style.
* workflow/README.md: develop's shorter output-roots paragraph, plus how a
  collaborator names their own COSMO_INFERENCE and how patch centres are drawn.
* workflow/tests: no fake image and no container= launch argument; the
  image-Python, image-under-home, profile-bounds and image-sims launch tests
  stay cut. test_one_integration_grid stays and reads the forced listing; the
  toy keeps its covariances map for it. The candide paper dry-runs target
  bmodes' `paper` and write into a tree of their own with stand-in centres.
  The candide toy run no longer plants a user matplotlibrc.
* test_cosmo_val: the pure-E/B test checks the jackknife against TreeCorr's,
  without a transform count.
* papers/bmodes: the ξ± parts replace the text dumps in rules/figures.smk
  and bb_covariance_nz_independence.py; the deleted sweep scripts and
  cosebis_binning_comparison stay deleted.
* No CONTRACTS files: the blind registry's layout lives in blinding.py's
  docstring, and custody.py's says it is stdlib-only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant