livepilot 1.17.4 → 1.17.5

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 CHANGED
@@ -1,5 +1,47 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.17.5 — Classify error-only commit payloads as failures (April 23 2026)
4
+
5
+ ### Fixed
6
+
7
+ - **`_classify_commit_result` now catches error-only commit payloads**
8
+ (`mcp_server/tools/_agent_os_engine/iteration.py`): Codex review on
9
+ PR #27 caught a gap I shipped in v1.17.3. My docstring listed
10
+ `{"error": ...}` as a known failure signal, but the implementation
11
+ never checked for a top-level `error` key. `commit_branch_async` in
12
+ `mcp_server/experiment/engine.py` returns error-only dicts in 5+
13
+ paths (`Branch {id} not found`, `Branch has no compiled plan`,
14
+ `Experiment {id} not found`). These fell through to
15
+ `"committed"` because they had no explicit `committed: false` /
16
+ `ok: false` / `status: "failed"` / `steps_ok: 0` signal. Classic
17
+ truth-gap: the iteration loop could claim success while the commit
18
+ applied zero steps.
19
+
20
+ Fix: if `result.get("error")` is truthy AND `result.get("committed")`
21
+ is not explicitly `True`, return `"commit_failed"`. The explicit-
22
+ committed caveat handles the edge case where a payload reports
23
+ success with a warning in the `error` field.
24
+
25
+ ### Tests
26
+
27
+ 4 new TDD tests in `tests/test_iterate_toward_goal.py`:
28
+ - `{"error": "Experiment not found"}` → `commit_failed`
29
+ - `{"error": "Branch not found"}` (real commit_branch_async shape) →
30
+ `commit_failed`, with the payload surfaced on `commit_result`
31
+ - Same discipline on the `on_timeout="commit_best"` path
32
+ - Edge case: `{"committed": True, "error": "warning...",
33
+ steps_ok: 3}` still returns `committed` (explicit success overrides)
34
+
35
+ 2726 → 2730 passing.
36
+
37
+ ### Process note
38
+
39
+ The fix that shipped in v1.17.3 was itself caught by a subsequent
40
+ review. Writing a docstring listing a failure signal and forgetting
41
+ to implement the check is the classic TDD violation the discipline
42
+ exists to prevent. Codex's automated review acted as the missing
43
+ failing-test-first pass.
44
+
3
45
  ## 1.17.4 — Shape cleanup + memory probe (April 23 2026)
4
46
 
5
47
  ### Fixed
Binary file
@@ -95,7 +95,7 @@ function anything() {
95
95
  function dispatch(cmd, args) {
96
96
  switch(cmd) {
97
97
  case "ping":
98
- send_response({"ok": true, "version": "1.17.4"});
98
+ send_response({"ok": true, "version": "1.17.5"});
99
99
  break;
100
100
  case "get_params":
101
101
  cmd_get_params(args);
@@ -1,2 +1,2 @@
1
1
  """LivePilot MCP Server — bridges MCP protocol to Ableton Live."""
2
- __version__ = "1.17.4"
2
+ __version__ = "1.17.5"
@@ -102,6 +102,13 @@ def _classify_commit_result(result: Any) -> str:
102
102
  return "commit_failed"
103
103
  if result.get("status") == "failed":
104
104
  return "commit_failed"
105
+ # v1.17.5 (Codex PR#27 review): a top-level "error" key with no
106
+ # explicit committed=True is a failure signal. commit_branch_async
107
+ # returns {"error": "Branch not found"} / {"error": "Branch has no
108
+ # compiled plan"} / {"error": "Experiment not found"} in several
109
+ # paths — without this check they'd fall through to "committed".
110
+ if result.get("error") and result.get("committed") is not True:
111
+ return "commit_failed"
105
112
  steps_ok = result.get("steps_ok")
106
113
  steps_failed = result.get("steps_failed")
107
114
  if steps_ok == 0 and (steps_failed is None or steps_failed > 0):
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "livepilot",
3
- "version": "1.17.4",
3
+ "version": "1.17.5",
4
4
  "mcpName": "io.github.dreamrec/livepilot",
5
5
  "description": "Agentic production system for Ableton Live 12 — 427 tools, 52 domains. Device atlas (1305 devices), sample engine (Splice + browser + filesystem), auto-composition, spectral perception, technique memory, creative intelligence (12 engines)",
6
6
  "author": "Pilot Studio",
@@ -5,7 +5,7 @@ Entry point for the ControlSurface. Ableton calls create_instance(c_instance)
5
5
  when this script is selected in Preferences > Link, Tempo & MIDI.
6
6
  """
7
7
 
8
- __version__ = "1.17.4"
8
+ __version__ = "1.17.5"
9
9
 
10
10
  from _Framework.ControlSurface import ControlSurface
11
11
  from . import router
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/dreamrec/LivePilot",
7
7
  "source": "github"
8
8
  },
9
- "version": "1.17.4",
9
+ "version": "1.17.5",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "livepilot",
14
- "version": "1.17.4",
14
+ "version": "1.17.5",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  }