livepilot 1.10.0 → 1.10.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/.claude-plugin/marketplace.json +3 -3
- package/AGENTS.md +3 -3
- package/CHANGELOG.md +150 -0
- package/CONTRIBUTING.md +2 -2
- package/LICENSE +62 -21
- package/README.md +264 -286
- package/livepilot/.Codex-plugin/plugin.json +2 -2
- package/livepilot/.claude-plugin/plugin.json +2 -2
- package/livepilot/skills/livepilot-arrangement/SKILL.md +18 -1
- package/livepilot/skills/livepilot-core/SKILL.md +5 -5
- package/livepilot/skills/livepilot-core/references/overview.md +3 -3
- package/livepilot/skills/livepilot-devices/SKILL.md +23 -2
- package/livepilot/skills/livepilot-evaluation/references/capability-modes.md +1 -1
- package/livepilot/skills/livepilot-release/SKILL.md +21 -17
- package/livepilot/skills/livepilot-sample-engine/SKILL.md +2 -1
- package/livepilot/skills/livepilot-wonder/SKILL.md +8 -6
- package/livepilot.mcpb +0 -0
- package/m4l_device/livepilot_bridge.js +1 -1
- package/manifest.json +4 -4
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/composer/engine.py +249 -169
- package/mcp_server/composer/sample_resolver.py +153 -0
- package/mcp_server/composer/tools.py +97 -87
- package/mcp_server/memory/taste_accessors.py +47 -0
- package/mcp_server/preview_studio/engine.py +9 -2
- package/mcp_server/preview_studio/tools.py +78 -35
- package/mcp_server/project_brain/tools.py +34 -0
- package/mcp_server/runtime/execution_router.py +180 -38
- package/mcp_server/runtime/mcp_dispatch.py +46 -0
- package/mcp_server/runtime/remote_commands.py +4 -1
- package/mcp_server/runtime/tools.py +55 -32
- package/mcp_server/sample_engine/moves.py +12 -12
- package/mcp_server/sample_engine/slice_workflow.py +190 -0
- package/mcp_server/sample_engine/tools.py +104 -1
- package/mcp_server/semantic_moves/device_creation_moves.py +7 -7
- package/mcp_server/semantic_moves/mix_moves.py +8 -8
- package/mcp_server/semantic_moves/models.py +7 -7
- package/mcp_server/semantic_moves/performance_moves.py +4 -4
- package/mcp_server/semantic_moves/sample_compilers.py +14 -9
- package/mcp_server/semantic_moves/sound_design_moves.py +4 -4
- package/mcp_server/semantic_moves/tools.py +63 -10
- package/mcp_server/semantic_moves/transition_moves.py +4 -4
- package/mcp_server/server.py +20 -1
- package/mcp_server/session_continuity/tracker.py +4 -1
- package/mcp_server/tools/_conductor.py +16 -0
- package/mcp_server/tools/_planner_engine.py +24 -0
- package/mcp_server/tools/analyzer.py +2 -0
- package/mcp_server/tools/planner.py +3 -0
- package/mcp_server/wonder_mode/engine.py +59 -13
- package/mcp_server/wonder_mode/tools.py +33 -1
- package/package.json +8 -8
- package/remote_script/LivePilot/__init__.py +1 -1
- package/remote_script/LivePilot/devices.py +10 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
|
|
3
3
|
"name": "dreamrec-LivePilot",
|
|
4
|
-
"description": "Agentic MCP production system for Ableton Live 12 —
|
|
4
|
+
"description": "Agentic MCP production system for Ableton Live 12 — 317 tools, 43 domains",
|
|
5
5
|
"owner": {
|
|
6
6
|
"name": "dreamrec",
|
|
7
7
|
"email": "dreamrec@users.noreply.github.com"
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
"plugins": [
|
|
10
10
|
{
|
|
11
11
|
"name": "livepilot",
|
|
12
|
-
"description": "Agentic production system for Ableton Live 12 —
|
|
13
|
-
"version": "1.10.
|
|
12
|
+
"description": "Agentic production system for Ableton Live 12 — 317 tools, 43 domains, device atlas, spectral perception, technique memory, sample intelligence, auto-composition, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
13
|
+
"version": "1.10.1",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "Pilot Studio"
|
|
16
16
|
},
|
package/AGENTS.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# LivePilot v1.10.
|
|
1
|
+
# LivePilot v1.10.1 — Ableton Live 12
|
|
2
2
|
|
|
3
3
|
## Project
|
|
4
4
|
- **Repo:** This directory (LivePilot)
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
## Key Rules
|
|
23
23
|
- ALL Live Object Model (LOM) calls must execute on Ableton's main thread via schedule_message queue
|
|
24
24
|
- Live 12 minimum — use modern note API (add_new_notes, get_notes_extended, apply_note_modifications)
|
|
25
|
-
-
|
|
25
|
+
- 317 tools across 43 domains: transport, tracks, clips, notes, devices, scenes, mixing, browser, arrangement, memory, analyzer, automation, theory, generative, harmony, midi_io, perception, agent_os, composition, motif, research, planner, project_brain, runtime, evaluation, mix_engine, sound_design, transition_engine, reference_engine, translation_engine, performance_engine, song_brain, preview_studio, hook_hunter, stuckness_detector, wonder_mode, session_continuity, creative_constraints, device_forge, sample_engine, atlas, composer
|
|
26
26
|
- JSON over TCP, newline-delimited, port 9878
|
|
27
27
|
- Structured errors with codes: INDEX_ERROR, NOT_FOUND, INVALID_PARAM, STATE_ERROR, TIMEOUT, INTERNAL
|
|
28
28
|
|
|
@@ -43,4 +43,4 @@ When modifying .amxd attributes that Max editor won't persist (e.g., `openinpres
|
|
|
43
43
|
4. Structure: 24-byte `ampf` header + `ptch` chunk + `mx@c` header + JSON patcher + frozen deps
|
|
44
44
|
|
|
45
45
|
## Tool Count
|
|
46
|
-
Currently
|
|
46
|
+
Currently 317 tools. If adding/removing tools, update: README.md, package.json description, livepilot/.Codex-plugin/plugin.json, livepilot/.claude-plugin/plugin.json, server.json, livepilot/skills/livepilot-core/SKILL.md, livepilot/skills/livepilot-core/references/overview.md, AGENTS.md, CLAUDE.md, CHANGELOG.md, tests/test_tools_contract.py, docs/manual/index.md, docs/manual/tool-reference.md
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,155 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.10.1 — Orchestration Hardening (April 14 2026)
|
|
4
|
+
|
|
5
|
+
Pure correctness pass on the execution substrate. No new public tools,
|
|
6
|
+
no renames, no tool count change. Thirteen commits across thirteen phases
|
|
7
|
+
(nine Phase 1 + four Phase 2). All new response fields are additive.
|
|
8
|
+
|
|
9
|
+
**Test results:** 1690 → **1740 passing** (+50 net, +56 new tests, −6 sync-to-async
|
|
10
|
+
rewrites). No regressions.
|
|
11
|
+
|
|
12
|
+
**Known carryover:** `m4l_device/LivePilot_Analyzer.amxd` is lagging —
|
|
13
|
+
its embedded JS is frozen at v1.9.14 while the repo source is at v1.10.1.
|
|
14
|
+
This is a pre-existing drift (1.10.0 shipped the same stale .amxd). The
|
|
15
|
+
Python/JS source in the repo is current; re-export from Max for Live at
|
|
16
|
+
your convenience to pick up `get_selected` ID-matching and 4-byte UTF-8
|
|
17
|
+
decoding in the embedded JS.
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
- **Execution router: `load_sample_to_simpler` reclassified as MCP tool.** It
|
|
21
|
+
was wrongly declared in `BRIDGE_COMMANDS` despite being an async Python
|
|
22
|
+
function with no JS dispatch case. All six sample-family semantic moves
|
|
23
|
+
that compiled this step now classify it correctly. Backend annotations
|
|
24
|
+
in `mcp_server/sample_engine/moves.py` updated to match.
|
|
25
|
+
- **Execution router: dedupe `capture_audio` classification.** Removed the
|
|
26
|
+
dead entry from `MCP_TOOLS` — `capture_audio` lives in `BRIDGE_COMMANDS`
|
|
27
|
+
and is handled by `livepilot_bridge.js`.
|
|
28
|
+
- **Execution router: async-only substrate.** `execute_step` and
|
|
29
|
+
`execute_plan_steps` (the sync path) are **deleted**. The only surviving
|
|
30
|
+
entry point is `execute_plan_steps_async`. `apply_semantic_move` and
|
|
31
|
+
`render_preview_variant` both became `async def` and dispatch through the
|
|
32
|
+
async router. The dead sync path was the last place where a plan could
|
|
33
|
+
silently produce steps that only worked on one transport.
|
|
34
|
+
- **Bridge dispatch unpacks params positionally.** Latent bug in the Phase 1
|
|
35
|
+
async router: it passed the whole params dict as a single arg to
|
|
36
|
+
`bridge.send_command`, which would have OSC-encoded the dict and failed on
|
|
37
|
+
the real M4L bridge. Fixed in Phase 2 to unpack via `*list(params.values())` —
|
|
38
|
+
plan authors construct params in the order the bridge command expects.
|
|
39
|
+
- **Preview Studio: `render_preview_variant` captures audible preview BEFORE
|
|
40
|
+
undo.** The function previously ran undo in a `finally` block that
|
|
41
|
+
executed before the "audible preview" section, so `preview_mode =
|
|
42
|
+
"audible_preview"` was a lie — it captured pre-variant audio. Now
|
|
43
|
+
restructured as: capture-before → apply → capture-after → play+sample
|
|
44
|
+
while variant is applied → stop playback → undo applied steps. Callers
|
|
45
|
+
can trust the `audible_preview` label.
|
|
46
|
+
- **SessionKernel: shares `ctx.lifespan_context` memory stores and fixes
|
|
47
|
+
silent method-name bugs.** `get_session_kernel` used to instantiate fresh
|
|
48
|
+
`TasteMemoryStore`, `AntiMemoryStore`, and `SessionMemoryStore` and call
|
|
49
|
+
`list_all()` / `recent()` (neither method exists), all wrapped in silent
|
|
50
|
+
`try/except: pass`. Users who recorded anti-preferences or session memory
|
|
51
|
+
via the public tools always saw an empty kernel. Now reuses stores the
|
|
52
|
+
same way `mcp_server/memory/tools.py` does, calls the correct methods
|
|
53
|
+
(`get_anti_preferences`, `get_recent`), and surfaces store-load failures
|
|
54
|
+
in a non-breaking `warnings` field.
|
|
55
|
+
- **Taste graph shape normalized across consumers.** Both
|
|
56
|
+
`preview_studio/engine.py:_estimate_taste_fit` and
|
|
57
|
+
`session_continuity/tracker.py` read `taste_graph.get("transition_boldness")`,
|
|
58
|
+
but the canonical `TasteGraph.to_dict()` puts it under `dimension_weights`.
|
|
59
|
+
Both consumers silently defaulted to 0.5, ignoring recorded user taste.
|
|
60
|
+
New `mcp_server/memory/taste_accessors.get_dimension_pref` helper reads
|
|
61
|
+
all three observed shapes; both consumers route through it.
|
|
62
|
+
- **Composer: plans are executable, not aspirational.** `compose()` and
|
|
63
|
+
`augment_with_samples()` used to emit pseudo-tools
|
|
64
|
+
(`_agent_pick_best_sample`, `_apply_technique`), placeholder strings
|
|
65
|
+
(`{downloaded_path}`), invalid sentinels (`device_index: -1`,
|
|
66
|
+
`track_index: -1`), and hardcoded `clip_slot_index: 0` on newly-created
|
|
67
|
+
empty tracks. Plans are now rebuilt via `sample_resolver.resolve_sample_for_layer`
|
|
68
|
+
at plan time. Unresolved layers are kept in the descriptive `layers`
|
|
69
|
+
output and surfaced in `warnings`, but dropped from `plan`. Processing
|
|
70
|
+
chains use `step_id` + `$from_step` bindings to resolve `device_index`
|
|
71
|
+
from `insert_device` results at execution time.
|
|
72
|
+
- **Composer: arrangement clips finally work.** Re-enabled the arrangement
|
|
73
|
+
emission path that was stubbed in Phase 7. Each resolved layer now emits
|
|
74
|
+
`create_clip` → `add_notes` (C3 trigger) → `create_arrangement_clip` per
|
|
75
|
+
section, tiling a 1-bar source clip across each section's bar count.
|
|
76
|
+
Simpler in classic mode plays the full sample on every trigger, so the
|
|
77
|
+
minimal pattern produces a playable baseline; the agent can replace it
|
|
78
|
+
with a more musical pattern via `suggest_sample_technique` recipes later.
|
|
79
|
+
Example: a techno prompt with one resolved sample now produces a 65-step
|
|
80
|
+
plan with 5 arrangement clips tiling Intro / Build / Drop / Drop 2 / Outro.
|
|
81
|
+
- **ProjectBrain: `build_project_brain` fetches notes for role inference.**
|
|
82
|
+
The tool never called `get_notes`, so `build_project_state_from_data`
|
|
83
|
+
always ran with an empty `notes_map`, forcing `role_graph` into the
|
|
84
|
+
"assume all tracks active in every section" fallback — destroying the
|
|
85
|
+
section-scoped role confidence RoleGraph was supposed to compute.
|
|
86
|
+
|
|
87
|
+
### Added
|
|
88
|
+
- **Async execution router with step-result binding** —
|
|
89
|
+
`mcp_server/runtime/execution_router.execute_plan_steps_async` dispatches
|
|
90
|
+
`remote_command`, `bridge_command`, and `mcp_tool` backends through their
|
|
91
|
+
correct transports. Supports step-result binding via
|
|
92
|
+
`{"$from_step": "<id>", "path": "a.b"}` on any param.
|
|
93
|
+
- **MCP dispatch registry** — `mcp_server/runtime/mcp_dispatch.py` registers
|
|
94
|
+
in-process Python tools (starting with `load_sample_to_simpler`) so plans
|
|
95
|
+
can invoke them through the async router. Lifespan-installed at startup
|
|
96
|
+
alongside `ableton`, `spectral`, `m4l`, and `splice_client`.
|
|
97
|
+
- **Splice remote download workflow in composer.** `sample_resolver` extended
|
|
98
|
+
with `splice_local` and `splice_remote` sources. Resolution order:
|
|
99
|
+
`filesystem > splice_local > splice_remote > browser`. Filesystem wins
|
|
100
|
+
even when Splice has a hit (local files are free). Splice remote downloads
|
|
101
|
+
cost 1 credit each and respect the 5-credit hard floor via
|
|
102
|
+
`splice_client.can_afford(1, budget)` — the floor check is upfront so
|
|
103
|
+
the resolver fails fast rather than thrashing per-layer.
|
|
104
|
+
- **`SpliceGRPCClient` wired into server lifespan.** `ctx.lifespan_context["splice_client"]`
|
|
105
|
+
is now populated at startup. Graceful degradation: if grpcio is missing,
|
|
106
|
+
Splice desktop isn't running, or the cert can't be read, `splice_client.connected`
|
|
107
|
+
stays False and the resolver treats it as "no splice hits".
|
|
108
|
+
- **Composer credit-safety prelude.** New `_credit_safety_prelude()` helper
|
|
109
|
+
in `composer/tools.py` runs once per compose/augment call: checks credits
|
|
110
|
+
remaining, trims `max_credits` to respect the floor, returns a warnings
|
|
111
|
+
list the tool merges into the plan output. No per-layer credit thrashing.
|
|
112
|
+
- **Additive return fields** (no breaking changes to existing callers):
|
|
113
|
+
- `insert_device.device_index` — actual index of the inserted device in
|
|
114
|
+
its chain/track. Composer plans bind to it.
|
|
115
|
+
- `load_sample_to_simpler.device_index` and `.track_index` — the real
|
|
116
|
+
Simpler position (was previously computed internally but not returned).
|
|
117
|
+
- `preview_semantic_move.compiled_plan` and `.compiled_plan_executable` —
|
|
118
|
+
the move compiled against a lightweight current-session kernel,
|
|
119
|
+
alongside the existing static `plan_template`.
|
|
120
|
+
- `get_session_kernel.warnings` — surfaced when memory/taste stores fail
|
|
121
|
+
to load. Additive, callers can ignore.
|
|
122
|
+
- **`mcp_server/composer/sample_resolver.py`** — async sample resolver with
|
|
123
|
+
filesystem-first preference, splice_local/remote hooks, and browser fallback.
|
|
124
|
+
- **`mcp_server/memory/taste_accessors.get_dimension_pref`** — canonical
|
|
125
|
+
reader for taste-graph dimension preferences. All new consumers must
|
|
126
|
+
use it.
|
|
127
|
+
- **Bridge parity test** — `tests/test_bridge_parity.py` compares Python
|
|
128
|
+
`BRIDGE_COMMANDS` against the `case` labels in
|
|
129
|
+
`m4l_device/livepilot_bridge.js`. Catches future misclassification drift.
|
|
130
|
+
|
|
131
|
+
### Changed (internal, no public tool changes)
|
|
132
|
+
- **`ComposerEngine.compose`, `augment`, and `get_plan` are async.** Sample
|
|
133
|
+
resolution may now hit the network (Splice download), so the whole compose
|
|
134
|
+
chain awaits. No production callers outside `composer/tools.py`; tests use
|
|
135
|
+
`asyncio.run(...)` wrappers.
|
|
136
|
+
- **`CompositionResult.resolved_samples` shape changed** from
|
|
137
|
+
`{role: path_str}` to `{role: {"path": str, "source": str}}` — callers
|
|
138
|
+
can now tell filesystem vs splice_local vs splice_remote hits apart.
|
|
139
|
+
|
|
140
|
+
### Tests
|
|
141
|
+
- Router suite: 23/23 (async-only; 6 legacy sync tests rewritten as async)
|
|
142
|
+
- Composer resolver suite: 13/13 (7 filesystem + 6 splice paths)
|
|
143
|
+
- Composer engine suite: 14/14 (9 Phase 7 + 5 Phase 2B arrangement contracts)
|
|
144
|
+
- Project brain suite: 47/47 (+2 Phase 8 notes_map regression)
|
|
145
|
+
- Preview studio suite: 17/17 (+1 ordering regression)
|
|
146
|
+
- Session kernel suite: 11/11 (+3 hydration regression)
|
|
147
|
+
- Taste accessors suite: 9/9 (new in Phase 3)
|
|
148
|
+
- Bridge parity suite: 2/2 (new in Phase 9)
|
|
149
|
+
- **Full repo: 1740 passed, 1 skipped** (up from 1690)
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
3
153
|
## 1.10.0 — The Intelligence Release (April 13 2026)
|
|
4
154
|
|
|
5
155
|
316 tools across 43 domains. Device Atlas v2, Sample Intelligence, Auto-Composition, Splice Integration, Device Forge, Live 12.3 API, Corpus Intelligence.
|
package/CONTRIBUTING.md
CHANGED
|
@@ -98,7 +98,7 @@ Prefix with `fix:`, `feat:`, `docs:`, `refactor:`, `test:`, or `chore:`.
|
|
|
98
98
|
|
|
99
99
|
## Tool Count Discipline
|
|
100
100
|
|
|
101
|
-
Currently **
|
|
101
|
+
Currently **317 tools**. If you add or remove a `@mcp.tool()` decorator, update all of these files:
|
|
102
102
|
|
|
103
103
|
- `README.md`
|
|
104
104
|
- `CLAUDE.md`
|
|
@@ -128,4 +128,4 @@ By participating, you agree to uphold this code.
|
|
|
128
128
|
|
|
129
129
|
## License
|
|
130
130
|
|
|
131
|
-
By contributing, you agree that your contributions will be licensed under the [
|
|
131
|
+
By contributing, you agree that your contributions will be licensed under the [Business Source License 1.1](LICENSE).
|
package/LICENSE
CHANGED
|
@@ -1,21 +1,62 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
1
|
+
Business Source License 1.1
|
|
2
|
+
|
|
3
|
+
Parameters
|
|
4
|
+
|
|
5
|
+
Licensor: Pilot Studio
|
|
6
|
+
Licensed Work: LivePilot 1.10.0
|
|
7
|
+
The Licensed Work is (c) 2026 Pilot Studio.
|
|
8
|
+
Additional Use Grant: You may make production use of the Licensed Work,
|
|
9
|
+
provided your use does not include offering it as a
|
|
10
|
+
commercial hosted service to third parties.
|
|
11
|
+
Change Date: April 13, 2030
|
|
12
|
+
Change License: MIT License
|
|
13
|
+
|
|
14
|
+
Notice
|
|
15
|
+
|
|
16
|
+
The Business Source License (this document, or the "License") is not an
|
|
17
|
+
Open Source license. However, the Licensed Work will eventually be made
|
|
18
|
+
available under the Change License, on the Change Date. License text
|
|
19
|
+
below is the full BSL 1.1 text from MariaDB BSL version.
|
|
20
|
+
|
|
21
|
+
Terms
|
|
22
|
+
|
|
23
|
+
The Licensor hereby grants you the right to copy, modify, create
|
|
24
|
+
derivative works, redistribute, and make non-production use of the
|
|
25
|
+
Licensed Work. The Licensor may make an Additional Use Grant, above,
|
|
26
|
+
permitting limited production use.
|
|
27
|
+
|
|
28
|
+
Effective on the Change Date, or the fourth anniversary of the first
|
|
29
|
+
publicly available distribution of a specific version of the Licensed
|
|
30
|
+
Work under this License, whichever comes first, the Licensor hereby
|
|
31
|
+
grants you rights under the terms of the Change License, and the rights
|
|
32
|
+
granted in the paragraph above terminate.
|
|
33
|
+
|
|
34
|
+
If your use of the Licensed Work does not comply with the requirements
|
|
35
|
+
currently in effect as described in this License, you must purchase a
|
|
36
|
+
commercial license from the Licensor, its affiliated entities, or
|
|
37
|
+
authorized resellers, or you must refrain from using the Licensed Work.
|
|
38
|
+
|
|
39
|
+
All copies of the original and modified Licensed Work, and derivative
|
|
40
|
+
works of the Licensed Work, are subject to this License. This License
|
|
41
|
+
applies separately for each version of the Licensed Work and the Change
|
|
42
|
+
Date may vary for each version of the Licensed Work released by
|
|
43
|
+
Licensor.
|
|
44
|
+
|
|
45
|
+
You must conspicuously display this License on each original or modified
|
|
46
|
+
copy of the Licensed Work. If you receive the Licensed Work in original
|
|
47
|
+
or modified form from a third party, the terms and conditions set forth
|
|
48
|
+
in this License apply to your use of that work.
|
|
49
|
+
|
|
50
|
+
Any use of the Licensed Work in violation of this License will
|
|
51
|
+
automatically terminate your rights under this License for the current
|
|
52
|
+
and all other versions of the Licensed Work.
|
|
53
|
+
|
|
54
|
+
This License does not grant you any right in any trademark or logo of
|
|
55
|
+
Licensor or its affiliates (provided that you may use a trademark or
|
|
56
|
+
logo of Licensor as expressly required by this License).
|
|
57
|
+
|
|
58
|
+
TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS
|
|
59
|
+
PROVIDED ON AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES
|
|
60
|
+
AND CONDITIONS, EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION)
|
|
61
|
+
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
|
62
|
+
NON-INFRINGEMENT, AND TITLE.
|