livepilot 1.26.0 → 1.26.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/README.md +1 -1
- package/installer/codex.js +87 -9
- package/livepilot/.Codex-plugin/plugin.json +8 -0
- package/livepilot/.claude-plugin/plugin.json +8 -0
- package/livepilot/.mcp.json +8 -0
- package/livepilot/agents/livepilot-producer/AGENT.md +314 -0
- package/livepilot/commands/arrange.md +47 -0
- package/livepilot/commands/beat.md +81 -0
- package/livepilot/commands/evaluate.md +49 -0
- package/livepilot/commands/memory.md +22 -0
- package/livepilot/commands/mix.md +47 -0
- package/livepilot/commands/perform.md +42 -0
- package/livepilot/commands/session.md +13 -0
- package/livepilot/commands/sounddesign.md +58 -0
- package/livepilot/rubrics/default_preset_check.md +82 -0
- package/livepilot/rubrics/layer_accumulation.md +79 -0
- package/livepilot/rubrics/layer_precision.md +79 -0
- package/livepilot/rubrics/modulation_presence.md +63 -0
- package/livepilot/rubrics/sound_design_depth.md +40 -0
- package/livepilot/skills/livepilot-arrangement/SKILL.md +164 -0
- package/livepilot/skills/livepilot-composition-engine/SKILL.md +151 -0
- package/livepilot/skills/livepilot-composition-engine/references/form-patterns.md +97 -0
- package/livepilot/skills/livepilot-composition-engine/references/transition-archetypes.md +102 -0
- package/livepilot/skills/livepilot-core/SKILL.md +261 -0
- package/livepilot/skills/livepilot-core/references/ableton-workflow-patterns.md +831 -0
- package/livepilot/skills/livepilot-core/references/affordances/_schema.md +160 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/auto-filter.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/chorus-ensemble.yaml +91 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/compressor.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/convolution-reverb.yaml +113 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/corpus.yaml +84 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/drift.yaml +105 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/echo.yaml +108 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/eq-eight.yaml +95 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/glue-compressor.yaml +88 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/granulator-iii.yaml +104 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/hybrid-reverb.yaml +83 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/operator.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/ping-pong-delay.yaml +104 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/poli.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/saturator.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/shifter.yaml +77 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/simpler.yaml +113 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/utility.yaml +95 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/vinyl-distortion.yaml +92 -0
- package/livepilot/skills/livepilot-core/references/affordances/devices/wavetable.yaml +98 -0
- package/livepilot/skills/livepilot-core/references/artist-vocabularies.md +389 -0
- package/livepilot/skills/livepilot-core/references/automation-atlas.md +272 -0
- package/livepilot/skills/livepilot-core/references/concepts/_schema.md +158 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/akufen.yaml +116 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/aphex-twin.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/arca-sophie.yaml +131 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/autechre.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/basic-channel.yaml +140 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/basinski.yaml +126 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/boards-of-canada.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/burial.yaml +127 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/com-truise-tycho.yaml +121 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/daft-punk.yaml +117 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/dj-premier-rza.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/gas.yaml +134 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/hawtin.yaml +127 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/isolee-luomo.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/j-dilla.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/jeff-mills.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/johannsson-richter.yaml +132 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/madlib.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/moodymann-theo-parrish.yaml +121 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/oneohtrix-point-never.yaml +126 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/photek-source-direct.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/rashad-spinn-traxman.yaml +122 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/robert-henke.yaml +113 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/shackleton.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/skream-mala.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/stars-of-the-lid.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/tim-hecker.yaml +122 -0
- package/livepilot/skills/livepilot-core/references/concepts/artists/villalobos.yaml +135 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/ambient.yaml +137 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/boom_bap.yaml +124 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/deep-minimal.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/deep_house.yaml +130 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/detroit_techno.yaml +116 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/disco.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/downtempo.yaml +129 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/drone.yaml +133 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/drum-and-bass.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/dub-techno.yaml +132 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/dub.yaml +129 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/dubstep.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/experimental.yaml +136 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/footwork.yaml +119 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/hip-hop.yaml +132 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/house.yaml +126 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/hyperpop.yaml +128 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/idm.yaml +134 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/lo_fi.yaml +129 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/microhouse.yaml +138 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/minimal-techno.yaml +116 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/modern-classical.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/soul.yaml +125 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/synthwave.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/techno.yaml +123 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/trap.yaml +120 -0
- package/livepilot/skills/livepilot-core/references/concepts/genres/uk-garage.yaml +121 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/00-index.md +110 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/distortion-and-character.md +687 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/drums-and-percussion.md +753 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/dynamics-and-punch.md +525 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/eq-and-filtering.md +402 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/midi-tools.md +963 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/movement-and-modulation.md +874 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/space-and-depth.md +571 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/spectral-and-weird.md +714 -0
- package/livepilot/skills/livepilot-core/references/device-atlas/synths-native.md +953 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/00-index.md +34 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/automation-as-music.md +204 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/chains-genre.md +173 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/creative-thinking.md +211 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/effects-distortion.md +188 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/effects-space.md +162 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/effects-spectral.md +229 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/instruments-synths.md +243 -0
- package/livepilot/skills/livepilot-core/references/genre-vocabularies.md +382 -0
- package/livepilot/skills/livepilot-core/references/m4l-devices.md +352 -0
- package/livepilot/skills/livepilot-core/references/memory-guide.md +178 -0
- package/livepilot/skills/livepilot-core/references/midi-recipes.md +402 -0
- package/livepilot/skills/livepilot-core/references/mixing-patterns.md +578 -0
- package/livepilot/skills/livepilot-core/references/overview.md +300 -0
- package/livepilot/skills/livepilot-core/references/pack-knowledge.md +319 -0
- package/livepilot/skills/livepilot-core/references/sample-manipulation.md +724 -0
- package/livepilot/skills/livepilot-core/references/sound-design-deep.md +140 -0
- package/livepilot/skills/livepilot-core/references/sound-design.md +393 -0
- package/livepilot/skills/livepilot-corpus-builder/SKILL.md +379 -0
- package/livepilot/skills/livepilot-creative-director/SKILL.md +455 -0
- package/livepilot/skills/livepilot-creative-director/references/anti-repetition-rules.md +214 -0
- package/livepilot/skills/livepilot-creative-director/references/creative-brief-template.md +222 -0
- package/livepilot/skills/livepilot-creative-director/references/hybrid-compilation.md +185 -0
- package/livepilot/skills/livepilot-creative-director/references/move-family-diversity-rule.md +258 -0
- package/livepilot/skills/livepilot-creative-director/references/phase-6-execution.md +409 -0
- package/livepilot/skills/livepilot-creative-director/references/the-four-move-rule.md +192 -0
- package/livepilot/skills/livepilot-devices/SKILL.md +213 -0
- package/livepilot/skills/livepilot-devices/references/load_browser_item-uri-grammar.md +82 -0
- package/livepilot/skills/livepilot-evaluation/SKILL.md +195 -0
- package/livepilot/skills/livepilot-evaluation/references/capability-modes.md +176 -0
- package/livepilot/skills/livepilot-evaluation/references/evaluation-contracts.md +121 -0
- package/livepilot/skills/livepilot-evaluation/references/memory-promotion.md +110 -0
- package/livepilot/skills/livepilot-mix-engine/SKILL.md +136 -0
- package/livepilot/skills/livepilot-mix-engine/references/mix-critics.md +143 -0
- package/livepilot/skills/livepilot-mix-engine/references/mix-moves.md +105 -0
- package/livepilot/skills/livepilot-mixing/SKILL.md +157 -0
- package/livepilot/skills/livepilot-notes/SKILL.md +130 -0
- package/livepilot/skills/livepilot-performance-engine/SKILL.md +122 -0
- package/livepilot/skills/livepilot-performance-engine/references/performance-safety.md +98 -0
- package/livepilot/skills/livepilot-release/SKILL.md +151 -0
- package/livepilot/skills/livepilot-sample-engine/SKILL.md +117 -0
- package/livepilot/skills/livepilot-sample-engine/references/sample-critics.md +87 -0
- package/livepilot/skills/livepilot-sample-engine/references/sample-philosophy.md +51 -0
- package/livepilot/skills/livepilot-sample-engine/references/sample-techniques.md +131 -0
- package/livepilot/skills/livepilot-sound-design-engine/SKILL.md +225 -0
- package/livepilot/skills/livepilot-sound-design-engine/references/patch-model.md +119 -0
- package/livepilot/skills/livepilot-sound-design-engine/references/sound-design-critics.md +118 -0
- package/livepilot/skills/livepilot-wonder/SKILL.md +143 -0
- package/m4l_device/LivePilot_Analyzer.amxd +0 -0
- package/m4l_device/LivePilot_Elektron.amxd +0 -0
- package/m4l_device/LivePilot_Elektron.maxpat +758 -0
- package/m4l_device/livepilot_bridge.js +1 -1
- package/m4l_device/livepilot_elektron_bridge.js +82 -0
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/composer/develop/apply.py +1 -1
- package/mcp_server/composer/full/apply.py +32 -6
- package/mcp_server/m4l_bridge.py +5 -0
- package/mcp_server/runtime/execution_router.py +6 -0
- package/mcp_server/runtime/mcp_dispatch.py +18 -0
- package/mcp_server/runtime/remote_commands.py +2 -0
- package/mcp_server/server.py +11 -7
- package/package.json +20 -5
- package/remote_script/LivePilot/__init__.py +1 -1
- package/remote_script/LivePilot/server.py +63 -2
- package/requirements.txt +3 -3
- package/server.json +3 -3
|
@@ -0,0 +1,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.
|