Tutorials › Pharmacometric Workflows and Reproducible Modeling › Verifying Software and Environment Metadata

Quality Control and Independent Review · Tutorial 320 of 399

Verifying Software and Environment Metadata

Learn to verify the identity, consistency, and limitations of the software and environment records associated with a model run.

Intermediate 12 min read

What You'll Learn

  • Distinguish captured metadata from metadata that has been independently checked.
  • Identify which software, operating-system, library, and configuration details affect interpretation.
  • Cross-check version records against logs, lockfiles, executable details, and environment evidence.
  • Classify findings as matched, discrepant, unavailable, or ambiguous.
  • Recognize why a version label or current workstation description may not identify the run environment.
  • Document metadata findings without treating them as evidence that a run has been reproduced.

Why Metadata Verification Matters

A model run is produced by more than model code and data. The software that interprets the code, the operating system and libraries it uses, and configuration choices such as solver tolerances can affect how a run behaves. If those details are missing or inaccurate, a reviewer may be unable to tell what conditions produced the reported results or how much confidence to place in a description of the analysis.

Metadata verification asks whether records of those conditions are identifiable, internally consistent, and supported by appropriate evidence. It does not establish that the submitted run can be repeated, nor does it determine whether a model is scientifically appropriate. The goal here is narrower: assess what the available records establish about the software and environment associated with the run.

Definition: Software and environment metadata are recorded details that identify the computational context of a run. They can include application and runtime versions, operating-system release and architecture, installed library versions, executable or container identifiers, and configuration settings used by the run. Verification is the process of checking those records against independent or complementary evidence and documenting agreement, discrepancy, ambiguity, or missing evidence.

Three distinctions help keep the review precise. A record is captured if it is present in a file or log. It is verified if it has been checked against evidence that supports the same claim. It is adequate if its specificity is sufficient for the review question. A line saying “software version 2.1” may be captured, but not adequately identify which software it describes, and not be independently verified.

What to Identify and Cross-Check

Begin by defining the run and the scope of the check. Record which submitted analysis, execution, or output set the metadata is supposed to describe. Then identify the computational components that could matter for interpreting that run. A useful review usually checks the following groups:

  • Application and runtime: name and version of the modeling program, scripting language, runtime, or relevant interpreter. Where available, note the executable path, build, and architecture.
  • Operating system: distribution or product, release, kernel or system version, and processor architecture. “Linux” alone, for example, does not identify a particular release or architecture.
  • Libraries and dependencies: relevant package names and versions, including numerical or solver libraries where recorded. A direct package list may not describe transitive or compiled dependencies.
  • Execution configuration: settings that influence how the software operates, such as solver selection, tolerances, thread count, locale, time zone, or random-number seed when applicable.
  • Environment identity: a container image digest, environment lockfile, or other immutable identifier, if one was used and recorded. A human-readable image tag alone may point to different image contents over time.

The right inventory is determined by the claim being reviewed and by the run records available. Not every setting is relevant to every model, and a missing item is not automatically evidence of an incorrect run. It is, however, a limit on what can be verified. Make that distinction explicit rather than silently treating an unrecorded value as a default.

Verification rule: For each metadata claim, record the claim, its source, the evidence used to check it, and the result. A claim is supported only to the extent that the evidence identifies the same run context and the same property. Similar-looking version labels or records from a later workstation session do not, by themselves, verify the environment used for the submitted run.

A concise review table makes these checks auditable. Use stable labels for findings: matched means the checked evidence agrees at the level of detail required; discrepant means relevant evidence conflicts; unavailable means there is no suitable evidence; and ambiguous means the evidence exists but does not resolve the claim. These labels describe the evidence, not the quality of the model.

Metadata claimUseful evidence to compareExample limitation
Modeling application versionRun log, executable version output, archived application recordA version string does not necessarily identify a vendor build or binary
Operating system and architectureRun-time system capture, container specification, host recordA current host description may not describe the historical run
Package versionsLockfile, package inventory, run logA package list may omit compiled libraries or packages outside the recorded environment
Solver or runtime settingsRun log, explicit configuration file, application recordA project default is not proof that the run used that setting
Container or environment identityImmutable digest or archived environment definitionA mutable tag may resolve to different contents at different times

A Defensible Verification Sequence

The review is stronger when it proceeds from the run record outward, rather than starting with the reviewer’s current machine and assuming it represents the submitted execution.

1
Define the claim.
Write down exactly what is asserted, such as “the submitted fit used application version 7.4 on a 64-bit Linux environment.” Separate compound claims so each can be checked.
2
Locate run-linked evidence.
Prefer records generated or archived with the run, such as logs and explicit environment captures. Note which file or record supports each field and whether the link to the submitted run is clear.
3
Compare independent or complementary records.
Check a version report against a log or executable record; compare a dependency list with a lockfile; compare configuration claims with the settings recorded for the execution.
4
Classify and document findings.
Mark each claim matched, discrepant, unavailable, or ambiguous. Preserve the observed values, source locations, and any unresolved limitations.

The justification for this sequence is that metadata claims have both a value and a referent: a version number is meaningful only if it identifies the software used for the run under review. A current system report may accurately describe the reviewer’s computer while providing no evidence about the submitted run. Linking evidence to the execution is therefore a necessary part of checking the claim, not an administrative detail.

Worked Example: Checking Application and Package Versions

Suppose a hypothetical submitted fit is described as having used “ModelFit 5.2 with the standard R libraries.” The archived run log identifies ModelFit 5.2.1 and R 4.3.2. The project lockfile lists R packages nlme 3.1-164 and deSolve 1.40, while a package inventory saved with the run lists nlme 3.1-162 and deSolve 1.40. Determine what the evidence supports.

Application version. The submitted description says 5.2, whereas the run log gives the more specific value 5.2.1. These records are not necessarily contradictory: 5.2 may be a shortened release label. The more precise run-linked record supports reporting ModelFit 5.2.1, but the reviewer should retain the original wording as a less specific claim rather than treating it as exact confirmation of a particular build.

R version. R 4.3.2 is explicitly present in the run log. If the log is clearly tied to this execution, that claim is supported by the available run-linked evidence. It does not establish every detail of how R was built or which compiled libraries it loaded.

Package versions. The two records agree on deSolve 1.40. For nlme, the lockfile says 3.1-164 and the run inventory says 3.1-162. The difference is \(164 - 162 = 2\) in the final version component. That arithmetic describes the label difference; it does not establish whether the versions behave differently for this analysis. The nlme claim is discrepant until the records can be reconciled. Report both observed versions and their sources; do not choose the lockfile value merely because it is more convenient.

Conclusion. The evidence supports reporting the run-log versions, agreement for deSolve, and an unresolved nlme discrepancy. “Standard R libraries” is too vague to verify as a complete dependency description. None of these findings alone establishes that the fit is invalid; they describe what can and cannot be confirmed about its recorded software context.

Configuration Records and Run-Specific Evidence

Configuration is often where a metadata check moves beyond generic software names. A package can have the same version while important run settings differ. Depending on the application and analysis, relevant details may include the numerical solver, absolute and relative tolerances, thread count, optimization controls, random seed, or environment variables. Record a setting only when it is relevant to the claim or needed to interpret the run, and distinguish explicit values from assumed defaults.

A configuration file shows what it specifies; it does not automatically show that the run read that file, that another setting did not override it, or that the file remained unchanged after execution. A log that records effective settings can provide a useful cross-check. If records conflict, preserve the conflict and investigate the relationship between the records rather than inferring which value was active.

Worked Example: Reconciling Solver Settings

In a hypothetical analysis package, the archived project configuration specifies a relative tolerance of \(1 \times 10^{-8}\) and an absolute tolerance of \(1 \times 10^{-10}\). The log associated with the submitted run reports \(1 \times 10^{-6}\) and \(1 \times 10^{-8}\), respectively. A project note says “default tolerances used.”

Compare the recorded values. The relative tolerance in the log is 100 times the configuration value because \((1 \times 10^{-6})/(1 \times 10^{-8}) = 100\). The absolute tolerance in the log is also 100 times the configuration value because \((1 \times 10^{-8})/(1 \times 10^{-10}) = 100\). Both recorded tolerances are therefore less stringent by these numerical comparisons, but that calculation does not quantify any change in model estimates.

Classify the evidence. The configuration and run log disagree, so the effective settings are discrepant. The note about defaults does not resolve the disagreement: it does not state the default values or establish that the defaults were active in the submitted run. The log is run-linked evidence for what the application reported, while the configuration is evidence for what the archived file specified.

Report the limitation. State both pairs of values, identify their sources, and mark the effective configuration as unresolved unless additional run-linked evidence explains the difference. Do not silently edit the project file to match the log or infer that the fit used a particular tolerance solely from a project note.

Operating-System and Environment Identity

Operating-system metadata can refer to different layers. A report of the host operating system, a container’s user-space distribution, and the kernel visible to a process may not be identical descriptions. Architecture matters too: “64-bit” does not specify whether the processor is x86-64 or ARM64. Record the layer and field actually observed rather than compressing them into a single generic label.

Likewise, environment identifiers differ in strength. A named environment or container tag can be useful for locating a setup, but it may be editable or point to changing contents. A lockfile or immutable image digest is usually more specific about the defined environment. Even these records have limits: they may not capture host-level libraries, external services, hardware details, or changes made after the environment was created. State what the identifier covers.

Worked Example: Evaluating an Operating-System Claim

A hypothetical submission states that a fit ran in “Ubuntu 22.04, x86-64.” The archived log records Ubuntu 22.04 and x86-64. A screenshot created six months later reports Ubuntu 24.04 on ARM64. The archived project also names the container tag pk-run:stable, but no image digest is retained.

Separate the records by time and referent. The log supports the stated operating-system release and architecture if it is linked to the submitted run. The later screenshot describes the system at the time the screenshot was made; it does not contradict the historical log unless it is also claimed to document the original execution.

Assess the container record. The tag identifies a name, but without an immutable digest or archived image contents it does not establish exactly which image that tag referred to at run time. Thus the operating-system claim has run-linked support, while the precise container image identity remains unavailable or ambiguous, depending on the remaining records.

Conclusion. Report the distinction: the run log records Ubuntu 22.04 on x86-64; a later screenshot describes a different system; and the mutable tag does not independently fix the image contents. Do not replace the run-linked record with the reviewer’s current environment or claim that the submission has been rerun.

Diagnostics, Alternatives, and Limits

Several patterns should prompt closer review. A log that lacks a run identifier may be difficult to connect to the submitted output. A package inventory dated after the run may describe a later environment. A lockfile that conflicts with the run log may document the intended setup rather than the effective one. A version report without an application name is ambiguous. An assertion that a setting was “default” is weak unless the relevant software version and default value are known and the run record supports that choice.

When evidence is incomplete, an appropriate next step may be to request a contemporaneous log, a more specific environment record, or clarification of how the records were generated. A current system command can describe the current system, but it cannot retroactively establish the historical run environment. Do not fill gaps by assuming common defaults or by treating an unverified screenshot as equivalent to a run-linked record.

The main alternatives differ in what they establish. A version string is simple but may be too broad or unsupported. A package inventory provides more detail but may omit transitive, compiled, or external dependencies. A lockfile records a declared package environment but does not by itself prove the run used it. A container digest can identify an image’s contents more specifically than a tag, but does not capture every host or runtime condition. A run log can link reported settings to execution, but may omit details or contain only software-reported values. These sources complement rather than automatically replace one another.

Metadata verification has important limits. Agreement among records cannot prove that every relevant environmental factor was captured, that the software operated correctly, or that two runs will produce identical outputs. A discrepancy does not by itself show that results are wrong. Its significance depends on which component differs and how it could affect the run; that assessment may require technical investigation beyond checking metadata. Keep the finding proportional to the evidence.

Common Pitfall: Treating a Plausible Record as Proof

Wrong reasoning: “The project lockfile lists the right packages, so those must be the packages used for the submitted fit.” This confuses a declared environment with the environment actually used. The lockfile may have been created or changed after the run, or the execution may have used a different library path.

Correction: Treat the lockfile as evidence of the environment it defines. Compare it with a run-linked inventory or log, check dates and links to the execution, and report any mismatch or missing evidence. A careful conclusion can be “the lockfile specifies these versions, but the available records do not verify that the run used them.”

Key takeaway: Verify each metadata claim against evidence tied to the submitted run, record the specificity and limitations of that evidence, and preserve disagreements rather than resolving them by assumption. A well-documented uncertainty is more informative than an unsupported claim of exactness.

Check Your Understanding

Answer each question, then compare your reasoning with the solutions below.

  1. A run log records application version 3.8.2, while a report says version 3.8. Is this necessarily a contradiction? What should the review record?
  2. A package lockfile and a run-linked inventory agree on 18 of 20 packages. The other two versions differ. Is the environment fully matched? Explain.
  3. A reviewer checks the current operating system of their laptop and finds it differs from the operating system stated in an archived run log. What can and cannot be concluded from this comparison?
  4. A configuration file specifies one solver tolerance, but the run log reports another. What is the appropriate finding and what should not be inferred?
  5. Name one advantage and one limitation of an immutable container digest as environment evidence.

Solutions. (1) Not necessarily: 3.8 may be an abbreviated label for 3.8.2. Record both values and their sources, and use the more specific run-linked value where the link is clear. (2) No. The two discrepancies mean the records do not fully agree; list the matching packages and both observed versions for each mismatch. (3) The laptop report describes the reviewer’s current system, not the historical run. The difference does not by itself contradict a run-linked archived record or establish what system was used. (4) Mark the settings discrepant, report both values and sources, and seek evidence about the effective setting. Do not assume the configuration file was used or that the logged value had no effect. (5) A digest identifies image contents more specifically than a mutable tag; it may still omit host-level conditions or other factors outside the image.

Clinical Biostats