livepilot 1.26.0 → 1.26.2

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.
Files changed (191) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +1 -1
  3. package/installer/codex.js +87 -9
  4. package/livepilot/.Codex-plugin/plugin.json +8 -0
  5. package/livepilot/.claude-plugin/plugin.json +8 -0
  6. package/livepilot/.mcp.json +8 -0
  7. package/livepilot/agents/livepilot-producer/AGENT.md +314 -0
  8. package/livepilot/commands/arrange.md +47 -0
  9. package/livepilot/commands/beat.md +81 -0
  10. package/livepilot/commands/evaluate.md +51 -0
  11. package/livepilot/commands/memory.md +22 -0
  12. package/livepilot/commands/mix.md +47 -0
  13. package/livepilot/commands/perform.md +42 -0
  14. package/livepilot/commands/session.md +13 -0
  15. package/livepilot/commands/sounddesign.md +58 -0
  16. package/livepilot/rubrics/default_preset_check.md +82 -0
  17. package/livepilot/rubrics/layer_accumulation.md +79 -0
  18. package/livepilot/rubrics/layer_precision.md +79 -0
  19. package/livepilot/rubrics/modulation_presence.md +63 -0
  20. package/livepilot/rubrics/sound_design_depth.md +40 -0
  21. package/livepilot/skills/livepilot-arrangement/SKILL.md +164 -0
  22. package/livepilot/skills/livepilot-composition-engine/SKILL.md +151 -0
  23. package/livepilot/skills/livepilot-composition-engine/references/form-patterns.md +97 -0
  24. package/livepilot/skills/livepilot-composition-engine/references/transition-archetypes.md +102 -0
  25. package/livepilot/skills/livepilot-core/SKILL.md +261 -0
  26. package/livepilot/skills/livepilot-core/references/ableton-workflow-patterns.md +831 -0
  27. package/livepilot/skills/livepilot-core/references/affordances/_schema.md +160 -0
  28. package/livepilot/skills/livepilot-core/references/affordances/devices/auto-filter.yaml +133 -0
  29. package/livepilot/skills/livepilot-core/references/affordances/devices/chorus-ensemble.yaml +91 -0
  30. package/livepilot/skills/livepilot-core/references/affordances/devices/compressor.yaml +98 -0
  31. package/livepilot/skills/livepilot-core/references/affordances/devices/convolution-reverb.yaml +113 -0
  32. package/livepilot/skills/livepilot-core/references/affordances/devices/corpus.yaml +84 -0
  33. package/livepilot/skills/livepilot-core/references/affordances/devices/drift.yaml +105 -0
  34. package/livepilot/skills/livepilot-core/references/affordances/devices/echo.yaml +108 -0
  35. package/livepilot/skills/livepilot-core/references/affordances/devices/eq-eight.yaml +95 -0
  36. package/livepilot/skills/livepilot-core/references/affordances/devices/glue-compressor.yaml +88 -0
  37. package/livepilot/skills/livepilot-core/references/affordances/devices/granulator-iii.yaml +104 -0
  38. package/livepilot/skills/livepilot-core/references/affordances/devices/hybrid-reverb.yaml +83 -0
  39. package/livepilot/skills/livepilot-core/references/affordances/devices/operator.yaml +98 -0
  40. package/livepilot/skills/livepilot-core/references/affordances/devices/ping-pong-delay.yaml +104 -0
  41. package/livepilot/skills/livepilot-core/references/affordances/devices/poli.yaml +98 -0
  42. package/livepilot/skills/livepilot-core/references/affordances/devices/saturator.yaml +98 -0
  43. package/livepilot/skills/livepilot-core/references/affordances/devices/shifter.yaml +77 -0
  44. package/livepilot/skills/livepilot-core/references/affordances/devices/simpler.yaml +113 -0
  45. package/livepilot/skills/livepilot-core/references/affordances/devices/utility.yaml +95 -0
  46. package/livepilot/skills/livepilot-core/references/affordances/devices/vinyl-distortion.yaml +92 -0
  47. package/livepilot/skills/livepilot-core/references/affordances/devices/wavetable.yaml +98 -0
  48. package/livepilot/skills/livepilot-core/references/artist-vocabularies.md +389 -0
  49. package/livepilot/skills/livepilot-core/references/automation-atlas.md +272 -0
  50. package/livepilot/skills/livepilot-core/references/concepts/_schema.md +158 -0
  51. package/livepilot/skills/livepilot-core/references/concepts/artists/akufen.yaml +116 -0
  52. package/livepilot/skills/livepilot-core/references/concepts/artists/aphex-twin.yaml +133 -0
  53. package/livepilot/skills/livepilot-core/references/concepts/artists/arca-sophie.yaml +131 -0
  54. package/livepilot/skills/livepilot-core/references/concepts/artists/autechre.yaml +130 -0
  55. package/livepilot/skills/livepilot-core/references/concepts/artists/basic-channel.yaml +140 -0
  56. package/livepilot/skills/livepilot-core/references/concepts/artists/basinski.yaml +126 -0
  57. package/livepilot/skills/livepilot-core/references/concepts/artists/boards-of-canada.yaml +124 -0
  58. package/livepilot/skills/livepilot-core/references/concepts/artists/burial.yaml +127 -0
  59. package/livepilot/skills/livepilot-core/references/concepts/artists/com-truise-tycho.yaml +121 -0
  60. package/livepilot/skills/livepilot-core/references/concepts/artists/daft-punk.yaml +117 -0
  61. package/livepilot/skills/livepilot-core/references/concepts/artists/dj-premier-rza.yaml +119 -0
  62. package/livepilot/skills/livepilot-core/references/concepts/artists/gas.yaml +134 -0
  63. package/livepilot/skills/livepilot-core/references/concepts/artists/hawtin.yaml +127 -0
  64. package/livepilot/skills/livepilot-core/references/concepts/artists/isolee-luomo.yaml +130 -0
  65. package/livepilot/skills/livepilot-core/references/concepts/artists/j-dilla.yaml +133 -0
  66. package/livepilot/skills/livepilot-core/references/concepts/artists/jeff-mills.yaml +120 -0
  67. package/livepilot/skills/livepilot-core/references/concepts/artists/johannsson-richter.yaml +132 -0
  68. package/livepilot/skills/livepilot-core/references/concepts/artists/madlib.yaml +124 -0
  69. package/livepilot/skills/livepilot-core/references/concepts/artists/moodymann-theo-parrish.yaml +121 -0
  70. package/livepilot/skills/livepilot-core/references/concepts/artists/oneohtrix-point-never.yaml +126 -0
  71. package/livepilot/skills/livepilot-core/references/concepts/artists/photek-source-direct.yaml +120 -0
  72. package/livepilot/skills/livepilot-core/references/concepts/artists/rashad-spinn-traxman.yaml +122 -0
  73. package/livepilot/skills/livepilot-core/references/concepts/artists/robert-henke.yaml +113 -0
  74. package/livepilot/skills/livepilot-core/references/concepts/artists/shackleton.yaml +124 -0
  75. package/livepilot/skills/livepilot-core/references/concepts/artists/skream-mala.yaml +119 -0
  76. package/livepilot/skills/livepilot-core/references/concepts/artists/stars-of-the-lid.yaml +119 -0
  77. package/livepilot/skills/livepilot-core/references/concepts/artists/tim-hecker.yaml +122 -0
  78. package/livepilot/skills/livepilot-core/references/concepts/artists/villalobos.yaml +135 -0
  79. package/livepilot/skills/livepilot-core/references/concepts/genres/ambient.yaml +137 -0
  80. package/livepilot/skills/livepilot-core/references/concepts/genres/boom_bap.yaml +124 -0
  81. package/livepilot/skills/livepilot-core/references/concepts/genres/deep-minimal.yaml +130 -0
  82. package/livepilot/skills/livepilot-core/references/concepts/genres/deep_house.yaml +130 -0
  83. package/livepilot/skills/livepilot-core/references/concepts/genres/detroit_techno.yaml +116 -0
  84. package/livepilot/skills/livepilot-core/references/concepts/genres/disco.yaml +123 -0
  85. package/livepilot/skills/livepilot-core/references/concepts/genres/downtempo.yaml +129 -0
  86. package/livepilot/skills/livepilot-core/references/concepts/genres/drone.yaml +133 -0
  87. package/livepilot/skills/livepilot-core/references/concepts/genres/drum-and-bass.yaml +119 -0
  88. package/livepilot/skills/livepilot-core/references/concepts/genres/dub-techno.yaml +132 -0
  89. package/livepilot/skills/livepilot-core/references/concepts/genres/dub.yaml +129 -0
  90. package/livepilot/skills/livepilot-core/references/concepts/genres/dubstep.yaml +120 -0
  91. package/livepilot/skills/livepilot-core/references/concepts/genres/experimental.yaml +136 -0
  92. package/livepilot/skills/livepilot-core/references/concepts/genres/footwork.yaml +119 -0
  93. package/livepilot/skills/livepilot-core/references/concepts/genres/hip-hop.yaml +132 -0
  94. package/livepilot/skills/livepilot-core/references/concepts/genres/house.yaml +126 -0
  95. package/livepilot/skills/livepilot-core/references/concepts/genres/hyperpop.yaml +128 -0
  96. package/livepilot/skills/livepilot-core/references/concepts/genres/idm.yaml +134 -0
  97. package/livepilot/skills/livepilot-core/references/concepts/genres/lo_fi.yaml +129 -0
  98. package/livepilot/skills/livepilot-core/references/concepts/genres/microhouse.yaml +138 -0
  99. package/livepilot/skills/livepilot-core/references/concepts/genres/minimal-techno.yaml +116 -0
  100. package/livepilot/skills/livepilot-core/references/concepts/genres/modern-classical.yaml +123 -0
  101. package/livepilot/skills/livepilot-core/references/concepts/genres/soul.yaml +125 -0
  102. package/livepilot/skills/livepilot-core/references/concepts/genres/synthwave.yaml +123 -0
  103. package/livepilot/skills/livepilot-core/references/concepts/genres/techno.yaml +123 -0
  104. package/livepilot/skills/livepilot-core/references/concepts/genres/trap.yaml +120 -0
  105. package/livepilot/skills/livepilot-core/references/concepts/genres/uk-garage.yaml +121 -0
  106. package/livepilot/skills/livepilot-core/references/device-atlas/00-index.md +110 -0
  107. package/livepilot/skills/livepilot-core/references/device-atlas/distortion-and-character.md +687 -0
  108. package/livepilot/skills/livepilot-core/references/device-atlas/drums-and-percussion.md +753 -0
  109. package/livepilot/skills/livepilot-core/references/device-atlas/dynamics-and-punch.md +525 -0
  110. package/livepilot/skills/livepilot-core/references/device-atlas/eq-and-filtering.md +402 -0
  111. package/livepilot/skills/livepilot-core/references/device-atlas/midi-tools.md +963 -0
  112. package/livepilot/skills/livepilot-core/references/device-atlas/movement-and-modulation.md +874 -0
  113. package/livepilot/skills/livepilot-core/references/device-atlas/space-and-depth.md +571 -0
  114. package/livepilot/skills/livepilot-core/references/device-atlas/spectral-and-weird.md +714 -0
  115. package/livepilot/skills/livepilot-core/references/device-atlas/synths-native.md +953 -0
  116. package/livepilot/skills/livepilot-core/references/device-knowledge/00-index.md +34 -0
  117. package/livepilot/skills/livepilot-core/references/device-knowledge/automation-as-music.md +204 -0
  118. package/livepilot/skills/livepilot-core/references/device-knowledge/chains-genre.md +173 -0
  119. package/livepilot/skills/livepilot-core/references/device-knowledge/creative-thinking.md +211 -0
  120. package/livepilot/skills/livepilot-core/references/device-knowledge/effects-distortion.md +188 -0
  121. package/livepilot/skills/livepilot-core/references/device-knowledge/effects-space.md +162 -0
  122. package/livepilot/skills/livepilot-core/references/device-knowledge/effects-spectral.md +229 -0
  123. package/livepilot/skills/livepilot-core/references/device-knowledge/instruments-synths.md +243 -0
  124. package/livepilot/skills/livepilot-core/references/genre-vocabularies.md +382 -0
  125. package/livepilot/skills/livepilot-core/references/m4l-devices.md +352 -0
  126. package/livepilot/skills/livepilot-core/references/memory-guide.md +178 -0
  127. package/livepilot/skills/livepilot-core/references/midi-recipes.md +402 -0
  128. package/livepilot/skills/livepilot-core/references/mixing-patterns.md +578 -0
  129. package/livepilot/skills/livepilot-core/references/overview.md +300 -0
  130. package/livepilot/skills/livepilot-core/references/pack-knowledge.md +319 -0
  131. package/livepilot/skills/livepilot-core/references/sample-manipulation.md +724 -0
  132. package/livepilot/skills/livepilot-core/references/sound-design-deep.md +140 -0
  133. package/livepilot/skills/livepilot-core/references/sound-design.md +393 -0
  134. package/livepilot/skills/livepilot-corpus-builder/SKILL.md +379 -0
  135. package/livepilot/skills/livepilot-creative-director/SKILL.md +462 -0
  136. package/livepilot/skills/livepilot-creative-director/references/anti-repetition-rules.md +214 -0
  137. package/livepilot/skills/livepilot-creative-director/references/creative-brief-template.md +222 -0
  138. package/livepilot/skills/livepilot-creative-director/references/hybrid-compilation.md +185 -0
  139. package/livepilot/skills/livepilot-creative-director/references/move-family-diversity-rule.md +258 -0
  140. package/livepilot/skills/livepilot-creative-director/references/phase-6-execution.md +409 -0
  141. package/livepilot/skills/livepilot-creative-director/references/the-four-move-rule.md +192 -0
  142. package/livepilot/skills/livepilot-devices/SKILL.md +213 -0
  143. package/livepilot/skills/livepilot-devices/references/load_browser_item-uri-grammar.md +82 -0
  144. package/livepilot/skills/livepilot-evaluation/SKILL.md +195 -0
  145. package/livepilot/skills/livepilot-evaluation/references/capability-modes.md +176 -0
  146. package/livepilot/skills/livepilot-evaluation/references/evaluation-contracts.md +121 -0
  147. package/livepilot/skills/livepilot-evaluation/references/memory-promotion.md +110 -0
  148. package/livepilot/skills/livepilot-mix-engine/SKILL.md +144 -0
  149. package/livepilot/skills/livepilot-mix-engine/references/mix-critics.md +143 -0
  150. package/livepilot/skills/livepilot-mix-engine/references/mix-moves.md +105 -0
  151. package/livepilot/skills/livepilot-mixing/SKILL.md +164 -0
  152. package/livepilot/skills/livepilot-notes/SKILL.md +130 -0
  153. package/livepilot/skills/livepilot-performance-engine/SKILL.md +122 -0
  154. package/livepilot/skills/livepilot-performance-engine/references/performance-safety.md +98 -0
  155. package/livepilot/skills/livepilot-release/SKILL.md +151 -0
  156. package/livepilot/skills/livepilot-sample-engine/SKILL.md +117 -0
  157. package/livepilot/skills/livepilot-sample-engine/references/sample-critics.md +87 -0
  158. package/livepilot/skills/livepilot-sample-engine/references/sample-philosophy.md +51 -0
  159. package/livepilot/skills/livepilot-sample-engine/references/sample-techniques.md +131 -0
  160. package/livepilot/skills/livepilot-sound-design-engine/SKILL.md +247 -0
  161. package/livepilot/skills/livepilot-sound-design-engine/references/patch-model.md +119 -0
  162. package/livepilot/skills/livepilot-sound-design-engine/references/sound-design-critics.md +118 -0
  163. package/livepilot/skills/livepilot-wonder/SKILL.md +143 -0
  164. package/m4l_device/LivePilot_Analyzer.amxd +0 -0
  165. package/m4l_device/LivePilot_Elektron.amxd +0 -0
  166. package/m4l_device/LivePilot_Elektron.maxpat +758 -0
  167. package/m4l_device/livepilot_bridge.js +1 -1
  168. package/m4l_device/livepilot_elektron_bridge.js +82 -0
  169. package/mcp_server/__init__.py +1 -1
  170. package/mcp_server/composer/develop/apply.py +1 -1
  171. package/mcp_server/composer/full/apply.py +32 -6
  172. package/mcp_server/composer/full/brief_builder.py +9 -0
  173. package/mcp_server/evaluation/feature_extractors.py +152 -8
  174. package/mcp_server/m4l_bridge.py +5 -0
  175. package/mcp_server/mix_engine/state_builder.py +19 -2
  176. package/mcp_server/mix_engine/tools.py +22 -0
  177. package/mcp_server/runtime/execution_router.py +6 -0
  178. package/mcp_server/runtime/mcp_dispatch.py +18 -0
  179. package/mcp_server/runtime/remote_commands.py +2 -0
  180. package/mcp_server/server.py +11 -7
  181. package/mcp_server/sound_design/tools.py +33 -0
  182. package/mcp_server/tools/_agent_os_engine/evaluation.py +7 -44
  183. package/mcp_server/tools/_agent_os_engine/models.py +2 -1
  184. package/mcp_server/tools/_conductor.py +5 -2
  185. package/mcp_server/tools/_evaluation_contracts.py +1 -1
  186. package/mcp_server/tools/_snapshot_normalizer.py +32 -3
  187. package/package.json +20 -5
  188. package/remote_script/LivePilot/__init__.py +1 -1
  189. package/remote_script/LivePilot/server.py +63 -2
  190. package/requirements.txt +3 -3
  191. package/server.json +3 -3
@@ -0,0 +1,192 @@
1
+ # The Four-Move Rule
2
+
3
+ A creative pass should touch four dimensions: **structural**,
4
+ **rhythmic**, **timbral**, **spatial**. The three plans generated in
5
+ Phase 3 distribute across these dimensions — they do not duplicate one.
6
+
7
+ This is the complement to the move-family diversity rule. Family
8
+ diversity enforces "different machinery"; four-move coverage enforces
9
+ "different musical consequence."
10
+
11
+ ## The four dimensions
12
+
13
+ Dimensions are orthogonal to `move.family`. A plan has ONE dominant
14
+ dimension and ONE dominant family. Multiple dimensions can map to the
15
+ same family (e.g. an `arrangement`-family plan can be structural OR
16
+ rhythmic depending on what it does). See
17
+ `move-family-diversity-rule.md` §"Family vs. dimension" for the split.
18
+
19
+ | Dimension | What it is | Dominant family typically | Tag with | Also uses |
20
+ |---|---|---|---|---|
21
+ | **Structural** | Section-level form — adds, removes, reshapes sections or clip density | `arrangement` or `transition` | `dimension_hint` optional (family implies it) | `livepilot-arrangement`, `livepilot-composition-engine`, scene/arrangement tools |
22
+ | **Rhythmic** | Timing, groove, swing, motif patterns, polyrhythm, per-hit velocity/probability | `arrangement` (clip pattern edits) OR `sound_design` (per-hit feel) | `dimension_hint: "rhythmic"` REQUIRED — there is no rhythmic family in the registry | `livepilot-notes`, `assign_clip_groove`, `modify_notes`, motif tools, Euclidean rhythm |
23
+ | **Timbral** | Source character — instrument choice, patch, saturation, texture | `sound_design` or `device_creation` | `dimension_hint` optional | `livepilot-sound-design-engine`, `livepilot-devices`, atlas lookups |
24
+ | **Spatial** | Space and stereo field — reverb, delay, pan, width, depth | `mix` (space-oriented moves) | `dimension_hint: "spatial"` recommended when family=mix (distinguishes from level/EQ mix plans) | `set_track_send`, `set_track_pan`, return-track routing, `add_space` |
25
+
26
+ Note that `performance` family is orthogonal — it rarely applies on
27
+ first-pass creative work; it's for live contexts.
28
+
29
+ **The fudge is not a fudge:** earlier drafts of this rule described
30
+ rhythmic plans as "fudged" because they borrow the `arrangement` or
31
+ `sound_design` family. That framing was wrong. The family axis and the
32
+ dimension axis are orthogonal by design — a rhythmic plan has an
33
+ honest family tag AND an honest dimension tag, via `dimension_hint`.
34
+ State both explicitly in the turn. No apology needed.
35
+
36
+ ## The rule
37
+
38
+ For a creative pass of 3 plans, coverage should span at least 3 of the
39
+ 4 dimensions. Plans may overlap only after all four dimensions have
40
+ been considered.
41
+
42
+ ```
43
+ dimensions_touched = {dominant_dimension(p) for p in plans}
44
+ len(dimensions_touched) >= 3 # default
45
+ len(dimensions_touched) >= 4 # ideal
46
+ ```
47
+
48
+ Falling below 3 distinct dimensions is the same failure mode as
49
+ falling below 3 distinct families — the agent is clustering.
50
+
51
+ ## How to identify a plan's dominant dimension
52
+
53
+ Use the move-family → dimension map, then confirm against the plan's
54
+ audible consequence:
55
+
56
+ 1. If dominant move's family is `arrangement` or `transition` → **structural**
57
+ 2. If dominant move's family is `sound_design` or `device_creation` → **timbral**
58
+ 3. If dominant move's family is `mix` AND the move is space-oriented
59
+ (`add_space`, `widen_stereo`, reverb-related) → **spatial**
60
+ 4. If dominant move's family is `mix` AND the move is level / EQ /
61
+ dynamics → still **spatial** for this taxonomy (mix's audible
62
+ consequence is positional)
63
+ 5. If the plan is primarily MIDI-editing (notes, grooves, motif
64
+ transforms) → **rhythmic**, regardless of family tagging
65
+
66
+ Ambiguous? Tag the seed explicitly in `seed.dimension_hint`.
67
+
68
+ ## Interaction with `locked_dimensions`
69
+
70
+ If the brief's `locked_dimensions` includes a dimension, that dimension
71
+ is off-limits. The remaining three must be covered across the three
72
+ plans.
73
+
74
+ | Locked | Must cover |
75
+ |---|---|
76
+ | (nothing) | any 3 of 4 (all 4 ideal) |
77
+ | `structural` | rhythmic + timbral + spatial |
78
+ | `timbral` | structural + rhythmic + spatial |
79
+ | `rhythmic` | structural + timbral + spatial |
80
+ | `spatial` | structural + rhythmic + timbral |
81
+ | two locks | the remaining two — ship 2 plans, not 3 |
82
+
83
+ Two locks on a 4-dimension space means the problem is narrow. Two
84
+ plans is honest; faking a third by sneaking into a locked dimension
85
+ violates both this rule AND the user's explicit constraint.
86
+
87
+ ## Example 1 — "Make it feel like Basic Channel if Dilla touched the swing"
88
+
89
+ No locked dimensions. Ideal coverage = 4/4 but we only have 3 plans.
90
+ Each plan tagged `family / dimension`:
91
+
92
+ - Plan A (`arrangement` / **structural**): Add an 8-bar breakdown at bar 48 where kick drops out and only ghost hats + dub-chord tail remain.
93
+ - Plan B (`arrangement` / **rhythmic**, dimension_hint="rhythmic"): Micro-shift hi-hat notes by −8 to +12 ticks, add ghost notes at 62% probability, assign a "Dilla-esque" groove.
94
+ - Plan C (`sound_design` / **timbral**): Load Drift for the chord, route to a send with Ping Pong Delay + Auto Filter on the return, print 25% wet.
95
+
96
+ Family-diversity note: Plans A and B are BOTH `arrangement` family —
97
+ this is a rule violation unless corrected. Swap Plan B to tag
98
+ `sound_design` family instead (per-hit velocity + micro-timing counts
99
+ as feel-shaping sound_design per the family→dimension map), OR swap
100
+ Plan A to `transition` family (create_breakdown semantic move). Either
101
+ fix keeps all three dimensions covered. The point: rhythmic as a
102
+ dimension does not exempt the plan from the three-distinct-families
103
+ constraint — the director must still land family diversity, just via
104
+ the appropriate tag.
105
+
106
+ Corrected version:
107
+ - Plan A (`transition` / **structural**): `create_breakdown` semantic move at bar 48.
108
+ - Plan B (`arrangement` / **rhythmic**, dimension_hint="rhythmic"): groove + probability edits to clip.
109
+ - Plan C (`sound_design` / **timbral**): Drift + send chain.
110
+
111
+ Spatial dimension is not directly touched by a plan — but Plan C's
112
+ send-chain IS spatial in consequence. Coverage is honest: 3 explicit
113
+ dimensions, one implicit.
114
+
115
+ ## Example 2 — "Make the drums more interesting, don't touch the arrangement"
116
+
117
+ Locked: `structural`. Must cover rhythmic + timbral + spatial.
118
+
119
+ - Plan A (`arrangement` / **rhythmic**, dimension_hint="rhythmic"): Add probability 70-90% to the hat and clap clip; apply a 58% swing groove from `list_grooves`. Family is `arrangement` because the target is clip content; dimension is rhythmic because the audible consequence is feel. The `structural` lock concerns SECTION-level arrangement, not clip-level edits — locked_dimensions semantics resolve at the dimension level, not the family level.
120
+ - Plan B (`sound_design` / **timbral**): Layer a parallel drum bus with Saturator + Drum Bus; per-hit velocity mod on snare.
121
+ - Plan C (`mix` / **spatial**, dimension_hint="spatial"): Send hats and ghost snares to a short plate reverb at -14 dB; narrow the kick to mono under 80 Hz.
122
+
123
+ All three dimensions hit. Section arrangement untouched. Three families
124
+ distinct. Honest.
125
+
126
+ ## Example 3 — Narrow request: "the pad is too static"
127
+
128
+ Ambiguous whether "static" means timbre or space. The agent should
129
+ compile a brief that acknowledges this and generate plans across both:
130
+
131
+ - Plan A (`sound_design` / **timbral**): Enable wavetable position LFO + macro
132
+ modulation on Drift.
133
+ - Plan B (`mix` / **spatial**, dimension_hint="spatial"): Send the pad to a long convolution reverb on a
134
+ return with Auto Filter LFO.
135
+ - Plan C (`arrangement` / **rhythmic**, dimension_hint="rhythmic"): Automate a slow 8-bar amplitude envelope so
136
+ the pad breathes with the section.
137
+
138
+ This is an explicit case where the structural dimension is not
139
+ relevant (it's one sound, not an arrangement decision). Three of four
140
+ is the natural coverage. Shipping a structural plan would be
141
+ fabricated.
142
+
143
+ ## When to drop below three dimensions
144
+
145
+ Drop to 2 of 4 (or 1 of 4) ONLY in these situations. In all cases:
146
+ ship fewer plans honestly. Do not fake coverage.
147
+
148
+ 1. **Two or more dimensions locked.** User explicitly locked two
149
+ dimensions → at most 2 dimensions remain → at most 2 honest plans.
150
+
151
+ 2. **Genuinely narrow task AND concept packet confirms no other
152
+ dimension is in scope.** Example: "make this one reverb return
153
+ less muddy" is spatial-only.
154
+
155
+ 3. **Low novelty_budget + narrow-idiom concept packet.** When the
156
+ user's request is reference-adjacent (`novelty_budget` ≤ 0.50) AND
157
+ the concept packet explicitly de-prioritizes certain dimensions,
158
+ dropping those dimensions is idiomatic, not fabricated. Examples:
159
+
160
+ - **Dub-techno packets** (Basic Channel / Rhythm & Sound) explicitly
161
+ de-emphasize the rhythmic dimension ("percussion implied not
162
+ stated"). Three plans may legitimately cluster in
163
+ timbral + spatial + (optional) structural. Rhythmic absent is
164
+ idiomatic honesty.
165
+ - **Ambient packets** (Gas / Basinski / Stars of the Lid) explicitly
166
+ de-emphasize rhythmic AND structural (static with very slow
167
+ evolution). Three plans clustering in timbral + spatial is
168
+ idiomatic.
169
+ - **Beat-focused packets** (Dilla / Premier) explicitly
170
+ de-emphasize the spatial dimension (dry intimacy is the aesthetic).
171
+ Three plans clustering in rhythmic + timbral + structural is
172
+ idiomatic.
173
+
174
+ When this rule fires, document the decision in the turn: *"The
175
+ packet's aesthetic de-prioritizes <dimension>; dropping it here is
176
+ idiomatic rather than coverage failure."* This prevents future
177
+ agents from mistaking the under-coverage for a skill bug.
178
+
179
+ **Never-drop rule:** even when dropping dimensions, the family
180
+ diversity rule still applies to whatever plans you DO ship. Two plans
181
+ must have different families; three plans must have three different
182
+ families. Narrow doesn't excuse fabricated distinctness.
183
+
184
+ ## Why this rule works
185
+
186
+ "Layered and complex output" — what the user asks for when they say
187
+ "more interesting" — is almost always a DISTRIBUTION problem, not a
188
+ depth problem. A pass that touches rhythm + timbre + space feels
189
+ three-dimensional even if each individual change is small. A pass that
190
+ stacks three `mix` moves feels thin even when the changes are large.
191
+
192
+ Force distribution. Depth emerges.
@@ -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.