---
title: "alis specialist"
url: "https://docs.alisx.com/reference/cli/specialist/"
---
# alis specialist

Find, read and reply to Alis Build conversations. Every builder has a build specialist, a human engineer, reachable from here.

## Synopsis

```bash
alis specialist approve-request <ticket> [flags]
alis specialist assign <ticket> --to <email|users/ID> [flags]
alis specialist decline-request <ticket> [flags]
alis specialist file <ticket> --in linear [--team KEY] [flags]
alis specialist get <ticket> [flags]
alis specialist invite <ticket> --to <email|users/ID> [--to <email|users/ID> ...] [flags]
alis specialist list [<org>.<product>] [flags]
alis specialist resolve <email|users/ID> [flags]
alis specialist send-message [flags]
alis specialist send-session [flags]
alis specialist tickets [flags]
alis specialist wait <ticket> [flags]
```

Aliases: `specialist`, `support`.

## Description

Human engineers review conversations first, including conversations written by AI agents. Keep messages concise and factual: the problem, its impact, the key evidence and the help needed. `list` lists people; `tickets` lists conversations. Conversations are addressable as `tickets/<id>` or the bare id.

| Target | Command shape | Audience |
|---|---|---|
| The Alis Build platform team | `send-message --message …` | A new platform-team conversation |
| A named teammate | `send-message --to <email\|users/ID> --product <org>.<product>` | A private peer conversation: sender, recipient, invitees. Support staff have no implicit access. |
| An existing conversation | `send-message --ticket <id>` | Its current participants |

## Subcommands

### alis specialist tickets

List the specialist conversations you can see (started by you or added to), newest first, with state and console link.

```bash
alis specialist tickets [flags]
```

Aliases: `tickets`, `conversations`.

| Flag | Type | Default | Meaning |
|---|---|---|---|
| `--inbox` | bool | false | List the open staff inbox instead of your own conversations (specialists only). |
| `--state <state>` | string | `open` | Filter by state: `open`, `resolved` or `all`. |

`--json` returns `tickets[]` with `ticket`, `url`, `display_name`, `state`, `source`, `creator`, `assignee`, `participants[]`, `create_time`, `update_time`, `answered` and `waiting_on`.

### alis specialist get

Read a specialist conversation: state, participants, the console link to hand to a person, and the messages with authors and timestamps.

```bash
alis specialist get <ticket> [flags]
```

| Flag | Type | Default | Meaning |
|---|---|---|---|
| `--last <n>` | int | `0` (all) | Only include the newest N messages. |

Under `--json`: `waiting_on` says whose move it is (`builder`, `specialist` or `nobody`), `pending_action` names what you are being asked for (`approval_request`, `diagnostics_requested`, `session_requested`, `question`, `reply`) with the exact `command` that answers it, `answered` is true when someone else has posted since your most recent message, and `last_reply` is that reply.

### alis specialist send-message

Start or continue a build specialist conversation. Without `--ticket` or `--to`, starts a new conversation with the Alis Build platform team. Provide the message with `--message`, `--message-file <path>` or stdin. The first non-empty line becomes the subject; Markdown renders in the console; the 2 MiB body limit is a transport cap.

```bash
alis specialist send-message [flags]
```

| Flag | Type | Default | Meaning |
|---|---|---|---|
| `--draft` | bool | false | Save a server-side draft instead of delivering; its author reviews and sends it from the conversation composer. Requires `--ticket`. |
| `--dry-run` | bool | false | Print the prepared envelope (sender, resolved recipient, audience, subject, body digest) and send nothing. |
| `--expect-sha256 <digest>` | string | | Refuse to send unless the body's sha256 matches (from `--dry-run`). |
| `--idempotency-key <key>` | string | | Unique key for this send; a retry with the same key returns the original receipt instead of sending again. |
| `--message <text>` | string | | The message; omit or use `-` to read from stdin. |
| `--message-file <path>` | string | | Read the message from this file (UTF-8 text or Markdown). |
| `--product <org.product>` | string | the current directory context | Product for `--to`. |
| `--ticket <id>` | string | | Existing conversation to post on. |
| `--to <email\|users/ID>` | string | | Current product member to start a private conversation with (exact email match). |
| `--yes` | bool | false | Skip the send confirmation prompt (same as `--approve`). |

The receipt carries `ticket`, `url`, `message`, `state: persisted`, `recipient`, `sender`, `audience`, `body.sha256`, `sent_at`, `verified` and `read_back`; a replayed send adds `replayed: true`. `persisted` means stored, not that the person has read it.

### alis specialist send-session

Locate a local coding-agent session transcript (an Alis agent, Claude Code, Codex or Gemini CLI), gzip it and upload it to a specialist conversation. Credentials are masked as `[REDACTED:<kind>]` before upload; transcripts over the 10 MiB cap are tail-truncated.

```bash
alis specialist send-session [flags]
```

| Flag | Type | Default | Meaning |
|---|---|---|---|
| `--harness <name>` | string | | Narrow the transcript search: `alis-agent`, `claude-code`, `codex` or `gemini`. |
| `--session <id>` | string | the session this command runs in (`ALIS_SESSION_ID`) | Session whose transcript to share. |
| `--ticket <id>` | string | | Conversation to upload the transcript to. |
| `--yes` | bool | false | Skip the upload confirmation prompt (same as `--approve`). |

### alis specialist wait

Block until someone other than you posts after your most recent message, or the conversation is resolved. Exits 0 with the reply on stdout; exits 5 with a `reply_timeout` envelope when `--timeout` passes first.

```bash
alis specialist wait <ticket> [flags]
```

| Flag | Type | Default | Meaning |
|---|---|---|---|
| `--after <time>` | string | your most recent message | Only count replies created after this RFC 3339 time. |
| `--timeout <duration>` | duration | `0` (indefinitely) | Give up waiting after this duration. |

### alis specialist list

List the product's current members (administrators, builders and viewers) who can be selected for a private builder-to-builder conversation. The product is detected from the current directory when omitted.

```bash
alis specialist list [<org>.<product>] [flags]
```

No flags beyond the global flags.

### alis specialist resolve

Resolve an email address or `users/ID` to exactly one current member of the product, and say whether you may start a private conversation with them and who will see it. Nothing is sent.

```bash
alis specialist resolve <email|users/ID> [flags]
```

| Flag | Type | Default | Meaning |
|---|---|---|---|
| `--product <org.product>` | string | the current directory context | Product to resolve within. |

`--json` returns `recipient`, `member`, `can_send` (with `reason`), `visibility` and the exact `send` command.

### alis specialist invite

Add teammates to an existing conversation, including a private peer conversation. Invited people gain access to the conversation's history and future messages. All recipients are resolved before anyone is added, using the same exact email or `users/ID` lookup as `resolve`.

```bash
alis specialist invite tickets/ID --to alex@example.com --to sam@example.com --dry-run --json
# Review the people and audience, then approve:
alis specialist invite tickets/ID --to alex@example.com --to sam@example.com --approve --json
```

| Flag | Type | Default | Meaning |
|---|---|---|---|
| `--to <email\|users/ID>` | string array | | Person to invite. Required; repeat for multiple people. |
| `--product <org.product>` | string | conversation's product, then current directory | Product member directory to resolve people within. |
| `--dry-run` | bool | false | Show resolved people, current participants, visibility and the approval command without changing access. |
| `--yes` | bool | false | Skip the confirmation prompt (same as `--approve`). |

Existing invitation permissions apply. Builders can only invite people from their own email domain. Reopen a resolved conversation before inviting people. Private peer conversations remain private; support staff have no implicit access.

People already on the conversation are skipped. `--json` returns `ticket`, `url`, `product`, `sender`, `audience`, `visibility`, `recipients`, `participants` and `read_back`. Each unique recipient has a state of `added` or `already_participant`; a dry run also returns `dry_run: true`, the exact `invite` command and `not_attempted` recipients.

If a request fails, `error.details.recipients` reports confirmed additions, an `unconfirmed` result and people `not_attempted`. Use `read_back` to check access. Retrying the same command skips existing participants without creating duplicates.

### alis specialist approve-request

Approve a build environment access request or a product request from a terminal. Access approval makes the requester a builder on every product in the build environment; product approval creates the product with a development deployment environment and makes the requester its administrator. The server verifies that you are an administrator who may decide it.

```bash
alis specialist approve-request <ticket> [flags]
```

| Flag | Type | Default | Meaning |
|---|---|---|---|
| `--yes` | bool | false | Skip the decision confirmation prompt (same as `--approve`). |

### alis specialist decline-request

Decline a request. A reason is required and is shown to the requester.

```bash
alis specialist decline-request <ticket> [flags]
```

| Flag | Type | Default | Meaning |
|---|---|---|---|
| `--reason <text>` | string | | Why the request is declined (required). |
| `--yes` | bool | false | Skip the decision confirmation prompt (same as `--approve`). |

### alis specialist assign

Hand a specialist conversation to another specialist, or release it back to the general inbox. Only the conversation's build specialists may hand it over; a builder may only hand to someone on their own email domain. Not available on private peer conversations.

```bash
alis specialist assign <ticket> --to <email|users/ID> [flags]
```

| Flag | Type | Default | Meaning |
|---|---|---|---|
| `--leave` | bool | false | Step out of the conversation after handing it over. |
| `--note <text>` | string | | A short hand-over note posted in the conversation. |
| `--release` | bool | false | Release the conversation to the general inbox instead (staff only). |
| `--to <email\|users/ID>` | string | | The new specialist. |
| `--yes` | bool | false | Skip the confirmation prompt (same as `--approve`). |

### alis specialist file

File an issue in an external tracker from a specialist conversation. Only the conversation's build specialists may file; filing again where an issue exists returns the existing one. Anyone on the responding side files in their own Linear workspace through the Linear connection on their account (Connected Apps on the console's account page).

```bash
alis specialist file <ticket> --in linear [--team KEY] [flags]
```

| Flag | Type | Default | Meaning |
|---|---|---|---|
| `--in <tracker>` | string | | Tracker to file in (required; `linear` is the only accepted value). |
| `--team <key\|id>` | string | | Team in your own Linear workspace (needed when it has several teams). |
| `--yes` | bool | false | Skip the confirmation prompt (same as `--approve`). |

## Examples

```bash title="Terminal"
alis specialist tickets --state all --json
alis specialist get tickets/<id> --json
alis specialist send-message --message-file ./ticket.md --json
alis specialist send-message --to ana@example.com --product acme.shop --message "Could you review the orders proto?" --json
alis specialist send-message --ticket <id> --message "Thanks, shipping a fix."
alis specialist send-message --message-file ./ticket.md --dry-run --json
alis specialist wait tickets/<id> --timeout 2h --json
alis specialist send-session --ticket <id> --harness claude-code --json
alis doctor --ticket <id>
```

## Error codes

`network_unreachable` (nothing sent), `signed_out` (exit 4), `recipient_not_found`, `recipient_ambiguous` (candidates in `error.details`), `recipient_not_member`, `recipient_is_self`, `recipient_invalid`, `product_required`, `product_not_found`, `send_denied`, `ticket_resolved` (start a new conversation), `message_too_large`, `message_not_utf8`, `message_file_unreadable`, `message_changed`, `unsupported_backend`. Every envelope says whether the message was sent.
