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 +42 -0
- package/m4l_device/LivePilot_Analyzer.amxd +0 -0
- package/m4l_device/livepilot_bridge.js +1 -1
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/tools/_agent_os_engine/iteration.py +7 -0
- package/package.json +1 -1
- package/remote_script/LivePilot/__init__.py +1 -1
- package/server.json +2 -2
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
|
package/mcp_server/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""LivePilot MCP Server — bridges MCP protocol to Ableton Live."""
|
|
2
|
-
__version__ = "1.17.
|
|
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.
|
|
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.
|
|
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.
|
|
9
|
+
"version": "1.17.5",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "livepilot",
|
|
14
|
-
"version": "1.17.
|
|
14
|
+
"version": "1.17.5",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
}
|