Back to releases

DSL Mutations and AI

Pomavo now lets you change work at scale with DSL mutations and connect AI assistants through MCP. The release also improves the shared query editor and theme application pipeline.

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.

Run reads and carefully scoped mutations from the same DSL console.

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.

ClauseWhat you use it forTypical result
SETUpdate status or custom fields on matched ticketsTriage, assignment, cleanup, sprint movement
CREATECreate tickets from a templateFollow up tasks, subtasks, planned work
LINKConnect matched tickets to another filtered setDependencies, parent child work, release tracking
UNLINKRemove one link type, selected links, or all linksCleanup stale relationships
COMMENTAdd the same plain text note to matched ticketsNudges, 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 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.

dsl
status = "Open" and priority = "Critical"
set status = "In Progress", assignee = @me
limit 25
dsl
"Sprint" = "Sprint 23" and status != "Done"
set "Sprint" = "Sprint 24"
OperatorMeaningExample use
=Replace the field valueSet status, assignee, priority, or a date
+=Append to a multi-value fieldAdd a label or tag
-=Remove from a multi-value fieldRemove 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.

dsl
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 patternHow it behaves
Standalone CREATECreates a ticket without a source filter
Filtered CREATECreates one ticket per matched source ticket
Multiple CREATE clausesCreates several tickets per source, in order
LINK inside a create blockLinks the source ticket to the new ticket
LINK ... TO (...) inside a create blockLinks the new ticket to targets from a sub-query

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.

dsl
status = "Blocked"
link "is blocked by" to (labels contains "infrastructure")
dsl
status = "Closed"
unlink "relates to"
comment "Closed tickets were detached from stale related work."
Clause formScope
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 ALLRemoves 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.

dsl
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 capabilityWhy it matters
Syntax highlightingYou can visually separate fields, operators, values, and clauses
AutocompleteYou can discover SET, CREATE, LINK, UNLINK, COMMENT, TO, FROM, and LIMIT
SnippetsYou can start from safe shapes such as CREATE "Template" SET ...
Shared editor behaviorSearch, 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 familyExamples
Fieldsstatus, template, assignee, "Story Points"
Operators=, !=, contains, between, in, not in
References@me, @username, $field,
quot;Field Name"
Datesd'today', d'now', d'-7d', d'now+2w'
MutationsSET, 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 areaCapabilities exposed to assistants
TemplatesList templates, get a template by name or id
ProjectsList projects, get a project by slug or id
IterationsList iterations and active iteration data
TicketsGet, search, create, update, set iteration, list transitions, transition
CommentsAdd, edit, delete, and list comments
LinksList link types, link tickets, unlink tickets
AttachmentsUpload, download, and delete attachments
PermissionsCheck and manage permission grants where allowed
QueriesRun reads and bulk mutations through execute_query
AutomationsList, 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.

dsl
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 50

Theme 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 improvementUser-facing effect
Central contextColors apply consistently across nested UI
Runtime applicationTheme changes can update without a full page rewrite
Editor alignmentConsole and DSL highlighting fit the active brand palette
Refactor boundaryFuture 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.