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.
Files changed (181) hide show
  1. package/CHANGELOG.md +24 -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 +49 -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 +455 -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 +136 -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 +157 -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 +225 -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/m4l_bridge.py +5 -0
  173. package/mcp_server/runtime/execution_router.py +6 -0
  174. package/mcp_server/runtime/mcp_dispatch.py +18 -0
  175. package/mcp_server/runtime/remote_commands.py +2 -0
  176. package/mcp_server/server.py +11 -7
  177. package/package.json +20 -5
  178. package/remote_script/LivePilot/__init__.py +1 -1
  179. package/remote_script/LivePilot/server.py +63 -2
  180. package/requirements.txt +3 -3
  181. package/server.json +3 -3
@@ -0,0 +1,409 @@
1
+ # Phase 6 — Execution Contracts (v1.20+)
2
+
3
+ Full contracts for the 10 semantic moves shipped in v1.20.0, plus the
4
+ escape-hatch policy for patterns not yet covered. Read this alongside
5
+ the Phase 6 decision table in `SKILL.md`.
6
+
7
+ Every NEW move listed here takes its user targets via
8
+ `apply_semantic_move(move_id, mode, args)`, where `args` is threaded
9
+ into the compiler's kernel as `kernel["seed_args"]`. The pre-v1.20 33
10
+ moves (mix / arrangement / transition / sound_design / performance /
11
+ sample families) still read only from `session_info` and ignore args.
12
+
13
+ ---
14
+
15
+ ## Routing family (v1.20 commit 1)
16
+
17
+ ### `build_send_chain`
18
+
19
+ Load an ordered device chain onto a return track. The Basic Channel /
20
+ dub-techno / ambient send-architecture primitive.
21
+
22
+ | Field | Type | Required | Notes |
23
+ |---|---|---|---|
24
+ | `return_track_index` | int | yes | 0 = Return A, 1 = Return B, ... (0-based) |
25
+ | `device_chain` | list[str] | yes | Device names in load order. Duplicates allowed (e.g., two Echos stacked). |
26
+
27
+ Compiled steps (per device in order, then a final verify read):
28
+
29
+ 1. `find_and_load_device(track_index=-(return_track_index+1), device_name=<name>, allow_duplicate=True)`
30
+ 2. ... (one per device)
31
+ 3. `get_track_info(track_index=-(return_track_index+1))` — read-only verify.
32
+
33
+ Risk: **medium** (return chains affect every track routing sends there).
34
+ Protect: `low_end=0.6` (dub returns can accumulate sub mud).
35
+ Family: `device_creation`.
36
+
37
+ **Typical caller:** "build me a Basic Channel dub architecture on
38
+ Return A" → build_send_chain({return_track_index: 0, device_chain:
39
+ ["Echo", "Auto Filter", "Convolution Reverb"]}).
40
+
41
+ ---
42
+
43
+ ### `configure_send_architecture`
44
+
45
+ Set send levels across a set of source tracks in a single move.
46
+
47
+ | Field | Type | Required | Notes |
48
+ |---|---|---|---|
49
+ | `source_track_indices` | list[int] | yes | 0-based; negative indices for returns |
50
+ | `send_index` | int | yes | Which send slot (0 = Send A, 1 = Send B, ...) |
51
+ | `levels` | list[float] | yes | 0.0-1.0. Must be same length as source_track_indices. Out-of-range values are clamped with a warning. |
52
+
53
+ Compiled steps: one `set_track_send` per (track, level) pair.
54
+
55
+ Risk: **low**. Protect: `clarity=0.5` (overdone sends muddy the mix).
56
+ Family: `mix`.
57
+
58
+ **Typical caller:** "route all percussion to the dub reverb at -10 dB" →
59
+ configure_send_architecture({source_track_indices: [2, 3, 4], send_index: 0, levels: [0.35, 0.35, 0.35]}).
60
+
61
+ ---
62
+
63
+ ### `set_track_routing`
64
+
65
+ Rewire a track's output routing. Useful for setting up bus architectures
66
+ ("Sends Only") or routing a track to a specific return.
67
+
68
+ | Field | Type | Required | Notes |
69
+ |---|---|---|---|
70
+ | `track_index` | int | yes | 0-based; negative for returns |
71
+ | `output_routing_type` | str | at least one of output_* required | e.g., "Sends Only", "Master" |
72
+ | `output_routing_channel` | str | | Display name from Live (e.g., "Post Mixer") |
73
+
74
+ Compiled steps: single `set_track_routing` call.
75
+
76
+ Risk: **medium** (a bad routing silences or feedback-loops audio).
77
+ Protect: `clarity=0.5`. Family: `mix`.
78
+
79
+ **Typical caller:** "send track 0 to bus-only so it only feeds the return" →
80
+ set_track_routing({track_index: 0, output_routing_type: "Sends Only"}).
81
+
82
+ ---
83
+
84
+ ## Device-mutation family (v1.20 commit 2)
85
+
86
+ ### `configure_device`
87
+
88
+ Reconfigure an existing device in bulk — set N parameters in one
89
+ undoable move. The ergonomic replacement for a chain of
90
+ `set_device_parameter` raw calls.
91
+
92
+ | Field | Type | Required | Notes |
93
+ |---|---|---|---|
94
+ | `track_index` | int | yes | Negative allowed (returns, master=-1000) |
95
+ | `device_index` | int | yes | Position in the track's chain |
96
+ | `param_overrides` | dict[str, Any] | yes | `{param_name: value}`. At least one entry required. |
97
+
98
+ Compiled steps: single `batch_set_parameters` call. Each
99
+ `{param_name, value}` pair is normalized into Live's preferred shape
100
+ (`parameter_name` key).
101
+
102
+ Risk: **low**. Protect: `{}` — caller declares via the specific
103
+ param_overrides. Family: `sound_design`.
104
+
105
+ **Preset library note (v1.21 scope):** the plan originally called for
106
+ `preset_name` + an affordance-YAML library. v1.20 ships `param_overrides`
107
+ only — once a preset library lands, the preset simply resolves to the
108
+ same dict and the move contract stays identical.
109
+
110
+ **Typical caller:** apply an affordance preset (affordance YAML →
111
+ resolved param dict) → configure_device({track_index: -1, device_index: 0,
112
+ param_overrides: {"Decay Time": 4000.0, "Dry/Wet": 0.35, "Size": 1.0}}).
113
+
114
+ ---
115
+
116
+ ### `remove_device`
117
+
118
+ Delete a device with a required audit reason. Destructive but undoable
119
+ via Live's undo stack.
120
+
121
+ | Field | Type | Required | Notes |
122
+ |---|---|---|---|
123
+ | `track_index` | int | yes | |
124
+ | `device_index` | int | yes | |
125
+ | `reason` | str | **yes** | Non-empty, non-whitespace. Destructive ops must be justified. |
126
+
127
+ Compiled steps:
128
+
129
+ 1. `delete_device(track_index, device_index)`
130
+ 2. `add_session_memory(category="device_removal", content="Removed track=<ti> device_index=<di>: <reason>")`
131
+
132
+ Risk: **medium**. Protect: `signal_integrity=0.9` (live signal-path
133
+ removal can silence audio). Family: `sound_design`.
134
+
135
+ ---
136
+
137
+ ## Content family (v1.20 commit 3)
138
+
139
+ ### `load_chord_source`
140
+
141
+ Create a named MIDI clip at a specific slot with chord voicing notes.
142
+ Feeds a `build_send_chain` return chain for dub-chord workflows.
143
+
144
+ | Field | Type | Required | Notes |
145
+ |---|---|---|---|
146
+ | `track_index` | int | yes | |
147
+ | `clip_slot` | int | yes | Non-negative |
148
+ | `notes` | list[dict] | yes | `[{pitch, start_time, duration, velocity?, probability?}]`; non-empty |
149
+ | `name` | str | yes | Non-whitespace |
150
+ | `length_beats` | float | no | Default 4.0 (one bar 4/4) |
151
+
152
+ Compiled steps (ordered, all remote_command):
153
+
154
+ 1. `create_clip(track_index, clip_index=clip_slot, length=length_beats)`
155
+ 2. `add_notes(track_index, clip_index=clip_slot, notes=...)`
156
+ 3. `set_clip_name(track_index, clip_index=clip_slot, name=...)`
157
+
158
+ Risk: **low**. Protect: `cohesion=0.6`. Family: `sound_design`.
159
+
160
+ ---
161
+
162
+ ### `create_drum_rack_pad`
163
+
164
+ Add one pad (chain) to a Drum Rack, loading a sample + setting Snap=0
165
+ post-load. Wraps the Live 12.4 native `replace_sample_native` flow.
166
+ Build kits one pad at a time à la Dilla.
167
+
168
+ | Field | Type | Required | Notes |
169
+ |---|---|---|---|
170
+ | `track_index` | int | yes | Track containing the Drum Rack |
171
+ | `pad_note` | int | yes | MIDI 0-127. Standard drum map: 36=Kick, 38=Snare, 42=CHH, 46=OHH. |
172
+ | `file_path` | str | yes | Absolute path to the audio file |
173
+ | `rack_device_index` | int | no | Auto-detects first Drum Rack if omitted |
174
+ | `chain_name` | str | no | Display name for the new chain |
175
+
176
+ Compiled steps: single `add_drum_rack_pad` call (backend=`mcp_tool`,
177
+ async — it composes insert_rack_chain + set_drum_chain_note +
178
+ insert_device + replace_sample_native + hygiene internally).
179
+
180
+ Risk: **low**. Family: `device_creation`.
181
+
182
+ ---
183
+
184
+ ## Metadata family (v1.20 commit 4)
185
+
186
+ ### `configure_groove`
187
+
188
+ Assign a groove to clips and optionally tune its timing_amount. The
189
+ Dilla-swing primitive; pre-resolve the groove_id via `list_grooves()`
190
+ before calling.
191
+
192
+ | Field | Type | Required | Notes |
193
+ |---|---|---|---|
194
+ | `track_index` | int | yes | |
195
+ | `clip_indices` | list[int] | yes | Non-empty; non-negative entries |
196
+ | `groove_id` | int | yes | From `list_grooves()` |
197
+ | `timing_amount` | float | no | 0.0-1.0; clamped with warning on out-of-range |
198
+
199
+ Compiled steps:
200
+
201
+ 1. `assign_clip_groove(track_index, clip_index=<each>, groove_id)` — one per clip
202
+ 2. `set_groove_params(groove_id, timing_amount=<clamped>)` — only if provided
203
+
204
+ Risk: **low**. Protect: `clarity=0.5`. Family: `arrangement`.
205
+
206
+ ---
207
+
208
+ ### `set_scene_metadata`
209
+
210
+ Set scene name / color / tempo in one conditional move. Each field is
211
+ optional; at least one required.
212
+
213
+ | Field | Type | Required | Notes |
214
+ |---|---|---|---|
215
+ | `scene_index` | int | yes | Non-negative |
216
+ | `name` | str | no | |
217
+ | `color_index` | int | no | |
218
+ | `tempo` | float | no | BPM. **set_scene_tempo DOES affect playback timing on scene fire — use cautiously inside a performance context.** |
219
+
220
+ Compiled steps: one tool call per provided field (`set_scene_name` /
221
+ `set_scene_color` / `set_scene_tempo`). Zero-field calls reject.
222
+
223
+ Risk: **low**. Family: `arrangement`.
224
+
225
+ ---
226
+
227
+ ### `set_track_metadata` (bundled rename + color)
228
+
229
+ Set track name and/or color in a single bundled move. Both fields are
230
+ optional; at least one required.
231
+
232
+ | Field | Type | Required | Notes |
233
+ |---|---|---|---|
234
+ | `track_index` | int | yes | Negative indices for returns allowed |
235
+ | `name` | str | no | |
236
+ | `color_index` | int | no | |
237
+
238
+ Compiled steps: one call per provided field. Zero-field calls reject.
239
+
240
+ Risk: **low**. Family: `mix`.
241
+
242
+ **Why bundled?** Phase 6 usage always pairs rename with color (name is
243
+ what the director types; color carries aesthetic meaning — green for
244
+ analog, orange for harmonic, etc.). The bundled move replaces two
245
+ raw calls with one named intent.
246
+
247
+ ---
248
+
249
+ ## Escape-hatch policy (v1.20, phased cutover)
250
+
251
+ When no semantic move in Phase 6's decision table covers the pattern,
252
+ the director may fall back to raw tool calls — BUT only with the
253
+ mandatory logging contract below. The hatch is explicitly a phased-
254
+ cutover transitional state; v1.21+ closes patterns as they accumulate
255
+ tech_debt log entries.
256
+
257
+ ### The three mandatory calls (in order)
258
+
259
+ 1. **The raw tool call itself** — e.g., `set_device_parameter(...)`,
260
+ `load_browser_item(...)`, `create_take_lane(...)`.
261
+ 2. **`add_session_memory(category="move_executed", ...)`** — one-line
262
+ ledger entry summarizing the move's family + target + brief
263
+ identity. Anti-repetition is blind without this.
264
+ 3. **`add_session_memory(category="tech_debt", ...)`** — tracking log
265
+ that names the uncovered pattern. Use wording specific enough that
266
+ v1.21 release planning can turn it into a semantic move.
267
+
268
+ ### Example: the director rewires a track group (pattern not yet in decision table)
269
+
270
+ ```python
271
+ # Raw tool call (no semantic move covers "rename track group")
272
+ ableton.send_command("set_group_name", {"group_index": 0, "name": "DRUMS"})
273
+
274
+ # Mandatory 2/3: ledger marker for anti-repetition
275
+ add_session_memory(
276
+ category="move_executed",
277
+ content="mix:group-0 rename to DRUMS — brief: stem organization for export",
278
+ engine="creative_director",
279
+ )
280
+
281
+ # Mandatory 3/3: tech_debt log so v1.21 can close the gap
282
+ add_session_memory(
283
+ category="tech_debt",
284
+ content="no semantic_move for: rename a track group (set_group_name). "
285
+ "Suggested move: set_group_metadata, family=mix, "
286
+ "seed_args={group_index, name?, color_index?}",
287
+ engine="creative_director",
288
+ )
289
+ ```
290
+
291
+ ### What the two entries do differently
292
+
293
+ | Entry | Consumer | Scrub? |
294
+ |---|---|---|
295
+ | `move_executed` | Anti-repetition Phase 3 recency table | Stable — never scrubbed |
296
+ | `tech_debt` | v1.21 release planning | Scrubbed per release after closure |
297
+
298
+ ### Honesty rules for the hatch
299
+
300
+ - **Don't treat the hatch as a shortcut.** Default is always
301
+ `apply_semantic_move`. The hatch is the branch you take once you've
302
+ checked the decision table AND run
303
+ `list_semantic_moves(domain="<family>")`.
304
+ - **Don't skip the tech_debt log because "that pattern is weird."**
305
+ Weird patterns are exactly the ones v1.21 should close. The log is
306
+ the input.
307
+ - **Don't use `category="tech_debt"` for other purposes.** It's a
308
+ specific contract with release planning. Use a different category
309
+ (e.g., `observation`) for general session notes.
310
+
311
+ ---
312
+
313
+ ## Affordance-preset resolution (bridge into configure_device)
314
+
315
+ **Shipping in v1.21.** The affordance library lives at
316
+ `mcp_server/affordances/devices/<slug>.yaml` and exposes a Python loader
317
+ at `mcp_server.affordances`. When the plan calls for a preset-style
318
+ reconfiguration (e.g., "dub cathedral reverb", "ping-pong dub delay"),
319
+ you have two equivalent dispatch paths:
320
+
321
+ ### Preferred (v1.21+): pass the preset reference to configure_device
322
+
323
+ The compiler resolves the preset YAML at compile time. This keeps the
324
+ director's turn clean (no filesystem call in Python) and makes the
325
+ dispatch self-describing:
326
+
327
+ ```python
328
+ apply_semantic_move(
329
+ "configure_device",
330
+ mode="explore",
331
+ args={
332
+ "track_index": -1,
333
+ "device_index": 0,
334
+ "device_slug": "reverb", # required when preset is used
335
+ "preset": "dub-cathedral", # v1.21 library name
336
+ },
337
+ )
338
+ ```
339
+
340
+ `device_slug` is REQUIRED when `preset` is supplied — v1.21 doesn't
341
+ auto-infer from class_name (that's v1.22 scope). The compiler returns
342
+ a clear warning if `device_slug` is missing.
343
+
344
+ ### Preset + explicit override (merge semantics)
345
+
346
+ The compiler merges preset-resolved params first, then applies any
347
+ explicit `param_overrides` on top (last-write-wins at dict-key
348
+ granularity):
349
+
350
+ ```python
351
+ apply_semantic_move(
352
+ "configure_device",
353
+ mode="explore",
354
+ args={
355
+ "track_index": -1,
356
+ "device_index": 0,
357
+ "device_slug": "reverb",
358
+ "preset": "dub-cathedral",
359
+ "param_overrides": {"Decay Time": 0.5}, # overrides preset's 0.85
360
+ },
361
+ )
362
+ # Result: Decay Time=0.5 (explicit wins), Room Size=0.95 (from preset),
363
+ # Dry/Wet=0.40 (from preset), etc.
364
+ ```
365
+
366
+ ### Fallback: resolve explicitly in Python
367
+
368
+ When you want to inspect or modify the resolved params before dispatch,
369
+ call the loader directly:
370
+
371
+ ```python
372
+ from mcp_server.affordances import resolve_preset
373
+
374
+ preset = resolve_preset("reverb", "dub-cathedral")
375
+ # preset = {"Decay Time": 0.85, "Room Size": 0.95, "Dry/Wet": 0.40, ...}
376
+
377
+ apply_semantic_move(
378
+ "configure_device",
379
+ mode="explore",
380
+ args={
381
+ "track_index": -1,
382
+ "device_index": 0,
383
+ "param_overrides": preset, # equivalent to path (1) above
384
+ },
385
+ )
386
+ ```
387
+
388
+ ### v1.21 library content
389
+
390
+ Minimal (3 seed presets, by design — v1.22 expands):
391
+
392
+ | device_slug | preset | description |
393
+ |----------------|----------------|------------------------------------------|
394
+ | `reverb` | `dub-cathedral`| Basic Channel-adjacent huge space |
395
+ | `delay` | `ping-pong-dub`| Dotted-8th ping-pong, feedback 0.45 |
396
+ | `auto-filter` | `slow-sweep` | Bar-long LFO LP sweep, moderate resonance|
397
+
398
+ List available presets programmatically via
399
+ `mcp_server.affordances.list_devices()` and
400
+ `mcp_server.affordances.list_presets(device_slug)`.
401
+
402
+ ---
403
+
404
+ ## See also
405
+
406
+ - `SKILL.md` §Phase 6 — the entry-level decision table
407
+ - `references/anti-repetition-rules.md` §v1.20 update — how ledger
408
+ entries feed the recency table
409
+ - `docs/plans/v1.20-structural-plan.md` — design rationale + §7 risks
@@ -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.