livepilot 1.26.0 → 1.26.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +1 -1
  3. package/installer/codex.js +87 -9
  4. package/livepilot/.Codex-plugin/plugin.json +8 -0
  5. package/livepilot/.claude-plugin/plugin.json +8 -0
  6. package/livepilot/.mcp.json +8 -0
  7. package/livepilot/agents/livepilot-producer/AGENT.md +314 -0
  8. package/livepilot/commands/arrange.md +47 -0
  9. package/livepilot/commands/beat.md +81 -0
  10. package/livepilot/commands/evaluate.md +51 -0
  11. package/livepilot/commands/memory.md +22 -0
  12. package/livepilot/commands/mix.md +47 -0
  13. package/livepilot/commands/perform.md +42 -0
  14. package/livepilot/commands/session.md +13 -0
  15. package/livepilot/commands/sounddesign.md +58 -0
  16. package/livepilot/rubrics/default_preset_check.md +82 -0
  17. package/livepilot/rubrics/layer_accumulation.md +79 -0
  18. package/livepilot/rubrics/layer_precision.md +79 -0
  19. package/livepilot/rubrics/modulation_presence.md +63 -0
  20. package/livepilot/rubrics/sound_design_depth.md +40 -0
  21. package/livepilot/skills/livepilot-arrangement/SKILL.md +164 -0
  22. package/livepilot/skills/livepilot-composition-engine/SKILL.md +151 -0
  23. package/livepilot/skills/livepilot-composition-engine/references/form-patterns.md +97 -0
  24. package/livepilot/skills/livepilot-composition-engine/references/transition-archetypes.md +102 -0
  25. package/livepilot/skills/livepilot-core/SKILL.md +261 -0
  26. package/livepilot/skills/livepilot-core/references/ableton-workflow-patterns.md +831 -0
  27. package/livepilot/skills/livepilot-core/references/affordances/_schema.md +160 -0
  28. package/livepilot/skills/livepilot-core/references/affordances/devices/auto-filter.yaml +133 -0
  29. package/livepilot/skills/livepilot-core/references/affordances/devices/chorus-ensemble.yaml +91 -0
  30. package/livepilot/skills/livepilot-core/references/affordances/devices/compressor.yaml +98 -0
  31. package/livepilot/skills/livepilot-core/references/affordances/devices/convolution-reverb.yaml +113 -0
  32. package/livepilot/skills/livepilot-core/references/affordances/devices/corpus.yaml +84 -0
  33. package/livepilot/skills/livepilot-core/references/affordances/devices/drift.yaml +105 -0
  34. package/livepilot/skills/livepilot-core/references/affordances/devices/echo.yaml +108 -0
  35. package/livepilot/skills/livepilot-core/references/affordances/devices/eq-eight.yaml +95 -0
  36. package/livepilot/skills/livepilot-core/references/affordances/devices/glue-compressor.yaml +88 -0
  37. package/livepilot/skills/livepilot-core/references/affordances/devices/granulator-iii.yaml +104 -0
  38. package/livepilot/skills/livepilot-core/references/affordances/devices/hybrid-reverb.yaml +83 -0
  39. package/livepilot/skills/livepilot-core/references/affordances/devices/operator.yaml +98 -0
  40. package/livepilot/skills/livepilot-core/references/affordances/devices/ping-pong-delay.yaml +104 -0
  41. package/livepilot/skills/livepilot-core/references/affordances/devices/poli.yaml +98 -0
  42. package/livepilot/skills/livepilot-core/references/affordances/devices/saturator.yaml +98 -0
  43. package/livepilot/skills/livepilot-core/references/affordances/devices/shifter.yaml +77 -0
  44. package/livepilot/skills/livepilot-core/references/affordances/devices/simpler.yaml +113 -0
  45. package/livepilot/skills/livepilot-core/references/affordances/devices/utility.yaml +95 -0
  46. package/livepilot/skills/livepilot-core/references/affordances/devices/vinyl-distortion.yaml +92 -0
  47. package/livepilot/skills/livepilot-core/references/affordances/devices/wavetable.yaml +98 -0
  48. package/livepilot/skills/livepilot-core/references/artist-vocabularies.md +389 -0
  49. package/livepilot/skills/livepilot-core/references/automation-atlas.md +272 -0
  50. package/livepilot/skills/livepilot-core/references/concepts/_schema.md +158 -0
  51. package/livepilot/skills/livepilot-core/references/concepts/artists/akufen.yaml +116 -0
  52. package/livepilot/skills/livepilot-core/references/concepts/artists/aphex-twin.yaml +133 -0
  53. package/livepilot/skills/livepilot-core/references/concepts/artists/arca-sophie.yaml +131 -0
  54. package/livepilot/skills/livepilot-core/references/concepts/artists/autechre.yaml +130 -0
  55. package/livepilot/skills/livepilot-core/references/concepts/artists/basic-channel.yaml +140 -0
  56. package/livepilot/skills/livepilot-core/references/concepts/artists/basinski.yaml +126 -0
  57. package/livepilot/skills/livepilot-core/references/concepts/artists/boards-of-canada.yaml +124 -0
  58. package/livepilot/skills/livepilot-core/references/concepts/artists/burial.yaml +127 -0
  59. package/livepilot/skills/livepilot-core/references/concepts/artists/com-truise-tycho.yaml +121 -0
  60. package/livepilot/skills/livepilot-core/references/concepts/artists/daft-punk.yaml +117 -0
  61. package/livepilot/skills/livepilot-core/references/concepts/artists/dj-premier-rza.yaml +119 -0
  62. package/livepilot/skills/livepilot-core/references/concepts/artists/gas.yaml +134 -0
  63. package/livepilot/skills/livepilot-core/references/concepts/artists/hawtin.yaml +127 -0
  64. package/livepilot/skills/livepilot-core/references/concepts/artists/isolee-luomo.yaml +130 -0
  65. package/livepilot/skills/livepilot-core/references/concepts/artists/j-dilla.yaml +133 -0
  66. package/livepilot/skills/livepilot-core/references/concepts/artists/jeff-mills.yaml +120 -0
  67. package/livepilot/skills/livepilot-core/references/concepts/artists/johannsson-richter.yaml +132 -0
  68. package/livepilot/skills/livepilot-core/references/concepts/artists/madlib.yaml +124 -0
  69. package/livepilot/skills/livepilot-core/references/concepts/artists/moodymann-theo-parrish.yaml +121 -0
  70. package/livepilot/skills/livepilot-core/references/concepts/artists/oneohtrix-point-never.yaml +126 -0
  71. package/livepilot/skills/livepilot-core/references/concepts/artists/photek-source-direct.yaml +120 -0
  72. package/livepilot/skills/livepilot-core/references/concepts/artists/rashad-spinn-traxman.yaml +122 -0
  73. package/livepilot/skills/livepilot-core/references/concepts/artists/robert-henke.yaml +113 -0
  74. package/livepilot/skills/livepilot-core/references/concepts/artists/shackleton.yaml +124 -0
  75. package/livepilot/skills/livepilot-core/references/concepts/artists/skream-mala.yaml +119 -0
  76. package/livepilot/skills/livepilot-core/references/concepts/artists/stars-of-the-lid.yaml +119 -0
  77. package/livepilot/skills/livepilot-core/references/concepts/artists/tim-hecker.yaml +122 -0
  78. package/livepilot/skills/livepilot-core/references/concepts/artists/villalobos.yaml +135 -0
  79. package/livepilot/skills/livepilot-core/references/concepts/genres/ambient.yaml +137 -0
  80. package/livepilot/skills/livepilot-core/references/concepts/genres/boom_bap.yaml +124 -0
  81. package/livepilot/skills/livepilot-core/references/concepts/genres/deep-minimal.yaml +130 -0
  82. package/livepilot/skills/livepilot-core/references/concepts/genres/deep_house.yaml +130 -0
  83. package/livepilot/skills/livepilot-core/references/concepts/genres/detroit_techno.yaml +116 -0
  84. package/livepilot/skills/livepilot-core/references/concepts/genres/disco.yaml +123 -0
  85. package/livepilot/skills/livepilot-core/references/concepts/genres/downtempo.yaml +129 -0
  86. package/livepilot/skills/livepilot-core/references/concepts/genres/drone.yaml +133 -0
  87. package/livepilot/skills/livepilot-core/references/concepts/genres/drum-and-bass.yaml +119 -0
  88. package/livepilot/skills/livepilot-core/references/concepts/genres/dub-techno.yaml +132 -0
  89. package/livepilot/skills/livepilot-core/references/concepts/genres/dub.yaml +129 -0
  90. package/livepilot/skills/livepilot-core/references/concepts/genres/dubstep.yaml +120 -0
  91. package/livepilot/skills/livepilot-core/references/concepts/genres/experimental.yaml +136 -0
  92. package/livepilot/skills/livepilot-core/references/concepts/genres/footwork.yaml +119 -0
  93. package/livepilot/skills/livepilot-core/references/concepts/genres/hip-hop.yaml +132 -0
  94. package/livepilot/skills/livepilot-core/references/concepts/genres/house.yaml +126 -0
  95. package/livepilot/skills/livepilot-core/references/concepts/genres/hyperpop.yaml +128 -0
  96. package/livepilot/skills/livepilot-core/references/concepts/genres/idm.yaml +134 -0
  97. package/livepilot/skills/livepilot-core/references/concepts/genres/lo_fi.yaml +129 -0
  98. package/livepilot/skills/livepilot-core/references/concepts/genres/microhouse.yaml +138 -0
  99. package/livepilot/skills/livepilot-core/references/concepts/genres/minimal-techno.yaml +116 -0
  100. package/livepilot/skills/livepilot-core/references/concepts/genres/modern-classical.yaml +123 -0
  101. package/livepilot/skills/livepilot-core/references/concepts/genres/soul.yaml +125 -0
  102. package/livepilot/skills/livepilot-core/references/concepts/genres/synthwave.yaml +123 -0
  103. package/livepilot/skills/livepilot-core/references/concepts/genres/techno.yaml +123 -0
  104. package/livepilot/skills/livepilot-core/references/concepts/genres/trap.yaml +120 -0
  105. package/livepilot/skills/livepilot-core/references/concepts/genres/uk-garage.yaml +121 -0
  106. package/livepilot/skills/livepilot-core/references/device-atlas/00-index.md +110 -0
  107. package/livepilot/skills/livepilot-core/references/device-atlas/distortion-and-character.md +687 -0
  108. package/livepilot/skills/livepilot-core/references/device-atlas/drums-and-percussion.md +753 -0
  109. package/livepilot/skills/livepilot-core/references/device-atlas/dynamics-and-punch.md +525 -0
  110. package/livepilot/skills/livepilot-core/references/device-atlas/eq-and-filtering.md +402 -0
  111. package/livepilot/skills/livepilot-core/references/device-atlas/midi-tools.md +963 -0
  112. package/livepilot/skills/livepilot-core/references/device-atlas/movement-and-modulation.md +874 -0
  113. package/livepilot/skills/livepilot-core/references/device-atlas/space-and-depth.md +571 -0
  114. package/livepilot/skills/livepilot-core/references/device-atlas/spectral-and-weird.md +714 -0
  115. package/livepilot/skills/livepilot-core/references/device-atlas/synths-native.md +953 -0
  116. package/livepilot/skills/livepilot-core/references/device-knowledge/00-index.md +34 -0
  117. package/livepilot/skills/livepilot-core/references/device-knowledge/automation-as-music.md +204 -0
  118. package/livepilot/skills/livepilot-core/references/device-knowledge/chains-genre.md +173 -0
  119. package/livepilot/skills/livepilot-core/references/device-knowledge/creative-thinking.md +211 -0
  120. package/livepilot/skills/livepilot-core/references/device-knowledge/effects-distortion.md +188 -0
  121. package/livepilot/skills/livepilot-core/references/device-knowledge/effects-space.md +162 -0
  122. package/livepilot/skills/livepilot-core/references/device-knowledge/effects-spectral.md +229 -0
  123. package/livepilot/skills/livepilot-core/references/device-knowledge/instruments-synths.md +243 -0
  124. package/livepilot/skills/livepilot-core/references/genre-vocabularies.md +382 -0
  125. package/livepilot/skills/livepilot-core/references/m4l-devices.md +352 -0
  126. package/livepilot/skills/livepilot-core/references/memory-guide.md +178 -0
  127. package/livepilot/skills/livepilot-core/references/midi-recipes.md +402 -0
  128. package/livepilot/skills/livepilot-core/references/mixing-patterns.md +578 -0
  129. package/livepilot/skills/livepilot-core/references/overview.md +300 -0
  130. package/livepilot/skills/livepilot-core/references/pack-knowledge.md +319 -0
  131. package/livepilot/skills/livepilot-core/references/sample-manipulation.md +724 -0
  132. package/livepilot/skills/livepilot-core/references/sound-design-deep.md +140 -0
  133. package/livepilot/skills/livepilot-core/references/sound-design.md +393 -0
  134. package/livepilot/skills/livepilot-corpus-builder/SKILL.md +379 -0
  135. package/livepilot/skills/livepilot-creative-director/SKILL.md +462 -0
  136. package/livepilot/skills/livepilot-creative-director/references/anti-repetition-rules.md +214 -0
  137. package/livepilot/skills/livepilot-creative-director/references/creative-brief-template.md +222 -0
  138. package/livepilot/skills/livepilot-creative-director/references/hybrid-compilation.md +185 -0
  139. package/livepilot/skills/livepilot-creative-director/references/move-family-diversity-rule.md +258 -0
  140. package/livepilot/skills/livepilot-creative-director/references/phase-6-execution.md +409 -0
  141. package/livepilot/skills/livepilot-creative-director/references/the-four-move-rule.md +192 -0
  142. package/livepilot/skills/livepilot-devices/SKILL.md +213 -0
  143. package/livepilot/skills/livepilot-devices/references/load_browser_item-uri-grammar.md +82 -0
  144. package/livepilot/skills/livepilot-evaluation/SKILL.md +195 -0
  145. package/livepilot/skills/livepilot-evaluation/references/capability-modes.md +176 -0
  146. package/livepilot/skills/livepilot-evaluation/references/evaluation-contracts.md +121 -0
  147. package/livepilot/skills/livepilot-evaluation/references/memory-promotion.md +110 -0
  148. package/livepilot/skills/livepilot-mix-engine/SKILL.md +144 -0
  149. package/livepilot/skills/livepilot-mix-engine/references/mix-critics.md +143 -0
  150. package/livepilot/skills/livepilot-mix-engine/references/mix-moves.md +105 -0
  151. package/livepilot/skills/livepilot-mixing/SKILL.md +164 -0
  152. package/livepilot/skills/livepilot-notes/SKILL.md +130 -0
  153. package/livepilot/skills/livepilot-performance-engine/SKILL.md +122 -0
  154. package/livepilot/skills/livepilot-performance-engine/references/performance-safety.md +98 -0
  155. package/livepilot/skills/livepilot-release/SKILL.md +151 -0
  156. package/livepilot/skills/livepilot-sample-engine/SKILL.md +117 -0
  157. package/livepilot/skills/livepilot-sample-engine/references/sample-critics.md +87 -0
  158. package/livepilot/skills/livepilot-sample-engine/references/sample-philosophy.md +51 -0
  159. package/livepilot/skills/livepilot-sample-engine/references/sample-techniques.md +131 -0
  160. package/livepilot/skills/livepilot-sound-design-engine/SKILL.md +247 -0
  161. package/livepilot/skills/livepilot-sound-design-engine/references/patch-model.md +119 -0
  162. package/livepilot/skills/livepilot-sound-design-engine/references/sound-design-critics.md +118 -0
  163. package/livepilot/skills/livepilot-wonder/SKILL.md +143 -0
  164. package/m4l_device/LivePilot_Analyzer.amxd +0 -0
  165. package/m4l_device/LivePilot_Elektron.amxd +0 -0
  166. package/m4l_device/LivePilot_Elektron.maxpat +758 -0
  167. package/m4l_device/livepilot_bridge.js +1 -1
  168. package/m4l_device/livepilot_elektron_bridge.js +82 -0
  169. package/mcp_server/__init__.py +1 -1
  170. package/mcp_server/composer/develop/apply.py +1 -1
  171. package/mcp_server/composer/full/apply.py +32 -6
  172. package/mcp_server/composer/full/brief_builder.py +9 -0
  173. package/mcp_server/evaluation/feature_extractors.py +152 -8
  174. package/mcp_server/m4l_bridge.py +5 -0
  175. package/mcp_server/mix_engine/state_builder.py +19 -2
  176. package/mcp_server/mix_engine/tools.py +22 -0
  177. package/mcp_server/runtime/execution_router.py +6 -0
  178. package/mcp_server/runtime/mcp_dispatch.py +18 -0
  179. package/mcp_server/runtime/remote_commands.py +2 -0
  180. package/mcp_server/server.py +11 -7
  181. package/mcp_server/sound_design/tools.py +33 -0
  182. package/mcp_server/tools/_agent_os_engine/evaluation.py +7 -44
  183. package/mcp_server/tools/_agent_os_engine/models.py +2 -1
  184. package/mcp_server/tools/_conductor.py +5 -2
  185. package/mcp_server/tools/_evaluation_contracts.py +1 -1
  186. package/mcp_server/tools/_snapshot_normalizer.py +32 -3
  187. package/package.json +20 -5
  188. package/remote_script/LivePilot/__init__.py +1 -1
  189. package/remote_script/LivePilot/server.py +63 -2
  190. package/requirements.txt +3 -3
  191. package/server.json +3 -3
@@ -0,0 +1,195 @@
1
+ ---
2
+ name: livepilot-evaluation
3
+ description: This skill should be used when the user asks to "evaluate a change", "was that good", "keep or undo", "A/B compare", "rate my change", "check if that helped", or wants to use the universal evaluation loop to judge production moves.
4
+ ---
5
+
6
+ # Evaluation Engine — Universal Move Judgment
7
+
8
+ The evaluation engine is the shared decision layer used by all other engines (mix, sound design, composition, performance). It determines whether a change improved the session, and whether to keep it, undo it, or learn from it.
9
+
10
+ ## The Universal Evaluation Loop
11
+
12
+ Every production move follows this loop regardless of which engine initiated it.
13
+
14
+ ### Step 1 — Compile Goal Vector
15
+
16
+ Call `compile_goal_vector(request_text, targets, protect, mode, aggression)` to establish what you are trying to achieve.
17
+
18
+ **request_text**: a plain-text description of the intended improvement (e.g., "reduce masking between bass and kick in 100-200 Hz range").
19
+
20
+ **targets**: dict of dimension → weight (e.g., `{"punch": 0.4, "weight": 0.3, "clarity": 0.3}`). Weights are normalized to sum to 1.0.
21
+
22
+ **Valid dimensions split into two families:**
23
+
24
+ **Family A — Technical / measurable** (derived from spectrum, RMS, LUFS, masking reports):
25
+ energy, punch, weight, density, brightness, warmth, width, depth, motion, contrast, clarity, cohesion, groove, tension, novelty, polish, emotion.
26
+
27
+ **Family B — Artistic / identity** (derived from concept packets, motif graphs, section labels, taste graphs): required on any goal vector invoked by `livepilot-creative-director`:
28
+ - **style_fit** — how well the result matches the concept packet's sonic_identity
29
+ - **distinctiveness** — how much the result differs from the baseline completion pattern
30
+ - **motif_coherence** — whether recurring motifs survive / evolve meaningfully
31
+ - **section_contrast** — whether section-level differences stay legible
32
+ - **restraint** — whether the result respects protected qualities and avoids additive drift
33
+ - **surprise_without_breakage** — whether novelty was introduced without violating identity
34
+
35
+ Both families share the same 0.0 – 1.0 scale. A technically improved result can still be artistically worse — both must pass for a creative-director turn to be kept.
36
+
37
+ **protect**: dict of dimension → minimum threshold (e.g., `{"clarity": 0.7}`). If a dimension drops below this value after a move, the move is undone.
38
+
39
+ **Modes** control how aggressively you act:
40
+
41
+ - `observe` — read-only analysis, no changes. Use for diagnostics and status checks.
42
+ - `improve` — targeted fixes for specific issues. The default mode. Make the smallest change that addresses the problem.
43
+ - `explore` — creative experimentation. Wider parameter ranges, more tolerance for unexpected results. Use when the user says "try something", "experiment", or "surprise me".
44
+ - `finish` — polish and finalize. Conservative moves only, protect what already works. Use when the user says "almost done", "final touches", or "wrap it up".
45
+ - `diagnose` — identify problems without fixing them. Like observe but with critic analysis. Use when the user says "what's wrong" without asking for fixes.
46
+
47
+ ### Step 2 — Build World Model
48
+
49
+ Call `build_world_model` to snapshot the current session state and available capabilities:
50
+
51
+ - Session info: tracks, clips, devices, tempo, time signature
52
+ - Capability state: analyzer connected, M4L bridge active, FluCoMa available
53
+ - Recent actions: last moves taken and their outcomes
54
+ - Active constraints: performance mode safety limits, user anti-preferences
55
+
56
+ The world model determines what tools are available and what measurements are possible.
57
+
58
+ ### Step 3 — Get Turn Budget
59
+
60
+ Call `get_turn_budget(mode)` to determine how many moves you should make this turn:
61
+
62
+ - `observe` / `diagnose`: 0 moves (read-only)
63
+ - `improve`: 1-3 moves per turn, evaluate after each
64
+ - `explore`: 1-5 moves per turn, wider tolerance
65
+ - `finish`: 1 move per turn, strict evaluation
66
+
67
+ Do not exceed the turn budget. If more work is needed, complete the current turn, report progress, and start a new turn.
68
+
69
+ ### Step 4 — Capture Before
70
+
71
+ Take measurements appropriate to the engine context:
72
+
73
+ - **Mix engine**: `get_master_spectrum` + `get_master_rms`
74
+ - **Sound design**: `get_device_parameters` + `get_master_spectrum`
75
+ - **Composition**: `get_notes` or `get_arrangement_notes` + `get_section_graph`
76
+ - **Universal**: `get_mix_snapshot` for full session state
77
+
78
+ Always capture before executing. Without a before snapshot, evaluation is meaningless.
79
+
80
+ ### Step 5 — Execute Intervention
81
+
82
+ Apply the planned change using the appropriate tool. Execute exactly one move, then proceed to evaluation.
83
+
84
+ ### Step 6 — Capture After
85
+
86
+ Repeat the same measurements from Step 4. Use identical tool calls to ensure comparable data.
87
+
88
+ ### Step 7 — Evaluate
89
+
90
+ Call the appropriate evaluator:
91
+
92
+ - `evaluate_move(goal_vector, before_snapshot, after_snapshot)` — universal evaluator. `goal_vector` is the dict returned by `compile_goal_vector`. Snapshots should contain `spectrum` (9-band dict sub_low → air, or 8-band from pre-v1.16 .amxd builds), `rms`, `peak`.
93
+ - `evaluate_mix_move(before_snapshot, after_snapshot, targets, protect)` — mix-specific with protection constraints. `targets` and `protect` are dicts of dimension → weight/threshold.
94
+ - `evaluate_composition_move(before_snapshot, after_snapshot, goal_vector)` — composition-specific
95
+ - `evaluate_with_fabric(engine, before_snapshot, after_snapshot, targets, protect)` — routes to the appropriate engine-specific evaluator. `engine` must be one of: `"sonic"`, `"composition"`, `"mix"`, `"transition"`, `"translation"`.
96
+
97
+ ### Step 8 — Read the Verdict
98
+
99
+ Every evaluator returns:
100
+
101
+ - `keep_change` (bool): whether the change should stay
102
+ - `score` (0.0-1.0): magnitude of improvement (0.5 = neutral, >0.5 = better, <0.5 = worse)
103
+ - `goal_progress` (0.0-1.0): how much closer to the stated goal
104
+ - `collateral_damage` (list): things that got worse as a side effect
105
+ - `explanation` (string): human-readable judgment summary
106
+
107
+ ### Step 8b — Creative-Success Verdict (for creative-director turns)
108
+
109
+ When the evaluation is invoked by `livepilot-creative-director`, also
110
+ assign one of five verdict tags. This is a structured classification
111
+ on top of `keep_change` / `score`, for learning and debugging:
112
+
113
+ | Verdict | Meaning | Technical score | Artistic score | User kept | Action |
114
+ |---|---|---|---|---|---|
115
+ | `safe_win` | Low-novelty move that landed cleanly | ≥ 0.6 | ≥ 0.55 | yes | Memory-learn candidate. Use as baseline for future similar asks. |
116
+ | `bold_win` | High-novelty move that landed and stuck | ≥ 0.55 | ≥ 0.65 | yes | STRONG memory-learn candidate. Surface when user asks for similar in the future. |
117
+ | `interesting_failure` | Novel, didn't land technically, but user kept for study | < 0.55 | ≥ 0.60 | yes | Note in memory but DO NOT promote for auto-replay. User keeping it ≠ reusability. |
118
+ | `identity_break` | Technically OK but violated protected qualities | ≥ 0.55 | < 0.45 | no | Auto-undo. `record_anti_preference` with the protected quality that was violated. |
119
+ | `generic_fallback` | Both scores ≤ mid, collapsed to a default pattern | < 0.55 | < 0.55 | no | Auto-undo. This is the "stuck in patterns" signature. `record_anti_preference` with the family+target combo. |
120
+
121
+ Include the verdict in `memory_learn` payload so future sessions can
122
+ filter by type. The director's Phase 8 uses these tags explicitly.
123
+
124
+ ### Step 9 — Keep or Undo
125
+
126
+ If `keep_change` is `false`:
127
+ 1. Call `undo()` immediately
128
+ 2. Report to the user: what was tried, why it was undone, citing `collateral_damage`
129
+ 3. Consider an alternative approach for the same goal
130
+
131
+ If `keep_change` is `true`:
132
+ 1. Report the improvement with score and explanation
133
+ 2. If `score > 0.7`, this is a memory promotion candidate (see below)
134
+
135
+ ### Step 10 — Repeat or Stop
136
+
137
+ Check turn budget remaining. If budget allows and goal_progress < 1.0, return to Step 4 for the next move. Otherwise, summarize progress and stop.
138
+
139
+ ## Capability Modes
140
+
141
+ The world model includes a capability state that affects what measurements are available. Call `get_capability_state` to check.
142
+
143
+ ### normal
144
+ Full measured evaluation. M4L analyzer connected, all spectral/RMS/key tools available. Critics use real data. This is the best mode.
145
+
146
+ ### measured_degraded
147
+ Analyzer data is stale (older than 5 seconds) or intermittent. Measurements may not reflect current state. Re-trigger analysis before trusting cached values. Inform the user that data freshness is limited.
148
+
149
+ ### judgment_only
150
+ No analyzer connected. Evaluation relies on device parameter changes, track structure, and role-based heuristics. Critics cannot use spectral evidence. Inform the user: "Evaluation is based on parameter analysis only — spectral verification unavailable."
151
+
152
+ ### read_only
153
+ Session disconnected or in an error state. No tools can modify the session. Only read operations from cached data. Inform the user and suggest reconnecting.
154
+
155
+ ## Action Ledger
156
+
157
+ Every move is recorded in the action ledger for accountability and learning.
158
+
159
+ - `get_action_ledger_summary` — summary of all actions taken this session with scores
160
+ - `get_recent_actions` — last N actions with full detail
161
+ - `get_last_move` — the most recent action and its evaluation result
162
+
163
+ Use the ledger to avoid repeating failed approaches. If a move type has been undone twice for the same issue, try a different strategy.
164
+
165
+ ## Memory Promotion
166
+
167
+ Successful moves can be promoted to persistent memory for future sessions.
168
+
169
+ - `get_promotion_candidates` — list moves from this session that scored > 0.7 and are eligible for saving
170
+ - `memory_learn(name, type, qualities, payload, tags)` — save a technique to memory. `type` must be one of: `beat_pattern`, `device_chain`, `mix_template`, `browser_pin`, `preference`. `qualities` must include a `summary` field. `payload` contains the technique data.
171
+ - `record_anti_preference(dimension, direction)` — record something the user explicitly rejected. `dimension` is the quality axis (e.g., "brightness", "width"), `direction` must be `"increase"` or `"decrease"`. This ensures the rejected direction is never suggested again.
172
+
173
+ ### Promotion Rules
174
+
175
+ 1. Only promote moves the user confirmed satisfaction with — a high score alone is not enough
176
+ 2. Anti-preferences are permanent until explicitly deleted
177
+ 3. Check `get_anti_preferences` before suggesting any move to avoid repeating rejected ideas
178
+ 4. Promotion is optional — never force it. Suggest when appropriate: "That scored 0.85 — want me to save this technique for future sessions?"
179
+ 5. **For creative-director turns**, apply the verdict-driven promotion rubric:
180
+ - `safe_win` → promote if user keeps ≥ 2 subsequent turns (avoid over-promoting minor moves)
181
+ - `bold_win` → promote immediately; tag with concept packet + novelty_budget context
182
+ - `interesting_failure` → DO NOT auto-promote; store as a "curiosity" note only
183
+ - `identity_break` → NEVER promote; `record_anti_preference` instead
184
+ - `generic_fallback` → NEVER promote; `record_anti_preference` with family+target combo
185
+ - See `livepilot-core/references/memory-guide.md` for the full promotion rubric.
186
+
187
+ ## A/B Comparison
188
+
189
+ When the user asks "was that good?" or "A/B compare":
190
+
191
+ 1. The before snapshot is A, the after snapshot is B
192
+ 2. Call the evaluator to get the score
193
+ 3. Present the comparison: "Before: [metrics]. After: [metrics]. Score: [score]. [explanation]"
194
+ 4. If the user prefers A, call `undo()` to revert to it
195
+ 5. If the user prefers B, keep the current state
@@ -0,0 +1,176 @@
1
+ # Capability Modes Reference
2
+
3
+ The evaluation engine adapts its behavior based on what measurement capabilities are available. Call `get_capability_state` to determine the current mode.
4
+
5
+ ## Mode: normal
6
+
7
+ Full measurement capabilities available.
8
+
9
+ **Requirements:**
10
+ - Ableton Live connected via TCP port 9878
11
+ - M4L analyzer bridge running on master track
12
+ - UDP 9880 (M4L -> Server) and OSC 9881 (Server -> M4L) active
13
+ - SpectralCache receiving fresh data (age < 5 seconds)
14
+
15
+ **Available measurements:**
16
+ - `get_master_spectrum` — 9-band spectral analysis (sub_low → air), real-time
17
+ - `get_master_rms` — RMS and peak levels
18
+ - `get_detected_key` — key detection from audio
19
+ - `get_mel_spectrum` — mel-scaled spectral representation
20
+ - `get_chroma` — chromagram for harmonic analysis
21
+ - `get_onsets` — transient detection
22
+ - `get_momentary_loudness` — short-term loudness
23
+ - `get_spectral_shape` — centroid, spread, skewness, kurtosis
24
+ - All device parameter reads and session state tools
25
+
26
+ **Evaluation quality:** Highest. Critics use measured spectral evidence. Before/after comparisons are numerically precise.
27
+
28
+ ## Mode: measured_degraded
29
+
30
+ Analyzer data is present but stale or intermittent.
31
+
32
+ **Indicators:**
33
+ - SpectralCache age > 5 seconds
34
+ - Intermittent UDP packet loss from M4L device
35
+ - M4L bridge loaded but analyzer section not receiving audio
36
+
37
+ **Available measurements:**
38
+ - All session state tools (tracks, clips, devices, parameters)
39
+ - Cached spectral data (may not reflect current audio)
40
+ - Device parameter reads (always fresh)
41
+
42
+ **Evaluation quality:** Moderate. Spectral comparisons may be inaccurate if data is stale. Always check cache age before trusting spectrum values.
43
+
44
+ **User notification:** "Analyzer data may be stale. For accurate spectral evaluation, play audio through the master bus and wait 2-3 seconds for the cache to refresh."
45
+
46
+ ## Mode: judgment_only
47
+
48
+ No M4L analyzer connected. The evaluation engine operates on structural and parametric data only.
49
+
50
+ **Indicators:**
51
+ - M4L bridge not loaded on master track
52
+ - UDP 9880 not receiving data
53
+ - `get_master_spectrum` returns error or empty data
54
+
55
+ **Available measurements:**
56
+ - All session state tools
57
+ - Device parameter reads
58
+ - Track structure (names, types, device chains)
59
+ - Note and clip data
60
+ - Role-based heuristics (bass tracks should have low content, etc.)
61
+
62
+ **Evaluation quality:** Limited. No spectral evidence for masking, balance, or loudness judgments. Critics infer from:
63
+ - Track names and roles (a track named "Bass" should have low-frequency content)
64
+ - Device chains (a track with EQ Eight + Compressor is likely processed)
65
+ - Parameter values (filter cutoff position, compressor threshold)
66
+ - Volume/pan/send positions
67
+
68
+ **User notification:** "M4L analyzer is not connected. Evaluation is based on track structure and parameter analysis only. For spectral verification, load the LivePilot Bridge device on the master track."
69
+
70
+ ## Mode: read_only
71
+
72
+ Session disconnected or in an error state.
73
+
74
+ **Indicators:**
75
+ - TCP connection to port 9878 failed or timed out
76
+ - Remote Script not responding
77
+ - Ableton Live not running or crashed
78
+
79
+ **Available measurements:**
80
+ - Cached session data from last successful connection
81
+ - Memory system (technique recall, preferences)
82
+ - No live reads from the session
83
+
84
+ **Evaluation quality:** None for current state. Can only reference cached data and memory.
85
+
86
+ **User notification:** "Session disconnected. Cannot evaluate current state. Reconnect to Ableton Live to resume."
87
+
88
+ ## Capability Fallback Chain
89
+
90
+ When a measurement fails, fall back gracefully:
91
+
92
+ 1. Try the primary measurement tool
93
+ 2. If it fails, check if degraded data is available in cache
94
+ 3. If no cache, use parametric/structural heuristics
95
+ 4. If no session connection, report inability and suggest reconnection
96
+
97
+ Never silently skip evaluation. Always inform the user which capability mode is active and how it affects the quality of judgment.
98
+
99
+ ## Checking Capability State
100
+
101
+ Call `get_capability_state` at the start of any evaluation session. The response is a nested `domains` dict keyed by capability name — NOT the flat shape older docs described.
102
+
103
+ ```json
104
+ {
105
+ "capability_state": {
106
+ "generated_at_ms": 1776929160866,
107
+ "overall_mode": "normal",
108
+ "domains": {
109
+ "session_access": {"name": "session_access", "available": true, "confidence": 1.0, "mode": "healthy", "reasons": []},
110
+ "analyzer": {"name": "analyzer", "available": true, "confidence": 0.9, "mode": "available", "reasons": []},
111
+ "memory": {"name": "memory", "available": true, "confidence": 1.0, "mode": "available", "reasons": []},
112
+ "web": {"name": "web", "available": true, "confidence": 0.7, "mode": "available", "reasons": []},
113
+ "research": {"name": "research", "available": true, "confidence": 0.9, "mode": "available", "reasons": []},
114
+ "flucoma": {"name": "flucoma", "available": false, "confidence": 0.0, "mode": "unavailable", "reasons": ["flucoma_not_installed"]}
115
+ }
116
+ }
117
+ }
118
+ ```
119
+
120
+ ### Top-level fields
121
+
122
+ - `capability_state.generated_at_ms`: Unix-ms timestamp of the probe.
123
+ - `capability_state.overall_mode`: one of `"normal"`, `"measured_degraded"`, `"judgment_only"`, `"read_only"` — the global evaluation-quality tier computed from the per-domain signals.
124
+ - `capability_state.domains`: dict keyed by domain name; each value is a capability-domain record.
125
+
126
+ ### Per-domain fields
127
+
128
+ Every entry in `domains` has the same shape:
129
+
130
+ - `name`: the domain key (`"session_access"`, `"analyzer"`, `"memory"`, `"web"`, `"research"`, `"flucoma"`).
131
+ - `available`: boolean — is this capability ready to use right now?
132
+ - `confidence`: 0.0–1.0 — how much to trust the `available` flag (e.g. stale analyzer data lowers confidence).
133
+ - `mode`: short human label specific to the domain (`"healthy"`, `"available"`, `"measured"`, `"stale"`, `"targeted_only"`, `"full"`, `"unavailable"`).
134
+ - `reasons`: list of short machine-readable tokens explaining why the domain is in its current state (`"analyzer_offline"`, `"web_unavailable"`, `"flucoma_not_installed"`, …). Empty when healthy.
135
+ - `freshness_ms`: optional — milliseconds since the domain last received fresh data (currently only the analyzer domain populates this).
136
+
137
+ ### Domain definitions
138
+
139
+ - **session_access** — live TCP connectivity to the Ableton Remote Script on port 9878. `available=true` means a `get_session_info` round-trip succeeded.
140
+ - **analyzer** — the M4L bridge + spectral cache. `available=true` requires the bridge to be connected AND the spectral cache to have recently received data.
141
+ - **memory** — the local technique-store / taste memory. `available=true` means the persistent stores can be read and written.
142
+ - **web** — server-side outbound HTTP capability. True when the MCP host can reach an arbitrary public URL (probed by a 500 ms HEAD request to `https://api.github.com`). Does NOT imply curated research corpora are installed — see the `research` domain for that.
143
+ - **research** — composite over `session_access`, `memory`, and `web`. `mode="full"` when all three are available; `"targeted_only"` when at least one source is up; `"unavailable"` when nothing is reachable.
144
+ - **flucoma** — whether the optional `flucoma` Python package is importable (probed via `importlib.util.find_spec`). FluCoMa-backed tools (`check_flucoma`, `extract_timbre_fingerprint`, etc.) degrade gracefully when this domain is unavailable.
145
+
146
+ ## Collaborative Mode (Live 12.4+)
147
+
148
+ Live 12.4 introduces a new capability tier that unlocks native LOM access for sample replacement. This tier is separate from the evaluation modes above — it affects routing behavior in the MCP server, not spectral measurement.
149
+
150
+ **Version gate:** Live 12.4.0+
151
+
152
+ **Detection flag:** `LiveVersionCapabilities.has_replace_sample_native == True`
153
+ (exposed on `LiveVersionCapabilities.capability_tier == "collaborative"`)
154
+
155
+ **What changes at this tier:**
156
+ - `SimplerDevice.replace_sample(path)` is available as a native LOM call.
157
+ The MCP tools `replace_simpler_sample` and `load_sample_to_simpler`
158
+ route to this native path automatically.
159
+ - The native path handles empty Simplers — the long-standing limitation
160
+ (documented in `feedback_load_browser_item_is_source_of_truth.md`)
161
+ that required `load_browser_item` as a workaround no longer applies
162
+ on Live 12.4+.
163
+
164
+ **Backward compatibility:**
165
+ - Live 12.0–12.3.x: `has_replace_sample_native == False`. All sample
166
+ replacement still routes through the M4L bridge. Zero behavior change.
167
+ - Live 12.4+: native path preferred; M4L bridge used only on fallback.
168
+
169
+ **Tool signatures:** unchanged. Callers do not need to detect the tier —
170
+ routing is transparent.
171
+
172
+ **Follow-up plans (not yet shipped):**
173
+ - Link Audio (tempo-sync sharing between Live sets) — tracked as a
174
+ future Collaborative-tier feature.
175
+ - Stem Separation v2 — tracked as a future Collaborative-tier feature.
176
+ Neither is available in the 1.26.2 release — still pending.
@@ -0,0 +1,121 @@
1
+ # Evaluation Contracts Reference
2
+
3
+ Every evaluator returns the same base contract. Engine-specific evaluators extend it with additional fields.
4
+
5
+ ## Base Evaluation Contract
6
+
7
+ Returned by `evaluate_move`:
8
+
9
+ ```json
10
+ {
11
+ "keep_change": true,
12
+ "score": 0.72,
13
+ "goal_progress": 0.6,
14
+ "collateral_damage": [],
15
+ "explanation": "Filter cut at 250 Hz reduced masking by 4 dB without affecting bass body.",
16
+ "before_metrics": {
17
+ "master_rms_db": -12.4,
18
+ "master_peak_db": -3.2,
19
+ "spectrum": [...]
20
+ },
21
+ "after_metrics": {
22
+ "master_rms_db": -12.8,
23
+ "master_peak_db": -3.5,
24
+ "spectrum": [...]
25
+ }
26
+ }
27
+ ```
28
+
29
+ ### Field Definitions
30
+
31
+ - **keep_change** (bool): `true` if the change improved the target without unacceptable regression. `false` if the change should be undone.
32
+ - **score** (float 0.0-1.0): 0.0 = catastrophic regression, 0.5 = neutral (no change), 1.0 = perfect improvement. Scores below 0.4 trigger automatic undo recommendation.
33
+ - **goal_progress** (float 0.0-1.0): how much of the stated goal has been achieved. 1.0 means the goal is fully met. Use this to decide whether to continue iterating.
34
+ - **collateral_damage** (list of strings): side effects that got worse. Empty list means no regressions detected. Examples: "bass lost 2 dB of body", "stereo width narrowed by 15%".
35
+ - **explanation** (string): one-sentence human-readable summary of the judgment. Always report this to the user.
36
+
37
+ ## Mix Evaluation Contract
38
+
39
+ Returned by `evaluate_mix_move`, extends base with:
40
+
41
+ ```json
42
+ {
43
+ "targets": {
44
+ "reduce_masking": { "before": 0.72, "after": 0.35, "improved": true },
45
+ "maintain_headroom": { "before": -3.2, "after": -3.5, "ok": true }
46
+ },
47
+ "protect": {
48
+ "bass_body": { "before": -14.2, "after": -14.8, "ok": true },
49
+ "vocal_presence": { "before": -8.1, "after": -8.0, "ok": true }
50
+ },
51
+ "spectral_delta_db": {
52
+ "sub": 0.1, "low": -0.3, "low_mid": -2.1,
53
+ "mid": 0.2, "high_mid": 0.1, "high": 0.0
54
+ }
55
+ }
56
+ ```
57
+
58
+ - **targets**: what the move aimed to improve, with before/after measurements
59
+ - **protect**: what must not get worse, with tolerance checking
60
+ - **spectral_delta_db**: per-band change in spectral energy
61
+
62
+ ## Composition Evaluation Contract
63
+
64
+ Returned by `evaluate_composition_move`, extends base with:
65
+
66
+ ```json
67
+ {
68
+ "structural_coherence": 0.85,
69
+ "thematic_continuity": 0.78,
70
+ "energy_delta": 0.15,
71
+ "transition_smoothness": 0.82,
72
+ "note_count_delta": 12
73
+ }
74
+ ```
75
+
76
+ - **structural_coherence**: how well the change fits the overall form
77
+ - **thematic_continuity**: whether existing motifs are maintained or developed (not broken)
78
+ - **energy_delta**: change in section energy level
79
+ - **transition_smoothness**: quality of section boundaries after the change
80
+
81
+ ## Fabric Evaluation Contract
82
+
83
+ Returned by `evaluate_with_fabric`, extends base with:
84
+
85
+ ```json
86
+ {
87
+ "taste_alignment": 0.88,
88
+ "anti_preference_violations": [],
89
+ "similar_past_moves": [
90
+ { "memory_id": "mix_001", "similarity": 0.91, "past_score": 0.85 }
91
+ ],
92
+ "novelty_score": 0.3
93
+ }
94
+ ```
95
+
96
+ - **taste_alignment**: how well the move matches the user's saved taste profile
97
+ - **anti_preference_violations**: list of anti-preferences this move conflicts with (should be empty)
98
+ - **similar_past_moves**: techniques from memory that resemble this move, with their past scores
99
+ - **novelty_score**: how different this move is from past approaches (high = novel, low = familiar)
100
+
101
+ ## Scoring Thresholds
102
+
103
+ | Score Range | Interpretation | Action |
104
+ |------------|---------------|--------|
105
+ | 0.0 - 0.3 | Significant regression | Auto-undo, explain damage |
106
+ | 0.3 - 0.45 | Mild regression | Undo recommended, ask user |
107
+ | 0.45 - 0.55 | Neutral / no effect | Keep but note it had no impact |
108
+ | 0.55 - 0.7 | Mild improvement | Keep, continue iterating |
109
+ | 0.7 - 0.85 | Clear improvement | Keep, suggest memory promotion |
110
+ | 0.85 - 1.0 | Excellent improvement | Keep, strongly suggest promotion |
111
+
112
+ ## Collateral Damage Categories
113
+
114
+ Common side effects to check for:
115
+
116
+ - **bass_body_loss**: EQ cuts in the low-mid range reduced bass warmth
117
+ - **stereo_narrowing**: mono compatibility fix reduced perceived width
118
+ - **headroom_reduction**: boost increased master peak level
119
+ - **transient_loss**: compression removed punch from drums
120
+ - **vocal_masking**: frequency boost created new masking with vocal track
121
+ - **phase_issue**: stereo manipulation introduced phase cancellation
@@ -0,0 +1,110 @@
1
+ # Memory Promotion Reference
2
+
3
+ Memory promotion saves successful production moves to persistent storage for recall in future sessions.
4
+
5
+ ## Promotion Flow
6
+
7
+ 1. A move scores > 0.7 in evaluation
8
+ 2. Call `get_promotion_candidates` to list all eligible moves from this session
9
+ 3. Present the candidate to the user with score and description
10
+ 4. If the user confirms, call `memory_learn(name, type, qualities, payload)` to save
11
+ 5. The technique is now available via `memory_recall` in future sessions
12
+
13
+ ## Promotion Candidates
14
+
15
+ `get_promotion_candidates` returns moves that meet all criteria:
16
+
17
+ - Evaluation score > 0.7
18
+ - `keep_change` was `true`
19
+ - The move has not already been promoted
20
+ - The move does not conflict with any anti-preference
21
+
22
+ Response format:
23
+ ```json
24
+ {
25
+ "candidates": [
26
+ {
27
+ "action_id": "act_001",
28
+ "move_type": "eq_cut",
29
+ "score": 0.85,
30
+ "goal": "reduce masking between bass and kick",
31
+ "parameters": {
32
+ "track": "Bass",
33
+ "device": "EQ Eight",
34
+ "band": 3,
35
+ "frequency": 250,
36
+ "gain_db": -4.5,
37
+ "q": 2.0
38
+ },
39
+ "explanation": "4.5 dB cut at 250 Hz on bass cleared kick presence without losing bass warmth"
40
+ }
41
+ ]
42
+ }
43
+ ```
44
+
45
+ ## Memory Types
46
+
47
+ When calling `memory_learn`, specify the type:
48
+
49
+ - `mix_template` — mixing techniques (EQ curves, compression settings, gain staging recipes)
50
+ - `sound_design` — patch design moves (modulation settings, filter configurations, oscillator tuning)
51
+ - `composition` — structural techniques (transition patterns, arrangement gestures, motif transformations)
52
+ - `automation` — automation curves and recipes
53
+ - `performance` — live performance patterns (scene orderings, safe macro ranges)
54
+
55
+ ## Anti-Preferences
56
+
57
+ Anti-preferences are the inverse of promotion — they record moves the user explicitly rejected.
58
+
59
+ ### Recording
60
+
61
+ Call `record_anti_preference(dimension, direction)` when:
62
+ - The user says "I hate that", "never do that again", "that's wrong"
63
+ - A move is undone and the user expresses displeasure (not just neutral undo)
64
+ - The user explicitly states a preference against a technique
65
+
66
+ ### Checking
67
+
68
+ Call `get_anti_preferences` before suggesting any move. The response lists all recorded anti-preferences with descriptions and creation dates.
69
+
70
+ ### Format
71
+ ```json
72
+ {
73
+ "anti_preferences": [
74
+ {
75
+ "id": "ap_001",
76
+ "description": "Never boost above 10 kHz on vocals — user finds it harsh",
77
+ "created": "2026-04-08T14:30:00Z"
78
+ },
79
+ {
80
+ "id": "ap_002",
81
+ "description": "No sidechain compression on pads — user prefers volume automation for ducking",
82
+ "created": "2026-04-09T09:15:00Z"
83
+ }
84
+ ]
85
+ }
86
+ ```
87
+
88
+ ### Rules
89
+
90
+ 1. Always check anti-preferences before planning any move
91
+ 2. If a planned move matches an anti-preference, skip it and choose an alternative
92
+ 3. Anti-preferences are permanent until the user explicitly asks to remove one
93
+ 4. When skipping a move due to anti-preference, tell the user: "Skipping [move] because you previously indicated [anti-preference]."
94
+
95
+ ## Promotion Best Practices
96
+
97
+ 1. **Do not auto-promote.** Always ask: "That scored [score] — want me to save this technique?"
98
+ 2. **Include context in the saved data.** A raw parameter value without context (genre, source material, goal) is less useful on recall.
99
+ 3. **Group related moves.** If three EQ cuts together solved a masking problem, save them as one technique, not three.
100
+ 4. **Tag with genre and role.** A bass EQ technique for house music may not apply to jazz. Include tags for future filtering.
101
+ 5. **Review periodically.** Suggest `memory_list` to the user occasionally to prune outdated techniques.
102
+
103
+ ## Recall Integration
104
+
105
+ When starting a new production task:
106
+
107
+ 1. Call `memory_recall(type, query)` to find relevant past techniques
108
+ 2. Present matches with their past scores: "I found a similar technique from a past session (scored 0.85). Want me to try it here?"
109
+ 3. If the user agrees, apply the recalled technique and evaluate as normal
110
+ 4. If the recalled technique scores lower in the new context, note this — context sensitivity means not all techniques transfer