Skip to main content

cloudsealed-jit

Detects structural waste in cloud billing exports.

Given a billing export from AWS, GCP or Azure, it models what each day should have cost, reports the days that did not match, and turns the excess into a monthly figure. It is a library, a CLI and an HTTP service.

License: MIT Python


The problem

Cloud cost anomaly detection is usually done by comparing each day against the period average and flagging anything beyond two or three standard deviations. On billing data that method fails in two specific ways.

Standard deviation is inflated by the very spikes you are looking for. A handful of large anomalies raises σ enough to pull themselves back inside the threshold, and to hide every smaller anomaly with them. This is the masking effect, and it gets worse as the anomalies get bigger.

A flat average ignores the weekly cycle. Most cloud bills have a pronounced weekday/weekend shape. Measured against a flat mean, ordinary Mondays look like overspend and ordinary Sundays look like savings.

The method

Baseline. Expected spend for a day is a level term times a weekday term:

expected[i] = rolling_median(cost, 7)[i] × dow_factor[weekday(i)]

The rolling median follows growth and step changes without being dragged by spikes. The weekday factor is the median ratio of observed spend to the level term for that weekday. It is only estimated with at least two full weeks of data; below that every factor is 1.0.

Scoring. Residuals are scored with a modified z-score built on the median absolute deviation:

z = 0.6745 × (x − baseline) / MAD

The 0.6745 constant makes MAD a consistent estimator of σ for normal data, so the score keeps the familiar "number of deviations" reading while tolerating contamination in roughly half the sample. Days at or above |z| = 3.5 are reported — the threshold recommended by Iglewicz & Hoaglin (1993).

Waste. Only positive excess counts. Waste percentage is the share of total spend sitting above the baseline on anomalous days, which converts directly to currency instead of being a count of unusual days.

Recommendations. Each carries a figure derived from the series itself, normalised to 30 days, and states its assumption in the description. Estimates that depend on facts the analyser cannot observe — whether a workload is production, whether a commitment is acceptable — are labelled conditional rather than presented as findings.

Does it actually work better?

Yes, and it is measured, not asserted. benchmarks/masking_benchmark.py builds synthetic bills whose anomalies are known by construction and scores this method against the textbook mean+standard-deviation approach:

scenario textbook F1 this method F1
masking (scale estimator) 0.667 0.923
seasonality (baseline) 0.667 1.000
end-to-end 0.667 1.000

Full derivation and reproduction steps in METHODOLOGY.md; the design of the codebase is in architecture.md. The benchmark runs in CI (--check) and fails the build if the advantage ever regresses.

Install

pip install cloudsealed-jit              # library + CLI
pip install "cloudsealed-jit[jit]"       # + numba-compiled kernels
pip install "cloudsealed-jit[jit,api]"   # + HTTP service

numba is optional. Without it the kernels run on pure NumPy and the results are identical; only large inputs get slower.

Use

CLI

cloudsealed-jit billing-export.csv
cloudsealed-jit billing-export.csv --json > findings.json
cat export.csv | cloudsealed-jit - --type cost-forecast

Library

from cloudsealed_jit import parse_billing_csv, analyze

series = parse_billing_csv(open("export.csv").read())
result = analyze(series)

print(result.metrics.wastePercentage)
for r in result.recommendations:
    print(r.title, r.potentialSavings)

HTTP service

docker run -p 8091:8091 cloudsealed/jit-optimization-engine
GET  /health
POST /v1/analyze-billing
curl -X POST localhost:8091/v1/analyze-billing \
  -H 'Content-Type: application/json' \
  -d '{"companyName":"Acme","csvContent":"date,cost\n2026-01-01,100\n..."}'

Set JIT_OPTIMIZATION_API_KEY to require an X-Api-Key header. Set JIT_MAX_CSV_BYTES to change the 64 MB upload ceiling.

Response shape:

{
  "anomalies": [
    { "date": "2026-01-31", "expectedCost": 99.0, "actualCost": 500.0,
      "deviation": 405.05, "zScore": 7.82, "severity": "CRITICAL",
      "description": "Spend above the day-of-week baseline by USD 401.00 (405.1%)." }
  ],
  "metrics": {
    "averageDailyCost": 106.32,
    "stdDeviation": 51.69,
    "sharpeRatio": 2.06,       // spend stability: mean / stddev of daily cost
    "wastePercentage": 6.29    // share of total spend above the baseline
  },
  "recommendations": [
    { "title": "...", "description": "...", "potentialSavings": 200.5, "effort": "MEDIUM" }
  ],
  "summary": "..."
}

sharpeRatio is a spend stability ratio — mean daily cost divided by its standard deviation, the reciprocal of the coefficient of variation. Higher means more predictable spend. It is named for the field in the consuming API contract; it is not a risk-adjusted return.

Supported exports

Provider Date column Cost column
AWS Cost and Usage Report lineItem/UsageStartDate lineItem/UnblendedCost
GCP billing export usage_start_time cost
Azure cost export Date, UsageDateTime Cost, CostInBillingCurrency
Generic heuristic heuristic

Line items are aggregated to calendar days. Days with no line items are inserted as zero-spend days rather than skipped. Rows that cannot be parsed are counted and reported in the summary rather than dropped silently.

Development

pip install -e ".[jit,api,dev]"
pytest

The test suite builds synthetic exports whose correct answer is known in advance — a known spike at a known date, a known weekend-idle service, a stable series that must produce no findings — so the assertions test behaviour rather than the current output.

License

MIT. See LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cloudsealed_jit-0.2.0.tar.gz (23.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cloudsealed_jit-0.2.0-py3-none-any.whl (20.4 kB view details)

Uploaded Python 3

File details

Details for the file cloudsealed_jit-0.2.0.tar.gz.

File metadata

  • Download URL: cloudsealed_jit-0.2.0.tar.gz
  • Upload date:
  • Size: 23.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.4

File hashes

Hashes for cloudsealed_jit-0.2.0.tar.gz
Algorithm Hash digest
SHA256 d187a5879662010a70faeb569b04a47ba562c144bd454fc094d64249e26257ce
MD5 3af1ef482538dcea74b217147ecc517a
BLAKE2b-256 187b53da5532ddb59c28afc593ef2e125649e7528b895e0826e72430bbc69785

See more details on using hashes here.

File details

Details for the file cloudsealed_jit-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for cloudsealed_jit-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6dfb182f8070e23634a9c7498a424e31bdd3387fd4dc8747dc7fa50f058337af
MD5 58598d1ec0db82aee5e068bffc0c244b
BLAKE2b-256 0ab719cae0f3e472707f05d9db948af22723c97c73f3aa9729503face2c046c9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page