Skip to content

Add a review desk for items that need a person #2401

Closed

Description

@sentry-junior

Automations and agents sometimes find work that needs a person. Today the only way to tell someone is a Slack message. A Slack message is a one-time notice, not state: it has no assignee, no open or done status, and no list of what is still waiting.

User story

As someone who owns or depends on automations, I want a review desk: one place that shows the items that need me, who else can act on each item, and whether it is still open. Some items only tell me something. Other items ask me for an answer. When I act on an item, the agent learns about it in the linked Conversation and continues the work.

Example: the fair-source review automation finds a needs-review change to a company entry. The agent adds an action item that asks "Approve or reject this entry?" with a reason field, and assigns it to two reviewers. One reviewer submits "reject: license is not fair source". The item closes for both reviewers. The answer goes to the linked Conversation, and the agent comments on the pull request.

Current behavior

  • Automations report results through outcomes, such as a Slack message (send_message). Nothing records whether a person acted on the message.
  • A blocked Automation gets status blocked, and its creator gets a one-time DM (packages/junior/src/chat/automations/blocked-notice.ts).
  • The dashboard derives a "Needs attention" filter from Automation status (packages/junior/src/chat/automations/collection.ts). This covers the health of the Automation. It does not cover items about a subject, such as a pull request that needs review.

Gap

  • No durable record says "this needs a person" for a specific subject.
  • Nobody can see which items are open, done, or dismissed, or who must act.
  • A person cannot give a structured answer that the agent then acts on.
  • Repeated Automation runs can post again about the same subject instead of updating one item.

Expected behavior

Items

An item has a title, a body, a status (open, done, or dismissed), and assignees. It can also have a subject (for example, a pull request), one or more linked Conversations, and the Automation that added it. Most items have one linked Conversation.

There are two kinds of item:

  • Notice: it only tells a person something. An assignee marks it done or dismisses it. It does not block work.
  • Action: it asks for an answer. The agent defines the input, similar to a user-input tool, and the item shows as a small form. The input uses the same request shape as requestUserInput (feat(chat): Let Junior ask for user input with requestUserInput #2149): a question and 1–4 fields. Each field is choice, multi_choice, or text. A confirmation is a choice field with two options. An action item must have at least one linked Conversation.

An item never closes automatically. Only a person or an agent closes it. For example, when a pull request is merged, the agent must close the related item.

Assignment

  • An item has one or more assignees. An assignee is a User or Everyone.
  • Everyone is an explicit assignment. It means that any person who can see the item can act on it.
  • An item with no assignees is not valid, and the add tool rejects it. If an unassigned item exists anyway, for example from a bug or old data, it shows only in the All view with an "Unassigned" label. Any person who can see it can take it. It does not turn on the "waiting on you" indicator.
  • Any assignee can act on the item. The first person who submits, completes, or dismisses it closes it for all assignees. The item records who closed it and when.
  • A person can take an item. This makes them the only assignee.
  • If no assigned User is available anymore, the item stays open as it is. Junior does not reassign or close it.

Review desk

  • Review desk is its own item in the dashboard navigation, second after Conversations. It is not only for Automations. The navigation item shows how many open items are assigned to me.
  • The page shows a list of items on the left and the selected item on the right. The list groups items into items that need an answer, notices, and blocked Automations.
  • The page has three views: Mine (I am an assigned User), Everyone (assigned to Everyone), and All. These views show only open items.
  • The selected item shows its title, body, subject, linked Conversations, who added it, and its assignees. It also shows the form or the available actions.
  • An assignee can take, submit, complete, or dismiss an item from the review desk.
  • Blocked Automations also show on the review desk, assigned to the Automation creator. Their state stays derived from Automation status. They are not stored as items.

Archive

  • When an item is done or dismissed, it is archived. It leaves the Mine, Everyone, and All views.
  • A person finds archived items with search or with an archived filter. The archived filter uses the same Mine, Everyone, and All views.
  • An archived item shows who closed it, when, and the submitted answer, if there is one.

In a Conversation

  • When an item is linked to a Conversation, the transcript shows a review card at the point where the agent added the item.
  • While the item is open, an assignee can answer or act on it in the card. This has the same result as acting on it from the review desk.
  • The card links to the item on the review desk.
  • A person who cannot act on the item sees the card without the form.
  • After the item closes, the card shows who closed it, when, and the submitted answer, if there is one. The form does not show anymore.
  • While the Conversation has open linked items, a bar above the message box shows how many. The bar opens a side panel that lists every open item linked to the Conversation. A person can act on each item in the side panel, with the same result as in the card.

In Slack

  • When an item is linked to a Slack Conversation, the review card also shows in that Slack thread. An assignee can act on it there.
  • The Slack card uses the same rendering as requestUserInput (feat(chat): Let Junior ask for user input with requestUserInput #2149). A short choice item shows buttons. Other items show an Answer button that opens a form.
  • A notice in Slack shows Done and Dismiss.
  • Acting in Slack has the same result as acting from the review desk or the dashboard card. The first person action closes the item everywhere.
  • After the item closes, the Slack card updates in place to show who closed it and the answer, if there is one.

"Waiting on you" indicator

  • A Conversation that waits on me shows a small, bright lavender dot. The dot is in the status marker spot next to the Conversation title.
  • The dot shows wherever Conversations are listed with that marker. Most people will see it in the Conversations sidebar.
  • When the dot shows, it replaces the other status markers, such as "finished since last viewed".
  • The dot is the only change. The Conversations list and sidebar layouts stay the same.
  • The indicator is general, so other features can use it later. Today only the review desk sets it: the Conversation has an open linked item, and I am an assignee of that item, as a User or through Everyone.

Messages to linked Conversations

  • Each person action on an item (submit, complete, dismiss, or take) sends a message to every linked Conversation that is still open.
  • When an agent closes an item, every other linked Conversation that is still open gets a message.
  • A change never sends a message to the Conversation that made the change.
  • Each message starts a new Turn in its Conversation.
  • A message about a person action comes from that person, not from the agent. It carries that person's authority, the same as a reply in Slack.
  • The message includes the item title, what happened, who did it, and the original question or the submitted answer. Then the agent has context even if the Conversation moved on.
  • Submit also saves the answer on the item and marks it done.

Agent tools

  • Add: add a notice or an action item. Assignees are required: one or more Users, or Everyone. Subject and linked Conversations are optional. Each item has a dedupe key. If an open item has the same key, add updates that item instead of adding a duplicate.
  • Update: change the title, body, assignees, or linked Conversations, or close the item as done or dismissed with a reason, for example "no longer needed: pull request closed".
  • Search: find items by subject, status, assignee (a User or Everyone), or Automation. For example: "which items are open for this pull request?"

Rules

  • An agent can never submit the answer to an action item. Only an assignee can submit.
  • An item linked to a private Conversation is visible only to its assigned Users. It cannot be assigned to Everyone.
  • Search returns only items that the current Actor can see.
  • An agent can update only items linked to its own Conversation or Automation, or items that the current Actor can see.

Out of scope

  • Broadcasting items to channels. This is a separate delivery concern, for example a Message card that points to the item and updates in place. A broadcast must respect the visibility of the linked Conversations.

Related: #2149, #2187, #2051, #874, #2244

via David Cramer.

--

View Session [Sentry]

Activity

  1. changed the title [-]Add an inbox for items that need a person[/-] [+]Add a review desk for items that need a person[/+] on Oct 30, 2026
  2. sentry-junior commented on Oct 31, 2026

    @sentry-junior
    ContributorAuthor

    Shipped in #2460 (Review items + agent tools), #2462 (person actions), #2464 (review desk page), #2466 (items in Conversations), #2468 (Slack cards), #2475 (action pane polish), and #2476 (mock reporting reads). Behavior is documented in packages/junior/src/chat/review-items/README.md.

    One intended difference from this spec: agent tools read as the Conversation, not as the Actor, so an agent in another Conversation of an assigned User cannot read a private item. Maintainability follow-ups (access rules in one module, Slack behind a provider-neutral signal, purge and FK cleanup, list paging, evals) are tracked as separate PRs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions