{
  "_class" : "org.jenkinsci.plugins.workflow.job.WorkflowRun",
  "actions" : [
    {
      "_class" : "hudson.model.CauseAction",
      "causes" : [
        {
          "_class" : "hudson.triggers.SCMTrigger$SCMTriggerCause",
          "shortDescription" : "Started by an SCM change"
        }
      ]
    },
    {
      
    },
    {
      "_class" : "jenkins.metrics.impl.TimeInQueueAction",
      "blockedDurationMillis" : 0,
      "blockedTimeMillis" : 0,
      "buildableDurationMillis" : 0,
      "buildableTimeMillis" : 0,
      "buildingDurationMillis" : 966076,
      "executingTimeMillis" : 951374,
      "executorUtilization" : 0.98,
      "subTaskCount" : 1,
      "waitingDurationMillis" : 7178,
      "waitingTimeMillis" : 7178
    },
    {
      "_class" : "org.jenkinsci.plugins.workflow.libs.LibrariesAction"
    },
    {
      
    },
    {
      
    },
    {
      "_class" : "hudson.plugins.git.util.BuildData",
      "buildsByBranchName" : {
        "refs/remotes/origin/master" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 15,
          "buildResult" : None,
          "marked" : {
            "SHA1" : "ec5e8070d3173282a6317b067f8673a657a1eb6f",
            "branch" : [
              {
                "SHA1" : "ec5e8070d3173282a6317b067f8673a657a1eb6f",
                "name" : "refs/remotes/origin/master"
              }
            ]
          },
          "revision" : {
            "SHA1" : "ec5e8070d3173282a6317b067f8673a657a1eb6f",
            "branch" : [
              {
                "SHA1" : "ec5e8070d3173282a6317b067f8673a657a1eb6f",
                "name" : "refs/remotes/origin/master"
              }
            ]
          }
        }
      },
      "lastBuiltRevision" : {
        "SHA1" : "ec5e8070d3173282a6317b067f8673a657a1eb6f",
        "branch" : [
          {
            "SHA1" : "ec5e8070d3173282a6317b067f8673a657a1eb6f",
            "name" : "refs/remotes/origin/master"
          }
        ]
      },
      "remoteUrls" : [
        "https://github.com/larson-group/clubb.git"
      ],
      "scmName" : ""
    },
    {
      
    },
    {
      "_class" : "org.jenkinsci.plugins.workflow.cps.EnvActionImpl"
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      "_class" : "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"
    },
    {
      "_class" : "org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction"
    },
    {
      
    },
    {
      "_class" : "org.jenkinsci.plugins.workflow.job.views.FlowGraphAction"
    },
    {
      
    },
    {
      
    }
  ],
  "artifacts" : [
    
  ],
  "building" : False,
  "description" : None,
  "displayName" : "#15",
  "duration" : 966076,
  "estimatedDuration" : 1965173,
  "executor" : None,
  "fullDisplayName" : "clubb_gpu_vs_cpu_diffness #15",
  "id" : "15",
  "keepLog" : False,
  "number" : 15,
  "queueId" : 11048,
  "result" : "SUCCESS",
  "timestamp" : 1792399088483,
  "url" : "https://carson.math.uwm.edu/jenkins/job/clubb_gpu_vs_cpu_diffness/15/",
  "changeSets" : [
    {
      "_class" : "hudson.plugins.git.GitChangeSetList",
      "items" : [
        {
          "_class" : "hudson.plugins.git.GitChangeSet",
          "affectedPaths" : [
            ".agents/skills/clubb-bit-changing/SKILL.md",
            ".agents/skills/clubb-jax-port/SKILL.md",
            ".agents/skills/clubb-finalization/SKILL.md",
            "AGENTS.md",
            ".agents/skills/clubb-testing-and-reporting/SKILL.md",
            ".agents/skills/clubb-documentation/change-messages/SKILL.md"
          ],
          "commitId" : "ccafe4f166f956eed26b91f7fdacd5600f60f5b2",
          "timestamp" : 1792344464000,
          "author" : {
            "absoluteUrl" : "https://carson.math.uwm.edu/jenkins/user/noreply",
            "fullName" : "noreply"
          },
          "authorEmail" : "noreply@github.com",
          "comment" : "Define when to declare bit-changing commits (#1403)\u000a\u000a* Define conservative bit-change declarations\u000a\u000aCentralize 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.\u000a\u000aRoute 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.\u000a\u000a* Define the optimization level for bitwise preservation\u000a\u000aUse -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.\u000a\u000aThe 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.\u000a",
          "date" : "2026-10-18 12:27:44 -0500",
          "id" : "ccafe4f166f956eed26b91f7fdacd5600f60f5b2",
          "msg" : "Define when to declare bit-changing commits (#1403)",
          "paths" : [
            {
              "editType" : "add",
              "file" : ".agents/skills/clubb-bit-changing/SKILL.md"
            },
            {
              "editType" : "edit",
              "file" : ".agents/skills/clubb-testing-and-reporting/SKILL.md"
            },
            {
              "editType" : "edit",
              "file" : ".agents/skills/clubb-documentation/change-messages/SKILL.md"
            },
            {
              "editType" : "edit",
              "file" : ".agents/skills/clubb-finalization/SKILL.md"
            },
            {
              "editType" : "edit",
              "file" : ".agents/skills/clubb-jax-port/SKILL.md"
            },
            {
              "editType" : "edit",
              "file" : "AGENTS.md"
            }
          ]
        },
        {
          "_class" : "hudson.plugins.git.GitChangeSet",
          "affectedPaths" : [
            "clubb_jax/src/clubb_standalone.py",
            "clubb_jax/pytests/auto_llm_generated_pytests/test_jax_cli_options.py",
            "run_scripts/README.md",
            "utilities/clubb_case_runner.py",
            "utilities/pytests/test_time_clubb.py",
            "tests/run_timestep_sweep.py",
            "clubb_jax/pytests/auto_llm_generated_pytests/test_case_cache_reuse.py",
            "clubb_python_driver/clubb_standalone.py",
            "tests/README.md",
            "src/clubb_standalone.F90",
            "run_scripts/run_scm_loss.py",
            "utilities/time_clubb.py",
            ".agents/skills/clubb-testing-and-reporting/SKILL.md",
            "utilities/create_case_namelist.py",
            "utilities/pytests/test_create_case_namelist.py",
            "tests/run_stats_output_consistency.py",
            "tests/run_jax_vs_fortran_cases.py",
            ".agents/skills/clubb-fortran-port/SKILL.md",
            "clubb_jax/src/clubb_case_initalization.py",
            "tests/case_runner_lifecycle_test.py",
            "utilities/README.md",
            "utilities/pytests/auto_llm_generated_pytests/test_timing_workers.py",
            "clubb_jax/pytests/auto_llm_generated_pytests/test_device_selection.py",
            ".agents/skills/clubb-numerical-diagnosis/SKILL.md",
            "utilities/pytests/auto_llm_generated_pytests/test_loss_cli.py",
            "tests/pytests/auto_llm_generated_pytests/test_scm_jax_driver_test.py",
            "run_scripts/run_scm.py",
            ".agents/skills/clubb-fortran-format/SKILL.md",
            "clubb_jax/src/Microphys/microphys_init_cleanup.py",
            ".agents/skills/clubb-finalization/SKILL.md",
            "AGENTS.md",
            "jenkins_tests/clubb_driver/Jenkinsfile",
            "utilities/timing_profiles.py",
            "clubb_jax/README.md",
            "run_scripts/run_tuner_job.py",
            "utilities/pytests/auto_llm_generated_pytests/test_clubb_case_runner.py",
            "tests/run_restart_test.py",
            "tests/run_loss_output_consistency.py",
            "utilities/pytests/timing_test_inputs.py",
            "clubb_jax/src/CLUBB_core/calc_pressure.py"
          ],
          "commitId" : "4f8368a377989b649fc0ed53c26957e193d21067",
          "timestamp" : 1792350419000,
          "author" : {
            "absoluteUrl" : "https://carson.math.uwm.edu/jenkins/user/noreply",
            "fullName" : "noreply"
          },
          "authorEmail" : "noreply@github.com",
          "comment" : "Add reusable case runners for timing (#1400)\u000a\u000aWe 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`.\u000a\u000a`clubb_case_runner` is a python object that abstracts the backend decisions. The \"flow\" is roughly:\u000a- high level script wants to run a clubb case some how\u000a- generates one or more case namelists (arm.in, bomex.in, etc)\u000a- creates a `clubb_case_runner` by passing it whatever runtime options (-jax/-python/-exe) the user requested\u000a- runs a case by passing this `clubb_case_runner` whatever namelists it wants to run.\u000a\u000aIn 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.\u000a",
          "date" : "2026-10-18 14:06:59 -0500",
          "id" : "4f8368a377989b649fc0ed53c26957e193d21067",
          "msg" : "Add reusable case runners for timing (#1400)",
          "paths" : [
            {
              "editType" : "add",
              "file" : "tests/case_runner_lifecycle_test.py"
            },
            {
              "editType" : "edit",
              "file" : "utilities/create_case_namelist.py"
            },
            {
              "editType" : "edit",
              "file" : "tests/run_loss_output_consistency.py"
            },
            {
              "editType" : "edit",
              "file" : "tests/README.md"
            },
            {
              "editType" : "add",
              "file" : "utilities/clubb_case_runner.py"
            },
            {
              "editType" : "edit",
              "file" : "utilities/timing_profiles.py"
            },
            {
              "editType" : "edit",
              "file" : "run_scripts/run_scm_loss.py"
            },
            {
              "editType" : "edit",
              "file" : ".agents/skills/clubb-numerical-diagnosis/SKILL.md"
            },
            {
              "editType" : "edit",
              "file" : "jenkins_tests/clubb_driver/Jenkinsfile"
            },
            {
              "editType" : "edit",
              "file" : "tests/run_jax_vs_fortran_cases.py"
            },
            {
              "editType" : "edit",
              "file" : ".agents/skills/clubb-fortran-port/SKILL.md"
            },
            {
              "editType" : "edit",
              "file" : "run_scripts/README.md"
            },
            {
              "editType" : "edit",
              "file" : "run_scripts/run_scm.py"
            },
            {
              "editType" : "edit",
              "file" : "clubb_jax/pytests/auto_llm_generated_pytests/test_device_selection.py"
            },
            {
              "editType" : "edit",
              "file" : "run_scripts/run_tuner_job.py"
            },
            {
              "editType" : "edit",
              "file" : "clubb_jax/src/Microphys/microphys_init_cleanup.py"
            },
            {
              "editType" : "add",
              "file" : "utilities/pytests/auto_llm_generated_pytests/test_clubb_case_runner.py"
            },
            {
              "editType" : "edit",
              "file" : "utilities/pytests/auto_llm_generated_pytests/test_loss_cli.py"
            },
            {
              "editType" : "edit",
              "file" : "clubb_python_driver/clubb_standalone.py"
            },
            {
              "editType" : "edit",
              "file" : "tests/run_stats_output_consistency.py"
            },
            {
              "editType" : "edit",
              "file" : "utilities/pytests/test_create_case_namelist.py"
            },
            {
              "editType" : "add",
              "file" : "utilities/pytests/timing_test_inputs.py"
            },
            {
              "editType" : "edit",
              "file" : "utilities/pytests/test_time_clubb.py"
            },
            {
              "editType" : "add",
              "file" : "clubb_jax/pytests/auto_llm_generated_pytests/test_case_cache_reuse.py"
            },
            {
              "editType" : "edit",
              "file" : "utilities/README.md"
            },
            {
              "editType" : "edit",
              "file" : "clubb_jax/src/clubb_standalone.py"
            },
            {
              "editType" : "edit",
              "file" : ".agents/skills/clubb-testing-and-reporting/SKILL.md"
            },
            {
              "editType" : "edit",
              "file" : "clubb_jax/pytests/auto_llm_generated_pytests/test_jax_cli_options.py"
            },
            {
              "editType" : "edit",
              "file" : "src/clubb_standalone.F90"
            },
            {
              "editType" : "edit",
              "file" : "tests/run_timestep_sweep.py"
            },
            {
              "editType" : "edit",
              "file" : "tests/pytests/auto_llm_generated_pytests/test_scm_jax_driver_test.py"
            },
            {
              "editType" : "edit",
              "file" : "clubb_jax/src/CLUBB_core/calc_pressure.py"
            },
            {
              "editType" : "edit",
              "file" : "clubb_jax/src/clubb_case_initalization.py"
            },
            {
              "editType" : "edit",
              "file" : "tests/run_restart_test.py"
            },
            {
              "editType" : "add",
              "file" : "utilities/pytests/auto_llm_generated_pytests/test_timing_workers.py"
            },
            {
              "editType" : "edit",
              "file" : "utilities/time_clubb.py"
            },
            {
              "editType" : "edit",
              "file" : ".agents/skills/clubb-finalization/SKILL.md"
            },
            {
              "editType" : "edit",
              "file" : "AGENTS.md"
            },
            {
              "editType" : "edit",
              "file" : ".agents/skills/clubb-fortran-format/SKILL.md"
            },
            {
              "editType" : "edit",
              "file" : "clubb_jax/README.md"
            }
          ]
        },
        {
          "_class" : "hudson.plugins.git.GitChangeSet",
          "affectedPaths" : [
            "clubb_jax/src/clubb_case_initalization.py",
            "clubb_jax/src/clubb_standalone.py",
            "utilities/README.md",
            "clubb_jax/pytests/auto_llm_generated_pytests/test_jax_cli_options.py",
            "clubb_jax/pytests/auto_llm_generated_pytests/test_device_selection.py",
            "clubb_jax/pytests/auto_llm_generated_pytests/test_code_timer_module.py",
            "clubb_jax/src/clubb_loss_driver.py",
            "run_scripts/README.md",
            "clubb_jax/view_profile.py",
            "clubb_jax/run_jax.py",
            "clubb_jax/pytests/auto_llm_generated_pytests/test_profile_cli.py",
            "clubb_jax/src/CLUBB_core/code_timer_module.py",
            "utilities/time_clubb.py",
            "clubb_jax/src/advance_clubb_to_end.py",
            "clubb_jax/README.md",
            "clubb_jax/src/clubb_driver_test.py"
          ],
          "commitId" : "ec5e8070d3173282a6317b067f8673a657a1eb6f",
          "timestamp" : 1792362852000,
          "author" : {
            "absoluteUrl" : "https://carson.math.uwm.edu/jenkins/user/noreply",
            "fullName" : "noreply"
          },
          "authorEmail" : "noreply@github.com",
          "comment" : "Add JAX timing and profiling (#1393)\u000a\u000a* Add JAX timing and persistent benchmark workers\u000a\u000aWrite Fortran-format CPU timing summaries and optional XProf/Perfetto traces\u000afrom JAX driver phases. Use synchronized persistent workers for full-case\u000awarmups and repetitions across Fortran, Python and JAX. Retain compiled JAX\u000aprograms when initialization settings are unchanged.\u000a\u000aValidation: 243 focused checks and CPU case workflows passed. Repeated\u000afive-step BOMEX/RICO_SILHS numeric outputs matched fresh controls exactly.\u000aThe two-column BOMEX JAX/Fortran comparison passed 1e-7 absolute and percent\u000athresholds. BFB against the parent is not established by these comparisons.\u000aGPU and GPTL execution remain untested.\u000a\u000a* Making jax timer use wall clock time instead of cpu/process time\u000a\u000a* Keep JAX timing separate from reusable runners\u000a\u000aMove process persistence, cache reuse and Python timing adapters to the\u000acase-runner branch. Keep JAX wall-clock summaries, optional deep profiles,\u000adriver instrumentation and the parser change that reads their clock label.\u000a\u000aThe timing-only shared suite and a three-step CPU BOMEX run pass. BFB\u000aagainst master is not established; physics expressions are unchanged.\u000a\u000a* Add reusable case runners for timing and tuning\u000a\u000aShare runtime selection and persistent standalone sessions between SCM,\u000atiming and tuning. Support namelist replacement and empty model reruns,\u000aplus parameter matrices for loss sessions. Synchronize timing cohorts and\u000arecord retained-model initialization separately. Use executable loss\u000aworkers for native tuning instead of requiring F2PY.\u000a\u000aRestore microphysics defaults between cases (BIT_CHANGING for sessions\u000athat previously inherited settings). Short native/CPU JAX sessions match\u000afresh same-backend stats values exactly; broader BFB is not established.\u000aNative build, focused suites and repeated loss/tuner/timing workflows pass.\u000a\u000a* Use F2PY for reusable Fortran loss runs\u000a\u000aRun persistent Fortran loss sessions through the existing Python API.\u000aRestore the native loss standalone and remove its parameter namelist reader\u000aand result writers. Python workers pass arrays directly into F2PY; ordinary\u000astandalone persistence and JAX execution remain available.\u000a\u000aFifteen native loss metric arrays match saved results exactly. Native and\u000aCPU JAX repeated loss/tuning workflows, tuner shutdown, the native build,\u000a454 shared checks and four API checks pass. Broader BFB is not established.\u000a\u000a* Keep case runners persistent without retaining model state\u000a\u000aRun each ordinary request through full initialization, advancement and\u000acleanup while keeping the process alive for in-memory JIT reuse. Remove\u000aretained-model commands, transport, timing/UI options and extra bindings.\u000aRestore tuning and loss frontends to their existing allocation-reusing APIs.\u000a\u000aThe native build, 445 shared checks, 121 focused JAX checks and 85 Dash\u000achecks pass. Short native/JAX/Python reused-process stats match fresh\u000acontrols exactly; tuning and synchronized timing sweeps pass. Two full\u000a16-column JAX repeats log no new compilations. These comparisons do not\u000aestablish blanket BFB.\u000a\u000a* Separate microphysics initialization fixes from case runners\u000a\u000aMove native default resets to their own branch/PR and keep the runner focused\u000aon shared runtime selection and full-case process reuse. Record the mixed-case\u000anative test's dependency on that fix. Refresh the timing base and master,\u000aand clarify runner, driver and test documentation under the current skills.\u000a\u000aThe shared checks pass, including output drainage, cancellation, synchronized\u000awarmup/repetition barriers and CLI forwarding. Python AST checks confirm the\u000aremaining audit edits change only documentation. Jenkins validation follows\u000athis published checkpoint.\u000a\u000a* Complete case-runner procedure descriptions\u000a\u000aDescribe the remaining changed CLI, test and profile routines under the current\u000adocumentation standards. Executable Python ASTs are unchanged from f66ccf2ff,\u000athe revision running in Jenkins; existing validation still applies.\u000a\u000a* Separate JAX timing from case runner changes\u000a\u000aKeep runtime selection and process reuse independent so the case runner\u000acan merge into master before JAX timing. Shared runner/CLI/timing\u000achecks pass (445 tests, including provisional coverage).\u000a\u000a* Add JAX timing after the case runner\u000a\u000aRestore the audited wall-clock summaries and optional execution tracing\u000aon top of the independent case runner. Keep the existing implementation\u000aand review history while reversing the PR merge order.\u000a\u000a* Add a JAX profiling option and viewer commands\u000a\u000aEnable captures with -jax=profile and print commands after cleanup.\u000aKeep capture export in the timer and viewing in view_profile.py.\u000a\u000a181 focused checks pass. CPU BOMEX captures preserve numeric stats;\u000aboth viewers were verified in-browser. Large full-Python Perfetto\u000aexports can truncate; XProf retained all five tested timesteps.\u000a\u000a* Clarify JAX timing usage and cleanup\u000a\u000aDocument the timer lifecycle, failure handling and Dash wall-time comparison metric. Executable Python AST is unchanged.\u000a",
          "date" : "2026-10-18 17:34:12 -0500",
          "id" : "ec5e8070d3173282a6317b067f8673a657a1eb6f",
          "msg" : "Add JAX timing and profiling (#1393)",
          "paths" : [
            {
              "editType" : "edit",
              "file" : "clubb_jax/src/advance_clubb_to_end.py"
            },
            {
              "editType" : "edit",
              "file" : "clubb_jax/src/clubb_standalone.py"
            },
            {
              "editType" : "edit",
              "file" : "utilities/time_clubb.py"
            },
            {
              "editType" : "edit",
              "file" : "clubb_jax/pytests/auto_llm_generated_pytests/test_jax_cli_options.py"
            },
            {
              "editType" : "add",
              "file" : "clubb_jax/pytests/auto_llm_generated_pytests/test_code_timer_module.py"
            },
            {
              "editType" : "edit",
              "file" : "clubb_jax/run_jax.py"
            },
            {
              "editType" : "add",
              "file" : "clubb_jax/view_profile.py"
            },
            {
              "editType" : "edit",
              "file" : "clubb_jax/pytests/auto_llm_generated_pytests/test_device_selection.py"
            },
            {
              "editType" : "edit",
              "file" : "clubb_jax/README.md"
            },
            {
              "editType" : "add",
              "file" : "clubb_jax/pytests/auto_llm_generated_pytests/test_profile_cli.py"
            },
            {
              "editType" : "edit",
              "file" : "clubb_jax/src/clubb_driver_test.py"
            },
            {
              "editType" : "add",
              "file" : "clubb_jax/src/CLUBB_core/code_timer_module.py"
            },
            {
              "editType" : "edit",
              "file" : "run_scripts/README.md"
            },
            {
              "editType" : "edit",
              "file" : "utilities/README.md"
            },
            {
              "editType" : "edit",
              "file" : "clubb_jax/src/clubb_case_initalization.py"
            },
            {
              "editType" : "edit",
              "file" : "clubb_jax/src/clubb_loss_driver.py"
            }
          ]
        }
      ],
      "kind" : "git"
    }
  ],
  "culprits" : [
    {
      "absoluteUrl" : "https://carson.math.uwm.edu/jenkins/user/noreply",
      "fullName" : "noreply"
    }
  ],
  "inProgress" : False,
  "nextBuild" : {
    "number" : 16,
    "url" : "https://carson.math.uwm.edu/jenkins/job/clubb_gpu_vs_cpu_diffness/16/"
  },
  "previousBuild" : {
    "number" : 14,
    "url" : "https://carson.math.uwm.edu/jenkins/job/clubb_gpu_vs_cpu_diffness/14/"
  }
}