# OFFICIAL LV2 ABI — how the 407 stack expects plugins to look

Status: facts VERIFIED from the image; conclusions about our integration PROPOSED.

## 1. Plugin discovery — VERIFIED

- Lilv 0.24.25 (`liblilv-0.so.0.24.25`) inside Ingen 0.5.1 scans
  `/usr/lib/lv2` (234 bundles present, e.g. `core.lv2`, `atom.lv2`,
  `MVerb.lv2`, `mda-*.lv2`). Bundles expose `manifest.ttl` with
  binary + minor/micro version fields, as in
  `/usr/lib/lv2/atom.lv2/manifest.ttl` (`lv2:minorVersion 2`,
  `lv2:microVersion 4`).

## 2. Block instantiation model — VERIFIED (from the installed UI/engine)

- The UI adds plugins with `ingen_wrapper.add_plugin(effect_id, effect_url)`
  which `q.put((ingen.put, effect_id, 'a ingen:Block ; lv2:prototype <url> …'))`
  — i.e. ordinary LV2 prototypes instantiated as Ingen Blocks, canvas
  position set via `ingen:canvasX/Y`; no custom plugin-UI is involved.
- Control flow: `set_parameter_value(port, value)` → `ingen.set(port,
  "http://drobilla.net/ns/ingen#value", str(value))` — control ports are
  addressed **by full node/port path strings** (e.g. `/main/sub1/mix/input`).
- Wiring: `connect_port(src_port, target_port)` /
  `disconnect_port` / `disconnect_plugin(effect_id)` → `ingen.connect`/
  `ingen.disconnect_all`.
- State: `get_state(path)` / `set_file(effect_id, file_name, is_cab,
  effect_type)` / `save_pedalboard` / `load_pedalboard(name, graph)`.

## 3. ABI obligations on our plugins

Derived from the inspected stack (not from guesses):

| Requirement | Evidence |
|---|---|
| AArch64 ELF shared object, GNU/Linux | loader verified (GLIBC_AUDIT.txt) |
| glibc symbols ≤ 2.36 | image libc 2.36-9+deb12u10 |
| No exotic dependencies | our rebuilt .so need only libc/libm(+ld-linux, standard) |
| Integer/symbol-version cleanliness | REBUILD_ABI_CHECK.txt — all needs satisfied |
| Control ports addressed by path; host-side automation only | set_parameter_value semantics |

Our four rebuilt plugins meet the ELF/loader/glibc obligations
(PLUGIN_COMPATIBILITY.md). What is NOT established from offline analysis:
that Ingen 0.5.1 accepts and runs them with correct audible behaviour —
TARGET-BLOCKED.

## 4. LV2 header/version notes — VERIFIED

- In-image LV2 headers: `/usr/include/lv2.h` and the full
  `/usr/include/lv2/` tree (`lv2/core/lv2.h`, `lv2plug.in/ns/...`,
  `lv2-c++-tools`); core vocabulary 1.18.x (`core.lv2` minor 18 / micro 4).
- Rebuild used the 407's own headers through the sysroot — no host LV2 or
  glibc headers entered the build (SYSROOT_BUILD.md §5).