livepilot 1.17.5 → 1.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,343 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.18.1 — Director HIGH-severity patches (April 23 2026)
4
+
5
+ Patch release addressing 4 of the 12 known issues documented in v1.18.0.
6
+ All three HIGH-severity bugs are fixed, plus 6 medium-severity items
7
+ (data cleanups and doc clarifications). All fixes landed with
8
+ regression-guard tests. 2779 project tests pass + 1 xfail (pre-existing).
9
+
10
+ ### High-severity fixes
11
+
12
+ - **#1 `create_experiment` auto-proposal returned single-char move_ids.**
13
+ Python unpacking bug at `mcp_server/experiment/tools.py:267` —
14
+ `[m[0] for m, _ in scored]` indexed the first character of each
15
+ move_id string. Fix: `[move_id for move_id, _ in scored[:limit]]`.
16
+ Pre-fix, calling the director's Flow B with no explicit seeds/move_ids
17
+ would always fail at run_experiment with `"Move t not found"`.
18
+
19
+ - **#2 `propose_composer_branches` ignored concept-packet arrangement
20
+ idioms.** Dub-techno prompts (referencing Basic Channel, Gas, etc.)
21
+ were collapsed to the generic techno template (Intro→Build→Drop→
22
+ Breakdown→Drop 2→Outro with 6 standard layers). Fix: "dub techno"
23
+ is now its own canonical genre in `GENRE_DEFAULTS` and
24
+ `SECTION_TEMPLATES`, with a continuous-evolution scaffold
25
+ (Dawn→Pulse→Chord→Depth→Withdraw→Return, 3-5 layers, energy 0.4).
26
+ Removed the `dub techno → techno` alias that was causing the
27
+ collapse; added `dub-techno` (hyphenated) as an alias to the new
28
+ canonical.
29
+
30
+ - **#3 Director raw-tool-call path bypassed the action ledger.**
31
+ Min-effective doc fix: Phase 6 of `livepilot-creative-director`
32
+ now mandates `add_session_memory(category="move_executed", ...)`
33
+ after raw-tool execution batches, so anti-repetition detection on
34
+ subsequent creative turns isn't blind. Added a state-inference
35
+ fallback table in `anti-repetition-rules.md` for when the ledger
36
+ is still empty (infer recent family from loaded devices, non-default
37
+ mixer state, clip slot contents). Full architectural fix (route all
38
+ Phase 6 execution through `apply_semantic_move`/`commit_experiment`)
39
+ is deferred to v1.19.
40
+
41
+ ### Medium-severity fixes
42
+
43
+ - **#4 Ping Pong Delay ghost packet.** `affordances/devices/ping-pong-delay.yaml`
44
+ previously described a standalone device that doesn't exist in
45
+ Live 12 (`search_browser` returned empty). Rewritten as an explicit
46
+ mode-alias for Echo with `Channel Mode = 1`. `echo.yaml` now prominently
47
+ documents the Channel Mode enum (0=Stereo, 1=Ping Pong, 2=Mid/Side).
48
+
49
+ - **#5 Auto Filter affordance used legacy 20-135 Hz ranges.** Modern
50
+ `AutoFilter2` class (Live 12 default) uses 0-1 normalized for
51
+ Frequency, Resonance, and LFO Amount. Live-verified mapping (raw
52
+ 0.45 → display 448 Hz) is now documented in the YAML. Legacy/modern
53
+ distinction clarified in the notes.
54
+
55
+ - **#9 `propose_composer_branches` silent count degradation.** Explicit
56
+ `count=3` at `freshness<0.7` was silently returning 2 seeds because
57
+ `layer_contrast` was gated behind `freshness>=0.7`. Fix: explicit
58
+ `count>=3` now raises freshness internally to 0.7 to admit all
59
+ strategies. Default `count=2` (no override) still respects the
60
+ freshness gate — preserves the "freshness shapes default strategy
61
+ count" contract and the existing tests that assert it.
62
+
63
+ - **#12 Low-novelty-budget escape hatch for 3-plan diversity rule.**
64
+ `move-family-diversity-rule.md` gained a dedicated section: when
65
+ `novelty_budget < 0.35` (user prompts like "keep the vibe, just
66
+ cleaner"), 1-2 family plans is acceptable and honest. Prevents the
67
+ rule from fighting cleanup requests.
68
+
69
+ ### Bonus fixes
70
+
71
+ - **`batch_set_parameters` schema gotcha documented.** Core SKILL.md
72
+ Rule 15 now shows the correct dict-of-dicts shape:
73
+ `{"ParamName": {"value": v}}`. Live verification surfaced this during
74
+ v1.18.0 pressure testing.
75
+
76
+ - **Convolution Reverb phantom `ir_length` already fixed in v1.18.0
77
+ commit 9** — regression test now guards against reintroduction.
78
+
79
+ ### Tests added
80
+
81
+ - `test_create_experiment_auto_proposal_no_m0_bug` (source-pattern
82
+ regression guard)
83
+ - `test_create_experiment_auto_proposal_functional` (mirror-logic
84
+ integration check)
85
+ - `test_composer_dub_techno_prompt_avoids_drop_scaffold` (no Drop/Drop 2
86
+ on Basic Channel prompts)
87
+ - `test_propose_composer_branches_honors_explicit_count` (count=3
88
+ returns 3 regardless of freshness)
89
+ - `test_medium_freshness_count_3_unlocks_all_strategies` (renamed from
90
+ test encoding the pre-fix bug as desired behavior)
91
+ - `test_medium_freshness_default_count_gives_two` (preserves
92
+ default-count-respects-freshness contract)
93
+ - `test_ping_pong_delay_is_documented_as_echo_mode`
94
+ - `test_auto_filter_ranges_are_normalized_for_modern_class`
95
+ - `test_low_novelty_escape_hatch_documented`
96
+ - `test_batch_set_parameters_schema_documented`
97
+ - `test_director_phase6_records_ledger_marker`
98
+ - `test_anti_repetition_has_state_inference_fallback`
99
+
100
+ ### Still open for v1.18.2 / v1.19
101
+
102
+ 8 items remain from the v1.18.0 Known Issues list:
103
+
104
+ - **#7 Packet `avoid` list runtime enforcement** (currently advisory —
105
+ pre-flight check against tool args needed)
106
+ - **#8 `locked_dimensions` runtime enforcement** (same pattern as #7)
107
+ - **#10 Wonder Mode zero-variant degradation on empty session context**
108
+ - **#11 Evaluation tie-break coarseness** (3-way ties at score 0.6)
109
+ - **Experiment state continuity between branches** (before-snapshot
110
+ drift)
111
+ - **Hybrid-packet compilation algorithm** (union/intersection logic
112
+ for "Basic Channel meets Dilla")
113
+ - **~20 missing genre YAMLs** (downtempo, boom_bap, lo_fi, synthwave,
114
+ techno, etc.) — xfail test tracks this
115
+ - **Full architectural fix for #3** (route director Phase 6 through
116
+ semantic_move commits, replacing the doc-level fix shipped here)
117
+
118
+ These are each scoped for focused follow-up sessions — they need new
119
+ infrastructure or architectural decisions not suitable for a patch
120
+ release.
121
+
122
+ ## 1.18.0 — Creative Director + concept packets + device affordances (April 23 2026)
123
+
124
+ A structural feature release. Addresses the "agent doesn't variate
125
+ enough, feels stuck in the same repetitive patterns" failure mode by
126
+ adding an enforcement layer on top of the existing tool surface.
127
+ **Zero new Python. Zero new MCP tools.** The entire feature is skill
128
+ documentation, structured YAML data, and prompt-level contracts.
129
+
130
+ ### Added
131
+
132
+ - **`livepilot-creative-director` skill** — new top-level skill that
133
+ routes creative intent through mandatory divergence before any
134
+ commit. Eight-phase contract: ground → compile brief → generate 3
135
+ plans with distinct `move.family` → cover 4 dimensions → preview
136
+ or rank → select + execute → evaluate → record. Critics (analyze_mix,
137
+ evaluate_move) DEFER until Phase 7 — firing them earlier pre-converges
138
+ the answer. Includes four reference files:
139
+ - `creative-brief-template.md` — YAML schema + 4 filled examples,
140
+ novelty_budget table with 6 user-framing buckets
141
+ - `move-family-diversity-rule.md` — canonical 6 families + family-vs-
142
+ dimension split + collision-avoidance rules
143
+ - `anti-repetition-rules.md` — recency threshold table (0-2/10
144
+ neutral, 3-4/10 least-weighted, ≥5/10 EXCLUDED) + borderline-
145
+ stuckness band (0.4-0.5 surfaces user option)
146
+ - `the-four-move-rule.md` — structural + rhythmic + timbral + spatial
147
+ dimension coverage with narrow-idiom exceptions for dub-techno /
148
+ ambient / beat-focused packets
149
+
150
+ - **Structured concept packets** (42 YAMLs under
151
+ `livepilot/skills/livepilot-core/references/concepts/`) — 28 artist
152
+ packets + 14 genre packets. Each packet carries `sonic_identity`,
153
+ `reach_for`, `avoid` (HARD filter), `evaluation_bias.target_dimensions`
154
+ + `protect` floors, `move_family_bias.favor` + `deprioritize`,
155
+ `dimensions_in_scope` + `dimensions_deprioritized`, and
156
+ `novelty_budget_default`. Narrative `artist-vocabularies.md` and
157
+ `genre-vocabularies.md` stay as human-facing overviews; YAMLs are
158
+ the machine source-of-truth.
159
+
160
+ - **Device affordance metadata** (20 YAMLs under
161
+ `livepilot/skills/livepilot-core/references/affordances/`) — per-
162
+ device affordance packets for Echo, Auto Filter, Convolution Reverb,
163
+ Hybrid Reverb, Ping Pong Delay, Drift, Corpus, Granulator III,
164
+ Simpler, Wavetable, Operator, Poli, Saturator, Compressor, Glue
165
+ Compressor, Utility, EQ Eight, Chorus-Ensemble, Shifter, Vinyl
166
+ Distortion. Each covers `musical_roles`, `strong_for` / `risky_for`,
167
+ `subtle` / `moderate` / `aggressive` parameter ranges, `pairings`
168
+ (with before/after/parallel order), `anti_pairings`, `remeasure`
169
+ queue, and `dimensional_impact` mapping to the four-move-rule.
170
+
171
+ - **Evaluation artistic dimensions** — `livepilot-evaluation/SKILL.md`
172
+ extended with Family B dimensions (style_fit, distinctiveness,
173
+ motif_coherence, section_contrast, restraint, surprise_without_breakage)
174
+ in addition to Family A (punch, weight, etc). Both required for
175
+ creative-director turns.
176
+
177
+ - **Creative-success verdict taxonomy** — 5 verdicts assigned at
178
+ evaluation Step 8b: `safe_win`, `bold_win`, `interesting_failure`,
179
+ `identity_break`, `generic_fallback`. Drives promotion decisions.
180
+
181
+ - **Verdict-gated reflection promotion rubric** — `memory-guide.md`
182
+ extended with a promotion matrix that keeps memory from converging
183
+ on safe_win-adjacent moves. `bold_win` promotes immediately;
184
+ `safe_win` conditional on user-keep-for-2-turns; `interesting_failure`
185
+ curiosity-store only; `identity_break` and `generic_fallback` record
186
+ anti-preferences instead.
187
+
188
+ - **Schema test harness** — `tests/test_creative_director.py` (27
189
+ passing, 1 xfail tracking missing genre YAMLs). Verifies skill file
190
+ structure, packet counts, canonical family/dimension enforcement,
191
+ cross-reference resolution, and cross-skill integration (director ↔
192
+ evaluation ↔ memory-guide).
193
+
194
+ ### Changed
195
+
196
+ - `livepilot-core/SKILL.md`: fixed semantic_moves family count (5→6,
197
+ `device_creation` was missing from the docs). Added director routing
198
+ pointer in the V2 Engine Skills table and Flow B preamble.
199
+ - `livepilot-wonder/SKILL.md`: added creative-director as a trigger
200
+ (not only stuck-rescue); split honesty rule to actively widen across
201
+ families BEFORE accepting <3 variants on first-pass creative calls.
202
+ - `livepilot-producer/AGENT.md`: director added to subagent skills
203
+ index with "load FIRST on open-ended creative intent" note.
204
+ - `artist-vocabularies.md` + `genre-vocabularies.md`: cross-reference
205
+ callouts pointing to the new YAML packets.
206
+ - `m4l_device/LivePilot_Analyzer.amxd` + `.maxpat` + `livepilot_bridge.js`:
207
+ versioning text added to analyzer UI for live identification across
208
+ instances.
209
+
210
+ ### Pressure-testing
211
+
212
+ The director was developed under TDD-for-skills discipline: three
213
+ subagent pressure-scenarios run in two rounds, with verdict-driven
214
+ fixes between rounds. Round 1 surfaced 9 issues, Round 2 verified
215
+ each was fixed and surfaced 3 more (higher-order patterns only visible
216
+ after first-order bugs were gone). PR 3 affordance work caught 3
217
+ schema-level bugs (`atlas_uri` semantic mismatch, phantom
218
+ `ir_length`, parameter-name canonicalization gap) before ship.
219
+
220
+ ### Known gaps
221
+
222
+ - ~20 narrative-only genres (downtempo, boom_bap, lo_fi, synthwave,
223
+ techno, detroit_techno, soul, footwork, deep_house, french_house,
224
+ disco, electronic, electronica, cinematic, hyperpop, drone,
225
+ bass_music, soulful_house, acid_techno, nu_disco, juke) referenced
226
+ by artist packets but not yet YAML-ified. Tracked via
227
+ `test_all_artist_genre_refs_resolve_strictly` xfail.
228
+
229
+ ### Known issues from pre-ship live verification (v1.18.1 patch targets)
230
+
231
+ 12 issues surfaced while running director end-to-end against a real
232
+ Ableton session before pushing v1.18.0. Shipping as-is rather than
233
+ blocking the release; patching in a focused follow-up. Severity is
234
+ this author's subjective production-impact rating.
235
+
236
+ **High severity — users will hit these in the first 30 seconds:**
237
+
238
+ 1. **`create_experiment` auto-proposal is broken.** When called without
239
+ explicit `seeds` or `move_ids`, the keyword-overlap selector
240
+ generates single-character `move_id` values (`"t"`, `"w"`, `"m"`)
241
+ that fail with `"Move t not found"` at run time. All three branches
242
+ fail. Workaround: director MUST pass explicit `move_ids=[...]` —
243
+ auto-proposal path is unusable. (`mcp_server/experiment/engine.py`
244
+ auto-propose logic.)
245
+ 2. **`propose_composer_branches` ignores concept packets.** A prompt
246
+ referencing Basic Channel produced generic EDM scaffold
247
+ (`Intro → Build → Drop → Breakdown → Drop 2 → Outro` + 6 standard
248
+ layers) instead of BC's continuous-evolution dub-techno form.
249
+ Composer falls back to genre-family defaults and doesn't consult
250
+ `concepts/artists/*.yaml` or `concepts/genres/*.yaml` arrangement_idioms.
251
+ 3. **Director Plan A bypasses the action ledger.** When the director
252
+ executes via raw tool calls (`load_browser_item`, `set_device_parameter`,
253
+ etc.) instead of `apply_semantic_move` / `create_experiment +
254
+ commit_experiment`, `get_last_move` returns empty and anti-repetition
255
+ goes blind. Either make semantic_move commits mandatory for director
256
+ plan execution, or add a session-state inference fallback that reads
257
+ device/track deltas directly.
258
+
259
+ **Medium severity — edges and enforcement gaps:**
260
+
261
+ 4. **Affordance YAML — Ping Pong Delay is a ghost packet.**
262
+ `affordances/devices/ping-pong-delay.yaml` describes a standalone
263
+ device that doesn't exist in Live 12 (empty `search_browser` result).
264
+ Ping-pong is a MODE of `Echo` (`Channel Mode = 1`). Merge the
265
+ affordance into `echo.yaml` or delete the file.
266
+ 5. **Affordance YAML — Auto Filter ranges are legacy.** Modern
267
+ `AutoFilter2` class uses 0-1 normalized for Frequency (display
268
+ `"448 Hz"` at raw `0.45`), NOT the 20-135 legacy range the affordance
269
+ YAML documents. Either update the affordance to reflect
270
+ AutoFilter2 OR ship separate legacy/modern variants.
271
+ 6. **Affordance YAML — `ir_length` phantom on Convolution Reverb.**
272
+ Already fixed in commit 9 by renaming to `decay_time`, but worth
273
+ flagging that this class of field-vs-actual drift needs a
274
+ systematic check (script that compares affordance parameter names
275
+ to `get_device_parameters` output for each device).
276
+ 7. **Packet `avoid` list is advisory, not runtime-enforced.** Director
277
+ SKILL.md documents the hard-filter rule but there's no code path
278
+ that compares user requests or tool args against the active packet's
279
+ `avoid` list before executing. Ask for "bump the high-end" under an
280
+ active BC packet and nothing blocks the EQ boost.
281
+ 8. **`locked_dimensions` respect is declarative only.** Same class as
282
+ (7) — director compiles a brief with explicit locks but no runtime
283
+ pre-flight check blocks tool calls that touch locked dimensions.
284
+ 9. **`propose_composer_branches` silent `count` degradation.** Requesting
285
+ 3 branches at `freshness < 0.7` returns 2 (only canonical +
286
+ energy_shift). User-visible surface returns fewer than requested
287
+ without flagging.
288
+ 10. **Wonder Mode degrades to zero executable variants on empty/sparse
289
+ session context.** Tested with `enter_wonder_mode("I'm stuck")` on
290
+ a mostly-empty session — returned 3 identical analytical-only
291
+ variants with `"No matching executable moves found"`. Needs a
292
+ cold-start path that proposes starting-point seeds from memory
293
+ or concept packets rather than requiring existing session content.
294
+ 11. **Evaluation tie-break is coarse.** 3-branch experiment with
295
+ different semantic moves (add_space, add_warmth, widen_stereo)
296
+ all scored identical 0.6. No clear winner emerges. Classifier
297
+ needs finer resolution OR explicit tie-break by novelty/taste.
298
+ 12. **Low-novelty-budget escape hatch missing from 3-plan rule.**
299
+ `"keep the vibe, just cleaner"` → `novelty_budget = 0.30`. The
300
+ 3-distinct-families rule fights against narrow cleanup requests.
301
+ Need explicit clause: "if `novelty_budget < 0.35`, 1-2 mix-family
302
+ plans is acceptable and honest."
303
+
304
+ **Also worth fixing:**
305
+
306
+ - `batch_set_parameters` schema — requires `{"Name": {"value": v}}`,
307
+ not `{"Name": v}`. Docs didn't make this obvious.
308
+ - State continuity between experiment branches — before-snapshot
309
+ track levels drifted between branches (0.76 → 0 → 0.87). Each
310
+ branch sees a different baseline. Needs transport-state locking.
311
+ - Hybrid-reference compilation algorithm — multi-packet asks
312
+ ("Basic Channel meets Dilla swing") work via LLM ad-hoc reasoning,
313
+ not via explicit union/intersection logic. Define the rule.
314
+
315
+ All 15 items are tracked for a v1.18.1 patch. The core v1.18.0
316
+ machinery (8-phase director contract, concept packets, affordances,
317
+ evaluation dimensions, verdict taxonomy) works correctly when plans
318
+ are constructed with explicit `move_ids` — which is the documented
319
+ primary path.
320
+
321
+ ### Live Ableton session result
322
+
323
+ Test scenario: build a Basic Channel dub chain on a return track, then
324
+ source (Meld Juno Square chord stab) with sends. Chain built cleanly.
325
+ User feedback on initial Plan A: "super basic" (default presets lack
326
+ character). Swapped Drift default → `Poly Juno Square.adv` preset.
327
+ Improved character. Flow A of the director (build a single plan, verify,
328
+ iterate) is production-viable today. Flow B (divergence via experiment)
329
+ has the 3 high-severity issues above.
330
+
331
+ ### Process note
332
+
333
+ This release was authored in a single session as a series of 6 PRs
334
+ (Creative Director skill → Concept packets → Affordances → Evaluation
335
+ dimensions → Reflection rubric → Test harness), each pressure-tested
336
+ before moving to the next. Outside-reviewer design plan is at
337
+ `docs/plans/livepilot_creativity_plan.md`.
338
+
339
+ ---
340
+
3
341
  ## 1.17.5 — Classify error-only commit payloads as failures (April 23 2026)
4
342
 
5
343
  ### Fixed
package/README.md CHANGED
@@ -101,7 +101,7 @@ Most MCP servers are tool collections — they execute commands. LivePilot is an
101
101
 
102
102
  **MCP Server** (`mcp_server/`) — Python FastMCP server. Validates inputs, routes commands to the Remote Script over TCP, manages the M4L bridge, runs the atlas, sample engine, composer, and all intelligence engines. This is what your AI client connects to.
103
103
 
104
- **M4L Bridge** (`m4l_device/`) — Optional Max for Live Audio Effect on the master track. Provides deep LOM access through Max's LiveAPI that the ControlSurface API can't reach. UDP 9880 (M4L to server) carries spectral data and LiveAPI responses. OSC 9881 (server to M4L) sends commands. The 32 spectral/analyzer tools strictly require the bridge; device and sample tools that call the bridge also have graceful fallbacks, so core functionality works without it. Backed by 30 bridge commands for hidden parameters, Simpler internals, warp markers, display values, and Simpler warp / Compressor sidechain writes that live on child objects Python can't reach.
104
+ **M4L Bridge** (`m4l_device/`) — Optional Max for Live Audio Effect on the master track. Provides deep LOM access through Max's LiveAPI that the ControlSurface API can't reach. UDP 9880 (M4L to server) carries spectral data and LiveAPI responses. OSC 9881 (server to M4L) sends commands. The 32 spectral/analyzer tools strictly require the bridge; device and sample tools that call the bridge also have graceful fallbacks, so core functionality works without it. Backed by 31 bridge commands for hidden parameters, Simpler internals, warp markers, display values, and Simpler warp / Compressor sidechain writes that live on child objects Python can't reach.
105
105
 
106
106
  **Device Atlas** (`mcp_server/atlas/`) — In-memory indexed JSON database. 1305 devices with browser URIs, 120 enriched with YAML sonic intelligence profiles (mood, genre, texture, recommended chains). 6 indexes: by_id, by_name, by_uri, by_category, by_tag, by_genre. The AI never hallucinates a device name or preset — it always resolves against the atlas first.
107
107
 
Binary file
@@ -31,6 +31,11 @@ autowatch = 1;
31
31
  inlets = 2; // 0: OSC commands, 1: dspstate~ (sample rate)
32
32
  outlets = 2; // 0: to udpsend (responses), 1: to buffer~/status
33
33
 
34
+ // Single source of truth for the bridge version — bumped alongside the
35
+ // rest of the release manifest. Surfaced in the UI via messnamed("livepilot_version", ...)
36
+ // so the frozen .amxd visibly reports which build it was last exported from.
37
+ var VERSION = "1.17.5";
38
+
34
39
  // ── State ──────────────────────────────────────────────────────────────────
35
40
 
36
41
  var cursor_a = null; // Primary LiveAPI cursor
@@ -95,7 +100,13 @@ function anything() {
95
100
  function dispatch(cmd, args) {
96
101
  switch(cmd) {
97
102
  case "ping":
98
- send_response({"ok": true, "version": "1.17.5"});
103
+ send_response({"ok": true, "version": VERSION});
104
+ break;
105
+ case "get_version":
106
+ // Side-channel for the UI label — emits on the "livepilot_version"
107
+ // named bus so a [r livepilot_version] in the patcher can set a
108
+ // [comment] without touching the OSC response outlet.
109
+ messnamed("livepilot_version", VERSION);
99
110
  break;
100
111
  case "get_params":
101
112
  cmd_get_params(args);
@@ -1,2 +1,2 @@
1
1
  """LivePilot MCP Server — bridges MCP protocol to Ableton Live."""
2
- __version__ = "1.17.5"
2
+ __version__ = "1.18.1"
@@ -124,7 +124,18 @@ def propose_composer_branches(
124
124
 
125
125
  intent = parse_prompt(request_text)
126
126
 
127
- # Gate high-novelty strategies on freshness.
127
+ # v1.18.1 #9 fix: explicit count=3 overrides the freshness default.
128
+ # Pre-fix, count=3 at freshness=0.6 silently returned 2 (canonical +
129
+ # energy_shift only; layer_contrast was gated behind freshness>=0.7).
130
+ # Now: caller asking for all 3 strategies gets them by internally
131
+ # raising freshness to 0.7. Count=2 (the default) does NOT raise
132
+ # freshness — the freshness gate still caps at 1 on low-freshness
133
+ # runs, which is the documented "freshness cautiously shapes default
134
+ # strategy count" contract.
135
+ if count >= 3:
136
+ freshness = max(freshness, 0.7)
137
+
138
+ # Gate high-novelty strategies on (possibly-raised) freshness.
128
139
  if freshness < 0.4:
129
140
  strategies = [_STRATEGIES[0]] # canonical only
130
141
  elif freshness < 0.7:
@@ -172,6 +172,19 @@ SECTION_TEMPLATES: dict[str, list[dict]] = {
172
172
  {"name": "Drop 2", "bars": 16, "layers": ["drums", "bass", "lead", "percussion", "vocal", "texture"]},
173
173
  {"name": "Outro", "bars": 8, "layers": ["drums:-6dB", "texture", "pad"]},
174
174
  ],
175
+ # Dub techno — continuous-evolution aesthetic. No Drop structure, no
176
+ # Build/Break cycle. Section names reflect dub-techno arrangement idioms:
177
+ # slow reveal, subtraction before addition, return deeper not louder.
178
+ # Source: concepts/artists/basic-channel.yaml arrangement_idioms +
179
+ # live-verification finding from v1.18.0 CHANGELOG #2. v1.18.1 #2 fix.
180
+ "dub techno": [
181
+ {"name": "Dawn", "bars": 16, "layers": ["texture:-12dB"]},
182
+ {"name": "Pulse", "bars": 16, "layers": ["drums:-6dB", "texture"]},
183
+ {"name": "Chord", "bars": 32, "layers": ["drums", "bass", "pad:-6dB", "texture"]},
184
+ {"name": "Depth", "bars": 32, "layers": ["drums", "bass", "pad", "texture"]},
185
+ {"name": "Withdraw", "bars": 16, "layers": ["pad:-6dB", "texture:-6dB"]},
186
+ {"name": "Return", "bars": 16, "layers": ["texture:-12dB"]},
187
+ ],
175
188
  "house": [
176
189
  {"name": "Intro", "bars": 8, "layers": ["drums:-6dB", "pad"]},
177
190
  {"name": "Verse", "bars": 16, "layers": ["drums", "bass", "pad"]},
@@ -51,6 +51,13 @@ GENRE_DEFAULTS: dict[str, dict] = {
51
51
  "tempo": 128, "keys": ["Am", "Cm"], "energy": 0.7,
52
52
  "layers_min": 5, "layers_max": 7,
53
53
  },
54
+ # Dub techno is its own canonical genre — continuous-evolution aesthetic
55
+ # referencing Basic Channel / Rhythm & Sound / Gas. Previously aliased to
56
+ # "techno" which defaulted to Drop-based scaffolds (v1.18.1 #2 fix).
57
+ "dub techno": {
58
+ "tempo": 125, "keys": ["Am", "Em"], "energy": 0.4,
59
+ "layers_min": 3, "layers_max": 5,
60
+ },
54
61
  "house": {
55
62
  "tempo": 124, "keys": ["Cm", "Fm"], "energy": 0.6,
56
63
  "layers_min": 5, "layers_max": 6,
@@ -93,7 +100,11 @@ _GENRE_ALIASES: dict[str, str] = {
93
100
  "industrial techno": "techno",
94
101
  "minimal techno": "techno",
95
102
  "detroit techno": "techno",
96
- "dub techno": "techno",
103
+ # NOTE: "dub techno" is intentionally NOT aliased to "techno"
104
+ # it's now its own canonical genre with dub-appropriate defaults
105
+ # (see GENRE_DEFAULTS above) and a non-Drop section template (see
106
+ # layer_planner.SECTION_TEMPLATES). v1.18.1 #2 fix.
107
+ "dub-techno": "dub techno",
97
108
  }
98
109
 
99
110
 
@@ -244,18 +244,22 @@ def create_experiment(
244
244
 
245
245
  # ── Mode 2/3: legacy move_ids path ──────────────────────────────────
246
246
  if not move_ids:
247
- # Auto-propose moves from the registry
247
+ # Auto-propose moves from the registry by keyword overlap.
248
+ # v1.18.1 #1 fix: the previous selector indexed the first character
249
+ # of each move_id (a Python unpacking trap — the variable was
250
+ # already the full string, the [0] subscript sliced into it).
251
+ # Result pre-fix: single-char move_ids like 't', 'w', 'm' that
252
+ # failed at run_experiment with "Move t not found". Now the whole
253
+ # move_id string is kept.
248
254
  from ..semantic_moves import registry
249
- from ..semantic_moves.tools import propose_next_best_move
250
- # Use the propose function's logic directly
251
255
  all_moves = list(registry._REGISTRY.values())
252
256
  request_lower = request_text.lower()
253
- scored = []
257
+ request_words = set(request_lower.split())
258
+ scored: list[tuple[str, float]] = []
254
259
  for move in all_moves:
255
260
  score = 0.0
256
261
  move_words = set(move.move_id.replace("_", " ").split())
257
262
  intent_words = set(move.intent.lower().split())
258
- request_words = set(request_lower.split())
259
263
  overlap = request_words & (move_words | intent_words)
260
264
  score += len(overlap) * 0.3
261
265
  for dim in move.targets:
@@ -264,7 +268,7 @@ def create_experiment(
264
268
  if score > 0.1:
265
269
  scored.append((move.move_id, score))
266
270
  scored.sort(key=lambda x: -x[1])
267
- move_ids = [m[0] for m, _ in scored[:limit]] if scored else []
271
+ move_ids = [move_id for move_id, _ in scored[:limit]] if scored else []
268
272
 
269
273
  if not move_ids:
270
274
  return {"error": "No matching semantic moves found for this request"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "livepilot",
3
- "version": "1.17.5",
3
+ "version": "1.18.1",
4
4
  "mcpName": "io.github.dreamrec/livepilot",
5
5
  "description": "Agentic production system for Ableton Live 12 — 427 tools, 52 domains. Device atlas (1305 devices), sample engine (Splice + browser + filesystem), auto-composition, spectral perception, technique memory, creative intelligence (12 engines)",
6
6
  "author": "Pilot Studio",
@@ -5,7 +5,7 @@ Entry point for the ControlSurface. Ableton calls create_instance(c_instance)
5
5
  when this script is selected in Preferences > Link, Tempo & MIDI.
6
6
  """
7
7
 
8
- __version__ = "1.17.5"
8
+ __version__ = "1.18.1"
9
9
 
10
10
  from _Framework.ControlSurface import ControlSurface
11
11
  from . import router
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/dreamrec/LivePilot",
7
7
  "source": "github"
8
8
  },
9
- "version": "1.17.5",
9
+ "version": "1.18.1",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "livepilot",
14
- "version": "1.17.5",
14
+ "version": "1.18.1",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  }