NEXT PUSH:
TASK: Fix port 16620 priority regression
FILES CHANGING: Source/Plugin/McpServer.cpp (start() method only)
FILES NOT TOUCHING: all locked files ✅
NEW FILES: none"
When SAFE plugin loaded: searchParamCallback, getParamsCallback, setParamsCallback
route directly to inProcessPlugin. When unloaded: cleared to nullptr (falls back to Helper).
Pro-Q 4 GUI now updates instantly when AI sets parameters via MCP.
docs: bump CLAUDE.md to v0.6.0, add Sprint 4-6 features + Sprint 7 warning
Sitar118+1: Claude Sonnet 4.6
6f6ce59
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sprint 7: McpServer.cpp — use param callbacks with Helper IPC fallback
Adds 3 param callbacks to McpServer. When SAFE plugin loaded in-process,
search/get/set_params go directly to inProcessPlugin. When UNSAFE (callbacks null),
falls back to Helper IPC. Pro-Q 4 GUI now updates when AI changes parameters."
docs: Sprint 7 task + update paths after folder move to AI MUSIC PRODUCTION
Sitar118+1: Claude Sonnet 4.6
29b4c18
- SYNC.md: clean rewrite — Sprint 7 task in correct section (CLAUDE CODE → ML INTERN),
removed stale Sprint 5/6 archive content, version stays v0.6.0
- SPRINT-LOG.md: added Sprint 7 entry
- MACHINE-CONTEXT.md: updated build dir path + full cmake/build commands
- CLAUDE.md: updated source path + version to v0.6.0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix: first instance always binds port 16620, fallback to auto-port
Sitar118+1: Claude Sonnet 4.6
19d5f13
Ensures Claude Code MCP registration (fixed at 16620) always works.
Second+ instances get OS-assigned ports, discoverable via list_instances().
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Full spec: channel name ComboBox in Editor, auto-port via bind_to_any_port,
/tmp/pluginbridge-registry.json, new list_instances MCP tool (6th tool),
get_analysis prefixed with channel name.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
release: v0.5.3 — live plugin spectrum working
Sitar118+1: Claude Sonnet 4.6
8208bb7
Safe plugins now process audio in-process. Pro-Q 4 spectrum confirmed live.
All plugin GUI meters, waveform displays, and analyzers now work correctly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
NEXT PUSH:
TASK: Pro-Q 4 spectrum analyzer fix — audio now flows through in-process instance
FILES CHANGING:
- PluginBridgeProcessor.cpp (processBlock routing + prepareToPlay in loadInProcessPlugin)
FILES NOT TOUCHING:
- PluginBridgeEditor.mm ✅
- PluginPickerComponent.mm ✅
- HelperPluginHost.mm ✅
- HelperConnection.cpp ✅
NEW FILES: none
APIS USED:
- inProcessPlugin->processBlock() — verified (AudioProcessor inheritance)
- inProcessPlugin->prepareToPlay() — verified safe (only SAFE plugins reach here)
Changes:
1. loadInProcessPlugin(): added prepareToPlay(currentSampleRate, currentBlockSize)
after setBusesLayout(), before state restore + addListener()
2. processBlock(): named MidiBuffer param, added in-process audio path:
if inProcessPlugin exists → processBlock directly (skips Helper shm)
else → existing Helper shm path unchanged
3. AudioAnalyser runs on the output regardless of which path is used"
answer: prepareToPlay question for Sprint 5 — Option B verified safe
Sitar118+1: Claude Sonnet 4.6
199d2e1
iZotope/Neutron crash concern is moot — those plugins are UNSAFE and never
reach loadInProcessPlugin(). Exact code for prepareToPlay() placement and
processBlock() restructure provided. ML intern unblocked.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sprint 5: ML Intern question — need prepareToPlay verification before implementing
task: Sprint 5 — route audio through in-process plugin for SAFE plugins
Sitar118+1: Claude Sonnet 4.6
2c0ae05
Pro-Q 4 spectrum shows no signal because audio goes through Helper instance
while GUI belongs to in-process instance. Fix: call inProcessPlugin->processBlock()
directly in processBlock() when safe plugin is loaded.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
docs: make SYNC.md lean — move sprint history to SPRINT-LOG.md
Sitar118+1: Claude Sonnet 4.6
a8f4396
SYNC.md now ~50 lines (just live state + message queues + next push template).
Sprint history moved to SPRINT-LOG.md (reference only, not read every session).
Saves Claude Code tokens on every session start.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
docs: add two-way message queue to SYNC.md — ML Intern ↔ Claude Code bridge
Sitar118+1: Claude Sonnet 4.6
cc0ab22
Adds:
- Partnership diagram explaining what each side relies on the other for
- ML INTERN → CLAUDE CODE section: question queue before writing code
- CLAUDE CODE → ML INTERN section: answers + diagnostics after builds
- First message: Sprint 4 regression explanation so ML intern understands what broke
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
docs: rewrite SYNC.md as live handoff protocol between ML Intern and Claude Code
Sitar118+1: Claude Sonnet 4.6
ac96bfc
Old SYNC.md was a static history log — ML intern pushed AudioAnalyser without
updating it, Claude Code had no idea what was coming.
New structure:
- NEXT PUSH section: ML Intern fills before every push (task, files changed, APIs used)
- LAST BUILD RESULT: Claude Code fills after every pull+build
- LOCKED FILES table: explicit list of files ML intern must not modify
- Sprint log with regression note from Sprint 4
- What Claude Code can do (so ML Intern knows what to request)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Restored PluginBridgeEditor.mm to v0.5.2 (in-process createEditor, TreeView picker)
- Restored PluginBridgeProcessor.cpp to v0.5.2 (loadInProcessPlugin, safety scan, deduplication, manufacturer names, PBLOG)
- Added PluginPickerComponent.mm to CMakeLists.txt (was never registered)
- Wired AudioAnalyser into v0.5.2 processor (prepareToPlay, processBlock, getAnalysisCallback)
- Fixed AudioAnalyser: FFT is now a stored member, not created per audio block
- Updated MACHINE-CONTEXT.md: full scope rules, workflow, architecture lock, dead-end list
Root cause of regression: ML Intern rewrote Editor+Processor to add AudioAnalyser,
accidentally reverting to pre-v0.5.2 CALayerHost architecture (FAILED-APPROACHES #10).
MACHINE-CONTEXT.md now has explicit scope rules to prevent this.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix: replace CARemoteLayerServer with CAContext+CALayerHost for cross-process GUI
Sitar118
0548359
Three bugs killed the GUI:
1. CARemoteLayerServer does not capture a hidden NSWindow's content cross-process.
Replaced with CAContext (server) + CALayerHost (client) — the correct private-but-stable
macOS API for cross-process layer embedding, stable from 10.10 through Sequoia.
2. NSWindow was never orderFront: — WindowServer never composited its content.
Fixed: window positioned at (-32000,-32000) and orderFront: called.
3. NSMachBootstrapServer (deprecated on 13+) no longer needed.
contextId (uint32_t) is sent directly over the existing IPC socket.
New file: Source/Shared/PrivateCA.h — declares CAContext, CALayerHost, CGSMainConnectionID.
update SYNC.md — grant full debug/fix permission for GUI issue
HelperPluginHost now has onGuiCreated callback. HelperIPC sets it.
When showGui() finishes creating the editor + registering the layer,
it calls onGuiCreated which triggers sendGuiReady with port name + size.
fix: use setLayerPortName() instead of direct member access