Skip to content

Releases: wandercom/transmogrifier

v0.3.0 — Remove [validation] extra (libomp collision avoidance)

Choose a tag to compare

@jmcentire jmcentire released this 12 Apr 03:13

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]:

  1. Drop the extra. pip install transmogrifier gives you the core register-translation functionality. The Level 1 (system prompt injection) and Level 2 (rule-based rewriting) paths are unchanged.
  2. If you need validation, you have two options until the Voyage-based replacement ships:
    • Install sentence-transformers manually 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. See NOTES.md in the repo for the implementation sketch.

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

Choose a tag to compare

@jmcentire jmcentire released this 27 Mar 23:38

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.git

Quick 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