v17_paradigm_assessment - TerrenceMcGuinness-NOAA/global-workflow GitHub Wiki

v17 dev_gsiupd2 Paradigm Assessment

Branch-comparison and infrastructure assessment of the CatherineThomas-NOAA/global-workflow dev_gsiupd2 line (the pre-coupled-modeling DA development trajectory) against the current forked develop baseline. Captured to anchor the upcoming SDD work plan to fold v17 coverage into the EIB MCP / GraphRAG knowledge base.

Field Value
Date captured 2026-04-22
v17 branch dev_gsiupd2
v17 HEAD fd237a4f9 โ€” Update GSI hash for unused variables and include new MPI setting for GSI (#4780)
Compared against forked develop (94548bc4f, TerrenceMcGuinness-NOAA/global-workflow)
Relative position +21 commits, 0 behind; merge-base 94548bc4f
Cumulative diff env/modulefiles/versions/parm/sorc/ush: 57 files, +961 / -222; dev/workflow infra: 47 files, +489 / -169
Reference EXPDIRs /gpfs/f6/gfs-cpu/world-shared/Catherine.Thomas/tmp/RUNTESTS_v17_gsiupd3/EXPDIR (9 cases, all Done)

1. Why this matters

dev_gsiupd2 is the current evolutionary tip of the v17 DA line. It is not a sideways fork โ€” it is 21 commits straight ahead of develop โ€” but its content culminates a divergent trajectory that pre-dates the upcoming coupled-modeling paradigm shift. Catherine Thomas's team drives experiments through the CM-managed dev/workflow/generate_workflows.sh directly (no GitLab CI/CD pipeline, no rocotostat.py instrumentation), so EXPDIR layouts and log artifacts differ from anything the forked branch's CI ever produces.

For the EIB MCP/GraphRAG, this means the existing collections โ€” ingested from a snapshot that predates v17 additions โ€” silently miss v17-only entities and return stale answers when asked about paradigm-specific behaviour. This document inventories what changed so the knowledge base can be updated deliberately rather than reactively.

2. Branch reality (git context)

HEAD = fd237a4f9 (dev_gsiupd2)
Merge-base with forked develop = 94548bc4f
Ahead/Behind = 21/0
Remote = github.com/CatherineThomas-NOAA/global-workflow

The 21 commits on top of forked develop are mostly straight develop progress (NSF/NCAR Derecho support, Ursa CI HPC account update, GFS low-res test case, ufs-model + GDAS hash refresh, complex2 GRIB2 packing, postamble executable, broad ush hygiene cleanup) plus the GSI-specific bump that names this branch (#4780, #4729). All ten submodules of the local dev_gsiupd2 clone have been initialized for this assessment.

3. Workflow-superproject changes (v17 vs forked develop)

3.1 NSF Derecho platform support (largest single chunk)

Path Kind
env/DERECHO.env new, +315 lines
versions/build.derecho.ver, versions/run.derecho.ver new
modulefiles/gw_run.derecho.lua, modulefiles/gw_setup.derecho.lua new
dev/workflow/hosts/derecho.yaml new
dev/workflow/hosts.py adds 'DERECHO' to SUPPORTED_HOSTS; auto-detect via /gpfs/csfs1; new _apply_env_overrides() honoring BASE_IC env var
dev/parm/config/{gcafs,gfs,gefs,sfs}/config.resources.DERECHO new per-app resource configs
parm/fetch/gcafs_ATMA_gdas-anl_derecho.yaml.j2 new fetch template

derecho.yaml selects pbspro scheduler, queues develop/main, paths under /lustre/desc1. Resolutions C48โ€“C1152 are flagged supported.

3.2 New SFS application registered

dev/workflow/applications/sfs.py โ€” SFSAppConfig(AppConfig):

  • Reads RUN (defaults to sfs) and NMEM_ENS from config.base.
  • _get_app_configs builds stage_ic โ†’ fcst โ†’ atmos_products plus, when ensemble size > 0, efcs and atmos_ensstat; conditional wave block (waveinit, wavepostsbs, wavepostpnt, with bnd / pnt / bull variants); oceanice_products, prep_emissions, extractvars, arch_tars/globus, arch_vrfy, cleanup.
  • _update_base forces RUN='sfs'.
  • get_task_names returns the ordered task list mirroring the configs.

Companion config tree: dev/parm/config/sfs/{config.base.j2,config.efcs, config.arch_tars.j2,config.atmos_products,config.atmos_ensstat,...}.

3.3 Exclusive-node task scheduling support

dev/workflow/rocoto/tasks.py adds the _EXCLUSIVE resource family:

  • New keys: clusters_exclusive, partition_exclusive, queue_exclusive, constraint_exclusive (validated from base).
  • When a task config sets is_exclusive, the generator uses the _exclusive values (falling back to batch) and emits PBS :exclhost / Slurm --exclusive natives. Local exclusive_task variable consolidates the two scheduler branches.

3.4 generate_workflows.sh rework (+257 lines)

This is the single entry point for v17 testing โ€” it bypasses GitLab CI entirely and shells out to setup_expt.py + setup_workflow.py per case. New flags relevant to the v17 workflow:

Flag Purpose
-S Run all valid SFS cases
-C Run all valid GCAFS cases
-I /path Override BASE_IC for every generated experiment

Case selection block at line 138 (case "${option}"); ambiguous-selection guard at line 323; YAML iteration at line 640.

3.5 Broad ush/ refactor (production hardening)

Change Files
postamble.sh rewritten as executable script (#4719) ush/postamble.sh
New helpers err_exit.sh, set_strict.sh, unset_strict.sh, timer.sh, wait_for_file.sh, cpfsd.sh, getdump.sh, getioda.sh, setup_data_dir.sh, dataroot_com_path.sh
Module-loading hygiene module-setup.sh, detect_machine.sh, jjob_shell_setup.sh, load_modules.sh (only check HOMEglobal when loading; #4738; remove prod_util / module-reset under ecflow #4657)
Parser updates parsing_namelists_{FV3,FV3_nest,CICE,GOCART,MOM6,WW3}.sh, parsing_model_configure_FV3.sh, parsing_ufs_configure.sh
Removed ush/fv3gfs_remap_weights.sh

3.6 Job-card cleanup (~10 JJOBs)

JGEFS_WAVE_STAT*, JGLOBAL_AERO_ANALYSIS_FINALIZE, JGLOBAL_ANALYSIS_STATS, JGLOBAL_ARCHIVE_TARS, JGLOBAL_ATMOS_SFCANL, JGLOBAL_ENKF_SELECT_OBS, JGLOBAL_FORECAST, JGLOBAL_MARINE_ANALYSIS_FINALIZE and _LETKF, JGLOBAL_WAVE_POST_SBS lose now-unneeded prod_util / module reset lines so that jobs run identically under rocoto and ecflow.

3.7 Templating push (.j2)

config.arch_tars and config.fetch migrated to Jinja2 templates across gcafs, gfs, gefs, and sfs, consistent with the broader move to template-everywhere configuration.

3.8 Submodule pin bumps

Submodule forked develop v17 dev_gsiupd2
sorc/gdas.cd a6df6330 a6512d26
sorc/gsi_enkf.fd 98d609a6 005343a4 (feature/llvm)
sorc/gsi_monitor.fd 00406871 2d0b5ee5
sorc/gsi_utils.fd 4e855b6c 0d6698c6
sorc/nexus.fd 7b0772b7 a89721aa
sorc/ufs_model.fd 7b637a8b 163ba47b (Mar 19 hash, #4536)
sorc/ufs_utils.fd a5001f95 ae59bc7a

The DA-paradigm content (the GSI updates that name this branch and the synchronized ufs-model / GDAS bumps) lives inside the submodules, not in the global-workflow superproject.

4. EXPDIR observations (RUNTESTS_v17_gsiupd3)

Nine experiments, all Done per gw_cistat:

Case tasks metatasks cycledefs cycles
C48_ATM 8 10 1 1
C48_S2SW 15 25 1 1
C48mx500_3DVarAOWCDA 56 45 3 2
C48mx500_hybAOWCDA 39 25 2 2
C96_atm3DVar 32 23 3 3
C96C48_hybatmDA 46 36 3 3
C96C48_hybatmsnowDA 47 37 3 3
C96C48_hybatmsoilDA 49 37 3 3
C96C48mx500_S2SW_cyc_gfs 85 67 4 3

Layout per case (note: configs are flat at EXPDIR root, no config/ subdir):

EXPDIR/<case>/
  PSLOT.xml          # generated rocoto workflow
  PSLOT.db           # rocoto sqlite state
  PSLOT_lock.db      # rocoto lock
  PSLOT.scron.sh     # cron driver
  PSLOT.crontab      # crontab fragment
  config.*           # ~80 config files at root
  logs/
    YYYYMMDDHH.log   # per-cycle rocoto log
    scron.log        # cron driver log

There are no *_rocotostat.log files in v17 EXPDIRs because the forked-repo CI's dev/ci/scripts/utils/rocotostat.py wrapper is not part of this development line.

Sampled task topology (C96C48_hybatmDA_v17_gsiupd3, 46 unique task names, 10 metatasks) confirms the canonical three-cycledef pattern from the v16 diagram: gdas_half (single bootstrap) โ†’ gdas (cycled, 6h) โ†’ gfs (forecast, 24h). Task families:

  • GDAS deterministic โ€” gdas_prep, gdas_anal, gdas_analcalc, gdas_analdiag, gdas_sfcanl_{gcycle,regrid}, gdas_atmanlprod/upp, gdas_fcst_seg#seg#, gdas_atmos_prod_#fhr_label#, gdas_fit2obs, gdas_verfozn, gdas_verfrad, gdas_vminmon, gdas_anlstat, gdas_arch_tar_#tartype#, gdas_arch_vrfy, gdas_cleanup.
  • EnKF (enkfgdas_*) hybrid DA โ€” eobs, ediag, eupd, ecen#grp#, epos#grp#, esfc_{gcycle,regrid}, echgres, fcst_mem#member#, stage_ic, earc_*, cleanup.
  • GFS deterministic โ€” gfs_prep, gfs_anal, gfs_analcalc, gfs_atmanlprod/upp, gfs_fcst_seg#seg#, gfs_atmos_prod_#fhr_label#, gfs_tracker, gfs_genesis, gfs_arch_*, gfs_cleanup.

Throttling per workflow XML: <workflow scheduler="slurm" cyclethrottle="3" taskthrottle="25">, partition batch, cluster c6, account gfs-cpu.

5. MCP / GraphRAG gap analysis

Current knowledge base state (per get_knowledge_base_status):

Collection Documents
code-with-context-v8-0-0 60,576
global-workflow-docs-v8-0-0 22,498
jjobs-v8-0-0 700
community-summaries 2,113
ci-test-cases-v1-0-0 74
ee2-standards-v5-0-0-enhanced 34
Neo4j 2,758 files / 2,012 functions / 54 classes / 2.65 M relationships

Gaps when interrogating v17 content today:

  1. applications/sfs.py and SFSAppConfig โ€” missing from graph; find_callers_callees on these symbols returns nothing.
  2. Derecho host (hosts/derecho.yaml, env/DERECHO.env, gw_*.derecho.lua, versions/*.derecho.ver) โ€” not represented; get_workflow_structure will not list Derecho among supported platforms.
  3. tasks.py is_exclusive resource branch โ€” graph carries the older signature; queries about exclusive scheduling fall through.
  4. ush refactor (postamble executable, err_exit, strict helpers, parsers, new helpers) โ€” stale; lookups by file path drift (we already saw workflow_xml.py vs rocoto_xml.py).
  5. gsi_enkf.fd feature/llvm branch content โ€” never indexed (submodule snapshots are pinned to whatever was previously ingested).
  6. generate_workflows.sh -S/-C/-I flags โ€” search returns the older parameter set.

6. Recommended path to fold v17 into MCP/GraphRAG

Captured here as the seed for the SDD descriptor; details to be elaborated in the spec phase.

  1. Dual-branch ingestion. Add a second snapshot of dev_gsiupd2 with all submodules at v17 pins. Suggested collection naming: code-with-context-v17-dev_gsiupd2-<sha>, global-workflow-docs-v17-dev_gsiupd2-<sha>. Keep the existing develop collections untouched.
  2. Branch / commit metadata. Tag every Chroma chunk and every Neo4j node with branch, commit_sha, and paradigm (develop | v17_pre_coupled). Expose a filter argument on search_documentation and on graph queries (analyze_code_structure, find_callers_callees, trace_execution_path) to scope answers to a paradigm.
  3. Schema extensions for v17-only entities listed in ยง5. In particular: add the is_exclusive resource axis to the Task node, register the SFS application class, model the Derecho host the same way other hosts are modeled, and recognize the .j2 template family for archive/fetch configs.
  4. Path-drift reconciliation. Sweep the graph for files renamed or removed since v8 ingestion (e.g. ush/fv3gfs_remap_weights.sh, workflow_xml.py) and emit a deprecation/redirect map so older queries resolve to current paths.
  5. Cross-cutting collections stay shared. community-summaries, ee2-standards-v5-0-0-enhanced, ci-test-cases-v1-0-0 are paradigm- agnostic and need no split. Only code/docs collections fork.
  6. Reference deliverable. This document, committed under docs/source/v17_paradigm_assessment.md, is the inaugural v17-aware reference doc and the input to the SDD spec phase.

7. Out-of-scope for the descriptor (defer to spec)

  • Detailed Neo4j schema deltas (node labels, properties, edge types).
  • Chroma collection naming convention and migration rules.
  • Ingestion pipeline modifications (paradigm-aware embeddings, dedup with the develop snapshot).
  • Validation criteria and regression suite (sample queries that must be answered correctly per paradigm).
  • MCP tool API surface for branch filtering (parameter naming, default behavior, backward compatibility).

Appendix A โ€” Reference repositories

Path Description
/gpfs/f6/drsa-precip3/scratch/Terry.McGuinness/global-workflow_forked forked-repo develop (94548bc4f) โ€” baseline
/gpfs/f6/drsa-precip3/scratch/Terry.McGuinness/global-workflow.v17_Catherine.Thomas v17 dev_gsiupd2 (fd237a4f9) โ€” submodules initialized
/gpfs/f6/gfs-cpu/world-shared/Catherine.Thomas/git/global-workflow/fork_dev_gfsv17 the working clone that actually drove the EXPDIR run (referenced as HOMEgfs inside the v17 XML)
/gpfs/f6/gfs-cpu/world-shared/Catherine.Thomas/tmp/RUNTESTS_v17_gsiupd3/EXPDIR 9-case v17 EXPDIR root

Appendix B โ€” How this assessment was produced

  • Direct inspection of both repos via the workspace file tools.
  • git diff --stat fork_develop -- <paths> between the two checkouts (forked develop was fetched into the v17 clone as fork_develop for the comparison).
  • gw_cistat plus per-case XML grep for task / metatask / cycledef counts.
  • The EIB MCP gateway was deliberately not used as the source of truth for v17 content because its v8 collections predate the additions catalogued here. The gateway was used only for general Rocoto background and to confirm the v8 graph's path drift.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ