Median

Signal

Triage the bugs and suggestions customers report, and tell them when the work ships.

Updated Oct 1, 20268 minute read

A signal is one bug or one suggestion. Each person who reported it is a reporter on that signal. Everyone in the organization can file, triage, edit and delete signals. Connecting Linear or GitHub needs an admin or owner, see Issue trackers.

Where signals come from

SourceHow it files
The agentFiles from a conversation when Track bugs and suggestions is on under Agent → Behavior. The switch is on by default. At most 3 signals per conversation.
The feedback panelAI reads each note and files it as a bug or a suggestion, or drops it as spam. Needs the same switch.
Crash reportsreportError files a bug at High priority. Needs the same switch.
Notes from elsewheremedian feedback submit, POST /v1/feedback, or median.feedback.submit over MCP. Read the same way as a feedback panel note.
Filed directlyNew signal on this page, median signals file, POST /v1/signals, median.signals.file over MCP, or the assistant.

With Track bugs and suggestions off, the agent, the feedback panel, crash reports and notes from elsewhere file nothing. Filing directly still works.

Duplicate checks and feedback reading run on AI and use credits, see Plans.

Duplicates

CheckRule
Same titleA new report whose title matches a signal of the same kind joins it. Matching ignores case and punctuation, and includes the titles of merged duplicates. It looks at the 60 most recently updated signals of the same kind that are not Declined.
AI readA new signal from the agent, a note or a crash report is compared with the 40 most recently updated signals of the same kind that are not Declined. A match merges it into the older one. It is skipped once a teammate has changed the new signal.
Same personOne report per person per signal. A repeat updates their quote and adds the new conversation to the report.

A report about a Declined signal starts a new signal. A report about a Done signal joins it, and the agent tells the customer it was fixed and asks them to try again.

The list

Signal → All shows the 60 most recently updated signals, bugs and suggestions together. A red Bug or blue Suggestion tag marks each one. The Signal item in the sidebar counts the signals waiting in Approvals.

PartWhat it holds
ApprovalsOpen signals, each as a card with Accept, Decline and Go to thread
In review, In progress, PlannedExpanded when the page loads
Done, DeclinedCollapsed when the page loads. Click the heading to expand.

With nothing filed, the page reads "No bugs or suggestions reported yet."

A row

PartDoes
Priority glyphOpens a menu to change the priority
Status glyphOpens a menu to change the status
TitleOpens the signal's page
Commit glyph and countCommits that may have fixed it, waiting for a decision
Linear identifier or GitHub #12Opens the issue
People glyph and countHow many people reported it
TimeSince the last change
Chat glyphGo to thread, the newest conversation it was reported from
More actions menuThe row menu below
Row menu itemShown when
EditAlways. Changes the title and details.
Go to threadIt was reported from a conversation
Mark doneIt is not Done
DeclineIt is past Open and not Declined
ReopenIt is Done or Declined. Sets it back to Open, into Approvals.
Open LIN-123, Open #12It has an issue in Linear or GitHub
DeleteAlways

Accept and decline

ActionStatusTrackersReporters
AcceptPlannedOpens an issue in every connected tracker that has none for it yetNo message
DeclineDeclinedCloses any linked issue as canceled or not plannedNo message

The card leaves Approvals as soon as you press either button. If a tracker refuses the issue, the signal still moves to Planned and the tracker's error shows under Approvals, or in the sidebar on the signal's page. Accept never opens a second issue in a tracker that already has one for the signal.

Several at once

Tick the checkbox on a row, or on a group heading to take the whole group. A bar appears at the bottom with the count.

ButtonDoes
StatusSets one status on every selected signal
PrioritySets one priority on every selected signal
AcceptAccepts each one. Reports "Accepted N.", "Skipped N already accepted." and "N could not reach a tracker."
DeclineDeclines each one. Reports "Declined N."
DeleteAsks first, then deletes them
Clear selectionUnticks everything

A signal counts as already accepted when it is past Open and has an issue in every connected tracker. Bulk Accept on a Planned signal that is missing an issue opens the missing one.

Status and priority

StatusMeansLinked issueReporters
OpenWaiting in ApprovalsReopened or moved back to not startedNo message
PlannedAcceptedReopened or moved back to not startedNo message
In progressBeing worked onMoved to startedNo message
In reviewBeing checkedMoved to startedNo message
DoneShippedCompleted or closedEach gets one message
DeclinedNot happeningCanceled or closed as not plannedNo message

Status also flows back from Linear and GitHub. The full mapping is under Issue trackers.

PriorityThe agent picks it when
UrgentNobody can use the product
HighSomething important is unusable and there is no way around it
MediumIt gets in the way and there is a workaround
LowIt is a papercut

The agent uses Medium when it does not pick one. A Linear issue carries the same priority.

A signal's page

Click a title to open the signal.

AreaContents
HeaderThe kind tag, the title, Edit, when it was filed, how many people reported it, and "Updated by" with a name and time
Status, PriorityMenus to change either
ActionsGo to thread. Accept and Decline while Open. Mark done until Done or Declined. Reopen once Done or Declined. A link to each tracker issue. Past Open with no issue, "No linked tracker issue." Delete.
BodyThe write-up, rendered as Markdown
Also reported asTitles of duplicates merged into it
CommitsCommits that may have fixed it, see Issue trackers
ReportersOne row per person, newest first, up to 50

A signal that was deleted or merged away shows "This signal was deleted or merged into another."

File a signal by hand

Press New signal at the top of the list.

FieldRules
TypeBug or Suggestion. Default Bug.
TitleRequired. Up to 120 characters.
Details (optional)Markdown. Up to 4,000 characters.
PriorityUrgent, High, Medium or Low. Default Medium.

Create adds it to Approvals with no reporters. A signal filed by hand skips the AI duplicate read and never opens a tracker issue on its own.

ErrorCause
Enter a title.The title is empty
Already on the list as "<title>".A signal of the same kind has that title or alias. Only the 60 most recently updated signals that are not Declined are checked.

Edit on a row or on the signal's page changes the title and details. Edits update any linked issue.

Reports

The Reporters section on a signal's page has one row per person, newest first, up to 50.

PartContents
NameTheir name, their email, or "Customer #N"
QuoteWhat they said, up to 400 characters
Image glyph and countScreenshots on the report
Thread idsEach conversation they reported it from, for example W-12
Page addressFor a feedback panel note or a crash report, the page it was sent from, shown instead of thread ids. Reads "Feedback panel" or "Crash report" when no page was sent.
TimeWhen they reported it

Click a row to open the report.

SectionContents
Header"Reported" with the date, and " · Notified of completion" once they were told
QuoteTheir words
From the feedback panelShown for panel notes
From a crash reportShown for reports sent with reportError
ScreenshotsUp to 6. Click one to open it full size.
ThreadsEach conversation by id and subject
FactsPage, Viewport, values from your app's state, and values you attached with context that are a single link. A link already shown as a screenshot is left out.
Browser logsError, Unhandled rejection, Console and Request entries
Attached valuesEvery other attached value, one block each under its label
Server check: Passed or Server check: FailedWhat your diagnostics endpoint returned

Copy report copies the whole report as plain text.

Screenshots

SourceWhat lands on the report
A conversationImages the customer sent in the thread. Only theirs, from the last 60 messages.
The agentImage links the customer gave it
The feedback panelImages picked, dragged or pasted in with the note
Your codeAn image address passed to attach, or image links sent with POST /v1/feedback

Each report keeps up to 6. Issues opened in Linear or GitHub show them inline.

Telling reporters

When a signal moves to Done, each reporter gets one message in the conversation they last reported from. It is posted under the agent's name.

KindMessage
BugThis bug has been fixed. Thanks for reporting it.
SuggestionYour suggestion has been implemented. Thanks for sending it.
  • Every move to Done sends it. That includes the list, the signal's page, the bulk bar, Confirm fix, a commit on a repository with Close bugs automatically, and the issue closing in Linear or GitHub.
  • A reporter is messaged once. Reopening and marking Done again does not message them a second time.
  • Feedback panel notes have no conversation, so they get no message. Neither does a report whose conversation was deleted.
  • Declining and deleting send nothing.
  • Reporters merged into a signal that is already Done get the message.
  • Each message fires the message.created webhook.

Merge duplicates

Merging has no button in the dashboard. Use the CLI, the API, MCP, or ask the assistant.

SurfaceCall
CLImedian signals merge <keep-id> --duplicate <remove-id>
APIPOST /v1/signals/{id}/merge with { "duplicateId": "..." }
MCPmedian.signals.merge({ signalId, duplicateId })
  • The signal you name first survives. The duplicate is deleted.
  • Reports move to the survivor. A person on both keeps one report.
  • The duplicate's title becomes an alias under "Also reported as". A signal keeps up to 6.
  • The survivor keeps the higher priority of the two.
  • The survivor takes the duplicate's Linear or GitHub issue when it has none of its own.
  • Commits claimed for the duplicate move to the survivor.

See the CLI reference and the management API for the full options.

Delete a signal

Delete asks for confirmation, then removes the signal with its reports and commit claims. Nobody is messaged. Issues in Linear or GitHub stay as they are.

New signals fire bug.created or suggestion.created, and changes fire signal.updated. See Webhooks.

Still need help?

    Esc