2026.10.57 — 2026-10-21
Breaking
Name realtime topics by role (9754674b)
Show every cluster and its subscriptions on one estate page (7fc4caf1)
The landing page is now the estate instead of a redirect to the first cluster: every cluster with its system, environment and health read the same way for every system, and the subscriptions across them with the row actions of each row's own cluster, each disabled with its reason. The cluster switcher gets an "All clusters" entry that leads to it.
The home slot is renamed from home.empty to home.estate.
Switching to a cluster of another system no longer carries a system-only view over to it, which ended on the not-found page; the switcher opens that cluster's home instead.
Name shared screens by role and show each row's kind (47005414)
Key plugin action targets and slots by role (37487b19)
Name connection close targets by role (ca4da4ea)
The connection close kind in the REST response, OpenAPI and the MCP connection_action tool is now one enum of role nouns: CONNECTION, CHANNEL (was SESSION), CONSUMER and DESTINATION (was ADDRESS_CONSUMERS).
Name MCP tools, arguments and prompts by role (69e43d44)
MCP tools, their arguments and the runbook prompts now speak roles (destination, subscription, route, connection, channel, consumer, producer) and take canonical resource ids such as artemis.queue/orders, as list_resources returns them.
Name resource fields by role in transfer, bulk, triage, events, metrics and alerting (45bf31b8)
Fields that held a queue or an address now name the subscription or the destination, and hold its resource id (
artemis.queue/orders) where they name one resource.Name SQL console columns by role (4c48f1e3)
The SQL console names what a message sits on by role, not by Artemis word.
Move Artemis-only routes under the artemis namespace (86e0fb32)
The broker configuration, its diff and the setup review are Artemis's own, so their routes move under /clusters/{c}/artemis/, and a cluster that runs another system answers the standard 404 there.
- /clusters/{c}/config/** -> /clusters/{c}/artemis/config/** (including bridge-credentials)
- /clusters/{c}/config-diff -> /clusters/{c}/artemis/config-diff
- /clusters/{c}/nodes/{n}/config -> /clusters/{c}/artemis/nodes/{n}/config
- /clusters/{c}/setup-review/** -> /clusters/{c}/artemis/setup-review/**
The URL namespace is the declaration: any path under /clusters/{c}/{system}/ where {system} is an installed driver's system id is refused unless the cluster runs it, so a new system-only controller cannot forget the guard.
Address shared resources by role and by kind and path (946f3494)
The resource API names what a resource is for, not what one broker calls it, and every resource is addressed by its kind and its path.
Routes, for an upgrader (old -> new):
- GET /clusters/{c}/queues -> /subscriptions; /addresses -> /destinations; /sessions -> /channels; /diverts and /bridges -> /routes (one list; routeClass FORWARD or LINK); /dlq -> /dead-letters. /consumers, /connections and /producers keep their paths.
- POST /queues -> /subscriptions {kind, name, destination, attributes}; POST /addresses -> /destinations {kind, name, attributes}.
- /queues/{q}/configuration, PATCH and DELETE of /queues/{q} and /addresses/{a} -> GET, PATCH and DELETE /resources/{kind}/{path}.
- /queues/{q}/pause, /resume, /reset-counter -> POST /resources/{kind}/{path}:pause, :resume, :reset-counters; DELETE /queues/{q}/messages -> POST /resources/{kind}/{path}:purge.
- /queues/{q}/messages -> /resources/{kind}/{path}/messages, .../messages/{position}; /messages/actions/{action} -> POST /resources/{kind}/{path}/messages:{action}.
- /nodes/{n}/connections|sessions|consumers/{id}/close and /addresses/{a}/consumers/close -> POST /resources/{kind}/{path}:close?node={n}.
- New: GET /subscriptions?q&cluster&sort&page&size lists the subscriptions of every cluster the caller may see.
- {path} is the id's path percent-encoded once more, so a name that holds a slash or a percent sign is one segment.
Bodies and views: resources carry id, kind and kindLabel, and a field that names another resource holds that resource's canonical id and is named by its role (subscription, destination, channel, connection). SubscriptionView.queueName/address/routingType are name, destination and nativeAttributes.routingType; message ids are positions (strings); the message action body takes positions and a target id; DLQ views are dead-letter destinations and subscriptions. Cluster views gain system and kinds. Audit target types QUEUE, ADDRESS and DIVERT are SUBSCRIPTION, DESTINATION and ROUTE, and the lifecycle audit actions are CREATE_SUBSCRIPTION, UPDATE_RESOURCE, DELETE_SUBSCRIPTION, PAUSE_SUBSCRIPTION, RESUME_SUBSCRIPTION, RESET_COUNTERS, CREATE_DESTINATION, DELETE_DESTINATION, CREATE_ROUTE and DELETE_ROUTE. Existing audit rows keep their old names.
Move divert creation under the Artemis namespace (a1797332)
Creating and deleting a divert is Artemis-only, so its routes move under the Artemis namespace. The request and response bodies are unchanged; only the paths move, and the routing view, the demo seed and the API client follow. Listing diverts and bridges stays at
GET /clusters/{clusterId}/divertsandGET /clusters/{clusterId}/bridges.Name plugin message sources and targets by role (eec6acd0)
Plugin messaging names what it reads and writes by role instead of by queue and address.
- RegistrationSpec.queue and MessageRegistration.queue are now
ResourceRef source, a subscription. - PluginMessage.queue is now
ResourceRef source, and PluginMessage.nodeId moves into the newMessageRef(nodeId, position)asPluginMessage.message, which also says where on that node the message is. - OutboundMessage.address is now
ResourceRef target: a destination routes the message, a subscription receives it directly where the system supports sending to one. This replaces theaddress::queueform. - PluginMessaging.checkSend takes a ResourceRef target.
- Effect.stateKey is now Effect.etag.
- Contract.VERSION is 17, and the plugin template pins it.
- RegistrationSpec.queue and MessageRegistration.queue are now
Name permissions and team patterns by role (2446487b)
Permissions, team patterns and token grants now speak in OpenBroker roles: a destination (was an address) and a subscription (was a queue).
Permission ids renamed:
- queue:read, create, delete, update, pause, purge -> subscription:read, create, delete, update, pause, purge
- address:read, create, delete -> destination:read, create, delete
- divert:write -> route:write
Approval gate operation types renamed: queue.delete -> subscription.delete, queue.purge -> subscription.purge, address.delete -> destination.delete.
Team pattern and share kinds QUEUE, ADDRESS, BOTH are now SUBSCRIPTION, DESTINATION, ANY. A token grant limited to names takes a resourceType of SUBSCRIPTION or DESTINATION (was resourceKind QUEUE or ADDRESS). The resource-type query parameter of the access check, resource access and unowned endpoints is now type, and the create patterns of the access summary are subscription and destination.
Plugin API: ResourceKind is now ResourceType (DESTINATION, SUBSCRIPTION), ResourceRef.queue and address are subscription and destination, PermissionDef.resourceKinds is resourceTypes. In plugin.json, resourceKinds is now resourceTypes and an assistant tool's resourceKind is now resourceType, with the values subscription and destination.
Added
Show each bulk item's and consumer-health row's kind (2a200360)
Name realtime topics by role (9754674b)
Show every cluster and its subscriptions on one estate page (7fc4caf1)
The landing page is now the estate instead of a redirect to the first cluster: every cluster with its system, environment and health read the same way for every system, and the subscriptions across them with the row actions of each row's own cluster, each disabled with its reason. The cluster switcher gets an "All clusters" entry that leads to it.
The home slot is renamed from home.empty to home.estate.
Switching to a cluster of another system no longer carries a system-only view over to it, which ended on the not-found page; the switcher opens that cluster's home instead.
Show system-only screens only for clusters of that system (715d4de0)
A navigation entry can name the system it is for. The sidebar, the command palette and the
gletters leave it out for a cluster that runs another system, and the screen's route, under/clusters/<id>/artemis/, answers such a cluster with the page-not-found page. Configuration, Config diff and Setup review are Artemis's; so is the routing Builder tab.A control disabled because the kind lacks the verb says so first, built from the system, the kind and the verb ("Artemis queues cannot be purged."), then a capability that is unavailable, then a permission that is missing. The control stays visible and the reason is reachable from the keyboard.
Name shared screens by role and show each row's kind (47005414)
Key plugin action targets and slots by role (37487b19)
Name connection close targets by role (ca4da4ea)
The connection close kind in the REST response, OpenAPI and the MCP connection_action tool is now one enum of role nouns: CONNECTION, CHANNEL (was SESSION), CONSUMER and DESTINATION (was ADDRESS_CONSUMERS).
Name MCP tools, arguments and prompts by role (69e43d44)
MCP tools, their arguments and the runbook prompts now speak roles (destination, subscription, route, connection, channel, consumer, producer) and take canonical resource ids such as artemis.queue/orders, as list_resources returns them.
Name resource fields by role in transfer, bulk, triage, events, metrics and alerting (45bf31b8)
Fields that held a queue or an address now name the subscription or the destination, and hold its resource id (
artemis.queue/orders) where they name one resource.Name SQL console columns by role (4c48f1e3)
The SQL console names what a message sits on by role, not by Artemis word.
Move Artemis-only routes under the artemis namespace (86e0fb32)
The broker configuration, its diff and the setup review are Artemis's own, so their routes move under /clusters/{c}/artemis/, and a cluster that runs another system answers the standard 404 there.
- /clusters/{c}/config/** -> /clusters/{c}/artemis/config/** (including bridge-credentials)
- /clusters/{c}/config-diff -> /clusters/{c}/artemis/config-diff
- /clusters/{c}/nodes/{n}/config -> /clusters/{c}/artemis/nodes/{n}/config
- /clusters/{c}/setup-review/** -> /clusters/{c}/artemis/setup-review/**
The URL namespace is the declaration: any path under /clusters/{c}/{system}/ where {system} is an installed driver's system id is refused unless the cluster runs it, so a new system-only controller cannot forget the guard.
Address shared resources by role and by kind and path (946f3494)
The resource API names what a resource is for, not what one broker calls it, and every resource is addressed by its kind and its path.
Routes, for an upgrader (old -> new):
- GET /clusters/{c}/queues -> /subscriptions; /addresses -> /destinations; /sessions -> /channels; /diverts and /bridges -> /routes (one list; routeClass FORWARD or LINK); /dlq -> /dead-letters. /consumers, /connections and /producers keep their paths.
- POST /queues -> /subscriptions {kind, name, destination, attributes}; POST /addresses -> /destinations {kind, name, attributes}.
- /queues/{q}/configuration, PATCH and DELETE of /queues/{q} and /addresses/{a} -> GET, PATCH and DELETE /resources/{kind}/{path}.
- /queues/{q}/pause, /resume, /reset-counter -> POST /resources/{kind}/{path}:pause, :resume, :reset-counters; DELETE /queues/{q}/messages -> POST /resources/{kind}/{path}:purge.
- /queues/{q}/messages -> /resources/{kind}/{path}/messages, .../messages/{position}; /messages/actions/{action} -> POST /resources/{kind}/{path}/messages:{action}.
- /nodes/{n}/connections|sessions|consumers/{id}/close and /addresses/{a}/consumers/close -> POST /resources/{kind}/{path}:close?node={n}.
- New: GET /subscriptions?q&cluster&sort&page&size lists the subscriptions of every cluster the caller may see.
- {path} is the id's path percent-encoded once more, so a name that holds a slash or a percent sign is one segment.
Bodies and views: resources carry id, kind and kindLabel, and a field that names another resource holds that resource's canonical id and is named by its role (subscription, destination, channel, connection). SubscriptionView.queueName/address/routingType are name, destination and nativeAttributes.routingType; message ids are positions (strings); the message action body takes positions and a target id; DLQ views are dead-letter destinations and subscriptions. Cluster views gain system and kinds. Audit target types QUEUE, ADDRESS and DIVERT are SUBSCRIPTION, DESTINATION and ROUTE, and the lifecycle audit actions are CREATE_SUBSCRIPTION, UPDATE_RESOURCE, DELETE_SUBSCRIPTION, PAUSE_SUBSCRIPTION, RESUME_SUBSCRIPTION, RESET_COUNTERS, CREATE_DESTINATION, DELETE_DESTINATION, CREATE_ROUTE and DELETE_ROUTE. Existing audit rows keep their old names.
Move divert creation under the Artemis namespace (a1797332)
Creating and deleting a divert is Artemis-only, so its routes move under the Artemis namespace. The request and response bodies are unchanged; only the paths move, and the routing view, the demo seed and the API client follow. Listing diverts and bridges stays at
GET /clusters/{clusterId}/divertsandGET /clusters/{clusterId}/bridges.Name plugin message sources and targets by role (eec6acd0)
Plugin messaging names what it reads and writes by role instead of by queue and address.
- RegistrationSpec.queue and MessageRegistration.queue are now
ResourceRef source, a subscription. - PluginMessage.queue is now
ResourceRef source, and PluginMessage.nodeId moves into the newMessageRef(nodeId, position)asPluginMessage.message, which also says where on that node the message is. - OutboundMessage.address is now
ResourceRef target: a destination routes the message, a subscription receives it directly where the system supports sending to one. This replaces theaddress::queueform. - PluginMessaging.checkSend takes a ResourceRef target.
- Effect.stateKey is now Effect.etag.
- Contract.VERSION is 17, and the plugin template pins it.
- RegistrationSpec.queue and MessageRegistration.queue are now
Name permissions and team patterns by role (2446487b)
Permissions, team patterns and token grants now speak in OpenBroker roles: a destination (was an address) and a subscription (was a queue).
Permission ids renamed:
- queue:read, create, delete, update, pause, purge -> subscription:read, create, delete, update, pause, purge
- address:read, create, delete -> destination:read, create, delete
- divert:write -> route:write
Approval gate operation types renamed: queue.delete -> subscription.delete, queue.purge -> subscription.purge, address.delete -> destination.delete.
Team pattern and share kinds QUEUE, ADDRESS, BOTH are now SUBSCRIPTION, DESTINATION, ANY. A token grant limited to names takes a resourceType of SUBSCRIPTION or DESTINATION (was resourceKind QUEUE or ADDRESS). The resource-type query parameter of the access check, resource access and unowned endpoints is now type, and the create patterns of the access summary are subscription and destination.
Plugin API: ResourceKind is now ResourceType (DESTINATION, SUBSCRIPTION), ResourceRef.queue and address are subscription and destination, PermissionDef.resourceKinds is resourceTypes. In plugin.json, resourceKinds is now resourceTypes and an assistant tool's resourceKind is now resourceType, with the values subscription and destination.
Fixed
Type the code point read in the resource id encoder (e859be0f)
Keep an empty table to its header so the empty message sits right under it (70ee537c)
Title the dead-letters page Dead letters, as its navigation entry (faf4632d)
Say subscription, not queue, in the consumer-health cause sentences (57b9c562)
Name the missing permission on Environments instead of loading forever (5a1c9995)
Name the Expectations tab and the destination in the tracing reasons (6be34510)
Read an event's family from its openbroker type (1e2c5a07)
The Family column showed 'other' for every event, because it matched the broker's old upper-case notification names.
State an absent delivery and an empty dead-letter destination in words (d8e76b37)
Seed team patterns with the role-neutral kinds (9cb08cc6)
Name the example's resources by role (836304ee)
Reach resources whose names contain a slash or a percent sign (0839a222)
A resource id travels as one URL segment, so a name holding a slash or a percent sign arrives as %2F or %25. Tomcat refused an encoded slash and Spring Security's strict firewall refused both, so a queue named like that could not be opened, paused or deleted at all. Tomcat now passes %2F through undecoded and the firewall allows the encoded slash and percent; the route decodes the segment after it has matched.
Behind a reverse proxy the same must hold: nginx needs proxy_pass without a URI part and Apache needs AllowEncodedSlashes NoDecode with nocanon. The quickstart and the high availability guide say so.
Keep accepting diverts to auto-created addresses and report retroactive diverts (1aff27c0)
The move onto the broker SDK refused a divert whose forwarding address Artemis would create on first use, and dropped retroactiveResource from the routing view, because the SDK's listings carry neither. Both come back: a DivertSettings system extension, implemented in the Artemis module, reads the address settings and the divert MBeans, so the routing feature stays free of Artemis types.