- plugin-architecture.md: new "Entity class display labels (API v10)"
section documenting the split (stable identity keys in XDATA, display
labels in the plugin declaration), the live-loaded-plugin gating (missing,
disabled, cap-excluded, failed, removed, or dead → bare native type), the
"<Label> (<Native>)" display rule, that raw schema fields (`type`,
`dxf_name`, `record_type`) and LIST are unchanged, and that the label is
display-only. `plugin.toml` deliberately does not carry the table: it is
the pre-load discovery file and labels must activate on live manifests.
- Template v2 demonstrates the whole convention: declares
`SURVEY-CLASS:POINT -> "Survey Point"` and stamps the identity key in
MARK_FIRST_SURVEY_POINT, so marked points show as "Survey Point (Point)"
while the plugin is loaded. plugin.toml's api_version is bumped to 10 (keep
in sync with ApiVersion::CURRENT) with a NOTE on where the class table
lives. DESIGN.md documents the flow.
- Template v2's stale `acadrust` pin (8a28c21, predating the host's codec
bump to 278c49a) is realigned with the host's pin: without it the template
no longer compiles on main — its `acadrust::EntityType` and the host
re-exports are distinct types when the revisions disagree (verified the
same four type errors occur before and after this feature's template edit).
- changelogs/unreleased.md entry (Plugins section).
Change CadModule::ribbon_groups() from -> Vec<RibbonGroup> to -> &[RibbonGroup],
backed by a per-module OnceLock cache. The ribbon group tree is static data
(&'static str, Copy enums) that was being fully reconstructed — Vecs, String
clones, enum discriminants — on every call, including all three per-frame
call sites (view(), dropdown_overlay(), style_combo_overlay()).
- 7 built-in modules + 2 plugin templates cache via function-local OnceLock.
Safe because each is a unit struct with exactly one instance per process
(plugins run in isolated child processes; see PluginProcess::spawn()).
- SharedCadModule avoids the static pattern entirely, storing groups in an
instance field (owned.rs).
- IPC runner converts &RibbonGroup -> OwnedRibbonGroup directly via new
From<&T> impls, avoiding an intermediate clone.
- render_small/render_large and the two make_tool_row closures now borrow
(&RibbonItem, &[ToolDef]) instead of taking ownership, so the view loop
doesn't need to clone items to satisfy the old by-value signatures.
- Various match-ergonomics deref fixes (*id, *default, *icon, etc.) from
the &RibbonItem pattern change.