Units Are Types.
Let's Treat Them That Way.

Dimensional Analysis as Reliability Infrastructure

SRECon 2026 Emmanuel I. Obi · Software Engineer The Radiativity Company
The problem

You already have a type system for code.
Your configs are untyped.

YAML doesn't know that 30 means seconds. Python doesn't know that 512 means megabytes. Your SLO dashboard doesn't know if 0.999 is a ratio or a percentage.

These aren't edge cases. They're the default failure mode of config-driven infrastructure.

The Config Problem

Timeout Bug
Seconds? Milliseconds?
timeout: 30
30ms timeout → cascading 504s
Memory Limit
MB? MiB? GB?
max_memory: 512
512 bytes → OOM crash loop
Alert Threshold
Ratio? Percent? Nines?
slo_target: 0.999
Compared against percent → pages never fire
Rate Limit
Per second? Per minute?
max_rps: 1000
1000/min not 1000/sec → overload

Anatomy of a Prevented Incident

deploy
New service config: timeout: 30 — but the downstream expects milliseconds
before
Without ucon: int(config["timeout"]) → 30ms timeout → cascading failures → SEV-1
after
With ucon: config.timeout.to(millisecond)<30000 ms> → correct behavior
or
Wrong unit? Pydantic validation rejects it before it ever reaches production
Caught at definition time. Not at 3 AM in a Slack thread.

Pop Quiz: Error Budget Math

Your SLO is 3.5 nines.

A deploy just caused 90 seconds of errors.

What percentage of your weekly error budget did you burn?

ucon says:

99.968%
3.5 nines = uptime
191 sec
Weekly budget
47.1%
Burned by 90s incident
Every SRE does this conversion in their head. Make the computer do it — and verify it.

Dimensional Safety

What works
# Same dimension → converts millisecond = Scale.milli * units.second t1 = units.second(30) t1.to(millisecond) # <30000 ms> # Memory units megabyte = Scale.mega * units.byte gibibyte = Scale.gibi * units.byte m = megabyte(512) m.to(gibibyte) # <0.477 GiB>
What fails — loudly
# Timeout + memory? No. megabyte = Scale.mega * units.byte t = units.second(30) m = megabyte(512) t + m # DimensionMismatch: time + information # Caught instantly. # Not at 3 AM.

Config Validation

from pydantic import BaseModel from ucon import units, Scale, Number, Dimension megabyte = Scale.mega * units.byte class ServiceConfig(BaseModel): timeout: Number[Dimension.time] memory: Number[Dimension.information] slo_target: Number[Dimension.ratio] # ✅ Valid — units are explicit cfg = ServiceConfig( timeout=units.second(30), memory=megabyte(512), slo_target=units.nines(3.5), ) # ❌ Fails — wrong dimension at parse time ServiceConfig(timeout=megabyte(30), ...) # ValidationError: timeout must be time, got information

From Config File to Type Safety

Your configs live in YAML. ucon meets them there.

service.yaml
# Plain YAML — no magic timeout: value: 30 unit: "second" memory: value: 512 unit: "MB" slo_target: value: 3.5 unit: "nines"
Load + validate
import yaml with open("service.yaml") as f: raw = yaml.safe_load(f) # Pydantic parses + validates cfg = ServiceConfig.from_yaml(raw) cfg.timeout # <30 s> cfg.timeout.to(ms) # <30000 ms> cfg.slo_target.to(pct) # <99.968 %>
What happens with a bad config
# Someone puts memory in the timeout field timeout: value: 512 unit: "MB" # ← wrong dimension # ValidationError: timeout must be time, got information # Caught at load time. Before deploy. Before 3 AM.
The problem is getting worse

Half your code is now AI-assisted.
The configs are no exception.

Developers using AI tools
84%
Stack Overflow 2025
Code that is AI-assisted
42%
Sonar State of Code 2025
AI code with potential vulnerabilities
48%
Exceeds AI 2026
Developers who trust AI output
29%
Stack Overflow 2025

AI agents are generating configs, autoscaling parameters, and IaC at scale. They make the same unit mistakes humans do — but faster, more confidently, and without the gut check.

Unit Errors Have a Price Tag

$125M
Mars Climate Orbiter
lb·s vs N·s — one team used metric, the other didn't
NASA/JPL Review Board, 1999 · IEEE Spectrum
1999
$42B
Medication Errors Worldwide
Annual global cost — dose miscalculations, unit confusion, wrong-drug administration
World Health Organization, 2023
annual
???
Your Last SEV-1
Misconfigured timeout, memory limit in the wrong unit, alert that never fired
recently
The cheapest incident is the one that never happens.

Built for Infrastructure, Not Physics Labs

ucon is
  • Injectable graphs — your domains, your units
  • Nines, dB, percent as first-class SRE quantities
  • Pydantic v2 integration for config schemas
  • MCP server for AI agent unit safety — 19 tools
  • Composable algebra: meter / second → velocity
  • Uncertainty propagation built in
Not another Pint
  • No global state — graphs are injectable
  • No flat-file unit definitions
  • Custom units are first-class citizens
  • Graph architecture: N edges, not N² factors
  • AI-native: built for MCP tool use
  • Non-linear maps: log, affine, exp (nines, dB, °C)

Numeric type safety for infrastructure quantities.

Questions?