Open sourcePy 3.12+offline-first

Your tests lie about upgrades.
PyMolt doesn't.

A dependency bump that passes CI can still take down production. PyMolt watches how your code actually behaves under both versions and hands you the diff — with receipts — before you merge. Then Axiom Graph writes the fix.

$curl -fsSL https://pymolt.zeelex.me/install.sh | sh
or uv tool install pymoltisolated tool, no system Python needed
Free & open-source CLIZero setup requiredWorks offline
~/projects/analytics-api — zsh
$pymolt contract report .
Rich CLI
Boundary Diff ReportBEHAVIOR_CHANGED
Clean boundary upgrade: NO
disappeared=0 | result_changed=2 | raise_changed=0 | needs_action=1
── BREAKING — result_changed (2) ───────────────────────────
pandas.DataFrame.sumsrc/stats.py:42
numeric_only default flipped (False → True)
pandas.DataFrame.masksrc/models.py:88
Copy-on-Write enabled (no in-place mutation)
verdict: 2 changed → BEHAVIOR_CHANGED (review needed)
Why upgrades hurt

A Python migration is a research project you can't estimate.

The hard part was never changing the version string — it's everything the version bump hides. Here is why standard CI and generic refactoring tools fail:

Problem Failure Mode

Tests pass in CI. Production silently breaks.

Unit test assertions check execution paths, not runtime edge cases. When pandas 2 flipped defaults or adopted Copy-on-Write, existing tests stayed green while prod calculations corrupted data.

Code Execution SymptomCI Passed / Prod Broke
df.sum() # pandas 1.x: silently drops text cols
df.sum() # pandas 2.x: raises TypeError or returns NaN
Impact
Data corruption & TypeErrors in production
Why CI misses it
Linters can't see implicit library defaults or runtime value types.
PyMolt surfaces this before code touching git.See real ledger diff

PyMolt replaces guesswork with empirical runtime facts — every issue tagged with provenance, confidence level, and golden contract diffs.

The funnel →
How It Works

Three steps. One migration.

Understanding comes before automation. Map risk, diff runtime behavior, and apply verified AST rewrites.

CLI, single engineevery command exports --json for CI/CD & AI agents
  1. 01

    1. Map & Risk

    free / offline

    Discovers all Python surfaces, runtime version divergence, and scores CVE & dependency upgrade risk in one offline pass.

    $ pymolt scan . && pymolt assess --risk
    3.8 → 3.12 / pandas 1.5 → 2.2 / RiskTier: MEDIUM / 1 CVE cleared
  2. 02

    2. Behavior Diff

    the differentiator

    Traces call execution into target dependencies under both versions — surfacing quiet runtime behavior changes before you merge.

    $ pymolt contract report .
    2 result_changed → BEHAVIOR_CHANGED / 104 unverified
  3. 03

    3. Safe Rewrites

    early access wishlist

    Generates format-preserving AST rewrites via LibCST and re-verifies every hunk locally against your golden test suite.

    $ pymolt codemods .
    3 files / 12 rewrites / verified rules applied
Why it's trustworthy

Built on explainability, not vibes.

A migration is often run by someone who doesn't know the codebase. The tool has to be the source of truth — so every fact must show why it was concluded.

01

Provenance on every fact

Each finding shows where it came from — a Dockerfile ARG chain, a lockfile, a tox matrix — and how confident it is. “Unknown” is an honest answer, not a failure.

sourced
py 3.6 (Dockerfile) 3.11 (CI)
base python:3.11@sha256… → unknown
02

Honesty markers, not best-effort

When a value can't be compared, PyMolt says so — opaque, BLIND, skipped — instead of smoothing over what it never actually observed.

disclosed
comparison: skipped_opaque
BLIND ×104 → listed, never hidden
03

It decides nothing

The tool produces empirical facts; an engineer reads the verdict. Codemods are dry-run by default and reviewed hunk by hunk — nothing is silently rewritten.

your call
verdict: NEEDS_ACTION
apply changes? [y/N] — always yours
Offline-first
network steps are opt-in & cached
Pure-stdlib tracer
Python 3.6+, zero edits to your repo
CLI, one engine
--json everywhere for CI
A real migration, anonymized

The Migration Ledger

Five Python services in the energy sector, 3.8 → 3.9 with their data stacks. Pick a dependency to see the molt — the old behavior shed, the new one it grew into. The code barely changes. The behavior underneath does.

6packages3behavioral / rewrite~4%trust until traced
behavioralneeds caresafe
pandas 1.5.32.2.0
change class: Behavioral
BEHAVIOR_CHANGED
old skin / v1 behavior
totals = df.sum() # silently drops
# non-numeric cols
df["net"].fillna(0, inplace=True)
new skin / v2 behavior
totals = df.sum(numeric_only=True)
# ^ now explicit — otherwise raises
df["net"] = df["net"].fillna(0) # CoW

What actually changes

  • Copy-on-Write: chained inplace assignment stops mutating the original frame
  • numeric_only default flipped to False — reductions that dropped columns now raise
  • pd.NA / nullable dtypes: use pd.isna(), not `is None`

How PyMolt surfaces it — contract traces the boundary under 1.5 and 2.2, then diffs — result_changed flags exactly these.

Built for AI Agents / MCP Integration

Don't waste 100k tokens making AI agents guess Python upgrades.

Claude Code or Cursor can attempt Python migrations alone — but raw LLMs burn 100,000+ tokens reading files, guessing deprecated APIs, and trusting green unit tests while production breaks. PyMolt feeds agents structured ground truth via MCP in 1 turn.

Efficiency Impact
Token reduction:53x smaller payload
Execution speed:95% fewer agent turns
API Accuracy:100% verified facts
Benchmark: Context Window Consumption

Raw Monorepo File Scanning vs PyMolt MCP Ingestion

Sample: 45k LOC Python Monorepo (3.8 → 3.12)
Raw Agent (Claude / ChatGPT reading files blindly)98,400 tokens (Context Window Bloat)
High latency, $1.48 per turn, misses Docker/tox matrix overrides
Agent + PyMolt MCP (Deterministic Structured Fact Dump)1,850 tokens (98.1% Savings)
1-turn ingestion, $0.02 per turn, 100% provenance & golden boundary diffs
Token Consumption-98% Tokens
1,850 tok98,400 tok
Agent Turn Latency20x Faster
~12s (1 turn)~4.2 mins (24 turns)
API Hallucination RateDeterministic
0.0% (AST + stdlib trace)18.4% (legacy memory)
Map repository & version surfaces
98,400 tokScans 40+ repo files; misses Dockerfile ARG chains, conda overrides & tox environment matrices.
1,850 tok53x smaller
pymolt scan --jsonSingle pass extracts all roots, runtime divergence & dependency edges with source provenance.
Validate target Python 3.12 compatibility
GuessworkRecalls outdated training memory; cannot resolve real lockfiles or query live CVE feeds.
Live facts100% accurate
pymolt assess --riskLock-first resolution corridor with live CVE, binary wheel & abandonment metrics.
Detect runtime behavior changes
18-25 turnsWrites ad-hoc print statements; trusts green unit tests while prod behavior silently shifts.
1 command1 turn fix
pymolt contract reportRuntime boundary diff: flags result_changed, raise_changed & BLIND unverified paths.
The Closed-Loop Fact Cycle

Your agent edits code → pymolt contract capture → PyMolt verifies whether BEHAVIOR_CHANGED is resolved. The reasoning loop closes on empirical runtime facts — never on hallucinated green test assertions.

Native Model Context Protocol (MCP) Support
Add PyMolt directly to Claude Code, Cursor, Windsurf, or ChatGPT desktop:
claude mcp add pymolt -- pymolt mcpllms.txt

* Benchmark measured on a 45,000 LOC Python codebase upgrading from 3.8 to 3.12 across 14 dependency boundaries.

Axiom Graph / early access

The fix, with receipts.

The CLI is free and open source. The hard part — knowing exactly how an API changed between two versions and rewriting for it correctly — is powered by Axiom Graph. Grounded in what actually changed, not blind pattern matching: the difference between a rename and a fix.

Early Access Wishlist
S / patch-grade≤5 wtWishlist
M / standard6–25 wtWishlist
L / framework-grade>25 wtWishlist

Join early access to get automated recipe rewrites prioritized for your project's target dependencies.

Join the Wishlist

Only versions cross the wire — never your code.

Automated Recipe Execution LoopLocal Verification Pipeline
STEP 01

1. You send versions, not code

PyMolt posts only dependency names and version jumps (from → to). Your source code never leaves your local machine.

POST /api/v1/recipes
{ pandas: 1.5.3 → 2.2.0 }
STEP 02

2. Axiom Graph mines patterns

The service checks public release diffs for that exact version jump and returns candidate codemods with evidence logs.

RECEIVE PATTERNS
rules[] + evidence logs
STEP 03

3. PyMolt re-verifies locally

Every candidate rule is executed locally against your project's golden test suite. Unverified rules are downgraded.

LOCAL VERIFY
verify(rule) → pass
STEP 04

4. Review & apply with LibCST

Format-preserving AST rewrites land via LibCST. You review and accept each hunk as a visual diff before committing.

APPLY REWRITE
pymolt codemods .
Early Access

The CLI is free. Get early access to automated rewrites.

We are onboarding initial engineering teams to refine codemod generation on real codebases. Request early access to get your target migrations prioritized.

Free & open source

PyMolt CLI

$0

forever / runs locally

Everything computable from local files and public data, in one offline-first run, scoped to one repository.

  • scan — surfaces, version divergence, dependency edges
  • assess --risk — lock-first resolve + CVE / wheel / abandonment
  • contract — behavioral boundary verification across versions
  • Pure-stdlib tracer (3.6+), zero edits to your project
  • CLI, --json everywhere for CI
Early access
Early Access Wishlist

Axiom Graph codemods

Early Access

free for early adopters / join the wishlist

Behavior-grounded rewrites for a specific dependency jump — generated by Axiom Graph, applied locally with LibCST. Class follows delivered weight: renames ×1, behavioral rewrites ×3.

  • Free access for early adopters during preview
  • One recipe = one package jump (e.g. pandas 1→2), unlocked forever
  • Priority evaluation for your specific Python migrations
  • Empty bundles cost nothing; re-runs never cost extra
  • Only versions cross the wire — never your code
Expertise + recipes

Migration help

Let's talk

scoped to your migration

Got a migration that's actually a research project? Hands-on audit from someone who has run these on large scientific codebases.

  • Hands-on migration audit & feasibility assessment
  • Behavioral verification of the paths tests miss
  • Blue/green & two-env cutover strategy
  • Accumulated migration recipes & datasets
  • CI/CD setup to stop the debt cycle recurring

Stop guessing. See the migration first.

Install the CLI in one line, map your migration for free, then let Axiom Graph handle the rewrite when you're ready.

$ curl -fsSL https://pymolt.zeelex.me/install.sh | sh