K-Dense-AI/scientific-agent-skills

uncertainty-and-units

Track physical units and propagate measurement uncertainty in scientific calculations using pint and uncertainties. Use for unit conversion and dimensional checking, GUM uncertainty budgets, Type A and Type B evaluation, coverage factors and expanded uncertainty, Monte Carlo propagation, significant-figure and plus-minus reporting, error propagation through curve fits, CODATA constants, auditing Python code for stripped units or broken uncertainty propagation, and order-of-magnitude plausibility

91CollectingRuns scripts
See how to use itView GitHub source
npx skills add https://github.com/K-Dense-AI/scientific-agent-skills --skill "skills/uncertainty-and-units"
Automated source guide

Source checked Jul 28, 2026·Refresh due Oct 26, 2026

Reorganized from the pinned upstream SKILL.md

Turn uncertainty-and-units's source instructions into a guide you can follow

According to the pinned SKILL.md from K-Dense-AI/scientific-agent-skills: Track physical units and propagate measurement uncertainty in scientific calculations using pint and uncertainties. Use for unit conversion and dimensional checking, GUM uncertainty budgets, Type A and Type B evaluation, coverage factors and expanded uncertainty, Monte Carlo propagation, significant-figure and plus-minus reporting, error propagation through…

npx skills add https://github.com/K-Dense-AI/scientific-agent-skills --skill "skills/uncertainty-and-units"
Check the pinned source

Best fit

  • Track physical units and propagate measurement uncertainty in scientific calculations using pint and uncertainties. Use for unit conversion and dimensional checking, GUM uncertainty budgets, Type A and Type B evaluation, coverage factors and expanded uncertainty, Monte Carlo propagation, significant-figure and plus-minus reporting, error propagation through curve fits, CODATA constants, auditing Python code for stripped units or broken uncertainty propagation, and order-of-magnitude plausibility

Bring this context

  • A concrete task that matches the documented purpose of uncertainty-and-units.
  • The files, examples, or context the task depends on.
  • Your constraints, target environment, and definition of done.

Expected outputs

  • A result that follows the pinned uncertainty-and-units instructions.
  • A concise record of assumptions, inputs used, and unresolved questions.
  • A final check against the source workflow and relevant permission signals.

Key source sections

Read uncertainty-and-units through these 5 source sections

Sections are extracted automatically from the pinned SKILL.md and link back to the source.

01

Non-negotiable workflow

1. Attach units at input and strip them only at output. Convert at function boundaries with ureg.wraps or mas("unit"), never mid-calculation. 2. Write the measurement model explicitly before computing anything, including corrections whose estimated value is zero. A correction le…

SKILL.md · Non-negotiable workflow
Attach units at input and strip them only at output. Convert at functionWrite the measurement model explicitly before computing anything, includingGive every input four things: an estimate, a standard uncertainty, the
02

Scope

Use this skill whenever a calculation carries physical units or a reported number needs an uncertainty. Concretely:

SKILL.md · Scope
converting between units, including conversions that need a physical contextpropagating uncertainty through a measurement model, with or without correlated inputs;building a GUM uncertainty budget from calibration certificates, specifications, and
03

Current release and installation

pint-pandas and pint-xarray add unit-aware columns and arrays and are separate installs.

SKILL.md · Current release and installation
pint 0.25.3, released 2026-03-19; requires Python 3.11+.uncertainties 3.2.3, released 2025-04-21; requires Python 3.8+.NumPy 2.5.1 and SciPy 1.18.0; both require Python 3.12+.
04

The failures this skill exists to prevent

Each of the following runs without error and produces a plausible number.

SKILL.md · The failures this skill exists to prevent
Each of the following runs without error and produces a plausible number..magnitude returns whatever the quantity happened to be carrying. Name the unit at the point of extraction, every time.Celsius and Fahrenheit are interval scales. An uncertainty on a temperature is always a difference and belongs in a delta unit: converting 20 ± 0.5 degC to Fahrenheit gives 68 degF ± 0.9 deltadegF, two different convers…
05

A unit stripped at an unknown scale

.magnitude returns whatever the quantity happened to be carrying. Name the unit at the point of extraction, every time.

SKILL.md · A unit stripped at an unknown scale
.magnitude returns whatever the quantity happened to be carrying. Name the unit at the point of extraction, every time.

SkillSignal prompt templates

Provide the task, context, and acceptance criteria

These prompts were written by SkillSignal from the source structure; they are not upstream text.

Task-start prompt

Confirm source fit, inputs, and outputs before acting.

Use uncertainty-and-units to help me with: [specific task]. Context: [files, data, or background]. Constraints: [environment, scope, and prohibited actions]. Before acting, check the pinned SKILL.md and explain which sections apply, what inputs are still missing, and what you will deliver.

Source-guided execution

Make the Agent explicitly follow the key extracted sections.

Apply the pinned uncertainty-and-units source to [task]. Pay particular attention to these source sections: “Non-negotiable workflow”, “Scope”, “Current release and installation”, “The failures this skill exists to prevent”, “A unit stripped at an unknown scale”. Preserve the important decision at each step. Mark facts not covered by the source as “needs confirmation” instead of inventing them. Then verify the result against my acceptance criteria: [criteria].

Result-review prompt

Check omissions, permissions, and source drift before delivery.

Review the current uncertainty-and-units result: (1) does it satisfy the original task; (2) were any applicable steps or limits in the pinned SKILL.md missed; (3) did it perform any unauthorized file, command, network, or data action; and (4) which conclusions remain unverified? List issues first, then fix only what the source or user authorization supports.

Output checklist

Verify each item before delivery

The task matches the purpose documented in the SKILL.md.

The source section “Non-negotiable workflow” has been checked.

The source section “Scope” has been checked.

The source section “Current release and installation” has been checked.

The source section “The failures this skill exists to prevent” has been checked.

Inputs, constraints, and acceptance criteria are explicit.

Unverified facts, compatibility, and outcome claims are clearly marked.

Any file, command, network, or data action has been reviewed.

Choose a different workflow

When another Skill is the better fit

FAQ

What does uncertainty-and-units do?

Track physical units and propagate measurement uncertainty in scientific calculations using pint and uncertainties. Use for unit conversion and dimensional checking, GUM uncertainty budgets, Type A and Type B evaluation, coverage factors and expanded uncertainty, Monte Carlo propagation, significant-figure and plus-minus reporting, error propagation through…

How do I start using uncertainty-and-units?

The catalog detected this source-specific install command: npx skills add https://github.com/K-Dense-AI/scientific-agent-skills --skill "skills/uncertainty-and-units". Inspect the command and pinned source before running it.

Which Agent platforms does it declare?

No dedicated Agent platform is declared in the pinned source record.

Repository stars
31,966
Repository forks
3,175
Quality
91/100
Source repository last pushed

Quality breakdown

Based on traceable docs and repository signals; stars are not treated as quality.

91/100
Documentation30/30
Specificity18/25
Maintenance20/20
Trust signals23/25

Compare before choosing

Related Agent Skills and source variants

These links are selected from shared tasks, functions, stacks, platforms, and same-name variants. Compare the source owner, documentation, permissions, and maintenance signals.

simpy by k-dense-ai

Build, inspect, test, and analyze bounded process-based discrete-event simulations with SimPy, including events, resources, interrupts, monitoring, replications, warm-up, and reproducible output analysis.

flowstudio-power-automate-build by github

Build, scaffold, and deploy Power Automate cloud flows using the FlowStudio MCP server. Your agent constructs flow definitions, wires connections, deploys, and tests — all via MCP without opening the portal. Load this skill when asked to: create a flow, build a new flow, deploy a flow definition, scaffold a Power Automate workflow, construct a flow JSON, update an existing flow's actions, patch a flow definition, add actions to a flow, wire up connections, or generate a workflow definition from

matchms by k-dense-ai

Process, clean, compare, and search tandem mass spectra with matchms. Use for MS/MS file I/O, metadata harmonization, peak filtering, spectral similarity, library matching, score matrices, and molecular-similarity networks. Use pyopenms instead for LC-MS feature detection or proteomics pipelines.

deployment-patterns by affaan-m

Deployment workflows, CI/CD pipeline patterns, Docker containerization, health checks, rollback strategies, and production readiness checklists for web applications. Use when setting up deployment infrastructure or planning releases.

pathml by k-dense-ai

Use PathML for local, research-only computational pathology workflows: load and tile slides, build preprocessing and QC pipelines, manage h5path data, quantify multiplex images, construct spatial graphs, and plan bounded model inference.

View original Skill.mdThis page is parsed directly from the repository SKILL.md without editorial rewriting. Collected: Jul 28, 2026 · about 10 min

Uncertainty and units

Scope

Use this skill whenever a calculation carries physical units or a reported number needs an uncertainty. Concretely:

  • converting between units, including conversions that need a physical context (wavelength to photon energy, mass to amount of substance, energy to temperature);
  • propagating uncertainty through a measurement model, with or without correlated inputs;
  • building a GUM uncertainty budget from calibration certificates, specifications, and repeatability data;
  • choosing a coverage factor and deciding whether k = 2 is defensible;
  • rounding and writing a result so a reader knows what the ± means;
  • extracting parameter uncertainties from a curve fit without discarding correlations;
  • reviewing existing analysis code for silent unit and uncertainty defects;
  • checking that a dimensionally consistent answer is also physically possible — the order of magnitude, the dimensionless group, and the regime it implies.

This skill covers the metrology and the two libraries that implement it. It does not cover statistical inference, model selection, or study design — see statistical-analysis, statistical-power, and experimental-design.

Current release and installation

Verified 2026-07-26:

  • pint 0.25.3, released 2026-03-19; requires Python 3.11+.
  • uncertainties 3.2.3, released 2025-04-21; requires Python 3.8+.
  • NumPy 2.5.1 and SciPy 1.18.0; both require Python 3.12+.
  • scipy.constants in SciPy 1.18.0 serves CODATA 2022. SciPy 1.11 and earlier served CODATA 2018, and several recommended values differ between them.
uv venv --python 3.13
source .venv/bin/activate
uv pip install "pint==0.25.3" "uncertainties==3.2.3" "numpy==2.5.1" "scipy==1.18.0"

pint-pandas and pint-xarray add unit-aware columns and arrays and are separate installs.

Non-negotiable workflow

  1. Attach units at input and strip them only at output. Convert at function boundaries with ureg.wraps or m_as("unit"), never mid-calculation.
  2. Write the measurement model explicitly before computing anything, including corrections whose estimated value is zero. A correction left out of the model leaves its uncertainty out of the budget.
  3. Give every input four things: an estimate, a standard uncertainty, the distribution the uncertainty came from, and its degrees of freedom.
  4. Convert Type B statements with the right divisor. A certificate's expanded uncertainty divides by its stated k; rectangular limits divide by sqrt(3).
  5. Identify correlations before combining. Inputs calibrated against the same standard, measured on the same instrument, or drawn from the same fit are correlated.
  6. Compute sensitivity coefficients, and read the budget from c_i * u(x_i) rather than from the raw uncertainties.
  7. Check the linearization. Run Monte Carlo alongside the GUM framework and apply the JCGM 101 clause 8 comparison. Report the Monte Carlo result when it fails.
  8. Choose k from the effective degrees of freedom, not by habit.
  9. Round the uncertainty first, then the value to the same decimal place.
  10. State what the ± is — standard or expanded, with k, the coverage probability, and the method.
  11. Sanity-check the magnitude before reporting. A dimensionally consistent result can still be impossible. Compare it against a known scale or a dimensionless group, and confirm every assumption you relied on still holds in that regime.

The failures this skill exists to prevent

Each of the following runs without error and produces a plausible number.

A unit stripped at an unknown scale

length = (12.7 * ureg.mm).magnitude          # 12.7 -- of what?
length = (12.7 * ureg.mm).m_as("m")          # 0.0127 metres, stated

.magnitude returns whatever the quantity happened to be carrying. Name the unit at the point of extraction, every time.

Offset temperature arithmetic

Q(20, "degC") + Q(5, "degC")     # OffsetUnitCalculusError -- correctly refused
Q(20, "degC") + Q(5, "delta_degC")   # 25 degree_Celsius
Q(25, "degC") - Q(20, "degC")        # 5 delta_degree_Celsius

Celsius and Fahrenheit are interval scales. An uncertainty on a temperature is always a difference and belongs in a delta_ unit: converting 20 ± 0.5 degC to Fahrenheit gives 68 degF ± 0.9 delta_degF, two different conversions on one line.

Logarithmic units that add by multiplying

Q(10, "dBm") + Q(10, "dBm")   # 0.0001 kilogram**2 * meter**4 / second**6

That is 10 mW × 10 mW, not 20 mW and not 13 dBm. Nothing raises. Convert to a linear unit before any arithmetic.

A correlation destroyed by a round trip

x = ufloat(1.0, 0.1)
x - x                                     # 0.0+/-0
x - ufloat(x.nominal_value, x.std_dev)    # 0.00+/-0.14

Rebuilding a variable from its nominal value and standard deviation creates an independent variable. So does any serialization that passes through a pair of floats. Use correlated_values(values, covariance_matrix) to rebuild a correlated set.

A covariance matrix silently rescaled

popt, pcov = curve_fit(f, x, y, sigma=sigma)                        # default
popt, pcov = curve_fit(f, x, y, sigma=sigma, absolute_sigma=True)

The default rescales pcov by the reduced chi-square, so the parameter uncertainties absorb the goodness of fit and match what you would get by passing no sigma at all. On one synthetic straight-line fit the two give [0.0364, 0.2154] and [0.0477, 0.2820] — a 31% difference. Pass absolute_sigma=True whenever sigma holds real standard uncertainties.

A linearization that was never checked

For y = x² with x = 1.0 ± 0.5, the GUM framework gives y = 1.0, u_c = 1.0, and a 95% interval of [-0.96, 2.96] — mostly negative, for a squared quantity. Monte Carlo gives a mean of 1.25, u_c = 1.06, and a shortest 95% interval of [0, 3.32]. Nothing in a linear-propagation library will tell you this happened.

Bundled local CLIs

All helpers run offline, reject URLs and symlinks, bound their inputs, write output atomically with private permissions, and refuse to overwrite without --force.

python skills/uncertainty-and-units/scripts/propagate_uncertainty.py --help
python skills/uncertainty-and-units/scripts/uncertainty_budget.py --help
python skills/uncertainty-and-units/scripts/format_result.py --help
python skills/uncertainty-and-units/scripts/convert_units.py --help
python skills/uncertainty-and-units/scripts/audit_units.py --help
python skills/uncertainty-and-units/scripts/check_plausibility.py --help

propagate_uncertainty.py

Runs both propagation methods on the same model and applies the JCGM 101 clause 8 validation test.

python skills/uncertainty-and-units/scripts/propagate_uncertainty.py \
  --expression "m / (pi * (d / 2) ** 2 * h)" \
  --variable "m=250.0,0.05" \
  --variable "d=20.0,0.02,rectangular" \
  --variable "h=40.0,0.05,rectangular" \
  --measurand density --unit "g/cm3" --format markdown

Each --variable is name=value,standard_uncertainty[,distribution[,dof]], where the distribution is normal, rectangular, triangular, arcsine, or exact and controls Monte Carlo sampling only. Correlations go in as --correlation "a,b=0.9". A JSON --spec file holds the same model for anything long-lived.

The expression is parsed into an abstract syntax tree and reduced by an explicit walk over + - * / ** and a fixed list of functions. It is never compiled or executed.

The report gives the estimate, u_c, sensitivity coefficients, the budget in percent, effective degrees of freedom, k, U, both Monte Carlo coverage intervals, and the verdict on whether the linearized result may be reported.

uncertainty_budget.py

Combines components stated the way certificates and data sheets state them.

python skills/uncertainty-and-units/scripts/uncertainty_budget.py --template > budget.json
python skills/uncertainty-and-units/scripts/uncertainty_budget.py --spec budget.json --format markdown

Each component names a distribution that fixes its divisor — expanded divides by its coverage_factor, rectangular by sqrt(3), triangular by sqrt(6), arcsine by sqrt(2), normal by 1 — with an optional sensitivity, dof, and relative: true. The tool computes u_c, the Welch-Satterthwaite effective degrees of freedom, k from the t-distribution, and U, and warns when a Type A component has no degrees of freedom, when nu_eff is small enough that k = 2 is wrong, when one component dominates, and when a Type B component declared normal is probably an undivided expanded uncertainty.

format_result.py

python skills/uncertainty-and-units/scripts/format_result.py \
  --value 12.34567 --uncertainty 0.02345 --unit mm \
  --coverage-factor 2.26 --coverage-probability 0.95

Returns 12.346 ± 0.023 mm, 12.346(23) mm, the scientific and LaTeX forms, and the sentence that has to accompany the number. Warns when one significant digit is requested for an uncertainty beginning in 1 or 2, and when the uncertainty exceeds the estimate.

convert_units.py

python skills/uncertainty-and-units/scripts/convert_units.py \
  --value 532 --unit nm --to eV --context spectroscopy --uncertainty 0.5

python skills/uncertainty-and-units/scripts/convert_units.py \
  --value 1.0 --unit g --to mol --context chemistry --context-parameter "mw=180.156 g/mol"

Carries the uncertainty through the conversion's local derivative, which matters because context conversions are reciprocal rather than proportional. Names the context in the error message when a conversion needs one, and flags offset and logarithmic units. --list-contexts shows what the registry defines.

audit_units.py

Static review of existing analysis code. Parses, never imports or runs.

python skills/uncertainty-and-units/scripts/audit_units.py \
  --input analysis.py --format markdown --fail-on medium
RuleSeverityDetects
UNIT001mediuma second UnitRegistry in one module — cross-registry ValueError
UNIT002mediumoffset temperature units with no delta_ unit anywhere
UNIT003high.magnitude without a preceding .to(...) or .m_as(...)
UNIT004mediumlogarithmic units, whose + multiplies
UNC001highcurve_fit without absolute_sigma
UNC002mediumnp.std / np.var without ddof
UNC003mediummath or numpy functions in a module that uses uncertainties
UNC004higha ufloat rebuilt from .nominal_value and .std_dev
CONST001lowa literal within 0.1% of a CODATA constant

Exit status is 1 when a finding meets --fail-on (default high), which makes it usable as a pre-commit or CI check.

The rules are heuristics, so a false positive is suppressed with a directive comment — trailing to cover its own line, or alone on a line to cover the next one:

value = quantity.magnitude  # audit-units: ignore UNIT003 -- already converted upstream

# audit-units: ignore UNC003 -- the argument here is a plain float array
scaled = np.log10(counts)

# audit-units: ignore-file CONST001 covers a whole module, and naming no rule suppresses all of them. Suppressions are counted in the report rather than hidden, so a file that silences everything still says so.

check_plausibility.py

Dimensional consistency is not physical possibility. A cell 2 m across and a Reynolds number of 4e7 in a capillary both pass every unit check. This tool tests a set of quantities against dimensionless groups, characteristic scales, and curated magnitude bands, and verifies each formula's dimensionality before reporting a number.

python skills/uncertainty-and-units/scripts/check_plausibility.py \
  --quantity "density=1060 kg/m**3" --quantity "velocity=0.5 mm/s" \
  --quantity "length=8 um" --quantity "viscosity=3.5 mPa*s" \
  --group reynolds --format markdown
# Re = 0.001211 -- laminar (circular pipe, length = diameter)

python skills/uncertainty-and-units/scripts/check_plausibility.py \
  --quantity "diameter=2 m" --band "eukaryotic_cell_diameter=diameter"
# implausible: 4.3 decades outside the 5-100 um range

--group evaluates one of 14 dimensionless groups and names the regime it places the system in; --scale computes a characteristic scale such as a diffusion time, Debye length, or Stokes settling velocity; --band compares a supplied quantity against an observed range. --list prints the whole catalogue with the inputs each formula needs.

Physical constants (k_B, N_A, R_gas, g_earth, and the rest) are available to every formula without being supplied, and are read from scipy.constants at run time rather than written as literals, so they track the CODATA release SciPy ships.

The dimensionality check is the point. Passing a kinematic viscosity where the formula needs a dynamic one — both called "viscosity", both tabulated for water, differing by a factor of ρ — is refused before any number is computed:

error: viscosity must have dimensionality [mass] / ([length] * [time]),
       but m²/s is [length] ** 2 / [time]

Exit status is 1 when the verdict meets --fail-on (default implausible; a value within one decade of a band is questionable). The thresholds are conventions with soft edges and assume the geometry their correlation was fitted for — see references/plausibility-scales.md for the characteristic length to use in each case.

Choosing a propagation method

SituationMethod
Linear or near-linear model, normal-ish inputs, large dofGUM framework alone
Any nonlinearity across ±2u of an inputrun both, apply the clause 8 test
Relative uncertainty above ~20% on any inputMonte Carlo
Dominant rectangular or otherwise non-normal componentMonte Carlo
Output bounded below (variance, concentration, squared quantity)Monte Carlo
Asymmetric output distributionMonte Carlo, shortest coverage interval
Correlated inputseither, but supply the covariance matrix, not the standard uncertainties alone

A model dominated by rectangular contributions fails the clause 8 test even when it is perfectly linear: the framework's k = 1.96 over-covers a nearly trapezoidal output. The estimate and u_c are still right; only the interval is too wide.

Constants

Never type a constant from memory. The 2019 SI redefinition fixed c, h, e, k, and N_A exactly, so their relative standard uncertainty is zero; everything else is a measured value that moves between CODATA releases.

import scipy.constants as constants

constants.value("electron mass")        # 9.1093837139e-31
constants.unit("electron mass")         # kg
constants.precision("electron mass")    # 3.07e-10, relative standard uncertainty
constants.precision("Planck constant")  # 0.0, exact by definition

precision returns a relative standard uncertainty; multiply by the value for the absolute one.

Reference files

  • references/gum-methodology.md — Type A and Type B evaluation, distribution divisors, the law of propagation, Welch-Satterthwaite, when the framework fails, the Monte Carlo procedure, and the clause 8 validation test.
  • references/pint-recipes.md — registries, offset and logarithmic units, contexts, boundary enforcement with wraps and check, NumPy interoperability, custom units, formatting.
  • references/uncertainties-recipes.md — variable identity and correlation, correlated_values, umath and unumpy, format specs, fit covariance matrices, and the package's limits.
  • references/domain-conversions.md — the energy ladder, spectroscopy, concentration, pressure, radiation and magnetism, mass spectrometry, logarithmic quantities, and the pairs that share dimensions without sharing meaning.
  • references/reporting-rules.md — rounding, notations, the sentence that must accompany a result, SD versus SEM versus CI in figures, non-detects, and conformity decision rules.
  • references/plausibility-scales.md — choosing the characteristic length, the dimensionless groups and the modelling assumption each one gates, characteristic scales, the observed magnitude bands and their sources, and the caveats on every threshold.

Dated sources

Checked 2026-07-26:

Skill path
skills/uncertainty-and-units/SKILL.md
Commit SHA
e7ac42510774
Repository license
MIT
Data collected