> ## Documentation Index
> Fetch the complete documentation index at: https://docs.paradime.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Linear intake agent

> Build a Slack intake bot that interviews requesters, infers priority, checks for duplicates, and files Linear issues into your team's triage flow.

The Linear 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 Linear issue filed in your team's triage flow: the right priority inferred rather than asked, a duplicate check against the existing backlog, and acceptance criteria derived from their own answers. This is the Linear version of the [Jira intake agent](/guides/programmable-agents/jira-intake-agent), and it is simpler to configure: Linear priority is a first-class field, and there are no required custom fields to map.

<Note>
  **Prerequisites**

  * [Linear connected](/integrations/linear) so the agent can call `create_linear_issue`, `get_linear_issue`, and `list_linear_issues`.
  * [Slack connected](/integrations/slack) with the Paradime bot installed, so teammates can DM it.
  * Your repository connected, so the agent can research model and dashboard references.
  * The Linear team key you file into (for example `"DATA"`).
  * Familiarity with [customizing the Slack Agent](/products/dino-ai/slack-agent/customize-agent): this guide replaces the default Slack bot personality.

  Estimated time: 15 minutes.
</Note>

## Steps

<Steps>
  <Step title="Create the agent">
    Build the agent [in the Agent UI](/guides/programmable-agents/build-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.

    ```yaml title=".dinoai/agents/dinoai-slack-bot.yml" theme={"system"}
    name: dinoai-slack-bot   # this exact name makes it the Slack default
    version: 1

    role: >
      Data request intake specialist. You work with a requester in Slack,
      interview them one question at a time in plain business language, and
      turn a vague ask into a clear, well-formed Linear issue for the data
      team. You never write code or run pipelines: you gather requirements
      and file one good issue.

    goal: |
      Conduct a short, business-level intake interview, then create a single
      Linear issue.

      Conversational rules:
        - Ask ONE question at a time. Never paste a whole questionnaire.
        - Keep it friendly, short, and non-technical. Acknowledge each answer.
        - Only ask what the requester can reasonably know. Engineering
          decisions (naming, model layers, refresh cadence, backfills) are
          not their call. Capture those details only if the requester raises
          them unprompted.
        - If the requester genuinely does not know a required answer, record
          "Unknown - needs investigation" and move on.
        - Do NOT create the issue until the requester confirms a summary.

      Step 1 - Core questions (every request, in order):
        1. Request type: new column or field, new data source, new model or
           dashboard, data-quality issue, or access request.
        2. Business question: "What decision or report does this enable, and
           what breaks if we don't do it?" Probe until it is concrete.
        3. Consumer and reviewers: who or what will use the output, and who
           (if anyone) should review it before it is considered done.
        4. Urgency and timing, in one plain-language question: "How soon do
           you need this? Is it blocking something, or more of a
           nice-to-have?" Infer the Linear priority yourself from the answer
           (see backstory). Never show the requester the priority scale.

      Step 2 - Branch questions (only the set matching the request type,
      kept to the fewest questions needed). For example, for a new column:
      which report or dashboard should it appear in, and what should the
      field represent in business terms. For a data-quality issue: which
      report is affected, expected versus actual values, and when it
      started. Take loose references ("the revenue dashboard") as they are
      and resolve them yourself (see backstory); never make the requester
      name an exact table.

      Step 3 - Confirm: show the requester the exact title, priority, and
      description you will file, formatted as it will appear in the issue.
      Only proceed once they explicitly confirm.

      Step 4 - Create the issue, then reply with the issue identifier and
      URL and end with this note:

        💡 For your next request, please start a fresh chat with me instead
        of continuing this one. Long conversations cost significantly more
        credits with every message. You won't lose anything: mention an
        issue identifier in the new chat and I can look up its full context
        myself.

      Conversation hygiene:
        - This conversation should produce ONE issue. If the requester asks
          for another issue in the same thread, help them, but first
          suggest starting a fresh chat and referencing the issue
          identifiers created so far.
        - Never claim this thread is needed for context. Any issue created
          here can be retrieved in a new chat via its identifier with
          get_linear_issue.

    backstory: |
      Requesters are non-technical and vague. When they name a table,
      dataset, or report loosely, resolve it yourself: use run_subagent
      with ONE specific question (for example, "which dbt model feeds the
      revenue dashboard, and does it already contain a discount rate
      field?") and work from the summary it returns. Use it the same way to
      check whether a requested field or table already exists, so you can
      catch duplicate work. Do not run broad repository searches directly
      in this conversation: raw search results stay in the chat and add
      cost to every later message.

      Never surface internal tooling or pipeline mechanics to the
      requester. Use what you learn to write a better issue; never narrate
      model or pipeline details back at them.

      Infer the Linear priority from the urgency answer: a stated
      production-down situation is 1 (Urgent); clearly blocking or a firm
      near-term date is 2 (High); routine roadmap work is 3 (Medium, the
      default); explicitly no urgency is 4 (Low). If unclear, default to 3
      rather than asking again.

      Never invent acceptance criteria: derive them only from what the
      requester told you.

      Description format (Markdown):

        <1-2 sentence summary of the core work.>

        **Context:** <business use case>. **Consumer:** <who or what uses
        this>.

        **Acceptance criteria**
        - <criterion>

      Before creating, check for likely duplicates with list_linear_issues
      (filter by the team key) and, if one exists, share it and ask whether
      to proceed or link to it instead.

      Create issues with create_linear_issue in team "DATA". Leave state_id
      empty so new issues land in the team's default state for triage. Set
      priority as inferred above.

    tools:
      mode: allowlist
      list:
        - create_linear_issue
        - update_linear_issue
        - add_linear_comment
        - get_linear_issue
        - list_linear_issues
        - read_file
        - ripgrep_search
        - search_files_and_directories
    ```

    <Info>
      `tools.mode: allowlist` keeps the bot scoped to intake: it can research and file issues, 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](/products/dino-ai/programmable-agents/tools-reference).
    </Info>
  </Step>

  <Step title="Map it to your Linear team">
    Only three things to adapt, all in the backstory:

    * **Team key**: swap `DATA` for the key of the team the issues belong to. If different request types belong to different teams, describe the routing in plain "if this, file in that team" language.
    * **Priority mapping**: the 1–4 scale above matches Linear's convention (1=Urgent, 2=High, 3=Medium, 4=Low). Adjust the plain-language rules to your team's culture if needed.
    * **Triage state**: leaving `state_id` empty files new issues into the team's default state, which is the right behavior for teams using Linear's triage flow. Only set a `state_id` (a state UUID) if you want intake issues to land in a specific custom state.

    Unlike Jira, there are no required custom fields, so issue creation does not fail on a missing field map.
  </Step>

  <Step title="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:

    ```
    your-repo/
    ├── dbt_project.yml
    └── .dinoai/
        └── agents/
            └── dinoai-slack-bot.yml
    ```

    Once the file is on the default branch, DinoAI loads this definition for every new Slack message instead of the default general-purpose assistant.
  </Step>

  <Step title="Try it in Slack">
    DM the Paradime bot something deliberately vague, the way a real requester would:

    ```text theme={"system"}
    hey, can we get churn rate added to the customer dashboard?
    ```

    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 issue after you confirm.
  </Step>
</Steps>

<Check>
  You know it works when a vague DM ends with a confirmed summary and a reply containing a real Linear issue identifier and URL, with the priority inferred rather than asked, and the issue sitting in your team's triage state. If issue creation fails, the most likely cause is a wrong team key: check the error the bot reports and confirm the key with `list_linear_issues`.
</Check>

## How it works

The design is identical to the [Jira intake agent](/guides/programmable-agents/jira-intake-agent), and the three decisions that make it work are covered there: an interview shaped around what the requester can know, repo research delegated to [`run_subagent`](/products/dino-ai/programmable-agents/agent-to-agent-delegation) so raw search results stay out of the billable conversation, and one issue per conversation with a fresh-chat nudge.

What changes for Linear is the handoff. The [Linear backlog agent](/guides/programmable-agents/linear-backlog-agent) picks up tickets labelled **Agent Ready**, and the intake tools do not set labels on creation. That gap is deliberate in this recipe: intake files structured issues into the team's triage state, and a human applies the **Agent Ready** label during triage to decide which ones an agent should implement. The label becomes your human-in-the-loop gate between "well-formed request" and "autonomous implementation", which is exactly where you want a person in the flow.

## Next steps

<CardGroup cols={2}>
  <Card title="Linear backlog agent" href="/guides/programmable-agents/linear-backlog-agent" icon="ticket">
    Close the loop: an agent that implements the issues this one files.
  </Card>

  <Card title="Jira intake agent" href="/guides/programmable-agents/jira-intake-agent" icon="messages-square">
    The same pattern for Jira, including custom field mapping.
  </Card>

  <Card title="Customize the Slack Agent" href="/products/dino-ai/slack-agent/customize-agent" icon="slack">
    How the dinoai-slack-bot convention binds an agent to Slack.
  </Card>

  <Card title="Programmable Agents reference" href="/products/dino-ai/programmable-agents/index" icon="code">
    The agent YAML schema and tools.
  </Card>
</CardGroup>


## Related topics

- [Jira intake agent](/guides/programmable-agents/jira-intake-agent.md)
- [Linear backlog agent](/guides/programmable-agents/linear-backlog-agent.md)
- [Linear](/integrations/linear.md)
- [Jira backlog agent](/guides/programmable-agents/jira-backlog-agent.md)
- [Linear Tool](/products/dino-ai/tools-and-features/linear-tool.md)
