Skip to content

Plugin SDK Coverage

How far a plugin can read, change, react to and extend each part of Whity core through the plugin SDK, as of SDK 1.82.0 and core 0.2.26 (2026-11-06). Of 51 areas, 12 are full, 26 partial and 13 none.

  • Full: A plugin can read, change, react to and extend this area through a published SDK contract.
  • Partial: Some of it is in the SDK; the rest is missing or reachable only through internal core classes.
  • None: No SDK contract. A plugin cannot interact with this area in a supported way.

Areas marked Needs a design have gaps that could cross workspaces, skip permissions or move money, so they get a design before an SDK export. Every SDK minor updates this matrix in the same pull request; CI checks it against the version ledger in sdk/src/Sdk.php.

Area Coverage Needs a design Planned
Users and accounts Partial Yes 0.2.27
People directory None Yes 0.2.28
Sign-in, SSO and two-factor None Yes later
Workspaces Partial Yes 0.2.28
Roles and permissions Partial Yes 0.2.27
Delegations None Yes later
User groups and audiences Partial Yes 0.2.28
Organizational units Full 0.2.28
Invitations and registration Partial Yes 0.2.27
Relations None Yes later
Tags and taxonomy None 0.2.28
Documents Partial Yes 0.2.27
Templates, themes and the editor Partial Yes later
Render service Partial Yes 0.2.28
Routing and approvals Partial Yes later
Plugin forms and public routes Full later
Core forms and submissions None Yes 0.2.27
Meetings and decisions None Yes later
Inbox and Waiting for you Partial Yes 0.2.28
Time windows Partial Yes later
Workspace records and automations Full Yes later
Data types Full later
Reports None Yes 0.2.28
Search and the command palette Partial Yes 0.2.28
Settings Partial Yes 0.2.27
Secrets Partial Yes 0.2.27
File storage Partial Yes 0.2.28
Notifications and mail Partial Yes 0.2.27
Languages and translations Partial 0.2.27
Branding and themes Partial Yes later
Navigation Full Yes 0.2.27
Home page Partial 0.2.28
Audit log Partial Yes 0.2.27
Jobs and scheduling Partial Yes 0.2.27
Health and status Full later
Plans, entitlements and payments Partial Yes 0.2.28
Plugin screens and blocks Full Yes later
Slots in core screens None Yes 0.2.28
Desktop app Partial later
MCP tools Full 0.2.27
MCP prompts and resources Partial later
Agents and presets Full 0.2.27
Agent proposals Full 0.2.27
Outbound webhooks and connectors None Yes later
Install, versions and lifecycle Partial Yes 0.2.28
Logging, errors and rate limits None Yes 0.2.28
Database and migrations Full Yes later
HTTP routes Full Yes 0.2.27
Hook events Partial Yes 0.2.27
Command line None Yes later
Personal preferences None 0.2.27

In the SDK

  • user.creating, user.created, user.updated, user.deleted hook events (SDK 1.0)
  • user.creating is read-only and can refuse an admin create with HookVetoException (SDK 1.70)

Missing

  • A user directory and membership reader
  • A supported way to provision or update users
  • user.updating and a user.deleting veto
  • Creation events on self-registration, invitation acceptance and SSO provisioning (only admin create fires them)
  • Custom profile fields
  • A slot on the user record page

Needs a design. Hooks on account creation must not expose credentials or let a listener change the role. A read-only notification payload and a narrow, audited mutation contract are needed rather than more filter hooks.

Planned: 0.2.27.

Missing

  • A person read and search contract
  • person.* events
  • Custom person fields
  • A person picker block

Needs a design. People records are personal data. A reader must be pinned to the current workspace, checked against relations:read for the caller, and able to redact fields.

Planned: 0.2.28.

In the SDK

  • ExternalAuthProvider and ExternalIdentity types (not yet wired to a registration path) (host)

Missing

  • Registering a plugin identity provider
  • Read-only sign-in, sign-out, two-factor and password-reset events
  • Custom second factors
  • Password policy extension

Needs a design. An identity provider decides who an account belongs to. It needs a trust tier, operator-only enablement and binding per workspace. Sign-in events must be observe-only so no plugin can capture credentials or block sign-in.

Planned: later.

In the SDK

  • tenant.creating to tenant.deleted hook events (SDK 1.0)
  • Veto a workspace deletion inside its transaction (SDK 1.15)
  • Owned tables cascade on workspace deletion (PluginTablesInterface) (SDK 1.20)

Missing

  • A workspace read contract (name, plan, locale, enabled plugins)
  • Workspace custom fields
  • A slot on workspace settings

Needs a design. Install-wide plugins see every workspace’s events. Hook subscriptions scoped to a workspace need a design before more workspace data is exposed.

Planned: 0.2.28.

In the SDK

  • Route requiredPermission enforced by the host (SDK 1.2)
  • PermissionResolver: read-only permission checks (SDK 1.16)
  • Permission checks scoped to one record (SDK 1.17)
  • Plugin-declared resource types (SDK 1.18)
  • Role checks scoped to one record (SDK 1.22)
  • ResourceScope: which records of a plugin resource type a caller may act on (narrowing only) (SDK 1.74)
  • Declared permissions and seeded roles (PluginRolesInterface) (SDK 1.0)
  • Role grants limited to the plugin’s own permissions and roles, removed only by the plugin that made them (SDK 1.72)

Missing

  • Granting and revoking record-level roles through a contract
  • Events when a role’s permissions change, and a veto on grants
  • Roles namespaced to the plugin

Needs a design. Anything that grants authority can escalate privilege. Role seeding and grants must be limited to the plugin’s own roles and permissions, and every check must be bound to the caller’s workspace by the host.

Planned: 0.2.27.

Missing

  • Reading active delegations and the acting-for context
  • Delegation events
  • A veto on delegating a plugin-owned permission

Needs a design. Delegation transfers authority, so plugins may observe and refuse it but must never create it.

Planned: later.

In the SDK

  • Plugin rule kinds in groups and routing (RoutingRuleResolverInterface) (SDK 1.37)
  • Audience rule vocabulary shared with groups (SDK 1.38)

Missing

  • Resolving a group’s or audience’s members
  • Group events
  • A group picker block

Needs a design. A plugin rule resolver returns people for a workspace. The host must drop anyone who is not an active member of that workspace rather than trusting the resolver.

Planned: 0.2.28.

In the SDK

  • ou.* hook events, including role assignment and a delete veto (SDK 1.0)
  • Plugin OU types an admin adopts (SDK 1.30)
  • ouScopePicker block (SDK 1.32)

Missing

  • A server-side OU tree reader
  • OU custom fields

Planned: 0.2.28.

In the SDK

  • membership.customer_joined when somebody joins a workspace through its own customer sign-up (SDK 1.73)

Missing

  • Published constants for registration.completed, registration.approved and registration.rejected (fired today, not in Events)
  • Invitation events
  • Custom registration fields
  • An accept-or-reject check on registration

Needs a design. A registration check may accept or reject, never set the role or unit, or it becomes an escalation path.

Planned: 0.2.27.

Missing

  • Plugin relationship types
  • Reading and writing relations
  • Relation events

Needs a design. Relations hold family and guardian links. Writes need permission-checked contracts.

Planned: later.

Missing

  • Declared taggable types and vocabularies
  • Reading and attaching tags
  • A tag picker block
  • Tag events

Planned: 0.2.28. Tracked in #714.

In the SDK

  • documentViewer block (SDK 1.36)
  • document.issuing (veto and checks), document.issued, document.rendered events (SDK 1.49)
  • Issue documents as the person (Documents::issue) (SDK 1.56)
  • Issue in the background where the workspace allows it (SDK 1.58)
  • PluginDocumentStore, QR verification links and tracking (SDK 1.63)
  • Document numbering rules and document.numbered (SDK 1.65)
  • Preflight an issue without writing (SDK 1.66)
  • document.revised (SDK 1.68)

Missing

  • Reading and listing documents other than the plugin’s own
  • Withdraw and revise contracts, and document.withdrawn
  • Issue events for documents raised by form submissions
  • Published constants for document.routed and document.route_acted
  • Embed record providers and chart sources
  • Collections and organizer views

Needs a design. Document visibility depends on the caller and the route. A reader must apply the host’s visibility policy per caller, and withdraw or revise must keep the audit trail intact.

Planned: 0.2.27.

In the SDK

  • Template slots in plugin.json (SDK 1.55)
  • Template slots and merge-field providers for code plugins (SDK 1.56)
  • Starter templates shipped by a plugin, seeded per workspace (SDK 1.81)
  • Read published templates and their merge fields (Templates) (SDK 1.82)

Missing

  • Plugin document themes
  • Editor blocks, toolbar items and slash-menu entries
  • Template and theme events

Needs a design. Merge fields and editor blocks end up in printed, immutable documents. Providers must be held to the caller’s workspace and permissions by the host, and plugin block markup needs a sandbox and server-side schema checks.

Planned: later.

In the SDK

  • DocumentRenderer, FlowDocument, PageSpec (SDK 1.41)
  • Inline runs in flowing text (SDK 1.44)
  • Render and issue from queue jobs and CLI commands (SDK 1.76)

Missing

  • Choosing a theme or brand when rendering
  • Rendering from a workspace template outside Documents::issue

Needs a design. HTML or CSS input to the renderer would be an injection and server-side request surface. Keep input structured.

Planned: 0.2.28. Tracked in #1151.

In the SDK

  • Plugin routing rules that resolve recipients (SDK 1.37)

Missing

  • Reading a document’s route and trail
  • Starting or acting on a route
  • Plugin route effects
  • route.completed, step-due events and a veto before an action

Needs a design. Acting on a route is an approval on a person’s behalf. It needs the actor bound by the host and the agent proposal policy.

Planned: later.

In the SDK

  • form block and input blocks (SDK 1.8)
  • Form preload from the plugin’s own GET (dataSource) (SDK 1.40)
  • Discriminated sub-forms (variant) (SDK 1.42)
  • Anonymous form posts (‘public’ => ‘form’, PublicForm) (SDK 1.67)
  • Anonymous link reads (‘public’ => ‘read’, PublicRead) (SDK 1.69)

Missing

  • Per-route rate limits beyond the host defaults

Planned: later.

Missing

  • form.submitted, submission.reviewed and submission.withdrawn events
  • Reading submissions
  • Custom field types, validators and prefill sources
  • Mapping a submission to a plugin record
  • A slot in the form builder and in submission review

Needs a design. Submissions hold personal data and anonymous input. Readers must respect member and reviewer scope, events should carry ids only, and a plugin field type on a public form needs the same gate public forms already have.

Planned: 0.2.27.

Missing

  • meeting.scheduled, meeting.held and decision.recorded events
  • Reading meetings and decisions
  • Agenda-item sources and a minutes slot

Needs a design. Attendance, quorum and decisions are legal facts. Writes need a host-bound actor and audit.

Planned: later.

In the SDK

  • inbox and timeline blocks for the plugin’s own items (SDK 1.31)

Missing

  • An inbox source contract so plugin tasks reach Waiting for you
  • Acting on an inbox item from a plugin

Needs a design. Each source must answer only for the caller in the current workspace. The host has to enforce that rather than trust the source.

Planned: 0.2.28. Tracked in #881.

In the SDK

  • Plugin window types an admin adopts (SDK 1.39)

Missing

  • Resolving a date to its window
  • window.closing veto, window.closed and window.reopened
  • A closed-period guard for plugin records
  • A published close-report contract

Needs a design. A closed period is a bookkeeping rule. Writes into it need a host-enforced guard.

Planned: later.

In the SDK

  • plugin.json manifest (SDK 1.47)
  • Manifest expressions (SDK 1.48)
  • Record types (SDK 1.50)
  • Record rules, defaults, computed and locked fields (SDK 1.51)
  • Automations (SDK 1.53)
  • Manifest tests (SDK 1.54)
  • issue_document automation step (SDK 1.57)

Missing

  • send_webhook, ask_approval, wait and call_action steps
  • Triggers from core events (form submitted, document issued)
  • Record types for code plugins

Needs a design. Triggers from another area’s events must carry ids and re-read under the run’s permissions. send_webhook needs an egress allowlist.

Planned: later.

In the SDK

  • Plugin-owned data types with generic admin screens (SDK 1.20)
  • Lifecycle writes and guards (SDK 1.24)

Missing

  • Lifecycle events (trashed, restored, deleted)
  • Data types as document merge fields

Planned: later.

Missing

  • A report source contract
  • Custom columns and filters
  • Scheduled reports

Needs a design. A report aggregates across records, so row visibility per caller must be enforced by the host or totals leak across units.

Planned: 0.2.28.

In the SDK

  • Data types that declare search are found by /api/search (host)

Missing

  • Workspace records in search
  • A custom search source
  • Palette commands and actions
  • Searching from a plugin

Needs a design. Results must be filtered by what the caller can see. The declarative path is safe; a free-form source needs host-side scoping.

Planned: 0.2.28.

In the SDK

  • Declared, typed, namespaced settings keys (SDK 1.21)

Missing

  • An SDK reader and writer for the plugin’s own keys
  • A settings-changed event
  • A settings page per plugin and per workspace

Needs a design. The internal settings service also covers core and install-wide keys. The SDK reader must be limited to the plugin’s own keys in the current workspace.

Planned: 0.2.27.

In the SDK

  • PluginSecrets: encrypted per plugin and workspace (SDK 1.60)

Missing

  • A host-rendered secret entry field
  • Listing and rotation

Needs a design. The host, not the caller, must decide which plugin and workspace a store belongs to.

Planned: 0.2.27.

In the SDK

  • Multipart uploads (SDK 1.5)
  • PluginFiles and ready-made file routes (SDK 1.63)

Missing

  • Signed temporary links
  • Quotas and a scan hook
  • file.uploaded event

Needs a design. The host must decide which plugin and workspace a store belongs to.

Planned: 0.2.28.

In the SDK

  • NotificationTransport contract (not yet discovered from plugins) (SDK 1.14)

Missing

  • A Notifier service: send to a person, role or unit
  • Declared notification types with English and Arabic labels
  • Registering plugin transports
  • Sent and failed events

Needs a design. Sending must be bound to the current workspace, reach only its members, and respect opt-outs; a plugin must not be able to pose as a security or billing notice.

Planned: 0.2.27.

In the SDK

  • English and Arabic labels on settings, data types, manifest screens and agents (SDK 1.21)

Missing

  • Shipping a translation catalogue
  • Arabic labels on frontend features, navigation and block text
  • The request’s language in the SDK Request

Planned: 0.2.27. Tracked in #521.

In the SDK

  • Theme token override from a plugin route (SDK 1.12)

Missing

  • Reading workspace branding
  • Choosing which plugin’s override applies per workspace
  • Fonts, logos and radii

Needs a design. The theme route is public and runs on every page. Per-workspace overrides need a design.

Planned: later.

In the SDK

  • Frontend features become sidebar items; navigation.register hook (SDK 1.2)

Missing

  • Top bar, user menu and create quick actions
  • Arabic labels

Needs a design. Navigation listeners receive the whole menu. Contributions should be append-only with links checked as internal paths.

Planned: 0.2.27.

In the SDK

  • One home card per plugin (SDK 1.62)

Missing

  • More than one card, and actions on cards
  • Contributing to Waiting for you

Planned: 0.2.28.

In the SDK

  • Declared audited plugin events (SDK 1.29)
  • timeline block (SDK 1.31)

Missing

  • Reading the plugin’s own audit entries
  • Recording an entry with a target and actor directly

Needs a design. Audit rows must be attributed by the host to the plugin that wrote them, so one plugin cannot write rows under another’s or core’s name.

Planned: 0.2.27.

In the SDK

  • Plugin job handlers (SDK 1.28)

Missing

  • Enqueueing through the SDK
  • Scheduled (cron) jobs
  • Job status for the UI

Needs a design. Enqueueing must accept only the plugin’s own job names in the current workspace.

Planned: 0.2.27.

In the SDK

  • Plugin health probes on the status page (SDK 1.19)

Missing

  • Probes per workspace
  • Alerting hook

Planned: later.

In the SDK

  • Declared sellable limits in the plan catalogue (PluginEntitlementsInterface) (host)
  • A plugin can be the deployment’s billing portal: checkout, subscriptions, customer portal, refunds and verified provider notifications (PluginBillingPortalInterface) (SDK 1.77)

Missing

  • Reading entitlements and consuming meters through the SDK
  • requiredEntitlement on routes
  • Plan, subscription and seat events
  • Charging through Whity Pay

Needs a design. Charging moves money. It needs consent, the ledger, idempotency and webhook trust; meters must stay bound to the workspace.

Planned: 0.2.28.

In the SDK

  • Frontend features (crud, action, custom) (SDK 1.2)
  • Server-driven blocks (SDK 1.6)
  • Data blocks (SDK 1.7)
  • chart block (SDK 1.10)
  • Sort, filter and paging (SDK 1.11)
  • Embedded screens (SDK 1.13)
  • dataRecord and recordFields blocks (SDK 1.33)
  • visibleWhen and accessGate (SDK 1.34)
  • flow block (SDK 1.35)

Missing

  • Native screens for store plugins (custom screens need a change in this repository)
  • Blocks outside /admin/x pages

Needs a design. Embedded screens are not isolated from the app. Third-party UI needs a separate origin, a message bridge and a scoped token first.

Planned: later.

Missing

  • Tabs, sections and actions on person, user, role, unit, workspace and document record pages
  • Slots in admin screens, settings and the person’s own settings
  • Top bar and user menu entries

Needs a design. A slot receives the record it sits on. It needs per-record permission checks and the same own-routes rule blocks have.

Planned: 0.2.28.

In the SDK

  • Plugins run under the offline desktop PHP host (SDK 1.27)

Missing

  • Rendering plugin blocks in the desktop or Flutter apps
  • Desktop plugin releases per workspace

Planned: later.

In the SDK

  • Plugin routes become MCP tools (host)
  • Hand-authored tools (SDK 1.43)
  • Tool annotations (SDK 1.45)
  • Tool context (SDK 1.46)
  • Toolsets, visibility, agent policy and undo windows (SDK 1.52)
  • Caller identity: person, agent or system (SDK 1.59)
  • The host decides whether a tool only reads (SDK 1.71)
  • Previews of what a proposed tool call would change (SDK 1.78)

Planned: 0.2.27.

In the SDK

  • Plugin prompts (SDK 1.9)
  • Plugin resources, read with the caller’s context (SDK 1.80)
  • Prompts and resources only from plugins the operator granted agent context, each gated by permission (SDK 1.80)

Missing

  • Resource subscriptions
  • Workspace-specific prompts

Planned: later.

In the SDK

  • Agent presets (SDK 1.61)
  • Plugin agents (SDK 1.64)
  • Agents service: the workspace’s agents and their activity, as the calling person (SDK 1.75)
  • Agent lifecycle events (SDK 1.75)
  • MCP connections, read without secrets, and connection events (SDK 1.79)

Planned: 0.2.27.

In the SDK

  • agentPolicy propose and suggest-only on plugin tools (SDK 1.52)
  • Proposal created, decided and undone events (SDK 1.78)
  • Plugin-provided previews of a proposal, run read-only (SDK 1.78)

Planned: 0.2.27.

Missing

  • Subscribing external URLs to events, with signing, retries and a delivery log
  • An outbound HTTP client
  • Admin-registered connectors

Needs a design. Outbound calls need a guard against private addresses, signing secrets kept in PluginSecrets, a workspace check per event and id-only payloads.

Planned: later. Tracked in #342.

In the SDK

  • SDK version constraint (SDK 1.1)
  • Core version constraint (SDK 1.4)

Missing

  • Enabled, installed and upgraded callbacks
  • Knowing whether the plugin is on for the current workspace
  • The running core version

Needs a design. Installing and enabling stay operator-only. A lifecycle callback must not let a plugin enable others.

Planned: 0.2.28.

Missing

  • A scrubbed logger
  • Reporting errors to the error tracker
  • Rate limits declared per route
  • Metrics

Needs a design. Plugin payloads must pass through the same scrubber before they reach logs or the error tracker.

Planned: 0.2.28.

In the SDK

  • Migrations (SDK 1.0)
  • Tenant-isolation conformance kit (SDK 1.3)
  • SchemaInspector (SDK 1.23)
  • Upsert and SequenceAllocator (SDK 1.25)
  • Undeclared-reference linter (SDK 1.26)
  • Offline-host conformance kit (SDK 1.27)

Missing

  • A runtime connection handle from the SDK
  • Read-only views of core tables

Needs a design. Workspace isolation is checked by lint and tests, not enforced. A connection bound to the workspace is a design question.

Planned: later.

In the SDK

  • Request and Response (SDK 1.0)
  • Multipart requests (SDK 1.5)
  • Route schemas in the OpenAPI document (host)

Missing

  • Workspace, language and actor kind on Request
  • Per-route rate limits and entitlements

Needs a design. Routes cannot tell an agent from a person today, so they cannot apply stricter rules to agents.

Planned: 0.2.27.

In the SDK

  • Events catalogue (SDK 1.0)
  • Veto exception (SDK 1.15)

Missing

  • Constants for events core already fires (membership, registration, federated sign-in, resource grants, routing, close report)
  • Observe-only listeners that cannot change the payload
  • Events for settings, plugins, plans, notifications, files and jobs

Needs a design. Every listener can rewrite the payload today. Observe-only listeners, and a per-event list of what may change, are needed before more events are published.

Planned: 0.2.27.

Missing

  • Plugin commands

Needs a design. Commands run with full database rights outside RBAC. A plugin command must be operator-only and name its workspace explicitly.

Planned: later.

Missing

  • Reading the person’s language, calendar and density
  • Plugin preference keys

Planned: 0.2.27.

Ordered by value to plugin authors, then by risk. Items marked design first get a reviewed design before any code.

Hardening (0.2.27). Before new surface: tighten the existing extension points the sweep found too permissive. Tracked privately under SECURITY.md and fixed in 0.2.27; each fix is listed here once it ships.

0.2.27: Events, context and the basics every plugin rebuilds

Section titled “0.2.27: Events, context and the basics every plugin rebuilds”
Item Areas Value Risk Design first Issue
Publish constants for every event core already fires, and add observe-only listeners Hook events, Invitations and registration, Users and accounts, Documents high low #1673
form.submitted, submission.reviewed and submission.withdrawn, and issue events for submission documents Core forms and submissions, Documents high medium #1674
Workspace, language and actor kind (person, agent, system) on the SDK Request HTTP routes, Languages and translations, Personal preferences high low #1675
Read and write the plugin’s own settings for the current workspace, a settings-changed event, and a host-rendered secret field Settings, Secrets high medium #1676
Notifier: declared notification types, sent to a person, role or unit in the current workspace Notifications and mail high medium #1677
Ship English and Arabic catalogues, and Arabic labels on features, navigation and blocks Languages and translations, Navigation medium low #521
Enqueue the plugin’s own jobs, and declare scheduled jobs Jobs and scheduling medium medium #1678
Record and read the plugin’s own audit entries, attributed by the host Audit log medium low #1679

0.2.28: Reading core data safely, and appearing inside core screens

Section titled “0.2.28: Reading core data safely, and appearing inside core screens”
Item Areas Value Risk Design first Issue
People, user, group and unit readers pinned to the workspace and checked per caller, with picker blocks People directory, Users and accounts, User groups and audiences, Organizational units, Workspaces high high Yes #1680
Inbox source contract: plugin tasks in Waiting for you Inbox and Waiting for you, Home page high medium Yes #881
Tabs, sections and actions on core record pages, rendered with blocks Slots in core screens high high Yes #1681
Search and report source contracts, filtered per caller by the host; workspace records in search Search and the command palette, Reports medium medium Yes #1682
Read entitlements and consume meters, and requiredEntitlement on routes Plans, entitlements and payments medium medium #1683
Read and list documents under the host’s visibility policy; withdraw and revise contracts Documents medium high Yes #1684
Plugin previews for proposals, and proposal events Agent proposals, MCP tools medium low #1685
Plugin tag vocabularies and taggable types Tags and taxonomy medium low #714
Lifecycle callbacks, a scrubbed logger, error reporting and per-route rate limits Install, versions and lifecycle, Logging, errors and rate limits medium low #1686
Render and issue from a job, and render with a workspace theme Render service, File storage medium medium #1151

later: High-risk surface, each behind its own design

Section titled “later: High-risk surface, each behind its own design”
Item Areas Value Risk Design first Issue
Outbound webhooks and connectors, and the send_webhook automation step Outbound webhooks and connectors, Workspace records and automations high high Yes #342
Charging through Whity Pay Plans, entitlements and payments high high Yes #1687
Isolated origin for embedded and store-plugin UI, then native screens for store plugins Plugin screens and blocks high high Yes #1688
Editor blocks and document themes from plugins Templates, themes and the editor medium high Yes #1689
Plugin identity providers and sign-in events Sign-in, SSO and two-factor medium high Yes #1690
Custom form field types, validators and prefill sources Core forms and submissions medium medium Yes #1691
Routing, meeting and time-window events, and a closed-period guard Routing and approvals, Meetings and decisions, Time windows medium medium #1692
Least-privilege plugin capabilities: plugins reach only the services they declare Database and migrations, Hook events medium high Yes #1693
Relations, delegations and plugin CLI commands Relations, Delegations, Command line low high Yes #1694