Releases: wandercom/transmogrifier
Release list
v0.3.0 — Remove [validation] extra (libomp collision avoidance)
Breaking change
The [validation] optional extra is removed. Anyone installing transmogrifier[validation] will now get a pip error. Core transmogrifier functionality (register detection, rule-based rewriting, LLM-based translation via the anthropic/openai/gemini backends, MCP server, CLI) is unchanged and does not depend on any native libraries.
Why
The [validation] extra depended on sentence-transformers, which transitively pulls torch and scikit-learn. On macOS those two wheels ship mutually-incompatible libomp.dylib install names, and the OpenMP runtime aborts the Python process when both load into memory together. pip install 'transmogrifier[validation]' was unsafe on any fresh macOS machine.
The validator itself was a single-purpose optional feature — a >0.95 cosine-similarity check on embedding pairs to catch semantic drift during Level 3 LLM translation. Nothing else in transmogrifier depended on it, and no downstream tool (advocate, constrain, kindex, pact) imported it. The cost-benefit didn't support keeping it as a primary feature.
Migration
If you were using transmogrifier[validation]:
- Drop the extra.
pip install transmogrifiergives you the core register-translation functionality. The Level 1 (system prompt injection) and Level 2 (rule-based rewriting) paths are unchanged. - If you need validation, you have two options until the Voyage-based replacement ships:
- Install
sentence-transformersmanually and carry the libomp risk yourself, then implement the two-line cosine-similarity check directly in your caller code. - Wait for
transmogrifier[validation-voyage], which will provide the same semantic-drift check via Voyage AI's embeddings API (Anthropic's officially recommended embeddings provider) with no native dependencies. SeeNOTES.mdin the repo for the implementation sketch.
- Install
What's unchanged
- Register detection (
transmog detect) - Rule-based rewriting (Level 1/2)
- LLM-based translation via anthropic/openai/gemini backends (Level 3)
- MCP server (
transmog-mcp) - CLI (
transmogrify) - Model profiles, calibration, task classifier, system prompts, kindex integration
- All existing tests pass
This is a pre-1.0 minor version bump (0.2.0 → 0.3.0) because removing a public optional extra is a breaking change for pinned dependents per semver convention.
v0.1.0 — Initial Release
Register-aware prompt translation. Detects linguistic register and normalizes it to maximize LLM output quality.
Empirical Basis
| Model | Register Spread | Level 1 Recovery |
|---|---|---|
| Claude Opus 4 | 18.8pp | 67% |
| Gemini 2.5 Flash | 56.2pp | 100%+ |
| Claude Haiku 4.5 | 6.2pp | 100% |
| GPT-4o Mini | 0pp (invariant) | N/A |
Features
- Register Detector: Heuristic classifier for 5 registers (casual, technical, academic, narrative, direct)
- Level 1: System prompt injection — zero cost, recovers 67-100% of accuracy gap
- Level 2: Rule-based rewriting — <1ms, strips register-specific filler/framing
- Model Profiles: Pre-seeded with empirical data from 4 production models
- CLI:
transmogrify detect,transmogrify translate,transmogrify profile list - MCP Server: Stub for Claude Code integration
Install
pip install git+https://github.com/jmcentire/transmogrifier.gitQuick Start
from transmogrifier.core import Transmogrifier
t = Transmogrifier()
result = t.translate("yo what's the deal with TCP", model="claude-opus-4")
# result.output_text -> "TCP"
# result.system_prompt -> normalization instruction
# result.elapsed_ms -> ~2ms