Skip to content

Host verb table declared in plugin-hostd; build the required verbs; limits as declared defaults #131

Description

@linuxnow

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).

  1. A verbs table 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
  2. 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.
  3. 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.
  4. 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.

  1. 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.
  2. 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.
  3. 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:

  1. Presets: save, rename, delete, user banks. preset_save, preset_show, preset_load and 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.
  2. 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_set carries meters only), and the Zynthian engine updates its controller. omx-clap-host: CLAP params flush out-events to the host.
  3. 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

  1. linuxnow commented on Oct 21, 2026

    @linuxnow
    ContributorAuthor

    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.

  2. 14 remaining items

  3. added 2 commits that reference this issue on Oct 22, 2026
  4. linuxnow commented on Oct 23, 2026

    @linuxnow
    ContributorAuthor

    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.

  5. linuxnow commented on Oct 23, 2026

    @linuxnow
    ContributorAuthor

    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.

    1. ONE OWNER. plugin-hostd owns the preset FILE and the preset WIRE: protocol/preset.schema.json (plugin is an OBJECT with a required id, plus version and fingerprint; dates are createdAt and modifiedAt; alias at most PHD_PRESET_ALIAS_MAX), the numeric refusals -523 to -527 and the reply forms in include/plugin-hostd/protocol.h, PHD_PRESET_FILE_MAX, and the format strings. omx-clap-core and omx-plugins INCLUDE or READ those; they do not retype codes, strings, limits or format names. A file that a worker or the daemon refuses with PRESET_INVALID is wrong by plugin-hostd's schema, whoever wrote it.
    2. omx-plugins factory presets (#214/#215): the generator writes plugin as {"id": ""} and createdAt/modifiedAt, validates every file it writes against plugin-hostd's INSTALLED schema (a test: all 120 files validate, sabotage: put the string back), and omx_preset_file.h reads plugin.id. If /1 is the console's older shape, plugin-hostd's schema states /1 as it was and the new shape is /2; decide from what the console's library reads today and say which in the commit.
    3. omx-clap-core (#219): answer the verbs with resp <PHD_ERR_*> (numeric, from plugin-hostd's protocol.h, which src/effects.c already includes), preset_show replies as plugin-hostd's page states, preset_save takes the four arguments mod-host.json declares, the file size limit is PHD_PRESET_FILE_MAX; delete the string codes and format macros in src/preset_file.h. docs/presets.md names only tests that exist: until make test-jack-presets and tests/jack_presets_e2e.sh exist they are not named.
    4. plugin-hostd (Host verb table declared in plugin-hostd; build the required verbs; limits as declared defaults #131): the daemon RELAY must exist in src (supervisor.c still answers preset_list/preset_get with PHD_ERR_NO_PRESET_LIST): read the file, refuse PRESET_INVALID / PRESET_PLUGIN_CHANGED, forward to the worker, answer by the numeric codes, with tests through tests/fake_host.c. docs/presets.md says only what is built.
    5. A cross-repo conformance test lives in plugin-hostd: every omx-plugins factory preset and every file omx-clap-core writes validate against the one schema.
    6. These issues close by an explicit coordinator close after the done-when is met on main, never by a PR keyword (lane-to-pr now says Refs #N).
  6. linuxnow commented on Oct 24, 2026

    @linuxnow
    ContributorAuthor

    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).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Important — fix this month

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions