Repository navigation
Host verb table declared in plugin-hostd; build the required verbs; limits as declared defaults #131
Description
Job: declare the host verb table in plugin-hostd's own protocol declaration and build the verbs that are required and missing.
Ruled by the operator 2026-10-21 (openmixer docs/design/specs/2026-10-21-strip-declaration.md on lane/strip-declaration-spec, section 14 items 20 to 23).
- A
verbstable in plugin-hostd's protocol declaration (protocol/plugin-hostd.json family): each of the 35 mod-ui host verbs with required / optional / absent per profile (LV2 worker, CLAP worker, console). Starting values, read from docs/zynthian/verbs.tsv on the devel/zynthian branch:- required: add, remove, bypass, connect, param_set, state_load, state_save, state_tmpdir, feature_enable, bundle_add, bundle_remove, preset_load, preset_save, preset_show, transport, transport_sync, cpu_load
- optional: midi_learn, midi_map, midi_unmap, cv_map, cv_unmap, monitor_midi_program, monitor_output, output_data_ready, patch_get, patch_set
- absent on purpose: cc_map, cc_value_set, cc_unmap, hmi_map, hmi_unmap, show_external_ui, set_midi_program_change_pedalboard_bank_channel, set_midi_program_change_pedalboard_snapshot_channel
- Build the required verbs that the tsv shows broken on the CLAP worker (connect port names, param_set by symbol, state_load, state_tmpdir, feature_enable, bundle_add/remove replay, preset_load/save/show). The smallest fix and its location (plugin-hostd or omx-clap-host) are in the tsv's last column; split the omx-clap-host parts into omx-clap-core issues.
- Limits as DECLARED DEFAULTS, written once and generated: pool members 8 per format, chain members at least 1 (a chain of one is valid, so a trip of one isolated plugin is a chain of one), 64 words in one line, the chain codes. Floor 1 overrides the draft's 2 on Protocol: declare a chain of instances run in one worker, with crash quarantine (for omx-clap-core#104) #101.
- A contract test that the served verb answers match the table; sabotage-verify (change a required verb to absent, watch it go red).
Rules: commit small, author Pau Aliagas linuxnow@gmail.com, no trailer, PR open, do not merge. Hand back what could not be run.
SCOPE UPDATE (operator 2026-10-21, binding; supersedes anything above that differs)
Model: own / pool / chain as BUILT in plugin-hostd 0.7.0 (#101, docs/design/notes/2026-10-21-chains.md on wave/contract-one-pass). NO pool of chains. mod-host is to be dropped: the host is omx-clap-host plus the LV2 adapter only.
- Chain floor 1. A chain of ONE member is valid (a trip of one plugin maps like any other). The built grammar refuses fewer than two with -902: change the grammar, the refusal, tests/verbs_contract.py, README and the protocol declaration, and make omx-clap-host accept a chain line of one (coordinate through a comment on omx-clap-core#104; do not edit that repo here). Limits (pool members 8, chain members at least 1, 64 words in a line, chain codes) are DECLARED DEFAULTS in the declarations.
- LV2 chains under require_pins (a precondition of removing mod-host, openmixer#2052). While require_pins is on a chain of LV2 is refused (PLACEMENT_INVALID) because an LV2 pin holds only in a world narrowed to the plugin's own bundle. Build the chain note's proposal: a chain's worker gets a world narrowed to the UNION of its members' bundles (the format's narrow_world takes a list of uris), so each member's pin still holds. Prove it with a chain of LV2 members through the adapter under require_pins, and sabotage-verify (break the union, watch it go red). Bench with omx-clap-core#104's eight LV2 plugins through the adapter and report the numbers.
- The verb table (required / optional / absent per profile) as in the body above.
Work on plugin-hostd's wave/contract-one-pass (tip 83e54db) via a lane branch; it joins GATE 0.3 only if the lead says so, otherwise it lands after the batch (GATE 2). No PR, no merge. Comment on this issue, do not open new issues.
OPERATOR RULING 2026-10-22: the Zynthian gaps are FIXED, not tolerated
Source: docs/zynthian/engine-gaps.md on spike/zynthian-strip (plugin-hostd PR #129) and docs/zynthian/verbs.tsv on devel/zynthian. The gaps the table calls "use" (the chain runs, a user loses a feature) become required work, not optional:
- Presets: save, rename, delete, user banks.
preset_save,preset_show,preset_loadand the bundle verbs on both CLAP and LV2 workers (verbs.tsv: CLAP answers -902 today; omx-clap-host writes the plugin's state as a preset file and loads it via the CLAP preset-load extension). Zynthian side: the plugind engine lists, saves, renames and deletes user presets as jalv does. - Parameter feedback (a plugin moves its own control: automation, an LFO, a preset load). The worker reports the change, the daemon forwards it as an event (today
output_setcarries meters only), and the Zynthian engine updates its controller. omx-clap-host: CLAP params flush out-events to the host. - MIDI learn.
midi_learn,midi_map,midi_unmap(and cv_map/cv_unmap) answered by the CLAP worker (verbs.tsv: -902 today); Zynthian's own learn by controller keeps working and stays the surface.
These move from "optional" to "required" in the verb table for the CLAP worker and the Zynthian profile. Order: the chain model first (S0 done, Run mod-host in CI so the LV2 worker path is proven #104, floor 1, union-narrowed world), these directly after. Lanes: omx-clap-core (worker side), plugin-hostd (relay + table), the Zynthian engine patch on PR Zynthian spike: a chain's audio slots as a plugin-hostd strip, parallel slots through an explicit mix #129's branch. Comment here; open no new issue.
Activity
docs/design: the host verb table note states the ruling instead of po…
protocol: the host verb table, each mod-ui verb required, optional or…
verbs: the words of a line the daemon reads are the declared line_wor…
fake-host: answers feature_enable, cpu_load, preset_show, preset_save…
host_verbs_contract: every row of the host verb table served per prof…
protocol: the host settings keep feature_enable, the LV2 bundles and …
supervisor: bundle_add, bundle_remove and state_tmpdir kept and sent …
make test serves the host verb table; sabotage breaks a declared row …
docs/design: the omx-clap-core items of the host verb table are the b…
linuxnow commentedon Oct 21, 2026
Operator, 2026-10-21: the model is own / pool / chain as built (plugin-hostd 0.7.0, #101), no pool of chains; mod-host is to be dropped, so the host is omx-clap-host plus the LV2 adapter only. With one host the uniform model wins: every plugin is a member of a chain and a chain of ONE is valid (floor 1; the built grammar refuses fewer than two with -902, so the grammar, its refusal, tests and omx-clap-host's chain line change). The chain note's open question becomes a precondition of removing mod-host (openmixer#2052): while require_pins is on a chain of LV2 plugins is refused (PLACEMENT_INVALID) because an LV2 pin holds only in a world narrowed to its own bundle. Decide and build: a chain worker gets a world narrowed to the UNION of its members' bundles (format narrow_world takes a list of uris), so each member's pin still holds; bench with omx-clap-core#104's eight LV2 plugins through the adapter. Fold both into this issue's scope; do not open new issues.
docs/design: a chain of one is valid, and an LV2 chain under require_…
protocol: chain takes one instance or more, and an LV2 member runs in…
chain: one member is a chain, the grammar and the daemon read chain_m…
protocol: the host verb table, a row per verb and a level per profile (…
14 remaining items
protocol: the preset refusals by code, the preset file formats, MIDI …
Merge pull request #138 from FreeMixer/cluster/plugin-hostd-131-r4-land
Merge pull request #139 from FreeMixer/cluster/plugin-hostd-131-r5-land
linuxnow commentedon Oct 23, 2026
Reopened 2026-10-23 by the coordinator. GitHub closed this issue when a PR whose body said 'Closes #131' merged, but that PR delivered only the first part (the preset file format and the daemon relay, or the worker's preset-file code and doc). The verbs are not implemented in the workers yet: the 2026-10-23 libraries audit found no source for them and the test the presets doc names does not exist. Open work: see the ruling comments 'PRESETS IN THE HOST' and the census comment on plugin-hostd#131. This issue closes when the done-when of the ruling is met, by an explicit close, not by a PR keyword.
linuxnow commentedon Oct 23, 2026
Coordinator ruling 2026-10-23, from the libraries audit (hb-out/audit-2026-10-23-libs.md, F1 to F3). Binding for plugin-hostd#131, omx-clap-core#219 and omx-plugins#214/#215; it adds to the ruling 'PRESETS IN THE HOST' and wins where they differ.
src: the daemon reads a preset file and checks it against the format,…
src: the daemon relays preset_load, preset_save and preset_show of an…
protocol: PRESET_PLUGIN_CHANGED and PRESET_INVALID name what the daem…
docs: presets.md states what this tree builds and what the worker hol…
build: the format test links the preset check the supervisor now calls (
release: plugin-hostd 0.9.0 (#131, #140)
Merge pull request #143 from FreeMixer/cluster/plugin-hostd-release-0…
linuxnow commentedon Oct 24, 2026
The operator ruled the Zynthian order on 2026-10-24: omx-clap-core#104, plugin-hostd#131, omx-clap-core#328, omx-clap-core#327. Source: the review note ops/notes/reviews/2026-10-24-fable-spikes-vst3-zynthian.md in the ops repo (section C).