Pomavo now gives you one language for finding tickets, changing them in bulk, and letting trusted AI assistants work with your organization through audited tools. The release brings the mutation engine, a console UI, a shared tokenizer, MCP tools, and a theme refactor into one connected workflow.
Bulk mutations arrive in the query DSL
The Query Language is no longer read only. You can still filter, sort, group, return, limit, and offset tickets, but the same query can now end with a mutation clause. A filter selects the tickets, then the mutation applies to every selected ticket. Large updates run as background work, so the UI does not have to wait for every affected ticket to finish.
| Clause | What you use it for | Typical result |
|---|---|---|
SET | Update status or custom fields on matched tickets | Triage, assignment, cleanup, sprint movement |
CREATE | Create tickets from a template | Follow up tasks, subtasks, planned work |
LINK | Connect matched tickets to another filtered set | Dependencies, parent child work, release tracking |
UNLINK | Remove one link type, selected links, or all links | Cleanup stale relationships |
COMMENT | Add the same plain text note to matched tickets | Nudges, audit notes, bulk communication |
Mutations apply to every ticket the filter matches. Run the query as a plain search first, then add the mutation clause after you have confirmed the result set.
SET updates fields without leaving search
SET is built for the repetitive updates you used to do ticket by ticket.
You can update status and custom fields, including fields with spaces when you quote the field name.
The mutation syntax also supports append and remove operators for multi-value fields where that behavior is supported.
Protected system fields such as sequence_number, created_at, updated_at, template, author, and id are not updatable.
status = "Open" and priority = "Critical"
set status = "In Progress", assignee = @me
limit 25"Sprint" = "Sprint 23" and status != "Done"
set "Sprint" = "Sprint 24"| Operator | Meaning | Example use |
|---|---|---|
= | Replace the field value | Set status, assignee, priority, or a date |
+= | Append to a multi-value field | Add a label or tag |
-= | Remove from a multi-value field | Remove a stale label |
CREATE turns filtered work into follow up work
CREATE can run by itself, or it can run once for each source ticket selected by a filter.
That makes it useful for breaking large approved work into tasks, creating investigation tickets for critical bugs, or adding standard checklist items for a release.
Inside a create block, SET fills the new ticket fields.
You can use source field references with $, including quoted names such as
quot;Due Date".
You can also use string interpolation such as "Investigate: ${Title}" to carry context into the new ticket.
template = "Bug Report" and priority = "Critical" and status = "Open" create "Task" ( set title = "Investigate: ${Title}"Investigate: ${Title}", assignee = $assignee, project = $project link "is parent of" )
limit 20| Create pattern | How it behaves |
|---|---|
Standalone CREATE | Creates a ticket without a source filter |
Filtered CREATE | Creates one ticket per matched source ticket |
Multiple CREATE clauses | Creates several tickets per source, in order |
LINK inside a create block | Links the source ticket to the new ticket |
LINK ... TO (...) inside a create block | Links the new ticket to targets from a sub-query |
LINK and UNLINK clean up relationships at scale
Links are first class in Pomavo, so the DSL can create and remove them in bulk.
Use LINK "link_type" TO (target_filter) when the source set and the target set can both be described by queries.
Use UNLINK when completed, archived, or duplicated tickets should no longer carry stale relationships.
UNLINK ALL is available for aggressive cleanup when you really mean every relationship on the matched tickets.
status = "Blocked"
link "is blocked by" to (labels contains "infrastructure")status = "Closed"
unlink "relates to"
comment "Closed tickets were detached from stale related work."| Clause form | Scope |
|---|---|
LINK "type" TO (query) | Links each matched ticket to every ticket in the target query |
UNLINK "type" | Removes all links of the named type from matched tickets |
UNLINK "type" FROM (query) | Removes named links only when the target matches the sub-query |
UNLINK ALL | Removes every link from matched tickets |
COMMENT adds an auditable note to every match
COMMENT lets you communicate the why behind a bulk change.
Because Pomavo records ticket history and activity under the acting identity, a comment can make a large mutation easier to understand later.
You can chain COMMENT after a SET, CREATE, or LINK clause when the note should describe the action that just happened.
template = "Bug" and status = "In Review" and updated_at < d'-3d'
comment "Friendly nudge: this has been waiting for review for over 3 days."The same comparison, date, reference, and text operators from search are available before the mutation clause.
That includes contains, not contains, between, in, not in, @me, relative dates such as d'-7d', and quoted field names.
A console UI for confident mutation work
The new console experience puts mutation authoring in front of the same high-signal editor used by search. You can write a filter, inspect the matching set, add a mutation clause, and keep a tight loop between query intent and affected tickets. Completions now include the mutation keywords, target clauses, and helpful snippets for common forms.
| Console capability | Why it matters |
|---|---|
| Syntax highlighting | You can visually separate fields, operators, values, and clauses |
| Autocomplete | You can discover SET, CREATE, LINK, UNLINK, COMMENT, TO, FROM, and LIMIT |
| Snippets | You can start from safe shapes such as CREATE "Template" SET ... |
| Shared editor behavior | Search, console, and MCP use the same language model |
Use LIMIT when you are testing a mutation shape. It gives you a small first run before you widen the filter.
Shared query tokenizer across product surfaces
The query tokenizer has been shared so the same DSL looks and behaves consistently wherever you write it. Search, saved queries, the console, automation DSL nodes, and AI-driven execution all benefit from the same understanding of keywords, values, comments, dates, references, and mutation clauses. This reduces drift between product surfaces and makes examples from Query Language reusable.
| Token family | Examples |
|---|---|
| Fields | status, template, assignee, "Story Points" |
| Operators | =, !=, contains, between, in, not in |
| References | @me, @username, $field, quot;Field Name" |
| Dates | d'today', d'now', d'-7d', d'now+2w' |
| Mutations | SET, CREATE, LINK, UNLINK, COMMENT |
MCP gives AI assistants a safe tool boundary
Pomavo now ships an MCP server for the Model Context Protocol.
AI assistants can use it to read organization structure, search tickets, create and update work, manage comments, handle links, upload or download attachments, inspect permissions, and run the DSL through execute_query.
The server authenticates with X-API-Key and X-Org-Short-Name, using an API key issued to a machine identity.
That means assistant activity is attributed to the integration identity and governed by the same permission model as other API clients.
| MCP area | Capabilities exposed to assistants |
|---|---|
| Templates | List templates, get a template by name or id |
| Projects | List projects, get a project by slug or id |
| Iterations | List iterations and active iteration data |
| Tickets | Get, search, create, update, set iteration, list transitions, transition |
| Comments | Add, edit, delete, and list comments |
| Links | List link types, link tickets, unlink tickets |
| Attachments | Upload, download, and delete attachments |
| Permissions | Check and manage permission grants where allowed |
| Queries | Run reads and bulk mutations through execute_query |
| Automations | List, inspect, create, and read automation query syntax |
execute_query supports bulk reads and mutations
The execute_query tool is the bridge between AI intent and the Pomavo DSL.
For reads, the assistant can use the same filters, sorting, grouping, projections, and limits you use in the UI.
For mutations, the assistant can submit a query that changes tickets through the service layer, with permissions applied to every operation.
Mutation responses return counts of succeeded and failed operations plus error details per ticket, so you can audit what happened.
template = "Bug Report" and priority = "Critical" and status = "Open"
set status = "In Progress", labels += "triaged" create "Task" ( set title = "Investigate: ${Title}"Investigate: ${Title}", assignee = $assignee, project = $project link "is parent of" )
link "relates to" to (template = "Epic" and project = $project)
limit 50Theme colors now flow through a JavaScript context
The theme system was refactored so product colors are applied through a JavaScript context rather than scattered one-off application points. That gives Pomavo a cleaner path for tenant branding, documentation surfaces, and embedded editors that need to react to theme changes. The query console benefits directly because syntax highlighting, controls, and preview states can live inside the same theme pipeline.
| Theme improvement | User-facing effect |
|---|---|
| Central context | Colors apply consistently across nested UI |
| Runtime application | Theme changes can update without a full page rewrite |
| Editor alignment | Console and DSL highlighting fit the active brand palette |
| Refactor boundary | Future themed components have one place to read color intent |
Bulk DSL mutations, MCP tools, and shared editor infrastructure make Pomavo easier to operate at team scale. You can automate cleanup, delegate scoped tasks to trusted AI assistants, and keep every change tied to permissions and history.
Next up, you will see these foundations show up in Automations, where the same typed data and query language power no-code workflows.