Prerequisites
- Jira connected so the agent can call
create_jira_issue,get_jira_issue, andlist_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.
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
DATAfor your project key and adjust which request types map toStory,Bug, orTask. - Custom fields: many Jira projects require custom fields on creation (a team picker, a sprint, a department). Add each one to
additional_fieldswith itscustomfield_XXXXXID. 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
goalto 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 throughrun_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.