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.
Summary
Section titled “Summary”People and access
Section titled “People and access”Users and accounts: Partial
Section titled “Users and accounts: Partial”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.
People directory: None
Section titled “People directory: None”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.
Sign-in, SSO and two-factor: None
Section titled “Sign-in, SSO and two-factor: None”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.
Workspaces: Partial
Section titled “Workspaces: Partial”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.
Roles and permissions: Partial
Section titled “Roles and permissions: Partial”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.
Delegations: None
Section titled “Delegations: None”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.
User groups and audiences: Partial
Section titled “User groups and audiences: Partial”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.
Organizational units: Full
Section titled “Organizational units: Full”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.
Invitations and registration: Partial
Section titled “Invitations and registration: Partial”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.
Relations: None
Section titled “Relations: None”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.
Tags and taxonomy: None
Section titled “Tags and taxonomy: None”Missing
- Declared taggable types and vocabularies
- Reading and attaching tags
- A tag picker block
- Tag events
Planned: 0.2.28. Tracked in #714.
Documents
Section titled “Documents”Documents: Partial
Section titled “Documents: Partial”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.
Templates, themes and the editor: Partial
Section titled “Templates, themes and the editor: Partial”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.
Render service: Partial
Section titled “Render service: Partial”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.
Routing and approvals: Partial
Section titled “Routing and approvals: Partial”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.
Forms and workflow
Section titled “Forms and workflow”Plugin forms and public routes: Full
Section titled “Plugin forms and public routes: Full”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.
Core forms and submissions: None
Section titled “Core forms and submissions: None”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.
Meetings and decisions: None
Section titled “Meetings and decisions: None”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.
Inbox and Waiting for you: Partial
Section titled “Inbox and Waiting for you: Partial”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.
Time windows: Partial
Section titled “Time windows: Partial”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.
Workspace records and automations: Full
Section titled “Workspace records and automations: Full”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.
Data types: Full
Section titled “Data types: Full”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.
Reports: None
Section titled “Reports: None”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.
Search and the command palette: Partial
Section titled “Search and the command palette: Partial”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.
Platform services
Section titled “Platform services”Settings: Partial
Section titled “Settings: Partial”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.
Secrets: Partial
Section titled “Secrets: Partial”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.
File storage: Partial
Section titled “File storage: Partial”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.
Notifications and mail: Partial
Section titled “Notifications and mail: Partial”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.
Languages and translations: Partial
Section titled “Languages and translations: Partial”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.
Branding and themes: Partial
Section titled “Branding and themes: Partial”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.
Navigation: Full
Section titled “Navigation: Full”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.
Home page: Partial
Section titled “Home page: Partial”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.
Audit log: Partial
Section titled “Audit log: Partial”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.
Jobs and scheduling: Partial
Section titled “Jobs and scheduling: Partial”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.
Health and status: Full
Section titled “Health and status: Full”In the SDK
- Plugin health probes on the status page (SDK 1.19)
Missing
- Probes per workspace
- Alerting hook
Planned: later.
Plans, entitlements and payments: Partial
Section titled “Plans, entitlements and payments: Partial”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.
Interface
Section titled “Interface”Plugin screens and blocks: Full
Section titled “Plugin screens and blocks: Full”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.
Slots in core screens: None
Section titled “Slots in core screens: None”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.
Desktop app: Partial
Section titled “Desktop app: Partial”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.
Agents and integrations
Section titled “Agents and integrations”MCP tools: Full
Section titled “MCP tools: Full”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.
MCP prompts and resources: Partial
Section titled “MCP prompts and resources: Partial”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.
Agents and presets: Full
Section titled “Agents and presets: Full”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.
Agent proposals: Full
Section titled “Agent proposals: Full”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.
Outbound webhooks and connectors: None
Section titled “Outbound webhooks and connectors: None”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.
Plugin runtime
Section titled “Plugin runtime”Install, versions and lifecycle: Partial
Section titled “Install, versions and lifecycle: Partial”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.
Logging, errors and rate limits: None
Section titled “Logging, errors and rate limits: None”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.
Database and migrations: Full
Section titled “Database and migrations: Full”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.
HTTP routes: Full
Section titled “HTTP routes: Full”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.
Hook events: Partial
Section titled “Hook events: Partial”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.
Command line: None
Section titled “Command line: None”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.
Personal preferences: None
Section titled “Personal preferences: None”Missing
- Reading the person’s language, calendar and density
- Plugin preference keys
Planned: 0.2.27.
Roadmap
Section titled “Roadmap”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 |