livepilot 1.26.0 → 1.26.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 +24 -0
- package/README.md +1 -1
- package/installer/codex.js +87 -9
- package/livepilot/.Codex-plugin/plugin.json +8 -0
- package/livepilot/.claude-plugin/plugin.json +8 -0
- package/livepilot/.mcp.json +8 -0
- package/livepilot/agents/livepilot-producer/AGENT.md +314 -0
- package/livepilot/commands/arrange.md +47 -0
- package/livepilot/commands/beat.md +81 -0
- package/livepilot/commands/evaluate.md +49 -0
- package/livepilot/commands/memory.md +22 -0
- package/livepilot/commands/mix.md +47 -0
- package/livepilot/commands/perform.md +42 -0
- package/livepilot/commands/session.md +13 -0
- package/livepilot/commands/sounddesign.md +58 -0
- package/livepilot/rubrics/default_preset_check.md +82 -0
- package/livepilot/rubrics/layer_accumulation.md +79 -0
- package/livepilot/rubrics/layer_precision.md +79 -0
- package/livepilot/rubrics/modulation_presence.md +63 -0
- package/livepilot/rubrics/sound_design_depth.md +40 -0
- package/livepilot/skills/livepilot-arrangement/SKILL.md +164 -0
- package/livepilot/skills/livepilot-composition-engine/SKILL.md +151 -0
- package/livepilot/skills/livepilot-composition-engine/references/form-patterns.md +97 -0
- package/livepilot/skills/livepilot-composition-engine/references/transition-archetypes.md +102 -0
- package/livepilot/skills/livepilot-core/SKILL.md +261 -0
- package/livepilot/skills/livepilot-core/references/ableton-workflow-patterns.md +831 -0
- package/livepilot/skills/livepilot-core/references/affordances/_schema.md +160 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/auto-filter.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/chorus-ensemble.yaml +91 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/compressor.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/convolution-reverb.yaml +113 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/corpus.yaml +84 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/drift.yaml +105 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/echo.yaml +108 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/eq-eight.yaml +95 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/glue-compressor.yaml +88 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/granulator-iii.yaml +104 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/hybrid-reverb.yaml +83 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/operator.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/ping-pong-delay.yaml +104 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/poli.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/saturator.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/shifter.yaml +77 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/simpler.yaml +113 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/utility.yaml +95 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/vinyl-distortion.yaml +92 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/wavetable.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/artist-vocabularies.md +389 -0
- package/livepilot/skills/livepilot-core/references/automation-atlas.md +272 -0
- package/livepilot/skills/livepilot-core/references/concepts/_schema.md +158 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/akufen.yaml +116 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/aphex-twin.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/arca-sophie.yaml +131 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/autechre.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/basic-channel.yaml +140 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/basinski.yaml +126 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/boards-of-canada.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/burial.yaml +127 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/com-truise-tycho.yaml +121 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/daft-punk.yaml +117 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/dj-premier-rza.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/gas.yaml +134 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/hawtin.yaml +127 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/isolee-luomo.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/j-dilla.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/jeff-mills.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/johannsson-richter.yaml +132 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/madlib.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/moodymann-theo-parrish.yaml +121 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/oneohtrix-point-never.yaml +126 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/photek-source-direct.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/rashad-spinn-traxman.yaml +122 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/robert-henke.yaml +113 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/shackleton.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/skream-mala.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/stars-of-the-lid.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/tim-hecker.yaml +122 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/villalobos.yaml +135 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/ambient.yaml +137 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/boom_bap.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/deep-minimal.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/deep_house.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/detroit_techno.yaml +116 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/disco.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/downtempo.yaml +129 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/drone.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/drum-and-bass.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/dub-techno.yaml +132 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/dub.yaml +129 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/dubstep.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/experimental.yaml +136 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/footwork.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/hip-hop.yaml +132 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/house.yaml +126 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/hyperpop.yaml +128 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/idm.yaml +134 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/lo_fi.yaml +129 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/microhouse.yaml +138 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/minimal-techno.yaml +116 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/modern-classical.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/soul.yaml +125 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/synthwave.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/techno.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/trap.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/uk-garage.yaml +121 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/00-index.md +110 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/distortion-and-character.md +687 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/drums-and-percussion.md +753 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/dynamics-and-punch.md +525 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/eq-and-filtering.md +402 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/midi-tools.md +963 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/movement-and-modulation.md +874 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/space-and-depth.md +571 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/spectral-and-weird.md +714 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/synths-native.md +953 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/00-index.md +34 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/automation-as-music.md +204 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/chains-genre.md +173 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/creative-thinking.md +211 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/effects-distortion.md +188 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/effects-space.md +162 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/effects-spectral.md +229 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/instruments-synths.md +243 -0
- package/livepilot/skills/livepilot-core/references/genre-vocabularies.md +382 -0
- package/livepilot/skills/livepilot-core/references/m4l-devices.md +352 -0
- package/livepilot/skills/livepilot-core/references/memory-guide.md +178 -0
- package/livepilot/skills/livepilot-core/references/midi-recipes.md +402 -0
- package/livepilot/skills/livepilot-core/references/mixing-patterns.md +578 -0
- package/livepilot/skills/livepilot-core/references/overview.md +300 -0
- package/livepilot/skills/livepilot-core/references/pack-knowledge.md +319 -0
- package/livepilot/skills/livepilot-core/references/sample-manipulation.md +724 -0
- package/livepilot/skills/livepilot-core/references/sound-design-deep.md +140 -0
- package/livepilot/skills/livepilot-core/references/sound-design.md +393 -0
- package/livepilot/skills/livepilot-corpus-builder/SKILL.md +379 -0
- package/livepilot/skills/livepilot-creative-director/SKILL.md +455 -0
- package/livepilot/skills/livepilot-creative-director/references/anti-repetition-rules.md +214 -0
- package/livepilot/skills/livepilot-creative-director/references/creative-brief-template.md +222 -0
- package/livepilot/skills/livepilot-creative-director/references/hybrid-compilation.md +185 -0
- package/livepilot/skills/livepilot-creative-director/references/move-family-diversity-rule.md +258 -0
- package/livepilot/skills/livepilot-creative-director/references/phase-6-execution.md +409 -0
- package/livepilot/skills/livepilot-creative-director/references/the-four-move-rule.md +192 -0
- package/livepilot/skills/livepilot-devices/SKILL.md +213 -0
- package/livepilot/skills/livepilot-devices/references/load_browser_item-uri-grammar.md +82 -0
- package/livepilot/skills/livepilot-evaluation/SKILL.md +195 -0
- package/livepilot/skills/livepilot-evaluation/references/capability-modes.md +176 -0
- package/livepilot/skills/livepilot-evaluation/references/evaluation-contracts.md +121 -0
- package/livepilot/skills/livepilot-evaluation/references/memory-promotion.md +110 -0
- package/livepilot/skills/livepilot-mix-engine/SKILL.md +136 -0
- package/livepilot/skills/livepilot-mix-engine/references/mix-critics.md +143 -0
- package/livepilot/skills/livepilot-mix-engine/references/mix-moves.md +105 -0
- package/livepilot/skills/livepilot-mixing/SKILL.md +157 -0
- package/livepilot/skills/livepilot-notes/SKILL.md +130 -0
- package/livepilot/skills/livepilot-performance-engine/SKILL.md +122 -0
- package/livepilot/skills/livepilot-performance-engine/references/performance-safety.md +98 -0
- package/livepilot/skills/livepilot-release/SKILL.md +151 -0
- package/livepilot/skills/livepilot-sample-engine/SKILL.md +117 -0
- package/livepilot/skills/livepilot-sample-engine/references/sample-critics.md +87 -0
- package/livepilot/skills/livepilot-sample-engine/references/sample-philosophy.md +51 -0
- package/livepilot/skills/livepilot-sample-engine/references/sample-techniques.md +131 -0
- package/livepilot/skills/livepilot-sound-design-engine/SKILL.md +225 -0
- package/livepilot/skills/livepilot-sound-design-engine/references/patch-model.md +119 -0
- package/livepilot/skills/livepilot-sound-design-engine/references/sound-design-critics.md +118 -0
- package/livepilot/skills/livepilot-wonder/SKILL.md +143 -0
- package/m4l_device/LivePilot_Analyzer.amxd +0 -0
- package/m4l_device/LivePilot_Elektron.amxd +0 -0
- package/m4l_device/LivePilot_Elektron.maxpat +758 -0
- package/m4l_device/livepilot_bridge.js +1 -1
- package/m4l_device/livepilot_elektron_bridge.js +82 -0
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/composer/develop/apply.py +1 -1
- package/mcp_server/composer/full/apply.py +32 -6
- package/mcp_server/m4l_bridge.py +5 -0
- package/mcp_server/runtime/execution_router.py +6 -0
- package/mcp_server/runtime/mcp_dispatch.py +18 -0
- package/mcp_server/runtime/remote_commands.py +2 -0
- package/mcp_server/server.py +11 -7
- package/package.json +20 -5
- package/remote_script/LivePilot/__init__.py +1 -1
- package/remote_script/LivePilot/server.py +63 -2
- package/requirements.txt +3 -3
- package/server.json +3 -3
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: livepilot-devices
|
|
3
|
+
description: This skill should be used when the user asks to "load a device", "add an effect", "find a plugin", "device chain", "rack", "preset", "sound design setup", "load instrument", "find a synth", or wants to browse, load, and configure devices in Ableton Live.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Device Loading and Configuration
|
|
7
|
+
|
|
8
|
+
Load instruments, effects, and plugins into Ableton Live tracks. Every device operation follows one discipline: search first, verify after.
|
|
9
|
+
|
|
10
|
+
## Primary Workflow — Atlas-Driven
|
|
11
|
+
|
|
12
|
+
The device atlas contains 1,305 devices with sonic descriptions, recipes, and recommendations. Always start here:
|
|
13
|
+
|
|
14
|
+
1. **Discover:** `atlas_search(query)` — find devices by name, sound character, or genre
|
|
15
|
+
2. **Learn:** `atlas_device_info(device_id)` — full parameters, recipes, gotchas, pairings
|
|
16
|
+
3. **Suggest:** `atlas_suggest(intent, genre)` — "I need a warm pad" → ranked device+recipe combos
|
|
17
|
+
4. **Chain:** `atlas_chain_suggest(role, genre)` — full device chain for a track role (instrument + effects)
|
|
18
|
+
5. **Load:** Use the URI from atlas results → `load_browser_item(uri)` or `find_and_load_device(name)`
|
|
19
|
+
6. **Recipe:** Apply starter recipe params → `batch_set_parameters(params)` from the atlas entry
|
|
20
|
+
7. **Verify:** `get_device_info(track_index, device_index)` — check health flags
|
|
21
|
+
|
|
22
|
+
If the atlas doesn't have a device (newly installed plugin, user sample), fall back to the browser workflow below.
|
|
23
|
+
|
|
24
|
+
## Browser Workflow — The Fallback Path
|
|
25
|
+
|
|
26
|
+
Use the browser workflow when the atlas doesn't have what you need:
|
|
27
|
+
|
|
28
|
+
1. **Search:** `search_browser(path, name_filter)` — returns a list of matching items with exact URIs
|
|
29
|
+
2. **Inspect:** Read the results. Confirm the item name, type, and path match what you need
|
|
30
|
+
3. **Load:** `load_browser_item(uri)` — pass the exact URI string from search results
|
|
31
|
+
|
|
32
|
+
Common search paths:
|
|
33
|
+
- `path="Instruments"` — synths, samplers, instrument racks
|
|
34
|
+
- `path="Drums"` — drum racks, drum kits, percussion
|
|
35
|
+
- `path="Audio Effects"` — reverb, delay, compressor, EQ, saturator
|
|
36
|
+
- `path="MIDI Effects"` — arpeggiator, chord, scale, random
|
|
37
|
+
- `path="Sounds"` — preset sounds organized by category
|
|
38
|
+
- `path="Samples"` — audio samples, one-shots, loops
|
|
39
|
+
|
|
40
|
+
Combine path with `name_filter` to narrow results. Example: `search_browser(path="Drums", name_filter="808 Kit")`.
|
|
41
|
+
|
|
42
|
+
NEVER invent device or preset names. A hallucinated name like "echomorph-hpf" or "Drift Pad Wonk" will crash the load. Always search first, then use the exact URI from results.
|
|
43
|
+
|
|
44
|
+
For the full URI grammar reference (the three forms — FileId, bare-name, path-style — failure modes, and discovery recipe), see `references/load_browser_item-uri-grammar.md`.
|
|
45
|
+
|
|
46
|
+
## find_and_load_device — The Shortcut
|
|
47
|
+
|
|
48
|
+
Use `find_and_load_device(name)` ONLY for these simple built-in effects:
|
|
49
|
+
- "Reverb"
|
|
50
|
+
- "Delay"
|
|
51
|
+
- "Compressor"
|
|
52
|
+
- "EQ Eight"
|
|
53
|
+
- "Saturator"
|
|
54
|
+
- "Utility"
|
|
55
|
+
|
|
56
|
+
For everything else — instruments, racks, presets, AU/VST plugins — use the browser workflow. The shortcut matches greedily and can load a sample file instead of a synth when names overlap (e.g., "Drift" matches "Synth Bass Drift Pad Wonk Bass.wav" before the Drift synthesizer).
|
|
57
|
+
|
|
58
|
+
## Plugin Health Verification
|
|
59
|
+
|
|
60
|
+
After loading any device, verify it actually works:
|
|
61
|
+
|
|
62
|
+
1. Call `get_device_info(track_index, device_index)` on the newly loaded device
|
|
63
|
+
2. Check `parameter_count` — if the device is an AU/VST plugin (`class_name` contains "PluginDevice") and `parameter_count` is 1 or less, the plugin is dead. The shell loaded but the DSP engine crashed.
|
|
64
|
+
3. Check `health_flags` for `opaque_or_failed_plugin` (dead or untweakable AU/VST) or `sample_dependent` (needs source audio)
|
|
65
|
+
4. Check `plugin_host_status` and `mcp_sound_design_ready`
|
|
66
|
+
5. If `mcp_sound_design_ready` is `false`: delete the device with `delete_device`, replace it with a native Ableton alternative, and report the failure to the user
|
|
67
|
+
|
|
68
|
+
Dead plugin recovery pattern:
|
|
69
|
+
```
|
|
70
|
+
get_device_info → parameter_count <= 1 on PluginDevice?
|
|
71
|
+
→ delete_device(track_index, device_index)
|
|
72
|
+
→ search_browser for native alternative
|
|
73
|
+
→ load_browser_item with replacement URI
|
|
74
|
+
→ report failure and substitution to user
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Rack Introspection
|
|
78
|
+
|
|
79
|
+
Use `walk_device_tree(track_index)` to see the full nested structure of racks on a track — Instrument Racks, Audio Effect Racks, and Drum Racks with all their chains and sub-devices.
|
|
80
|
+
|
|
81
|
+
Use `get_rack_chains(track_index, device_index)` to inspect individual rack chain contents. For Drum Racks, this reveals which pads have samples loaded and which chains exist. An empty Drum Rack (zero chains) produces silence.
|
|
82
|
+
|
|
83
|
+
Set chain volumes with `set_chain_volume(track_index, device_index, chain_index, volume)` to balance rack layers.
|
|
84
|
+
|
|
85
|
+
## Drum Rack Rule
|
|
86
|
+
|
|
87
|
+
NEVER load a bare "Drum Rack" — it is an empty container with zero chains and produces silence. Always load a kit preset through the browser:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
search_browser(path="Drums", name_filter="Kit")
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Pick a real kit from results: "909 Core Kit", "808 Core Kit", "Boom Bap Kit", "Lo-Fi Kit", etc. These come pre-loaded with samples on their pads.
|
|
94
|
+
|
|
95
|
+
After loading any Drum Rack preset, verify with `get_rack_chains` that chains exist and have named pads like "Bass Drum", "Snare", "Hi-Hat".
|
|
96
|
+
|
|
97
|
+
## Custom Drum Rack Construction (build a kit from one-shots)
|
|
98
|
+
|
|
99
|
+
When the user asks for a custom kit ("build me a minimal-techno kit", "make a Dilla-style boom-bap kit from these samples"), use `add_drum_rack_pad` — NOT repeated `load_browser_item` calls.
|
|
100
|
+
|
|
101
|
+
**Why this matters (BUG-2026-04-22 #1):** Calling `load_browser_item` repeatedly on a track that contains a Drum Rack does NOT add new pads. The first call creates a chain at note 36; every subsequent call REPLACES the existing chain instead of appending to the next pad. After 7 sequential drops you end up with exactly 1 chain — only the last sample. This is a Live API limitation, not something to work around with retry loops.
|
|
102
|
+
|
|
103
|
+
**The canonical workflow:**
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
# 1. Make sure a Drum Rack exists on the track. Either:
|
|
107
|
+
# - Load a preset kit and clear it, or
|
|
108
|
+
# - insert_device(track_index=N, device_name="Drum Rack") for an empty rack
|
|
109
|
+
# 2. For each sample:
|
|
110
|
+
add_drum_rack_pad(
|
|
111
|
+
track_index=N,
|
|
112
|
+
pad_note=36, # 36=Kick, 38=Snare, 42=Closed HH, 46=Open HH
|
|
113
|
+
file_path="/abs/path/to/sample.wav",
|
|
114
|
+
)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
`add_drum_rack_pad` does the full atomic build per pad: insert_rack_chain → set_drum_chain_note → insert empty Simpler into the chain → load sample via the native Live 12.4 replace_sample API with nested addressing. Returns `{ok, chain_index, pad_note, nested_device_index}` so you can verify and chain further calls.
|
|
118
|
+
|
|
119
|
+
Requires Live 12.4+ (uses native nested-sample loading). On older versions returns an error directing the caller to the legacy separate-tracks workaround.
|
|
120
|
+
|
|
121
|
+
For nested-Simpler operations on existing pads (e.g., adjust loop points after the kit is built), `replace_simpler_sample` and `load_sample_to_simpler` accept `chain_index` and `nested_device_index` for explicit deep addressing.
|
|
122
|
+
|
|
123
|
+
## Sample-Dependent Devices
|
|
124
|
+
|
|
125
|
+
These devices load "successfully" with many parameters but produce zero audio without source material. Since MCP tools cannot load samples into third-party plugin UIs, NEVER use these as standalone instruments:
|
|
126
|
+
|
|
127
|
+
- **Granular synths:** iDensity, Tardigrain, Koala Sampler, Burns Audio Granular
|
|
128
|
+
- **Bare samplers:** Simpler (empty), Sampler (empty) — always load a preset, never the empty shell
|
|
129
|
+
- **Sample players:** AudioLayer, sEGments
|
|
130
|
+
|
|
131
|
+
Use self-contained synthesizers instead — these produce sound immediately from MIDI input alone:
|
|
132
|
+
- **Wavetable** — versatile wavetable synthesis
|
|
133
|
+
- **Operator** — FM synthesis, 4 operators
|
|
134
|
+
- **Drift** — analog-modeled, warm and organic
|
|
135
|
+
- **Analog** — subtractive analog modeling
|
|
136
|
+
- **Meld** — MPE-ready, two engines
|
|
137
|
+
- **Collision** — physical modeling, mallet/resonator
|
|
138
|
+
- **Tension** — physical modeling, string/exciter
|
|
139
|
+
|
|
140
|
+
If granular textures are needed: use Wavetable with aggressive wavetable position modulation, Operator with FM feedback and short envelopes, or load a Simpler/Sampler **preset** (not the bare instrument) from the Sounds browser.
|
|
141
|
+
|
|
142
|
+
## Simpler Operations
|
|
143
|
+
|
|
144
|
+
For Simpler devices that already have samples loaded:
|
|
145
|
+
|
|
146
|
+
- `load_sample_to_simpler(track_index, device_index, file_path)` — load audio into Simpler
|
|
147
|
+
- `replace_simpler_sample(track_index, device_index, file_path)` — swap the current sample. Only works on Simplers that already have a sample loaded.
|
|
148
|
+
- `crop_simpler(track_index, device_index)` — trim sample to current start/end points
|
|
149
|
+
- `reverse_simpler(track_index, device_index)` — reverse the loaded sample
|
|
150
|
+
- `get_simpler_slices(track_index, device_index)` — retrieve auto-detected slice points (Slice mode)
|
|
151
|
+
- `set_simpler_playback_mode(track_index, device_index, playback_mode)` — switch modes: 0=Classic, 1=One-Shot, 2=Slice. Optional: `slice_by` (0=Transient, 1=Beat, 2=Region, 3=Manual), `sensitivity` (0.0-1.0, Transient only)
|
|
152
|
+
- `warp_simpler(track_index, device_index, beats)` — warp sample to fit N beats
|
|
153
|
+
|
|
154
|
+
### Slice Workflow
|
|
155
|
+
|
|
156
|
+
For slice-based production, use `plan_slice_workflow`:
|
|
157
|
+
1. `plan_slice_workflow(file_path=..., intent="rhythm")` — generates a complete workflow with Simpler setup, slice mapping, and MIDI notes
|
|
158
|
+
2. Intents: `rhythm`, `hook`, `texture`, `percussion`, `melodic`
|
|
159
|
+
3. The tool returns a step-by-step plan — execute each tool call in sequence
|
|
160
|
+
|
|
161
|
+
Manual slice workflow: load sample → `set_simpler_playback_mode(playback_mode=2)` → `get_simpler_slices` → program MIDI notes targeting slice indices (C3 = slice 0, C#3 = slice 1, etc.)
|
|
162
|
+
|
|
163
|
+
### New Device Operations (12.3+)
|
|
164
|
+
|
|
165
|
+
- `insert_device(track_index, device_name)` — insert native device by name (10x faster than browser, 12.3+)
|
|
166
|
+
- `insert_rack_chain(track_index, device_index)` — add chain to Instrument/Audio/Drum Rack
|
|
167
|
+
- `set_drum_chain_note(track_index, device_index, chain_index, note)` — assign MIDI note to Drum Rack chain
|
|
168
|
+
- `add_drum_rack_pad(track_index, pad_note, file_path)` — atomic single-pad build (chain + note + Simpler + sample). 12.4+. Use this for custom kit construction; see the "Custom Drum Rack Construction" section above.
|
|
169
|
+
- `move_device(track_index, device_index, new_index)` — reorder devices on a track
|
|
170
|
+
|
|
171
|
+
### Plugin Deep Control
|
|
172
|
+
|
|
173
|
+
- `get_plugin_parameters(track_index, device_index)` — all AU/VST plugin parameters
|
|
174
|
+
- `map_plugin_parameter(track_index, device_index, parameter_index)` — map for automation
|
|
175
|
+
- `get_plugin_presets(track_index, device_index)` — list plugin presets
|
|
176
|
+
|
|
177
|
+
## Parameter Name Quirks (BUG-2026-04-22 #10)
|
|
178
|
+
|
|
179
|
+
Ableton's parameter names are inconsistent across devices. When `set_device_parameter` or `batch_set_parameters` errors with "Parameter 'X' not found," the response already lists the first 20 available names — read it and pick the right one. Common surprises:
|
|
180
|
+
|
|
181
|
+
| You'd expect | Actual name | Where |
|
|
182
|
+
|---|---|---|
|
|
183
|
+
| `Width` | `Stereo Width` | Utility |
|
|
184
|
+
| `Cutoff` | `Filter Freq` / `Frequency` | Various filters — check per-device |
|
|
185
|
+
| `Resonance` | `Filter Resonance` / `Q` | Same |
|
|
186
|
+
| `Drive` | `Drive` (Saturator) but `Drive Amount` (some racks) | Saturator vs racks |
|
|
187
|
+
| `Mix` | `Dry/Wet` | Almost every native effect |
|
|
188
|
+
| `Volume` | `Volume` (mixer) but `Sample Volume` / `Out Volume` | On certain devices |
|
|
189
|
+
|
|
190
|
+
When in doubt, call `get_device_parameters(track_index, device_index)` first — it returns the exact `name` of every parameter and the `name` field is what `set_device_parameter` accepts.
|
|
191
|
+
|
|
192
|
+
## Effect Chain Best Practices
|
|
193
|
+
|
|
194
|
+
After loading any effect, verify its key parameters are not at pass-through defaults:
|
|
195
|
+
- **Reverb:** `Dry/Wet` should be > 0 (typically 20-40% for subtle, 60-100% for creative)
|
|
196
|
+
- **Delay:** `Dry/Wet` > 0, `Feedback` set appropriately
|
|
197
|
+
- **Compressor:** `Threshold` below signal level, `Ratio` > 1:1
|
|
198
|
+
- **EQ Eight:** At least one band with non-zero gain
|
|
199
|
+
- **Saturator:** `Drive` > 0 dB
|
|
200
|
+
- **Utility:** `Gain` at target value, `Width` as needed
|
|
201
|
+
|
|
202
|
+
Use `get_device_parameters` to read current values, then `set_device_parameter` or `batch_set_parameters` to configure. Use `toggle_device` to bypass/enable devices for A/B comparison.
|
|
203
|
+
|
|
204
|
+
## Device Presets
|
|
205
|
+
|
|
206
|
+
- `get_device_presets(track_index, device_index)` — list available presets for the loaded device
|
|
207
|
+
- `get_plugin_parameters(track_index, device_index)` — see all AU/VST plugin parameters
|
|
208
|
+
- `get_plugin_presets(track_index, device_index)` — list presets for AU/VST plugins
|
|
209
|
+
- `map_plugin_parameter(track_index, device_index, parameter_index)` — map a plugin parameter for automation
|
|
210
|
+
|
|
211
|
+
## Device Atlas Reference
|
|
212
|
+
|
|
213
|
+
Consult `references/device-atlas/` in the livepilot-core skill for the full corpus of 280+ instruments, 139 drum kits, and 350+ impulse responses. The atlas contains real browser URIs, preset names, and sonic descriptions. Use it as your lookup table before loading any device — never guess a name that is not in the atlas or in browser search results.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# `load_browser_item` URI Grammar
|
|
2
|
+
|
|
3
|
+
> Reference for the URI strings accepted by `load_browser_item(track_index, uri, ...)`.
|
|
4
|
+
> Resolves the BUG-2026-04-22 #14 friction (URI format was undocumented and required reverse-engineering).
|
|
5
|
+
|
|
6
|
+
## TL;DR
|
|
7
|
+
|
|
8
|
+
URIs are produced by `search_browser` / `get_browser_items` / `get_browser_tree` — never invent them by hand. The format is `query:<Top-Level-Folder>#<Item-Identifier>`. Three known forms in the wild:
|
|
9
|
+
|
|
10
|
+
| Form | Example | When you'll see it |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| **File ID** | `query:Drums#FileId_29738` | Browser items that resolve to a file in Live's installed packs (samples, presets, kits). The numeric FileId is stable across sessions on the same machine. |
|
|
13
|
+
| **Bare name** | `query:Synths#Operator` | Native devices and effects whose name is unique within the folder. Most built-in instruments. |
|
|
14
|
+
| **Path-like** | `query:UserLibrary#Samples:Splice:Filename.wav` | Items inside the User Library or other deep folder paths. The fragment uses `:` as a path separator within the URI's hash. |
|
|
15
|
+
|
|
16
|
+
## Discovery recipe
|
|
17
|
+
|
|
18
|
+
You almost never need to construct a URI from scratch. Always:
|
|
19
|
+
|
|
20
|
+
1. **Search:** `search_browser(path="Drums", name_filter="909 Core")` — returns each match with its exact `uri` field.
|
|
21
|
+
2. **Or browse:** `get_browser_tree()` for the top-level structure; `get_browser_items(path="Drums")` to drill down. Items include their URI.
|
|
22
|
+
3. **Use the URI verbatim:** pass the exact string from the result to `load_browser_item(uri=...)`. Do not modify, normalize, or reconstruct it.
|
|
23
|
+
|
|
24
|
+
## Why three forms exist
|
|
25
|
+
|
|
26
|
+
Live's browser is backed by multiple resolvers under the hood:
|
|
27
|
+
|
|
28
|
+
- **Pack content** is keyed by an internal FileId from a per-machine SQLite index — fast lookup, opaque names.
|
|
29
|
+
- **Native devices** are addressed by their stable English class name within their folder.
|
|
30
|
+
- **User Library / Samples** items use a path-style fragment because they're filesystem-rooted, not pack-indexed.
|
|
31
|
+
|
|
32
|
+
The URI you receive from search/browse already has the correct form for that item — there is no "preferred" or "canonical" form, only "the one Live's browser knows."
|
|
33
|
+
|
|
34
|
+
## What goes wrong if you guess
|
|
35
|
+
|
|
36
|
+
- **Guessed FileId**: silently fails or loads the wrong sample.
|
|
37
|
+
- **Guessed bare name** for a non-unique item: loads whatever Live's matcher hits first (e.g., `query:Synths#Drift` may match a `Drift Pad Wonk Bass.wav` sample before the `Drift` synth — see the `find_and_load_device` warning in `livepilot-devices` SKILL).
|
|
38
|
+
- **Path with wrong separator** (using `/` instead of `:`): URI parses but resolves to nothing.
|
|
39
|
+
- **Stale FileId** copied from a different machine: stale FileIds aren't portable.
|
|
40
|
+
|
|
41
|
+
## Top-level folders (current Live 12.4)
|
|
42
|
+
|
|
43
|
+
| Folder | Typical content |
|
|
44
|
+
|---|---|
|
|
45
|
+
| `Sounds` | Genre-organized presets across all native synths |
|
|
46
|
+
| `Drums` | Drum Racks, drum kits, percussion one-shots |
|
|
47
|
+
| `Instruments` | Synths, samplers, instrument racks (top-level entries) |
|
|
48
|
+
| `Audio Effects` | Reverb, delay, compressor, EQ, saturator, etc. |
|
|
49
|
+
| `MIDI Effects` | Arpeggiator, chord, scale, random, MPE Tools |
|
|
50
|
+
| `Max for Live` | Native + installed M4L devices |
|
|
51
|
+
| `Plug-ins` | Installed AU/VST plugins |
|
|
52
|
+
| `Clips` | Sample loops + MIDI clips that ship with packs |
|
|
53
|
+
| `Samples` | The big one — ~22,000 individual audio files |
|
|
54
|
+
| `Packs` | Pack-level entries that resolve to internal preset/sample lists |
|
|
55
|
+
| `User Library` | Your personal saved devices, racks, samples, sets |
|
|
56
|
+
| `Current Project` | Items in the current Live set's project folder |
|
|
57
|
+
|
|
58
|
+
## Behaviour after load (BUG-2026-04-22 #16)
|
|
59
|
+
|
|
60
|
+
`load_browser_item` is context-dependent — same URI, different result:
|
|
61
|
+
|
|
62
|
+
- **Empty track:** creates a Simpler with the sample loaded (instruments load directly).
|
|
63
|
+
- **Track with an instrument already:** drops the new device after the existing one (Live's "load to selected" behavior).
|
|
64
|
+
- **Track with a Drum Rack:** the FIRST `load_browser_item` of a sample creates a chain on note 36; **every subsequent call REPLACES that chain** instead of appending to the next pad. To build a kit pad-by-pad, use `add_drum_rack_pad(track_index, pad_note, file_path)` instead — it does the chain + note + Simpler + sample sequence atomically per pad.
|
|
65
|
+
|
|
66
|
+
See the "Custom Drum Rack Construction" section in `livepilot-devices` SKILL for the canonical kit-build flow.
|
|
67
|
+
|
|
68
|
+
## Role-aware defaults (BUG-2026-04-22 #17 + #18)
|
|
69
|
+
|
|
70
|
+
`load_browser_item(role=...)` applies post-load Simpler defaults so the loaded sample plays correctly without per-bug-memory hand-tweaking:
|
|
71
|
+
|
|
72
|
+
| Role | Snap | Volume | Trigger Mode | Root note |
|
|
73
|
+
|---|---|---|---|---|
|
|
74
|
+
| `"drum"` | 0 | 0 dB | 0 (Trigger / one-shot) | C1 (36) |
|
|
75
|
+
| `"melodic"` | 1 | 0 dB | 1 (Gate / held) | C3 (60) |
|
|
76
|
+
| `"texture"` | 0 | -6 dB | 1 (Gate) | C3 (60) |
|
|
77
|
+
|
|
78
|
+
Omit `role` to keep Live's raw defaults (Volume=-12 dB, Snap=1, root=C3). Useful when loading a non-Simpler device or when you want the legacy behavior.
|
|
79
|
+
|
|
80
|
+
## Trigger Mode polarity (BUG-2026-04-22 #9)
|
|
81
|
+
|
|
82
|
+
Reverse from intuition: `Trigger Mode value=0` is **Trigger** (one-shot), `value=1` is **Gate** (held). The `role="drum"` default sets it to 0, the others to 1.
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: livepilot-evaluation
|
|
3
|
+
description: This skill should be used when the user asks to "evaluate a change", "was that good", "keep or undo", "A/B compare", "rate my change", "check if that helped", or wants to use the universal evaluation loop to judge production moves.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Evaluation Engine — Universal Move Judgment
|
|
7
|
+
|
|
8
|
+
The evaluation engine is the shared decision layer used by all other engines (mix, sound design, composition, performance). It determines whether a change improved the session, and whether to keep it, undo it, or learn from it.
|
|
9
|
+
|
|
10
|
+
## The Universal Evaluation Loop
|
|
11
|
+
|
|
12
|
+
Every production move follows this loop regardless of which engine initiated it.
|
|
13
|
+
|
|
14
|
+
### Step 1 — Compile Goal Vector
|
|
15
|
+
|
|
16
|
+
Call `compile_goal_vector(request_text, targets, protect, mode, aggression)` to establish what you are trying to achieve.
|
|
17
|
+
|
|
18
|
+
**request_text**: a plain-text description of the intended improvement (e.g., "reduce masking between bass and kick in 100-200 Hz range").
|
|
19
|
+
|
|
20
|
+
**targets**: dict of dimension → weight (e.g., `{"punch": 0.4, "weight": 0.3, "clarity": 0.3}`). Weights are normalized to sum to 1.0.
|
|
21
|
+
|
|
22
|
+
**Valid dimensions split into two families:**
|
|
23
|
+
|
|
24
|
+
**Family A — Technical / measurable** (derived from spectrum, RMS, LUFS, masking reports):
|
|
25
|
+
energy, punch, weight, density, brightness, warmth, width, depth, motion, contrast, clarity, cohesion, groove, tension, novelty, polish, emotion.
|
|
26
|
+
|
|
27
|
+
**Family B — Artistic / identity** (derived from concept packets, motif graphs, section labels, taste graphs): required on any goal vector invoked by `livepilot-creative-director`:
|
|
28
|
+
- **style_fit** — how well the result matches the concept packet's sonic_identity
|
|
29
|
+
- **distinctiveness** — how much the result differs from the baseline completion pattern
|
|
30
|
+
- **motif_coherence** — whether recurring motifs survive / evolve meaningfully
|
|
31
|
+
- **section_contrast** — whether section-level differences stay legible
|
|
32
|
+
- **restraint** — whether the result respects protected qualities and avoids additive drift
|
|
33
|
+
- **surprise_without_breakage** — whether novelty was introduced without violating identity
|
|
34
|
+
|
|
35
|
+
Both families share the same 0.0 – 1.0 scale. A technically improved result can still be artistically worse — both must pass for a creative-director turn to be kept.
|
|
36
|
+
|
|
37
|
+
**protect**: dict of dimension → minimum threshold (e.g., `{"clarity": 0.7}`). If a dimension drops below this value after a move, the move is undone.
|
|
38
|
+
|
|
39
|
+
**Modes** control how aggressively you act:
|
|
40
|
+
|
|
41
|
+
- `observe` — read-only analysis, no changes. Use for diagnostics and status checks.
|
|
42
|
+
- `improve` — targeted fixes for specific issues. The default mode. Make the smallest change that addresses the problem.
|
|
43
|
+
- `explore` — creative experimentation. Wider parameter ranges, more tolerance for unexpected results. Use when the user says "try something", "experiment", or "surprise me".
|
|
44
|
+
- `finish` — polish and finalize. Conservative moves only, protect what already works. Use when the user says "almost done", "final touches", or "wrap it up".
|
|
45
|
+
- `diagnose` — identify problems without fixing them. Like observe but with critic analysis. Use when the user says "what's wrong" without asking for fixes.
|
|
46
|
+
|
|
47
|
+
### Step 2 — Build World Model
|
|
48
|
+
|
|
49
|
+
Call `build_world_model` to snapshot the current session state and available capabilities:
|
|
50
|
+
|
|
51
|
+
- Session info: tracks, clips, devices, tempo, time signature
|
|
52
|
+
- Capability state: analyzer connected, M4L bridge active, FluCoMa available
|
|
53
|
+
- Recent actions: last moves taken and their outcomes
|
|
54
|
+
- Active constraints: performance mode safety limits, user anti-preferences
|
|
55
|
+
|
|
56
|
+
The world model determines what tools are available and what measurements are possible.
|
|
57
|
+
|
|
58
|
+
### Step 3 — Get Turn Budget
|
|
59
|
+
|
|
60
|
+
Call `get_turn_budget(mode)` to determine how many moves you should make this turn:
|
|
61
|
+
|
|
62
|
+
- `observe` / `diagnose`: 0 moves (read-only)
|
|
63
|
+
- `improve`: 1-3 moves per turn, evaluate after each
|
|
64
|
+
- `explore`: 1-5 moves per turn, wider tolerance
|
|
65
|
+
- `finish`: 1 move per turn, strict evaluation
|
|
66
|
+
|
|
67
|
+
Do not exceed the turn budget. If more work is needed, complete the current turn, report progress, and start a new turn.
|
|
68
|
+
|
|
69
|
+
### Step 4 — Capture Before
|
|
70
|
+
|
|
71
|
+
Take measurements appropriate to the engine context:
|
|
72
|
+
|
|
73
|
+
- **Mix engine**: `get_master_spectrum` + `get_master_rms`
|
|
74
|
+
- **Sound design**: `get_device_parameters` + `get_master_spectrum`
|
|
75
|
+
- **Composition**: `get_notes` or `get_arrangement_notes` + `get_section_graph`
|
|
76
|
+
- **Universal**: `get_mix_snapshot` for full session state
|
|
77
|
+
|
|
78
|
+
Always capture before executing. Without a before snapshot, evaluation is meaningless.
|
|
79
|
+
|
|
80
|
+
### Step 5 — Execute Intervention
|
|
81
|
+
|
|
82
|
+
Apply the planned change using the appropriate tool. Execute exactly one move, then proceed to evaluation.
|
|
83
|
+
|
|
84
|
+
### Step 6 — Capture After
|
|
85
|
+
|
|
86
|
+
Repeat the same measurements from Step 4. Use identical tool calls to ensure comparable data.
|
|
87
|
+
|
|
88
|
+
### Step 7 — Evaluate
|
|
89
|
+
|
|
90
|
+
Call the appropriate evaluator:
|
|
91
|
+
|
|
92
|
+
- `evaluate_move(goal_vector, before_snapshot, after_snapshot)` — universal evaluator. `goal_vector` is the dict returned by `compile_goal_vector`. Snapshots should contain `spectrum` (9-band dict sub_low → air, or 8-band from pre-v1.16 .amxd builds), `rms`, `peak`.
|
|
93
|
+
- `evaluate_mix_move(before_snapshot, after_snapshot, targets, protect)` — mix-specific with protection constraints. `targets` and `protect` are dicts of dimension → weight/threshold.
|
|
94
|
+
- `evaluate_composition_move(before_snapshot, after_snapshot, goal_vector)` — composition-specific
|
|
95
|
+
- `evaluate_with_fabric(engine, before_snapshot, after_snapshot, targets, protect)` — routes to the appropriate engine-specific evaluator. `engine` must be one of: `"sonic"`, `"composition"`, `"mix"`, `"transition"`, `"translation"`.
|
|
96
|
+
|
|
97
|
+
### Step 8 — Read the Verdict
|
|
98
|
+
|
|
99
|
+
Every evaluator returns:
|
|
100
|
+
|
|
101
|
+
- `keep_change` (bool): whether the change should stay
|
|
102
|
+
- `score` (0.0-1.0): magnitude of improvement (0.5 = neutral, >0.5 = better, <0.5 = worse)
|
|
103
|
+
- `goal_progress` (0.0-1.0): how much closer to the stated goal
|
|
104
|
+
- `collateral_damage` (list): things that got worse as a side effect
|
|
105
|
+
- `explanation` (string): human-readable judgment summary
|
|
106
|
+
|
|
107
|
+
### Step 8b — Creative-Success Verdict (for creative-director turns)
|
|
108
|
+
|
|
109
|
+
When the evaluation is invoked by `livepilot-creative-director`, also
|
|
110
|
+
assign one of five verdict tags. This is a structured classification
|
|
111
|
+
on top of `keep_change` / `score`, for learning and debugging:
|
|
112
|
+
|
|
113
|
+
| Verdict | Meaning | Technical score | Artistic score | User kept | Action |
|
|
114
|
+
|---|---|---|---|---|---|
|
|
115
|
+
| `safe_win` | Low-novelty move that landed cleanly | ≥ 0.6 | ≥ 0.55 | yes | Memory-learn candidate. Use as baseline for future similar asks. |
|
|
116
|
+
| `bold_win` | High-novelty move that landed and stuck | ≥ 0.55 | ≥ 0.65 | yes | STRONG memory-learn candidate. Surface when user asks for similar in the future. |
|
|
117
|
+
| `interesting_failure` | Novel, didn't land technically, but user kept for study | < 0.55 | ≥ 0.60 | yes | Note in memory but DO NOT promote for auto-replay. User keeping it ≠ reusability. |
|
|
118
|
+
| `identity_break` | Technically OK but violated protected qualities | ≥ 0.55 | < 0.45 | no | Auto-undo. `record_anti_preference` with the protected quality that was violated. |
|
|
119
|
+
| `generic_fallback` | Both scores ≤ mid, collapsed to a default pattern | < 0.55 | < 0.55 | no | Auto-undo. This is the "stuck in patterns" signature. `record_anti_preference` with the family+target combo. |
|
|
120
|
+
|
|
121
|
+
Include the verdict in `memory_learn` payload so future sessions can
|
|
122
|
+
filter by type. The director's Phase 8 uses these tags explicitly.
|
|
123
|
+
|
|
124
|
+
### Step 9 — Keep or Undo
|
|
125
|
+
|
|
126
|
+
If `keep_change` is `false`:
|
|
127
|
+
1. Call `undo()` immediately
|
|
128
|
+
2. Report to the user: what was tried, why it was undone, citing `collateral_damage`
|
|
129
|
+
3. Consider an alternative approach for the same goal
|
|
130
|
+
|
|
131
|
+
If `keep_change` is `true`:
|
|
132
|
+
1. Report the improvement with score and explanation
|
|
133
|
+
2. If `score > 0.7`, this is a memory promotion candidate (see below)
|
|
134
|
+
|
|
135
|
+
### Step 10 — Repeat or Stop
|
|
136
|
+
|
|
137
|
+
Check turn budget remaining. If budget allows and goal_progress < 1.0, return to Step 4 for the next move. Otherwise, summarize progress and stop.
|
|
138
|
+
|
|
139
|
+
## Capability Modes
|
|
140
|
+
|
|
141
|
+
The world model includes a capability state that affects what measurements are available. Call `get_capability_state` to check.
|
|
142
|
+
|
|
143
|
+
### normal
|
|
144
|
+
Full measured evaluation. M4L analyzer connected, all spectral/RMS/key tools available. Critics use real data. This is the best mode.
|
|
145
|
+
|
|
146
|
+
### measured_degraded
|
|
147
|
+
Analyzer data is stale (older than 5 seconds) or intermittent. Measurements may not reflect current state. Re-trigger analysis before trusting cached values. Inform the user that data freshness is limited.
|
|
148
|
+
|
|
149
|
+
### judgment_only
|
|
150
|
+
No analyzer connected. Evaluation relies on device parameter changes, track structure, and role-based heuristics. Critics cannot use spectral evidence. Inform the user: "Evaluation is based on parameter analysis only — spectral verification unavailable."
|
|
151
|
+
|
|
152
|
+
### read_only
|
|
153
|
+
Session disconnected or in an error state. No tools can modify the session. Only read operations from cached data. Inform the user and suggest reconnecting.
|
|
154
|
+
|
|
155
|
+
## Action Ledger
|
|
156
|
+
|
|
157
|
+
Every move is recorded in the action ledger for accountability and learning.
|
|
158
|
+
|
|
159
|
+
- `get_action_ledger_summary` — summary of all actions taken this session with scores
|
|
160
|
+
- `get_recent_actions` — last N actions with full detail
|
|
161
|
+
- `get_last_move` — the most recent action and its evaluation result
|
|
162
|
+
|
|
163
|
+
Use the ledger to avoid repeating failed approaches. If a move type has been undone twice for the same issue, try a different strategy.
|
|
164
|
+
|
|
165
|
+
## Memory Promotion
|
|
166
|
+
|
|
167
|
+
Successful moves can be promoted to persistent memory for future sessions.
|
|
168
|
+
|
|
169
|
+
- `get_promotion_candidates` — list moves from this session that scored > 0.7 and are eligible for saving
|
|
170
|
+
- `memory_learn(name, type, qualities, payload, tags)` — save a technique to memory. `type` must be one of: `beat_pattern`, `device_chain`, `mix_template`, `browser_pin`, `preference`. `qualities` must include a `summary` field. `payload` contains the technique data.
|
|
171
|
+
- `record_anti_preference(dimension, direction)` — record something the user explicitly rejected. `dimension` is the quality axis (e.g., "brightness", "width"), `direction` must be `"increase"` or `"decrease"`. This ensures the rejected direction is never suggested again.
|
|
172
|
+
|
|
173
|
+
### Promotion Rules
|
|
174
|
+
|
|
175
|
+
1. Only promote moves the user confirmed satisfaction with — a high score alone is not enough
|
|
176
|
+
2. Anti-preferences are permanent until explicitly deleted
|
|
177
|
+
3. Check `get_anti_preferences` before suggesting any move to avoid repeating rejected ideas
|
|
178
|
+
4. Promotion is optional — never force it. Suggest when appropriate: "That scored 0.85 — want me to save this technique for future sessions?"
|
|
179
|
+
5. **For creative-director turns**, apply the verdict-driven promotion rubric:
|
|
180
|
+
- `safe_win` → promote if user keeps ≥ 2 subsequent turns (avoid over-promoting minor moves)
|
|
181
|
+
- `bold_win` → promote immediately; tag with concept packet + novelty_budget context
|
|
182
|
+
- `interesting_failure` → DO NOT auto-promote; store as a "curiosity" note only
|
|
183
|
+
- `identity_break` → NEVER promote; `record_anti_preference` instead
|
|
184
|
+
- `generic_fallback` → NEVER promote; `record_anti_preference` with family+target combo
|
|
185
|
+
- See `livepilot-core/references/memory-guide.md` for the full promotion rubric.
|
|
186
|
+
|
|
187
|
+
## A/B Comparison
|
|
188
|
+
|
|
189
|
+
When the user asks "was that good?" or "A/B compare":
|
|
190
|
+
|
|
191
|
+
1. The before snapshot is A, the after snapshot is B
|
|
192
|
+
2. Call the evaluator to get the score
|
|
193
|
+
3. Present the comparison: "Before: [metrics]. After: [metrics]. Score: [score]. [explanation]"
|
|
194
|
+
4. If the user prefers A, call `undo()` to revert to it
|
|
195
|
+
5. If the user prefers B, keep the current state
|