<workflowRun _class='org.jenkinsci.plugins.workflow.job.WorkflowRun'><action _class='hudson.model.CauseAction'><cause _class='hudson.triggers.SCMTrigger$SCMTriggerCause'><shortDescription>Started by an SCM change</shortDescription></cause></action><action></action><action _class='jenkins.metrics.impl.TimeInQueueAction'><blockedDurationMillis>0</blockedDurationMillis><blockedTimeMillis>0</blockedTimeMillis><buildableDurationMillis>0</buildableDurationMillis><buildableTimeMillis>0</buildableTimeMillis><buildingDurationMillis>90056</buildingDurationMillis><executingTimeMillis>89105</executingTimeMillis><executorUtilization>0.99</executorUtilization><queuingDurationMillis>7021</queuingDurationMillis><queuingTimeMillis>7023</queuingTimeMillis><subTaskCount>1</subTaskCount><totalDurationMillis>97077</totalDurationMillis><waitingDurationMillis>7019</waitingDurationMillis><waitingTimeMillis>7019</waitingTimeMillis></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmaster _class='hudson.plugins.git.util.Build'><buildNumber>599</buildNumber><marked><SHA1>ec5e8070d3173282a6317b067f8673a657a1eb6f</SHA1><branch><SHA1>ec5e8070d3173282a6317b067f8673a657a1eb6f</SHA1><name>refs/remotes/origin/master</name></branch></marked><revision><SHA1>ec5e8070d3173282a6317b067f8673a657a1eb6f</SHA1><branch><SHA1>ec5e8070d3173282a6317b067f8673a657a1eb6f</SHA1><name>refs/remotes/origin/master</name></branch></revision></refsremotesoriginmaster></buildsByBranchName><lastBuiltRevision><SHA1>ec5e8070d3173282a6317b067f8673a657a1eb6f</SHA1><branch><SHA1>ec5e8070d3173282a6317b067f8673a657a1eb6f</SHA1><name>refs/remotes/origin/master</name></branch></lastBuiltRevision><remoteUrl>https://github.com/larson-group/clubb.git</remoteUrl><scmName></scmName></action><action></action><action></action><action></action><action></action><action></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'><artifactsUrl>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_r8029_flags_gfortran_test/lastStableBuild/artifact</artifactsUrl><changesUrl>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_r8029_flags_gfortran_test/changes</changesUrl><displayUrl>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_r8029_flags_gfortran_test/lastStableBuild/pipeline-overview</displayUrl><testsUrl>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_r8029_flags_gfortran_test/lastStableBuild/testReport</testsUrl></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'><restartEnabled>false</restartEnabled><restartableStage>Update sys_admin Repo</restartableStage><restartableStage>Run Python Test</restartableStage></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'><node _class='org.jenkinsci.plugins.workflow.graph.FlowStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepAtomNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.cps.nodes.StepEndNode'></node><node _class='org.jenkinsci.plugins.workflow.graph.FlowEndNode'></node></action><action></action><action></action><action></action><building>false</building><displayName>#599</displayName><duration>90056</duration><estimatedDuration>114814</estimatedDuration><fullDisplayName>clubb_BFB_r8029_flags_gfortran_test #599</fullDisplayName><id>599</id><keepLog>false</keepLog><number>599</number><queueId>11028</queueId><result>SUCCESS</result><timestamp>1792398428292</timestamp><url>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_r8029_flags_gfortran_test/599/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>.agents/skills/clubb-bit-changing/SKILL.md</affectedPath><affectedPath>.agents/skills/clubb-jax-port/SKILL.md</affectedPath><affectedPath>.agents/skills/clubb-finalization/SKILL.md</affectedPath><affectedPath>AGENTS.md</affectedPath><affectedPath>.agents/skills/clubb-documentation/change-messages/SKILL.md</affectedPath><affectedPath>.agents/skills/clubb-testing-and-reporting/SKILL.md</affectedPath><commitId>ccafe4f166f956eed26b91f7fdacd5600f60f5b2</commitId><timestamp>1792344464000</timestamp><author><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Define when to declare bit-changing commits (#1403)

* Define conservative bit-change declarations

Centralize the policy around intentional Fortran numerical answer changes, with named affected BFB tests or precise untested conditions. Preserve standalone coverage and the current JAX parity boundary, keep declarations sparse, and separate answer-changing edits from preserving cleanup.

Route message writing, validation and branch finalization to one owner. Skill schemas, local links, heading anchors, parser examples and manual decision scenarios were checked; no model or CI code changes.

* Define the optimization level for bitwise preservation

Use -O0 as the normal preservation standard. Differences confined to optimized builds do not require an answer-change declaration when -O0 is verified BFB; report known optimized-only differences and their configuration in the PR.

The changed skill schema and whitespace checks pass. Inspected current debug compile flags and manually reviewed the optimized-only decision scenario; documentation only, no numerical rerun.
</comment><date>2026-10-18 12:27:44 -0500</date><id>ccafe4f166f956eed26b91f7fdacd5600f60f5b2</id><msg>Define when to declare bit-changing commits (#1403)</msg><path><editType>edit</editType><file>.agents/skills/clubb-finalization/SKILL.md</file></path><path><editType>edit</editType><file>.agents/skills/clubb-jax-port/SKILL.md</file></path><path><editType>edit</editType><file>.agents/skills/clubb-documentation/change-messages/SKILL.md</file></path><path><editType>add</editType><file>.agents/skills/clubb-bit-changing/SKILL.md</file></path><path><editType>edit</editType><file>AGENTS.md</file></path><path><editType>edit</editType><file>.agents/skills/clubb-testing-and-reporting/SKILL.md</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>clubb_jax/src/clubb_standalone.py</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_jax_cli_options.py</affectedPath><affectedPath>run_scripts/README.md</affectedPath><affectedPath>utilities/clubb_case_runner.py</affectedPath><affectedPath>utilities/pytests/test_time_clubb.py</affectedPath><affectedPath>tests/run_timestep_sweep.py</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_case_cache_reuse.py</affectedPath><affectedPath>clubb_python_driver/clubb_standalone.py</affectedPath><affectedPath>tests/README.md</affectedPath><affectedPath>src/clubb_standalone.F90</affectedPath><affectedPath>run_scripts/run_scm_loss.py</affectedPath><affectedPath>utilities/time_clubb.py</affectedPath><affectedPath>.agents/skills/clubb-testing-and-reporting/SKILL.md</affectedPath><affectedPath>utilities/create_case_namelist.py</affectedPath><affectedPath>utilities/pytests/test_create_case_namelist.py</affectedPath><affectedPath>tests/run_stats_output_consistency.py</affectedPath><affectedPath>tests/run_jax_vs_fortran_cases.py</affectedPath><affectedPath>.agents/skills/clubb-fortran-port/SKILL.md</affectedPath><affectedPath>clubb_jax/src/clubb_case_initalization.py</affectedPath><affectedPath>utilities/README.md</affectedPath><affectedPath>utilities/pytests/auto_llm_generated_pytests/test_timing_workers.py</affectedPath><affectedPath>tests/case_runner_lifecycle_test.py</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_device_selection.py</affectedPath><affectedPath>.agents/skills/clubb-numerical-diagnosis/SKILL.md</affectedPath><affectedPath>utilities/pytests/auto_llm_generated_pytests/test_loss_cli.py</affectedPath><affectedPath>tests/pytests/auto_llm_generated_pytests/test_scm_jax_driver_test.py</affectedPath><affectedPath>run_scripts/run_scm.py</affectedPath><affectedPath>.agents/skills/clubb-fortran-format/SKILL.md</affectedPath><affectedPath>.agents/skills/clubb-finalization/SKILL.md</affectedPath><affectedPath>clubb_jax/src/Microphys/microphys_init_cleanup.py</affectedPath><affectedPath>AGENTS.md</affectedPath><affectedPath>jenkins_tests/clubb_driver/Jenkinsfile</affectedPath><affectedPath>utilities/timing_profiles.py</affectedPath><affectedPath>clubb_jax/README.md</affectedPath><affectedPath>run_scripts/run_tuner_job.py</affectedPath><affectedPath>utilities/pytests/auto_llm_generated_pytests/test_clubb_case_runner.py</affectedPath><affectedPath>tests/run_restart_test.py</affectedPath><affectedPath>utilities/pytests/timing_test_inputs.py</affectedPath><affectedPath>clubb_jax/src/CLUBB_core/calc_pressure.py</affectedPath><affectedPath>tests/run_loss_output_consistency.py</affectedPath><commitId>4f8368a377989b649fc0ed53c26957e193d21067</commitId><timestamp>1792350419000</timestamp><author><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Add reusable case runners for timing (#1400)

We have multiple entry points now for clubb standalone (fortran,python,jax), and there's additional logic that chooses which fortran installation to use (gfortran,ifort,nvhpc,etc). All of this has historically (~1 year) been done by run_scm.py, but we have a number of other scripts that need this same kind of logic, so instead of making run_scm.py more complicated and letting other scripts import it's pieces, we've made a `clubb_case_runner`.

`clubb_case_runner` is a python object that abstracts the backend decisions. The "flow" is roughly:
- high level script wants to run a clubb case some how
- generates one or more case namelists (arm.in, bomex.in, etc)
- creates a `clubb_case_runner` by passing it whatever runtime options (-jax/-python/-exe) the user requested
- runs a case by passing this `clubb_case_runner` whatever namelists it wants to run.

In addition to deduplicating runtime setting logic, this allows python scripts to create these high level `clubb_case_runner` objects and use those to do things that usually requires duplicate multiprocessesing and error code parsing logic.
</comment><date>2026-10-18 14:06:59 -0500</date><id>4f8368a377989b649fc0ed53c26957e193d21067</id><msg>Add reusable case runners for timing (#1400)</msg><path><editType>edit</editType><file>tests/pytests/auto_llm_generated_pytests/test_scm_jax_driver_test.py</file></path><path><editType>edit</editType><file>tests/run_jax_vs_fortran_cases.py</file></path><path><editType>edit</editType><file>tests/README.md</file></path><path><editType>add</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_case_cache_reuse.py</file></path><path><editType>add</editType><file>utilities/pytests/timing_test_inputs.py</file></path><path><editType>edit</editType><file>utilities/pytests/test_time_clubb.py</file></path><path><editType>edit</editType><file>utilities/timing_profiles.py</file></path><path><editType>edit</editType><file>.agents/skills/clubb-finalization/SKILL.md</file></path><path><editType>edit</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_jax_cli_options.py</file></path><path><editType>edit</editType><file>run_scripts/run_tuner_job.py</file></path><path><editType>edit</editType><file>utilities/README.md</file></path><path><editType>edit</editType><file>clubb_jax/src/CLUBB_core/calc_pressure.py</file></path><path><editType>edit</editType><file>clubb_jax/src/clubb_case_initalization.py</file></path><path><editType>edit</editType><file>tests/run_restart_test.py</file></path><path><editType>edit</editType><file>utilities/pytests/test_create_case_namelist.py</file></path><path><editType>edit</editType><file>clubb_jax/README.md</file></path><path><editType>edit</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_device_selection.py</file></path><path><editType>edit</editType><file>clubb_jax/src/Microphys/microphys_init_cleanup.py</file></path><path><editType>edit</editType><file>.agents/skills/clubb-numerical-diagnosis/SKILL.md</file></path><path><editType>edit</editType><file>tests/run_stats_output_consistency.py</file></path><path><editType>edit</editType><file>utilities/pytests/auto_llm_generated_pytests/test_loss_cli.py</file></path><path><editType>add</editType><file>utilities/pytests/auto_llm_generated_pytests/test_timing_workers.py</file></path><path><editType>add</editType><file>tests/case_runner_lifecycle_test.py</file></path><path><editType>edit</editType><file>clubb_jax/src/clubb_standalone.py</file></path><path><editType>edit</editType><file>tests/run_timestep_sweep.py</file></path><path><editType>edit</editType><file>src/clubb_standalone.F90</file></path><path><editType>edit</editType><file>AGENTS.md</file></path><path><editType>edit</editType><file>clubb_python_driver/clubb_standalone.py</file></path><path><editType>edit</editType><file>run_scripts/run_scm_loss.py</file></path><path><editType>edit</editType><file>.agents/skills/clubb-testing-and-reporting/SKILL.md</file></path><path><editType>edit</editType><file>tests/run_loss_output_consistency.py</file></path><path><editType>edit</editType><file>jenkins_tests/clubb_driver/Jenkinsfile</file></path><path><editType>edit</editType><file>run_scripts/README.md</file></path><path><editType>edit</editType><file>run_scripts/run_scm.py</file></path><path><editType>edit</editType><file>utilities/time_clubb.py</file></path><path><editType>edit</editType><file>.agents/skills/clubb-fortran-format/SKILL.md</file></path><path><editType>add</editType><file>utilities/clubb_case_runner.py</file></path><path><editType>add</editType><file>utilities/pytests/auto_llm_generated_pytests/test_clubb_case_runner.py</file></path><path><editType>edit</editType><file>.agents/skills/clubb-fortran-port/SKILL.md</file></path><path><editType>edit</editType><file>utilities/create_case_namelist.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>clubb_jax/src/clubb_case_initalization.py</affectedPath><affectedPath>clubb_jax/src/clubb_standalone.py</affectedPath><affectedPath>utilities/README.md</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_jax_cli_options.py</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_device_selection.py</affectedPath><affectedPath>clubb_jax/src/clubb_loss_driver.py</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_code_timer_module.py</affectedPath><affectedPath>run_scripts/README.md</affectedPath><affectedPath>clubb_jax/view_profile.py</affectedPath><affectedPath>clubb_jax/run_jax.py</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_profile_cli.py</affectedPath><affectedPath>clubb_jax/src/CLUBB_core/code_timer_module.py</affectedPath><affectedPath>utilities/time_clubb.py</affectedPath><affectedPath>clubb_jax/src/advance_clubb_to_end.py</affectedPath><affectedPath>clubb_jax/README.md</affectedPath><affectedPath>clubb_jax/src/clubb_driver_test.py</affectedPath><commitId>ec5e8070d3173282a6317b067f8673a657a1eb6f</commitId><timestamp>1792362852000</timestamp><author><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Add JAX timing and profiling (#1393)

* Add JAX timing and persistent benchmark workers

Write Fortran-format CPU timing summaries and optional XProf/Perfetto traces
from JAX driver phases. Use synchronized persistent workers for full-case
warmups and repetitions across Fortran, Python and JAX. Retain compiled JAX
programs when initialization settings are unchanged.

Validation: 243 focused checks and CPU case workflows passed. Repeated
five-step BOMEX/RICO_SILHS numeric outputs matched fresh controls exactly.
The two-column BOMEX JAX/Fortran comparison passed 1e-7 absolute and percent
thresholds. BFB against the parent is not established by these comparisons.
GPU and GPTL execution remain untested.

* Making jax timer use wall clock time instead of cpu/process time

* Keep JAX timing separate from reusable runners

Move process persistence, cache reuse and Python timing adapters to the
case-runner branch. Keep JAX wall-clock summaries, optional deep profiles,
driver instrumentation and the parser change that reads their clock label.

The timing-only shared suite and a three-step CPU BOMEX run pass. BFB
against master is not established; physics expressions are unchanged.

* Add reusable case runners for timing and tuning

Share runtime selection and persistent standalone sessions between SCM,
timing and tuning. Support namelist replacement and empty model reruns,
plus parameter matrices for loss sessions. Synchronize timing cohorts and
record retained-model initialization separately. Use executable loss
workers for native tuning instead of requiring F2PY.

Restore microphysics defaults between cases (BIT_CHANGING for sessions
that previously inherited settings). Short native/CPU JAX sessions match
fresh same-backend stats values exactly; broader BFB is not established.
Native build, focused suites and repeated loss/tuner/timing workflows pass.

* Use F2PY for reusable Fortran loss runs

Run persistent Fortran loss sessions through the existing Python API.
Restore the native loss standalone and remove its parameter namelist reader
and result writers. Python workers pass arrays directly into F2PY; ordinary
standalone persistence and JAX execution remain available.

Fifteen native loss metric arrays match saved results exactly. Native and
CPU JAX repeated loss/tuning workflows, tuner shutdown, the native build,
454 shared checks and four API checks pass. Broader BFB is not established.

* Keep case runners persistent without retaining model state

Run each ordinary request through full initialization, advancement and
cleanup while keeping the process alive for in-memory JIT reuse. Remove
retained-model commands, transport, timing/UI options and extra bindings.
Restore tuning and loss frontends to their existing allocation-reusing APIs.

The native build, 445 shared checks, 121 focused JAX checks and 85 Dash
checks pass. Short native/JAX/Python reused-process stats match fresh
controls exactly; tuning and synchronized timing sweeps pass. Two full
16-column JAX repeats log no new compilations. These comparisons do not
establish blanket BFB.

* Separate microphysics initialization fixes from case runners

Move native default resets to their own branch/PR and keep the runner focused
on shared runtime selection and full-case process reuse. Record the mixed-case
native test's dependency on that fix. Refresh the timing base and master,
and clarify runner, driver and test documentation under the current skills.

The shared checks pass, including output drainage, cancellation, synchronized
warmup/repetition barriers and CLI forwarding. Python AST checks confirm the
remaining audit edits change only documentation. Jenkins validation follows
this published checkpoint.

* Complete case-runner procedure descriptions

Describe the remaining changed CLI, test and profile routines under the current
documentation standards. Executable Python ASTs are unchanged from f66ccf2ff,
the revision running in Jenkins; existing validation still applies.

* Separate JAX timing from case runner changes

Keep runtime selection and process reuse independent so the case runner
can merge into master before JAX timing. Shared runner/CLI/timing
checks pass (445 tests, including provisional coverage).

* Add JAX timing after the case runner

Restore the audited wall-clock summaries and optional execution tracing
on top of the independent case runner. Keep the existing implementation
and review history while reversing the PR merge order.

* Add a JAX profiling option and viewer commands

Enable captures with -jax=profile and print commands after cleanup.
Keep capture export in the timer and viewing in view_profile.py.

181 focused checks pass. CPU BOMEX captures preserve numeric stats;
both viewers were verified in-browser. Large full-Python Perfetto
exports can truncate; XProf retained all five tested timesteps.

* Clarify JAX timing usage and cleanup

Document the timer lifecycle, failure handling and Dash wall-time comparison metric. Executable Python AST is unchanged.
</comment><date>2026-10-18 17:34:12 -0500</date><id>ec5e8070d3173282a6317b067f8673a657a1eb6f</id><msg>Add JAX timing and profiling (#1393)</msg><path><editType>add</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_profile_cli.py</file></path><path><editType>edit</editType><file>clubb_jax/src/clubb_loss_driver.py</file></path><path><editType>add</editType><file>clubb_jax/src/CLUBB_core/code_timer_module.py</file></path><path><editType>edit</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_jax_cli_options.py</file></path><path><editType>edit</editType><file>utilities/README.md</file></path><path><editType>edit</editType><file>clubb_jax/README.md</file></path><path><editType>edit</editType><file>utilities/time_clubb.py</file></path><path><editType>edit</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_device_selection.py</file></path><path><editType>edit</editType><file>clubb_jax/src/advance_clubb_to_end.py</file></path><path><editType>edit</editType><file>clubb_jax/src/clubb_standalone.py</file></path><path><editType>add</editType><file>clubb_jax/view_profile.py</file></path><path><editType>edit</editType><file>clubb_jax/src/clubb_driver_test.py</file></path><path><editType>add</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_code_timer_module.py</file></path><path><editType>edit</editType><file>run_scripts/README.md</file></path><path><editType>edit</editType><file>clubb_jax/run_jax.py</file></path><path><editType>edit</editType><file>clubb_jax/src/clubb_case_initalization.py</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName><id>noreply</id></culprit><inProgress>false</inProgress><previousBuild><action _class='hudson.model.CauseAction'><cause _class='hudson.triggers.SCMTrigger$SCMTriggerCause'><shortDescription>Started by an SCM change</shortDescription></cause></action><action></action><action _class='jenkins.metrics.impl.TimeInQueueAction'><blockedDurationMillis>0</blockedDurationMillis><blockedTimeMillis>0</blockedTimeMillis><buildableDurationMillis>0</buildableDurationMillis><buildableTimeMillis>0</buildableTimeMillis><buildingDurationMillis>171459</buildingDurationMillis><executingTimeMillis>170440</executingTimeMillis><executorUtilization>0.99</executorUtilization><subTaskCount>1</subTaskCount><waitingDurationMillis>6419</waitingDurationMillis><waitingTimeMillis>6419</waitingTimeMillis></action><action _class='org.jenkinsci.plugins.workflow.libs.LibrariesAction'></action><action></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginmaster _class='hudson.plugins.git.util.Build'><buildNumber>598</buildNumber><marked><SHA1>6e48f97c2a96bc78fb498c82f1ed0bb690235349</SHA1><branch><SHA1>6e48f97c2a96bc78fb498c82f1ed0bb690235349</SHA1><name>refs/remotes/origin/master</name></branch></marked><revision><SHA1>6e48f97c2a96bc78fb498c82f1ed0bb690235349</SHA1><branch><SHA1>6e48f97c2a96bc78fb498c82f1ed0bb690235349</SHA1><name>refs/remotes/origin/master</name></branch></revision></refsremotesoriginmaster></buildsByBranchName><lastBuiltRevision><SHA1>6e48f97c2a96bc78fb498c82f1ed0bb690235349</SHA1><branch><SHA1>6e48f97c2a96bc78fb498c82f1ed0bb690235349</SHA1><name>refs/remotes/origin/master</name></branch></lastBuiltRevision><remoteUrl>https://github.com/larson-group/clubb.git</remoteUrl><scmName></scmName></action><action></action><action></action><action></action><action></action><action></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><action _class='org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction'></action><action></action><action _class='org.jenkinsci.plugins.workflow.job.views.FlowGraphAction'></action><action></action><action></action><action></action><building>false</building><displayName>#598</displayName><duration>171459</duration><estimatedDuration>114814</estimatedDuration><fullDisplayName>clubb_BFB_r8029_flags_gfortran_test #598</fullDisplayName><id>598</id><keepLog>false</keepLog><number>598</number><queueId>10907</queueId><result>SUCCESS</result><timestamp>1792312027640</timestamp><url>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_r8029_flags_gfortran_test/598/</url><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_windm_edsclrm_scalar_indices.py</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_xp2_error_diagnostics.py</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_radiation_error_diagnostics.py</affectedPath><affectedPath>clubb_jax/src/CLUBB_core/err_info.py</affectedPath><affectedPath>clubb_jax/src/CLUBB_core/advance_windm_edsclrm_module.py</affectedPath><affectedPath>clubb_jax/pytests/auto_llm_generated_pytests/test_jit_compile.py</affectedPath><affectedPath>clubb_jax/src/CLUBB_core/__init__.py</affectedPath><affectedPath>clubb_jax/src/CLUBB_core/numerical_check.py</affectedPath><affectedPath>clubb_jax/src/advance_clubb_to_end.py</affectedPath><affectedPath>clubb_jax/src/CLUBB_core/advance_xp2_xpyp_module.py</affectedPath><affectedPath>clubb_python_api/JAX_INTEROPERABILITY_PROPOSAL.md</affectedPath><affectedPath>clubb_jax/src/CLUBB_core/err_info_codes.py</affectedPath><affectedPath>clubb_jax/src/Radiation/radiation_module.py</affectedPath><commitId>aa8c2aa4037dda69d686ca97bcbbe1a8208401fd</commitId><timestamp>1792259885000</timestamp><author><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Remove the JAX error-message code registry (#1401)

* Remove the JAX error-message code registry

Print failure details at the runtime checks that detect them. Remove the
extra reason_code field and its setters, decoder, initialization/reset
handling and exports; retain the normal per-column fatal-error status.
Update the scalar-guard assertions and add cached-call diagnostic checks.

Local CPU checks passed for the ErrInfo pytree, diagnostic output, driver
debug gates and state reset/batching behavior (65 cases across five modules).

* Correct the multiple-LHS diagnostic test's wp3 grid

Allocate synthetic wp3 on thermodynamic levels, as required by
calc_wp3_on_wp2, so the test reaches the multiple-LHS guard during tracing.

The 21 selected CPU diagnostic checks pass, covering cached-call output,
per-column fatal status and preservation of fields on the unsupported path.

* Restore the C2 explanation in the multiple-LHS diagnostic

Name C2rt, C2thl and C2rtthl when their unequal values prevent a single-LHS
solve. Keep the direct runtime print and existing fatal-status handling.

The focused CPU cached-call test passes, including the restored explanation,
quiet valid calls and preservation of incoming fields on failure.

* Revert "Restore the C2 explanation in the multiple-LHS diagnostic"

This reverts commit 170a13e2bc7af24e92d8d8bc9de9d9db601921ed.

* List single-LHS requirements in the JAX diagnostic

Print the approved static requirements after the unsupported multiple-LHS
message: explicit turbulent advection or ADG1, plus per-column equivalence
of C2thl and C2rtthl to C2rt within the relative epsilon tolerance.

The focused CPU cached-call test passes, checking the listed requirements,
quiet valid calls and preservation of incoming fields and fatal status.
</comment><date>2026-10-17 12:58:05 -0500</date><id>aa8c2aa4037dda69d686ca97bcbbe1a8208401fd</id><msg>Remove the JAX error-message code registry (#1401)</msg><path><editType>edit</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_jit_compile.py</file></path><path><editType>add</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_xp2_error_diagnostics.py</file></path><path><editType>edit</editType><file>clubb_jax/src/CLUBB_core/numerical_check.py</file></path><path><editType>edit</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_windm_edsclrm_scalar_indices.py</file></path><path><editType>edit</editType><file>clubb_jax/src/CLUBB_core/advance_xp2_xpyp_module.py</file></path><path><editType>edit</editType><file>clubb_jax/src/advance_clubb_to_end.py</file></path><path><editType>add</editType><file>clubb_jax/pytests/auto_llm_generated_pytests/test_radiation_error_diagnostics.py</file></path><path><editType>edit</editType><file>clubb_jax/src/CLUBB_core/err_info.py</file></path><path><editType>edit</editType><file>clubb_jax/src/Radiation/radiation_module.py</file></path><path><editType>edit</editType><file>clubb_python_api/JAX_INTEROPERABILITY_PROPOSAL.md</file></path><path><editType>edit</editType><file>clubb_jax/src/CLUBB_core/__init__.py</file></path><path><editType>delete</editType><file>clubb_jax/src/CLUBB_core/err_info_codes.py</file></path><path><editType>edit</editType><file>clubb_jax/src/CLUBB_core/advance_windm_edsclrm_module.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>.agents/skills/clubb-jax-port/SKILL.md</affectedPath><affectedPath>.agents/skills/clubb-documentation/change-messages/SKILL.md</affectedPath><affectedPath>.agents/skills/clubb-testing-and-reporting/SKILL.md</affectedPath><commitId>6e48f97c2a96bc78fb498c82f1ed0bb690235349</commitId><timestamp>1792260807000</timestamp><author><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>Restrict BIT_CHANGING guidance to Fortran result changes (#1399)

Keep JAX numerical acceptance focused on agreement with the corresponding
Fortran implementation rather than preserving earlier JAX output. Clarify
the reporting rule and link it from the JAX porting workflow.

All 21 skill schemas, 112 local links and 7 heading anchors pass, along with
diff formatting. Only three skill Markdown files change.
</comment><date>2026-10-17 13:13:27 -0500</date><id>6e48f97c2a96bc78fb498c82f1ed0bb690235349</id><msg>Restrict BIT_CHANGING guidance to Fortran result changes (#1399)</msg><path><editType>edit</editType><file>.agents/skills/clubb-documentation/change-messages/SKILL.md</file></path><path><editType>edit</editType><file>.agents/skills/clubb-testing-and-reporting/SKILL.md</file></path><path><editType>edit</editType><file>.agents/skills/clubb-jax-port/SKILL.md</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>http://carson.math.uwm.edu/jenkins/user/noreply</absoluteUrl><fullName>noreply</fullName></culprit><inProgress>false</inProgress><nextBuild><number>599</number><url>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_r8029_flags_gfortran_test/599/</url></nextBuild><previousBuild><number>597</number><url>http://carson.math.uwm.edu/jenkins/job/clubb_BFB_r8029_flags_gfortran_test/597/</url></previousBuild></previousBuild></workflowRun>