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,222 @@
1
+ # Creative Brief — Schema and Examples
2
+
3
+ The Creative Brief is an inline YAML block emitted during Phase 2 of the
4
+ director contract. It is NOT a tool call and NOT stored in memory until
5
+ Phase 8 (`memory_learn`). It is a conditioning payload that downstream
6
+ skills read in the same turn.
7
+
8
+ ## Why an inline block
9
+
10
+ The brief's only job is to pin the artistic thesis and constraints
11
+ BEFORE generation so the three plans can be judged against it. If it
12
+ lives in memory or in a tool response, the agent can ignore it. Inline
13
+ in the turn, the agent cannot.
14
+
15
+ ## Schema
16
+
17
+ ```yaml
18
+ creative_brief:
19
+ identity: # one-line artistic thesis (not a genre label)
20
+ reference_anchors: # list — artists/genres/tracks user named
21
+ - type: artist # artist | genre | track | description
22
+ name: # e.g. "Basic Channel"
23
+ source: # user | inferred_from_memory | inferred_from_session
24
+ protected_qualities: # list — things that must survive all changes
25
+ - # e.g. "low-end weight", "restraint", "sparseness"
26
+ anti_patterns: # list — things that would break the brief
27
+ - # drawn from concept packet `avoid` + anti_preferences + last_move_target
28
+ novelty_budget: # 0.0 (conservative) to 1.0 (strange-but-plausible)
29
+ target_dimensions: # evaluation bias — what "better" means here
30
+ groove: # 0.0 to ~0.25 (weights sum loosely to 1)
31
+ depth:
32
+ contrast:
33
+ novelty:
34
+ cohesion:
35
+ motion:
36
+ clarity:
37
+ structure_hypothesis: # optional — only if structure is in scope
38
+ - section: # intro | groove_body | breakdown | return | outro
39
+ bars:
40
+ intent:
41
+ locked_dimensions: # list — dimensions user said don't touch
42
+ - # "structural" | "rhythmic" | "timbral" | "spatial"
43
+ last_move_target: # from Phase 1 get_last_move — do NOT re-target this combo
44
+ family: # e.g. "mix"
45
+ target: # e.g. "track_index=2" / "master" / "bass group"
46
+ move_id: # e.g. "make_kick_bass_lock"
47
+ recommended_skill_chain: # ordered skills to execute the winning plan
48
+ -
49
+ ```
50
+
51
+ ### Why `last_move_target`
52
+
53
+ `anti-repetition-rules.md` §3 forbids Phase 3 plans from repeating the
54
+ exact family + target combination of the most recent committed move.
55
+ That constraint lives in Phase 1 read results and can be lost between
56
+ phases. Putting `last_move_target` in the brief makes it survive — and
57
+ makes the violation visible on review. If Phase 1 returns no prior
58
+ move (fresh session), leave the field as `null`.
59
+
60
+ ## Rules for filling each field
61
+
62
+ | Field | Source |
63
+ |---|---|
64
+ | `identity` | User prompt + concept packet `sonic_identity`. One sentence. Not a genre label. |
65
+ | `reference_anchors` | Explicit user references, OR inferred from `project_brain` if returning to an existing track |
66
+ | `protected_qualities` | Concept packet `sonic_identity` + `project_brain` identity statement. Also anything user said "keep". |
67
+ | `anti_patterns` | UNION of concept packet `avoid` + `get_anti_preferences` results + user's "don't" asks + the `last_move_target` combo (do not re-target) |
68
+ | `novelty_budget` | See the novelty_budget table below. |
69
+ | `target_dimensions` | Concept packet `evaluation_bias.target_dimensions` if packet is loaded; else derive from intent. Dub/ambient → depth/motion; club/dance → groove/contrast; pop → clarity/motion. |
70
+ | `structure_hypothesis` | Only if the request is structural. Otherwise omit. |
71
+ | `locked_dimensions` | Read user's prompt literally. "Don't touch the arrangement" → `structural`. Silence = no locks. Silence for rhythmic/timbral/spatial = permission. Silence for structural = permission with **conditional** disclosure: flag the intent in the `identity` line ONLY IF the Phase 3 plan set actually includes a structural plan. Compile plans first, then decide whether the disclosure is warranted — no structural plan means no disclosure. |
72
+ | `last_move_target` | From Phase 1 `get_last_move`. Populate family + target + move_id. If no prior move, set to `null`. |
73
+ | `recommended_skill_chain` | Map target_dimensions to skills. See the-four-move-rule.md family-to-dimension table. |
74
+
75
+ ### Novelty budget — full table
76
+
77
+ User framing maps to `novelty_budget` values. Choose the nearest match:
78
+
79
+ | User says | novelty_budget | Notes |
80
+ |---|---|---|
81
+ | "keep the vibe, just cleaner" / "same energy, tighten it" | 0.25 – 0.35 | Conservative; bias toward `mix` and `sound_design` refinement |
82
+ | "a bit more like X" / "lean it slightly toward X" | 0.40 – 0.50 | Reference-adjacent; packet avoid filters matter MORE than novelty |
83
+ | "make it more interesting" / "develop this" / "more character" | 0.50 – 0.65 | Default creative ask; 0.55 is a safe midpoint |
84
+ | "take it somewhere" / "evolve this" / "mutate" | 0.60 – 0.75 | Moderately high novelty; cross-domain moves allowed |
85
+ | "surprise me" / "make it magical" / "I'm stuck" | 0.70 – 0.85 | High novelty; strange-but-plausible plans welcome. If `detect_stuckness > 0.5`, route to Wonder rescue instead |
86
+ | "I don't know what I want" / open-ended "ideas?" | 0.55 | Default to mid; let divergence surface options |
87
+
88
+ If the user frame spans two categories, pick the lower novelty. Under
89
+ speed pressure ("quickly"), do NOT change the novelty_budget — it is
90
+ the artistic posture, not the effort level.
91
+
92
+ ## Example 1 — "Make it feel like Basic Channel if Dilla touched the swing"
93
+
94
+ ```yaml
95
+ creative_brief:
96
+ identity: "Dub-techno space with human swing tension — chord stabs as harmonic vehicle, percussion implied not stated (structural change in scope — will add a breakdown section)"
97
+ reference_anchors:
98
+ - type: artist
99
+ name: "Basic Channel"
100
+ source: user
101
+ - type: artist
102
+ name: "J Dilla"
103
+ source: user
104
+ protected_qualities:
105
+ - low-end weight
106
+ - space as instrument
107
+ - restraint (subtraction over addition)
108
+ anti_patterns:
109
+ - bright transient-heavy hats
110
+ - crisp EDM clap dominance
111
+ - full-grid quantization
112
+ - obvious boom-bap clichés
113
+ novelty_budget: 0.65
114
+ target_dimensions:
115
+ depth: 0.22
116
+ groove: 0.20
117
+ motion: 0.14
118
+ contrast: 0.12
119
+ novelty: 0.12
120
+ cohesion: 0.10
121
+ clarity: 0.10
122
+ locked_dimensions: [] # silent = no locks, BUT structural change flagged in identity (see silent-locks rule)
123
+ last_move_target: null # fresh session
124
+ recommended_skill_chain:
125
+ - livepilot-sound-design-engine # chord stab + filtered delay + reverb tails
126
+ - livepilot-notes # swing + micro-timing shifts on hats
127
+ - livepilot-arrangement # negative-space section logic
128
+ - livepilot-evaluation # artistic dimensions must pass
129
+ ```
130
+
131
+ ## Example 2 — "Make the drums more interesting, don't touch the arrangement"
132
+
133
+ ```yaml
134
+ creative_brief:
135
+ identity: "Increase drum character without destabilizing the track's form"
136
+ reference_anchors: [] # no external reference named
137
+ protected_qualities:
138
+ - current arrangement shape
139
+ - overall density
140
+ anti_patterns:
141
+ - every-bar fills
142
+ - ornamental velocity rides that don't alter feel
143
+ - sterile quantization
144
+ novelty_budget: 0.55
145
+ target_dimensions:
146
+ groove: 0.25
147
+ novelty: 0.18
148
+ motion: 0.15
149
+ contrast: 0.12
150
+ depth: 0.10
151
+ cohesion: 0.10
152
+ clarity: 0.10
153
+ locked_dimensions:
154
+ - structural # user said "don't touch the arrangement" — section-level off-limits; rhythmic clip edits still allowed
155
+ last_move_target: null
156
+ recommended_skill_chain:
157
+ - livepilot-notes # swing, ghost notes, probability, micro-timing
158
+ - livepilot-sound-design-engine # drum timbre variations per hit
159
+ - livepilot-evaluation
160
+ ```
161
+
162
+ ## Example 3 — "Just quickly, make it sound a bit more like Basic Channel"
163
+
164
+ Speed pressure ("just quickly" / "don't overthink it") does NOT skip
165
+ the brief; it compresses prose. Reference-adjacent ask ("a bit more
166
+ like") maps to `novelty_budget ≈ 0.45`.
167
+
168
+ ```yaml
169
+ creative_brief:
170
+ identity: "Basic Channel-adjacent dub-techno posture — space and tail as harmonic vehicle, restrained top end"
171
+ reference_anchors:
172
+ - type: artist
173
+ name: "Basic Channel"
174
+ source: user
175
+ protected_qualities:
176
+ - existing chord content (reference-adjacent, not reference-replacement)
177
+ - low-end weight / mono sub
178
+ - current arrangement shape (structural not named in scope)
179
+ anti_patterns:
180
+ - bright transient-heavy hats # packet avoid
181
+ - dry signals / short tails # packet avoid
182
+ - pre-mixed "finished" presets # packet avoid
183
+ novelty_budget: 0.45 # "a bit more like" → reference-adjacent
184
+ target_dimensions:
185
+ depth: 0.24
186
+ motion: 0.18
187
+ cohesion: 0.14
188
+ groove: 0.12
189
+ contrast: 0.12
190
+ novelty: 0.10
191
+ clarity: 0.10
192
+ locked_dimensions: []
193
+ last_move_target: null
194
+ recommended_skill_chain:
195
+ - livepilot-devices # return track setup (Ping-Pong Delay → Convolution Reverb)
196
+ - livepilot-sound-design-engine # chord routing, filter-on-return
197
+ - livepilot-mix-engine # narrow-to-mono sub
198
+ - livepilot-evaluation
199
+ ```
200
+
201
+ ## Example 4 — Exact-parameter request (NO BRIEF)
202
+
203
+ > "Set track 3 volume to -6 dB."
204
+
205
+ This is operational, not creative. The director does not fire. No brief.
206
+ The agent routes directly to `set_track_volume`.
207
+
208
+ ## Field-absence rules
209
+
210
+ - If `reference_anchors` is empty AND no concept packet loads → `identity`
211
+ comes from current `project_brain` identity statement, or from
212
+ re-reading the user prompt's most recent aesthetic adjective
213
+ - If `anti_patterns` is empty → fall back to recent `get_anti_preferences`
214
+ results; if that is empty too, the brief is brittle — flag the gap
215
+ - If `target_dimensions` cannot be inferred → use a flat weight (all
216
+ ≈0.14) and note the weakness in the turn
217
+
218
+ ## Emit rule
219
+
220
+ The brief appears ONCE per creative turn, at the top of the assistant
221
+ message, before any Phase 3 tool call. It is for the user to see and
222
+ correct. Treat user edits to the brief as authoritative.
@@ -0,0 +1,185 @@
1
+ # Hybrid Concept Packet Compilation
2
+
3
+ **Tool:** `compile_hybrid_brief(packet_ids: list[str], weights: list[float] | None = None)`
4
+ **Module:** `mcp_server/creative_director/hybrid.py`
5
+ **Shipped:** v1.19.0 (Item B from `docs/plans/v1.19-structural-plan.md` §3)
6
+
7
+ ---
8
+
9
+ ## When to call it
10
+
11
+ Phase 1 of the creative director skill. If the user names **two or more**
12
+ reference points in their request, call this tool before Phase 2 brief
13
+ compilation. Examples:
14
+
15
+ | User prompt | Call |
16
+ |---|---|
17
+ | "Basic Channel meets Dilla swing" | `compile_hybrid_brief(["basic-channel", "j-dilla"])` |
18
+ | "Villalobos but sparse like Gas" | `compile_hybrid_brief(["villalobos", "gas"])` |
19
+ | "Madlib chop with Photek precision" | `compile_hybrid_brief(["madlib", "photek-source-direct"])` |
20
+ | "Boards-of-Canada sound design, Basic Channel space, Dilla drums" | `compile_hybrid_brief(["boards-of-canada", "basic-channel", "j-dilla"])` |
21
+
22
+ Do NOT call this when:
23
+
24
+ - Only one reference is named (just load the single packet)
25
+ - The user names references but asks for a move that doesn't use the
26
+ brief's `reach_for` or `avoid` (e.g., "make the kick louder" — trivial
27
+ direct action, no packet merge needed)
28
+ - You're in a continuation turn on an already-compiled hybrid
29
+ brief — reuse the brief from the session record
30
+
31
+ ---
32
+
33
+ ## Merge rules (canonical)
34
+
35
+ These rules are enforced in
36
+ `mcp_server/creative_director/hybrid.py::_compile_from_packets`. The
37
+ table shows what each packet field does when N packets are merged.
38
+
39
+ | Field | Merge strategy | Rationale |
40
+ |---|---|---|
41
+ | `sonic_identity` | UNION | hybrids describe the envelope of both sounds |
42
+ | `reach_for.instruments` / `effects` / `packs` / `utilities` | UNION | candidate pool widens; let Phase 3 filter |
43
+ | `avoid` | UNION | both packets' hard filters apply — stricter wins |
44
+ | `rhythm_idioms` / `harmony_idioms` / `arrangement_idioms` / `texture_idioms` | UNION | all stylistic tendencies remain available |
45
+ | `sample_roles` | UNION | all source roles valid |
46
+ | `dimensions_in_scope` | UNION | scope widens to cover both |
47
+ | `dimensions_deprioritized` | INTERSECTION | deprioritize only when ALL packets agree — otherwise one packet wants what the other ignores |
48
+ | `move_family_bias.deprioritize` | INTERSECTION | same logic — don't starve a family one packet depends on |
49
+ | `move_family_bias.favor` | INTERSECTION when non-empty, UNION fallback with warning | focus where both agree; when disjoint, span both (warn — hybrid may blur) |
50
+ | `evaluation_bias.target_dimensions` | WEIGHTED AVERAGE (default uniform) | continuous blend, weights sum to 1.0 |
51
+ | `evaluation_bias.protect` | MAX per dimension | stricter floor wins (protect=0.80 beats 0.75) |
52
+ | `novelty_budget_default` | MAX | hybrid asks skew exploratory — let the more adventurous packet lead |
53
+ | `tempo_hint` | NEAREST-OVERLAP: intersect overlapping ranges, else midpoint + warn | disjoint tempos = real ambiguity to surface |
54
+
55
+ ---
56
+
57
+ ## Output shape
58
+
59
+ ```yaml
60
+ type: hybrid
61
+ source_packets: [basic-channel, j-dilla]
62
+ weights: [0.5, 0.5]
63
+ name: "Basic Channel / Rhythm & Sound × J Dilla"
64
+
65
+ sonic_identity: [...] # UNION
66
+ reach_for: # UNION per-subfield
67
+ instruments: [...]
68
+ effects: [...]
69
+ packs: [...]
70
+ utilities: [...]
71
+
72
+ avoid: [...] # UNION
73
+ anti_patterns: [...] # alias of avoid — compat with
74
+ # check_brief_compliance
75
+
76
+ rhythm_idioms: [...] # UNION
77
+ harmony_idioms: [...]
78
+ arrangement_idioms: [...]
79
+ texture_idioms: [...]
80
+ sample_roles: [...]
81
+
82
+ evaluation_bias:
83
+ target_dimensions: # WEIGHTED AVERAGE
84
+ groove: 0.19 # e.g., (0.12 + 0.26) / 2
85
+ depth: 0.20
86
+ ...
87
+ protect: # MAX per dimension
88
+ low_end: 0.80 # e.g., max(0.80, 0.75)
89
+ cohesion: 0.68
90
+ ...
91
+
92
+ move_family_bias:
93
+ favor: [sound_design, device_creation] # INTERSECTION
94
+ deprioritize: [performance] # INTERSECTION
95
+
96
+ dimensions_in_scope: [...] # UNION
97
+ dimensions_deprioritized: [] # INTERSECTION (often empty for hybrids)
98
+ locked_dimensions: [] # NEVER locked by hybrid itself
99
+
100
+ novelty_budget_default: 0.6 # MAX
101
+ tempo_hint:
102
+ min: 107.5 # or overlap range, or midpoint+disjoint flag
103
+ max: 110.0
104
+ time_signature: "4/4"
105
+ disjoint: true # present only when tempo ranges didn't overlap
106
+
107
+ warnings: # human-readable ambiguity notes
108
+ - "Tempo ranges don't overlap (Basic Channel 120-130; J Dilla 85-95)
109
+ — defaulting to midpoint 108 BPM. Specify which anchor you want
110
+ or pick a single packet."
111
+ ```
112
+
113
+ ---
114
+
115
+ ## Handling the `warnings` list
116
+
117
+ `warnings` is a signal the merge algorithm had to make a choice the
118
+ user's prompt didn't disambiguate. Surface every entry in your Phase 2
119
+ brief — DO NOT silently accept the defaulted value.
120
+
121
+ | Warning kind | What it means | What to do in the brief |
122
+ |---|---|---|
123
+ | **Tempo disjoint** | Source packets' tempo ranges don't overlap | Cite the ranges in the identity line, ask the user to pick an anchor or state a target tempo |
124
+ | **Favor union fallback** | `favor` lists had empty intersection, fell back to UNION | Note that the hybrid may span more move families than either source intends; lean harder on user framing in Phase 3 |
125
+ | **(Future warnings)** | Any future ambiguity the merge algorithm detects | Surface literally — don't paraphrase |
126
+
127
+ ---
128
+
129
+ ## Interoperability
130
+
131
+ - **`check_brief_compliance`** (v1.18.3): the hybrid brief passes
132
+ directly. The merged `avoid` list is also exposed as `anti_patterns`
133
+ for compat; `locked_dimensions` is always `[]` (hybrids don't lock).
134
+ - **Phase 3 plan candidates**: use `reach_for` to seed devices,
135
+ `avoid` as HARD filter on each candidate, `move_family_bias.favor` to
136
+ weight family diversity.
137
+ - **Phase 7 learning**: `source_packets` is preserved on the brief, so
138
+ when the user accepts a plan you can record which hybrid produced it
139
+ (taste over time).
140
+
141
+ ---
142
+
143
+ ## Example: BC × Dilla
144
+
145
+ ```python
146
+ brief = compile_hybrid_brief(["basic-channel", "j-dilla"])
147
+
148
+ # Merged avoid (UNION):
149
+ # bright top-end, dry signals, short tails, ... (BC)
150
+ # quantized drums, bright mixes, trap hi-hats, ... (Dilla)
151
+ # → result: both sets enforced
152
+
153
+ # Dimensions:
154
+ # BC deprioritizes [rhythmic]; Dilla deprioritizes [spatial]
155
+ # → INTERSECTION is empty → neither deprioritized in hybrid
156
+ # → UNION of in_scope is {structural, rhythmic, timbral, spatial}
157
+
158
+ # Favor:
159
+ # BC favor = {sound_design, device_creation, mix}
160
+ # Dilla favor = {arrangement, sound_design, device_creation}
161
+ # → INTERSECTION = {sound_design, device_creation}
162
+ # → hybrid plans cluster on sound_design + device_creation
163
+
164
+ # Tempo:
165
+ # BC 120-130, Dilla 85-95 → DISJOINT
166
+ # → warning surfaces; midpoint ~108 BPM returned
167
+ # → Brief must ask user to pick an anchor
168
+ ```
169
+
170
+ ---
171
+
172
+ ## What this is NOT
173
+
174
+ - **Not a taste classifier.** The merge is a syntactic operation over
175
+ packet fields. It doesn't judge whether the hybrid "makes sense" as
176
+ an artistic direction — that's the user's call.
177
+ - **Not a replacement for packet curation.** If the user asks for a
178
+ hybrid you've never heard of that doesn't resolve to existing
179
+ packets, `compile_hybrid_brief` raises `ValueError`. Fall back to
180
+ the narrative `.md` files and note the missing packet as v1.20+
181
+ scope.
182
+ - **Not for more than ~4 packets.** The merge runs at any N, but
183
+ target_dimensions weighted average gets noisy as N grows
184
+ ("nothing is emphasized"). Prompts with 4+ references usually
185
+ deserve clarification, not automatic merging.
@@ -0,0 +1,258 @@
1
+ # Move-Family Diversity Rule
2
+
3
+ The single mechanical rule that prevents pattern-repetition: when the
4
+ director generates three plans, their DOMINANT moves must come from
5
+ three DIFFERENT `move.family` values.
6
+
7
+ This is not taste. This is a structural constraint enforced before
8
+ preview or ranking.
9
+
10
+ ## Family vs. dimension — two different axes
11
+
12
+ The director reasons on two orthogonal axes:
13
+
14
+ - **`move.family`** — WHERE in the semantic_moves registry the dominant
15
+ move lives. Six stable values, code-enforced. This is what the
16
+ diversity rule operates on.
17
+ - **`dimension`** — WHAT kind of musical consequence the plan has.
18
+ Four values: structural / rhythmic / timbral / spatial. This is what
19
+ the four-move rule operates on.
20
+
21
+ A rhythmic plan has a rhythmic DIMENSION but its FAMILY is typically
22
+ `arrangement` (clip-level pattern change) or `sound_design` (per-hit
23
+ timbre variation that changes feel). That is **not** a fudge — it is
24
+ the correct taxonomy, because rhythmic work in Ableton happens via
25
+ note editing + grooves, which are tooled through those families. Tag
26
+ such a seed with `dimension_hint: "rhythmic"` so downstream evaluation
27
+ knows what dimension was touched.
28
+
29
+ ## The seven canonical families
30
+
31
+ Source of truth: the semantic-move registry, populated by both
32
+ `mcp_server/semantic_moves/*.py` AND `mcp_server/sample_engine/moves.py`.
33
+ Never invent an eighth family at the director level.
34
+
35
+ | Family | What it covers | Typical moves | Maps to dimension |
36
+ |---|---|---|---|
37
+ | `mix` | Level / EQ / dynamics / space-via-send / stereo | `tighten_low_end`, `widen_stereo`, `make_punchier`, `darken_without_losing_width`, `reduce_repetition_fatigue`, `make_kick_bass_lock`, `reduce_foreground_competition` | spatial (usually) |
38
+ | `arrangement` | Section-level structure, clip density, and clip-level rhythmic edits | `refresh_repeated_section`, plus structural moves in `mix_moves.py`. Rhythmic plans that edit notes / grooves / motifs sit here via `dimension_hint: "rhythmic"`. | structural — or rhythmic with dimension_hint |
39
+ | `transition` | Between-section energy and motion | `create_buildup_tension`, `smooth_scene_handoff`, `increase_contrast_before_payoff`, `bridge_sections`, `open_chorus`, `create_breakdown`, `increase_forward_motion` | structural |
40
+ | `sound_design` | Timbre of individual sources. Per-hit velocity / probability / micro-timing variations also sit here when they change feel, not pattern. | `add_warmth`, `add_texture`, `shape_transients`, `add_space` | timbral — or rhythmic with dimension_hint when per-hit-timing oriented |
41
+ | `performance` | Live-safe energy shaping | `recover_energy`, `decompress_tension`, `safe_spotlight`, `emergency_simplify` | (context-specific) |
42
+ | `device_creation` | New device / rack / instrument load. Generates Max for Live M4L devices procedurally. | `create_chaos_modulator`, `create_feedback_resonator`, `create_wavefolder_effect`, `create_bitcrusher_effect`, `create_karplus_string`, `create_stochastic_texture`, `create_fdn_reverb` | timbral |
43
+ | `sample` | Sample-based creative moves — chop, layer, stretch, resample, one-shot. Lives in `sample_engine/moves.py`. | `sample_chop_rhythm`, `sample_texture_layer`, `sample_vocal_ghost`, `sample_break_layer`, `sample_resample_destroy`, `sample_one_shot_accent` | rhythmic (chop / break / one-shot) or timbral (texture / vocal_ghost / resample) |
44
+
45
+ **Discovery:** always call `list_semantic_moves(domain=<family>)` at
46
+ runtime to enumerate — do not hardcode move IDs. Families are stable;
47
+ the move catalog grows. As of v1.26.1 the runtime returns 44 moves
48
+ across all 7 domains.
49
+
50
+ **Why the director never invents an eighth `rhythmic` family:** the
51
+ move registry is the execution substrate. A family that exists in
52
+ documentation but not in `semantic_moves/*.py` or `sample_engine/moves.py`
53
+ cannot be compiled into an experiment seed via the registry path. It
54
+ would force every rhythmic seed onto the `freeform` / `technique`
55
+ source path with a hand-assembled `compiled_plan`. Cleaner to keep the
56
+ family set code-aligned and use `dimension_hint` to record the musical
57
+ consequence.
58
+
59
+ **Note on the `sample` family:** sample-based creative work was
60
+ historically documented as "sample_engine is not a semantic_move
61
+ family" (see the Sample-heavy workflows section below). That was wrong
62
+ — v1.18.0 verification against `list_semantic_moves()` confirmed
63
+ `sample` is a legitimate domain with 6 moves. Prefer sample-family
64
+ moves over tagging sample work as `sound_design` or `device_creation`
65
+ when the dominant operation IS chopping / stretching / resampling.
66
+
67
+ ## The rule
68
+
69
+ Generate three seeds. For each seed, identify its DOMINANT move (the
70
+ first step in the compiled plan, or the single `move_id` for
71
+ `source="semantic_move"` seeds). The `.family` attribute of those three
72
+ dominant moves must be three different values from the canonical set.
73
+
74
+ ```
75
+ plan_A.dominant.family != plan_B.dominant.family
76
+ plan_B.dominant.family != plan_C.dominant.family
77
+ plan_A.dominant.family != plan_C.dominant.family
78
+ ```
79
+
80
+ If any two match → regenerate the offending plan from a different family.
81
+
82
+ ## Low-novelty escape hatch
83
+
84
+ The 3-distinct-families rule exists to prevent collapse-to-mode on
85
+ creative intent. But "creative intent" spans a wide novelty range (see
86
+ `creative-brief-template.md` novelty_budget table). At the conservative
87
+ end, the rule fights against the user's ask.
88
+
89
+ **If the brief's `novelty_budget < 0.35`** (e.g., "keep the vibe, just
90
+ cleaner", "tighten it up", "final polish"), the 3-family rule is
91
+ RELAXED:
92
+
93
+ | novelty_budget | Minimum distinct families |
94
+ |---|---|
95
+ | `< 0.35` | 1-2 is honest; 3 is fabricated |
96
+ | `0.35 – 0.50` | 2 minimum; 3 ideal |
97
+ | `> 0.50` | 3 required (standard rule) |
98
+
99
+ **Rationale:** low novelty_budget signals refinement, not exploration.
100
+ A user asking "make it cleaner" under an active Basic Channel packet
101
+ rightly gets 1-2 mix-family plans (low-end clean-up, tail tail-taming,
102
+ send level adjustment) — inventing a structural or sound_design plan
103
+ for them would ignore what they asked for. That's exactly the
104
+ "generic_fallback" failure mode the verdict taxonomy catches on the
105
+ OTHER end — the director shouldn't produce it preemptively by forcing
106
+ divergence the user didn't want.
107
+
108
+ **Honesty requirements when the escape hatch applies:**
109
+ - State the novelty_budget value in the brief's notes
110
+ - Name the rule: "Low-novelty escape hatch — 3-family rule relaxed"
111
+ - Still differentiate the 1-2 plans meaningfully (different target,
112
+ different parameter direction) — the rule relaxation is about the
113
+ family-count constraint, NOT the no-fabricated-distinctness rule
114
+ which applies always
115
+
116
+ **Anti-pattern under the escape hatch:** shipping 2 plans that are
117
+ "same move with different EQ Q" or "same send at different levels".
118
+ Even under relaxed family rules, plans must have distinct musical
119
+ consequence. Use different TARGETS (different tracks) or different
120
+ MECHANISMS (EQ vs. Utility gain vs. saturator input drive) to stay
121
+ honest.
122
+
123
+ ## How to pick the dominant move for a multi-step seed
124
+
125
+ For `source="freeform"` / `"synthesis"` / `"composer"` / `"technique"`
126
+ seeds that arrive with a compiled plan:
127
+
128
+ 1. The dominant move is the step with the **highest musical consequence**,
129
+ not the first step in execution order.
130
+ 2. Heuristic: a step that changes identity (new device, new section,
131
+ new timbre) outranks a step that tunes parameters.
132
+ 3. If ambiguous: tag the seed with a `family_hint` in the seed dict and
133
+ use that.
134
+
135
+ ## Anti-examples — fabricated distinctness
136
+
137
+ **REJECT these seed sets.** They look different but collapse to one pattern:
138
+
139
+ - Three `mix` plans with different EQ curves on the same track
140
+ → all `family="mix"` — the agent is converging to "mixing".
141
+ - `add_warmth` + `add_texture` + `add_space` — all three are `sound_design`.
142
+ The agent found the sound-design hammer and is hitting everything.
143
+ - Three seeds using different references (Villalobos / Basic Channel /
144
+ Gas) but all routing to `sound_design` moves — reference diversity
145
+ is not family diversity.
146
+ - Two plans that both add a send to the same reverb with different levels.
147
+
148
+ **ACCEPT these:** family is actually different.
149
+
150
+ - Plan A: `arrangement` (breakdown at bar 48) + Plan B: `sound_design`
151
+ (dub chord on pad) + Plan C: `mix` (widen_stereo on hats bus)
152
+ - Plan A: `transition` (increase_forward_motion into drop) + Plan B:
153
+ `device_creation` (add Granulator III on vocal) + Plan C:
154
+ `sound_design` (shape_transients on kick)
155
+
156
+ ## Edge cases
157
+
158
+ ### User pre-locked a dimension
159
+
160
+ If the brief's `locked_dimensions` excludes one or more dimensions
161
+ (e.g., "don't touch the arrangement"), the families that map to those
162
+ dimensions are off-limits. See `the-four-move-rule.md` for the map.
163
+
164
+ With one lock: the remaining families still must differ across three plans.
165
+ With two locks: only 2 dimensions left — ship 2 plans, not 3 (honesty rule).
166
+
167
+ ### Mix excluded by recency — family-collision risk
168
+
169
+ When the recency rule excludes `mix` (≥ 5 of 10 in `get_action_ledger_summary(limit=10)`), the
170
+ natural fallback plans often collapse into two `arrangement`-family
171
+ plans — one structural (insert a breakdown) and one rhythmic (clip
172
+ groove + probability edits). Both are honest `arrangement` with
173
+ different `dimension_hint` tags, but the diversity rule requires three
174
+ distinct families.
175
+
176
+ **Pre-empt the collision:** when `mix` is excluded and you want both
177
+ structural AND rhythmic coverage, route the structural plan through
178
+ `transition` family (`create_breakdown`, `create_buildup_tension`,
179
+ `bridge_sections`, `increase_forward_motion`) rather than
180
+ `arrangement`. Both families can deliver structural consequence;
181
+ `transition` is the one that leaves `arrangement` free for the
182
+ rhythmic plan.
183
+
184
+ Allowed combinations when mix is excluded:
185
+ - `transition` (structural) + `arrangement` (rhythmic) + `sound_design` (timbral) ✅
186
+ - `arrangement` (structural) + `sound_design` (rhythmic, per-hit) + `device_creation` (timbral) ✅
187
+ - `arrangement` (structural) + `arrangement` (rhythmic) — ❌ family collision, regenerate
188
+
189
+ ### Fewer than three families plausibly apply
190
+
191
+ Example: the user's "more warmth on the master" request genuinely only
192
+ has `mix` and `sound_design` as credible families. Do NOT fabricate a
193
+ `device_creation` plan to hit three.
194
+
195
+ - Ship two plans across the two real families
196
+ - Document explicitly: "Only 2 plans — the ask narrows to {mix,
197
+ sound_design}; forcing a third would be theatre."
198
+ - This is inherited from Wonder's honesty rule
199
+ - This is ACCEPTABLE on stuck-rescue contexts; on a first-pass creative
200
+ call, re-read the concept packet and check whether a third family
201
+ was overlooked before giving up
202
+
203
+ ### The concept packet mandates a family
204
+
205
+ If the packet's `reach_for.techniques` cluster in one family, use that
206
+ family for the dominant plan — but the OTHER two plans still vary.
207
+ Packet specifies the center; diversity rule specifies the spread.
208
+
209
+ ### Sample-heavy workflows
210
+
211
+ As of v1.18.0, `sample` IS a semantic_move family (registry lives in
212
+ `sample_engine/moves.py`). For dominant-sample work, prefer sample-
213
+ family moves directly:
214
+
215
+ - Rhythmic chopping → `sample_chop_rhythm` or `sample_break_layer`
216
+ - Atmospheric layering → `sample_texture_layer`
217
+ - Vocal transformation → `sample_vocal_ghost`
218
+ - Destructive transformation → `sample_resample_destroy`
219
+ - Punctuation → `sample_one_shot_accent`
220
+
221
+ Only fall back to `sound_design` or `device_creation` when the dominant
222
+ action is PATCH-level programming or NEW-device loading rather than
223
+ sample-level manipulation. Loading Simpler with a degraded source,
224
+ for instance, is `device_creation` (loading the instrument); chopping
225
+ an already-loaded sample is `sample`.
226
+
227
+ ### Rhythmic plans
228
+
229
+ A rhythmic plan (one whose primary consequence is swing / ghost-note
230
+ programming / probability / motif transformation / groove assignment)
231
+ dominates as `arrangement` if it edits clip content or pattern, OR as
232
+ `sound_design` if it shapes per-hit timbre/velocity in a way that
233
+ changes feel. Always attach `dimension_hint: "rhythmic"` to the seed.
234
+
235
+ Two rhythmic plans across a diverse set are fine IF their dominant
236
+ families differ (one `arrangement`, one `sound_design`). Two rhythmic
237
+ plans both tagged `arrangement` = fabricated distinctness by the same
238
+ rule that forbids two `mix` plans.
239
+
240
+ ## What to write into the turn
241
+
242
+ After Phase 3 generation, explicitly state the family split. Example:
243
+
244
+ > Three plans:
245
+ > - **A (sound_design):** Dub chord stab into filtered delay send.
246
+ > - **B (arrangement):** Negative-space breakdown at bar 48, ghost percussion only.
247
+ > - **C (mix):** Widen stereo on hats bus, narrow sub to mono under 80 Hz.
248
+
249
+ This makes the diversity legible and auditable by the user.
250
+
251
+ ## Why this works
252
+
253
+ "Pattern repetition" is a signal that the agent keeps choosing the same
254
+ family (usually `mix` or `sound_design`, because those are the
255
+ easiest/safest). Forcing three families forces the agent to consider
256
+ structural and transitional moves it would otherwise skip. That is
257
+ where the "distinct musical idea, not just distinct parameters"
258
+ property comes from.