Automation & Quality Rules

One engine for bad tickets and recurring work

"Every bug needs a component" and "raise the quarterly access review every Monday" are the same kind of object in Trakr. Four scopes, two execution modes, eleven checks, a full field-condition system — and a dry run that changes nothing and tells nobody.

Two jobs

Per-ticket, or once

  • PER_TICKET selects tickets, checks them and acts on each finding
  • ONCE selects nothing and acts a single time
  • ONCE may only create a ticket or call a webhook
  • ONCE is refused at tenant and platform level
  • Same editor, same triggers, same run history
Four scopes

A union of standards, not a ladder

  • PLATFORM, TENANT, ORGANIZATION, PROJECT
  • A project adds standards, it cannot remove them
  • Admin → Automation for platform and tenant
  • Settings → Automation for the organisation
  • Project Settings → Ticket Quality Rules for a project
Deliberately not

The things it refuses to do

  • No cron — hourly, daily or weekly only
  • No regex — pattern matching is glob, * and ?
  • No overruling a workflow refusal
  • No rule cascade — a rule-authored write raises no rule
  • No currentUser() in a rule's filter
Check
Flags when What it looks for Evaluated per ticket
Default Configurable per rule
Summary too short
The summary is shorter than the configured minimum
15 chars
Description missing
Fewer than the configured number of characters of actual text — markup does not count towards the total
30 chars
Description missing a required phrase
A phrase you require — "steps to reproduce", "acceptance criteria" — is absent
Your phrase
Assignee missing
Nobody owns the ticket — usually paired with the auto-assign action
On / off
Due date missing
No due date set — pairs naturally with "set due in N days"
On / off
Estimate missing
No original estimate on a ticket that should carry one
On / off
Component missing
No component — which also means no component lead to route to
On / off
Label missing
No labels at all — the check that keeps a triage taxonomy alive
On / off
No time logged
Work is in progress but no work log exists against the ticket
On / off
Stale
Untouched for longer than the configured number of days
14 days
Overdue
Past its due date and not resolved
On / off
Field condition
The general case — any field, any supported operator, any value. Six field kinds and roughly thirty operators
Your rule
Note Thresholds are per rule, not global — a support project and a platform project can hold different standards without arguing about it.
01 / No cascades

A rule-authored write raises no rule

When a rule sets a priority, that update does not fire the "updated" event for another rule to react to. The graph is flat, with no depth limit to tune and no runaway loop to discover at three in the morning.

Actions are ordered and applied individually, so one failure costs one action rather than aborting the run. An action applies once per finding, not once per run — the same open problem does not get acted on repeatedly just because the schedule ticked again.

02 / The workflow wins

Refusals are recorded, never overruled

The transition action goes through the project's own workflow engine. If the workflow says that move is not legal from this status, the automation records a failed action and moves on. It does not have a back door, because a back door would make the workflow a suggestion.

Auto-assign behaves the same way: on a project set to manual routing, it is reported as a failed action naming the reason, rather than silently doing nothing or inventing an assignee.

03 / Findings close themselves

Fix the ticket and the flag goes away

Per rule and ticket, Trakr tracks the finding, when it was first and last flagged, when it was last notified, the notify count, when actions ran and when it resolved. A finding that no longer reproduces self-closes on the next clean run.

Notification targets are the assignee, the reporter, the watchers, the project lead and named users, with a send-email flag and a renotify-after-days setting where zero means every run. Nobody has to close a ticket about a ticket.

04 / Refused at save

You cannot build a rule that cannot work

Five configurations are rejected when you press save: a rule with no schedule and no event, a rule with no requirements, a rule with nobody to notify and nothing to do, a ONCE rule with nothing to do, and a filter containing currentUser() — which has no meaning when a scheduler is the caller.

Field and operator pairing is enforced at save too, a condition with no value is refused, and an empty field fails every condition except the one that asks it to be empty.

Triggers & selection

When a rule runs, and over what
  • Schedules Hourly · Daily at an hour · Weekly on a day
  • Cron Deliberately not supported
  • Events CREATED · UPDATED · TRANSITIONED
  • Events ASSIGNED · COMMENTED
  • Event dispatch After commit, background thread
  • On demand Run now
  • Rehearsal Dry run — no action, no record, no notification
  • Selection Ticket scope + TQL filter
  • Include resolved tickets Optional flag
  • Cap per run 500 tickets by default
Every run is recorded.
Status, trigger source, tickets checked and flagged, notifications sent, actions run and failed, the error if there was one, and timings. You can answer "what did automation do last night?" without guessing.

Field conditions

Six kinds of field, and the operators each accepts
  • TEXT summary · description · key · feature
  • OPTION project · type · status · category · priority · resolution · request kind · incident flag · cycle · parent
  • USER assignee · reporter — matched on username, display name or email
  • COLLECTION labels · components · watchers
  • DATE due · start · created · updated · resolved
  • NUMBER original estimate · time spent
  • Presence IS_EMPTY · IS_NOT_EMPTY
  • Text CONTAINS · NOT_CONTAINS · EQUALS · NOT_EQUALS · STARTS_WITH · ENDS_WITH · MATCHES_PATTERN
  • Sets & length IS_ONE_OF · IS_NONE_OF · LENGTH_AT_LEAST · LENGTH_AT_MOST
  • Numbers AT_LEAST · AT_MOST · GREATER_THAN · LESS_THAN
  • Collections COUNT_AT_LEAST · COUNT_AT_MOST
  • Dates IN_THE_PAST · IN_THE_FUTURE · WITHIN_NEXT_DAYS · WITHIN_LAST_DAYS · MORE_THAN_DAYS_AGO
MATCHES_PATTERN is glob, never regex.
* and ? only. A rule author cannot hand the engine a catastrophic backtracking pattern, and the person reading the rule six months later can still tell what it matches.
Fields

Change the ticket

  • Set priority
  • Set type
  • Set due date in N days
  • Transition — through the project's own workflow
  • Add or remove a label, created on demand
  • Add or remove a component, never created
People

Get it to an owner

  • Assign to a named user
  • Assign to the project lead
  • Assign to the default assignee
  • Unassign
  • Auto-assign — runs the project's routing rule
  • Assign by skill — least-busy carrier of that skill
  • Add a watcher
Beyond the ticket

Say something, or start something

  • Add a comment
  • Link a ticket
  • Create a ticket, optionally from a template
  • Call a webhook
  • Notify assignee, reporter, watchers, project lead or named users

Mode, pool, fallback — and a preview that shows its working

Round-robin reads and writes its cursor under a row lock, so two tickets arriving in the same second do not both go to the same person. Viewers and customers are never eligible, and cross-organisation groups and accounts are refused outright.

  1. Pick a mode. MANUAL leaves assignment to a human — and an automation auto-assign action against a manual project is honestly reported as a failed action. ROUND_ROBIN takes turns. LEAST_BUSY counts open tickets.
  2. Pick a pool. PROJECT_MEMBERS, a GROUP, a SKILL, or a NAMED_USERS list.
  3. Pick a fallback. DEFAULT_ASSIGNEE, PROJECT_LEAD, or NONE — because the honest answer is sometimes that nobody is available.
  4. Decide about absence. respectAvailability skips people who are away, rather than letting their delegation redirect quietly steal every turn while they are on holiday.
  5. Check the live preview. The settings page lists every candidate, whether they are eligible, why they are not, their open-ticket count, and who is next in line.

That last point is the one that matters in practice. Routing that cannot explain itself gets switched off after the first argument about whose queue is fuller — a preview that names the skipped person and the reason ends the argument before it starts.

Can I test a rule without anyone noticing?

Yes. A dry run notifies nobody, records nothing and performs no action — it only tells you what the rule would have found. There is also a Run now for when you do want the rule to act immediately, independently of its schedule.

Do rules at different scopes override each other?

No. Platform, tenant, organisation and project rules form a union of standards, not a ladder. A project cannot switch off a standard the organisation set; it can only add its own on top. The editors live at Admin → Automation, Settings → Automation and Project Settings → Ticket Quality Rules.

Can an automation rule break my workflow?

No. Transitions go through the project's own workflow engine, and a refusal is recorded as a failed action rather than overruled. Actions are ordered and applied individually, so one failure costs one action and not the whole run.

Rules also cannot cascade: a write made by a rule raises no further rule, which means there is no recursion depth to tune and no loop to discover the hard way.

Will a rule keep nagging people about the same ticket?

Only as often as you tell it to. An action applies once per finding rather than once per run, and notifications honour a renotify-after-days setting where zero means every run.

Per rule and ticket, Trakr tracks the finding, when it was first and last flagged, when it was last notified, the notify count, when actions ran and when it resolved. When the underlying problem is fixed, the finding closes itself on the next clean run.

Does it use cron?

Deliberately not. Schedules are hourly, daily at a chosen hour, or weekly on a chosen day and hour. On top of that there are five events — created, updated, transitioned, assigned and commented — dispatched after commit on a background thread, so a rule never slows down or rolls back the user write that triggered it.

How does auto-assignment decide who gets the ticket?

Each project has a routing rule: a mode of manual, round-robin or least-busy; a pool drawn from project members, a group, a skill or a named list; and a fallback of default assignee, project lead or nobody. Respect-availability skips people who are away rather than letting a delegation redirect steal their turn, and the round-robin cursor is read and written under a row lock.

A live preview on the settings page shows every candidate, whether they are eligible, why they are not, their open-ticket count and who is next. Viewers and customers are never eligible, and cross-organisation groups and accounts are refused.

Standards that enforce themselves

Write the rule once, dry-run it, and let it hold the line. No cron, no regex, no cascades, no overruled workflows. Made in Belgium.