Skip to main content
The Jira intake agent turns the DinoAI Slack bot into a data-request intake specialist. Anyone in your company DMs the bot, answers a short interview in plain business language, and gets a well-formed Jira ticket filed with your team’s conventions: the right priority, labels, and custom fields, a duplicate check against the existing backlog, and acceptance criteria derived from their own answers. The requester never sees a form, a priority scale, or an engineering question. This pattern comes from a production deployment at a Paradime customer, generalized so you can adapt it to your own Jira project.
Prerequisites
  • Jira connected so the agent can call create_jira_issue, get_jira_issue, and list_jira_issues.
  • Slack connected with the Paradime bot installed, so teammates can DM it.
  • Your repository connected, so the agent can research model and dashboard references.
  • Familiarity with customizing the Slack Agent: this guide replaces the default Slack bot personality.
Estimated time: 20 minutes.

Steps

1

Create the agent

Build the agent in the Agent UI, naming it exactly dinoai-slack-bot, and use the definition below for its role, goal, backstory, and tools. (Alternatively, commit the file directly at .dinoai/agents/dinoai-slack-bot.yml.) Either way, the name dinoai-slack-bot is the reserved convention that binds the agent to Slack DMs and @Paradime mentions, so this definition becomes what your teammates talk to.
.dinoai/agents/dinoai-slack-bot.yml
tools.mode: allowlist keeps the bot scoped to intake: it can research and file tickets, but not write code, run SQL, or trigger pipelines. You do not need to list run_subagent: core research and navigation tools are always available to every agent regardless of the allowlist. See the Tools Reference.
2

Map it to your Jira project

Replace the placeholders in the backstory’s field map with your own conventions:
  • Project key and issue types: swap DATA for your project key and adjust which request types map to Story, Bug, or Task.
  • Custom fields: many Jira projects require custom fields on creation (a team picker, a sprint, a department). Add each one to additional_fields with its customfield_XXXXX ID. To find the IDs, open an existing ticket through the API or ask your Jira admin. A required custom field that is missing makes ticket creation fail, so state it explicitly in the backstory, including the note that omitting it fails.
  • Routing rules: if different request types belong to different teams or boards, describe the routing in the backstory the same way the priority rules are described, in plain “if this, set that” language.
  • Request types: the five core types cover most data teams. Add or remove branches in Step 2 of the goal to match the requests your team actually receives.
3

Deploy it to your repo

Deploying from the Agent UI opens a PR that adds the agent file to your repository; review and merge it. If you authored the YAML by hand instead, commit it to your repository’s default branch, alongside your dbt™ project:
Once the file is on the default branch, DinoAI loads this definition for every new Slack message instead of the default general-purpose assistant.
4

Try it in Slack

DM the Paradime bot something deliberately vague, the way a real requester would:
The bot should ask one question at a time (business question, consumer, urgency), resolve “the customer dashboard” against your repo on its own, present a confirmation summary, and only file the ticket after you confirm.
You know it works when a vague DM ends with a confirmed summary and a reply containing a real Jira ticket key and URL, with the priority inferred rather than asked, and any required custom fields populated. If ticket creation fails, the most likely cause is a required custom field missing from additional_fields: check the error the bot reports and compare it against your project’s required fields.

How it works

Three design decisions do most of the work, and they transfer to any intake workflow (see the Linear intake agent for the Linear version): The interview is shaped around what the requester can know. Core questions capture the business context every ticket needs; branch questions adapt to the request type; and engineering decisions (column names, model layers, backfills) are explicitly not asked. The bot also never exposes internal scales or tooling: it asks “how soon do you need this?” in plain language and infers the Jira priority itself. This is what makes the bot usable by non-technical teammates, which is the point of intake. Research runs through run_subagent, not in the chat. When a requester says “the revenue dashboard”, the bot needs to find the real model behind it and check whether the request already exists. Doing that with direct repository searches dumps large results into the conversation, and everything in a Slack conversation is re-sent to the model with every subsequent message. Delegating each lookup to run_subagent keeps the raw results in a separate, short-lived context; only the findings summary enters the chat. Same answers, a fraction of the credits. One conversation, one ticket. Long-running Slack threads get more expensive with every message, because the full history is input to every model call. The agent is designed to file one ticket per conversation and then nudge the requester to start fresh, and the nudge includes the unlock that makes it painless: a ticket key is all the context a new chat needs, because the bot can retrieve any ticket with get_jira_issue. In production use, this pattern is the difference between tickets that cost thousands of credits and tickets that cost hundreds of thousands. A natural next step is to close the loop: label tickets the intake agent files, and let the Jira backlog agent pick up the agent-ready ones and deliver the dbt™ changes as PRs. Intake fills the backlog in a structured way; the backlog agent works it.

Next steps

Jira backlog agent

Close the loop: an agent that implements the tickets this one files.

Customize the Slack Agent

How the dinoai-slack-bot convention binds an agent to Slack.

Agent-to-agent delegation

When to use run_subagent versus invoke_agent.

Programmable Agents reference

The agent YAML schema and tools.