Changelog
What's new in Phantom. Release notes written for engineers, not commit logs.
- v1.6.0 September 7, 2026
Phantom 1.6.0 adds Ableton MCP setup and fixes audio-analysis, output, and installation edge cases.
DAW setup
phantom setup-abletoninstalls the pinned Ableton MCP Remote Script and configures it alongside Phantom. Existing unrelated MCP servers are preserved; replacing an existing Ableton entry requires--force.- Full Ableton setup restricts the installed Remote Script listener to localhost and stops if it cannot verify the configuration.
--config-onlydoes not secure an existing script. - Ableton MCP telemetry and automatic script installation on server startup are disabled in the generated configuration. Activate the Remote Script in Live and verify
get_session_infoafter setup. - REAPER setup now pins the independently versioned bridge release
v1.1.1. Failed bridge checkouts stop setup before copying scripts unless unverified operation is explicitly requested. - Setup previews withhold MCP configuration values that could contain credentials.
Audio and reliability
- Check loudness and clipping across channels so stereo cancellation does not hide active audio or clipped samples.
- Detect positive integer PCM clipping rails and keep clipping metadata distinct in cached analysis.
- Preserve headroom in processed audio using atomic 32-bit float WAV output. Separate input and output directories now work through processing and reference matching.
- Reject invalid analysis settings before native algorithms run, bound live-metrics reads, and check resampling allocations against the configured audio budget.
- Load the native analysis engine when needed so installation diagnostics remain available when it cannot load.
- Remove unused code, enforce import ordering and additional lint rules, and revise the README and engineering skills around verified behavior and limits.
Packaging
Source archives now use an explicit file list. CI checks both package formats for unexpected files and local home paths before release.
Compatibility and verification
Phantom’s MCP surface remains 20 tools. External DAW bridges provide their own tools. Python 3.10–3.13 on macOS and Linux remains the supported installation range; Windows support still requires an alternative analysis backend.
Local tests covered synthetic signals, local audio integration, setup configuration, and package contents. The pinned REAPER bridge and Ableton Remote Script were installed locally. A connected Ableton Live session was not tested because Live was unavailable; configuration success is not a live-session verification.
- v1.5.2 August 22, 2026
Fixed
Stereo rating on the reference path
compare_to_referencerated stereo width and correlation on the dB scale. The #56 fix in 1.5.1 correctedcompare_to_profileonly, so the reference path still called_rate_deviation_refwith no thresholds and fell back to the dB defaults (1.0/3.0/6.0).Width gaps between two mixes top out near 1.2 and correlation gaps at 2.0, so anything under 1.0 read
on_targetand, for correlation, the significant ratings were unreachable by construction. A near-mono mix against a decorrelated reference reported deviation 1.0 and ratedon_target.Width reuses
_WIDTH_THRESHOLDS. Correlation gets_CORRELATION_THRESHOLDS, anchored on_BASS_MONO_THRESHOLD— a 0.05 departure from fully mono is the established just-detectable step — with 0.15/0.25 continuing the ladder.GCC-PHAT delay on short inputs
_gcc_phat_delaybuilt its lag region without checking the correlation was long enough to hold it.max_shiftis 2205 samples at 44.1 kHz, so once an input fell below twice that the two halves overlapped, and once it fell belowmax_shiftthe negative slice clamped to the whole array.Measured with broadband noise: a 1000-sample pair with a true delay of 0 reported -2205 samples (-50.00 ms); the same pair at delay 100 reported -2105 (-47.73 ms). The reading tracked the real delay but sat a full window away from it. Reachable from real files, since
compare_phasetruncates both signals to the shorter one.max_shiftis now clamped ton // 2.Other fixes
PHANTOM_MASKING_TOP_Nrejects 0 and negatives. Pairs sort worst-first, so a negative slice dropped the most severe pairs rather than returning fewer.fix --interactive --jsonkeeps its prompt off stdout, so the document parses.read_live_metricsreturns the "no live metrics" message instead of a rawFileNotFoundErrorwhen a snapshot vanishes between listing and selection.enforce_decode_limitshonours itsAudioLoadErrorcontract in the size probe.install.shreports phantom's exit status, notgrep's — two of three success cases previously printed a failure.install.ps1checks$LASTEXITCODEafterphantom setup.- Commit hooks scan
.ps1and.bats, and block the Claude URL shapes actually handed out. - CI: the optional-extras job can fail the build and runs
test_processing.py; the planning-docs gate fetchesorigin/mainbefore diffing.
Added
mid_side_statemid_side_ratio_dbis undefined at both extremes and returned a bareNonefor each — a mono file has no side energy, a fully inverted one has no mid. Those are opposite conditions: mono is usually fine, fully inverted cancels on a mono fold.StereoResultnow carriesmid_side_state, set topure_midorpure_sidein those cases andNonewhen the ratio is a real measurement. Additive; the existing field is unchanged.Tests
Nine tests closing gaps confirmed by mutation testing:
compare_phaseresampling (deletingalign_sample_ratesleft all 43 phase tests passing), the maskingmoderate/lowseverity branches (both threshold tests asserted inside anifthat never ran), anddynamic_complexity/loudness_db(replacing the Essentia call with constants passed the entire suite).Also rewritten to depend on what they name: band normalization call sites, the problem sort order, and the analysis window truncation.
Known
Phantom still does not install on Windows.
essentiahas never published a Windows wheel, souv tool install phantom-audiofails at dependency resolution. Tracked in #52. Phantom Studio, the plugin, is unaffected — it does not use essentia and builds on Windows.Full Changelog: https://github.com/fadelabs/phantom/compare/v1.5.1...v1.5.2
- v1.5.1 August 17, 2026
Fixed
Stereo width was rated on the wrong scale
compare_to_profilereturnedon_targetfor stereo width on every possible input, including a fully mono mix. Width is a side/mid ratio, but it was being scored against the dB thresholds (1.0/3.0/6.0), and the largest below-range deviation width can produce is 0.7 — under theon_targetthreshold. Width now uses ratio-scaled thresholds. A near-mono mix ratessignificantly_belowagainst pop and ambient, and stillon_targetagainst lo-fi, which targets narrow.Fixing it surfaced a second gap:
_WIDTH_RANGEShad no entry forvery_wide. The ambient profile declares that descriptor, so it fell through to a (0.0, 2.0) catch-all spanning the whole usable domain, which disabled the width check for that genre entirely. Six regression tests cover both; one asserts that no bundled profile relies on the catch-all, so a future descriptor cannot silently disable its own check. (#56)Other fixes
- The pre-push hook refuses to vouch for a ref that is not the one checked out.
Its checks run against the working tree, so pushing a different ref meant the
hook reported on code that wasn't being pushed.
--no-verifyoverrides. ClassVarnow resolves at module scope, so pydantic honors it on Python 3.10–3.12. Python 3.13 resolved the annotation where the older versions did not.
Changed
Windows install telemetry matches install.sh
install.ps1now sends a single POST with a JSON body: install method, outcome, and one of four enumerated failure reason codes through a newStop-Installthat mirrors install.sh'serr(). Telemetry initialization moved above the Windows build check, architecture is normalized to x86_64/arm64, and extras reportnoneuntil an install is actually attempted. Same endpoint, same opt-out (PHANTOM_NO_TELEMETRY=1), still fire-and-forget.Windows CI
New
.github/workflows/install-windows.ymlruns the installer's telemetry harness onwindows-latestunder both Windows PowerShell 5.1 — what users actually have — and PowerShell 7, plus a parse check.tests/install_ps1/adds 125 assertions across nine scenarios, checked against the validation rules the telemetry endpoint really applies. It runs anywhere:python3 tests/install_ps1/verify_telemetry.pyA second CI job runs
install.ps1end to end and is expected to fail until #52 lands. See below.Lint
Adopted ruff 0.16.3 and cleared the findings its widened default rule set surfaced.
Docs
Phantom does not install on Windows, and never has
essentiais a hard core dependency and has never published a Windows wheel for any version, nor an sdist since 2020.uv tool install phantom-audiotherefore fails at dependency resolution on Windows, with or without extras. Every other dependency resolves fine.This release does not fix that — it stops the project implying otherwise. The README install block states it,
pyproject.tomlclassifiers no longer claimOperating System :: OS Independent(which was false), and CLAUDE.md records it beside the Essentia decision that caused it. Replacing essentia with a Windows-capable backend is tracked in #52.Corrections
detect_problemscoverage andbatch_diagnosticconcurrency were both documented inaccurately.- Fixed the
uvxinvocation example, the telemetry opt-out example, and a link to a 404 install URL. - RELEASING.md now names the real keychain item, warns that
uv publishwithout file arguments uploads every stale artifact left indist/, and corrects the Anthropic marketplace step.
Full Changelog: https://github.com/fadelabs/phantom/compare/v1.5.0...v1.5.1
- The pre-push hook refuses to vouch for a ref that is not the one checked out.
Its checks run against the working tree, so pushing a different ref meant the
hook reported on code that wasn't being pushed.
- v1.5.0 August 17, 2026
What's new
Live metering from Reaper
New
read_live_metricsMCP tool reads real-time loudness and peak metrics from a running Reaper session, bringing the tool count to 20.Tunable analysis
New
AnalysisSettingslayer: FFT and frame sizes, polarity and crest thresholds, PHAT window, masking band splits, and problem-detection thresholds are now tunable throughPHANTOM_*environment variables. Analysis caching is scoped to the active settings, so changing a knob never returns stale results. All 40 runtime variables are documented in the README, andphantom doctorprints its environment table straight from the central registry so docs and code can't drift.Stem separation is its own package
The Demucs-based separation engine moved to a sibling PyPI package,
phantom-audio-separation(also 1.5.0). Installingphantom-audio[separation]still works and now pulls it in; the core package stays lighter for everyone who doesn't separate stems.Safer Reaper setup
phantom setup-reaperis now transactional: it backs up existing configuration, stages changes before applying them, and supports--dry-runand--uninstall.Changed
- Install telemetry (install.sh) now sends a single POST with a JSON body:
install method, outcome, and one of six enumerated failure reason codes, plus
a stable per-run id. Same endpoint, same opt-out (
PHANTOM_NO_TELEMETRY=1), still fire-and-forget. The Windows installer also reports install outcomes; its payload moves to the same JSON shape in an upcoming release. - Typed response models throughout: per-band maps, problem details, and dict-compatible flat maps replace loose dicts.
- Internal analysis facade: all analysis tools route through a single registry with generated wrappers, gated by a schema snapshot test so the MCP surface can't change silently.
Fixed
- Input hardening across the analysis pipeline: non-finite samples are rejected, sample magnitudes bounded, decoded array sizes capped, environment values validated, and error messages redact absolute paths (including UNC and spaced paths).
phantom analyze --jsonoutput contract restored.- 2026-07-05 audit findings and all Phase 0–3 code-review findings resolved.
- CLI tests no longer overwrite a real
.mcp.json.
Security
- cryptography 49.0.0 → 50.0.0 (PYSEC-2026-3552).
- torch → 2.13.0, setuptools → 83.0.0, plus patched transitive dependencies.
- Semgrep SAST added to CI and pre-commit; gitleaks action updated to v3.
Docs
- All five plugin skills (mix, mastering, effects, diagnostician, session-architect) recalibrated against the actual analysis code — thresholds, knobs, and tool facts now match what ships.
- Full
PHANTOM_*environment variable reference in the README, including the installer-only variables and telemetry disclosure.
Full Changelog: https://github.com/fadelabs/phantom/compare/v1.3.1...v1.5.0
- Install telemetry (install.sh) now sends a single POST with a JSON body:
install method, outcome, and one of six enumerated failure reason codes, plus
a stable per-run id. Same endpoint, same opt-out (
- v1.3.1 June 1, 2026
Security hardening release. All users should upgrade:
pip install -U phantom-audioFixes
- Output writes are now always confined to a sandbox (default
~/.phantom/output, override withPHANTOM_OUTPUT_DIR). Closes an arbitrary file-write path in the default configuration. - Decode-bomb guards added to the stem-separation and render paths (duration/size caps + ffmpeg
-max_alloc/-t/-fs). - Atomic, race-free output creation in reference matching; symlink TOCTOU hardening on confined input reads.
Behavior change
- Default output location moved from next to the input file to
~/.phantom/output. SetPHANTOM_OUTPUT_DIRto write elsewhere. Input reads stay unconfined unlessPHANTOM_AUDIO_DIRis set.
See the published Security Advisory for full details and CVEs.
- Output writes are now always confined to a sandbox (default
- v1.3.0 May 20, 2026
What's Changed
All five domain expert skills (audio-diagnostician, mix-engineer, effects-engineer, mastering-engineer, session-architect) have been substantially rewritten with deeper decision trees, conflict resolution, and measurable verification criteria.
Mix Engineer
- Buried vocal diagnostic sequence with fallback chain
- Three-way frequency conflict resolution (home-band assignment)
- Compression/EQ interaction awareness (re-check threshold after EQ moves)
- Per-section processing for density changes across song sections
- Cumulative thinning detection after HPF passes
Mastering Engineer
- Corrective-only 6 dB send-back threshold (enhancement and album adaptation excluded)
- Minimum-phase vs linear-phase EQ decision tree
- Compressor-limiter attack interaction for punch preservation
- Section-aware mastering automation
- Parallel compression skip on over-compressed material
- Pass/fail QC thresholds for final delivery
Effects Engineer
- Pre-reverb ambiance assessment (dry studio vs live room)
- Dual-bus mono-safety for extreme width intent
- Chain order rationale (distortion→reverb vs reverb→distortion)
- Inter-effect coherence framework
- Bus vs individual effect routing decision matrix
- Stem delivery considerations for send/return effects
Audio Diagnostician
- Creative intent detection before flagging (aesthetic noise, player's tone)
- Per-section cumulative noise calculation
- Confidence prefixes on all findings (Definite/Likely/Possible)
- M/S detection before phase correlation flagging
- Pan-aware masking analysis
- Playback context reporting (headphone vs PA)
Session Architect
- Time-pressure prep triage (immediate vs deferrable)
- Complexity-driven scaling override (instrument density, not just stem count)
- Multi-format delivery architecture from session start
- Mid-session track expansion procedures
- Creative direction override documentation
- Headphone feed independence routing
Housekeeping
- Remove SKILL-AUDIT.md from tracked files
- Add .claudeignore
- Update .gitignore to exclude docs/research
Full Changelog: https://github.com/fadelabs/phantom/compare/v1.2.4...v1.3.0
- v1.2.4 May 14, 2026
What's Changed
Phases 21-22 of the v1.2 milestone, plus CI fixes.
Performance & Resilience (Phase 21)
- Thread-safe LRU analysis cache eliminates redundant computation across comparison calls
- Polyphase FIR resampling for cross-sample-rate comparison (auto-resamples instead of erroring)
- FFT spectrum sharing in
detect_problems— eliminates 4 redundant FFT passes - Environment variable helpers (
PHANTOM_PHAT_WINDOW_S,PHANTOM_MASKING_TOP_N) for tuning - Adaptive
top_nfor multi-stem masking based on stem count
Code Review Fixes (Phase 21)
- Sentinel object for cache miss instead of None (prevents false hits)
fcntl.flockadvisory locking replaces TOCTOU-vulnerable O_CREAT|O_EXCL pattern- Exception chaining with
from excin env helpers - Integer array overflow protection in RMS calculations
- Resampling log downgraded from warning to info (expected operation)
Test Hardening & CI (Phase 22)
- 60-second stereo fixture for duration-handling tests
- Error schema consistency tests for all 18 MCP tools
- Plugin skill content validation (frontmatter, tool references, domain keywords)
- Long audio duration tests with 120s timeout guards
- Optional dependency integration tests (matchering, demucs, pedalboard)
- GitHub Actions CI workflow — Python 3.10 + 3.12 matrix, ruff + pytest
- Dependabot configuration for pip and GitHub Actions updates
CI Fixes
- Use setup-uv@v7 (v8 not yet published)
- Install dev extras for ruff and pytest in CI
- Pedalboard skip guards for optional dependency tests
- tomllib fallback for Python 3.10 compatibility
Full Changelog: https://github.com/fadelabs/phantom/compare/v1.2.3...v1.2.4
- v1.2.3 May 13, 2026
What's Changed
Phases 18-24 of the v1.2 milestone.
Bug Fixes & UX (Phase 18)
- Reaper setup improvements with FFmpeg/SWS detection
- CLI render command with Matchering integration
- Audio fix pipeline CLI command
Tech Debt (Phase 19)
- Server handler deduplication (~400 lines removed)
- Complete test coverage for CLI and processing modules
Security Hardening (Phase 20)
- Input sanitization across all MCP tools
- Path security for audio file access
- Profile loading hardened against JSON injection
Audio Processing (Phase 23)
- Auto-fix pipeline for audio problem remediation
- Parametric EQ recipe generation from problem detection
- Processing comparison with before/after analysis
Overengineering Audit (Phase 24)
wrap_errorsdecorator replaces 12 inline try/except patterns- Band-excess detector deduplication (3 functions → 1)
comparison/subpackage consolidated (5 files → 1)- Dead code and proxy class removal
- All 19 MCP tools using uniform error handling
- Code review findings fixed (lock leak, cache bug, nan guards, FIPS compliance)
Stats
- Tests: 883 passed, 4 skipped
- Net change: +6,052 / -1,544 lines across 57 files
Full Changelog: https://github.com/fadelabs/phantom/compare/v1.2.2...v1.2.3
- v1.2.2 May 14, 2026
What's Changed
Security & Safety Gates (Phase 17.1)
- Pre-commit framework with gitleaks secret scanning (v8.30.1)
- PII detection hook — blocks personal info and absolute paths in commits
- Large binary hook — blocks audio files >1MB from being committed
- Planning docs hook — prevents internal
.planning/docs from leaking - GitHub Actions security scan CI for PRs and pushes to main
.gitignoreextended with credential file patterns (*.pem, *.key, *.p12)
Bug Fixes
- Version string drift fixed (
__init__.pynow matchespyproject.toml) - Path validation added to
phantom rendercommand - Pytest restored to pre-push hook
- Gitleaks allowlist narrowed from
tests/totests/fixtures/ actions/checkoutdowngraded from v6 to v4 (v6 doesn't exist)
Docs
- Star badge, PayPal support link, and GitHub Sponsor button added
- CONTRIBUTING.md updated with pre-commit install instructions
Full Changelog: https://github.com/fadelabs/phantom/compare/v1.2.1...v1.2.2
- v1.2.1 May 4, 2026
📖 Documentation · Getting Started · Website
What's new
- Install telemetry — install script reports anonymous install events (started, completed, failed) to fadelab.net for platform support decisions
- Install URL —
curl -sSL https://fadelab.net/install | bash(redirects to latest installer) - README — added docs links, updated contact to hello@fadelab.net
Install
curl -sSL https://fadelab.net/install | bashOr try without installing:
uvx phantom-audio analyze your-track.wav - v1.2.0 May 14, 2026
What's Changed
Hardening (PR #21)
- TOCTOU race fix in profile caching
- Demucs 600s timeout via ThreadPoolExecutor
- Lock file prevents concurrent
match_to_referenceoutput races
CLI & Setup
phantom setup— one-command onboarding (MCP config, plugin install, Reaper bridge)phantom version/phantom update/phantom uninstalllifecycle commands- Claude Code marketplace manifest for plugin installation
- MCP config defaults to
~/.mcp.json(global) for new users
Audio Diagnostician Skill (autoresearch 55 → 84)
- Instrument-aware phase correlation thresholds
- Cumulative noise math with worked examples
- Live recording bleed vs masking distinction
- Pre-mastering borderline pass/fail table
- Spectral centroid edge cases for instrument identification
- Concrete EQ prescriptions and tool recommendations
Installer & Docs
- uv-first install (pip fails on stock macOS due to PEP 668)
- Interactive extras prompt with size/license info
- Pin uv bootstrap to v0.11.7 for supply chain safety
- Patent pending notice added to README
Full Changelog: https://github.com/fadelabs/phantom/compare/v1.1.0...v1.2.0
- v1.1.0 May 2, 2026
Phantom v1.1.0
First tagged release. Includes the complete v1.0 analysis engine and v1.1 CLI tools.
What's included
- 17 MCP analysis tools — spectrum, loudness, dynamics, stereo, phase, problems, masking, comparison, matching, separation, diagnostics
- 5 domain expert skills — mix engineer, effects engineer, mastering engineer, audio diagnostician, session architect
- 9 genre reference profiles — pop, rock, hip-hop, electronic, EDM, metal, rock-metal, lo-fi, ambient
- CLI tools —
phantom analyze,compare,separate,render,setup-reaper,doctor,version,update,uninstall - Reaper DAW integration — auto-setup bridge with
phantom setup-reaper - Self-update system —
phantom updatechecks GitHub for new versions - Clean uninstall —
phantom uninstallremoves all artifacts
Install
pip install git+https://github.com/fadelabs/phantomOr try without installing:
uvx phantom-audio analyze your-track.wav